mirror of
https://github.com/dergigi/boris.git
synced 2026-02-21 15:05:00 +01:00
feat: initialize markr nostr bookmark client
- Add project structure with TypeScript, React, and Vite - Implement nostr authentication using browser extension (NIP-07) - Add NIP-51 compliant bookmark fetching and display - Create minimal UI with login and bookmark components - Integrate applesauce-core and applesauce-react libraries - Add responsive styling with dark/light mode support - Include comprehensive README with setup instructions This is a minimal MVP for a nostr bookmark client that allows users to view their bookmarks according to NIP-51 specification.
This commit is contained in:
151
node_modules/light-bolt11-decoder/.eslintrc.json
generated
vendored
Normal file
151
node_modules/light-bolt11-decoder/.eslintrc.json
generated
vendored
Normal file
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"root": true,
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 9,
|
||||
"ecmaFeatures": {
|
||||
"jsx": true
|
||||
},
|
||||
"sourceType": "module",
|
||||
"allowImportExportEverywhere": false
|
||||
},
|
||||
|
||||
"env": {
|
||||
"es6": true,
|
||||
"node": true
|
||||
},
|
||||
|
||||
"globals": {
|
||||
"document": false,
|
||||
"navigator": false,
|
||||
"window": false,
|
||||
"location": false,
|
||||
"URL": false,
|
||||
"URLSearchParams": false,
|
||||
"fetch": false,
|
||||
"EventSource": false,
|
||||
"localStorage": false,
|
||||
"sessionStorage": false,
|
||||
"BigInt": false
|
||||
},
|
||||
|
||||
"rules": {
|
||||
"accessor-pairs": 2,
|
||||
"arrow-spacing": [2, {"before": true, "after": true}],
|
||||
"block-spacing": [2, "always"],
|
||||
"brace-style": [2, "1tbs", {"allowSingleLine": true}],
|
||||
"comma-dangle": 0,
|
||||
"comma-spacing": [2, {"before": false, "after": true}],
|
||||
"comma-style": [2, "last"],
|
||||
"constructor-super": 2,
|
||||
"curly": [0, "multi-line"],
|
||||
"dot-location": [2, "property"],
|
||||
"eol-last": 2,
|
||||
"eqeqeq": [2, "allow-null"],
|
||||
"generator-star-spacing": [2, {"before": true, "after": true}],
|
||||
"handle-callback-err": [2, "^(err|error)$"],
|
||||
"indent": 0,
|
||||
"jsx-quotes": [2, "prefer-double"],
|
||||
"key-spacing": [2, {"beforeColon": false, "afterColon": true}],
|
||||
"keyword-spacing": [2, {"before": true, "after": true}],
|
||||
"new-cap": 0,
|
||||
"new-parens": 0,
|
||||
"no-array-constructor": 2,
|
||||
"no-caller": 2,
|
||||
"no-class-assign": 2,
|
||||
"no-cond-assign": 2,
|
||||
"no-const-assign": 2,
|
||||
"no-control-regex": 0,
|
||||
"no-debugger": 0,
|
||||
"no-delete-var": 2,
|
||||
"no-dupe-args": 2,
|
||||
"no-dupe-class-members": 2,
|
||||
"no-dupe-keys": 2,
|
||||
"no-duplicate-case": 2,
|
||||
"no-empty-character-class": 2,
|
||||
"no-empty-pattern": 2,
|
||||
"no-eval": 0,
|
||||
"no-ex-assign": 2,
|
||||
"no-extend-native": 2,
|
||||
"no-extra-bind": 2,
|
||||
"no-extra-boolean-cast": 2,
|
||||
"no-extra-parens": [2, "functions"],
|
||||
"no-fallthrough": 2,
|
||||
"no-floating-decimal": 2,
|
||||
"no-func-assign": 2,
|
||||
"no-implied-eval": 2,
|
||||
"no-inner-declarations": [0, "functions"],
|
||||
"no-invalid-regexp": 2,
|
||||
"no-irregular-whitespace": 2,
|
||||
"no-iterator": 2,
|
||||
"no-label-var": 2,
|
||||
"no-labels": [2, {"allowLoop": false, "allowSwitch": false}],
|
||||
"no-lone-blocks": 2,
|
||||
"no-mixed-spaces-and-tabs": 2,
|
||||
"no-multi-spaces": 2,
|
||||
"no-multi-str": 2,
|
||||
"no-multiple-empty-lines": [2, {"max": 2}],
|
||||
"no-native-reassign": 2,
|
||||
"no-negated-in-lhs": 2,
|
||||
"no-new": 0,
|
||||
"no-new-func": 2,
|
||||
"no-new-object": 2,
|
||||
"no-new-require": 2,
|
||||
"no-new-symbol": 2,
|
||||
"no-new-wrappers": 2,
|
||||
"no-obj-calls": 2,
|
||||
"no-octal": 2,
|
||||
"no-octal-escape": 2,
|
||||
"no-path-concat": 0,
|
||||
"no-proto": 2,
|
||||
"no-redeclare": 2,
|
||||
"no-regex-spaces": 2,
|
||||
"no-return-assign": 0,
|
||||
"no-self-assign": 2,
|
||||
"no-self-compare": 2,
|
||||
"no-sequences": 2,
|
||||
"no-shadow-restricted-names": 2,
|
||||
"no-spaced-func": 2,
|
||||
"no-sparse-arrays": 2,
|
||||
"no-this-before-super": 2,
|
||||
"no-throw-literal": 2,
|
||||
"no-trailing-spaces": 2,
|
||||
"no-undef": 2,
|
||||
"no-undef-init": 2,
|
||||
"no-unexpected-multiline": 2,
|
||||
"no-unneeded-ternary": [2, {"defaultAssignment": false}],
|
||||
"no-unreachable": 2,
|
||||
"no-unused-vars": [
|
||||
2,
|
||||
{"vars": "local", "args": "none", "varsIgnorePattern": "^_"}
|
||||
],
|
||||
"no-useless-call": 2,
|
||||
"no-useless-constructor": 2,
|
||||
"no-with": 2,
|
||||
"one-var": [0, {"initialized": "never"}],
|
||||
"operator-linebreak": [
|
||||
2,
|
||||
"after",
|
||||
{"overrides": {"?": "before", ":": "before"}}
|
||||
],
|
||||
"padded-blocks": [2, "never"],
|
||||
"quotes": [
|
||||
2,
|
||||
"single",
|
||||
{"avoidEscape": true, "allowTemplateLiterals": true}
|
||||
],
|
||||
"semi": [2, "never"],
|
||||
"semi-spacing": [2, {"before": false, "after": true}],
|
||||
"space-before-blocks": [2, "always"],
|
||||
"space-before-function-paren": 0,
|
||||
"space-in-parens": [2, "never"],
|
||||
"space-infix-ops": 2,
|
||||
"space-unary-ops": [2, {"words": true, "nonwords": false}],
|
||||
"spaced-comment": 0,
|
||||
"template-curly-spacing": [2, "never"],
|
||||
"use-isnan": 2,
|
||||
"valid-typeof": 2,
|
||||
"wrap-iife": [2, "any"],
|
||||
"yield-star-spacing": [2, "both"],
|
||||
"yoda": [0]
|
||||
}
|
||||
}
|
||||
10
node_modules/light-bolt11-decoder/.prettierrc.yaml
generated
vendored
Normal file
10
node_modules/light-bolt11-decoder/.prettierrc.yaml
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
semi: false
|
||||
arrowParens: avoid
|
||||
insertPragma: false
|
||||
printWidth: 80
|
||||
proseWrap: preserve
|
||||
singleQuote: true
|
||||
trailingComma: none
|
||||
useTabs: false
|
||||
jsxBracketSameLine: false
|
||||
bracketSpacing: false
|
||||
21
node_modules/light-bolt11-decoder/LICENSE
generated
vendored
Normal file
21
node_modules/light-bolt11-decoder/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 bitcoinjs contributors, fiatjaf
|
||||
|
||||
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.
|
||||
180
node_modules/light-bolt11-decoder/README.md
generated
vendored
Normal file
180
node_modules/light-bolt11-decoder/README.md
generated
vendored
Normal file
@@ -0,0 +1,180 @@
|
||||
<a href="https://nbd.wtf"><img align="right" height="196" src="https://user-images.githubusercontent.com/1653275/194609043-0add674b-dd40-41ed-986c-ab4a2e053092.png" /></a>
|
||||
|
||||
# light-bolt11-decoder
|
||||
|
||||
A lightweight and naïve library for decoding lightning network payment requests as defined in [BOLT #11](https://github.com/lightningnetwork/lightning-rfc/blob/master/11-payment-encoding.md).
|
||||
|
||||
It doesn't recover payee from signature, doesn't check signature, doesn't parse fallback addresses and doesn't do any encoding -- therefore dependencies are very minimal (no libsecp256k1 here).
|
||||
|
||||
Code derived from [bolt11](https://npmjs.com/package/bolt11), which has the full functionality but it's a pain to run in browsers.
|
||||
|
||||
Spits out "sections" of the invoice, in a way that is used to make visualizations like https://bolt11.org/.
|
||||
|
||||
The dependencies are minimal: no `Buffer`, only [`@scure/base`](https://github.com/paulmillr/scure-base).
|
||||
|
||||
## Installation
|
||||
|
||||
```
|
||||
yarn add light-bolt11-decoder
|
||||
```
|
||||
|
||||
## Example Output from `require('light-bolt11-decoder').decode("lnbc...")`
|
||||
|
||||
```js
|
||||
{
|
||||
paymentRequest:
|
||||
'lnbc20u1p3y0x3hpp5743k2g0fsqqxj7n8qzuhns5gmkk4djeejk3wkp64ppevgekvc0jsdqcve5kzar2v9nr5gpqd4hkuetesp5ez2g297jduwc20t6lmqlsg3man0vf2jfd8ar9fh8fhn2g8yttfkqxqy9gcqcqzys9qrsgqrzjqtx3k77yrrav9hye7zar2rtqlfkytl094dsp0ms5majzth6gt7ca6uhdkxl983uywgqqqqlgqqqvx5qqjqrzjqd98kxkpyw0l9tyy8r8q57k7zpy9zjmh6sez752wj6gcumqnj3yxzhdsmg6qq56utgqqqqqqqqqqqeqqjq7jd56882gtxhrjm03c93aacyfy306m4fq0tskf83c0nmet8zc2lxyyg3saz8x6vwcp26xnrlagf9semau3qm2glysp7sv95693fphvsp54l567',
|
||||
sections: [
|
||||
{
|
||||
name: 'lightning_network',
|
||||
letters: 'ln'
|
||||
},
|
||||
{
|
||||
name: 'coin_network',
|
||||
letters: 'bc',
|
||||
value: {
|
||||
bech32: 'bc',
|
||||
pubKeyHash: 0,
|
||||
scriptHash: 5,
|
||||
validWitnessVersions: [0]
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'amount',
|
||||
letters: '20u',
|
||||
value: '2000000'
|
||||
},
|
||||
{
|
||||
name: 'separator',
|
||||
letters: '1'
|
||||
},
|
||||
{
|
||||
name: 'timestamp',
|
||||
letters: 'p3y0x3h',
|
||||
value: 1648859703
|
||||
},
|
||||
{
|
||||
name: 'payment_hash',
|
||||
tag: 'p',
|
||||
letters: 'pp5743k2g0fsqqxj7n8qzuhns5gmkk4djeejk3wkp64ppevgekvc0js',
|
||||
value:
|
||||
'f5636521e98000697a6700b979c288ddad56cb3995a2eb07550872c466ccc3e5'
|
||||
},
|
||||
{
|
||||
name: 'description',
|
||||
tag: 'd',
|
||||
letters: 'dqcve5kzar2v9nr5gpqd4hkuete',
|
||||
value: 'fiatjaf: money'
|
||||
},
|
||||
{
|
||||
name: 'payment_secret',
|
||||
tag: 's',
|
||||
letters: 'sp5ez2g297jduwc20t6lmqlsg3man0vf2jfd8ar9fh8fhn2g8yttfkq',
|
||||
value:
|
||||
'c8948517d26f1d853d7afec1f8223becdec4aa4969fa32a6e74de6a41c8b5a6c'
|
||||
},
|
||||
{
|
||||
name: 'expiry',
|
||||
tag: 'x',
|
||||
letters: 'xqy9gcq',
|
||||
value: 172800
|
||||
},
|
||||
{
|
||||
name: 'min_final_cltv_expiry',
|
||||
tag: 'c',
|
||||
letters: 'cqzys',
|
||||
value: 144
|
||||
},
|
||||
{
|
||||
name: 'feature_bits',
|
||||
tag: '9',
|
||||
letters: '9qrsgq',
|
||||
value: {
|
||||
option_data_loss_protect: 'unsupported',
|
||||
initial_routing_sync: 'unsupported',
|
||||
option_upfront_shutdown_script: 'unsupported',
|
||||
gossip_queries: 'unsupported',
|
||||
var_onion_optin: 'required',
|
||||
gossip_queries_ex: 'unsupported',
|
||||
option_static_remotekey: 'unsupported',
|
||||
payment_secret: 'required',
|
||||
basic_mpp: 'unsupported',
|
||||
option_support_large_channel: 'unsupported',
|
||||
extra_bits: {
|
||||
start_bit: 20,
|
||||
bits: [],
|
||||
has_required: false
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'route_hint',
|
||||
tag: 'r',
|
||||
letters:
|
||||
'rzjqtx3k77yrrav9hye7zar2rtqlfkytl094dsp0ms5majzth6gt7ca6uhdkxl983uywgqqqqlgqqqvx5qqjq',
|
||||
value: [
|
||||
{
|
||||
pubkey:
|
||||
'02cd1b7bc418fac2dc99f0ba350d60fa6c45fde5ab6017ee14df6425df485fb1dd',
|
||||
short_channel_id: '72edb1be53c78472',
|
||||
fee_base_msat: 1000,
|
||||
fee_proportional_millionths: 50000,
|
||||
cltv_expiry_delta: 144
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'route_hint',
|
||||
tag: 'r',
|
||||
letters:
|
||||
'rzjqd98kxkpyw0l9tyy8r8q57k7zpy9zjmh6sez752wj6gcumqnj3yxzhdsmg6qq56utgqqqqqqqqqqqeqqjq',
|
||||
value: [
|
||||
{
|
||||
pubkey:
|
||||
'034a7b1ac1239ff2ac8438ce0a7ade1048514b77d4322f514e96918e6c13944861',
|
||||
short_channel_id: '5db0da3400535c5a',
|
||||
fee_base_msat: 0,
|
||||
fee_proportional_millionths: 100,
|
||||
cltv_expiry_delta: 144
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'signature',
|
||||
letters:
|
||||
'7jd56882gtxhrjm03c93aacyfy306m4fq0tskf83c0nmet8zc2lxyyg3saz8x6vwcp26xnrlagf9semau3qm2glysp7sv95693fphvsp',
|
||||
value:
|
||||
'f49b4d1cea42cd71cb6f8e0b1ef7044922fd6ea903d70b24f1c3e7bcace2c2be621111874473698ec055a34c7fea1258677de441b523e4807d06169a2c521bb201'
|
||||
},
|
||||
{
|
||||
name: 'checksum',
|
||||
letters: '54l567'
|
||||
}
|
||||
],
|
||||
expiry: 172800,
|
||||
route_hints: [
|
||||
[
|
||||
{
|
||||
pubkey:
|
||||
'02cd1b7bc418fac2dc99f0ba350d60fa6c45fde5ab6017ee14df6425df485fb1dd',
|
||||
short_channel_id: '72edb1be53c78472',
|
||||
fee_base_msat: 1000,
|
||||
fee_proportional_millionths: 50000,
|
||||
cltv_expiry_delta: 144
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
pubkey:
|
||||
'034a7b1ac1239ff2ac8438ce0a7ade1048514b77d4322f514e96918e6c13944861',
|
||||
short_channel_id: '5db0da3400535c5a',
|
||||
fee_base_msat: 0,
|
||||
fee_proportional_millionths: 100,
|
||||
cltv_expiry_delta: 144
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## LICENSE [MIT](LICENSE)
|
||||
89
node_modules/light-bolt11-decoder/bolt11.d.ts
generated
vendored
Normal file
89
node_modules/light-bolt11-decoder/bolt11.d.ts
generated
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
declare module "light-bolt11-decoder" {
|
||||
type NetworkSection = {
|
||||
name: 'coin_network';
|
||||
letters: string;
|
||||
value?: {
|
||||
bech32: string;
|
||||
pubKeyHash: number;
|
||||
scriptHash: number;
|
||||
validWitnessVersions: number[];
|
||||
};
|
||||
};
|
||||
|
||||
type FeatureBits = {
|
||||
option_data_loss_protect: string;
|
||||
initial_routing_sync: string;
|
||||
option_upfront_shutdown_script: string;
|
||||
gossip_queries: string;
|
||||
var_onion_optin: string;
|
||||
gossip_queries_ex: string;
|
||||
option_static_remotekey: string;
|
||||
payment_secret: string;
|
||||
basic_mpp: string;
|
||||
option_support_large_channel: string;
|
||||
extra_bits: {
|
||||
start_bit: number;
|
||||
bits: unknown[];
|
||||
has_required: boolean;
|
||||
};
|
||||
};
|
||||
|
||||
type RouteHint = {
|
||||
pubkey: string;
|
||||
short_channel_id: string;
|
||||
fee_base_msat: number;
|
||||
fee_proportional_millionths: number;
|
||||
cltv_expiry_delta: number;
|
||||
};
|
||||
|
||||
type RouteHintSection = {
|
||||
name: "route_hint";
|
||||
tag: "r";
|
||||
letters: string;
|
||||
value: RouteHint[];
|
||||
};
|
||||
|
||||
type FeatureBitsSection = {
|
||||
name: "feature_bits";
|
||||
tag: "9";
|
||||
letters: string;
|
||||
value: FeatureBits;
|
||||
};
|
||||
|
||||
type Section =
|
||||
| { name: "paymentRequest"; value: string }
|
||||
| { name: "expiry"; value: number }
|
||||
| { name: "checksum"; letters: string }
|
||||
| NetworkSection
|
||||
| { name: "amount"; letters: string; value: string }
|
||||
| { name: "separator"; letters: string }
|
||||
| { name: "timestamp"; letters: string; value: number }
|
||||
| { name: "payment_hash"; tag: "p"; letters: string; value: string }
|
||||
| { name: "description"; tag: "d"; letters: string; value: string }
|
||||
| { name: "payment_secret"; tag: "s"; letters: string; value: string }
|
||||
| {
|
||||
name: "min_final_cltv_expiry";
|
||||
tag: "c";
|
||||
letters: string;
|
||||
value: number;
|
||||
}
|
||||
| FeatureBitsSection
|
||||
| RouteHintSection
|
||||
| { name: "signature"; letters: string; value: string };
|
||||
|
||||
type PaymentJSON = {
|
||||
paymentRequest: string;
|
||||
sections: Section[];
|
||||
expiry: number;
|
||||
route_hints: RouteHint[][];
|
||||
};
|
||||
|
||||
type DecodedInvoice = {
|
||||
paymentRequest: string;
|
||||
sections: Section[];
|
||||
expiry: number;
|
||||
route_hints: RouteHint[][];
|
||||
};
|
||||
|
||||
function decode(invoice: string): DecodedInvoice;
|
||||
}
|
||||
397
node_modules/light-bolt11-decoder/bolt11.js
generated
vendored
Normal file
397
node_modules/light-bolt11-decoder/bolt11.js
generated
vendored
Normal file
@@ -0,0 +1,397 @@
|
||||
const {bech32, hex, utf8} = require('@scure/base')
|
||||
|
||||
// defaults for encode; default timestamp is current time at call
|
||||
const DEFAULTNETWORK = {
|
||||
// default network is bitcoin
|
||||
bech32: 'bc',
|
||||
pubKeyHash: 0x00,
|
||||
scriptHash: 0x05,
|
||||
validWitnessVersions: [0]
|
||||
}
|
||||
const TESTNETWORK = {
|
||||
bech32: 'tb',
|
||||
pubKeyHash: 0x6f,
|
||||
scriptHash: 0xc4,
|
||||
validWitnessVersions: [0]
|
||||
}
|
||||
const SIGNETNETWORK = {
|
||||
bech32: 'tbs',
|
||||
pubKeyHash: 0x6f,
|
||||
scriptHash: 0xc4,
|
||||
validWitnessVersions: [0]
|
||||
}
|
||||
const REGTESTNETWORK = {
|
||||
bech32: 'bcrt',
|
||||
pubKeyHash: 0x6f,
|
||||
scriptHash: 0xc4,
|
||||
validWitnessVersions: [0]
|
||||
}
|
||||
const SIMNETWORK = {
|
||||
bech32: 'sb',
|
||||
pubKeyHash: 0x3f,
|
||||
scriptHash: 0x7b,
|
||||
validWitnessVersions: [0]
|
||||
}
|
||||
|
||||
const FEATUREBIT_ORDER = [
|
||||
'option_data_loss_protect',
|
||||
'initial_routing_sync',
|
||||
'option_upfront_shutdown_script',
|
||||
'gossip_queries',
|
||||
'var_onion_optin',
|
||||
'gossip_queries_ex',
|
||||
'option_static_remotekey',
|
||||
'payment_secret',
|
||||
'basic_mpp',
|
||||
'option_support_large_channel'
|
||||
]
|
||||
|
||||
const DIVISORS = {
|
||||
m: BigInt(1e3),
|
||||
u: BigInt(1e6),
|
||||
n: BigInt(1e9),
|
||||
p: BigInt(1e12)
|
||||
}
|
||||
|
||||
const MAX_MILLISATS = BigInt('2100000000000000000')
|
||||
|
||||
const MILLISATS_PER_BTC = BigInt(1e11)
|
||||
|
||||
const TAGCODES = {
|
||||
payment_hash: 1,
|
||||
payment_secret: 16,
|
||||
description: 13,
|
||||
payee: 19,
|
||||
description_hash: 23, // commit to longer descriptions (used by lnurl-pay)
|
||||
expiry: 6, // default: 3600 (1 hour)
|
||||
min_final_cltv_expiry: 24, // default: 9
|
||||
fallback_address: 9,
|
||||
route_hint: 3, // for extra routing info (private etc.)
|
||||
feature_bits: 5,
|
||||
metadata: 27
|
||||
}
|
||||
|
||||
// reverse the keys and values of TAGCODES and insert into TAGNAMES
|
||||
const TAGNAMES = {}
|
||||
for (let i = 0, keys = Object.keys(TAGCODES); i < keys.length; i++) {
|
||||
const currentName = keys[i]
|
||||
const currentCode = TAGCODES[keys[i]].toString()
|
||||
TAGNAMES[currentCode] = currentName
|
||||
}
|
||||
|
||||
const TAGPARSERS = {
|
||||
1: words => hex.encode(bech32.fromWordsUnsafe(words)), // 256 bits
|
||||
16: words => hex.encode(bech32.fromWordsUnsafe(words)), // 256 bits
|
||||
13: words => utf8.encode(bech32.fromWordsUnsafe(words)), // string variable length
|
||||
19: words => hex.encode(bech32.fromWordsUnsafe(words)), // 264 bits
|
||||
23: words => hex.encode(bech32.fromWordsUnsafe(words)), // 256 bits
|
||||
27: words => hex.encode(bech32.fromWordsUnsafe(words)), // variable
|
||||
6: wordsToIntBE, // default: 3600 (1 hour)
|
||||
24: wordsToIntBE, // default: 9
|
||||
3: routingInfoParser, // for extra routing info (private etc.)
|
||||
5: featureBitsParser // keep feature bits as array of 5 bit words
|
||||
}
|
||||
|
||||
function getUnknownParser(tagCode) {
|
||||
return words => ({
|
||||
tagCode: parseInt(tagCode),
|
||||
words: bech32.encode('unknown', words, Number.MAX_SAFE_INTEGER)
|
||||
})
|
||||
}
|
||||
|
||||
function wordsToIntBE(words) {
|
||||
return words.reverse().reduce((total, item, index) => {
|
||||
return total + item * Math.pow(32, index)
|
||||
}, 0)
|
||||
}
|
||||
|
||||
// first convert from words to buffer, trimming padding where necessary
|
||||
// parse in 51 byte chunks. See encoder for details.
|
||||
function routingInfoParser(words) {
|
||||
const routes = []
|
||||
let pubkey,
|
||||
shortChannelId,
|
||||
feeBaseMSats,
|
||||
feeProportionalMillionths,
|
||||
cltvExpiryDelta
|
||||
let routesBuffer = bech32.fromWordsUnsafe(words)
|
||||
while (routesBuffer.length > 0) {
|
||||
pubkey = hex.encode(routesBuffer.slice(0, 33)) // 33 bytes
|
||||
shortChannelId = hex.encode(routesBuffer.slice(33, 41)) // 8 bytes
|
||||
feeBaseMSats = parseInt(hex.encode(routesBuffer.slice(41, 45)), 16) // 4 bytes
|
||||
feeProportionalMillionths = parseInt(
|
||||
hex.encode(routesBuffer.slice(45, 49)),
|
||||
16
|
||||
) // 4 bytes
|
||||
cltvExpiryDelta = parseInt(hex.encode(routesBuffer.slice(49, 51)), 16) // 2 bytes
|
||||
|
||||
routesBuffer = routesBuffer.slice(51)
|
||||
|
||||
routes.push({
|
||||
pubkey,
|
||||
short_channel_id: shortChannelId,
|
||||
fee_base_msat: feeBaseMSats,
|
||||
fee_proportional_millionths: feeProportionalMillionths,
|
||||
cltv_expiry_delta: cltvExpiryDelta
|
||||
})
|
||||
}
|
||||
return routes
|
||||
}
|
||||
|
||||
function featureBitsParser(words) {
|
||||
const bools = words
|
||||
.slice()
|
||||
.reverse()
|
||||
.map(word => [
|
||||
!!(word & 0b1),
|
||||
!!(word & 0b10),
|
||||
!!(word & 0b100),
|
||||
!!(word & 0b1000),
|
||||
!!(word & 0b10000)
|
||||
])
|
||||
.reduce((finalArr, itemArr) => finalArr.concat(itemArr), [])
|
||||
while (bools.length < FEATUREBIT_ORDER.length * 2) {
|
||||
bools.push(false)
|
||||
}
|
||||
|
||||
const featureBits = {}
|
||||
|
||||
FEATUREBIT_ORDER.forEach((featureName, index) => {
|
||||
let status
|
||||
if (bools[index * 2]) {
|
||||
status = 'required'
|
||||
} else if (bools[index * 2 + 1]) {
|
||||
status = 'supported'
|
||||
} else {
|
||||
status = 'unsupported'
|
||||
}
|
||||
featureBits[featureName] = status
|
||||
})
|
||||
|
||||
const extraBits = bools.slice(FEATUREBIT_ORDER.length * 2)
|
||||
featureBits.extra_bits = {
|
||||
start_bit: FEATUREBIT_ORDER.length * 2,
|
||||
bits: extraBits,
|
||||
has_required: extraBits.reduce(
|
||||
(result, bit, index) =>
|
||||
index % 2 !== 0 ? result || false : result || bit,
|
||||
false
|
||||
)
|
||||
}
|
||||
|
||||
return featureBits
|
||||
}
|
||||
|
||||
function hrpToMillisat(hrpString, outputString) {
|
||||
let divisor, value
|
||||
if (hrpString.slice(-1).match(/^[munp]$/)) {
|
||||
divisor = hrpString.slice(-1)
|
||||
value = hrpString.slice(0, -1)
|
||||
} else if (hrpString.slice(-1).match(/^[^munp0-9]$/)) {
|
||||
throw new Error('Not a valid multiplier for the amount')
|
||||
} else {
|
||||
value = hrpString
|
||||
}
|
||||
|
||||
if (!value.match(/^\d+$/))
|
||||
throw new Error('Not a valid human readable amount')
|
||||
|
||||
const valueBN = BigInt(value)
|
||||
|
||||
const millisatoshisBN = divisor
|
||||
? (valueBN * MILLISATS_PER_BTC) / DIVISORS[divisor]
|
||||
: valueBN * MILLISATS_PER_BTC
|
||||
|
||||
if (
|
||||
(divisor === 'p' && !(valueBN % BigInt(10) === BigInt(0))) ||
|
||||
millisatoshisBN > MAX_MILLISATS
|
||||
) {
|
||||
throw new Error('Amount is outside of valid range')
|
||||
}
|
||||
|
||||
return outputString ? millisatoshisBN.toString() : millisatoshisBN
|
||||
}
|
||||
|
||||
// decode will only have extra comments that aren't covered in encode comments.
|
||||
// also if anything is hard to read I'll comment.
|
||||
function decode(paymentRequest, network) {
|
||||
if (typeof paymentRequest !== 'string')
|
||||
throw new Error('Lightning Payment Request must be string')
|
||||
if (paymentRequest.slice(0, 2).toLowerCase() !== 'ln')
|
||||
throw new Error('Not a proper lightning payment request')
|
||||
|
||||
const sections = []
|
||||
const decoded = bech32.decode(paymentRequest, Number.MAX_SAFE_INTEGER)
|
||||
paymentRequest = paymentRequest.toLowerCase()
|
||||
const prefix = decoded.prefix
|
||||
let words = decoded.words
|
||||
let letters = paymentRequest.slice(prefix.length + 1)
|
||||
let sigWords = words.slice(-104)
|
||||
words = words.slice(0, -104)
|
||||
|
||||
// Without reverse lookups, can't say that the multipier at the end must
|
||||
// have a number before it, so instead we parse, and if the second group
|
||||
// doesn't have anything, there's a good chance the last letter of the
|
||||
// coin type got captured by the third group, so just re-regex without
|
||||
// the number.
|
||||
let prefixMatches = prefix.match(/^ln(\S+?)(\d*)([a-zA-Z]?)$/)
|
||||
if (prefixMatches && !prefixMatches[2])
|
||||
prefixMatches = prefix.match(/^ln(\S+)$/)
|
||||
if (!prefixMatches) {
|
||||
throw new Error('Not a proper lightning payment request')
|
||||
}
|
||||
|
||||
// "ln" section
|
||||
sections.push({
|
||||
name: 'lightning_network',
|
||||
letters: 'ln'
|
||||
})
|
||||
|
||||
// "bc" section
|
||||
const bech32Prefix = prefixMatches[1]
|
||||
let coinNetwork
|
||||
if (!network) {
|
||||
switch (bech32Prefix) {
|
||||
case DEFAULTNETWORK.bech32:
|
||||
coinNetwork = DEFAULTNETWORK
|
||||
break
|
||||
case TESTNETWORK.bech32:
|
||||
coinNetwork = TESTNETWORK
|
||||
break
|
||||
case SIGNETNETWORK.bech32:
|
||||
coinNetwork = SIGNETNETWORK
|
||||
break
|
||||
case REGTESTNETWORK.bech32:
|
||||
coinNetwork = REGTESTNETWORK
|
||||
break
|
||||
case SIMNETWORK.bech32:
|
||||
coinNetwork = SIMNETWORK
|
||||
break
|
||||
}
|
||||
} else {
|
||||
if (
|
||||
network.bech32 === undefined ||
|
||||
network.pubKeyHash === undefined ||
|
||||
network.scriptHash === undefined ||
|
||||
!Array.isArray(network.validWitnessVersions)
|
||||
)
|
||||
throw new Error('Invalid network')
|
||||
coinNetwork = network
|
||||
}
|
||||
if (!coinNetwork || coinNetwork.bech32 !== bech32Prefix) {
|
||||
throw new Error('Unknown coin bech32 prefix')
|
||||
}
|
||||
sections.push({
|
||||
name: 'coin_network',
|
||||
letters: bech32Prefix,
|
||||
value: coinNetwork
|
||||
})
|
||||
|
||||
// amount section
|
||||
const value = prefixMatches[2]
|
||||
let millisatoshis
|
||||
if (value) {
|
||||
const divisor = prefixMatches[3]
|
||||
millisatoshis = hrpToMillisat(value + divisor, true)
|
||||
sections.push({
|
||||
name: 'amount',
|
||||
letters: prefixMatches[2] + prefixMatches[3],
|
||||
value: millisatoshis
|
||||
})
|
||||
} else {
|
||||
millisatoshis = null
|
||||
}
|
||||
|
||||
// "1" separator
|
||||
sections.push({
|
||||
name: 'separator',
|
||||
letters: '1'
|
||||
})
|
||||
|
||||
// timestamp
|
||||
const timestamp = wordsToIntBE(words.slice(0, 7))
|
||||
words = words.slice(7) // trim off the left 7 words
|
||||
sections.push({
|
||||
name: 'timestamp',
|
||||
letters: letters.slice(0, 7),
|
||||
value: timestamp
|
||||
})
|
||||
letters = letters.slice(7)
|
||||
|
||||
let tagName, parser, tagLength, tagWords
|
||||
// we have no tag count to go on, so just keep hacking off words
|
||||
// until we have none.
|
||||
while (words.length > 0) {
|
||||
const tagCode = words[0].toString()
|
||||
tagName = TAGNAMES[tagCode] || 'unknown_tag'
|
||||
parser = TAGPARSERS[tagCode] || getUnknownParser(tagCode)
|
||||
words = words.slice(1)
|
||||
|
||||
tagLength = wordsToIntBE(words.slice(0, 2))
|
||||
words = words.slice(2)
|
||||
|
||||
tagWords = words.slice(0, tagLength)
|
||||
words = words.slice(tagLength)
|
||||
|
||||
sections.push({
|
||||
name: tagName,
|
||||
tag: letters[0],
|
||||
letters: letters.slice(0, 1 + 2 + tagLength),
|
||||
value: parser(tagWords) // see: parsers for more comments
|
||||
})
|
||||
letters = letters.slice(1 + 2 + tagLength)
|
||||
}
|
||||
|
||||
// signature
|
||||
sections.push({
|
||||
name: 'signature',
|
||||
letters: letters.slice(0, 104),
|
||||
value: hex.encode(bech32.fromWordsUnsafe(sigWords))
|
||||
})
|
||||
letters = letters.slice(104)
|
||||
|
||||
// checksum
|
||||
sections.push({
|
||||
name: 'checksum',
|
||||
letters: letters
|
||||
})
|
||||
|
||||
let result = {
|
||||
paymentRequest,
|
||||
sections,
|
||||
|
||||
get expiry() {
|
||||
let exp = sections.find(s => s.name === 'expiry')
|
||||
if (exp) return getValue('timestamp') + exp.value
|
||||
},
|
||||
|
||||
get route_hints() {
|
||||
return sections.filter(s => s.name === 'route_hint').map(s => s.value)
|
||||
}
|
||||
}
|
||||
|
||||
for (let name in TAGCODES) {
|
||||
if (name === 'route_hint') {
|
||||
// route hints can be multiple, so this won't work for them
|
||||
continue
|
||||
}
|
||||
|
||||
Object.defineProperty(result, name, {
|
||||
get() {
|
||||
return getValue(name)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
function getValue(name) {
|
||||
let section = sections.find(s => s.name === name)
|
||||
return section ? section.value : undefined
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
decode,
|
||||
hrpToMillisat
|
||||
}
|
||||
21
node_modules/light-bolt11-decoder/node_modules/@scure/base/LICENSE
generated
vendored
Normal file
21
node_modules/light-bolt11-decoder/node_modules/@scure/base/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2022 Paul Miller (https://paulmillr.com)
|
||||
|
||||
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.
|
||||
147
node_modules/light-bolt11-decoder/node_modules/@scure/base/README.md
generated
vendored
Normal file
147
node_modules/light-bolt11-decoder/node_modules/@scure/base/README.md
generated
vendored
Normal file
@@ -0,0 +1,147 @@
|
||||
# scure-base
|
||||
|
||||
Secure, [audited](#security) and 0-dep implementation of bech32, base64, base58, base32 & base16.
|
||||
|
||||
Written in [functional style](#design-rationale), uses chaining, has unique tests which ensure correctness.
|
||||
|
||||
Matches following specs:
|
||||
|
||||
- Bech32, Bech32m: [BIP173](https://en.bitcoin.it/wiki/BIP_0173), [BIP350](https://en.bitcoin.it/wiki/BIP_0350)
|
||||
- Base16, Base32, Base32Hex, Base64, Base64Url: [RFC 4648](https://datatracker.ietf.org/doc/html/rfc4648) (aka RFC 3548)
|
||||
- [Base58](https://www.ietf.org/archive/id/draft-msporny-base58-03.txt), [Base58check](https://en.bitcoin.it/wiki/Base58Check_encoding), [Base32 Crockford](https://www.crockford.com/base32.html)
|
||||
|
||||
### This library belongs to *scure*
|
||||
|
||||
> **scure** — secure audited packages for every use case.
|
||||
|
||||
- Independent security audits
|
||||
- All releases are signed with PGP keys
|
||||
- Check out all libraries:
|
||||
[base](https://github.com/paulmillr/scure-base),
|
||||
[bip32](https://github.com/paulmillr/scure-bip32),
|
||||
[bip39](https://github.com/paulmillr/scure-bip39)
|
||||
|
||||
## Usage
|
||||
|
||||
> npm install @scure/base
|
||||
|
||||
Or
|
||||
|
||||
> yarn add @scure/base
|
||||
|
||||
```js
|
||||
const { base16, base32, base64, base58 } = require('@scure/base');
|
||||
// Flavors
|
||||
const { base58xmr, base58xrp, base32hex, base32crockford, base64url } = require('@scure/base');
|
||||
|
||||
const data = Uint8Array.from([1, 2, 3]);
|
||||
base64.decode(base64.encode(data));
|
||||
|
||||
// Everything has the same API except for bech32 and base58check
|
||||
base32.encode(data);
|
||||
base16.encode(data);
|
||||
base32hex.encode(data);
|
||||
|
||||
// bech32
|
||||
const { bech32, bech32m } = require('@scure/base');
|
||||
const words = bech32.toWords(data);
|
||||
const be = bech32.encode('prefix', words);
|
||||
const { prefix, words } = bech32.decode(be);
|
||||
bech32m.encode('prefix', words);
|
||||
|
||||
// base58check is special-case
|
||||
// you need to pass sha256() function that returns Uint8Array
|
||||
const { base58check } = require('@scure/base');
|
||||
base58check(sha256).encode(data);
|
||||
|
||||
// Alternative API
|
||||
const { str, bytes } = require('@scure/base');
|
||||
const encoded = str('base64', data);
|
||||
const data = bytes('base64', encoded);
|
||||
```
|
||||
|
||||
## Design rationale
|
||||
|
||||
The code may feel unnecessarily complicated; but actually it's much easier to reason about.
|
||||
Any encoding library consists of two functions:
|
||||
|
||||
```
|
||||
encode(A) -> B
|
||||
decode(B) -> A
|
||||
where X = decode(encode(X))
|
||||
# encode(decode(X)) can be !== X!
|
||||
# because decoding can normalize input
|
||||
|
||||
e.g.
|
||||
base58checksum = {
|
||||
encode(): {
|
||||
// checksum
|
||||
// radix conversion
|
||||
// alphabet
|
||||
},
|
||||
decode(): {
|
||||
// alphabet
|
||||
// radix conversion
|
||||
// checksum
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
But instead of creating two big functions for each specific case,
|
||||
we create them from tiny composamble building blocks:
|
||||
|
||||
```
|
||||
base58checksum = chain(checksum(), radix(), alphabet())
|
||||
```
|
||||
|
||||
Which is the same as chain/pipe/sequence function in Functional Programming,
|
||||
but significantly more useful since it enforces same order of execution of encode/decode.
|
||||
Basically you only define encode (in declarative way) and get correct decode for free.
|
||||
So, instead of reasoning about two big functions you need only reason about primitives and encode chain.
|
||||
The design revealed obvious bug in older version of the lib,
|
||||
where xmr version of base58 had errors in decode's block processing.
|
||||
|
||||
Besides base-encodings, we can reuse the same approach with any encode/decode function
|
||||
(`bytes2number`, `bytes2u32`, etc).
|
||||
For example, you can easily encode entropy to mnemonic (BIP-39):
|
||||
|
||||
```ts
|
||||
export function getCoder(wordlist: string[]) {
|
||||
if (!Array.isArray(wordlist) || wordlist.length !== 2 ** 11 || typeof wordlist[0] !== 'string') {
|
||||
throw new Error('Worlist: expected array of 2048 strings');
|
||||
}
|
||||
return mbc.chain(mbu.checksum(1, checksum), mbu.radix2(11, true), mbu.alphabet(wordlist));
|
||||
}
|
||||
```
|
||||
|
||||
## base58 is O(n^2) and radixes
|
||||
|
||||
`Uint8Array` is represented as big-endian number:
|
||||
|
||||
```
|
||||
[1, 2, 3, 4, 5] -> 1*(256**4) + 2*(256**3) 3*(256**2) + 4*(256**1) + 5*(256**0)
|
||||
where 256 = 2**8 (8 bits per byte)
|
||||
```
|
||||
|
||||
which is then converted to a number in another radix/base (16/32/58/64, etc).
|
||||
|
||||
However, generic conversion between bases has [quadratic O(n^2) time complexity](https://cs.stackexchange.com/q/21799).
|
||||
|
||||
Which means base58 has quadratic time complexity too. Use base58 only when you have small
|
||||
constant sized input, because variable length sized input from user can cause DoS.
|
||||
|
||||
On the other hand, if both bases are power of same number (like `2**8 <-> 2**64`),
|
||||
there is linear algorithm. For now we have implementation for power-of-two bases only (radix2).
|
||||
|
||||
## Security
|
||||
|
||||
The library has been audited by Cure53 on Jan 5, 2022. Check out the audit [PDF](./audit/2022-01-05-cure53-audit-nbl2.pdf) & [URL](https://cure53.de/pentest-report_hashing-libs.pdf). See [changes since audit](https://github.com/paulmillr/scure-base/compare/1.0.0..main).
|
||||
|
||||
1. The library was initially developed for [js-ethereum-cryptography](https://github.com/ethereum/js-ethereum-cryptography)
|
||||
2. At commit [ae00e6d7](https://github.com/ethereum/js-ethereum-cryptography/commit/ae00e6d7d24fb3c76a1c7fe10039f6ecd120b77e), it
|
||||
was extracted to a separate package called `micro-base`
|
||||
3. After the audit we've decided to use NPM namespace for security. Since `@micro` namespace was taken, we've renamed the package to `@scure/base`
|
||||
|
||||
## License
|
||||
|
||||
MIT (c) Paul Miller [(https://paulmillr.com)](https://paulmillr.com), see LICENSE file.
|
||||
394
node_modules/light-bolt11-decoder/node_modules/@scure/base/lib/esm/index.js
generated
vendored
Normal file
394
node_modules/light-bolt11-decoder/node_modules/@scure/base/lib/esm/index.js
generated
vendored
Normal file
@@ -0,0 +1,394 @@
|
||||
/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
||||
export function assertNumber(n) {
|
||||
if (!Number.isSafeInteger(n))
|
||||
throw new Error(`Wrong integer: ${n}`);
|
||||
}
|
||||
function chain(...args) {
|
||||
const wrap = (a, b) => (c) => a(b(c));
|
||||
const encode = Array.from(args)
|
||||
.reverse()
|
||||
.reduce((acc, i) => (acc ? wrap(acc, i.encode) : i.encode), undefined);
|
||||
const decode = args.reduce((acc, i) => (acc ? wrap(acc, i.decode) : i.decode), undefined);
|
||||
return { encode, decode };
|
||||
}
|
||||
function alphabet(alphabet) {
|
||||
return {
|
||||
encode: (digits) => {
|
||||
if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
|
||||
throw new Error('alphabet.encode input should be an array of numbers');
|
||||
return digits.map((i) => {
|
||||
assertNumber(i);
|
||||
if (i < 0 || i >= alphabet.length)
|
||||
throw new Error(`Digit index outside alphabet: ${i} (alphabet: ${alphabet.length})`);
|
||||
return alphabet[i];
|
||||
});
|
||||
},
|
||||
decode: (input) => {
|
||||
if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))
|
||||
throw new Error('alphabet.decode input should be array of strings');
|
||||
return input.map((letter) => {
|
||||
if (typeof letter !== 'string')
|
||||
throw new Error(`alphabet.decode: not string element=${letter}`);
|
||||
const index = alphabet.indexOf(letter);
|
||||
if (index === -1)
|
||||
throw new Error(`Unknown letter: "${letter}". Allowed: ${alphabet}`);
|
||||
return index;
|
||||
});
|
||||
},
|
||||
};
|
||||
}
|
||||
function join(separator = '') {
|
||||
if (typeof separator !== 'string')
|
||||
throw new Error('join separator should be string');
|
||||
return {
|
||||
encode: (from) => {
|
||||
if (!Array.isArray(from) || (from.length && typeof from[0] !== 'string'))
|
||||
throw new Error('join.encode input should be array of strings');
|
||||
for (let i of from)
|
||||
if (typeof i !== 'string')
|
||||
throw new Error(`join.encode: non-string input=${i}`);
|
||||
return from.join(separator);
|
||||
},
|
||||
decode: (to) => {
|
||||
if (typeof to !== 'string')
|
||||
throw new Error('join.decode input should be string');
|
||||
return to.split(separator);
|
||||
},
|
||||
};
|
||||
}
|
||||
function padding(bits, chr = '=') {
|
||||
assertNumber(bits);
|
||||
if (typeof chr !== 'string')
|
||||
throw new Error('padding chr should be string');
|
||||
return {
|
||||
encode(data) {
|
||||
if (!Array.isArray(data) || (data.length && typeof data[0] !== 'string'))
|
||||
throw new Error('padding.encode input should be array of strings');
|
||||
for (let i of data)
|
||||
if (typeof i !== 'string')
|
||||
throw new Error(`padding.encode: non-string input=${i}`);
|
||||
while ((data.length * bits) % 8)
|
||||
data.push(chr);
|
||||
return data;
|
||||
},
|
||||
decode(input) {
|
||||
if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))
|
||||
throw new Error('padding.encode input should be array of strings');
|
||||
for (let i of input)
|
||||
if (typeof i !== 'string')
|
||||
throw new Error(`padding.decode: non-string input=${i}`);
|
||||
let end = input.length;
|
||||
if ((end * bits) % 8)
|
||||
throw new Error('Invalid padding: string should have whole number of bytes');
|
||||
for (; end > 0 && input[end - 1] === chr; end--) {
|
||||
if (!(((end - 1) * bits) % 8))
|
||||
throw new Error('Invalid padding: string has too much padding');
|
||||
}
|
||||
return input.slice(0, end);
|
||||
},
|
||||
};
|
||||
}
|
||||
function normalize(fn) {
|
||||
if (typeof fn !== 'function')
|
||||
throw new Error('normalize fn should be function');
|
||||
return { encode: (from) => from, decode: (to) => fn(to) };
|
||||
}
|
||||
function convertRadix(data, from, to) {
|
||||
if (from < 2)
|
||||
throw new Error(`convertRadix: wrong from=${from}, base cannot be less than 2`);
|
||||
if (to < 2)
|
||||
throw new Error(`convertRadix: wrong to=${to}, base cannot be less than 2`);
|
||||
if (!Array.isArray(data))
|
||||
throw new Error('convertRadix: data should be array');
|
||||
if (!data.length)
|
||||
return [];
|
||||
let pos = 0;
|
||||
const res = [];
|
||||
const digits = Array.from(data);
|
||||
digits.forEach((d) => {
|
||||
assertNumber(d);
|
||||
if (d < 0 || d >= from)
|
||||
throw new Error(`Wrong integer: ${d}`);
|
||||
});
|
||||
while (true) {
|
||||
let carry = 0;
|
||||
let done = true;
|
||||
for (let i = pos; i < digits.length; i++) {
|
||||
const digit = digits[i];
|
||||
const digitBase = from * carry + digit;
|
||||
if (!Number.isSafeInteger(digitBase) ||
|
||||
(from * carry) / from !== carry ||
|
||||
digitBase - digit !== from * carry) {
|
||||
throw new Error('convertRadix: carry overflow');
|
||||
}
|
||||
carry = digitBase % to;
|
||||
digits[i] = Math.floor(digitBase / to);
|
||||
if (!Number.isSafeInteger(digits[i]) || digits[i] * to + carry !== digitBase)
|
||||
throw new Error('convertRadix: carry overflow');
|
||||
if (!done)
|
||||
continue;
|
||||
else if (!digits[i])
|
||||
pos = i;
|
||||
else
|
||||
done = false;
|
||||
}
|
||||
res.push(carry);
|
||||
if (done)
|
||||
break;
|
||||
}
|
||||
for (let i = 0; i < data.length - 1 && data[i] === 0; i++)
|
||||
res.push(0);
|
||||
return res.reverse();
|
||||
}
|
||||
const gcd = (a, b) => (!b ? a : gcd(b, a % b));
|
||||
const radix2carry = (from, to) => from + (to - gcd(from, to));
|
||||
function convertRadix2(data, from, to, padding) {
|
||||
if (!Array.isArray(data))
|
||||
throw new Error('convertRadix2: data should be array');
|
||||
if (from <= 0 || from > 32)
|
||||
throw new Error(`convertRadix2: wrong from=${from}`);
|
||||
if (to <= 0 || to > 32)
|
||||
throw new Error(`convertRadix2: wrong to=${to}`);
|
||||
if (radix2carry(from, to) > 32) {
|
||||
throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`);
|
||||
}
|
||||
let carry = 0;
|
||||
let pos = 0;
|
||||
const mask = 2 ** to - 1;
|
||||
const res = [];
|
||||
for (const n of data) {
|
||||
assertNumber(n);
|
||||
if (n >= 2 ** from)
|
||||
throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);
|
||||
carry = (carry << from) | n;
|
||||
if (pos + from > 32)
|
||||
throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);
|
||||
pos += from;
|
||||
for (; pos >= to; pos -= to)
|
||||
res.push(((carry >> (pos - to)) & mask) >>> 0);
|
||||
carry &= 2 ** pos - 1;
|
||||
}
|
||||
carry = (carry << (to - pos)) & mask;
|
||||
if (!padding && pos >= from)
|
||||
throw new Error('Excess padding');
|
||||
if (!padding && carry)
|
||||
throw new Error(`Non-zero padding: ${carry}`);
|
||||
if (padding && pos > 0)
|
||||
res.push(carry >>> 0);
|
||||
return res;
|
||||
}
|
||||
function radix(num) {
|
||||
assertNumber(num);
|
||||
return {
|
||||
encode: (bytes) => {
|
||||
if (!(bytes instanceof Uint8Array))
|
||||
throw new Error('radix.encode input should be Uint8Array');
|
||||
return convertRadix(Array.from(bytes), 2 ** 8, num);
|
||||
},
|
||||
decode: (digits) => {
|
||||
if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
|
||||
throw new Error('radix.decode input should be array of strings');
|
||||
return Uint8Array.from(convertRadix(digits, num, 2 ** 8));
|
||||
},
|
||||
};
|
||||
}
|
||||
function radix2(bits, revPadding = false) {
|
||||
assertNumber(bits);
|
||||
if (bits <= 0 || bits > 32)
|
||||
throw new Error('radix2: bits should be in (0..32]');
|
||||
if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)
|
||||
throw new Error('radix2: carry overflow');
|
||||
return {
|
||||
encode: (bytes) => {
|
||||
if (!(bytes instanceof Uint8Array))
|
||||
throw new Error('radix2.encode input should be Uint8Array');
|
||||
return convertRadix2(Array.from(bytes), 8, bits, !revPadding);
|
||||
},
|
||||
decode: (digits) => {
|
||||
if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
|
||||
throw new Error('radix2.decode input should be array of strings');
|
||||
return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));
|
||||
},
|
||||
};
|
||||
}
|
||||
function unsafeWrapper(fn) {
|
||||
if (typeof fn !== 'function')
|
||||
throw new Error('unsafeWrapper fn should be function');
|
||||
return function (...args) {
|
||||
try {
|
||||
return fn.apply(null, args);
|
||||
}
|
||||
catch (e) { }
|
||||
};
|
||||
}
|
||||
function checksum(len, fn) {
|
||||
assertNumber(len);
|
||||
if (typeof fn !== 'function')
|
||||
throw new Error('checksum fn should be function');
|
||||
return {
|
||||
encode(data) {
|
||||
if (!(data instanceof Uint8Array))
|
||||
throw new Error('checksum.encode: input should be Uint8Array');
|
||||
const checksum = fn(data).slice(0, len);
|
||||
const res = new Uint8Array(data.length + len);
|
||||
res.set(data);
|
||||
res.set(checksum, data.length);
|
||||
return res;
|
||||
},
|
||||
decode(data) {
|
||||
if (!(data instanceof Uint8Array))
|
||||
throw new Error('checksum.decode: input should be Uint8Array');
|
||||
const payload = data.slice(0, -len);
|
||||
const newChecksum = fn(payload).slice(0, len);
|
||||
const oldChecksum = data.slice(-len);
|
||||
for (let i = 0; i < len; i++)
|
||||
if (newChecksum[i] !== oldChecksum[i])
|
||||
throw new Error('Invalid checksum');
|
||||
return payload;
|
||||
},
|
||||
};
|
||||
}
|
||||
export const utils = { alphabet, chain, checksum, radix, radix2, join, padding };
|
||||
export const base16 = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));
|
||||
export const base32 = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), padding(5), join(''));
|
||||
export const base32hex = chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), padding(5), join(''));
|
||||
export const base32crockford = chain(radix2(5), alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'), join(''), normalize((s) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1')));
|
||||
export const base64 = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), padding(6), join(''));
|
||||
export const base64url = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), padding(6), join(''));
|
||||
const genBase58 = (abc) => chain(radix(58), alphabet(abc), join(''));
|
||||
export const base58 = genBase58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
|
||||
export const base58flickr = genBase58('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ');
|
||||
export const base58xrp = genBase58('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz');
|
||||
const XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];
|
||||
export const base58xmr = {
|
||||
encode(data) {
|
||||
let res = '';
|
||||
for (let i = 0; i < data.length; i += 8) {
|
||||
const block = data.subarray(i, i + 8);
|
||||
res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length], '1');
|
||||
}
|
||||
return res;
|
||||
},
|
||||
decode(str) {
|
||||
let res = [];
|
||||
for (let i = 0; i < str.length; i += 11) {
|
||||
const slice = str.slice(i, i + 11);
|
||||
const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);
|
||||
const block = base58.decode(slice);
|
||||
for (let j = 0; j < block.length - blockLen; j++) {
|
||||
if (block[j] !== 0)
|
||||
throw new Error('base58xmr: wrong padding');
|
||||
}
|
||||
res = res.concat(Array.from(block.slice(block.length - blockLen)));
|
||||
}
|
||||
return Uint8Array.from(res);
|
||||
},
|
||||
};
|
||||
export const base58check = (sha256) => chain(checksum(4, (data) => sha256(sha256(data))), base58);
|
||||
const BECH_ALPHABET = chain(alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), join(''));
|
||||
const POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];
|
||||
function bech32Polymod(pre) {
|
||||
const b = pre >> 25;
|
||||
let chk = (pre & 0x1ffffff) << 5;
|
||||
for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {
|
||||
if (((b >> i) & 1) === 1)
|
||||
chk ^= POLYMOD_GENERATORS[i];
|
||||
}
|
||||
return chk;
|
||||
}
|
||||
function bechChecksum(prefix, words, encodingConst = 1) {
|
||||
const len = prefix.length;
|
||||
let chk = 1;
|
||||
for (let i = 0; i < len; i++) {
|
||||
const c = prefix.charCodeAt(i);
|
||||
if (c < 33 || c > 126)
|
||||
throw new Error(`Invalid prefix (${prefix})`);
|
||||
chk = bech32Polymod(chk) ^ (c >> 5);
|
||||
}
|
||||
chk = bech32Polymod(chk);
|
||||
for (let i = 0; i < len; i++)
|
||||
chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);
|
||||
for (let v of words)
|
||||
chk = bech32Polymod(chk) ^ v;
|
||||
for (let i = 0; i < 6; i++)
|
||||
chk = bech32Polymod(chk);
|
||||
chk ^= encodingConst;
|
||||
return BECH_ALPHABET.encode(convertRadix2([chk % 2 ** 30], 30, 5, false));
|
||||
}
|
||||
function genBech32(encoding) {
|
||||
const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;
|
||||
const _words = radix2(5);
|
||||
const fromWords = _words.decode;
|
||||
const toWords = _words.encode;
|
||||
const fromWordsUnsafe = unsafeWrapper(fromWords);
|
||||
function encode(prefix, words, limit = 90) {
|
||||
if (typeof prefix !== 'string')
|
||||
throw new Error(`bech32.encode prefix should be string, not ${typeof prefix}`);
|
||||
if (!Array.isArray(words) || (words.length && typeof words[0] !== 'number'))
|
||||
throw new Error(`bech32.encode words should be array of numbers, not ${typeof words}`);
|
||||
const actualLength = prefix.length + 7 + words.length;
|
||||
if (limit !== false && actualLength > limit)
|
||||
throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);
|
||||
prefix = prefix.toLowerCase();
|
||||
return `${prefix}1${BECH_ALPHABET.encode(words)}${bechChecksum(prefix, words, ENCODING_CONST)}`;
|
||||
}
|
||||
function decode(str, limit = 90) {
|
||||
if (typeof str !== 'string')
|
||||
throw new Error(`bech32.decode input should be string, not ${typeof str}`);
|
||||
if (str.length < 8 || (limit !== false && str.length > limit))
|
||||
throw new TypeError(`Wrong string length: ${str.length} (${str}). Expected (8..${limit})`);
|
||||
const lowered = str.toLowerCase();
|
||||
if (str !== lowered && str !== str.toUpperCase())
|
||||
throw new Error(`String must be lowercase or uppercase`);
|
||||
str = lowered;
|
||||
const sepIndex = str.lastIndexOf('1');
|
||||
if (sepIndex === 0 || sepIndex === -1)
|
||||
throw new Error(`Letter "1" must be present between prefix and data only`);
|
||||
const prefix = str.slice(0, sepIndex);
|
||||
const _words = str.slice(sepIndex + 1);
|
||||
if (_words.length < 6)
|
||||
throw new Error('Data must be at least 6 characters long');
|
||||
const words = BECH_ALPHABET.decode(_words).slice(0, -6);
|
||||
const sum = bechChecksum(prefix, words, ENCODING_CONST);
|
||||
if (!_words.endsWith(sum))
|
||||
throw new Error(`Invalid checksum in ${str}: expected "${sum}"`);
|
||||
return { prefix, words };
|
||||
}
|
||||
const decodeUnsafe = unsafeWrapper(decode);
|
||||
function decodeToBytes(str) {
|
||||
const { prefix, words } = decode(str, false);
|
||||
return { prefix, words, bytes: fromWords(words) };
|
||||
}
|
||||
return { encode, decode, decodeToBytes, decodeUnsafe, fromWords, fromWordsUnsafe, toWords };
|
||||
}
|
||||
export const bech32 = genBech32('bech32');
|
||||
export const bech32m = genBech32('bech32m');
|
||||
export const utf8 = {
|
||||
encode: (data) => new TextDecoder().decode(data),
|
||||
decode: (str) => new TextEncoder().encode(str),
|
||||
};
|
||||
export const hex = chain(radix2(4), alphabet('0123456789abcdef'), join(''), normalize((s) => {
|
||||
if (typeof s !== 'string' || s.length % 2)
|
||||
throw new TypeError(`hex.decode: expected string, got ${typeof s} with length ${s.length}`);
|
||||
return s.toLowerCase();
|
||||
}));
|
||||
const CODERS = {
|
||||
utf8, hex, base16, base32, base64, base64url, base58, base58xmr
|
||||
};
|
||||
const coderTypeError = `Invalid encoding type. Available types: ${Object.keys(CODERS).join(', ')}`;
|
||||
export const bytesToString = (type, bytes) => {
|
||||
if (typeof type !== 'string' || !CODERS.hasOwnProperty(type))
|
||||
throw new TypeError(coderTypeError);
|
||||
if (!(bytes instanceof Uint8Array))
|
||||
throw new TypeError('bytesToString() expects Uint8Array');
|
||||
return CODERS[type].encode(bytes);
|
||||
};
|
||||
export const str = bytesToString;
|
||||
export const stringToBytes = (type, str) => {
|
||||
if (!CODERS.hasOwnProperty(type))
|
||||
throw new TypeError(coderTypeError);
|
||||
if (typeof str !== 'string')
|
||||
throw new TypeError('stringToBytes() expects string');
|
||||
return CODERS[type].decode(str);
|
||||
};
|
||||
export const bytes = stringToBytes;
|
||||
1
node_modules/light-bolt11-decoder/node_modules/@scure/base/lib/esm/package.json
generated
vendored
Normal file
1
node_modules/light-bolt11-decoder/node_modules/@scure/base/lib/esm/package.json
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{ "type": "module" }
|
||||
92
node_modules/light-bolt11-decoder/node_modules/@scure/base/lib/index.d.ts
generated
vendored
Normal file
92
node_modules/light-bolt11-decoder/node_modules/@scure/base/lib/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
||||
export declare function assertNumber(n: number): void;
|
||||
export interface Coder<F, T> {
|
||||
encode(from: F): T;
|
||||
decode(to: T): F;
|
||||
}
|
||||
export interface BytesCoder extends Coder<Uint8Array, string> {
|
||||
encode: (data: Uint8Array) => string;
|
||||
decode: (str: string) => Uint8Array;
|
||||
}
|
||||
declare type Chain = [Coder<any, any>, ...Coder<any, any>[]];
|
||||
declare type Input<F> = F extends Coder<infer T, any> ? T : never;
|
||||
declare type Output<F> = F extends Coder<any, infer T> ? T : never;
|
||||
declare type First<T> = T extends [infer U, ...any[]] ? U : never;
|
||||
declare type Last<T> = T extends [...any[], infer U] ? U : never;
|
||||
declare type Tail<T> = T extends [any, ...infer U] ? U : never;
|
||||
declare type AsChain<C extends Chain, Rest = Tail<C>> = {
|
||||
[K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;
|
||||
};
|
||||
declare function chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>>;
|
||||
declare type Alphabet = string[] | string;
|
||||
declare function alphabet(alphabet: Alphabet): Coder<number[], string[]>;
|
||||
declare function join(separator?: string): Coder<string[], string>;
|
||||
declare function padding(bits: number, chr?: string): Coder<string[], string[]>;
|
||||
declare function radix(num: number): Coder<Uint8Array, number[]>;
|
||||
declare function radix2(bits: number, revPadding?: boolean): Coder<Uint8Array, number[]>;
|
||||
declare function checksum(len: number, fn: (data: Uint8Array) => Uint8Array): Coder<Uint8Array, Uint8Array>;
|
||||
export declare const utils: {
|
||||
alphabet: typeof alphabet;
|
||||
chain: typeof chain;
|
||||
checksum: typeof checksum;
|
||||
radix: typeof radix;
|
||||
radix2: typeof radix2;
|
||||
join: typeof join;
|
||||
padding: typeof padding;
|
||||
};
|
||||
export declare const base16: BytesCoder;
|
||||
export declare const base32: BytesCoder;
|
||||
export declare const base32hex: BytesCoder;
|
||||
export declare const base32crockford: BytesCoder;
|
||||
export declare const base64: BytesCoder;
|
||||
export declare const base64url: BytesCoder;
|
||||
export declare const base58: BytesCoder;
|
||||
export declare const base58flickr: BytesCoder;
|
||||
export declare const base58xrp: BytesCoder;
|
||||
export declare const base58xmr: BytesCoder;
|
||||
export declare const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder;
|
||||
export interface Bech32Decoded {
|
||||
prefix: string;
|
||||
words: number[];
|
||||
}
|
||||
export interface Bech32DecodedWithArray {
|
||||
prefix: string;
|
||||
words: number[];
|
||||
bytes: Uint8Array;
|
||||
}
|
||||
export declare const bech32: {
|
||||
encode: (prefix: string, words: number[] | Uint8Array, limit?: number | false) => string;
|
||||
decode: (str: string, limit?: number | false) => Bech32Decoded;
|
||||
decodeToBytes: (str: string) => Bech32DecodedWithArray;
|
||||
decodeUnsafe: (str: string, limit?: number | false | undefined) => Bech32Decoded | undefined;
|
||||
fromWords: (to: number[]) => Uint8Array;
|
||||
fromWordsUnsafe: (to: number[]) => Uint8Array | undefined;
|
||||
toWords: (from: Uint8Array) => number[];
|
||||
};
|
||||
export declare const bech32m: {
|
||||
encode: (prefix: string, words: number[] | Uint8Array, limit?: number | false) => string;
|
||||
decode: (str: string, limit?: number | false) => Bech32Decoded;
|
||||
decodeToBytes: (str: string) => Bech32DecodedWithArray;
|
||||
decodeUnsafe: (str: string, limit?: number | false | undefined) => Bech32Decoded | undefined;
|
||||
fromWords: (to: number[]) => Uint8Array;
|
||||
fromWordsUnsafe: (to: number[]) => Uint8Array | undefined;
|
||||
toWords: (from: Uint8Array) => number[];
|
||||
};
|
||||
export declare const utf8: BytesCoder;
|
||||
export declare const hex: BytesCoder;
|
||||
declare const CODERS: {
|
||||
utf8: BytesCoder;
|
||||
hex: BytesCoder;
|
||||
base16: BytesCoder;
|
||||
base32: BytesCoder;
|
||||
base64: BytesCoder;
|
||||
base64url: BytesCoder;
|
||||
base58: BytesCoder;
|
||||
base58xmr: BytesCoder;
|
||||
};
|
||||
declare type CoderType = keyof typeof CODERS;
|
||||
export declare const bytesToString: (type: CoderType, bytes: Uint8Array) => string;
|
||||
export declare const str: (type: CoderType, bytes: Uint8Array) => string;
|
||||
export declare const stringToBytes: (type: CoderType, str: string) => Uint8Array;
|
||||
export declare const bytes: (type: CoderType, str: string) => Uint8Array;
|
||||
export {};
|
||||
401
node_modules/light-bolt11-decoder/node_modules/@scure/base/lib/index.js
generated
vendored
Normal file
401
node_modules/light-bolt11-decoder/node_modules/@scure/base/lib/index.js
generated
vendored
Normal file
@@ -0,0 +1,401 @@
|
||||
"use strict";
|
||||
/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.bytes = exports.stringToBytes = exports.str = exports.bytesToString = exports.hex = exports.utf8 = exports.bech32m = exports.bech32 = exports.base58check = exports.base58xmr = exports.base58xrp = exports.base58flickr = exports.base58 = exports.base64url = exports.base64 = exports.base32crockford = exports.base32hex = exports.base32 = exports.base16 = exports.utils = exports.assertNumber = void 0;
|
||||
function assertNumber(n) {
|
||||
if (!Number.isSafeInteger(n))
|
||||
throw new Error(`Wrong integer: ${n}`);
|
||||
}
|
||||
exports.assertNumber = assertNumber;
|
||||
function chain(...args) {
|
||||
const wrap = (a, b) => (c) => a(b(c));
|
||||
const encode = Array.from(args)
|
||||
.reverse()
|
||||
.reduce((acc, i) => (acc ? wrap(acc, i.encode) : i.encode), undefined);
|
||||
const decode = args.reduce((acc, i) => (acc ? wrap(acc, i.decode) : i.decode), undefined);
|
||||
return { encode, decode };
|
||||
}
|
||||
function alphabet(alphabet) {
|
||||
return {
|
||||
encode: (digits) => {
|
||||
if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
|
||||
throw new Error('alphabet.encode input should be an array of numbers');
|
||||
return digits.map((i) => {
|
||||
assertNumber(i);
|
||||
if (i < 0 || i >= alphabet.length)
|
||||
throw new Error(`Digit index outside alphabet: ${i} (alphabet: ${alphabet.length})`);
|
||||
return alphabet[i];
|
||||
});
|
||||
},
|
||||
decode: (input) => {
|
||||
if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))
|
||||
throw new Error('alphabet.decode input should be array of strings');
|
||||
return input.map((letter) => {
|
||||
if (typeof letter !== 'string')
|
||||
throw new Error(`alphabet.decode: not string element=${letter}`);
|
||||
const index = alphabet.indexOf(letter);
|
||||
if (index === -1)
|
||||
throw new Error(`Unknown letter: "${letter}". Allowed: ${alphabet}`);
|
||||
return index;
|
||||
});
|
||||
},
|
||||
};
|
||||
}
|
||||
function join(separator = '') {
|
||||
if (typeof separator !== 'string')
|
||||
throw new Error('join separator should be string');
|
||||
return {
|
||||
encode: (from) => {
|
||||
if (!Array.isArray(from) || (from.length && typeof from[0] !== 'string'))
|
||||
throw new Error('join.encode input should be array of strings');
|
||||
for (let i of from)
|
||||
if (typeof i !== 'string')
|
||||
throw new Error(`join.encode: non-string input=${i}`);
|
||||
return from.join(separator);
|
||||
},
|
||||
decode: (to) => {
|
||||
if (typeof to !== 'string')
|
||||
throw new Error('join.decode input should be string');
|
||||
return to.split(separator);
|
||||
},
|
||||
};
|
||||
}
|
||||
function padding(bits, chr = '=') {
|
||||
assertNumber(bits);
|
||||
if (typeof chr !== 'string')
|
||||
throw new Error('padding chr should be string');
|
||||
return {
|
||||
encode(data) {
|
||||
if (!Array.isArray(data) || (data.length && typeof data[0] !== 'string'))
|
||||
throw new Error('padding.encode input should be array of strings');
|
||||
for (let i of data)
|
||||
if (typeof i !== 'string')
|
||||
throw new Error(`padding.encode: non-string input=${i}`);
|
||||
while ((data.length * bits) % 8)
|
||||
data.push(chr);
|
||||
return data;
|
||||
},
|
||||
decode(input) {
|
||||
if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))
|
||||
throw new Error('padding.encode input should be array of strings');
|
||||
for (let i of input)
|
||||
if (typeof i !== 'string')
|
||||
throw new Error(`padding.decode: non-string input=${i}`);
|
||||
let end = input.length;
|
||||
if ((end * bits) % 8)
|
||||
throw new Error('Invalid padding: string should have whole number of bytes');
|
||||
for (; end > 0 && input[end - 1] === chr; end--) {
|
||||
if (!(((end - 1) * bits) % 8))
|
||||
throw new Error('Invalid padding: string has too much padding');
|
||||
}
|
||||
return input.slice(0, end);
|
||||
},
|
||||
};
|
||||
}
|
||||
function normalize(fn) {
|
||||
if (typeof fn !== 'function')
|
||||
throw new Error('normalize fn should be function');
|
||||
return { encode: (from) => from, decode: (to) => fn(to) };
|
||||
}
|
||||
function convertRadix(data, from, to) {
|
||||
if (from < 2)
|
||||
throw new Error(`convertRadix: wrong from=${from}, base cannot be less than 2`);
|
||||
if (to < 2)
|
||||
throw new Error(`convertRadix: wrong to=${to}, base cannot be less than 2`);
|
||||
if (!Array.isArray(data))
|
||||
throw new Error('convertRadix: data should be array');
|
||||
if (!data.length)
|
||||
return [];
|
||||
let pos = 0;
|
||||
const res = [];
|
||||
const digits = Array.from(data);
|
||||
digits.forEach((d) => {
|
||||
assertNumber(d);
|
||||
if (d < 0 || d >= from)
|
||||
throw new Error(`Wrong integer: ${d}`);
|
||||
});
|
||||
while (true) {
|
||||
let carry = 0;
|
||||
let done = true;
|
||||
for (let i = pos; i < digits.length; i++) {
|
||||
const digit = digits[i];
|
||||
const digitBase = from * carry + digit;
|
||||
if (!Number.isSafeInteger(digitBase) ||
|
||||
(from * carry) / from !== carry ||
|
||||
digitBase - digit !== from * carry) {
|
||||
throw new Error('convertRadix: carry overflow');
|
||||
}
|
||||
carry = digitBase % to;
|
||||
digits[i] = Math.floor(digitBase / to);
|
||||
if (!Number.isSafeInteger(digits[i]) || digits[i] * to + carry !== digitBase)
|
||||
throw new Error('convertRadix: carry overflow');
|
||||
if (!done)
|
||||
continue;
|
||||
else if (!digits[i])
|
||||
pos = i;
|
||||
else
|
||||
done = false;
|
||||
}
|
||||
res.push(carry);
|
||||
if (done)
|
||||
break;
|
||||
}
|
||||
for (let i = 0; i < data.length - 1 && data[i] === 0; i++)
|
||||
res.push(0);
|
||||
return res.reverse();
|
||||
}
|
||||
const gcd = (a, b) => (!b ? a : gcd(b, a % b));
|
||||
const radix2carry = (from, to) => from + (to - gcd(from, to));
|
||||
function convertRadix2(data, from, to, padding) {
|
||||
if (!Array.isArray(data))
|
||||
throw new Error('convertRadix2: data should be array');
|
||||
if (from <= 0 || from > 32)
|
||||
throw new Error(`convertRadix2: wrong from=${from}`);
|
||||
if (to <= 0 || to > 32)
|
||||
throw new Error(`convertRadix2: wrong to=${to}`);
|
||||
if (radix2carry(from, to) > 32) {
|
||||
throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`);
|
||||
}
|
||||
let carry = 0;
|
||||
let pos = 0;
|
||||
const mask = 2 ** to - 1;
|
||||
const res = [];
|
||||
for (const n of data) {
|
||||
assertNumber(n);
|
||||
if (n >= 2 ** from)
|
||||
throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);
|
||||
carry = (carry << from) | n;
|
||||
if (pos + from > 32)
|
||||
throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);
|
||||
pos += from;
|
||||
for (; pos >= to; pos -= to)
|
||||
res.push(((carry >> (pos - to)) & mask) >>> 0);
|
||||
carry &= 2 ** pos - 1;
|
||||
}
|
||||
carry = (carry << (to - pos)) & mask;
|
||||
if (!padding && pos >= from)
|
||||
throw new Error('Excess padding');
|
||||
if (!padding && carry)
|
||||
throw new Error(`Non-zero padding: ${carry}`);
|
||||
if (padding && pos > 0)
|
||||
res.push(carry >>> 0);
|
||||
return res;
|
||||
}
|
||||
function radix(num) {
|
||||
assertNumber(num);
|
||||
return {
|
||||
encode: (bytes) => {
|
||||
if (!(bytes instanceof Uint8Array))
|
||||
throw new Error('radix.encode input should be Uint8Array');
|
||||
return convertRadix(Array.from(bytes), 2 ** 8, num);
|
||||
},
|
||||
decode: (digits) => {
|
||||
if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
|
||||
throw new Error('radix.decode input should be array of strings');
|
||||
return Uint8Array.from(convertRadix(digits, num, 2 ** 8));
|
||||
},
|
||||
};
|
||||
}
|
||||
function radix2(bits, revPadding = false) {
|
||||
assertNumber(bits);
|
||||
if (bits <= 0 || bits > 32)
|
||||
throw new Error('radix2: bits should be in (0..32]');
|
||||
if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)
|
||||
throw new Error('radix2: carry overflow');
|
||||
return {
|
||||
encode: (bytes) => {
|
||||
if (!(bytes instanceof Uint8Array))
|
||||
throw new Error('radix2.encode input should be Uint8Array');
|
||||
return convertRadix2(Array.from(bytes), 8, bits, !revPadding);
|
||||
},
|
||||
decode: (digits) => {
|
||||
if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
|
||||
throw new Error('radix2.decode input should be array of strings');
|
||||
return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));
|
||||
},
|
||||
};
|
||||
}
|
||||
function unsafeWrapper(fn) {
|
||||
if (typeof fn !== 'function')
|
||||
throw new Error('unsafeWrapper fn should be function');
|
||||
return function (...args) {
|
||||
try {
|
||||
return fn.apply(null, args);
|
||||
}
|
||||
catch (e) { }
|
||||
};
|
||||
}
|
||||
function checksum(len, fn) {
|
||||
assertNumber(len);
|
||||
if (typeof fn !== 'function')
|
||||
throw new Error('checksum fn should be function');
|
||||
return {
|
||||
encode(data) {
|
||||
if (!(data instanceof Uint8Array))
|
||||
throw new Error('checksum.encode: input should be Uint8Array');
|
||||
const checksum = fn(data).slice(0, len);
|
||||
const res = new Uint8Array(data.length + len);
|
||||
res.set(data);
|
||||
res.set(checksum, data.length);
|
||||
return res;
|
||||
},
|
||||
decode(data) {
|
||||
if (!(data instanceof Uint8Array))
|
||||
throw new Error('checksum.decode: input should be Uint8Array');
|
||||
const payload = data.slice(0, -len);
|
||||
const newChecksum = fn(payload).slice(0, len);
|
||||
const oldChecksum = data.slice(-len);
|
||||
for (let i = 0; i < len; i++)
|
||||
if (newChecksum[i] !== oldChecksum[i])
|
||||
throw new Error('Invalid checksum');
|
||||
return payload;
|
||||
},
|
||||
};
|
||||
}
|
||||
exports.utils = { alphabet, chain, checksum, radix, radix2, join, padding };
|
||||
exports.base16 = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));
|
||||
exports.base32 = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), padding(5), join(''));
|
||||
exports.base32hex = chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), padding(5), join(''));
|
||||
exports.base32crockford = chain(radix2(5), alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'), join(''), normalize((s) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1')));
|
||||
exports.base64 = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), padding(6), join(''));
|
||||
exports.base64url = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), padding(6), join(''));
|
||||
const genBase58 = (abc) => chain(radix(58), alphabet(abc), join(''));
|
||||
exports.base58 = genBase58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
|
||||
exports.base58flickr = genBase58('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ');
|
||||
exports.base58xrp = genBase58('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz');
|
||||
const XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];
|
||||
exports.base58xmr = {
|
||||
encode(data) {
|
||||
let res = '';
|
||||
for (let i = 0; i < data.length; i += 8) {
|
||||
const block = data.subarray(i, i + 8);
|
||||
res += exports.base58.encode(block).padStart(XMR_BLOCK_LEN[block.length], '1');
|
||||
}
|
||||
return res;
|
||||
},
|
||||
decode(str) {
|
||||
let res = [];
|
||||
for (let i = 0; i < str.length; i += 11) {
|
||||
const slice = str.slice(i, i + 11);
|
||||
const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);
|
||||
const block = exports.base58.decode(slice);
|
||||
for (let j = 0; j < block.length - blockLen; j++) {
|
||||
if (block[j] !== 0)
|
||||
throw new Error('base58xmr: wrong padding');
|
||||
}
|
||||
res = res.concat(Array.from(block.slice(block.length - blockLen)));
|
||||
}
|
||||
return Uint8Array.from(res);
|
||||
},
|
||||
};
|
||||
const base58check = (sha256) => chain(checksum(4, (data) => sha256(sha256(data))), exports.base58);
|
||||
exports.base58check = base58check;
|
||||
const BECH_ALPHABET = chain(alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), join(''));
|
||||
const POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];
|
||||
function bech32Polymod(pre) {
|
||||
const b = pre >> 25;
|
||||
let chk = (pre & 0x1ffffff) << 5;
|
||||
for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {
|
||||
if (((b >> i) & 1) === 1)
|
||||
chk ^= POLYMOD_GENERATORS[i];
|
||||
}
|
||||
return chk;
|
||||
}
|
||||
function bechChecksum(prefix, words, encodingConst = 1) {
|
||||
const len = prefix.length;
|
||||
let chk = 1;
|
||||
for (let i = 0; i < len; i++) {
|
||||
const c = prefix.charCodeAt(i);
|
||||
if (c < 33 || c > 126)
|
||||
throw new Error(`Invalid prefix (${prefix})`);
|
||||
chk = bech32Polymod(chk) ^ (c >> 5);
|
||||
}
|
||||
chk = bech32Polymod(chk);
|
||||
for (let i = 0; i < len; i++)
|
||||
chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);
|
||||
for (let v of words)
|
||||
chk = bech32Polymod(chk) ^ v;
|
||||
for (let i = 0; i < 6; i++)
|
||||
chk = bech32Polymod(chk);
|
||||
chk ^= encodingConst;
|
||||
return BECH_ALPHABET.encode(convertRadix2([chk % 2 ** 30], 30, 5, false));
|
||||
}
|
||||
function genBech32(encoding) {
|
||||
const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;
|
||||
const _words = radix2(5);
|
||||
const fromWords = _words.decode;
|
||||
const toWords = _words.encode;
|
||||
const fromWordsUnsafe = unsafeWrapper(fromWords);
|
||||
function encode(prefix, words, limit = 90) {
|
||||
if (typeof prefix !== 'string')
|
||||
throw new Error(`bech32.encode prefix should be string, not ${typeof prefix}`);
|
||||
if (!Array.isArray(words) || (words.length && typeof words[0] !== 'number'))
|
||||
throw new Error(`bech32.encode words should be array of numbers, not ${typeof words}`);
|
||||
const actualLength = prefix.length + 7 + words.length;
|
||||
if (limit !== false && actualLength > limit)
|
||||
throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);
|
||||
prefix = prefix.toLowerCase();
|
||||
return `${prefix}1${BECH_ALPHABET.encode(words)}${bechChecksum(prefix, words, ENCODING_CONST)}`;
|
||||
}
|
||||
function decode(str, limit = 90) {
|
||||
if (typeof str !== 'string')
|
||||
throw new Error(`bech32.decode input should be string, not ${typeof str}`);
|
||||
if (str.length < 8 || (limit !== false && str.length > limit))
|
||||
throw new TypeError(`Wrong string length: ${str.length} (${str}). Expected (8..${limit})`);
|
||||
const lowered = str.toLowerCase();
|
||||
if (str !== lowered && str !== str.toUpperCase())
|
||||
throw new Error(`String must be lowercase or uppercase`);
|
||||
str = lowered;
|
||||
const sepIndex = str.lastIndexOf('1');
|
||||
if (sepIndex === 0 || sepIndex === -1)
|
||||
throw new Error(`Letter "1" must be present between prefix and data only`);
|
||||
const prefix = str.slice(0, sepIndex);
|
||||
const _words = str.slice(sepIndex + 1);
|
||||
if (_words.length < 6)
|
||||
throw new Error('Data must be at least 6 characters long');
|
||||
const words = BECH_ALPHABET.decode(_words).slice(0, -6);
|
||||
const sum = bechChecksum(prefix, words, ENCODING_CONST);
|
||||
if (!_words.endsWith(sum))
|
||||
throw new Error(`Invalid checksum in ${str}: expected "${sum}"`);
|
||||
return { prefix, words };
|
||||
}
|
||||
const decodeUnsafe = unsafeWrapper(decode);
|
||||
function decodeToBytes(str) {
|
||||
const { prefix, words } = decode(str, false);
|
||||
return { prefix, words, bytes: fromWords(words) };
|
||||
}
|
||||
return { encode, decode, decodeToBytes, decodeUnsafe, fromWords, fromWordsUnsafe, toWords };
|
||||
}
|
||||
exports.bech32 = genBech32('bech32');
|
||||
exports.bech32m = genBech32('bech32m');
|
||||
exports.utf8 = {
|
||||
encode: (data) => new TextDecoder().decode(data),
|
||||
decode: (str) => new TextEncoder().encode(str),
|
||||
};
|
||||
exports.hex = chain(radix2(4), alphabet('0123456789abcdef'), join(''), normalize((s) => {
|
||||
if (typeof s !== 'string' || s.length % 2)
|
||||
throw new TypeError(`hex.decode: expected string, got ${typeof s} with length ${s.length}`);
|
||||
return s.toLowerCase();
|
||||
}));
|
||||
const CODERS = {
|
||||
utf8: exports.utf8, hex: exports.hex, base16: exports.base16, base32: exports.base32, base64: exports.base64, base64url: exports.base64url, base58: exports.base58, base58xmr: exports.base58xmr
|
||||
};
|
||||
const coderTypeError = `Invalid encoding type. Available types: ${Object.keys(CODERS).join(', ')}`;
|
||||
const bytesToString = (type, bytes) => {
|
||||
if (typeof type !== 'string' || !CODERS.hasOwnProperty(type))
|
||||
throw new TypeError(coderTypeError);
|
||||
if (!(bytes instanceof Uint8Array))
|
||||
throw new TypeError('bytesToString() expects Uint8Array');
|
||||
return CODERS[type].encode(bytes);
|
||||
};
|
||||
exports.bytesToString = bytesToString;
|
||||
exports.str = exports.bytesToString;
|
||||
const stringToBytes = (type, str) => {
|
||||
if (!CODERS.hasOwnProperty(type))
|
||||
throw new TypeError(coderTypeError);
|
||||
if (typeof str !== 'string')
|
||||
throw new TypeError('stringToBytes() expects string');
|
||||
return CODERS[type].decode(str);
|
||||
};
|
||||
exports.stringToBytes = stringToBytes;
|
||||
exports.bytes = exports.stringToBytes;
|
||||
60
node_modules/light-bolt11-decoder/node_modules/@scure/base/package.json
generated
vendored
Normal file
60
node_modules/light-bolt11-decoder/node_modules/@scure/base/package.json
generated
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"name": "@scure/base",
|
||||
"version": "1.1.1",
|
||||
"description": "Secure, audited & 0-dep implementation of bech32, base64, base58, base32 & base16",
|
||||
"files": [
|
||||
"lib/index.js",
|
||||
"lib/esm/index.js",
|
||||
"lib/esm/package.json",
|
||||
"lib/index.d.ts"
|
||||
],
|
||||
"main": "lib/index.js",
|
||||
"module": "lib/esm/index.js",
|
||||
"types": "lib/index.d.ts",
|
||||
"exports": {
|
||||
".": {
|
||||
"import": "./lib/esm/index.js",
|
||||
"default": "./lib/index.js"
|
||||
},
|
||||
"./index.d.ts": "./lib/index.d.ts"
|
||||
},
|
||||
"scripts": {
|
||||
"bench": "node test/benchmark/index.js",
|
||||
"build": "tsc -d && tsc -p tsconfig.esm.json",
|
||||
"lint": "prettier --check index.ts",
|
||||
"test": "node test/index.js"
|
||||
},
|
||||
"author": "Paul Miller (https://paulmillr.com)",
|
||||
"license": "MIT",
|
||||
"homepage": "https://github.com/paulmillr/scure-base",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/paulmillr/scure-base.git"
|
||||
},
|
||||
"devDependencies": {
|
||||
"micro-should": "0.2.0",
|
||||
"prettier": "2.6.2",
|
||||
"typescript": "4.7.3"
|
||||
},
|
||||
"keywords": [
|
||||
"bech32",
|
||||
"bech32m",
|
||||
"base64",
|
||||
"base58",
|
||||
"base32",
|
||||
"base16",
|
||||
"rfc4648",
|
||||
"rfc3548",
|
||||
"crockford",
|
||||
"encode",
|
||||
"encoder",
|
||||
"base-x",
|
||||
"base"
|
||||
],
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
]
|
||||
}
|
||||
30
node_modules/light-bolt11-decoder/package.json
generated
vendored
Normal file
30
node_modules/light-bolt11-decoder/package.json
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"name": "light-bolt11-decoder",
|
||||
"version": "3.2.0",
|
||||
"description": "decode lightning invoices without overhead (doesn't check signatures).",
|
||||
"main": "bolt11.js",
|
||||
"types": "bolt11.d.ts",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/fiatjaf/light-bolt11-decoder.git"
|
||||
},
|
||||
"keywords": [
|
||||
"invoice",
|
||||
"payment",
|
||||
"request",
|
||||
"lightning",
|
||||
"network",
|
||||
"bolt11",
|
||||
"bech32"
|
||||
],
|
||||
"author": "fiatjaf",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@scure/base": "1.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"eslint": "^8.0.0",
|
||||
"jest": "^29.4.3",
|
||||
"prettier": "^2.4.1"
|
||||
}
|
||||
}
|
||||
165
node_modules/light-bolt11-decoder/tests/basic.test.js
generated
vendored
Normal file
165
node_modules/light-bolt11-decoder/tests/basic.test.js
generated
vendored
Normal file
@@ -0,0 +1,165 @@
|
||||
/* eslint-env jest */
|
||||
|
||||
const {decode} = require('..')
|
||||
|
||||
describe('decoding', () => {
|
||||
it('should decode an invoice', () => {
|
||||
let inv = decode(
|
||||
'lnbc20u1p3y0x3hpp5743k2g0fsqqxj7n8qzuhns5gmkk4djeejk3wkp64ppevgekvc0jsdqcve5kzar2v9nr5gpqd4hkuetesp5ez2g297jduwc20t6lmqlsg3man0vf2jfd8ar9fh8fhn2g8yttfkqxqy9gcqcqzys9qrsgqrzjqtx3k77yrrav9hye7zar2rtqlfkytl094dsp0ms5majzth6gt7ca6uhdkxl983uywgqqqqlgqqqvx5qqjqrzjqd98kxkpyw0l9tyy8r8q57k7zpy9zjmh6sez752wj6gcumqnj3yxzhdsmg6qq56utgqqqqqqqqqqqeqqjq7jd56882gtxhrjm03c93aacyfy306m4fq0tskf83c0nmet8zc2lxyyg3saz8x6vwcp26xnrlagf9semau3qm2glysp7sv95693fphvsp54l567'
|
||||
)
|
||||
expect(inv).toEqual({
|
||||
paymentRequest:
|
||||
'lnbc20u1p3y0x3hpp5743k2g0fsqqxj7n8qzuhns5gmkk4djeejk3wkp64ppevgekvc0jsdqcve5kzar2v9nr5gpqd4hkuetesp5ez2g297jduwc20t6lmqlsg3man0vf2jfd8ar9fh8fhn2g8yttfkqxqy9gcqcqzys9qrsgqrzjqtx3k77yrrav9hye7zar2rtqlfkytl094dsp0ms5majzth6gt7ca6uhdkxl983uywgqqqqlgqqqvx5qqjqrzjqd98kxkpyw0l9tyy8r8q57k7zpy9zjmh6sez752wj6gcumqnj3yxzhdsmg6qq56utgqqqqqqqqqqqeqqjq7jd56882gtxhrjm03c93aacyfy306m4fq0tskf83c0nmet8zc2lxyyg3saz8x6vwcp26xnrlagf9semau3qm2glysp7sv95693fphvsp54l567',
|
||||
sections: [
|
||||
{
|
||||
name: 'lightning_network',
|
||||
letters: 'ln'
|
||||
},
|
||||
{
|
||||
name: 'coin_network',
|
||||
letters: 'bc',
|
||||
value: {
|
||||
bech32: 'bc',
|
||||
pubKeyHash: 0,
|
||||
scriptHash: 5,
|
||||
validWitnessVersions: [0]
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'amount',
|
||||
letters: '20u',
|
||||
value: '2000000'
|
||||
},
|
||||
{
|
||||
name: 'separator',
|
||||
letters: '1'
|
||||
},
|
||||
{
|
||||
name: 'timestamp',
|
||||
letters: 'p3y0x3h',
|
||||
value: 1648859703
|
||||
},
|
||||
{
|
||||
name: 'payment_hash',
|
||||
tag: 'p',
|
||||
letters: 'pp5743k2g0fsqqxj7n8qzuhns5gmkk4djeejk3wkp64ppevgekvc0js',
|
||||
value:
|
||||
'f5636521e98000697a6700b979c288ddad56cb3995a2eb07550872c466ccc3e5'
|
||||
},
|
||||
{
|
||||
name: 'description',
|
||||
tag: 'd',
|
||||
letters: 'dqcve5kzar2v9nr5gpqd4hkuete',
|
||||
value: 'fiatjaf: money'
|
||||
},
|
||||
{
|
||||
name: 'payment_secret',
|
||||
tag: 's',
|
||||
letters: 'sp5ez2g297jduwc20t6lmqlsg3man0vf2jfd8ar9fh8fhn2g8yttfkq',
|
||||
value:
|
||||
'c8948517d26f1d853d7afec1f8223becdec4aa4969fa32a6e74de6a41c8b5a6c'
|
||||
},
|
||||
{
|
||||
name: 'expiry',
|
||||
tag: 'x',
|
||||
letters: 'xqy9gcq',
|
||||
value: 172800
|
||||
},
|
||||
{
|
||||
name: 'min_final_cltv_expiry',
|
||||
tag: 'c',
|
||||
letters: 'cqzys',
|
||||
value: 144
|
||||
},
|
||||
{
|
||||
name: 'feature_bits',
|
||||
tag: '9',
|
||||
letters: '9qrsgq',
|
||||
value: {
|
||||
option_data_loss_protect: 'unsupported',
|
||||
initial_routing_sync: 'unsupported',
|
||||
option_upfront_shutdown_script: 'unsupported',
|
||||
gossip_queries: 'unsupported',
|
||||
var_onion_optin: 'required',
|
||||
gossip_queries_ex: 'unsupported',
|
||||
option_static_remotekey: 'unsupported',
|
||||
payment_secret: 'required',
|
||||
basic_mpp: 'unsupported',
|
||||
option_support_large_channel: 'unsupported',
|
||||
extra_bits: {
|
||||
start_bit: 20,
|
||||
bits: [],
|
||||
has_required: false
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'route_hint',
|
||||
tag: 'r',
|
||||
letters:
|
||||
'rzjqtx3k77yrrav9hye7zar2rtqlfkytl094dsp0ms5majzth6gt7ca6uhdkxl983uywgqqqqlgqqqvx5qqjq',
|
||||
value: [
|
||||
{
|
||||
pubkey:
|
||||
'02cd1b7bc418fac2dc99f0ba350d60fa6c45fde5ab6017ee14df6425df485fb1dd',
|
||||
short_channel_id: '72edb1be53c78472',
|
||||
fee_base_msat: 1000,
|
||||
fee_proportional_millionths: 50000,
|
||||
cltv_expiry_delta: 144
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'route_hint',
|
||||
tag: 'r',
|
||||
letters:
|
||||
'rzjqd98kxkpyw0l9tyy8r8q57k7zpy9zjmh6sez752wj6gcumqnj3yxzhdsmg6qq56utgqqqqqqqqqqqeqqjq',
|
||||
value: [
|
||||
{
|
||||
pubkey:
|
||||
'034a7b1ac1239ff2ac8438ce0a7ade1048514b77d4322f514e96918e6c13944861',
|
||||
short_channel_id: '5db0da3400535c5a',
|
||||
fee_base_msat: 0,
|
||||
fee_proportional_millionths: 100,
|
||||
cltv_expiry_delta: 144
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'signature',
|
||||
letters:
|
||||
'7jd56882gtxhrjm03c93aacyfy306m4fq0tskf83c0nmet8zc2lxyyg3saz8x6vwcp26xnrlagf9semau3qm2glysp7sv95693fphvsp',
|
||||
value:
|
||||
'f49b4d1cea42cd71cb6f8e0b1ef7044922fd6ea903d70b24f1c3e7bcace2c2be621111874473698ec055a34c7fea1258677de441b523e4807d06169a2c521bb201'
|
||||
},
|
||||
{
|
||||
name: 'checksum',
|
||||
letters: '54l567'
|
||||
}
|
||||
],
|
||||
expiry: 172800,
|
||||
route_hints: [
|
||||
[
|
||||
{
|
||||
pubkey:
|
||||
'02cd1b7bc418fac2dc99f0ba350d60fa6c45fde5ab6017ee14df6425df485fb1dd',
|
||||
short_channel_id: '72edb1be53c78472',
|
||||
fee_base_msat: 1000,
|
||||
fee_proportional_millionths: 50000,
|
||||
cltv_expiry_delta: 144
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
pubkey:
|
||||
'034a7b1ac1239ff2ac8438ce0a7ade1048514b77d4322f514e96918e6c13944861',
|
||||
short_channel_id: '5db0da3400535c5a',
|
||||
fee_base_msat: 0,
|
||||
fee_proportional_millionths: 100,
|
||||
cltv_expiry_delta: 144
|
||||
}
|
||||
]
|
||||
]
|
||||
})
|
||||
})
|
||||
})
|
||||
1
node_modules/light-bolt11-decoder/tsconfig.json
generated
vendored
Normal file
1
node_modules/light-bolt11-decoder/tsconfig.json
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
645
node_modules/light-bolt11-decoder/yarn-error.log
generated
vendored
Normal file
645
node_modules/light-bolt11-decoder/yarn-error.log
generated
vendored
Normal file
@@ -0,0 +1,645 @@
|
||||
Arguments:
|
||||
/usr/local/bin/node /usr/bin/yarn
|
||||
|
||||
PATH:
|
||||
/home/fiatjaf/.yarn/bin:/home/fiatjaf/npm_modules/bin:/home/fiatjaf/.deno/bin:/home/fiatjaf/.yarn/bin:/home/fiatjaf/npm_modules/bin:/home/fiatjaf/.deno/bin:/home/fiatjaf/.yarn/bin:/home/fiatjaf/npm_modules/bin:/home/fiatjaf/.deno/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/fiatjaf/comp/go/bin:/home/fiatjaf/.pub-cache/bin:/home/fiatjaf/.cargo/bin:/home/fiatjaf/npm_modules/bin:/home/fiatjaf/node_modules/bin:/home/fiatjaf/.local/share/coursier/bin:/home/fiatjaf/.local/bin:/home/fiatjaf/comp/go/bin:/home/fiatjaf/.pub-cache/bin:/home/fiatjaf/.cargo/bin:/home/fiatjaf/npm_modules/bin:/home/fiatjaf/node_modules/bin:/home/fiatjaf/.local/share/coursier/bin:/home/fiatjaf/.local/bin:/home/fiatjaf/comp/go/bin:/home/fiatjaf/.pub-cache/bin:/home/fiatjaf/.cargo/bin:/home/fiatjaf/npm_modules/bin:/home/fiatjaf/node_modules/bin:/home/fiatjaf/.local/share/coursier/bin:/home/fiatjaf/.local/bin
|
||||
|
||||
Yarn version:
|
||||
1.22.19
|
||||
|
||||
Node version:
|
||||
18.14.0
|
||||
|
||||
Platform:
|
||||
linux x64
|
||||
|
||||
Trace:
|
||||
SyntaxError: /home/fiatjaf/comp/light-bolt11-decoder/package.json: Unexpected token } in JSON at position 431
|
||||
at JSON.parse (<anonymous>)
|
||||
at /usr/lib/node_modules/yarn/lib/cli.js:1629:59
|
||||
at Generator.next (<anonymous>)
|
||||
at step (/usr/lib/node_modules/yarn/lib/cli.js:310:30)
|
||||
at /usr/lib/node_modules/yarn/lib/cli.js:321:13
|
||||
|
||||
npm manifest:
|
||||
{
|
||||
"name": "light-bolt11-decoder",
|
||||
"version": "2.1.0",
|
||||
"description": "",
|
||||
"main": "bolt11.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/fiatjaf/light-bolt11-decoder.git"
|
||||
},
|
||||
"keywords": [
|
||||
"invoice",
|
||||
"payment",
|
||||
"request",
|
||||
"lightning",
|
||||
"network",
|
||||
"bolt11",
|
||||
"bech32"
|
||||
],
|
||||
"author": "fiatjaf",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@scure/base": "1.1.1",
|
||||
},
|
||||
"devDependencies": {
|
||||
"eslint": "^8.0.0",
|
||||
"prettier": "^2.4.1"
|
||||
}
|
||||
}
|
||||
|
||||
yarn manifest:
|
||||
No manifest
|
||||
|
||||
Lockfile:
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@eslint/eslintrc@^1.2.1":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6"
|
||||
integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==
|
||||
dependencies:
|
||||
ajv "^6.12.4"
|
||||
debug "^4.3.2"
|
||||
espree "^9.3.1"
|
||||
globals "^13.9.0"
|
||||
ignore "^5.2.0"
|
||||
import-fresh "^3.2.1"
|
||||
js-yaml "^4.1.0"
|
||||
minimatch "^3.0.4"
|
||||
strip-json-comments "^3.1.1"
|
||||
|
||||
"@humanwhocodes/config-array@^0.9.2":
|
||||
version "0.9.5"
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7"
|
||||
integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==
|
||||
dependencies:
|
||||
"@humanwhocodes/object-schema" "^1.2.1"
|
||||
debug "^4.1.1"
|
||||
minimatch "^3.0.4"
|
||||
|
||||
"@humanwhocodes/object-schema@^1.2.1":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
|
||||
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
|
||||
|
||||
acorn-jsx@^5.3.1:
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
||||
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
||||
|
||||
acorn@^8.7.0:
|
||||
version "8.7.0"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
|
||||
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
|
||||
|
||||
ajv@^6.10.0, ajv@^6.12.4:
|
||||
version "6.12.6"
|
||||
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"
|
||||
fast-json-stable-stringify "^2.0.0"
|
||||
json-schema-traverse "^0.4.1"
|
||||
uri-js "^4.2.2"
|
||||
|
||||
ansi-regex@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
|
||||
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
|
||||
|
||||
ansi-styles@^4.1.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
|
||||
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
|
||||
dependencies:
|
||||
color-convert "^2.0.1"
|
||||
|
||||
argparse@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
|
||||
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
|
||||
|
||||
balanced-match@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
||||
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
||||
|
||||
base64-js@^1.3.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
|
||||
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
||||
|
||||
bech32@^1.1.2:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
|
||||
integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
|
||||
|
||||
bn.js@^4.11.8:
|
||||
version "4.12.0"
|
||||
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
|
||||
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
|
||||
|
||||
brace-expansion@^1.1.7:
|
||||
version "1.1.11"
|
||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
|
||||
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
|
||||
dependencies:
|
||||
balanced-match "^1.0.0"
|
||||
concat-map "0.0.1"
|
||||
|
||||
buffer@^6.0.3:
|
||||
version "6.0.3"
|
||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
|
||||
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
|
||||
dependencies:
|
||||
base64-js "^1.3.1"
|
||||
ieee754 "^1.2.1"
|
||||
|
||||
callsites@^3.0.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
|
||||
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
|
||||
|
||||
chalk@^4.0.0:
|
||||
version "4.1.2"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
|
||||
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
|
||||
dependencies:
|
||||
ansi-styles "^4.1.0"
|
||||
supports-color "^7.1.0"
|
||||
|
||||
color-convert@^2.0.1:
|
||||
version "2.0.1"
|
||||
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.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
||||
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
||||
|
||||
concat-map@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
|
||||
|
||||
cross-spawn@^7.0.2:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
|
||||
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
|
||||
dependencies:
|
||||
path-key "^3.1.0"
|
||||
shebang-command "^2.0.0"
|
||||
which "^2.0.1"
|
||||
|
||||
debug@^4.1.1, debug@^4.3.2:
|
||||
version "4.3.4"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
|
||||
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
|
||||
dependencies:
|
||||
ms "2.1.2"
|
||||
|
||||
deep-is@^0.1.3:
|
||||
version "0.1.4"
|
||||
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
|
||||
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
|
||||
|
||||
doctrine@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
|
||||
integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
|
||||
dependencies:
|
||||
esutils "^2.0.2"
|
||||
|
||||
escape-string-regexp@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
|
||||
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
|
||||
|
||||
eslint-scope@^7.1.1:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
|
||||
integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
|
||||
dependencies:
|
||||
esrecurse "^4.3.0"
|
||||
estraverse "^5.2.0"
|
||||
|
||||
eslint-utils@^3.0.0:
|
||||
version "3.0.0"
|
||||
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@^2.0.0:
|
||||
version "2.1.0"
|
||||
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.3.0:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
|
||||
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
|
||||
|
||||
eslint@^8.0.0:
|
||||
version "8.13.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.13.0.tgz#6fcea43b6811e655410f5626cfcf328016badcd7"
|
||||
integrity sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==
|
||||
dependencies:
|
||||
"@eslint/eslintrc" "^1.2.1"
|
||||
"@humanwhocodes/config-array" "^0.9.2"
|
||||
ajv "^6.10.0"
|
||||
chalk "^4.0.0"
|
||||
cross-spawn "^7.0.2"
|
||||
debug "^4.3.2"
|
||||
doctrine "^3.0.0"
|
||||
escape-string-regexp "^4.0.0"
|
||||
eslint-scope "^7.1.1"
|
||||
eslint-utils "^3.0.0"
|
||||
eslint-visitor-keys "^3.3.0"
|
||||
espree "^9.3.1"
|
||||
esquery "^1.4.0"
|
||||
esutils "^2.0.2"
|
||||
fast-deep-equal "^3.1.3"
|
||||
file-entry-cache "^6.0.1"
|
||||
functional-red-black-tree "^1.0.1"
|
||||
glob-parent "^6.0.1"
|
||||
globals "^13.6.0"
|
||||
ignore "^5.2.0"
|
||||
import-fresh "^3.0.0"
|
||||
imurmurhash "^0.1.4"
|
||||
is-glob "^4.0.0"
|
||||
js-yaml "^4.1.0"
|
||||
json-stable-stringify-without-jsonify "^1.0.1"
|
||||
levn "^0.4.1"
|
||||
lodash.merge "^4.6.2"
|
||||
minimatch "^3.0.4"
|
||||
natural-compare "^1.4.0"
|
||||
optionator "^0.9.1"
|
||||
regexpp "^3.2.0"
|
||||
strip-ansi "^6.0.1"
|
||||
strip-json-comments "^3.1.0"
|
||||
text-table "^0.2.0"
|
||||
v8-compile-cache "^2.0.3"
|
||||
|
||||
espree@^9.3.1:
|
||||
version "9.3.1"
|
||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd"
|
||||
integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==
|
||||
dependencies:
|
||||
acorn "^8.7.0"
|
||||
acorn-jsx "^5.3.1"
|
||||
eslint-visitor-keys "^3.3.0"
|
||||
|
||||
esquery@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
|
||||
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
|
||||
dependencies:
|
||||
estraverse "^5.1.0"
|
||||
|
||||
esrecurse@^4.3.0:
|
||||
version "4.3.0"
|
||||
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:
|
||||
version "5.3.0"
|
||||
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.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
|
||||
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
|
||||
|
||||
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
|
||||
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
|
||||
|
||||
fast-json-stable-stringify@^2.0.0:
|
||||
version "2.1.0"
|
||||
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.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
|
||||
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
|
||||
|
||||
file-entry-cache@^6.0.1:
|
||||
version "6.0.1"
|
||||
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"
|
||||
|
||||
flat-cache@^3.0.4:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
|
||||
integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
|
||||
dependencies:
|
||||
flatted "^3.1.0"
|
||||
rimraf "^3.0.2"
|
||||
|
||||
flatted@^3.1.0:
|
||||
version "3.2.5"
|
||||
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
|
||||
integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
|
||||
|
||||
fs.realpath@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
|
||||
|
||||
functional-red-black-tree@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
|
||||
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
|
||||
|
||||
glob-parent@^6.0.1:
|
||||
version "6.0.2"
|
||||
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.0"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
|
||||
integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.0.4"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
globals@^13.6.0, globals@^13.9.0:
|
||||
version "13.13.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b"
|
||||
integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==
|
||||
dependencies:
|
||||
type-fest "^0.20.2"
|
||||
|
||||
has-flag@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
|
||||
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
|
||||
|
||||
ieee754@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
||||
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
|
||||
|
||||
ignore@^5.2.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
|
||||
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
|
||||
|
||||
import-fresh@^3.0.0, import-fresh@^3.2.1:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
|
||||
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
|
||||
dependencies:
|
||||
parent-module "^1.0.0"
|
||||
resolve-from "^4.0.0"
|
||||
|
||||
imurmurhash@^0.1.4:
|
||||
version "0.1.4"
|
||||
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
|
||||
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
|
||||
|
||||
inflight@^1.0.4:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
|
||||
integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
|
||||
dependencies:
|
||||
once "^1.3.0"
|
||||
wrappy "1"
|
||||
|
||||
inherits@2:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
|
||||
is-extglob@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
|
||||
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
|
||||
|
||||
is-glob@^4.0.0, is-glob@^4.0.3:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
|
||||
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
|
||||
dependencies:
|
||||
is-extglob "^2.1.1"
|
||||
|
||||
isexe@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
||||
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
|
||||
|
||||
js-yaml@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
|
||||
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
|
||||
dependencies:
|
||||
argparse "^2.0.1"
|
||||
|
||||
json-schema-traverse@^0.4.1:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
|
||||
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
|
||||
|
||||
json-stable-stringify-without-jsonify@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
|
||||
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
|
||||
|
||||
levn@^0.4.1:
|
||||
version "0.4.1"
|
||||
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"
|
||||
type-check "~0.4.0"
|
||||
|
||||
lodash.merge@^4.6.2:
|
||||
version "4.6.2"
|
||||
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
|
||||
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
|
||||
|
||||
minimatch@^3.0.4:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
||||
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
ms@2.1.2:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||
|
||||
natural-compare@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
|
||||
|
||||
once@^1.3.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
||||
dependencies:
|
||||
wrappy "1"
|
||||
|
||||
optionator@^0.9.1:
|
||||
version "0.9.1"
|
||||
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
|
||||
integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
|
||||
dependencies:
|
||||
deep-is "^0.1.3"
|
||||
fast-levenshtein "^2.0.6"
|
||||
levn "^0.4.1"
|
||||
prelude-ls "^1.2.1"
|
||||
type-check "^0.4.0"
|
||||
word-wrap "^1.2.3"
|
||||
|
||||
parent-module@^1.0.0:
|
||||
version "1.0.1"
|
||||
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"
|
||||
|
||||
path-is-absolute@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
|
||||
|
||||
path-key@^3.1.0:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
|
||||
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
|
||||
|
||||
prelude-ls@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
|
||||
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
|
||||
|
||||
prettier@^2.4.1:
|
||||
version "2.6.2"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032"
|
||||
integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==
|
||||
|
||||
punycode@^2.1.0:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
|
||||
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
|
||||
|
||||
regexpp@^3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
|
||||
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
|
||||
|
||||
resolve-from@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
|
||||
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
|
||||
|
||||
rimraf@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
|
||||
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
|
||||
dependencies:
|
||||
glob "^7.1.3"
|
||||
|
||||
shebang-command@^2.0.0:
|
||||
version "2.0.0"
|
||||
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@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
|
||||
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
|
||||
|
||||
strip-ansi@^6.0.1:
|
||||
version "6.0.1"
|
||||
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-json-comments@^3.1.0, strip-json-comments@^3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
|
||||
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
|
||||
|
||||
supports-color@^7.1.0:
|
||||
version "7.2.0"
|
||||
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"
|
||||
|
||||
text-table@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
||||
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
|
||||
|
||||
type-check@^0.4.0, type-check@~0.4.0:
|
||||
version "0.4.0"
|
||||
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.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
|
||||
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
|
||||
|
||||
uri-js@^4.2.2:
|
||||
version "4.4.1"
|
||||
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
|
||||
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
|
||||
dependencies:
|
||||
punycode "^2.1.0"
|
||||
|
||||
v8-compile-cache@^2.0.3:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
|
||||
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
|
||||
|
||||
which@^2.0.1:
|
||||
version "2.0.2"
|
||||
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.3:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
|
||||
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
|
||||
|
||||
wrappy@1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
||||
Reference in New Issue
Block a user