├── .firebase └── hosting.ZGlzdA.cache ├── .firebaserc ├── .gitignore ├── LICENSE ├── README.md ├── firebase.json ├── index.html ├── package.json ├── pnpm-lock.yaml ├── public └── favicon.ico ├── src ├── App.vue ├── components │ ├── GitHub.vue │ ├── Homepage.vue │ └── Twitter.vue ├── firebase.js ├── main.js ├── router.js └── views │ ├── Profile.vue │ └── SignIn.vue └── vite.config.js /.firebase/hosting.ZGlzdA.cache: -------------------------------------------------------------------------------- 1 | index.html,1670529247036,1bd2b17efc1c44116a6b379345020ca29228878a2407684f917fda58010cf100 2 | assets/index-7d7ce957.css,1670529247036,e3ccd64866cfa2d06ad796e7cbe09c01f3125bed486457e096f04d868e6a3c00 3 | favicon.ico,1670444641717,d5451f0f0f0bcbcd433bbdf4f6e7e5d89d8ecce2650649e969ccb5e5cd499ab2 4 | assets/index-f149710d.js,1670529247036,0be91a9ee5de54ef578d79c80df195ae0537bb208a88f91c62ed486756f9969d 5 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "vue-routes-authentication" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Gaute Meek Olsen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue-guard-routes-with-Firebase-Authentication 2 | 3 | Demonstration on how to guard paths in a Vue project with Vue Router and Firebase Authentication 4 | 5 | ## Article 6 | 7 | I have written a blog with explenation 8 | 9 | [gaute.dev](https://gaute.dev/dev-blog/vue-router-firebase-auth) 10 | 11 | [Medium](https://medium.com/@gaute.meek/vue-guard-routes-with-firebase-authentication-7a139bb8b4f6) 12 | 13 | [dev.to](https://dev.to/gautemeekolsen/vue-guard-routes-with-firebase-authentication-f4l) 14 | 15 | ## Demo 16 | Hosted at [vue-routes-authentication.web.app](https://vue-routes-authentication.web.app) 17 | 18 | ## Summary 19 | ```js 20 | export function getCurrentUser() { 21 | return new Promise((resolve, reject) => { 22 | const unsubscribe = onAuthStateChanged(auth, (user) => { 23 | unsubscribe() 24 | resolve(user) 25 | }, reject) 26 | }) 27 | } 28 | ``` 29 | ```js 30 | const routes = [ 31 | { 32 | path: '/', 33 | redirect: '/signin' 34 | }, 35 | { 36 | path: '/signin', 37 | component: SignIn 38 | }, 39 | { 40 | path: '/profile', 41 | component: Profile, 42 | meta: { 43 | requiresAuth: true 44 | } 45 | } 46 | ] 47 | 48 | router.beforeEach(async (to) => { 49 | const requiresAuth = to.matched.some(record => record.meta.requiresAuth); 50 | if (requiresAuth && !await getCurrentUser()) { 51 | return '/signin'; 52 | } 53 | }) 54 | ``` 55 | 56 | ## Dev 57 | 58 | ### Serve 59 | `npm run dev` 60 | 61 | ### Deploy to Firebase hosting 62 | `npm run deploy` 63 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "dist", 4 | "ignore": [ 5 | "firebase.json", 6 | "**/.*", 7 | "**/node_modules/**" 8 | ], 9 | "rewrites": [ 10 | { 11 | "source": "**", 12 | "destination": "/index.html" 13 | } 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | vue-guard-routes-with-firebase-authentication 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-guard-routes-with-firebase-authentication", 3 | "version": "0.2.0", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "deploy": "vite build && firebase deploy" 9 | }, 10 | "dependencies": { 11 | "firebase": "^9.14.0", 12 | "vue": "^3.2.45", 13 | "vue-router": "^4.1.6" 14 | }, 15 | "devDependencies": { 16 | "@vitejs/plugin-vue": "^4.0.0-beta.0", 17 | "vite": "^4.0.0-beta.5" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@vitejs/plugin-vue': ^4.0.0-beta.0 5 | firebase: ^9.14.0 6 | vite: ^4.0.0-beta.5 7 | vue: ^3.2.45 8 | vue-router: ^4.1.6 9 | 10 | dependencies: 11 | firebase: 9.14.0 12 | vue: 3.2.45 13 | vue-router: 4.1.6_vue@3.2.45 14 | 15 | devDependencies: 16 | '@vitejs/plugin-vue': 4.0.0-beta.0_52n6m3tculxsdye4oufjkspuma 17 | vite: 4.0.0-beta.5 18 | 19 | packages: 20 | 21 | /@babel/helper-string-parser/7.19.4: 22 | resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} 23 | engines: {node: '>=6.9.0'} 24 | 25 | /@babel/helper-validator-identifier/7.19.1: 26 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} 27 | engines: {node: '>=6.9.0'} 28 | 29 | /@babel/parser/7.20.5: 30 | resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==} 31 | engines: {node: '>=6.0.0'} 32 | hasBin: true 33 | dependencies: 34 | '@babel/types': 7.20.5 35 | 36 | /@babel/types/7.20.5: 37 | resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==} 38 | engines: {node: '>=6.9.0'} 39 | dependencies: 40 | '@babel/helper-string-parser': 7.19.4 41 | '@babel/helper-validator-identifier': 7.19.1 42 | to-fast-properties: 2.0.0 43 | 44 | /@esbuild/android-arm/0.16.1: 45 | resolution: {integrity: sha512-zkalq3i2M+l812fhSswRM9FSryXEmoz30bfDlPYOl1ij0hBZd+lU3rRUzHSenU8LpsN/SAgX1d/mwq2dvGO3Qw==} 46 | engines: {node: '>=12'} 47 | cpu: [arm] 48 | os: [android] 49 | requiresBuild: true 50 | dev: true 51 | optional: true 52 | 53 | /@esbuild/android-arm64/0.16.1: 54 | resolution: {integrity: sha512-BHOqlxpx2UNDHvn6Ldu2QftJXYtXmsagaECew1RiY27hd/wqCx+pz5ByQpNRPyqv5S9uODqtk69LkXpmPqSqJA==} 55 | engines: {node: '>=12'} 56 | cpu: [arm64] 57 | os: [android] 58 | requiresBuild: true 59 | dev: true 60 | optional: true 61 | 62 | /@esbuild/android-x64/0.16.1: 63 | resolution: {integrity: sha512-/xaEo77WGtykr4+VUHZF78xc/pfmtrfpYb6tJjA5sPCsqynXKdM7Z1E7LoqP7NJZbf5KW8Klm64f9CTIm97R9w==} 64 | engines: {node: '>=12'} 65 | cpu: [x64] 66 | os: [android] 67 | requiresBuild: true 68 | dev: true 69 | optional: true 70 | 71 | /@esbuild/darwin-arm64/0.16.1: 72 | resolution: {integrity: sha512-vYWHFDhxF4hmOVs1NkanPtbBb2ZcVAkMJan5iImpaL/FA2SfYIFX8IN/W20e7/2DpDxd7XkrP1i5bQUAsyXjsQ==} 73 | engines: {node: '>=12'} 74 | cpu: [arm64] 75 | os: [darwin] 76 | requiresBuild: true 77 | dev: true 78 | optional: true 79 | 80 | /@esbuild/darwin-x64/0.16.1: 81 | resolution: {integrity: sha512-UFJ8swS3ZiQgT51ll9P3K+WOiYSc3Dw68kbZqXlmF5zwB7p/nx31jilW6ie+UlKIFRw4X0Z1SejwVC6ZpH7PSQ==} 82 | engines: {node: '>=12'} 83 | cpu: [x64] 84 | os: [darwin] 85 | requiresBuild: true 86 | dev: true 87 | optional: true 88 | 89 | /@esbuild/freebsd-arm64/0.16.1: 90 | resolution: {integrity: sha512-/6kJ0VROu7JYiWMV9EscVHH66HCCDd0Uo3mGjrP6vtscF19f9Prkf3xZJH3AO9OxUOZpfjtZatf9b0OyKVMl6A==} 91 | engines: {node: '>=12'} 92 | cpu: [arm64] 93 | os: [freebsd] 94 | requiresBuild: true 95 | dev: true 96 | optional: true 97 | 98 | /@esbuild/freebsd-x64/0.16.1: 99 | resolution: {integrity: sha512-BKYAYhsgD/6/mOeOwMSEcTyL9GlFBNr2LkgWEaugUp/oXCC+ScCH/EqphD3Jp5MsMNIk71b0YqDDveDHXuwcLw==} 100 | engines: {node: '>=12'} 101 | cpu: [x64] 102 | os: [freebsd] 103 | requiresBuild: true 104 | dev: true 105 | optional: true 106 | 107 | /@esbuild/linux-arm/0.16.1: 108 | resolution: {integrity: sha512-ZKBI/JEIjcG9YbERCDR1qPBVjr47+BKGp32Iz2cf00001yhF8mGPhVJse69jR3Wb1RU78BijVKhHPvZewsvAKA==} 109 | engines: {node: '>=12'} 110 | cpu: [arm] 111 | os: [linux] 112 | requiresBuild: true 113 | dev: true 114 | optional: true 115 | 116 | /@esbuild/linux-arm64/0.16.1: 117 | resolution: {integrity: sha512-3mRaXF3nVjgPcrJOLr3IdidMLolHi3nMO7UQPYX+asKqn3UVnNqD30vlZvg8r1amJ7o5TOHvPXqgHK33ivyMPg==} 118 | engines: {node: '>=12'} 119 | cpu: [arm64] 120 | os: [linux] 121 | requiresBuild: true 122 | dev: true 123 | optional: true 124 | 125 | /@esbuild/linux-ia32/0.16.1: 126 | resolution: {integrity: sha512-rTiIs5ms38XUb5Bn7hbbkR45CS3rz/hC/IfRE8Uccgzo4qRkf3Zd0Re6IUoCP+DvcTzLPz1VLfDO8VyD7UUI0w==} 127 | engines: {node: '>=12'} 128 | cpu: [ia32] 129 | os: [linux] 130 | requiresBuild: true 131 | dev: true 132 | optional: true 133 | 134 | /@esbuild/linux-loong64/0.16.1: 135 | resolution: {integrity: sha512-TgUV9ZpMzo9O48AkwJfgx9HJIMnA9kCopAYmjp2y9TPT6Z7Crxrlp2XVkaZ2mxhvrrzVsHlhwfolcj1scXHfKw==} 136 | engines: {node: '>=12'} 137 | cpu: [loong64] 138 | os: [linux] 139 | requiresBuild: true 140 | dev: true 141 | optional: true 142 | 143 | /@esbuild/linux-mips64el/0.16.1: 144 | resolution: {integrity: sha512-TH6aEzbImbo1iUrdhtRdhgynuuiODx+Ju2DaIq+eUIOLj6Hg47NlcM5hQ3bHVKxflPiGIrGi1DTacrEoQOiOTg==} 145 | engines: {node: '>=12'} 146 | cpu: [mips64el] 147 | os: [linux] 148 | requiresBuild: true 149 | dev: true 150 | optional: true 151 | 152 | /@esbuild/linux-ppc64/0.16.1: 153 | resolution: {integrity: sha512-//BU2o/gfw6clxJCrU8xa0gxElP18HiAzS/pN1HKzL2ayqz8WinOYEzPOZrqJvkC4u2Qoh5NEiVd98wTr2C9eg==} 154 | engines: {node: '>=12'} 155 | cpu: [ppc64] 156 | os: [linux] 157 | requiresBuild: true 158 | dev: true 159 | optional: true 160 | 161 | /@esbuild/linux-riscv64/0.16.1: 162 | resolution: {integrity: sha512-pBrrjLBwmlsMR7iNi+W/q5JtfyzlZ97WUxBztZvsGnWBpnmjjgbdPBlwxYbgQAzqzMAsP45j6CJUpGra3SSFiQ==} 163 | engines: {node: '>=12'} 164 | cpu: [riscv64] 165 | os: [linux] 166 | requiresBuild: true 167 | dev: true 168 | optional: true 169 | 170 | /@esbuild/linux-s390x/0.16.1: 171 | resolution: {integrity: sha512-e4txkDfouCcByJacawPh9M6qmF9TyzJ+Y6Sj4L+Iu7pRBaAldSqI/pQym26XBcawVlmyYhLA51JXVlQdyj3Rlg==} 172 | engines: {node: '>=12'} 173 | cpu: [s390x] 174 | os: [linux] 175 | requiresBuild: true 176 | dev: true 177 | optional: true 178 | 179 | /@esbuild/linux-x64/0.16.1: 180 | resolution: {integrity: sha512-2kSF6dFTN5HbSgA+htdS69npthoR/FDr8PXc9O6h6RqRN+l7y3u8MlFMu9RSsOOD11FigiBJnzUYcl3QRT9eSA==} 181 | engines: {node: '>=12'} 182 | cpu: [x64] 183 | os: [linux] 184 | requiresBuild: true 185 | dev: true 186 | optional: true 187 | 188 | /@esbuild/netbsd-x64/0.16.1: 189 | resolution: {integrity: sha512-OkDgqg+drkSEvNOAEPUQrv3g7OlE0hMsLe7on5+GePZvjgQepQ7fQ8T6RGj2nEMGa5Am2Q3jWEVx5lq6bsFpRw==} 190 | engines: {node: '>=12'} 191 | cpu: [x64] 192 | os: [netbsd] 193 | requiresBuild: true 194 | dev: true 195 | optional: true 196 | 197 | /@esbuild/openbsd-x64/0.16.1: 198 | resolution: {integrity: sha512-YqC0KN4nJoDSIaBVkUYa1FvreYFKu6wOoWGl+lYmcRzw6pj5f96+WSE7+vRiucKpDd52P1CYlnO9yGzSo9eXSw==} 199 | engines: {node: '>=12'} 200 | cpu: [x64] 201 | os: [openbsd] 202 | requiresBuild: true 203 | dev: true 204 | optional: true 205 | 206 | /@esbuild/sunos-x64/0.16.1: 207 | resolution: {integrity: sha512-KgfRBLjr6W9iyLLAOU58lSJ7/6W7H+KoDV27CGpEv0R5xR2LYMAE2SQ2sE0r2CP1rDa/huu/Uj1RvcVZ5nptqg==} 208 | engines: {node: '>=12'} 209 | cpu: [x64] 210 | os: [sunos] 211 | requiresBuild: true 212 | dev: true 213 | optional: true 214 | 215 | /@esbuild/win32-arm64/0.16.1: 216 | resolution: {integrity: sha512-UuKMH583a6epN+L6VxbXwYQ/RISJsz8NN05QlV2l0LY8aV79Wty23BkBz0WF5kOK22eXNavgb2sgcZer6Qg+KA==} 217 | engines: {node: '>=12'} 218 | cpu: [arm64] 219 | os: [win32] 220 | requiresBuild: true 221 | dev: true 222 | optional: true 223 | 224 | /@esbuild/win32-ia32/0.16.1: 225 | resolution: {integrity: sha512-tnno7oPwPfZAyxRguqTi6ehf/s/x8xq1QtB8TLAfSP3DfIaO1U3gHAf5I/AMVlZPMzwtDUvURRfJK/a72cHyZg==} 226 | engines: {node: '>=12'} 227 | cpu: [ia32] 228 | os: [win32] 229 | requiresBuild: true 230 | dev: true 231 | optional: true 232 | 233 | /@esbuild/win32-x64/0.16.1: 234 | resolution: {integrity: sha512-vxkjnTk2nCxx3eIolisfjvIN0eZj8vp27iF/fh3vQ7GXkEdK/VzbolT8Nl5YsEddrXc5RRJbHulHM0pGuY+VgQ==} 235 | engines: {node: '>=12'} 236 | cpu: [x64] 237 | os: [win32] 238 | requiresBuild: true 239 | dev: true 240 | optional: true 241 | 242 | /@firebase/analytics-compat/0.1.17_dvqpjc4ehcooegrkfkqbfp67kq: 243 | resolution: {integrity: sha512-36ByEDsH6/3YNuD6yig30s2A/+E1pt333r8SJirUE8+aHYl/DGX0PXplKvJWDGamYYjMwet3Kt4XRrB1NY8mLg==} 244 | peerDependencies: 245 | '@firebase/app-compat': 0.x 246 | dependencies: 247 | '@firebase/analytics': 0.8.4_@firebase+app@0.8.4 248 | '@firebase/analytics-types': 0.7.1 249 | '@firebase/app-compat': 0.1.39 250 | '@firebase/component': 0.5.21 251 | '@firebase/util': 1.7.3 252 | tslib: 2.4.1 253 | transitivePeerDependencies: 254 | - '@firebase/app' 255 | dev: false 256 | 257 | /@firebase/analytics-types/0.7.1: 258 | resolution: {integrity: sha512-a1INLjelc1Mqrt2CbGmGdlNBj0zsvwBv0K5q5C6Fje8GSXBMc3+iQQQjzYe/4KkK6nL54UP7ZMeI/Q3VEW72FA==} 259 | dev: false 260 | 261 | /@firebase/analytics/0.8.4_@firebase+app@0.8.4: 262 | resolution: {integrity: sha512-Bgr2tMexv0YrL6kjrOF1xVRts8PM6WWmROpfRQjh0xFU4QSoofBJhkVn2NXDXkHWrr5slFfqB5yOnmgAIsHiMw==} 263 | peerDependencies: 264 | '@firebase/app': 0.x 265 | dependencies: 266 | '@firebase/app': 0.8.4 267 | '@firebase/component': 0.5.21 268 | '@firebase/installations': 0.5.16_@firebase+app@0.8.4 269 | '@firebase/logger': 0.3.4 270 | '@firebase/util': 1.7.3 271 | tslib: 2.4.1 272 | dev: false 273 | 274 | /@firebase/app-check-compat/0.2.17_dvqpjc4ehcooegrkfkqbfp67kq: 275 | resolution: {integrity: sha512-yhiAy6U4MuhbY+DCgvG5FcrXkAL+7YohRzqywycQKr31k/ftelbR5l9Zmo2WJMxdLxfubnnqeG/BYCRHlSvk7A==} 276 | peerDependencies: 277 | '@firebase/app-compat': 0.x 278 | dependencies: 279 | '@firebase/app-check': 0.5.17_@firebase+app@0.8.4 280 | '@firebase/app-check-types': 0.4.1 281 | '@firebase/app-compat': 0.1.39 282 | '@firebase/component': 0.5.21 283 | '@firebase/logger': 0.3.4 284 | '@firebase/util': 1.7.3 285 | tslib: 2.4.1 286 | transitivePeerDependencies: 287 | - '@firebase/app' 288 | dev: false 289 | 290 | /@firebase/app-check-interop-types/0.1.1: 291 | resolution: {integrity: sha512-QpYh5GmiLA9ob8NWAZpHbNNl9TzxxZI4NLevT6MYPRDXKG9BSmBI7FATRfm5uv2QQUVSQrESKog5CCmU16v+7Q==} 292 | dev: false 293 | 294 | /@firebase/app-check-types/0.4.1: 295 | resolution: {integrity: sha512-4X79w2X0H5i5qvaho3qkjZg5qdERnKR4gCfy/fxDmdMMP4QgNJHJ9IBk1E+c4cm5HlaZVcLq9K6z8xaRqjZhyw==} 296 | dev: false 297 | 298 | /@firebase/app-check/0.5.17_@firebase+app@0.8.4: 299 | resolution: {integrity: sha512-P4bm0lbs+VgS7pns322GC0hyKuTDCqYk2X4FGBf133LZaw1NXJpzOteqPdCT0hBCaR0QSHk49gxx+bdnSdd5Fg==} 300 | peerDependencies: 301 | '@firebase/app': 0.x 302 | dependencies: 303 | '@firebase/app': 0.8.4 304 | '@firebase/component': 0.5.21 305 | '@firebase/logger': 0.3.4 306 | '@firebase/util': 1.7.3 307 | tslib: 2.4.1 308 | dev: false 309 | 310 | /@firebase/app-compat/0.1.39: 311 | resolution: {integrity: sha512-F5O/N38dVGFzpe6zM//MslYT80rpX0V+MQNMvONPUlXhvDqS5T+8NMSCWOcZ++Z4Hkj8EvgTJk59AMnD8SdyFw==} 312 | dependencies: 313 | '@firebase/app': 0.8.4 314 | '@firebase/component': 0.5.21 315 | '@firebase/logger': 0.3.4 316 | '@firebase/util': 1.7.3 317 | tslib: 2.4.1 318 | dev: false 319 | 320 | /@firebase/app-types/0.8.1: 321 | resolution: {integrity: sha512-p75Ow3QhB82kpMzmOntv866wH9eZ3b4+QbUY+8/DA5Zzdf1c8Nsk8B7kbFpzJt4wwHMdy5LTF5YUnoTc1JiWkw==} 322 | dev: false 323 | 324 | /@firebase/app/0.8.4: 325 | resolution: {integrity: sha512-gQntijd+sLaGWjcBQpk33giCEXNzGLB6489NMpypVgEXJwQXYQPSrtb9vUHXot1w1iy/j6xlNl4K8wwwNdRgDg==} 326 | dependencies: 327 | '@firebase/component': 0.5.21 328 | '@firebase/logger': 0.3.4 329 | '@firebase/util': 1.7.3 330 | idb: 7.0.1 331 | tslib: 2.4.1 332 | dev: false 333 | 334 | /@firebase/auth-compat/0.2.24_uougi3e27jpxvoatrekmluf7oy: 335 | resolution: {integrity: sha512-IuZQScjtoOLkUHtmIUJ2F3E2OpDOyap6L/9HL/DX3nzEA1LrX7wlpeU6OF2jS9E0KLueWKIrSkIQOOsKoQj/sA==} 336 | peerDependencies: 337 | '@firebase/app-compat': 0.x 338 | dependencies: 339 | '@firebase/app-compat': 0.1.39 340 | '@firebase/auth': 0.20.11_@firebase+app@0.8.4 341 | '@firebase/auth-types': 0.11.1_ng4u4jtoxpyfdkxsmbmyeoj754 342 | '@firebase/component': 0.5.21 343 | '@firebase/util': 1.7.3 344 | node-fetch: 2.6.7 345 | selenium-webdriver: 4.5.0 346 | tslib: 2.4.1 347 | transitivePeerDependencies: 348 | - '@firebase/app' 349 | - '@firebase/app-types' 350 | - bufferutil 351 | - encoding 352 | - utf-8-validate 353 | dev: false 354 | 355 | /@firebase/auth-interop-types/0.1.7_ng4u4jtoxpyfdkxsmbmyeoj754: 356 | resolution: {integrity: sha512-yA/dTveGGPcc85JP8ZE/KZqfGQyQTBCV10THdI8HTlP1GDvNrhr//J5jAt58MlsCOaO3XmC4DqScPBbtIsR/EA==} 357 | peerDependencies: 358 | '@firebase/app-types': 0.x 359 | '@firebase/util': 1.x 360 | dependencies: 361 | '@firebase/app-types': 0.8.1 362 | '@firebase/util': 1.7.3 363 | dev: false 364 | 365 | /@firebase/auth-types/0.11.1_ng4u4jtoxpyfdkxsmbmyeoj754: 366 | resolution: {integrity: sha512-ud7T39VG9ptTrC2fOy/XlU+ubC+BVuBJPteuzsPZSa9l7gkntvWgVb3Z/3FxqqRPlkVUYiyvmsbRN3DE1He2ow==} 367 | peerDependencies: 368 | '@firebase/app-types': 0.x 369 | '@firebase/util': 1.x 370 | dependencies: 371 | '@firebase/app-types': 0.8.1 372 | '@firebase/util': 1.7.3 373 | dev: false 374 | 375 | /@firebase/auth/0.20.11_@firebase+app@0.8.4: 376 | resolution: {integrity: sha512-cKy91l4URDG3yWfPK7tjUySh2wCLxtTilsR59jiqQJLReBrQsKP79eFDJ6jqWwbEh3+f1lmoH1nKswwbo9XdmA==} 377 | peerDependencies: 378 | '@firebase/app': 0.x 379 | dependencies: 380 | '@firebase/app': 0.8.4 381 | '@firebase/component': 0.5.21 382 | '@firebase/logger': 0.3.4 383 | '@firebase/util': 1.7.3 384 | node-fetch: 2.6.7 385 | selenium-webdriver: 4.5.0 386 | tslib: 2.4.1 387 | transitivePeerDependencies: 388 | - bufferutil 389 | - encoding 390 | - utf-8-validate 391 | dev: false 392 | 393 | /@firebase/component/0.5.21: 394 | resolution: {integrity: sha512-12MMQ/ulfygKpEJpseYMR0HunJdlsLrwx2XcEs40M18jocy2+spyzHHEwegN3x/2/BLFBjR5247Etmz0G97Qpg==} 395 | dependencies: 396 | '@firebase/util': 1.7.3 397 | tslib: 2.4.1 398 | dev: false 399 | 400 | /@firebase/database-compat/0.2.10_@firebase+app-types@0.8.1: 401 | resolution: {integrity: sha512-fK+IgUUqVKcWK/gltzDU+B1xauCOfY6vulO8lxoNTkcCGlSxuTtwsdqjGkFmgFRMYjXFWWJ6iFcJ/vXahzwCtA==} 402 | dependencies: 403 | '@firebase/component': 0.5.21 404 | '@firebase/database': 0.13.10_@firebase+app-types@0.8.1 405 | '@firebase/database-types': 0.9.17 406 | '@firebase/logger': 0.3.4 407 | '@firebase/util': 1.7.3 408 | tslib: 2.4.1 409 | transitivePeerDependencies: 410 | - '@firebase/app-types' 411 | dev: false 412 | 413 | /@firebase/database-types/0.9.17: 414 | resolution: {integrity: sha512-YQm2tCZyxNtEnlS5qo5gd2PAYgKCy69tUKwioGhApCFThW+mIgZs7IeYeJo2M51i4LCixYUl+CvnOyAnb/c3XA==} 415 | dependencies: 416 | '@firebase/app-types': 0.8.1 417 | '@firebase/util': 1.7.3 418 | dev: false 419 | 420 | /@firebase/database/0.13.10_@firebase+app-types@0.8.1: 421 | resolution: {integrity: sha512-KRucuzZ7ZHQsRdGEmhxId5jyM2yKsjsQWF9yv0dIhlxYg0D8rCVDZc/waoPKA5oV3/SEIoptF8F7R1Vfe7BCQA==} 422 | dependencies: 423 | '@firebase/auth-interop-types': 0.1.7_ng4u4jtoxpyfdkxsmbmyeoj754 424 | '@firebase/component': 0.5.21 425 | '@firebase/logger': 0.3.4 426 | '@firebase/util': 1.7.3 427 | faye-websocket: 0.11.4 428 | tslib: 2.4.1 429 | transitivePeerDependencies: 430 | - '@firebase/app-types' 431 | dev: false 432 | 433 | /@firebase/firestore-compat/0.2.3_uougi3e27jpxvoatrekmluf7oy: 434 | resolution: {integrity: sha512-FgJwGCA2K+lsGk6gbJo57qn4iocQSGfOlNi2s4QsEO/WOVIU00yYGm408fN7iAGpr9d5VKyulO4sYcic7cS51g==} 435 | peerDependencies: 436 | '@firebase/app-compat': 0.x 437 | dependencies: 438 | '@firebase/app-compat': 0.1.39 439 | '@firebase/component': 0.5.21 440 | '@firebase/firestore': 3.7.3_@firebase+app@0.8.4 441 | '@firebase/firestore-types': 2.5.1_ng4u4jtoxpyfdkxsmbmyeoj754 442 | '@firebase/util': 1.7.3 443 | tslib: 2.4.1 444 | transitivePeerDependencies: 445 | - '@firebase/app' 446 | - '@firebase/app-types' 447 | - encoding 448 | dev: false 449 | 450 | /@firebase/firestore-types/2.5.1_ng4u4jtoxpyfdkxsmbmyeoj754: 451 | resolution: {integrity: sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw==} 452 | peerDependencies: 453 | '@firebase/app-types': 0.x 454 | '@firebase/util': 1.x 455 | dependencies: 456 | '@firebase/app-types': 0.8.1 457 | '@firebase/util': 1.7.3 458 | dev: false 459 | 460 | /@firebase/firestore/3.7.3_@firebase+app@0.8.4: 461 | resolution: {integrity: sha512-hnA8hljwJBpejv0SPlt0yiej1wz3VRcLzoNAZujTCI1wLoADkRNsqic5uN/Ge0M0vbmHliLXtet/PDqvEbB9Ww==} 462 | engines: {node: '>=10.10.0'} 463 | peerDependencies: 464 | '@firebase/app': 0.x 465 | dependencies: 466 | '@firebase/app': 0.8.4 467 | '@firebase/component': 0.5.21 468 | '@firebase/logger': 0.3.4 469 | '@firebase/util': 1.7.3 470 | '@firebase/webchannel-wrapper': 0.8.1 471 | '@grpc/grpc-js': 1.8.0 472 | '@grpc/proto-loader': 0.6.13 473 | node-fetch: 2.6.7 474 | tslib: 2.4.1 475 | transitivePeerDependencies: 476 | - encoding 477 | dev: false 478 | 479 | /@firebase/functions-compat/0.2.8_uougi3e27jpxvoatrekmluf7oy: 480 | resolution: {integrity: sha512-5w668whT+bm6oVcFqIxfFbn9N77WycpNCfZNg1l0iC+5RLSt53RTVu43pqi43vh23Vp4ad+SRBgZiQGAMen5wA==} 481 | peerDependencies: 482 | '@firebase/app-compat': 0.x 483 | dependencies: 484 | '@firebase/app-compat': 0.1.39 485 | '@firebase/component': 0.5.21 486 | '@firebase/functions': 0.8.8_kuqwk5rcidsndwsionzwdbqiqi 487 | '@firebase/functions-types': 0.5.1 488 | '@firebase/util': 1.7.3 489 | tslib: 2.4.1 490 | transitivePeerDependencies: 491 | - '@firebase/app' 492 | - '@firebase/app-types' 493 | - encoding 494 | dev: false 495 | 496 | /@firebase/functions-types/0.5.1: 497 | resolution: {integrity: sha512-olEJnTuULM/ws0pwhHA0Ze5oIdpFbZsdBGCaBhyL4pm1NUR4Moh0cyAsqr+VtqHCNMGquHU1GJ77qITkoonp0w==} 498 | dev: false 499 | 500 | /@firebase/functions/0.8.8_kuqwk5rcidsndwsionzwdbqiqi: 501 | resolution: {integrity: sha512-weNcDQJcH3/2YFaXd5dF5pUk3IQdZY60QNuWpq7yS+uaPlCRHjT0K989Q3ZcmYwXz7mHTfhlQamXdA4Yobgt+Q==} 502 | peerDependencies: 503 | '@firebase/app': 0.x 504 | dependencies: 505 | '@firebase/app': 0.8.4 506 | '@firebase/app-check-interop-types': 0.1.1 507 | '@firebase/auth-interop-types': 0.1.7_ng4u4jtoxpyfdkxsmbmyeoj754 508 | '@firebase/component': 0.5.21 509 | '@firebase/messaging-interop-types': 0.1.1 510 | '@firebase/util': 1.7.3 511 | node-fetch: 2.6.7 512 | tslib: 2.4.1 513 | transitivePeerDependencies: 514 | - '@firebase/app-types' 515 | - encoding 516 | dev: false 517 | 518 | /@firebase/installations-compat/0.1.16_uougi3e27jpxvoatrekmluf7oy: 519 | resolution: {integrity: sha512-Xp7s3iUMZ6/TN0a+g1kpHNEn7h59kSxi44/2I7bd3X6xwHnxMu0TqYB7U9WfqEhqiI9iKulL3g06wIZqaklElw==} 520 | peerDependencies: 521 | '@firebase/app-compat': 0.x 522 | dependencies: 523 | '@firebase/app-compat': 0.1.39 524 | '@firebase/component': 0.5.21 525 | '@firebase/installations': 0.5.16_@firebase+app@0.8.4 526 | '@firebase/installations-types': 0.4.1_@firebase+app-types@0.8.1 527 | '@firebase/util': 1.7.3 528 | tslib: 2.4.1 529 | transitivePeerDependencies: 530 | - '@firebase/app' 531 | - '@firebase/app-types' 532 | dev: false 533 | 534 | /@firebase/installations-types/0.4.1_@firebase+app-types@0.8.1: 535 | resolution: {integrity: sha512-ac906QcmipomZjSasGDYNS1LDy4JNGzQ4VXHpFtoOrI6U2QGFkRezZpI+5bzfU062JOD+doO6irYC6Uwnv/GnA==} 536 | peerDependencies: 537 | '@firebase/app-types': 0.x 538 | dependencies: 539 | '@firebase/app-types': 0.8.1 540 | dev: false 541 | 542 | /@firebase/installations/0.5.16_@firebase+app@0.8.4: 543 | resolution: {integrity: sha512-k3iyjr+yZnDOcJbP+CCZW3/zQJf9gYL2CNBJs9QbmFJoLz7cgIcnAT/XNDMudxcggF1goLfq4+MygpzHD0NzLA==} 544 | peerDependencies: 545 | '@firebase/app': 0.x 546 | dependencies: 547 | '@firebase/app': 0.8.4 548 | '@firebase/component': 0.5.21 549 | '@firebase/util': 1.7.3 550 | idb: 7.0.1 551 | tslib: 2.4.1 552 | dev: false 553 | 554 | /@firebase/logger/0.3.4: 555 | resolution: {integrity: sha512-hlFglGRgZEwoyClZcGLx/Wd+zoLfGmbDkFx56mQt/jJ0XMbfPqwId1kiPl0zgdWZX+D8iH+gT6GuLPFsJWgiGw==} 556 | dependencies: 557 | tslib: 2.4.1 558 | dev: false 559 | 560 | /@firebase/messaging-compat/0.1.21_dvqpjc4ehcooegrkfkqbfp67kq: 561 | resolution: {integrity: sha512-oxQCQ8EXqpSaTybryokbEM/LAqkG0L7OJuucllCg5roqRGIHE437Abus0Bn67P8TKJaYjyKxomg8wCvfmInjlg==} 562 | peerDependencies: 563 | '@firebase/app-compat': 0.x 564 | dependencies: 565 | '@firebase/app-compat': 0.1.39 566 | '@firebase/component': 0.5.21 567 | '@firebase/messaging': 0.11.0_@firebase+app@0.8.4 568 | '@firebase/util': 1.7.3 569 | tslib: 2.4.1 570 | transitivePeerDependencies: 571 | - '@firebase/app' 572 | dev: false 573 | 574 | /@firebase/messaging-interop-types/0.1.1: 575 | resolution: {integrity: sha512-7XuY87zPh01EBaeS3s6co31Il5oGbPl5MxAg6Uj3fPv7PqJQlbwQ+B5k7CKSF/Y26tRxp+u+usxIvIWCSEA8CQ==} 576 | dev: false 577 | 578 | /@firebase/messaging/0.11.0_@firebase+app@0.8.4: 579 | resolution: {integrity: sha512-V7+Xw4QlB8PgINY7Wml+Uj8A3S2nR0ooVoaqfRJ8ZN3W7A4aO/DCkjPsf6DXehwfqRLA7PGB9Boe8l9Idy7icA==} 580 | peerDependencies: 581 | '@firebase/app': 0.x 582 | dependencies: 583 | '@firebase/app': 0.8.4 584 | '@firebase/component': 0.5.21 585 | '@firebase/installations': 0.5.16_@firebase+app@0.8.4 586 | '@firebase/messaging-interop-types': 0.1.1 587 | '@firebase/util': 1.7.3 588 | idb: 7.0.1 589 | tslib: 2.4.1 590 | dev: false 591 | 592 | /@firebase/performance-compat/0.1.17_dvqpjc4ehcooegrkfkqbfp67kq: 593 | resolution: {integrity: sha512-Hci5MrDlRuqwVozq7LaSAufXXElz+AtmEQArix64kLRJqHhOu5K/8TpuZXM/klR6gnLyIrk+01CrAemH3zHpDw==} 594 | peerDependencies: 595 | '@firebase/app-compat': 0.x 596 | dependencies: 597 | '@firebase/app-compat': 0.1.39 598 | '@firebase/component': 0.5.21 599 | '@firebase/logger': 0.3.4 600 | '@firebase/performance': 0.5.17_@firebase+app@0.8.4 601 | '@firebase/performance-types': 0.1.1 602 | '@firebase/util': 1.7.3 603 | tslib: 2.4.1 604 | transitivePeerDependencies: 605 | - '@firebase/app' 606 | dev: false 607 | 608 | /@firebase/performance-types/0.1.1: 609 | resolution: {integrity: sha512-wiJRLBg8EPaYSGJqx7aqkZ3L5fULfZa9zOTs4C06K020g0zzJh9kUUO/0U3wvHz7zRQjJxTO8Jw4SDjxs3EZrA==} 610 | dev: false 611 | 612 | /@firebase/performance/0.5.17_@firebase+app@0.8.4: 613 | resolution: {integrity: sha512-NDgzI5JYo6Itnj1FWhMkK3LtwKhtOnhC+WBkxezjzFVuCOornQjvu7ucAU1o2dHXh7MFruhHGFPsHyfkkMCljA==} 614 | peerDependencies: 615 | '@firebase/app': 0.x 616 | dependencies: 617 | '@firebase/app': 0.8.4 618 | '@firebase/component': 0.5.21 619 | '@firebase/installations': 0.5.16_@firebase+app@0.8.4 620 | '@firebase/logger': 0.3.4 621 | '@firebase/util': 1.7.3 622 | tslib: 2.4.1 623 | dev: false 624 | 625 | /@firebase/remote-config-compat/0.1.16_dvqpjc4ehcooegrkfkqbfp67kq: 626 | resolution: {integrity: sha512-BWonzeqODnGki/fZ17zOnjJFR5CWbIOU0PmYGjWBnbkWxpFDdE3zNsz8JTVd/Mkt7y2PHFMYpLsyZ473E/62FQ==} 627 | peerDependencies: 628 | '@firebase/app-compat': 0.x 629 | dependencies: 630 | '@firebase/app-compat': 0.1.39 631 | '@firebase/component': 0.5.21 632 | '@firebase/logger': 0.3.4 633 | '@firebase/remote-config': 0.3.15_@firebase+app@0.8.4 634 | '@firebase/remote-config-types': 0.2.1 635 | '@firebase/util': 1.7.3 636 | tslib: 2.4.1 637 | transitivePeerDependencies: 638 | - '@firebase/app' 639 | dev: false 640 | 641 | /@firebase/remote-config-types/0.2.1: 642 | resolution: {integrity: sha512-1PGx4vKtMMd5uB6G1Nj2b8fOnJx7mIJGzkdyfhIM1oQx9k3dJ+pVu4StrNm46vHaD8ZlOQLr91YfUE43xSXwSg==} 643 | dev: false 644 | 645 | /@firebase/remote-config/0.3.15_@firebase+app@0.8.4: 646 | resolution: {integrity: sha512-ZCyqoCaftoNvc2r4zPaqNV4OgC4sRHjcQI+agzXESnhDLnTY8DpCaQ0m9j6deHuxxDOgu8QPDb8psLbjR+9CgQ==} 647 | peerDependencies: 648 | '@firebase/app': 0.x 649 | dependencies: 650 | '@firebase/app': 0.8.4 651 | '@firebase/component': 0.5.21 652 | '@firebase/installations': 0.5.16_@firebase+app@0.8.4 653 | '@firebase/logger': 0.3.4 654 | '@firebase/util': 1.7.3 655 | tslib: 2.4.1 656 | dev: false 657 | 658 | /@firebase/storage-compat/0.1.22_uougi3e27jpxvoatrekmluf7oy: 659 | resolution: {integrity: sha512-uv33WnAEcxf2983Z03uhJmKc91LKSsRijFwut8xeoJamJoGAVj1Tc9Mio491aI1KZ+RMkNFghHL2FpxjuvxpPg==} 660 | peerDependencies: 661 | '@firebase/app-compat': 0.x 662 | dependencies: 663 | '@firebase/app-compat': 0.1.39 664 | '@firebase/component': 0.5.21 665 | '@firebase/storage': 0.9.14_@firebase+app@0.8.4 666 | '@firebase/storage-types': 0.6.1_ng4u4jtoxpyfdkxsmbmyeoj754 667 | '@firebase/util': 1.7.3 668 | tslib: 2.4.1 669 | transitivePeerDependencies: 670 | - '@firebase/app' 671 | - '@firebase/app-types' 672 | - encoding 673 | dev: false 674 | 675 | /@firebase/storage-types/0.6.1_ng4u4jtoxpyfdkxsmbmyeoj754: 676 | resolution: {integrity: sha512-/pkNzKiGCSjdBBZHPvWL1kkPZfM3pFJ38HPJE1xTHwLBwdrFb4JrmY+5/E4ma5ePsbejecIOD1SZhEKDB/JwUQ==} 677 | peerDependencies: 678 | '@firebase/app-types': 0.x 679 | '@firebase/util': 1.x 680 | dependencies: 681 | '@firebase/app-types': 0.8.1 682 | '@firebase/util': 1.7.3 683 | dev: false 684 | 685 | /@firebase/storage/0.9.14_@firebase+app@0.8.4: 686 | resolution: {integrity: sha512-he8VAJ4BLkQdebnna15TI1/ymkwQTeKnjA/psKMAJ2+/UswD/68bCMKOlTrMvw6Flv3zc5YZk1xdL9DHR0i6wg==} 687 | peerDependencies: 688 | '@firebase/app': 0.x 689 | dependencies: 690 | '@firebase/app': 0.8.4 691 | '@firebase/component': 0.5.21 692 | '@firebase/util': 1.7.3 693 | node-fetch: 2.6.7 694 | tslib: 2.4.1 695 | transitivePeerDependencies: 696 | - encoding 697 | dev: false 698 | 699 | /@firebase/util/1.7.3: 700 | resolution: {integrity: sha512-wxNqWbqokF551WrJ9BIFouU/V5SL1oYCGx1oudcirdhadnQRFH5v1sjgGL7cUV/UsekSycygphdrF2lxBxOYKg==} 701 | dependencies: 702 | tslib: 2.4.1 703 | dev: false 704 | 705 | /@firebase/webchannel-wrapper/0.8.1: 706 | resolution: {integrity: sha512-CJW8vxt6bJaBeco2VnlJjmCmAkrrtIdf0GGKvpAB4J5gw8Gi0rHb+qsgKp6LsyS5W6ALPLawLs7phZmw02dvLw==} 707 | dev: false 708 | 709 | /@grpc/grpc-js/1.8.0: 710 | resolution: {integrity: sha512-ySMTXQuMvvswoobvN+0LsaPf7ITO2JVfJmHxQKI4cGehNrrUms+n81BlHEX7Hl/LExji6XE3fnI9U04GSkRruA==} 711 | engines: {node: ^8.13.0 || >=10.10.0} 712 | dependencies: 713 | '@grpc/proto-loader': 0.7.4 714 | '@types/node': 18.11.11 715 | dev: false 716 | 717 | /@grpc/proto-loader/0.6.13: 718 | resolution: {integrity: sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==} 719 | engines: {node: '>=6'} 720 | hasBin: true 721 | dependencies: 722 | '@types/long': 4.0.2 723 | lodash.camelcase: 4.3.0 724 | long: 4.0.0 725 | protobufjs: 6.11.3 726 | yargs: 16.2.0 727 | dev: false 728 | 729 | /@grpc/proto-loader/0.7.4: 730 | resolution: {integrity: sha512-MnWjkGwqQ3W8fx94/c1CwqLsNmHHv2t0CFn+9++6+cDphC1lolpg9M2OU0iebIjK//pBNX9e94ho+gjx6vz39w==} 731 | engines: {node: '>=6'} 732 | hasBin: true 733 | dependencies: 734 | '@types/long': 4.0.2 735 | lodash.camelcase: 4.3.0 736 | long: 4.0.0 737 | protobufjs: 7.1.2 738 | yargs: 16.2.0 739 | dev: false 740 | 741 | /@protobufjs/aspromise/1.1.2: 742 | resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} 743 | dev: false 744 | 745 | /@protobufjs/base64/1.1.2: 746 | resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} 747 | dev: false 748 | 749 | /@protobufjs/codegen/2.0.4: 750 | resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} 751 | dev: false 752 | 753 | /@protobufjs/eventemitter/1.1.0: 754 | resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} 755 | dev: false 756 | 757 | /@protobufjs/fetch/1.1.0: 758 | resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} 759 | dependencies: 760 | '@protobufjs/aspromise': 1.1.2 761 | '@protobufjs/inquire': 1.1.0 762 | dev: false 763 | 764 | /@protobufjs/float/1.0.2: 765 | resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} 766 | dev: false 767 | 768 | /@protobufjs/inquire/1.1.0: 769 | resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} 770 | dev: false 771 | 772 | /@protobufjs/path/1.1.2: 773 | resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} 774 | dev: false 775 | 776 | /@protobufjs/pool/1.1.0: 777 | resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} 778 | dev: false 779 | 780 | /@protobufjs/utf8/1.1.0: 781 | resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} 782 | dev: false 783 | 784 | /@types/long/4.0.2: 785 | resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} 786 | dev: false 787 | 788 | /@types/node/18.11.11: 789 | resolution: {integrity: sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==} 790 | dev: false 791 | 792 | /@vitejs/plugin-vue/4.0.0-beta.0_52n6m3tculxsdye4oufjkspuma: 793 | resolution: {integrity: sha512-ip9aE0C3lyjwVCdM8Wa2oVhXOCRJPauNUrfftkipeud3xVHXUYI4akCIamMIMgXorqpd16ms7zLckfO1rU9i6g==} 794 | engines: {node: ^14.18.0 || >=16.0.0} 795 | peerDependencies: 796 | vite: ^4.0.0-alpha.0 797 | vue: ^3.2.25 798 | dependencies: 799 | vite: 4.0.0-beta.5 800 | vue: 3.2.45 801 | dev: true 802 | 803 | /@vue/compiler-core/3.2.45: 804 | resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} 805 | dependencies: 806 | '@babel/parser': 7.20.5 807 | '@vue/shared': 3.2.45 808 | estree-walker: 2.0.2 809 | source-map: 0.6.1 810 | 811 | /@vue/compiler-dom/3.2.45: 812 | resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==} 813 | dependencies: 814 | '@vue/compiler-core': 3.2.45 815 | '@vue/shared': 3.2.45 816 | 817 | /@vue/compiler-sfc/3.2.45: 818 | resolution: {integrity: sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==} 819 | dependencies: 820 | '@babel/parser': 7.20.5 821 | '@vue/compiler-core': 3.2.45 822 | '@vue/compiler-dom': 3.2.45 823 | '@vue/compiler-ssr': 3.2.45 824 | '@vue/reactivity-transform': 3.2.45 825 | '@vue/shared': 3.2.45 826 | estree-walker: 2.0.2 827 | magic-string: 0.25.9 828 | postcss: 8.4.19 829 | source-map: 0.6.1 830 | 831 | /@vue/compiler-ssr/3.2.45: 832 | resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==} 833 | dependencies: 834 | '@vue/compiler-dom': 3.2.45 835 | '@vue/shared': 3.2.45 836 | 837 | /@vue/devtools-api/6.4.5: 838 | resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==} 839 | dev: false 840 | 841 | /@vue/reactivity-transform/3.2.45: 842 | resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==} 843 | dependencies: 844 | '@babel/parser': 7.20.5 845 | '@vue/compiler-core': 3.2.45 846 | '@vue/shared': 3.2.45 847 | estree-walker: 2.0.2 848 | magic-string: 0.25.9 849 | 850 | /@vue/reactivity/3.2.45: 851 | resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==} 852 | dependencies: 853 | '@vue/shared': 3.2.45 854 | 855 | /@vue/runtime-core/3.2.45: 856 | resolution: {integrity: sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==} 857 | dependencies: 858 | '@vue/reactivity': 3.2.45 859 | '@vue/shared': 3.2.45 860 | 861 | /@vue/runtime-dom/3.2.45: 862 | resolution: {integrity: sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==} 863 | dependencies: 864 | '@vue/runtime-core': 3.2.45 865 | '@vue/shared': 3.2.45 866 | csstype: 2.6.21 867 | 868 | /@vue/server-renderer/3.2.45_vue@3.2.45: 869 | resolution: {integrity: sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==} 870 | peerDependencies: 871 | vue: 3.2.45 872 | dependencies: 873 | '@vue/compiler-ssr': 3.2.45 874 | '@vue/shared': 3.2.45 875 | vue: 3.2.45 876 | 877 | /@vue/shared/3.2.45: 878 | resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} 879 | 880 | /ansi-regex/5.0.1: 881 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 882 | engines: {node: '>=8'} 883 | dev: false 884 | 885 | /ansi-styles/4.3.0: 886 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 887 | engines: {node: '>=8'} 888 | dependencies: 889 | color-convert: 2.0.1 890 | dev: false 891 | 892 | /balanced-match/1.0.2: 893 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 894 | dev: false 895 | 896 | /brace-expansion/1.1.11: 897 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 898 | dependencies: 899 | balanced-match: 1.0.2 900 | concat-map: 0.0.1 901 | dev: false 902 | 903 | /cliui/7.0.4: 904 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 905 | dependencies: 906 | string-width: 4.2.3 907 | strip-ansi: 6.0.1 908 | wrap-ansi: 7.0.0 909 | dev: false 910 | 911 | /color-convert/2.0.1: 912 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 913 | engines: {node: '>=7.0.0'} 914 | dependencies: 915 | color-name: 1.1.4 916 | dev: false 917 | 918 | /color-name/1.1.4: 919 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 920 | dev: false 921 | 922 | /concat-map/0.0.1: 923 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 924 | dev: false 925 | 926 | /core-util-is/1.0.3: 927 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 928 | dev: false 929 | 930 | /csstype/2.6.21: 931 | resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} 932 | 933 | /emoji-regex/8.0.0: 934 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 935 | dev: false 936 | 937 | /esbuild/0.16.1: 938 | resolution: {integrity: sha512-XbnT9SXFcijZ9GYsay7z69rzSWKlW+Ze7+ULEecEkVAkDyzfA6DLbqGp//6F4hUh3FOydco8xQEejE6LxI1kyQ==} 939 | engines: {node: '>=12'} 940 | hasBin: true 941 | requiresBuild: true 942 | optionalDependencies: 943 | '@esbuild/android-arm': 0.16.1 944 | '@esbuild/android-arm64': 0.16.1 945 | '@esbuild/android-x64': 0.16.1 946 | '@esbuild/darwin-arm64': 0.16.1 947 | '@esbuild/darwin-x64': 0.16.1 948 | '@esbuild/freebsd-arm64': 0.16.1 949 | '@esbuild/freebsd-x64': 0.16.1 950 | '@esbuild/linux-arm': 0.16.1 951 | '@esbuild/linux-arm64': 0.16.1 952 | '@esbuild/linux-ia32': 0.16.1 953 | '@esbuild/linux-loong64': 0.16.1 954 | '@esbuild/linux-mips64el': 0.16.1 955 | '@esbuild/linux-ppc64': 0.16.1 956 | '@esbuild/linux-riscv64': 0.16.1 957 | '@esbuild/linux-s390x': 0.16.1 958 | '@esbuild/linux-x64': 0.16.1 959 | '@esbuild/netbsd-x64': 0.16.1 960 | '@esbuild/openbsd-x64': 0.16.1 961 | '@esbuild/sunos-x64': 0.16.1 962 | '@esbuild/win32-arm64': 0.16.1 963 | '@esbuild/win32-ia32': 0.16.1 964 | '@esbuild/win32-x64': 0.16.1 965 | dev: true 966 | 967 | /escalade/3.1.1: 968 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 969 | engines: {node: '>=6'} 970 | dev: false 971 | 972 | /estree-walker/2.0.2: 973 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 974 | 975 | /faye-websocket/0.11.4: 976 | resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} 977 | engines: {node: '>=0.8.0'} 978 | dependencies: 979 | websocket-driver: 0.7.4 980 | dev: false 981 | 982 | /firebase/9.14.0: 983 | resolution: {integrity: sha512-wePrsf7W33mhT7RVXQavragoAgXb/NDm22vuhwJXkprrQ2Y9alrEKC5LTAtLJL3P2dHdDmeylS6PLZwWPEE79A==} 984 | dependencies: 985 | '@firebase/analytics': 0.8.4_@firebase+app@0.8.4 986 | '@firebase/analytics-compat': 0.1.17_dvqpjc4ehcooegrkfkqbfp67kq 987 | '@firebase/app': 0.8.4 988 | '@firebase/app-check': 0.5.17_@firebase+app@0.8.4 989 | '@firebase/app-check-compat': 0.2.17_dvqpjc4ehcooegrkfkqbfp67kq 990 | '@firebase/app-compat': 0.1.39 991 | '@firebase/app-types': 0.8.1 992 | '@firebase/auth': 0.20.11_@firebase+app@0.8.4 993 | '@firebase/auth-compat': 0.2.24_uougi3e27jpxvoatrekmluf7oy 994 | '@firebase/database': 0.13.10_@firebase+app-types@0.8.1 995 | '@firebase/database-compat': 0.2.10_@firebase+app-types@0.8.1 996 | '@firebase/firestore': 3.7.3_@firebase+app@0.8.4 997 | '@firebase/firestore-compat': 0.2.3_uougi3e27jpxvoatrekmluf7oy 998 | '@firebase/functions': 0.8.8_kuqwk5rcidsndwsionzwdbqiqi 999 | '@firebase/functions-compat': 0.2.8_uougi3e27jpxvoatrekmluf7oy 1000 | '@firebase/installations': 0.5.16_@firebase+app@0.8.4 1001 | '@firebase/installations-compat': 0.1.16_uougi3e27jpxvoatrekmluf7oy 1002 | '@firebase/messaging': 0.11.0_@firebase+app@0.8.4 1003 | '@firebase/messaging-compat': 0.1.21_dvqpjc4ehcooegrkfkqbfp67kq 1004 | '@firebase/performance': 0.5.17_@firebase+app@0.8.4 1005 | '@firebase/performance-compat': 0.1.17_dvqpjc4ehcooegrkfkqbfp67kq 1006 | '@firebase/remote-config': 0.3.15_@firebase+app@0.8.4 1007 | '@firebase/remote-config-compat': 0.1.16_dvqpjc4ehcooegrkfkqbfp67kq 1008 | '@firebase/storage': 0.9.14_@firebase+app@0.8.4 1009 | '@firebase/storage-compat': 0.1.22_uougi3e27jpxvoatrekmluf7oy 1010 | '@firebase/util': 1.7.3 1011 | transitivePeerDependencies: 1012 | - bufferutil 1013 | - encoding 1014 | - utf-8-validate 1015 | dev: false 1016 | 1017 | /fs.realpath/1.0.0: 1018 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1019 | dev: false 1020 | 1021 | /fsevents/2.3.2: 1022 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1023 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1024 | os: [darwin] 1025 | requiresBuild: true 1026 | dev: true 1027 | optional: true 1028 | 1029 | /function-bind/1.1.1: 1030 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1031 | dev: true 1032 | 1033 | /get-caller-file/2.0.5: 1034 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1035 | engines: {node: 6.* || 8.* || >= 10.*} 1036 | dev: false 1037 | 1038 | /glob/7.2.3: 1039 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1040 | dependencies: 1041 | fs.realpath: 1.0.0 1042 | inflight: 1.0.6 1043 | inherits: 2.0.4 1044 | minimatch: 3.1.2 1045 | once: 1.4.0 1046 | path-is-absolute: 1.0.1 1047 | dev: false 1048 | 1049 | /has/1.0.3: 1050 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1051 | engines: {node: '>= 0.4.0'} 1052 | dependencies: 1053 | function-bind: 1.1.1 1054 | dev: true 1055 | 1056 | /http-parser-js/0.5.8: 1057 | resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} 1058 | dev: false 1059 | 1060 | /idb/7.0.1: 1061 | resolution: {integrity: sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==} 1062 | dev: false 1063 | 1064 | /immediate/3.0.6: 1065 | resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} 1066 | dev: false 1067 | 1068 | /inflight/1.0.6: 1069 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1070 | dependencies: 1071 | once: 1.4.0 1072 | wrappy: 1.0.2 1073 | dev: false 1074 | 1075 | /inherits/2.0.4: 1076 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1077 | dev: false 1078 | 1079 | /is-core-module/2.11.0: 1080 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 1081 | dependencies: 1082 | has: 1.0.3 1083 | dev: true 1084 | 1085 | /is-fullwidth-code-point/3.0.0: 1086 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1087 | engines: {node: '>=8'} 1088 | dev: false 1089 | 1090 | /isarray/1.0.0: 1091 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 1092 | dev: false 1093 | 1094 | /jszip/3.10.1: 1095 | resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} 1096 | dependencies: 1097 | lie: 3.3.0 1098 | pako: 1.0.11 1099 | readable-stream: 2.3.7 1100 | setimmediate: 1.0.5 1101 | dev: false 1102 | 1103 | /lie/3.3.0: 1104 | resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} 1105 | dependencies: 1106 | immediate: 3.0.6 1107 | dev: false 1108 | 1109 | /lodash.camelcase/4.3.0: 1110 | resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} 1111 | dev: false 1112 | 1113 | /long/4.0.0: 1114 | resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} 1115 | dev: false 1116 | 1117 | /long/5.2.1: 1118 | resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} 1119 | dev: false 1120 | 1121 | /magic-string/0.25.9: 1122 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 1123 | dependencies: 1124 | sourcemap-codec: 1.4.8 1125 | 1126 | /minimatch/3.1.2: 1127 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1128 | dependencies: 1129 | brace-expansion: 1.1.11 1130 | dev: false 1131 | 1132 | /nanoid/3.3.4: 1133 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 1134 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1135 | hasBin: true 1136 | 1137 | /node-fetch/2.6.7: 1138 | resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} 1139 | engines: {node: 4.x || >=6.0.0} 1140 | peerDependencies: 1141 | encoding: ^0.1.0 1142 | peerDependenciesMeta: 1143 | encoding: 1144 | optional: true 1145 | dependencies: 1146 | whatwg-url: 5.0.0 1147 | dev: false 1148 | 1149 | /once/1.4.0: 1150 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1151 | dependencies: 1152 | wrappy: 1.0.2 1153 | dev: false 1154 | 1155 | /pako/1.0.11: 1156 | resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} 1157 | dev: false 1158 | 1159 | /path-is-absolute/1.0.1: 1160 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1161 | engines: {node: '>=0.10.0'} 1162 | dev: false 1163 | 1164 | /path-parse/1.0.7: 1165 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1166 | dev: true 1167 | 1168 | /picocolors/1.0.0: 1169 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1170 | 1171 | /postcss/8.4.19: 1172 | resolution: {integrity: sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==} 1173 | engines: {node: ^10 || ^12 || >=14} 1174 | dependencies: 1175 | nanoid: 3.3.4 1176 | picocolors: 1.0.0 1177 | source-map-js: 1.0.2 1178 | 1179 | /process-nextick-args/2.0.1: 1180 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1181 | dev: false 1182 | 1183 | /protobufjs/6.11.3: 1184 | resolution: {integrity: sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==} 1185 | hasBin: true 1186 | requiresBuild: true 1187 | dependencies: 1188 | '@protobufjs/aspromise': 1.1.2 1189 | '@protobufjs/base64': 1.1.2 1190 | '@protobufjs/codegen': 2.0.4 1191 | '@protobufjs/eventemitter': 1.1.0 1192 | '@protobufjs/fetch': 1.1.0 1193 | '@protobufjs/float': 1.0.2 1194 | '@protobufjs/inquire': 1.1.0 1195 | '@protobufjs/path': 1.1.2 1196 | '@protobufjs/pool': 1.1.0 1197 | '@protobufjs/utf8': 1.1.0 1198 | '@types/long': 4.0.2 1199 | '@types/node': 18.11.11 1200 | long: 4.0.0 1201 | dev: false 1202 | 1203 | /protobufjs/7.1.2: 1204 | resolution: {integrity: sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ==} 1205 | engines: {node: '>=12.0.0'} 1206 | requiresBuild: true 1207 | dependencies: 1208 | '@protobufjs/aspromise': 1.1.2 1209 | '@protobufjs/base64': 1.1.2 1210 | '@protobufjs/codegen': 2.0.4 1211 | '@protobufjs/eventemitter': 1.1.0 1212 | '@protobufjs/fetch': 1.1.0 1213 | '@protobufjs/float': 1.0.2 1214 | '@protobufjs/inquire': 1.1.0 1215 | '@protobufjs/path': 1.1.2 1216 | '@protobufjs/pool': 1.1.0 1217 | '@protobufjs/utf8': 1.1.0 1218 | '@types/node': 18.11.11 1219 | long: 5.2.1 1220 | dev: false 1221 | 1222 | /readable-stream/2.3.7: 1223 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 1224 | dependencies: 1225 | core-util-is: 1.0.3 1226 | inherits: 2.0.4 1227 | isarray: 1.0.0 1228 | process-nextick-args: 2.0.1 1229 | safe-buffer: 5.1.2 1230 | string_decoder: 1.1.1 1231 | util-deprecate: 1.0.2 1232 | dev: false 1233 | 1234 | /require-directory/2.1.1: 1235 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1236 | engines: {node: '>=0.10.0'} 1237 | dev: false 1238 | 1239 | /resolve/1.22.1: 1240 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 1241 | hasBin: true 1242 | dependencies: 1243 | is-core-module: 2.11.0 1244 | path-parse: 1.0.7 1245 | supports-preserve-symlinks-flag: 1.0.0 1246 | dev: true 1247 | 1248 | /rimraf/3.0.2: 1249 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1250 | hasBin: true 1251 | dependencies: 1252 | glob: 7.2.3 1253 | dev: false 1254 | 1255 | /rollup/3.6.0: 1256 | resolution: {integrity: sha512-qCgiBeSu2/AIOKWGFMiRkjPlGlcVwxAjwpGKQZOQYng+83Hip4PjrWHm7EQX1wnrvRqfTytEihRRfLHdX+hR4g==} 1257 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1258 | hasBin: true 1259 | optionalDependencies: 1260 | fsevents: 2.3.2 1261 | dev: true 1262 | 1263 | /safe-buffer/5.1.2: 1264 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1265 | dev: false 1266 | 1267 | /safe-buffer/5.2.1: 1268 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1269 | dev: false 1270 | 1271 | /selenium-webdriver/4.5.0: 1272 | resolution: {integrity: sha512-9mSFii+lRwcnT2KUAB1kqvx6+mMiiQHH60Y0VUtr3kxxi3oZ3CV3B8e2nuJ7T4SPb+Q6VA0swswe7rYpez07Bg==} 1273 | engines: {node: '>= 14.20.0'} 1274 | dependencies: 1275 | jszip: 3.10.1 1276 | tmp: 0.2.1 1277 | ws: 8.11.0 1278 | transitivePeerDependencies: 1279 | - bufferutil 1280 | - utf-8-validate 1281 | dev: false 1282 | 1283 | /setimmediate/1.0.5: 1284 | resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} 1285 | dev: false 1286 | 1287 | /source-map-js/1.0.2: 1288 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1289 | engines: {node: '>=0.10.0'} 1290 | 1291 | /source-map/0.6.1: 1292 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1293 | engines: {node: '>=0.10.0'} 1294 | 1295 | /sourcemap-codec/1.4.8: 1296 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1297 | deprecated: Please use @jridgewell/sourcemap-codec instead 1298 | 1299 | /string-width/4.2.3: 1300 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1301 | engines: {node: '>=8'} 1302 | dependencies: 1303 | emoji-regex: 8.0.0 1304 | is-fullwidth-code-point: 3.0.0 1305 | strip-ansi: 6.0.1 1306 | dev: false 1307 | 1308 | /string_decoder/1.1.1: 1309 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1310 | dependencies: 1311 | safe-buffer: 5.1.2 1312 | dev: false 1313 | 1314 | /strip-ansi/6.0.1: 1315 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1316 | engines: {node: '>=8'} 1317 | dependencies: 1318 | ansi-regex: 5.0.1 1319 | dev: false 1320 | 1321 | /supports-preserve-symlinks-flag/1.0.0: 1322 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1323 | engines: {node: '>= 0.4'} 1324 | dev: true 1325 | 1326 | /tmp/0.2.1: 1327 | resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} 1328 | engines: {node: '>=8.17.0'} 1329 | dependencies: 1330 | rimraf: 3.0.2 1331 | dev: false 1332 | 1333 | /to-fast-properties/2.0.0: 1334 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1335 | engines: {node: '>=4'} 1336 | 1337 | /tr46/0.0.3: 1338 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 1339 | dev: false 1340 | 1341 | /tslib/2.4.1: 1342 | resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} 1343 | dev: false 1344 | 1345 | /util-deprecate/1.0.2: 1346 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1347 | dev: false 1348 | 1349 | /vite/4.0.0-beta.5: 1350 | resolution: {integrity: sha512-NNzcqXIFHFYVoP6bDcUitcIvSVHdrUBNr4wztCUbbi2Xmya2cc/tglCh73ncfsyzAT/WDLRoIeKG7Dp1r7LRVA==} 1351 | engines: {node: ^14.18.0 || >=16.0.0} 1352 | hasBin: true 1353 | peerDependencies: 1354 | '@types/node': '>= 14' 1355 | less: '*' 1356 | sass: '*' 1357 | stylus: '*' 1358 | sugarss: '*' 1359 | terser: ^5.4.0 1360 | peerDependenciesMeta: 1361 | '@types/node': 1362 | optional: true 1363 | less: 1364 | optional: true 1365 | sass: 1366 | optional: true 1367 | stylus: 1368 | optional: true 1369 | sugarss: 1370 | optional: true 1371 | terser: 1372 | optional: true 1373 | dependencies: 1374 | esbuild: 0.16.1 1375 | postcss: 8.4.19 1376 | resolve: 1.22.1 1377 | rollup: 3.6.0 1378 | optionalDependencies: 1379 | fsevents: 2.3.2 1380 | dev: true 1381 | 1382 | /vue-router/4.1.6_vue@3.2.45: 1383 | resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==} 1384 | peerDependencies: 1385 | vue: ^3.2.0 1386 | dependencies: 1387 | '@vue/devtools-api': 6.4.5 1388 | vue: 3.2.45 1389 | dev: false 1390 | 1391 | /vue/3.2.45: 1392 | resolution: {integrity: sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==} 1393 | dependencies: 1394 | '@vue/compiler-dom': 3.2.45 1395 | '@vue/compiler-sfc': 3.2.45 1396 | '@vue/runtime-dom': 3.2.45 1397 | '@vue/server-renderer': 3.2.45_vue@3.2.45 1398 | '@vue/shared': 3.2.45 1399 | 1400 | /webidl-conversions/3.0.1: 1401 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 1402 | dev: false 1403 | 1404 | /websocket-driver/0.7.4: 1405 | resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} 1406 | engines: {node: '>=0.8.0'} 1407 | dependencies: 1408 | http-parser-js: 0.5.8 1409 | safe-buffer: 5.2.1 1410 | websocket-extensions: 0.1.4 1411 | dev: false 1412 | 1413 | /websocket-extensions/0.1.4: 1414 | resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} 1415 | engines: {node: '>=0.8.0'} 1416 | dev: false 1417 | 1418 | /whatwg-url/5.0.0: 1419 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 1420 | dependencies: 1421 | tr46: 0.0.3 1422 | webidl-conversions: 3.0.1 1423 | dev: false 1424 | 1425 | /wrap-ansi/7.0.0: 1426 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1427 | engines: {node: '>=10'} 1428 | dependencies: 1429 | ansi-styles: 4.3.0 1430 | string-width: 4.2.3 1431 | strip-ansi: 6.0.1 1432 | dev: false 1433 | 1434 | /wrappy/1.0.2: 1435 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1436 | dev: false 1437 | 1438 | /ws/8.11.0: 1439 | resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} 1440 | engines: {node: '>=10.0.0'} 1441 | peerDependencies: 1442 | bufferutil: ^4.0.1 1443 | utf-8-validate: ^5.0.2 1444 | peerDependenciesMeta: 1445 | bufferutil: 1446 | optional: true 1447 | utf-8-validate: 1448 | optional: true 1449 | dev: false 1450 | 1451 | /y18n/5.0.8: 1452 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1453 | engines: {node: '>=10'} 1454 | dev: false 1455 | 1456 | /yargs-parser/20.2.9: 1457 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 1458 | engines: {node: '>=10'} 1459 | dev: false 1460 | 1461 | /yargs/16.2.0: 1462 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 1463 | engines: {node: '>=10'} 1464 | dependencies: 1465 | cliui: 7.0.4 1466 | escalade: 3.1.1 1467 | get-caller-file: 2.0.5 1468 | require-directory: 2.1.1 1469 | string-width: 4.2.3 1470 | y18n: 5.0.8 1471 | yargs-parser: 20.2.9 1472 | dev: false 1473 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gautemo/Vue-guard-routes-with-Firebase-Authentication/a5d69d870e537225635c2da54a45bb4d2264de17/public/favicon.ico -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 25 | 87 | -------------------------------------------------------------------------------- /src/components/GitHub.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | -------------------------------------------------------------------------------- /src/components/Homepage.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 25 | 26 | -------------------------------------------------------------------------------- /src/components/Twitter.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | -------------------------------------------------------------------------------- /src/firebase.js: -------------------------------------------------------------------------------- 1 | import { initializeApp } from "firebase/app"; 2 | import { getAuth, signInWithEmailAndPassword, onAuthStateChanged, signOut } from "firebase/auth"; 3 | 4 | const firebaseConfig = { 5 | apiKey: "AIzaSyCkZPJsYdh7-4mcsuiPszvVERSwDOBKb74", 6 | authDomain: "vue-routes-authentication.firebaseapp.com", 7 | databaseURL: "https://vue-routes-authentication.firebaseio.com", 8 | projectId: "vue-routes-authentication", 9 | storageBucket: "vue-routes-authentication.appspot.com", 10 | messagingSenderId: "680655489437", 11 | appId: "1:680655489437:web:9d66d2b0f438e3e9014774", 12 | measurementId: "G-CGL0FS2DVQ", 13 | }; 14 | const app = initializeApp(firebaseConfig); 15 | export const auth = getAuth(app); 16 | 17 | export function getCurrentUser() { 18 | return new Promise((resolve, reject) => { 19 | const unsubscribe = onAuthStateChanged(auth, (user) => { 20 | unsubscribe(); 21 | resolve(user); 22 | }, reject); 23 | }); 24 | }; 25 | 26 | export async function login() { 27 | await signInWithEmailAndPassword(auth, 'user@mail.com', 'password') 28 | } 29 | 30 | export async function logout() { 31 | await signOut(auth) 32 | } 33 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import { router } from './router' 4 | 5 | createApp(App).use(router).mount('#app') -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | import { getCurrentUser } from './firebase' 2 | import SignIn from './views/SignIn.vue' 3 | import Profile from './views/Profile.vue' 4 | import { createRouter, createWebHistory } from 'vue-router' 5 | 6 | const routes = [ 7 | { 8 | path: '/', 9 | redirect: '/signin' 10 | }, 11 | { 12 | path: '/signin', 13 | component: SignIn 14 | }, 15 | { 16 | path: '/profile', 17 | component: Profile, 18 | meta: { 19 | requiresAuth: true 20 | } 21 | } 22 | ] 23 | 24 | export const router = new createRouter({ 25 | history: createWebHistory(), 26 | routes 27 | }) 28 | 29 | router.beforeEach(async (to) => { 30 | const requiresAuth = to.matched.some(record => record.meta.requiresAuth); 31 | if (requiresAuth && !await getCurrentUser()) { 32 | return '/signin'; 33 | } 34 | }) 35 | -------------------------------------------------------------------------------- /src/views/Profile.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 21 | 22 | -------------------------------------------------------------------------------- /src/views/SignIn.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | 20 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | 4 | export default defineConfig({ 5 | plugins: [vue()], 6 | }) --------------------------------------------------------------------------------