├── .eslintignore ├── tsconfig.json ├── demo ├── app.vue ├── .gitignore ├── tsconfig.json ├── server │ └── api │ │ └── me.ts ├── package.json ├── nuxt.config.ts ├── README.md └── pages │ ├── index.vue │ └── profile.vue ├── playground ├── package.json ├── pages │ ├── confirm.vue │ ├── index.vue │ └── me.vue ├── server │ └── api │ │ ├── me.ts │ │ └── data.ts ├── app.vue ├── nuxt.config.ts └── package-lock.json ├── .eslintrc ├── src ├── runtime │ ├── server │ │ ├── services │ │ │ ├── index.ts │ │ │ ├── serverFirebaseAdmin.ts │ │ │ ├── serverFirebaseAuth.ts │ │ │ └── serverFirebaseUser.ts │ │ └── api │ │ │ └── session.ts │ ├── composables │ │ ├── useFirebaseAuth.ts │ │ ├── useFirestore.ts │ │ ├── useFirebaseFunctions.ts │ │ ├── useFirebaseToken.ts │ │ ├── useFirebaseUser.ts │ │ └── useFirebaseApp.ts │ ├── plugins │ │ ├── auth-redirect.ts │ │ ├── firebase.server.ts │ │ └── firebase.client.ts │ ├── config │ │ └── firebase-admin.ts │ ├── utils │ │ └── redirect.ts │ └── types │ │ └── index.d.ts └── module.ts ├── .editorconfig ├── docs ├── auth-middleware.md ├── cookbook │ ├── server-user.md │ ├── firestore.md │ └── auth.md ├── index.md ├── introduction.md ├── vue-composables.md ├── .vitepress │ └── config.js ├── getting-started.md └── server-services.md ├── .gitignore ├── .github └── workflows │ └── docs.yml ├── LICENSE ├── package.json └── README.md /.eslintignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./playground/.nuxt/tsconfig.json" 3 | } 4 | -------------------------------------------------------------------------------- /demo/app.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log* 3 | .nuxt 4 | .nitro 5 | .cache 6 | .output 7 | .env 8 | dist 9 | -------------------------------------------------------------------------------- /demo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://v3.nuxtjs.org/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | -------------------------------------------------------------------------------- /playground/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "nuxt-firebase-playground", 4 | "dependencies": { 5 | "firebase": "^9.12.1" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "@nuxtjs/eslint-config-typescript" 4 | ], 5 | "rules": { 6 | "@typescript-eslint/no-unused-vars": [ 7 | "off" 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/runtime/server/services/index.ts: -------------------------------------------------------------------------------- 1 | export { serverFirebaseAdmin } from './serverFirebaseAdmin' 2 | export { serverFirebaseAuth } from './serverFirebaseAuth' 3 | export { serverFirebaseUser } from './serverFirebaseUser' 4 | -------------------------------------------------------------------------------- /demo/server/api/me.ts: -------------------------------------------------------------------------------- 1 | import { serverFirebaseUser } from '#firebase/server' 2 | 3 | export default defineEventHandler(async (event) => { 4 | const user = await serverFirebaseUser(event) 5 | 6 | return user ?? 'User not signed in.' 7 | }) 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_size = 2 5 | indent_style = space 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /src/runtime/composables/useFirebaseAuth.ts: -------------------------------------------------------------------------------- 1 | import { type Auth } from 'firebase/auth' 2 | import { useNuxtApp } from '#imports' 3 | 4 | export const useFirebaseAuth = (): Auth => { 5 | const { $firebaseAuth } = useNuxtApp() 6 | return $firebaseAuth 7 | } 8 | -------------------------------------------------------------------------------- /src/runtime/composables/useFirestore.ts: -------------------------------------------------------------------------------- 1 | import { type Firestore } from 'firebase/firestore/lite' 2 | import { useNuxtApp } from '#imports' 3 | 4 | export const useFirestore = (): Firestore => { 5 | const { $firebaseFirestore } = useNuxtApp() 6 | return $firebaseFirestore 7 | } 8 | -------------------------------------------------------------------------------- /playground/pages/confirm.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /src/runtime/composables/useFirebaseFunctions.ts: -------------------------------------------------------------------------------- 1 | import { type Functions } from 'firebase/functions' 2 | import { useNuxtApp } from '#imports' 3 | 4 | export const useFirebaseFunctions = (): Functions => { 5 | const { $firebaseFunctions } = useNuxtApp() 6 | return $firebaseFunctions 7 | } 8 | -------------------------------------------------------------------------------- /playground/server/api/me.ts: -------------------------------------------------------------------------------- 1 | import { serverFirebaseUser } from '#firebase/server' 2 | export default defineEventHandler(async (event) => { 3 | const user = await serverFirebaseUser(event) 4 | 5 | if (!user) { 6 | event.res.statusCode = 400 7 | return 'Must be signed in' 8 | } 9 | 10 | return user 11 | }) 12 | -------------------------------------------------------------------------------- /src/runtime/composables/useFirebaseToken.ts: -------------------------------------------------------------------------------- 1 | import { useCookie, useRuntimeConfig } from '#imports' 2 | 3 | export const useFirebaseToken = () => { 4 | const { firebase: { cookies: cookieOptions } } = useRuntimeConfig().public 5 | const cookieName = `${cookieOptions.name}-access-token` 6 | 7 | return useCookie(cookieName) 8 | } 9 | -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "build": "nuxt build", 5 | "dev": "nuxt dev", 6 | "generate": "nuxt generate", 7 | "preview": "nuxt preview", 8 | "postinstall": "nuxt prepare" 9 | }, 10 | "devDependencies": { 11 | "@oswld/nuxt-firebase": "0.3.1", 12 | "nuxt": "3.0.0-rc.12" 13 | }, 14 | "dependencies": { 15 | "firebase": "^9.12.1", 16 | "firebase-admin": "^11.2.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/runtime/composables/useFirebaseUser.ts: -------------------------------------------------------------------------------- 1 | import type { Ref } from 'vue' 2 | import { User } from 'firebase/auth' 3 | import { useFirebaseToken } from './useFirebaseToken' 4 | import { useState } from '#imports' 5 | 6 | export const useFirebaseUser = (): Ref => { 7 | const user = useState('firebase_user') 8 | const token = useFirebaseToken() 9 | 10 | if (!token.value) { 11 | user.value = null 12 | } 13 | 14 | return user 15 | } 16 | -------------------------------------------------------------------------------- /src/runtime/plugins/auth-redirect.ts: -------------------------------------------------------------------------------- 1 | import { useFirebaseUser } from '../composables/useFirebaseUser' 2 | import { redirectToLogin } from '../utils/redirect' 3 | import { defineNuxtPlugin, addRouteMiddleware } from '#imports' 4 | 5 | export default defineNuxtPlugin(() => { 6 | addRouteMiddleware('global-auth', (to) => { 7 | const user = useFirebaseUser() 8 | if (!user.value) { 9 | return redirectToLogin(to.path) 10 | } 11 | }, { global: true }) 12 | }) 13 | -------------------------------------------------------------------------------- /docs/auth-middleware.md: -------------------------------------------------------------------------------- 1 | # Auth middleware 2 | You can protect your authenticated routes by creating a custom middleware in your project. For example `middleware/auth.ts` 3 | ```ts 4 | export default defineNuxtRouteMiddleware((to, _from) => { 5 | const user = useFirebaseUser() 6 | if (!user.value) { 7 | return navigateTo('/login') 8 | } 9 | }) 10 | ``` 11 | 12 | Then you can reference your middleware in your page with: 13 | ```ts 14 | definePageMeta({ 15 | middleware: 'auth' 16 | }) 17 | ``` -------------------------------------------------------------------------------- /playground/server/api/data.ts: -------------------------------------------------------------------------------- 1 | import { serverFirebaseAdmin, serverFirebaseUser } from '#firebase/server' 2 | export default defineEventHandler(async (event) => { 3 | const user = await serverFirebaseUser(event) 4 | 5 | if (!user) { 6 | event.res.statusCode = 400 7 | return 'Must be signed in' 8 | } 9 | 10 | const { firestore: db } = serverFirebaseAdmin(event) 11 | 12 | const doc = await db.collection('status').doc(user.uid).get() 13 | const status = doc.data() 14 | return status 15 | }) 16 | -------------------------------------------------------------------------------- /src/runtime/config/firebase-admin.ts: -------------------------------------------------------------------------------- 1 | import { initializeApp } from 'firebase-admin/app' 2 | import admin from 'firebase-admin' 3 | 4 | // TODO: how to use with runtimeconfig? 5 | // Keys must be present in .env file this way. 6 | const credOptions = { 7 | projectId: process.env.FIREBASE_PROJECT_ID, 8 | clientEmail: process.env.FIREBASE_CLIENT_EMAIL, 9 | privateKey: process.env.FIREBASE_PRIVATE_KEY?.replace(/\\n/g, '\n') 10 | } 11 | 12 | const app = initializeApp({ 13 | credential: admin.credential.cert(credOptions) 14 | }) 15 | 16 | export default app 17 | -------------------------------------------------------------------------------- /demo/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | // https://v3.nuxtjs.org/api/configuration/nuxt.config 2 | export default defineNuxtConfig({ 3 | modules: ['@oswld/nuxt-firebase'], 4 | firebase: { 5 | redirect: { 6 | login: '/' 7 | }, 8 | config: { 9 | apiKey: 'AIzaSyDZbErWnsPmyVWRZ1joFGldWpGcZ5pEtd4', 10 | authDomain: 'nuxt3-firebase-demo.firebaseapp.com', 11 | projectId: 'nuxt3-firebase-demo', 12 | storageBucket: 'nuxt3-firebase-demo.appspot.com', 13 | messagingSenderId: '642353543886', 14 | appId: '1:642353543886:web:b962cd0ce0fd8229e8ee9f' 15 | } 16 | } 17 | }) 18 | -------------------------------------------------------------------------------- /src/runtime/server/services/serverFirebaseAdmin.ts: -------------------------------------------------------------------------------- 1 | import { getApp } from 'firebase-admin/app' 2 | import { getFunctions } from 'firebase-admin/functions' 3 | import { getFirestore } from 'firebase-admin/firestore' 4 | import type { H3Event } from 'h3' 5 | 6 | export const serverFirebaseAdmin = (event: H3Event) => { 7 | if (!event.context._firebaseAdmin) { 8 | const app = getApp() 9 | 10 | event.context._firebaseAdmin = app 11 | } 12 | 13 | const firestore = getFirestore() 14 | const functions = getFunctions() 15 | 16 | return { 17 | firestore, functions, app: event.context._firebaseAdmin 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/runtime/composables/useFirebaseApp.ts: -------------------------------------------------------------------------------- 1 | import { type FirebaseApp, initializeApp, getApps } from 'firebase/app' 2 | import { useNuxtApp, useRuntimeConfig } from '#imports' 3 | 4 | export const useFirebaseApp = (): FirebaseApp => { 5 | const nuxtApp = useNuxtApp() 6 | 7 | // if firebase app has not been created yet. 8 | if (!nuxtApp._firebaseApp) { 9 | const { firebase: { config } } = useRuntimeConfig().public 10 | 11 | const apps = getApps() 12 | 13 | // initialize app if not done yet. 14 | const app = apps.length ? apps[0] : initializeApp(config) 15 | nuxtApp._firebaseApp = app 16 | } 17 | return nuxtApp._firebaseApp 18 | } 19 | -------------------------------------------------------------------------------- /src/runtime/utils/redirect.ts: -------------------------------------------------------------------------------- 1 | import { useRuntimeConfig, navigateTo, useRouter } from '#imports' 2 | 3 | export const redirectToLogin = (toPath) => { 4 | const router = useRouter() 5 | 6 | const redirect = useRuntimeConfig().public.firebase.redirect 7 | if (redirect && redirect.login) { 8 | // Do not redirect for login and callback pages 9 | if ([redirect.login, redirect.callback].includes(toPath)) { 10 | return 11 | } 12 | 13 | // Do not redirect if route not resolved by router (must return 404) 14 | if (!router.resolve(toPath).name) { 15 | return 16 | } 17 | 18 | return navigateTo(redirect.login) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | node_modules 3 | 4 | # Logs 5 | *.log* 6 | 7 | # Temp directories 8 | .temp 9 | .tmp 10 | .cache 11 | 12 | # Yarn 13 | **/.yarn/cache 14 | **/.yarn/*state* 15 | 16 | # Generated dirs 17 | dist 18 | 19 | # Nuxt 20 | .nuxt 21 | .output 22 | .vercel_build_output 23 | .build-* 24 | .env 25 | .netlify 26 | 27 | # Env 28 | .env 29 | 30 | # Testing 31 | reports 32 | coverage 33 | *.lcov 34 | .nyc_output 35 | 36 | # VSCode 37 | .vscode 38 | 39 | # Intellij idea 40 | *.iml 41 | .idea 42 | 43 | # OSX 44 | .DS_Store 45 | .AppleDouble 46 | .LSOverride 47 | .AppleDB 48 | .AppleDesktop 49 | Network Trash Folder 50 | Temporary Items 51 | .apdisk 52 | -------------------------------------------------------------------------------- /src/runtime/server/services/serverFirebaseAuth.ts: -------------------------------------------------------------------------------- 1 | import { type Auth, getAuth } from 'firebase-admin/auth' 2 | import { type H3Event, getCookie } from 'h3' 3 | import { useRuntimeConfig } from '#imports' 4 | 5 | export const serverFirebaseAuth = (event: H3Event): Auth => { 6 | const { public: { firebase: { cookies: cookieOptions } } } = useRuntimeConfig() 7 | 8 | if (!event.context._firebaseAuth) { 9 | const token = getCookie(event, `${cookieOptions.name}-access-token`) 10 | const auth = getAuth() 11 | 12 | event.context._firebaseAuth = auth 13 | event.context._token = token 14 | } 15 | 16 | return event.context._firebaseAuth as Auth 17 | } 18 | -------------------------------------------------------------------------------- /playground/app.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 30 | -------------------------------------------------------------------------------- /docs/cookbook/server-user.md: -------------------------------------------------------------------------------- 1 | 1. Add server api: `server/api/user.ts`: 2 | 3 | ```ts 4 | import { serverFirebaseUser } from '#firebase/server' 5 | 6 | export default defineEventHandler(async (event) => { 7 | const user = await serverFirebaseUser(event) 8 | 9 | return user ?? 'User not signed in.' 10 | }) 11 | ``` 12 | 13 | 2. Call that api in your component (with cookies): 14 | 15 | ```vue 16 | 28 | ``` -------------------------------------------------------------------------------- /docs/cookbook/firestore.md: -------------------------------------------------------------------------------- 1 | # Firestore 2 | Use `firestore/lite` in your app. 3 | 4 | ### Read documents 5 | 6 | ```vue 7 | 17 | ``` 18 | 19 | ### Write documents 20 | 21 | ```vue 22 | 33 | ``` -------------------------------------------------------------------------------- /.github/workflows/docs.yml: -------------------------------------------------------------------------------- 1 | name: Deploy docs 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3 13 | with: 14 | fetch-depth: 0 15 | - uses: actions/setup-node@v3 16 | with: 17 | node-version: 16 18 | - run: npm install 19 | 20 | - name: Prepare 21 | run: npm run dev:prepare 22 | 23 | - name: Build 24 | run: npm run docs:build 25 | 26 | - name: Deploy 27 | uses: peaceiris/actions-gh-pages@v3 28 | with: 29 | github_token: ${{ secrets.GITHUB_TOKEN }} 30 | publish_dir: docs/.vitepress/dist 31 | # cname: example.com # if wanna deploy to custom domain -------------------------------------------------------------------------------- /demo/README.md: -------------------------------------------------------------------------------- 1 | # Nuxt 3 Minimal Starter 2 | 3 | Look at the [nuxt 3 documentation](https://v3.nuxtjs.org) to learn more. 4 | 5 | ## Setup 6 | 7 | Make sure to install the dependencies: 8 | 9 | ```bash 10 | # yarn 11 | yarn install 12 | 13 | # npm 14 | npm install 15 | 16 | # pnpm 17 | pnpm install --shamefully-hoist 18 | ``` 19 | 20 | ## Development Server 21 | 22 | Start the development server on http://localhost:3000 23 | 24 | ```bash 25 | npm run dev 26 | ``` 27 | 28 | ## Production 29 | 30 | Build the application for production: 31 | 32 | ```bash 33 | npm run build 34 | ``` 35 | 36 | Locally preview production build: 37 | 38 | ```bash 39 | npm run preview 40 | ``` 41 | 42 | Checkout the [deployment documentation](https://v3.nuxtjs.org/guide/deploy/presets) for more information. 43 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | hero: 4 | name: Nuxt Firebase 5 | tagline: Firebase module for Nuxt. 6 | actions: 7 | - theme: brand 8 | text: Get Started 9 | link: /introduction 10 | - theme: alt 11 | text: View on GitHub 12 | link: https://github.com/kai-oswald/nuxt-firebase 13 | 14 | features: 15 | - icon: 🚀 16 | title: Nuxt 3 ready 17 | details: Easily integrate and use Firebase in your Nuxt 3 app. 18 | - icon: 🔥 19 | title: Modular mode 20 | details: Use the new modular syntax of Firebase (v9+). 21 | - icon: ⚡️ 22 | title: Vue 3 composables 23 | details: Ready-to-use composables that you can just use. 24 | - icon: 🔧️ 25 | title: Usage in API server routes 26 | details: Use the firebase-admin SDK on the server-side. 27 | --- -------------------------------------------------------------------------------- /playground/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | import { defineNuxtConfig } from 'nuxt/config' 2 | import FirebaseModule from '..' 3 | 4 | export default defineNuxtConfig({ 5 | modules: [ 6 | FirebaseModule 7 | ], 8 | myModule: { 9 | addPlugin: true 10 | }, 11 | firebase: { 12 | cookies: { 13 | lifetime: 60 * 60 * 8 // 8 hours 14 | }, 15 | redirect: { 16 | login: '/', 17 | callback: '/confirm' 18 | }, 19 | config: { 20 | apiKey: 'AIzaSyDZbErWnsPmyVWRZ1joFGldWpGcZ5pEtd4', 21 | authDomain: 'nuxt3-firebase-demo.firebaseapp.com', 22 | projectId: 'nuxt3-firebase-demo', 23 | storageBucket: 'nuxt3-firebase-demo.appspot.com', 24 | messagingSenderId: '642353543886', 25 | appId: '1:642353543886:web:b962cd0ce0fd8229e8ee9f' 26 | } 27 | } 28 | }) 29 | -------------------------------------------------------------------------------- /src/runtime/server/services/serverFirebaseUser.ts: -------------------------------------------------------------------------------- 1 | import type { Auth, UserRecord } from 'firebase-admin/auth' 2 | import { serverFirebaseAuth } from '../services/serverFirebaseAuth' 3 | 4 | export const serverFirebaseUser = async (event): Promise => { 5 | const auth = serverFirebaseAuth(event) 6 | 7 | const firebaseUser = await tryGetUser(auth, event.context._token) 8 | 9 | event.context._user = firebaseUser 10 | 11 | return event.context._user 12 | } 13 | 14 | async function tryGetUser (auth: Auth, token: string) : Promise { 15 | if (!token) { 16 | return null 17 | } 18 | 19 | try { 20 | const decodedToken = await auth.verifyIdToken(token) 21 | const user = await auth.getUser(decodedToken?.uid) 22 | return user 23 | } catch (err) { 24 | return null 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /docs/cookbook/auth.md: -------------------------------------------------------------------------------- 1 | ### Sign in 2 | ```vue 3 | 18 | ``` 19 | 20 | ### Sign out 21 | 22 | ```vue 23 | 38 | ``` -------------------------------------------------------------------------------- /docs/introduction.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | Easily integrate Firebase into your Nuxt project. 3 | This module is heavily inspired by the official [Supabase module](https://supabase.nuxtjs.org/) and behaves similiary. 4 | 5 | ## Features 6 | The Nuxt Firebase module is a module that helps you integrate the Firebase JavaScript SDK into your application. 7 | Simply configure the `nuxt.config.ts` to use most of the Firebase Services in your app. 8 | 9 | This module supports the modular mode of Firebase v9+ to reduce the final bundle size. 10 | 11 | The module adds a plugin for automated setup of Firebase and handles listening to `onAuthStateChanged()` for Firebase Authentication. 12 | 13 | ## How does it work? 14 | The module adds a plugin to your Nuxt application that handles the initialization of most Firebase services and adds composables that are auto-registered for easy access throughout the app. 15 | 16 | Currently these Firebase services are supported: 17 | - Authentication 18 | - Firestore 19 | - Functions 20 | 21 | Other services will be shipped later. -------------------------------------------------------------------------------- /docs/vue-composables.md: -------------------------------------------------------------------------------- 1 | # Vue composables 2 | 3 | This module contains some Vue composables that you can use. 4 | 5 | ## `useFirebaseApp` 6 | Access the firebase `app` instance. This function also initializes the `firebaseApp` when called the first time. 7 | 8 | ```ts 9 | const app = useFirebaseApp() 10 | ``` 11 | 12 | ## `useFirebaseAuth` 13 | Access the firebase `auth` instance. Only use inside functions. 14 | 15 | ```ts 16 | onMounted(() => { 17 | const auth = useFirebaseAuth() 18 | }) 19 | ``` 20 | 21 | ## `useFirebaseFunctions` 22 | Access the firebase `functions` instance. 23 | 24 | ```ts 25 | const functions = useFirebaseFunctions() 26 | ``` 27 | 28 | ## `useFirebaseToken` 29 | Holds the access token that is saved as cookie. 30 | 31 | ```ts 32 | const token = useFirebaseToken() 33 | ``` 34 | 35 | ## `useFirebaseUser` 36 | A reactive binding to the currently signed in user. 37 | 38 | ```ts 39 | const user = useFirebaseUser() 40 | ``` 41 | 42 | ## `useFirestore` 43 | Access the firebase `firestore` instance. 44 | 45 | ```ts 46 | const db = useFirestore() 47 | ``` 48 | 49 | -------------------------------------------------------------------------------- /docs/.vitepress/config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | title: "Nuxt Firebase", 3 | description: "Firebase module for Nuxt", 4 | base: "/nuxt-firebase/", 5 | themeConfig: { 6 | socialLinks: [ 7 | { icon: 'github', link: 'https://github.com/kai-oswald/nuxt-firebase' }, 8 | ], 9 | sidebar: [ 10 | { 11 | text: 'Guide', 12 | items: [ 13 | { text: 'Introduction', link: '/introduction' }, 14 | { text: 'Getting Started', link: '/getting-started' }, 15 | ] 16 | }, 17 | { 18 | text: 'Usage', 19 | items: [ 20 | { text: 'Vue composables', link: '/vue-composables' }, 21 | { text: 'Server services', link: '/server-services' }, 22 | { text: 'Auth middleware', link: '/auth-middleware' }, 23 | ] 24 | }, 25 | { 26 | text: 'Cookbook', 27 | items: [ 28 | { text: 'Auth', link: '/cookbook/auth' }, 29 | { text: 'Firestore', link: '/cookbook/firestore' }, 30 | { text: 'Server user', link: '/cookbook/server-user' } 31 | ] 32 | } 33 | ] 34 | } 35 | } -------------------------------------------------------------------------------- /src/runtime/server/api/session.ts: -------------------------------------------------------------------------------- 1 | import { readBody, setCookie, assertMethod, defineEventHandler } from 'h3' 2 | import { useRuntimeConfig } from '#imports' 3 | 4 | const config = useRuntimeConfig().public 5 | 6 | export default defineEventHandler(async (event) => { 7 | assertMethod(event, 'POST') 8 | const cookieOptions = config.firebase.cookies 9 | const { event: signEvent, token } = await readBody(event) 10 | 11 | if (!event) { throw new Error('Auth event missing!') } 12 | 13 | if (signEvent === 'SIGNED_IN') { 14 | if (!token) { throw new Error('Auth token missing!') } 15 | setCookie(event, `${cookieOptions.name}-access-token`, token, { 16 | domain: cookieOptions.domain, 17 | maxAge: cookieOptions.lifetime ?? 0, 18 | path: cookieOptions.path, 19 | sameSite: cookieOptions.sameSite as boolean | 'lax' | 'strict' | 'none' 20 | } 21 | ) 22 | } 23 | 24 | if (signEvent === 'SIGNED_OUT') { 25 | setCookie(event, `${cookieOptions.name}-access-token`, '', { 26 | maxAge: -1, 27 | path: cookieOptions.path 28 | }) 29 | } 30 | 31 | return 'auth cookie set' 32 | }) 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Kai Oswald 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 | -------------------------------------------------------------------------------- /playground/pages/index.vue: -------------------------------------------------------------------------------- 1 | 18 | 42 | -------------------------------------------------------------------------------- /src/runtime/types/index.d.ts: -------------------------------------------------------------------------------- 1 | import type { Auth } from 'firebase/auth' 2 | import type { FirebaseApp } from 'firebase/app' 3 | import type { Firestore } from 'firebase/firestore/lite' 4 | import type { Functions } from 'firebase/functions' 5 | 6 | export interface CookieOptions { 7 | // (Optional) The cookie name prefix. Defaults to `fb` meaning the cookies will be `fb-access-token`. 8 | name?: string 9 | // (Optional) The cookie lifetime (expiration) in seconds. Set to 8 hours by default. 10 | lifetime?: number 11 | // (Optional) The cookie domain this should run on. Leave it blank to restrict it to your domain. 12 | domain?: string 13 | path?: string 14 | // (Optional) SameSite configuration for the session cookie. Defaults to 'lax', but can be changed to 'strict' or 'none'. Set it to false if you want to disable the SameSite setting. 15 | sameSite?: string 16 | } 17 | 18 | export interface RedirectOptions { 19 | login: string 20 | callback?: string 21 | } 22 | 23 | declare module '#app' { 24 | interface NuxtApp { 25 | $firebaseApp: FirebaseApp; 26 | $firebaseAuth: Auth; 27 | $firebaseFirestore: Firestore; 28 | $firebaseFunctions: Functions; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /docs/getting-started.md: -------------------------------------------------------------------------------- 1 | # Getting started 2 | Checkout the [Nuxt 3](https://v3.nuxtjs.org/) documentation and [Firebase](https://firebase.google.com/docs/web/setup) to learn more. 3 | 4 | ## Installation 5 | 6 | 1. `@oswld/nuxt-firebase` as a dev dependency to your project: 7 | 8 | ```bash 9 | npm i -D @oswld/nuxt-firebase 10 | ``` 11 | 12 | 2. Add `@oswld/nuxt-firebase` to the `modules` section of `nuxt.config.ts`: 13 | ```ts [nuxt.config.ts] 14 | import { defineNuxtConfig } from 'nuxt' 15 | export default defineNuxtConfig({ 16 | modules: ['@oswld/nuxt-firebase'], 17 | }) 18 | ``` 19 | 20 | 3. Add your Firebase configuration to the `firebase` section of `nuxt.config.ts` 21 | ``` 22 | { 23 | firebase: { 24 | config: firebaseConfig 25 | } 26 | } 27 | ``` 28 | 29 | 4. Add config for `firebase-admin` in `.env` 30 | ``` 31 | FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n1234\n-----END PRIVATE KEY-----\n" 32 | FIREBASE_CLIENT_EMAIL="firebase-adminsdk-1234@your-firebase-project.iam.gserviceaccount.com" 33 | FIREBASE_PROJECT_ID="your-firebase-project" 34 | ``` 35 | 36 | That's it! You can now use firebase in your Nuxt app ✨ 37 | 38 | ## Demo 39 | A very basic demo is available at [https://nuxt3-firebase-demo.netlify.app/](https://nuxt3-firebase-demo.netlify.app/). -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@oswld/nuxt-firebase", 3 | "version": "1.0.0", 4 | "description": "Firebase module for Nuxt", 5 | "repository": "kai-oswald/nuxt-firebase", 6 | "homepage": "https://kai-oswald.github.io/nuxt-firebase/", 7 | "license": "MIT", 8 | "type": "module", 9 | "exports": { 10 | ".": { 11 | "import": "./dist/module.mjs", 12 | "require": "./dist/module.cjs" 13 | } 14 | }, 15 | "main": "./dist/module.cjs", 16 | "types": "./dist/types.d.ts", 17 | "files": [ 18 | "dist" 19 | ], 20 | "scripts": { 21 | "prepack": "nuxt-module-build", 22 | "dev": "nuxi dev playground", 23 | "dev:build": "nuxi build playground", 24 | "dev:prepare": "nuxt-module-build --stub && nuxi prepare playground", 25 | "docs:dev": "vitepress dev docs", 26 | "docs:build": "vitepress build docs", 27 | "docs:serve": "vitepress serve docs" 28 | }, 29 | "dependencies": { 30 | "@nuxt/kit": "^3.0.0", 31 | "defu": "^6.1.0", 32 | "firebase": "^9.12.1", 33 | "firebase-admin": "^11.2.0" 34 | }, 35 | "devDependencies": { 36 | "@nuxt/module-builder": "^0.2.0", 37 | "@nuxt/schema": "^3.0.0", 38 | "@nuxtjs/eslint-config-typescript": "^11.0.0", 39 | "eslint": "^8.25.0", 40 | "nuxt": "^3.0.0", 41 | "vitepress": "^1.0.0-alpha.26" 42 | } 43 | } -------------------------------------------------------------------------------- /docs/server-services.md: -------------------------------------------------------------------------------- 1 | # Server services 2 | 3 | This module also includes `firebase-admin/*` services that you can use on the server-side. 4 | 5 | ## `serverFirebaseAdmin` 6 | Allows access to various `firebase-admin/*` service instances. 7 | 8 | ```ts 9 | import { serverFirebaseAdmin } from '#firebase/server' 10 | 11 | export default defineEventHandler(async (event) => { 12 | const { firestore, functions, app } = await serverFirebaseAdmin(event) 13 | }) 14 | 15 | ``` 16 | 17 | ## `serverFirebaseAuth` 18 | Holds the initialized instance of `firebase-admin/auth` 19 | ```ts 20 | import { serverFirebaseAuth } from '#firebase/server' 21 | 22 | export default defineEventHandler(async (event) => { 23 | const auth = await serverFirebaseAuth(event) 24 | }) 25 | ``` 26 | 27 | ## `serverFirebaseUser` 28 | Get the current authenticated user on the server-side. 29 | ```ts 30 | // server/api/user.ts 31 | import { serverFirebaseUser } from '#firebase/server' 32 | 33 | export default defineEventHandler(async (event) => { 34 | const user = await serverFirebaseUser(event) 35 | }) 36 | ``` 37 | 38 | If you want to call this route on SSR, please read this [section](https://v3.nuxtjs.org/getting-started/data-fetching/#isomorphic-fetch-and-fetch), you must send your browser cookies including your firebase token. 39 | 40 | ```ts 41 | const user = ref(null) 42 | const { data } = await useFetch('/api/user', { 43 | headers: useRequestHeaders(['cookie']) 44 | }) 45 | user.value = data 46 | ``` -------------------------------------------------------------------------------- /src/runtime/plugins/firebase.server.ts: -------------------------------------------------------------------------------- 1 | import { User } from '@firebase/auth' 2 | import { getAuth, UserRecord } from 'firebase-admin/auth' 3 | import app from '../config/firebase-admin' 4 | import { useFirebaseUser } from '../composables/useFirebaseUser' 5 | import { useFirebaseToken } from '../composables/useFirebaseToken' 6 | import { redirectToLogin } from '../utils/redirect' 7 | import { defineNuxtPlugin, useRoute } from '#imports' 8 | 9 | // Set firebase user on server side 10 | export default defineNuxtPlugin(async () => { 11 | const user = useFirebaseUser() 12 | const token = useFirebaseToken() 13 | const route = useRoute() 14 | if (!token.value) { 15 | return 16 | } 17 | 18 | // on the server-side we need to use the admin sdk 19 | // and verify the token that we get from the cookie 20 | const auth = getAuth(app) 21 | 22 | try { 23 | const decodedToken = await auth.verifyIdToken(token.value) 24 | const firebaseUser = await auth.getUser(decodedToken.user_id) 25 | user.value = formatUser(firebaseUser) 26 | } catch (err) { 27 | user.value = null 28 | token.value = null 29 | 30 | await redirectToLogin(route.path) 31 | } 32 | }) 33 | 34 | const formatUser = (user: UserRecord): User => { 35 | return { 36 | uid: user.uid, 37 | email: user.email, 38 | displayName: user.displayName, 39 | photoURL: user.photoURL, 40 | phoneNumber: user.phoneNumber, 41 | emailVerified: user.emailVerified 42 | } as User 43 | } 44 | -------------------------------------------------------------------------------- /demo/pages/index.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 44 | -------------------------------------------------------------------------------- /demo/pages/profile.vue: -------------------------------------------------------------------------------- 1 | 22 | 58 | -------------------------------------------------------------------------------- /playground/pages/me.vue: -------------------------------------------------------------------------------- 1 | 25 | 58 | -------------------------------------------------------------------------------- /src/runtime/plugins/firebase.client.ts: -------------------------------------------------------------------------------- 1 | import { getAuth, onAuthStateChanged } from 'firebase/auth' 2 | import { getFirestore } from 'firebase/firestore/lite' 3 | import { getFunctions } from 'firebase/functions' 4 | import { useFirebaseUser } from '../composables/useFirebaseUser' 5 | import { useFirebaseToken } from '../composables/useFirebaseToken' 6 | import { useFirebaseApp } from '../composables/useFirebaseApp' 7 | import { defineNuxtPlugin } from '#imports' 8 | 9 | export default defineNuxtPlugin((nuxtApp) => { 10 | // initialize firebase 11 | const app = useFirebaseApp() 12 | const auth = getAuth(app) 13 | const firestore = getFirestore(app) 14 | const functions = getFunctions(app) 15 | 16 | nuxtApp.provide('firebaseFunctions', functions) 17 | nuxtApp.provide('firebaseApp', app) 18 | nuxtApp.provide('firebaseAuth', auth) 19 | nuxtApp.provide('firebaseFirestore', firestore) 20 | 21 | // Once Nuxt app is mounted 22 | nuxtApp.hooks.hook('app:mounted', async () => { 23 | // Listen to Firebase auth changes 24 | await initUser(auth) 25 | }) 26 | }) 27 | 28 | export const initUser = (auth) => { 29 | const firebaseUser = useFirebaseUser() 30 | const firebaseToken = useFirebaseToken() 31 | 32 | onAuthStateChanged(auth, async (user) => { 33 | const token = await user?.getIdToken() 34 | 35 | const event = user ? 'SIGNED_IN' : 'SIGNED_OUT' 36 | await setServerSession(event, token) 37 | 38 | firebaseUser.value = user 39 | 40 | // The following are just workarounds, in case servers don't set cookies. 41 | 42 | // Some hosts (such as netlify) don't return the cookie from the setServerSession call in api functions. 43 | // As a workaround we set the cookie client-side if the token was not set. 44 | if (event === 'SIGNED_IN' && !firebaseToken.value) { 45 | // @ts-ignore 46 | firebaseToken.value = token // ignore error because nuxt will serialize to json 47 | } 48 | 49 | // Same workaround for signout, clear the cookie. 50 | if (event === 'SIGNED_OUT' && firebaseToken.value) { 51 | firebaseToken.value = null 52 | } 53 | }) 54 | } 55 | 56 | function setServerSession (event, token): Promise { 57 | return $fetch('/api/_firebase/session', { 58 | method: 'POST', 59 | body: { event, token } 60 | }) 61 | } 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > [!NOTE] 2 | > This lib was created when [Vuefire](https://github.com/vuejs/vuefire) wasn't Nuxt 3 ready yet, but it is now in a good state. I recommend using [Vuefire](https://github.com/vuejs/vuefire) instead of this one 3 | 4 | # nuxt-firebase module 5 | 6 | > [Firebase](https://firebase.google.com/) module for [Nuxt](https://v3.nuxtjs.org) 7 | 8 | [Docs](https://kai-oswald.github.io/nuxt-firebase/) 9 | [Demo](https://nuxt3-firebase-demo.netlify.app/) 10 | 11 | ## Features 12 | 13 | - Nuxt 3 ready 14 | - Vue 3 composables 15 | - Modular Mode (Firebase v9+) 16 | - Usage in API server routes 17 | - Authentication support 18 | - TypeScript support 19 | 20 | ## Quick Setup 21 | 22 | 1. Add `@oswld/nuxt-firebase` dependency to your project 23 | ``` 24 | # using yarn 25 | yarn add --dev @oswld/nuxt-firebase 26 | 27 | # using npm 28 | npm i --save-dev @oswld/nuxt-firebase 29 | ``` 30 | 31 | 2. Add `@oswld/nuxt-firebase` to the `modules` section of `nuxt.config.ts` 32 | ``` 33 | { 34 | modules: [ 35 | '@oswld/nuxt-firebase' 36 | ], 37 | } 38 | ``` 39 | 40 | 3. Add your firebase config to the `firebase` section of `nuxt.config.ts` 41 | ``` 42 | { 43 | firebase: { 44 | config: firebaseConfig 45 | } 46 | } 47 | ``` 48 | 49 | 4. Add config for `firebase-admin`. 50 | These must currently be present on process.env, so add them to your environment variables: 51 | ``` 52 | // .env 53 | FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n1234\n-----END PRIVATE KEY-----\n" 54 | FIREBASE_CLIENT_EMAIL="firebase-adminsdk-1234@your-firebase-project.iam.gserviceaccount.com" 55 | FIREBASE_PROJECT_ID="your-firebase-project" 56 | ``` 57 | 58 | 59 | That's it! You can now use firebase in your Nuxt app ✨ 60 | 61 | ### Vue Composables 62 | - `useFirebaseUser` 63 | - `useFirebaseApp` 64 | - `useFirebaseAuth` 65 | - `useFirebaseToken` 66 | - `useFirebaseFunctions` 67 | - `useFirestore` 68 | 69 | ### Server services 70 | - `serverFirebaseAdmin` 71 | - `serverFirebaseAuth` 72 | - `serverFirebaseUser` 73 | 74 | 75 | ## Nuxt 2 76 | 77 | If you are looking for a solution with Nuxt 2, checkout https://github.com/nuxt-community/firebase-module 78 | 79 | ## Development 80 | 81 | 1. Clone this repository 82 | 2. Install dependencies using `yarn install` or `npm install` 83 | 3. Prepare development server using `yarn dev:prepare` or `npm run dev:prepare` 84 | 4. Build module using `yarn build` or `npm build` 85 | 5. Launch playground using `yarn dev` or `npm run dev` 86 | 87 | ## License 88 | 89 | [MIT License](./LICENSE) 90 | -------------------------------------------------------------------------------- /src/module.ts: -------------------------------------------------------------------------------- 1 | import { fileURLToPath } from 'url' 2 | import { defu } from 'defu' 3 | import { defineNuxtModule, addPlugin, addServerHandler, createResolver, resolveModule, addTemplate, extendViteConfig } from '@nuxt/kit' 4 | import type { FirebaseOptions } from 'firebase/app' 5 | import type { CookieOptions, RedirectOptions } from './runtime/types' 6 | 7 | export interface ModuleOptions { 8 | /** 9 | * Firebase client options that are passed to `initializeApp` 10 | * @default {} 11 | * @type object 12 | * @docs https://firebase.google.com/docs/reference/js/v8/firebase#initializeapp 13 | */ 14 | config: FirebaseOptions 15 | 16 | /** 17 | * Firebase private key for firebase-admin 18 | * @default process.env.FIREBASE_PRIVATE_KEY 19 | * @example '-----BEGIN PRIVATE KEY-----\n1234=\n-----END PRIVATE KEY-----\n' 20 | * @type string 21 | * @docs https://firebase.google.com/docs/admin/setup#set-up-project-and-service-account 22 | */ 23 | privateKey: string 24 | 25 | /** 26 | * Firebase project id for firebase-admin 27 | * @default process.env.FIREBASE_PROJECT_ID 28 | * @example 'your-project' 29 | * @type string 30 | * @docs https://firebase.google.com/docs/admin/setup#set-up-project-and-service-account 31 | */ 32 | projectId: string 33 | 34 | /** 35 | * The firebase client email for firebase-admin 36 | * @default process.env.FIREBASE_CLIENT_EMAIL 37 | * @example 'firebase-adminsdk-1234@your-project.iam.gserviceaccount.com' 38 | * @type string 39 | * @docs https://firebase.google.com/docs/admin/setup#set-up-project-and-service-account 40 | */ 41 | clientEmail: string 42 | 43 | /** 44 | * Redirection options 45 | * @default false 46 | * @type object | boolean 47 | */ 48 | redirect?: RedirectOptions | boolean 49 | 50 | /** 51 | * Firebase Cookie options 52 | * @default { 53 | name: 'fb', 54 | lifetime: 60 * 60 * 8, 55 | domain: '', 56 | path: '/', 57 | sameSite: 'lax' 58 | } 59 | * @type object 60 | */ 61 | cookies?: CookieOptions 62 | } 63 | 64 | export default defineNuxtModule({ 65 | meta: { 66 | name: '@oswld/nuxt-firebase', 67 | configKey: 'firebase', 68 | compatibility: { 69 | nuxt: '^3.0.0' 70 | } 71 | }, 72 | defaults: { 73 | config: {}, 74 | privateKey: process.env.FIREBASE_PRIVATE_KEY as string, 75 | projectId: process.env.FIREBASE_PROJECT_ID as string, 76 | clientEmail: process.env.FIREBASE_CLIENT_EMAIL as string, 77 | redirect: false, 78 | cookies: { 79 | name: 'fb', 80 | lifetime: 60 * 60 * 8, 81 | domain: '', 82 | path: '/', 83 | sameSite: 'lax' 84 | } 85 | }, 86 | setup (options, nuxt) { 87 | const { resolve } = createResolver(import.meta.url) 88 | const resolveRuntimeModule = (path: string) => resolveModule(path, { paths: resolve('./runtime') }) 89 | 90 | // firebase admin available? 91 | if (!options.projectId) { 92 | // eslint-disable-next-line no-console 93 | console.warn('Missing `FIREBASE_PROJECT_ID` in `.env`. `firebase-admin` not available.') 94 | } 95 | if (!options.privateKey) { 96 | // eslint-disable-next-line no-console 97 | console.warn('Missing `FIREBASE_PRIVATE_KEY` in `.env`. `firebase-admin` not available.') 98 | } 99 | if (!options.clientEmail) { 100 | // eslint-disable-next-line no-console 101 | console.warn('Missing `FIREBASE_CLIENT_EMAIL` in `.env`. `firebase-admin` not available.') 102 | } 103 | 104 | // Public runtimeConfig 105 | nuxt.options.runtimeConfig.public.firebase = defu(nuxt.options.runtimeConfig.public.firebase, { 106 | config: options.config, 107 | redirect: options.redirect, 108 | cookies: options.cookies 109 | }) 110 | 111 | // Private runtimeConfig 112 | nuxt.options.runtimeConfig.firebase = defu(nuxt.options.runtimeConfig.firebase, { 113 | projectId: options.projectId, 114 | privateKey: options.privateKey, 115 | clientEmail: options.clientEmail 116 | }) 117 | 118 | // Transpile runtime 119 | const runtimeDir = fileURLToPath(new URL('./runtime', import.meta.url)) 120 | nuxt.options.build.transpile.push(runtimeDir) 121 | 122 | // fixes https://github.com/kai-oswald/nuxt-firebase/issues/1 123 | extendViteConfig((config) => { 124 | config.optimizeDeps = config.optimizeDeps || {} 125 | config.optimizeDeps.include = config.optimizeDeps.include || [] 126 | config.optimizeDeps.include.push('firebase/app') 127 | config.optimizeDeps.include.push('firebase/auth') 128 | config.optimizeDeps.include.push('firebase/firestore/lite') 129 | config.optimizeDeps.include.push('firebase/functions') 130 | }) 131 | 132 | // Add firebase server plugin to load the user on server-side 133 | addPlugin(resolve(runtimeDir, 'plugins', 'firebase.server')) 134 | addPlugin(resolve(runtimeDir, 'plugins', 'firebase.client')) 135 | addPlugin(resolve(runtimeDir, 'plugins', 'auth-redirect')) 136 | 137 | // Add firebase session endpoint to store the session on server-side 138 | addServerHandler({ 139 | route: '/api/_firebase/session', 140 | handler: resolve(runtimeDir, 'server/api/session') 141 | }) 142 | 143 | // Add firebase composables 144 | nuxt.hook('imports:dirs', (dirs) => { 145 | dirs.push(resolve(runtimeDir, 'composables')) 146 | }) 147 | 148 | nuxt.hook('nitro:config', (nitroConfig) => { 149 | nitroConfig.alias = nitroConfig.alias || {} 150 | 151 | // Inline module runtime in Nitro bundle 152 | nitroConfig.externals = defu(typeof nitroConfig.externals === 'object' ? nitroConfig.externals : {}, { 153 | inline: [resolve('./runtime')] 154 | }) 155 | nitroConfig.alias['#firebase/server'] = resolveRuntimeModule('./server/services') 156 | }) 157 | 158 | addTemplate({ 159 | filename: 'types/firebase.d.ts', 160 | getContents: () => [ 161 | 'declare module \'#firebase/server\' {', 162 | ` const serverFirebaseAdmin: typeof import('${resolve('./runtime/server/services')}').serverFirebaseAdmin`, 163 | ` const serverFirebaseAuth: typeof import('${resolve('./runtime/server/services')}').serverFirebaseAuth`, 164 | ` const serverFirebaseUser: typeof import('${resolve('./runtime/server/services')}').serverFirebaseUser`, 165 | '}' 166 | ].join('\n') 167 | }) 168 | 169 | nuxt.hook('prepare:types', (options) => { 170 | options.references.push({ path: resolve(nuxt.options.buildDir, 'types/firebase.d.ts') }) 171 | }) 172 | } 173 | }) 174 | -------------------------------------------------------------------------------- /playground/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nuxt-firebase-playground", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "name": "nuxt-firebase-playground", 8 | "dependencies": { 9 | "firebase": "^9.12.1" 10 | } 11 | }, 12 | "node_modules/@firebase/analytics": { 13 | "version": "0.8.3", 14 | "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.8.3.tgz", 15 | "integrity": "sha512-viGhc57JW9zHp/0JKpLBUthdpOrEjbPETQFz8oNfaNma+cHA6FtIrtg4Sla52DgqatbATcE9aIDBiPCGrCtNjw==", 16 | "dependencies": { 17 | "@firebase/component": "0.5.20", 18 | "@firebase/installations": "0.5.15", 19 | "@firebase/logger": "0.3.3", 20 | "@firebase/util": "1.7.2", 21 | "tslib": "^2.1.0" 22 | }, 23 | "peerDependencies": { 24 | "@firebase/app": "0.x" 25 | } 26 | }, 27 | "node_modules/@firebase/analytics-compat": { 28 | "version": "0.1.16", 29 | "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.16.tgz", 30 | "integrity": "sha512-mDAhE33WiyCrqSQZvzyZtQCCdf4ipn5tsEpTbIUruk7MbThQ1EbNAbPBiEk9NDLD3sUyLABZGFctvym/hc8H+w==", 31 | "dependencies": { 32 | "@firebase/analytics": "0.8.3", 33 | "@firebase/analytics-types": "0.7.0", 34 | "@firebase/component": "0.5.20", 35 | "@firebase/util": "1.7.2", 36 | "tslib": "^2.1.0" 37 | }, 38 | "peerDependencies": { 39 | "@firebase/app-compat": "0.x" 40 | } 41 | }, 42 | "node_modules/@firebase/analytics-types": { 43 | "version": "0.7.0", 44 | "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.7.0.tgz", 45 | "integrity": "sha512-DNE2Waiwy5+zZnCfintkDtBfaW6MjIG883474v6Z0K1XZIvl76cLND4iv0YUb48leyF+PJK1KO2XrgHb/KpmhQ==" 46 | }, 47 | "node_modules/@firebase/app": { 48 | "version": "0.8.2", 49 | "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.8.2.tgz", 50 | "integrity": "sha512-ByNDCe8h9O/szO3XVTrS484MtqBOKriVaNCQC7Y7KgZSaiA0OOWmIY5vwi63mBTYetqMNN5VGiG/6ZSmGIZyoQ==", 51 | "dependencies": { 52 | "@firebase/component": "0.5.20", 53 | "@firebase/logger": "0.3.3", 54 | "@firebase/util": "1.7.2", 55 | "idb": "7.0.1", 56 | "tslib": "^2.1.0" 57 | } 58 | }, 59 | "node_modules/@firebase/app-check": { 60 | "version": "0.5.15", 61 | "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.15.tgz", 62 | "integrity": "sha512-ifQalGXkXMwGR3F8Glmo1XtDg0UjkwCmI/ff05mxnKGMfs5ZDyw8DikQfna//a/KdYuOBqxlBwS2BhHiobqUUg==", 63 | "dependencies": { 64 | "@firebase/component": "0.5.20", 65 | "@firebase/logger": "0.3.3", 66 | "@firebase/util": "1.7.2", 67 | "tslib": "^2.1.0" 68 | }, 69 | "peerDependencies": { 70 | "@firebase/app": "0.x" 71 | } 72 | }, 73 | "node_modules/@firebase/app-check-compat": { 74 | "version": "0.2.15", 75 | "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.15.tgz", 76 | "integrity": "sha512-EgD1WEFwwq7aP7DxPSYuUpMt8eAhClA57976D3BaHDbH/IXEuw0DfaeT0LtBb+xJD7J8uxy+YKpudCC8gzUu8g==", 77 | "dependencies": { 78 | "@firebase/app-check": "0.5.15", 79 | "@firebase/app-check-types": "0.4.0", 80 | "@firebase/component": "0.5.20", 81 | "@firebase/logger": "0.3.3", 82 | "@firebase/util": "1.7.2", 83 | "tslib": "^2.1.0" 84 | }, 85 | "peerDependencies": { 86 | "@firebase/app-compat": "0.x" 87 | } 88 | }, 89 | "node_modules/@firebase/app-check-interop-types": { 90 | "version": "0.1.0", 91 | "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz", 92 | "integrity": "sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA==" 93 | }, 94 | "node_modules/@firebase/app-check-types": { 95 | "version": "0.4.0", 96 | "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.4.0.tgz", 97 | "integrity": "sha512-SsWafqMABIOu7zLgWbmwvHGOeQQVQlwm42kwwubsmfLmL4Sf5uGpBfDhQ0CAkpi7bkJ/NwNFKafNDL9prRNP0Q==" 98 | }, 99 | "node_modules/@firebase/app-compat": { 100 | "version": "0.1.37", 101 | "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.37.tgz", 102 | "integrity": "sha512-doTKYGlVc8ZiQNOl66rpkU/YItRyOxCgMp4YWThXkPM4T/pTi4a9IMCe8K88gVNeYWd8sKW4vSnxjcOG5hQXEA==", 103 | "dependencies": { 104 | "@firebase/app": "0.8.2", 105 | "@firebase/component": "0.5.20", 106 | "@firebase/logger": "0.3.3", 107 | "@firebase/util": "1.7.2", 108 | "tslib": "^2.1.0" 109 | } 110 | }, 111 | "node_modules/@firebase/app-types": { 112 | "version": "0.8.0", 113 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.8.0.tgz", 114 | "integrity": "sha512-Lec3VVquUwXPn2UReGSsfTxuMBVRmzGIwA/CJnF0LQuPgv9kOmXk9mVqsDMfHxHtqjai0n6wWHR2TqjdVV/bYA==" 115 | }, 116 | "node_modules/@firebase/auth": { 117 | "version": "0.20.10", 118 | "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.20.10.tgz", 119 | "integrity": "sha512-uAZypmVv/4nijaPVtR/ipjKBmSDPLQ7sNScLHs2DVhdvCklgUUF5+zsEdPlMfKDIfmVQHFwHbUgeKyXDYSRMwQ==", 120 | "dependencies": { 121 | "@firebase/component": "0.5.20", 122 | "@firebase/logger": "0.3.3", 123 | "@firebase/util": "1.7.2", 124 | "node-fetch": "2.6.7", 125 | "selenium-webdriver": "4.1.2", 126 | "tslib": "^2.1.0" 127 | }, 128 | "peerDependencies": { 129 | "@firebase/app": "0.x" 130 | } 131 | }, 132 | "node_modules/@firebase/auth-compat": { 133 | "version": "0.2.23", 134 | "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.23.tgz", 135 | "integrity": "sha512-r9YEXaL7YKoFOWHRvVoQ6d5klP+hkSsAtt21UIvP3/BxDDU+yLXN5vVvFHr38apuUeMGN34M7zkY6SihnLutIQ==", 136 | "dependencies": { 137 | "@firebase/auth": "0.20.10", 138 | "@firebase/auth-types": "0.11.0", 139 | "@firebase/component": "0.5.20", 140 | "@firebase/util": "1.7.2", 141 | "node-fetch": "2.6.7", 142 | "selenium-webdriver": "4.1.2", 143 | "tslib": "^2.1.0" 144 | }, 145 | "peerDependencies": { 146 | "@firebase/app-compat": "0.x" 147 | } 148 | }, 149 | "node_modules/@firebase/auth-interop-types": { 150 | "version": "0.1.6", 151 | "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", 152 | "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==", 153 | "peerDependencies": { 154 | "@firebase/app-types": "0.x", 155 | "@firebase/util": "1.x" 156 | } 157 | }, 158 | "node_modules/@firebase/auth-types": { 159 | "version": "0.11.0", 160 | "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.11.0.tgz", 161 | "integrity": "sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw==", 162 | "peerDependencies": { 163 | "@firebase/app-types": "0.x", 164 | "@firebase/util": "1.x" 165 | } 166 | }, 167 | "node_modules/@firebase/component": { 168 | "version": "0.5.20", 169 | "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.20.tgz", 170 | "integrity": "sha512-wP51tQBlPFprfAWxWjzC/56hG4APhl43jFsgwuqCl3bhVbiKcr278QbrbGNmIXDeGKo4sGZLAnH9whl2apeCmA==", 171 | "dependencies": { 172 | "@firebase/util": "1.7.2", 173 | "tslib": "^2.1.0" 174 | } 175 | }, 176 | "node_modules/@firebase/database": { 177 | "version": "0.13.9", 178 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.13.9.tgz", 179 | "integrity": "sha512-raQEBgQQybaEoMloJL8wWHQywGQ9mF2VbitvHydsbSNn+KL/xRDjXeQZPuuSbRjkYV6mR8jvQB7gpnzQQNE8Qg==", 180 | "dependencies": { 181 | "@firebase/auth-interop-types": "0.1.6", 182 | "@firebase/component": "0.5.20", 183 | "@firebase/logger": "0.3.3", 184 | "@firebase/util": "1.7.2", 185 | "faye-websocket": "0.11.4", 186 | "tslib": "^2.1.0" 187 | } 188 | }, 189 | "node_modules/@firebase/database-compat": { 190 | "version": "0.2.9", 191 | "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.2.9.tgz", 192 | "integrity": "sha512-zzyFM3+jW/qYtHojiQirHXGXYyElbqVngEEn/i2gXoSzcK0Y2AL5oHAqGYXLaaW0+t4Zwnssh3HnQJM8C1D0fw==", 193 | "dependencies": { 194 | "@firebase/component": "0.5.20", 195 | "@firebase/database": "0.13.9", 196 | "@firebase/database-types": "0.9.16", 197 | "@firebase/logger": "0.3.3", 198 | "@firebase/util": "1.7.2", 199 | "tslib": "^2.1.0" 200 | } 201 | }, 202 | "node_modules/@firebase/database-types": { 203 | "version": "0.9.16", 204 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.16.tgz", 205 | "integrity": "sha512-dK/uFgHisrVijSoHf9RLJ7NwvlOul2rO/z9ufOSbGd8/TqFVASXz+19mynhDIoSEnyQtJC/NTyBzSPfjz0w61w==", 206 | "dependencies": { 207 | "@firebase/app-types": "0.8.0", 208 | "@firebase/util": "1.7.2" 209 | } 210 | }, 211 | "node_modules/@firebase/firestore": { 212 | "version": "3.7.1", 213 | "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.7.1.tgz", 214 | "integrity": "sha512-sDZ79cUf4cwCyRzN74zODgaeUvyt0lGA8YwaasVVqojgznwMG/bIz+/Tny4ZEnLZFrlniCqt2tStWsiC6s3u7g==", 215 | "dependencies": { 216 | "@firebase/component": "0.5.20", 217 | "@firebase/logger": "0.3.3", 218 | "@firebase/util": "1.7.2", 219 | "@firebase/webchannel-wrapper": "0.8.0", 220 | "@grpc/grpc-js": "^1.3.2", 221 | "@grpc/proto-loader": "^0.6.13", 222 | "node-fetch": "2.6.7", 223 | "tslib": "^2.1.0" 224 | }, 225 | "engines": { 226 | "node": ">=10.10.0" 227 | }, 228 | "peerDependencies": { 229 | "@firebase/app": "0.x" 230 | } 231 | }, 232 | "node_modules/@firebase/firestore-compat": { 233 | "version": "0.2.1", 234 | "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.2.1.tgz", 235 | "integrity": "sha512-XiiTpmUfyZ6QU3Dw9BCT4T+KPvqzada1GsUNX49HmriWHpIn3jTAjsagkigRAnmNDlxS3ki6Yzg9Cs60tpD0tw==", 236 | "dependencies": { 237 | "@firebase/component": "0.5.20", 238 | "@firebase/firestore": "3.7.1", 239 | "@firebase/firestore-types": "2.5.0", 240 | "@firebase/util": "1.7.2", 241 | "tslib": "^2.1.0" 242 | }, 243 | "peerDependencies": { 244 | "@firebase/app-compat": "0.x" 245 | } 246 | }, 247 | "node_modules/@firebase/firestore-types": { 248 | "version": "2.5.0", 249 | "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.0.tgz", 250 | "integrity": "sha512-I6c2m1zUhZ5SH0cWPmINabDyH5w0PPFHk2UHsjBpKdZllzJZ2TwTkXbDtpHUZNmnc/zAa0WNMNMvcvbb/xJLKA==", 251 | "peerDependencies": { 252 | "@firebase/app-types": "0.x", 253 | "@firebase/util": "1.x" 254 | } 255 | }, 256 | "node_modules/@firebase/functions": { 257 | "version": "0.8.7", 258 | "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.8.7.tgz", 259 | "integrity": "sha512-JHSKdAOzlFJ9NdKoOaq4x6S1q6B3GmYZDg13KIDsE6BC0E9o/eWxOWOjSFJRCP/lpfFwa0rYBRayfUvZxW3BLw==", 260 | "dependencies": { 261 | "@firebase/app-check-interop-types": "0.1.0", 262 | "@firebase/auth-interop-types": "0.1.6", 263 | "@firebase/component": "0.5.20", 264 | "@firebase/messaging-interop-types": "0.1.0", 265 | "@firebase/util": "1.7.2", 266 | "node-fetch": "2.6.7", 267 | "tslib": "^2.1.0" 268 | }, 269 | "peerDependencies": { 270 | "@firebase/app": "0.x" 271 | } 272 | }, 273 | "node_modules/@firebase/functions-compat": { 274 | "version": "0.2.7", 275 | "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.2.7.tgz", 276 | "integrity": "sha512-bcUst8ZDJHeVy2Wox4KEM5EizsrrqLzbwFIwJD7KkuSYP8XrlV2gaqJnCvIXXc0Nc4JRGvbXcvFFMXDjhsEp4Q==", 277 | "dependencies": { 278 | "@firebase/component": "0.5.20", 279 | "@firebase/functions": "0.8.7", 280 | "@firebase/functions-types": "0.5.0", 281 | "@firebase/util": "1.7.2", 282 | "tslib": "^2.1.0" 283 | }, 284 | "peerDependencies": { 285 | "@firebase/app-compat": "0.x" 286 | } 287 | }, 288 | "node_modules/@firebase/functions-types": { 289 | "version": "0.5.0", 290 | "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.5.0.tgz", 291 | "integrity": "sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA==" 292 | }, 293 | "node_modules/@firebase/installations": { 294 | "version": "0.5.15", 295 | "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.15.tgz", 296 | "integrity": "sha512-RVm2nc2d+bEDFzFzQDTTU1Z13fjAD0v88yDLjtRZuT2R7JwvAegQ4F7CupBvnnf7nftkd3kBwdOi8MhMthb3jQ==", 297 | "dependencies": { 298 | "@firebase/component": "0.5.20", 299 | "@firebase/util": "1.7.2", 300 | "idb": "7.0.1", 301 | "tslib": "^2.1.0" 302 | }, 303 | "peerDependencies": { 304 | "@firebase/app": "0.x" 305 | } 306 | }, 307 | "node_modules/@firebase/installations-compat": { 308 | "version": "0.1.15", 309 | "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.1.15.tgz", 310 | "integrity": "sha512-m0atyudsVj6ekmM+djhhzzInMC3Y233YJky9vXUVt5MHQY0mHhqDds9+UIrCa6cpbl+ntI2fOuoYV7y01s3sfw==", 311 | "dependencies": { 312 | "@firebase/component": "0.5.20", 313 | "@firebase/installations": "0.5.15", 314 | "@firebase/installations-types": "0.4.0", 315 | "@firebase/util": "1.7.2", 316 | "tslib": "^2.1.0" 317 | }, 318 | "peerDependencies": { 319 | "@firebase/app-compat": "0.x" 320 | } 321 | }, 322 | "node_modules/@firebase/installations-types": { 323 | "version": "0.4.0", 324 | "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.4.0.tgz", 325 | "integrity": "sha512-nXxWKQDvBGctuvsizbUEJKfxXU9WAaDhon+j0jpjIfOJkvkj3YHqlLB/HeYjpUn85Pb22BjplpTnDn4Gm9pc3A==", 326 | "peerDependencies": { 327 | "@firebase/app-types": "0.x" 328 | } 329 | }, 330 | "node_modules/@firebase/logger": { 331 | "version": "0.3.3", 332 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.3.tgz", 333 | "integrity": "sha512-POTJl07jOKTOevLXrTvJD/VZ0M6PnJXflbAh5J9VGkmtXPXNG6MdZ9fmRgqYhXKTaDId6AQenQ262uwgpdtO0Q==", 334 | "dependencies": { 335 | "tslib": "^2.1.0" 336 | } 337 | }, 338 | "node_modules/@firebase/messaging": { 339 | "version": "0.9.19", 340 | "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.9.19.tgz", 341 | "integrity": "sha512-xu99y/7/P+y3txGtgjsVJZyvx7T5/KdvFgDWS7oZwhKYG0o+DXFvvw3SBMK82LFGFOoyHlJUPqv45EyCPnOPCA==", 342 | "dependencies": { 343 | "@firebase/component": "0.5.20", 344 | "@firebase/installations": "0.5.15", 345 | "@firebase/messaging-interop-types": "0.1.0", 346 | "@firebase/util": "1.7.2", 347 | "idb": "7.0.1", 348 | "tslib": "^2.1.0" 349 | }, 350 | "peerDependencies": { 351 | "@firebase/app": "0.x" 352 | } 353 | }, 354 | "node_modules/@firebase/messaging-compat": { 355 | "version": "0.1.19", 356 | "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.19.tgz", 357 | "integrity": "sha512-h5tx4nxfSILeRquk5mKE8Onu7WtL6b7rfB6GKNJKecvkPs3nnq5Z4cp2Av4JUR2Wtt9UxCTfO0iRbbmtrt2bZQ==", 358 | "dependencies": { 359 | "@firebase/component": "0.5.20", 360 | "@firebase/messaging": "0.9.19", 361 | "@firebase/util": "1.7.2", 362 | "tslib": "^2.1.0" 363 | }, 364 | "peerDependencies": { 365 | "@firebase/app-compat": "0.x" 366 | } 367 | }, 368 | "node_modules/@firebase/messaging-interop-types": { 369 | "version": "0.1.0", 370 | "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.0.tgz", 371 | "integrity": "sha512-DbvUl/rXAZpQeKBnwz0NYY5OCqr2nFA0Bj28Fmr3NXGqR4PAkfTOHuQlVtLO1Nudo3q0HxAYLa68ZDAcuv2uKQ==" 372 | }, 373 | "node_modules/@firebase/performance": { 374 | "version": "0.5.15", 375 | "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.15.tgz", 376 | "integrity": "sha512-YnnkUehXXzqQefNE5PlPEsXeJYSeY7cMWEdHYTj6u0/F5ntLSAhVZC8jl3Y0fTU1W8a9USQhml6NaXyWiVGmjQ==", 377 | "dependencies": { 378 | "@firebase/component": "0.5.20", 379 | "@firebase/installations": "0.5.15", 380 | "@firebase/logger": "0.3.3", 381 | "@firebase/util": "1.7.2", 382 | "tslib": "^2.1.0" 383 | }, 384 | "peerDependencies": { 385 | "@firebase/app": "0.x" 386 | } 387 | }, 388 | "node_modules/@firebase/performance-compat": { 389 | "version": "0.1.15", 390 | "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.15.tgz", 391 | "integrity": "sha512-mryHr5eBEpWxBo8b3KM/53SwwVjMVahwdEnhfx1r+zAvmEPEzXUOGBzAC1l5WQ4DrwtDR87uMZ5soiQ/0jl9QQ==", 392 | "dependencies": { 393 | "@firebase/component": "0.5.20", 394 | "@firebase/logger": "0.3.3", 395 | "@firebase/performance": "0.5.15", 396 | "@firebase/performance-types": "0.1.0", 397 | "@firebase/util": "1.7.2", 398 | "tslib": "^2.1.0" 399 | }, 400 | "peerDependencies": { 401 | "@firebase/app-compat": "0.x" 402 | } 403 | }, 404 | "node_modules/@firebase/performance-types": { 405 | "version": "0.1.0", 406 | "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.1.0.tgz", 407 | "integrity": "sha512-6p1HxrH0mpx+622Ql6fcxFxfkYSBpE3LSuwM7iTtYU2nw91Hj6THC8Bc8z4nboIq7WvgsT/kOTYVVZzCSlXl8w==" 408 | }, 409 | "node_modules/@firebase/remote-config": { 410 | "version": "0.3.14", 411 | "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.14.tgz", 412 | "integrity": "sha512-wEOz3Tasxhr5lCGioe0WNZwDOoQhNZK2qGAm5+AlHAPaAhWIWvqUTkKsk3nFRztyRZzj3r9k5Gc2OSpEcQKP1A==", 413 | "dependencies": { 414 | "@firebase/component": "0.5.20", 415 | "@firebase/installations": "0.5.15", 416 | "@firebase/logger": "0.3.3", 417 | "@firebase/util": "1.7.2", 418 | "tslib": "^2.1.0" 419 | }, 420 | "peerDependencies": { 421 | "@firebase/app": "0.x" 422 | } 423 | }, 424 | "node_modules/@firebase/remote-config-compat": { 425 | "version": "0.1.15", 426 | "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.15.tgz", 427 | "integrity": "sha512-jGUrZXIxQRMeSrqEaCi3MtMF33NN12TNTQDZlbex2+T2+yTMI/sn3Mq52T/OccCo86DK17WVlXSWQCH1zCD13g==", 428 | "dependencies": { 429 | "@firebase/component": "0.5.20", 430 | "@firebase/logger": "0.3.3", 431 | "@firebase/remote-config": "0.3.14", 432 | "@firebase/remote-config-types": "0.2.0", 433 | "@firebase/util": "1.7.2", 434 | "tslib": "^2.1.0" 435 | }, 436 | "peerDependencies": { 437 | "@firebase/app-compat": "0.x" 438 | } 439 | }, 440 | "node_modules/@firebase/remote-config-types": { 441 | "version": "0.2.0", 442 | "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.2.0.tgz", 443 | "integrity": "sha512-hqK5sCPeZvcHQ1D6VjJZdW6EexLTXNMJfPdTwbD8NrXUw6UjWC4KWhLK/TSlL0QPsQtcKRkaaoP+9QCgKfMFPw==" 444 | }, 445 | "node_modules/@firebase/storage": { 446 | "version": "0.9.12", 447 | "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.12.tgz", 448 | "integrity": "sha512-XIAmje0ufvRrxrUU/9tvGCuUIy7WSJf3XM8Y8OV9EW2Dg1w4f8IpraLiUdlirdtFM0UAnO2kDQHoiVQYhRrADQ==", 449 | "dependencies": { 450 | "@firebase/component": "0.5.20", 451 | "@firebase/util": "1.7.2", 452 | "node-fetch": "2.6.7", 453 | "tslib": "^2.1.0" 454 | }, 455 | "peerDependencies": { 456 | "@firebase/app": "0.x" 457 | } 458 | }, 459 | "node_modules/@firebase/storage-compat": { 460 | "version": "0.1.20", 461 | "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.20.tgz", 462 | "integrity": "sha512-8vruwltKdvEPhYbPXA/otb5fAD7MGsBHpCzktJWvF7eIALa4sUlYt+jJxG5Nwk2FoT1NrwLQ7TtI7zvm6/NinA==", 463 | "dependencies": { 464 | "@firebase/component": "0.5.20", 465 | "@firebase/storage": "0.9.12", 466 | "@firebase/storage-types": "0.6.0", 467 | "@firebase/util": "1.7.2", 468 | "tslib": "^2.1.0" 469 | }, 470 | "peerDependencies": { 471 | "@firebase/app-compat": "0.x" 472 | } 473 | }, 474 | "node_modules/@firebase/storage-types": { 475 | "version": "0.6.0", 476 | "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.6.0.tgz", 477 | "integrity": "sha512-1LpWhcCb1ftpkP/akhzjzeFxgVefs6eMD2QeKiJJUGH1qOiows2w5o0sKCUSQrvrRQS1lz3SFGvNR1Ck/gqxeA==", 478 | "peerDependencies": { 479 | "@firebase/app-types": "0.x", 480 | "@firebase/util": "1.x" 481 | } 482 | }, 483 | "node_modules/@firebase/util": { 484 | "version": "1.7.2", 485 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.7.2.tgz", 486 | "integrity": "sha512-P3aTihYEMoz2QQlcn0T7av7HLEK9gsTc1ZiN9VA8wnUtEJscUNemCmTmP3RRysqEb3Z+tVVoycztY8f6R36rRw==", 487 | "dependencies": { 488 | "tslib": "^2.1.0" 489 | } 490 | }, 491 | "node_modules/@firebase/webchannel-wrapper": { 492 | "version": "0.8.0", 493 | "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.8.0.tgz", 494 | "integrity": "sha512-Q8erQds5LuAUgNuFOt/tu/abffYUHYxN+Ogp2V5EOssfFG7Ja4ce324Sqyq41u/vB5CSr+tfYS3JzTDrDxCvdw==" 495 | }, 496 | "node_modules/@grpc/grpc-js": { 497 | "version": "1.7.3", 498 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.3.tgz", 499 | "integrity": "sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==", 500 | "dependencies": { 501 | "@grpc/proto-loader": "^0.7.0", 502 | "@types/node": ">=12.12.47" 503 | }, 504 | "engines": { 505 | "node": "^8.13.0 || >=10.10.0" 506 | } 507 | }, 508 | "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { 509 | "version": "0.7.3", 510 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.3.tgz", 511 | "integrity": "sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA==", 512 | "dependencies": { 513 | "@types/long": "^4.0.1", 514 | "lodash.camelcase": "^4.3.0", 515 | "long": "^4.0.0", 516 | "protobufjs": "^7.0.0", 517 | "yargs": "^16.2.0" 518 | }, 519 | "bin": { 520 | "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" 521 | }, 522 | "engines": { 523 | "node": ">=6" 524 | } 525 | }, 526 | "node_modules/@grpc/grpc-js/node_modules/protobufjs": { 527 | "version": "7.1.2", 528 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.1.2.tgz", 529 | "integrity": "sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ==", 530 | "hasInstallScript": true, 531 | "dependencies": { 532 | "@protobufjs/aspromise": "^1.1.2", 533 | "@protobufjs/base64": "^1.1.2", 534 | "@protobufjs/codegen": "^2.0.4", 535 | "@protobufjs/eventemitter": "^1.1.0", 536 | "@protobufjs/fetch": "^1.1.0", 537 | "@protobufjs/float": "^1.0.2", 538 | "@protobufjs/inquire": "^1.1.0", 539 | "@protobufjs/path": "^1.1.2", 540 | "@protobufjs/pool": "^1.1.0", 541 | "@protobufjs/utf8": "^1.1.0", 542 | "@types/node": ">=13.7.0", 543 | "long": "^5.0.0" 544 | }, 545 | "engines": { 546 | "node": ">=12.0.0" 547 | } 548 | }, 549 | "node_modules/@grpc/grpc-js/node_modules/protobufjs/node_modules/long": { 550 | "version": "5.2.0", 551 | "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", 552 | "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==" 553 | }, 554 | "node_modules/@grpc/proto-loader": { 555 | "version": "0.6.13", 556 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", 557 | "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", 558 | "dependencies": { 559 | "@types/long": "^4.0.1", 560 | "lodash.camelcase": "^4.3.0", 561 | "long": "^4.0.0", 562 | "protobufjs": "^6.11.3", 563 | "yargs": "^16.2.0" 564 | }, 565 | "bin": { 566 | "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" 567 | }, 568 | "engines": { 569 | "node": ">=6" 570 | } 571 | }, 572 | "node_modules/@protobufjs/aspromise": { 573 | "version": "1.1.2", 574 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 575 | "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" 576 | }, 577 | "node_modules/@protobufjs/base64": { 578 | "version": "1.1.2", 579 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 580 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 581 | }, 582 | "node_modules/@protobufjs/codegen": { 583 | "version": "2.0.4", 584 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 585 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 586 | }, 587 | "node_modules/@protobufjs/eventemitter": { 588 | "version": "1.1.0", 589 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 590 | "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" 591 | }, 592 | "node_modules/@protobufjs/fetch": { 593 | "version": "1.1.0", 594 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 595 | "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", 596 | "dependencies": { 597 | "@protobufjs/aspromise": "^1.1.1", 598 | "@protobufjs/inquire": "^1.1.0" 599 | } 600 | }, 601 | "node_modules/@protobufjs/float": { 602 | "version": "1.0.2", 603 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 604 | "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" 605 | }, 606 | "node_modules/@protobufjs/inquire": { 607 | "version": "1.1.0", 608 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 609 | "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" 610 | }, 611 | "node_modules/@protobufjs/path": { 612 | "version": "1.1.2", 613 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 614 | "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" 615 | }, 616 | "node_modules/@protobufjs/pool": { 617 | "version": "1.1.0", 618 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 619 | "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" 620 | }, 621 | "node_modules/@protobufjs/utf8": { 622 | "version": "1.1.0", 623 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 624 | "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" 625 | }, 626 | "node_modules/@types/long": { 627 | "version": "4.0.2", 628 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", 629 | "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" 630 | }, 631 | "node_modules/@types/node": { 632 | "version": "18.11.3", 633 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz", 634 | "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==" 635 | }, 636 | "node_modules/ansi-regex": { 637 | "version": "5.0.1", 638 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 639 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 640 | "engines": { 641 | "node": ">=8" 642 | } 643 | }, 644 | "node_modules/ansi-styles": { 645 | "version": "4.3.0", 646 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 647 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 648 | "dependencies": { 649 | "color-convert": "^2.0.1" 650 | }, 651 | "engines": { 652 | "node": ">=8" 653 | }, 654 | "funding": { 655 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 656 | } 657 | }, 658 | "node_modules/balanced-match": { 659 | "version": "1.0.2", 660 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 661 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 662 | }, 663 | "node_modules/brace-expansion": { 664 | "version": "1.1.11", 665 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 666 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 667 | "dependencies": { 668 | "balanced-match": "^1.0.0", 669 | "concat-map": "0.0.1" 670 | } 671 | }, 672 | "node_modules/cliui": { 673 | "version": "7.0.4", 674 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 675 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 676 | "dependencies": { 677 | "string-width": "^4.2.0", 678 | "strip-ansi": "^6.0.0", 679 | "wrap-ansi": "^7.0.0" 680 | } 681 | }, 682 | "node_modules/color-convert": { 683 | "version": "2.0.1", 684 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 685 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 686 | "dependencies": { 687 | "color-name": "~1.1.4" 688 | }, 689 | "engines": { 690 | "node": ">=7.0.0" 691 | } 692 | }, 693 | "node_modules/color-name": { 694 | "version": "1.1.4", 695 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 696 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 697 | }, 698 | "node_modules/concat-map": { 699 | "version": "0.0.1", 700 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 701 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 702 | }, 703 | "node_modules/core-util-is": { 704 | "version": "1.0.3", 705 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 706 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 707 | }, 708 | "node_modules/emoji-regex": { 709 | "version": "8.0.0", 710 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 711 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 712 | }, 713 | "node_modules/escalade": { 714 | "version": "3.1.1", 715 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 716 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 717 | "engines": { 718 | "node": ">=6" 719 | } 720 | }, 721 | "node_modules/faye-websocket": { 722 | "version": "0.11.4", 723 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", 724 | "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", 725 | "dependencies": { 726 | "websocket-driver": ">=0.5.1" 727 | }, 728 | "engines": { 729 | "node": ">=0.8.0" 730 | } 731 | }, 732 | "node_modules/firebase": { 733 | "version": "9.12.1", 734 | "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.12.1.tgz", 735 | "integrity": "sha512-sBp4rvkCC7TUnGeneRNs6GVcajO+iSXmYjxqXN4FsrBzldJ5/AOnDXf4bi9OUZtQSl+EHDgUWShBieht15ijgQ==", 736 | "dependencies": { 737 | "@firebase/analytics": "0.8.3", 738 | "@firebase/analytics-compat": "0.1.16", 739 | "@firebase/app": "0.8.2", 740 | "@firebase/app-check": "0.5.15", 741 | "@firebase/app-check-compat": "0.2.15", 742 | "@firebase/app-compat": "0.1.37", 743 | "@firebase/app-types": "0.8.0", 744 | "@firebase/auth": "0.20.10", 745 | "@firebase/auth-compat": "0.2.23", 746 | "@firebase/database": "0.13.9", 747 | "@firebase/database-compat": "0.2.9", 748 | "@firebase/firestore": "3.7.1", 749 | "@firebase/firestore-compat": "0.2.1", 750 | "@firebase/functions": "0.8.7", 751 | "@firebase/functions-compat": "0.2.7", 752 | "@firebase/installations": "0.5.15", 753 | "@firebase/installations-compat": "0.1.15", 754 | "@firebase/messaging": "0.9.19", 755 | "@firebase/messaging-compat": "0.1.19", 756 | "@firebase/performance": "0.5.15", 757 | "@firebase/performance-compat": "0.1.15", 758 | "@firebase/remote-config": "0.3.14", 759 | "@firebase/remote-config-compat": "0.1.15", 760 | "@firebase/storage": "0.9.12", 761 | "@firebase/storage-compat": "0.1.20", 762 | "@firebase/util": "1.7.2" 763 | } 764 | }, 765 | "node_modules/fs.realpath": { 766 | "version": "1.0.0", 767 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 768 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 769 | }, 770 | "node_modules/get-caller-file": { 771 | "version": "2.0.5", 772 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 773 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 774 | "engines": { 775 | "node": "6.* || 8.* || >= 10.*" 776 | } 777 | }, 778 | "node_modules/glob": { 779 | "version": "7.2.3", 780 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 781 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 782 | "dependencies": { 783 | "fs.realpath": "^1.0.0", 784 | "inflight": "^1.0.4", 785 | "inherits": "2", 786 | "minimatch": "^3.1.1", 787 | "once": "^1.3.0", 788 | "path-is-absolute": "^1.0.0" 789 | }, 790 | "engines": { 791 | "node": "*" 792 | }, 793 | "funding": { 794 | "url": "https://github.com/sponsors/isaacs" 795 | } 796 | }, 797 | "node_modules/http-parser-js": { 798 | "version": "0.5.8", 799 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", 800 | "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" 801 | }, 802 | "node_modules/idb": { 803 | "version": "7.0.1", 804 | "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", 805 | "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" 806 | }, 807 | "node_modules/immediate": { 808 | "version": "3.0.6", 809 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 810 | "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" 811 | }, 812 | "node_modules/inflight": { 813 | "version": "1.0.6", 814 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 815 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 816 | "dependencies": { 817 | "once": "^1.3.0", 818 | "wrappy": "1" 819 | } 820 | }, 821 | "node_modules/inherits": { 822 | "version": "2.0.4", 823 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 824 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 825 | }, 826 | "node_modules/is-fullwidth-code-point": { 827 | "version": "3.0.0", 828 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 829 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 830 | "engines": { 831 | "node": ">=8" 832 | } 833 | }, 834 | "node_modules/isarray": { 835 | "version": "1.0.0", 836 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 837 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 838 | }, 839 | "node_modules/jszip": { 840 | "version": "3.10.1", 841 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", 842 | "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", 843 | "dependencies": { 844 | "lie": "~3.3.0", 845 | "pako": "~1.0.2", 846 | "readable-stream": "~2.3.6", 847 | "setimmediate": "^1.0.5" 848 | } 849 | }, 850 | "node_modules/lie": { 851 | "version": "3.3.0", 852 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 853 | "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 854 | "dependencies": { 855 | "immediate": "~3.0.5" 856 | } 857 | }, 858 | "node_modules/lodash.camelcase": { 859 | "version": "4.3.0", 860 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 861 | "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" 862 | }, 863 | "node_modules/long": { 864 | "version": "4.0.0", 865 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 866 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 867 | }, 868 | "node_modules/minimatch": { 869 | "version": "3.1.2", 870 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 871 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 872 | "dependencies": { 873 | "brace-expansion": "^1.1.7" 874 | }, 875 | "engines": { 876 | "node": "*" 877 | } 878 | }, 879 | "node_modules/node-fetch": { 880 | "version": "2.6.7", 881 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 882 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 883 | "dependencies": { 884 | "whatwg-url": "^5.0.0" 885 | }, 886 | "engines": { 887 | "node": "4.x || >=6.0.0" 888 | }, 889 | "peerDependencies": { 890 | "encoding": "^0.1.0" 891 | }, 892 | "peerDependenciesMeta": { 893 | "encoding": { 894 | "optional": true 895 | } 896 | } 897 | }, 898 | "node_modules/once": { 899 | "version": "1.4.0", 900 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 901 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 902 | "dependencies": { 903 | "wrappy": "1" 904 | } 905 | }, 906 | "node_modules/pako": { 907 | "version": "1.0.11", 908 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 909 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 910 | }, 911 | "node_modules/path-is-absolute": { 912 | "version": "1.0.1", 913 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 914 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 915 | "engines": { 916 | "node": ">=0.10.0" 917 | } 918 | }, 919 | "node_modules/process-nextick-args": { 920 | "version": "2.0.1", 921 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 922 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 923 | }, 924 | "node_modules/protobufjs": { 925 | "version": "6.11.3", 926 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", 927 | "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", 928 | "hasInstallScript": true, 929 | "dependencies": { 930 | "@protobufjs/aspromise": "^1.1.2", 931 | "@protobufjs/base64": "^1.1.2", 932 | "@protobufjs/codegen": "^2.0.4", 933 | "@protobufjs/eventemitter": "^1.1.0", 934 | "@protobufjs/fetch": "^1.1.0", 935 | "@protobufjs/float": "^1.0.2", 936 | "@protobufjs/inquire": "^1.1.0", 937 | "@protobufjs/path": "^1.1.2", 938 | "@protobufjs/pool": "^1.1.0", 939 | "@protobufjs/utf8": "^1.1.0", 940 | "@types/long": "^4.0.1", 941 | "@types/node": ">=13.7.0", 942 | "long": "^4.0.0" 943 | }, 944 | "bin": { 945 | "pbjs": "bin/pbjs", 946 | "pbts": "bin/pbts" 947 | } 948 | }, 949 | "node_modules/readable-stream": { 950 | "version": "2.3.7", 951 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 952 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 953 | "dependencies": { 954 | "core-util-is": "~1.0.0", 955 | "inherits": "~2.0.3", 956 | "isarray": "~1.0.0", 957 | "process-nextick-args": "~2.0.0", 958 | "safe-buffer": "~5.1.1", 959 | "string_decoder": "~1.1.1", 960 | "util-deprecate": "~1.0.1" 961 | } 962 | }, 963 | "node_modules/require-directory": { 964 | "version": "2.1.1", 965 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 966 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 967 | "engines": { 968 | "node": ">=0.10.0" 969 | } 970 | }, 971 | "node_modules/rimraf": { 972 | "version": "3.0.2", 973 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 974 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 975 | "dependencies": { 976 | "glob": "^7.1.3" 977 | }, 978 | "bin": { 979 | "rimraf": "bin.js" 980 | }, 981 | "funding": { 982 | "url": "https://github.com/sponsors/isaacs" 983 | } 984 | }, 985 | "node_modules/safe-buffer": { 986 | "version": "5.1.2", 987 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 988 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 989 | }, 990 | "node_modules/selenium-webdriver": { 991 | "version": "4.1.2", 992 | "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.1.2.tgz", 993 | "integrity": "sha512-e4Ap8vQvhipgBB8Ry9zBiKGkU6kHKyNnWiavGGLKkrdW81Zv7NVMtFOL/j3yX0G8QScM7XIXijKssNd4EUxSOw==", 994 | "dependencies": { 995 | "jszip": "^3.6.0", 996 | "tmp": "^0.2.1", 997 | "ws": ">=7.4.6" 998 | }, 999 | "engines": { 1000 | "node": ">= 10.15.0" 1001 | } 1002 | }, 1003 | "node_modules/setimmediate": { 1004 | "version": "1.0.5", 1005 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 1006 | "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" 1007 | }, 1008 | "node_modules/string_decoder": { 1009 | "version": "1.1.1", 1010 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1011 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1012 | "dependencies": { 1013 | "safe-buffer": "~5.1.0" 1014 | } 1015 | }, 1016 | "node_modules/string-width": { 1017 | "version": "4.2.3", 1018 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1019 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1020 | "dependencies": { 1021 | "emoji-regex": "^8.0.0", 1022 | "is-fullwidth-code-point": "^3.0.0", 1023 | "strip-ansi": "^6.0.1" 1024 | }, 1025 | "engines": { 1026 | "node": ">=8" 1027 | } 1028 | }, 1029 | "node_modules/strip-ansi": { 1030 | "version": "6.0.1", 1031 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1032 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1033 | "dependencies": { 1034 | "ansi-regex": "^5.0.1" 1035 | }, 1036 | "engines": { 1037 | "node": ">=8" 1038 | } 1039 | }, 1040 | "node_modules/tmp": { 1041 | "version": "0.2.1", 1042 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", 1043 | "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", 1044 | "dependencies": { 1045 | "rimraf": "^3.0.0" 1046 | }, 1047 | "engines": { 1048 | "node": ">=8.17.0" 1049 | } 1050 | }, 1051 | "node_modules/tr46": { 1052 | "version": "0.0.3", 1053 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1054 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 1055 | }, 1056 | "node_modules/tslib": { 1057 | "version": "2.4.0", 1058 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 1059 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" 1060 | }, 1061 | "node_modules/util-deprecate": { 1062 | "version": "1.0.2", 1063 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1064 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1065 | }, 1066 | "node_modules/webidl-conversions": { 1067 | "version": "3.0.1", 1068 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1069 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 1070 | }, 1071 | "node_modules/websocket-driver": { 1072 | "version": "0.7.4", 1073 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", 1074 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", 1075 | "dependencies": { 1076 | "http-parser-js": ">=0.5.1", 1077 | "safe-buffer": ">=5.1.0", 1078 | "websocket-extensions": ">=0.1.1" 1079 | }, 1080 | "engines": { 1081 | "node": ">=0.8.0" 1082 | } 1083 | }, 1084 | "node_modules/websocket-extensions": { 1085 | "version": "0.1.4", 1086 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", 1087 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", 1088 | "engines": { 1089 | "node": ">=0.8.0" 1090 | } 1091 | }, 1092 | "node_modules/whatwg-url": { 1093 | "version": "5.0.0", 1094 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1095 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1096 | "dependencies": { 1097 | "tr46": "~0.0.3", 1098 | "webidl-conversions": "^3.0.0" 1099 | } 1100 | }, 1101 | "node_modules/wrap-ansi": { 1102 | "version": "7.0.0", 1103 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1104 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1105 | "dependencies": { 1106 | "ansi-styles": "^4.0.0", 1107 | "string-width": "^4.1.0", 1108 | "strip-ansi": "^6.0.0" 1109 | }, 1110 | "engines": { 1111 | "node": ">=10" 1112 | }, 1113 | "funding": { 1114 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1115 | } 1116 | }, 1117 | "node_modules/wrappy": { 1118 | "version": "1.0.2", 1119 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1120 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1121 | }, 1122 | "node_modules/ws": { 1123 | "version": "8.9.0", 1124 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", 1125 | "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", 1126 | "engines": { 1127 | "node": ">=10.0.0" 1128 | }, 1129 | "peerDependencies": { 1130 | "bufferutil": "^4.0.1", 1131 | "utf-8-validate": "^5.0.2" 1132 | }, 1133 | "peerDependenciesMeta": { 1134 | "bufferutil": { 1135 | "optional": true 1136 | }, 1137 | "utf-8-validate": { 1138 | "optional": true 1139 | } 1140 | } 1141 | }, 1142 | "node_modules/y18n": { 1143 | "version": "5.0.8", 1144 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1145 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1146 | "engines": { 1147 | "node": ">=10" 1148 | } 1149 | }, 1150 | "node_modules/yargs": { 1151 | "version": "16.2.0", 1152 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1153 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1154 | "dependencies": { 1155 | "cliui": "^7.0.2", 1156 | "escalade": "^3.1.1", 1157 | "get-caller-file": "^2.0.5", 1158 | "require-directory": "^2.1.1", 1159 | "string-width": "^4.2.0", 1160 | "y18n": "^5.0.5", 1161 | "yargs-parser": "^20.2.2" 1162 | }, 1163 | "engines": { 1164 | "node": ">=10" 1165 | } 1166 | }, 1167 | "node_modules/yargs-parser": { 1168 | "version": "20.2.9", 1169 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1170 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 1171 | "engines": { 1172 | "node": ">=10" 1173 | } 1174 | } 1175 | }, 1176 | "dependencies": { 1177 | "@firebase/analytics": { 1178 | "version": "0.8.3", 1179 | "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.8.3.tgz", 1180 | "integrity": "sha512-viGhc57JW9zHp/0JKpLBUthdpOrEjbPETQFz8oNfaNma+cHA6FtIrtg4Sla52DgqatbATcE9aIDBiPCGrCtNjw==", 1181 | "requires": { 1182 | "@firebase/component": "0.5.20", 1183 | "@firebase/installations": "0.5.15", 1184 | "@firebase/logger": "0.3.3", 1185 | "@firebase/util": "1.7.2", 1186 | "tslib": "^2.1.0" 1187 | } 1188 | }, 1189 | "@firebase/analytics-compat": { 1190 | "version": "0.1.16", 1191 | "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.16.tgz", 1192 | "integrity": "sha512-mDAhE33WiyCrqSQZvzyZtQCCdf4ipn5tsEpTbIUruk7MbThQ1EbNAbPBiEk9NDLD3sUyLABZGFctvym/hc8H+w==", 1193 | "requires": { 1194 | "@firebase/analytics": "0.8.3", 1195 | "@firebase/analytics-types": "0.7.0", 1196 | "@firebase/component": "0.5.20", 1197 | "@firebase/util": "1.7.2", 1198 | "tslib": "^2.1.0" 1199 | } 1200 | }, 1201 | "@firebase/analytics-types": { 1202 | "version": "0.7.0", 1203 | "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.7.0.tgz", 1204 | "integrity": "sha512-DNE2Waiwy5+zZnCfintkDtBfaW6MjIG883474v6Z0K1XZIvl76cLND4iv0YUb48leyF+PJK1KO2XrgHb/KpmhQ==" 1205 | }, 1206 | "@firebase/app": { 1207 | "version": "0.8.2", 1208 | "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.8.2.tgz", 1209 | "integrity": "sha512-ByNDCe8h9O/szO3XVTrS484MtqBOKriVaNCQC7Y7KgZSaiA0OOWmIY5vwi63mBTYetqMNN5VGiG/6ZSmGIZyoQ==", 1210 | "requires": { 1211 | "@firebase/component": "0.5.20", 1212 | "@firebase/logger": "0.3.3", 1213 | "@firebase/util": "1.7.2", 1214 | "idb": "7.0.1", 1215 | "tslib": "^2.1.0" 1216 | } 1217 | }, 1218 | "@firebase/app-check": { 1219 | "version": "0.5.15", 1220 | "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.15.tgz", 1221 | "integrity": "sha512-ifQalGXkXMwGR3F8Glmo1XtDg0UjkwCmI/ff05mxnKGMfs5ZDyw8DikQfna//a/KdYuOBqxlBwS2BhHiobqUUg==", 1222 | "requires": { 1223 | "@firebase/component": "0.5.20", 1224 | "@firebase/logger": "0.3.3", 1225 | "@firebase/util": "1.7.2", 1226 | "tslib": "^2.1.0" 1227 | } 1228 | }, 1229 | "@firebase/app-check-compat": { 1230 | "version": "0.2.15", 1231 | "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.15.tgz", 1232 | "integrity": "sha512-EgD1WEFwwq7aP7DxPSYuUpMt8eAhClA57976D3BaHDbH/IXEuw0DfaeT0LtBb+xJD7J8uxy+YKpudCC8gzUu8g==", 1233 | "requires": { 1234 | "@firebase/app-check": "0.5.15", 1235 | "@firebase/app-check-types": "0.4.0", 1236 | "@firebase/component": "0.5.20", 1237 | "@firebase/logger": "0.3.3", 1238 | "@firebase/util": "1.7.2", 1239 | "tslib": "^2.1.0" 1240 | } 1241 | }, 1242 | "@firebase/app-check-interop-types": { 1243 | "version": "0.1.0", 1244 | "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz", 1245 | "integrity": "sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA==" 1246 | }, 1247 | "@firebase/app-check-types": { 1248 | "version": "0.4.0", 1249 | "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.4.0.tgz", 1250 | "integrity": "sha512-SsWafqMABIOu7zLgWbmwvHGOeQQVQlwm42kwwubsmfLmL4Sf5uGpBfDhQ0CAkpi7bkJ/NwNFKafNDL9prRNP0Q==" 1251 | }, 1252 | "@firebase/app-compat": { 1253 | "version": "0.1.37", 1254 | "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.37.tgz", 1255 | "integrity": "sha512-doTKYGlVc8ZiQNOl66rpkU/YItRyOxCgMp4YWThXkPM4T/pTi4a9IMCe8K88gVNeYWd8sKW4vSnxjcOG5hQXEA==", 1256 | "requires": { 1257 | "@firebase/app": "0.8.2", 1258 | "@firebase/component": "0.5.20", 1259 | "@firebase/logger": "0.3.3", 1260 | "@firebase/util": "1.7.2", 1261 | "tslib": "^2.1.0" 1262 | } 1263 | }, 1264 | "@firebase/app-types": { 1265 | "version": "0.8.0", 1266 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.8.0.tgz", 1267 | "integrity": "sha512-Lec3VVquUwXPn2UReGSsfTxuMBVRmzGIwA/CJnF0LQuPgv9kOmXk9mVqsDMfHxHtqjai0n6wWHR2TqjdVV/bYA==" 1268 | }, 1269 | "@firebase/auth": { 1270 | "version": "0.20.10", 1271 | "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.20.10.tgz", 1272 | "integrity": "sha512-uAZypmVv/4nijaPVtR/ipjKBmSDPLQ7sNScLHs2DVhdvCklgUUF5+zsEdPlMfKDIfmVQHFwHbUgeKyXDYSRMwQ==", 1273 | "requires": { 1274 | "@firebase/component": "0.5.20", 1275 | "@firebase/logger": "0.3.3", 1276 | "@firebase/util": "1.7.2", 1277 | "node-fetch": "2.6.7", 1278 | "selenium-webdriver": "4.1.2", 1279 | "tslib": "^2.1.0" 1280 | } 1281 | }, 1282 | "@firebase/auth-compat": { 1283 | "version": "0.2.23", 1284 | "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.23.tgz", 1285 | "integrity": "sha512-r9YEXaL7YKoFOWHRvVoQ6d5klP+hkSsAtt21UIvP3/BxDDU+yLXN5vVvFHr38apuUeMGN34M7zkY6SihnLutIQ==", 1286 | "requires": { 1287 | "@firebase/auth": "0.20.10", 1288 | "@firebase/auth-types": "0.11.0", 1289 | "@firebase/component": "0.5.20", 1290 | "@firebase/util": "1.7.2", 1291 | "node-fetch": "2.6.7", 1292 | "selenium-webdriver": "4.1.2", 1293 | "tslib": "^2.1.0" 1294 | } 1295 | }, 1296 | "@firebase/auth-interop-types": { 1297 | "version": "0.1.6", 1298 | "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", 1299 | "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==", 1300 | "requires": {} 1301 | }, 1302 | "@firebase/auth-types": { 1303 | "version": "0.11.0", 1304 | "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.11.0.tgz", 1305 | "integrity": "sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw==", 1306 | "requires": {} 1307 | }, 1308 | "@firebase/component": { 1309 | "version": "0.5.20", 1310 | "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.20.tgz", 1311 | "integrity": "sha512-wP51tQBlPFprfAWxWjzC/56hG4APhl43jFsgwuqCl3bhVbiKcr278QbrbGNmIXDeGKo4sGZLAnH9whl2apeCmA==", 1312 | "requires": { 1313 | "@firebase/util": "1.7.2", 1314 | "tslib": "^2.1.0" 1315 | } 1316 | }, 1317 | "@firebase/database": { 1318 | "version": "0.13.9", 1319 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.13.9.tgz", 1320 | "integrity": "sha512-raQEBgQQybaEoMloJL8wWHQywGQ9mF2VbitvHydsbSNn+KL/xRDjXeQZPuuSbRjkYV6mR8jvQB7gpnzQQNE8Qg==", 1321 | "requires": { 1322 | "@firebase/auth-interop-types": "0.1.6", 1323 | "@firebase/component": "0.5.20", 1324 | "@firebase/logger": "0.3.3", 1325 | "@firebase/util": "1.7.2", 1326 | "faye-websocket": "0.11.4", 1327 | "tslib": "^2.1.0" 1328 | } 1329 | }, 1330 | "@firebase/database-compat": { 1331 | "version": "0.2.9", 1332 | "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.2.9.tgz", 1333 | "integrity": "sha512-zzyFM3+jW/qYtHojiQirHXGXYyElbqVngEEn/i2gXoSzcK0Y2AL5oHAqGYXLaaW0+t4Zwnssh3HnQJM8C1D0fw==", 1334 | "requires": { 1335 | "@firebase/component": "0.5.20", 1336 | "@firebase/database": "0.13.9", 1337 | "@firebase/database-types": "0.9.16", 1338 | "@firebase/logger": "0.3.3", 1339 | "@firebase/util": "1.7.2", 1340 | "tslib": "^2.1.0" 1341 | } 1342 | }, 1343 | "@firebase/database-types": { 1344 | "version": "0.9.16", 1345 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.16.tgz", 1346 | "integrity": "sha512-dK/uFgHisrVijSoHf9RLJ7NwvlOul2rO/z9ufOSbGd8/TqFVASXz+19mynhDIoSEnyQtJC/NTyBzSPfjz0w61w==", 1347 | "requires": { 1348 | "@firebase/app-types": "0.8.0", 1349 | "@firebase/util": "1.7.2" 1350 | } 1351 | }, 1352 | "@firebase/firestore": { 1353 | "version": "3.7.1", 1354 | "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.7.1.tgz", 1355 | "integrity": "sha512-sDZ79cUf4cwCyRzN74zODgaeUvyt0lGA8YwaasVVqojgznwMG/bIz+/Tny4ZEnLZFrlniCqt2tStWsiC6s3u7g==", 1356 | "requires": { 1357 | "@firebase/component": "0.5.20", 1358 | "@firebase/logger": "0.3.3", 1359 | "@firebase/util": "1.7.2", 1360 | "@firebase/webchannel-wrapper": "0.8.0", 1361 | "@grpc/grpc-js": "^1.3.2", 1362 | "@grpc/proto-loader": "^0.6.13", 1363 | "node-fetch": "2.6.7", 1364 | "tslib": "^2.1.0" 1365 | } 1366 | }, 1367 | "@firebase/firestore-compat": { 1368 | "version": "0.2.1", 1369 | "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.2.1.tgz", 1370 | "integrity": "sha512-XiiTpmUfyZ6QU3Dw9BCT4T+KPvqzada1GsUNX49HmriWHpIn3jTAjsagkigRAnmNDlxS3ki6Yzg9Cs60tpD0tw==", 1371 | "requires": { 1372 | "@firebase/component": "0.5.20", 1373 | "@firebase/firestore": "3.7.1", 1374 | "@firebase/firestore-types": "2.5.0", 1375 | "@firebase/util": "1.7.2", 1376 | "tslib": "^2.1.0" 1377 | } 1378 | }, 1379 | "@firebase/firestore-types": { 1380 | "version": "2.5.0", 1381 | "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.0.tgz", 1382 | "integrity": "sha512-I6c2m1zUhZ5SH0cWPmINabDyH5w0PPFHk2UHsjBpKdZllzJZ2TwTkXbDtpHUZNmnc/zAa0WNMNMvcvbb/xJLKA==", 1383 | "requires": {} 1384 | }, 1385 | "@firebase/functions": { 1386 | "version": "0.8.7", 1387 | "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.8.7.tgz", 1388 | "integrity": "sha512-JHSKdAOzlFJ9NdKoOaq4x6S1q6B3GmYZDg13KIDsE6BC0E9o/eWxOWOjSFJRCP/lpfFwa0rYBRayfUvZxW3BLw==", 1389 | "requires": { 1390 | "@firebase/app-check-interop-types": "0.1.0", 1391 | "@firebase/auth-interop-types": "0.1.6", 1392 | "@firebase/component": "0.5.20", 1393 | "@firebase/messaging-interop-types": "0.1.0", 1394 | "@firebase/util": "1.7.2", 1395 | "node-fetch": "2.6.7", 1396 | "tslib": "^2.1.0" 1397 | } 1398 | }, 1399 | "@firebase/functions-compat": { 1400 | "version": "0.2.7", 1401 | "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.2.7.tgz", 1402 | "integrity": "sha512-bcUst8ZDJHeVy2Wox4KEM5EizsrrqLzbwFIwJD7KkuSYP8XrlV2gaqJnCvIXXc0Nc4JRGvbXcvFFMXDjhsEp4Q==", 1403 | "requires": { 1404 | "@firebase/component": "0.5.20", 1405 | "@firebase/functions": "0.8.7", 1406 | "@firebase/functions-types": "0.5.0", 1407 | "@firebase/util": "1.7.2", 1408 | "tslib": "^2.1.0" 1409 | } 1410 | }, 1411 | "@firebase/functions-types": { 1412 | "version": "0.5.0", 1413 | "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.5.0.tgz", 1414 | "integrity": "sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA==" 1415 | }, 1416 | "@firebase/installations": { 1417 | "version": "0.5.15", 1418 | "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.15.tgz", 1419 | "integrity": "sha512-RVm2nc2d+bEDFzFzQDTTU1Z13fjAD0v88yDLjtRZuT2R7JwvAegQ4F7CupBvnnf7nftkd3kBwdOi8MhMthb3jQ==", 1420 | "requires": { 1421 | "@firebase/component": "0.5.20", 1422 | "@firebase/util": "1.7.2", 1423 | "idb": "7.0.1", 1424 | "tslib": "^2.1.0" 1425 | } 1426 | }, 1427 | "@firebase/installations-compat": { 1428 | "version": "0.1.15", 1429 | "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.1.15.tgz", 1430 | "integrity": "sha512-m0atyudsVj6ekmM+djhhzzInMC3Y233YJky9vXUVt5MHQY0mHhqDds9+UIrCa6cpbl+ntI2fOuoYV7y01s3sfw==", 1431 | "requires": { 1432 | "@firebase/component": "0.5.20", 1433 | "@firebase/installations": "0.5.15", 1434 | "@firebase/installations-types": "0.4.0", 1435 | "@firebase/util": "1.7.2", 1436 | "tslib": "^2.1.0" 1437 | } 1438 | }, 1439 | "@firebase/installations-types": { 1440 | "version": "0.4.0", 1441 | "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.4.0.tgz", 1442 | "integrity": "sha512-nXxWKQDvBGctuvsizbUEJKfxXU9WAaDhon+j0jpjIfOJkvkj3YHqlLB/HeYjpUn85Pb22BjplpTnDn4Gm9pc3A==", 1443 | "requires": {} 1444 | }, 1445 | "@firebase/logger": { 1446 | "version": "0.3.3", 1447 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.3.tgz", 1448 | "integrity": "sha512-POTJl07jOKTOevLXrTvJD/VZ0M6PnJXflbAh5J9VGkmtXPXNG6MdZ9fmRgqYhXKTaDId6AQenQ262uwgpdtO0Q==", 1449 | "requires": { 1450 | "tslib": "^2.1.0" 1451 | } 1452 | }, 1453 | "@firebase/messaging": { 1454 | "version": "0.9.19", 1455 | "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.9.19.tgz", 1456 | "integrity": "sha512-xu99y/7/P+y3txGtgjsVJZyvx7T5/KdvFgDWS7oZwhKYG0o+DXFvvw3SBMK82LFGFOoyHlJUPqv45EyCPnOPCA==", 1457 | "requires": { 1458 | "@firebase/component": "0.5.20", 1459 | "@firebase/installations": "0.5.15", 1460 | "@firebase/messaging-interop-types": "0.1.0", 1461 | "@firebase/util": "1.7.2", 1462 | "idb": "7.0.1", 1463 | "tslib": "^2.1.0" 1464 | } 1465 | }, 1466 | "@firebase/messaging-compat": { 1467 | "version": "0.1.19", 1468 | "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.19.tgz", 1469 | "integrity": "sha512-h5tx4nxfSILeRquk5mKE8Onu7WtL6b7rfB6GKNJKecvkPs3nnq5Z4cp2Av4JUR2Wtt9UxCTfO0iRbbmtrt2bZQ==", 1470 | "requires": { 1471 | "@firebase/component": "0.5.20", 1472 | "@firebase/messaging": "0.9.19", 1473 | "@firebase/util": "1.7.2", 1474 | "tslib": "^2.1.0" 1475 | } 1476 | }, 1477 | "@firebase/messaging-interop-types": { 1478 | "version": "0.1.0", 1479 | "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.0.tgz", 1480 | "integrity": "sha512-DbvUl/rXAZpQeKBnwz0NYY5OCqr2nFA0Bj28Fmr3NXGqR4PAkfTOHuQlVtLO1Nudo3q0HxAYLa68ZDAcuv2uKQ==" 1481 | }, 1482 | "@firebase/performance": { 1483 | "version": "0.5.15", 1484 | "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.15.tgz", 1485 | "integrity": "sha512-YnnkUehXXzqQefNE5PlPEsXeJYSeY7cMWEdHYTj6u0/F5ntLSAhVZC8jl3Y0fTU1W8a9USQhml6NaXyWiVGmjQ==", 1486 | "requires": { 1487 | "@firebase/component": "0.5.20", 1488 | "@firebase/installations": "0.5.15", 1489 | "@firebase/logger": "0.3.3", 1490 | "@firebase/util": "1.7.2", 1491 | "tslib": "^2.1.0" 1492 | } 1493 | }, 1494 | "@firebase/performance-compat": { 1495 | "version": "0.1.15", 1496 | "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.15.tgz", 1497 | "integrity": "sha512-mryHr5eBEpWxBo8b3KM/53SwwVjMVahwdEnhfx1r+zAvmEPEzXUOGBzAC1l5WQ4DrwtDR87uMZ5soiQ/0jl9QQ==", 1498 | "requires": { 1499 | "@firebase/component": "0.5.20", 1500 | "@firebase/logger": "0.3.3", 1501 | "@firebase/performance": "0.5.15", 1502 | "@firebase/performance-types": "0.1.0", 1503 | "@firebase/util": "1.7.2", 1504 | "tslib": "^2.1.0" 1505 | } 1506 | }, 1507 | "@firebase/performance-types": { 1508 | "version": "0.1.0", 1509 | "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.1.0.tgz", 1510 | "integrity": "sha512-6p1HxrH0mpx+622Ql6fcxFxfkYSBpE3LSuwM7iTtYU2nw91Hj6THC8Bc8z4nboIq7WvgsT/kOTYVVZzCSlXl8w==" 1511 | }, 1512 | "@firebase/remote-config": { 1513 | "version": "0.3.14", 1514 | "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.14.tgz", 1515 | "integrity": "sha512-wEOz3Tasxhr5lCGioe0WNZwDOoQhNZK2qGAm5+AlHAPaAhWIWvqUTkKsk3nFRztyRZzj3r9k5Gc2OSpEcQKP1A==", 1516 | "requires": { 1517 | "@firebase/component": "0.5.20", 1518 | "@firebase/installations": "0.5.15", 1519 | "@firebase/logger": "0.3.3", 1520 | "@firebase/util": "1.7.2", 1521 | "tslib": "^2.1.0" 1522 | } 1523 | }, 1524 | "@firebase/remote-config-compat": { 1525 | "version": "0.1.15", 1526 | "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.15.tgz", 1527 | "integrity": "sha512-jGUrZXIxQRMeSrqEaCi3MtMF33NN12TNTQDZlbex2+T2+yTMI/sn3Mq52T/OccCo86DK17WVlXSWQCH1zCD13g==", 1528 | "requires": { 1529 | "@firebase/component": "0.5.20", 1530 | "@firebase/logger": "0.3.3", 1531 | "@firebase/remote-config": "0.3.14", 1532 | "@firebase/remote-config-types": "0.2.0", 1533 | "@firebase/util": "1.7.2", 1534 | "tslib": "^2.1.0" 1535 | } 1536 | }, 1537 | "@firebase/remote-config-types": { 1538 | "version": "0.2.0", 1539 | "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.2.0.tgz", 1540 | "integrity": "sha512-hqK5sCPeZvcHQ1D6VjJZdW6EexLTXNMJfPdTwbD8NrXUw6UjWC4KWhLK/TSlL0QPsQtcKRkaaoP+9QCgKfMFPw==" 1541 | }, 1542 | "@firebase/storage": { 1543 | "version": "0.9.12", 1544 | "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.12.tgz", 1545 | "integrity": "sha512-XIAmje0ufvRrxrUU/9tvGCuUIy7WSJf3XM8Y8OV9EW2Dg1w4f8IpraLiUdlirdtFM0UAnO2kDQHoiVQYhRrADQ==", 1546 | "requires": { 1547 | "@firebase/component": "0.5.20", 1548 | "@firebase/util": "1.7.2", 1549 | "node-fetch": "2.6.7", 1550 | "tslib": "^2.1.0" 1551 | } 1552 | }, 1553 | "@firebase/storage-compat": { 1554 | "version": "0.1.20", 1555 | "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.20.tgz", 1556 | "integrity": "sha512-8vruwltKdvEPhYbPXA/otb5fAD7MGsBHpCzktJWvF7eIALa4sUlYt+jJxG5Nwk2FoT1NrwLQ7TtI7zvm6/NinA==", 1557 | "requires": { 1558 | "@firebase/component": "0.5.20", 1559 | "@firebase/storage": "0.9.12", 1560 | "@firebase/storage-types": "0.6.0", 1561 | "@firebase/util": "1.7.2", 1562 | "tslib": "^2.1.0" 1563 | } 1564 | }, 1565 | "@firebase/storage-types": { 1566 | "version": "0.6.0", 1567 | "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.6.0.tgz", 1568 | "integrity": "sha512-1LpWhcCb1ftpkP/akhzjzeFxgVefs6eMD2QeKiJJUGH1qOiows2w5o0sKCUSQrvrRQS1lz3SFGvNR1Ck/gqxeA==", 1569 | "requires": {} 1570 | }, 1571 | "@firebase/util": { 1572 | "version": "1.7.2", 1573 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.7.2.tgz", 1574 | "integrity": "sha512-P3aTihYEMoz2QQlcn0T7av7HLEK9gsTc1ZiN9VA8wnUtEJscUNemCmTmP3RRysqEb3Z+tVVoycztY8f6R36rRw==", 1575 | "requires": { 1576 | "tslib": "^2.1.0" 1577 | } 1578 | }, 1579 | "@firebase/webchannel-wrapper": { 1580 | "version": "0.8.0", 1581 | "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.8.0.tgz", 1582 | "integrity": "sha512-Q8erQds5LuAUgNuFOt/tu/abffYUHYxN+Ogp2V5EOssfFG7Ja4ce324Sqyq41u/vB5CSr+tfYS3JzTDrDxCvdw==" 1583 | }, 1584 | "@grpc/grpc-js": { 1585 | "version": "1.7.3", 1586 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.3.tgz", 1587 | "integrity": "sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==", 1588 | "requires": { 1589 | "@grpc/proto-loader": "^0.7.0", 1590 | "@types/node": ">=12.12.47" 1591 | }, 1592 | "dependencies": { 1593 | "@grpc/proto-loader": { 1594 | "version": "0.7.3", 1595 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.3.tgz", 1596 | "integrity": "sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA==", 1597 | "requires": { 1598 | "@types/long": "^4.0.1", 1599 | "lodash.camelcase": "^4.3.0", 1600 | "long": "^4.0.0", 1601 | "protobufjs": "^7.0.0", 1602 | "yargs": "^16.2.0" 1603 | } 1604 | }, 1605 | "protobufjs": { 1606 | "version": "7.1.2", 1607 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.1.2.tgz", 1608 | "integrity": "sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ==", 1609 | "requires": { 1610 | "@protobufjs/aspromise": "^1.1.2", 1611 | "@protobufjs/base64": "^1.1.2", 1612 | "@protobufjs/codegen": "^2.0.4", 1613 | "@protobufjs/eventemitter": "^1.1.0", 1614 | "@protobufjs/fetch": "^1.1.0", 1615 | "@protobufjs/float": "^1.0.2", 1616 | "@protobufjs/inquire": "^1.1.0", 1617 | "@protobufjs/path": "^1.1.2", 1618 | "@protobufjs/pool": "^1.1.0", 1619 | "@protobufjs/utf8": "^1.1.0", 1620 | "@types/node": ">=13.7.0", 1621 | "long": "^5.0.0" 1622 | }, 1623 | "dependencies": { 1624 | "long": { 1625 | "version": "5.2.0", 1626 | "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", 1627 | "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==" 1628 | } 1629 | } 1630 | } 1631 | } 1632 | }, 1633 | "@grpc/proto-loader": { 1634 | "version": "0.6.13", 1635 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", 1636 | "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", 1637 | "requires": { 1638 | "@types/long": "^4.0.1", 1639 | "lodash.camelcase": "^4.3.0", 1640 | "long": "^4.0.0", 1641 | "protobufjs": "^6.11.3", 1642 | "yargs": "^16.2.0" 1643 | } 1644 | }, 1645 | "@protobufjs/aspromise": { 1646 | "version": "1.1.2", 1647 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 1648 | "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" 1649 | }, 1650 | "@protobufjs/base64": { 1651 | "version": "1.1.2", 1652 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 1653 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 1654 | }, 1655 | "@protobufjs/codegen": { 1656 | "version": "2.0.4", 1657 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 1658 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 1659 | }, 1660 | "@protobufjs/eventemitter": { 1661 | "version": "1.1.0", 1662 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 1663 | "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" 1664 | }, 1665 | "@protobufjs/fetch": { 1666 | "version": "1.1.0", 1667 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 1668 | "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", 1669 | "requires": { 1670 | "@protobufjs/aspromise": "^1.1.1", 1671 | "@protobufjs/inquire": "^1.1.0" 1672 | } 1673 | }, 1674 | "@protobufjs/float": { 1675 | "version": "1.0.2", 1676 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 1677 | "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" 1678 | }, 1679 | "@protobufjs/inquire": { 1680 | "version": "1.1.0", 1681 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 1682 | "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" 1683 | }, 1684 | "@protobufjs/path": { 1685 | "version": "1.1.2", 1686 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 1687 | "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" 1688 | }, 1689 | "@protobufjs/pool": { 1690 | "version": "1.1.0", 1691 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 1692 | "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" 1693 | }, 1694 | "@protobufjs/utf8": { 1695 | "version": "1.1.0", 1696 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 1697 | "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" 1698 | }, 1699 | "@types/long": { 1700 | "version": "4.0.2", 1701 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", 1702 | "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" 1703 | }, 1704 | "@types/node": { 1705 | "version": "18.11.3", 1706 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz", 1707 | "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==" 1708 | }, 1709 | "ansi-regex": { 1710 | "version": "5.0.1", 1711 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1712 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 1713 | }, 1714 | "ansi-styles": { 1715 | "version": "4.3.0", 1716 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1717 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1718 | "requires": { 1719 | "color-convert": "^2.0.1" 1720 | } 1721 | }, 1722 | "balanced-match": { 1723 | "version": "1.0.2", 1724 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1725 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 1726 | }, 1727 | "brace-expansion": { 1728 | "version": "1.1.11", 1729 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1730 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1731 | "requires": { 1732 | "balanced-match": "^1.0.0", 1733 | "concat-map": "0.0.1" 1734 | } 1735 | }, 1736 | "cliui": { 1737 | "version": "7.0.4", 1738 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1739 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1740 | "requires": { 1741 | "string-width": "^4.2.0", 1742 | "strip-ansi": "^6.0.0", 1743 | "wrap-ansi": "^7.0.0" 1744 | } 1745 | }, 1746 | "color-convert": { 1747 | "version": "2.0.1", 1748 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1749 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1750 | "requires": { 1751 | "color-name": "~1.1.4" 1752 | } 1753 | }, 1754 | "color-name": { 1755 | "version": "1.1.4", 1756 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1757 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1758 | }, 1759 | "concat-map": { 1760 | "version": "0.0.1", 1761 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1762 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 1763 | }, 1764 | "core-util-is": { 1765 | "version": "1.0.3", 1766 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 1767 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 1768 | }, 1769 | "emoji-regex": { 1770 | "version": "8.0.0", 1771 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1772 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1773 | }, 1774 | "escalade": { 1775 | "version": "3.1.1", 1776 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1777 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 1778 | }, 1779 | "faye-websocket": { 1780 | "version": "0.11.4", 1781 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", 1782 | "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", 1783 | "requires": { 1784 | "websocket-driver": ">=0.5.1" 1785 | } 1786 | }, 1787 | "firebase": { 1788 | "version": "9.12.1", 1789 | "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.12.1.tgz", 1790 | "integrity": "sha512-sBp4rvkCC7TUnGeneRNs6GVcajO+iSXmYjxqXN4FsrBzldJ5/AOnDXf4bi9OUZtQSl+EHDgUWShBieht15ijgQ==", 1791 | "requires": { 1792 | "@firebase/analytics": "0.8.3", 1793 | "@firebase/analytics-compat": "0.1.16", 1794 | "@firebase/app": "0.8.2", 1795 | "@firebase/app-check": "0.5.15", 1796 | "@firebase/app-check-compat": "0.2.15", 1797 | "@firebase/app-compat": "0.1.37", 1798 | "@firebase/app-types": "0.8.0", 1799 | "@firebase/auth": "0.20.10", 1800 | "@firebase/auth-compat": "0.2.23", 1801 | "@firebase/database": "0.13.9", 1802 | "@firebase/database-compat": "0.2.9", 1803 | "@firebase/firestore": "3.7.1", 1804 | "@firebase/firestore-compat": "0.2.1", 1805 | "@firebase/functions": "0.8.7", 1806 | "@firebase/functions-compat": "0.2.7", 1807 | "@firebase/installations": "0.5.15", 1808 | "@firebase/installations-compat": "0.1.15", 1809 | "@firebase/messaging": "0.9.19", 1810 | "@firebase/messaging-compat": "0.1.19", 1811 | "@firebase/performance": "0.5.15", 1812 | "@firebase/performance-compat": "0.1.15", 1813 | "@firebase/remote-config": "0.3.14", 1814 | "@firebase/remote-config-compat": "0.1.15", 1815 | "@firebase/storage": "0.9.12", 1816 | "@firebase/storage-compat": "0.1.20", 1817 | "@firebase/util": "1.7.2" 1818 | } 1819 | }, 1820 | "fs.realpath": { 1821 | "version": "1.0.0", 1822 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1823 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 1824 | }, 1825 | "get-caller-file": { 1826 | "version": "2.0.5", 1827 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1828 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 1829 | }, 1830 | "glob": { 1831 | "version": "7.2.3", 1832 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1833 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1834 | "requires": { 1835 | "fs.realpath": "^1.0.0", 1836 | "inflight": "^1.0.4", 1837 | "inherits": "2", 1838 | "minimatch": "^3.1.1", 1839 | "once": "^1.3.0", 1840 | "path-is-absolute": "^1.0.0" 1841 | } 1842 | }, 1843 | "http-parser-js": { 1844 | "version": "0.5.8", 1845 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", 1846 | "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" 1847 | }, 1848 | "idb": { 1849 | "version": "7.0.1", 1850 | "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", 1851 | "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" 1852 | }, 1853 | "immediate": { 1854 | "version": "3.0.6", 1855 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 1856 | "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" 1857 | }, 1858 | "inflight": { 1859 | "version": "1.0.6", 1860 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1861 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1862 | "requires": { 1863 | "once": "^1.3.0", 1864 | "wrappy": "1" 1865 | } 1866 | }, 1867 | "inherits": { 1868 | "version": "2.0.4", 1869 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1870 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1871 | }, 1872 | "is-fullwidth-code-point": { 1873 | "version": "3.0.0", 1874 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1875 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 1876 | }, 1877 | "isarray": { 1878 | "version": "1.0.0", 1879 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1880 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 1881 | }, 1882 | "jszip": { 1883 | "version": "3.10.1", 1884 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", 1885 | "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", 1886 | "requires": { 1887 | "lie": "~3.3.0", 1888 | "pako": "~1.0.2", 1889 | "readable-stream": "~2.3.6", 1890 | "setimmediate": "^1.0.5" 1891 | } 1892 | }, 1893 | "lie": { 1894 | "version": "3.3.0", 1895 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 1896 | "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 1897 | "requires": { 1898 | "immediate": "~3.0.5" 1899 | } 1900 | }, 1901 | "lodash.camelcase": { 1902 | "version": "4.3.0", 1903 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 1904 | "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" 1905 | }, 1906 | "long": { 1907 | "version": "4.0.0", 1908 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1909 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1910 | }, 1911 | "minimatch": { 1912 | "version": "3.1.2", 1913 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1914 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1915 | "requires": { 1916 | "brace-expansion": "^1.1.7" 1917 | } 1918 | }, 1919 | "node-fetch": { 1920 | "version": "2.6.7", 1921 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 1922 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 1923 | "requires": { 1924 | "whatwg-url": "^5.0.0" 1925 | } 1926 | }, 1927 | "once": { 1928 | "version": "1.4.0", 1929 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1930 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1931 | "requires": { 1932 | "wrappy": "1" 1933 | } 1934 | }, 1935 | "pako": { 1936 | "version": "1.0.11", 1937 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 1938 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 1939 | }, 1940 | "path-is-absolute": { 1941 | "version": "1.0.1", 1942 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1943 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" 1944 | }, 1945 | "process-nextick-args": { 1946 | "version": "2.0.1", 1947 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1948 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1949 | }, 1950 | "protobufjs": { 1951 | "version": "6.11.3", 1952 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", 1953 | "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", 1954 | "requires": { 1955 | "@protobufjs/aspromise": "^1.1.2", 1956 | "@protobufjs/base64": "^1.1.2", 1957 | "@protobufjs/codegen": "^2.0.4", 1958 | "@protobufjs/eventemitter": "^1.1.0", 1959 | "@protobufjs/fetch": "^1.1.0", 1960 | "@protobufjs/float": "^1.0.2", 1961 | "@protobufjs/inquire": "^1.1.0", 1962 | "@protobufjs/path": "^1.1.2", 1963 | "@protobufjs/pool": "^1.1.0", 1964 | "@protobufjs/utf8": "^1.1.0", 1965 | "@types/long": "^4.0.1", 1966 | "@types/node": ">=13.7.0", 1967 | "long": "^4.0.0" 1968 | } 1969 | }, 1970 | "readable-stream": { 1971 | "version": "2.3.7", 1972 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1973 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1974 | "requires": { 1975 | "core-util-is": "~1.0.0", 1976 | "inherits": "~2.0.3", 1977 | "isarray": "~1.0.0", 1978 | "process-nextick-args": "~2.0.0", 1979 | "safe-buffer": "~5.1.1", 1980 | "string_decoder": "~1.1.1", 1981 | "util-deprecate": "~1.0.1" 1982 | } 1983 | }, 1984 | "require-directory": { 1985 | "version": "2.1.1", 1986 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1987 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" 1988 | }, 1989 | "rimraf": { 1990 | "version": "3.0.2", 1991 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1992 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1993 | "requires": { 1994 | "glob": "^7.1.3" 1995 | } 1996 | }, 1997 | "safe-buffer": { 1998 | "version": "5.1.2", 1999 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2000 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2001 | }, 2002 | "selenium-webdriver": { 2003 | "version": "4.1.2", 2004 | "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.1.2.tgz", 2005 | "integrity": "sha512-e4Ap8vQvhipgBB8Ry9zBiKGkU6kHKyNnWiavGGLKkrdW81Zv7NVMtFOL/j3yX0G8QScM7XIXijKssNd4EUxSOw==", 2006 | "requires": { 2007 | "jszip": "^3.6.0", 2008 | "tmp": "^0.2.1", 2009 | "ws": ">=7.4.6" 2010 | } 2011 | }, 2012 | "setimmediate": { 2013 | "version": "1.0.5", 2014 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 2015 | "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" 2016 | }, 2017 | "string_decoder": { 2018 | "version": "1.1.1", 2019 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2020 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2021 | "requires": { 2022 | "safe-buffer": "~5.1.0" 2023 | } 2024 | }, 2025 | "string-width": { 2026 | "version": "4.2.3", 2027 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2028 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2029 | "requires": { 2030 | "emoji-regex": "^8.0.0", 2031 | "is-fullwidth-code-point": "^3.0.0", 2032 | "strip-ansi": "^6.0.1" 2033 | } 2034 | }, 2035 | "strip-ansi": { 2036 | "version": "6.0.1", 2037 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2038 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2039 | "requires": { 2040 | "ansi-regex": "^5.0.1" 2041 | } 2042 | }, 2043 | "tmp": { 2044 | "version": "0.2.1", 2045 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", 2046 | "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", 2047 | "requires": { 2048 | "rimraf": "^3.0.0" 2049 | } 2050 | }, 2051 | "tr46": { 2052 | "version": "0.0.3", 2053 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2054 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 2055 | }, 2056 | "tslib": { 2057 | "version": "2.4.0", 2058 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 2059 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" 2060 | }, 2061 | "util-deprecate": { 2062 | "version": "1.0.2", 2063 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2064 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 2065 | }, 2066 | "webidl-conversions": { 2067 | "version": "3.0.1", 2068 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2069 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 2070 | }, 2071 | "websocket-driver": { 2072 | "version": "0.7.4", 2073 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", 2074 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", 2075 | "requires": { 2076 | "http-parser-js": ">=0.5.1", 2077 | "safe-buffer": ">=5.1.0", 2078 | "websocket-extensions": ">=0.1.1" 2079 | } 2080 | }, 2081 | "websocket-extensions": { 2082 | "version": "0.1.4", 2083 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", 2084 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" 2085 | }, 2086 | "whatwg-url": { 2087 | "version": "5.0.0", 2088 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2089 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2090 | "requires": { 2091 | "tr46": "~0.0.3", 2092 | "webidl-conversions": "^3.0.0" 2093 | } 2094 | }, 2095 | "wrap-ansi": { 2096 | "version": "7.0.0", 2097 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2098 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2099 | "requires": { 2100 | "ansi-styles": "^4.0.0", 2101 | "string-width": "^4.1.0", 2102 | "strip-ansi": "^6.0.0" 2103 | } 2104 | }, 2105 | "wrappy": { 2106 | "version": "1.0.2", 2107 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2108 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 2109 | }, 2110 | "ws": { 2111 | "version": "8.9.0", 2112 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", 2113 | "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", 2114 | "requires": {} 2115 | }, 2116 | "y18n": { 2117 | "version": "5.0.8", 2118 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2119 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 2120 | }, 2121 | "yargs": { 2122 | "version": "16.2.0", 2123 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 2124 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 2125 | "requires": { 2126 | "cliui": "^7.0.2", 2127 | "escalade": "^3.1.1", 2128 | "get-caller-file": "^2.0.5", 2129 | "require-directory": "^2.1.1", 2130 | "string-width": "^4.2.0", 2131 | "y18n": "^5.0.5", 2132 | "yargs-parser": "^20.2.2" 2133 | } 2134 | }, 2135 | "yargs-parser": { 2136 | "version": "20.2.9", 2137 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 2138 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" 2139 | } 2140 | } 2141 | } 2142 | --------------------------------------------------------------------------------