diff --git a/.gitignore b/.gitignore index 2040521f0..c24325c49 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ aos.json .prettierignore .vscode -.DS_Store \ No newline at end of file +.DS_Store +bun.lock \ No newline at end of file diff --git a/.npmignore b/.npmignore index 5b6b9c775..04ac0bb47 100644 --- a/.npmignore +++ b/.npmignore @@ -3,8 +3,14 @@ node_modules wallet.json backup echo -potato +hyper modules logos +extensions +process/test +process/crypto +.gitpod +.husky +.github aos.json -*.tgz \ No newline at end of file +*.tgz diff --git a/README.md b/README.md index 526efbc97..f0b183a38 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ aos [name/process-id] | `--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 | | `--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 | diff --git a/blueprints/htoken.lua b/blueprints/htoken.lua new file mode 100644 index 000000000..33db6dde3 --- /dev/null +++ b/blueprints/htoken.lua @@ -0,0 +1,229 @@ +local bint = require('.bint')(256) +--[[ + This module implements the ao Standard Token Specification. + + Terms: + Sender: the wallet or Process that sent the Message + + It will first initialize the internal state, and then attach handlers, + according to the ao Standard Token Spec API: + + - Info(): return the token parameters, like Name, Ticker, Logo, and Denomination + + - Balance(Target?: string): return the token balance of the Target. If Target is not provided, the Sender + is assumed to be the Target + + - Balances(): return the token balance of all participants + + - Transfer(Target: string, Quantity: number): if the Sender has a sufficient balance, send the specified Quantity + to the Target. It will also issue a Credit-Notice to the Target and a Debit-Notice to the Sender + + - Mint(Quantity: number): if the Sender matches the Process Owner, then mint the desired Quantity of tokens, adding + them the Processes' balance +]] +-- +local json = require('json') + +--[[ + utils helper functions to remove the bint complexity. +]] +-- + + +local utils = { + add = function(a, b) + return tostring(bint(a) + bint(b)) + end, + subtract = function(a, b) + return tostring(bint(a) - bint(b)) + end, + toBalanceValue = function(a) + return tostring(bint(a)) + end, + toNumber = function(a) + return bint.tonumber(a) + end +} + + +--[[ + Initialize State + + ao.id is equal to the Process.Id + ]] +-- +Variant = "0.0.4" + +-- token should be idempotent and not change previous state updates +Denomination = Denomination or 12 +Balances = Balances or { [id] = utils.toBalanceValue(10000 * 10 ^ Denomination) } +TotalSupply = TotalSupply or utils.toBalanceValue(10000 * 10 ^ Denomination) +Name = Name or 'Hyper Test Coin' +Ticker = Ticker or 'HYPER' +Logo = Logo or 'eskTHZQzCLOFrpzkr7zeaf4RxmkaNVYvHuPLh4CLpX4' + +--[[ + Add handlers for each incoming Action defined by the ao Standard Token Specification + ]] +-- + +--[[ + Info + ]] +-- +Handlers.add('info', function(msg) + send({ + Target = msg.from, + Name = Name, + Ticker = Ticker, + Logo = Logo, + Denomination = tostring(Denomination) + }) +end) + +--[[ + Balance + ]] +-- +Handlers.add('balance', { action = "balance"}, function(msg) + local bal = '0' + print('balance called') + print('from ' .. msg.from) + + -- If not Recipient is provided, then return the Senders balance + if (msg.recipient) then + if (Balances[msg.recipient]) then + bal = Balances[msg.recipient] + end + elseif msg.target and Balances[msg.target] then + bal = Balances[msg.target] + elseif Balances[msg.from] then + bal = Balances[msg.from] + end + send({ + target = msg.from, + balance = bal, + ticker = Ticker, + account = msg.recipient or msg.from, + data = bal + }) +end) + +--[[ + Balances + ]] +-- +Handlers.add('balances', + function(msg) + send({target = msg.from, data = json.encode(Balances) }) + end) + +--[[ + Transfer + ]] +-- +Handlers.add('transfer', function(msg) + assert(type(msg.recipient) == 'string', 'Recipient is required!') + assert(type(msg.quantity) == 'string', 'Quantity is required!') + assert(bint.__lt(0, bint(msg.quantity)), 'Quantity must be greater than 0') + + if not Balances[msg.from] then Balances[msg.from] = "0" end + if not Balances[msg.recipient] then Balances[msg.recipient] = "0" end + + if bint(msg.quantity) <= bint(Balances[msg.from]) then + Balances[msg.from] = utils.subtract(Balances[msg.from], msg.quantity) + Balances[msg.recipient] = utils.add(Balances[msg.recipient], msg.quantity) + + --[[ + Only send the notifications to the Sender and Recipient + if the Cast tag is not set on the Transfer message + ]] + -- + if not msg.cast then + -- Debit-Notice message template, that is sent to the Sender of the transfer + local debitNotice = { + action = 'Debit-Notice', + recipient = msg.recipient, + quantity = msg.quantity, + data = colors.gray .. + "You transferred " .. + colors.blue .. msg.quantity .. colors.gray .. " to " .. colors.green .. msg.recipient .. colors.reset + } + -- Credit-Notice message template, that is sent to the Recipient of the transfer + local creditNotice = { + target = msg.recipient, + action = 'Credit-Notice', + sender = msg.from, + quantity = msg.quantity, + data = colors.gray .. + "You received " .. + colors.blue .. msg.quantity .. colors.gray .. " from " .. colors.green .. msg.from .. colors.reset + } + + -- Add forwarded tags to the credit and debit notice messages + for tagName, tagValue in pairs(msg) do + -- Tags beginning with "X-" are forwarded + if string.sub(tagName, 1, 2) == "x-" then + debitNotice[tagName] = tagValue + creditNotice[tagName] = tagValue + end + end + + -- Send Debit-Notice and Credit-Notice + debitNotice.Target = msg.from + send(debitNotice) + send(creditNotice) + end + else + send({ + target = msg.from, + action = 'Transfer-Error', + ['Message-Id'] = msg.id, + error = 'Insufficient Balance!' + }) + end +end) + +--[[ + Mint + ]] +-- +Handlers.add('mint', function(msg) + assert(type(msg.quantity) == 'string', 'Quantity is required!') + assert(bint(0) < bint(msg.quantity), 'Quantity must be greater than zero!') + + if not Balances[id] then Balances[id] = "0" end + + if msg.from == id then + -- Add tokens to the token pool, according to Quantity + Balances[msg.from] = utils.add(Balances[msg.from], msg.quantity) + TotalSupply = utils.add(TotalSupply, msg.quantity) + send({ + target = msg.from, + data = colors.gray .. "Successfully minted " .. colors.blue .. msg.quantity .. colors.reset + }) + else + send({ + target = msg.from, + action = 'Mint-Error', + ['Message-Id'] = msg.id, + error = 'Only the Process Id can mint new ' .. Ticker .. ' tokens!' + }) + end +end) + +--[[ + Total Supply + ]] +-- +Handlers.add('totalSupply', function(msg) + assert(msg.From ~= id, 'Cannot call Total-Supply from the same process!') + send({ + Target = msg.From, + Action = 'Total-Supply', + Data = TotalSupply, + Ticker = Ticker + }) +end) + + diff --git a/hyper/Makefile b/hyper/Makefile new file mode 100644 index 000000000..681223ea8 --- /dev/null +++ b/hyper/Makefile @@ -0,0 +1,9 @@ +test: + eval $(luarocks path) + busted + +download: + wget https://www.lua.org/ftp/lua-5.3.6.tar.gz + tar -xzf lua-5.3.6.tar.gz + wget https://luarocks.org/releases/luarocks-3.9.2.tar.gz + tar -xzf luarocks-3.9.2.tar.gz diff --git a/hyper/README.md b/hyper/README.md new file mode 100644 index 000000000..f9f2115f4 --- /dev/null +++ b/hyper/README.md @@ -0,0 +1,77 @@ +# hyper AOS + +hyper AOS is a hyperBEAM based implementation of AOS, focused to deliver lighting fast performance to the AO network. + + +## Developer Setup + + +* Install lua + +```sh +wget https://www.lua.org/ftp/lua-5.3.6.tar.gz +tar -xzf lua-5.3.6.tar.gz +cd lua-5.3.6 +``` + +For linux + +```sh +make linux +``` + +For mac + +```sh +make macosx +``` + +```sh +sudo make install +``` + +* Install luarocks + +```sh +wget https://luarocks.org/releases/luarocks-3.9.2.tar.gz +tar -xzf luarocks-3.9.2.tar.gz +cd luarocks-3.9.2 +``` + +```sh +./configure --lua-version=5.3 --with-lua=/usr/local +make +sudo make install +``` + +* Init lua env + +```sh +luarocks init +``` + +* Install busted testing library + +```sh +luarocks install busted +``` + +* Setup lua env + +```sh +eval $(luarocks path) +``` + +## Tests + +* Running Tests + +```sh +busted +``` + +* 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 new file mode 100644 index 000000000..7d20a23ba --- /dev/null +++ b/hyper/bundle.js @@ -0,0 +1,67 @@ +/** + * 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, + * 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 figlet from 'figlet' + + +let __dirname = url.fileURLToPath(new URL('.', import.meta.url)); +if (os.platform() === 'win32') { + __dirname = __dirname.replace(/\\/g, "/").replace(/^[A-Za-z]:\//, "/") +} + +export function dry() { + console.log('not implemented') + 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' ] + .map(name => { + const code = fs.readFileSync(__dirname + 'src/' + name, 'utf-8') + const mod = name.replace(/\.lua$/, "") + return template(mod, code) + }) + .join('\n\n') + let main = fs.readFileSync(__dirname + 'src/' + "main.lua", "utf-8") + luaFiles += '\n\n' + main + let args = process.argv.slice(2) + if (args[0]) { + luaFiles += '\n\n' + fs.readFileSync(__dirname + 'blueprints/' + args[0], 'utf-8') + } + let aosLogo = figlet.textSync('AOS') + luaFiles += '\n\n' + `print [[${aosLogo}]]` + + return luaFiles +} + +function template(mod, code) { + return ` +local function load_${mod.replace("-", "_")}() + ${code} +end +_G.package.loaded[".${mod}"] = load_${mod.replace("-", "_")}() +print("loaded ${mod}") + ` +} + + +console.log( + update() +) + + diff --git a/hyper/package.json b/hyper/package.json new file mode 100644 index 000000000..843dfea6e --- /dev/null +++ b/hyper/package.json @@ -0,0 +1,14 @@ +{ + "type": "module", + "name": "hyper", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "scripts": { + "build": "node bundle.js > hyper-aos.lua", + "deploy": "arx upload hyper-aos.lua -t arweave -w $WALLET_FILE --content-type text/x-lua --tags data-protocol ao" + }, + "dependencies": { + "figlet": "^1.8.1" + } +} diff --git a/hyper/spec/ao_spec.lua b/hyper/spec/ao_spec.lua new file mode 100644 index 000000000..827f1a451 --- /dev/null +++ b/hyper/spec/ao_spec.lua @@ -0,0 +1,366 @@ +--[[ +hyper AOS unit tests + +ao module + +* clearOutbox function +* init function +* send function +* spawn function +* result function +* event function +]] + +describe("ao", function() + + local ao + local mockUtils, mockHandlers + + before_each(function() + -- Mock dependencies + mockUtils = { + map = function(fn, tbl) + for i, v in ipairs(tbl or {}) do + fn(v) + end + end, + keys = function(tbl) + local keys = {} + for k, _ in pairs(tbl or {}) do + table.insert(keys, k) + end + return keys + end, + reduce = function(fn, acc, tbl) + for _, v in ipairs(tbl or {}) do + acc = fn(acc, v) + end + return acc + end, + includes = function(item, tbl) + for _, v in ipairs(tbl or {}) do + if v == item then return true end + end + return false + end + } + + mockHandlers = { + once = function() end + } + + -- Mock package.loaded + package.loaded['.handlers'] = mockHandlers + package.loaded['.utils'] = mockUtils + + -- Clear any existing global ao and Handlers + ao = nil + Handlers = mockHandlers + + -- Require the module after mocking + ao = require('src/ao') + end) + + after_each(function() + -- Clean up package.loaded + package.loaded['.handlers'] = nil + package.loaded['.utils'] = nil + package.loaded['src/ao'] = nil + Handlers = nil + ao = nil + end) + + describe("initialization", function() + + it("should have version 0.0.6", function() + assert.are.equal("0.0.6", ao._version) + end) + + it("should initialize with empty id", function() + assert.are.equal("", ao.id) + end) + + it("should initialize with empty authorities", function() + assert.is_not_nil(ao.authorities) + assert.are.equal("table", type(ao.authorities)) + assert.are.equal(0, #ao.authorities) + end) + + it("should initialize reference to 0", function() + assert.are.equal(0, ao.reference) + end) + + it("should initialize outbox with proper structure", function() + assert.is_not_nil(ao.outbox) + assert.is_not_nil(ao.outbox.Output) + assert.is_not_nil(ao.outbox.Messages) + assert.is_not_nil(ao.outbox.Spawns) + assert.is_not_nil(ao.outbox.Assignments) + end) + + it("should preserve existing ao data when present", function() + local existingAo = { + id = "existing-id", + reference = 5, + authorities = {"auth1", "auth2"} + } + + package.loaded['src/ao'] = nil + _G.ao = existingAo + local newAo = require('src/ao') + + assert.are.equal("existing-id", newAo.id) + assert.are.equal(5, newAo.reference) + assert.are.equal(2, #newAo.authorities) + end) + + end) + + describe("clearOutbox", function() + + it("should reset outbox to empty structure", function() + ao.outbox.Messages = { {data = "test"} } + ao.outbox.Output = { data = "test" } + + ao.clearOutbox() + + assert.are.equal(0, #ao.outbox.Messages) + assert.are.equal(0, #ao.outbox.Spawns) + assert.are.equal(0, #ao.outbox.Assignments) + assert.is_not_nil(ao.outbox.Output) + end) + + end) + + describe("init", function() + + local mockEnv + + before_each(function() + mockEnv = { + process = { + commitments = { + ["test-id"] = { + alg = "rsa-pss-sha512", + committer = "test-committer" + } + }, + authority = {"auth1", "auth2", "auth3"} -- Use table instead of string to avoid parsing + } + } + ao.id = "" + ao.authorities = {} + end) + + it("should set id from process commitments", function() + local originalPrint = print + print = function() end + + ao.init(mockEnv) + + print = originalPrint + assert.are.equal("test-id", ao.id) + end) + + it("should not change id if already set", function() + local originalPrint = print + print = function() end + + ao.id = "existing-id" + ao.init(mockEnv) + + print = originalPrint + assert.are.equal("existing-id", ao.id) + end) + + it("should handle array authority directly", function() + local originalPrint = print + print = function() end + + ao.init(mockEnv) + + print = originalPrint + assert.are.equal(3, #ao.authorities) + assert.are.equal("auth1", ao.authorities[1]) + assert.are.equal("auth2", ao.authorities[2]) + assert.are.equal("auth3", ao.authorities[3]) + end) + + + it("should use table authority directly", function() + local originalPrint = print + print = function() end + + mockEnv.process.authority = {"direct1", "direct2"} + ao.init(mockEnv) + + print = originalPrint + assert.are.equal(2, #ao.authorities) + assert.are.equal("direct1", ao.authorities[1]) + assert.are.equal("direct2", ao.authorities[2]) + end) + + it("should not change authorities if already populated", function() + local originalPrint = print + print = function() end + + ao.authorities = {"existing"} + ao.init(mockEnv) + + print = originalPrint + assert.are.equal(1, #ao.authorities) + assert.are.equal("existing", ao.authorities[1]) + end) + + it("should reset outbox", function() + local originalPrint = print + print = function() end + + ao.outbox.Messages = { {data = "old"} } + ao.init(mockEnv) + + print = originalPrint + assert.are.equal(0, #ao.outbox.Messages) + end) + + it("should set env", function() + local originalPrint = print + print = function() end + + ao.init(mockEnv) + + print = originalPrint + assert.are.equal(mockEnv, ao.env) + end) + + end) + + describe("send", function() + + before_each(function() + ao.reference = 0 + ao.outbox.Messages = {} + end) + + it("should increment reference", function() + local msg = { target = "test-target", data = "test" } + ao.send(msg) + + assert.are.equal(1, ao.reference) + assert.are.equal("1", msg.reference) + end) + + it("should add message to outbox", function() + local msg = { target = "test-target", data = "test" } + ao.send(msg) + + assert.are.equal(1, #ao.outbox.Messages) + assert.are.equal("test-target", ao.outbox.Messages[1].target) + assert.are.equal("test", ao.outbox.Messages[1].data) + end) + + it("should add onReply function when target exists", function() + local msg = { target = "test-target", data = "test" } + local result = ao.send(msg) + + assert.is_not_nil(result.onReply) + assert.are.equal("function", type(result.onReply)) + end) + + it("should validate message is table", function() + assert.has_error(function() + ao.send("not a table") + end) + end) + + it("should return message with modifications", function() + local msg = { target = "test-target", data = "test" } + local result = ao.send(msg) + + assert.are.equal(msg, result) + assert.are.equal("1", result.reference) + end) + + end) + + describe("spawn", function() + + before_each(function() + ao.reference = 0 + ao.outbox.Spawns = {} + ao.id = "test-ao-id" + end) + + it("should increment reference", function() + local msg = { data = "test" } + ao.spawn("module-id", msg) + + assert.are.equal(1, ao.reference) + assert.are.equal("1", msg.reference) + end) + + it("should add spawn to outbox", function() + local msg = { data = "test" } + ao.spawn("module-id", msg) + + assert.are.equal(1, #ao.outbox.Spawns) + assert.are.equal("test", ao.outbox.Spawns[1].data) + end) + + it("should add onReply function", function() + local msg = { data = "test" } + local result = ao.spawn("module-id", msg) + + assert.is_not_nil(result.onReply) + assert.are.equal("function", type(result.onReply)) + end) + + it("should validate module is string", function() + assert.has_error(function() + ao.spawn(123, {}) + end) + end) + + it("should validate message is table", function() + assert.has_error(function() + ao.spawn("module-id", "not a table") + end) + end) + + end) + + describe("result", function() + + it("should return result object with outbox structure", function() + local testResult = { Output = { data = "test" } } + local result = ao.result(testResult) + + assert.is_not_nil(result) + assert.are.equal("test", result.Output.data) + -- ao.result adds outbox structure + assert.is_not_nil(result.Messages) + assert.is_not_nil(result.Spawns) + assert.is_not_nil(result.Assignments) + end) + + end) + + describe("event", function() + + it("should call event function if it exists", function() + local eventCalled = false + local testData = { action = "test" } + + ao.event = function(data) + eventCalled = true + assert.are.equal(testData, data) + end + + ao.event(testData) + + assert.is_true(eventCalled) + end) + + end) + +end) \ No newline at end of file diff --git a/hyper/spec/handlers_spec.lua b/hyper/spec/handlers_spec.lua new file mode 100644 index 000000000..a6c0831a5 --- /dev/null +++ b/hyper/spec/handlers_spec.lua @@ -0,0 +1,370 @@ +--[[ +hyper AOS unit tests + +handlers module + +* add function +* append function +* prepend function +* remove function +* evaluate function +* once function +* generateResolver function +]] + +describe("handlers", function() + + local handlers + local mockUtils, mockHandlersUtils + + before_each(function() + -- Mock dependencies + mockUtils = { + matchesSpec = function(msg, spec) return true end, + reduce = function(fn, acc, tbl) return acc end + } + + mockHandlersUtils = {} + + -- Mock package.loaded + package.loaded['.utils'] = mockUtils + package.loaded['.handlers-utils'] = mockHandlersUtils + + -- Clear any existing global Handlers + _G.Handlers = nil + + -- Require the module after mocking + handlers = require('src/handlers') + end) + + after_each(function() + -- Clean up package.loaded + package.loaded['.utils'] = nil + package.loaded['.handlers-utils'] = nil + package.loaded['src/handlers'] = nil + _G.Handlers = nil + end) + + describe("initialization", function() + + it("should have version 0.0.5", function() + assert.are.equal("0.0.5", handlers._version) + end) + + it("should initialize empty list", function() + assert.is_not_nil(handlers.list) + assert.are.equal("table", type(handlers.list)) + assert.are.equal(0, #handlers.list) + end) + + it("should initialize onceNonce to 0", function() + assert.are.equal(0, handlers.onceNonce) + end) + + it("should preserve existing Handlers.list if Handlers exists", function() + _G.Handlers = { list = { { name = "existing" } } } + package.loaded['src/handlers'] = nil + local newHandlers = require('src/handlers') + + assert.are.equal(1, #newHandlers.list) + assert.are.equal("existing", newHandlers.list[1].name) + end) + + end) + + describe("generateResolver", function() + + it("should return function when given function", function() + local testFunc = function() return "test" end + local resolver = handlers.generateResolver(testFunc) + + assert.are.equal("function", type(resolver)) + assert.are.equal("test", resolver()) + end) + + it("should handle table of patterns", function() + local resolveSpec = { + ["test-pattern"] = function() return "matched" end + } + + local resolver = handlers.generateResolver(resolveSpec) + local result = resolver({ action = "test" }) + + assert.are.equal("matched", result) + end) + + end) + + describe("add", function() + + before_each(function() + handlers.list = {} + end) + + it("should add handler with 2 args (name, handle)", function() + local testHandle = function() return "test" end + handlers.add("test-handler", testHandle) + + assert.are.equal(1, #handlers.list) + assert.are.equal("test-handler", handlers.list[1].name) + assert.are.equal("test-handler", handlers.list[1].pattern) + assert.is_nil(handlers.list[1].maxRuns) + end) + + it("should add handler with 3 args (name, pattern, handle)", function() + local testPattern = function() return true end + local testHandle = function() return "test" end + handlers.add("test-handler", testPattern, testHandle) + + assert.are.equal(1, #handlers.list) + assert.are.equal("test-handler", handlers.list[1].name) + assert.are.equal(testPattern, handlers.list[1].pattern) + end) + + it("should add handler with 4 args (name, pattern, handle, maxRuns)", function() + local testPattern = function() return true end + local testHandle = function() return "test" end + handlers.add("test-handler", testPattern, testHandle, 5) + + assert.are.equal(1, #handlers.list) + assert.are.equal("test-handler", handlers.list[1].name) + assert.are.equal(5, handlers.list[1].maxRuns) + end) + + it("should update existing handler by name", function() + local testHandle1 = function() return "test1" end + local testHandle2 = function() return "test2" end + + handlers.add("test-handler", testHandle1) + handlers.add("test-handler", testHandle2) + + assert.are.equal(1, #handlers.list) + end) + + it("should validate arguments", function() + assert.has_error(function() + handlers.add(123, function() end) -- invalid name type + end) + + assert.has_error(function() + handlers.add("test", 123, function() end) -- invalid pattern type + end) + end) + + end) + + describe("append", function() + + before_each(function() + handlers.list = {} + handlers.add("first", function() end) + end) + + it("should add handler to end of list", function() + handlers.append("second", function() end) + + assert.are.equal(2, #handlers.list) + assert.are.equal("second", handlers.list[2].name) + end) + + end) + + describe("prepend", function() + + before_each(function() + handlers.list = {} + handlers.add("first", function() end) + end) + + it("should add handler to beginning of list", function() + handlers.prepend("zeroth", function() end) + + assert.are.equal(2, #handlers.list) + assert.are.equal("zeroth", handlers.list[1].name) + assert.are.equal("first", handlers.list[2].name) + end) + + end) + + describe("remove", function() + + before_each(function() + handlers.list = {} + handlers.add("first", function() end) + handlers.add("second", function() end) + handlers.add("third", function() end) + end) + + it("should remove handler by name", function() + handlers.remove("second") + + assert.are.equal(2, #handlers.list) + assert.are.equal("first", handlers.list[1].name) + assert.are.equal("third", handlers.list[2].name) + end) + + it("should remove handler successfully", function() + local initialCount = #handlers.list + handlers.remove("second") + + assert.are.equal(initialCount - 1, #handlers.list) + end) + + it("should return nil if handler not found", function() + local removed = handlers.remove("nonexistent") + + assert.is_nil(removed) + end) + + end) + + describe("once", function() + + before_each(function() + handlers.list = {} + -- Reset onceNonce to get predictable names + handlers.onceNonce = 0 + end) + + it("should add handler with maxRuns of 1", function() + handlers.once("test-once", function() end) + + assert.are.equal(1, #handlers.list) + assert.are.equal(1, handlers.list[1].maxRuns) + end) + + it("should generate name when not provided", function() + -- Reset nonce first + handlers.onceNonce = 0 + handlers.once(function() end, function() end) + + assert.are.equal(1, #handlers.list) + assert.are.equal("_once_0", handlers.list[1].name) + assert.are.equal(1, handlers.onceNonce) + end) + + it("should increment onceNonce for generated names", function() + -- Save current state and reset completely + local originalNonce = handlers.onceNonce + local originalList = handlers.list + handlers.list = {} + handlers.onceNonce = 0 + + handlers.once(function() end, function() end) + handlers.once(function() end, function() end) + + assert.are.equal(2, #handlers.list) + -- Since prepend inserts at position 1, the second handler comes first + assert.are.equal("_once_1", handlers.list[1].name) + assert.are.equal("_once_0", handlers.list[2].name) + assert.are.equal(2, handlers.onceNonce) + + -- Restore original state + handlers.onceNonce = originalNonce + handlers.list = originalList + end) + + end) + + describe("evaluate", function() + + before_each(function() + handlers.list = {} + end) + + it("should call matching handler", function() + local called = false + local testPattern = function() return true end + local testHandle = function() called = true end + + handlers.add("test", testPattern, testHandle) + handlers.evaluate({ action = "test" }, { process = {} }) + + assert.is_true(called) + end) + + it("should not call non-matching handler", function() + local called = false + local testPattern = function() return false end + local testHandle = function() called = true end + + -- Mock matchesSpec to return false for this test + mockUtils.matchesSpec = function(msg, spec) return false end + + handlers.add("test", testPattern, testHandle) + -- Add a default handler to avoid the nil error + handlers.add("_default", function() return true end, function() end) + + handlers.evaluate({ action = "test" }, { process = {} }) + + assert.is_false(called) + end) + + it("should handle handler returning -1 (break)", function() + local firstCalled = false + local secondCalled = false + + handlers.add("first", function() return true end, function() + firstCalled = true + return -1 + end) + handlers.add("second", function() return true end, function() + secondCalled = true + end) + + handlers.evaluate({ action = "test" }, { process = {} }) + + assert.is_true(firstCalled) + assert.is_false(secondCalled) + end) + + it("should handle handler returning 0 (skip)", function() + local firstCalled = false + local secondCalled = false + + -- Mock matchesSpec to return specific values based on pattern + mockUtils.matchesSpec = function(msg, pattern) + if type(pattern) == "function" then + return pattern() + end + return true + end + + handlers.add("first", function() return 0 end, function() + firstCalled = true + return 0 + end) + handlers.add("second", function() return true end, function() + secondCalled = true + end) + + handlers.evaluate({ action = "test" }, { process = {} }) + + assert.is_false(firstCalled) -- Should not be called because pattern returns 0 + assert.is_true(secondCalled) + end) + + it("should remove handler after maxRuns reached", function() + local callCount = 0 + handlers.add("test", function() return true end, function() + callCount = callCount + 1 + end, 2) + -- Add a default handler to avoid the nil error + handlers.add("_default", function() return true end, function() end) + + handlers.evaluate({ action = "test" }, { process = {} }) + handlers.evaluate({ action = "test" }, { process = {} }) + handlers.evaluate({ action = "test" }, { process = {} }) + + assert.are.equal(2, callCount) + -- Handler should be removed from list after maxRuns + local found = false + for _, h in ipairs(handlers.list) do + if h.name == "test" then found = true end + end + assert.is_false(found) + end) + + end) + +end) \ No newline at end of file diff --git a/hyper/spec/json_spec.lua b/hyper/spec/json_spec.lua new file mode 100644 index 000000000..990cd7f68 --- /dev/null +++ b/hyper/spec/json_spec.lua @@ -0,0 +1,447 @@ +--[[ +hyper AOS unit tests + +json module + +* encode function +* decode function +* error handling +* edge cases +]] + +describe("json", function() + + local json + + before_each(function() + json = require('src/json') + end) + + after_each(function() + package.loaded['src/json'] = nil + end) + + describe("initialization", function() + + it("should have version 0.2.0", function() + assert.are.equal("0.2.0", json._version) + end) + + it("should have encode function", function() + assert.are.equal("function", type(json.encode)) + end) + + it("should have decode function", function() + assert.are.equal("function", type(json.decode)) + end) + + end) + + describe("encode", function() + + describe("basic types", function() + + it("should encode nil to null", function() + assert.are.equal("null", json.encode(nil)) + end) + + it("should encode boolean true", function() + assert.are.equal("true", json.encode(true)) + end) + + it("should encode boolean false", function() + assert.are.equal("false", json.encode(false)) + end) + + it("should encode numbers", function() + assert.are.equal("42", json.encode(42)) + assert.are.equal("3.14", json.encode(3.14)) + assert.are.equal("0", json.encode(0)) + assert.are.equal("-123", json.encode(-123)) + end) + + it("should encode strings", function() + assert.are.equal('"hello"', json.encode("hello")) + assert.are.equal('""', json.encode("")) + end) + + end) + + describe("string escaping", function() + + it("should escape special characters", function() + assert.are.equal('"hello\\nworld"', json.encode("hello\nworld")) + assert.are.equal('"tab\\there"', json.encode("tab\there")) + assert.are.equal('"quote\\""', json.encode('quote"')) + assert.are.equal('"backslash\\\\"', json.encode("backslash\\")) + end) + + it("should escape control characters", function() + assert.are.equal('"\\b"', json.encode("\b")) + assert.are.equal('"\\f"', json.encode("\f")) + assert.are.equal('"\\r"', json.encode("\r")) + end) + + end) + + describe("arrays", function() + + it("should encode empty array", function() + assert.are.equal("[]", json.encode({})) + end) + + it("should encode simple array", function() + assert.are.equal("[1,2,3]", json.encode({1, 2, 3})) + end) + + it("should encode mixed type array", function() + local result = json.encode({1, "hello", true}) + assert.are.equal('[1,"hello",true]', result) + end) + + it("should encode nested arrays", function() + assert.are.equal("[[1,2],[3,4]]", json.encode({{1, 2}, {3, 4}})) + end) + + end) + + describe("objects", function() + + it("should encode simple object", function() + local result = json.encode({name = "John", age = 30}) + -- Since order is not guaranteed, check both possibilities + local expected1 = '{"name":"John","age":30}' + local expected2 = '{"age":30,"name":"John"}' + assert.is_true(result == expected1 or result == expected2) + end) + + it("should encode nested objects", function() + local obj = { + person = { + name = "John", + details = {age = 30} + } + } + local result = json.encode(obj) + assert.is_true(string.find(result, '"person"') ~= nil) + assert.is_true(string.find(result, '"name":"John"') ~= nil) + assert.is_true(string.find(result, '"age":30') ~= nil) + end) + + it("should skip function values", function() + local obj = { + name = "John", + func = function() end, + age = 30 + } + local result = json.encode(obj) + assert.is_false(string.find(result, "func") ~= nil) + assert.is_true(string.find(result, "name") ~= nil) + assert.is_true(string.find(result, "age") ~= nil) + end) + + end) + + describe("error cases", function() + + it("should error on invalid number values", function() + assert.has_error(function() + json.encode(math.huge) + end) + + assert.has_error(function() + json.encode(-math.huge) + end) + + assert.has_error(function() + json.encode(0/0) -- NaN + end) + end) + + it("should error on circular references", function() + local obj = {} + obj.self = obj + + assert.has_error(function() + json.encode(obj) + end) + end) + + it("should error on mixed key types in tables", function() + local mixed = {1, 2, name = "John"} + + assert.has_error(function() + json.encode(mixed) + end) + end) + + it("should error on sparse arrays", function() + local sparse = {1, nil, 3} + sparse[5] = 5 + + assert.has_error(function() + json.encode(sparse) + end) + end) + + it("should error on non-string object keys", function() + local obj = {} + obj[42] = "number key" + + assert.has_error(function() + json.encode(obj) + end) + end) + + it("should error on unsupported types", function() + assert.has_error(function() + json.encode(function() end) + end) + + assert.has_error(function() + json.encode(coroutine.create(function() end)) + end) + end) + + end) + + end) + + describe("decode", function() + + describe("basic types", function() + + it("should decode null to nil", function() + assert.is_nil(json.decode("null")) + end) + + it("should decode booleans", function() + assert.is_true(json.decode("true")) + assert.is_false(json.decode("false")) + end) + + it("should decode numbers", function() + assert.are.equal(42, json.decode("42")) + assert.are.equal(3.14, json.decode("3.14")) + assert.are.equal(0, json.decode("0")) + assert.are.equal(-123, json.decode("-123")) + end) + + it("should decode strings", function() + assert.are.equal("hello", json.decode('"hello"')) + assert.are.equal("", json.decode('""')) + end) + + end) + + describe("string unescaping", function() + + it("should unescape special characters", function() + assert.are.equal("hello\nworld", json.decode('"hello\\nworld"')) + assert.are.equal("tab\there", json.decode('"tab\\there"')) + assert.are.equal('quote"', json.decode('"quote\\""')) + assert.are.equal("backslash\\", json.decode('"backslash\\\\"')) + end) + + it("should unescape control characters", function() + assert.are.equal("\b", json.decode('"\\b"')) + assert.are.equal("\f", json.decode('"\\f"')) + assert.are.equal("\r", json.decode('"\\r"')) + end) + + end) + + describe("arrays", function() + + it("should decode empty array", function() + local result = json.decode("[]") + assert.are.equal("table", type(result)) + assert.are.equal(0, #result) + end) + + it("should decode simple array", function() + local result = json.decode("[1,2,3]") + assert.are.equal(3, #result) + assert.are.equal(1, result[1]) + assert.are.equal(2, result[2]) + assert.are.equal(3, result[3]) + end) + + it("should decode mixed type array", function() + local result = json.decode('[1,"hello",true,null]') + -- Note: null becomes nil, which doesn't count in Lua array length + assert.are.equal(3, #result) + assert.are.equal(1, result[1]) + assert.are.equal("hello", result[2]) + assert.is_true(result[3]) + assert.is_nil(result[4]) -- This is still accessible but doesn't affect length + end) + + it("should encode array with explicit nil", function() + -- Note: Lua arrays with nil values are tricky + local arr = {1, "hello", true} + arr[4] = nil -- This won't actually set anything + local result = json.encode(arr) + assert.are.equal('[1,"hello",true]', result) + end) + + it("should decode nested arrays", function() + local result = json.decode("[[1,2],[3,4]]") + assert.are.equal(2, #result) + assert.are.equal(2, #result[1]) + assert.are.equal(1, result[1][1]) + assert.are.equal(4, result[2][2]) + end) + + it("should handle whitespace in arrays", function() + local result = json.decode("[ 1 , 2 , 3 ]") + assert.are.equal(3, #result) + assert.are.equal(1, result[1]) + end) + + end) + + describe("objects", function() + + it("should decode empty object", function() + local result = json.decode("{}") + assert.are.equal("table", type(result)) + assert.is_nil(next(result)) -- empty table + end) + + it("should decode simple object", function() + local result = json.decode('{"name":"John","age":30}') + assert.are.equal("John", result.name) + assert.are.equal(30, result.age) + end) + + it("should decode nested objects", function() + local result = json.decode('{"person":{"name":"John","age":30}}') + assert.are.equal("John", result.person.name) + assert.are.equal(30, result.person.age) + end) + + it("should handle whitespace in objects", function() + local result = json.decode('{ "name" : "John" , "age" : 30 }') + assert.are.equal("John", result.name) + assert.are.equal(30, result.age) + end) + + end) + + describe("error cases", function() + + it("should error on non-string input", function() + assert.has_error(function() + json.decode(42) + end) + + assert.has_error(function() + json.decode(nil) + end) + end) + + it("should error on invalid JSON", function() + assert.has_error(function() + json.decode("invalid") + end) + + assert.has_error(function() + json.decode("{invalid}") + end) + + assert.has_error(function() + json.decode("[1,2,") + end) + end) + + it("should error on trailing garbage", function() + assert.has_error(function() + json.decode('{"name":"John"} extra') + end) + end) + + it("should error on invalid escape sequences", function() + assert.has_error(function() + json.decode('"invalid\\x escape"') + end) + end) + + it("should error on control characters in strings", function() + assert.has_error(function() + json.decode('"\x01"') -- control character + end) + end) + + it("should error on unclosed strings", function() + assert.has_error(function() + json.decode('"unclosed string') + end) + end) + + it("should error on invalid numbers", function() + assert.has_error(function() + json.decode("123abc") + end) + end) + + it("should error on missing colons in objects", function() + assert.has_error(function() + json.decode('{"name" "John"}') + end) + end) + + it("should error on missing commas", function() + assert.has_error(function() + json.decode('[1 2 3]') + end) + + assert.has_error(function() + json.decode('{"a":1 "b":2}') + end) + end) + + end) + + end) + + describe("roundtrip", function() + + it("should encode and decode back to original", function() + local original = { + name = "John", + age = 30, + active = true, + scores = {85, 92, 78}, + address = { + street = "123 Main St", + city = "Anytown" + } + } + + local encoded = json.encode(original) + local decoded = json.decode(encoded) + + assert.are.equal(original.name, decoded.name) + assert.are.equal(original.age, decoded.age) + assert.are.equal(original.active, decoded.active) + assert.are.equal(#original.scores, #decoded.scores) + assert.are.equal(original.scores[1], decoded.scores[1]) + assert.are.equal(original.address.street, decoded.address.street) + end) + + it("should handle arrays correctly", function() + local original = {1, "hello", true, {nested = "value"}} + local encoded = json.encode(original) + local decoded = json.decode(encoded) + + assert.are.equal(#original, #decoded) + assert.are.equal(original[1], decoded[1]) + assert.are.equal(original[2], decoded[2]) + assert.are.equal(original[3], decoded[3]) + assert.are.equal(original[4].nested, decoded[4].nested) + end) + + end) + +end) \ No newline at end of file diff --git a/hyper/spec/main_simple_spec.lua b/hyper/spec/main_simple_spec.lua new file mode 100644 index 000000000..6fdaf3e9e --- /dev/null +++ b/hyper/spec/main_simple_spec.lua @@ -0,0 +1,27 @@ +--[[ +hyper AOS unit tests + +main module (simplified) + +* compute function basic behavior +]] + +describe("main (simplified)", function() + + describe("compute", function() + + it("should be a function", function() + local main = require('src/main') + assert.are.equal("function", type(compute)) + end) + + it("should require basic parameters", function() + -- Test that compute function exists and can be called + -- without mocking the entire AO environment + assert.is_not_nil(compute) + assert.are.equal("function", type(compute)) + end) + + end) + +end) \ No newline at end of file diff --git a/hyper/spec/main_spec.lua b/hyper/spec/main_spec.lua new file mode 100644 index 000000000..ee0bd3c08 --- /dev/null +++ b/hyper/spec/main_spec.lua @@ -0,0 +1,157 @@ +--[[ +hyper AOS unit tests + +main module + +* compute function +]] +local main = require('src/main') + +describe("main", function() + + describe("compute", function() + + local mockBase, mockReq, mockOpts + + before_each(function() + -- Mock the global ao object + _G.ao = { + event = function() end + } + + -- Mock the process module + package.loaded['.process'] = { + handle = function(req, base) + return { + Output = { data = "test output" }, + Messages = { + { target = "test-target", data = "test message 1" }, + { target = "test-target2", data = "test message 2" } + } + } + end + } + + mockBase = { + process = { id = "test-process-id" }, + results = {} + } + + mockReq = { + body = { action = "Test", data = "test data" } + } + + mockOpts = {} + end) + + after_each(function() + -- Clean up global ao + _G.ao = nil + -- Clean up mocked modules + package.loaded['.process'] = nil + end) + + it("should return base object with results", function() + local result = compute(mockBase, mockReq, mockOpts) + + assert.is_not_nil(result) + assert.are.equal(mockBase, result) + assert.is_not_nil(result.results) + end) + + it("should set info to 'hyper-aos'", function() + local result = compute(mockBase, mockReq, mockOpts) + + assert.are.equal("hyper-aos", result.results.info) + end) + + it("should initialize empty outbox", function() + local result = compute(mockBase, mockReq, mockOpts) + + assert.is_not_nil(result.results.outbox) + assert.are.equal("table", type(result.results.outbox)) + end) + + it("should set output from process results", function() + local result = compute(mockBase, mockReq, mockOpts) + + assert.are.equal("test output", result.results.output.data) + end) + + it("should populate outbox with indexed messages", function() + local result = compute(mockBase, mockReq, mockOpts) + + assert.are.equal("test message 1", result.results.outbox["1"].data) + assert.are.equal("test message 2", result.results.outbox["2"].data) + assert.are.equal("test-target", result.results.outbox["1"].target) + assert.are.equal("test-target2", result.results.outbox["2"].target) + end) + + it("should handle empty messages array", function() + -- Override process mock to return empty messages + package.loaded['.process'] = { + handle = function(req, base) + return { + Output = { data = "test output" }, + Messages = {} + } + end + } + + local result = compute(mockBase, mockReq, mockOpts) + + assert.are.equal(0, #result.results.outbox) + end) + + it("should call ao.event with process and request body", function() + local eventCalls = {} + _G.ao.event = function(data) + table.insert(eventCalls, data) + end + + compute(mockBase, mockReq, mockOpts) + + assert.are.equal(2, #eventCalls) + assert.are.equal(mockBase.process, eventCalls[1]) + assert.are.equal(mockReq.body, eventCalls[2]) + end) + + it("should call process.handle with correct parameters", function() + local handleCalls = {} + package.loaded['.process'] = { + handle = function(req, base) + table.insert(handleCalls, {req = req, base = base}) + return { + Output = { data = "test" }, + Messages = {} + } + end + } + + compute(mockBase, mockReq, mockOpts) + + assert.are.equal(1, #handleCalls) + assert.are.equal(mockReq, handleCalls[1].req) + assert.are.equal(mockBase, handleCalls[1].base) + end) + + it("should handle process.handle returning nil Messages", function() + package.loaded['.process'] = { + handle = function(req, base) + return { + Output = { data = "test output" }, + Messages = nil + } + end + } + + -- Should handle nil Messages gracefully + local result = compute(mockBase, mockReq, mockOpts) + assert.is_not_nil(result) + assert.is_not_nil(result.results) + assert.are.equal("test output", result.results.output.data) + end) + + end) + +end) \ No newline at end of file diff --git a/hyper/spec/process_spec.lua b/hyper/spec/process_spec.lua new file mode 100644 index 000000000..f42603573 --- /dev/null +++ b/hyper/spec/process_spec.lua @@ -0,0 +1,315 @@ +--[[ +hyper AOS unit tests + +process module + +* handle function +* Version function +]] + +describe("process", function() + + local process + local mockAo, mockHandlers, mockUtils, mockState, mockEval, mockDefault, mockJson + + before_each(function() + -- Mock all dependencies + mockAo = { + init = function() end, + clearOutbox = function() end, + result = function(r) return r end, + send = function(msg) return msg end + } + + mockHandlers = { + add = function() end, + remove = function() end, + evaluate = function() return true end + } + + mockUtils = { + map = function(fn, tbl) + for i, v in ipairs(tbl or {}) do + fn(v) + end + end, + keys = function(tbl) + local keys = {} + for k, _ in pairs(tbl or {}) do + table.insert(keys, k) + end + return keys + end + } + + mockState = { + reset = function(logs) return {} end, + init = function() end, + isTrusted = function() return true end, + getFrom = function() return "test-from" end, + insertInbox = function() end + } + + mockEval = function() return function() end end + mockDefault = function() return function() end end + mockJson = { + decode = function(str) return {} end + } + + -- Set up global mocks + _G.ao = mockAo + _G.Handlers = mockHandlers + _G.Utils = mockUtils + _G.HandlerPrintLogs = {} + _G.Owner = "test-owner" + _G.Colors = { + red = "", green = "", gray = "", reset = "" + } + _G.Prompt = function() return "aos> " end + _G.Errors = {} + _G.Version = function() print("version: " .. (process and process._version or "2.0.7")) end + + -- Mock package.loaded + package.loaded['.ao'] = mockAo + package.loaded['.handlers'] = mockHandlers + package.loaded['.utils'] = mockUtils + package.loaded['.dump'] = {} + package.loaded['.state'] = mockState + package.loaded['.eval'] = mockEval + package.loaded['.default'] = mockDefault + package.loaded['.json'] = mockJson + + -- Require the module after mocking + process = require('src/process') + end) + + after_each(function() + -- Clean up globals + _G.ao = nil + _G.Handlers = nil + _G.Utils = nil + _G.HandlerPrintLogs = nil + _G.Owner = nil + _G.Colors = nil + _G.Prompt = nil + _G.Errors = nil + _G.Version = nil + + -- Clean up package.loaded + package.loaded['.ao'] = nil + package.loaded['.handlers'] = nil + package.loaded['.utils'] = nil + package.loaded['.dump'] = nil + package.loaded['.state'] = nil + package.loaded['.eval'] = nil + package.loaded['.default'] = nil + package.loaded['.json'] = nil + package.loaded['src/process'] = nil + end) + + describe("handle", function() + + local mockReq, mockBase + + before_each(function() + mockReq = { + ['block-timestamp'] = "1234567890", + body = { + action = "Test", + data = "test data", + ['Content-Type'] = "text/plain" + } + } + + mockBase = { + process = { id = "test-process" } + } + end) + + it("should return untrusted message result when not trusted", function() + mockState.isTrusted = function() return false end + + local result = process.handle(mockReq, mockBase) + + assert.are.equal("Message is not trusted.", result.Output.data) + end) + + it("should decode JSON data when Content-Type is application/json", function() + local decodeCalled = false + mockJson.decode = function(str) + decodeCalled = true + return { decoded = true } + end + + mockReq.body['Content-Type'] = 'application/json' + mockReq.body.data = '{"test": true}' + + process.handle(mockReq, mockBase) + + assert.is_true(decodeCalled) + end) + + it("should set os.time from block-timestamp", function() + process.handle(mockReq, mockBase) + + assert.are.equal(1234567890, os.time()) + end) + + it("should add reply function to request", function() + local replyFn = nil + mockHandlers.evaluate = function(req) + replyFn = req.reply + return true + end + + process.handle(mockReq, mockBase) + + assert.is_not_nil(replyFn) + assert.are.equal("function", type(replyFn)) + end) + + it("should handle Eval action correctly", function() + mockReq.body.action = "Eval" + + local result = process.handle(mockReq, mockBase) + + assert.is_not_nil(result.Output) + assert.are.equal("aos> ", result.Output.prompt) + end) + + it("should handle non-Eval action correctly", function() + mockReq.body.action = "Balance" + + local result = process.handle(mockReq, mockBase) + + assert.is_not_nil(result.Output) + assert.are.equal("aos> ", result.Output.prompt) + assert.is_true(result.Output.print) + end) + + it("should handle handler evaluation errors", function() + mockHandlers.evaluate = function() + error("Test error") + end + + local result = process.handle(mockReq, mockBase) + + assert.is_not_nil(result.Output) + assert.is_true(string.find(result.Output.data, "error") ~= nil) + end) + + it("should handle Eval errors differently", function() + mockReq.body.action = "Eval" + mockHandlers.evaluate = function() + error("Eval test error") + end + + local result = process.handle(mockReq, mockBase) + + assert.is_not_nil(result.Error) + assert.is_true(string.find(result.Error, "Eval test error") ~= nil) + end) + + it("should initialize ao and state", function() + local aoInitCalled = false + local stateInitCalled = false + + mockAo.init = function() aoInitCalled = true end + mockState.init = function() stateInitCalled = true end + + process.handle(mockReq, mockBase) + + assert.is_true(aoInitCalled) + assert.is_true(stateInitCalled) + end) + + it("should clear outbox", function() + local clearOutboxCalled = false + mockAo.clearOutbox = function() clearOutboxCalled = true end + + process.handle(mockReq, mockBase) + + assert.is_true(clearOutboxCalled) + end) + + it("should add and remove _eval and _default handlers", function() + local addedHandlers = {} + local removedHandlers = {} + + mockHandlers.add = function(name) + table.insert(addedHandlers, name) + end + + mockHandlers.remove = function(name) + table.insert(removedHandlers, name) + end + + process.handle(mockReq, mockBase) + + -- Helper function + local function contains(tbl, item) + for _, v in ipairs(tbl) do + if v == item then return true end + end + return false + end + + assert.is_true(contains(addedHandlers, "_eval")) + assert.is_true(contains(addedHandlers, "_default")) + assert.is_true(contains(removedHandlers, "_eval")) + assert.is_true(contains(removedHandlers, "_default")) + end) + + it("should create reply function with correct properties", function() + local sentMessage = nil + mockAo.send = function(msg) + sentMessage = msg + return msg + end + + mockHandlers.evaluate = function(req) + req.reply({ data = "test reply" }) + return true + end + + process.handle(mockReq, mockBase) + + assert.is_not_nil(sentMessage) + assert.are.equal("test reply", sentMessage.data) + assert.are.equal("test-from", sentMessage.target) + end) + + end) + + describe("Version", function() + + it("should print version", function() + local printOutput = "" + local originalPrint = print + print = function(str) printOutput = str end + + -- The Version function from process.lua + local function Version() + print("version: " .. process._version) + end + + Version() + + print = originalPrint + assert.is_true(string.find(printOutput, "version:") ~= nil) + assert.is_true(string.find(printOutput, "2.0.7") ~= nil) + end) + + end) + +end) + +-- Helper function for testing +local utils = { + contains = function(tbl, item) + for _, v in ipairs(tbl) do + if v == item then return true end + end + return false + end +} \ No newline at end of file diff --git a/hyper/spec/string-ext_spec.lua b/hyper/spec/string-ext_spec.lua new file mode 100644 index 000000000..0fe25371b --- /dev/null +++ b/hyper/spec/string-ext_spec.lua @@ -0,0 +1,607 @@ +--[[ +hyper AOS unit tests + +string-ext module + +* string.gmatch implementation +]] +local string_ext = require('src/string-ext') + +describe("string-ext", function() + + -- Store original function to restore later + local original_gmatch = string.gmatch + + -- Install the extensions before running tests + before_each(function() + -- Force our implementation by clearing existing functions first + -- busted breaks if we don't do this + string.gmatch = nil + string_ext.install() + end) + + -- Restore original functions after tests + after_each(function() + string.gmatch = original_gmatch + end) + + describe("string.gmatch", function() + + it("should exist after installation", function() + assert.is_not_nil(string.gmatch) + assert.are.equal("function", type(string.gmatch)) + end) + + it("should find simple patterns", function() + local results = {} + for word in string.gmatch("hello world test", "%w+") do + table.insert(results, word) + end + assert.are.same({"hello", "world", "test"}, results) + end) + + it("should find digit patterns", function() + local results = {} + for num in string.gmatch("abc123def456ghi", "%d+") do + table.insert(results, num) + end + assert.are.same({"123", "456"}, results) + end) + + it("should handle captures", function() + local results = {} + for name, value in string.gmatch("name=john age=25 city=nyc", "(%w+)=(%w+)") do + table.insert(results, {name, value}) + end + assert.are.same({{"name", "john"}, {"age", "25"}, {"city", "nyc"}}, results) + end) + + it("should handle empty string", function() + local count = 0 + for match in string.gmatch("", "%w+") do + count = count + 1 + end + assert.are.equal(0, count) + end) + + it("should handle no matches", function() + local count = 0 + for match in string.gmatch("abc", "%d+") do + count = count + 1 + end + assert.are.equal(0, count) + end) + + it("should handle single character matches", function() + local results = {} + for char in string.gmatch("a1b2c3", "%a") do + table.insert(results, char) + end + assert.are.same({"a", "b", "c"}, results) + end) + + it("should handle line iteration like in process.lua", function() + local input = "line1\nline2\nline3\n" + local results = {} + for line in string.gmatch(input, "([^\n]*)\n?") do + if line ~= "" then -- Skip empty matches + table.insert(results, line) + end + end + assert.are.same({"line1", "line2", "line3"}, results) + end) + + it("should throw error for non-string input", function() + assert.has_error(function() + local iter = string.gmatch(123, "%w+") + iter() -- Call the iterator to trigger the error + end) + end) + + it("should throw error for non-string pattern", function() + assert.has_error(function() + local iter = string.gmatch("hello", 123) + iter() -- Call the iterator to trigger the error + end) + end) + + it("should throw error with correct message for non-string input", function() + local success, err = pcall(function() + string.gmatch(123, "%w+") + end) + assert.is_false(success) + assert.matches("bad argument #1 to 'gmatch'", err) + assert.matches("string expected, got number", err) + end) + + it("should throw error with correct message for non-string pattern", function() + local success, err = pcall(function() + string.gmatch("hello", 123) + end) + assert.is_false(success) + assert.matches("bad argument #2 to 'gmatch'", err) + assert.matches("string expected, got number", err) + end) + end) + + describe("Zero-Width Matches and Boundary Conditions", function() + + it("should handle zero-width matches correctly", function() + local results = {} + local count = 0 + for match in string.gmatch("abc", "()") do -- Empty capture at position + table.insert(results, match) + count = count + 1 + if count > 5 then break end -- Safety + end + -- Should handle gracefully without infinite loop + assert.is_true(count <= 5) + assert.is_true(#results <= 5) + end) + + it("should handle patterns that match empty strings", function() + local results = {} + local count = 0 + for match in string.gmatch("abc", "b*") do -- Can match empty string + table.insert(results, match) + count = count + 1 + if count > 10 then break end + end + -- Should not infinite loop + assert.is_true(count <= 10) + assert.is_true(#results <= 10) + end) + + it("should handle matches at string boundaries", function() + local results = {} + for match in string.gmatch("hello", "^%w+") do -- Start anchor + table.insert(results, match) + end + assert.are.same({"hello"}, results) + end) + + it("should handle overlapping potential matches", function() + local results = {} + for match in string.gmatch("aaa", "aa") do + table.insert(results, match) + end + -- Should find "aa" once, not overlapping matches + assert.are.same({"aa"}, results) + end) + + end) + + describe("Unicode and Multi-byte Character Handling", function() + + it("should handle unicode characters", function() + local results = {} + for word in string.gmatch("café naïve résumé", "%S+") do + table.insert(results, word) + end + assert.are.same({"café", "naïve", "résumé"}, results) + end) + + it("should handle multi-byte UTF-8 sequences", function() + local emoji_string = "🚀 hello 🌟 world 💫" + local results = {} + for word in string.gmatch(emoji_string, "%w+") do + table.insert(results, word) + end + assert.are.same({"hello", "world"}, results) + end) + + it("should handle mixed ASCII and unicode", function() + local mixed = "hello世界test" + local results = {} + for match in string.gmatch(mixed, "%w+") do + table.insert(results, match) + end + -- Should find ASCII words + assert.is_true(#results >= 2) + end) + + end) + + describe("Complex Pattern Edge Cases", function() + + it("should handle escaped characters in patterns", function() + local results = {} + for match in string.gmatch("a.b*c+d?e", "%.") do -- Escaped dot + table.insert(results, match) + end + assert.are.same({"."}, results) + end) + + it("should handle character classes", function() + local results = {} + for match in string.gmatch("abc123XYZ", "[a-z]+") do + table.insert(results, match) + end + assert.are.same({"abc"}, results) + end) + + it("should handle negated character classes", function() + local results = {} + for match in string.gmatch("abc123", "[^%d]+") do + table.insert(results, match) + end + assert.are.same({"abc"}, results) + end) + + it("should handle complex nested patterns", function() + local results = {} + for match in string.gmatch("(test) [data]", "%b()") do -- Balanced parentheses + table.insert(results, match) + end + assert.are.same({"(test)"}, results) + end) + + it("should handle optional quantifiers", function() + local results = {} + for match in string.gmatch("color colour", "colou?r") do + table.insert(results, match) + end + assert.are.same({"color", "colour"}, results) + end) + + end) + + describe("Memory and Performance Edge Cases", function() + + it("should handle very large number of matches", function() + local large_string = string.rep("a ", 1000) -- 1000 matches + local count = 0 + for match in string.gmatch(large_string, "%w") do + count = count + 1 + end + assert.are.equal(1000, count) + end) + + it("should handle patterns with many captures", function() + -- Test more than 5 captures (our old optimization limit) + local results = {} + for a, b, c, d, e, f in string.gmatch("1,2,3,4,5,6", "(%d),(%d),(%d),(%d),(%d),(%d)") do + table.insert(results, {a, b, c, d, e, f}) + end + assert.are.same({{"1", "2", "3", "4", "5", "6"}}, results) + end) + + it("should handle patterns with up to 10 captures", function() + local results = {} + for a, b, c, d, e, f, g, h, i, j in string.gmatch("1,2,3,4,5,6,7,8,9,0", "(%d),(%d),(%d),(%d),(%d),(%d),(%d),(%d),(%d),(%d)") do + table.insert(results, {a, b, c, d, e, f, g, h, i, j}) + end + assert.are.same({{"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}}, results) + end) + + it("should handle repeated pattern matching efficiently", function() + local text = "word1 word2 word3 word4 word5" + local count = 0 + for word in string.gmatch(text, "%w+") do + count = count + 1 + end + assert.are.equal(5, count) + end) + + end) + + describe("Error Handling Edge Cases", function() + + it("should handle nil arguments gracefully", function() + local success, err = pcall(function() + string.gmatch(nil, "%w+") + end) + assert.is_false(success) + assert.matches("bad argument #1 to 'gmatch'", err) + end) + + it("should handle empty pattern correctly", function() + local success, err = pcall(function() + string.gmatch("test", "") + end) + assert.is_false(success) + assert.matches("bad argument #2 to 'gmatch'", err) + end) + + it("should handle malformed patterns", function() + local success, err = pcall(function() + string.gmatch("test", "[") -- Unclosed bracket + end) + assert.is_false(success) + assert.matches("malformed pattern", err) + end) + + it("should handle malformed character classes", function() + local success, err = pcall(function() + string.gmatch("test", "[abc") -- Unclosed bracket + end) + assert.is_false(success) + assert.matches("malformed pattern", err) + end) + + it("should handle invalid escape sequences gracefully", function() + -- This should work - Lua patterns handle most escapes + local results = {} + for match in string.gmatch("test\\n", "\\") do + table.insert(results, match) + end + assert.are.same({"\\"}, results) + end) + + end) + + describe("Iterator State Edge Cases", function() + + it("should handle iterator called after completion", function() + local iter = string.gmatch("abc", "%w") + local results = {} + + -- Exhaust the iterator + for match in iter do + table.insert(results, match) + end + + -- Calling again should return nil + assert.is_nil(iter()) + assert.is_nil(iter()) + end) + + it("should handle multiple iterators on same string", function() + local iter1 = string.gmatch("abc", "%w") + local iter2 = string.gmatch("abc", "%w") + + assert.are.equal("a", iter1()) + assert.are.equal("a", iter2()) -- Should be independent + assert.are.equal("b", iter1()) + assert.are.equal("b", iter2()) + end) + + it("should handle iterator state independence", function() + local text = "one two three" + local iter1 = string.gmatch(text, "%w+") + local iter2 = string.gmatch(text, "%w+") + + local first1 = iter1() + local first2 = iter2() + local second1 = iter1() + + assert.are.equal("one", first1) + assert.are.equal("one", first2) + assert.are.equal("two", second1) + end) + + it("should handle premature iterator termination", function() + local iter = string.gmatch("one two three four", "%w+") + + -- Only consume first two matches + local first = iter() + local second = iter() + + assert.are.equal("one", first) + assert.are.equal("two", second) + + -- Iterator should still work for remaining matches + local third = iter() + assert.are.equal("three", third) + end) + + end) + + describe("Security Features", function() + + describe("Pattern Validation", function() + + it("should reject patterns with too many quantifiers", function() + local success, err = pcall(function() + string.gmatch("test", "%w*%w*%w*%w*%w*%w*") -- 6 quantifiers + end) + assert.is_false(success) + assert.matches("pattern contains too many quantifiers", err) + end) + + it("should allow patterns with acceptable number of quantifiers", function() + local success = pcall(function() + string.gmatch("test", "%w*%w*%w*%w*%w*") -- 5 quantifiers (limit) + end) + assert.is_true(success) + end) + + it("should reject nested quantifiers .*.*", function() + local success, err = pcall(function() + string.gmatch("test", ".*.*") + end) + assert.is_false(success) + assert.matches("nested quantifiers not allowed", err) + end) + + it("should reject nested quantifiers .+.+", function() + local success, err = pcall(function() + string.gmatch("test", ".+.+") + end) + assert.is_false(success) + assert.matches("nested quantifiers not allowed", err) + end) + + it("should reject patterns with too many alternations", function() + local pattern = "a|b|c|d|e|f|g|h|i|j|k|l" -- 11 pipes + local success, err = pcall(function() + string.gmatch("test", pattern) + end) + assert.is_false(success) + assert.matches("pattern too complex", err) + end) + + it("should allow patterns with acceptable alternations", function() + local pattern = "a|b|c|d|e|f|g|h|i|j" -- 9 pipes (under limit) + local success = pcall(function() + string.gmatch("test", pattern) + end) + assert.is_true(success) + end) + + it("should reject patterns designed to cause catastrophic backtracking", function() + -- ReDoS patterns + local success, err = pcall(function() + string.gmatch("aaaaaaaaaaaaaaaaaaaaX", "(a+)+b") + end) + assert.is_false(success) + assert.matches("catastrophic backtracking", err) + end) + + it("should reject complex nested group patterns", function() + local success, err = pcall(function() + string.gmatch("test", "(a*)*b") + end) + assert.is_false(success) + assert.matches("catastrophic backtracking", err) + end) + + end) + + describe("Length Limits", function() + + it("should reject strings that are too long", function() + local long_string = string.rep("a", 100001) -- Over 100KB limit + local success, err = pcall(function() + string.gmatch(long_string, "%w+") + end) + assert.is_false(success) + assert.matches("string too long", err) + end) + + it("should accept strings at the length limit", function() + local max_string = string.rep("a", 100000) -- Exactly at 100KB limit + local success = pcall(function() + string.gmatch(max_string, "%w+") + end) + assert.is_true(success) + end) + + it("should reject patterns that are too long", function() + local long_pattern = string.rep("a", 501) -- Over 500 char limit + local success, err = pcall(function() + string.gmatch("test", long_pattern) + end) + assert.is_false(success) + assert.matches("pattern too long", err) + end) + + it("should accept patterns at the length limit", function() + local max_pattern = string.rep("a", 500) -- Exactly at 500 char limit + local success = pcall(function() + string.gmatch("test", max_pattern) + end) + assert.is_true(success) + end) + + end) + + describe("DoS Protection", function() + + it("should prevent infinite loops with iteration limit", function() + -- Create a pattern that could potentially cause many iterations + local test_string = string.rep("a", 1000) + local iter = string.gmatch(test_string, "a?") -- This could match empty strings + + local count = 0 + local success, err = pcall(function() + for match in iter do + count = count + 1 + -- The iteration limit should kick in before we reach this high count + if count > 15000 then + break + end + end + end) + + -- Should either complete successfully with reasonable count or hit iteration limit + if not success then + assert.matches("too many iterations", err) + else + assert.is_true(count <= 10000) -- Should not exceed our iteration limit + end + end) + + it("should ensure forward progress to prevent infinite loops", function() + -- Test that we always advance position even with zero-width matches + local results = {} + local count = 0 + for match in string.gmatch("abc", "a?") do + table.insert(results, match) + count = count + 1 + if count > 10 then -- Safety break + break + end + end + + -- Should have finite results, not infinite loop + assert.is_true(#results <= 10) + assert.is_true(count <= 10) + end) + + it("should handle pathological zero-width patterns", function() + local results = {} + local count = 0 + local success, err = pcall(function() + for match in string.gmatch("test", ".*") do + table.insert(results, match) + count = count + 1 + if count > 20 then break end -- Safety + end + end) + + -- Should either work with reasonable results or hit safety limits + if success then + assert.is_true(count <= 20) + end + end) + + end) + + describe("Performance Optimizations", function() + + it("should handle multiple captures efficiently", function() + local results = {} + for a, b, c, d, e in string.gmatch("1:2:3:4:5 6:7:8:9:0", "(%d):(%d):(%d):(%d):(%d)") do + table.insert(results, {a, b, c, d, e}) + end + assert.are.same({{"1", "2", "3", "4", "5"}, {"6", "7", "8", "9", "0"}}, results) + end) + + it("should handle single captures efficiently", function() + local results = {} + for capture in string.gmatch("a1b2c3", "(%d)") do + table.insert(results, capture) + end + assert.are.same({"1", "2", "3"}, results) + end) + + it("should handle no captures efficiently", function() + local results = {} + for match in string.gmatch("hello world", "%w+") do + table.insert(results, match) + end + assert.are.same({"hello", "world"}, results) + end) + + it("should handle large input efficiently", function() + local large_input = string.rep("word ", 5000) -- 5000 words + local count = 0 + local start_time = os.clock() + + for word in string.gmatch(large_input, "%w+") do + count = count + 1 + end + + local end_time = os.clock() + local duration = end_time - start_time + + assert.are.equal(5000, count) + -- Should complete in reasonable time (less than 1 second) + assert.is_true(duration < 1.0) + end) + + end) + + end) +end) \ No newline at end of file diff --git a/hyper/spec/stringify_spec.lua b/hyper/spec/stringify_spec.lua new file mode 100644 index 000000000..c040fc024 --- /dev/null +++ b/hyper/spec/stringify_spec.lua @@ -0,0 +1,29 @@ +--[[ +hyper AOS unit tests + +stringify module + +* matchesPattern +]] +local stringify = require('src/stringify') +local colors = { + red = "\27[31m", + green = "\27[32m", + blue = "\27[34m", + reset = "\27[0m" +} + +describe("stringify", function() + describe("format", function() + it("should format table list of strings", function() + assert.are.same(stringify.format({ "hello" }), '{ ' .. colors.green ..'"hello"' .. colors.reset .. ' }') + end) + it("should format nested table", function() + assert.are.same(stringify.format({ foo = { bar = "baz"}}), string.format([[{ + %sfoo%s = { + %sbar%s = %s"baz"%s + } +}]], colors.red, colors.reset, colors.red, colors.reset, colors.green, colors.reset )) + end) + end) +end) diff --git a/hyper/spec/utils_spec.lua b/hyper/spec/utils_spec.lua new file mode 100644 index 000000000..8642e1d31 --- /dev/null +++ b/hyper/spec/utils_spec.lua @@ -0,0 +1,22 @@ +--[[ +hyper AOS unit tests + +utils module + +* matchesPattern +]] +local utils = require('src/utils') + +describe("utils", function() + describe("matchesSpec", function() + it("should match action", function() + assert.is_true(utils.matchesSpec({ action = "Balance"}, "Balance")) + end) + it("should match body.action", function() + assert.is_true(utils.matchesSpec({ body = { action = "Balance"}}, "Balance")) + end) + it("should match body.method", function() + assert.is_true(utils.matchesSpec({ body = { method = "beep"}}, { method = "beep"})) + end) + end) +end) diff --git a/hyper/src/ao.lua b/hyper/src/ao.lua new file mode 100644 index 000000000..f4dfb1e3a --- /dev/null +++ b/hyper/src/ao.lua @@ -0,0 +1,246 @@ +Handlers = Handlers or require('.handlers') + +local oldao = ao or {} + +local utils = require('.utils') + +local ao = { + _version = "0.0.6", + id = oldao.id or "", + _module = oldao._module or "", + authorities = oldao.authorities or {}, + reference = oldao.reference or 0, + outbox = oldao.outbox or + {Output = {}, Messages = {}, Spawns = {}, Assignments = {}}, + nonExtractableTags = { + 'data-protocol', 'variant', 'from-process', 'from-module', 'type', + 'from', 'owner', 'anchor', 'target', 'data', 'tags', 'read-only' + }, + nonForwardableTags = { + 'data-protocol', 'variant', 'from-process', 'from-module', 'type', + 'from', 'owner', 'anchor', 'target', 'tags', 'tagArray', 'hash-chain', + 'timestamp', 'nonce', 'slot', 'epoch', 'signature', 'forwarded-by', + 'pushed-for', 'read-only', 'cron', 'block-height', 'reference', 'id', + 'reply-to' + }, + Nonce = nil +} + +function ao.clearOutbox() + ao.outbox = { Output = {}, Messages = {}, Spawns = {}, Assignments = {}} +end + +local function getId(m) + local id = "" + utils.map(function (k) + local c = m.commitments[k] + if c.alg == "rsa-pss-sha512" then + id = k + elseif c.alg == "signed" and c['commitment-device'] == "ans104" then + id = k + end + end, utils.keys(m.commitments) + ) + return id +end + +local function splitOnComma(str) + print(str) + local curr = "" + local parts = {} + for i = 1, #str do + local c = str:sub(i, i) + if c == "," then + table.insert(parts, curr) + curr = "" + else + curr = curr .. c + end + end + table.insert(parts, curr) + return parts +end + + +function ao.init(env) + if ao.id == "" then ao.id = getId(env.process) end + + -- if ao._module == "" then + -- ao._module = env.Module.Id + -- end + -- TODO: need to deal with assignables + if #ao.authorities < 1 then + if type(env.process.authority) == 'string' then + ao.authorities = {} + for part in splitOnComma(env.process.authority) do + if part ~= "" and part ~= nil and not utils.includes(part, ao.authorities) then + table.insert(ao.authorities, part) + end + end + else + ao.authorities = env.process.authority + end + end + + ao.outbox = {Output = {}, Messages = {}, Spawns = {}, Assignments = {}} + ao.env = env + +end + +function ao.send(msg) + assert(type(msg) == 'table', 'msg should be a table') + + ao.reference = ao.reference + 1 + local referenceString = tostring(ao.reference) + -- set kv + msg.reference = referenceString + + -- clone message info and add to outbox + table.insert(ao.outbox.Messages, utils.reduce( + function (acc, key) + acc[key] = msg[key] + return acc + end, + {}, + utils.keys(msg) + )) + + if msg.target then + msg.onReply = function(...) + local from, resolver + if select("#", ...) == 2 then + from = select(1, ...) + resolver = select(2, ...) + else + from = msg.target + resolver = select(1, ...) + end + Handlers.once({ + from = from, + ["x-reference"] = referenceString + }, resolver) + end + end + return msg +end + +function ao.spawn(module, msg) + assert(type(module) == "string", "Module source id is required!") + assert(type(msg) == "table", "Message must be a table.") + + ao.reference = ao.reference + 1 + + local spawnRef = tostring(ao.reference) + + msg["reference"] = spawnRef + + -- clone message info and add to outbox + table.insert(ao.outbox.Spawns, utils.reduce( + function (acc, key) + acc[key] = msg[key] + return acc + end, + {}, + utils.keys(msg) + )) + + msg.onReply = function(cb) + Handlers.once({ + action = "Spawned", + from = ao.id, + ["x-reference"] = spawnRef + }, cb) + end + + return msg + +end + +-- registerHint +-- +function ao.registerHint(msg) + -- check if From-Process tag exists + local fromProcess = nil + local hint = nil + local hintTTL = nil + + -- find From-Process tag + if msg.Tags then + for name, value in pairs(msg.Tags) do + if name == "From-Process" then + -- split by & to get process, hint, and ttl + local parts = {} + + for part in string.gmatch(value, "[^&]+") do + table.insert(parts, part) + end + local hintParts = {} + if parts[2] then + for item in string.gmatch(parts[2], "[^=]+") do + table.insert(hintParts, item) + end + end + local ttlParts = {} + if parts[3] then + for item in string.gmatch(parts[3], "[^=]+") do + table.insert(ttlParts, item) + end + end + + fromProcess = parts[1] or nil + hint = hintParts[2] or nil + hintTTL = ttlParts[2] or nil + break + end + end + end + + -- if we found a hint, store it in the registry + if hint then + if not ao._hints then + ao._hints = {} + end + ao._hints[fromProcess] = { + hint = hint, + ttl = hintTTL + } + end + -- enforce bounded registry of 1000 keys + if ao._hints then + local count = 0 + local oldest = nil + local oldestKey = nil + + -- count keys and find oldest entry + for k, v in pairs(ao._hints) do + count = count + 1 + if not oldest or v.ttl < oldest then + oldest = v.ttl + oldestKey = k + end + end + + -- if over 1000 entries, remove oldest + if count > 1000 and oldestKey then + ao._hints[oldestKey] = nil + end + end +end + +function ao.result(result) + if ao.outbox.Error or result.Error then + return { Error = result.Error or ao.outbox.Error } + end + return { + Output = result.Output or ao.output.Output, + Messages = ao.outbox.Messages, + Spawns = ao.outbox.Spawns, + Assignments = ao.outbox.Assignments + } +end + +-- set global Send and Spawn +Send = Send or ao.send +Spawn = Spawn or ao.spawn + +return ao diff --git a/hyper/src/assignment.lua b/hyper/src/assignment.lua new file mode 100644 index 000000000..eb7d3bb0d --- /dev/null +++ b/hyper/src/assignment.lua @@ -0,0 +1,91 @@ +--- The Assignment module provides functionality for handling assignments. Returns the Assignment table. +-- @module assignment + +--- The Assignment module +-- @table Assignment +-- @field _version The version number of the assignment module +-- @field init The init function +local Assignment = { _version = "0.1.0" } +local utils = require('.utils') + +--- Implement assignable polyfills on ao. +-- Creates addAssignable, removeAssignable, isAssignment, and isAssignable fields on ao. +-- @function init +-- @tparam {table} ao The ao environment object +-- @see ao.addAssignable +-- @see ao.removeAssignable +-- @see ao.isAssignment +-- @see ao.isAssignable +function Assignment.init (ao) + -- Find the index of an object in an array by a given property + -- @lfunction findIndexByProp + -- @tparam {table} array The array to search + -- @tparam {string} prop The property to search by + -- @tparam {any} value The value to search for + -- @treturn {number|nil} The index of the object, or nil if not found + local function findIndexByProp(array, prop, value) + for index, object in ipairs(array) do + if object[prop] == value then return index end + end + + return nil + end + + ao.assignables = ao.assignables or {} + + ao.addAssignable = ao.addAssignable or function (...) + local name = nil + local matchSpec = nil + + local idx = nil + + -- Initialize the parameters based on arguments + if select("#", ...) == 1 then + matchSpec = select(1, ...) + else + name = select(1, ...) + matchSpec = select(2, ...) + assert(type(name) == 'string', 'MatchSpec name MUST be a string') + end + + if name then idx = findIndexByProp(ao.assignables, "name", name) end + + if idx ~= nil and idx > 0 then + -- found update + ao.assignables[idx].pattern = matchSpec + else + -- append the new assignable, including potentially nil name + table.insert(ao.assignables, { pattern = matchSpec, name = name }) + end + end + + ao.removeAssignable = ao.removeAssignable or function (name) + local idx = nil + + if type(name) == 'string' then idx = findIndexByProp(ao.assignables, "name", name) + else + assert(type(name) == 'number', 'index MUST be a number') + idx = name + end + + if idx == nil or idx <= 0 or idx > #ao.assignables then return end + + table.remove(ao.assignables, idx) + end + + ao.isAssignment = ao.isAssignment or function (msg) return msg.Target ~= ao.id end + + ao.isAssignable = ao.isAssignable or function (msg) + for _, assignable in pairs(ao.assignables) do + if utils.matchesSpec(msg, assignable.pattern) then return true end + end + + -- If assignables is empty, the the above loop will noop, + -- and this expression will execute. + -- + -- In other words, all msgs are not assignable, by default. + return false + end +end + +return Assignment diff --git a/hyper/src/base64.lua b/hyper/src/base64.lua new file mode 100644 index 000000000..6bf473f2b --- /dev/null +++ b/hyper/src/base64.lua @@ -0,0 +1,201 @@ +--[[ + + base64 -- v1.5.3 public domain Lua base64 encoder/decoder + no warranty implied; use at your own risk + + Needs bit32.extract function. If not present it's implemented using BitOp + or Lua 5.3 native bit operators. For Lua 5.1 fallbacks to pure Lua + implementation inspired by Rici Lake's post: + http://ricilake.blogspot.co.uk/2007/10/iterating-bits-in-lua.html + + author: Ilya Kolbin (iskolbin@gmail.com) + url: github.com/iskolbin/lbase64 + + COMPATIBILITY + + Lua 5.1+, LuaJIT + + LICENSE + + See end of file for license information. + +--]] + + +local base64 = {} + +local extract = _G.bit32 and _G.bit32.extract -- Lua 5.2/Lua 5.3 in compatibility mode +if not extract then + if _G.bit then -- LuaJIT + local shl, shr, band = _G.bit.lshift, _G.bit.rshift, _G.bit.band + extract = function( v, from, width ) + return band( shr( v, from ), shl( 1, width ) - 1 ) + end + elseif _G._VERSION == "Lua 5.1" then + extract = function( v, from, width ) + local w = 0 + local flag = 2^from + for i = 0, width-1 do + local flag2 = flag + flag + if v % flag2 >= flag then + w = w + 2^i + end + flag = flag2 + end + return w + end + else -- Lua 5.3+ + extract = load[[return function( v, from, width ) + return ( v >> from ) & ((1 << width) - 1) + end]]() + end +end + + +function base64.makeencoder( s62, s63, spad ) + local encoder = {} + for b64code, char in pairs{[0]='A','B','C','D','E','F','G','H','I','J', + 'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y', + 'Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n', + 'o','p','q','r','s','t','u','v','w','x','y','z','0','1','2', + '3','4','5','6','7','8','9',s62 or '+',s63 or'/',spad or'='} do + encoder[b64code] = char:byte() + end + return encoder +end + +function base64.makedecoder( s62, s63, spad ) + local decoder = {} + for b64code, charcode in pairs( base64.makeencoder( s62, s63, spad )) do + decoder[charcode] = b64code + end + return decoder +end + +local DEFAULT_ENCODER = base64.makeencoder() +local DEFAULT_DECODER = base64.makedecoder() + +local char, concat = string.char, table.concat + +function base64.encode( str, encoder, usecaching ) + encoder = encoder or DEFAULT_ENCODER + local t, k, n = {}, 1, #str + local lastn = n % 3 + local cache = {} + for i = 1, n-lastn, 3 do + local a, b, c = str:byte( i, i+2 ) + local v = a*0x10000 + b*0x100 + c + local s + if usecaching then + s = cache[v] + if not s then + s = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[extract(v,6,6)], encoder[extract(v,0,6)]) + cache[v] = s + end + else + s = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[extract(v,6,6)], encoder[extract(v,0,6)]) + end + t[k] = s + k = k + 1 + end + if lastn == 2 then + local a, b = str:byte( n-1, n ) + local v = a*0x10000 + b*0x100 + t[k] = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[extract(v,6,6)], encoder[64]) + elseif lastn == 1 then + local v = str:byte( n )*0x10000 + t[k] = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[64], encoder[64]) + end + return concat( t ) +end + +function base64.decode( b64, decoder, usecaching ) + decoder = decoder or DEFAULT_DECODER + local pattern = '[^%w%+%/%=]' + if decoder then + local s62, s63 + for charcode, b64code in pairs( decoder ) do + if b64code == 62 then s62 = charcode + elseif b64code == 63 then s63 = charcode + end + end + pattern = ('[^%%w%%%s%%%s%%=]'):format( char(s62), char(s63) ) + end + b64 = b64:gsub( pattern, '' ) + local cache = usecaching and {} + local t, k = {}, 1 + local n = #b64 + local padding = b64:sub(-2) == '==' and 2 or b64:sub(-1) == '=' and 1 or 0 + for i = 1, padding > 0 and n-4 or n, 4 do + local a, b, c, d = b64:byte( i, i+3 ) + local s + if usecaching then + local v0 = a*0x1000000 + b*0x10000 + c*0x100 + d + s = cache[v0] + if not s then + local v = decoder[a]*0x40000 + decoder[b]*0x1000 + decoder[c]*0x40 + decoder[d] + s = char( extract(v,16,8), extract(v,8,8), extract(v,0,8)) + cache[v0] = s + end + else + local v = decoder[a]*0x40000 + decoder[b]*0x1000 + decoder[c]*0x40 + decoder[d] + s = char( extract(v,16,8), extract(v,8,8), extract(v,0,8)) + end + t[k] = s + k = k + 1 + end + if padding == 1 then + local a, b, c = b64:byte( n-3, n-1 ) + local v = decoder[a]*0x40000 + decoder[b]*0x1000 + decoder[c]*0x40 + t[k] = char( extract(v,16,8), extract(v,8,8)) + elseif padding == 2 then + local a, b = b64:byte( n-3, n-2 ) + local v = decoder[a]*0x40000 + decoder[b]*0x1000 + t[k] = char( extract(v,16,8)) + end + return concat( t ) +end + +return base64 + +--[[ +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2018 Ilya Kolbin +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +--]] \ No newline at end of file diff --git a/hyper/src/bint.lua b/hyper/src/bint.lua new file mode 100644 index 000000000..ce2164ad2 --- /dev/null +++ b/hyper/src/bint.lua @@ -0,0 +1,1739 @@ +--[[-- +lua-bint - v0.5.1 - 26/Jun/2023 +Eduardo Bart - edub4rt@gmail.com +https://github.com/edubart/lua-bint + +Small portable arbitrary-precision integer arithmetic library in pure Lua for +computing with large integers. + +Different from most arbitrary-precision integer libraries in pure Lua out there this one +uses an array of lua integers as underlying data-type in its implementation instead of +using strings or large tables, this make it efficient for working with fixed width integers +and to make bitwise operations. + +## Design goals + +The main design goal of this library is to be small, correct, self contained and use few +resources while retaining acceptable performance and feature completeness. + +The library is designed to follow recent Lua integer semantics, this means that +integer overflow warps around, +signed integers are implemented using two-complement arithmetic rules, +integer division operations rounds towards minus infinity, +any mixed operations with float numbers promotes the value to a float, +and the usual division/power operation always promotes to floats. + +The library is designed to be possible to work with only unsigned integer arithmetic +when using the proper methods. + +All the lua arithmetic operators (+, -, *, //, /, %) and bitwise operators (&, |, ~, <<, >>) +are implemented as metamethods. + +The integer size must be fixed in advance and the library is designed to be more efficient when +working with integers of sizes between 64-4096 bits. If you need to work with really huge numbers +without size restrictions then use another library. This choice has been made to have more efficiency +in that specific size range. + +## Usage + +First on you should require the bint file including how many bits the bint module will work with, +by calling the returned function from the require, for example: + +```lua +local bint = require 'bint'(1024) +``` + +For more information about its arguments see @{newmodule}. +Then when you need create a bint, you can use one of the following functions: + +* @{bint.fromuinteger} (convert from lua integers, but read as unsigned integer) +* @{bint.frominteger} (convert from lua integers, preserving the sign) +* @{bint.frombase} (convert from arbitrary bases, like hexadecimal) +* @{bint.fromstring} (convert from arbitrary string, support binary/hexadecimal/decimal) +* @{bint.trunc} (convert from lua numbers, truncating the fractional part) +* @{bint.new} (convert from anything, asserts on invalid integers) +* @{bint.tobint} (convert from anything, returns nil on invalid integers) +* @{bint.parse} (convert from anything, returns a lua number as fallback) +* @{bint.zero} +* @{bint.one} +* `bint` + +You can also call `bint` as it is an alias to `bint.new`. +In doubt use @{bint.new} to create a new bint. + +Then you can use all the usual lua numeric operations on it, +all the arithmetic metamethods are implemented. +When you are done computing and need to get the result, +get the output from one of the following functions: + +* @{bint.touinteger} (convert to a lua integer, wraps around as an unsigned integer) +* @{bint.tointeger} (convert to a lua integer, wraps around, preserves the sign) +* @{bint.tonumber} (convert to lua float, losing precision) +* @{bint.tobase} (convert to a string in any base) +* @{bint.__tostring} (convert to a string in base 10) + +To output a very large integer with no loss you probably want to use @{bint.tobase} +or call `tostring` to get a string representation. + +## Precautions + +All library functions can be mixed with lua numbers, +this makes easy to mix operations between bints and lua numbers, +however the user should take care in some situations: + +* Don't mix integers and float operations if you want to work with integers only. +* Don't use the regular equal operator ('==') to compare values from this library, +unless you know in advance that both values are of the same primitive type, +otherwise it will always return false, use @{bint.eq} to be safe. +* Don't pass fractional numbers to functions that an integer is expected +* Don't mix operations between bint classes with different sizes as this is not supported, this +will throw assertions. +* Remember that casting back to lua integers or numbers precision can be lost. +* For dividing while preserving integers use the @{bint.__idiv} (the '//' operator). +* For doing power operation preserving integers use the @{bint.ipow} function. +* Configure the proper integer size you intend to work with, otherwise large integers may wrap around. + +]] + +-- Returns number of bits of the internal lua integer type. +local function luainteger_bitsize() + local n, i = -1, 0 + repeat + n, i = n >> 16, i + 16 + until n==0 + return i +end + +local math_type = math.type +local math_floor = math.floor +local math_abs = math.abs +local math_ceil = math.ceil +local math_modf = math.modf +local math_mininteger = math.mininteger +local math_maxinteger = math.maxinteger +local math_max = math.max +local math_min = math.min +local string_format = string.format +local table_insert = table.insert +local table_concat = table.concat +local table_unpack = table.unpack + +local memo = {} + +--- Create a new bint module representing integers of the desired bit size. +-- This is the returned function when `require 'bint'` is called. +-- @function newmodule +-- @param bits Number of bits for the integer representation, must be multiple of wordbits and +-- at least 64. +-- @param[opt] wordbits Number of the bits for the internal word, +-- defaults to half of Lua's integer size. +local function newmodule(bits, wordbits) + +local intbits = luainteger_bitsize() +bits = bits or 256 +wordbits = wordbits or (intbits // 2) + +-- Memoize bint modules +local memoindex = bits * 64 + wordbits +if memo[memoindex] then + return memo[memoindex] +end + +-- Validate +assert(bits % wordbits == 0, 'bitsize is not multiple of word bitsize') +assert(2*wordbits <= intbits, 'word bitsize must be half of the lua integer bitsize') +assert(bits >= 64, 'bitsize must be >= 64') +assert(wordbits >= 8, 'wordbits must be at least 8') +assert(bits % 8 == 0, 'bitsize must be multiple of 8') + +-- Create bint module +local bint = {} +bint.__index = bint + +--- Number of bits representing a bint instance. +bint.bits = bits + +-- Constants used internally +local BINT_BITS = bits +local BINT_BYTES = bits // 8 +local BINT_WORDBITS = wordbits +local BINT_SIZE = BINT_BITS // BINT_WORDBITS +local BINT_WORDMAX = (1 << BINT_WORDBITS) - 1 +local BINT_WORDMSB = (1 << (BINT_WORDBITS - 1)) +local BINT_LEPACKFMT = '<'..('I'..(wordbits // 8)):rep(BINT_SIZE) +local BINT_MATHMININTEGER, BINT_MATHMAXINTEGER +local BINT_MININTEGER + +--- Create a new bint with 0 value. +function bint.zero() + local x = setmetatable({}, bint) + for i=1,BINT_SIZE do + x[i] = 0 + end + return x +end +local bint_zero = bint.zero + +--- Create a new bint with 1 value. +function bint.one() + local x = setmetatable({}, bint) + x[1] = 1 + for i=2,BINT_SIZE do + x[i] = 0 + end + return x +end +local bint_one = bint.one + +-- Convert a value to a lua integer without losing precision. +local function tointeger(x) + x = tonumber(x) + local ty = math_type(x) + if ty == 'float' then + local floorx = math_floor(x) + if floorx == x then + x = floorx + ty = math_type(x) + end + end + if ty == 'integer' then + return x + end +end + +--- Create a bint from an unsigned integer. +-- Treats signed integers as an unsigned integer. +-- @param x A value to initialize from convertible to a lua integer. +-- @return A new bint or nil in case the input cannot be represented by an integer. +-- @see bint.frominteger +function bint.fromuinteger(x) + x = tointeger(x) + if x then + if x == 1 then + return bint_one() + elseif x == 0 then + return bint_zero() + end + local n = setmetatable({}, bint) + for i=1,BINT_SIZE do + n[i] = x & BINT_WORDMAX + x = x >> BINT_WORDBITS + end + return n + end +end +local bint_fromuinteger = bint.fromuinteger + +--- Create a bint from a signed integer. +-- @param x A value to initialize from convertible to a lua integer. +-- @return A new bint or nil in case the input cannot be represented by an integer. +-- @see bint.fromuinteger +function bint.frominteger(x) + x = tointeger(x) + if x then + if x == 1 then + return bint_one() + elseif x == 0 then + return bint_zero() + end + local neg = false + if x < 0 then + x = math_abs(x) + neg = true + end + local n = setmetatable({}, bint) + for i=1,BINT_SIZE do + n[i] = x & BINT_WORDMAX + x = x >> BINT_WORDBITS + end + if neg then + n:_unm() + end + return n + end +end +local bint_frominteger = bint.frominteger + +local basesteps = {} + +-- Compute the read step for frombase function +local function getbasestep(base) + local step = basesteps[base] + if step then + return step + end + step = 0 + local dmax = 1 + local limit = math_maxinteger // base + repeat + step = step + 1 + dmax = dmax * base + until dmax >= limit + basesteps[base] = step + return step +end + +-- Compute power with lua integers. +local function ipow(y, x, n) + if n == 1 then + return y * x + elseif n & 1 == 0 then --even + return ipow(y, x * x, n // 2) + end + return ipow(x * y, x * x, (n-1) // 2) +end + +--- Create a bint from a string of the desired base. +-- @param s The string to be converted from, +-- must have only alphanumeric and '+-' characters. +-- @param[opt] base Base that the number is represented, defaults to 10. +-- Must be at least 2 and at most 36. +-- @return A new bint or nil in case the conversion failed. +function bint.frombase(s, base) + if type(s) ~= 'string' then + return + end + base = base or 10 + if not (base >= 2 and base <= 36) then + -- number base is too large + return + end + local step = getbasestep(base) + if #s < step then + -- string is small, use tonumber (faster) + return bint_frominteger(tonumber(s, base)) + end + local sign, int = s:lower():match('^([+-]?)(%w+)$') + if not (sign and int) then + -- invalid integer string representation + return + end + local n = bint_zero() + for i=1,#int,step do + local part = int:sub(i,i+step-1) + local d = tonumber(part, base) + if not d then + -- invalid integer string representation + return + end + if i > 1 then + n = n * ipow(1, base, #part) + end + if d ~= 0 then + n:_add(d) + end + end + if sign == '-' then + n:_unm() + end + return n +end +local bint_frombase = bint.frombase + +--- Create a new bint from a string. +-- The string can by a decimal number, binary number prefixed with '0b' or hexadecimal number prefixed with '0x'. +-- @param s A string convertible to a bint. +-- @return A new bint or nil in case the conversion failed. +-- @see bint.frombase +function bint.fromstring(s) + if type(s) ~= 'string' then + return + end + if s:find('^[+-]?[0-9]+$') then + return bint_frombase(s, 10) + elseif s:find('^[+-]?0[xX][0-9a-fA-F]+$') then + return bint_frombase(s:gsub('0[xX]', '', 1), 16) + elseif s:find('^[+-]?0[bB][01]+$') then + return bint_frombase(s:gsub('0[bB]', '', 1), 2) + end +end +local bint_fromstring = bint.fromstring + +--- Create a new bint from a buffer of little-endian bytes. +-- @param buffer Buffer of bytes, extra bytes are trimmed from the right, missing bytes are padded to the right. +-- @raise An assert is thrown in case buffer is not an string. +-- @return A bint. +function bint.fromle(buffer) + assert(type(buffer) == 'string', 'buffer is not a string') + if #buffer > BINT_BYTES then -- trim extra bytes from the right + buffer = buffer:sub(1, BINT_BYTES) + elseif #buffer < BINT_BYTES then -- add missing bytes to the right + buffer = buffer..('\x00'):rep(BINT_BYTES - #buffer) + end + return setmetatable({BINT_LEPACKFMT:unpack(buffer)}, bint) +end + +--- Create a new bint from a buffer of big-endian bytes. +-- @param buffer Buffer of bytes, extra bytes are trimmed from the left, missing bytes are padded to the left. +-- @raise An assert is thrown in case buffer is not an string. +-- @return A bint. +function bint.frombe(buffer) + assert(type(buffer) == 'string', 'buffer is not a string') + if #buffer > BINT_BYTES then -- trim extra bytes from the left + buffer = buffer:sub(-BINT_BYTES, #buffer) + elseif #buffer < BINT_BYTES then -- add missing bytes to the left + buffer = ('\x00'):rep(BINT_BYTES - #buffer)..buffer + end + return setmetatable({BINT_LEPACKFMT:unpack(buffer:reverse())}, bint) +end + +--- Create a new bint from a value. +-- @param x A value convertible to a bint (string, number or another bint). +-- @return A new bint, guaranteed to be a new reference in case needed. +-- @raise An assert is thrown in case x is not convertible to a bint. +-- @see bint.tobint +-- @see bint.parse +function bint.new(x) + if getmetatable(x) ~= bint then + local ty = type(x) + if ty == 'number' then + x = bint_frominteger(x) + elseif ty == 'string' then + x = bint_fromstring(x) + end + assert(x, 'value cannot be represented by a bint') + return x + end + -- return a clone + local n = setmetatable({}, bint) + for i=1,BINT_SIZE do + n[i] = x[i] + end + return n +end +local bint_new = bint.new + +--- Convert a value to a bint if possible. +-- @param x A value to be converted (string, number or another bint). +-- @param[opt] clone A boolean that tells if a new bint reference should be returned. +-- Defaults to false. +-- @return A bint or nil in case the conversion failed. +-- @see bint.new +-- @see bint.parse +function bint.tobint(x, clone) + if getmetatable(x) == bint then + if not clone then + return x + end + -- return a clone + local n = setmetatable({}, bint) + for i=1,BINT_SIZE do + n[i] = x[i] + end + return n + end + local ty = type(x) + if ty == 'number' then + return bint_frominteger(x) + elseif ty == 'string' then + return bint_fromstring(x) + end +end +local tobint = bint.tobint + +--- Convert a value to a bint if possible otherwise to a lua number. +-- Useful to prepare values that you are unsure if it's going to be an integer or float. +-- @param x A value to be converted (string, number or another bint). +-- @param[opt] clone A boolean that tells if a new bint reference should be returned. +-- Defaults to false. +-- @return A bint or a lua number or nil in case the conversion failed. +-- @see bint.new +-- @see bint.tobint +function bint.parse(x, clone) + local i = tobint(x, clone) + if i then + return i + end + return tonumber(x) +end +local bint_parse = bint.parse + +--- Convert a bint to an unsigned integer. +-- Note that large unsigned integers may be represented as negatives in lua integers. +-- Note that lua cannot represent values larger than 64 bits, +-- in that case integer values wrap around. +-- @param x A bint or a number to be converted into an unsigned integer. +-- @return An integer or nil in case the input cannot be represented by an integer. +-- @see bint.tointeger +function bint.touinteger(x) + if getmetatable(x) == bint then + local n = 0 + for i=1,BINT_SIZE do + n = n | (x[i] << (BINT_WORDBITS * (i - 1))) + end + return n + end + return tointeger(x) +end + +--- Convert a bint to a signed integer. +-- It works by taking absolute values then applying the sign bit in case needed. +-- Note that lua cannot represent values larger than 64 bits, +-- in that case integer values wrap around. +-- @param x A bint or value to be converted into an unsigned integer. +-- @return An integer or nil in case the input cannot be represented by an integer. +-- @see bint.touinteger +function bint.tointeger(x) + if getmetatable(x) == bint then + local n = 0 + local neg = x:isneg() + if neg then + x = -x + end + for i=1,BINT_SIZE do + n = n | (x[i] << (BINT_WORDBITS * (i - 1))) + end + if neg then + n = -n + end + return n + end + return tointeger(x) +end +local bint_tointeger = bint.tointeger + +local function bint_assert_tointeger(x) + x = bint_tointeger(x) + if not x then + error('value has no integer representation') + end + return x +end + +--- Convert a bint to a lua float in case integer would wrap around or lua integer otherwise. +-- Different from @{bint.tointeger} the operation does not wrap around integers, +-- but digits precision are lost in the process of converting to a float. +-- @param x A bint or value to be converted into a lua number. +-- @return A lua number or nil in case the input cannot be represented by a number. +-- @see bint.tointeger +function bint.tonumber(x) + if getmetatable(x) == bint then + if x <= BINT_MATHMAXINTEGER and x >= BINT_MATHMININTEGER then + return x:tointeger() + end + return tonumber(tostring(x)) + end + return tonumber(x) +end +local bint_tonumber = bint.tonumber + +-- Compute base letters to use in bint.tobase +local BASE_LETTERS = {} +do + for i=1,36 do + BASE_LETTERS[i-1] = ('0123456789abcdefghijklmnopqrstuvwxyz'):sub(i,i) + end +end + +--- Convert a bint to a string in the desired base. +-- @param x The bint to be converted from. +-- @param[opt] base Base to be represented, defaults to 10. +-- Must be at least 2 and at most 36. +-- @param[opt] unsigned Whether to output as an unsigned integer. +-- Defaults to false for base 10 and true for others. +-- When unsigned is false the symbol '-' is prepended in negative values. +-- @return A string representing the input. +-- @raise An assert is thrown in case the base is invalid. +function bint.tobase(x, base, unsigned) + x = tobint(x) + if not x then + -- x is a fractional float or something else + return + end + base = base or 10 + if not (base >= 2 and base <= 36) then + -- number base is too large + return + end + if unsigned == nil then + unsigned = base ~= 10 + end + local isxneg = x:isneg() + if (base == 10 and not unsigned) or (base == 16 and unsigned and not isxneg) then + if x <= BINT_MATHMAXINTEGER and x >= BINT_MATHMININTEGER then + -- integer is small, use tostring or string.format (faster) + local n = x:tointeger() + if base == 10 then + return tostring(n) + elseif unsigned then + return string_format('%x', n) + end + end + end + local ss = {} + local neg = not unsigned and isxneg + x = neg and x:abs() or bint_new(x) + local xiszero = x:iszero() + if xiszero then + return '0' + end + -- calculate basepow + local step = 0 + local basepow = 1 + local limit = (BINT_WORDMSB - 1) // base + repeat + step = step + 1 + basepow = basepow * base + until basepow >= limit + -- serialize base digits + local size = BINT_SIZE + local xd, carry, d + repeat + -- single word division + carry = 0 + xiszero = true + for i=size,1,-1 do + carry = carry | x[i] + d, xd = carry // basepow, carry % basepow + if xiszero and d ~= 0 then + size = i + xiszero = false + end + x[i] = d + carry = xd << BINT_WORDBITS + end + -- digit division + for _=1,step do + xd, d = xd // base, xd % base + if xiszero and xd == 0 and d == 0 then + -- stop on leading zeros + break + end + table_insert(ss, 1, BASE_LETTERS[d]) + end + until xiszero + if neg then + table_insert(ss, 1, '-') + end + return table_concat(ss) +end + +local function bint_assert_convert(x) + return assert(tobint(x), 'value has not integer representation') +end + +--- Convert a bint to a buffer of little-endian bytes. +-- @param x A bint or lua integer. +-- @param[opt] trim If true, zero bytes on the right are trimmed. +-- @return A buffer of bytes representing the input. +-- @raise Asserts in case input is not convertible to an integer. +function bint.tole(x, trim) + x = bint_assert_convert(x) + local s = BINT_LEPACKFMT:pack(table_unpack(x)) + if trim then + s = s:gsub('\x00+$', '') + if s == '' then + s = '\x00' + end + end + return s +end + +--- Convert a bint to a buffer of big-endian bytes. +-- @param x A bint or lua integer. +-- @param[opt] trim If true, zero bytes on the left are trimmed. +-- @return A buffer of bytes representing the input. +-- @raise Asserts in case input is not convertible to an integer. +function bint.tobe(x, trim) + x = bint_assert_convert(x) + local s = BINT_LEPACKFMT:pack(table_unpack(x)):reverse() + if trim then + s = s:gsub('^\x00+', '') + if s == '' then + s = '\x00' + end + end + return s +end + +--- Check if a number is 0 considering bints. +-- @param x A bint or a lua number. +function bint.iszero(x) + if getmetatable(x) == bint then + for i=1,BINT_SIZE do + if x[i] ~= 0 then + return false + end + end + return true + end + return x == 0 +end + +--- Check if a number is 1 considering bints. +-- @param x A bint or a lua number. +function bint.isone(x) + if getmetatable(x) == bint then + if x[1] ~= 1 then + return false + end + for i=2,BINT_SIZE do + if x[i] ~= 0 then + return false + end + end + return true + end + return x == 1 +end + +--- Check if a number is -1 considering bints. +-- @param x A bint or a lua number. +function bint.isminusone(x) + if getmetatable(x) == bint then + for i=1,BINT_SIZE do + if x[i] ~= BINT_WORDMAX then + return false + end + end + return true + end + return x == -1 +end +local bint_isminusone = bint.isminusone + +--- Check if the input is a bint. +-- @param x Any lua value. +function bint.isbint(x) + return getmetatable(x) == bint +end + +--- Check if the input is a lua integer or a bint. +-- @param x Any lua value. +function bint.isintegral(x) + return getmetatable(x) == bint or math_type(x) == 'integer' +end + +--- Check if the input is a bint or a lua number. +-- @param x Any lua value. +function bint.isnumeric(x) + return getmetatable(x) == bint or type(x) == 'number' +end + +--- Get the number type of the input (bint, integer or float). +-- @param x Any lua value. +-- @return Returns "bint" for bints, "integer" for lua integers, +-- "float" from lua floats or nil otherwise. +function bint.type(x) + if getmetatable(x) == bint then + return 'bint' + end + return math_type(x) +end + +--- Check if a number is negative considering bints. +-- Zero is guaranteed to never be negative for bints. +-- @param x A bint or a lua number. +function bint.isneg(x) + if getmetatable(x) == bint then + return x[BINT_SIZE] & BINT_WORDMSB ~= 0 + end + return x < 0 +end +local bint_isneg = bint.isneg + +--- Check if a number is positive considering bints. +-- @param x A bint or a lua number. +function bint.ispos(x) + if getmetatable(x) == bint then + return not x:isneg() and not x:iszero() + end + return x > 0 +end + +--- Check if a number is even considering bints. +-- @param x A bint or a lua number. +function bint.iseven(x) + if getmetatable(x) == bint then + return x[1] & 1 == 0 + end + return math_abs(x) % 2 == 0 +end + +--- Check if a number is odd considering bints. +-- @param x A bint or a lua number. +function bint.isodd(x) + if getmetatable(x) == bint then + return x[1] & 1 == 1 + end + return math_abs(x) % 2 == 1 +end + +--- Create a new bint with the maximum possible integer value. +function bint.maxinteger() + local x = setmetatable({}, bint) + for i=1,BINT_SIZE-1 do + x[i] = BINT_WORDMAX + end + x[BINT_SIZE] = BINT_WORDMAX ~ BINT_WORDMSB + return x +end + +--- Create a new bint with the minimum possible integer value. +function bint.mininteger() + local x = setmetatable({}, bint) + for i=1,BINT_SIZE-1 do + x[i] = 0 + end + x[BINT_SIZE] = BINT_WORDMSB + return x +end + +--- Bitwise left shift a bint in one bit (in-place). +function bint:_shlone() + local wordbitsm1 = BINT_WORDBITS - 1 + for i=BINT_SIZE,2,-1 do + self[i] = ((self[i] << 1) | (self[i-1] >> wordbitsm1)) & BINT_WORDMAX + end + self[1] = (self[1] << 1) & BINT_WORDMAX + return self +end + +--- Bitwise right shift a bint in one bit (in-place). +function bint:_shrone() + local wordbitsm1 = BINT_WORDBITS - 1 + for i=1,BINT_SIZE-1 do + self[i] = ((self[i] >> 1) | (self[i+1] << wordbitsm1)) & BINT_WORDMAX + end + self[BINT_SIZE] = self[BINT_SIZE] >> 1 + return self +end + +-- Bitwise left shift words of a bint (in-place). Used only internally. +function bint:_shlwords(n) + for i=BINT_SIZE,n+1,-1 do + self[i] = self[i - n] + end + for i=1,n do + self[i] = 0 + end + return self +end + +-- Bitwise right shift words of a bint (in-place). Used only internally. +function bint:_shrwords(n) + if n < BINT_SIZE then + for i=1,BINT_SIZE-n do + self[i] = self[i + n] + end + for i=BINT_SIZE-n+1,BINT_SIZE do + self[i] = 0 + end + else + for i=1,BINT_SIZE do + self[i] = 0 + end + end + return self +end + +--- Increment a bint by one (in-place). +function bint:_inc() + for i=1,BINT_SIZE do + local tmp = self[i] + local v = (tmp + 1) & BINT_WORDMAX + self[i] = v + if v > tmp then + break + end + end + return self +end + +--- Increment a number by one considering bints. +-- @param x A bint or a lua number to increment. +function bint.inc(x) + local ix = tobint(x, true) + if ix then + return ix:_inc() + end + return x + 1 +end + +--- Decrement a bint by one (in-place). +function bint:_dec() + for i=1,BINT_SIZE do + local tmp = self[i] + local v = (tmp - 1) & BINT_WORDMAX + self[i] = v + if v <= tmp then + break + end + end + return self +end + +--- Decrement a number by one considering bints. +-- @param x A bint or a lua number to decrement. +function bint.dec(x) + local ix = tobint(x, true) + if ix then + return ix:_dec() + end + return x - 1 +end + +--- Assign a bint to a new value (in-place). +-- @param y A value to be copied from. +-- @raise Asserts in case inputs are not convertible to integers. +function bint:_assign(y) + y = bint_assert_convert(y) + for i=1,BINT_SIZE do + self[i] = y[i] + end + return self +end + +--- Take absolute of a bint (in-place). +function bint:_abs() + if self:isneg() then + self:_unm() + end + return self +end + +--- Take absolute of a number considering bints. +-- @param x A bint or a lua number to take the absolute. +function bint.abs(x) + local ix = tobint(x, true) + if ix then + return ix:_abs() + end + return math_abs(x) +end +local bint_abs = bint.abs + +--- Take the floor of a number considering bints. +-- @param x A bint or a lua number to perform the floor operation. +function bint.floor(x) + if getmetatable(x) == bint then + return bint_new(x) + end + return bint_new(math_floor(tonumber(x))) +end + +--- Take ceil of a number considering bints. +-- @param x A bint or a lua number to perform the ceil operation. +function bint.ceil(x) + if getmetatable(x) == bint then + return bint_new(x) + end + return bint_new(math_ceil(tonumber(x))) +end + +--- Wrap around bits of an integer (discarding left bits) considering bints. +-- @param x A bint or a lua integer. +-- @param y Number of right bits to preserve. +function bint.bwrap(x, y) + x = bint_assert_convert(x) + if y <= 0 then + return bint_zero() + elseif y < BINT_BITS then + return x & (bint_one() << y):_dec() + end + return bint_new(x) +end + +--- Rotate left integer x by y bits considering bints. +-- @param x A bint or a lua integer. +-- @param y Number of bits to rotate. +function bint.brol(x, y) + x, y = bint_assert_convert(x), bint_assert_tointeger(y) + if y > 0 then + return (x << y) | (x >> (BINT_BITS - y)) + elseif y < 0 then + if y ~= math_mininteger then + return x:bror(-y) + else + x:bror(-(y+1)) + x:bror(1) + end + end + return x +end + +--- Rotate right integer x by y bits considering bints. +-- @param x A bint or a lua integer. +-- @param y Number of bits to rotate. +function bint.bror(x, y) + x, y = bint_assert_convert(x), bint_assert_tointeger(y) + if y > 0 then + return (x >> y) | (x << (BINT_BITS - y)) + elseif y < 0 then + if y ~= math_mininteger then + return x:brol(-y) + else + x:brol(-(y+1)) + x:brol(1) + end + end + return x +end + +--- Truncate a number to a bint. +-- Floats numbers are truncated, that is, the fractional port is discarded. +-- @param x A number to truncate. +-- @return A new bint or nil in case the input does not fit in a bint or is not a number. +function bint.trunc(x) + if getmetatable(x) ~= bint then + x = tonumber(x) + if x then + local ty = math_type(x) + if ty == 'float' then + -- truncate to integer + x = math_modf(x) + end + return bint_frominteger(x) + end + return + end + return bint_new(x) +end + +--- Take maximum between two numbers considering bints. +-- @param x A bint or lua number to compare. +-- @param y A bint or lua number to compare. +-- @return A bint or a lua number. Guarantees to return a new bint for integer values. +function bint.max(x, y) + local ix, iy = tobint(x), tobint(y) + if ix and iy then + return bint_new(ix > iy and ix or iy) + end + return bint_parse(math_max(x, y)) +end + +--- Take minimum between two numbers considering bints. +-- @param x A bint or lua number to compare. +-- @param y A bint or lua number to compare. +-- @return A bint or a lua number. Guarantees to return a new bint for integer values. +function bint.min(x, y) + local ix, iy = tobint(x), tobint(y) + if ix and iy then + return bint_new(ix < iy and ix or iy) + end + return bint_parse(math_min(x, y)) +end + +--- Add an integer to a bint (in-place). +-- @param y An integer to be added. +-- @raise Asserts in case inputs are not convertible to integers. +function bint:_add(y) + y = bint_assert_convert(y) + local carry = 0 + for i=1,BINT_SIZE do + local tmp = self[i] + y[i] + carry + carry = tmp >> BINT_WORDBITS + self[i] = tmp & BINT_WORDMAX + end + return self +end + +--- Add two numbers considering bints. +-- @param x A bint or a lua number to be added. +-- @param y A bint or a lua number to be added. +function bint.__add(x, y) + local ix, iy = tobint(x), tobint(y) + if ix and iy then + local z = setmetatable({}, bint) + local carry = 0 + for i=1,BINT_SIZE do + local tmp = ix[i] + iy[i] + carry + carry = tmp >> BINT_WORDBITS + z[i] = tmp & BINT_WORDMAX + end + return z + end + return bint_tonumber(x) + bint_tonumber(y) +end + +--- Subtract an integer from a bint (in-place). +-- @param y An integer to subtract. +-- @raise Asserts in case inputs are not convertible to integers. +function bint:_sub(y) + y = bint_assert_convert(y) + local borrow = 0 + local wordmaxp1 = BINT_WORDMAX + 1 + for i=1,BINT_SIZE do + local res = self[i] + wordmaxp1 - y[i] - borrow + self[i] = res & BINT_WORDMAX + borrow = (res >> BINT_WORDBITS) ~ 1 + end + return self +end + +--- Subtract two numbers considering bints. +-- @param x A bint or a lua number to be subtracted from. +-- @param y A bint or a lua number to subtract. +function bint.__sub(x, y) + local ix, iy = tobint(x), tobint(y) + if ix and iy then + local z = setmetatable({}, bint) + local borrow = 0 + local wordmaxp1 = BINT_WORDMAX + 1 + for i=1,BINT_SIZE do + local res = ix[i] + wordmaxp1 - iy[i] - borrow + z[i] = res & BINT_WORDMAX + borrow = (res >> BINT_WORDBITS) ~ 1 + end + return z + end + return bint_tonumber(x) - bint_tonumber(y) +end + +--- Multiply two numbers considering bints. +-- @param x A bint or a lua number to multiply. +-- @param y A bint or a lua number to multiply. +function bint.__mul(x, y) + local ix, iy = tobint(x), tobint(y) + if ix and iy then + local z = bint_zero() + local sizep1 = BINT_SIZE+1 + local s = sizep1 + local e = 0 + for i=1,BINT_SIZE do + if ix[i] ~= 0 or iy[i] ~= 0 then + e = math_max(e, i) + s = math_min(s, i) + end + end + for i=s,e do + for j=s,math_min(sizep1-i,e) do + local a = ix[i] * iy[j] + if a ~= 0 then + local carry = 0 + for k=i+j-1,BINT_SIZE do + local tmp = z[k] + (a & BINT_WORDMAX) + carry + carry = tmp >> BINT_WORDBITS + z[k] = tmp & BINT_WORDMAX + a = a >> BINT_WORDBITS + end + end + end + end + return z + end + return bint_tonumber(x) * bint_tonumber(y) +end + +--- Check if bints are equal. +-- @param x A bint to compare. +-- @param y A bint to compare. +function bint.__eq(x, y) + for i=1,BINT_SIZE do + if x[i] ~= y[i] then + return false + end + end + return true +end + +--- Check if numbers are equal considering bints. +-- @param x A bint or lua number to compare. +-- @param y A bint or lua number to compare. +function bint.eq(x, y) + local ix, iy = tobint(x), tobint(y) + if ix and iy then + return ix == iy + end + return x == y +end +local bint_eq = bint.eq + +local function findleftbit(x) + for i=BINT_SIZE,1,-1 do + local v = x[i] + if v ~= 0 then + local j = 0 + repeat + v = v >> 1 + j = j + 1 + until v == 0 + return (i-1)*BINT_WORDBITS + j - 1, i + end + end +end + +-- Single word division modulus +local function sudivmod(nume, deno) + local rema + local carry = 0 + for i=BINT_SIZE,1,-1 do + carry = carry | nume[i] + nume[i] = carry // deno + rema = carry % deno + carry = rema << BINT_WORDBITS + end + return rema +end + +--- Perform unsigned division and modulo operation between two integers considering bints. +-- This is effectively the same of @{bint.udiv} and @{bint.umod}. +-- @param x The numerator, must be a bint or a lua integer. +-- @param y The denominator, must be a bint or a lua integer. +-- @return The quotient following the remainder, both bints. +-- @raise Asserts on attempt to divide by zero +-- or if inputs are not convertible to integers. +-- @see bint.udiv +-- @see bint.umod +function bint.udivmod(x, y) + local nume = bint_new(x) + local deno = bint_assert_convert(y) + -- compute if high bits of denominator are all zeros + local ishighzero = true + for i=2,BINT_SIZE do + if deno[i] ~= 0 then + ishighzero = false + break + end + end + if ishighzero then + -- try to divide by a single word (optimization) + local low = deno[1] + assert(low ~= 0, 'attempt to divide by zero') + if low == 1 then + -- denominator is one + return nume, bint_zero() + elseif low <= (BINT_WORDMSB - 1) then + -- can do single word division + local rema = sudivmod(nume, low) + return nume, bint_fromuinteger(rema) + end + end + if nume:ult(deno) then + -- denominator is greater than numerator + return bint_zero(), nume + end + -- align leftmost digits in numerator and denominator + local denolbit = findleftbit(deno) + local numelbit, numesize = findleftbit(nume) + local bit = numelbit - denolbit + deno = deno << bit + local wordmaxp1 = BINT_WORDMAX + 1 + local wordbitsm1 = BINT_WORDBITS - 1 + local denosize = numesize + local quot = bint_zero() + while bit >= 0 do + -- compute denominator <= numerator + local le = true + local size = math_max(numesize, denosize) + for i=size,1,-1 do + local a, b = deno[i], nume[i] + if a ~= b then + le = a < b + break + end + end + -- if the portion of the numerator above the denominator is greater or equal than to the denominator + if le then + -- subtract denominator from the portion of the numerator + local borrow = 0 + for i=1,size do + local res = nume[i] + wordmaxp1 - deno[i] - borrow + nume[i] = res & BINT_WORDMAX + borrow = (res >> BINT_WORDBITS) ~ 1 + end + -- concatenate 1 to the right bit of the quotient + local i = (bit // BINT_WORDBITS) + 1 + quot[i] = quot[i] | (1 << (bit % BINT_WORDBITS)) + end + -- shift right the denominator in one bit + for i=1,denosize-1 do + deno[i] = ((deno[i] >> 1) | (deno[i+1] << wordbitsm1)) & BINT_WORDMAX + end + local lastdenoword = deno[denosize] >> 1 + deno[denosize] = lastdenoword + -- recalculate denominator size (optimization) + if lastdenoword == 0 then + while deno[denosize] == 0 do + denosize = denosize - 1 + end + if denosize == 0 then + break + end + end + -- decrement current set bit for the quotient + bit = bit - 1 + end + -- the remaining numerator is the remainder + return quot, nume +end +local bint_udivmod = bint.udivmod + +--- Perform unsigned division between two integers considering bints. +-- @param x The numerator, must be a bint or a lua integer. +-- @param y The denominator, must be a bint or a lua integer. +-- @return The quotient, a bint. +-- @raise Asserts on attempt to divide by zero +-- or if inputs are not convertible to integers. +function bint.udiv(x, y) + return (bint_udivmod(x, y)) +end + +--- Perform unsigned integer modulo operation between two integers considering bints. +-- @param x The numerator, must be a bint or a lua integer. +-- @param y The denominator, must be a bint or a lua integer. +-- @return The remainder, a bint. +-- @raise Asserts on attempt to divide by zero +-- or if the inputs are not convertible to integers. +function bint.umod(x, y) + local _, rema = bint_udivmod(x, y) + return rema +end +local bint_umod = bint.umod + +--- Perform integer truncate division and modulo operation between two numbers considering bints. +-- This is effectively the same of @{bint.tdiv} and @{bint.tmod}. +-- @param x The numerator, a bint or lua number. +-- @param y The denominator, a bint or lua number. +-- @return The quotient following the remainder, both bint or lua number. +-- @raise Asserts on attempt to divide by zero or on division overflow. +-- @see bint.tdiv +-- @see bint.tmod +function bint.tdivmod(x, y) + local ax, ay = bint_abs(x), bint_abs(y) + local ix, iy = tobint(ax), tobint(ay) + local quot, rema + if ix and iy then + assert(not (bint_eq(x, BINT_MININTEGER) and bint_isminusone(y)), 'division overflow') + quot, rema = bint_udivmod(ix, iy) + else + quot, rema = ax // ay, ax % ay + end + local isxneg, isyneg = bint_isneg(x), bint_isneg(y) + if isxneg ~= isyneg then + quot = -quot + end + if isxneg then + rema = -rema + end + return quot, rema +end +local bint_tdivmod = bint.tdivmod + +--- Perform truncate division between two numbers considering bints. +-- Truncate division is a division that rounds the quotient towards zero. +-- @param x The numerator, a bint or lua number. +-- @param y The denominator, a bint or lua number. +-- @return The quotient, a bint or lua number. +-- @raise Asserts on attempt to divide by zero or on division overflow. +function bint.tdiv(x, y) + return (bint_tdivmod(x, y)) +end + +--- Perform integer truncate modulo operation between two numbers considering bints. +-- The operation is defined as the remainder of the truncate division +-- (division that rounds the quotient towards zero). +-- @param x The numerator, a bint or lua number. +-- @param y The denominator, a bint or lua number. +-- @return The remainder, a bint or lua number. +-- @raise Asserts on attempt to divide by zero or on division overflow. +function bint.tmod(x, y) + local _, rema = bint_tdivmod(x, y) + return rema +end + +--- Perform integer floor division and modulo operation between two numbers considering bints. +-- This is effectively the same of @{bint.__idiv} and @{bint.__mod}. +-- @param x The numerator, a bint or lua number. +-- @param y The denominator, a bint or lua number. +-- @return The quotient following the remainder, both bint or lua number. +-- @raise Asserts on attempt to divide by zero. +-- @see bint.__idiv +-- @see bint.__mod +function bint.idivmod(x, y) + local ix, iy = tobint(x), tobint(y) + if ix and iy then + local isnumeneg = ix[BINT_SIZE] & BINT_WORDMSB ~= 0 + local isdenoneg = iy[BINT_SIZE] & BINT_WORDMSB ~= 0 + if isnumeneg then + ix = -ix + end + if isdenoneg then + iy = -iy + end + local quot, rema = bint_udivmod(ix, iy) + if isnumeneg ~= isdenoneg then + quot:_unm() + -- round quotient towards minus infinity + if not rema:iszero() then + quot:_dec() + -- adjust the remainder + if isnumeneg and not isdenoneg then + rema:_unm():_add(y) + elseif isdenoneg and not isnumeneg then + rema:_add(y) + end + end + elseif isnumeneg then + -- adjust the remainder + rema:_unm() + end + return quot, rema + end + local nx, ny = bint_tonumber(x), bint_tonumber(y) + return nx // ny, nx % ny +end +local bint_idivmod = bint.idivmod + +--- Perform floor division between two numbers considering bints. +-- Floor division is a division that rounds the quotient towards minus infinity, +-- resulting in the floor of the division of its operands. +-- @param x The numerator, a bint or lua number. +-- @param y The denominator, a bint or lua number. +-- @return The quotient, a bint or lua number. +-- @raise Asserts on attempt to divide by zero. +function bint.__idiv(x, y) + local ix, iy = tobint(x), tobint(y) + if ix and iy then + local isnumeneg = ix[BINT_SIZE] & BINT_WORDMSB ~= 0 + local isdenoneg = iy[BINT_SIZE] & BINT_WORDMSB ~= 0 + if isnumeneg then + ix = -ix + end + if isdenoneg then + iy = -iy + end + local quot, rema = bint_udivmod(ix, iy) + if isnumeneg ~= isdenoneg then + quot:_unm() + -- round quotient towards minus infinity + if not rema:iszero() then + quot:_dec() + end + end + return quot, rema + end + return bint_tonumber(x) // bint_tonumber(y) +end + +--- Perform division between two numbers considering bints. +-- This always casts inputs to floats, for integer division only use @{bint.__idiv}. +-- @param x The numerator, a bint or lua number. +-- @param y The denominator, a bint or lua number. +-- @return The quotient, a lua number. +function bint.__div(x, y) + return bint_tonumber(x) / bint_tonumber(y) +end + +--- Perform integer floor modulo operation between two numbers considering bints. +-- The operation is defined as the remainder of the floor division +-- (division that rounds the quotient towards minus infinity). +-- @param x The numerator, a bint or lua number. +-- @param y The denominator, a bint or lua number. +-- @return The remainder, a bint or lua number. +-- @raise Asserts on attempt to divide by zero. +function bint.__mod(x, y) + local _, rema = bint_idivmod(x, y) + return rema +end + +--- Perform integer power between two integers considering bints. +-- If y is negative then pow is performed as an unsigned integer. +-- @param x The base, an integer. +-- @param y The exponent, an integer. +-- @return The result of the pow operation, a bint. +-- @raise Asserts in case inputs are not convertible to integers. +-- @see bint.__pow +-- @see bint.upowmod +function bint.ipow(x, y) + y = bint_assert_convert(y) + if y:iszero() then + return bint_one() + elseif y:isone() then + return bint_new(x) + end + -- compute exponentiation by squaring + x, y = bint_new(x), bint_new(y) + local z = bint_one() + repeat + if y:iseven() then + x = x * x + y:_shrone() + else + z = x * z + x = x * x + y:_dec():_shrone() + end + until y:isone() + return x * z +end + +--- Perform integer power between two unsigned integers over a modulus considering bints. +-- @param x The base, an integer. +-- @param y The exponent, an integer. +-- @param m The modulus, an integer. +-- @return The result of the pow operation, a bint. +-- @raise Asserts in case inputs are not convertible to integers. +-- @see bint.__pow +-- @see bint.ipow +function bint.upowmod(x, y, m) + m = bint_assert_convert(m) + if m:isone() then + return bint_zero() + end + x, y = bint_new(x), bint_new(y) + local z = bint_one() + x = bint_umod(x, m) + while not y:iszero() do + if y:isodd() then + z = bint_umod(z*x, m) + end + y:_shrone() + x = bint_umod(x*x, m) + end + return z +end + +--- Perform numeric power between two numbers considering bints. +-- This always casts inputs to floats, for integer power only use @{bint.ipow}. +-- @param x The base, a bint or lua number. +-- @param y The exponent, a bint or lua number. +-- @return The result of the pow operation, a lua number. +-- @see bint.ipow +function bint.__pow(x, y) + return bint_tonumber(x) ^ bint_tonumber(y) +end + +--- Bitwise left shift integers considering bints. +-- @param x An integer to perform the bitwise shift. +-- @param y An integer with the number of bits to shift. +-- @return The result of shift operation, a bint. +-- @raise Asserts in case inputs are not convertible to integers. +function bint.__shl(x, y) + x, y = bint_new(x), bint_assert_tointeger(y) + if y == math_mininteger or math_abs(y) >= BINT_BITS then + return bint_zero() + end + if y < 0 then + return x >> -y + end + local nvals = y // BINT_WORDBITS + if nvals ~= 0 then + x:_shlwords(nvals) + y = y - nvals * BINT_WORDBITS + end + if y ~= 0 then + local wordbitsmy = BINT_WORDBITS - y + for i=BINT_SIZE,2,-1 do + x[i] = ((x[i] << y) | (x[i-1] >> wordbitsmy)) & BINT_WORDMAX + end + x[1] = (x[1] << y) & BINT_WORDMAX + end + return x +end + +--- Bitwise right shift integers considering bints. +-- @param x An integer to perform the bitwise shift. +-- @param y An integer with the number of bits to shift. +-- @return The result of shift operation, a bint. +-- @raise Asserts in case inputs are not convertible to integers. +function bint.__shr(x, y) + x, y = bint_new(x), bint_assert_tointeger(y) + if y == math_mininteger or math_abs(y) >= BINT_BITS then + return bint_zero() + end + if y < 0 then + return x << -y + end + local nvals = y // BINT_WORDBITS + if nvals ~= 0 then + x:_shrwords(nvals) + y = y - nvals * BINT_WORDBITS + end + if y ~= 0 then + local wordbitsmy = BINT_WORDBITS - y + for i=1,BINT_SIZE-1 do + x[i] = ((x[i] >> y) | (x[i+1] << wordbitsmy)) & BINT_WORDMAX + end + x[BINT_SIZE] = x[BINT_SIZE] >> y + end + return x +end + +--- Bitwise AND bints (in-place). +-- @param y An integer to perform bitwise AND. +-- @raise Asserts in case inputs are not convertible to integers. +function bint:_band(y) + y = bint_assert_convert(y) + for i=1,BINT_SIZE do + self[i] = self[i] & y[i] + end + return self +end + +--- Bitwise AND two integers considering bints. +-- @param x An integer to perform bitwise AND. +-- @param y An integer to perform bitwise AND. +-- @raise Asserts in case inputs are not convertible to integers. +function bint.__band(x, y) + return bint_new(x):_band(y) +end + +--- Bitwise OR bints (in-place). +-- @param y An integer to perform bitwise OR. +-- @raise Asserts in case inputs are not convertible to integers. +function bint:_bor(y) + y = bint_assert_convert(y) + for i=1,BINT_SIZE do + self[i] = self[i] | y[i] + end + return self +end + +--- Bitwise OR two integers considering bints. +-- @param x An integer to perform bitwise OR. +-- @param y An integer to perform bitwise OR. +-- @raise Asserts in case inputs are not convertible to integers. +function bint.__bor(x, y) + return bint_new(x):_bor(y) +end + +--- Bitwise XOR bints (in-place). +-- @param y An integer to perform bitwise XOR. +-- @raise Asserts in case inputs are not convertible to integers. +function bint:_bxor(y) + y = bint_assert_convert(y) + for i=1,BINT_SIZE do + self[i] = self[i] ~ y[i] + end + return self +end + +--- Bitwise XOR two integers considering bints. +-- @param x An integer to perform bitwise XOR. +-- @param y An integer to perform bitwise XOR. +-- @raise Asserts in case inputs are not convertible to integers. +function bint.__bxor(x, y) + return bint_new(x):_bxor(y) +end + +--- Bitwise NOT a bint (in-place). +function bint:_bnot() + for i=1,BINT_SIZE do + self[i] = (~self[i]) & BINT_WORDMAX + end + return self +end + +--- Bitwise NOT a bint. +-- @param x An integer to perform bitwise NOT. +-- @raise Asserts in case inputs are not convertible to integers. +function bint.__bnot(x) + local y = setmetatable({}, bint) + for i=1,BINT_SIZE do + y[i] = (~x[i]) & BINT_WORDMAX + end + return y +end + +--- Negate a bint (in-place). This effectively applies two's complements. +function bint:_unm() + return self:_bnot():_inc() +end + +--- Negate a bint. This effectively applies two's complements. +-- @param x A bint to perform negation. +function bint.__unm(x) + return (~x):_inc() +end + +--- Compare if integer x is less than y considering bints (unsigned version). +-- @param x Left integer to compare. +-- @param y Right integer to compare. +-- @raise Asserts in case inputs are not convertible to integers. +-- @see bint.__lt +function bint.ult(x, y) + x, y = bint_assert_convert(x), bint_assert_convert(y) + for i=BINT_SIZE,1,-1 do + local a, b = x[i], y[i] + if a ~= b then + return a < b + end + end + return false +end + +--- Compare if bint x is less or equal than y considering bints (unsigned version). +-- @param x Left integer to compare. +-- @param y Right integer to compare. +-- @raise Asserts in case inputs are not convertible to integers. +-- @see bint.__le +function bint.ule(x, y) + x, y = bint_assert_convert(x), bint_assert_convert(y) + for i=BINT_SIZE,1,-1 do + local a, b = x[i], y[i] + if a ~= b then + return a < b + end + end + return true +end + +--- Compare if number x is less than y considering bints and signs. +-- @param x Left value to compare, a bint or lua number. +-- @param y Right value to compare, a bint or lua number. +-- @see bint.ult +function bint.__lt(x, y) + local ix, iy = tobint(x), tobint(y) + if ix and iy then + local xneg = ix[BINT_SIZE] & BINT_WORDMSB ~= 0 + local yneg = iy[BINT_SIZE] & BINT_WORDMSB ~= 0 + if xneg == yneg then + for i=BINT_SIZE,1,-1 do + local a, b = ix[i], iy[i] + if a ~= b then + return a < b + end + end + return false + end + return xneg and not yneg + end + return bint_tonumber(x) < bint_tonumber(y) +end + +--- Compare if number x is less or equal than y considering bints and signs. +-- @param x Left value to compare, a bint or lua number. +-- @param y Right value to compare, a bint or lua number. +-- @see bint.ule +function bint.__le(x, y) + local ix, iy = tobint(x), tobint(y) + if ix and iy then + local xneg = ix[BINT_SIZE] & BINT_WORDMSB ~= 0 + local yneg = iy[BINT_SIZE] & BINT_WORDMSB ~= 0 + if xneg == yneg then + for i=BINT_SIZE,1,-1 do + local a, b = ix[i], iy[i] + if a ~= b then + return a < b + end + end + return true + end + return xneg and not yneg + end + return bint_tonumber(x) <= bint_tonumber(y) +end + +--- Convert a bint to a string on base 10. +-- @see bint.tobase +function bint:__tostring() + return self:tobase(10) +end + +-- Allow creating bints by calling bint itself +setmetatable(bint, { + __call = function(_, x) + return bint_new(x) + end +}) + +BINT_MATHMININTEGER, BINT_MATHMAXINTEGER = bint_new(math.mininteger), bint_new(math.maxinteger) +BINT_MININTEGER = bint.mininteger() +memo[memoindex] = bint + +return bint + +end + +return newmodule \ No newline at end of file diff --git a/hyper/src/boot.lua b/hyper/src/boot.lua new file mode 100644 index 000000000..502b0dc69 --- /dev/null +++ b/hyper/src/boot.lua @@ -0,0 +1,47 @@ +--- The Boot module provides functionality for booting the process. Returns the boot function. +-- @module boot + +-- This is for aop6 Boot Loader +-- See: https://github.com/permaweb/aos/issues/342 +-- For the Process as the first Message, if On-Boot +-- has the value 'data' then evaluate the data +-- if it is a tx id, then download and evaluate the tx + +local drive = { _version = "0.0.1" } + +function drive.getData(txId) + local file = io.open('/data/' .. txId) + if not file then + return nil, "File not found!" + end + local contents = file:read( + file:seek('end') + ) + file:close() + return contents +end + +--- The boot function. +-- If the message has no On-Boot tag, do nothing. +-- If the message has an On-Boot tag with the value 'Data', then evaluate the message. +-- If the message has an On-Boot tag with a tx id, then download and evaluate the tx data. +-- @function boot +-- @param ao The ao environment object +-- @see eval +return function (ao) + local eval = require(".eval")(ao) + return function (msg) + if #Inbox == 0 then + table.insert(Inbox, msg) + end + if msg.Tags['On-Boot'] == nil then + return + end + if msg.Tags['On-Boot'] == 'Data' then + eval(msg) + else + local loadedVal = drive.getData(msg.Tags['On-Boot']) + eval({ Data = loadedVal }) + end + end +end \ No newline at end of file diff --git a/hyper/src/chance.lua b/hyper/src/chance.lua new file mode 100644 index 000000000..7c84f8d92 --- /dev/null +++ b/hyper/src/chance.lua @@ -0,0 +1,105 @@ +--- The Chance module provides utilities for generating random numbers and values. Returns the chance table. +-- @module chance + +local N = 624 +local M = 397 +local MATRIX_A = 0x9908b0df +local UPPER_MASK = 0x80000000 +local LOWER_MASK = 0x7fffffff + +--- Initializes mt[N] with a seed +-- @lfunction init_genrand +-- @tparam {table} o The table to initialize +-- @tparam {number} s The seed +local function init_genrand(o, s) + o.mt[0] = s & 0xffffffff + for i = 1, N - 1 do + o.mt[i] = (1812433253 * (o.mt[i - 1] ~ (o.mt[i - 1] >> 30))) + i + -- See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. + -- In the previous versions, MSBs of the seed affect + -- only MSBs of the array mt[]. + -- 2002/01/09 modified by Makoto Matsumoto + o.mt[i] = o.mt[i] & 0xffffffff + -- for >32 bit machines + end + o.mti = N +end + +--- Generates a random number on [0,0xffffffff]-interval +-- @lfunction genrand_int32 +-- @tparam {table} o The table to generate the random number from +-- @treturn {number} The random number +local function genrand_int32(o) + local y + local mag01 = {} -- mag01[x] = x * MATRIX_A for x=0,1 + mag01[0] = 0x0 + mag01[1] = MATRIX_A + if o.mti >= N then -- generate N words at one time + if o.mti == N + 1 then -- if init_genrand() has not been called, + init_genrand(o, 5489) -- a default initial seed is used + end + for kk = 0, N - M - 1 do + y = (o.mt[kk] & UPPER_MASK) | (o.mt[kk + 1] & LOWER_MASK) + o.mt[kk] = o.mt[kk + M] ~ (y >> 1) ~ mag01[y & 0x1] + end + for kk = N - M, N - 2 do + y = (o.mt[kk] & UPPER_MASK) | (o.mt[kk + 1] & LOWER_MASK) + o.mt[kk] = o.mt[kk + (M - N)] ~ (y >> 1) ~ mag01[y & 0x1] + end + y = (o.mt[N - 1] & UPPER_MASK) | (o.mt[0] & LOWER_MASK) + o.mt[N - 1] = o.mt[M - 1] ~ (y >> 1) ~ mag01[y & 0x1] + + o.mti = 0 + end + + y = o.mt[o.mti] + o.mti = o.mti + 1 + + -- Tempering + y = y ~ (y >> 11) + y = y ~ ((y << 7) & 0x9d2c5680) + y = y ~ ((y << 15) & 0xefc60000) + y = y ~ (y >> 18) + + return y +end + +local MersenneTwister = {} +MersenneTwister.mt = {} +MersenneTwister.mti = N + 1 + + +--- The Random table +-- @table Random +-- @field seed The seed function +-- @field random The random function +-- @field integer The integer function +local Random = {} + +--- Sets a new random table given a seed. +-- @function seed +-- @tparam {number} seed The seed +function Random.seed(seed) + init_genrand(MersenneTwister, seed) +end + +--- Generates a random number on [0,1)-real-interval. +-- @function random +-- @treturn {number} The random number +function Random.random() + return genrand_int32(MersenneTwister) * (1.0 / 4294967296.0) +end + +--- Returns a random integer. The min and max are INCLUDED in the range. +-- The max integer in lua is math.maxinteger +-- The min is math.mininteger +-- @function Random.integer +-- @tparam {number} min The minimum value +-- @tparam {number} max The maximum value +-- @treturn {number} The random integer +function Random.integer(min, max) + assert(max >= min, "max must bigger than min") + return math.floor(Random.random() * (max - min + 1) + min) +end + +return Random \ No newline at end of file diff --git a/hyper/src/checklist.md b/hyper/src/checklist.md new file mode 100644 index 000000000..ce4d9a318 --- /dev/null +++ b/hyper/src/checklist.md @@ -0,0 +1,19 @@ +- [x] init state +- [x] return error +- [x] print +- [x] send +- [x] spawn +- [ ] assign +- [ ] authorities +- [ ] assignable +- [ ] seed - chance +- [ ] ftcsv + +etc + +Issues: + +- authorities +- assignments + +NOTE: Owner is not correctly implemented, it needs to handle ['from-process'] use case diff --git a/hyper/src/default.lua b/hyper/src/default.lua new file mode 100644 index 000000000..ec9facbaa --- /dev/null +++ b/hyper/src/default.lua @@ -0,0 +1,24 @@ +local json = require('.json') +-- default handler for aos +return function (insertInbox) + return function (msg) + -- Add Message to Inbox + insertInbox(msg) + + -- local txt = Colors.gray .. "New Message From " .. Colors.green .. + -- (msg.From and (msg.From:sub(1,3) .. "..." .. msg.From:sub(-3)) or "unknown") .. Colors.gray .. ": " + -- if msg.Action then + -- txt = txt .. Colors.gray .. (msg.Action and ("Action = " .. Colors.blue .. msg.Action:sub(1,20)) or "") .. Colors.reset + -- else + -- local data = msg.Data + -- if type(data) == 'table' then + -- data = json.encode(data) + -- end + -- txt = txt .. Colors.gray .. "Data = " .. Colors.blue .. (data and data:sub(1,20) or "") .. Colors.reset + -- end + -- Print to Output + -- print(txt) + print("New Message") + end + +end diff --git a/hyper/src/dump.lua b/hyper/src/dump.lua new file mode 100644 index 000000000..d59e22f24 --- /dev/null +++ b/hyper/src/dump.lua @@ -0,0 +1,297 @@ +-- +-- Copyright (C) 2018 Masatoshi Teruya +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- +-- dump.lua +-- lua-dump +-- Created by Masatoshi Teruya on 18/04/22. +-- +--- file-scope variables +local type = type +local floor = math.floor +local tostring = tostring +local tblsort = table.sort +local tblconcat = table.concat +local strmatch = string.match +local strformat = string.format +--- constants +local INFINITE_POS = math.huge +local LUA_FIELDNAME_PAT = '^[a-zA-Z_][a-zA-Z0-9_]*$' +local FOR_KEY = 'key' +local FOR_VAL = 'val' +local FOR_CIRCULAR = 'circular' +local RESERVED_WORD = { + -- primitive data + ['nil'] = true, + ['true'] = true, + ['false'] = true, + -- declaraton + ['local'] = true, + ['function'] = true, + -- boolean logic + ['and'] = true, + ['or'] = true, + ['not'] = true, + -- conditional statement + ['if'] = true, + ['elseif'] = true, + ['else'] = true, + -- iteration statement + ['for'] = true, + ['in'] = true, + ['while'] = true, + ['until'] = true, + ['repeat'] = true, + -- jump statement + ['break'] = true, + ['goto'] = true, + ['return'] = true, + -- block scope statement + ['then'] = true, + ['do'] = true, + ['end'] = true, +} +local DEFAULT_INDENT = 4 + +--- filter function for dump +--- @param val any +--- @param depth integer +--- @param vtype string +--- @param use string +--- @param key any +--- @param udata any +--- @return any val +--- @return boolean nodump +local function DEFAULT_FILTER(val) + return val +end + +--- sort_index +--- @param a table +--- @param b table +local function sort_index(a, b) + if a.typ == b.typ then + if a.typ == 'boolean' then + return b.key + end + + return a.key < b.key + end + + return a.typ == 'number' +end + +--- dumptbl +--- @param tbl table +--- @param depth integer +--- @param indent string +--- @param nestIndent string +--- @param ctx table +--- @return string +local function dumptbl(tbl, depth, indent, nestIndent, ctx) + local ref = tostring(tbl) + + -- circular reference + if ctx.circular[ref] then + local val, nodump = ctx.filter(tbl, depth, type(tbl), FOR_CIRCULAR, tbl, + ctx.udata) + + if val ~= nil and val ~= tbl then + local t = type(val) + + if t == 'table' then + -- dump table value + if not nodump then + return dumptbl(val, depth + 1, indent, nestIndent, ctx) + end + return tostring(val) + elseif t == 'string' then + return strformat('%q', val) + elseif t == 'number' or t == 'boolean' then + return tostring(val) + end + + return strformat('%q', tostring(val)) + end + + return '""' + end + + local res = {} + local arr = {} + local narr = 0 + local fieldIndent = indent .. nestIndent + + -- save reference + ctx.circular[ref] = true + + for k, v in pairs(tbl) do + -- check key + local key, nokdump = ctx.filter(k, depth, type(k), FOR_KEY, nil, + ctx.udata) + + if key ~= nil then + -- check val + local val, novdump = ctx.filter(v, depth, type(v), FOR_VAL, key, + ctx.udata) + local kv + + if val ~= nil then + local kt = type(key) + local vt = type(val) + + -- convert key to suitable to be safely read back + -- by the Lua interpreter + if kt == 'number' or kt == 'boolean' then + k = key + key = '[' .. tostring(key) .. ']' + -- dump table value + elseif kt == 'table' and not nokdump then + key = '[' .. + dumptbl(key, depth + 1, fieldIndent, nestIndent, + ctx) .. ']' + k = key + kt = 'string' + elseif kt ~= 'string' or RESERVED_WORD[key] or + not strmatch(key, LUA_FIELDNAME_PAT) then + key = strformat("[%q]", tostring(key), v) + k = key + kt = 'string' + end + + -- convert key-val pair to suitable to be safely read back + -- by the Lua interpreter + if vt == 'number' or vt == 'boolean' then + kv = strformat('%s%s = %s', fieldIndent, key, tostring(val)) + elseif vt == 'string' then + -- dump a string-value + if not novdump then + kv = strformat('%s%s = %q', fieldIndent, key, val) + else + kv = strformat('%s%s = %s', fieldIndent, key, val) + end + elseif vt == 'table' and not novdump then + kv = strformat('%s%s = %s', fieldIndent, key, dumptbl(val, + depth + + 1, + fieldIndent, + nestIndent, + ctx)) + else + kv = strformat('%s%s = %q', fieldIndent, key, tostring(val)) + end + + -- add to array + narr = narr + 1 + arr[narr] = { + typ = kt, + key = k, + val = kv, + } + end + end + end + + -- remove reference + ctx.circular[ref] = nil + -- concat result + if narr > 0 then + tblsort(arr, sort_index) + + for i = 1, narr do + res[i] = arr[i].val + end + res[1] = '{' .. ctx.LF .. res[1] + res = tblconcat(res, ',' .. ctx.LF) .. ctx.LF .. indent .. '}' + else + res = '{}' + end + + return res +end + +--- is_uint +--- @param v any +--- @return boolean ok +local function is_uint(v) + return type(v) == 'number' and v < INFINITE_POS and v >= 0 and floor(v) == v +end + +--- dump +--- @param val any +--- @param indent integer +--- @param padding integer +--- @param filter function +--- @param udata +--- @return string +local function dump(val, indent, padding, filter, udata) + local t = type(val) + + -- check indent + if indent == nil then + indent = DEFAULT_INDENT + elseif not is_uint(indent) then + error('indent must be unsigned integer', 2) + end + + -- check padding + if padding == nil then + padding = 0 + elseif not is_uint(padding) then + error('padding must be unsigned integer', 2) + end + + -- check filter + if filter == nil then + filter = DEFAULT_FILTER + elseif type(filter) ~= 'function' then + error('filter must be function', 2) + end + + -- dump table + if t == 'table' then + local ispace = '' + local pspace = '' + + if indent > 0 then + ispace = strformat('%' .. tostring(indent) .. 's', '') + end + + if padding > 0 then + pspace = strformat('%' .. tostring(padding) .. 's', '') + end + + return dumptbl(val, 1, pspace, ispace, { + LF = ispace == '' and ' ' or '\n', + circular = {}, + filter = filter, + udata = udata, + }) + end + + -- dump value + local v, nodump = filter(val, 0, t, FOR_VAL, nil, udata) + if nodump == true then + return tostring(v) + end + return strformat('%q', tostring(v)) +end + +return dump \ No newline at end of file diff --git a/hyper/src/eval.lua b/hyper/src/eval.lua new file mode 100644 index 000000000..b2fbd2d93 --- /dev/null +++ b/hyper/src/eval.lua @@ -0,0 +1,51 @@ +--- The Eval module provides a handler for evaluating Lua expressions. Returns the eval function. +-- @module eval + +local stringify = require(".stringify") +local json = require('.json') +--- The eval function. +-- Handler for executing and evaluating Lua expressions. +-- After execution, the result is stringified and placed in ao.outbox.Output. +-- @function eval +-- @tparam {table} ao The ao environment object +-- @treturn {function} The handler function, which takes a message as an argument. +-- @see stringify +return function (ao) + return function (req) + local msg = req.body + -- exec expression + local expr = msg.body and msg.body.body or msg.data or "" + local func, err = load("return " .. expr, 'aos', 't', _G) + local output = "" + local e = nil + if err then + func, err = load(expr, 'aos', 't', _G) + end + if func then + output, e = func() + else + ao.outbox.Error = err + return + end + if e then + ao.outbox.Error = e + return + end + if HandlerPrintLogs and output then + table.insert(HandlerPrintLogs, + type(output) == "table" + and stringify.format(output) + or tostring(output) + ) + -- print(stringify.format(HandlerPrintLogs)) + -- else + -- -- set result in outbox.Output (Left for backwards compatibility) + -- ao.outbox.Output = { + -- data = type(output) == "table" + -- and stringify.format(output) or tostring(output), + -- prompt = Prompt() + -- } + -- + end + end +end diff --git a/hyper/src/handlers-utils.lua b/hyper/src/handlers-utils.lua new file mode 100644 index 000000000..39319e861 --- /dev/null +++ b/hyper/src/handlers-utils.lua @@ -0,0 +1,90 @@ +--- The Handler 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. Returns the _utils table. +-- @module handlers-utils + +--- The _utils table +-- @table _utils +-- @field _version The version number of the _utils module +-- @field hasMatchingTag The hasMatchingTag function +-- @field hasMatchingTagOf The hasMatchingTagOf function +-- @field hasMatchingData The hasMatchingData function +-- @field reply The reply function +-- @field continue The continue function +local _utils = { _version = "0.0.2" } + +local _ = require('.utils') + +--- Checks if a given message has a tag that matches the specified name and value. +-- @function hasMatchingTag +-- @tparam {string} name The tag name to check +-- @tparam {string} value The value to match for in the tag +-- @treturn {function} A function that takes a message and returns whether there is a tag match (-1 if matches, 0 otherwise) +function _utils.hasMatchingTag(name, value) + assert(type(name) == 'string' and type(value) == 'string', 'invalid arguments: (name : string, value : string)') + + return function (msg) + return msg.Tags[name] == value + end +end + +--- Checks if a given message has a tag that matches the specified name and one of the specified values. +-- @function hasMatchingTagOf +-- @tparam {string} name The tag name to check +-- @tparam {string[]} values The list of values of which one should match +-- @treturn {function} A function that takes a message and returns whether there is a tag match (-1 if matches, 0 otherwise) +function _utils.hasMatchingTagOf(name, values) + assert(type(name) == 'string' and type(values) == 'table', 'invalid arguments: (name : string, values : string[])') + return function (msg) + for _, value in ipairs(values) do + local patternResult = Handlers.utils.hasMatchingTag(name, value)(msg) + + if patternResult ~= 0 and patternResult ~= false and patternResult ~= "skip" then + return patternResult + end + end + + return 0 + end +end + +--- Checks if a given message has data that matches the specified value. +-- @function hasMatchingData +-- @tparam {string} value The value to match against the message data +-- @treturn {function} A function that takes a message and returns whether the data matches the value (-1 if matches, 0 otherwise) +function _utils.hasMatchingData(value) + assert(type(value) == 'string', 'invalid arguments: (value : string)') + return function (msg) + return msg.Data == value + end +end + +--- Given an input, returns a function that takes a message and replies to it. +-- @function reply +-- @tparam {table | string} input The content to send back. If a string, it sends it as data. If a table, it assumes a structure with `Tags`. +-- @treturn {function} A function that takes a message and replies to it +function _utils.reply(input) + assert(type(input) == 'table' or type(input) == 'string', 'invalid arguments: (input : table or string)') + return function (msg) + if type(input) == 'string' then + msg.reply({ Data = input }) + return + end + msg.reply(input) + end +end + +--- Inverts the provided pattern's result if it matches, so that it continues execution with the next matching handler. +-- @function continue +-- @tparam {table | function} pattern The pattern to check for in the message +-- @treturn {function} Function that executes the pattern matching function and returns `1` (continue), so that the execution of handlers continues. +function _utils.continue(pattern) + return function (msg) + local match = _.matchesSpec(msg, pattern) + + if not match or match == 0 or match == "skip" then + return match + end + return 1 + end +end + +return _utils diff --git a/hyper/src/handlers.lua b/hyper/src/handlers.lua new file mode 100644 index 000000000..744dd0c20 --- /dev/null +++ b/hyper/src/handlers.lua @@ -0,0 +1,356 @@ +--- 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. Returns the handlers table. +-- @module handlers + +--- The handlers table +-- @table handlers +-- @field _version The version number of the handlers module +-- @field list The list of handlers +-- @field onceNonce The nonce for the once handlers +-- @field utils The handlers-utils module +-- @field generateResolver The generateResolver function +-- @field receive The receive function +-- @field once The once function +-- @field add The add function +-- @field append The append function +-- @field prepend The prepend function +-- @field remove The remove function +-- @field evaluate The evaluate function +local handlers = { _version = "0.0.5" } +local utils = require('.utils') + +handlers.utils = require('.handlers-utils') +-- if update we need to keep defined handlers +if Handlers then + handlers.list = Handlers.list or {} +else + handlers.list = {} +end +handlers.onceNonce = 0 + +--- Given an array, a property name, and a value, returns the index of the object in the array that has the property with the value. +-- @lfunction findIndexByProp +-- @tparam {table[]} array The array to search through +-- @tparam {string} prop The property name to check +-- @tparam {any} value The value to check for in the property +-- @treturn {number | nil} The index of the object in the array that has the property with the value, or nil if no such object is found +local function findIndexByProp(array, prop, value) + for index, object in ipairs(array) do + if object[prop] == value then + return index + end + end + return nil +end + +--- Given a name, a pattern, and a handle, asserts that the arguments are valid. +-- @lfunction assertAddArgs +-- @tparam {string} name The name of the handler +-- @tparam {table | function | string} pattern The pattern to check for in the message +-- @tparam {function} handle The function to call if the pattern matches +-- @tparam {number | string | nil} maxRuns The maximum number of times the handler should run, or nil if there is no limit +local function assertAddArgs(name, pattern, handle, maxRuns) + assert( + type(name) == 'string' and + (type(pattern) == 'function' or type(pattern) == 'table' or type(pattern) == 'string'), + 'Invalid arguments given. Expected: \n' .. + '\tname : string, ' .. + '\tpattern : action : string | MsgMatch : table,\n' .. + '\t\tfunction(msg: Message) : {-1 = break, 0 = skip, 1 = continue},\n' .. + '\thandle(msg : Message) : void) | Resolver,\n' .. + '\tMaxRuns? : number | "inf" | nil') +end + +--- Given a resolver specification, returns a resolver function. +-- @function generateResolver +-- @tparam {table | function} resolveSpec The resolver specification +-- @treturn {function} A resolver function +function handlers.generateResolver(resolveSpec) + return function(msg) + -- If the resolver is a single function, call it. + -- Else, find the first matching pattern (by its matchSpec), and exec. + if type(resolveSpec) == "function" then + return resolveSpec(msg) + else + for matchSpec, func in pairs(resolveSpec) do + if utils.matchesSpec(msg, matchSpec) then + return func(msg) + end + end + end + end +end + +--- Given a pattern, returns the next message that matches the pattern. +-- This function uses Lua's coroutines under-the-hood to add a handler, pause, +-- and then resume the current coroutine. This allows us to effectively block +-- processing of one message until another is received that matches the pattern. +-- @function receive +-- @tparam {table | function} pattern The pattern to check for in the message +function handlers.receive(pattern) + return 'not implemented' +end + +--- Given a name, a pattern, and a handle, adds a handler to the list. +-- If name is not provided, "_once_" prefix plus onceNonce will be used as the name. +-- Adds handler with maxRuns of 1 such that it will only be called once then removed from the list. +-- @function once +-- @tparam {string} name The name of the handler +-- @tparam {table | function | string} pattern The pattern to check for in the message +-- @tparam {function} handle The function to call if the pattern matches +function handlers.once(...) + local name, pattern, handle + if select("#", ...) == 3 then + name = select(1, ...) + pattern = select(2, ...) + handle = select(3, ...) + else + name = "_once_" .. tostring(handlers.onceNonce) + handlers.onceNonce = handlers.onceNonce + 1 + pattern = select(1, ...) + handle = select(2, ...) + end + handlers.prepend(name, pattern, handle, 1) +end + +--- Given a name, a pattern, and a handle, adds a handler to the list. +-- @function add +-- @tparam {string} name The name of the handler +-- @tparam {table | function | string} pattern The pattern to check for in the message +-- @tparam {function} handle The function to call if the pattern matches +-- @tparam {number | string | nil} maxRuns The maximum number of times the handler should run, or nil if there is no limit +function handlers.add(...) + local name, pattern, handle, maxRuns + local args = select("#", ...) + if args == 2 then + name = select(1, ...) + pattern = select(1, ...) + handle = select(2, ...) + maxRuns = nil + elseif args == 3 then + name = select(1, ...) + pattern = select(2, ...) + handle = select(3, ...) + maxRuns = nil + else + name = select(1, ...) + pattern = select(2, ...) + handle = select(3, ...) + maxRuns = select(4, ...) + end + assertAddArgs(name, pattern, handle, maxRuns) + + handle = handlers.generateResolver(handle) + + -- update existing handler by name + local idx = findIndexByProp(handlers.list, "name", name) + if idx ~= nil and idx > 0 then + -- found update + handlers.list[idx].pattern = pattern + handlers.list[idx].handle = handle + handlers.list[idx].maxRuns = maxRuns + else + -- not found then add + table.insert(handlers.list, { pattern = pattern, handle = handle, name = name, maxRuns = maxRuns }) + + end + return #handlers.list +end + +--- Appends a new handler to the end of the handlers list. +-- @function append +-- @tparam {string} name The name of the handler +-- @tparam {table | function | string} pattern The pattern to check for in the message +-- @tparam {function} handle The function to call if the pattern matches +-- @tparam {number | string | nil} maxRuns The maximum number of times the handler should run, or nil if there is no limit +function handlers.append(...) + local name, pattern, handle, maxRuns + local args = select("#", ...) + if args == 2 then + name = select(1, ...) + pattern = select(1, ...) + handle = select(2, ...) + maxRuns = nil + elseif args == 3 then + name = select(1, ...) + pattern = select(2, ...) + handle = select(3, ...) + maxRuns = nil + else + name = select(1, ...) + pattern = select(2, ...) + handle = select(3, ...) + maxRuns = select(4, ...) + end + assertAddArgs(name, pattern, handle, maxRuns) + + handle = handlers.generateResolver(handle) + -- update existing handler by name + local idx = findIndexByProp(handlers.list, "name", name) + if idx ~= nil and idx > 0 then + -- found update + handlers.list[idx].pattern = pattern + handlers.list[idx].handle = handle + handlers.list[idx].maxRuns = maxRuns + else + table.insert(handlers.list, { pattern = pattern, handle = handle, name = name, maxRuns = maxRuns }) + end +end + +--- Prepends a new handler to the beginning of the handlers list. +-- @function prepend +-- @tparam {string} name The name of the handler +-- @tparam {table | function | string} pattern The pattern to check for in the message +-- @tparam {function} handle The function to call if the pattern matches +-- @tparam {number | string | nil} maxRuns The maximum number of times the handler should run, or nil if there is no limit +function handlers.prepend(...) + local name, pattern, handle, maxRuns + local args = select("#", ...) + if args == 2 then + name = select(1, ...) + pattern = select(1, ...) + handle = select(2, ...) + maxRuns = nil + elseif args == 3 then + name = select(1, ...) + pattern = select(2, ...) + handle = select(3, ...) + maxRuns = nil + else + name = select(1, ...) + pattern = select(2, ...) + handle = select(3, ...) + maxRuns = select(4, ...) + end + assertAddArgs(name, pattern, handle, maxRuns) + + handle = handlers.generateResolver(handle) + + -- update existing handler by name + local idx = findIndexByProp(handlers.list, "name", name) + if idx ~= nil and idx > 0 then + -- found update + handlers.list[idx].pattern = pattern + handlers.list[idx].handle = handle + handlers.list[idx].maxRuns = maxRuns + else + table.insert(handlers.list, 1, { pattern = pattern, handle = handle, name = name, maxRuns = maxRuns }) + end +end + +--- Returns an object that allows adding a new handler before a specified handler. +-- @function before +-- @tparam {string} handleName The name of the handler before which the new handler will be added +-- @treturn {table} An object with an `add` method to insert the new handler +function handlers.before(handleName) + assert(type(handleName) == 'string', 'Handler name MUST be a string') + + local idx = findIndexByProp(handlers.list, "name", handleName) + return { + add = function (name, pattern, handle, maxRuns) + assertAddArgs(name, pattern, handle, maxRuns) + handle = handlers.generateResolver(handle) + if idx then + table.insert(handlers.list, idx, { pattern = pattern, handle = handle, name = name, maxRuns = maxRuns }) + end + end + } +end + +--- Returns an object that allows adding a new handler after a specified handler. +-- @function after +-- @tparam {string} handleName The name of the handler after which the new handler will be added +-- @treturn {table} An object with an `add` method to insert the new handler +function handlers.after(handleName) + assert(type(handleName) == 'string', 'Handler name MUST be a string') + local idx = findIndexByProp(handlers.list, "name", handleName) + return { + add = function (name, pattern, handle, maxRuns) + assertAddArgs(name, pattern, handle, maxRuns) + handle = handlers.generateResolver(handle) + if idx then + table.insert(handlers.list, idx + 1, { pattern = pattern, handle = handle, name = name, maxRuns = maxRuns }) + end + end + } + +end + +--- Removes a handler from the handlers list by name. +-- @function remove +-- @tparam {string} name The name of the handler to be removed +function handlers.remove(name) + assert(type(name) == 'string', 'name MUST be string') + if #handlers.list == 1 and handlers.list[1].name == name then + handlers.list = {} + end + + local idx = findIndexByProp(handlers.list, "name", name) + if idx ~= nil and idx > 0 then + table.remove(handlers.list, idx) + end +end + +--- Evaluates each handler against a given message and environment. Handlers are called in the order they appear in the handlers list. +-- Return 0 to not call handler, -1 to break after handler is called, 1 to continue +-- @function evaluate +-- @tparam {table} msg The message to be processed by the handlers. +-- @tparam {table} env The environment in which the handlers are executed. +-- @treturn The response from the handler(s). Returns a default message if no handler matches. +function handlers.evaluate(msg, env) + local handled = false + assert(type(msg) == 'table', 'msg is not valid') + assert(type(env) == 'table', 'env is not valid') + for _, o in ipairs(handlers.list) do + if o.name ~= "_default" then + local match = utils.matchesSpec(msg, o.pattern) + if not (type(match) == 'number' or type(match) == 'string' or type(match) == 'boolean') then + error("Pattern result is not valid, it MUST be string, number, or boolean") + end + -- handle boolean returns + if type(match) == "boolean" and match == true then + match = -1 + elseif type(match) == "boolean" and match == false then + match = 0 + end + + -- handle string returns + if type(match) == "string" then + if match == "continue" then + match = 1 + elseif match == "break" then + match = -1 + else + match = 0 + end + end + + if match ~= 0 then + if match < 0 then + handled = true + end + -- each handle function can accept, the msg, env + local status, err = pcall(o.handle, msg, env) + if not status then + error(err) + end + -- remove handler if maxRuns is reached. maxRuns can be either a number or "inf" + if o.maxRuns ~= nil and o.maxRuns ~= "inf" then + o.maxRuns = o.maxRuns - 1 + if o.maxRuns == 0 then + handlers.remove(o.name) + end + end + end + if match < 0 then + return handled + end + end + end + -- do default + if not handled then + local idx = findIndexByProp(handlers.list, "name", "_default") + handlers.list[idx].handle(msg,env) + end +end + +return handlers diff --git a/hyper/src/json.lua b/hyper/src/json.lua new file mode 100644 index 000000000..b553f3509 --- /dev/null +++ b/hyper/src/json.lua @@ -0,0 +1,307 @@ +local json = {_version = "0.2.0"} + +------------------------------------------------------------------------------- +-- Encode +------------------------------------------------------------------------------- + +local encode + +local escape_char_map = { + ["\\"] = "\\", + ["\""] = "\"", + ["\b"] = "b", + ["\f"] = "f", + ["\n"] = "n", + ["\r"] = "r", + ["\t"] = "t" +} + +local escape_char_map_inv = {["/"] = "/"} +for k, v in pairs(escape_char_map) do escape_char_map_inv[v] = k end + +local function escape_char(c) + return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte())) +end + +local function encode_nil(val) return "null" end + +local function encode_table(val, stack) + local res = {} + stack = stack or {} + + -- Circular reference? + if stack[val] then error("circular reference") end + + stack[val] = true + + if rawget(val, 1) ~= nil or next(val) == nil then + -- Treat as array -- check keys are valid and it is not sparse + local n = 0 + for k in pairs(val) do + if type(k) ~= "number" then + error("invalid table: mixed or invalid key types") + end + n = n + 1 + end + if n ~= #val then error("invalid table: sparse array") end + -- Encode + for i = 1, #val do res[i] = encode(val[i], stack) end + stack[val] = nil + return "[" .. table.concat(res, ",") .. "]" + else + -- Treat as an object + local i = 1 + for k, v in pairs(val) do + if type(k) ~= "string" then + error("invalid table: mixed or invalid key types") + end + if type(v) ~= "function" then + res[i] = encode(k, stack) .. ":" .. encode(v, stack) + i = i + 1 + end + end + stack[val] = nil + return "{" .. table.concat(res, ",") .. "}" + end +end + +local function encode_string(val) + return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' +end + +local function encode_number(val) + -- Check for NaN, -inf and inf + if val ~= val or val <= -math.huge or val >= math.huge then + error("unexpected number value '" .. tostring(val) .. "'") + end + return string.format("%.14g", val) +end + +local type_func_map = { + ["nil"] = encode_nil, + ["table"] = encode_table, + ["string"] = encode_string, + ["number"] = encode_number, + ["boolean"] = tostring +} + +encode = function(val, stack) + local t = type(val) + local f = type_func_map[t] + if f then return f(val, stack) end + error("unexpected type '" .. t .. "'") +end + +function json.encode(val) return (encode(val)) end + +------------------------------------------------------------------------------- +-- Decode +------------------------------------------------------------------------------- + +local parse + +local function create_set(...) + local res = {} + for i = 1, select("#", ...) do res[select(i, ...)] = true end + return res +end + +local space_chars = create_set(" ", "\t", "\r", "\n") +local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") +local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") +local literals = create_set("true", "false", "null") + +local literal_map = {["true"] = true, ["false"] = false, ["null"] = nil} + +local function next_char(str, idx, set, negate) + for i = idx, #str do if set[str:sub(i, i)] ~= negate then return i end end + return #str + 1 +end + +local function decode_error(str, idx, msg) + local line_count = 1 + local col_count = 1 + for i = 1, idx - 1 do + col_count = col_count + 1 + if str:sub(i, i) == "\n" then + line_count = line_count + 1 + col_count = 1 + end + end + error(string.format("%s at line %d col %d", msg, line_count, col_count)) +end + +local function codepoint_to_utf8(n) + local f = math.floor + if n <= 0x7f then + return string.char(n) + elseif n <= 0x7ff then + return string.char(f(n / 64) + 192, n % 64 + 128) + elseif n <= 0xffff then + return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, + n % 64 + 128) + elseif n <= 0x10ffff then + return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, + f(n % 4096 / 64) + 128, n % 64 + 128) + end + error(string.format("invalid unicode codepoint '%x'", n)) +end + +local function parse_unicode_escape(s) + local n1 = tonumber(s:sub(1, 4), 16) + local n2 = tonumber(s:sub(7, 10), 16) + if n2 then + return + codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) + else + return codepoint_to_utf8(n1) + end +end + +local function parse_string(str, i) + local res = {} + local j = i + 1 + local k = j + + while j <= #str do + local x = str:byte(j) + + if x < 32 then + decode_error(str, j, "control character in string") + elseif x == 92 then -- `\`: Escape + res[#res + 1] = str:sub(k, j - 1) + j = j + 1 + local c = str:sub(j, j) + if c == "u" then + local hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1) or + str:match("^%x%x%x%x", j + 1) or + decode_error(str, j - 1, + "invalid unicode escape in string") + res[#res + 1] = parse_unicode_escape(hex) + j = j + #hex + else + if not escape_chars[c] then + decode_error(str, j - 1, + "invalid escape char '" .. c .. "' in string") + end + res[#res + 1] = escape_char_map_inv[c] + end + k = j + 1 + elseif x == 34 then -- `"`: End of string + res[#res + 1] = str:sub(k, j - 1) + return table.concat(res), j + 1 + end + j = j + 1 + end + + decode_error(str, i, "expected closing quote for string") +end + +local function parse_number(str, i) + local x = next_char(str, i, delim_chars) + local s = str:sub(i, x - 1) + local n = tonumber(s) + if not n then decode_error(str, i, "invalid number '" .. s .. "'") end + return n, x +end + +local function parse_literal(str, i) + local x = next_char(str, i, delim_chars) + local word = str:sub(i, x - 1) + if not literals[word] then + decode_error(str, i, "invalid literal '" .. word .. "'") + end + return literal_map[word], x +end + +local function parse_array(str, i) + local res = {} + local n = 1 + i = i + 1 + while true do + local x + i = next_char(str, i, space_chars, true) + if str:sub(i, i) == "]" then + i = i + 1 + break + end + x, i = parse(str, i) + res[n] = x + n = n + 1 + i = next_char(str, i, space_chars, true) + local chr = str:sub(i, i) + i = i + 1 + if chr == "]" then break end + if chr ~= "," then decode_error(str, i, "expected ']' or ','") end + end + return res, i +end + +local function parse_object(str, i) + local res = {} + i = i + 1 + while true do + local key, val + i = next_char(str, i, space_chars, true) + if str:sub(i, i) == "}" then + i = i + 1 + break + end + if str:sub(i, i) ~= '"' then + decode_error(str, i, "expected string for key") + end + key, i = parse(str, i) + i = next_char(str, i, space_chars, true) + if str:sub(i, i) ~= ":" then + decode_error(str, i, "expected ':' after key") + end + i = next_char(str, i + 1, space_chars, true) + val, i = parse(str, i) + res[key] = val + i = next_char(str, i, space_chars, true) + local chr = str:sub(i, i) + i = i + 1 + if chr == "}" then break end + if chr ~= "," then decode_error(str, i, "expected '}' or ','") end + end + return res, i +end + +local char_func_map = { + ['"'] = parse_string, + ["0"] = parse_number, + ["1"] = parse_number, + ["2"] = parse_number, + ["3"] = parse_number, + ["4"] = parse_number, + ["5"] = parse_number, + ["6"] = parse_number, + ["7"] = parse_number, + ["8"] = parse_number, + ["9"] = parse_number, + ["-"] = parse_number, + ["t"] = parse_literal, + ["f"] = parse_literal, + ["n"] = parse_literal, + ["["] = parse_array, + ["{"] = parse_object +} + +parse = function(str, idx) + local chr = str:sub(idx, idx) + local f = char_func_map[chr] + if f then return f(str, idx) end + decode_error(str, idx, "unexpected character '" .. chr .. "'") +end + +function json.decode(str) + if type(str) ~= "string" then + error("expected argument of type string, got " .. type(str)) + end + local res, idx = parse(str, next_char(str, 1, space_chars, true)) + idx = next_char(str, idx, space_chars, true) + if idx <= #str then decode_error(str, idx, "trailing garbage") end + return res +end + +return json diff --git a/hyper/src/main.backup b/hyper/src/main.backup new file mode 100644 index 000000000..8975628eb --- /dev/null +++ b/hyper/src/main.backup @@ -0,0 +1,40 @@ +ao = require('.ao') +local _process = require('.process') + +function compute(base, req, opts) + local message = { + Id = req.body.target, + Action = req.body.action, + Data = req.body.body, + Type = req.body.type, + Target = req.body.target, + Owner = "OWNER", + From = "OWNER", + Timestamp = tostring(req['timestamp']), + ['Block-Height'] = tostring(req['block-height']), + ["Hash-Chain"] = req['hash-chain'], + ['Block-Hash'] = tostring(req['block-hash']), + ['Data-Protocol'] = req['data-protocol'], + ['Path'] = req.path, + ['Slot'] = req.slot, + ['Epoch'] = req.epoch + } + base.process.script = nil + local process = { + Id = req.body.target, + Type = base.process.type, + Device = base.process.device, + Owner = "OWNER", + ['Execution-Device'] = base.process['execution-device'], + ['Scheduler-Device'] = base.process['scheduler-device'], + ['Random-Seed'] = base.process['test-random-seed'], + commitments = base.process.commitments + } + + base.results = _process.handle(message, { + Process = process, + Module = { Id = "1" } + }) + + return base +end diff --git a/hyper/src/main.lua b/hyper/src/main.lua new file mode 100644 index 000000000..40dd07345 --- /dev/null +++ b/hyper/src/main.lua @@ -0,0 +1,20 @@ +---@diagnostic disable lowercase-global +function compute(base, req, opts) + -- local _ao = require('.ao') + local _process = require('.process') + + ao.event(base.process) + ao.event(req.body) + local _results = _process.handle(req, base) + base.results = { + info = "hyper-aos", + outbox = {}, + output = _results.Output + } + if _results.Messages then + for i=1,#_results.Messages do + base.results.outbox[tostring(i)] = _results.Messages[i] + end + end + return base +end diff --git a/hyper/src/package.json b/hyper/src/package.json new file mode 100644 index 000000000..c907e10f8 --- /dev/null +++ b/hyper/src/package.json @@ -0,0 +1,7 @@ +{ + "type": "module", + "name": "aos-no-coroutines", + "version": "1.0.0", + "main": "index.js", + "license": "MIT" +} diff --git a/hyper/src/pretty.lua b/hyper/src/pretty.lua new file mode 100644 index 000000000..1e7d949f0 --- /dev/null +++ b/hyper/src/pretty.lua @@ -0,0 +1,20 @@ +local pretty = { _version = "0.0.1" } + +pretty.tprint = function (tbl, indent) + if not indent then indent = 0 end + local output = "" + for k, v in pairs(tbl) do + local formatting = string.rep(" ", indent) .. k .. ": " + if type(v) == "table" then + output = output .. formatting .. "\n" + output = output .. pretty.tprint(v, indent+1) + elseif type(v) == 'boolean' then + output = output .. formatting .. tostring(v) .. "\n" + else + output = output .. formatting .. v .. "\n" + end + end + return output +end + +return pretty diff --git a/hyper/src/process.lua b/hyper/src/process.lua new file mode 100644 index 000000000..abee42ce6 --- /dev/null +++ b/hyper/src/process.lua @@ -0,0 +1,134 @@ +ao = ao or require('.ao') +Handlers = require('.handlers') +Utils = require('.utils') +Dump = require('.dump') + +local process = { _version = "2.0.7" } +local state = require('.state') +local eval = require('.eval') +local default = require('.default') +local json = require('.json') + +function Prompt() + return "aos> " +end + +function process.handle(req, base) + HandlerPrintLogs = state.reset(HandlerPrintLogs) + os.time = function () return tonumber(req['block-timestamp']) end + + ao.init(base) + -- initialize state + state.init(req, base) + + + -- magic table + req.body.data = req.body['Content-Type'] == 'application/json' + and json.decode(req.body.data or "{}") + or req.body.data + + Errors = Errors or {} + -- clear outbox + ao.clearOutbox() + + if not state.isTrusted(req) then + return ao.result({ + Output = { + data = "Message is not trusted." + } + }) + end + + req.reply = function (_reply) + local _from = state.getFrom(req) + _reply.target = _reply.target and _reply.target or _from + _reply['x-reference'] = req.body.reference or nil + _reply['x-origin'] = req.body['x-origin'] or nil + return ao.send(_reply) + end + + + -- state.checkSlot(msg, ao) + Handlers.add("_eval", function (_req) + local function getMsgFrom(m) + local from = "" + Utils.map( + function (k) + local c = m.commitments[k] + if c.alg == "rsa-pss-sha512" then + from = c.committer + end + end, + Utils.keys(m.commitments) + ) + return from + end + return _req.body.action == "Eval" and Owner == getMsgFrom(_req.body) + end, eval(ao)) + + Handlers.add("_default", + function () return true end, + default(state.insertInbox) + ) + + local status, error = pcall(Handlers.evaluate, req, base) + + -- cleanup handlers so that they are always at the end of the pipeline + Handlers.remove("_eval") + Handlers.remove("_default") + + local printData = table.concat(HandlerPrintLogs, "\n") + if not status then + if req.body.action == "Eval" then + return { + Error = table.concat({ + printData, + "\n", + Colors.red, + "error: " .. error, + Colors.reset, + }) + } + end + print(Colors.red .. "Error" .. Colors.gray .. " handling message " .. Colors.reset) + print(Colors.green .. error .. Colors.reset) + -- print("\n" .. Colors.gray .. debug.traceback() .. Colors.reset) + return ao.result({ + Output = { + data = printData .. '\n\n' .. Colors.red .. 'error:\n' .. Colors.reset .. error + }, + Messages = {}, + Spawns = {}, + Assignments = {} + }) + end + + local response = {} + + if req.body.action == "Eval" then + response = ao.result({ + Output = { + data = printData, + prompt = Prompt() + } + }) + else + response = ao.result({ + Output = { + data = printData, + prompt = Prompt(), + print = true + } + }) + end + + HandlerPrintLogs = state.reset(HandlerPrintLogs) -- clear logs + -- ao.Slot = msg.Slot + return response +end + +function Version() + print("version: " .. process._version) +end + +return process diff --git a/hyper/src/state.lua b/hyper/src/state.lua new file mode 100644 index 000000000..3196787c7 --- /dev/null +++ b/hyper/src/state.lua @@ -0,0 +1,154 @@ +ao = ao or require('.ao') +local state = {} +local stringify = require('.stringify') +local utils = require('.utils') + +Colors = { red = "\27[31m", green = "\27[32m", + blue = "\27[34m", reset = "\27[0m", gray = "\27[90m" +} +Bell = "\x07" + +Initialized = Initialized or false +Name = Name or "aos" + +Owner = Owner or "" +Inbox = Inbox or {} + +-- global prompt function +function Prompt() + return "aos> " +end + +local maxInboxCount = 10000 + +function state.insertInbox(msg) + table.insert(Inbox, msg) + local overflow = #Inbox - maxInboxCount + for i = 1,overflow do + table.remove(Inbox,1) + end +end +local function getOwnerAddress(m) + local _owner = nil + utils.map(function (k) + local c = m.commitments[k] + if c.alg == "rsa-pss-sha512" then + _owner = c.committer + elseif c.alg == "signed" and c['commitment-device'] == "ans104" then + _owner = c.commiter + end + end, utils.keys(m.commitments)) + return _owner +end + +local function isFromOwner(m) + local _owner = getOwnerAddress(m) + local _fromProcess = m['from-process'] or _owner + return _owner ~= nil and _fromProcess == _owner +end + +local function getOwner(m) + local id = "" + if m['from-process'] then + return m['from-process'] + end + + utils.map(function (k) + local c = m.commitments[k] + if c.alg == "rsa-pss-sha512" then + id = c.committer + elseif c.alg == "signed" and c['commitment-device'] == "ans104" then + id = c.committer + end + end, utils.keys(m.commitments) + ) + return id +end + +function state.init(req, base) + if not Initialized then + Owner = getOwner(base.process) + -- if process id is equal to message id then set Owner + -- TODO: need additional check, like msg.Slot == 1 + -- if env.Process.Id == msg.Id and Owner ~= msg.Id then + -- Owner = env.Process['From-Process'] or msg.From + -- end + -- if env.Process.Name then + -- Name = Name == "aos" and env.Process.Name + -- end + -- global print function + function print(a) + if type(a) == "table" then + a = stringify.format(a) + end + + if type(a) == "boolean" then + a = Colors.blue .. tostring(a) .. Colors.reset + end + if type(a) == "nil" then + a = Colors.red .. tostring(a) .. Colors.reset + end + if type(a) == "number" then + a = Colors.green .. tostring(a) .. Colors.reset + end + + if HandlerPrintLogs then + table.insert(HandlerPrintLogs, a) + return nil + end + + return tostring(a) + end + + Initialized = true + end +end + +function state.getFrom(req) + return getOwner(req.body) +end + +function state.isTrusted(req) + if isFromOwner(req.body) then + return true + end + local _trusted = false + + if req.body['from-process'] then + _trusted = utils.includes( + req.body['from-process'], + ao.authorities + ) + end + + if not _trusted then + _trusted = utils.includes( + getOwner(req.body), ao.authorities + ) + end + return _trusted +end + +function state.checkSlot(req, ao) + -- slot check + if not ao.slot then + ao.slot = tonumber(req.slot) + else + if tonumber(req.slot) ~= (ao.slot + 1) then + print(table.concat({ + Colors.red, + "WARNING: Slot did not match, may be due to an error generated by process", + Colors.reset + })) + print("") + end + end +end + +function state.reset(tbl) + tbl = nil + collectgarbage() + return {} +end + +return state diff --git a/hyper/src/string-ext.lua b/hyper/src/string-ext.lua new file mode 100644 index 000000000..0d449c04f --- /dev/null +++ b/hyper/src/string-ext.lua @@ -0,0 +1,164 @@ + -- @module string-ext + --- The String Extensions module provides missing string functions for Luerl compatibility. + --- Currently implements `string.gmatch` and returns the `string-ext` table. + + -- @table string-ext + -- @field _version The version number of the string-ext module + -- @field install The install function to patch the global string table + local string_ext = { _version = "0.3.0" } + + -- Security constants + local MAX_STRING_LENGTH = 100000 -- 100KB limit + local MAX_PATTERN_LENGTH = 500 -- 500 char pattern limit + local MAX_ITERATIONS = 10000 -- Prevent infinite loops + + -- Pattern validation: check for potentially dangerous patterns + local function validate_pattern(pattern) + -- Block patterns with excessive quantifiers that could cause exponential backtracking + local quantifier_count = 0 + local pos = 1 + while pos <= #pattern do + local found = string.find(pattern, "[%*%+%?]", pos) + if found then + quantifier_count = quantifier_count + 1 + pos = found + 1 + else + break + end + end + if quantifier_count > 5 then + error("pattern contains too many quantifiers", 3) + end + + -- Block nested quantifiers like .*.* + if string.find(pattern, "%.%*%.%*") or string.find(pattern, "%.%+%.%+") then + error("nested quantifiers not allowed", 3) + end + + -- Block patterns with excessive alternation (if using | for alternation) + local pipe_count = 0 + pos = 1 + while pos <= #pattern do + local found = string.find(pattern, "|", pos) + if found then + pipe_count = pipe_count + 1 + pos = found + 1 + else + break + end + end + if pipe_count > 10 then + error("pattern too complex", 3) + end + + -- Check for malformed patterns that could cause issues + -- Unclosed brackets + local bracket_depth = 0 + pos = 1 + while pos <= #pattern do + local char = pattern:sub(pos, pos) + if char == "[" and (pos == 1 or pattern:sub(pos-1, pos-1) ~= "%") then + bracket_depth = bracket_depth + 1 + elseif char == "]" and (pos == 1 or pattern:sub(pos-1, pos-1) ~= "%") then + bracket_depth = bracket_depth - 1 + end + pos = pos + 1 + end + if bracket_depth ~= 0 then + error("malformed pattern (unclosed '[')", 3) + end + + -- Check for potential ReDoS patterns - be more specific to avoid false positives + -- Look for nested quantified groups like (a+)+ or (a*)* + if string.find(pattern, "%(.*%+%)%+") or string.find(pattern, "%(.*%*%)%*") then + error("pattern may cause catastrophic backtracking", 3) + end + end + + --- Install string extensions into the global string table. + -- Adds `string.gmatch` even if string.gmatch exists but is broken (like in Luerl) + -- @function install + function string_ext.install() + --- Iterator that finds successive matches of *pattern* in *s*. + -- Behaves like native `string.gmatch` in Lua 5.3+. + -- If the pattern contains captures, each iterator step returns all captures. + -- Otherwise, it returns the full match substring. + -- @function string.gmatch + -- @tparam string s The string to search + -- @tparam string pattern The Lua pattern (must be non-empty) + -- @treturn function Iterator yielding captures or full matches + string.gmatch = function(s, pattern) + -- argument validation + if type(s) ~= "string" then + error("bad argument #1 to 'gmatch' (string expected, got " .. type(s) .. ")", 2) + end + if type(pattern) ~= "string" then + error("bad argument #2 to 'gmatch' (string expected, got " .. type(pattern) .. ")", 2) + end + if pattern == "" then + error("bad argument #2 to 'gmatch' (non-empty string expected)", 2) + end + + -- Security checks + if #s > MAX_STRING_LENGTH then + error("string too long", 2) + end + if #pattern > MAX_PATTERN_LENGTH then + error("pattern too long", 2) + end + + validate_pattern(pattern) + + -- current search position (idx is 1-based) + local pos = 1 + local iteration_count = 0 + local last_pos = 0 -- Track last position to detect zero-width matches + + return function() + -- DoS protection: prevent infinite loops + iteration_count = iteration_count + 1 + if iteration_count > MAX_ITERATIONS then + error("too many iterations", 2) + end + + -- iterator finished once pos passes string length + if pos > #s then + return nil + end + + -- string.find returns: start, stop, capture1, capture2, ... + -- Use table to handle unlimited captures + local results = { string.find(s, pattern, pos) } + local start_idx, stop_idx = results[1], results[2] + + -- no further matches + if not start_idx then + return nil + end + + -- Handle zero-width matches: if we matched at the same position as last time + -- and the match is zero-width, advance by 1 to prevent infinite loop + if start_idx == last_pos and start_idx == stop_idx then + pos = pos + 1 + else + -- Normal advancement: move past the current match + pos = math.max(stop_idx + 1, pos + 1) + end + + last_pos = start_idx + + -- if captures exist, yield them; otherwise yield the raw match + if #results > 2 then + -- Return all captures (handles any number of captures) + return table.unpack(results, 3) + else + return string.sub(s, start_idx, stop_idx) + end + end + end + end + + -- Auto-install string extensions when module is loaded + string_ext.install() + + return string_ext \ No newline at end of file diff --git a/hyper/src/stringify.lua b/hyper/src/stringify.lua new file mode 100644 index 000000000..e3c46fbd8 --- /dev/null +++ b/hyper/src/stringify.lua @@ -0,0 +1,103 @@ +--- The Stringify module provides utilities for formatting and displaying Lua tables in a more readable manner. Returns the stringify table. +-- @module stringify + +--- The stringify table +-- @table stringify +-- @field _version The version number of the stringify module +-- @field isSimpleArray The isSimpleArray function +-- @field format The format function +local stringify = { _version = "0.0.1" } + +-- ANSI color codes +local colors = { + red = "\27[31m", + green = "\27[32m", + blue = "\27[34m", + reset = "\27[0m" +} + +--- Checks if a table is a simple array (i.e., an array with consecutive numeric keys starting from 1). +-- @function isSimpleArray +-- @tparam {table} tbl The table to check +-- @treturn {boolean} Whether the table is a simple array +function stringify.isSimpleArray(tbl) + local arrayIndex = 1 + for k, v in pairs(tbl) do + if k ~= arrayIndex or (type(v) ~= "number" and type(v) ~= "string") then + return false + end + arrayIndex = arrayIndex + 1 + end + return true +end + +--- Formats a table for display, handling circular references and formatting strings and tables recursively. +-- @function format +-- @tparam {table} tbl The table to format +-- @tparam {number} indent The indentation level (default is 0) +-- @tparam {table} visited A table to track visited tables and detect circular references (optional) +-- @treturn {string} A string representation of the table +function stringify.format(tbl, indent, visited) + indent = indent or 0 + local toIndent = string.rep(" ", indent) + local toIndentChild = string.rep(" ", indent + 2) + + local result = {} + local isArray = true + local arrayIndex = 1 + + if stringify.isSimpleArray(tbl) then + for _, v in ipairs(tbl) do + if type(v) == "string" then + v = colors.green .. '"' .. v .. '"' .. colors.reset + else + v = colors.blue .. tostring(v) .. colors.reset + end + table.insert(result, v) + end + return "{ " .. table.concat(result, ", ") .. " }" + end + + for k, v in pairs(tbl) do + if isArray then + if k == arrayIndex then + arrayIndex = arrayIndex + 1 + if type(v) == "table" then + v = stringify.format(v, indent + 2) + elseif type(v) == "string" then + v = colors.green .. '"' .. v .. '"' .. colors.reset + else + v = colors.blue .. tostring(v) .. colors.reset + end + table.insert(result, toIndentChild .. v) + else + isArray = false + result = {} + end + end + if not isArray then + if type(v) == "table" then + visited = visited or {} + if visited[v] then + return "" + end + visited[v] = true + + v = stringify.format(v, indent + 2, visited) + elseif type(v) == "string" then + v = colors.green .. '"' .. v .. '"' .. colors.reset + else + v = colors.blue .. tostring(v) .. colors.reset + end + k = colors.red .. k .. colors.reset + table.insert(result, toIndentChild .. k .. " = " .. v) + end + end + + local prefix = isArray and "{\n" or "{\n " + local suffix = isArray and "\n" .. toIndent .. " }" or "\n" .. toIndent .. "}" + local separator = isArray and ",\n" or ",\n " + return prefix .. table.concat(result, separator) .. suffix +end + +return stringify diff --git a/hyper/src/utils.lua b/hyper/src/utils.lua new file mode 100644 index 000000000..f38b38a81 --- /dev/null +++ b/hyper/src/utils.lua @@ -0,0 +1,380 @@ +--- The 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 utils + +--- The utils table +-- @table utils +-- @field _version The version number of the utils module +-- @field matchesPattern The matchesPattern function +-- @field matchesSpec The matchesSpec function +-- @field curry The curry function +-- @field concat The concat function +-- @field reduce The reduce function +-- @field map The map function +-- @field filter The filter function +-- @field find The find function +-- @field propEq The propEq function +-- @field reverse The reverse function +-- @field compose The compose function +-- @field prop The prop function +-- @field includes The includes function +-- @field keys The keys function +-- @field values The values function +local utils = { _version = "0.0.5" } + +--- Given a pattern, a value, and a message, returns whether there is a pattern match. +-- @usage utils.matchesPattern(pattern, value, msg) +-- @param pattern The pattern to match +-- @param value The value to check for in the pattern +-- @param msg The message to check for the pattern +-- @treturn {boolean} Whether there is a pattern match +function utils.matchesPattern(pattern, value, msg) + -- If the key is not in the message, then it does not match + if (not pattern) then + return false + end + -- if the patternMatchSpec is a wildcard, then it always matches + if pattern == '_' then + return true + end + -- if the patternMatchSpec is a function, then it is executed on the tag value + if type(pattern) == "function" then + if pattern(value, msg) then + return true + else + return false + end + end + -- if the patternMatchSpec is a string, check it for special symbols (less `-` alone) + -- and exact string match mode + if (type(pattern) == 'string') then + if string.match(pattern, "[%^%$%(%)%%%.%[%]%*%+%?]") then + if string.match(value, pattern) then + return true + end + else + if value == pattern then + return true + end + end + end + + -- if the pattern is a table, recursively check if any of its sub-patterns match + if type(pattern) == 'table' then + for _, subPattern in pairs(pattern) do + if utils.matchesPattern(subPattern, value, msg) then + return true + end + end + end + + return false +end + +--- Given a message and a spec, returns whether there is a spec match. +-- @usage utils.matchesSpec(msg, spec) +-- @param msg The message to check for the spec +-- @param spec The spec to check for in the message +-- @treturn {boolean} Whether there is a spec match +function utils.matchesSpec(msg, spec) + if type(spec) == 'function' then + return spec(msg) + -- If the spec is a table, step through every key/value pair in the pattern and check if the msg matches + -- Supported pattern types: + -- - Exact string match + -- - Lua gmatch string + -- - '_' (wildcard: Message has tag, but can be any value) + -- - Function execution on the tag, optionally using the msg as the second argument + -- - Table of patterns, where ANY of the sub-patterns matching the tag will result in a match + end + if type(spec) == 'table' then + for key, pattern in pairs(spec) do + -- The key can either be in the top level of the 'msg' object + -- or in the body table of the msg + local msgValue = msg[key] or msg.body[key] + if not msgValue then + return false + end + local matchesMsgValue = utils.matchesPattern(pattern, msgValue, msg) + if not matchesMsgValue then + return false + end + + end + return true + end + + if type(spec) == 'string' and msg.action and msg.action == spec then + return true + end + if type(spec) == 'string' and msg.body.action and msg.body.action == spec then + return true + end + return false +end + +--- Given a table, returns whether it is an array. +-- An 'array' is defined as a table with integer keys starting from 1 and +-- having no gaps between the keys. +-- @lfunction isArray +-- @param table The table to check +-- @treturn {boolean} Whether the table is an array +local function isArray(table) + if type(table) == "table" then + local maxIndex = 0 + for k, v in pairs(table) do + if type(k) ~= "number" or k < 1 or math.floor(k) ~= k then + return false -- If there's a non-integer key, it's not an array + end + maxIndex = math.max(maxIndex, k) + end + -- If the highest numeric index is equal to the number of elements, it's an array + return maxIndex == #table + end + return false +end + +--- Curries a function. +-- @tparam {function} fn The function to curry +-- @tparam {number} arity The arity of the function +-- @treturn {function} The curried function +utils.curry = function (fn, arity) + assert(type(fn) == "function", "function is required as first argument") + arity = arity or debug.getinfo(fn, "u").nparams + if arity < 2 then return fn end + + return function (...) + local args = {...} + + if #args >= arity then + return fn(table.unpack(args)) + else + return utils.curry(function (...) + return fn(table.unpack(args), ...) + end, arity - #args) + end + end +end + +--- Concat two Array Tables +-- @function concat +-- @usage utils.concat(a)(b) +-- @usage utils.concat({1, 2})({3, 4}) --> {1, 2, 3, 4} +-- @tparam {table} a The first array +-- @tparam {table} b The second array +-- @treturn {table} The concatenated array +utils.concat = utils.curry(function (a, b) + assert(type(a) == "table", "first argument should be a table that is an array") + assert(type(b) == "table", "second argument should be a table that is an array") + assert(isArray(a), "first argument should be a table") + assert(isArray(b), "second argument should be a table") + + local result = {} + for i = 1, #a do + result[#result + 1] = a[i] + end + for i = 1, #b do + result[#result + 1] = b[i] + end + return result +end, 2) + +--- Applies a function to each element of a table, reducing it to a single value. +-- @function utils.reduce +-- @usage utils.reduce(fn)(initial)(t) +-- @usage utils.reduce(function(acc, x) return acc + x end)(0)({1, 2, 3}) --> 6 +-- @tparam {function} fn The function to apply +-- @param initial The initial value +-- @tparam {table} t The table to reduce +-- @return The reduced value +utils.reduce = utils.curry(function (fn, initial, t) + assert(type(fn) == "function", "first argument should be a function that accepts (result, value, key)") + assert(type(t) == "table" and isArray(t), "third argument should be a table that is an array") + local result = initial + for k, v in pairs(t) do + if result == nil then + result = v + else + result = fn(result, v, k) + end + end + return result +end, 3) + +--- Applies a function to each element of an array table, mapping it to a new value. +-- @function utils.map +-- @usage utils.map(fn)(t) +-- @usage utils.map(function(x) return x * 2 end)({1, 2, 3}) --> {2, 4, 6} +-- @tparam {function} fn The function to apply to each element +-- @tparam {table} data The table to map over +-- @treturn {table} The mapped table +utils.map = utils.curry(function (fn, data) + assert(type(fn) == "function", "first argument should be a unary function") + assert(type(data) == "table" and isArray(data), "second argument should be an Array") + + local function map (result, v, k) + result[k] = fn(v, k) + return result + end + + return utils.reduce(map, {}, data) +end, 2) + +--- Filters an array table based on a predicate function. +-- @function utils.filter +-- @usage utils.filter(fn)(t) +-- @usage utils.filter(function(x) return x > 1 end)({1, 2, 3}) --> {2,3} +-- @tparam {function} fn The predicate function to determine if an element should be included. +-- @tparam {table} data The array to filter +-- @treturn {table} The filtered table +utils.filter = utils.curry(function (fn, data) + assert(type(fn) == "function", "first argument should be a unary function") + assert(type(data) == "table" and isArray(data), "second argument should be an Array") + + local function filter (result, v, _k) + if fn(v) then + table.insert(result, v) + end + return result + end + + return utils.reduce(filter,{}, data) +end, 2) + +--- Finds the first element in an array table that satisfies a predicate function. +-- @function utils.find +-- @usage utils.find(fn)(t) +-- @usage utils.find(function(x) return x > 1 end)({1, 2, 3}) --> 2 +-- @tparam {function} fn The predicate function to determine if an element should be included. +-- @tparam {table} t The array table to search +-- @treturn The first element that satisfies the predicate function +utils.find = utils.curry(function (fn, t) + assert(type(fn) == "function", "first argument should be a unary function") + assert(type(t) == "table", "second argument should be a table that is an array") + for _, v in pairs(t) do + if fn(v) then + return v + end + end +end, 2) + +--- Checks if a property of an object is equal to a value. +-- @function utils.propEq +-- @usage utils.propEq(propName)(value)(object) +-- @usage utils.propEq("name")("Lua")({name = "Lua"}) --> true +-- @tparam {string} propName The property name to check +-- @tparam {string} value The value to check against +-- @tparam {table} object The object to check +-- @treturn {boolean} Whether the property is equal to the value +utils.propEq = utils.curry(function (propName, value, object) + assert(type(propName) == "string", "first argument should be a string") + assert(type(value) == "string", "second argument should be a string") + assert(type(object) == "table", "third argument should be a table") + + return object[propName] == value +end, 3) + +--- Reverses an array table. +-- @function utils.reverse +-- @usage utils.reverse(data) +-- @usage utils.reverse({1, 2, 3}) --> {3, 2, 1} +-- @tparam {table} data The array table to reverse +-- @treturn {table} The reversed array table +utils.reverse = function (data) + assert(type(data) == "table", "argument needs to be a table that is an array") + return utils.reduce( + function (result, v, i) + result[#data - i + 1] = v + return result + end, + {}, + data + ) +end + +--- Composes a series of functions into a single function. +-- @function utils.compose +-- @usage utils.compose(fn1)(fn2)(fn3)(v) +-- @usage utils.compose(function(x) return x + 1 end)(function(x) return x * 2 end)(3) --> 7 +-- @tparam {function} ... The functions to compose +-- @treturn {function} The composed function +utils.compose = utils.curry(function (...) + local mutations = utils.reverse({...}) + + return function (v) + local result = v + for _, fn in pairs(mutations) do + assert(type(fn) == "function", "each argument needs to be a function") + result = fn(result) + end + return result + end +end, 2) + +--- Returns the value of a property of an object. +-- @function utils.prop +-- @usage utils.prop(propName)(object) +-- @usage utils.prop("name")({name = "Lua"}) --> "Lua" +-- @tparam {string} propName The property name to get +-- @tparam {table} object The object to get the property from +-- @treturn The value of the property +utils.prop = utils.curry(function (propName, object) + return object[propName] +end, 2) + +--- Checks if an array table includes a value. +-- @function utils.includes +-- @usage utils.includes(val)(t) +-- @usage utils.includes(2)({1, 2, 3}) --> true +-- @param val The value to check for +-- @tparam {table} t The array table to check +-- @treturn {boolean} Whether the value is in the array table +utils.includes = utils.curry(function (val, t) + assert(type(t) == "table", "argument needs to be a table") + assert(isArray(t), "argument should be a table that is an array") + return utils.find(function (v) return v == val end, t) ~= nil +end, 2) + +--- Returns the keys of a table. +-- @usage utils.keys(t) +-- @usage utils.keys({name = "Lua", age = 25}) --> {"name", "age"} +-- @tparam {table} t The table to get the keys from +-- @treturn {table} The keys of the table +utils.keys = function (t) + assert(type(t) == "table", "argument needs to be a table") + local keys = {} + for key in pairs(t) do + table.insert(keys, key) + end + return keys +end + +--- Returns the values of a table. +-- @usage utils.values(t) +-- @usage utils.values({name = "Lua", age = 25}) --> {"Lua", 25} +-- @tparam {table} t The table to get the values from +-- @treturn {table} The values of the table +utils.values = function (t) + assert(type(t) == "table", "argument needs to be a table") + local values = {} + for _, value in pairs(t) do + table.insert(values, value) + end + return values +end + +--- Convert a message's tags to a table of key-value pairs +-- @function Tab +-- @tparam {table} msg The message containing tags +-- @treturn {table} A table with tag names as keys and their values +function utils.Tab(msg) + local inputs = {} + for _, o in ipairs(msg.Tags) do + if not inputs[o.name] then + inputs[o.name] = o.value + end + end + return inputs +end + + +return utils diff --git a/modules/llama/config.yml b/modules/llama/config.yml index ec6acc916..d40fd931b 100644 --- a/modules/llama/config.yml +++ b/modules/llama/config.yml @@ -2,4 +2,4 @@ stack_size: 268435456 initial_memory: 838860800 maximum_memory: 4294967296 keep_js: true -target: 64 \ No newline at end of file +target: 64 diff --git a/package.json b/package.json index 4443dffaa..f359b70a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@permaweb/aos", - "version": "2.0.6", + "version": "2.0.7", "private": true, "repository": "https://github.com/permaweb/aos.git", "license": "MIT", @@ -22,7 +22,7 @@ "test-all": "yarn workspaces --parallel run test" }, "dependencies": { - "@permaweb/aoconnect": "^0.0.68", + "@permaweb/aoconnect": "^0.0.85", "arweave": "^1.15.1", "chalk": "^5.3.0", "figlet": "^1.7.0", @@ -36,6 +36,7 @@ "prompts": "^2.4.2", "semver": "^7.5.4", "tar-stream": "^3.1.7", + "undici": "^7.8.0", "yargs": "^17.7.2" }, "devDependencies": { @@ -46,14 +47,17 @@ "husky": "^9.1.6", "lint-staged": "^15.2.10", "markdown-toc-gen": "^1.1.0", + "shelljs": "^0.9.2", "sort-package-json": "^2.10.1", - "standard": "^17.1.2", - "shelljs": "^0.9.2" + "standard": "^17.1.2" }, "aos": { - "module": "QEgxNlbNwBi10VXu5DbP6XHoRDHcynP_Qbq3lpNC97s", - "sqlite": "Ka08x7JWLMm_K3vPRnqMU22hh3dehPUUyC7pnW2DvvQ", - "llama": "TQ2lVatVR4dcB7ReZ65NfaCJSbF3sxRX1OdM77vO7y8", + "module": "ISShJH1ij-hPPt9St5UFFr_8Ys3Kj5cyg7zrMGt7H9s", + "sqlite": "ei1VSwheQnNIG87iqlwxiQk-sWY5ikj4DFBxcpFZ-S4", + "llama": "QkFLfRXw8MOeHMNoHK0tyno17wbSxCecATohFMaULKM", "version": "2.0.4" + }, + "hyper": { + "module": "xVcnPK8MPmcocS6zwq1eLmM2KhfyarP8zzmz3UVi1g4" } } diff --git a/process/ao.lua b/process/ao.lua index 96ee53f54..aed15a3ff 100644 --- a/process/ao.lua +++ b/process/ao.lua @@ -146,10 +146,12 @@ function ao.init(env) end end - if #ao.authorities < 1 then - for _, o in ipairs(env.Process.Tags) do - if o.name == "Authority" then - table.insert(ao.authorities, o.value) + for _, o in ipairs(env.Process.Tags) do + if o.name == "Authority" then + for part in string.gmatch(o.value, "[^,]+") do + if part ~= "" and part ~= nil and not _includes(ao.authorities)(part) then + table.insert(ao.authorities, part) + end end end end @@ -328,6 +330,79 @@ function ao.spawn(module, msg) return spawn end +-- registerHint +-- if a From-Process has `hint` and `hint-ttl` then we need to add bounded registry +function ao.registerHint(msg) + -- check if From-Process tag exists + local fromProcess = nil + local hint = nil + local hintTTL = nil + + -- find From-Process tag + if msg.Tags then + for name, value in pairs(msg.Tags) do + if name == "From-Process" then + -- split by & to get process, hint, and ttl + local parts = {} + + for part in string.gmatch(value, "[^&]+") do + table.insert(parts, part) + end + local hintParts = {} + if parts[2] then + for item in string.gmatch(parts[2], "[^=]+") do + table.insert(hintParts, item) + end + end + local ttlParts = {} + if parts[3] then + for item in string.gmatch(parts[3], "[^=]+") do + table.insert(ttlParts, item) + end + end + + fromProcess = parts[1] or nil + hint = hintParts[2] or nil + hintTTL = ttlParts[2] or nil + break + end + end + end + + -- if we found a hint, store it in the registry + if hint then + if not ao._hints then + ao._hints = {} + end + if not fromProcess then + ao._hints[fromProcess] = { + hint = hint, + ttl = hintTTL + } + end + end + -- enforce bounded registry of 1000 keys + if ao._hints then + local count = 0 + local oldest = nil + local oldestKey = nil + + -- count keys and find oldest entry + for k, v in pairs(ao._hints) do + count = count + 1 + if not oldest or v.ttl < oldest then + oldest = v.ttl + oldestKey = k + end + end + + -- if over 1000 entries, remove oldest + if count > 1000 and oldestKey then + ao._hints[oldestKey] = nil + end + end +end + --- Assigns a message to a process. -- @function assign -- @tparam {table} assignment The assignment to assign @@ -338,6 +413,7 @@ function ao.assign(assignment) table.insert(ao.outbox.Assignments, assignment) end + --- Checks if a message is trusted. -- The default security model of AOS processes: Trust all and *only* those on the ao.authorities list. -- @function isTrusted diff --git a/process/process.lua b/process/process.lua index d251331c1..ea96446bd 100644 --- a/process/process.lua +++ b/process/process.lua @@ -63,6 +63,36 @@ ao.spawn = function(module, msg) return aospawn(module, msg) end +--- Normalizes a message's keys and tags to title case +-- @function normalize +-- @tparam {table} msg The message to normalize +-- @treturn {table} The normalized message +local function normalizeMsg(msg) + -- Normalize keys to title case + for key, value in pairs(msg) do + local normalizedKey = Utils.normalize(key) + -- Only add to normalizedKeys if the key changed during normalization + if normalizedKey ~= key then + msg[key] = nil + msg[normalizedKey] = value + end + end + + -- Normalize tag names to title case + if msg.Tags and type(msg.Tags) == "table" then + for i, tag in ipairs(msg.Tags) do + if tag.name and type(tag.name) == "string" then + tag.name = Utils.normalize(tag.name) + end + end + end + + -- Bring tags to root message + ao.normalize(msg) + + return msg +end + --- Remove the last three lines from a string -- @lfunction removeLastThreeLines -- @tparam {string} input The string to remove the last three lines from @@ -311,7 +341,7 @@ function process.handle(msg, _) ao.init(env) -- relocate custom tags to root message - msg = ao.normalize(msg) + msg = normalizeMsg(msg) -- set process id ao.id = ao.env.Process.Id initializeState(msg, ao.env) @@ -335,24 +365,25 @@ function process.handle(msg, _) -- clear Outbox ao.clearOutbox() - -- Only check for Nonce if msg is not read-only and not cron - if not msg['Read-Only'] and not msg['Cron'] then - if not ao.Nonce then - ao.Nonce = tonumber(msg.Nonce) - else - if tonumber(msg.Nonce) ~= (ao.Nonce + 1) then - print(Colors.red .. "WARNING: Nonce did not match, may be due to an error generated by process" .. Colors.reset) - print("") - --return ao.result({Error = "HALT Nonce is out of sync " .. ao.Nonce .. " <> " .. (msg.Nonce or "0") }) - end - end - end + -- commented out + -- -- Only check for Nonce if msg is not read-only and not cron + -- if not msg['Read-Only'] and not msg['Cron'] then + -- if not ao.Nonce then + -- ao.Nonce = tonumber(msg.Nonce) + -- else + -- if tonumber(msg.Nonce) ~= (ao.Nonce + 1) then + -- print(Colors.red .. "WARNING: Nonce did not match, may be due to an error generated by process" .. Colors.reset) + -- print("") + -- --return ao.result({Error = "HALT Nonce is out of sync " .. ao.Nonce .. " <> " .. (msg.Nonce or "0") }) + -- end + -- end + -- end -- Only trust messages from a signed owner or an Authority if msg.From ~= msg.Owner and not ao.isTrusted(msg) then - if msg.From ~= ao.id then - Send({ Target = msg.From, Data = "Message is not trusted by this process!" }) - end + -- if msg.From ~= ao.id then + -- Send({Target = msg.From, Data = "Message is not trusted by this process!"}) + -- end print('Message is not trusted! From: ' .. msg.From .. ' - Owner: ' .. msg.Owner) return ao.result({}) end @@ -507,3 +538,4 @@ end apm = require('.apm') return process + diff --git a/process/test/normalized-message.test.js b/process/test/normalized-message.test.js new file mode 100644 index 000000000..7fe3e6fba --- /dev/null +++ b/process/test/normalized-message.test.js @@ -0,0 +1,96 @@ +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 env = { + Process: { + Id: 'AOS', + Owner: 'FOOBAR', + 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) + 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' } + ], + Data: ` +Handlers.add("inspect-normalized", + function (msg) + return msg.Tags["type"] == "test-event" or msg.Tags["Type"] == "test-event" + end, + function (msg) + -- Print normalized message keys + print("Type: " .. (msg.Tags["Type"] or "nil")) + print("Data-Protocol: " .. (msg.Tags["Data-Protocol"] or "nil")) + print("Message: " .. (msg.Tags["Message"] or "nil")) + print("Action: " .. (msg.Tags["Action"] or "nil")) + + -- Return true if keys were normalized properly + return msg.Tags["Type"] == "test-event" and + msg.Tags["Data-Protocol"] == "https://example.com/protocol" and + msg.Tags["Message"] == "Hello, world!" + end +) + ` + } + + // Load the handler + const { Memory } = await handle(start, evalMsg, env) + + // Test message with lowercase keys + const testMsg = { + Target: 'AOS', + From: 'FRED', + Owner: 'FRED', + Tags: [ + { name: 'type', value: 'test-event' }, + { name: 'data-PROTOCOL', value: 'https://example.com/protocol' }, + { name: 'MESSAGE', value: 'Hello, world!' }, + { name: 'action', value: 'test-action' } + ], + 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/state.test.js b/process/test/state.test.js index c8e1ef776..22df298fc 100644 --- a/process/test/state.test.js +++ b/process/test/state.test.js @@ -31,6 +31,33 @@ async function init(handle) { return Memory } +const envWithAuthorities = { + Process: { + Id: 'AOS', + Owner: 'FOOBAR', + Tags: [ + { name: 'Name', value: 'Thomas' }, + { name: 'Authority', value: 'FOO,BAR,FOOBAR,UNIQUE-ADDRESS' } + ] + } +} + +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) + return Memory +} + test('check state properties for aos', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) @@ -72,4 +99,114 @@ test('test authorities', async () => { } const result = await handle(start, msg, env) assert.ok(result.Output.data.includes('Message is not trusted! From: BAM - Owner: BEEP')) -}) \ No newline at end of file +}) + +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' } + ], + Data: 'ao.authorities' + } + const result0 = await handle(start, msg0, envWithAuthorities) + assert.ok(result0.Output.data.includes('FOO')) + 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 = { + Target: 'AOS', + Owner: 'FOOBAR', + From: 'FOOBAR', + ['Block-Height']: "1000", + Id: "1234xyxfoo1", + Module: "WOOPAWOOPA", + Tags: [ + { name: 'Action', value: 'Eval' } + ], + Data: '#ao.authorities' + } + const result1 = await handle(start, msg1, envWithAuthorities) + assert.ok(result1.Output.data == '4') + // Should be trusted (FOO is in the authority list) + const msg2 = { + Target: 'AOS', + Owner: 'FOO', + From: 'FOO', + ['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")) + + // 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' } + ], + Data: 'Hello world!' + } + const result3 = await handle(start, msg3, envWithAuthorities) + 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' } + ], + Data: 'Hello world!' + } + const result4 = await handle(start, msg4, envWithAuthorities) + 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' } + ], + Data: ` +return require('.utils').capitalize("foo-bar") + ` + } + const result = await handle(start, msg, env) + assert.ok(result.Output.data.includes('Foo-bar')) +}) diff --git a/process/test/utils-matches-pattern.test.js b/process/test/utils-matches-pattern.test.js new file mode 100644 index 000000000..534d1759a --- /dev/null +++ b/process/test/utils-matches-pattern.test.js @@ -0,0 +1,604 @@ +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 env = { + Process: { + Id: 'AOS', + Owner: 'FOOBAR', + 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) + 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' } + ], + Data: ` +Handlers.add("test-action-handler", + { Action = "test-action" }, + function(msg) + print("Handler matched: Action = " .. (msg.Action or "nil")) + end +) + ` + } + + 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' } + ], + Data: 'test message' + } + + const result = await handle(Memory, testMsg, env) + assert.ok(result.Output.data.includes('Handler matched: Action = test-action')) +}) + +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' } + ], + Data: ` +Handlers.add("test-protocol-handler", + { ["Data-Protocol"] = "test-protocol" }, + function(msg) + print("Handler matched: Data-Protocol = " .. (msg.Tags["Data-Protocol"] or "nil")) + end +) + ` + } + + 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' } + ], + Data: 'test message' + } + + const result = await handle(Memory, testMsg, env) + assert.ok(result.Output.data.includes('Handler matched: Data-Protocol = test-protocol')) +}) + +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' } + ], + Data: ` +Handlers.add("test-content-type-handler", + { ["Content-Type"] = "application/json" }, + function(msg) + print("Handler matched: Content-Type = " .. (msg.Tags["Content-Type"] or "nil")) + end +) + ` + } + + 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' } + ], + Data: '{"test": "data"}' + } + + const result = await handle(Memory, testMsg, env) + assert.ok(result.Output.data.includes('Handler matched: Content-Type = application/json')) +}) + +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' } + ], + Data: ` +Handlers.add("case-variation-handler", + { Action = "test-action" }, + function(msg) + print("Handler matched with Action: " .. (msg.Action or "nil")) + end +) + ` + } + + 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' } + ], + 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' } + ], + 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' } + ], + 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' } + ], + Data: 'test message 4' + } + + const result4 = await handle(result3.Memory, testMsg4, env) + assert.ok(result4.Output.data.includes('Handler matched with Action: test-action')) +}) + +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' } + ], + Data: ` +Handlers.add("protocol-case-handler", + { ["Data-Protocol"] = "test-protocol" }, + function(msg) + print("Protocol handler matched: " .. (msg.Tags["Data-Protocol"] or "nil")) + end +) + ` + } + + 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', // 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' } + ], + 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]}`) + currentMemory = result.Memory + } +}) + +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' } + ], + Data: ` +Handlers.add("multi-key-handler", + { + Action = "migrate", + ["Content-Type"] = "application/json" + }, + function(msg) + print("Migration handler triggered!") + print("Action: " .. (msg.Action or "nil")) + print("Content-Type: " .. (msg.Tags["Content-Type"] or "nil")) + end +) + ` + } + + const { Memory } = await handle(start, setupMsg, env) + + // Send message with various case patterns (simulating legacy vs mainnet differences) + const migrationMsg = { + Target: 'AOS', + From: 'FRED', + Owner: 'FRED', + Tags: [ + { name: 'action', value: 'migrate' }, + { name: 'content-type', value: 'application/json' } + ], + 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')) + assert.ok(result.Output.data.includes('Content-Type: application/json')) +}) + +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' } + ], + Data: ` +Handlers.add("exact-match-handler", + { Action = "test-action" }, + function(msg) + print("Exact match handler triggered: " .. (msg.Action or "nil")) + end +) + ` + } + + 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' } + ], + Data: 'test message' + } + + const result = await handle(Memory, testMsg, env) + assert.ok(result.Output.data.includes('Exact match handler triggered: test-action')) +}) + +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' } + ], + Data: ` +Handlers.add("mixed-case-handler", + { + ["X-Reference"] = "test-ref" + }, + function(msg) + print("Mixed case handler triggered!") + print("X-Reference: " .. (msg.Tags["X-Reference"] or "nil")) + end +) + ` + } + + 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' } + ], + 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')) +}) + +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' } + ], + Data: ` +Handlers.add("no-match-handler", + { Action = "expected-action" }, + function(msg) + print("This handler should NOT be triggered!") + end +) + ` + } + + 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' } + ], + 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')) + assert.ok(!result.Output.data.includes('This handler should NOT be triggered!')) +}) + +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' } + ], + Data: ` +Handlers.add("underscore-dash-handler", + { + ["Data-Protocol"] = "test-protocol", + ["Content-Type"] = "application/json", + ["Reply-To"] = "test-reply" + }, + function(msg) + print("Underscore conversion handler triggered!") + print("Data-Protocol: " .. (msg.Tags["Data-Protocol"] or "nil")) + print("Content-Type: " .. (msg.Tags["Content-Type"] or "nil")) + print("Reply-To: " .. (msg.Tags["Reply-To"] or "nil")) + end +) + ` + } + + const { Memory } = await handle(start, setupMsg, env) + + // Test message with underscores that should be converted to dashes + const testMsg = { + Target: 'AOS', + From: 'FRED', + Owner: 'FRED', + Tags: [ + { name: 'data_protocol', value: 'test-protocol' }, + { name: 'content_type', value: 'application/json' }, + { name: 'reply_to', value: 'test-reply' } + ], + 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')) + assert.ok(result.Output.data.includes('Content-Type: application/json')) + assert.ok(result.Output.data.includes('Reply-To: test-reply')) +}) + +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' } + ], + Data: ` +Handlers.add("mixed-format-handler", + { + ["X-Custom-Header"] = "test-value" + }, + function(msg) + print("Mixed format handler triggered!") + print("X-Custom-Header: " .. (msg.Tags["X-Custom-Header"] or "nil")) + end +) + ` + } + + 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' + ] + + 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' } + ], + 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]}`) + currentMemory = result.Memory + } +}) \ No newline at end of file diff --git a/process/utils.lua b/process/utils.lua index 4608b6a03..dc42f24b2 100644 --- a/process/utils.lua +++ b/process/utils.lua @@ -46,14 +46,16 @@ function utils.matchesPattern(pattern, value, msg) end -- if the patternMatchSpec is a string, check it for special symbols (less `-` alone) - -- and exact string match mode + -- and exact string match mode with case-insensitive matching if (type(pattern) == 'string') then if string.match(pattern, "[%^%$%(%)%%%.%[%]%*%+%?]") then - if string.match(value, pattern) then + -- For regex patterns, use case-insensitive matching + if string.match(string.lower(value or ""), string.lower(pattern)) then return true end else - if value == pattern then + -- For exact string matches, compare case-insensitively + if string.lower(value or "") == string.lower(pattern) then return true end end @@ -105,6 +107,34 @@ function utils.matchesSpec(msg, spec) return false end +--- Normalizes a string to title case and converts underscores to dashes +-- @function utils.normalize +-- @tparam {string} str The string to normalize +-- @treturn {string} The normalized string +utils.normalize = function(str) + if type(str) ~= "string" then return str end + + -- Convert underscores to dashes first + local result = str:gsub("_", "-") + -- Lowercase all letters + result = result:lower() + -- Capitalize first letter + result = result:gsub("^%l", string.upper) + -- Capitalize any letter following a dash + result = result:gsub("%-(%l)", function(match) return "-" .. string.upper(match) end) + return result +end + +--- Capitalize function +-- @param str +-- @returns string +function utils.capitalize(str) + if type(str) ~= "string" or str == "" then + return str + end + return str:sub(1,1):upper() .. str:sub(2):lower() +end + --- Given a table, returns whether it is an array. -- An 'array' is defined as a table with integer keys starting from 1 and -- having no gaps between the keys. diff --git a/src/evaluate.js b/src/evaluate.js index c8d3ac439..e415bfe94 100644 --- a/src/evaluate.js +++ b/src/evaluate.js @@ -1,61 +1,70 @@ +/** + * 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. + */ + import { of, fromPromise, Resolved } from 'hyper-async' import chalk from 'chalk' -export async function evaluate(line, processId, wallet, services, spinner) { - return of() - .map(_ => { - if (process.env.DEBUG) console.time('Send') - return _ - }) - .chain(() => services.sendMessage({ - processId: processId, - wallet: wallet, tags: [ - { name: 'Action', value: 'Eval' } - ], - data: line - }, spinner)) +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) + + // send message to hyperbeam or legacy mu + function pushMessage(msg) { + return services.sendMessage(msg, spinner) + } - .map(x => { - //console.log(x) + // read the result unless it is provided. + function readResult(message) { + return message.Output || message.Error + ? of(message) + : services.readResult({ message, process: processId }) + } + + // 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.log("") - console.timeEnd('Send') + console.time(name) } - spinner.suffixText = `${chalk.gray("[Computing")} ${chalk.green(x)}${chalk.gray("...]")}` - if (process.env.DEBUG) console.time('Read') - return x - }) + return _ + } + } - .map(message => ({ message, process: processId })) - .chain(services.readResult) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .bichain(services.readResult, Resolved) - .map(x => { + // common time end console tap function + function tEnd(name) { + return _ => { if (process.env.DEBUG) { - console.log("") - console.timeEnd('Read') + console.log("\n>>>>>>>>>") + console.timeEnd(name) + console.log(">>>>>>>>>\n") } - return x - }) - .toPromise().catch(err => { - console.log(err) - return {} - }) - //return { output: 'echo: ' + line, prompt: null } -} \ No newline at end of file + return _ + } + } + + // log error of promise return empty obj + function logError(err) { + if (!swallowError) console.log(err) + return {} + } +} diff --git a/src/index.js b/src/index.js index ea05dab29..9f2bf5af0 100644 --- a/src/index.js +++ b/src/index.js @@ -7,6 +7,7 @@ import chalk from 'chalk' import path from 'path' import * as url from 'url' import process from 'node:process' +import prompts from 'prompts' import { of, fromPromise, Rejected, Resolved } from 'hyper-async' @@ -53,13 +54,13 @@ let { let { spawnProcessRelay, sendMessageRelay, readResultRelay, monitorProcessRelay, unmonitorProcessRelay, liveRelay, printLiveRelay, - dryrunRelay, handleRelayTopup + dryrunRelay } = relaySvc let { - spawnProcessMainnet, sendMessageMainnet, readResultMainnet, + spawnProcessMainnet, sendMessageMainnet, monitorProcessMainnet, unmonitorProcessMainnet, liveMainnet, printLiveMainnet, - dryrunMainnet + handleNodeTopup } = mainnetSvc if (!process.stdin.isTTY) { @@ -121,37 +122,58 @@ if (argv.watch && argv.watch.length === 43) { splash() -if (argv['relay']) { - console.log(`\n${chalk.gray('Using Relay:')} ${chalk.yellow(argv['relay'])}`); - process.env.RELAY_URL = argv['relay'] - // replace services to use relay service - sendMessage = sendMessageRelay - spawnProcess = spawnProcessRelay - readResult = readResultRelay - monitorProcess = monitorProcessRelay - unmonitorProcess = unmonitorProcessRelay - live = liveRelay - printLive = printLiveRelay - dryrun = dryrunRelay - - relayMode = true +if (argv['scheduler']) { + process.env.SCHEDULER = argv['scheduler'] } + +if (argv['authority']) { + process.env.AUTHORITY = argv['authority'] +} + +if (argv['url']) { + process.env.AO_URL = argv['url'] +} + if (argv['mainnet']) { - console.log(chalk.magentaBright('Using Mainnet: ') + chalk.magenta(argv['mainnet'])) - process.env.AO_URL = argv['mainnet'] - // get scheduler if in mainnetmode - process.env.SCHEDULER = await fetch(`${process.env.AO_URL}/~meta@1.0/address`).then(res => res.text()) - // replace services to use mainnet service - sendMessage = sendMessageMainnet - spawnProcess = spawnProcessMainnet - readResult = readResultMainnet - monitorProcess = monitorProcessMainnet - unmonitorProcess = unmonitorProcessMainnet - live = liveMainnet - printLive = printLiveMainnet - dryrun = dryrunMainnet - - relayMode = true + if (typeof argv['mainnet'] !== 'string' || argv['mainnet'].trim() === '') { + 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 + 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); + } } if (argv['gateway-url']) { console.log(chalk.yellow('Using Gateway: ') + chalk.blue(argv['gateway-url'])) @@ -168,13 +190,18 @@ if (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() { 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']) { + if (argv['relay'] || argv['mainnet']) { process.env.WALLET = JSON.stringify(jwk) } // handle list option, need jwk in order to do it. @@ -183,18 +210,27 @@ async function runProcess() { } return Resolved(jwk) }) - .chain(jwk => register(jwk, { address, isAddress, spawnProcess, gql }) + .chain(jwk => register(jwk, { address, isAddress, spawnProcess, gql, spawnProcessMainnet }) .map(id => ({ jwk, id })) ) .toPromise() .then(async ({ jwk, id }) => { let editorMode = false let editorData = '' - const history = readHistory(id) - if (argv.relay && argv.topup) { - await handleRelayTopup(jwk, false); + // this can be improved, but for now if ao-url is set + // we will use hyper mode + if (process.env.AO_URL !== "undefined") { + process.env.WALLET = JSON.stringify(jwk) + sendMessage = sendMessageMainnet + readResult = () => null + live = liveMainnet + printLive = printLiveMainnet + } + + if (argv.mainnet && argv.topup) { + await handleNodeTopup(jwk, false); } if (luaData.length > 0 && argv.load) { @@ -236,12 +272,14 @@ async function runProcess() { } if (process.env.DEBUG) console.time(chalk.gray('Connecting')) + globalThis.prompt = await connect(jwk, id, luaData) if (process.env.DEBUG) console.timeEnd(chalk.gray('Connecting')) // check loading files flag await handleLoadArgs(jwk, id) cron = await live(id) + cron.start() const spinner = ora({ spinner: 'dots', @@ -304,6 +342,7 @@ async function runProcess() { } // pause live if (!editorMode && line === '.pause') { + console.log("=== pausing live feed ===") // pause live feed cron.stop() rl.prompt(true) @@ -465,9 +504,9 @@ async function runProcess() { console.timeEnd(chalk.gray('Elapsed')) } - if (cron) { - cron.start() - } + // if (cron) { + // cron.start() + // } // rl.close() // repl() @@ -490,7 +529,7 @@ async function runProcess() { if (argv.list) { console.log(e) } else { - if (argv.relay) { + if (argv.mainnet) { let jwk; if (process.env.WALLET) { try { @@ -501,12 +540,12 @@ async function runProcess() { } try { - const topupSuccess = await handleRelayTopup(jwk, true); + const topupSuccess = await handleNodeTopup(jwk, true); if (topupSuccess) { return runProcess(); } } catch (topupError) { - console.error('Error handling relay topup:', topupError); + console.error('Error handling node topup:', topupError); process.exit(1); } } @@ -516,7 +555,6 @@ async function runProcess() { if (argv.load) { console.log(e.message) } else { - console.log(e) 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) } @@ -536,13 +574,20 @@ async function connect(jwk, id) { spinner.start() 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 - let promptResult = await evaluate("require('.process')._version", id, jwk, { sendMessage, readResult }, spinner) - let _prompt = promptResult?.Output?.prompt || promptResult?.Output?.data?.prompt + 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) { - spinner.suffixText = chalk.red('[Connecting to process....]') - await new Promise(resolve => setTimeout(resolve, 500 * i)) + if (i === 0) { + spinner.suffixText = chalk.gray('[Connecting to process...]') + } else { + 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 }) _prompt = promptResult?.Output?.prompt || promptResult?.Output?.data?.prompt @@ -557,7 +602,10 @@ async function connect(jwk, id) { } const aosVersion = getPkg().aos.version if (promptResult.Output.data?.output !== aosVersion && promptResult.Output.data !== aosVersion) { - 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") { + console.log(chalk.blue('A new AOS update is available. run [.update] to install.')) + } } return _prompt } diff --git a/src/register.js b/src/register.js index ae3b77869..84eea1855 100644 --- a/src/register.js +++ b/src/register.js @@ -1,8 +1,13 @@ /** - * create a new account for a given wallet, for this demo only one process per jwk. - * - * register -w ./wallet.json - * + * Process Registration Module + * + * Exports the `register` function to manage AO processes on Arweave's Permaweb: + * - 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' @@ -37,39 +42,29 @@ 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( - _ => Rejected({ ok: false, error: 'GRAPHQL Error trying to locate process.' }), - results => results?.length > 0 - ? Resolved(results.reverse()) - /** - * No process was found that matches the name, module and owners - * But no catastrophic error occured. - * - * By rejecting with 'ok: true' we are signaling that a - * new process should be spawned with the given criteria - */ - : Rejected({ ...ctx, ok: true }) - ) + .bichain(gqlQueryError, handleQueryResults) } + + const getResultId = results => results.length === 1 + ? Resolved(results[0].node.id) + : Rejected(results) const selectModule = (results) => - of(results).chain((results) => { - if (!results?.length) return Rejected({ ok: false, error: 'No module found with provided name.' }) - - return of(results) - .chain((results) => { - if (results.length === 1) return Resolved(results[0].node.id) - return Rejected(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; @@ -84,22 +79,41 @@ export function register(jwk, services) { .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 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(e => "aos") + ctx.processType = processOS + return ctx + }) const createProcess = (ctx) => { const { ok, name, spawnTags, module, error } = ctx if (!ok) { return Rejected({ error: error || 'Unknown error occured' }) } - let data = "1984" + let appName = "aos" + if (process.env.AO_URL !== "undefined") { + appName = "hyper-aos" + } + let data = "" let tags = [ - { name: 'App-Name', value: 'aos' }, + { name: 'App-Name', value: appName }, { name: 'Name', value: name }, { name: 'Authority', value: 'fcoN_xJeisVsPXA-trzVAuIiqO3ydLQxM-L4XbrQKzY' }, ...(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 (/^\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)$/.test(argv.cron)) { + if (cronExp.test(argv.cron)) { tags = [...tags, { name: 'Cron-Interval', value: argv.cron }, { name: 'Cron-Tag-Action', value: 'Cron' } @@ -115,6 +129,24 @@ export function register(jwk, services) { } } + // 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 + }) + } + + return services.spawnProcess({ wallet: jwk, src: module, @@ -125,6 +157,14 @@ export function register(jwk, services) { 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" + } + } return Promise.resolve(results[0].node.id) } @@ -135,6 +175,7 @@ export function register(jwk, services) { value: r.node.id } }) + return prompts({ type: 'select', name: 'process', @@ -143,6 +184,10 @@ export function register(jwk, services) { 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' })) } @@ -163,48 +208,19 @@ export function register(jwk, services) { if (services.isAddress(name)) { return of(name) } + 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( - (ctx) => { - if (!ctx.ok) return Rejected(ctx) - return findModule(ctx).chain(createProcess) - }, - fromPromise(alreadyRegistered) - ) + .bichain(doRegister, resolveId) } -// function queryForTransfered(name) { -// return `query ($recipients: [String!]!) { -// transactions( -// first: 100, -// recipients: $recipients, -// tags:[ -// { name:"Data-Protocol", values: ["ao"]}, -// { name:"Variant", values:["ao.TN.1"]}, -// { name:"Type", values:["Process-Transfer"]}, -// { name:"Name", values:["${name}"]} -// ], -// sort:HEIGHT_ASC -// ) { -// edges { -// node { -// id -// tags { -// name -// value -// } - -// } -// } -// } -// } -// ` -// } - function queryForAOS(name) { return `query ($owners: [String!]!) { transactions( diff --git a/src/services/connect.js b/src/services/connect.js index 8f4828926..cc56b8196 100644 --- a/src/services/connect.js +++ b/src/services/connect.js @@ -221,4 +221,4 @@ export async function live(id, watch) { ct = await cron.schedule('*/2 * * * * *', printLive) return ct -} \ No newline at end of file +} diff --git a/src/services/dev.js b/src/services/dev.js index dc07bfd39..aa72c8956 100644 --- a/src/services/dev.js +++ b/src/services/dev.js @@ -4,7 +4,7 @@ const argv = minimist(process.argv.slice(2)) if (argv['dev']) { console.log('*** DEV ENVIRONMENT ***') - process.env.GATEWAY_URL = 'https://arweave.net' + 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.SCHEDULER = 'gCpQfnG6nWLlKs8jYgV8oUfe38GYrPLv59AC7LCtCGg' diff --git a/src/services/help.js b/src/services/help.js index 35689ff16..f18cbbd87 100644 --- a/src/services/help.js +++ b/src/services/help.js @@ -29,27 +29,26 @@ ${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('--relay [relay-url]')} Set the HyperBEAM Relay URL to handle payments in your process. - ${chalk.green('--topup')} Topup balance on the relayer (must be used alongside --relay). - ${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('--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 Computer 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. + ${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('--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 diff --git a/src/services/mainnet.js b/src/services/mainnet.js index 5373c1bf4..d1661d631 100644 --- a/src/services/mainnet.js +++ b/src/services/mainnet.js @@ -1,112 +1,177 @@ -import { connect } from '@permaweb/aoconnect' -import { fromPromise, Resolved, Rejected } from 'hyper-async' +/** + * mainnet-interaction.js + * + * This module provides utilities to interact with AO processes on Arweave's + * 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. + */ + +import { connect, createSigner } from '@permaweb/aoconnect' +import { of, fromPromise, Resolved, Rejected } from 'hyper-async' import chalk from 'chalk' 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 Arweave from 'arweave' +import prompts from 'prompts' const arweave = Arweave.init({}) const pkg = getPkg() const setupMainnet = (wallet) => { - const info = { - GATEWAY_URL: process.env.GATEWAY_URL, - CU_URL: process.env.CU_URL, - MU_URL: process.env.MU_URL, - AO_URL : process.env.AO_URL - } - return connect({ + const options = { MODE: 'mainnet', - wallet, - ...info - }) + device: 'process@1.0', + signer: createSigner(wallet), + GATEWAY_URL: process.env.GATEWAY_URL, + URL: process.env.AO_URL + } + return connect(options) } -export function readResultMainnet(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 - ) +const assoc = (k, v, o) => { + o[k] = v + return o } -export function dryrunMainnet({ processId, wallet, tags, data }, spinnner) { - const { dryrun } = setupMainnet(wallet) - return fromPromise(() => - arweave.wallets.jwkToAddress(wallet).then(Owner => - dryrun({ process: processId, Owner, tags, data }) - ) - )() +const parseWasmBody = (body) => { + try { + return JSON.parse(body) + } catch (e) { + 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) { - let retries = "." - const { message, createDataItemSigner } = setupMainnet(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) - -} + const { request } = setupMainnet(wallet) + const submitRequest = fromPromise(request) + const params = { + Type: 'Message', + path: `/${processId}~process@1.0/push/serialize~json@1.0`, + method: 'POST', + ...tags.filter(t => t.name !== 'device').reduce((a, t) => assoc(t.name, t.value, a), {}), + data: data, + 'data-protocol': 'ao', + variant: 'ao.N.1', + target: processId, + "accept-bundle": "true", + // "accept-codec": "httpsig@1.0", + "signingFormat": "ANS-104" + } -export function spawnProcessMainnet({ wallet, src, tags, data }) { - const SCHEDULER = process.env.SCHEDULER || "_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA" - const { spawn, createDataItemSigner } = setupMainnet(wallet) - + return of(params) + .chain(submitRequest) + .map(prop('body')) + .map(JSON.parse) + .map(handleResults) - tags = tags.concat([{ name: 'aos-Version', value: pkg.version }]) - return fromPromise(() => spawn({ - module: src, scheduler: SCHEDULER, signer: createDataItemSigner(), tags, data - }) - .then(result => new Promise((resolve) => setTimeout(() => resolve(result), 500))) - )() } -export function monitorProcessMainnet({ id, wallet }) { - const { monitor, createDataItemSigner } = setupRelay(wallet) +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 + ctx['scheduler-location'] = scheduler - return fromPromise(() => monitor({ process: id, signer: createDataItemSigner() }))() - //.map(result => (console.log(result), result)) + return ctx -} +}) -export function unmonitorProcessMainnet({ id, wallet }) { - const { unmonitor, createDataItemSigner } = setupRelay(wallet) +const setAuthority = fromPromise(async function (ctx) { + let authority = process.env.AUTHORITY - return fromPromise(() => unmonitor({ process: id, signer: createDataItemSigner() }))() - //.map(result => (console.log(result), result)) + // 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) + }) + + 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', + 'data-protocol': 'ao', + variant: 'ao.N.1', + ...tags.reduce((a, t) => assoc(t.name, t.value, a), {}), + 'aos-version': pkg.version, + 'accept-bundle': 'true', + 'codec-device': 'ans104@1.0', + 'signingFormat': 'ANS-104' + } + if (data) { + params.data = data + } + return of(params) + .chain(setScheduler) + .chain(setAuthority) + .chain(params => isHyper ? of(params) : getExecutionDevice(params)) + .map(p => { + if (p['execution-device'] === 'lua@5.3a') { + p.Module = process.env.AOS_MODULE || pkg.hyper.module + } else { + p.Module = src + } + return p + }) + .chain(submitRequest) + .map(prop('process')) + } @@ -136,85 +201,294 @@ export function printLiveMainnet() { export async function liveMainnet(id, watch) { _watch = watch let ct = null - let cursor = null - let count = null let cursorFile = path.resolve(os.homedir() + `/.${id}.txt`) - + let cursor = 1 if (fs.existsSync(cursorFile)) { - cursor = fs.readFileSync(cursorFile, 'utf-8') + cursor = parseInt(fs.readFileSync(cursorFile, 'utf-8')) } - let stopped = false - process.stdin.on('keypress', (str, key) => { - if (ct && !stopped) { - ct.stop() - stopped = true - setTimeout(() => { ct.start(); stopped = false }, 60000) - } - }) let isJobRunning = false const checkLive = async () => { - const wallet = process.env.WALLET - const { results } = setupMainnet(wallet) + const wallet = typeof process.env.WALLET == 'string' ? JSON.parse(process.env.WALLET) : process.env.WALLET + const { request } = setupMainnet(wallet) if (!isJobRunning) { - try { isJobRunning = true; - let params = { process: id, limit: 1000 } - if (cursor) { - params["from"] = cursor - } else { - params["limit"] = 5 - params["sort"] = "DESC" + // Get the current slot + const currentSlotPath = `/${id}~process@1.0/slot/current/body/serialize~json@1.0` // LIVE PARAMS + const currentSlotParams = { + path: currentSlotPath, + method: 'POST', + device: 'process@1.0', + 'data-protocol': 'ao', + variant: 'ao.N.1', + 'aos-version': pkg.version, + signingFormat: 'ANS-104', + "accept-bundle": "true", + "accept-codec": "httpsig@1.0" } + const currentSlot = await request(currentSlotParams) + .then(res => res.body) + .then(JSON.parse) + .then(res => res.body) - const _relayResults = await results(params) - - let edges = uniqBy(prop('cursor'))(_relayResults.edges.filter(function (e) { - if (e.node?.Output?.print === true) { - return true + if (isNaN(cursor)) { + cursor = currentSlot + 1 + } + // Eval up to the current slot + while (cursor <= currentSlot) { + + const path = `/${id}~process@1.0/compute&slot=${cursor}/results/serialize~json@1.0` // LIVE PARAMS + const params = { + path, + method: 'POST', + device: 'process@1.0', + 'data-protocol': 'ao', + 'scheduler-device': 'scheduler@1.0', + 'push-device': 'push@1.0', + variant: 'ao.N.1', + 'aos-version': pkg.version, + signingFormat: 'ANS-104', + "accept-bundle": "true", + "accept-codec": "httpsig@1.0" } - if (e.cursor === cursor) { - return false + const results = await request(params) + .then(res => res.body) + .then(JSON.parse) + .then(handleResults) + + // If results, add to alerts + if (!globalThis.alerts[cursor]) { + globalThis.alerts[cursor] = results.Output || results.Error } - 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); - - // --- peek on previous line and if delete line if last prompt. - // --- 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 - } - }) + // Update cursor + if (results.Output || results.Error) { + cursor++ + fs.writeFileSync(cursorFile, cursor.toString()) + } } - count = edges.length - if (results.edges.length > 0) { - cursor = results.edges[results.edges.length - 1].cursor - fs.writeFileSync(cursorFile, cursor) - } - //process.nextTick(() => null) - } catch (e) { // surpress error messages #195 - // console.log(chalk.red('An error occurred with live updates...')) + // console.log(chalk.red('An error occurred with live updates...'), { e }) // console.log('Message: ', chalk.gray(e.message)) } finally { isJobRunning = false } } } - await cron.schedule('*/2 * * * * *', checkLive) + ct = await cron.schedule('*/2 * * * * *', checkLive) - ct = await cron.schedule('*/2 * * * * *', printLiveMainnet) + await cron.schedule('*/2 * * * * *', printLiveMainnet) return ct -} \ No newline at end of file +} + +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; +} + +function fromDenominatedAmount(num) { + 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 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`); + + 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(); + + let balanceResponse; + try { + balanceResponse = await aoLegacy.dryrun({ + process: PAYMENT.token, + tags: [ + { name: 'Action', value: 'Balance' }, + { name: 'Recipient', value: walletAddress }, + ] + }); + spinner.stop(); + } + catch (e) { + spinner.stop(); + console.log(chalk.red('Error getting your balance')); + process.exit(1); + } + + 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}`))); + if (balance <= 0) { + 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))); + + let continueWithTopup = true; + + 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}`); + + if (balanceRes.ok) { + 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`))); + + } catch (e) { + 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'); + } + + 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); + + if (isNaN(topupAmount) || topupAmount <= 0) { + 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`))); + + rl.close(); + spinner = ora({ + spinner: 'dots', + suffixText: chalk.gray('[Transferring balance to node...]') + }); + spinner.start(); + + 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 transferId = await aoLegacy.message({ + process: PAYMENT.token, + tags: [ + { name: 'Action', value: 'Transfer' }, + { name: 'Quantity', value: sendQuantity }, + { name: 'Recipient', value: PAYMENT.subledger }, + ], + signer: createSigner(jwk) + }); + + await aoLegacy.result({ + process: PAYMENT.token, + message: transferId + }); + + 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(); + + const transferParams = { + type: 'Message', + path: `/${PAYMENT.subledger}~process@1.0/push/serialize~json@1.0`, + method: 'POST', + 'data-protocol': 'ao', + variant: 'ao.N.1', + target: PAYMENT.subledger, + 'accept-bundle': 'true', + 'accept-codec': 'httpsig@1.0', + 'signingFormat': 'ANS-104', + action: 'Transfer', + Recipient: walletAddress, + Route: ledgerAddress, + Quantity: sendQuantity + } + + const transferRes = await aoMainnet.request(transferParams); + if (transferRes.status === '200') { + let updatedNodeBalance; + do { + try { + 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; + } + + if (currentNodeBalance !== updatedNodeBalance) { + spinner.stop(); + console.log(chalk.gray('Updated balance in node: ' + chalk.green(`${fromDenominatedAmount(updatedNodeBalance)} ${PAYMENT.ticker}`))); + } + + } catch (e) { + console.error(e); + process.exit(1); + } + } + while (currentNodeBalance === updatedNodeBalance); + + return true; + } + else { + console.log(chalk.red('Error handling node topup.')); + process.exit(1); + } + } +} diff --git a/src/services/version.js b/src/services/version.js index fe0d7a22e..d624e6573 100644 --- a/src/services/version.js +++ b/src/services/version.js @@ -13,7 +13,7 @@ const pkg = getPkg() export function version(id) { console.log(chalk.gray(` -AOS Client Version: ${pkg.version}. 2024`)) +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)}`) diff --git a/yarn.lock b/yarn.lock index 65b910406..0afd51bbf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,100 +3,100 @@ "@babel/code-frame@^7.0.0": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: - "@babel/helper-validator-identifier" "^7.25.9" + "@babel/helper-validator-identifier" "^7.27.1" js-tokens "^4.0.0" - picocolors "^1.0.0" + picocolors "^1.1.1" -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== "@commitlint/cli@^19.5.0": - version "19.7.1" - resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-19.7.1.tgz" - integrity sha512-iObGjR1tE/PfDtDTEfd+tnRkB3/HJzpQqRTyofS2MPPkDn1mp3DBC8SoPDayokfAy+xKhF8+bwRCJO25Nea0YQ== - dependencies: - "@commitlint/format" "^19.5.0" - "@commitlint/lint" "^19.7.1" - "@commitlint/load" "^19.6.1" - "@commitlint/read" "^19.5.0" - "@commitlint/types" "^19.5.0" - tinyexec "^0.3.0" + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-19.8.1.tgz#85f7d9f331344e1f0a2b9d8b24fd3695466e1158" + integrity sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA== + dependencies: + "@commitlint/format" "^19.8.1" + "@commitlint/lint" "^19.8.1" + "@commitlint/load" "^19.8.1" + "@commitlint/read" "^19.8.1" + "@commitlint/types" "^19.8.1" + tinyexec "^1.0.0" yargs "^17.0.0" "@commitlint/config-conventional@^19.5.0": - version "19.7.1" - resolved "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.7.1.tgz" - integrity sha512-fsEIF8zgiI/FIWSnykdQNj/0JE4av08MudLTyYHm4FlLWemKoQvPNUYU2M/3tktWcCEyq7aOkDDgtjrmgWFbvg== + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-19.8.1.tgz#eab42df58cda44f18410ae0cbd6785ece00f214b" + integrity sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ== dependencies: - "@commitlint/types" "^19.5.0" + "@commitlint/types" "^19.8.1" conventional-changelog-conventionalcommits "^7.0.2" -"@commitlint/config-validator@^19.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.5.0.tgz" - integrity sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw== +"@commitlint/config-validator@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-19.8.1.tgz#29e9bb1360fa41b9439b23d8e25deaaf097306b5" + integrity sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ== dependencies: - "@commitlint/types" "^19.5.0" + "@commitlint/types" "^19.8.1" ajv "^8.11.0" -"@commitlint/ensure@^19.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.5.0.tgz" - integrity sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg== +"@commitlint/ensure@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-19.8.1.tgz#938c54d6f586bda600b5c8e8e842edb281546e14" + integrity sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw== dependencies: - "@commitlint/types" "^19.5.0" + "@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.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz" - integrity sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg== +"@commitlint/execute-rule@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz#53000363b737773e2d25e97c20f15eaa78742067" + integrity sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA== -"@commitlint/format@^19.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/format/-/format-19.5.0.tgz" - integrity sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A== +"@commitlint/format@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-19.8.1.tgz#3e09b1291b3e29092d7a86f0afbbcfc0d99d3ad4" + integrity sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw== dependencies: - "@commitlint/types" "^19.5.0" + "@commitlint/types" "^19.8.1" chalk "^5.3.0" -"@commitlint/is-ignored@^19.7.1": - version "19.7.1" - resolved "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.7.1.tgz" - integrity sha512-3IaOc6HVg2hAoGleRK3r9vL9zZ3XY0rf1RsUf6jdQLuaD46ZHnXBiOPTyQ004C4IvYjSWqJwlh0/u2P73aIE3g== +"@commitlint/is-ignored@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz#fed0851360ea2d21799eaf8ec9ef6d98c15536e3" + integrity sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg== dependencies: - "@commitlint/types" "^19.5.0" + "@commitlint/types" "^19.8.1" semver "^7.6.0" -"@commitlint/lint@^19.7.1": - version "19.7.1" - resolved "https://registry.npmjs.org/@commitlint/lint/-/lint-19.7.1.tgz" - integrity sha512-LhcPfVjcOcOZA7LEuBBeO00o3MeZa+tWrX9Xyl1r9PMd5FWsEoZI9IgnGqTKZ0lZt5pO3ZlstgnRyY1CJJc9Xg== - dependencies: - "@commitlint/is-ignored" "^19.7.1" - "@commitlint/parse" "^19.5.0" - "@commitlint/rules" "^19.6.0" - "@commitlint/types" "^19.5.0" - -"@commitlint/load@^19.6.1": - version "19.6.1" - resolved "https://registry.npmjs.org/@commitlint/load/-/load-19.6.1.tgz" - integrity sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA== - dependencies: - "@commitlint/config-validator" "^19.5.0" - "@commitlint/execute-rule" "^19.5.0" - "@commitlint/resolve-extends" "^19.5.0" - "@commitlint/types" "^19.5.0" +"@commitlint/lint@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-19.8.1.tgz#c21bf9000ca54e41c5b0139c98aaf12473c03bb0" + 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.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-19.8.1.tgz#b997b1f65a961bf0a47189f15f6dc8786ceb4576" + 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" @@ -104,73 +104,97 @@ lodash.merge "^4.6.2" lodash.uniq "^4.5.0" -"@commitlint/message@^19.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/message/-/message-19.5.0.tgz" - integrity sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ== +"@commitlint/message@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-19.8.1.tgz#d5d0d87837483d9f9b4559ffa06e1aaa26d266d6" + integrity sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg== -"@commitlint/parse@^19.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/parse/-/parse-19.5.0.tgz" - integrity sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw== +"@commitlint/parse@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-19.8.1.tgz#73125d04f07f11477cf563cbfe0cc9f6dc85a747" + integrity sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw== dependencies: - "@commitlint/types" "^19.5.0" + "@commitlint/types" "^19.8.1" conventional-changelog-angular "^7.0.0" conventional-commits-parser "^5.0.0" -"@commitlint/read@^19.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/read/-/read-19.5.0.tgz" - integrity sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ== +"@commitlint/read@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-19.8.1.tgz#812930fd0f616e796e122751cb983346e5454ec8" + integrity sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ== dependencies: - "@commitlint/top-level" "^19.5.0" - "@commitlint/types" "^19.5.0" + "@commitlint/top-level" "^19.8.1" + "@commitlint/types" "^19.8.1" git-raw-commits "^4.0.0" minimist "^1.2.8" - tinyexec "^0.3.0" + tinyexec "^1.0.0" -"@commitlint/resolve-extends@^19.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz" - integrity sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA== +"@commitlint/resolve-extends@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz#a44bb4c22e3e7d407cc9a3758fcf58f5c360b694" + integrity sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg== dependencies: - "@commitlint/config-validator" "^19.5.0" - "@commitlint/types" "^19.5.0" + "@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.6.0": - version "19.6.0" - resolved "https://registry.npmjs.org/@commitlint/rules/-/rules-19.6.0.tgz" - integrity sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw== +"@commitlint/rules@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-19.8.1.tgz#1cea53d5bf970ce56dc105e1da5e6655a2fe7a5f" + integrity sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw== dependencies: - "@commitlint/ensure" "^19.5.0" - "@commitlint/message" "^19.5.0" - "@commitlint/to-lines" "^19.5.0" - "@commitlint/types" "^19.5.0" + "@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.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.5.0.tgz" - integrity sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ== +"@commitlint/to-lines@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-19.8.1.tgz#c1a28a84542c7ba321c1c11178b83ae024257b47" + integrity sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg== -"@commitlint/top-level@^19.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.5.0.tgz" - integrity sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng== +"@commitlint/top-level@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-19.8.1.tgz#2c942189d83a29b21ff7ba6e91607301efdf5916" + integrity sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw== dependencies: find-up "^7.0.0" -"@commitlint/types@^19.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/types/-/types-19.5.0.tgz" - integrity sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg== +"@commitlint/types@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-19.8.1.tgz#7971fbd56b0cfb31692a4e1941b74ac8217c44e5" + 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.yarnpkg.com/@dha-team/arbundles/-/arbundles-1.0.3.tgz#4080514945a830e7d61f3d079401f28e8bd198d2" + 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/aix-ppc64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" @@ -333,12 +357,12 @@ "@esbuild/linux-x64@0.20.2": version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== "@esbuild/linux-x64@0.24.2": version "0.24.2" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== "@esbuild/netbsd-arm64@0.24.2": @@ -412,20 +436,20 @@ integrity sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== "@eslint-community/eslint-utils@^4.2.0": - version "4.4.1" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz" - integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== + version "4.7.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + 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" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" 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" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" @@ -440,17 +464,302 @@ "@eslint/js@8.57.1": version "8.57.1" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@fastify/busboy@^2.0.0": - version "2.1.1" - resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz" - integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== +"@ethersproject/abstract-provider@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" + 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.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" + 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.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" + 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.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" + integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== + dependencies: + "@ethersproject/bytes" "^5.8.0" + +"@ethersproject/basex@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.8.0.tgz#1d279a90c4be84d1c1139114a1f844869e57d03a" + 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.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" + 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.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" + 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.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" + 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.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" + 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.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.8.0.tgz#a51ae2a50bcd48ef6fd108c64cbae5e6ff34a761" + 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.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz#d18de0a4cf0f185f232eb3c17d5e0744d97eb8c9" + 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.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" + 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.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" + integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== + +"@ethersproject/networks@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" + integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/pbkdf2@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz#cd2621130e5dd51f6a0172e63a6e4a0c0a0ec37e" + 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.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" + integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/providers@^5.7.2": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.8.0.tgz#6c2ae354f7f96ee150439f7de06236928bc04cb4" + 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.yarnpkg.com/@ethersproject/random/-/random-5.8.0.tgz#1bced04d49449f37c6437c701735a1a022f0057a" + 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.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" + 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.yarnpkg.com/@ethersproject/sha2/-/sha2-5.8.0.tgz#8954a613bb78dac9b46829c0a95de561ef74e5e1" + 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.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" + 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.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" + 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.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" + 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.yarnpkg.com/@ethersproject/wallet/-/wallet-5.8.0.tgz#49c300d10872e6986d953e8310dc33d440da8127" + 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.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" + 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.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.8.0.tgz#7a5654ee8d1bb1f4dbe43f91d217356d650ad821" + 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" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: "@humanwhocodes/object-schema" "^2.0.3" @@ -459,24 +768,24 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 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" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" 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" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" 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" + resolved "https://registry.yarnpkg.com/@johnnymorganz/stylua-bin/-/stylua-bin-0.20.0.tgz#85a3f05e6d6533586b923958080a1a2ebca651ab" integrity sha512-CjsdrDNhUHivkm7xvT+LK0E+aOzD2RbLy0jiD1s/x5RoTq8tqXenhZN7ao2NeuLctwrKCOk26xAv5oP4JmGoPw== dependencies: axios "^1.6.0" @@ -484,9 +793,14 @@ rimraf "^3.0.2" unzipper "^0.10.11" +"@noble/ed25519@^1.6.1": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.5.tgz#94df8bdb9fec9c4644a56007eecb57b0e9fbd0d7" + 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" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -494,12 +808,12 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 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" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -507,44 +821,47 @@ "@permaweb/ao-loader@^0.0.44": version "0.0.44" - resolved "https://registry.npmjs.org/@permaweb/ao-loader/-/ao-loader-0.0.44.tgz" + resolved "https://registry.yarnpkg.com/@permaweb/ao-loader/-/ao-loader-0.0.44.tgz#47d568c55068e213d47eeda058f027a26f02aeda" 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" + resolved "https://registry.yarnpkg.com/@permaweb/ao-scheduler-utils/-/ao-scheduler-utils-0.0.25.tgz#50c96a411d59f58010ace322d6abd3cd5e11e4cd" integrity sha512-b0UYSTgnLMIYLScrfNBgcqK7ZMmd78L3J0Jz4RIsIq2P5PtkdRqQ7fYqLlltg7bD1f3dvl4TkO1925ED4ei7LA== dependencies: lru-cache "^10.2.2" ramda "^0.30.0" zod "^3.23.5" -"@permaweb/aoconnect@^0.0.68": - version "0.0.68" - resolved "https://registry.npmjs.org/@permaweb/aoconnect/-/aoconnect-0.0.68.tgz" - integrity sha512-QK8VJ/rbmyZ7esuk6O2F4uJG0AKiYNzDuQNzsdgCLH7kt+0FlKTS4MKM1KH9fvXivqXdXYs02OxmzkkWprNxog== +"@permaweb/aoconnect@^0.0.85": + version "0.0.85" + resolved "https://registry.yarnpkg.com/@permaweb/aoconnect/-/aoconnect-0.0.85.tgz#3e8685d39ec1df91ff68b619ecd3a75168c6b6b0" + integrity sha512-lPfDLDaQyOY1oupxkw9B9ZslKw1ENASEdzComoMc2RZ7DejBx2OdHzU+fmZO1ZEQ5zQSm82/wgRVBd/1l6092g== 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" - warp-arbundles "^1.0.4" + 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" + resolved "https://registry.yarnpkg.com/@permaweb/protocol-tag-utils/-/protocol-tag-utils-0.0.2.tgz#c8a2eddf7da15d70a6e60aecff839730cb59aee3" 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" + resolved "https://registry.yarnpkg.com/@permaweb/wasm-json-toolkit/-/wasm-json-toolkit-0.2.9.tgz#241cdf37c1690a751a73dd05987336142e5576d1" integrity sha512-CGCeUwS+UeqUdvORiyG0LykkQXLTwS5TWc590CUkDfOYyBUSPv8pse0sJStvTC9LKAzuNx3ELBvmqHCI4muUAA== dependencies: buffer-pipe "0.0.3" @@ -553,49 +870,61 @@ "@permaweb/wasm-metering@^0.2.2": version "0.2.2" - resolved "https://registry.npmjs.org/@permaweb/wasm-metering/-/wasm-metering-0.2.2.tgz" + resolved "https://registry.yarnpkg.com/@permaweb/wasm-metering/-/wasm-metering-0.2.2.tgz#a854c485d9ddbbefb4a17a3692822b696d54a2c7" integrity sha512-xM2MbPkHc4rzhTR6VH5eXtfC+liaYSuNCa0kPRaqSZO2gr1SirJWnzUBDa5VOfTBTgIlIVv5RW+Mkbt/VuK+oA== dependencies: "@permaweb/wasm-json-toolkit" "^0.2.9" leb128 "^0.0.4" +"@randlabs/communication-bridge@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@randlabs/communication-bridge/-/communication-bridge-1.0.1.tgz#d1ecfc29157afcbb0ca2d73122d67905eecb5bf3" + integrity sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg== + +"@randlabs/myalgo-connect@^1.1.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@randlabs/myalgo-connect/-/myalgo-connect-1.4.2.tgz#ce3ad97b3889ea21da75852187511d3f6be0fa05" + 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" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" 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" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" 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" + resolved "https://registry.yarnpkg.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz#8cb81cf170853496cbc501a3b32dcf5e46ffb61a" 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" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/node@*": - version "22.13.1" - resolved "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz" - integrity sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew== + version "24.0.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.0.3.tgz#f935910f3eece3a3a2f8be86b96ba833dc286cab" + integrity sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg== dependencies: - undici-types "~6.20.0" + 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" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== JSONStream@^1.3.5: version "1.3.5" - resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: jsonparse "^1.2.0" @@ -603,22 +932,27 @@ JSONStream@^1.3.5: acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.9.0: - version "8.14.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" - integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@^7.1.2: version "7.1.3" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== ajv@^6.12.4: version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -628,7 +962,7 @@ ajv@^6.12.4: ajv@^8.11.0: version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" @@ -636,55 +970,76 @@ ajv@^8.11.0: 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.yarnpkg.com/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6" + integrity sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ== + +algosdk@^1.13.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/algosdk/-/algosdk-1.24.1.tgz#afc4102457ae0c38a32de6b84f4d713aedfc9e89" + 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.0.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== 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" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 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" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 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" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansi-styles@^6.0.0, ansi-styles@^6.2.1: version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== arconnect@^0.4.2: version "0.4.2" - resolved "https://registry.npmjs.org/arconnect/-/arconnect-0.4.2.tgz" + resolved "https://registry.yarnpkg.com/arconnect/-/arconnect-0.4.2.tgz#83de7638fb46183e82d7ec7efb5594c5f7cdc806" 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" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 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" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: call-bound "^1.0.3" @@ -692,24 +1047,26 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: array-ify@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== array-includes@^3.1.6, array-includes@^3.1.8: - version "3.1.8" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + version "3.1.9" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" + integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" + 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" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== dependencies: call-bind "^1.0.7" @@ -720,20 +1077,21 @@ array.prototype.findlast@^1.2.5: es-shim-unscopables "^1.0.2" array.prototype.findlastindex@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + version "1.2.6" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" + integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" define-properties "^1.2.1" - es-abstract "^1.23.2" + es-abstract "^1.23.9" es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" + 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" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: call-bind "^1.0.8" @@ -743,7 +1101,7 @@ array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.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" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: call-bind "^1.0.8" @@ -753,7 +1111,7 @@ array.prototype.flatmap@^1.3.2, array.prototype.flatmap@^1.3.3: 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" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: call-bind "^1.0.7" @@ -764,7 +1122,7 @@ array.prototype.tosorted@^1.1.4: 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" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: array-buffer-byte-length "^1.0.1" @@ -775,10 +1133,17 @@ arraybuffer.prototype.slice@^1.0.4: get-intrinsic "^1.2.6" is-array-buffer "^3.0.4" -arweave@^1.10.13, arweave@^1.13.7, arweave@^1.15.1, arweave@^1.15.5: - version "1.15.5" - resolved "https://registry.npmjs.org/arweave/-/arweave-1.15.5.tgz" - integrity sha512-Zj3b8juz1ZtDaQDPQlzWyk2I4wZPx3RmcGq8pVJeZXl2Tjw0WRy5ueHPelxZtBLqCirGoZxZEAFRs6SZUSCBjg== +arweave-stream-tx@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/arweave-stream-tx/-/arweave-stream-tx-1.2.2.tgz#2d5c66554301baacd02586a152fbb198b422112f" + integrity sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ== + dependencies: + exponential-backoff "^3.1.0" + +arweave@^1.10.13, arweave@^1.15.1, arweave@^1.15.5, arweave@^1.15.7: + version "1.15.7" + resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.15.7.tgz#d09265d128e93a471203649de083ba7fec52cb29" + integrity sha512-F+Y4iWU1qea9IsKQ/YNmLsY4DHQVsaJBuhEbFxQn9cfGHOmtXE+bwo14oY8xqymsqSNf/e1PeIfLk7G7qN/hVA== dependencies: arconnect "^0.4.2" asn1.js "^5.4.1" @@ -787,7 +1152,7 @@ arweave@^1.10.13, arweave@^1.13.7, arweave@^1.15.1, arweave@^1.15.5: asn1.js@^5.4.1: version "5.4.1" - resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" @@ -797,25 +1162,25 @@ asn1.js@^5.4.1: async-function@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 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" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" -axios@^1.6.0: - version "1.7.9" - resolved "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz" - integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== +axios@^1.6.0, axios@^1.7.9: + version "1.10.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.10.0.tgz#af320aee8632eaf2a400b6a1979fa75856f38d54" + integrity sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -823,42 +1188,54 @@ axios@^1.6.0: b4a@^1.6.4: version "1.6.7" - resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" 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" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 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" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== +base-x@^3.0.2: + version "3.0.11" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.11.tgz#40d80e2a1aeacba29792ccc6c5354806421287ff" + 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" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base64url@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + 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" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== -bignumber.js@^9.0.2: - version "9.1.2" - resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== +bignumber.js@^9.0.0, bignumber.js@^9.0.2: + version "9.3.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.0.tgz#bdba7e2a4c1a2eba08290e8dcad4f36393c92acd" + 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" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg== dependencies: buffers "~0.1.1" @@ -866,7 +1243,7 @@ binary@~0.3.0: bl@^5.0.0: version "5.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== dependencies: buffer "^6.0.3" @@ -875,51 +1252,68 @@ bl@^5.0.0: bluebird@~3.4.1: version "3.4.7" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== -bn.js@^4.0.0, bn.js@^4.11.6: - version "4.12.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz" - integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg== +bn.js@^4.0.0, bn.js@^4.11.6, bn.js@^4.11.9: + version "4.12.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.2.tgz#3d8fed6796c24e177737f7cc5172ee04ef39ec99" + integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== + +bn.js@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566" + integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + 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" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + 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" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" 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" + resolved "https://registry.yarnpkg.com/buffer-pipe/-/buffer-pipe-0.0.0.tgz#186ec257d696e8e74c3051160a0e9e9a9811a387" 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" + resolved "https://registry.yarnpkg.com/buffer-pipe/-/buffer-pipe-0.0.3.tgz#242197681d4591e7feda213336af6c07a5ce2409" integrity sha512-GlxfuD/NrKvCNs0Ut+7b1IHjylfdegMBxQIlZHj7bObKVQBxB5S84gtm2yu1mQ8/sSggceWBDPY0cPXgvX2MuA== dependencies: safe-buffer "^5.1.2" -buffer@^6.0.3: +buffer@^6.0.2, buffer@^6.0.3: version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -927,27 +1321,27 @@ buffer@^6.0.3: buffers@~0.1.1: version "0.1.1" - resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== builtins@^5.0.1: version "5.1.0" - resolved "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.1.0.tgz#6d85eeb360c4ebc166c3fdef922a15aa7316a5e8" integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== dependencies: semver "^7.0.0" -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz" - integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== +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.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + 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" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== dependencies: call-bind-apply-helpers "^1.0.0" @@ -955,29 +1349,29 @@ call-bind@^1.0.7, call-bind@^1.0.8: get-intrinsic "^1.2.4" set-function-length "^1.2.2" -call-bound@^1.0.2, call-bound@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz" - integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== dependencies: - call-bind-apply-helpers "^1.0.1" - get-intrinsic "^1.2.6" + 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" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== chainsaw@~0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" 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" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -985,31 +1379,31 @@ chalk@^4.0.0: chalk@^5.0.0, chalk@^5.3.0, chalk@^5.4.1: version "5.4.1" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== cli-cursor@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" 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" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" 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" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" 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" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== dependencies: slice-ansi "^5.0.0" @@ -1017,7 +1411,7 @@ cli-truncate@^4.0.0: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -1026,36 +1420,36 @@ cliui@^8.0.1: color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 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" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 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" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" 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" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@^13.1.0: version "13.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== compare-func@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" @@ -1063,26 +1457,26 @@ compare-func@^2.0.0: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 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" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" 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" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5" 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" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== dependencies: JSONStream "^1.3.5" @@ -1092,19 +1486,19 @@ conventional-commits-parser@^5.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" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 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" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz#7f644503e1c2bff90aed2d29a637008f279646bb" integrity sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g== dependencies: jiti "^2.4.1" cosmiconfig@^9.0.0: version "9.0.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== dependencies: env-paths "^2.2.1" @@ -1112,9 +1506,16 @@ cosmiconfig@^9.0.0: js-yaml "^4.1.0" parse-json "^5.2.0" +cross-fetch@^3.1.5: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.2.0.tgz#34e9192f53bc757d6614304d9e5e6fb4edb782e3" + 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" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== dependencies: nice-try "^1.0.4" @@ -1125,7 +1526,7 @@ cross-spawn@^6.0.0: 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" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -1134,17 +1535,17 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: dargs@^8.0.0: version "8.1.0" - resolved "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-8.1.0.tgz#a34859ea509cbce45485e5aa356fef70bfcc7272" 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" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" 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" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== dependencies: call-bound "^1.0.3" @@ -1153,7 +1554,7 @@ data-view-buffer@^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" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== dependencies: call-bound "^1.0.3" @@ -1162,7 +1563,7 @@ data-view-byte-length@^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" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== dependencies: call-bound "^1.0.2" @@ -1170,27 +1571,27 @@ data-view-byte-offset@^1.0.1: is-data-view "^1.0.1" debug@4, debug@^4.3.1, debug@^4.3.2, debug@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== dependencies: ms "^2.1.3" debug@^3.2.7: version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 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" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -1199,7 +1600,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: 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" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -1208,48 +1609,48 @@ define-properties@^1.1.3, define-properties@^1.2.1: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 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" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-7.0.1.tgz#cbb060a12842b9c4d333f1cac4aa4da1bb66bc25" 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" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-4.0.1.tgz#fcefdb5713e1fb8cb2839b8b6ee22e6716ab8f23" 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" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 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" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 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" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 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" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -1258,71 +1659,84 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: duplexer2@~0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" 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" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +elliptic@6.6.1, elliptic@^6.5.7: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + 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" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" 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" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + version "1.4.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + 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" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== environment@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" 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" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 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: - version "1.23.9" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz" - integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== +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.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328" + 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.3" + 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.0.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.2.7" - get-proto "^1.0.0" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" get-symbol-description "^1.1.0" globalthis "^1.0.4" gopd "^1.2.0" @@ -1334,21 +1748,24 @@ es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23 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.0" + is-weakref "^1.1.1" math-intrinsics "^1.1.0" - object-inspect "^1.13.3" + 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.3" + 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" @@ -1357,21 +1774,21 @@ es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23 typed-array-byte-offset "^1.0.4" typed-array-length "^1.0.7" unbox-primitive "^1.1.0" - which-typed-array "^1.1.18" + 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" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" 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" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 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" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75" integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== dependencies: call-bind "^1.0.8" @@ -1391,16 +1808,16 @@ es-iterator-helpers@^1.2.1: iterator.prototype "^1.1.4" safe-array-concat "^1.1.3" -es-object-atoms@^1.0.0: +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" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" 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" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: es-errors "^1.3.0" @@ -1408,16 +1825,16 @@ es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: has-tostringtag "^1.0.2" hasown "^2.0.2" -es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== +es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== dependencies: - hasown "^2.0.0" + 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" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: is-callable "^1.2.7" @@ -1426,7 +1843,7 @@ es-to-primitive@^1.3.0: esbuild@^0.20.1: version "0.20.2" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== optionalDependencies: "@esbuild/aix-ppc64" "0.20.2" @@ -1455,7 +1872,7 @@ esbuild@^0.20.1: esbuild@^0.24.0: version "0.24.2" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== optionalDependencies: "@esbuild/aix-ppc64" "0.24.2" @@ -1486,27 +1903,27 @@ esbuild@^0.24.0: escalade@^3.1.1: version "3.2.0" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" 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" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 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" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz#70852d395731a96704a592be5b0bfaccfeded239" 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" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" 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" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" @@ -1515,14 +1932,14 @@ eslint-import-resolver-node@^0.3.9: 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" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" 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" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== dependencies: eslint-utils "^2.0.0" @@ -1530,7 +1947,7 @@ eslint-plugin-es@^4.1.0: 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" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== dependencies: "@rtsao/scc" "^1.1.0" @@ -1555,7 +1972,7 @@ eslint-plugin-import@^2.27.5: 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" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz#e29221d8f5174f84d18f2eb94765f2eeea033b90" integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q== dependencies: builtins "^5.0.1" @@ -1569,13 +1986,13 @@ eslint-plugin-n@^15.7.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" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz#acd3fd7d55cead7a10f92cf698f36c0aafcd717a" integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ== eslint-plugin-react@^7.36.1: - version "7.37.4" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz" - integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ== + version "7.37.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" + integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" @@ -1587,7 +2004,7 @@ eslint-plugin-react@^7.36.1: hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.8" + object.entries "^1.1.9" object.fromentries "^2.0.8" object.values "^1.2.1" prop-types "^15.8.1" @@ -1598,7 +2015,7 @@ eslint-plugin-react@^7.36.1: eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -1606,36 +2023,36 @@ eslint-scope@^7.2.2: eslint-utils@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" 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" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 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" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 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" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 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" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.41.0: version "8.57.1" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -1679,7 +2096,7 @@ eslint@^8.41.0: espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" @@ -1688,36 +2105,36 @@ espree@^9.6.0, espree@^9.6.1: esquery@^1.4.2: version "1.6.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" 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" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 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" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 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" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 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" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== execa@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: cross-spawn "^6.0.0" @@ -1730,7 +2147,7 @@ execa@^1.0.0: execa@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: cross-spawn "^7.0.3" @@ -1743,19 +2160,24 @@ execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" +exponential-backoff@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.2.tgz#a8f26adb96bf78e8cd8ad1037928d5e5c0679d91" + 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" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 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" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== fast-glob@^3.3.2: version "3.3.3" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -1766,68 +2188,68 @@ fast-glob@^3.3.2: 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" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 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" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 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" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== fastq@^1.6.0: - version "1.19.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz" - integrity sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA== + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" -fdir@^6.4.2: - version "6.4.3" - resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz" - integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== +fdir@^6.4.4: + version "6.4.6" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281" + integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== 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" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== dependencies: node-domexception "^1.0.0" web-streams-polyfill "^3.0.3" figlet@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/figlet/-/figlet-1.8.0.tgz" - integrity sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw== + version "1.8.1" + resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.8.1.tgz#e8e8a07e8c16be24c31086d7d5de8a9b9cf7f0fd" + integrity sha512-kEC3Sme+YvA8Hkibv0NR1oClGcWia0VB2fC1SlMy027cwe795Xx40Xiv/nw/iFAwQLupymWh+uhAAErn/7hwPg== 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" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 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" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 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" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 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" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -1835,7 +2257,7 @@ find-up@^5.0.0: find-up@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-7.0.0.tgz#e8dec1455f74f78d888ad65bf7ca13dd2b4e66fb" integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g== dependencies: locate-path "^7.2.0" @@ -1844,7 +2266,7 @@ find-up@^7.0.0: flat-cache@^3.0.4: version "3.2.0" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" @@ -1852,46 +2274,48 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.2.9: - version "3.3.2" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz" - integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + 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" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== -for-each@^0.3.3: - version "0.3.4" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz" - integrity sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw== +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: is-callable "^1.2.7" form-data@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz" - integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + version "4.0.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.3.tgz#608b1b3f3e28be0fccf5901fc85fb3641e5cf0ae" + 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" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" 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" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fstream@^1.0.12: version "1.0.12" - resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== dependencies: graceful-fs "^4.1.2" @@ -1901,12 +2325,12 @@ fstream@^1.0.12: function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 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" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: call-bind "^1.0.8" @@ -1918,30 +2342,30 @@ function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: 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" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" 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" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-east-asian-width@^1.0.0: version "1.3.0" - resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz" - integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA== +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.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: - call-bind-apply-helpers "^1.0.1" + call-bind-apply-helpers "^1.0.2" es-define-property "^1.0.1" es-errors "^1.3.0" - es-object-atoms "^1.0.0" + es-object-atoms "^1.1.1" function-bind "^1.1.2" - get-proto "^1.0.0" + get-proto "^1.0.1" gopd "^1.2.0" has-symbols "^1.1.0" hasown "^2.0.2" @@ -1949,7 +2373,7 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@ 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" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" @@ -1957,29 +2381,29 @@ get-proto@^1.0.0, get-proto@^1.0.1: get-stdin@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" 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" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" 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" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 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" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" 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" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: call-bound "^1.0.3" @@ -1988,12 +2412,12 @@ get-symbol-description@^1.1.0: 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" + resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-3.2.0.tgz#ffe5d5895e29d24f930f9a98dd604b7e407d2f5f" 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" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-4.0.0.tgz#b212fd2bff9726d27c1283a1157e829490593285" integrity sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== dependencies: dargs "^8.0.0" @@ -2002,21 +2426,21 @@ git-raw-commits@^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" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 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" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 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" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -2028,21 +2452,21 @@ glob@^7.1.3: global-directory@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" 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" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" 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" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: define-properties "^1.2.1" @@ -2050,72 +2474,94 @@ globalthis@^1.0.4: gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" 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" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 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" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 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" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" 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" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 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" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" 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" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" 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" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" 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" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" -hasown@^2.0.0, hasown@^2.0.2: +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + 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" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" +hi-base32@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" + integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + 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: version "1.0.4" - resolved "https://registry.npmjs.org/http-message-signatures/-/http-message-signatures-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/http-message-signatures/-/http-message-signatures-1.0.4.tgz#3d1f614977d3a435af7c1d35a75e1e48d9094075" integrity sha512-gavCQWnxHFg0BVlKs6CmYK7hNSH1o0x0mHTC68yBAHYOYuTVXPv52mEE7QuT5TenfiagTdOa/zPJzen4lEX7Rg== dependencies: structured-headers "^1.0.1" https-proxy-agent@^7.0.4: version "7.0.6" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: agent-base "^7.1.2" @@ -2123,32 +2569,32 @@ https-proxy-agent@^7.0.4: human-signals@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== husky@^9.1.6: version "9.1.7" - resolved "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== hyper-async@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/hyper-async/-/hyper-async-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/hyper-async/-/hyper-async-1.1.2.tgz#b9a83be36e726bface6f4a5b84f1a1a25bf19e6a" 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" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.1.1, ignore@^5.2.0: version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" 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" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" @@ -2156,17 +2602,17 @@ import-fresh@^3.2.1, import-fresh@^3.3.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" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -2174,17 +2620,17 @@ inflight@^1.0.4: inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 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" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" 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" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" @@ -2193,12 +2639,12 @@ internal-slot@^1.1.0: interpret@^1.0.0: version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" 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" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: call-bind "^1.0.8" @@ -2207,12 +2653,12 @@ is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 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" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: async-function "^1.0.0" @@ -2223,14 +2669,14 @@ is-async-function@^2.0.0: is-bigint@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" 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" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: call-bound "^1.0.3" @@ -2238,19 +2684,19 @@ is-boolean-object@^1.2.1: is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" 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" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" 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" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: call-bound "^1.0.2" @@ -2259,7 +2705,7 @@ is-data-view@^1.0.1, is-data-view@^1.0.2: 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" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: call-bound "^1.0.2" @@ -2267,36 +2713,36 @@ is-date-object@^1.0.5, is-date-object@^1.1.0: is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 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" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" 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" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 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" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-fullwidth-code-point@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== dependencies: get-east-asian-width "^1.0.0" 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" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== dependencies: call-bound "^1.0.3" @@ -2306,24 +2752,29 @@ is-generator-function@^1.0.10: 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" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 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" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" 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" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + 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" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: call-bound "^1.0.3" @@ -2331,27 +2782,27 @@ is-number-object@^1.1.1: is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 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" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 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" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 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" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" 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" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: call-bound "^1.0.2" @@ -2361,29 +2812,29 @@ is-regex@^1.2.1: is-set@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" 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" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" 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" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 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" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== -is-string@^1.0.7, is-string@^1.1.1: +is-string@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: call-bound "^1.0.3" @@ -2391,7 +2842,7 @@ is-string@^1.0.7, is-string@^1.1.1: 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" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: call-bound "^1.0.2" @@ -2400,38 +2851,38 @@ is-symbol@^1.0.4, is-symbol@^1.1.1: 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" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" 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" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" 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" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" 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" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== -is-weakref@^1.0.2, is-weakref@^1.1.0: +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" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" 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" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: call-bound "^1.0.3" @@ -2439,22 +2890,22 @@ is-weakset@^2.0.3: isarray@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" 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" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 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" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== dependencies: define-data-property "^1.1.4" @@ -2466,7 +2917,7 @@ iterator.prototype@^1.1.4: jest-diff@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" @@ -2476,71 +2927,93 @@ jest-diff@^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" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jiti@^2.4.1: version "2.4.2" - resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560" integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + 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.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-sha512@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha512/-/js-sha512-0.8.0.tgz#dd22db8d02756faccf19f218e3ed61ec8249f7d4" + 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" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 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" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + 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" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 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" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 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" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 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" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 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" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 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" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" 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" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== "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" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: array-includes "^3.1.6" @@ -2548,21 +3021,30 @@ jsonparse@^1.2.0: object.assign "^4.1.4" object.values "^1.1.6" +keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + 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" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 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" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" 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" + resolved "https://registry.yarnpkg.com/leb128/-/leb128-0.0.4.tgz#f96d698cf3ba5b677423abfe50b7e9b2df1463ff" integrity sha512-2zejk0fCIgY8RVcc/KzvyfpDio5Oo8HgPZmkrOmdwmbk0KpKpgD+JKwikxKk8cZYkANIhwHK50SNukkCm3XkCQ== dependencies: bn.js "^4.11.6" @@ -2570,7 +3052,7 @@ leb128@0.0.4, leb128@^0.0.4: levn@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -2578,18 +3060,18 @@ levn@^0.4.1: lilconfig@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" 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" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lint-staged@^15.2.10: - version "15.4.3" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.4.3.tgz" - integrity sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g== + version "15.5.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.5.2.tgz#beff028fd0681f7db26ffbb67050a21ed4d059a3" + integrity sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w== dependencies: chalk "^5.4.1" commander "^13.1.0" @@ -2604,13 +3086,13 @@ lint-staged@^15.2.10: listenercount@~1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== listr2@^8.2.5: - version "8.2.5" - resolved "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz" - integrity sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ== + version "8.3.3" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.3.3.tgz#815fc8f738260ff220981bf9e866b3e11e8121bf" + integrity sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ== dependencies: cli-truncate "^4.0.0" colorette "^2.0.20" @@ -2621,7 +3103,7 @@ listr2@^8.2.5: 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" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== dependencies: graceful-fs "^4.1.15" @@ -2632,7 +3114,7 @@ load-json-file@^5.2.0: locate-path@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" @@ -2640,66 +3122,66 @@ locate-path@^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" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 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" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" 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" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 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" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 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" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" 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" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 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" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" 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" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" 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" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" 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" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" 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" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" 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" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== dependencies: chalk "^5.0.0" @@ -2707,7 +3189,7 @@ log-symbols@^5.1.0: log-update@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== dependencies: ansi-escapes "^7.0.0" @@ -2718,47 +3200,47 @@ log-update@^6.1.0: loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 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" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== 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== + version "1.2.0" + resolved "https://registry.yarnpkg.com/markdown-toc-gen/-/markdown-toc-gen-1.2.0.tgz#e7d6d02e396eebc8066dda032a4a81c3c1760783" + integrity sha512-+8eDFxBDC08XpBa8NdHaU0kDUGrc2XLn/3xCdzZZ0MWQ3ZvUhkdCAINeUwcGjhJ3zkBbfiVVWscORvI1UzO9sQ== 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" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== meow@^12.0.1: version "12.1.1" - resolved "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz" + resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" 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" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0: version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.8: version "4.0.8" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" @@ -2766,130 +3248,165 @@ micromatch@^4.0.8: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 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" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 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" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 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" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" 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" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== -minimalistic-assert@^1.0.0: +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" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + 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" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== "mkdirp@>=0.5 0": version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" 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" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.39.8.tgz#9078cd8386081afd986cca34b52b5d84ea7a4d38" 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" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multistream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" + 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" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 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" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + 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" + resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.3.tgz#c4bc7173dd96d96c50bdb51122c64415458caff2" 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" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== +node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + 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" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" 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.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + 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" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 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" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" 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" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.3: +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" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" 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" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 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" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: call-bind "^1.0.8" @@ -2899,18 +3416,19 @@ object.assign@^4.1.4, object.assign@^4.1.7: has-symbols "^1.1.0" object-keys "^1.1.1" -object.entries@^1.1.8: - version "1.1.8" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz" - integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== +object.entries@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" + integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" define-properties "^1.2.1" - es-object-atoms "^1.0.0" + 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" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: call-bind "^1.0.7" @@ -2920,7 +3438,7 @@ object.fromentries@^2.0.8: object.groupby@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: call-bind "^1.0.7" @@ -2929,7 +3447,7 @@ object.groupby@^1.0.3: 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" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: call-bind "^1.0.8" @@ -2939,40 +3457,40 @@ object.values@^1.1.6, object.values@^1.2.0, object.values@^1.2.1: obliterator@^2.0.1: version "2.0.5" - resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.5.tgz#031e0145354b0c18840336ae51d41e7d6d2c76aa" 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" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 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" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 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" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" 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" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" 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" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -2984,7 +3502,7 @@ optionator@^0.9.3: ora@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/ora/-/ora-7.0.1.tgz#cdd530ecd865fe39e451a0e7697865669cb11930" integrity sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw== dependencies: chalk "^5.3.0" @@ -2999,7 +3517,7 @@ ora@^7.0.1: own-keys@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== dependencies: get-intrinsic "^1.2.6" @@ -3008,66 +3526,66 @@ own-keys@^1.0.1: p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 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" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 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" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 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" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" 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" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 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" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 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" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" 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" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 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" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 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" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" @@ -3075,7 +3593,7 @@ parse-json@^4.0.0: parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -3085,72 +3603,72 @@ parse-json@^5.2.0: path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 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" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 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" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" 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" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 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" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 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" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 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" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" 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" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -picocolors@^1.0.0: +picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 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" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== picomatch@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== pidtree@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== pify@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" 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" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== dependencies: find-up "^3.0.0" @@ -3158,22 +3676,22 @@ pkg-conf@^3.1.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" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" 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" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 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" + resolved "https://registry.yarnpkg.com/pretty-file-tree/-/pretty-file-tree-1.0.1.tgz#ca876e6797c2078b5074f720bb2cd4cde92adb1c" 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" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" @@ -3182,12 +3700,12 @@ pretty-format@^29.7.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" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== prompts@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -3195,7 +3713,7 @@ prompts@^2.4.2: prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -3204,45 +3722,45 @@ prop-types@^15.8.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" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pump@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz" - integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + version "3.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.3.tgz#151d979f1a29668dc0025ec589a455b53282268d" + 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" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 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" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 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" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.30.1.tgz#7108ac95673062b060025052cd5143ae8fc605bf" 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" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 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" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== readable-stream@^2.0.2, readable-stream@~2.3.6: version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -3253,9 +3771,9 @@ readable-stream@^2.0.2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.4.0: +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" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -3264,14 +3782,14 @@ readable-stream@^3.4.0: rechoir@^0.6.2: version "0.6.2" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 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" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: call-bind "^1.0.8" @@ -3283,9 +3801,9 @@ reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: get-proto "^1.0.1" which-builtin-type "^1.2.1" -regexp.prototype.flags@^1.5.3: +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" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: call-bind "^1.0.8" @@ -3297,32 +3815,32 @@ regexp.prototype.flags@^1.5.3: regexpp@^3.0.0: version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 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" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 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" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 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" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 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" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 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" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: is-core-module "^2.16.0" @@ -3331,7 +3849,7 @@ resolve@^1.1.6, resolve@^1.22.1, resolve@^1.22.4: 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" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: is-core-module "^2.13.0" @@ -3340,7 +3858,7 @@ resolve@^2.0.0-next.5: restore-cursor@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== dependencies: onetime "^5.1.0" @@ -3348,46 +3866,46 @@ restore-cursor@^4.0.0: restore-cursor@^5.0.0: version "5.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== dependencies: onetime "^7.0.0" signal-exit "^4.1.0" reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rfdc@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@2: version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 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" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 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" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: call-bind "^1.0.8" @@ -3396,19 +3914,19 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +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" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 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" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 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" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== dependencies: es-errors "^1.3.0" @@ -3416,7 +3934,7 @@ safe-push-apply@^1.0.0: 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" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: call-bound "^1.0.2" @@ -3425,27 +3943,41 @@ safe-regex-test@^1.1.0: safer-buffer@^2.1.0: version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-5.0.1.tgz#dc2c86187d48ff2da756f0f7e96417ee03c414b1" + 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" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.3.1: version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.0.0, semver@^7.3.8, semver@^7.5.4, semver@^7.6.0: - version "7.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== 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" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -3457,7 +3989,7 @@ set-function-length@^1.2.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" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -3467,7 +3999,7 @@ set-function-name@^2.0.2: set-proto@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== dependencies: dunder-proto "^1.0.1" @@ -3476,36 +4008,36 @@ set-proto@^1.0.0: setimmediate@~1.0.4: version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 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" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 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" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 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" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 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" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shelljs@^0.9.2: version "0.9.2" - resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.9.2.tgz#a8ac724434520cd7ae24d52071e37a18ac2bb183" integrity sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw== dependencies: execa "^1.0.0" @@ -3515,7 +4047,7 @@ shelljs@^0.9.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" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: es-errors "^1.3.0" @@ -3523,7 +4055,7 @@ side-channel-list@^1.0.0: 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" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: call-bound "^1.0.2" @@ -3533,7 +4065,7 @@ side-channel-map@^1.0.1: 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" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== dependencies: call-bound "^1.0.2" @@ -3544,7 +4076,7 @@ side-channel-weakmap@^1.0.2: side-channel@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: es-errors "^1.3.0" @@ -3555,22 +4087,22 @@ side-channel@^1.1.0: 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" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 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" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slice-ansi@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" @@ -3578,7 +4110,7 @@ slice-ansi@^5.0.0: slice-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== dependencies: ansi-styles "^6.2.1" @@ -3586,13 +4118,13 @@ slice-ansi@^7.1.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" + resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== sort-package-json@^2.10.1: - version "2.14.0" - resolved "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.14.0.tgz" - integrity sha512-xBRdmMjFB/KW3l51mP31dhlaiFmqkHLfWTfZAno8prb/wbDxwBPWFpxB16GZbiPbYr3wL41H8Kx22QIDWRe8WQ== + version "2.15.1" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.15.1.tgz#e5a035fad7da277b1947b9eecc93ea09c1c2526e" + integrity sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA== dependencies: detect-indent "^7.0.1" detect-newline "^4.0.0" @@ -3605,12 +4137,12 @@ sort-package-json@^2.10.1: split2@^4.0.0: version "4.2.0" - resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" 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" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-15.1.0.tgz#717409a002edd13cd57f6554fdd3464d9a22a774" integrity sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw== dependencies: get-stdin "^8.0.0" @@ -3620,7 +4152,7 @@ standard-engine@^15.1.0: standard@^17.1.2: version "17.1.2" - resolved "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz" + resolved "https://registry.yarnpkg.com/standard/-/standard-17.1.2.tgz#fc7e365e401569fee2a840d2a3862d218ef78092" integrity sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA== dependencies: eslint "^8.41.0" @@ -3635,15 +4167,23 @@ standard@^17.1.2: stdin-discarder@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" 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.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + streamx@^2.15.0: - version "2.22.0" - resolved "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz" - integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== + version "2.22.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.1.tgz#c97cbb0ce18da4f4db5a971dc9ab68ff5dc7f5a5" + integrity sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA== dependencies: fast-fifo "^1.3.2" text-decoder "^1.1.0" @@ -3652,12 +4192,12 @@ streamx@^2.15.0: string-argv@^0.3.2: version "0.3.2" - resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" 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" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -3666,7 +4206,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string-width@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-6.1.0.tgz#96488d6ed23f9ad5d82d13522af9e4c4c3fd7518" integrity sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ== dependencies: eastasianwidth "^0.2.0" @@ -3675,7 +4215,7 @@ string-width@^6.1.0: string-width@^7.0.0: version "7.2.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: emoji-regex "^10.3.0" @@ -3684,7 +4224,7 @@ string-width@^7.0.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" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== dependencies: call-bind "^1.0.8" @@ -3703,7 +4243,7 @@ string.prototype.matchall@^4.0.12: 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" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== dependencies: define-properties "^1.1.3" @@ -3711,7 +4251,7 @@ string.prototype.repeat@^1.0.0: 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" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== dependencies: call-bind "^1.0.8" @@ -3724,7 +4264,7 @@ string.prototype.trim@^1.2.10: 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" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: call-bind "^1.0.8" @@ -3734,7 +4274,7 @@ string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: 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" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" @@ -3743,72 +4283,77 @@ string.prototype.trimstart@^1.0.8: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 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" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.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" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 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" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" 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" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 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" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 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" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" 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" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 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" + resolved "https://registry.yarnpkg.com/structured-headers/-/structured-headers-1.0.1.tgz#1821e434e0fe45bdd78f07c779b16519ab520415" integrity sha512-QYBxdBtA4Tl5rFPuqmbmdrS9kbtren74RTJTcs0VSQNVV5iRhJD4QlYTLD0+81SBwUQctjEQzjTRI3WG4DzICA== +structured-headers@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/structured-headers/-/structured-headers-2.0.1.tgz#fc06476faaf76d744fbae198381e87179e47f2a8" + 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" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 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" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 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" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== dependencies: b4a "^1.6.4" @@ -3817,54 +4362,71 @@ tar-stream@^3.1.7: text-decoder@^1.1.0: version "1.2.3" - resolved "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" 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" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" 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" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 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" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 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.yarnpkg.com/tinyexec/-/tinyexec-1.0.1.tgz#70c31ab7abbb4aea0a24f55d120e5990bfa1e0b1" + integrity sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw== tinyglobby@^0.2.9: - version "0.2.10" - resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz" - integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + version "0.2.14" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" + integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== dependencies: - fdir "^6.4.2" + fdir "^6.4.4" picomatch "^4.0.2" +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + 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" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + 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" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" 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" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" @@ -3872,26 +4434,31 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + 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" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 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" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 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" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" 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" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: call-bound "^1.0.3" @@ -3900,7 +4467,7 @@ typed-array-buffer@^1.0.3: 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" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: call-bind "^1.0.8" @@ -3911,7 +4478,7 @@ typed-array-byte-length@^1.0.3: 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" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: available-typed-arrays "^1.0.7" @@ -3924,7 +4491,7 @@ typed-array-byte-offset@^1.0.4: 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" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" @@ -3936,7 +4503,7 @@ typed-array-length@^1.0.7: unbox-primitive@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: call-bound "^1.0.3" @@ -3944,26 +4511,24 @@ unbox-primitive@^1.1.0: has-symbols "^1.1.0" which-boxed-primitive "^1.1.1" -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== +undici-types@~7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.8.0.tgz#de00b85b710c54122e44fbfd911f8d70174cd294" + integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== -undici@^5.19.1: - version "5.28.5" - resolved "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz" - integrity sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA== - dependencies: - "@fastify/busboy" "^2.0.0" +undici@^7.8.0: + version "7.10.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-7.10.0.tgz#8ae17a976acc6593b13c9ff3342840bea9b24670" + integrity sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw== unicorn-magic@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" 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" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.14.tgz#d2b33c977714da0fbc0f82774ad35470a7c962b1" integrity sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g== dependencies: big-integer "^1.6.17" @@ -3979,52 +4544,52 @@ unzipper@^0.10.11: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 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" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@8.3.2: version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 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" + resolved "https://registry.yarnpkg.com/version-guard/-/version-guard-1.1.3.tgz#5a39b9d195f94cb10d469553aa9951e1917da5d2" integrity sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ== -warp-arbundles@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/warp-arbundles/-/warp-arbundles-1.0.4.tgz" - integrity sha512-KeRac/EJ7VOK+v5+PSMh2SrzpCKOAFnJICLlqZWt6qPkDCzVwcrNE5wFxOlEk5U170ewMDAB3e86UHUblevXpw== - dependencies: - arweave "^1.13.7" - base64url "^3.0.1" - buffer "^6.0.3" - warp-isomorphic "^1.0.7" - -warp-isomorphic@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/warp-isomorphic/-/warp-isomorphic-1.0.7.tgz" - integrity sha512-fXHbUXwdYqPm9fRPz8mjv5ndPco09aMQuTe4kXfymzOq8V6F3DLsg9cIafxvjms9/mc6eijzkLBJ63yjEENEjA== - dependencies: - buffer "^6.0.3" - undici "^5.19.1" +vlq@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-2.0.4.tgz#6057b85729245b9829e3cc7755f95b228d4fe041" + 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" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + 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" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: is-bigint "^1.1.0" @@ -4035,7 +4600,7 @@ which-boxed-primitive@^1.1.0, which-boxed-primitive@^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" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== dependencies: call-bound "^1.0.2" @@ -4054,7 +4619,7 @@ which-builtin-type@^1.2.1: which-collection@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3" @@ -4062,40 +4627,41 @@ which-collection@^1.0.2: is-weakmap "^2.0.2" is-weakset "^2.0.3" -which-typed-array@^1.1.16, which-typed-array@^1.1.18: - version "1.1.18" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz" - integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA== +which-typed-array@^1.1.16, which-typed-array@^1.1.19: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== dependencies: available-typed-arrays "^1.0.7" call-bind "^1.0.8" - call-bound "^1.0.3" - for-each "^0.3.3" + 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" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 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" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 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" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 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" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -4104,7 +4670,7 @@ wrap-ansi@^7.0.0: wrap-ansi@^9.0.0: version "9.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== dependencies: ansi-styles "^6.2.1" @@ -4113,32 +4679,37 @@ wrap-ansi@^9.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + 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" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yaml@^2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz" - integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== + version "2.8.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6" + integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.0.0, yargs@^17.7.2: version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -4151,15 +4722,15 @@ yargs@^17.0.0, yargs@^17.7.2: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yocto-queue@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz" - integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== + version "1.2.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.1.tgz#36d7c4739f775b3cbc28e6136e21aa057adec418" + integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg== zod@^3.23.5, zod@^3.24.1: - version "3.24.1" - resolved "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz" - integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A== + version "3.25.64" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.64.tgz#57b5c7e76dd64e447f7e710285fcdb396b32f803" + integrity sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g==