├── .eslintrc ├── .gitignore ├── .travis.yml ├── LICENSE.md ├── README.md ├── bin ├── .eslintrc └── solid-bearer-token ├── package-lock.json ├── package.json └── src ├── IdentityManager.js └── SolidClient.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | env: { 3 | node: true, 4 | es6: true, 5 | }, 6 | 7 | parserOptions: { 8 | ecmaVersion: 8, 9 | }, 10 | 11 | rules: { 12 | // Possible Errors 13 | comma-dangle: [2, "always-multiline"], 14 | no-cond-assign: 0, 15 | no-console: 2, 16 | no-constant-condition: 0, 17 | no-debugger: 2, 18 | no-dupe-args: 2, 19 | no-dupe-keys: 2, 20 | no-duplicate-case: 2, 21 | no-empty: 2, 22 | no-empty-character-class: 2, 23 | no-ex-assign: 2, 24 | no-extra-boolean-cast: 2, 25 | no-extra-parens: 0, 26 | no-extra-semi: 2, 27 | no-func-assign: 2, 28 | no-inner-declarations: 2, 29 | no-invalid-regexp: 2, 30 | no-irregular-whitespace: 2, 31 | no-negated-in-lhs: 2, 32 | no-obj-calls: 2, 33 | no-regex-spaces: 2, 34 | no-sparse-arrays: 2, 35 | no-unreachable: 2, 36 | use-isnan: 2, 37 | valid-jsdoc: 0, 38 | valid-typeof: 2, 39 | no-unexpected-multiline: 2, 40 | 41 | // Best Practices 42 | accessor-pairs: 2, 43 | block-scoped-var: 2, 44 | complexity: 0, 45 | consistent-return: 0, 46 | curly: 0, 47 | default-case: 0, 48 | dot-notation: 2, 49 | dot-location: [2, "property"], 50 | eqeqeq: 2, 51 | guard-for-in: 0, 52 | no-alert: 2, 53 | no-caller: 2, 54 | no-div-regex: 2, 55 | no-else-return: 0, 56 | no-labels: 2, 57 | no-eq-null: 2, 58 | no-eval: 2, 59 | no-extend-native: 2, 60 | no-extra-bind: 2, 61 | no-fallthrough: 0, 62 | no-floating-decimal: 2, 63 | no-implicit-coercion: 0, 64 | no-implied-eval: 2, 65 | no-invalid-this: 2, 66 | no-iterator: 2, 67 | no-lone-blocks: 2, 68 | no-loop-func: 2, 69 | no-multi-spaces: 0, 70 | no-multi-str: 2, 71 | no-native-reassign: 2, 72 | no-new-func: 2, 73 | no-new-wrappers: 2, 74 | no-new: 2, 75 | no-octal-escape: 2, 76 | no-octal: 2, 77 | no-param-reassign: 0, 78 | no-process-env: 2, 79 | no-proto: 2, 80 | no-redeclare: 2, 81 | no-return-assign: 0, 82 | no-script-url: 2, 83 | no-self-compare: 2, 84 | no-sequences: 0, // allow the comma operator 85 | no-throw-literal: 2, 86 | no-unused-expressions: 0, 87 | no-useless-call: 2, 88 | no-void: 2, 89 | no-warning-comments: 0, 90 | no-with: 2, 91 | radix: 2, 92 | vars-on-top: 0, 93 | wrap-iife: [2, "inside"], 94 | yoda: 2, 95 | 96 | // Strict Mode 97 | strict: [2, "never"], 98 | 99 | // Variables 100 | init-declarations: 0, 101 | no-catch-shadow: 2, 102 | no-delete-var: 2, 103 | no-label-var: 2, 104 | no-shadow-restricted-names: 2, 105 | no-shadow: 0, 106 | no-undef-init: 2, 107 | no-undef: 2, 108 | no-undefined: 0, 109 | no-unused-vars: [ 2, { args: "none" }], 110 | no-use-before-define: [2, "nofunc"], 111 | 112 | // Node.js 113 | callback-return: 0, 114 | handle-callback-err: 2, 115 | no-mixed-requires: 2, 116 | no-new-require: 2, 117 | no-path-concat: 2, 118 | no-process-exit: 2, 119 | no-restricted-modules: 2, 120 | no-sync: 2, 121 | 122 | // Stylistic Issues 123 | array-bracket-spacing: 2, 124 | block-spacing: 2, 125 | brace-style: [2, "stroustrup", { allowSingleLine: true }], 126 | camelcase: 0, 127 | comma-spacing: 2, 128 | comma-style: 2, 129 | computed-property-spacing: 2, 130 | consistent-this: 0, 131 | eol-last: 2, 132 | func-names: 0, 133 | func-style: [2, "declaration"], 134 | id-length: 0, 135 | id-match: 2, 136 | indent-legacy: [2, 2, { VariableDeclarator: 2 }], 137 | key-spacing: [2, { mode: "minimum" }], 138 | lines-around-comment: [2, { "allowClassStart": true }], 139 | linebreak-style: 2, 140 | max-nested-callbacks: [2, 2], 141 | new-cap: 2, 142 | new-parens: 2, 143 | newline-after-var: 0, 144 | no-array-constructor: 2, 145 | no-continue: 2, 146 | no-inline-comments: 0, 147 | no-lonely-if: 2, 148 | no-mixed-spaces-and-tabs: 2, 149 | no-multiple-empty-lines: 0, 150 | no-nested-ternary: 0, 151 | no-new-object: 2, 152 | no-spaced-func: 2, 153 | no-ternary: 0, 154 | no-trailing-spaces: 2, 155 | no-underscore-dangle: 0, 156 | no-unneeded-ternary: 2, 157 | object-curly-spacing: [2, "always"], 158 | object-curly-newline: 0, 159 | object-property-newline: 0, 160 | one-var: 0, 161 | operator-assignment: 2, 162 | operator-linebreak: [2, "after", { overrides: { ":": "ignore" } }], 163 | padded-blocks: [2, "never"], 164 | quote-props: [2, "consistent-as-needed"], 165 | quotes: [2, "single", "avoid-escape"], 166 | semi-spacing: 2, 167 | semi: 2, 168 | sort-vars: 0, 169 | keyword-spacing: 2, 170 | space-before-blocks: 2, 171 | space-before-function-paren: [2, {"anonymous": "always", "named": "never"}], 172 | space-in-parens: 2, 173 | space-infix-ops: 2, 174 | space-unary-ops: 2, 175 | spaced-comment: [2, "always", { block: { markers: ["!"] } }], 176 | wrap-regex: 0, 177 | }, 178 | } 179 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "10" 4 | - "12" 5 | - "node" 6 | cache: 7 | directories: 8 | - node_modules 9 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # MIT License 2 | 3 | Copyright ©2018–present Ruben Verborgh 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included 13 | in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY 19 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 20 | OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Solid CLI 2 | A utility to facilitate command-line interaction with Solid servers. 3 | 4 | ⚠️ **Do _not_ depend on this library yet.** 5 | It currently is a hard-coded integration with node-solid-server, 6 | meant for experimentation. 7 | It is not guaranteed to work, and certainly not with arbitrary Solid servers. 8 | 9 | We are currently lacking server-side implementations 10 | of the necessary parts of OIDC for non-browser apps. 11 | Solid CLI uses a hack to still enable this, 12 | but it is _not_ a recommended way of working. 13 | 14 | In the future, Solid servers and Solid CLI 15 | should use a standardized protocol instead. 16 | 17 | ## Installation 18 | ``` 19 | npm install -g @solid/cli 20 | ``` 21 | 22 | ## Usage 23 | ``` 24 | IDP=https://drive.verborgh.org 25 | USERNAME=ruben 26 | PASSWORD=ruben 27 | URL=https://drive.verborgh.org/inbox/ 28 | 29 | curl "$URL" -H 'Authorization: Bearer '`solid-bearer-token "$IDP" "$USERNAME" "$PASSWORD" "$URL"` 30 | ``` 31 | 32 | ## License 33 | ©2018–present [Ruben Verborgh](https://ruben.verborgh.org/), 34 | [MIT License](https://github.com/solid/solid-cli/blob/master/LICENSE.md). 35 | -------------------------------------------------------------------------------- /bin/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | rules: { 3 | no-console: 0, 4 | no-process-exit: 0, 5 | no-process-env: 0, 6 | no-sync: 0, 7 | }, 8 | } 9 | -------------------------------------------------------------------------------- /bin/solid-bearer-token: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | const SolidClient = require('../src/SolidClient'); 5 | const IdentityManager = require('../src/IdentityManager'); 6 | 7 | // Parse the command-line arguments 8 | const args = process.argv.slice(2); 9 | if (args.length !== 4) 10 | die('Usage: solid-bearer-token identity_provider username password url'); 11 | const [identityProvider, username, password, url] = args; 12 | 13 | 14 | 15 | // Initialize the Solid client using the settings file 16 | const settingsFile = path.join(process.env.HOME, '.solid-cli.json'); 17 | const identityManager = loadIdentityManager(settingsFile); 18 | const client = new SolidClient({ identityManager }); 19 | 20 | // Obtain an access token for the given URL 21 | const token = getToken(client, { identityProvider, username, password, url }); 22 | 23 | // Save the settings file when done 24 | token.finally(() => saveIdentityManager(identityManager, settingsFile)); 25 | 26 | // Log the access token to the console 27 | token.then(console.log, die); 28 | 29 | 30 | 31 | // Instantiates the identity manager from the given settings file 32 | function loadIdentityManager(settingsFile) { 33 | let settingsJson; 34 | try { settingsJson = fs.readFileSync(settingsFile, 'utf8'); } 35 | catch (error) { settingsJson = '{}'; } 36 | return IdentityManager.fromJSON(settingsJson); 37 | } 38 | 39 | // Saves the identity manager into a settings file 40 | function saveIdentityManager(identityManager, settingsFile) { 41 | const settingsJSON = identityManager.toJSON(); 42 | fs.writeFileSync(settingsFile, settingsJSON); 43 | } 44 | 45 | // Obtains a token 46 | async function getToken(client, { identityProvider, username, password, url }) { 47 | const session = await client.login(identityProvider, { username, password }); 48 | return client.createToken(url, session); 49 | } 50 | 51 | // Terminates the process with the given error 52 | function die(error) { 53 | console.error(error); 54 | process.exit(1); 55 | } 56 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@solid/cli", 3 | "version": "0.2.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.11", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 10 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.12.11", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", 19 | "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.10.4", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 25 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.10.4", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | }, 32 | "dependencies": { 33 | "chalk": { 34 | "version": "2.4.2", 35 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 36 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 37 | "dev": true, 38 | "requires": { 39 | "ansi-styles": "^3.2.1", 40 | "escape-string-regexp": "^1.0.5", 41 | "supports-color": "^5.3.0" 42 | } 43 | } 44 | } 45 | }, 46 | "@eslint/eslintrc": { 47 | "version": "0.3.0", 48 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", 49 | "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", 50 | "dev": true, 51 | "requires": { 52 | "ajv": "^6.12.4", 53 | "debug": "^4.1.1", 54 | "espree": "^7.3.0", 55 | "globals": "^12.1.0", 56 | "ignore": "^4.0.6", 57 | "import-fresh": "^3.2.1", 58 | "js-yaml": "^3.13.1", 59 | "lodash": "^4.17.20", 60 | "minimatch": "^3.0.4", 61 | "strip-json-comments": "^3.1.1" 62 | } 63 | }, 64 | "@peculiar/asn1-schema": { 65 | "version": "2.0.27", 66 | "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.0.27.tgz", 67 | "integrity": "sha512-1tIx7iL3Ma3HtnNS93nB7nhyI0soUJypElj9owd4tpMrRDmeJ8eZubsdq1sb0KSaCs5RqZNoABCP6m5WtnlVhQ==", 68 | "requires": { 69 | "@types/asn1js": "^2.0.0", 70 | "asn1js": "^2.0.26", 71 | "pvtsutils": "^1.1.1", 72 | "tslib": "^2.0.3" 73 | } 74 | }, 75 | "@peculiar/json-schema": { 76 | "version": "1.1.12", 77 | "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", 78 | "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", 79 | "requires": { 80 | "tslib": "^2.0.0" 81 | } 82 | }, 83 | "@peculiar/webcrypto": { 84 | "version": "1.1.4", 85 | "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.1.4.tgz", 86 | "integrity": "sha512-gEVxfbseFDV0Za3AmjTrRB+wigEMOejHDzoo571e8/YWD33Ejmk0XPF3+G+VaN8+5C5IWZx4CPvxQZ7mF2dvNA==", 87 | "requires": { 88 | "@peculiar/asn1-schema": "^2.0.26", 89 | "@peculiar/json-schema": "^1.1.12", 90 | "pvtsutils": "^1.1.1", 91 | "tslib": "^2.0.3", 92 | "webcrypto-core": "^1.1.8" 93 | } 94 | }, 95 | "@sinonjs/text-encoding": { 96 | "version": "0.7.1", 97 | "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", 98 | "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" 99 | }, 100 | "@solid/jose": { 101 | "version": "0.6.5", 102 | "resolved": "https://registry.npmjs.org/@solid/jose/-/jose-0.6.5.tgz", 103 | "integrity": "sha512-EkEw47sxXu/r0KQFqa7FmpXJWAiHOWsQXdUxxuzgPWF2kcblLDl4VOAwIh5lfq8MhG4+GZJHSPeRdkZgcE85+g==", 104 | "requires": { 105 | "@sinonjs/text-encoding": "^0.7.1", 106 | "base64url": "^3.0.1", 107 | "isomorphic-webcrypto": "^2.3.6" 108 | } 109 | }, 110 | "@solid/oidc-rp": { 111 | "version": "0.11.5", 112 | "resolved": "https://registry.npmjs.org/@solid/oidc-rp/-/oidc-rp-0.11.5.tgz", 113 | "integrity": "sha512-b/Vkkrp1aKi/u5mCdDfIxwIknRG6oKgx5hzTCHuqGzmZKNkZos1EAQGSrxLtyNUFKKO0ipdXmUfOALOLrf2vVw==", 114 | "requires": { 115 | "@solid/jose": "^0.6.5", 116 | "assert": "^2.0.0", 117 | "base64url": "^3.0.1", 118 | "node-fetch": "^2.6.1", 119 | "standard-http-error": "^2.0.1", 120 | "whatwg-url": "^8.4.0" 121 | } 122 | }, 123 | "@types/asn1js": { 124 | "version": "2.0.0", 125 | "resolved": "https://registry.npmjs.org/@types/asn1js/-/asn1js-2.0.0.tgz", 126 | "integrity": "sha512-Jjzp5EqU0hNpADctc/UqhiFbY1y2MqIxBVa2S4dBlbnZHTLPMuggoL5q43X63LpsOIINRDirBjP56DUUKIUWIA==" 127 | }, 128 | "@unimodules/core": { 129 | "version": "7.0.0", 130 | "resolved": "https://registry.npmjs.org/@unimodules/core/-/core-7.0.0.tgz", 131 | "integrity": "sha512-hKxNN6ad2VmmJqB3i1C8IJe27TcchY7YAKpkQhshjPxso61f7iM7AUFeG4vcU1vPH5d/X4Vk1ds8bWxaxg7nnw==", 132 | "optional": true, 133 | "requires": { 134 | "compare-versions": "^3.4.0" 135 | } 136 | }, 137 | "@unimodules/react-native-adapter": { 138 | "version": "6.1.0", 139 | "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-6.1.0.tgz", 140 | "integrity": "sha512-Fg+Dzt6KxwJLiTfEy1thgntqI/hybx5MsqbJkSfFAfZRmi/5+ypcl5LZQf8gqplgjzXWqeM3M184GAwezwIbjQ==", 141 | "optional": true, 142 | "requires": { 143 | "invariant": "^2.2.4", 144 | "lodash": "^4.5.0" 145 | } 146 | }, 147 | "acorn": { 148 | "version": "7.4.1", 149 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 150 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 151 | "dev": true 152 | }, 153 | "acorn-jsx": { 154 | "version": "5.3.1", 155 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", 156 | "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", 157 | "dev": true 158 | }, 159 | "ajv": { 160 | "version": "6.12.6", 161 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 162 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 163 | "dev": true, 164 | "requires": { 165 | "fast-deep-equal": "^3.1.1", 166 | "fast-json-stable-stringify": "^2.0.0", 167 | "json-schema-traverse": "^0.4.1", 168 | "uri-js": "^4.2.2" 169 | } 170 | }, 171 | "ansi-colors": { 172 | "version": "4.1.1", 173 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 174 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 175 | "dev": true 176 | }, 177 | "ansi-regex": { 178 | "version": "5.0.0", 179 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 180 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 181 | "dev": true 182 | }, 183 | "ansi-styles": { 184 | "version": "3.2.1", 185 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 186 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 187 | "dev": true, 188 | "requires": { 189 | "color-convert": "^1.9.0" 190 | } 191 | }, 192 | "argparse": { 193 | "version": "1.0.10", 194 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 195 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 196 | "dev": true, 197 | "requires": { 198 | "sprintf-js": "~1.0.2" 199 | } 200 | }, 201 | "array-filter": { 202 | "version": "1.0.0", 203 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", 204 | "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=" 205 | }, 206 | "asmcrypto.js": { 207 | "version": "0.22.0", 208 | "resolved": "https://registry.npmjs.org/asmcrypto.js/-/asmcrypto.js-0.22.0.tgz", 209 | "integrity": "sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA==" 210 | }, 211 | "asn1js": { 212 | "version": "2.0.26", 213 | "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.0.26.tgz", 214 | "integrity": "sha512-yG89F0j9B4B0MKIcFyWWxnpZPLaNTjCj4tkE3fjbAoo0qmpGw0PYYqSbX/4ebnd9Icn8ZgK4K1fvDyEtW1JYtQ==", 215 | "requires": { 216 | "pvutils": "^1.0.17" 217 | } 218 | }, 219 | "assert": { 220 | "version": "2.0.0", 221 | "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", 222 | "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", 223 | "requires": { 224 | "es6-object-assign": "^1.1.0", 225 | "is-nan": "^1.2.1", 226 | "object-is": "^1.0.1", 227 | "util": "^0.12.0" 228 | } 229 | }, 230 | "astral-regex": { 231 | "version": "2.0.0", 232 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 233 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 234 | "dev": true 235 | }, 236 | "available-typed-arrays": { 237 | "version": "1.0.2", 238 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", 239 | "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", 240 | "requires": { 241 | "array-filter": "^1.0.0" 242 | } 243 | }, 244 | "b64-lite": { 245 | "version": "1.4.0", 246 | "resolved": "https://registry.npmjs.org/b64-lite/-/b64-lite-1.4.0.tgz", 247 | "integrity": "sha512-aHe97M7DXt+dkpa8fHlCcm1CnskAHrJqEfMI0KN7dwqlzml/aUe1AGt6lk51HzrSfVD67xOso84sOpr+0wIe2w==", 248 | "requires": { 249 | "base-64": "^0.1.0" 250 | } 251 | }, 252 | "b64u-lite": { 253 | "version": "1.1.0", 254 | "resolved": "https://registry.npmjs.org/b64u-lite/-/b64u-lite-1.1.0.tgz", 255 | "integrity": "sha512-929qWGDVCRph7gQVTC6koHqQIpF4vtVaSbwLltFQo44B1bYUquALswZdBKFfrJCPEnsCOvWkJsPdQYZ/Ukhw8A==", 256 | "requires": { 257 | "b64-lite": "^1.4.0" 258 | } 259 | }, 260 | "balanced-match": { 261 | "version": "1.0.0", 262 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 263 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 264 | "dev": true 265 | }, 266 | "base-64": { 267 | "version": "0.1.0", 268 | "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", 269 | "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=" 270 | }, 271 | "base64-js": { 272 | "version": "1.5.1", 273 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 274 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 275 | "optional": true 276 | }, 277 | "base64url": { 278 | "version": "3.0.1", 279 | "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", 280 | "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" 281 | }, 282 | "brace-expansion": { 283 | "version": "1.1.11", 284 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 285 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 286 | "dev": true, 287 | "requires": { 288 | "balanced-match": "^1.0.0", 289 | "concat-map": "0.0.1" 290 | } 291 | }, 292 | "buffer-from": { 293 | "version": "1.1.1", 294 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 295 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 296 | "dev": true 297 | }, 298 | "call-bind": { 299 | "version": "1.0.2", 300 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 301 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 302 | "requires": { 303 | "function-bind": "^1.1.1", 304 | "get-intrinsic": "^1.0.2" 305 | } 306 | }, 307 | "callsites": { 308 | "version": "3.1.0", 309 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 310 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 311 | "dev": true 312 | }, 313 | "chalk": { 314 | "version": "4.1.0", 315 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 316 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 317 | "dev": true, 318 | "requires": { 319 | "ansi-styles": "^4.1.0", 320 | "supports-color": "^7.1.0" 321 | }, 322 | "dependencies": { 323 | "ansi-styles": { 324 | "version": "4.3.0", 325 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 326 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 327 | "dev": true, 328 | "requires": { 329 | "color-convert": "^2.0.1" 330 | } 331 | }, 332 | "color-convert": { 333 | "version": "2.0.1", 334 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 335 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 336 | "dev": true, 337 | "requires": { 338 | "color-name": "~1.1.4" 339 | } 340 | }, 341 | "color-name": { 342 | "version": "1.1.4", 343 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 344 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 345 | "dev": true 346 | }, 347 | "has-flag": { 348 | "version": "4.0.0", 349 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 350 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 351 | "dev": true 352 | }, 353 | "supports-color": { 354 | "version": "7.2.0", 355 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 356 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 357 | "dev": true, 358 | "requires": { 359 | "has-flag": "^4.0.0" 360 | } 361 | } 362 | } 363 | }, 364 | "color-convert": { 365 | "version": "1.9.3", 366 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 367 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 368 | "dev": true, 369 | "requires": { 370 | "color-name": "1.1.3" 371 | } 372 | }, 373 | "color-name": { 374 | "version": "1.1.3", 375 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 376 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 377 | "dev": true 378 | }, 379 | "compare-versions": { 380 | "version": "3.6.0", 381 | "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", 382 | "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", 383 | "optional": true 384 | }, 385 | "concat-map": { 386 | "version": "0.0.1", 387 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 388 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 389 | "dev": true 390 | }, 391 | "concat-stream": { 392 | "version": "1.6.2", 393 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 394 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 395 | "dev": true, 396 | "requires": { 397 | "buffer-from": "^1.0.0", 398 | "inherits": "^2.0.3", 399 | "readable-stream": "^2.2.2", 400 | "typedarray": "^0.0.6" 401 | } 402 | }, 403 | "core-util-is": { 404 | "version": "1.0.2", 405 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 406 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 407 | "dev": true 408 | }, 409 | "cross-spawn": { 410 | "version": "7.0.3", 411 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 412 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 413 | "dev": true, 414 | "requires": { 415 | "path-key": "^3.1.0", 416 | "shebang-command": "^2.0.0", 417 | "which": "^2.0.1" 418 | } 419 | }, 420 | "debug": { 421 | "version": "4.3.1", 422 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 423 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 424 | "dev": true, 425 | "requires": { 426 | "ms": "2.1.2" 427 | } 428 | }, 429 | "deep-is": { 430 | "version": "0.1.3", 431 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 432 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 433 | "dev": true 434 | }, 435 | "define-properties": { 436 | "version": "1.1.3", 437 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 438 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 439 | "requires": { 440 | "object-keys": "^1.0.12" 441 | } 442 | }, 443 | "doctrine": { 444 | "version": "3.0.0", 445 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 446 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 447 | "dev": true, 448 | "requires": { 449 | "esutils": "^2.0.2" 450 | } 451 | }, 452 | "emoji-regex": { 453 | "version": "8.0.0", 454 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 455 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 456 | "dev": true 457 | }, 458 | "enquirer": { 459 | "version": "2.3.6", 460 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 461 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 462 | "dev": true, 463 | "requires": { 464 | "ansi-colors": "^4.1.1" 465 | } 466 | }, 467 | "es-abstract": { 468 | "version": "1.18.0-next.2", 469 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", 470 | "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", 471 | "requires": { 472 | "call-bind": "^1.0.2", 473 | "es-to-primitive": "^1.2.1", 474 | "function-bind": "^1.1.1", 475 | "get-intrinsic": "^1.0.2", 476 | "has": "^1.0.3", 477 | "has-symbols": "^1.0.1", 478 | "is-callable": "^1.2.2", 479 | "is-negative-zero": "^2.0.1", 480 | "is-regex": "^1.1.1", 481 | "object-inspect": "^1.9.0", 482 | "object-keys": "^1.1.1", 483 | "object.assign": "^4.1.2", 484 | "string.prototype.trimend": "^1.0.3", 485 | "string.prototype.trimstart": "^1.0.3" 486 | } 487 | }, 488 | "es-to-primitive": { 489 | "version": "1.2.1", 490 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 491 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 492 | "requires": { 493 | "is-callable": "^1.1.4", 494 | "is-date-object": "^1.0.1", 495 | "is-symbol": "^1.0.2" 496 | } 497 | }, 498 | "es6-object-assign": { 499 | "version": "1.1.0", 500 | "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", 501 | "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" 502 | }, 503 | "escape-string-regexp": { 504 | "version": "1.0.5", 505 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 506 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 507 | "dev": true 508 | }, 509 | "eslint": { 510 | "version": "7.18.0", 511 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz", 512 | "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==", 513 | "dev": true, 514 | "requires": { 515 | "@babel/code-frame": "^7.0.0", 516 | "@eslint/eslintrc": "^0.3.0", 517 | "ajv": "^6.10.0", 518 | "chalk": "^4.0.0", 519 | "cross-spawn": "^7.0.2", 520 | "debug": "^4.0.1", 521 | "doctrine": "^3.0.0", 522 | "enquirer": "^2.3.5", 523 | "eslint-scope": "^5.1.1", 524 | "eslint-utils": "^2.1.0", 525 | "eslint-visitor-keys": "^2.0.0", 526 | "espree": "^7.3.1", 527 | "esquery": "^1.2.0", 528 | "esutils": "^2.0.2", 529 | "file-entry-cache": "^6.0.0", 530 | "functional-red-black-tree": "^1.0.1", 531 | "glob-parent": "^5.0.0", 532 | "globals": "^12.1.0", 533 | "ignore": "^4.0.6", 534 | "import-fresh": "^3.0.0", 535 | "imurmurhash": "^0.1.4", 536 | "is-glob": "^4.0.0", 537 | "js-yaml": "^3.13.1", 538 | "json-stable-stringify-without-jsonify": "^1.0.1", 539 | "levn": "^0.4.1", 540 | "lodash": "^4.17.20", 541 | "minimatch": "^3.0.4", 542 | "natural-compare": "^1.4.0", 543 | "optionator": "^0.9.1", 544 | "progress": "^2.0.0", 545 | "regexpp": "^3.1.0", 546 | "semver": "^7.2.1", 547 | "strip-ansi": "^6.0.0", 548 | "strip-json-comments": "^3.1.0", 549 | "table": "^6.0.4", 550 | "text-table": "^0.2.0", 551 | "v8-compile-cache": "^2.0.3" 552 | } 553 | }, 554 | "eslint-scope": { 555 | "version": "5.1.1", 556 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 557 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 558 | "dev": true, 559 | "requires": { 560 | "esrecurse": "^4.3.0", 561 | "estraverse": "^4.1.1" 562 | } 563 | }, 564 | "eslint-utils": { 565 | "version": "2.1.0", 566 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 567 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 568 | "dev": true, 569 | "requires": { 570 | "eslint-visitor-keys": "^1.1.0" 571 | }, 572 | "dependencies": { 573 | "eslint-visitor-keys": { 574 | "version": "1.3.0", 575 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 576 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 577 | "dev": true 578 | } 579 | } 580 | }, 581 | "eslint-visitor-keys": { 582 | "version": "2.0.0", 583 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", 584 | "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", 585 | "dev": true 586 | }, 587 | "espree": { 588 | "version": "7.3.1", 589 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 590 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 591 | "dev": true, 592 | "requires": { 593 | "acorn": "^7.4.0", 594 | "acorn-jsx": "^5.3.1", 595 | "eslint-visitor-keys": "^1.3.0" 596 | }, 597 | "dependencies": { 598 | "eslint-visitor-keys": { 599 | "version": "1.3.0", 600 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 601 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 602 | "dev": true 603 | } 604 | } 605 | }, 606 | "esprima": { 607 | "version": "4.0.1", 608 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 609 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 610 | "dev": true 611 | }, 612 | "esquery": { 613 | "version": "1.3.1", 614 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", 615 | "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", 616 | "dev": true, 617 | "requires": { 618 | "estraverse": "^5.1.0" 619 | }, 620 | "dependencies": { 621 | "estraverse": { 622 | "version": "5.2.0", 623 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 624 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 625 | "dev": true 626 | } 627 | } 628 | }, 629 | "esrecurse": { 630 | "version": "4.3.0", 631 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 632 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 633 | "dev": true, 634 | "requires": { 635 | "estraverse": "^5.2.0" 636 | }, 637 | "dependencies": { 638 | "estraverse": { 639 | "version": "5.2.0", 640 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 641 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 642 | "dev": true 643 | } 644 | } 645 | }, 646 | "estraverse": { 647 | "version": "4.3.0", 648 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 649 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 650 | "dev": true 651 | }, 652 | "esutils": { 653 | "version": "2.0.3", 654 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 655 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 656 | "dev": true 657 | }, 658 | "expo-random": { 659 | "version": "11.0.0", 660 | "resolved": "https://registry.npmjs.org/expo-random/-/expo-random-11.0.0.tgz", 661 | "integrity": "sha512-5x+F4KZlO2v9MZI79fvhuHUdSLCXAz1l8a6a7ABU+3/eBD5TIwtgBuu3YLtGldadVV7hX19HGfZy4GCO2R1dFA==", 662 | "optional": true, 663 | "requires": { 664 | "base64-js": "^1.3.0" 665 | } 666 | }, 667 | "fast-deep-equal": { 668 | "version": "3.1.3", 669 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 670 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 671 | "dev": true 672 | }, 673 | "fast-json-stable-stringify": { 674 | "version": "2.1.0", 675 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 676 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 677 | "dev": true 678 | }, 679 | "fast-levenshtein": { 680 | "version": "2.0.6", 681 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 682 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 683 | "dev": true 684 | }, 685 | "file-entry-cache": { 686 | "version": "6.0.0", 687 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", 688 | "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", 689 | "dev": true, 690 | "requires": { 691 | "flat-cache": "^3.0.4" 692 | } 693 | }, 694 | "flat-cache": { 695 | "version": "3.0.4", 696 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 697 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 698 | "dev": true, 699 | "requires": { 700 | "flatted": "^3.1.0", 701 | "rimraf": "^3.0.2" 702 | } 703 | }, 704 | "flatted": { 705 | "version": "3.1.1", 706 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", 707 | "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", 708 | "dev": true 709 | }, 710 | "foreach": { 711 | "version": "2.0.5", 712 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 713 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" 714 | }, 715 | "fs.realpath": { 716 | "version": "1.0.0", 717 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 718 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 719 | "dev": true 720 | }, 721 | "function-bind": { 722 | "version": "1.1.1", 723 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 724 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 725 | }, 726 | "functional-red-black-tree": { 727 | "version": "1.0.1", 728 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 729 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 730 | "dev": true 731 | }, 732 | "get-intrinsic": { 733 | "version": "1.1.0", 734 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.0.tgz", 735 | "integrity": "sha512-M11rgtQp5GZMZzDL7jLTNxbDfurpzuau5uqRWDPvlHjfvg3TdScAZo96GLvhMjImrmR8uAt0FS2RLoMrfWGKlg==", 736 | "requires": { 737 | "function-bind": "^1.1.1", 738 | "has": "^1.0.3", 739 | "has-symbols": "^1.0.1" 740 | } 741 | }, 742 | "glob": { 743 | "version": "7.1.6", 744 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 745 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 746 | "dev": true, 747 | "requires": { 748 | "fs.realpath": "^1.0.0", 749 | "inflight": "^1.0.4", 750 | "inherits": "2", 751 | "minimatch": "^3.0.4", 752 | "once": "^1.3.0", 753 | "path-is-absolute": "^1.0.0" 754 | } 755 | }, 756 | "glob-parent": { 757 | "version": "5.1.1", 758 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 759 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 760 | "dev": true, 761 | "requires": { 762 | "is-glob": "^4.0.1" 763 | } 764 | }, 765 | "globals": { 766 | "version": "12.4.0", 767 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 768 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 769 | "dev": true, 770 | "requires": { 771 | "type-fest": "^0.8.1" 772 | } 773 | }, 774 | "has": { 775 | "version": "1.0.3", 776 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 777 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 778 | "requires": { 779 | "function-bind": "^1.1.1" 780 | } 781 | }, 782 | "has-flag": { 783 | "version": "3.0.0", 784 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 785 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 786 | "dev": true 787 | }, 788 | "has-symbols": { 789 | "version": "1.0.1", 790 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 791 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 792 | }, 793 | "ignore": { 794 | "version": "4.0.6", 795 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 796 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 797 | "dev": true 798 | }, 799 | "import-fresh": { 800 | "version": "3.3.0", 801 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 802 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 803 | "dev": true, 804 | "requires": { 805 | "parent-module": "^1.0.0", 806 | "resolve-from": "^4.0.0" 807 | } 808 | }, 809 | "imurmurhash": { 810 | "version": "0.1.4", 811 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 812 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 813 | "dev": true 814 | }, 815 | "inflight": { 816 | "version": "1.0.6", 817 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 818 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 819 | "dev": true, 820 | "requires": { 821 | "once": "^1.3.0", 822 | "wrappy": "1" 823 | } 824 | }, 825 | "inherits": { 826 | "version": "2.0.4", 827 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 828 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 829 | }, 830 | "invariant": { 831 | "version": "2.2.4", 832 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 833 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 834 | "optional": true, 835 | "requires": { 836 | "loose-envify": "^1.0.0" 837 | } 838 | }, 839 | "is-arguments": { 840 | "version": "1.1.0", 841 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", 842 | "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", 843 | "requires": { 844 | "call-bind": "^1.0.0" 845 | } 846 | }, 847 | "is-callable": { 848 | "version": "1.2.2", 849 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", 850 | "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" 851 | }, 852 | "is-date-object": { 853 | "version": "1.0.2", 854 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 855 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" 856 | }, 857 | "is-extglob": { 858 | "version": "2.1.1", 859 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 860 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 861 | "dev": true 862 | }, 863 | "is-fullwidth-code-point": { 864 | "version": "3.0.0", 865 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 866 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 867 | "dev": true 868 | }, 869 | "is-generator-function": { 870 | "version": "1.0.8", 871 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", 872 | "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==" 873 | }, 874 | "is-glob": { 875 | "version": "4.0.1", 876 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 877 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 878 | "dev": true, 879 | "requires": { 880 | "is-extglob": "^2.1.1" 881 | } 882 | }, 883 | "is-nan": { 884 | "version": "1.3.2", 885 | "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", 886 | "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", 887 | "requires": { 888 | "call-bind": "^1.0.0", 889 | "define-properties": "^1.1.3" 890 | } 891 | }, 892 | "is-negative-zero": { 893 | "version": "2.0.1", 894 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 895 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" 896 | }, 897 | "is-regex": { 898 | "version": "1.1.1", 899 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 900 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 901 | "requires": { 902 | "has-symbols": "^1.0.1" 903 | } 904 | }, 905 | "is-symbol": { 906 | "version": "1.0.3", 907 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 908 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 909 | "requires": { 910 | "has-symbols": "^1.0.1" 911 | } 912 | }, 913 | "is-typed-array": { 914 | "version": "1.1.4", 915 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.4.tgz", 916 | "integrity": "sha512-ILaRgn4zaSrVNXNGtON6iFNotXW3hAPF3+0fB1usg2jFlWqo5fEDdmJkz0zBfoi7Dgskr8Khi2xZ8cXqZEfXNA==", 917 | "requires": { 918 | "available-typed-arrays": "^1.0.2", 919 | "call-bind": "^1.0.0", 920 | "es-abstract": "^1.18.0-next.1", 921 | "foreach": "^2.0.5", 922 | "has-symbols": "^1.0.1" 923 | } 924 | }, 925 | "isarray": { 926 | "version": "1.0.0", 927 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 928 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 929 | "dev": true 930 | }, 931 | "isexe": { 932 | "version": "2.0.0", 933 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 934 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 935 | "dev": true 936 | }, 937 | "isomorphic-webcrypto": { 938 | "version": "2.3.6", 939 | "resolved": "https://registry.npmjs.org/isomorphic-webcrypto/-/isomorphic-webcrypto-2.3.6.tgz", 940 | "integrity": "sha512-d1prB3b0UMWOao5DK3+O2Dr5ZJCakzB5Q+2kCWNkNuM9ln7VB8TSw2SwUjbnErzg7cgsYja+VPQaeBtXEojpew==", 941 | "requires": { 942 | "@peculiar/webcrypto": "^1.0.22", 943 | "@unimodules/core": "*", 944 | "@unimodules/react-native-adapter": "*", 945 | "asmcrypto.js": "^0.22.0", 946 | "b64-lite": "^1.3.1", 947 | "b64u-lite": "^1.0.1", 948 | "expo-random": "*", 949 | "msrcrypto": "^1.5.6", 950 | "react-native-securerandom": "^0.1.1", 951 | "str2buf": "^1.3.0", 952 | "webcrypto-shim": "^0.1.4" 953 | } 954 | }, 955 | "js-tokens": { 956 | "version": "4.0.0", 957 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 958 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 959 | }, 960 | "js-yaml": { 961 | "version": "3.14.1", 962 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 963 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 964 | "dev": true, 965 | "requires": { 966 | "argparse": "^1.0.7", 967 | "esprima": "^4.0.0" 968 | } 969 | }, 970 | "json-schema-traverse": { 971 | "version": "0.4.1", 972 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 973 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 974 | "dev": true 975 | }, 976 | "json-stable-stringify-without-jsonify": { 977 | "version": "1.0.1", 978 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 979 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 980 | "dev": true 981 | }, 982 | "levn": { 983 | "version": "0.4.1", 984 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 985 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 986 | "dev": true, 987 | "requires": { 988 | "prelude-ls": "^1.2.1", 989 | "type-check": "~0.4.0" 990 | } 991 | }, 992 | "lodash": { 993 | "version": "4.17.20", 994 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 995 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 996 | }, 997 | "lodash.sortby": { 998 | "version": "4.7.0", 999 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1000 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 1001 | }, 1002 | "loose-envify": { 1003 | "version": "1.4.0", 1004 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1005 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1006 | "optional": true, 1007 | "requires": { 1008 | "js-tokens": "^3.0.0 || ^4.0.0" 1009 | } 1010 | }, 1011 | "lru-cache": { 1012 | "version": "6.0.0", 1013 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1014 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1015 | "dev": true, 1016 | "requires": { 1017 | "yallist": "^4.0.0" 1018 | } 1019 | }, 1020 | "minimatch": { 1021 | "version": "3.0.4", 1022 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1023 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1024 | "dev": true, 1025 | "requires": { 1026 | "brace-expansion": "^1.1.7" 1027 | } 1028 | }, 1029 | "ms": { 1030 | "version": "2.1.2", 1031 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1032 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1033 | "dev": true 1034 | }, 1035 | "msrcrypto": { 1036 | "version": "1.5.8", 1037 | "resolved": "https://registry.npmjs.org/msrcrypto/-/msrcrypto-1.5.8.tgz", 1038 | "integrity": "sha512-ujZ0TRuozHKKm6eGbKHfXef7f+esIhEckmThVnz7RNyiOJd7a6MXj2JGBoL9cnPDW+JMG16MoTUh5X+XXjI66Q==" 1039 | }, 1040 | "natural-compare": { 1041 | "version": "1.4.0", 1042 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1043 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1044 | "dev": true 1045 | }, 1046 | "node-fetch": { 1047 | "version": "2.6.1", 1048 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 1049 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 1050 | }, 1051 | "object-inspect": { 1052 | "version": "1.9.0", 1053 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", 1054 | "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" 1055 | }, 1056 | "object-is": { 1057 | "version": "1.1.4", 1058 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", 1059 | "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", 1060 | "requires": { 1061 | "call-bind": "^1.0.0", 1062 | "define-properties": "^1.1.3" 1063 | } 1064 | }, 1065 | "object-keys": { 1066 | "version": "1.1.1", 1067 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1068 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 1069 | }, 1070 | "object.assign": { 1071 | "version": "4.1.2", 1072 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 1073 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 1074 | "requires": { 1075 | "call-bind": "^1.0.0", 1076 | "define-properties": "^1.1.3", 1077 | "has-symbols": "^1.0.1", 1078 | "object-keys": "^1.1.1" 1079 | } 1080 | }, 1081 | "once": { 1082 | "version": "1.4.0", 1083 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1084 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1085 | "dev": true, 1086 | "requires": { 1087 | "wrappy": "1" 1088 | } 1089 | }, 1090 | "optionator": { 1091 | "version": "0.9.1", 1092 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1093 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1094 | "dev": true, 1095 | "requires": { 1096 | "deep-is": "^0.1.3", 1097 | "fast-levenshtein": "^2.0.6", 1098 | "levn": "^0.4.1", 1099 | "prelude-ls": "^1.2.1", 1100 | "type-check": "^0.4.0", 1101 | "word-wrap": "^1.2.3" 1102 | } 1103 | }, 1104 | "os-shim": { 1105 | "version": "0.1.3", 1106 | "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", 1107 | "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", 1108 | "dev": true 1109 | }, 1110 | "parent-module": { 1111 | "version": "1.0.1", 1112 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1113 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1114 | "dev": true, 1115 | "requires": { 1116 | "callsites": "^3.0.0" 1117 | } 1118 | }, 1119 | "path-is-absolute": { 1120 | "version": "1.0.1", 1121 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1122 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1123 | "dev": true 1124 | }, 1125 | "path-key": { 1126 | "version": "3.1.1", 1127 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1128 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1129 | "dev": true 1130 | }, 1131 | "pre-commit": { 1132 | "version": "1.2.2", 1133 | "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", 1134 | "integrity": "sha1-287g7p3nI15X95xW186UZBpp7sY=", 1135 | "dev": true, 1136 | "requires": { 1137 | "cross-spawn": "^5.0.1", 1138 | "spawn-sync": "^1.0.15", 1139 | "which": "1.2.x" 1140 | }, 1141 | "dependencies": { 1142 | "cross-spawn": { 1143 | "version": "5.1.0", 1144 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 1145 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 1146 | "dev": true, 1147 | "requires": { 1148 | "lru-cache": "^4.0.1", 1149 | "shebang-command": "^1.2.0", 1150 | "which": "^1.2.9" 1151 | } 1152 | }, 1153 | "lru-cache": { 1154 | "version": "4.1.5", 1155 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 1156 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 1157 | "dev": true, 1158 | "requires": { 1159 | "pseudomap": "^1.0.2", 1160 | "yallist": "^2.1.2" 1161 | } 1162 | }, 1163 | "shebang-command": { 1164 | "version": "1.2.0", 1165 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1166 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1167 | "dev": true, 1168 | "requires": { 1169 | "shebang-regex": "^1.0.0" 1170 | } 1171 | }, 1172 | "shebang-regex": { 1173 | "version": "1.0.0", 1174 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1175 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1176 | "dev": true 1177 | }, 1178 | "which": { 1179 | "version": "1.2.14", 1180 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", 1181 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", 1182 | "dev": true, 1183 | "requires": { 1184 | "isexe": "^2.0.0" 1185 | } 1186 | }, 1187 | "yallist": { 1188 | "version": "2.1.2", 1189 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1190 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1191 | "dev": true 1192 | } 1193 | } 1194 | }, 1195 | "prelude-ls": { 1196 | "version": "1.2.1", 1197 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1198 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1199 | "dev": true 1200 | }, 1201 | "process-nextick-args": { 1202 | "version": "2.0.1", 1203 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1204 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1205 | "dev": true 1206 | }, 1207 | "progress": { 1208 | "version": "2.0.3", 1209 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1210 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1211 | "dev": true 1212 | }, 1213 | "pseudomap": { 1214 | "version": "1.0.2", 1215 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1216 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1217 | "dev": true 1218 | }, 1219 | "punycode": { 1220 | "version": "2.1.1", 1221 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1222 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1223 | }, 1224 | "pvtsutils": { 1225 | "version": "1.1.1", 1226 | "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.1.1.tgz", 1227 | "integrity": "sha512-Evbhe6L4Sxwu4SPLQ4LQZhgfWDQO3qa1lju9jM5cxsQp8vE10VipcSmo7hiJW48TmiHgVLgDtC2TL6/+ND+IVg==", 1228 | "requires": { 1229 | "tslib": "^2.0.3" 1230 | } 1231 | }, 1232 | "pvutils": { 1233 | "version": "1.0.17", 1234 | "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz", 1235 | "integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==" 1236 | }, 1237 | "react-native-securerandom": { 1238 | "version": "0.1.1", 1239 | "resolved": "https://registry.npmjs.org/react-native-securerandom/-/react-native-securerandom-0.1.1.tgz", 1240 | "integrity": "sha1-8TBiOkEsM4sK+t7bwgTFy7i/IHA=", 1241 | "optional": true, 1242 | "requires": { 1243 | "base64-js": "*" 1244 | } 1245 | }, 1246 | "readable-stream": { 1247 | "version": "2.3.7", 1248 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1249 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1250 | "dev": true, 1251 | "requires": { 1252 | "core-util-is": "~1.0.0", 1253 | "inherits": "~2.0.3", 1254 | "isarray": "~1.0.0", 1255 | "process-nextick-args": "~2.0.0", 1256 | "safe-buffer": "~5.1.1", 1257 | "string_decoder": "~1.1.1", 1258 | "util-deprecate": "~1.0.1" 1259 | }, 1260 | "dependencies": { 1261 | "safe-buffer": { 1262 | "version": "5.1.2", 1263 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1264 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1265 | "dev": true 1266 | } 1267 | } 1268 | }, 1269 | "regexpp": { 1270 | "version": "3.1.0", 1271 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 1272 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 1273 | "dev": true 1274 | }, 1275 | "require-from-string": { 1276 | "version": "2.0.2", 1277 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1278 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 1279 | "dev": true 1280 | }, 1281 | "resolve-from": { 1282 | "version": "4.0.0", 1283 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1284 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1285 | "dev": true 1286 | }, 1287 | "rimraf": { 1288 | "version": "3.0.2", 1289 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1290 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1291 | "dev": true, 1292 | "requires": { 1293 | "glob": "^7.1.3" 1294 | } 1295 | }, 1296 | "safe-buffer": { 1297 | "version": "5.2.1", 1298 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1299 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1300 | }, 1301 | "semver": { 1302 | "version": "7.3.4", 1303 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", 1304 | "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", 1305 | "dev": true, 1306 | "requires": { 1307 | "lru-cache": "^6.0.0" 1308 | } 1309 | }, 1310 | "shebang-command": { 1311 | "version": "2.0.0", 1312 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1313 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1314 | "dev": true, 1315 | "requires": { 1316 | "shebang-regex": "^3.0.0" 1317 | } 1318 | }, 1319 | "shebang-regex": { 1320 | "version": "3.0.0", 1321 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1322 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1323 | "dev": true 1324 | }, 1325 | "slice-ansi": { 1326 | "version": "4.0.0", 1327 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 1328 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 1329 | "dev": true, 1330 | "requires": { 1331 | "ansi-styles": "^4.0.0", 1332 | "astral-regex": "^2.0.0", 1333 | "is-fullwidth-code-point": "^3.0.0" 1334 | }, 1335 | "dependencies": { 1336 | "ansi-styles": { 1337 | "version": "4.3.0", 1338 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1339 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1340 | "dev": true, 1341 | "requires": { 1342 | "color-convert": "^2.0.1" 1343 | } 1344 | }, 1345 | "color-convert": { 1346 | "version": "2.0.1", 1347 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1348 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1349 | "dev": true, 1350 | "requires": { 1351 | "color-name": "~1.1.4" 1352 | } 1353 | }, 1354 | "color-name": { 1355 | "version": "1.1.4", 1356 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1357 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1358 | "dev": true 1359 | } 1360 | } 1361 | }, 1362 | "spawn-sync": { 1363 | "version": "1.0.15", 1364 | "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", 1365 | "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", 1366 | "dev": true, 1367 | "requires": { 1368 | "concat-stream": "^1.4.7", 1369 | "os-shim": "^0.1.2" 1370 | } 1371 | }, 1372 | "sprintf-js": { 1373 | "version": "1.0.3", 1374 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1375 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1376 | "dev": true 1377 | }, 1378 | "standard-error": { 1379 | "version": "1.1.0", 1380 | "resolved": "https://registry.npmjs.org/standard-error/-/standard-error-1.1.0.tgz", 1381 | "integrity": "sha1-I+UWj6HAggGJ5YEnAaeQWFENDTQ=" 1382 | }, 1383 | "standard-http-error": { 1384 | "version": "2.0.1", 1385 | "resolved": "https://registry.npmjs.org/standard-http-error/-/standard-http-error-2.0.1.tgz", 1386 | "integrity": "sha1-+K6RcuPO+cs40ucIShkl9Xp8NL0=", 1387 | "requires": { 1388 | "standard-error": ">= 1.1.0 < 2" 1389 | } 1390 | }, 1391 | "str2buf": { 1392 | "version": "1.3.0", 1393 | "resolved": "https://registry.npmjs.org/str2buf/-/str2buf-1.3.0.tgz", 1394 | "integrity": "sha512-xIBmHIUHYZDP4HyoXGHYNVmxlXLXDrtFHYT0eV6IOdEj3VO9ccaF1Ejl9Oq8iFjITllpT8FhaXb4KsNmw+3EuA==" 1395 | }, 1396 | "string-width": { 1397 | "version": "4.2.0", 1398 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1399 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1400 | "dev": true, 1401 | "requires": { 1402 | "emoji-regex": "^8.0.0", 1403 | "is-fullwidth-code-point": "^3.0.0", 1404 | "strip-ansi": "^6.0.0" 1405 | } 1406 | }, 1407 | "string.prototype.trimend": { 1408 | "version": "1.0.3", 1409 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", 1410 | "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", 1411 | "requires": { 1412 | "call-bind": "^1.0.0", 1413 | "define-properties": "^1.1.3" 1414 | } 1415 | }, 1416 | "string.prototype.trimstart": { 1417 | "version": "1.0.3", 1418 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", 1419 | "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", 1420 | "requires": { 1421 | "call-bind": "^1.0.0", 1422 | "define-properties": "^1.1.3" 1423 | } 1424 | }, 1425 | "string_decoder": { 1426 | "version": "1.1.1", 1427 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1428 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1429 | "dev": true, 1430 | "requires": { 1431 | "safe-buffer": "~5.1.0" 1432 | }, 1433 | "dependencies": { 1434 | "safe-buffer": { 1435 | "version": "5.1.2", 1436 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1437 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1438 | "dev": true 1439 | } 1440 | } 1441 | }, 1442 | "strip-ansi": { 1443 | "version": "6.0.0", 1444 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1445 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1446 | "dev": true, 1447 | "requires": { 1448 | "ansi-regex": "^5.0.0" 1449 | } 1450 | }, 1451 | "strip-json-comments": { 1452 | "version": "3.1.1", 1453 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1454 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1455 | "dev": true 1456 | }, 1457 | "supports-color": { 1458 | "version": "5.5.0", 1459 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1460 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1461 | "dev": true, 1462 | "requires": { 1463 | "has-flag": "^3.0.0" 1464 | } 1465 | }, 1466 | "table": { 1467 | "version": "6.0.7", 1468 | "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", 1469 | "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", 1470 | "dev": true, 1471 | "requires": { 1472 | "ajv": "^7.0.2", 1473 | "lodash": "^4.17.20", 1474 | "slice-ansi": "^4.0.0", 1475 | "string-width": "^4.2.0" 1476 | }, 1477 | "dependencies": { 1478 | "ajv": { 1479 | "version": "7.0.3", 1480 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz", 1481 | "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==", 1482 | "dev": true, 1483 | "requires": { 1484 | "fast-deep-equal": "^3.1.1", 1485 | "json-schema-traverse": "^1.0.0", 1486 | "require-from-string": "^2.0.2", 1487 | "uri-js": "^4.2.2" 1488 | } 1489 | }, 1490 | "json-schema-traverse": { 1491 | "version": "1.0.0", 1492 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 1493 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 1494 | "dev": true 1495 | } 1496 | } 1497 | }, 1498 | "text-table": { 1499 | "version": "0.2.0", 1500 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1501 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1502 | "dev": true 1503 | }, 1504 | "tr46": { 1505 | "version": "2.0.2", 1506 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", 1507 | "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", 1508 | "requires": { 1509 | "punycode": "^2.1.1" 1510 | } 1511 | }, 1512 | "tslib": { 1513 | "version": "2.1.0", 1514 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", 1515 | "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" 1516 | }, 1517 | "type-check": { 1518 | "version": "0.4.0", 1519 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1520 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1521 | "dev": true, 1522 | "requires": { 1523 | "prelude-ls": "^1.2.1" 1524 | } 1525 | }, 1526 | "type-fest": { 1527 | "version": "0.8.1", 1528 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1529 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 1530 | "dev": true 1531 | }, 1532 | "typedarray": { 1533 | "version": "0.0.6", 1534 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1535 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1536 | "dev": true 1537 | }, 1538 | "uri-js": { 1539 | "version": "4.4.1", 1540 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1541 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1542 | "dev": true, 1543 | "requires": { 1544 | "punycode": "^2.1.0" 1545 | } 1546 | }, 1547 | "util": { 1548 | "version": "0.12.3", 1549 | "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", 1550 | "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", 1551 | "requires": { 1552 | "inherits": "^2.0.3", 1553 | "is-arguments": "^1.0.4", 1554 | "is-generator-function": "^1.0.7", 1555 | "is-typed-array": "^1.1.3", 1556 | "safe-buffer": "^5.1.2", 1557 | "which-typed-array": "^1.1.2" 1558 | } 1559 | }, 1560 | "util-deprecate": { 1561 | "version": "1.0.2", 1562 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1563 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1564 | "dev": true 1565 | }, 1566 | "v8-compile-cache": { 1567 | "version": "2.2.0", 1568 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", 1569 | "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", 1570 | "dev": true 1571 | }, 1572 | "webcrypto-core": { 1573 | "version": "1.1.9", 1574 | "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.1.9.tgz", 1575 | "integrity": "sha512-Ac7yZQpz9+oDpKgltmHUb7Czlw6fahe9AhbBOkXkaU3y7vmvrRASNmU1T0VdH4iJsNEFgYh7R49qJjru4huzmw==", 1576 | "requires": { 1577 | "@peculiar/asn1-schema": "^2.0.12", 1578 | "@peculiar/json-schema": "^1.1.12", 1579 | "asn1js": "^2.0.26", 1580 | "pvtsutils": "^1.0.11", 1581 | "tslib": "^2.0.1" 1582 | } 1583 | }, 1584 | "webcrypto-shim": { 1585 | "version": "0.1.6", 1586 | "resolved": "https://registry.npmjs.org/webcrypto-shim/-/webcrypto-shim-0.1.6.tgz", 1587 | "integrity": "sha512-0o612s3S5z3IkDSRghIwd3Ul4X8NRmmZDpt6PWGI9gSM+nygVvrfzGjhIh4vwzlOJxYxS0fcFD1wh3yznuVzFg==" 1588 | }, 1589 | "webidl-conversions": { 1590 | "version": "6.1.0", 1591 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", 1592 | "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" 1593 | }, 1594 | "whatwg-url": { 1595 | "version": "8.4.0", 1596 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", 1597 | "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", 1598 | "requires": { 1599 | "lodash.sortby": "^4.7.0", 1600 | "tr46": "^2.0.2", 1601 | "webidl-conversions": "^6.1.0" 1602 | } 1603 | }, 1604 | "which": { 1605 | "version": "2.0.2", 1606 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1607 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1608 | "dev": true, 1609 | "requires": { 1610 | "isexe": "^2.0.0" 1611 | } 1612 | }, 1613 | "which-typed-array": { 1614 | "version": "1.1.4", 1615 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", 1616 | "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", 1617 | "requires": { 1618 | "available-typed-arrays": "^1.0.2", 1619 | "call-bind": "^1.0.0", 1620 | "es-abstract": "^1.18.0-next.1", 1621 | "foreach": "^2.0.5", 1622 | "function-bind": "^1.1.1", 1623 | "has-symbols": "^1.0.1", 1624 | "is-typed-array": "^1.1.3" 1625 | } 1626 | }, 1627 | "word-wrap": { 1628 | "version": "1.2.3", 1629 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1630 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1631 | "dev": true 1632 | }, 1633 | "wrappy": { 1634 | "version": "1.0.2", 1635 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1636 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1637 | "dev": true 1638 | }, 1639 | "yallist": { 1640 | "version": "4.0.0", 1641 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1642 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1643 | "dev": true 1644 | } 1645 | } 1646 | } 1647 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@solid/cli", 3 | "version": "0.2.1", 4 | "author": "Ruben Verborgh (https://ruben.verborgh.org/)", 5 | "description": "A utility to facilitate command-line interaction with Solid servers", 6 | "license": "MIT", 7 | "repository": "https://github.com/solid/solid-cli", 8 | "bin": { 9 | "solid-bearer-token": "./bin/solid-bearer-token" 10 | }, 11 | "scripts": { 12 | "build": "echo Nothing to build", 13 | "lint": "eslint src bin/*", 14 | "test": "npm run lint" 15 | }, 16 | "dependencies": { 17 | "@solid/oidc-rp": "^0.11.5" 18 | }, 19 | "devDependencies": { 20 | "eslint": "^7.18.0", 21 | "pre-commit": "^1.2.2" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/IdentityManager.js: -------------------------------------------------------------------------------- 1 | class IdentityManager { 2 | constructor(providers = {}) { 3 | this._providers = providers; 4 | } 5 | 6 | addProviderSettings(providerSettings) { 7 | const url = providerSettings.provider.url; 8 | const provider = this._providers[url] || (this._providers[url] = {}); 9 | provider.providerSettings = providerSettings; 10 | } 11 | 12 | getProviderSettings(url) { 13 | return this._providers[url] && this._providers[url].providerSettings; 14 | } 15 | 16 | addSession(providerSettings, username, session) { 17 | this.getSessions(providerSettings)[username] = session; 18 | } 19 | 20 | getSession(providerSettings, username) { 21 | return this.getSessions(providerSettings)[username]; 22 | } 23 | 24 | getSessions(providerSettings) { 25 | const url = providerSettings.provider.url; 26 | const provider = this._providers[url] || (this._providers[url] = {}); 27 | const sessions = provider.sessions || (provider.sessions = {}); 28 | return sessions; 29 | } 30 | 31 | toJSON() { 32 | return JSON.stringify({ 33 | providers: this._providers, 34 | }); 35 | } 36 | 37 | static fromJSON(json) { 38 | const { providers } = JSON.parse(json); 39 | return new IdentityManager(providers || {}); 40 | } 41 | } 42 | 43 | module.exports = IdentityManager; 44 | -------------------------------------------------------------------------------- /src/SolidClient.js: -------------------------------------------------------------------------------- 1 | const { URL, resolve, parse: parseUrl } = require('url'); 2 | const https = require('https'); 3 | const querystring = require('querystring'); 4 | const RelyingParty = require('@solid/oidc-rp'); 5 | const PoPToken = require('@solid/oidc-rp/src/PoPToken'); 6 | 7 | // Fake redirect URL 8 | const redirectUrl = 'http://example.org/'; 9 | 10 | class SolidClient { 11 | constructor({ identityManager }) { 12 | this._identityManager = identityManager; 13 | } 14 | 15 | /** 16 | * Logs the user in with the given identity provider 17 | * 18 | * @param identityProvider string The URL of the identity provider 19 | * @param credentials object An object with username and password keys 20 | * 21 | * @returns Promise A session for the given user 22 | */ 23 | async login(identityProvider, credentials) { 24 | // Obtain a relying party 25 | const relyingParty = await this.getRelyingParty(identityProvider); 26 | 27 | // Load or create a session 28 | const username = credentials.username; 29 | let session = this._identityManager.getSession(relyingParty, username); 30 | if (!session || this.isExpired(session)) { 31 | session = await this.createSession(relyingParty, credentials); 32 | this._identityManager.addSession(relyingParty, username, session); 33 | } 34 | return session; 35 | } 36 | 37 | /** 38 | * Logs the user in with the given identity provider 39 | * 40 | * @param relyingParty RelyingParty The relying party 41 | * @param credentials object An object with username and password keys 42 | * 43 | * @returns Promise A session for the given user 44 | */ 45 | async createSession(relyingParty, credentials) { 46 | // Obtain the authorization URL 47 | const authData = {}; 48 | const authUrl = await relyingParty.createRequest({ redirect_uri: redirectUrl }, authData); 49 | 50 | // Perform the login 51 | const loginParams = await this.getLoginParams(authUrl); 52 | const accessUrl = await this.performLogin(loginParams.loginUrl, loginParams, credentials); 53 | const session = await relyingParty.validateResponse(accessUrl, authData); 54 | 55 | return session; 56 | } 57 | 58 | /** 59 | * Creates an access token for the given URL. 60 | * 61 | * @param url string 62 | * @param session Session 63 | * 64 | * @returns Promise An access token 65 | */ 66 | async createToken(url, session) { 67 | return PoPToken.issueFor(url, session); 68 | } 69 | 70 | /** 71 | * Obtains a relying party for the given identity provider. 72 | * 73 | * @param identityProvider string The URL of the identity provider 74 | * 75 | * @returns Promise A relying party 76 | */ 77 | async getRelyingParty(identityProvider) { 78 | // Try to load an existing relying party 79 | let relyingParty; 80 | const providerSettings = this._identityManager.getProviderSettings(identityProvider); 81 | if (providerSettings) { 82 | relyingParty = RelyingParty.from(providerSettings); 83 | } 84 | // Create a new relying party 85 | else { 86 | relyingParty = await this.registerRelyingParty(identityProvider); 87 | this._identityManager.addProviderSettings(relyingParty); 88 | } 89 | return relyingParty; 90 | } 91 | 92 | /** 93 | * Registers a relying party for the given identity provider. 94 | * 95 | * @param identityProvider string The URL of the identity provider 96 | * 97 | * @returns Promise A relying party 98 | */ 99 | async registerRelyingParty(identityProvider) { 100 | const responseType = 'id_token token'; 101 | const registration = { 102 | issuer: identityProvider, 103 | grant_types: ['implicit'], 104 | redirect_uris: [redirectUrl], 105 | response_types: [responseType], 106 | scope: 'openid profile', 107 | }; 108 | const options = { 109 | defaults: { 110 | authenticate: { 111 | redirect_uri: redirectUrl, 112 | response_type: responseType, 113 | }, 114 | }, 115 | }; 116 | return RelyingParty.register(identityProvider, registration, options); 117 | } 118 | 119 | /** 120 | * Obtains the login parameters through the given authentication URL. 121 | * 122 | * @param authUrl String The authentication URL 123 | * 124 | * @returns Promise A key/value object of login parameters 125 | */ 126 | async getLoginParams(authUrl) { 127 | // Retrieve the login page in HTML 128 | const authorizationPage = await this.fetch(authUrl); 129 | const loginPageUrl = resolve(authUrl, authorizationPage.headers.location); 130 | const loginPage = await this.fetch(loginPageUrl); 131 | 132 | // Extract the password form's target URL 133 | const passwordForm = loginPage.body.match(//)[0]; 134 | const loginUrl = resolve(loginPageUrl, passwordForm.match(/action="([^"]+)"/)[1]); 135 | 136 | // Extract the password form's hidden fields 137 | const loginParams = { loginUrl }; 138 | let match, inputRegex = / An access URL. 153 | */ 154 | async performLogin(loginUrl, loginParams, credentials) { 155 | // Set the credentials 156 | loginParams.username = credentials.username; 157 | loginParams.password = credentials.password; 158 | 159 | // Perform the login POST request 160 | const options = parseUrl(loginUrl); 161 | const postData = querystring.stringify(loginParams); 162 | options.method = 'POST'; 163 | options.headers = { 164 | 'Content-Type': 'application/x-www-form-urlencoded', 165 | 'Content-Length': postData.length, 166 | }; 167 | const loginResponse = await this.fetch(options, postData); 168 | 169 | // Verify the login was successful 170 | if (loginResponse.statusCode !== 302) { 171 | const message = loginResponse.body.match(/(.*?)<\/strong>/); 172 | const cause = message ? message[1] : 'unknown cause'; 173 | throw new Error(`Could not log in: ${cause}`); 174 | } 175 | 176 | // Redirect to the authentication page, passing the session cookie 177 | let authUrl = loginResponse.headers.location; 178 | const cookie = loginResponse.headers['set-cookie'][0].replace(/;.*/, ''); 179 | 180 | // Handle the new consent page in 5.1.1 181 | if (this.isAboveVersion511(loginResponse.headers['x-powered-by'])) { 182 | const consentUrl = new URL(authUrl); 183 | const search = consentUrl.search.substring(1); 184 | let consPostData = JSON.parse('{"' + decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/\=/g, '":"') + '"}'); 185 | consPostData.consent = true; 186 | consPostData.access_mode = ['Read', 'Write', 'Append', 'Control']; 187 | consPostData = querystring.stringify(consPostData); 188 | const consOptions = parseUrl(`${consentUrl.origin}${consentUrl.pathname}`); 189 | consOptions.method = 'POST'; 190 | consOptions.headers = { 191 | 'Content-Type': 'application/x-www-form-urlencoded', 192 | 'Content-Length': consPostData.length, 193 | cookie, 194 | }; 195 | const consentResponse = await this.fetch(consOptions, consPostData); 196 | 197 | authUrl = consentResponse.headers.location; 198 | } 199 | 200 | const authResponse = await this.fetch(Object.assign(parseUrl(authUrl), { 201 | headers: { cookie }, 202 | })); 203 | 204 | // Obtain the access URL from the redirected response 205 | const accessUrl = authResponse.headers.location; 206 | return accessUrl; 207 | } 208 | 209 | isAboveVersion511(version) { 210 | return /^solid-server\/5\.(1\.[1-9]|[2-9]|1\d)/.test(version); 211 | } 212 | 213 | /** 214 | * Fetches the given resource over HTTP. 215 | * 216 | * @param options object The request options 217 | * @param data? string The request body 218 | * 219 | * @returns Promise The HTTP response with a body property 220 | */ 221 | fetch(options, data) { 222 | return new Promise((resolve, reject) => { 223 | const request = https.request(options); 224 | request.end(data); 225 | request.on('response', response => { 226 | response.body = ''; 227 | response.on('data', data => response.body += data); 228 | response.on('end', () => resolve(response)); 229 | }); 230 | request.on('error', reject); 231 | }); 232 | } 233 | 234 | /** 235 | * Determines whether the session has expired. 236 | * 237 | * @param session object The session 238 | * 239 | * @returns boolean Whether the session has expired 240 | */ 241 | isExpired(session) { 242 | const now = Date.now() / 1000; 243 | const expiry = session.idClaims && session.idClaims.exp || 0; 244 | return expiry < now; 245 | } 246 | } 247 | 248 | module.exports = SolidClient; 249 | --------------------------------------------------------------------------------