├── .github └── workflows │ └── node.yml ├── .gitignore ├── LICENSE ├── README.md ├── index.js ├── lib ├── relay-pool.js └── relay.js ├── package-lock.json ├── package.json └── test └── test.js /.github/workflows/node.yml: -------------------------------------------------------------------------------- 1 | name: Node.js CI 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | strategy: 15 | matrix: 16 | node-version: [10.x, 12.x, 14.x, 15.x] 17 | 18 | steps: 19 | - uses: actions/checkout@v3 20 | - name: Use Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v3 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | - run: npm ci 25 | - run: npm run build --if-present 26 | - run: npm test 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | .build-result 107 | .buildcmd 108 | tags 109 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Melvin Carvalho 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # nostr 3 | 4 | nostr nodejs library 5 | 6 | ## Example 7 | 8 | ```js 9 | const {RelayPool} = require('nostr') 10 | 11 | const jb55 = "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245" 12 | const damus = "wss://relay.damus.io" 13 | const scsi = "wss://nostr-pub.wellorder.net" 14 | const relays = [damus, scsi] 15 | 16 | const pool = RelayPool(relays) 17 | 18 | pool.on('open', relay => { 19 | relay.subscribe("subid", {limit: 2, kinds:[1], authors: [jb55]}) 20 | }); 21 | 22 | pool.on('eose', relay => { 23 | relay.close() 24 | }); 25 | 26 | pool.on('event', (relay, sub_id, ev) => { 27 | console.log(ev) 28 | }); 29 | ``` 30 | 31 | ## API 32 | 33 | ### RelayPool(urls, options) 34 | 35 | Connect to a pool of relays. You should use this instead of `Relay` directly. 36 | 37 | options: `{reconnect: true|false}`, defaults to `{reconnect: true}` 38 | 39 | ``` 40 | const relays = [`wss://relay1.com`, `wss://relay2.com`] 41 | const pool = RelayPool(relays, {reconnect: false}) 42 | ``` 43 | 44 | ### Relay(url, options) 45 | 46 | Connect to a relay 47 | 48 | options: `{reconnect: true|false}`, defaults to `{reconnect: true}` 49 | 50 | ``` 51 | const relay = Relay(`wss://relay.damus.io`, {reconnect: false}) 52 | ``` 53 | 54 | ### async calculateId(event) 55 | 56 | Calculate an id from an event 57 | 58 | ### async signId(privkey, id) 59 | 60 | Create a signature for an id 61 | 62 | ### async verifyEvent(event) 63 | 64 | Verify an event 65 | 66 | Returns: true if valid signature, false otherwise 67 | 68 | ### decryptDm(privkey, event) 69 | 70 | Decrypt a direct message 71 | 72 | Returns: decrypted content 73 | 74 | ### encryptDM(privkey, pubkey, msg) 75 | 76 | Encrypt a direct message 77 | 78 | Returns: encrypted content 79 | 80 | ### getPublicKey(privkey) 81 | 82 | Get a public key from a privkey 83 | 84 | ### async createDelegation(privkey, publisherPubkey, conditions) 85 | 86 | Create a delegation. This gives `publisherPubkey` permission to create events 87 | on the `privkey`s behalf subject to `conditions` 88 | 89 | `privkey`: authorizer private key 90 | 91 | `publisherKey`: delegate/publisher pubkey 92 | 93 | `conditions`: `&` separated set of event creation permissions that the delegate 94 | is required to adhere to when creating events 95 | 96 | eg: `created_at>1669303873&created_at<1674574279&kind=1,7` 97 | 98 | Returns: 99 | 100 | ```js 101 | {pubkey, publisherPubkey, conditions, token} 102 | ``` 103 | 104 | Where `token` is the delegation token, which is a signature from the authorizer 105 | of the delegation `nostr:delegation:publisher_key:`. 106 | 107 | ### async createDelegationEvent(publisherPrivkey, event, delegation) 108 | 109 | Create a delegated event from a `delegation`. This is an event posted on behalf 110 | of `delegation.pubkey` subject to `delegation.conditions`. 111 | 112 | `delegation`: a delegation in the form returned by `createDelegation` 113 | 114 | `publisherPrivkey`: the private key of the delegate, the entity posting on behalf of `delegation.pubkey` 115 | 116 | `event`: The event to post as a delegate. The event `pubkey` will be overridden 117 | by the `publisherPubkey`. The delegation tag will be upserted into the tag 118 | list. 119 | 120 | 121 | ### async signDelegationToken(privkey, unsignedToken) 122 | 123 | Sign a delegation string in the form `nostr:delegation:...`. 124 | 125 | Returns: a signature string called the delegation token. 126 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 2 | const Relay = require('./lib/relay') 3 | const RelayPool = require('./lib/relay-pool') 4 | const noble = require('noble-secp256k1') 5 | const crypto = require('crypto') 6 | 7 | async function signId(privkey, id) { 8 | return await noble.schnorr.sign(id, privkey) 9 | } 10 | 11 | async function verifyEvent(event) { 12 | return await noble.schnorr.verify(event.sig, event.id, event.pubkey) 13 | } 14 | 15 | function utf8_encode(txt) { 16 | if (typeof TextEncoder !== 'undefined' && TextEncoder) { 17 | const encoder = new TextEncoder() 18 | return encoder.encode(txt) 19 | } else { 20 | const util = require('util'); 21 | const encoder = new util.TextEncoder('utf-8'); 22 | return encoder.encode(txt) 23 | } 24 | } 25 | 26 | async function calculateId(ev) { 27 | const commit = eventCommitment(ev) 28 | const sha256 = noble.utils.sha256; 29 | const buf = utf8_encode(commit); 30 | return hexEncode(await sha256(buf)) 31 | } 32 | 33 | function eventCommitment(ev) { 34 | const {pubkey,created_at,kind,tags,content} = ev 35 | return JSON.stringify([0, pubkey, created_at, kind, tags, content]) 36 | } 37 | 38 | function delegationCommitment(pk, conditions) { 39 | return `nostr:delegation:${pk}:${conditions}` 40 | } 41 | 42 | async function signDelegationToken(privkey, unsigned_token) 43 | { 44 | const hash = hexEncode(await noble.utils.sha256(unsigned_token)) 45 | return (await signId(privkey, hash)) 46 | } 47 | 48 | async function createDelegation(privkey, publisherPubkey, conditions) { 49 | const pubkey = getPublicKey(privkey) 50 | const unsigned_token = delegationCommitment(publisherPubkey, conditions) 51 | const token = await signDelegationToken(privkey, unsigned_token) 52 | return {pubkey, publisherPubkey, conditions, token} 53 | } 54 | 55 | function createDelegationTag(delegation) { 56 | const { pubkey, conditions, token } = delegation 57 | return ["delegation", pubkey, conditions, token] 58 | } 59 | 60 | function upsert_delegation_tag(tags, delegation) 61 | { 62 | let found = false 63 | for (const tag of tags) { 64 | if (tag.length >= 4 && tag[0] === "delegation") { 65 | tag[1] = delegation.pubkey 66 | tag[2] = delegation.conditions 67 | tag[3] = delegation.token 68 | return 69 | } 70 | } 71 | tags.push(createDelegationTag(delegation)) 72 | } 73 | 74 | async function createDelegationEvent(publisher_privkey, ev, delegation) { 75 | let tags = ev.tags || [] 76 | 77 | upsert_delegation_tag(tags, delegation) 78 | 79 | ev.tags = tags 80 | ev.pubkey = delegation.publisherPubkey 81 | ev.id = await calculateId(ev) 82 | ev.sig = await signId(publisher_privkey, ev.id) 83 | return ev 84 | } 85 | 86 | function hexChar(val) { 87 | if (val < 10) 88 | return String.fromCharCode(48 + val) 89 | if (val < 16) 90 | return String.fromCharCode(97 + val - 10) 91 | } 92 | 93 | function hexEncode(buf) { 94 | let str = "" 95 | for (let i = 0; i < buf.length; i++) { 96 | const c = buf[i] 97 | str += hexChar(c >> 4) 98 | str += hexChar(c & 0xF) 99 | } 100 | return str 101 | } 102 | 103 | function base64_decode(str) 104 | { 105 | if (typeof Buffer !== 'undefined' && Buffer) { 106 | return Buffer.from(str, 'base64') 107 | } else if (typeof atob !== 'undefined' && atob) { 108 | return atob(str) 109 | } 110 | throw new Error("no base64 implementation") 111 | } 112 | 113 | 114 | function encryptDm(privkey, to, msg) { 115 | const shared_point = noble.getSharedSecret(privkey, '02' + to) 116 | const shared_x = shared_point.substr(2, 64) 117 | const iv = crypto.randomBytes(16); 118 | const cipher = crypto.createCipheriv( 119 | 'aes-256-cbc', 120 | Buffer.from(shared_x, 'hex'), 121 | iv 122 | ) 123 | 124 | let encrypted = cipher.update(msg, 'utf8', 'base64'); 125 | encrypted += cipher.final('base64'); 126 | 127 | return encrypted + "?iv=" + iv.toString('base64') 128 | } 129 | 130 | function decryptDm(privkey, ev) { 131 | let [enc, iv] = ev.content.split("?") 132 | if (!iv || !enc) 133 | return 134 | iv = iv.slice(3) 135 | iv = base64_decode(iv) 136 | 137 | const shared_point = noble.getSharedSecret(privkey, '02' + ev.pubkey) 138 | const shared_x = shared_point.substr(2, 64) 139 | const decipher = crypto.createDecipheriv( 140 | 'aes-256-cbc', 141 | Buffer.from(shared_x, 'hex'), 142 | iv 143 | ) 144 | 145 | let decrypted = decipher.update(enc, "base64", "utf8") 146 | decrypted += decipher.final("utf8") 147 | 148 | return decrypted 149 | } 150 | 151 | 152 | function getPublicKey(privkey) { 153 | return noble.schnorr.getPublicKey(privkey) 154 | } 155 | 156 | module.exports = { 157 | Relay, 158 | RelayPool, 159 | signId, 160 | verifyEvent, 161 | calculateId, 162 | getPublicKey, 163 | decryptDm, 164 | encryptDm, 165 | delegationCommitment, 166 | createDelegationTag, 167 | createDelegationEvent, 168 | createDelegation, 169 | signDelegationToken, 170 | eventCommitment 171 | } 172 | 173 | -------------------------------------------------------------------------------- /lib/relay-pool.js: -------------------------------------------------------------------------------- 1 | 2 | const Relay = require('./relay') 3 | 4 | function RelayPool(relays, opts) 5 | { 6 | if (!(this instanceof RelayPool)) 7 | return new RelayPool(relays, opts) 8 | 9 | this.onfn = {} 10 | this.relays = [] 11 | this.opts = opts 12 | 13 | for (const relay of relays) { 14 | this.add(relay) 15 | } 16 | 17 | return this 18 | } 19 | 20 | RelayPool.prototype.close = function relayPoolClose() { 21 | for (const relay of this.relays) { 22 | relay.close() 23 | } 24 | } 25 | 26 | RelayPool.prototype.on = function relayPoolOn(method, fn) { 27 | for (const relay of this.relays) { 28 | this.onfn[method] = fn 29 | relay.onfn[method] = fn.bind(null, relay) 30 | } 31 | return this 32 | } 33 | 34 | RelayPool.prototype.has = function relayPoolHas(relayUrl) { 35 | for (const relay of this.relays) { 36 | if (relay.url === relayUrl) 37 | return true 38 | } 39 | 40 | return false 41 | } 42 | 43 | RelayPool.prototype.send = function relayPoolSend(payload, relay_ids) { 44 | const relays = relay_ids ? this.find_relays(relay_ids) : this.relays 45 | for (const relay of relays) { 46 | relay.send(payload) 47 | } 48 | } 49 | 50 | RelayPool.prototype.setupHandlers = function relayPoolSetupHandlers() 51 | { 52 | // setup its message handlers with the ones we have already 53 | const keys = Object.keys(this.onfn) 54 | for (const handler of keys) { 55 | for (const relay of this.relays) { 56 | relay.onfn[handler] = this.onfn[handler].bind(null, relay) 57 | } 58 | } 59 | } 60 | 61 | RelayPool.prototype.remove = function relayPoolRemove(url) { 62 | let i = 0 63 | 64 | for (const relay of this.relays) { 65 | if (relay.url === url) { 66 | relay.ws && relay.ws.close() 67 | this.relays = this.relays.splice(i, 1) 68 | return true 69 | } 70 | 71 | i += 1 72 | } 73 | 74 | return false 75 | } 76 | 77 | RelayPool.prototype.subscribe = function relayPoolSubscribe(sub_id, filters, relay_ids) { 78 | const relays = relay_ids ? this.find_relays(relay_ids) : this.relays 79 | for (const relay of relays) { 80 | relay.subscribe(sub_id, filters) 81 | } 82 | } 83 | 84 | RelayPool.prototype.unsubscribe = function relayPoolUnsubscibe(sub_id, relay_ids) { 85 | const relays = relay_ids ? this.find_relays(relay_ids) : this.relays 86 | for (const relay of relays) { 87 | relay.unsubscribe(sub_id) 88 | } 89 | } 90 | 91 | 92 | RelayPool.prototype.add = function relayPoolAdd(relay) { 93 | if (relay instanceof Relay) { 94 | if (this.has(relay.url)) 95 | return false 96 | 97 | this.relays.push(relay) 98 | this.setupHandlers() 99 | return true 100 | } 101 | 102 | if (this.has(relay)) 103 | return false 104 | 105 | const r = Relay(relay, this.opts) 106 | this.relays.push(r) 107 | this.setupHandlers() 108 | return true 109 | } 110 | 111 | RelayPool.prototype.find_relays = function relayPoolFindRelays(relay_ids) { 112 | if (relay_ids instanceof Relay) 113 | return [relay_ids] 114 | 115 | if (relay_ids.length === 0) 116 | return [] 117 | 118 | if (!relay_ids[0]) 119 | throw new Error("what!?") 120 | 121 | if (relay_ids[0] instanceof Relay) 122 | return relay_ids 123 | 124 | return this.relays.reduce((acc, relay) => { 125 | if (relay_ids.some((rid) => relay.url === rid)) 126 | acc.push(relay) 127 | return acc 128 | }, []) 129 | } 130 | 131 | module.exports = RelayPool 132 | -------------------------------------------------------------------------------- /lib/relay.js: -------------------------------------------------------------------------------- 1 | const WS = typeof WebSocket !== 'undefined' ? WebSocket : require('ws') 2 | 3 | Relay.prototype.wait_connected = async function relay_wait_connected(data) { 4 | let retry = 1000 5 | while (true) { 6 | if (this.ws.readyState !== 1) { 7 | await sleep(retry) 8 | retry *= 1.5 9 | } 10 | else { 11 | return 12 | } 13 | } 14 | } 15 | 16 | 17 | function Relay(relay, opts={}) 18 | { 19 | if (!(this instanceof Relay)) 20 | return new Relay(relay, opts) 21 | 22 | this.url = relay 23 | this.opts = opts 24 | 25 | if (opts.reconnect == null) 26 | opts.reconnect = true 27 | 28 | const me = this 29 | me.onfn = {} 30 | 31 | init_websocket(me) 32 | .catch(e => { 33 | if (me.onfn.error) 34 | me.onfn.error(e) 35 | }) 36 | 37 | return this 38 | } 39 | 40 | function init_websocket(me) { 41 | return new Promise((resolve, reject) => { 42 | const ws = me.ws = new WS(me.url); 43 | 44 | let resolved = false 45 | ws.onmessage = (m) => { 46 | handle_nostr_message(me, m) 47 | if (me.onfn.message) 48 | me.onfn.message(m) 49 | } 50 | ws.onclose = (e) => { 51 | if (me.onfn.close) 52 | me.onfn.close(e) 53 | if (me.reconnecting) 54 | return reject(new Error("close during reconnect")) 55 | if (!me.manualClose && me.opts.reconnect) 56 | reconnect(me) 57 | } 58 | ws.onerror = (e) => { 59 | if (me.onfn.error) 60 | me.onfn.error(e) 61 | if (me.reconnecting) 62 | return reject(new Error("error during reconnect")) 63 | if (me.opts.reconnect) 64 | reconnect(me) 65 | } 66 | ws.onopen = (e) => { 67 | if (me.onfn.open) 68 | me.onfn.open(e) 69 | 70 | if (resolved) return 71 | 72 | resolved = true 73 | resolve(me) 74 | } 75 | }); 76 | } 77 | 78 | function sleep(ms) { 79 | return new Promise(resolve => setTimeout(resolve, ms)); 80 | } 81 | 82 | async function reconnect(me) 83 | { 84 | const reconnecting = true 85 | let n = 100 86 | try { 87 | me.reconnecting = true 88 | await init_websocket(me) 89 | me.reconnecting = false 90 | } catch { 91 | //console.error(`error thrown during reconnect... trying again in ${n} ms`) 92 | await sleep(n) 93 | n *= 1.5 94 | } 95 | } 96 | 97 | Relay.prototype.on = function relayOn(method, fn) { 98 | this.onfn[method] = fn 99 | return this 100 | } 101 | 102 | Relay.prototype.close = function relayClose() { 103 | if (this.ws) { 104 | this.manualClose = true 105 | this.ws.close() 106 | } 107 | } 108 | 109 | Relay.prototype.subscribe = function relay_subscribe(sub_id, filters) { 110 | if (Array.isArray(filters)) 111 | this.send(["REQ", sub_id, ...filters]) 112 | else 113 | this.send(["REQ", sub_id, filters]) 114 | } 115 | 116 | Relay.prototype.unsubscribe = function relay_unsubscribe(sub_id) { 117 | this.send(["CLOSE", sub_id]) 118 | } 119 | 120 | Relay.prototype.send = async function relay_send(data) { 121 | await this.wait_connected() 122 | this.ws.send(JSON.stringify(data)) 123 | } 124 | 125 | function handle_nostr_message(relay, msg) 126 | { 127 | let data 128 | try { 129 | data = JSON.parse(msg.data) 130 | } catch (e) { 131 | console.error("handle_nostr_message", e) 132 | return 133 | } 134 | if (data.length >= 2) { 135 | switch (data[0]) { 136 | case "EVENT": 137 | if (data.length < 3) 138 | return 139 | return relay.onfn.event && relay.onfn.event(data[1], data[2]) 140 | case "EOSE": 141 | return relay.onfn.eose && relay.onfn.eose(data[1]) 142 | case "NOTICE": 143 | return relay.onfn.notice && relay.onfn.notice(...data.slice(1)) 144 | case "OK": 145 | return relay.onfn.ok && relay.onfn.ok(...data.slice(1)) 146 | } 147 | } 148 | } 149 | 150 | module.exports = Relay 151 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nostr", 3 | "version": "0.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "nostr", 9 | "version": "0.1.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "noble-secp256k1": "^1.2.14", 13 | "ws": "^8.8.1" 14 | }, 15 | "devDependencies": { 16 | "tape": "^5.6.0" 17 | } 18 | }, 19 | "node_modules/array.prototype.every": { 20 | "version": "1.1.3", 21 | "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.3.tgz", 22 | "integrity": "sha512-vWnriJI//SOMOWtXbU/VXhJ/InfnNHPF6BLKn5WfY8xXy+NWql0fUy20GO3sdqBhCAO+qw8S/E5nJiZX+QFdCA==", 23 | "dev": true, 24 | "dependencies": { 25 | "call-bind": "^1.0.2", 26 | "define-properties": "^1.1.3", 27 | "es-abstract": "^1.19.0", 28 | "is-string": "^1.0.7" 29 | }, 30 | "engines": { 31 | "node": ">= 0.4" 32 | }, 33 | "funding": { 34 | "url": "https://github.com/sponsors/ljharb" 35 | } 36 | }, 37 | "node_modules/available-typed-arrays": { 38 | "version": "1.0.5", 39 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 40 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 41 | "dev": true, 42 | "engines": { 43 | "node": ">= 0.4" 44 | }, 45 | "funding": { 46 | "url": "https://github.com/sponsors/ljharb" 47 | } 48 | }, 49 | "node_modules/balanced-match": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 52 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 53 | "dev": true 54 | }, 55 | "node_modules/brace-expansion": { 56 | "version": "1.1.11", 57 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 58 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 59 | "dev": true, 60 | "dependencies": { 61 | "balanced-match": "^1.0.0", 62 | "concat-map": "0.0.1" 63 | } 64 | }, 65 | "node_modules/call-bind": { 66 | "version": "1.0.2", 67 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 68 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 69 | "dev": true, 70 | "dependencies": { 71 | "function-bind": "^1.1.1", 72 | "get-intrinsic": "^1.0.2" 73 | }, 74 | "funding": { 75 | "url": "https://github.com/sponsors/ljharb" 76 | } 77 | }, 78 | "node_modules/concat-map": { 79 | "version": "0.0.1", 80 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 81 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 82 | "dev": true 83 | }, 84 | "node_modules/deep-equal": { 85 | "version": "2.0.5", 86 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", 87 | "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", 88 | "dev": true, 89 | "dependencies": { 90 | "call-bind": "^1.0.0", 91 | "es-get-iterator": "^1.1.1", 92 | "get-intrinsic": "^1.0.1", 93 | "is-arguments": "^1.0.4", 94 | "is-date-object": "^1.0.2", 95 | "is-regex": "^1.1.1", 96 | "isarray": "^2.0.5", 97 | "object-is": "^1.1.4", 98 | "object-keys": "^1.1.1", 99 | "object.assign": "^4.1.2", 100 | "regexp.prototype.flags": "^1.3.0", 101 | "side-channel": "^1.0.3", 102 | "which-boxed-primitive": "^1.0.1", 103 | "which-collection": "^1.0.1", 104 | "which-typed-array": "^1.1.2" 105 | }, 106 | "funding": { 107 | "url": "https://github.com/sponsors/ljharb" 108 | } 109 | }, 110 | "node_modules/define-properties": { 111 | "version": "1.1.4", 112 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", 113 | "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", 114 | "dev": true, 115 | "dependencies": { 116 | "has-property-descriptors": "^1.0.0", 117 | "object-keys": "^1.1.1" 118 | }, 119 | "engines": { 120 | "node": ">= 0.4" 121 | }, 122 | "funding": { 123 | "url": "https://github.com/sponsors/ljharb" 124 | } 125 | }, 126 | "node_modules/defined": { 127 | "version": "1.0.0", 128 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 129 | "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", 130 | "dev": true 131 | }, 132 | "node_modules/dotignore": { 133 | "version": "0.1.2", 134 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 135 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 136 | "dev": true, 137 | "dependencies": { 138 | "minimatch": "^3.0.4" 139 | }, 140 | "bin": { 141 | "ignored": "bin/ignored" 142 | } 143 | }, 144 | "node_modules/es-abstract": { 145 | "version": "1.20.1", 146 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", 147 | "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", 148 | "dev": true, 149 | "dependencies": { 150 | "call-bind": "^1.0.2", 151 | "es-to-primitive": "^1.2.1", 152 | "function-bind": "^1.1.1", 153 | "function.prototype.name": "^1.1.5", 154 | "get-intrinsic": "^1.1.1", 155 | "get-symbol-description": "^1.0.0", 156 | "has": "^1.0.3", 157 | "has-property-descriptors": "^1.0.0", 158 | "has-symbols": "^1.0.3", 159 | "internal-slot": "^1.0.3", 160 | "is-callable": "^1.2.4", 161 | "is-negative-zero": "^2.0.2", 162 | "is-regex": "^1.1.4", 163 | "is-shared-array-buffer": "^1.0.2", 164 | "is-string": "^1.0.7", 165 | "is-weakref": "^1.0.2", 166 | "object-inspect": "^1.12.0", 167 | "object-keys": "^1.1.1", 168 | "object.assign": "^4.1.2", 169 | "regexp.prototype.flags": "^1.4.3", 170 | "string.prototype.trimend": "^1.0.5", 171 | "string.prototype.trimstart": "^1.0.5", 172 | "unbox-primitive": "^1.0.2" 173 | }, 174 | "engines": { 175 | "node": ">= 0.4" 176 | }, 177 | "funding": { 178 | "url": "https://github.com/sponsors/ljharb" 179 | } 180 | }, 181 | "node_modules/es-get-iterator": { 182 | "version": "1.1.2", 183 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", 184 | "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", 185 | "dev": true, 186 | "dependencies": { 187 | "call-bind": "^1.0.2", 188 | "get-intrinsic": "^1.1.0", 189 | "has-symbols": "^1.0.1", 190 | "is-arguments": "^1.1.0", 191 | "is-map": "^2.0.2", 192 | "is-set": "^2.0.2", 193 | "is-string": "^1.0.5", 194 | "isarray": "^2.0.5" 195 | }, 196 | "funding": { 197 | "url": "https://github.com/sponsors/ljharb" 198 | } 199 | }, 200 | "node_modules/es-to-primitive": { 201 | "version": "1.2.1", 202 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 203 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 204 | "dev": true, 205 | "dependencies": { 206 | "is-callable": "^1.1.4", 207 | "is-date-object": "^1.0.1", 208 | "is-symbol": "^1.0.2" 209 | }, 210 | "engines": { 211 | "node": ">= 0.4" 212 | }, 213 | "funding": { 214 | "url": "https://github.com/sponsors/ljharb" 215 | } 216 | }, 217 | "node_modules/for-each": { 218 | "version": "0.3.3", 219 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 220 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 221 | "dev": true, 222 | "dependencies": { 223 | "is-callable": "^1.1.3" 224 | } 225 | }, 226 | "node_modules/fs.realpath": { 227 | "version": "1.0.0", 228 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 229 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 230 | "dev": true 231 | }, 232 | "node_modules/function-bind": { 233 | "version": "1.1.1", 234 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 235 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 236 | "dev": true 237 | }, 238 | "node_modules/function.prototype.name": { 239 | "version": "1.1.5", 240 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 241 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 242 | "dev": true, 243 | "dependencies": { 244 | "call-bind": "^1.0.2", 245 | "define-properties": "^1.1.3", 246 | "es-abstract": "^1.19.0", 247 | "functions-have-names": "^1.2.2" 248 | }, 249 | "engines": { 250 | "node": ">= 0.4" 251 | }, 252 | "funding": { 253 | "url": "https://github.com/sponsors/ljharb" 254 | } 255 | }, 256 | "node_modules/functions-have-names": { 257 | "version": "1.2.3", 258 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 259 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 260 | "dev": true, 261 | "funding": { 262 | "url": "https://github.com/sponsors/ljharb" 263 | } 264 | }, 265 | "node_modules/get-intrinsic": { 266 | "version": "1.1.2", 267 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 268 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 269 | "dev": true, 270 | "dependencies": { 271 | "function-bind": "^1.1.1", 272 | "has": "^1.0.3", 273 | "has-symbols": "^1.0.3" 274 | }, 275 | "funding": { 276 | "url": "https://github.com/sponsors/ljharb" 277 | } 278 | }, 279 | "node_modules/get-package-type": { 280 | "version": "0.1.0", 281 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 282 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 283 | "dev": true, 284 | "engines": { 285 | "node": ">=8.0.0" 286 | } 287 | }, 288 | "node_modules/get-symbol-description": { 289 | "version": "1.0.0", 290 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 291 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 292 | "dev": true, 293 | "dependencies": { 294 | "call-bind": "^1.0.2", 295 | "get-intrinsic": "^1.1.1" 296 | }, 297 | "engines": { 298 | "node": ">= 0.4" 299 | }, 300 | "funding": { 301 | "url": "https://github.com/sponsors/ljharb" 302 | } 303 | }, 304 | "node_modules/glob": { 305 | "version": "7.2.3", 306 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 307 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 308 | "dev": true, 309 | "dependencies": { 310 | "fs.realpath": "^1.0.0", 311 | "inflight": "^1.0.4", 312 | "inherits": "2", 313 | "minimatch": "^3.1.1", 314 | "once": "^1.3.0", 315 | "path-is-absolute": "^1.0.0" 316 | }, 317 | "engines": { 318 | "node": "*" 319 | }, 320 | "funding": { 321 | "url": "https://github.com/sponsors/isaacs" 322 | } 323 | }, 324 | "node_modules/has": { 325 | "version": "1.0.3", 326 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 327 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 328 | "dev": true, 329 | "dependencies": { 330 | "function-bind": "^1.1.1" 331 | }, 332 | "engines": { 333 | "node": ">= 0.4.0" 334 | } 335 | }, 336 | "node_modules/has-bigints": { 337 | "version": "1.0.2", 338 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 339 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 340 | "dev": true, 341 | "funding": { 342 | "url": "https://github.com/sponsors/ljharb" 343 | } 344 | }, 345 | "node_modules/has-dynamic-import": { 346 | "version": "2.0.1", 347 | "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz", 348 | "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==", 349 | "dev": true, 350 | "dependencies": { 351 | "call-bind": "^1.0.2", 352 | "get-intrinsic": "^1.1.1" 353 | }, 354 | "funding": { 355 | "url": "https://github.com/sponsors/ljharb" 356 | } 357 | }, 358 | "node_modules/has-property-descriptors": { 359 | "version": "1.0.0", 360 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 361 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 362 | "dev": true, 363 | "dependencies": { 364 | "get-intrinsic": "^1.1.1" 365 | }, 366 | "funding": { 367 | "url": "https://github.com/sponsors/ljharb" 368 | } 369 | }, 370 | "node_modules/has-symbols": { 371 | "version": "1.0.3", 372 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 373 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 374 | "dev": true, 375 | "engines": { 376 | "node": ">= 0.4" 377 | }, 378 | "funding": { 379 | "url": "https://github.com/sponsors/ljharb" 380 | } 381 | }, 382 | "node_modules/has-tostringtag": { 383 | "version": "1.0.0", 384 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 385 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 386 | "dev": true, 387 | "dependencies": { 388 | "has-symbols": "^1.0.2" 389 | }, 390 | "engines": { 391 | "node": ">= 0.4" 392 | }, 393 | "funding": { 394 | "url": "https://github.com/sponsors/ljharb" 395 | } 396 | }, 397 | "node_modules/inflight": { 398 | "version": "1.0.6", 399 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 400 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 401 | "dev": true, 402 | "dependencies": { 403 | "once": "^1.3.0", 404 | "wrappy": "1" 405 | } 406 | }, 407 | "node_modules/inherits": { 408 | "version": "2.0.4", 409 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 410 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 411 | "dev": true 412 | }, 413 | "node_modules/internal-slot": { 414 | "version": "1.0.3", 415 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", 416 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", 417 | "dev": true, 418 | "dependencies": { 419 | "get-intrinsic": "^1.1.0", 420 | "has": "^1.0.3", 421 | "side-channel": "^1.0.4" 422 | }, 423 | "engines": { 424 | "node": ">= 0.4" 425 | } 426 | }, 427 | "node_modules/is-arguments": { 428 | "version": "1.1.1", 429 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 430 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 431 | "dev": true, 432 | "dependencies": { 433 | "call-bind": "^1.0.2", 434 | "has-tostringtag": "^1.0.0" 435 | }, 436 | "engines": { 437 | "node": ">= 0.4" 438 | }, 439 | "funding": { 440 | "url": "https://github.com/sponsors/ljharb" 441 | } 442 | }, 443 | "node_modules/is-bigint": { 444 | "version": "1.0.4", 445 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 446 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 447 | "dev": true, 448 | "dependencies": { 449 | "has-bigints": "^1.0.1" 450 | }, 451 | "funding": { 452 | "url": "https://github.com/sponsors/ljharb" 453 | } 454 | }, 455 | "node_modules/is-boolean-object": { 456 | "version": "1.1.2", 457 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 458 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 459 | "dev": true, 460 | "dependencies": { 461 | "call-bind": "^1.0.2", 462 | "has-tostringtag": "^1.0.0" 463 | }, 464 | "engines": { 465 | "node": ">= 0.4" 466 | }, 467 | "funding": { 468 | "url": "https://github.com/sponsors/ljharb" 469 | } 470 | }, 471 | "node_modules/is-callable": { 472 | "version": "1.2.4", 473 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", 474 | "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", 475 | "dev": true, 476 | "engines": { 477 | "node": ">= 0.4" 478 | }, 479 | "funding": { 480 | "url": "https://github.com/sponsors/ljharb" 481 | } 482 | }, 483 | "node_modules/is-core-module": { 484 | "version": "2.10.0", 485 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 486 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 487 | "dev": true, 488 | "dependencies": { 489 | "has": "^1.0.3" 490 | }, 491 | "funding": { 492 | "url": "https://github.com/sponsors/ljharb" 493 | } 494 | }, 495 | "node_modules/is-date-object": { 496 | "version": "1.0.5", 497 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 498 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 499 | "dev": true, 500 | "dependencies": { 501 | "has-tostringtag": "^1.0.0" 502 | }, 503 | "engines": { 504 | "node": ">= 0.4" 505 | }, 506 | "funding": { 507 | "url": "https://github.com/sponsors/ljharb" 508 | } 509 | }, 510 | "node_modules/is-map": { 511 | "version": "2.0.2", 512 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", 513 | "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", 514 | "dev": true, 515 | "funding": { 516 | "url": "https://github.com/sponsors/ljharb" 517 | } 518 | }, 519 | "node_modules/is-negative-zero": { 520 | "version": "2.0.2", 521 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 522 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 523 | "dev": true, 524 | "engines": { 525 | "node": ">= 0.4" 526 | }, 527 | "funding": { 528 | "url": "https://github.com/sponsors/ljharb" 529 | } 530 | }, 531 | "node_modules/is-number-object": { 532 | "version": "1.0.7", 533 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 534 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 535 | "dev": true, 536 | "dependencies": { 537 | "has-tostringtag": "^1.0.0" 538 | }, 539 | "engines": { 540 | "node": ">= 0.4" 541 | }, 542 | "funding": { 543 | "url": "https://github.com/sponsors/ljharb" 544 | } 545 | }, 546 | "node_modules/is-regex": { 547 | "version": "1.1.4", 548 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 549 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 550 | "dev": true, 551 | "dependencies": { 552 | "call-bind": "^1.0.2", 553 | "has-tostringtag": "^1.0.0" 554 | }, 555 | "engines": { 556 | "node": ">= 0.4" 557 | }, 558 | "funding": { 559 | "url": "https://github.com/sponsors/ljharb" 560 | } 561 | }, 562 | "node_modules/is-set": { 563 | "version": "2.0.2", 564 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", 565 | "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", 566 | "dev": true, 567 | "funding": { 568 | "url": "https://github.com/sponsors/ljharb" 569 | } 570 | }, 571 | "node_modules/is-shared-array-buffer": { 572 | "version": "1.0.2", 573 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 574 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 575 | "dev": true, 576 | "dependencies": { 577 | "call-bind": "^1.0.2" 578 | }, 579 | "funding": { 580 | "url": "https://github.com/sponsors/ljharb" 581 | } 582 | }, 583 | "node_modules/is-string": { 584 | "version": "1.0.7", 585 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 586 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 587 | "dev": true, 588 | "dependencies": { 589 | "has-tostringtag": "^1.0.0" 590 | }, 591 | "engines": { 592 | "node": ">= 0.4" 593 | }, 594 | "funding": { 595 | "url": "https://github.com/sponsors/ljharb" 596 | } 597 | }, 598 | "node_modules/is-symbol": { 599 | "version": "1.0.4", 600 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 601 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 602 | "dev": true, 603 | "dependencies": { 604 | "has-symbols": "^1.0.2" 605 | }, 606 | "engines": { 607 | "node": ">= 0.4" 608 | }, 609 | "funding": { 610 | "url": "https://github.com/sponsors/ljharb" 611 | } 612 | }, 613 | "node_modules/is-typed-array": { 614 | "version": "1.1.9", 615 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", 616 | "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", 617 | "dev": true, 618 | "dependencies": { 619 | "available-typed-arrays": "^1.0.5", 620 | "call-bind": "^1.0.2", 621 | "es-abstract": "^1.20.0", 622 | "for-each": "^0.3.3", 623 | "has-tostringtag": "^1.0.0" 624 | }, 625 | "engines": { 626 | "node": ">= 0.4" 627 | }, 628 | "funding": { 629 | "url": "https://github.com/sponsors/ljharb" 630 | } 631 | }, 632 | "node_modules/is-weakmap": { 633 | "version": "2.0.1", 634 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 635 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", 636 | "dev": true, 637 | "funding": { 638 | "url": "https://github.com/sponsors/ljharb" 639 | } 640 | }, 641 | "node_modules/is-weakref": { 642 | "version": "1.0.2", 643 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 644 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 645 | "dev": true, 646 | "dependencies": { 647 | "call-bind": "^1.0.2" 648 | }, 649 | "funding": { 650 | "url": "https://github.com/sponsors/ljharb" 651 | } 652 | }, 653 | "node_modules/is-weakset": { 654 | "version": "2.0.2", 655 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", 656 | "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", 657 | "dev": true, 658 | "dependencies": { 659 | "call-bind": "^1.0.2", 660 | "get-intrinsic": "^1.1.1" 661 | }, 662 | "funding": { 663 | "url": "https://github.com/sponsors/ljharb" 664 | } 665 | }, 666 | "node_modules/isarray": { 667 | "version": "2.0.5", 668 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 669 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 670 | "dev": true 671 | }, 672 | "node_modules/minimatch": { 673 | "version": "3.1.2", 674 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 675 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 676 | "dev": true, 677 | "dependencies": { 678 | "brace-expansion": "^1.1.7" 679 | }, 680 | "engines": { 681 | "node": "*" 682 | } 683 | }, 684 | "node_modules/minimist": { 685 | "version": "1.2.6", 686 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 687 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 688 | "dev": true 689 | }, 690 | "node_modules/noble-secp256k1": { 691 | "version": "1.2.14", 692 | "resolved": "https://registry.npmjs.org/noble-secp256k1/-/noble-secp256k1-1.2.14.tgz", 693 | "integrity": "sha512-GSCXyoZBUaaPwVWdYncMEmzlSUjF9J/YeEHpklYJCyg8wPuJP3NzDx0BkiwArzINkdX2HJHvUJhL6vVWPOQQcg==", 694 | "deprecated": "Switch to namespaced @noble/secp256k1 for security and feature updates" 695 | }, 696 | "node_modules/object-inspect": { 697 | "version": "1.12.2", 698 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 699 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 700 | "dev": true, 701 | "funding": { 702 | "url": "https://github.com/sponsors/ljharb" 703 | } 704 | }, 705 | "node_modules/object-is": { 706 | "version": "1.1.5", 707 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 708 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 709 | "dev": true, 710 | "dependencies": { 711 | "call-bind": "^1.0.2", 712 | "define-properties": "^1.1.3" 713 | }, 714 | "engines": { 715 | "node": ">= 0.4" 716 | }, 717 | "funding": { 718 | "url": "https://github.com/sponsors/ljharb" 719 | } 720 | }, 721 | "node_modules/object-keys": { 722 | "version": "1.1.1", 723 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 724 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 725 | "dev": true, 726 | "engines": { 727 | "node": ">= 0.4" 728 | } 729 | }, 730 | "node_modules/object.assign": { 731 | "version": "4.1.4", 732 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", 733 | "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", 734 | "dev": true, 735 | "dependencies": { 736 | "call-bind": "^1.0.2", 737 | "define-properties": "^1.1.4", 738 | "has-symbols": "^1.0.3", 739 | "object-keys": "^1.1.1" 740 | }, 741 | "engines": { 742 | "node": ">= 0.4" 743 | }, 744 | "funding": { 745 | "url": "https://github.com/sponsors/ljharb" 746 | } 747 | }, 748 | "node_modules/once": { 749 | "version": "1.4.0", 750 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 751 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 752 | "dev": true, 753 | "dependencies": { 754 | "wrappy": "1" 755 | } 756 | }, 757 | "node_modules/path-is-absolute": { 758 | "version": "1.0.1", 759 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 760 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 761 | "dev": true, 762 | "engines": { 763 | "node": ">=0.10.0" 764 | } 765 | }, 766 | "node_modules/path-parse": { 767 | "version": "1.0.7", 768 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 769 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 770 | "dev": true 771 | }, 772 | "node_modules/regexp.prototype.flags": { 773 | "version": "1.4.3", 774 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", 775 | "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", 776 | "dev": true, 777 | "dependencies": { 778 | "call-bind": "^1.0.2", 779 | "define-properties": "^1.1.3", 780 | "functions-have-names": "^1.2.2" 781 | }, 782 | "engines": { 783 | "node": ">= 0.4" 784 | }, 785 | "funding": { 786 | "url": "https://github.com/sponsors/ljharb" 787 | } 788 | }, 789 | "node_modules/resolve": { 790 | "version": "2.0.0-next.4", 791 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", 792 | "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", 793 | "dev": true, 794 | "dependencies": { 795 | "is-core-module": "^2.9.0", 796 | "path-parse": "^1.0.7", 797 | "supports-preserve-symlinks-flag": "^1.0.0" 798 | }, 799 | "bin": { 800 | "resolve": "bin/resolve" 801 | }, 802 | "funding": { 803 | "url": "https://github.com/sponsors/ljharb" 804 | } 805 | }, 806 | "node_modules/resumer": { 807 | "version": "0.0.0", 808 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 809 | "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", 810 | "dev": true, 811 | "dependencies": { 812 | "through": "~2.3.4" 813 | } 814 | }, 815 | "node_modules/side-channel": { 816 | "version": "1.0.4", 817 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 818 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 819 | "dev": true, 820 | "dependencies": { 821 | "call-bind": "^1.0.0", 822 | "get-intrinsic": "^1.0.2", 823 | "object-inspect": "^1.9.0" 824 | }, 825 | "funding": { 826 | "url": "https://github.com/sponsors/ljharb" 827 | } 828 | }, 829 | "node_modules/string.prototype.trim": { 830 | "version": "1.2.6", 831 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz", 832 | "integrity": "sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==", 833 | "dev": true, 834 | "dependencies": { 835 | "call-bind": "^1.0.2", 836 | "define-properties": "^1.1.4", 837 | "es-abstract": "^1.19.5" 838 | }, 839 | "engines": { 840 | "node": ">= 0.4" 841 | }, 842 | "funding": { 843 | "url": "https://github.com/sponsors/ljharb" 844 | } 845 | }, 846 | "node_modules/string.prototype.trimend": { 847 | "version": "1.0.5", 848 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", 849 | "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", 850 | "dev": true, 851 | "dependencies": { 852 | "call-bind": "^1.0.2", 853 | "define-properties": "^1.1.4", 854 | "es-abstract": "^1.19.5" 855 | }, 856 | "funding": { 857 | "url": "https://github.com/sponsors/ljharb" 858 | } 859 | }, 860 | "node_modules/string.prototype.trimstart": { 861 | "version": "1.0.5", 862 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", 863 | "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", 864 | "dev": true, 865 | "dependencies": { 866 | "call-bind": "^1.0.2", 867 | "define-properties": "^1.1.4", 868 | "es-abstract": "^1.19.5" 869 | }, 870 | "funding": { 871 | "url": "https://github.com/sponsors/ljharb" 872 | } 873 | }, 874 | "node_modules/supports-preserve-symlinks-flag": { 875 | "version": "1.0.0", 876 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 877 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 878 | "dev": true, 879 | "engines": { 880 | "node": ">= 0.4" 881 | }, 882 | "funding": { 883 | "url": "https://github.com/sponsors/ljharb" 884 | } 885 | }, 886 | "node_modules/tape": { 887 | "version": "5.6.0", 888 | "resolved": "https://registry.npmjs.org/tape/-/tape-5.6.0.tgz", 889 | "integrity": "sha512-LyM4uqbiTAqDgsHTY0r1LH66yE24P3SZaz5TL3mPUds0XCTFl/0AMUBrjgBjUclvbPTFB4IalXg0wFfbTuuu/Q==", 890 | "dev": true, 891 | "dependencies": { 892 | "array.prototype.every": "^1.1.3", 893 | "call-bind": "^1.0.2", 894 | "deep-equal": "^2.0.5", 895 | "defined": "^1.0.0", 896 | "dotignore": "^0.1.2", 897 | "for-each": "^0.3.3", 898 | "get-package-type": "^0.1.0", 899 | "glob": "^7.2.3", 900 | "has": "^1.0.3", 901 | "has-dynamic-import": "^2.0.1", 902 | "inherits": "^2.0.4", 903 | "is-regex": "^1.1.4", 904 | "minimist": "^1.2.6", 905 | "object-inspect": "^1.12.2", 906 | "object-is": "^1.1.5", 907 | "object-keys": "^1.1.1", 908 | "object.assign": "^4.1.3", 909 | "resolve": "^2.0.0-next.3", 910 | "resumer": "^0.0.0", 911 | "string.prototype.trim": "^1.2.6", 912 | "through": "^2.3.8" 913 | }, 914 | "bin": { 915 | "tape": "bin/tape" 916 | } 917 | }, 918 | "node_modules/through": { 919 | "version": "2.3.8", 920 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 921 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 922 | "dev": true 923 | }, 924 | "node_modules/unbox-primitive": { 925 | "version": "1.0.2", 926 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 927 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 928 | "dev": true, 929 | "dependencies": { 930 | "call-bind": "^1.0.2", 931 | "has-bigints": "^1.0.2", 932 | "has-symbols": "^1.0.3", 933 | "which-boxed-primitive": "^1.0.2" 934 | }, 935 | "funding": { 936 | "url": "https://github.com/sponsors/ljharb" 937 | } 938 | }, 939 | "node_modules/which-boxed-primitive": { 940 | "version": "1.0.2", 941 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 942 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 943 | "dev": true, 944 | "dependencies": { 945 | "is-bigint": "^1.0.1", 946 | "is-boolean-object": "^1.1.0", 947 | "is-number-object": "^1.0.4", 948 | "is-string": "^1.0.5", 949 | "is-symbol": "^1.0.3" 950 | }, 951 | "funding": { 952 | "url": "https://github.com/sponsors/ljharb" 953 | } 954 | }, 955 | "node_modules/which-collection": { 956 | "version": "1.0.1", 957 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 958 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 959 | "dev": true, 960 | "dependencies": { 961 | "is-map": "^2.0.1", 962 | "is-set": "^2.0.1", 963 | "is-weakmap": "^2.0.1", 964 | "is-weakset": "^2.0.1" 965 | }, 966 | "funding": { 967 | "url": "https://github.com/sponsors/ljharb" 968 | } 969 | }, 970 | "node_modules/which-typed-array": { 971 | "version": "1.1.8", 972 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", 973 | "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", 974 | "dev": true, 975 | "dependencies": { 976 | "available-typed-arrays": "^1.0.5", 977 | "call-bind": "^1.0.2", 978 | "es-abstract": "^1.20.0", 979 | "for-each": "^0.3.3", 980 | "has-tostringtag": "^1.0.0", 981 | "is-typed-array": "^1.1.9" 982 | }, 983 | "engines": { 984 | "node": ">= 0.4" 985 | }, 986 | "funding": { 987 | "url": "https://github.com/sponsors/ljharb" 988 | } 989 | }, 990 | "node_modules/wrappy": { 991 | "version": "1.0.2", 992 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 993 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 994 | "dev": true 995 | }, 996 | "node_modules/ws": { 997 | "version": "8.8.1", 998 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", 999 | "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", 1000 | "engines": { 1001 | "node": ">=10.0.0" 1002 | }, 1003 | "peerDependencies": { 1004 | "bufferutil": "^4.0.1", 1005 | "utf-8-validate": "^5.0.2" 1006 | }, 1007 | "peerDependenciesMeta": { 1008 | "bufferutil": { 1009 | "optional": true 1010 | }, 1011 | "utf-8-validate": { 1012 | "optional": true 1013 | } 1014 | } 1015 | } 1016 | }, 1017 | "dependencies": { 1018 | "array.prototype.every": { 1019 | "version": "1.1.3", 1020 | "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.3.tgz", 1021 | "integrity": "sha512-vWnriJI//SOMOWtXbU/VXhJ/InfnNHPF6BLKn5WfY8xXy+NWql0fUy20GO3sdqBhCAO+qw8S/E5nJiZX+QFdCA==", 1022 | "dev": true, 1023 | "requires": { 1024 | "call-bind": "^1.0.2", 1025 | "define-properties": "^1.1.3", 1026 | "es-abstract": "^1.19.0", 1027 | "is-string": "^1.0.7" 1028 | } 1029 | }, 1030 | "available-typed-arrays": { 1031 | "version": "1.0.5", 1032 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 1033 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 1034 | "dev": true 1035 | }, 1036 | "balanced-match": { 1037 | "version": "1.0.2", 1038 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1039 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1040 | "dev": true 1041 | }, 1042 | "brace-expansion": { 1043 | "version": "1.1.11", 1044 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1045 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1046 | "dev": true, 1047 | "requires": { 1048 | "balanced-match": "^1.0.0", 1049 | "concat-map": "0.0.1" 1050 | } 1051 | }, 1052 | "call-bind": { 1053 | "version": "1.0.2", 1054 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1055 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1056 | "dev": true, 1057 | "requires": { 1058 | "function-bind": "^1.1.1", 1059 | "get-intrinsic": "^1.0.2" 1060 | } 1061 | }, 1062 | "concat-map": { 1063 | "version": "0.0.1", 1064 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1065 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1066 | "dev": true 1067 | }, 1068 | "deep-equal": { 1069 | "version": "2.0.5", 1070 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", 1071 | "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", 1072 | "dev": true, 1073 | "requires": { 1074 | "call-bind": "^1.0.0", 1075 | "es-get-iterator": "^1.1.1", 1076 | "get-intrinsic": "^1.0.1", 1077 | "is-arguments": "^1.0.4", 1078 | "is-date-object": "^1.0.2", 1079 | "is-regex": "^1.1.1", 1080 | "isarray": "^2.0.5", 1081 | "object-is": "^1.1.4", 1082 | "object-keys": "^1.1.1", 1083 | "object.assign": "^4.1.2", 1084 | "regexp.prototype.flags": "^1.3.0", 1085 | "side-channel": "^1.0.3", 1086 | "which-boxed-primitive": "^1.0.1", 1087 | "which-collection": "^1.0.1", 1088 | "which-typed-array": "^1.1.2" 1089 | } 1090 | }, 1091 | "define-properties": { 1092 | "version": "1.1.4", 1093 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", 1094 | "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", 1095 | "dev": true, 1096 | "requires": { 1097 | "has-property-descriptors": "^1.0.0", 1098 | "object-keys": "^1.1.1" 1099 | } 1100 | }, 1101 | "defined": { 1102 | "version": "1.0.0", 1103 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 1104 | "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", 1105 | "dev": true 1106 | }, 1107 | "dotignore": { 1108 | "version": "0.1.2", 1109 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 1110 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 1111 | "dev": true, 1112 | "requires": { 1113 | "minimatch": "^3.0.4" 1114 | } 1115 | }, 1116 | "es-abstract": { 1117 | "version": "1.20.1", 1118 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", 1119 | "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", 1120 | "dev": true, 1121 | "requires": { 1122 | "call-bind": "^1.0.2", 1123 | "es-to-primitive": "^1.2.1", 1124 | "function-bind": "^1.1.1", 1125 | "function.prototype.name": "^1.1.5", 1126 | "get-intrinsic": "^1.1.1", 1127 | "get-symbol-description": "^1.0.0", 1128 | "has": "^1.0.3", 1129 | "has-property-descriptors": "^1.0.0", 1130 | "has-symbols": "^1.0.3", 1131 | "internal-slot": "^1.0.3", 1132 | "is-callable": "^1.2.4", 1133 | "is-negative-zero": "^2.0.2", 1134 | "is-regex": "^1.1.4", 1135 | "is-shared-array-buffer": "^1.0.2", 1136 | "is-string": "^1.0.7", 1137 | "is-weakref": "^1.0.2", 1138 | "object-inspect": "^1.12.0", 1139 | "object-keys": "^1.1.1", 1140 | "object.assign": "^4.1.2", 1141 | "regexp.prototype.flags": "^1.4.3", 1142 | "string.prototype.trimend": "^1.0.5", 1143 | "string.prototype.trimstart": "^1.0.5", 1144 | "unbox-primitive": "^1.0.2" 1145 | } 1146 | }, 1147 | "es-get-iterator": { 1148 | "version": "1.1.2", 1149 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", 1150 | "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", 1151 | "dev": true, 1152 | "requires": { 1153 | "call-bind": "^1.0.2", 1154 | "get-intrinsic": "^1.1.0", 1155 | "has-symbols": "^1.0.1", 1156 | "is-arguments": "^1.1.0", 1157 | "is-map": "^2.0.2", 1158 | "is-set": "^2.0.2", 1159 | "is-string": "^1.0.5", 1160 | "isarray": "^2.0.5" 1161 | } 1162 | }, 1163 | "es-to-primitive": { 1164 | "version": "1.2.1", 1165 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1166 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1167 | "dev": true, 1168 | "requires": { 1169 | "is-callable": "^1.1.4", 1170 | "is-date-object": "^1.0.1", 1171 | "is-symbol": "^1.0.2" 1172 | } 1173 | }, 1174 | "for-each": { 1175 | "version": "0.3.3", 1176 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1177 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1178 | "dev": true, 1179 | "requires": { 1180 | "is-callable": "^1.1.3" 1181 | } 1182 | }, 1183 | "fs.realpath": { 1184 | "version": "1.0.0", 1185 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1186 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1187 | "dev": true 1188 | }, 1189 | "function-bind": { 1190 | "version": "1.1.1", 1191 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1192 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1193 | "dev": true 1194 | }, 1195 | "function.prototype.name": { 1196 | "version": "1.1.5", 1197 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 1198 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 1199 | "dev": true, 1200 | "requires": { 1201 | "call-bind": "^1.0.2", 1202 | "define-properties": "^1.1.3", 1203 | "es-abstract": "^1.19.0", 1204 | "functions-have-names": "^1.2.2" 1205 | } 1206 | }, 1207 | "functions-have-names": { 1208 | "version": "1.2.3", 1209 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 1210 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 1211 | "dev": true 1212 | }, 1213 | "get-intrinsic": { 1214 | "version": "1.1.2", 1215 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 1216 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 1217 | "dev": true, 1218 | "requires": { 1219 | "function-bind": "^1.1.1", 1220 | "has": "^1.0.3", 1221 | "has-symbols": "^1.0.3" 1222 | } 1223 | }, 1224 | "get-package-type": { 1225 | "version": "0.1.0", 1226 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 1227 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 1228 | "dev": true 1229 | }, 1230 | "get-symbol-description": { 1231 | "version": "1.0.0", 1232 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 1233 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 1234 | "dev": true, 1235 | "requires": { 1236 | "call-bind": "^1.0.2", 1237 | "get-intrinsic": "^1.1.1" 1238 | } 1239 | }, 1240 | "glob": { 1241 | "version": "7.2.3", 1242 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1243 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1244 | "dev": true, 1245 | "requires": { 1246 | "fs.realpath": "^1.0.0", 1247 | "inflight": "^1.0.4", 1248 | "inherits": "2", 1249 | "minimatch": "^3.1.1", 1250 | "once": "^1.3.0", 1251 | "path-is-absolute": "^1.0.0" 1252 | } 1253 | }, 1254 | "has": { 1255 | "version": "1.0.3", 1256 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1257 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1258 | "dev": true, 1259 | "requires": { 1260 | "function-bind": "^1.1.1" 1261 | } 1262 | }, 1263 | "has-bigints": { 1264 | "version": "1.0.2", 1265 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 1266 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 1267 | "dev": true 1268 | }, 1269 | "has-dynamic-import": { 1270 | "version": "2.0.1", 1271 | "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz", 1272 | "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==", 1273 | "dev": true, 1274 | "requires": { 1275 | "call-bind": "^1.0.2", 1276 | "get-intrinsic": "^1.1.1" 1277 | } 1278 | }, 1279 | "has-property-descriptors": { 1280 | "version": "1.0.0", 1281 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 1282 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 1283 | "dev": true, 1284 | "requires": { 1285 | "get-intrinsic": "^1.1.1" 1286 | } 1287 | }, 1288 | "has-symbols": { 1289 | "version": "1.0.3", 1290 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1291 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1292 | "dev": true 1293 | }, 1294 | "has-tostringtag": { 1295 | "version": "1.0.0", 1296 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 1297 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 1298 | "dev": true, 1299 | "requires": { 1300 | "has-symbols": "^1.0.2" 1301 | } 1302 | }, 1303 | "inflight": { 1304 | "version": "1.0.6", 1305 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1306 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1307 | "dev": true, 1308 | "requires": { 1309 | "once": "^1.3.0", 1310 | "wrappy": "1" 1311 | } 1312 | }, 1313 | "inherits": { 1314 | "version": "2.0.4", 1315 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1316 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1317 | "dev": true 1318 | }, 1319 | "internal-slot": { 1320 | "version": "1.0.3", 1321 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", 1322 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", 1323 | "dev": true, 1324 | "requires": { 1325 | "get-intrinsic": "^1.1.0", 1326 | "has": "^1.0.3", 1327 | "side-channel": "^1.0.4" 1328 | } 1329 | }, 1330 | "is-arguments": { 1331 | "version": "1.1.1", 1332 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 1333 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 1334 | "dev": true, 1335 | "requires": { 1336 | "call-bind": "^1.0.2", 1337 | "has-tostringtag": "^1.0.0" 1338 | } 1339 | }, 1340 | "is-bigint": { 1341 | "version": "1.0.4", 1342 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 1343 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 1344 | "dev": true, 1345 | "requires": { 1346 | "has-bigints": "^1.0.1" 1347 | } 1348 | }, 1349 | "is-boolean-object": { 1350 | "version": "1.1.2", 1351 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 1352 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 1353 | "dev": true, 1354 | "requires": { 1355 | "call-bind": "^1.0.2", 1356 | "has-tostringtag": "^1.0.0" 1357 | } 1358 | }, 1359 | "is-callable": { 1360 | "version": "1.2.4", 1361 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", 1362 | "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", 1363 | "dev": true 1364 | }, 1365 | "is-core-module": { 1366 | "version": "2.10.0", 1367 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 1368 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 1369 | "dev": true, 1370 | "requires": { 1371 | "has": "^1.0.3" 1372 | } 1373 | }, 1374 | "is-date-object": { 1375 | "version": "1.0.5", 1376 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1377 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1378 | "dev": true, 1379 | "requires": { 1380 | "has-tostringtag": "^1.0.0" 1381 | } 1382 | }, 1383 | "is-map": { 1384 | "version": "2.0.2", 1385 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", 1386 | "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", 1387 | "dev": true 1388 | }, 1389 | "is-negative-zero": { 1390 | "version": "2.0.2", 1391 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 1392 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 1393 | "dev": true 1394 | }, 1395 | "is-number-object": { 1396 | "version": "1.0.7", 1397 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 1398 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 1399 | "dev": true, 1400 | "requires": { 1401 | "has-tostringtag": "^1.0.0" 1402 | } 1403 | }, 1404 | "is-regex": { 1405 | "version": "1.1.4", 1406 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1407 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1408 | "dev": true, 1409 | "requires": { 1410 | "call-bind": "^1.0.2", 1411 | "has-tostringtag": "^1.0.0" 1412 | } 1413 | }, 1414 | "is-set": { 1415 | "version": "2.0.2", 1416 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", 1417 | "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", 1418 | "dev": true 1419 | }, 1420 | "is-shared-array-buffer": { 1421 | "version": "1.0.2", 1422 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 1423 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 1424 | "dev": true, 1425 | "requires": { 1426 | "call-bind": "^1.0.2" 1427 | } 1428 | }, 1429 | "is-string": { 1430 | "version": "1.0.7", 1431 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 1432 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 1433 | "dev": true, 1434 | "requires": { 1435 | "has-tostringtag": "^1.0.0" 1436 | } 1437 | }, 1438 | "is-symbol": { 1439 | "version": "1.0.4", 1440 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1441 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1442 | "dev": true, 1443 | "requires": { 1444 | "has-symbols": "^1.0.2" 1445 | } 1446 | }, 1447 | "is-typed-array": { 1448 | "version": "1.1.9", 1449 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", 1450 | "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", 1451 | "dev": true, 1452 | "requires": { 1453 | "available-typed-arrays": "^1.0.5", 1454 | "call-bind": "^1.0.2", 1455 | "es-abstract": "^1.20.0", 1456 | "for-each": "^0.3.3", 1457 | "has-tostringtag": "^1.0.0" 1458 | } 1459 | }, 1460 | "is-weakmap": { 1461 | "version": "2.0.1", 1462 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 1463 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", 1464 | "dev": true 1465 | }, 1466 | "is-weakref": { 1467 | "version": "1.0.2", 1468 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 1469 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 1470 | "dev": true, 1471 | "requires": { 1472 | "call-bind": "^1.0.2" 1473 | } 1474 | }, 1475 | "is-weakset": { 1476 | "version": "2.0.2", 1477 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", 1478 | "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", 1479 | "dev": true, 1480 | "requires": { 1481 | "call-bind": "^1.0.2", 1482 | "get-intrinsic": "^1.1.1" 1483 | } 1484 | }, 1485 | "isarray": { 1486 | "version": "2.0.5", 1487 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 1488 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 1489 | "dev": true 1490 | }, 1491 | "minimatch": { 1492 | "version": "3.1.2", 1493 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1494 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1495 | "dev": true, 1496 | "requires": { 1497 | "brace-expansion": "^1.1.7" 1498 | } 1499 | }, 1500 | "minimist": { 1501 | "version": "1.2.6", 1502 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1503 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 1504 | "dev": true 1505 | }, 1506 | "noble-secp256k1": { 1507 | "version": "1.2.14", 1508 | "resolved": "https://registry.npmjs.org/noble-secp256k1/-/noble-secp256k1-1.2.14.tgz", 1509 | "integrity": "sha512-GSCXyoZBUaaPwVWdYncMEmzlSUjF9J/YeEHpklYJCyg8wPuJP3NzDx0BkiwArzINkdX2HJHvUJhL6vVWPOQQcg==" 1510 | }, 1511 | "object-inspect": { 1512 | "version": "1.12.2", 1513 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 1514 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 1515 | "dev": true 1516 | }, 1517 | "object-is": { 1518 | "version": "1.1.5", 1519 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 1520 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 1521 | "dev": true, 1522 | "requires": { 1523 | "call-bind": "^1.0.2", 1524 | "define-properties": "^1.1.3" 1525 | } 1526 | }, 1527 | "object-keys": { 1528 | "version": "1.1.1", 1529 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1530 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1531 | "dev": true 1532 | }, 1533 | "object.assign": { 1534 | "version": "4.1.4", 1535 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", 1536 | "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", 1537 | "dev": true, 1538 | "requires": { 1539 | "call-bind": "^1.0.2", 1540 | "define-properties": "^1.1.4", 1541 | "has-symbols": "^1.0.3", 1542 | "object-keys": "^1.1.1" 1543 | } 1544 | }, 1545 | "once": { 1546 | "version": "1.4.0", 1547 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1548 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1549 | "dev": true, 1550 | "requires": { 1551 | "wrappy": "1" 1552 | } 1553 | }, 1554 | "path-is-absolute": { 1555 | "version": "1.0.1", 1556 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1557 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1558 | "dev": true 1559 | }, 1560 | "path-parse": { 1561 | "version": "1.0.7", 1562 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1563 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1564 | "dev": true 1565 | }, 1566 | "regexp.prototype.flags": { 1567 | "version": "1.4.3", 1568 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", 1569 | "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", 1570 | "dev": true, 1571 | "requires": { 1572 | "call-bind": "^1.0.2", 1573 | "define-properties": "^1.1.3", 1574 | "functions-have-names": "^1.2.2" 1575 | } 1576 | }, 1577 | "resolve": { 1578 | "version": "2.0.0-next.4", 1579 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", 1580 | "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", 1581 | "dev": true, 1582 | "requires": { 1583 | "is-core-module": "^2.9.0", 1584 | "path-parse": "^1.0.7", 1585 | "supports-preserve-symlinks-flag": "^1.0.0" 1586 | } 1587 | }, 1588 | "resumer": { 1589 | "version": "0.0.0", 1590 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 1591 | "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", 1592 | "dev": true, 1593 | "requires": { 1594 | "through": "~2.3.4" 1595 | } 1596 | }, 1597 | "side-channel": { 1598 | "version": "1.0.4", 1599 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1600 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1601 | "dev": true, 1602 | "requires": { 1603 | "call-bind": "^1.0.0", 1604 | "get-intrinsic": "^1.0.2", 1605 | "object-inspect": "^1.9.0" 1606 | } 1607 | }, 1608 | "string.prototype.trim": { 1609 | "version": "1.2.6", 1610 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz", 1611 | "integrity": "sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==", 1612 | "dev": true, 1613 | "requires": { 1614 | "call-bind": "^1.0.2", 1615 | "define-properties": "^1.1.4", 1616 | "es-abstract": "^1.19.5" 1617 | } 1618 | }, 1619 | "string.prototype.trimend": { 1620 | "version": "1.0.5", 1621 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", 1622 | "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", 1623 | "dev": true, 1624 | "requires": { 1625 | "call-bind": "^1.0.2", 1626 | "define-properties": "^1.1.4", 1627 | "es-abstract": "^1.19.5" 1628 | } 1629 | }, 1630 | "string.prototype.trimstart": { 1631 | "version": "1.0.5", 1632 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", 1633 | "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", 1634 | "dev": true, 1635 | "requires": { 1636 | "call-bind": "^1.0.2", 1637 | "define-properties": "^1.1.4", 1638 | "es-abstract": "^1.19.5" 1639 | } 1640 | }, 1641 | "supports-preserve-symlinks-flag": { 1642 | "version": "1.0.0", 1643 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1644 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1645 | "dev": true 1646 | }, 1647 | "tape": { 1648 | "version": "5.6.0", 1649 | "resolved": "https://registry.npmjs.org/tape/-/tape-5.6.0.tgz", 1650 | "integrity": "sha512-LyM4uqbiTAqDgsHTY0r1LH66yE24P3SZaz5TL3mPUds0XCTFl/0AMUBrjgBjUclvbPTFB4IalXg0wFfbTuuu/Q==", 1651 | "dev": true, 1652 | "requires": { 1653 | "array.prototype.every": "^1.1.3", 1654 | "call-bind": "^1.0.2", 1655 | "deep-equal": "^2.0.5", 1656 | "defined": "^1.0.0", 1657 | "dotignore": "^0.1.2", 1658 | "for-each": "^0.3.3", 1659 | "get-package-type": "^0.1.0", 1660 | "glob": "^7.2.3", 1661 | "has": "^1.0.3", 1662 | "has-dynamic-import": "^2.0.1", 1663 | "inherits": "^2.0.4", 1664 | "is-regex": "^1.1.4", 1665 | "minimist": "^1.2.6", 1666 | "object-inspect": "^1.12.2", 1667 | "object-is": "^1.1.5", 1668 | "object-keys": "^1.1.1", 1669 | "object.assign": "^4.1.3", 1670 | "resolve": "^2.0.0-next.3", 1671 | "resumer": "^0.0.0", 1672 | "string.prototype.trim": "^1.2.6", 1673 | "through": "^2.3.8" 1674 | } 1675 | }, 1676 | "through": { 1677 | "version": "2.3.8", 1678 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1679 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 1680 | "dev": true 1681 | }, 1682 | "unbox-primitive": { 1683 | "version": "1.0.2", 1684 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 1685 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 1686 | "dev": true, 1687 | "requires": { 1688 | "call-bind": "^1.0.2", 1689 | "has-bigints": "^1.0.2", 1690 | "has-symbols": "^1.0.3", 1691 | "which-boxed-primitive": "^1.0.2" 1692 | } 1693 | }, 1694 | "which-boxed-primitive": { 1695 | "version": "1.0.2", 1696 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1697 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1698 | "dev": true, 1699 | "requires": { 1700 | "is-bigint": "^1.0.1", 1701 | "is-boolean-object": "^1.1.0", 1702 | "is-number-object": "^1.0.4", 1703 | "is-string": "^1.0.5", 1704 | "is-symbol": "^1.0.3" 1705 | } 1706 | }, 1707 | "which-collection": { 1708 | "version": "1.0.1", 1709 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 1710 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 1711 | "dev": true, 1712 | "requires": { 1713 | "is-map": "^2.0.1", 1714 | "is-set": "^2.0.1", 1715 | "is-weakmap": "^2.0.1", 1716 | "is-weakset": "^2.0.1" 1717 | } 1718 | }, 1719 | "which-typed-array": { 1720 | "version": "1.1.8", 1721 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", 1722 | "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", 1723 | "dev": true, 1724 | "requires": { 1725 | "available-typed-arrays": "^1.0.5", 1726 | "call-bind": "^1.0.2", 1727 | "es-abstract": "^1.20.0", 1728 | "for-each": "^0.3.3", 1729 | "has-tostringtag": "^1.0.0", 1730 | "is-typed-array": "^1.1.9" 1731 | } 1732 | }, 1733 | "wrappy": { 1734 | "version": "1.0.2", 1735 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1736 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1737 | "dev": true 1738 | }, 1739 | "ws": { 1740 | "version": "8.8.1", 1741 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", 1742 | "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", 1743 | "requires": {} 1744 | } 1745 | } 1746 | } 1747 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nostr", 3 | "version": "0.2.8", 4 | "description": "nostr lib and cli", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "tape test/*.js" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/jb55/nostr-js.git" 12 | }, 13 | "keywords": [ 14 | "nostr" 15 | ], 16 | "contributors": [ 17 | "Melvin Carvalho", 18 | "William Casarin " 19 | ], 20 | "license": "MIT", 21 | "bugs": { 22 | "url": "https://github.com/jb55/nostr-js/issues" 23 | }, 24 | "homepage": "https://github.com/jb55/nostr-js", 25 | "devDependencies": { 26 | "tape": "^5.6.0" 27 | }, 28 | "dependencies": { 29 | "noble-secp256k1": "^1.2.14", 30 | "ws": "^8.8.1" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | 2 | const test = require('tape') 3 | const {RelayPool, encryptDm, decryptDm, calculateId, createDelegation, 4 | createDelegationEvent, getPublicKey, signDelegationToken, 5 | signId, verifyEvent} = require('../') 6 | 7 | const jb55 = "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245" 8 | const damus = "wss://relay.damus.io" 9 | const scsi = "wss://nostr-pub.wellorder.net" 10 | const relays = [damus, scsi] 11 | 12 | const PRIVKEY = "81cbdb9c82bcb6067ca96ca0e754bb3d3efd1b813281010e392256c642de1064" 13 | const PUBKEY = "8a5a685420091ae0abef79be1735921b6bab047cc5b2aaefb8f8902dedf117f5" 14 | 15 | function create_test_event(value) { 16 | const created_at = 0 17 | const kind = 1 18 | const content = (value ? value : "hi") 19 | const tags = [] 20 | 21 | return {pubkey: PUBKEY, created_at, kind, content, tags} 22 | } 23 | 24 | test('get pubkey works', function (t) { 25 | t.plan(1) 26 | t.equal(getPublicKey(PRIVKEY), PUBKEY) 27 | }); 28 | 29 | test('decrypt works', function (t) { 30 | t.plan(1) 31 | const dm = {id: "62cfada0ff663ba225b67dd2c089242cdfd2c05107bd3d871cec8cee3dcf8ae2",pubkey: "8a5a685420091ae0abef79be1735921b6bab047cc5b2aaefb8f8902dedf117f5",created_at: 1669439828,kind: 4,tags: [["p","8a5a685420091ae0abef79be1735921b6bab047cc5b2aaefb8f8902dedf117f5"]],content: "01xFLdntA3rg+L1F+mGUug==?iv=P3yubTIbGbB+Nvi2qtsw0A==",sig: "f52a550ff18ca3cedfdf3c108744c7bd3cdde601c5b014ead814967c4bafe5c87735d32f8734a337d6a271b519d29a0fc863141197bdc6253a3a19c7488ebbff"} 32 | 33 | const content = decryptDm(PRIVKEY, dm) 34 | t.equal(content, "hi") 35 | }); 36 | 37 | test('encrypt then decrypt works', async function (t) { 38 | t.plan(1) 39 | const msg = "hello, world!" 40 | let dm = {pubkey: PUBKEY, kind: 4, created_at: 1669439828} 41 | dm.content = encryptDm(PRIVKEY, PUBKEY, msg) 42 | const decrypted = decryptDm(PRIVKEY, dm) 43 | 44 | t.equal(decrypted, msg) 45 | }); 46 | 47 | test('create delegate event', async function (t) { 48 | const publisher_privkey = "d78578125f35cfc39fab89427d4086be1f0db939c393efd311631776a8e5d9ca" 49 | const publisher_pubkey = "575d3b6f59dcb0595b127d210c1664ed465f819966b70c937cac7a6e91c3f7d0" 50 | 51 | const conditions = "created_at<1669341617&kind=1" 52 | const delegation = await createDelegation(PRIVKEY, publisher_pubkey, conditions) 53 | const ev = create_test_event() 54 | const delegate_ev = await createDelegationEvent(publisher_privkey, ev, delegation) 55 | 56 | t.equal(delegate_ev.pubkey, delegation.publisherPubkey) 57 | }) 58 | 59 | test('sign delegation token', async function (t) { 60 | t.plan(1) 61 | 62 | const unsigned_token = 'nostr:delegation:fa11cadbb65d6e81ae4e18a09ab7d784ea87d8b5c18bc81ece76b088fa0d1f5b:kind=1&created_at>1668780345&created_at<1700317277' 63 | 64 | const signed = await signDelegationToken(PRIVKEY, unsigned_token) 65 | t.equal(signed.length, 128) 66 | }) 67 | 68 | test('calculate event id', async function (t) { 69 | t.plan(1) 70 | 71 | const ev = create_test_event() 72 | const id = await calculateId(ev) 73 | 74 | t.equal(id, "c690044fedd4fb2a7a3c4757f9deb1be4893e81605a5ae9c04f99a189c2810dd"); 75 | }) 76 | 77 | test('verify event', async function (t) { 78 | t.plan(2) 79 | 80 | const ev = create_test_event() 81 | ev.id = await calculateId(ev) 82 | ev.sig = await signId(PRIVKEY, ev.id) 83 | 84 | const verify = await verifyEvent(ev) 85 | 86 | t.true(verify); 87 | 88 | const other = create_test_event('different') 89 | other.id = await calculateId(other) 90 | other.sig = await signId(PRIVKEY, other.id) 91 | 92 | const verifyFalse = await verifyEvent(other) 93 | 94 | t.false(verifyFalse); 95 | }) 96 | 97 | test('connect to multiple works', function (t) { 98 | t.plan(2) 99 | 100 | const pool = RelayPool(relays) 101 | 102 | pool.on('open', relay => { 103 | t.equal(true, relay.url === damus || relay.url === scsi, `connected to ${relay.url}`) 104 | 105 | relay.close() 106 | }); 107 | }); 108 | 109 | test('querying multiple works', function (t) { 110 | let per_relay = 2 111 | let expected = per_relay * relays.length 112 | 113 | t.plan(expected) 114 | 115 | let n = 0 116 | const pool = RelayPool(relays) 117 | 118 | pool.on('open', relay => { 119 | relay.subscribe("subid", {limit: per_relay, kinds:[1], authors: [jb55]}) 120 | }); 121 | 122 | pool.on('eose', relay => { 123 | relay.close() 124 | }); 125 | 126 | pool.on('event', (relay, sub_id, ev) => { 127 | t.equal("subid", sub_id, `got event ${++n}/${expected} from ${relay.url}`) 128 | }); 129 | }); 130 | 131 | test('connection error handling works', function (t) { 132 | t.plan(3) 133 | 134 | const pool = RelayPool(['ws://adfaskldasdf.example.com']) 135 | 136 | pool.on('error', (relay, e) => { 137 | t.match(e.message, /^((getaddrinfo ENOTFOUND)|(close during reconnect))/) 138 | }) 139 | }) 140 | 141 | test('connection error handling works, no reconnect', function (t) { 142 | t.plan(1) 143 | 144 | const pool = RelayPool(['ws://adfaskldasdf.example.com'], {reconnect:false}) 145 | 146 | pool.on('error', (relay, e) => { 147 | t.match(e.message, /^getaddrinfo ENOTFOUND/) 148 | }) 149 | }) 150 | --------------------------------------------------------------------------------