├── .editorconfig ├── .github └── workflows │ ├── lint.yml │ └── nodejs.yml ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src └── index.ts ├── tsconfig.json └── tslint.json /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | end_of_line = lf 4 | indent_size = 2 5 | indent_style = space 6 | insert_final_newline = true 7 | root = true 8 | trim_trailing_whitespace = true 9 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Linting 2 | 3 | on: [push] 4 | 5 | jobs: 6 | lint: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v1 10 | - name: Use Node.js 11 | uses: actions/setup-node@v1 12 | with: 13 | node-version: 10.x 14 | - name: npm install, build, and test 15 | run: | 16 | npm install 17 | npm run lint 18 | env: 19 | CI: true 20 | -------------------------------------------------------------------------------- /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | name: Node CI 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | jobs: 8 | linting: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v1 12 | - name: Use Node.js 13 | uses: actions/setup-node@v1 14 | with: 15 | node-version: 10.x 16 | - name: npm install, build, and test 17 | run: | 18 | npm install 19 | npm run lint 20 | env: 21 | CI: true 22 | 23 | build-and-publish-npm: 24 | if: success() 25 | runs-on: ubuntu-latest 26 | strategy: 27 | matrix: 28 | node-version: [10.x] 29 | steps: 30 | - uses: actions/checkout@v1 31 | - name: Use Node.js ${{ matrix.node-version }} 32 | uses: actions/setup-node@v1 33 | with: 34 | node-version: ${{ matrix.node-version }} 35 | - name: Authenticate with NPM 36 | run: | 37 | echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" >> ~/.npmrc 38 | - name: npm publish 39 | run: | 40 | npm install 41 | npm publish 42 | env: 43 | CI: true 44 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | dist 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "arrowParens": "always" 4 | } 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018-present Dominik Biedebach 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `@d2k/react-localstorage` 2 | 3 | > React hooks for easy and simple localstorage access 4 | 5 | > You'll need to install `react`, `react-dom`, etc at `^16.8.4` 6 | 7 | ## Install 8 | 9 | ```sh 10 | npm i @d2k/react-localstorage --save 11 | ``` 12 | 13 | ## Usage 14 | 15 | React Localstorage gives you simple hooks to work with your localstorage. Here is some example code: 16 | 17 | ```jsx 18 | import React from 'react' 19 | import useLocalStorage from '@d2k/react-localstorage' 20 | 21 | const App = () => { 22 | const [firstName, setFirstName, removeFirstName] = useLocalStorage('firstName', 'John') 23 | const [lastName, setLastName, removeLastName] = useLocalStorage('lastName', 'Doe') 24 | 25 | // You can update localStorage data via setFirstName('John') or removeFirstName() 26 | 27 | return ( 28 |

Demo

29 | { firstName && lastName && ( 30 |

31 | Hello {firstName} {lastName} 32 |

33 | )} 34 | ) 35 | } 36 | ``` 37 | 38 | Use `.set` or `.remove` to update data from your component. 39 | 40 | All storage updates will be automatically synced with all components using the same localStorage value key. 41 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@d2k/react-localstorage", 3 | "version": "1.1.3", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.10.4", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 19 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 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 | }, 33 | "@octokit/rest": { 34 | "version": "15.2.6", 35 | "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-15.2.6.tgz", 36 | "integrity": "sha512-KcqG0zjnjzUqn7wczz/fKiueNpTLiAI7erhUG6bXWAsYKJJlqnwYonFSXrMW/nmes5y+qOk4uSyHBh1mdRXdVQ==", 37 | "dev": true, 38 | "requires": { 39 | "before-after-hook": "^1.1.0", 40 | "btoa-lite": "^1.0.0", 41 | "debug": "^3.1.0", 42 | "http-proxy-agent": "^2.1.0", 43 | "https-proxy-agent": "^2.2.0", 44 | "lodash": "^4.17.4", 45 | "node-fetch": "^2.1.1", 46 | "url-template": "^2.0.8" 47 | } 48 | }, 49 | "@types/prop-types": { 50 | "version": "15.7.3", 51 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", 52 | "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", 53 | "dev": true 54 | }, 55 | "@types/react": { 56 | "version": "16.9.46", 57 | "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.46.tgz", 58 | "integrity": "sha512-dbHzO3aAq1lB3jRQuNpuZ/mnu+CdD3H0WVaaBQA8LTT3S33xhVBUj232T8M3tAhSWJs/D/UqORYUlJNl/8VQZg==", 59 | "dev": true, 60 | "requires": { 61 | "@types/prop-types": "*", 62 | "csstype": "^3.0.2" 63 | } 64 | }, 65 | "after-all-results": { 66 | "version": "2.0.0", 67 | "resolved": "https://registry.npmjs.org/after-all-results/-/after-all-results-2.0.0.tgz", 68 | "integrity": "sha1-asL8ICtQD4jaj09VMM+hAPTGotA=", 69 | "dev": true 70 | }, 71 | "agent-base": { 72 | "version": "4.3.0", 73 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 74 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 75 | "dev": true, 76 | "requires": { 77 | "es6-promisify": "^5.0.0" 78 | } 79 | }, 80 | "ansi-escapes": { 81 | "version": "3.2.0", 82 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 83 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 84 | "dev": true 85 | }, 86 | "ansi-regex": { 87 | "version": "3.0.0", 88 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 89 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 90 | "dev": true 91 | }, 92 | "ansi-styles": { 93 | "version": "3.2.1", 94 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 95 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 96 | "dev": true, 97 | "requires": { 98 | "color-convert": "^1.9.0" 99 | } 100 | }, 101 | "argparse": { 102 | "version": "1.0.10", 103 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 104 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 105 | "dev": true, 106 | "requires": { 107 | "sprintf-js": "~1.0.2" 108 | } 109 | }, 110 | "args": { 111 | "version": "4.0.0", 112 | "resolved": "https://registry.npmjs.org/args/-/args-4.0.0.tgz", 113 | "integrity": "sha512-4b7lVF58nlo7sNtq8s2OueroOY/UHn0Nt/NVjsx9zn28u6yDVb9bQ/uy/5jKtHCbUDil4MlMyDLF5+OHEgnTug==", 114 | "dev": true, 115 | "requires": { 116 | "camelcase": "5.0.0", 117 | "chalk": "2.3.2", 118 | "leven": "2.1.0", 119 | "mri": "1.1.0" 120 | }, 121 | "dependencies": { 122 | "chalk": { 123 | "version": "2.3.2", 124 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", 125 | "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", 126 | "dev": true, 127 | "requires": { 128 | "ansi-styles": "^3.2.1", 129 | "escape-string-regexp": "^1.0.5", 130 | "supports-color": "^5.3.0" 131 | } 132 | } 133 | } 134 | }, 135 | "async-retry": { 136 | "version": "1.2.1", 137 | "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.1.tgz", 138 | "integrity": "sha512-FadV8UDcyZDjzb6eV7MCJj0bfrNjwKw7/X0QHPFCbYP6T20FXgZCYXpJKlQC8RxEQP1E6Xs8pNHdh3bcrZAuAw==", 139 | "dev": true, 140 | "requires": { 141 | "retry": "0.10.1" 142 | } 143 | }, 144 | "balanced-match": { 145 | "version": "1.0.0", 146 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 147 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 148 | "dev": true 149 | }, 150 | "before-after-hook": { 151 | "version": "1.4.0", 152 | "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.4.0.tgz", 153 | "integrity": "sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg==", 154 | "dev": true 155 | }, 156 | "brace-expansion": { 157 | "version": "1.1.11", 158 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 159 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 160 | "dev": true, 161 | "requires": { 162 | "balanced-match": "^1.0.0", 163 | "concat-map": "0.0.1" 164 | } 165 | }, 166 | "btoa-lite": { 167 | "version": "1.0.0", 168 | "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", 169 | "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", 170 | "dev": true 171 | }, 172 | "builtin-modules": { 173 | "version": "1.1.1", 174 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 175 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 176 | "dev": true 177 | }, 178 | "camelcase": { 179 | "version": "5.0.0", 180 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", 181 | "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", 182 | "dev": true 183 | }, 184 | "capitalize": { 185 | "version": "1.0.0", 186 | "resolved": "https://registry.npmjs.org/capitalize/-/capitalize-1.0.0.tgz", 187 | "integrity": "sha1-3IAsWAruEBkpAg0soUtMqKCuRL4=", 188 | "dev": true 189 | }, 190 | "chalk": { 191 | "version": "2.4.0", 192 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", 193 | "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", 194 | "dev": true, 195 | "requires": { 196 | "ansi-styles": "^3.2.1", 197 | "escape-string-regexp": "^1.0.5", 198 | "supports-color": "^5.3.0" 199 | } 200 | }, 201 | "chardet": { 202 | "version": "0.4.2", 203 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 204 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", 205 | "dev": true 206 | }, 207 | "child-process-promise": { 208 | "version": "2.2.1", 209 | "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", 210 | "integrity": "sha1-RzChHvYQ+tRQuPIjx50x172tgHQ=", 211 | "dev": true, 212 | "requires": { 213 | "cross-spawn": "^4.0.2", 214 | "node-version": "^1.0.0", 215 | "promise-polyfill": "^6.0.1" 216 | } 217 | }, 218 | "cli-cursor": { 219 | "version": "2.1.0", 220 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 221 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 222 | "dev": true, 223 | "requires": { 224 | "restore-cursor": "^2.0.0" 225 | } 226 | }, 227 | "cli-spinners": { 228 | "version": "1.3.1", 229 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", 230 | "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", 231 | "dev": true 232 | }, 233 | "cli-width": { 234 | "version": "2.2.1", 235 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 236 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 237 | "dev": true 238 | }, 239 | "clone": { 240 | "version": "1.0.4", 241 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 242 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 243 | "dev": true 244 | }, 245 | "color-convert": { 246 | "version": "1.9.3", 247 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 248 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 249 | "dev": true, 250 | "requires": { 251 | "color-name": "1.1.3" 252 | } 253 | }, 254 | "color-name": { 255 | "version": "1.1.3", 256 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 257 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 258 | "dev": true 259 | }, 260 | "commander": { 261 | "version": "2.20.3", 262 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 263 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 264 | "dev": true 265 | }, 266 | "concat-map": { 267 | "version": "0.0.1", 268 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 269 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 270 | "dev": true 271 | }, 272 | "configstore": { 273 | "version": "3.1.2", 274 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", 275 | "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", 276 | "dev": true, 277 | "requires": { 278 | "dot-prop": "^4.1.0", 279 | "graceful-fs": "^4.1.2", 280 | "make-dir": "^1.0.0", 281 | "unique-string": "^1.0.0", 282 | "write-file-atomic": "^2.0.0", 283 | "xdg-basedir": "^3.0.0" 284 | } 285 | }, 286 | "core-util-is": { 287 | "version": "1.0.2", 288 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 289 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 290 | "dev": true 291 | }, 292 | "cross-spawn": { 293 | "version": "4.0.2", 294 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", 295 | "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", 296 | "dev": true, 297 | "requires": { 298 | "lru-cache": "^4.0.1", 299 | "which": "^1.2.9" 300 | } 301 | }, 302 | "crypto-random-string": { 303 | "version": "1.0.0", 304 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 305 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", 306 | "dev": true 307 | }, 308 | "csstype": { 309 | "version": "3.0.2", 310 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", 311 | "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==", 312 | "dev": true 313 | }, 314 | "cwd": { 315 | "version": "0.9.1", 316 | "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.9.1.tgz", 317 | "integrity": "sha1-QeEKfhq4M9xZwuyoOBTH3ne1pP0=", 318 | "dev": true, 319 | "requires": { 320 | "find-pkg": "^0.1.0" 321 | } 322 | }, 323 | "debug": { 324 | "version": "3.2.6", 325 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 326 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 327 | "dev": true, 328 | "requires": { 329 | "ms": "^2.1.1" 330 | } 331 | }, 332 | "decompress-response": { 333 | "version": "3.3.0", 334 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 335 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 336 | "dev": true, 337 | "requires": { 338 | "mimic-response": "^1.0.0" 339 | } 340 | }, 341 | "deep-extend": { 342 | "version": "0.6.0", 343 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 344 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 345 | "dev": true 346 | }, 347 | "defaults": { 348 | "version": "1.0.3", 349 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", 350 | "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", 351 | "dev": true, 352 | "requires": { 353 | "clone": "^1.0.2" 354 | } 355 | }, 356 | "delay": { 357 | "version": "4.3.0", 358 | "resolved": "https://registry.npmjs.org/delay/-/delay-4.3.0.tgz", 359 | "integrity": "sha512-Lwaf3zVFDMBop1yDuFZ19F9WyGcZcGacsbdlZtWjQmM50tOcMntm1njF/Nb/Vjij3KaSvCF+sEYGKrrjObu2NA==", 360 | "dev": true 361 | }, 362 | "diff": { 363 | "version": "4.0.2", 364 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 365 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 366 | "dev": true 367 | }, 368 | "dot-prop": { 369 | "version": "4.2.1", 370 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", 371 | "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", 372 | "dev": true, 373 | "requires": { 374 | "is-obj": "^1.0.0" 375 | } 376 | }, 377 | "duplexer3": { 378 | "version": "0.1.4", 379 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 380 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", 381 | "dev": true 382 | }, 383 | "es6-promise": { 384 | "version": "4.2.8", 385 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 386 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 387 | "dev": true 388 | }, 389 | "es6-promisify": { 390 | "version": "5.0.0", 391 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 392 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 393 | "dev": true, 394 | "requires": { 395 | "es6-promise": "^4.0.3" 396 | } 397 | }, 398 | "escape-goat": { 399 | "version": "1.3.0", 400 | "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-1.3.0.tgz", 401 | "integrity": "sha512-E2nU1Y39N5UgfLU8qwMlK0vZrZprIwWLeVmDYN8wd/e37hMtGzu2w1DBiREts0XHfgyZEQlj/hYr0H0izF0HDQ==", 402 | "dev": true 403 | }, 404 | "escape-string-regexp": { 405 | "version": "1.0.5", 406 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 407 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 408 | "dev": true 409 | }, 410 | "esprima": { 411 | "version": "4.0.1", 412 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 413 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 414 | "dev": true 415 | }, 416 | "expand-tilde": { 417 | "version": "1.2.2", 418 | "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", 419 | "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", 420 | "dev": true, 421 | "requires": { 422 | "os-homedir": "^1.0.1" 423 | } 424 | }, 425 | "extend-shallow": { 426 | "version": "2.0.1", 427 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 428 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 429 | "dev": true, 430 | "requires": { 431 | "is-extendable": "^0.1.0" 432 | } 433 | }, 434 | "external-editor": { 435 | "version": "2.2.0", 436 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 437 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 438 | "dev": true, 439 | "requires": { 440 | "chardet": "^0.4.0", 441 | "iconv-lite": "^0.4.17", 442 | "tmp": "^0.0.33" 443 | } 444 | }, 445 | "figures": { 446 | "version": "2.0.0", 447 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 448 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 449 | "dev": true, 450 | "requires": { 451 | "escape-string-regexp": "^1.0.5" 452 | } 453 | }, 454 | "file-name": { 455 | "version": "0.1.0", 456 | "resolved": "https://registry.npmjs.org/file-name/-/file-name-0.1.0.tgz", 457 | "integrity": "sha1-ErEi8SD5w028F2wauBpUis7W3vc=", 458 | "dev": true 459 | }, 460 | "find-file-up": { 461 | "version": "0.1.3", 462 | "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", 463 | "integrity": "sha1-z2gJG8+fMApA2kEbN9pczlovvqA=", 464 | "dev": true, 465 | "requires": { 466 | "fs-exists-sync": "^0.1.0", 467 | "resolve-dir": "^0.1.0" 468 | } 469 | }, 470 | "find-pkg": { 471 | "version": "0.1.2", 472 | "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", 473 | "integrity": "sha1-G9wiwG42NlUy4qJIBGhUuXiNpVc=", 474 | "dev": true, 475 | "requires": { 476 | "find-file-up": "^0.1.2" 477 | } 478 | }, 479 | "fs-exists-sync": { 480 | "version": "0.1.0", 481 | "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", 482 | "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", 483 | "dev": true 484 | }, 485 | "fs-extra": { 486 | "version": "5.0.0", 487 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", 488 | "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", 489 | "dev": true, 490 | "requires": { 491 | "graceful-fs": "^4.1.2", 492 | "jsonfile": "^4.0.0", 493 | "universalify": "^0.1.0" 494 | } 495 | }, 496 | "fs.realpath": { 497 | "version": "1.0.0", 498 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 499 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 500 | "dev": true 501 | }, 502 | "get-stream": { 503 | "version": "3.0.0", 504 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 505 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 506 | "dev": true 507 | }, 508 | "gh-got": { 509 | "version": "6.0.0", 510 | "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", 511 | "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", 512 | "dev": true, 513 | "requires": { 514 | "got": "^7.0.0", 515 | "is-plain-obj": "^1.1.0" 516 | } 517 | }, 518 | "git-config-path": { 519 | "version": "1.0.1", 520 | "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", 521 | "integrity": "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ=", 522 | "dev": true, 523 | "requires": { 524 | "extend-shallow": "^2.0.1", 525 | "fs-exists-sync": "^0.1.0", 526 | "homedir-polyfill": "^1.0.0" 527 | } 528 | }, 529 | "git-repo-name": { 530 | "version": "0.6.0", 531 | "resolved": "https://registry.npmjs.org/git-repo-name/-/git-repo-name-0.6.0.tgz", 532 | "integrity": "sha1-rwmIRlaqU37GJccIcAgXXNYSKP8=", 533 | "dev": true, 534 | "requires": { 535 | "cwd": "^0.9.1", 536 | "file-name": "^0.1.0", 537 | "lazy-cache": "^1.0.4", 538 | "remote-origin-url": "^0.5.1" 539 | } 540 | }, 541 | "git-spawned-stream": { 542 | "version": "1.0.0", 543 | "resolved": "https://registry.npmjs.org/git-spawned-stream/-/git-spawned-stream-1.0.0.tgz", 544 | "integrity": "sha1-q/+vHasb8qYSkm1f7RyfNe9OMRE=", 545 | "dev": true, 546 | "requires": { 547 | "debug": "~0.8.1", 548 | "spawn-to-readstream": "~0.1.3" 549 | }, 550 | "dependencies": { 551 | "debug": { 552 | "version": "0.8.1", 553 | "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", 554 | "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=", 555 | "dev": true 556 | } 557 | } 558 | }, 559 | "git-state": { 560 | "version": "4.0.0", 561 | "resolved": "https://registry.npmjs.org/git-state/-/git-state-4.0.0.tgz", 562 | "integrity": "sha512-7rW22+ryQP6az93gU2jr+4SVAAoEPLELTwQiZd1ldq+77N+KLinP1FyZ61bkWrbXiZcEc9F9mpam2r30yG68Tw==", 563 | "dev": true, 564 | "requires": { 565 | "after-all-results": "^2.0.0" 566 | } 567 | }, 568 | "git-username": { 569 | "version": "1.0.0", 570 | "resolved": "https://registry.npmjs.org/git-username/-/git-username-1.0.0.tgz", 571 | "integrity": "sha512-xm45KwBR6Eu1jO4umx/o2M84v9TC7tdOBuzLx8ayhdR9H1FBiiG9azz31uC0esDvaWVBTDINpJ5USomk+ja8OQ==", 572 | "dev": true, 573 | "requires": { 574 | "parse-github-url": "^1.0.2", 575 | "remote-origin-url": "^1.0.0" 576 | }, 577 | "dependencies": { 578 | "remote-origin-url": { 579 | "version": "1.0.0", 580 | "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-1.0.0.tgz", 581 | "integrity": "sha512-xHDM6IBqivpiQ1e4WOuFpM/T6rbzA/WBsu+3WLtgPOhHyjA0nYlijV3NprlTb4FcXlQ5+Q+z174sQ1NnUF5FwA==", 582 | "dev": true, 583 | "requires": { 584 | "parse-git-config": "^1.1.1" 585 | } 586 | } 587 | } 588 | }, 589 | "github-username": { 590 | "version": "4.1.0", 591 | "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", 592 | "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", 593 | "dev": true, 594 | "requires": { 595 | "gh-got": "^6.0.0" 596 | } 597 | }, 598 | "glob": { 599 | "version": "7.1.6", 600 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 601 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 602 | "dev": true, 603 | "requires": { 604 | "fs.realpath": "^1.0.0", 605 | "inflight": "^1.0.4", 606 | "inherits": "2", 607 | "minimatch": "^3.0.4", 608 | "once": "^1.3.0", 609 | "path-is-absolute": "^1.0.0" 610 | } 611 | }, 612 | "global-modules": { 613 | "version": "0.2.3", 614 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", 615 | "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", 616 | "dev": true, 617 | "requires": { 618 | "global-prefix": "^0.1.4", 619 | "is-windows": "^0.2.0" 620 | } 621 | }, 622 | "global-prefix": { 623 | "version": "0.1.5", 624 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", 625 | "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", 626 | "dev": true, 627 | "requires": { 628 | "homedir-polyfill": "^1.0.0", 629 | "ini": "^1.3.4", 630 | "is-windows": "^0.2.0", 631 | "which": "^1.2.12" 632 | } 633 | }, 634 | "got": { 635 | "version": "7.1.0", 636 | "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", 637 | "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", 638 | "dev": true, 639 | "requires": { 640 | "decompress-response": "^3.2.0", 641 | "duplexer3": "^0.1.4", 642 | "get-stream": "^3.0.0", 643 | "is-plain-obj": "^1.1.0", 644 | "is-retry-allowed": "^1.0.0", 645 | "is-stream": "^1.0.0", 646 | "isurl": "^1.0.0-alpha5", 647 | "lowercase-keys": "^1.0.0", 648 | "p-cancelable": "^0.3.0", 649 | "p-timeout": "^1.1.1", 650 | "safe-buffer": "^5.0.1", 651 | "timed-out": "^4.0.0", 652 | "url-parse-lax": "^1.0.0", 653 | "url-to-options": "^1.0.1" 654 | } 655 | }, 656 | "graceful-fs": { 657 | "version": "4.2.4", 658 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 659 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 660 | "dev": true 661 | }, 662 | "has-flag": { 663 | "version": "3.0.0", 664 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 665 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 666 | "dev": true 667 | }, 668 | "has-symbol-support-x": { 669 | "version": "1.4.2", 670 | "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", 671 | "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", 672 | "dev": true 673 | }, 674 | "has-to-string-tag-x": { 675 | "version": "1.4.1", 676 | "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", 677 | "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", 678 | "dev": true, 679 | "requires": { 680 | "has-symbol-support-x": "^1.4.1" 681 | } 682 | }, 683 | "homedir-polyfill": { 684 | "version": "1.0.3", 685 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", 686 | "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", 687 | "dev": true, 688 | "requires": { 689 | "parse-passwd": "^1.0.0" 690 | } 691 | }, 692 | "http-proxy-agent": { 693 | "version": "2.1.0", 694 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 695 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 696 | "dev": true, 697 | "requires": { 698 | "agent-base": "4", 699 | "debug": "3.1.0" 700 | }, 701 | "dependencies": { 702 | "debug": { 703 | "version": "3.1.0", 704 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 705 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 706 | "dev": true, 707 | "requires": { 708 | "ms": "2.0.0" 709 | } 710 | }, 711 | "ms": { 712 | "version": "2.0.0", 713 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 714 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 715 | "dev": true 716 | } 717 | } 718 | }, 719 | "https-proxy-agent": { 720 | "version": "2.2.4", 721 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 722 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 723 | "dev": true, 724 | "requires": { 725 | "agent-base": "^4.3.0", 726 | "debug": "^3.1.0" 727 | } 728 | }, 729 | "iconv-lite": { 730 | "version": "0.4.24", 731 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 732 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 733 | "dev": true, 734 | "requires": { 735 | "safer-buffer": ">= 2.1.2 < 3" 736 | } 737 | }, 738 | "imurmurhash": { 739 | "version": "0.1.4", 740 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 741 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 742 | "dev": true 743 | }, 744 | "inflight": { 745 | "version": "1.0.6", 746 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 747 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 748 | "dev": true, 749 | "requires": { 750 | "once": "^1.3.0", 751 | "wrappy": "1" 752 | } 753 | }, 754 | "inherits": { 755 | "version": "2.0.4", 756 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 757 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 758 | "dev": true 759 | }, 760 | "ini": { 761 | "version": "1.3.8", 762 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 763 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 764 | "dev": true 765 | }, 766 | "inquirer": { 767 | "version": "5.2.0", 768 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", 769 | "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", 770 | "dev": true, 771 | "requires": { 772 | "ansi-escapes": "^3.0.0", 773 | "chalk": "^2.0.0", 774 | "cli-cursor": "^2.1.0", 775 | "cli-width": "^2.0.0", 776 | "external-editor": "^2.1.0", 777 | "figures": "^2.0.0", 778 | "lodash": "^4.3.0", 779 | "mute-stream": "0.0.7", 780 | "run-async": "^2.2.0", 781 | "rxjs": "^5.5.2", 782 | "string-width": "^2.1.0", 783 | "strip-ansi": "^4.0.0", 784 | "through": "^2.3.6" 785 | } 786 | }, 787 | "is-extendable": { 788 | "version": "0.1.1", 789 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 790 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 791 | "dev": true 792 | }, 793 | "is-fullwidth-code-point": { 794 | "version": "2.0.0", 795 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 796 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 797 | "dev": true 798 | }, 799 | "is-obj": { 800 | "version": "1.0.1", 801 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 802 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 803 | "dev": true 804 | }, 805 | "is-object": { 806 | "version": "1.0.1", 807 | "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", 808 | "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", 809 | "dev": true 810 | }, 811 | "is-plain-obj": { 812 | "version": "1.1.0", 813 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 814 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", 815 | "dev": true 816 | }, 817 | "is-retry-allowed": { 818 | "version": "1.2.0", 819 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", 820 | "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", 821 | "dev": true 822 | }, 823 | "is-stream": { 824 | "version": "1.1.0", 825 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 826 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 827 | "dev": true 828 | }, 829 | "is-windows": { 830 | "version": "0.2.0", 831 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", 832 | "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", 833 | "dev": true 834 | }, 835 | "is-wsl": { 836 | "version": "1.1.0", 837 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 838 | "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", 839 | "dev": true 840 | }, 841 | "isarray": { 842 | "version": "0.0.1", 843 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 844 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 845 | "dev": true 846 | }, 847 | "isexe": { 848 | "version": "2.0.0", 849 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 850 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 851 | "dev": true 852 | }, 853 | "isurl": { 854 | "version": "1.0.0", 855 | "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", 856 | "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", 857 | "dev": true, 858 | "requires": { 859 | "has-to-string-tag-x": "^1.2.0", 860 | "is-object": "^1.0.1" 861 | } 862 | }, 863 | "js-tokens": { 864 | "version": "4.0.0", 865 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 866 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 867 | "dev": true 868 | }, 869 | "js-yaml": { 870 | "version": "3.14.0", 871 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 872 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 873 | "dev": true, 874 | "requires": { 875 | "argparse": "^1.0.7", 876 | "esprima": "^4.0.0" 877 | } 878 | }, 879 | "jsonfile": { 880 | "version": "4.0.0", 881 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 882 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 883 | "dev": true, 884 | "requires": { 885 | "graceful-fs": "^4.1.6" 886 | } 887 | }, 888 | "lazy-cache": { 889 | "version": "1.0.4", 890 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 891 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 892 | "dev": true 893 | }, 894 | "leven": { 895 | "version": "2.1.0", 896 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 897 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", 898 | "dev": true 899 | }, 900 | "limit-spawn": { 901 | "version": "0.0.3", 902 | "resolved": "https://registry.npmjs.org/limit-spawn/-/limit-spawn-0.0.3.tgz", 903 | "integrity": "sha1-zAnCRGeg8KHtEKUZbbpZfK0/Zdw=", 904 | "dev": true 905 | }, 906 | "lodash": { 907 | "version": "4.17.21", 908 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 909 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 910 | "dev": true 911 | }, 912 | "log-symbols": { 913 | "version": "2.2.0", 914 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", 915 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 916 | "dev": true, 917 | "requires": { 918 | "chalk": "^2.0.1" 919 | } 920 | }, 921 | "loose-envify": { 922 | "version": "1.4.0", 923 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 924 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 925 | "dev": true, 926 | "requires": { 927 | "js-tokens": "^3.0.0 || ^4.0.0" 928 | } 929 | }, 930 | "lowercase-keys": { 931 | "version": "1.0.1", 932 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 933 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", 934 | "dev": true 935 | }, 936 | "lru-cache": { 937 | "version": "4.1.5", 938 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 939 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 940 | "dev": true, 941 | "requires": { 942 | "pseudomap": "^1.0.2", 943 | "yallist": "^2.1.2" 944 | } 945 | }, 946 | "make-dir": { 947 | "version": "1.3.0", 948 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 949 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 950 | "dev": true, 951 | "requires": { 952 | "pify": "^3.0.0" 953 | } 954 | }, 955 | "mimic-fn": { 956 | "version": "1.2.0", 957 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 958 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 959 | "dev": true 960 | }, 961 | "mimic-response": { 962 | "version": "1.0.1", 963 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 964 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 965 | "dev": true 966 | }, 967 | "minimatch": { 968 | "version": "3.0.4", 969 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 970 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 971 | "dev": true, 972 | "requires": { 973 | "brace-expansion": "^1.1.7" 974 | } 975 | }, 976 | "minimist": { 977 | "version": "1.2.5", 978 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 979 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 980 | "dev": true 981 | }, 982 | "mkdirp": { 983 | "version": "0.5.5", 984 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 985 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 986 | "dev": true, 987 | "requires": { 988 | "minimist": "^1.2.5" 989 | } 990 | }, 991 | "mri": { 992 | "version": "1.1.0", 993 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.0.tgz", 994 | "integrity": "sha1-XAo/KcjM/7ux7JQdzsCdcfoy82o=", 995 | "dev": true 996 | }, 997 | "ms": { 998 | "version": "2.1.2", 999 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1000 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1001 | "dev": true 1002 | }, 1003 | "mute-stream": { 1004 | "version": "0.0.7", 1005 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1006 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1007 | "dev": true 1008 | }, 1009 | "node-fetch": { 1010 | "version": "2.6.0", 1011 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 1012 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", 1013 | "dev": true 1014 | }, 1015 | "node-version": { 1016 | "version": "1.1.3", 1017 | "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.1.3.tgz", 1018 | "integrity": "sha512-rEwE51JWn0yN3Wl5BXeGn5d52OGbSXzWiiXRjAQeuyvcGKyvuSILW2rb3G7Xh+nexzLwhTpek6Ehxd6IjvHePg==", 1019 | "dev": true 1020 | }, 1021 | "object-assign": { 1022 | "version": "4.1.1", 1023 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1024 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1025 | "dev": true 1026 | }, 1027 | "object-keys": { 1028 | "version": "0.4.0", 1029 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", 1030 | "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", 1031 | "dev": true 1032 | }, 1033 | "once": { 1034 | "version": "1.4.0", 1035 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1036 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1037 | "dev": true, 1038 | "requires": { 1039 | "wrappy": "1" 1040 | } 1041 | }, 1042 | "onetime": { 1043 | "version": "2.0.1", 1044 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1045 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1046 | "dev": true, 1047 | "requires": { 1048 | "mimic-fn": "^1.0.0" 1049 | } 1050 | }, 1051 | "opn": { 1052 | "version": "5.4.0", 1053 | "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", 1054 | "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", 1055 | "dev": true, 1056 | "requires": { 1057 | "is-wsl": "^1.1.0" 1058 | } 1059 | }, 1060 | "ora": { 1061 | "version": "2.0.0", 1062 | "resolved": "https://registry.npmjs.org/ora/-/ora-2.0.0.tgz", 1063 | "integrity": "sha512-g+IR0nMUXq1k4nE3gkENbN4wkF0XsVZFyxznTF6CdmwQ9qeTGONGpSR9LM5//1l0TVvJoJF3MkMtJp6slUsWFg==", 1064 | "dev": true, 1065 | "requires": { 1066 | "chalk": "^2.3.1", 1067 | "cli-cursor": "^2.1.0", 1068 | "cli-spinners": "^1.1.0", 1069 | "log-symbols": "^2.2.0", 1070 | "strip-ansi": "^4.0.0", 1071 | "wcwidth": "^1.0.1" 1072 | } 1073 | }, 1074 | "os-homedir": { 1075 | "version": "1.0.2", 1076 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1077 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1078 | "dev": true 1079 | }, 1080 | "os-tmpdir": { 1081 | "version": "1.0.2", 1082 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1083 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1084 | "dev": true 1085 | }, 1086 | "p-cancelable": { 1087 | "version": "0.3.0", 1088 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", 1089 | "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", 1090 | "dev": true 1091 | }, 1092 | "p-finally": { 1093 | "version": "1.0.0", 1094 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1095 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1096 | "dev": true 1097 | }, 1098 | "p-timeout": { 1099 | "version": "1.2.1", 1100 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", 1101 | "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", 1102 | "dev": true, 1103 | "requires": { 1104 | "p-finally": "^1.0.0" 1105 | } 1106 | }, 1107 | "parse-git-config": { 1108 | "version": "1.1.1", 1109 | "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz", 1110 | "integrity": "sha1-06mYQxcTL1c5hxK7pDjhKVkN34w=", 1111 | "dev": true, 1112 | "requires": { 1113 | "extend-shallow": "^2.0.1", 1114 | "fs-exists-sync": "^0.1.0", 1115 | "git-config-path": "^1.0.1", 1116 | "ini": "^1.3.4" 1117 | } 1118 | }, 1119 | "parse-github-url": { 1120 | "version": "1.0.2", 1121 | "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", 1122 | "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", 1123 | "dev": true 1124 | }, 1125 | "parse-passwd": { 1126 | "version": "1.0.0", 1127 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 1128 | "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", 1129 | "dev": true 1130 | }, 1131 | "path-is-absolute": { 1132 | "version": "1.0.1", 1133 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1134 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1135 | "dev": true 1136 | }, 1137 | "path-parse": { 1138 | "version": "1.0.7", 1139 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1140 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1141 | "dev": true 1142 | }, 1143 | "pify": { 1144 | "version": "3.0.0", 1145 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1146 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1147 | "dev": true 1148 | }, 1149 | "prepend-http": { 1150 | "version": "1.0.4", 1151 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", 1152 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", 1153 | "dev": true 1154 | }, 1155 | "promise-polyfill": { 1156 | "version": "6.1.0", 1157 | "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", 1158 | "integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=", 1159 | "dev": true 1160 | }, 1161 | "prop-types": { 1162 | "version": "15.7.2", 1163 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 1164 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 1165 | "dev": true, 1166 | "requires": { 1167 | "loose-envify": "^1.4.0", 1168 | "object-assign": "^4.1.1", 1169 | "react-is": "^16.8.1" 1170 | } 1171 | }, 1172 | "pseudomap": { 1173 | "version": "1.0.2", 1174 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1175 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1176 | "dev": true 1177 | }, 1178 | "random-string": { 1179 | "version": "0.2.0", 1180 | "resolved": "https://registry.npmjs.org/random-string/-/random-string-0.2.0.tgz", 1181 | "integrity": "sha1-pG5DdTUr7amg17DRntbTIezR2C0=", 1182 | "dev": true 1183 | }, 1184 | "rc": { 1185 | "version": "1.2.8", 1186 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1187 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1188 | "dev": true, 1189 | "requires": { 1190 | "deep-extend": "^0.6.0", 1191 | "ini": "~1.3.0", 1192 | "minimist": "^1.2.0", 1193 | "strip-json-comments": "~2.0.1" 1194 | } 1195 | }, 1196 | "react": { 1197 | "version": "16.13.1", 1198 | "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", 1199 | "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", 1200 | "dev": true, 1201 | "requires": { 1202 | "loose-envify": "^1.1.0", 1203 | "object-assign": "^4.1.1", 1204 | "prop-types": "^15.6.2" 1205 | } 1206 | }, 1207 | "react-dom": { 1208 | "version": "16.13.1", 1209 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", 1210 | "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", 1211 | "dev": true, 1212 | "requires": { 1213 | "loose-envify": "^1.1.0", 1214 | "object-assign": "^4.1.1", 1215 | "prop-types": "^15.6.2", 1216 | "scheduler": "^0.19.1" 1217 | } 1218 | }, 1219 | "react-is": { 1220 | "version": "16.13.1", 1221 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1222 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 1223 | "dev": true 1224 | }, 1225 | "readable-stream": { 1226 | "version": "1.0.34", 1227 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 1228 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 1229 | "dev": true, 1230 | "requires": { 1231 | "core-util-is": "~1.0.0", 1232 | "inherits": "~2.0.1", 1233 | "isarray": "0.0.1", 1234 | "string_decoder": "~0.10.x" 1235 | } 1236 | }, 1237 | "registry-auth-token": { 1238 | "version": "3.3.2", 1239 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", 1240 | "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", 1241 | "dev": true, 1242 | "requires": { 1243 | "rc": "^1.1.6", 1244 | "safe-buffer": "^5.0.1" 1245 | } 1246 | }, 1247 | "registry-url": { 1248 | "version": "3.1.0", 1249 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", 1250 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", 1251 | "dev": true, 1252 | "requires": { 1253 | "rc": "^1.0.1" 1254 | } 1255 | }, 1256 | "release": { 1257 | "version": "6.3.0", 1258 | "resolved": "https://registry.npmjs.org/release/-/release-6.3.0.tgz", 1259 | "integrity": "sha512-p2dQcsNzCwI0LMHFb/BAd49NrTbIlt2krjaDVHsjV40tScLIRHVatEtN+4MV4Xx9jKKGiZGoM2gtrSn6vJeM1g==", 1260 | "dev": true, 1261 | "requires": { 1262 | "@octokit/rest": "15.2.6", 1263 | "args": "4.0.0", 1264 | "async-retry": "1.2.1", 1265 | "capitalize": "1.0.0", 1266 | "chalk": "2.4.0", 1267 | "configstore": "3.1.2", 1268 | "delay": "4.3.0", 1269 | "escape-goat": "1.3.0", 1270 | "fs-extra": "5.0.0", 1271 | "git-repo-name": "0.6.0", 1272 | "git-spawned-stream": "1.0.0", 1273 | "git-state": "4.0.0", 1274 | "git-username": "1.0.0", 1275 | "github-username": "4.1.0", 1276 | "inquirer": "5.2.0", 1277 | "node-fetch": "2.6.0", 1278 | "node-version": "1.1.3", 1279 | "opn": "5.4.0", 1280 | "ora": "2.0.0", 1281 | "random-string": "0.2.0", 1282 | "semver": "5.5.0", 1283 | "tagged-versions": "1.3.0", 1284 | "update-check": "1.3.2" 1285 | } 1286 | }, 1287 | "remote-origin-url": { 1288 | "version": "0.5.3", 1289 | "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-0.5.3.tgz", 1290 | "integrity": "sha512-crQ7Xk1m/F2IiwBx5oTqk/c0hjoumrEz+a36+ZoVupskQRE/q7pAwHKsTNeiZ31sbSTELvVlVv4h1W0Xo5szKg==", 1291 | "dev": true, 1292 | "requires": { 1293 | "parse-git-config": "^1.1.1" 1294 | } 1295 | }, 1296 | "resolve": { 1297 | "version": "1.17.0", 1298 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 1299 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 1300 | "dev": true, 1301 | "requires": { 1302 | "path-parse": "^1.0.6" 1303 | } 1304 | }, 1305 | "resolve-dir": { 1306 | "version": "0.1.1", 1307 | "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", 1308 | "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", 1309 | "dev": true, 1310 | "requires": { 1311 | "expand-tilde": "^1.2.2", 1312 | "global-modules": "^0.2.3" 1313 | } 1314 | }, 1315 | "restore-cursor": { 1316 | "version": "2.0.0", 1317 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1318 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1319 | "dev": true, 1320 | "requires": { 1321 | "onetime": "^2.0.0", 1322 | "signal-exit": "^3.0.2" 1323 | } 1324 | }, 1325 | "retry": { 1326 | "version": "0.10.1", 1327 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", 1328 | "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", 1329 | "dev": true 1330 | }, 1331 | "run-async": { 1332 | "version": "2.4.1", 1333 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1334 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 1335 | "dev": true 1336 | }, 1337 | "rxjs": { 1338 | "version": "5.5.12", 1339 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", 1340 | "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", 1341 | "dev": true, 1342 | "requires": { 1343 | "symbol-observable": "1.0.1" 1344 | } 1345 | }, 1346 | "safe-buffer": { 1347 | "version": "5.2.1", 1348 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1349 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1350 | "dev": true 1351 | }, 1352 | "safer-buffer": { 1353 | "version": "2.1.2", 1354 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1355 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1356 | "dev": true 1357 | }, 1358 | "scheduler": { 1359 | "version": "0.19.1", 1360 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", 1361 | "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", 1362 | "dev": true, 1363 | "requires": { 1364 | "loose-envify": "^1.1.0", 1365 | "object-assign": "^4.1.1" 1366 | } 1367 | }, 1368 | "semver": { 1369 | "version": "5.5.0", 1370 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 1371 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", 1372 | "dev": true 1373 | }, 1374 | "signal-exit": { 1375 | "version": "3.0.3", 1376 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1377 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 1378 | "dev": true 1379 | }, 1380 | "spawn-to-readstream": { 1381 | "version": "0.1.3", 1382 | "resolved": "https://registry.npmjs.org/spawn-to-readstream/-/spawn-to-readstream-0.1.3.tgz", 1383 | "integrity": "sha1-lnaLcnOaxk/6d8jOLL+YwtIdjb8=", 1384 | "dev": true, 1385 | "requires": { 1386 | "limit-spawn": "0.0.3", 1387 | "through2": "~0.4.1" 1388 | } 1389 | }, 1390 | "sprintf-js": { 1391 | "version": "1.0.3", 1392 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1393 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1394 | "dev": true 1395 | }, 1396 | "string-width": { 1397 | "version": "2.1.1", 1398 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1399 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1400 | "dev": true, 1401 | "requires": { 1402 | "is-fullwidth-code-point": "^2.0.0", 1403 | "strip-ansi": "^4.0.0" 1404 | } 1405 | }, 1406 | "string_decoder": { 1407 | "version": "0.10.31", 1408 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1409 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1410 | "dev": true 1411 | }, 1412 | "strip-ansi": { 1413 | "version": "4.0.0", 1414 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1415 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1416 | "dev": true, 1417 | "requires": { 1418 | "ansi-regex": "^3.0.0" 1419 | } 1420 | }, 1421 | "strip-json-comments": { 1422 | "version": "2.0.1", 1423 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1424 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1425 | "dev": true 1426 | }, 1427 | "supports-color": { 1428 | "version": "5.5.0", 1429 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1430 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1431 | "dev": true, 1432 | "requires": { 1433 | "has-flag": "^3.0.0" 1434 | } 1435 | }, 1436 | "symbol-observable": { 1437 | "version": "1.0.1", 1438 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", 1439 | "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", 1440 | "dev": true 1441 | }, 1442 | "tagged-versions": { 1443 | "version": "1.3.0", 1444 | "resolved": "https://registry.npmjs.org/tagged-versions/-/tagged-versions-1.3.0.tgz", 1445 | "integrity": "sha1-/TzKF2hZgXuVsfXTEaEsnAjIvcQ=", 1446 | "dev": true, 1447 | "requires": { 1448 | "child-process-promise": "^2.1.3", 1449 | "semver": "^5.3.0" 1450 | } 1451 | }, 1452 | "through": { 1453 | "version": "2.3.8", 1454 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1455 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1456 | "dev": true 1457 | }, 1458 | "through2": { 1459 | "version": "0.4.2", 1460 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", 1461 | "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", 1462 | "dev": true, 1463 | "requires": { 1464 | "readable-stream": "~1.0.17", 1465 | "xtend": "~2.1.1" 1466 | } 1467 | }, 1468 | "timed-out": { 1469 | "version": "4.0.1", 1470 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 1471 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", 1472 | "dev": true 1473 | }, 1474 | "tmp": { 1475 | "version": "0.0.33", 1476 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1477 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1478 | "dev": true, 1479 | "requires": { 1480 | "os-tmpdir": "~1.0.2" 1481 | } 1482 | }, 1483 | "tslib": { 1484 | "version": "1.13.0", 1485 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 1486 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", 1487 | "dev": true 1488 | }, 1489 | "tslint": { 1490 | "version": "5.20.1", 1491 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", 1492 | "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", 1493 | "dev": true, 1494 | "requires": { 1495 | "@babel/code-frame": "^7.0.0", 1496 | "builtin-modules": "^1.1.1", 1497 | "chalk": "^2.3.0", 1498 | "commander": "^2.12.1", 1499 | "diff": "^4.0.1", 1500 | "glob": "^7.1.1", 1501 | "js-yaml": "^3.13.1", 1502 | "minimatch": "^3.0.4", 1503 | "mkdirp": "^0.5.1", 1504 | "resolve": "^1.3.2", 1505 | "semver": "^5.3.0", 1506 | "tslib": "^1.8.0", 1507 | "tsutils": "^2.29.0" 1508 | } 1509 | }, 1510 | "tsutils": { 1511 | "version": "2.29.0", 1512 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 1513 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 1514 | "dev": true, 1515 | "requires": { 1516 | "tslib": "^1.8.1" 1517 | } 1518 | }, 1519 | "typescript": { 1520 | "version": "3.9.7", 1521 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", 1522 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", 1523 | "dev": true 1524 | }, 1525 | "unique-string": { 1526 | "version": "1.0.0", 1527 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 1528 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 1529 | "dev": true, 1530 | "requires": { 1531 | "crypto-random-string": "^1.0.0" 1532 | } 1533 | }, 1534 | "universalify": { 1535 | "version": "0.1.2", 1536 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1537 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1538 | "dev": true 1539 | }, 1540 | "update-check": { 1541 | "version": "1.3.2", 1542 | "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.3.2.tgz", 1543 | "integrity": "sha512-0iGt63gXrsU4VTw4tIGVVk14H6KLHI7ExNPuSmdDdwUrUAQTBnh1hQcRpnoBWetb3/Ab4YyXK1iDWXP7D0VHTQ==", 1544 | "dev": true, 1545 | "requires": { 1546 | "registry-auth-token": "3.3.2", 1547 | "registry-url": "3.1.0" 1548 | } 1549 | }, 1550 | "url-parse-lax": { 1551 | "version": "1.0.0", 1552 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", 1553 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", 1554 | "dev": true, 1555 | "requires": { 1556 | "prepend-http": "^1.0.1" 1557 | } 1558 | }, 1559 | "url-template": { 1560 | "version": "2.0.8", 1561 | "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", 1562 | "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", 1563 | "dev": true 1564 | }, 1565 | "url-to-options": { 1566 | "version": "1.0.1", 1567 | "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", 1568 | "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", 1569 | "dev": true 1570 | }, 1571 | "wcwidth": { 1572 | "version": "1.0.1", 1573 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 1574 | "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", 1575 | "dev": true, 1576 | "requires": { 1577 | "defaults": "^1.0.3" 1578 | } 1579 | }, 1580 | "which": { 1581 | "version": "1.3.1", 1582 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1583 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1584 | "dev": true, 1585 | "requires": { 1586 | "isexe": "^2.0.0" 1587 | } 1588 | }, 1589 | "wrappy": { 1590 | "version": "1.0.2", 1591 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1592 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1593 | "dev": true 1594 | }, 1595 | "write-file-atomic": { 1596 | "version": "2.4.3", 1597 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", 1598 | "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", 1599 | "dev": true, 1600 | "requires": { 1601 | "graceful-fs": "^4.1.11", 1602 | "imurmurhash": "^0.1.4", 1603 | "signal-exit": "^3.0.2" 1604 | } 1605 | }, 1606 | "xdg-basedir": { 1607 | "version": "3.0.0", 1608 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 1609 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", 1610 | "dev": true 1611 | }, 1612 | "xtend": { 1613 | "version": "2.1.2", 1614 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", 1615 | "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", 1616 | "dev": true, 1617 | "requires": { 1618 | "object-keys": "~0.4.0" 1619 | } 1620 | }, 1621 | "yallist": { 1622 | "version": "2.1.2", 1623 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1624 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1625 | "dev": true 1626 | } 1627 | } 1628 | } 1629 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@d2k/react-localstorage", 3 | "version": "1.1.3", 4 | "description": "React hooks for localstorage", 5 | "main": "./dist/index.js", 6 | "types": "./dist/index.d.ts", 7 | "repository": "https://github.com/bdbch/react-localstorage", 8 | "author": "@d2k", 9 | "license": "MIT", 10 | "publishConfig": { 11 | "access": "public" 12 | }, 13 | "files": [ 14 | "dist/**/*.*" 15 | ], 16 | "keywords": [ 17 | "react", 18 | "hooks", 19 | "localstorage" 20 | ], 21 | "scripts": { 22 | "prepublish": "npm run build", 23 | "start": "tsc --watch", 24 | "build": "npm run clean && tsc", 25 | "clean": "rm -rf ./dist", 26 | "lint": "tslint -c tslint.json 'src/**/*.ts?(x)'", 27 | "set-upstream": "git branch --set-upstream-to origin/master", 28 | "release:major": "npm run set-upstream && release major", 29 | "release:minor": "npm run set-upstream && release minor", 30 | "release:patch": "npm run set-upstream && release patch" 31 | }, 32 | "devDependencies": { 33 | "@types/react": "^16.8.23", 34 | "react": "^16.8.4", 35 | "react-dom": "^16.8.4", 36 | "release": "^6.1.0", 37 | "tslint": "^5.20.0", 38 | "typescript": "^3.5.3" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { useCallback, useEffect, useState } from "react"; 2 | 3 | const writeToLocalStorage = (key: string, data: any) => { 4 | const stringifiedData = JSON.stringify(data); 5 | window.localStorage.setItem(key, stringifiedData); 6 | }; 7 | 8 | const clearLocalStorageByKey = (key: string) => { 9 | window.localStorage.removeItem(key); 10 | }; 11 | 12 | const useLocalStorage = ( 13 | key: string, 14 | defaultValue?: T, 15 | ): [T | undefined, (val: T) => void, () => void] => { 16 | const [data, setData] = useState(undefined); 17 | const set = useCallback( 18 | (localStorageData) => writeToLocalStorage(key, localStorageData), 19 | [key], 20 | ); 21 | const remove = useCallback(() => clearLocalStorageByKey(key), [key]); 22 | 23 | useEffect(() => { 24 | const currentData = window.localStorage.getItem(key); 25 | 26 | if ( 27 | (!currentData || 28 | typeof currentData === "undefined" || 29 | typeof currentData === null) && 30 | defaultValue 31 | ) { 32 | set(defaultValue); 33 | } 34 | 35 | if ( 36 | currentData && 37 | typeof currentData !== "undefined" && 38 | typeof currentData !== null 39 | ) { 40 | const parsedData = JSON.parse(currentData); 41 | if (parsedData) { 42 | setData(parsedData); 43 | } 44 | } 45 | }, [key]); 46 | 47 | const checkLocalStorage = useCallback( 48 | (e: StorageEvent) => { 49 | if (e.storageArea === window.localStorage) { 50 | if (key === e.key && e.newValue) { 51 | setData(JSON.parse(e.newValue)); 52 | } 53 | } 54 | }, 55 | [key], 56 | ); 57 | 58 | useEffect(() => { 59 | window.addEventListener("storage", checkLocalStorage); 60 | return () => window.removeEventListener("storage", checkLocalStorage); 61 | }, [key]); 62 | 63 | return [data, set, remove]; 64 | }; 65 | 66 | export default useLocalStorage; 67 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | // "incremental": true, /* Enable incremental compilation */ 5 | "target": "es5", 6 | /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ 7 | "module": "commonjs", 8 | /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 9 | "lib": ["dom", "es2015"], 10 | /* Specify library files to be included in the compilation. */ 11 | "allowJs": false, 12 | /* Allow javascript files to be compiled. */ 13 | "checkJs": false, 14 | /* Report errors in .js files. */ 15 | "jsx": "react", 16 | /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 17 | "declaration": true, 18 | /* Generates corresponding '.d.ts' file. */ 19 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 20 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 21 | // "outFile": "./", /* Concatenate and emit output to single file. */ 22 | "outDir": "./dist", 23 | /* Redirect output structure to the directory. */ 24 | "rootDir": "./src", 25 | /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 26 | // "composite": true, /* Enable project compilation */ 27 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 28 | // "removeComments": true, /* Do not emit comments to output. */ 29 | // "noEmit": true, /* Do not emit outputs. */ 30 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 31 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 32 | "isolatedModules": false, 33 | /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 34 | 35 | /* Strict Type-Checking Options */ 36 | "strict": true, 37 | /* Enable all strict type-checking options. */ 38 | "noImplicitAny": true, 39 | /* Raise error on expressions and declarations with an implied 'any' type. */ 40 | "strictNullChecks": true, 41 | /* Enable strict null checks. */ 42 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 43 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 44 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 45 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 46 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 47 | 48 | /* Additional Checks */ 49 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 50 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 51 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 52 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 53 | 54 | /* Module Resolution Options */ 55 | "moduleResolution": "node", 56 | /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 57 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 58 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 59 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 60 | // "typeRoots": [], /* List of folders to include type definitions from. */ 61 | // "types": [], /* Type declaration files to be included in compilation. */ 62 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 63 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 64 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 65 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 66 | 67 | /* Source Map Options */ 68 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 69 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 70 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 71 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 72 | 73 | /* Experimental Options */ 74 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 75 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": {}, 7 | "rules": {}, 8 | "rulesDirectory": [] 9 | } --------------------------------------------------------------------------------