From 52a8473918e1879347f346e2837699c38428a463 Mon Sep 17 00:00:00 2001 From: Natasha Tikhonova <64562118+natashatikhonova@users.noreply.github.com> Date: Mon, 21 Aug 2023 09:36:09 +0200 Subject: [PATCH 1/3] fix(board): show first tab's content when any tab is deleted (#1166) Signed-off-by: Natasha Tikhonova --- .../src/Admin/scenarios/TilesOverview/index.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/next-tavla/src/Admin/scenarios/TilesOverview/index.tsx b/next-tavla/src/Admin/scenarios/TilesOverview/index.tsx index 3dda3c27b9..9e1b45ca15 100644 --- a/next-tavla/src/Admin/scenarios/TilesOverview/index.tsx +++ b/next-tavla/src/Admin/scenarios/TilesOverview/index.tsx @@ -1,5 +1,5 @@ import { TTile } from 'types/tile' -import React from 'react' +import React, { useEffect, useState } from 'react' import { TileSettings } from 'Admin/scenarios/TileSettings' import { Tab, TabList, TabPanel, TabPanels, Tabs } from '@entur/tab' import Image from 'next/image' @@ -8,6 +8,12 @@ import classes from './styles.module.css' import { Heading2, LeadParagraph } from '@entur/typography' function TilesOverview({ tiles }: { tiles: TTile[] }) { + const [activeTab, setActiveTab] = useState(0) + + useEffect(() => { + setActiveTab(0) + }, [tiles.length]) + if (tiles.length === 0) return (
@@ -23,7 +29,11 @@ function TilesOverview({ tiles }: { tiles: TTile[] }) { ) return ( - + setActiveTab(newIndex)} + > {tiles.map((tile) => ( {tile.name ?? tile.placeId} From fc57444f59e2ba0cba7861c1a177f2c9510055a3 Mon Sep 17 00:00:00 2001 From: lindtvedtsebastian <46536611+lindtvedtsebastian@users.noreply.github.com> Date: Wed, 23 Aug 2023 12:08:57 +0200 Subject: [PATCH 2/3] feat(auth): login/logout/create user functionality (#1171) * feat(admin): added firebase-admin * feat(admin): cleaned up env and added firebase-admin * feat(login): added login modal * feat(login): login modal pages system * feat(auth): login with session cookies * feat(auth): logout endpoint and fetch session cookie in edit loader * feat(auth): useAuth hook * feat(auth): form validation hook * chore(alert): update @entur/alert * feat(auth): alert box for user error * feat(auth): form validation in create account * chore(auth): general cleanup * chore(auth): remove uneccesary return type from hook * feat(auth): parse FIREBASE_CONFIG before custom admin config --- next-tavla/package.json | 3 +- next-tavla/pages/api/login.ts | 32 + next-tavla/pages/api/logout.ts | 9 + next-tavla/pages/edit/[id].tsx | 20 +- .../Admin/scenarios/AddTile/AddTile.cy.tsx | 4 +- next-tavla/src/Admin/scenarios/Edit/index.tsx | 6 + .../scenarios/Login/components/CreateUser.tsx | 67 + .../scenarios/Login/components/Email.tsx | 62 + .../scenarios/Login/components/Start.tsx | 27 + .../scenarios/Login/components/UserError.tsx | 9 + .../Admin/scenarios/Login/hooks/useAuth.ts | 52 + .../Login/hooks/useFirebaseAuthError.ts | 71 ++ .../src/Admin/scenarios/Login/index.tsx | 93 ++ .../Admin/scenarios/Login/styles.module.css | 10 + next-tavla/src/Admin/types/login.ts | 5 + next-tavla/src/Admin/utils/firebase.ts | 23 + next-tavla/src/Admin/utils/index.ts | 16 +- next-tavla/src/Shared/assets/env.ts | 21 + .../src/Shared/assets/environmentConfig.ts | 53 - .../src/Shared/assets/illustrations/Musk.png | Bin 0 -> 94282 bytes next-tavla/src/Shared/graphql/utils.ts | 7 +- next-tavla/src/Shared/styles/spacing.css | 8 + next-tavla/src/Shared/types/next.ts | 5 + next-tavla/src/Shared/utils/firebase.ts | 16 +- next-tavla/yarn.lock | 1090 ++++++++++++++++- 25 files changed, 1601 insertions(+), 108 deletions(-) create mode 100644 next-tavla/pages/api/login.ts create mode 100644 next-tavla/pages/api/logout.ts create mode 100644 next-tavla/src/Admin/scenarios/Login/components/CreateUser.tsx create mode 100644 next-tavla/src/Admin/scenarios/Login/components/Email.tsx create mode 100644 next-tavla/src/Admin/scenarios/Login/components/Start.tsx create mode 100644 next-tavla/src/Admin/scenarios/Login/components/UserError.tsx create mode 100644 next-tavla/src/Admin/scenarios/Login/hooks/useAuth.ts create mode 100644 next-tavla/src/Admin/scenarios/Login/hooks/useFirebaseAuthError.ts create mode 100644 next-tavla/src/Admin/scenarios/Login/index.tsx create mode 100644 next-tavla/src/Admin/scenarios/Login/styles.module.css create mode 100644 next-tavla/src/Admin/types/login.ts create mode 100644 next-tavla/src/Admin/utils/firebase.ts create mode 100644 next-tavla/src/Shared/assets/env.ts delete mode 100644 next-tavla/src/Shared/assets/environmentConfig.ts create mode 100644 next-tavla/src/Shared/assets/illustrations/Musk.png create mode 100644 next-tavla/src/Shared/types/next.ts diff --git a/next-tavla/package.json b/next-tavla/package.json index c48f2cd810..2cc5c1afc7 100644 --- a/next-tavla/package.json +++ b/next-tavla/package.json @@ -27,7 +27,7 @@ "@dnd-kit/modifiers": "6.0.1", "@dnd-kit/sortable": "7.0.2", "@dnd-kit/utilities": "3.2.1", - "@entur/alert": "0.14.3", + "@entur/alert": "0.14.9", "@entur/button": "3.0.8", "@entur/chip": "0.6.39", "@entur/dropdown": "4.0.9", @@ -43,6 +43,7 @@ "@firebase/database-types": "0.10.4", "classnames": "2.3.2", "firebase": "9.18.0", + "firebase-admin": "11.10.1", "graphql": "16.6.0", "lodash": "4.17.21", "nanoid": "4.0.2", diff --git a/next-tavla/pages/api/login.ts b/next-tavla/pages/api/login.ts new file mode 100644 index 0000000000..15c17693c5 --- /dev/null +++ b/next-tavla/pages/api/login.ts @@ -0,0 +1,32 @@ +import { initializeAdminApp } from 'Admin/utils/firebase' +import { auth } from 'firebase-admin' +import { NextApiRequest, NextApiResponse } from 'next' + +initializeAdminApp() + +export default async function handler( + request: NextApiRequest, + response: NextApiResponse, +) { + const authorization = request.headers.authorization + if (authorization?.startsWith('Bearer ')) { + const idToken = authorization.split('Bearer ')[1] ?? '' + const decodedToken = await auth().verifyIdToken(idToken) + + if (decodedToken) { + const expiresIn = 60 * 60 * 24 * 10 // Ten days + const sessionCookie = await auth().createSessionCookie(idToken, { + expiresIn, + }) + + response.setHeader( + 'Set-Cookie', + `session=${sessionCookie};HttpOnly;Max-Age=${expiresIn};Secure;SameSite=Strict;Path=/;`, + ) + return response + .status(200) + .json({ message: 'Successfully logged in!' }) + } + } + return response.status(400).json({ error: 'Could not log in!' }) +} diff --git a/next-tavla/pages/api/logout.ts b/next-tavla/pages/api/logout.ts new file mode 100644 index 0000000000..43e66a8925 --- /dev/null +++ b/next-tavla/pages/api/logout.ts @@ -0,0 +1,9 @@ +import { NextApiRequest, NextApiResponse } from 'next' + +export default async function handler( + request: NextApiRequest, + response: NextApiResponse, +) { + response.setHeader('Set-Cookie', `session="";Max-Age=-1;Path=/`) + return response.status(200).json({ message: 'Successfully logged out!' }) +} diff --git a/next-tavla/pages/edit/[id].tsx b/next-tavla/pages/edit/[id].tsx index dc37497a2b..65096a0c6b 100755 --- a/next-tavla/pages/edit/[id].tsx +++ b/next-tavla/pages/edit/[id].tsx @@ -6,14 +6,21 @@ import classes from 'styles/pages/admin.module.css' import { Contrast } from '@entur/layout' import { upgradeSettings } from 'utils/converters' import { ToastProvider } from '@entur/alert' +import { IncomingNextMessage } from 'types/next' +import { verifySession } from 'Admin/utils/firebase' +import { DecodedIdToken } from 'firebase-admin/lib/auth/token-verifier' export async function getServerSideProps({ params, + req, }: { params: { id: string } + req: IncomingNextMessage }) { const { id } = params + const session = req.cookies['session'] + const user = await verifySession(session) const settings: TSettings | undefined = await getBoardSettings(id) if (!settings) { @@ -26,18 +33,27 @@ export async function getServerSideProps({ return { props: { + user: user, settings: convertedSettings, id, }, } } -function AdminPage({ settings, id }: { settings: TSettings; id: string }) { +function AdminPage({ + user, + settings, + id, +}: { + user: DecodedIdToken | null + settings: TSettings + id: string +}) { return (
- + ) diff --git a/next-tavla/src/Admin/scenarios/AddTile/AddTile.cy.tsx b/next-tavla/src/Admin/scenarios/AddTile/AddTile.cy.tsx index 9eabbbf099..e6930bd68e 100644 --- a/next-tavla/src/Admin/scenarios/AddTile/AddTile.cy.tsx +++ b/next-tavla/src/Admin/scenarios/AddTile/AddTile.cy.tsx @@ -1,11 +1,11 @@ import { Contrast } from '@entur/layout' import React, { useReducer } from 'react' -import { geocoder_endpoint } from 'src/Shared/assets/environmentConfig' import { TilesOverview } from '../TilesOverview' import { AddTile } from './index' import { SettingsDispatchContext } from 'Admin/utils/contexts' import { settingsReducer } from '../Edit/reducer' import { ToastProvider } from '@entur/alert' +import { GEOCODER_ENDPOINT } from 'assets/env' describe('', () => { const TestComponent = () => { @@ -30,7 +30,7 @@ describe('', () => { it('can add a stop place tile', () => { cy.mount() - cy.intercept(`${geocoder_endpoint}/autocomplete?*`, { + cy.intercept(`${GEOCODER_ENDPOINT}/autocomplete?*`, { fixture: 'graphql/geocoder.json', }) diff --git a/next-tavla/src/Admin/scenarios/Edit/index.tsx b/next-tavla/src/Admin/scenarios/Edit/index.tsx index 65da3c2ed9..d184f71d0a 100644 --- a/next-tavla/src/Admin/scenarios/Edit/index.tsx +++ b/next-tavla/src/Admin/scenarios/Edit/index.tsx @@ -12,13 +12,17 @@ import { Heading1 } from '@entur/typography' import { CopyIcon, SaveIcon } from '@entur/icons' import { SecondaryLink } from 'components/SecondaryLink' import { useToast } from '@entur/alert' +import { Login } from '../Login' +import { DecodedIdToken } from 'firebase-admin/lib/auth/token-verifier' function Edit({ initialSettings, documentId, + user, }: { initialSettings: TSettings documentId: string + user: DecodedIdToken | null }) { const [settings, dispatch] = useReducer(settingsReducer, initialSettings) const { addToast } = useToast() @@ -51,6 +55,8 @@ function Edit({ Lagre tavla + +
diff --git a/next-tavla/src/Admin/scenarios/Login/components/CreateUser.tsx b/next-tavla/src/Admin/scenarios/Login/components/CreateUser.tsx new file mode 100644 index 0000000000..fb96a1c397 --- /dev/null +++ b/next-tavla/src/Admin/scenarios/Login/components/CreateUser.tsx @@ -0,0 +1,67 @@ +import { PrimaryButton } from '@entur/button' +import { TextField } from '@entur/form' +import { Heading3 } from '@entur/typography' +import musk from 'assets/illustrations/Musk.png' +import { FirebaseError } from 'firebase/app' +import Image from 'next/image' +import { SyntheticEvent } from 'react' + +import { useAuth } from '../hooks/useAuth' +import { useFirebaseAuthError } from '../hooks/useFirebaseAuthError' +import { UserError } from './UserError' + +function CreateUser() { + const { createUser } = useAuth() + const { error, setError, getTextFieldPropsForType } = useFirebaseAuthError() + + const submitCreateUser = async (event: SyntheticEvent) => { + event.preventDefault() + + const data = event.currentTarget as unknown as { + email: HTMLInputElement + password: HTMLInputElement + repeat_password: HTMLInputElement + } + + const email = data.email.value + const password = data.password.value + const repeatPassword = data.repeat_password.value + + try { + await createUser(email, password, repeatPassword) + } catch (error) { + if (error instanceof FirebaseError) setError(error) + } + } + + return ( +
+ illustration + Logg inn med e-post +
+ + + + + Opprett ny bruker + +
+ ) +} + +export { CreateUser } diff --git a/next-tavla/src/Admin/scenarios/Login/components/Email.tsx b/next-tavla/src/Admin/scenarios/Login/components/Email.tsx new file mode 100644 index 0000000000..4bd4761295 --- /dev/null +++ b/next-tavla/src/Admin/scenarios/Login/components/Email.tsx @@ -0,0 +1,62 @@ +import { PrimaryButton } from '@entur/button' +import { TextField } from '@entur/form' +import { Heading3 } from '@entur/typography' +import musk from 'assets/illustrations/Musk.png' +import { FirebaseError } from 'firebase/app' +import Image from 'next/image' +import { SyntheticEvent } from 'react' +import { useAuth } from '../hooks/useAuth' +import { useFirebaseAuthError } from '../hooks/useFirebaseAuthError' +import { UserError } from './UserError' + +function Email() { + const { error, setError, getTextFieldPropsForType } = useFirebaseAuthError() + const { login } = useAuth() + + const submitEmailLogin = async (event: SyntheticEvent) => { + event.preventDefault() + + const data = event.currentTarget as unknown as { + email: HTMLInputElement + password: HTMLInputElement + } + + const email = data.email.value + const password = data.password.value + + try { + await login(email, password) + } catch (error: unknown) { + if (error instanceof FirebaseError) { + setError(error) + } + } + } + + return ( +
+ illustration + Logg inn med e-post +
+ + + + + + Logg inn + +
+ ) +} + +export { Email } diff --git a/next-tavla/src/Admin/scenarios/Login/components/Start.tsx b/next-tavla/src/Admin/scenarios/Login/components/Start.tsx new file mode 100644 index 0000000000..49ab30905b --- /dev/null +++ b/next-tavla/src/Admin/scenarios/Login/components/Start.tsx @@ -0,0 +1,27 @@ +import { PrimaryButton, SecondaryButton } from '@entur/button' +import { Heading3, Paragraph } from '@entur/typography' +import { TLoginPage } from 'Admin/types/login' +import musk from 'assets/illustrations/Musk.png' +import Image from 'next/image' + +function Start({ pushPage }: { pushPage: (page: TLoginPage) => void }) { + return ( +
+ illustration + Logg inn for å fortsette + + Logg inn for å få tilgang til å opprette og administrere tavler. + +
+ pushPage('email')}> + Logg inn med e-post + + pushPage('create')}> + Opprett ny bruker + +
+
+ ) +} + +export { Start } diff --git a/next-tavla/src/Admin/scenarios/Login/components/UserError.tsx b/next-tavla/src/Admin/scenarios/Login/components/UserError.tsx new file mode 100644 index 0000000000..4a11048ded --- /dev/null +++ b/next-tavla/src/Admin/scenarios/Login/components/UserError.tsx @@ -0,0 +1,9 @@ +import { SmallAlertBox } from '@entur/alert' +import { TAuthError } from 'Admin/types/login' + +function UserError({ error }: { error?: TAuthError }) { + if (!error || error.type !== 'user') return null + return {error.value} +} + +export { UserError } diff --git a/next-tavla/src/Admin/scenarios/Login/hooks/useAuth.ts b/next-tavla/src/Admin/scenarios/Login/hooks/useAuth.ts new file mode 100644 index 0000000000..8687f9a1ef --- /dev/null +++ b/next-tavla/src/Admin/scenarios/Login/hooks/useAuth.ts @@ -0,0 +1,52 @@ +import { fetchWithIdToken } from 'Admin/utils' +import { + createUserWithEmailAndPassword, + signInWithEmailAndPassword, +} from 'firebase/auth' +import { auth } from 'utils/firebase' + +import { FirebaseError } from 'firebase/app' +import { useRouter } from 'next/router' + +function useAuth() { + const router = useRouter() + + const login = async (email: string, password: string) => { + const credential = await signInWithEmailAndPassword( + auth, + email, + password, + ) + await fetchWithIdToken('/api/login', await credential.user.getIdToken()) + router.reload() + } + + const logout = async () => { + await fetch('/api/logout') + router.reload() + } + + const createUser = async ( + email: string, + password: string, + repeatPassword: string, + ) => { + if (password !== repeatPassword) + throw new FirebaseError( + 'auth/password-no-match', + 'passwords does not match', + ) + + const credential = await createUserWithEmailAndPassword( + auth, + email, + password, + ) + await fetchWithIdToken('/api/login', await credential.user.getIdToken()) + router.reload() + } + + return { login, logout, createUser } +} + +export { useAuth } diff --git a/next-tavla/src/Admin/scenarios/Login/hooks/useFirebaseAuthError.ts b/next-tavla/src/Admin/scenarios/Login/hooks/useFirebaseAuthError.ts new file mode 100644 index 0000000000..d0511aa0ce --- /dev/null +++ b/next-tavla/src/Admin/scenarios/Login/hooks/useFirebaseAuthError.ts @@ -0,0 +1,71 @@ +import { VariantType } from '@entur/form' +import { TAuthError, TErrorType } from 'Admin/types/login' +import { FirebaseError } from 'firebase/app' +import { useState } from 'react' + +function useFirebaseAuthError() { + const [error, setError] = useState() + + const getTextFieldPropsForType = ( + type: TErrorType, + ): { variant?: VariantType | undefined; feedback?: string } => { + return { + variant: type === error?.type ? 'error' : undefined, + feedback: error?.value, + } + } + + const setErrorMessage = (error: FirebaseError) => { + switch (error.code) { + case 'auth/invalid-email': + return setError({ + type: 'email', + value: 'E-postadressen er ikke gyldig.', + }) + case 'auth/user-not-found': + return setError({ + type: 'email', + value: 'Det finnes ingen konto assosiert med denne e-postadressen.', + }) + case 'auth/email-already-in-use': + return setError({ + type: 'email', + value: 'E-postadressen er allerede i bruk.', + }) + case 'auth/wrong-password': + return setError({ + type: 'password', + value: 'Passordet er ikke gyldig.', + }) + case 'auth/weak-password': + return setError({ + type: 'password', + value: 'Passordet er for svakt.', + }) + case 'auth/password-no-match': + return setError({ + type: 'repeat_password', + value: 'Passordene er ikke like.', + }) + case 'auth/user-disabled': + return setError({ + type: 'user', + value: 'Kontoen du forsøker å logge inn på er deaktivert.', + }) + case 'auth/too-many-requests': + return setError({ + type: 'user', + value: 'Kontoen har blitt midlertidig låst grunnet gjentatte mislykkede påloggingsforsøk.', + }) + case 'auth/operation-not-allowed': + return setError({ + type: 'user', + value: 'Opprettelse av ny bruker feilet.', + }) + } + } + + return { error, setError: setErrorMessage, getTextFieldPropsForType } +} + +export { useFirebaseAuthError } diff --git a/next-tavla/src/Admin/scenarios/Login/index.tsx b/next-tavla/src/Admin/scenarios/Login/index.tsx new file mode 100644 index 0000000000..39582c3c80 --- /dev/null +++ b/next-tavla/src/Admin/scenarios/Login/index.tsx @@ -0,0 +1,93 @@ +import { PrimaryButton, SecondarySquareButton } from '@entur/button' +import { BackArrowIcon, CloseIcon } from '@entur/icons' +import { Modal } from '@entur/modal' +import { TLoginPage } from 'Admin/types/login' +import { DecodedIdToken } from 'firebase-admin/lib/auth/token-verifier' +import { useState } from 'react' +import { CreateUser } from './components/CreateUser' +import { Email } from './components/Email' +import { Start } from './components/Start' +import { useAuth } from './hooks/useAuth' +import classes from './styles.module.css' + +function Login({ user }: { user: DecodedIdToken | null }) { + const { logout } = useAuth() + + const [showModal, setShowModal] = useState(false) + const [pages, setPages] = useState([]) + + if (user) { + // return early if user is already logged in + return Logg ut + } + + const pushPage = (page: TLoginPage) => { + setPages([...pages, page]) + } + + const popPage = () => { + setPages(pages.slice(0, -1)) + } + + const closeModal = () => { + setShowModal(false) + } + + const nestedPagesExist = pages && pages.length > 0 + + return ( + <> + setShowModal(true)}> + Logg inn + + +
+ + + + {nestedPagesExist && ( + + + + )} +
+ +
+ + ) +} + +function LoginPage({ + pages, + pushPage, +}: { + pages: TLoginPage[] + pushPage: (page: TLoginPage) => void +}) { + if (!pages) return + + const lastPage = pages.slice(-1)[0] + + switch (lastPage) { + case 'email': + return + case 'create': + return + default: + return + } +} + +export { Login } diff --git a/next-tavla/src/Admin/scenarios/Login/styles.module.css b/next-tavla/src/Admin/scenarios/Login/styles.module.css new file mode 100644 index 0000000000..ea5dcd9f29 --- /dev/null +++ b/next-tavla/src/Admin/scenarios/Login/styles.module.css @@ -0,0 +1,10 @@ +.login { + text-align: center; +} + +.actions { + display: flex; + width: 100%; + flex-flow: row-reverse; + justify-content: space-between; +} diff --git a/next-tavla/src/Admin/types/login.ts b/next-tavla/src/Admin/types/login.ts new file mode 100644 index 0000000000..34c3ff122a --- /dev/null +++ b/next-tavla/src/Admin/types/login.ts @@ -0,0 +1,5 @@ +export type TLoginPage = 'start' | 'email' | 'create' + +export type TErrorType = 'email' | 'password' | 'repeat_password' | 'user' + +export type TAuthError = { type: TErrorType; value: string } diff --git a/next-tavla/src/Admin/utils/firebase.ts b/next-tavla/src/Admin/utils/firebase.ts new file mode 100644 index 0000000000..b4284c4542 --- /dev/null +++ b/next-tavla/src/Admin/utils/firebase.ts @@ -0,0 +1,23 @@ +import admin, { auth } from 'firebase-admin' +import { AppOptions, cert, getApps } from 'firebase-admin/app' + +const FIREBASE_ADMIN_CONFIG = (process.env.FIREBASE_CONFIG as AppOptions) ?? { + credential: cert(process.env.FIREBASE_SECRET_KEY ?? ''), +} + +initializeAdminApp() + +export function initializeAdminApp() { + if (getApps().length <= 0) { + admin.initializeApp(FIREBASE_ADMIN_CONFIG) + } +} + +export async function verifySession(session?: string) { + if (!session) return null + try { + return await auth().verifySessionCookie(session, true) + } catch { + return null + } +} diff --git a/next-tavla/src/Admin/utils/index.ts b/next-tavla/src/Admin/utils/index.ts index 4a403a6c38..33d3f84541 100644 --- a/next-tavla/src/Admin/utils/index.ts +++ b/next-tavla/src/Admin/utils/index.ts @@ -1,5 +1,4 @@ -import { geocoder_endpoint } from 'src/Shared/assets/environmentConfig' -const CLIENT_NAME = 'entur-tavla-staging' +import { CLIENT_NAME, GEOCODER_ENDPOINT } from 'assets/env' type TPartialGeoResponse = { features: Array<{ @@ -22,7 +21,7 @@ export async function fetchItems( text, }) - return fetch(`${geocoder_endpoint}/autocomplete?${searchParams}`, { + return fetch(`${GEOCODER_ENDPOINT}/autocomplete?${searchParams}`, { headers: { 'ET-Client-Name': CLIENT_NAME, }, @@ -38,3 +37,14 @@ export async function fetchItems( return items }) } + +export async function fetchWithIdToken( + url: string, + idToken: string, + method = 'POST', +) { + return fetch(url, { + method, + headers: { Authorization: `Bearer ${idToken}` }, + }) +} diff --git a/next-tavla/src/Shared/assets/env.ts b/next-tavla/src/Shared/assets/env.ts new file mode 100644 index 0000000000..bd05117e47 --- /dev/null +++ b/next-tavla/src/Shared/assets/env.ts @@ -0,0 +1,21 @@ +export type TEndpointNames = 'journey-planner' | 'mobility' | 'vehicles' + +export const GRAPHQL_ENDPOINTS: Record = { + ['journey-planner']: 'https://api.entur.io/journey-planner/v3/graphql', + ['mobility']: 'https://api.entur.io/mobility/v2/graphql', + ['vehicles']: 'https://api.entur.io/realtime/v1/vehicles/graphql', +} + +export const GEOCODER_ENDPOINT = 'https://api.entur.io/geocoder/v1' + +export const CLIENT_NAME = 'entur-tavla-staging' + +export const FIREBASE_CLIENT_CONFIG = { + apiKey: 'AIzaSyDXpgZUj0IXBP3ECSlEk6IJwo_6VkYC_VE', + authDomain: 'entur-tavla-staging.firebaseapp.com', + databaseURL: 'https://entur-tavla-staging.firebaseio.com', + projectId: 'entur-tavla-staging', + storageBucket: 'entur-tavla-staging.appspot.com', + messagingSenderId: '934908160432', + appId: '1:934908160432:web:68c802afea624557ca4e75', +} diff --git a/next-tavla/src/Shared/assets/environmentConfig.ts b/next-tavla/src/Shared/assets/environmentConfig.ts deleted file mode 100644 index ecc4160402..0000000000 --- a/next-tavla/src/Shared/assets/environmentConfig.ts +++ /dev/null @@ -1,53 +0,0 @@ -export type TEndpointNames = 'journey-planner' | 'mobility' | 'vehicles' - -const staging_endpoints: Record = { - ['journey-planner']: - 'https://api.staging.entur.io/journey-planner/v3/graphql', - ['mobility']: '', - ['vehicles']: '', -} - -const prod_endpoints: Record = { - ['journey-planner']: 'https://api.entur.io/journey-planner/v3/graphql', - ['mobility']: '', - ['vehicles']: '', -} - -const Staging = { - firebaseConfig: { - apiKey: 'AIzaSyDXpgZUj0IXBP3ECSlEk6IJwo_6VkYC_VE', - authDomain: 'entur-tavla-staging.firebaseapp.com', - databaseURL: 'https://entur-tavla-staging.firebaseio.com', - projectId: 'entur-tavla-staging', - storageBucket: 'entur-tavla-staging.appspot.com', - messagingSenderId: '934908160432', - appId: '1:934908160432:web:68c802afea624557ca4e75', - }, - geocoder_endpoint: 'https://api.staging.entur.io/geocoder/v1', - client_name: 'entur-tavla-staging', - graphql_endpoints: staging_endpoints, -} - -const Prod = { - firebaseConfig: { - apiKey: 'AIzaSyDBzat6zxRmQQQQsEpI3YiZ9uX4V9d-Bgg', - authDomain: 'entur-tavla-prod.firebaseapp.com', - databaseURL: 'https://entur-tavla-prod.firebaseio.com', - projectId: 'entur-tavla-prod', - storageBucket: 'entur-tavla-prod.appspot.com', - messagingSenderId: '1025677335075', - appId: '1:1025677335075:web:7e5e1f495564c1a0dcef96', - measurementId: 'G-GJLJPD7LYB', - }, - geocoder_endpoint: 'https://api.staging.entur.io/geocoder/v1', - client_name: 'entur-tavla', - graphql_endpoints: prod_endpoints, -} - -const config = process.env.NEXT_PUBLIC_ENV === 'prod' ? Prod : Staging - -export const firebaseConfig = config.firebaseConfig - -export const geocoder_endpoint = config.geocoder_endpoint - -export const graphql_endpoints = config.graphql_endpoints diff --git a/next-tavla/src/Shared/assets/illustrations/Musk.png b/next-tavla/src/Shared/assets/illustrations/Musk.png new file mode 100644 index 0000000000000000000000000000000000000000..8e43c31fa3004b77554fdf6b3f1f7ae62edabc9b GIT binary patch literal 94282 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
>w75-FDDut!xowLEGUq? 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 +1&U7!p5%`9ErY)9nO=#*9qwuQ|O*|vi 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 literal 0 HcmV?d00001 diff --git a/next-tavla/src/Shared/graphql/utils.ts b/next-tavla/src/Shared/graphql/utils.ts index 57170bb679..f50f533433 100644 --- a/next-tavla/src/Shared/graphql/utils.ts +++ b/next-tavla/src/Shared/graphql/utils.ts @@ -1,16 +1,13 @@ +import { GRAPHQL_ENDPOINTS, TEndpointNames } from 'assets/env' import useSWR from 'swr' import { TypedDocumentString } from './index' -import { - graphql_endpoints, - type TEndpointNames, -} from 'src/Shared/assets/environmentConfig' async function fetcher([query, variables, endpointName]: [ TypedDocumentString, Variables, TEndpointNames, ]) { - return fetch(graphql_endpoints[endpointName], { + return fetch(GRAPHQL_ENDPOINTS[endpointName], { headers: { 'Content-Type': 'application/json', 'ET-Client-Name': 'tavla-test', diff --git a/next-tavla/src/Shared/styles/spacing.css b/next-tavla/src/Shared/styles/spacing.css index 6de3380069..6922d103df 100644 --- a/next-tavla/src/Shared/styles/spacing.css +++ b/next-tavla/src/Shared/styles/spacing.css @@ -78,10 +78,18 @@ padding-bottom: 2em; } +.w-50 { + width: 50%; +} + .w-100 { width: 100%; } +.h-50 { + height: 50%; +} + .h-100 { height: 100%; } diff --git a/next-tavla/src/Shared/types/next.ts b/next-tavla/src/Shared/types/next.ts new file mode 100644 index 0000000000..232f167e62 --- /dev/null +++ b/next-tavla/src/Shared/types/next.ts @@ -0,0 +1,5 @@ +import { IncomingMessage } from 'http' + +export type IncomingNextMessage = { + cookies: { [key: string]: string } +} & IncomingMessage diff --git a/next-tavla/src/Shared/utils/firebase.ts b/next-tavla/src/Shared/utils/firebase.ts index 6ebdcbbfb7..1222de335a 100644 --- a/next-tavla/src/Shared/utils/firebase.ts +++ b/next-tavla/src/Shared/utils/firebase.ts @@ -1,5 +1,6 @@ import { TSettings } from 'types/settings' -import { initializeApp } from 'firebase/app' +import { getApp, getApps, initializeApp } from 'firebase/app' +import { EmailAuthProvider, getAuth } from 'firebase/auth' import { getDoc, addDoc, @@ -8,12 +9,19 @@ import { collection, getFirestore, } from '@firebase/firestore/lite' -import { firebaseConfig } from 'src/Shared/assets/environmentConfig' - -const app = initializeApp(firebaseConfig) +import { FIREBASE_CLIENT_CONFIG } from 'assets/env' +const app = initializeClientApp() +export const auth = getAuth(app) const firestore = getFirestore(app) +export const emailAuthProvider = new EmailAuthProvider() + +function initializeClientApp() { + if (getApps().length > 0) return getApp() + return initializeApp(FIREBASE_CLIENT_CONFIG) +} + export async function getBoardSettings(boardId: string) { const document = await getDoc(doc(firestore, 'settings-v2', boardId)) return document.data() as TSettings diff --git a/next-tavla/yarn.lock b/next-tavla/yarn.lock index 79add0b00f..07449e2d8a 100644 --- a/next-tavla/yarn.lock +++ b/next-tavla/yarn.lock @@ -316,6 +316,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.20.15": + version: 7.22.10 + resolution: "@babel/parser@npm:7.22.10" + bin: + parser: ./bin/babel-parser.js + checksum: af51567b7d3cdf523bc608eae057397486c7fa6c2e5753027c01fe5c36f0767b2d01ce3049b222841326cc5b8c7fda1d810ac1a01af0a97bb04679e2ef9f7049 + languageName: node + linkType: hard + "@babel/plugin-proposal-class-properties@npm:^7.0.0": version: 7.18.6 resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" @@ -942,21 +951,21 @@ __metadata: languageName: node linkType: hard -"@entur/alert@npm:0.14.3": - version: 0.14.3 - resolution: "@entur/alert@npm:0.14.3" +"@entur/alert@npm:0.14.9": + version: 0.14.9 + resolution: "@entur/alert@npm:0.14.9" dependencies: - "@entur/expand": ^3.4.1 - "@entur/icons": ^6.3.0 - "@entur/tokens": ^3.9.0 - "@entur/typography": ^1.8.0 - "@entur/utils": ^0.9.0 + "@entur/expand": ^3.4.7 + "@entur/icons": ^6.4.2 + "@entur/tokens": ^3.10.0 + "@entur/typography": ^1.8.6 + "@entur/utils": ^0.9.3 classnames: ^2.3.1 copy-text-to-clipboard: ^2.2 peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 0affbe82709d9f0aceccde1d0fc9d1492e925aa8019ac8ed3258c752dcf70233f06e95cfe600b4daed5dd1ce5f904e200c34fb122b2be2ccff91841abb61c4d6 + checksum: 3a3e1b2037d1bc950f49618e186adcee0231ca8701dfdc3fc0b10fc3bcdb3bb95e204e1a5bef3f81321cee5f9bd9dbe6b6589fff760f7371771fc6767307bf46 languageName: node linkType: hard @@ -1063,20 +1072,20 @@ __metadata: languageName: node linkType: hard -"@entur/expand@npm:^3.4.1": - version: 3.4.1 - resolution: "@entur/expand@npm:3.4.1" +"@entur/expand@npm:^3.4.7": + version: 3.4.7 + resolution: "@entur/expand@npm:3.4.7" dependencies: - "@entur/icons": ^6.3.0 - "@entur/tokens": ^3.9.0 - "@entur/typography": ^1.8.0 - "@entur/utils": ^0.9.0 + "@entur/icons": ^6.4.2 + "@entur/tokens": ^3.10.0 + "@entur/typography": ^1.8.6 + "@entur/utils": ^0.9.3 classnames: ^2.3.1 react-collapse: ^5.1.0 peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 184391294d142215be982faacd1af81effb296dbcb606c876376ac67a5e8abbc258ade4de01a5bb941bc9d47bc8cf92ac247432217362179451889a8eff77a4b + checksum: a5663aa72a27f645873c3a18a968212075ff81df6b089327abc5d8c9e9ba7238b5994954ab27d18e8476e3001ee75217ad376b11252722acf55227f6937ba5da languageName: node linkType: hard @@ -1140,6 +1149,19 @@ __metadata: languageName: node linkType: hard +"@entur/icons@npm:^6.4.2": + version: 6.4.2 + resolution: "@entur/icons@npm:6.4.2" + dependencies: + "@entur/tokens": ^3.10.0 + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + sass: ^1.58.0 + checksum: fa2679f975040783ae9669535ea1b7cc184d443c2627f97deb760599ad14e1eff5b4c570103a1615a03b38d80b1aea003b5e1028f09c6d2656bfbd2fc22248ac + languageName: node + linkType: hard + "@entur/layout@npm:2.1.33, @entur/layout@npm:^2.1.33": version: 2.1.33 resolution: "@entur/layout@npm:2.1.33" @@ -1335,6 +1357,22 @@ __metadata: languageName: node linkType: hard +"@entur/typography@npm:^1.8.6": + version: 1.8.6 + resolution: "@entur/typography@npm:1.8.6" + dependencies: + "@entur/icons": ^6.4.2 + "@entur/tokens": ^3.10.0 + "@entur/utils": ^0.9.3 + classnames: ^2.3.1 + normalize-scss: ^7.0.1 + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 26aba80c94e5561b8a1cce6c186776df3e1cc0a042d59833bd43e963e4cf1dcf558ee1879360f15b3560c2d3b33bf7e942496bb01d895118b9808e1aba27575c + languageName: node + linkType: hard + "@entur/utils@npm:^0.9.0": version: 0.9.0 resolution: "@entur/utils@npm:0.9.0" @@ -1401,6 +1439,15 @@ __metadata: languageName: node linkType: hard +"@fastify/busboy@npm:^1.2.1": + version: 1.2.1 + resolution: "@fastify/busboy@npm:1.2.1" + dependencies: + text-decoding: ^1.0.0 + checksum: 6e773a2929fd7732fd8ba8f9e1c1b9d622c6165b6e0bed9268e1785f8fd5e8b0a35d6adfe86f15a701bf7783d09c629f3437b3578d34c0246eb26f973ede20f0 + languageName: node + linkType: hard + "@firebase/analytics-compat@npm:0.2.4": version: 0.2.4 resolution: "@firebase/analytics-compat@npm:0.2.4" @@ -1573,7 +1620,7 @@ __metadata: languageName: node linkType: hard -"@firebase/database-compat@npm:0.3.4": +"@firebase/database-compat@npm:0.3.4, @firebase/database-compat@npm:^0.3.4": version: 0.3.4 resolution: "@firebase/database-compat@npm:0.3.4" dependencies: @@ -1587,7 +1634,7 @@ __metadata: languageName: node linkType: hard -"@firebase/database-types@npm:0.10.4": +"@firebase/database-types@npm:0.10.4, @firebase/database-types@npm:^0.10.4": version: 0.10.4 resolution: "@firebase/database-types@npm:0.10.4" dependencies: @@ -1908,6 +1955,68 @@ __metadata: languageName: node linkType: hard +"@google-cloud/firestore@npm:^6.6.0": + version: 6.7.0 + resolution: "@google-cloud/firestore@npm:6.7.0" + dependencies: + fast-deep-equal: ^3.1.1 + functional-red-black-tree: ^1.0.1 + google-gax: ^3.5.7 + protobufjs: ^7.0.0 + checksum: 8464d4d866adcbd80cd528230408f7161a402df7b74d4036b2f81c1f9b83051057364e1c8264477b7a46ce03c2b8fa0d28799f6ccd77d905274a71ca93b2593f + languageName: node + linkType: hard + +"@google-cloud/paginator@npm:^3.0.7": + version: 3.0.7 + resolution: "@google-cloud/paginator@npm:3.0.7" + dependencies: + arrify: ^2.0.0 + extend: ^3.0.2 + checksum: bdecce8a894a0c7f47f13d0e42b2fa142098e1dd34ce571b7216ad624057214baf9066ecf091501b3770da9d7be20b983eda30185c8c6596192cb748f8a0090c + languageName: node + linkType: hard + +"@google-cloud/projectify@npm:^3.0.0": + version: 3.0.0 + resolution: "@google-cloud/projectify@npm:3.0.0" + checksum: 4fa7ad689422b0b9c152fb00260e54e39d81678f9c51518bdb34bc57ee00604524fcdd5837fa97eb2f8ff4811afee3f345b1b0993bc4a2fa1b803bdd6554839a + languageName: node + linkType: hard + +"@google-cloud/promisify@npm:^3.0.0": + version: 3.0.1 + resolution: "@google-cloud/promisify@npm:3.0.1" + checksum: 44b4de760425d6ea328f6208c46219cfcc44383b4015c67a6b18b55b8fee5b754a11f80ed481a7d779bc471950b2b856dce51e36e8004b0d2f73a93e50d756ce + languageName: node + linkType: hard + +"@google-cloud/storage@npm:^6.9.5": + version: 6.12.0 + resolution: "@google-cloud/storage@npm:6.12.0" + dependencies: + "@google-cloud/paginator": ^3.0.7 + "@google-cloud/projectify": ^3.0.0 + "@google-cloud/promisify": ^3.0.0 + abort-controller: ^3.0.0 + async-retry: ^1.3.3 + compressible: ^2.0.12 + duplexify: ^4.0.0 + ent: ^2.2.0 + extend: ^3.0.2 + fast-xml-parser: ^4.2.2 + gaxios: ^5.0.0 + google-auth-library: ^8.0.1 + mime: ^3.0.0 + mime-types: ^2.0.8 + p-limit: ^3.0.1 + retry-request: ^5.0.0 + teeny-request: ^8.0.0 + uuid: ^8.0.0 + checksum: cfe44e3f4d1bacd8eeefa7885d261f421c4ff84e82abe50200b5b77e28322baf9cb67497872b9868b25b43b14197b1a155d5eb7b70afb39d3476fa4bdead3338 + languageName: node + linkType: hard + "@graphql-codegen/add@npm:^3.2.1": version: 3.2.3 resolution: "@graphql-codegen/add@npm:3.2.3" @@ -2639,6 +2748,16 @@ __metadata: languageName: node linkType: hard +"@grpc/grpc-js@npm:~1.8.0": + version: 1.8.21 + resolution: "@grpc/grpc-js@npm:1.8.21" + dependencies: + "@grpc/proto-loader": ^0.7.0 + "@types/node": ">=12.12.47" + checksum: 32bbb3667c20005987eaef0268898fcb49b7bf46e8f338f3ad6f3343e5ff125d63da9aa869b6bca2a918adacf39715d29431461f233c677012206faedbd71169 + languageName: node + linkType: hard + "@grpc/proto-loader@npm:^0.6.13": version: 0.6.13 resolution: "@grpc/proto-loader@npm:0.6.13" @@ -3007,6 +3126,15 @@ __metadata: languageName: node linkType: hard +"@jsdoc/salty@npm:^0.2.1": + version: 0.2.5 + resolution: "@jsdoc/salty@npm:0.2.5" + dependencies: + lodash: ^4.17.21 + checksum: 16c65d48c340d8f1b892797bdd6ace4f90d916d16bed5023f2a5421240ead20e828031dfb1d07b8eb0e172a62f532c3c005287e723e30ee9a0c8a0d7d2e98953 + languageName: node + linkType: hard + "@next/env@npm:13.2.4": version: 13.2.4 resolution: "@next/env@npm:13.2.4" @@ -3527,6 +3655,59 @@ __metadata: languageName: node linkType: hard +"@types/body-parser@npm:*": + version: 1.19.2 + resolution: "@types/body-parser@npm:1.19.2" + dependencies: + "@types/connect": "*" + "@types/node": "*" + checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + languageName: node + linkType: hard + +"@types/connect@npm:*": + version: 3.4.35 + resolution: "@types/connect@npm:3.4.35" + dependencies: + "@types/node": "*" + checksum: fe81351470f2d3165e8b12ce33542eef89ea893e36dd62e8f7d72566dfb7e448376ae962f9f3ea888547ce8b55a40020ca0e01d637fab5d99567673084542641 + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.17.35 + resolution: "@types/express-serve-static-core@npm:4.17.35" + dependencies: + "@types/node": "*" + "@types/qs": "*" + "@types/range-parser": "*" + "@types/send": "*" + checksum: cc8995d10c6feda475ec1b3a0e69eb0f35f21ab6b49129ad5c6f279e0bc5de8175bc04ec51304cb79a43eec3ed2f5a1e01472eb6d5f827b8c35c6ca8ad24eb6e + languageName: node + linkType: hard + +"@types/express@npm:^4.17.14": + version: 4.17.17 + resolution: "@types/express@npm:4.17.17" + dependencies: + "@types/body-parser": "*" + "@types/express-serve-static-core": ^4.17.33 + "@types/qs": "*" + "@types/serve-static": "*" + checksum: 0196dacc275ac3ce89d7364885cb08e7fb61f53ca101f65886dbf1daf9b7eb05c0943e2e4bbd01b0cc5e50f37e0eea7e4cbe97d0304094411ac73e1b7998f4da + languageName: node + linkType: hard + +"@types/glob@npm:*": + version: 8.1.0 + resolution: "@types/glob@npm:8.1.0" + dependencies: + "@types/minimatch": ^5.1.2 + "@types/node": "*" + checksum: 9101f3a9061e40137190f70626aa0e202369b5ec4012c3fabe6f5d229cce04772db9a94fa5a0eb39655e2e4ad105c38afbb4af56a56c0996a8c7d4fc72350e3d + languageName: node + linkType: hard + "@types/graceful-fs@npm:^4.1.3": version: 4.1.6 resolution: "@types/graceful-fs@npm:4.1.6" @@ -3536,6 +3717,13 @@ __metadata: languageName: node linkType: hard +"@types/http-errors@npm:*": + version: 2.0.1 + resolution: "@types/http-errors@npm:2.0.1" + checksum: 3bb0c50b0a652e679a84c30cd0340d696c32ef6558518268c238840346c077f899315daaf1c26c09c57ddd5dc80510f2a7f46acd52bf949e339e35ed3ee9654f + languageName: node + linkType: hard + "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": version: 2.0.4 resolution: "@types/istanbul-lib-coverage@npm:2.0.4" @@ -3600,6 +3788,22 @@ __metadata: languageName: node linkType: hard +"@types/jsonwebtoken@npm:^9.0.0": + version: 9.0.2 + resolution: "@types/jsonwebtoken@npm:9.0.2" + dependencies: + "@types/node": "*" + checksum: 3bb8d40e78d7eb53e427db6e9f0f22e0890cfee80965dcf741d08341814913afb211306de6e9847c6d241cc8e36f8a59090cbfdcc510ab7c81af9d650c5afe0e + languageName: node + linkType: hard + +"@types/linkify-it@npm:*": + version: 3.0.2 + resolution: "@types/linkify-it@npm:3.0.2" + checksum: dff8f10fafb885422474e456596f12d518ec4cdd6c33cca7a08e7c86b912d301ed91cf5a7613e148c45a12600dc9ab3d85ad16d5b48dc1aaeda151a68f16b536 + languageName: node + linkType: hard + "@types/lodash@npm:4.14.191": version: 4.14.191 resolution: "@types/lodash@npm:4.14.191" @@ -3607,13 +3811,51 @@ __metadata: languageName: node linkType: hard -"@types/long@npm:^4.0.1": +"@types/long@npm:^4.0.0, @types/long@npm:^4.0.1": version: 4.0.2 resolution: "@types/long@npm:4.0.2" checksum: d16cde7240d834cf44ba1eaec49e78ae3180e724cd667052b194a372f350d024cba8dd3f37b0864931683dab09ca935d52f0c4c1687178af5ada9fc85b0635f4 languageName: node linkType: hard +"@types/markdown-it@npm:^12.2.3": + version: 12.2.3 + resolution: "@types/markdown-it@npm:12.2.3" + dependencies: + "@types/linkify-it": "*" + "@types/mdurl": "*" + checksum: 868824a3e4d00718ba9cd4762cf16694762a670860f4b402e6e9f952b6841a2027488bdc55d05c2b960bf5078df21a9d041270af7e8949514645fe88fdb722ac + languageName: node + linkType: hard + +"@types/mdurl@npm:*": + version: 1.0.2 + resolution: "@types/mdurl@npm:1.0.2" + checksum: 79c7e523b377f53cf1f5a240fe23d0c6cae856667692bd21bf1d064eafe5ccc40ae39a2aa0a9a51e8c94d1307228c8f6b121e847124591a9a828c3baf65e86e2 + languageName: node + linkType: hard + +"@types/mime@npm:*": + version: 3.0.1 + resolution: "@types/mime@npm:3.0.1" + checksum: 4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7 + languageName: node + linkType: hard + +"@types/mime@npm:^1": + version: 1.3.2 + resolution: "@types/mime@npm:1.3.2" + checksum: 0493368244cced1a69cb791b485a260a422e6fcc857782e1178d1e6f219f1b161793e9f87f5fae1b219af0f50bee24fcbe733a18b4be8fdd07a38a8fb91146fd + languageName: node + linkType: hard + +"@types/minimatch@npm:^5.1.2": + version: 5.1.2 + resolution: "@types/minimatch@npm:5.1.2" + checksum: 0391a282860c7cb6fe262c12b99564732401bdaa5e395bee9ca323c312c1a0f45efbf34dce974682036e857db59a5c9b1da522f3d6055aeead7097264c8705a8 + languageName: node + linkType: hard + "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": version: 20.3.1 resolution: "@types/node@npm:20.3.1" @@ -3656,6 +3898,20 @@ __metadata: languageName: node linkType: hard +"@types/qs@npm:*": + version: 6.9.7 + resolution: "@types/qs@npm:6.9.7" + checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba + languageName: node + linkType: hard + +"@types/range-parser@npm:*": + version: 1.2.4 + resolution: "@types/range-parser@npm:1.2.4" + checksum: b7c0dfd5080a989d6c8bb0b6750fc0933d9acabeb476da6fe71d8bdf1ab65e37c136169d84148034802f48378ab94e3c37bb4ef7656b2bec2cb9c0f8d4146a95 + languageName: node + linkType: hard + "@types/react@npm:18.0.28": version: 18.0.28 resolution: "@types/react@npm:18.0.28" @@ -3667,6 +3923,16 @@ __metadata: languageName: node linkType: hard +"@types/rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "@types/rimraf@npm:3.0.2" + dependencies: + "@types/glob": "*" + "@types/node": "*" + checksum: b47fa302f46434cba704d20465861ad250df79467d3d289f9d6490d3aeeb41e8cb32dd80bd1a8fd833d1e185ac719fbf9be12e05ad9ce9be094d8ee8f1405347 + languageName: node + linkType: hard + "@types/scheduler@npm:*": version: 0.16.3 resolution: "@types/scheduler@npm:0.16.3" @@ -3681,6 +3947,27 @@ __metadata: languageName: node linkType: hard +"@types/send@npm:*": + version: 0.17.1 + resolution: "@types/send@npm:0.17.1" + dependencies: + "@types/mime": ^1 + "@types/node": "*" + checksum: 10b620a5960058ef009afbc17686f680d6486277c62f640845381ec4baa0ea683fdd77c3afea4803daf5fcddd3fb2972c8aa32e078939f1d4e96f83195c89793 + languageName: node + linkType: hard + +"@types/serve-static@npm:*": + version: 1.15.2 + resolution: "@types/serve-static@npm:1.15.2" + dependencies: + "@types/http-errors": "*" + "@types/mime": "*" + "@types/node": "*" + checksum: 15c261dbfc57890f7cc17c04d5b22b418dfa0330c912b46c5d8ae2064da5d6f844ef7f41b63c7f4bbf07675e97ebe6ac804b032635ec742ae45d6f1274259b3e + languageName: node + linkType: hard + "@types/sinonjs__fake-timers@npm:8.1.1": version: 8.1.1 resolution: "@types/sinonjs__fake-timers@npm:8.1.1" @@ -3973,6 +4260,15 @@ __metadata: languageName: node linkType: hard +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: ^5.0.0 + checksum: 170bdba9b47b7e65906a28c8ce4f38a7a369d78e2271706f020849c1bfe0ee2067d4261df8bbb66eb84f79208fd5b710df759d64191db58cfba7ce8ef9c54b75 + languageName: node + linkType: hard + "acorn-globals@npm:^7.0.0": version: 7.0.1 resolution: "acorn-globals@npm:7.0.1" @@ -4033,6 +4329,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.9.0": + version: 8.10.0 + resolution: "acorn@npm:8.10.0" + bin: + acorn: bin/acorn + checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -4293,6 +4598,13 @@ __metadata: languageName: node linkType: hard +"arrify@npm:^2.0.0": + version: 2.0.1 + resolution: "arrify@npm:2.0.1" + checksum: 067c4c1afd182806a82e4c1cb8acee16ab8b5284fbca1ce29408e6e91281c36bb5b612f6ddfbd40a0f7a7e0c75bf2696eb94c027f6e328d6e9c52465c98e4209 + languageName: node + linkType: hard + "asap@npm:~2.0.3": version: 2.0.6 resolution: "asap@npm:2.0.6" @@ -4341,6 +4653,15 @@ __metadata: languageName: node linkType: hard +"async-retry@npm:^1.3.3": + version: 1.3.3 + resolution: "async-retry@npm:1.3.3" + dependencies: + retry: 0.13.1 + checksum: 38a7152ff7265a9321ea214b9c69e8224ab1febbdec98efbbde6e562f17ff68405569b796b1c5271f354aef8783665d29953f051f68c1fc45306e61aec82fdc4 + languageName: node + linkType: hard + "async@npm:^3.2.0": version: 3.2.4 resolution: "async@npm:3.2.4" @@ -4533,7 +4854,7 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.1": +"base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 @@ -4556,6 +4877,13 @@ __metadata: languageName: node linkType: hard +"bignumber.js@npm:^9.0.0": + version: 9.1.1 + resolution: "bignumber.js@npm:9.1.1" + checksum: ad243b7e2f9120b112d670bb3d674128f0bd2ca1745b0a6c9df0433bd2c0252c43e6315d944c2ac07b4c639e7496b425e46842773cf89c6a2dcd4f31e5c4b11e + languageName: node + linkType: hard + "bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" @@ -4648,6 +4976,13 @@ __metadata: languageName: node linkType: hard +"buffer-equal-constant-time@npm:1.0.1": + version: 1.0.1 + resolution: "buffer-equal-constant-time@npm:1.0.1" + checksum: 80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -4776,6 +5111,15 @@ __metadata: languageName: node linkType: hard +"catharsis@npm:^0.9.0": + version: 0.9.0 + resolution: "catharsis@npm:0.9.0" + dependencies: + lodash: ^4.17.15 + checksum: da867df1fd01823ea5a7283886ba382f6eb5b1fe5af356e00fd944a02d9b867f4ea2fc7f61416c53427f62760fdbd41614f6e8ae37686d2c3a4696871526df20 + languageName: node + linkType: hard + "chalk@npm:5.2.0": version: 5.2.0 resolution: "chalk@npm:5.2.0" @@ -5101,6 +5445,15 @@ __metadata: languageName: node linkType: hard +"compressible@npm:^2.0.12": + version: 2.0.18 + resolution: "compressible@npm:2.0.18" + dependencies: + mime-db: ">= 1.43.0 < 2" + checksum: 58321a85b375d39230405654721353f709d0c1442129e9a17081771b816302a012471a9b8f4864c7dbe02eef7f2aaac3c614795197092262e94b409c9be108f0 + languageName: node + linkType: hard + "compute-scroll-into-view@npm:^1.0.17": version: 1.0.20 resolution: "compute-scroll-into-view@npm:1.0.20" @@ -5653,6 +6006,18 @@ __metadata: languageName: node linkType: hard +"duplexify@npm:^4.0.0": + version: 4.1.2 + resolution: "duplexify@npm:4.1.2" + dependencies: + end-of-stream: ^1.4.1 + inherits: ^2.0.3 + readable-stream: ^3.1.1 + stream-shift: ^1.0.0 + checksum: 964376c61c0e92f6ed0694b3ba97c84f199413dc40ab8dfdaef80b7a7f4982fcabf796214e28ed614a5bc1ec45488a29b81e7d46fa3f5ddf65bcb118c20145ad + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -5670,6 +6035,15 @@ __metadata: languageName: node linkType: hard +"ecdsa-sig-formatter@npm:1.0.11, ecdsa-sig-formatter@npm:^1.0.11": + version: 1.0.11 + resolution: "ecdsa-sig-formatter@npm:1.0.11" + dependencies: + safe-buffer: ^5.0.1 + checksum: 207f9ab1c2669b8e65540bce29506134613dd5f122cccf1e6a560f4d63f2732d427d938f8481df175505aad94583bcb32c688737bb39a6df0625f903d6d93c03 + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.4.431": version: 1.4.437 resolution: "electron-to-chromium@npm:1.4.437" @@ -5707,7 +6081,7 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.1.0": +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": version: 1.4.4 resolution: "end-of-stream@npm:1.4.4" dependencies: @@ -5745,6 +6119,13 @@ __metadata: languageName: node linkType: hard +"ent@npm:^2.2.0": + version: 2.2.0 + resolution: "ent@npm:2.2.0" + checksum: f588b5707d6fef36011ea10d530645912a69530a1eb0831f8708c498ac028363a7009f45cfadd28ceb4dafd9ac17ec15213f88d09ce239cd033cfe1328dd7d7d + languageName: node + linkType: hard + "entities@npm:^4.4.0": version: 4.5.0 resolution: "entities@npm:4.5.0" @@ -5752,6 +6133,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:~2.1.0": + version: 2.1.0 + resolution: "entities@npm:2.1.0" + checksum: a10a877e489586a3f6a691fe49bf3fc4e58f06c8e80522f08214a5150ba457e7017b447d4913a3fa041bda06ee4c92517baa4d8d75373eaa79369e9639225ffd + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -5900,6 +6288,25 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^1.13.0": + version: 1.14.3 + resolution: "escodegen@npm:1.14.3" + dependencies: + esprima: ^4.0.1 + estraverse: ^4.2.0 + esutils: ^2.0.2 + optionator: ^0.8.1 + source-map: ~0.6.1 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 381cdc4767ecdb221206bbbab021b467bbc2a6f5c9a99c9e6353040080bdd3dfe73d7604ad89a47aca6ea7d58bc635f6bd3fbc8da9a1998e9ddfa8372362ccd0 + languageName: node + linkType: hard + "escodegen@npm:^2.0.0": version: 2.0.0 resolution: "escodegen@npm:2.0.0" @@ -6172,6 +6579,17 @@ __metadata: languageName: node linkType: hard +"espree@npm:^9.0.0": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: ^8.9.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.4.1 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + languageName: node + linkType: hard + "espree@npm:^9.5.0, espree@npm:^9.5.2": version: 9.5.2 resolution: "espree@npm:9.5.2" @@ -6211,7 +6629,7 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1": +"estraverse@npm:^4.1.1, estraverse@npm:^4.2.0": version: 4.3.0 resolution: "estraverse@npm:4.3.0" checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 @@ -6232,6 +6650,13 @@ __metadata: languageName: node linkType: hard +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 1ffe3bb22a6d51bdeb6bf6f7cf97d2ff4a74b017ad12284cc9e6a279e727dc30a5de6bb613e5596ff4dc3e517841339ad09a7eec44266eccb1aa201a30448166 + languageName: node + linkType: hard + "eventemitter2@npm:6.4.7": version: 6.4.7 resolution: "eventemitter2@npm:6.4.7" @@ -6326,7 +6751,7 @@ __metadata: languageName: node linkType: hard -"extend@npm:~3.0.2": +"extend@npm:^3.0.2, extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" checksum: a50a8309ca65ea5d426382ff09f33586527882cf532931cb08ca786ea3146c0553310bda688710ff61d7668eba9f96b923fe1420cdf56a2c3eaf30fcab87b515 @@ -6439,6 +6864,13 @@ __metadata: languageName: node linkType: hard +"fast-text-encoding@npm:^1.0.0, fast-text-encoding@npm:^1.0.3": + version: 1.0.6 + resolution: "fast-text-encoding@npm:1.0.6" + checksum: 9d58f694314b3283e785bf61954902536da228607ad246905e30256f9ab8331f780ac987e7222c9f5eafd04168d07e12b8054c85cedb76a2c05af0e82387a903 + languageName: node + linkType: hard + "fast-url-parser@npm:^1.1.3": version: 1.1.3 resolution: "fast-url-parser@npm:1.1.3" @@ -6448,6 +6880,17 @@ __metadata: languageName: node linkType: hard +"fast-xml-parser@npm:^4.2.2": + version: 4.2.7 + resolution: "fast-xml-parser@npm:4.2.7" + dependencies: + strnum: ^1.0.5 + bin: + fxparser: src/cli/cli.js + checksum: d8b0c9e04756f6c43fa0399428f30149acadae21350e42e26e8fe98e24e6afa6b9b00aa554453795036b00e9fee974a1b556fe2ba18be391d51a9bf1ab790e7c + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.15.0 resolution: "fastq@npm:1.15.0" @@ -6563,6 +7006,29 @@ __metadata: languageName: node linkType: hard +"firebase-admin@npm:11.10.1": + version: 11.10.1 + resolution: "firebase-admin@npm:11.10.1" + dependencies: + "@fastify/busboy": ^1.2.1 + "@firebase/database-compat": ^0.3.4 + "@firebase/database-types": ^0.10.4 + "@google-cloud/firestore": ^6.6.0 + "@google-cloud/storage": ^6.9.5 + "@types/node": ">=12.12.47" + jsonwebtoken: ^9.0.0 + jwks-rsa: ^3.0.1 + node-forge: ^1.3.1 + uuid: ^9.0.0 + dependenciesMeta: + "@google-cloud/firestore": + optional: true + "@google-cloud/storage": + optional: true + checksum: e0ba6795be4064b0713c83d305894b79d1543d9129e4b531ee9f299020923b36b0c3ed7509ced9fe02ca5a65f030077eee9bcfa20c29919a0996ef7e7a5caeaa + languageName: node + linkType: hard + "firebase@npm:9.18.0": version: 9.18.0 resolution: "firebase@npm:9.18.0" @@ -6746,8 +7212,15 @@ __metadata: languageName: node linkType: hard -"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": - version: 1.2.3 +"functional-red-black-tree@npm:^1.0.1": + version: 1.0.1 + resolution: "functional-red-black-tree@npm:1.0.1" + checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": + version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 languageName: node @@ -6769,6 +7242,28 @@ __metadata: languageName: node linkType: hard +"gaxios@npm:^5.0.0, gaxios@npm:^5.0.1": + version: 5.1.3 + resolution: "gaxios@npm:5.1.3" + dependencies: + extend: ^3.0.2 + https-proxy-agent: ^5.0.0 + is-stream: ^2.0.0 + node-fetch: ^2.6.9 + checksum: 1cf72697715c64f6db1d6fa6e9243bb57ee14b0c758338a33790ecac2675d819a1fc0c51b2fab312d9bfe8201cc981c171b70ff60adcaaec881c5bc5610c42f1 + languageName: node + linkType: hard + +"gcp-metadata@npm:^5.3.0": + version: 5.3.0 + resolution: "gcp-metadata@npm:5.3.0" + dependencies: + gaxios: ^5.0.0 + json-bigint: ^1.0.0 + checksum: 891ea0b902a17f33d7bae753830d23962b63af94ed071092c30496e7d26f8128ba9af43c3d38474bea29cb32a884b4bcb5720ce8b9de4a7e1108475d3d7ae219 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -6938,6 +7433,19 @@ __metadata: languageName: node linkType: hard +"glob@npm:^8.0.0": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 + languageName: node + linkType: hard + "global-dirs@npm:^3.0.0": version: 3.0.1 resolution: "global-dirs@npm:3.0.1" @@ -6999,6 +7507,60 @@ __metadata: languageName: node linkType: hard +"google-auth-library@npm:^8.0.1, google-auth-library@npm:^8.0.2": + version: 8.9.0 + resolution: "google-auth-library@npm:8.9.0" + dependencies: + arrify: ^2.0.0 + base64-js: ^1.3.0 + ecdsa-sig-formatter: ^1.0.11 + fast-text-encoding: ^1.0.0 + gaxios: ^5.0.0 + gcp-metadata: ^5.3.0 + gtoken: ^6.1.0 + jws: ^4.0.0 + lru-cache: ^6.0.0 + checksum: 8e0bc5f1e91804523786413bf4358e4c5ad94b1e873c725ddd03d0f1c242e2b38e26352c0f375334fbc1d94110f761b304aa0429de49b4a27ebc3875a5b56644 + languageName: node + linkType: hard + +"google-gax@npm:^3.5.7": + version: 3.6.1 + resolution: "google-gax@npm:3.6.1" + dependencies: + "@grpc/grpc-js": ~1.8.0 + "@grpc/proto-loader": ^0.7.0 + "@types/long": ^4.0.0 + "@types/rimraf": ^3.0.2 + abort-controller: ^3.0.0 + duplexify: ^4.0.0 + fast-text-encoding: ^1.0.3 + google-auth-library: ^8.0.2 + is-stream-ended: ^0.1.4 + node-fetch: ^2.6.1 + object-hash: ^3.0.0 + proto3-json-serializer: ^1.0.0 + protobufjs: 7.2.4 + protobufjs-cli: 1.1.1 + retry-request: ^5.0.0 + bin: + compileProtos: build/tools/compileProtos.js + minifyProtoJson: build/tools/minify.js + checksum: 16e5fb211d75c6a4cb4d2e62adba7bbf41d160feba74fe39435a70fc31ef8ebc740af4527a2897abab39a1806d131792b2a761da432ae1b916198c9c43aab36e + languageName: node + linkType: hard + +"google-p12-pem@npm:^4.0.0": + version: 4.0.1 + resolution: "google-p12-pem@npm:4.0.1" + dependencies: + node-forge: ^1.3.1 + bin: + gp12-pem: build/src/bin/gp12-pem.js + checksum: 59a5026331ea67455672e83770da29f09d979f02e06cb2227ea5916f8cca437887c2d3869f2602a686dc84437886ae9d2ac010780803cbe8e5f161c2d02d8efd + languageName: node + linkType: hard + "gopd@npm:^1.0.1": version: 1.0.1 resolution: "gopd@npm:1.0.1" @@ -7008,7 +7570,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 @@ -7086,6 +7648,17 @@ __metadata: languageName: node linkType: hard +"gtoken@npm:^6.1.0": + version: 6.1.2 + resolution: "gtoken@npm:6.1.2" + dependencies: + gaxios: ^5.0.1 + google-p12-pem: ^4.0.0 + jws: ^4.0.0 + checksum: cf3210afe2ccee8feaa06f0c7eb942e217244a8563a1d0a71aa3095eea545015896741c1d48654d8de35b7b07579f93e25e5dfe817f06b7e753646b67f7a4ecf + languageName: node + linkType: hard + "handlebars@npm:4.7.7": version: 4.7.7 resolution: "handlebars@npm:4.7.7" @@ -7752,6 +8325,13 @@ __metadata: languageName: node linkType: hard +"is-stream-ended@npm:^0.1.4": + version: 0.1.4 + resolution: "is-stream-ended@npm:0.1.4" + checksum: 56cbc9cfa0a77877777a3df9e186abb5b0ca73dcbcaf0fd87ed573fb8f8e61283abec0fc072c9e3412336edc04449439b8a128d2bcc6c2797158de5465cfaf85 + languageName: node + linkType: hard + "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -8454,7 +9034,7 @@ __metadata: languageName: node linkType: hard -"jose@npm:^4.11.4": +"jose@npm:^4.10.4, jose@npm:^4.11.4": version: 4.14.4 resolution: "jose@npm:4.14.4" checksum: 2d820a91a8fd97c05d8bc8eedc373b944a0cd7f5fe41063086da233d0473c73fb523912a9f026ea870782bd221f4a515f441a2d3af4de48c6f2c76dac5082377 @@ -8498,6 +9078,15 @@ __metadata: languageName: node linkType: hard +"js2xmlparser@npm:^4.0.2": + version: 4.0.2 + resolution: "js2xmlparser@npm:4.0.2" + dependencies: + xmlcreate: ^2.0.4 + checksum: 55e3af71dc0104941dfc3e85452230db42ff3870a5777d1ea26bc0c68743f49113a517a7b305421a932b29f10058a012a7da8f5ba07860a05a1dce9fe5b62962 + languageName: node + linkType: hard + "jsbn@npm:~0.1.0": version: 0.1.1 resolution: "jsbn@npm:0.1.1" @@ -8505,6 +9094,31 @@ __metadata: languageName: node linkType: hard +"jsdoc@npm:^4.0.0": + version: 4.0.2 + resolution: "jsdoc@npm:4.0.2" + dependencies: + "@babel/parser": ^7.20.15 + "@jsdoc/salty": ^0.2.1 + "@types/markdown-it": ^12.2.3 + bluebird: ^3.7.2 + catharsis: ^0.9.0 + escape-string-regexp: ^2.0.0 + js2xmlparser: ^4.0.2 + klaw: ^3.0.0 + markdown-it: ^12.3.2 + markdown-it-anchor: ^8.4.1 + marked: ^4.0.10 + mkdirp: ^1.0.4 + requizzle: ^0.2.3 + strip-json-comments: ^3.1.0 + underscore: ~1.13.2 + bin: + jsdoc: jsdoc.js + checksum: 04bf5ab005349b7581bd0e72ed99933eb71a41dcb47235b486b7d9146fbdf212a53e0cc044abe48ccf46012bd812dc1dfc007c6d679660ebdd053cd000242515 + languageName: node + linkType: hard + "jsdom@npm:^20.0.0": version: 20.0.3 resolution: "jsdom@npm:20.0.3" @@ -8553,6 +9167,15 @@ __metadata: languageName: node linkType: hard +"json-bigint@npm:^1.0.0": + version: 1.0.0 + resolution: "json-bigint@npm:1.0.0" + dependencies: + bignumber.js: ^9.0.0 + checksum: c67bb93ccb3c291e60eb4b62931403e378906aab113ec1c2a8dd0f9a7f065ad6fd9713d627b732abefae2e244ac9ce1721c7a3142b2979532f12b258634ce6f6 + languageName: node + linkType: hard + "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" @@ -8654,6 +9277,18 @@ __metadata: languageName: node linkType: hard +"jsonwebtoken@npm:^9.0.0": + version: 9.0.1 + resolution: "jsonwebtoken@npm:9.0.1" + dependencies: + jws: ^3.2.2 + lodash: ^4.17.21 + ms: ^2.1.1 + semver: ^7.3.8 + checksum: 0eafe268896f4e8f9ab1f0f20e8c645721b7a9cddc41c0aba1e58da5c34564e8c9990817c1a5b646d795bcbb1339350826fe57c4569b5379ba9eea4a9aa5bbd0 + languageName: node + linkType: hard + "jsprim@npm:^2.0.2": version: 2.0.2 resolution: "jsprim@npm:2.0.2" @@ -8676,6 +9311,71 @@ __metadata: languageName: node linkType: hard +"jwa@npm:^1.4.1": + version: 1.4.1 + resolution: "jwa@npm:1.4.1" + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: ^5.0.1 + checksum: ff30ea7c2dcc61f3ed2098d868bf89d43701605090c5b21b5544b512843ec6fd9e028381a4dda466cbcdb885c2d1150f7c62e7168394ee07941b4098e1035e2f + languageName: node + linkType: hard + +"jwa@npm:^2.0.0": + version: 2.0.0 + resolution: "jwa@npm:2.0.0" + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: ^5.0.1 + checksum: 8f00b71ad5fe94cb55006d0d19202f8f56889109caada2f7eeb63ca81755769ce87f4f48101967f398462e3b8ae4faebfbd5a0269cb755dead5d63c77ba4d2f1 + languageName: node + linkType: hard + +"jwks-rsa@npm:^3.0.1": + version: 3.0.1 + resolution: "jwks-rsa@npm:3.0.1" + dependencies: + "@types/express": ^4.17.14 + "@types/jsonwebtoken": ^9.0.0 + debug: ^4.3.4 + jose: ^4.10.4 + limiter: ^1.1.5 + lru-memoizer: ^2.1.4 + checksum: 943bf7792d23761c1e9d1f4d1b67e967ea5b38968583a87a7c862f6df0b9c4a5a34a97fa82efcd375776476664b2916df757aafab69013ab05d3e1fa9fbc1363 + languageName: node + linkType: hard + +"jws@npm:^3.2.2": + version: 3.2.2 + resolution: "jws@npm:3.2.2" + dependencies: + jwa: ^1.4.1 + safe-buffer: ^5.0.1 + checksum: f0213fe5b79344c56cd443428d8f65c16bf842dc8cb8f5aed693e1e91d79c20741663ad6eff07a6d2c433d1831acc9814e8d7bada6a0471fbb91d09ceb2bf5c2 + languageName: node + linkType: hard + +"jws@npm:^4.0.0": + version: 4.0.0 + resolution: "jws@npm:4.0.0" + dependencies: + jwa: ^2.0.0 + safe-buffer: ^5.0.1 + checksum: d68d07aa6d1b8cb35c363a9bd2b48f15064d342a5d9dc18a250dbbce8dc06bd7e4792516c50baa16b8d14f61167c19e851fd7f66b59ecc68b7f6a013759765f7 + languageName: node + linkType: hard + +"klaw@npm:^3.0.0": + version: 3.0.0 + resolution: "klaw@npm:3.0.0" + dependencies: + graceful-fs: ^4.1.9 + checksum: 1bf9de22392c80d28de8a2babd6f0de29fa52fcdc1654838fd35174b3641c168ec32b8b03022191e3c190efd535c31fce23f85e29cb260245571da7263ef418e + languageName: node + linkType: hard + "kleur@npm:^3.0.3": version: 3.0.3 resolution: "kleur@npm:3.0.3" @@ -8733,6 +9433,13 @@ __metadata: languageName: node linkType: hard +"limiter@npm:^1.1.5": + version: 1.1.5 + resolution: "limiter@npm:1.1.5" + checksum: 2d51d3a8bef131aada820b76530f8223380a0079aa0fffdfd3ec47ac2f65763225cb4c62a2f22347f4898c5eeb248edfec991c4a4f5b608dfca0aaa37ac48071 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -8740,6 +9447,15 @@ __metadata: languageName: node linkType: hard +"linkify-it@npm:^3.0.1": + version: 3.0.3 + resolution: "linkify-it@npm:3.0.3" + dependencies: + uc.micro: ^1.0.1 + checksum: 31367a4bb70c5bbc9703246236b504b0a8e049bcd4e0de4291fa50f0ebdebf235b5eb54db6493cb0b1319357c6eeafc4324c9f4aa34b0b943d9f2e11a1268fbc + languageName: node + linkType: hard + "listr2@npm:^3.8.3": version: 3.14.0 resolution: "listr2@npm:3.14.0" @@ -8807,6 +9523,13 @@ __metadata: languageName: node linkType: hard +"lodash.clonedeep@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.clonedeep@npm:4.5.0" + checksum: 92c46f094b064e876a23c97f57f81fbffd5d760bf2d8a1c61d85db6d1e488c66b0384c943abee4f6af7debf5ad4e4282e74ff83177c9e63d8ff081a4837c3489 + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -8821,7 +9544,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.17.21, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.0": +"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -8925,6 +9648,26 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:~4.0.0": + version: 4.0.2 + resolution: "lru-cache@npm:4.0.2" + dependencies: + pseudomap: ^1.0.1 + yallist: ^2.0.0 + checksum: 1f615ef23f3316c0935533df2a14f66050502ffd0841726ea3dbaceac09a1bb80cd0c1f8799a881c4d13fe2cdebbd7919668a54eae4ec97caf66141e56b5c3bb + languageName: node + linkType: hard + +"lru-memoizer@npm:^2.1.4": + version: 2.2.0 + resolution: "lru-memoizer@npm:2.2.0" + dependencies: + lodash.clonedeep: ^4.5.0 + lru-cache: ~4.0.0 + checksum: 555f672b3ff6b4fec63792ca1cda7b585fc54f5e8f0b73166e6d513cc4103032cd69f5d40b32700807c9ca94671728e9108a3fe0803fc3f1b08716946c5a6098 + languageName: node + linkType: hard + "lz-string@npm:^1.5.0": version: 1.5.0 resolution: "lz-string@npm:1.5.0" @@ -8982,6 +9725,47 @@ __metadata: languageName: node linkType: hard +"markdown-it-anchor@npm:^8.4.1": + version: 8.6.7 + resolution: "markdown-it-anchor@npm:8.6.7" + peerDependencies: + "@types/markdown-it": "*" + markdown-it: "*" + checksum: 828236768ac7f61ed5591393c1b1bfc5dbf2b6d0c58a3deec606c61dddaa12658a34450cbef37ab50a04453e618ce1efd47d86e4e52595024334898fd306225b + languageName: node + linkType: hard + +"markdown-it@npm:^12.3.2": + version: 12.3.2 + resolution: "markdown-it@npm:12.3.2" + dependencies: + argparse: ^2.0.1 + entities: ~2.1.0 + linkify-it: ^3.0.1 + mdurl: ^1.0.1 + uc.micro: ^1.0.5 + bin: + markdown-it: bin/markdown-it.js + checksum: 890555711c1c00fa03b936ca2b213001a3b9b37dea140d8445ae4130ce16628392aad24b12e2a0a9935336ca5951f2957a38f4e5309a2e38eab44e25ff32a41e + languageName: node + linkType: hard + +"marked@npm:^4.0.10": + version: 4.3.0 + resolution: "marked@npm:4.3.0" + bin: + marked: bin/marked.js + checksum: 0db6817893952c3ec710eb9ceafb8468bf5ae38cb0f92b7b083baa13d70b19774674be04db5b817681fa7c5c6a088f61300815e4dd75a59696f4716ad69f6260 + languageName: node + linkType: hard + +"mdurl@npm:^1.0.1": + version: 1.0.1 + resolution: "mdurl@npm:1.0.1" + checksum: 71731ecba943926bfbf9f9b51e28b5945f9411c4eda80894221b47cc105afa43ba2da820732b436f0798fd3edbbffcd1fc1415843c41a87fea08a41cc1e3d02b + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -9018,14 +9802,14 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.52.0": +"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19": +"mime-types@npm:^2.0.8, mime-types@npm:^2.1.12, mime-types@npm:~2.1.19": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -9034,6 +9818,15 @@ __metadata: languageName: node linkType: hard +"mime@npm:^3.0.0": + version: 3.0.0 + resolution: "mime@npm:3.0.0" + bin: + mime: cli.js + checksum: f43f9b7bfa64534e6b05bd6062961681aeb406a5b53673b53b683f27fcc4e739989941836a355eef831f4478923651ecc739f4a5f6e20a76487b432bfd4db928 + languageName: node + linkType: hard + "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -9066,6 +9859,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: ^2.0.1 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 + languageName: node + linkType: hard + "minimatch@npm:^9.0.1": version: 9.0.1 resolution: "minimatch@npm:9.0.1" @@ -9166,7 +9968,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3": +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -9360,6 +10162,27 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^2.6.9": + version: 2.6.12 + resolution: "node-fetch@npm:2.6.12" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 3bc1655203d47ee8e313c0d96664b9673a3d4dd8002740318e9d27d14ef306693a4b2ef8d6525775056fd912a19e23f3ac0d7111ad8925877b7567b29a625592 + languageName: node + linkType: hard + +"node-forge@npm:^1.3.1": + version: 1.3.1 + resolution: "node-forge@npm:1.3.1" + checksum: 08fb072d3d670599c89a1704b3e9c649ff1b998256737f0e06fbd1a5bf41cae4457ccaee32d95052d80bbafd9ffe01284e078c8071f0267dc9744e51c5ed42a9 + languageName: node + linkType: hard + "node-gyp-build@npm:^4.3.0": version: 4.6.0 resolution: "node-gyp-build@npm:4.6.0" @@ -9491,6 +10314,13 @@ __metadata: languageName: node linkType: hard +"object-hash@npm:^3.0.0": + version: 3.0.0 + resolution: "object-hash@npm:3.0.0" + checksum: 80b4904bb3857c52cc1bfd0b52c0352532ca12ed3b8a6ff06a90cd209dfda1b95cee059a7625eb9da29537027f68ac4619363491eedb2f5d3dddbba97494fd6c + languageName: node + linkType: hard + "object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": version: 1.12.3 resolution: "object-inspect@npm:1.12.3" @@ -9668,7 +10498,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:3.1.0, p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": +"p-limit@npm:3.1.0, p-limit@npm:^3.0.1, p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -10022,6 +10852,58 @@ __metadata: languageName: node linkType: hard +"proto3-json-serializer@npm:^1.0.0": + version: 1.1.1 + resolution: "proto3-json-serializer@npm:1.1.1" + dependencies: + protobufjs: ^7.0.0 + checksum: 0cd94cb635a9b9b3a2d047700175be4a6c7b7a43e2698826edad17604793764bcdfc270585ea58cb94aa690211b6cdaae5bf7a22522bea68ca67a2844773b4b7 + languageName: node + linkType: hard + +"protobufjs-cli@npm:1.1.1": + version: 1.1.1 + resolution: "protobufjs-cli@npm:1.1.1" + dependencies: + chalk: ^4.0.0 + escodegen: ^1.13.0 + espree: ^9.0.0 + estraverse: ^5.1.0 + glob: ^8.0.0 + jsdoc: ^4.0.0 + minimist: ^1.2.0 + semver: ^7.1.2 + tmp: ^0.2.1 + uglify-js: ^3.7.7 + peerDependencies: + protobufjs: ^7.0.0 + bin: + pbjs: bin/pbjs + pbts: bin/pbts + checksum: 124a2cb10d6fccdd6e8f2984b0f7d9a351d9c1efd17f237acd4a9e7c4b82d63265364b1c86bfa5c6a6fa17d7119182c4c323a8972c0078e1ac5c5f653d096f9b + languageName: node + linkType: hard + +"protobufjs@npm:7.2.4": + version: 7.2.4 + resolution: "protobufjs@npm:7.2.4" + dependencies: + "@protobufjs/aspromise": ^1.1.2 + "@protobufjs/base64": ^1.1.2 + "@protobufjs/codegen": ^2.0.4 + "@protobufjs/eventemitter": ^1.1.0 + "@protobufjs/fetch": ^1.1.0 + "@protobufjs/float": ^1.0.2 + "@protobufjs/inquire": ^1.1.0 + "@protobufjs/path": ^1.1.2 + "@protobufjs/pool": ^1.1.0 + "@protobufjs/utf8": ^1.1.0 + "@types/node": ">=13.7.0" + long: ^5.0.0 + checksum: a952cdf2a5e5250c16ae651b570849b6f5b20a5475c3eef63ffb290ad239aa2916adfc1cc676f7fc93c69f48113df268761c0c246f7f023118c85bdd1a170044 + languageName: node + linkType: hard + "protobufjs@npm:^6.11.3": version: 6.11.3 resolution: "protobufjs@npm:6.11.3" @@ -10073,6 +10955,13 @@ __metadata: languageName: node linkType: hard +"pseudomap@npm:^1.0.1": + version: 1.0.2 + resolution: "pseudomap@npm:1.0.2" + checksum: 856c0aae0ff2ad60881168334448e898ad7a0e45fe7386d114b150084254c01e200c957cf378378025df4e052c7890c5bd933939b0e0d2ecfcc1dc2f0b2991f5 + languageName: node + linkType: hard + "psl@npm:^1.1.28, psl@npm:^1.1.33": version: 1.9.0 resolution: "psl@npm:1.9.0" @@ -10304,7 +11193,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -10420,6 +11309,15 @@ __metadata: languageName: node linkType: hard +"requizzle@npm:^0.2.3": + version: 0.2.4 + resolution: "requizzle@npm:0.2.4" + dependencies: + lodash: ^4.17.21 + checksum: fceaa448b235f9ed111aa58360129225a3cec1a897a23293dc08d2a00f001756c042a62df0a9d4d1e2669ace52dec960aea73437f407b30c51bfba2e9da208b7 + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -10519,6 +11417,23 @@ __metadata: languageName: node linkType: hard +"retry-request@npm:^5.0.0": + version: 5.0.2 + resolution: "retry-request@npm:5.0.2" + dependencies: + debug: ^4.1.1 + extend: ^3.0.2 + checksum: d6c95d27f4468aa5557605d811cfaa5862be0eaff9fc5f18a338a7c17a7972fbec5b6142abb6b1e494b4c02df875fec2f1c3a281bf79900d33607d8536277ffe + languageName: node + linkType: hard + +"retry@npm:0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -10662,6 +11577,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.1.2": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + "semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.1": version: 7.5.2 resolution: "semver@npm:7.5.2" @@ -10922,6 +11848,22 @@ __metadata: languageName: node linkType: hard +"stream-events@npm:^1.0.5": + version: 1.0.5 + resolution: "stream-events@npm:1.0.5" + dependencies: + stubs: ^3.0.0 + checksum: 969ce82e34bfbef5734629cc06f9d7f3705a9ceb8fcd6a526332f9159f1f8bbfdb1a453f3ced0b728083454f7706adbbe8428bceb788a0287ca48ba2642dc3fc + languageName: node + linkType: hard + +"stream-shift@npm:^1.0.0": + version: 1.0.1 + resolution: "stream-shift@npm:1.0.1" + checksum: 59b82b44b29ec3699b5519a49b3cedcc6db58c72fb40c04e005525dfdcab1c75c4e0c180b923c380f204bed78211b9bad8faecc7b93dece4d004c3f6ec75737b + languageName: node + linkType: hard + "streamsearch@npm:^1.1.0": version: 1.1.0 resolution: "streamsearch@npm:1.1.0" @@ -11079,6 +12021,20 @@ __metadata: languageName: node linkType: hard +"strnum@npm:^1.0.5": + version: 1.0.5 + resolution: "strnum@npm:1.0.5" + checksum: 651b2031db5da1bf4a77fdd2f116a8ac8055157c5420f5569f64879133825915ad461513e7202a16d7fec63c54fd822410d0962f8ca12385c4334891b9ae6dd2 + languageName: node + linkType: hard + +"stubs@npm:^3.0.0": + version: 3.0.0 + resolution: "stubs@npm:3.0.0" + checksum: dec7b82186e3743317616235c59bfb53284acc312cb9f4c3e97e2205c67a5c158b0ca89db5927e52351582e90a2672822eeaec9db396e23e56893d2a8676e024 + languageName: node + linkType: hard + "styled-jsx@npm:5.1.1": version: 5.1.1 resolution: "styled-jsx@npm:5.1.1" @@ -11195,7 +12151,7 @@ __metadata: "@dnd-kit/modifiers": 6.0.1 "@dnd-kit/sortable": 7.0.2 "@dnd-kit/utilities": 3.2.1 - "@entur/alert": 0.14.3 + "@entur/alert": 0.14.9 "@entur/button": 3.0.8 "@entur/chip": 0.6.39 "@entur/dropdown": 4.0.9 @@ -11229,6 +12185,7 @@ __metadata: eslint-config-prettier: 8.8.0 eslint-plugin-prettier: 4.2.1 firebase: 9.18.0 + firebase-admin: 11.10.1 graphql: 16.6.0 husky: 8.0.3 jest: 29.5.0 @@ -11251,6 +12208,19 @@ __metadata: languageName: node linkType: hard +"teeny-request@npm:^8.0.0": + version: 8.0.3 + resolution: "teeny-request@npm:8.0.3" + dependencies: + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + node-fetch: ^2.6.1 + stream-events: ^1.0.5 + uuid: ^9.0.0 + checksum: 6682a14df3708068db147c91af5f2b2e097e2e53c03dddaef40f6f974297f2da9e6112c615af9fbc84a1685c6846b8a9e485771d1a350aa25e9ff5fcf63dd821 + languageName: node + linkType: hard + "test-exclude@npm:^6.0.0": version: 6.0.0 resolution: "test-exclude@npm:6.0.0" @@ -11262,6 +12232,13 @@ __metadata: languageName: node linkType: hard +"text-decoding@npm:^1.0.0": + version: 1.0.0 + resolution: "text-decoding@npm:1.0.0" + checksum: 4b2359d8efdabea72ac470304e991913e9b82a55b1c33ab5204f115d11305ac5900add80aee5f7d22b2bcf0faebaf35b193d28a10b74adf175d9ac9d63604445 + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -11315,7 +12292,7 @@ __metadata: languageName: node linkType: hard -"tmp@npm:~0.2.1": +"tmp@npm:^0.2.1, tmp@npm:~0.2.1": version: 0.2.1 resolution: "tmp@npm:0.2.1" dependencies: @@ -11551,7 +12528,14 @@ __metadata: languageName: node linkType: hard -"uglify-js@npm:^3.1.4": +"uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": + version: 1.0.6 + resolution: "uc.micro@npm:1.0.6" + checksum: 6898bb556319a38e9cf175e3628689347bd26fec15fc6b29fa38e0045af63075ff3fea4cf1fdba9db46c9f0cbf07f2348cd8844889dd31ebd288c29fe0d27e7a + languageName: node + linkType: hard + +"uglify-js@npm:^3.1.4, uglify-js@npm:^3.7.7": version: 3.17.4 resolution: "uglify-js@npm:3.17.4" bin: @@ -11579,6 +12563,13 @@ __metadata: languageName: node linkType: hard +"underscore@npm:~1.13.2": + version: 1.13.6 + resolution: "underscore@npm:1.13.6" + checksum: d5cedd14a9d0d91dd38c1ce6169e4455bb931f0aaf354108e47bd46d3f2da7464d49b2171a5cf786d61963204a42d01ea1332a903b7342ad428deaafaf70ec36 + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -11732,7 +12723,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": +"uuid@npm:^8.0.0, uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" bin: @@ -11741,6 +12732,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^9.0.0": + version: 9.0.0 + resolution: "uuid@npm:9.0.0" + bin: + uuid: dist/bin/uuid + checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028 + languageName: node + linkType: hard + "v8-to-istanbul@npm:^9.0.1": version: 9.1.0 resolution: "v8-to-istanbul@npm:9.1.0" @@ -12062,6 +13062,13 @@ __metadata: languageName: node linkType: hard +"xmlcreate@npm:^2.0.4": + version: 2.0.4 + resolution: "xmlcreate@npm:2.0.4" + checksum: b8dd52668b9aea77cd1408fa85538c14bb8dcc98b4e7bb51e76696c9c115d59eba7240298d0c4fd2caf8f1a8e283ab4e5c7b9a6bcfcf23a8b48f5068b677b748 + languageName: node + linkType: hard + "y18n@npm:^4.0.0": version: 4.0.3 resolution: "y18n@npm:4.0.3" @@ -12076,6 +13083,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^2.0.0": + version: 2.1.2 + resolution: "yallist@npm:2.1.2" + checksum: 9ba99409209f485b6fcb970330908a6d41fa1c933f75e08250316cce19383179a6b70a7e0721b89672ebb6199cc377bf3e432f55100da6a7d6e11902b0a642cb + languageName: node + linkType: hard + "yallist@npm:^3.0.2": version: 3.1.1 resolution: "yallist@npm:3.1.1" From d7c2757fc6a874ec3b4c943910fc91015ba6084b Mon Sep 17 00:00:00 2001 From: lindtvedtsebastian <46536611+lindtvedtsebastian@users.noreply.github.com> Date: Wed, 23 Aug 2023 12:27:59 +0200 Subject: [PATCH 3/3] chore(ci/cd): added FIREBASE_CONFIG to workflow file (#1172) --- .github/workflows/deploy_next_tavla_staging.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/deploy_next_tavla_staging.yml b/.github/workflows/deploy_next_tavla_staging.yml index 0aba6e0ec6..f350f6fa9a 100644 --- a/.github/workflows/deploy_next_tavla_staging.yml +++ b/.github/workflows/deploy_next_tavla_staging.yml @@ -7,6 +7,8 @@ on: - master paths: - "next-tavla/**" +env: + FIREBASE_CONFIG: ${{ secrets.FIREBASE_CONFIG }} jobs: deploy-staging: