diff --git a/packages/scripts/config-firebase.ts b/packages/scripts/config-firebase.ts deleted file mode 100644 index ffa81491e..000000000 --- a/packages/scripts/config-firebase.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { program } from 'commander' -import { cert, initializeApp } from 'firebase-admin/app' -import { FieldValue, getFirestore } from 'firebase-admin/firestore' -import { getStorage } from 'firebase-admin/storage' -import { getAuth } from 'firebase-admin/auth' -import { firebase_dev_service_account, firebase_prod_service_account } from './service-accounts' -import './record-logs' - -program - .option('-fb, --firebase [dev/prod]', 'Firebase Project', 'dev') - .allowUnknownOption() // because config is shared by multiple scripts - .parse(process.argv) - -export const firebase_environment = program.opts().firebase === 'prod' ? 'prod' : 'dev' -console.log(`Firebase running on ${firebase_environment}`) - -const serviceAccount = firebase_environment === 'dev' ? firebase_dev_service_account : firebase_prod_service_account -export const projectId = serviceAccount.project_id - -initializeApp({ - // @ts-expect-error - credential: cert(serviceAccount), - databaseURL: `https://${projectId}.firebaseio.com`, - storageBucket: `${projectId}.appspot.com`, -}) -export const db = getFirestore() -export const timestamp = FieldValue.serverTimestamp() -export const storage = getStorage() -export const auth = getAuth() diff --git a/packages/scripts/migrate-to-supabase/convert-entries.ts b/packages/scripts/migrate-to-supabase/convert-entries.ts deleted file mode 100644 index 296ed6e64..000000000 --- a/packages/scripts/migrate-to-supabase/convert-entries.ts +++ /dev/null @@ -1,644 +0,0 @@ -import { randomUUID } from 'node:crypto' -import type { TablesInsert } from '@living-dictionaries/types' -import type { ActualDatabaseEntry } from '@living-dictionaries/types/entry.interface' -import type { ActualDatabaseVideo } from '@living-dictionaries/types/video.interface' -import { jacob_ld_user_id } from '../config-supabase' -import { get_supabase_user_id_from_firebase_uid } from './get-user-id' - -interface DataForSupabase { - entry: TablesInsert<'entries'> - senses: TablesInsert<'senses'>[] - sentences: TablesInsert<'sentences'>[] - senses_in_sentences: TablesInsert<'senses_in_sentences'>[] - audios: TablesInsert<'audio'>[] - audio_speakers: TablesInsert<'audio_speakers'>[] - photos: TablesInsert<'photos'>[] - sense_photos: TablesInsert<'sense_photos'>[] - videos: TablesInsert<'videos'>[] - video_speakers: TablesInsert<'video_speakers'>[] - sense_videos: TablesInsert<'sense_videos'>[] - dialects: string[] - new_speaker_name?: string - prior_import_id: string | null -} - -export function convert_entry(_entry: ActualDatabaseEntry & Record, uuid: () => string = randomUUID): [any, DataForSupabase] { - const dict_entry_id = `${_entry.dictionary_id}:${_entry.id}` - if (_entry.deletedVfs) - console.log(`deletedVfs in ${dict_entry_id} - youtubeId: ${_entry.deletedVfs[0].youtubeId}`) - - if (_entry.xv && _entry.xs?.vn) - console.log(`both xv ${_entry.xv} and xs.vn ${_entry.xs.vn} for ${dict_entry_id}`) - - if (_entry.lo && _entry.lo1 && _entry.lo !== _entry.lo1) - console.log(`lost lo: ${_entry.lo} in favor of lo1: ${_entry.lo1} for ${dict_entry_id}`) - - if (_entry.sf && _entry.sfs?.length && !_entry.sfs[0].sp.includes(_entry.sf.sp)) - console.log(`different speakers in ${dict_entry_id} - ${_entry.sf.sp} in sf and ${_entry.sfs[0].sp.join(', ')} sfs`) - - try { - const entry: TablesInsert<'entries'> = { - id: _entry.id!, - dictionary_id: _entry.dictionary_id, - } as TablesInsert<'entries'> - let prior_import_id = null - - if (typeof _entry.updatedAt?.seconds === 'number') { - entry.updated_at = seconds_to_timestamp_string(_entry.updatedAt.seconds) - delete _entry.updatedAt - } - if (typeof _entry.ua?.seconds === 'number') { - entry.updated_at = seconds_to_timestamp_string(_entry.ua.seconds) - delete _entry.ua - } - if (typeof _entry.updatedBy === 'string') { - entry.updated_by = get_supabase_user_id_from_firebase_uid(_entry.updatedBy) - delete _entry.updatedBy - } - if (typeof _entry.ub === 'string') { - entry.updated_by = get_supabase_user_id_from_firebase_uid(_entry.ub) - delete _entry.ub - } - if (typeof _entry.createdAt?.seconds === 'number') { - entry.created_at = seconds_to_timestamp_string(_entry.createdAt.seconds) - delete _entry.createdAt - } - if (typeof _entry.ca?.seconds === 'number') { - entry.created_at = seconds_to_timestamp_string(_entry.ca.seconds) - delete _entry.ca - } - if (typeof _entry.createdBy === 'string') { - entry.created_by = get_supabase_user_id_from_firebase_uid(_entry.createdBy) - delete _entry.createdBy - } - if (typeof _entry.cb === 'string') { - entry.created_by = get_supabase_user_id_from_firebase_uid(_entry.cb) - delete _entry.cb - } - if (typeof _entry.ab === 'string') { - if (!entry.created_by) - entry.created_by = get_supabase_user_id_from_firebase_uid(_entry.ab) - delete _entry.ab - } - - if (entry.created_by === 'OTD' || !entry.created_by) - entry.created_by = jacob_ld_user_id - if (!entry.updated_by) - entry.updated_by = entry.created_by - - const dialects = new Set() - - const first_sense_from_base: TablesInsert<'senses'> = { - entry_id: _entry.id, - created_by: entry.created_by || entry.updated_by, - created_at: entry.created_at || entry.updated_at, - updated_by: entry.updated_by || entry.created_by, - updated_at: entry.updated_at || entry.created_at, - id: uuid(), - } - - if (!_entry.lx) - console.log(`no lexeme for ${dict_entry_id}`) - entry.lexeme = { default: _entry.lx || '' } - delete _entry.lx - - if (typeof _entry.ei === 'number') { - // @ts-expect-error - errors because ei is not typed as a number - entry.elicitation_id = _entry.ei.toString() - delete _entry.ei - } - - for (const [key, value] of Object.entries(_entry) as [keyof ActualDatabaseEntry, any][]) { - if (!value || isEmptyArray(value) || isEmptyObject(value)) { - delete _entry[key] - continue - } - - if (typeof value === 'string') { - if (key === 'ph') { - entry.phonetic = value - delete _entry[key] - continue - } - - if (key === 'ei') { - entry.elicitation_id = value - delete _entry[key] - continue - } - - // @ts-expect-error - not typed - if (key === 'hm') { - entry.unsupported_fields ??= {} - entry.unsupported_fields.hm = value - delete _entry[key] - continue - } - - // @ts-expect-error - not typed - if (key === 'dt') { - entry.unsupported_fields ??= {} - entry.unsupported_fields.dt = value - delete _entry[key] - continue - } - - // @ts-expect-error - not typed - if (key === 'semdom') { - entry.unsupported_fields ??= {} - entry.unsupported_fields.semdom = value - delete _entry[key] - continue - } - - // @ts-expect-error - doesn't have importId typed - if (key === 'ii' || key === 'importId' || key === 'source') { - // @ts-expect-error - prior_import_id = key === 'source' ? value.replace('import: ', '') : value // source key found in miahuatec-zapotec - delete _entry[key] - continue - } - - if (key === 'de') { - first_sense_from_base.definition = { - en: value, - } - delete _entry[key] - continue - } - - if (key === 'nc') { - first_sense_from_base.noun_class = value - delete _entry[key] - continue - } - - if (key === 'nt') { - entry.notes = { default: value } - delete _entry[key] - continue - } - - if (key === 'mr') { - entry.morphology = value - delete _entry[key] - continue - } - - if (key === 'in') { - entry.interlinearization = value - delete _entry[key] - continue - } - - if (key === 'va') { - first_sense_from_base.variant = { default: value } - delete _entry[key] - continue - } - - if (key === 'pl') { - first_sense_from_base.plural_form = { default: value } - delete _entry[key] - continue - } - - if (key === 'lo1') { - entry.lexeme.lo1 = value - delete _entry[key] - continue - } - if (key === 'lo2') { - entry.lexeme.lo2 = value - delete _entry[key] - continue - } - - // lo3, lo4, lo5 are not used yet - if (key === 'lo3') { - entry.lexeme.lo3 = value - delete _entry[key] - continue - } - if (key === 'lo4') { - entry.lexeme.lo4 = value - delete _entry[key] - continue - } - if (key === 'lo5') { - entry.lexeme.lo5 = value - delete _entry[key] - continue - } - } - - if (key === 'di') { - if (typeof value === 'string') - dialects.add(value) - else if (Array.isArray(value)) - value.forEach(d => dialects.add(d)) - delete _entry[key] - continue - } - - if (key === 'ps') { - if (typeof value === 'string') - first_sense_from_base.parts_of_speech = [value] - else if (Array.isArray(value)) - first_sense_from_base.parts_of_speech = value - delete _entry[key] - continue - } - - if (key === 'sd') { - if (typeof value === 'string') { - first_sense_from_base.write_in_semantic_domains = [value] - } else if (Array.isArray(value)) { - first_sense_from_base.write_in_semantic_domains = value - } - delete _entry[key] - continue - } - - if (key === 'scn') { - if (Array.isArray(value)) { - entry.scientific_names = value - delete _entry[key] - continue - } - } - - if (key === 'sdn') { - if (Array.isArray(value)) { - first_sense_from_base.semantic_domains = value - delete _entry[key] - continue - } - } - - if (key === 'sr') { - if (typeof value === 'string') { - entry.sources = [value] - } else if (Array.isArray(value)) { - entry.sources = value - } - delete _entry[key] - continue - } - - if (key === 'co') { - entry.coordinates = value - delete _entry[key] - continue - } - } - - if (_entry.lo) { - if (!entry.lexeme.lo1) { - entry.lexeme.lo1 = _entry.lo - } - delete _entry.lo - } - if (_entry.local_orthography_1) { - entry.lexeme.lo1 = _entry.local_orthography_1 // only 4 times in garifuna and lo1 is just a period in each so we overwrite that one - delete _entry.local_orthography_1 - } - - if (typeof _entry.gl === 'object') { - first_sense_from_base.glosses = _entry.gl - delete _entry.gl - } - - const senses: TablesInsert<'senses'>[] = [first_sense_from_base] - const sentences: TablesInsert<'sentences'>[] = [] - const senses_in_sentences: TablesInsert<'senses_in_sentences'>[] = [] - - let vernacular_sentence: string - let translation: Record = null - if (_entry.xs) { - if (typeof _entry.xs.vernacular === 'string') { - vernacular_sentence = _entry.xs.vernacular - delete _entry.xs.vernacular - } - if (typeof _entry.xs.xv === 'string') { - if (vernacular_sentence) - throw new Error(`xs.vernacular and xs.xv in ${entry.dictionary_id}`) - vernacular_sentence = _entry.xs.xv - delete _entry.xs.xv - } - if (typeof _entry.xs.vn === 'string') { - // if (vernacular_sentence) - // console.log(`xs.vernacular || xs.xv "${vernacular_sentence}" overwritten by xs.vn "${_entry.xs.vn}" for ${entry.id} in ${entry.dictionary_id}`) - vernacular_sentence = _entry.xs.vn - delete _entry.xs.vn - } - for (const key of Object.keys(_entry.xs)) { - translation = { ...(translation || {}), [key]: _entry.xs[key] } - } - delete _entry.xs - } - if (!vernacular_sentence && typeof _entry.xe === 'string') { - vernacular_sentence = _entry.xe - delete _entry.xe - } - if (typeof _entry.xv === 'string') { - if (!vernacular_sentence) - vernacular_sentence = _entry.xv - delete _entry.xv - } - - if (vernacular_sentence) { - const sentence_id = uuid() - - const sentence: TablesInsert<'sentences'> = { - id: sentence_id, - created_by: entry.created_by, - updated_by: entry.updated_by || entry.created_by, - dictionary_id: entry.dictionary_id, - text: { default: vernacular_sentence }, - ...(translation ? { translation } : {}), - } - sentences.push(sentence) - - const sense_in_sentences: TablesInsert<'senses_in_sentences'> = { - sentence_id, - sense_id: first_sense_from_base.id, - created_by: entry.created_by, - ...(entry.created_at ? { created_at: entry.created_at } : {}), - } - senses_in_sentences.push(sense_in_sentences) - } - - const audios: TablesInsert<'audio'>[] = [] - const audio_speakers: TablesInsert<'audio_speakers'>[] = [] - let new_speaker_name: string = null - - if (_entry.sf && !_entry.sf.path) - delete _entry.sf - if (_entry.sf?.path || _entry.sfs?.[0].path) { - const audio_id = uuid() - const sf = _entry.sf?.path ? _entry.sf : _entry.sfs![0] as unknown as ActualDatabaseEntry['sf'] - const { ab, path, ts, cr, sp, speakerName, source } = sf! - if (typeof speakerName === 'string') { - if (speakerName.trim()) - new_speaker_name = speakerName.trim() - delete sf.speakerName - } - delete sf.mt - if (!ab && !entry.created_by) - console.info(`No ab for ${_entry.id} sf`) - const created_by = get_supabase_user_id_from_firebase_uid(ab) || entry.created_by - const audio: TablesInsert<'audio'> = { - id: audio_id, - dictionary_id: entry.dictionary_id, - entry_id: _entry.id, - created_by, - updated_by: created_by, - storage_path: path, - } - delete sf.ab - delete sf.path - if (ts) { - if (ts.toString().length === 13) - audio.created_at = new Date(ts).toISOString() - // @ts-expect-error - else if (typeof ts === 'object' && '_seconds' in ts) - // @ts-expect-error - audio.created_at = seconds_to_timestamp_string(ts._seconds) - else - throw new Error(`odd timestamp for ${_entry.id}: ${ts}`) - audio.updated_at = audio.created_at - delete sf.ts - } - if (cr) { - if (cr !== 'Jacob Bowdoin') - audio.source = cr - delete sf.cr - } - if (source && !cr) { - if (source !== 'local_import' && !source.startsWith('import:')) - audio.source = source - delete sf.source - } - audios.push(audio) - let speaker_id: string = null - if (Array.isArray(sp) && sp.length === 1) { - [speaker_id] = sp - } - if (typeof sp === 'string') { - speaker_id = sp - } - if (speaker_id) { - audio_speakers.push({ - audio_id, - speaker_id, - created_by, - ...(audio.created_at - ? { created_at: audio.created_at } - : entry.created_at - ? { created_at: entry.created_at } - : {}), - }) - delete sf.sp - } - if (sf.sc && sf.sc !== 'local_import') - throw new Error(`unexpected sc in ${_entry.id}: ${sf.sc}`) - delete sf.sc - if (!sf.speakerName) - delete sf.speakerName - if (!Object.keys(sf).length) { - delete _entry.sf - delete _entry.sfs - } - } - - const photos: TablesInsert<'photos'>[] = [] - const sense_photos: TablesInsert<'sense_photos'>[] = [] - - if (_entry.pf) { - const photo_id = uuid() - const { ab, path, ts, sc, cr, gcs, source, uploadedAt, uploadedBy } = _entry.pf - if (uploadedAt) - console.info({ uploadedAt }) - if (!ab && !entry.created_by) - console.info(`No ab for ${_entry.id} pf`) - - const created_by = get_supabase_user_id_from_firebase_uid(ab) || get_supabase_user_id_from_firebase_uid(uploadedBy) || entry.created_by - const photo: TablesInsert<'photos'> = { - id: photo_id, - dictionary_id: entry.dictionary_id, - created_by, - updated_by: created_by, - storage_path: path, - serving_url: remove_newline_from_end(gcs), - } - delete _entry.pf.ab - delete _entry.pf.path - delete _entry.pf.gcs - if (ts) { - if (ts.toString().length === 13) - photo.created_at = new Date(ts).toISOString() - // @ts-expect-error - else if (typeof ts === 'object' && '_seconds' in ts) - // @ts-expect-error - photo.created_at = seconds_to_timestamp_string(ts._seconds) - else - throw new Error(`odd timestamp for ${_entry.id}: ${ts}`) - photo.updated_at = photo.created_at - delete _entry.pf.ts - } - if (cr) { - if (cr !== 'Jacob Bowdoin') - photo.source = cr - delete _entry.pf.cr - } - if (source && !photo.source) { - if (source !== 'local_import' && !source.startsWith('import:')) - photo.source = source - delete _entry.pf.source - } - if (sc && sc !== 'local_import') - throw new Error(`unexpected sc in ${_entry.id}: ${sc}`) - delete _entry.pf.sc - - photos.push(photo) - sense_photos.push({ - photo_id, - sense_id: first_sense_from_base.id, - created_by, - ...(photo.created_at - ? { created_at: photo.created_at } - : entry.created_at - ? { created_at: entry.created_at } - : {}), - }) - if (!Object.keys(_entry.pf).length) - delete _entry.pf - } - - const videos: TablesInsert<'videos'>[] = [] - const sense_videos: TablesInsert<'sense_videos'>[] = [] - const video_speakers: TablesInsert<'video_speakers'>[] = [] - - if (_entry.deletedVfs?.[0].youtubeId) // only keep if a record of stored deleted video - delete _entry.deletedVfs - - if (_entry.vfs?.[0] || _entry.deletedVfs?.[0]) { - const video_id = uuid() - const [vf] = (_entry.vfs || _entry.deletedVfs) as ActualDatabaseVideo[] - const { ts, ab, path, sp, youtubeId, deleted, startAt } = vf - if (!ab && !entry.created_by) - console.info(`No ab for ${_entry.id} vfs`) - const created_by = get_supabase_user_id_from_firebase_uid(ab) || entry.created_by - const video: TablesInsert<'videos'> = { - id: video_id, - dictionary_id: entry.dictionary_id, - created_by, - updated_by: created_by, - } - delete vf.ab - if (path) { - video.storage_path = path - delete vf.path - } - if (youtubeId) { - video.hosted_elsewhere = { - type: 'youtube', - video_id: youtubeId, - ...(startAt ? { start_at_seconds: startAt } : {}), - } - delete vf.youtubeId - delete vf.startAt - } - if (deleted) { - video.deleted = new Date(deleted).toISOString() - delete vf.deleted - } - if (ts) { - if (ts.toString().length === 13) - video.created_at = new Date(ts).toISOString() - else - throw new Error(`odd timestamp for ${_entry.id}: ${ts}`) - delete vf.ts - } - video.updated_at = video.created_at - videos.push(video) - sense_videos.push({ - video_id, - sense_id: first_sense_from_base.id, - created_by, - ...(video.created_at - ? { created_at: video.created_at } - : entry.created_at - ? { created_at: entry.created_at } - : {}), - }) - if (sp) { - video_speakers.push({ - video_id, - speaker_id: Array.isArray(sp) ? sp[0] : sp, - created_by, - ...(video.created_at - ? { created_at: video.created_at } - : entry.created_at - ? { created_at: entry.created_at } - : {}), - }) - delete vf.sp - } - if (!Object.keys(vf).length) { - delete _entry.vfs - delete _entry.deletedVfs - } - } - - delete _entry.id - delete _entry.dictionary_id - delete _entry.dictId - - const supa_data: DataForSupabase = { - entry, - senses, - sentences, - senses_in_sentences, - audios, - audio_speakers, - photos, - sense_photos, - videos, - video_speakers, - sense_videos, - dialects: Array.from(dialects), - ...(new_speaker_name ? { new_speaker_name } : {}), - prior_import_id, - } - - // Object.keys(supa_data).forEach((key) => { - // if (Array.isArray(supa_data[key]) && supa_data[key].length === 0) { - // delete supa_data[key] - // } - // }) - - return [_entry, supa_data] - } catch (e) { - console.log(e, _entry) - // @ts-expect-error - throw new Error(e) - } -} - -export function seconds_to_timestamp_string(seconds: number): string { - return new Date(seconds * 1000).toISOString() -} - -function isEmptyArray(value: any): boolean { - return Array.isArray(value) && value.length === 0 -} - -function isEmptyObject(value: any): boolean { - return typeof value === 'object' && value !== null && !Object.keys(value).length -} - -function remove_newline_from_end(value: string): string { - return value.replace(/\n$/, '') -} diff --git a/packages/scripts/migrate-to-supabase/dictionaries.ts b/packages/scripts/migrate-to-supabase/dictionaries.ts deleted file mode 100644 index bda449045..000000000 --- a/packages/scripts/migrate-to-supabase/dictionaries.ts +++ /dev/null @@ -1,78 +0,0 @@ -import fs, { writeFileSync } from 'node:fs' -import path, { dirname } from 'node:path' -import { fileURLToPath } from 'node:url' -import { access } from 'node:fs/promises' -import { db } from '../config-firebase' -import { postgres } from '../config-supabase' -import { sync_users_across_and_write_fb_sb_mappings, write_users_to_disk } from './users' -import { generate_dictionary_inserts } from './generate-dictionary-inserts' -import { load_fb_to_sb_user_ids } from './get-user-id' -import type { IDictionary } from './types' - -migrate_dictionaries() - -const FOLDER = 'firestore-data' -const dictionaries_filename = 'firestore-dictionaries-prod.json' - -const __dirname = dirname(fileURLToPath(import.meta.url)) -function local_filepath(filename: string): string { - return path.join(__dirname, FOLDER, filename) -} - -async function file_exists(filename: string): Promise { - try { - await access(local_filepath(filename), fs.constants.F_OK) - return true - } catch { - return false - } -} - -async function migrate_dictionaries() { - // await reset_local_db() - await write_users_to_disk() - await sync_users_across_and_write_fb_sb_mappings() // needs run twice, first to sync users, then to load them into memory - await sync_users_across_and_write_fb_sb_mappings() // needs run twice, first to sync users, then to load them into memory - - const dictionaries = await get_dictionaries() - await load_fb_to_sb_user_ids() - - let sql_query = 'BEGIN;' // Start a transaction - - const dictionary_sql = generate_dictionary_inserts(dictionaries) - sql_query += `${dictionary_sql}\n` - sql_query += '\nCOMMIT;' // End the transaction - try { - writeFileSync(`./logs/${Date.now()}_dictionaries-query.sql`, sql_query) - console.log('executing sql query') - await postgres.execute_query(sql_query) - console.log('finished') - } catch (err) { - console.error(err) - await postgres.execute_query('ROLLBACK;') // Rollback the transaction in case of error - } -} - -async function get_dictionaries() { - // const dictionaries_downloaded = await file_exists(dictionaries_filename) - - // if (dictionaries_downloaded) { - // const firebase_dictionaries = (await import('./firestore-data/firestore-dictionaries-prod.json')).default as IDictionary[] - // return firebase_dictionaries - // } - - const fb_dictionaries: IDictionary[] = [] - - const dict_snapshot = await db.collection('dictionaries').get() - - for (const dictionary of dict_snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() } as IDictionary))) { - console.info(dictionary.id) - fb_dictionaries.push(dictionary) - } - - console.log(`Done fetching ${fb_dictionaries.length} dictionaries`) - - fs.writeFileSync(path.resolve(__dirname, FOLDER, dictionaries_filename), JSON.stringify(fb_dictionaries, null, 2)) - - return fb_dictionaries -} diff --git a/packages/scripts/migrate-to-supabase/editors-info-invites-partners.ts b/packages/scripts/migrate-to-supabase/editors-info-invites-partners.ts deleted file mode 100644 index f1298ccb7..000000000 --- a/packages/scripts/migrate-to-supabase/editors-info-invites-partners.ts +++ /dev/null @@ -1,230 +0,0 @@ -import { writeFileSync } from 'node:fs' -import path, { dirname } from 'node:path' -import { fileURLToPath } from 'node:url' -import type { IHelper, IInvite } from '@living-dictionaries/types/invite.interface' -import type { Citation, IAbout, IGrammar, Partner } from '@living-dictionaries/types/dictionary.interface' -import { db } from '../config-firebase' -import { admin_supabase, postgres } from '../config-supabase' -import { load_fb_to_sb_user_ids } from './get-user-id' -import { generate_inserts } from './generate-inserts' - -migrate_the_rest() - -async function migrate_the_rest() { - // if (environment === 'dev') { - // await reset_local_db() - // } - // if (environment === 'prod') { - // await save_dictionaries() // just do once - // } - // await write_users_to_disk() // just do once - // await sync_users_across_and_write_fb_sb_mappings() // needs run twice, first to sync users, then to save them to disk - // await sync_users_across_and_write_fb_sb_mappings() // needs run twice, first to sync users, then to save them to disk - await load_fb_to_sb_user_ids() - - const dictionaries = await load_saved_dictionaries() - - const fb_managers = await get_managers_by_dictionary_id() - const fb_contributors = await get_contributors_by_dictionary_id() - const fb_writeInCollaborators = await get_writeInCollaborators_by_dictionary_id() - const fb_invites = await get_invites_by_dictionary_id() - const fb_partners = await get_partners_by_dictionary_id() - const fb_dictionary_infos = await get_info_by_dictionary_id() - - let sql_query = 'BEGIN;' // Start a transaction - // if (environment === 'dev') { - // for (const { id, name } of dictionaries) { - // const dictionary_sql = sql_file_string('dictionaries', { id, name, created_by: jacob_ld_user_id, updated_by: jacob_ld_user_id }) - // sql_query += `${dictionary_sql}\n` - // } - // } - - const sql = generate_inserts({ - dictionary_ids: dictionaries.map(({ id }) => id), - fb_managers, - fb_contributors, - fb_writeInCollaborators, - fb_dictionary_infos, - fb_invites, - fb_partners, - }) - sql_query += `${sql}\n` - sql_query += '\nCOMMIT;' // End the transaction - try { - writeFileSync(`./logs/${Date.now()}_migrate-the-rest-query.sql`, sql_query) - console.log('executing sql query') - await postgres.execute_query(sql_query) - console.log('finished') - } catch (err) { - console.error(err) - await postgres.execute_query('ROLLBACK;') // Rollback the transaction in case of error - } -} - -const FOLDER = 'firestore-data' -const __dirname = dirname(fileURLToPath(import.meta.url)) - -async function save_dictionaries() { - const { data: dictionaries_1 } = await admin_supabase.from('dictionaries') - .select('id, name') - .order('id', { ascending: true }) - .range(0, 999) - const { data: dictionaries_2 } = await admin_supabase.from('dictionaries') - .select('id, name') - .order('id', { ascending: true }) - .range(1000, 1999) - - writeFileSync(path.resolve(__dirname, FOLDER, 'dictionaries.json'), JSON.stringify([...dictionaries_1, ...dictionaries_2], null, 2)) -} - -async function load_saved_dictionaries() { - const dictionaries = (await import('./firestore-data/dictionaries.json')).default - return dictionaries -} - -// get managers using collection group from dictionaries/{dictionary_id}/managers -async function get_managers_by_dictionary_id() { - const fb_managers: Record = {} - const snapshot = await db.collectionGroup('managers').get() - snapshot.forEach((doc) => { - const data = doc.data() as IHelper - const dictionaryId = doc.ref.parent.parent?.id - - if (dictionaryId) { - if (!fb_managers[dictionaryId]) { - fb_managers[dictionaryId] = [] - } - fb_managers[dictionaryId].push(data) - } else { - console.log('no dictionary id found for manager') - } - }) - return fb_managers -} - -// get contributors using collection group from dictionaries/{dictionary_id}/contributors -async function get_contributors_by_dictionary_id() { - const fb_contributors: Record = {} - const snapshot = await db.collectionGroup('contributors').get() - snapshot.forEach((doc) => { - const data = doc.data() as IHelper - const dictionaryId = doc.ref.parent.parent?.id - - if (dictionaryId) { - if (!fb_contributors[dictionaryId]) { - fb_contributors[dictionaryId] = [] - } - fb_contributors[dictionaryId].push(data) - } else { - console.log('no dictionary id found for contributor') - } - }) - return fb_contributors -} - -// get writeInCollaborators using collection group from dictionaries/{dictionary_id}/writeInCollaborators -async function get_writeInCollaborators_by_dictionary_id() { - const fb_writeInCollaborators: Record = {} - const snapshot = await db.collectionGroup('writeInCollaborators').get() - snapshot.forEach((doc) => { - const data = doc.data() as IHelper - const dictionaryId = doc.ref.parent.parent?.id - - if (dictionaryId) { - if (!fb_writeInCollaborators[dictionaryId]) { - fb_writeInCollaborators[dictionaryId] = [] - } - fb_writeInCollaborators[dictionaryId].push(data) - } else { - console.log('no dictionary id found for writeInCollaborator') - } - }) - return fb_writeInCollaborators -} - -// get partners using collection group from dictionaries/{dictionary_id}/partners -async function get_partners_by_dictionary_id() { - const fb_partners: Record = {} - const snapshot = await db.collectionGroup('partners').get() - snapshot.forEach((doc) => { - const data = doc.data() as Partner - const dictionaryId = doc.ref.parent.parent?.id - - if (dictionaryId) { - if (!fb_partners[dictionaryId]) { - fb_partners[dictionaryId] = [] - } - fb_partners[dictionaryId].push(data) - } else { - console.log('no dictionary id found for partner') - } - }) - return fb_partners -} - -// get invites using collection group from dictionaries/{dictionary_id}/invites -async function get_invites_by_dictionary_id() { - const fb_invites: Record = {} - const snapshot = await db.collectionGroup('invites').get() - snapshot.forEach((doc) => { - const data = doc.data() as IInvite - const dictionaryId = doc.ref.parent.parent?.id - - if (dictionaryId) { - if (!fb_invites[dictionaryId]) { - fb_invites[dictionaryId] = [] - } - fb_invites[dictionaryId].push(data) - } else { - console.log('no dictionary id found for invite') - } - }) - return fb_invites -} - -// get about, grammar, citation using collection group from dictionaries/{dictionary_id}/info/about (about/grammar/citation is the doc id) -async function get_info_by_dictionary_id() { - const fb_dictionary_info: Record = {} - const snapshot = await db.collectionGroup('info').get() - snapshot.forEach((doc) => { - const data = doc.data() as IAbout & IGrammar & Citation - const dictionaryId = doc.ref.parent.parent?.id - - let info_type: 'about' | 'grammar' | 'citation' - if (doc.id === 'about') { - info_type = 'about' - } else if (doc.id === 'grammar') { - info_type = 'grammar' - } else if (doc.id === 'citation') { - info_type = 'citation' - } else { - throw new Error('info type not found') - } - - if (!data[info_type]) { - return - } - - if (dictionaryId) { - if (!fb_dictionary_info[dictionaryId]) { - fb_dictionary_info[dictionaryId] = {} - } - fb_dictionary_info[dictionaryId][info_type] = data[info_type] - if (data.createdBy) { - fb_dictionary_info[dictionaryId].createdBy = data.createdBy - } - if (data.updatedBy) { - fb_dictionary_info[dictionaryId].updatedBy = data.updatedBy - } - } else { - console.log('no dictionary id found for info') - } - }) - return fb_dictionary_info -} diff --git a/packages/scripts/migrate-to-supabase/generate-inserts.test.ts b/packages/scripts/migrate-to-supabase/generate-inserts.test.ts deleted file mode 100644 index 8a944a1e2..000000000 --- a/packages/scripts/migrate-to-supabase/generate-inserts.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { jacob_ld_user_id } from '../constants' -import { generate_inserts } from './generate-inserts' - -vi.mock('./get-user-id', () => { - return { - get_supabase_user_id_from_firebase_uid: () => jacob_ld_user_id, - } -}) - -vi.mock('node:crypto', () => { - const uuid_template = '11111111-1111-1111-1111-111111111111' - let current_uuid_index = 0 - - function incremental_consistent_uuid() { - return uuid_template.slice(0, -5) + (current_uuid_index++).toString().padStart(5, '0') - } - - return { - randomUUID: incremental_consistent_uuid, - } -}) - -test(generate_inserts, () => { - const sql = generate_inserts({ - dictionary_ids: ['d_id-1', 'd_id-2', 'd_id-3'], - fb_managers: { - 'd_id-1': [ - { id: '1', name: 'Bob' }, - { - id: '2', - name: 'Jim', - // @ts-expect-error - createdAt: { _seconds: 123 }, - }, - ], - 'd_id-2': [ - { id: '3', name: 'Alice' }, - { id: '4', name: 'Eve' }, - ], - }, - fb_contributors: { - 'd_id-1': [ - { id: '5', name: 'Charlie' }, - ], - }, - fb_writeInCollaborators: { - 'd_id-2': [ - { id: 'not-important', name: 'Dave', createdBy: 'jim', updatedBy: 'jim' }, - { id: 'not-important', name: 'Eve' }, - ], - }, - fb_partners: { - 'd_id-1': [ - { - id: 'not-important', - name: 'Frank', - logo: { fb_storage_path: 'foo', specifiable_image_url: 'abc' }, - // @ts-expect-error - createdAt: { _seconds: 123 }, - // @ts-expect-error - updatedAt: { _seconds: 456 }, - }, - { - id: 'not-important', - name: 'George', - }, - ], - }, - fb_invites: { - 'd_id-2': [ - { - id: '8', - targetEmail: 'foo@g.com', - role: 'contributor', - status: 'sent', - dictionaryName: 'bar', - inviterEmail: 'g@g.com', - inviterName: 'h', - }, - ], - }, - fb_dictionary_infos: { - 'd_id-1': { about: 'about 1', citation: 'citation 1', createdBy: 'jim', updatedBy: 'jim' }, - 'd_id-2': { about: 'about 2', grammar: 'grammar 2' }, - }, - }) - expect(sql).toMatchInlineSnapshot(` - "INSERT INTO dictionary_roles ("dictionary_id", "role", "user_id") VALUES - ('d_id-1', 'manager', 'de2d3715-6337-45a3-a81a-d82c3210b2a7'); - INSERT INTO dictionary_roles ("created_at", "dictionary_id", "role", "user_id") VALUES - ('1970-01-01T00:02:03.000Z', 'd_id-1', 'manager', 'de2d3715-6337-45a3-a81a-d82c3210b2a7'); - INSERT INTO dictionary_roles ("dictionary_id", "role", "user_id") VALUES - ('d_id-1', 'contributor', 'de2d3715-6337-45a3-a81a-d82c3210b2a7'); - INSERT INTO photos ("created_at", "created_by", "dictionary_id", "id", "serving_url", "storage_path", "updated_at", "updated_by") VALUES - ('1970-01-01T00:02:03.000Z', 'de2d3715-6337-45a3-a81a-d82c3210b2a7', 'd_id-1', '11111111-1111-1111-1111-111111100000', 'abc', 'foo', '1970-01-01T00:07:36.000Z', 'de2d3715-6337-45a3-a81a-d82c3210b2a7'); - INSERT INTO dictionary_partners ("created_at", "created_by", "dictionary_id", "name", "photo_id", "updated_at", "updated_by") VALUES - ('1970-01-01T00:02:03.000Z', 'de2d3715-6337-45a3-a81a-d82c3210b2a7', 'd_id-1', 'Frank', '11111111-1111-1111-1111-111111100000', '1970-01-01T00:07:36.000Z', 'de2d3715-6337-45a3-a81a-d82c3210b2a7'); - INSERT INTO dictionary_partners ("created_by", "dictionary_id", "name", "updated_by") VALUES - ('de2d3715-6337-45a3-a81a-d82c3210b2a7', 'd_id-1', 'George', 'de2d3715-6337-45a3-a81a-d82c3210b2a7'); - INSERT INTO dictionary_info ("about", "citation", "created_by", "id", "updated_by") VALUES - ('about 1', 'citation 1', 'de2d3715-6337-45a3-a81a-d82c3210b2a7', 'd_id-1', 'de2d3715-6337-45a3-a81a-d82c3210b2a7'); - INSERT INTO dictionary_roles ("dictionary_id", "role", "user_id") VALUES - ('d_id-2', 'manager', 'de2d3715-6337-45a3-a81a-d82c3210b2a7'); - INSERT INTO dictionary_roles ("dictionary_id", "role", "user_id") VALUES - ('d_id-2', 'manager', 'de2d3715-6337-45a3-a81a-d82c3210b2a7'); - INSERT INTO invites ("created_by", "dictionary_id", "inviter_email", "role", "status", "target_email") VALUES - ('de2d3715-6337-45a3-a81a-d82c3210b2a7', 'd_id-2', 'g@g.com', 'contributor', 'sent', 'foo@g.com'); - INSERT INTO dictionary_info ("about", "created_by", "grammar", "id", "updated_by", "write_in_collaborators") VALUES - ('about 2', 'de2d3715-6337-45a3-a81a-d82c3210b2a7', 'grammar 2', 'd_id-2', 'de2d3715-6337-45a3-a81a-d82c3210b2a7', '{Dave,Eve}'); - " - `) -}) diff --git a/packages/scripts/migrate-to-supabase/generate-inserts.ts b/packages/scripts/migrate-to-supabase/generate-inserts.ts deleted file mode 100644 index 0bc531b51..000000000 --- a/packages/scripts/migrate-to-supabase/generate-inserts.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { randomUUID } from 'node:crypto' -import type { TablesInsert } from '@living-dictionaries/types' -import type { IHelper, IInvite } from '@living-dictionaries/types/invite.interface' -import type { Partner } from '@living-dictionaries/types/dictionary.interface' -import { sql_file_string } from '../import/to-sql-string' -import { jacob_ld_user_id } from '../constants' -import { get_supabase_user_id_from_firebase_uid } from './get-user-id' - -export function generate_inserts({ - dictionary_ids, - fb_managers, - fb_contributors, - fb_partners, - fb_invites, - fb_writeInCollaborators, - fb_dictionary_infos, -}: { - dictionary_ids: string[] - fb_managers: Record - fb_contributors: Record - fb_partners: Record - fb_invites: Record - fb_writeInCollaborators: Record - fb_dictionary_infos: Record -}): string { - let sql_statements = '' - - for (const dictionary_id of dictionary_ids) { - for (const manager of fb_managers[dictionary_id] || []) { - // @ts-expect-error - const seconds_created_at = manager.createdAt?._seconds - - const user_id = get_supabase_user_id_from_firebase_uid(manager.id) - if (!user_id) { - console.error(`trying to add manager: No Supabase user found for Firebase UID: ${manager.id}`) - continue - } - const dictionary_role: TablesInsert<'dictionary_roles'> = { - dictionary_id, - role: 'manager', - user_id: get_supabase_user_id_from_firebase_uid(manager.id), - ...(seconds_created_at && { created_at: seconds_to_timestamp_string(seconds_created_at) }), - } - sql_statements += sql_file_string('dictionary_roles', dictionary_role) - } - - for (const contributor of fb_contributors[dictionary_id] || []) { - // @ts-expect-error - const seconds_created_at = contributor.createdAt?._seconds - - const dictionary_role: TablesInsert<'dictionary_roles'> = { - dictionary_id, - role: 'contributor', - user_id: get_supabase_user_id_from_firebase_uid(contributor.id), - ...(seconds_created_at && { created_at: seconds_to_timestamp_string(seconds_created_at) }), - } - sql_statements += sql_file_string('dictionary_roles', dictionary_role) - } - - for (const partner of fb_partners[dictionary_id] || []) { - // @ts-expect-error - const seconds_created_at = partner.createdAt?._seconds - // @ts-expect-error - const seconds_updated_at = partner.updatedAt?._seconds - - let photo_id: string - if (partner.logo?.fb_storage_path) { - photo_id = randomUUID() - const photo: TablesInsert<'photos'> = { - id: photo_id, - dictionary_id, - storage_path: partner.logo.fb_storage_path, - serving_url: partner.logo.specifiable_image_url, - ...(seconds_created_at && { created_at: seconds_to_timestamp_string(seconds_created_at) }), - ...(seconds_updated_at && { updated_at: seconds_to_timestamp_string(seconds_updated_at) }), - created_by: get_supabase_user_id_from_firebase_uid(partner.createdBy) || jacob_ld_user_id, - updated_by: get_supabase_user_id_from_firebase_uid(partner.updatedBy) || jacob_ld_user_id, - } - sql_statements += sql_file_string('photos', photo) - } - - const dictionary_partner: TablesInsert<'dictionary_partners'> = { - dictionary_id, - name: partner.name, - ...(photo_id && { photo_id }), - ...(seconds_created_at && { created_at: seconds_to_timestamp_string(seconds_created_at) }), - ...(seconds_updated_at && { updated_at: seconds_to_timestamp_string(seconds_updated_at) }), - created_by: get_supabase_user_id_from_firebase_uid(partner.createdBy) || jacob_ld_user_id, - updated_by: get_supabase_user_id_from_firebase_uid(partner.updatedBy) || jacob_ld_user_id, - } - sql_statements += sql_file_string('dictionary_partners', dictionary_partner) - } - - for (const invite of fb_invites[dictionary_id] || []) { - // @ts-expect-error - const seconds_created_at = invite.createdAt?._seconds - const dictionary_invite: TablesInsert<'invites'> = { - dictionary_id, - inviter_email: invite.inviterEmail, - target_email: invite.targetEmail, - role: invite.role || 'contributor', - status: invite.status, - created_by: get_supabase_user_id_from_firebase_uid(invite.createdBy) || jacob_ld_user_id, - ...(seconds_created_at && { created_at: seconds_to_timestamp_string(seconds_created_at) }), - } - - sql_statements += sql_file_string('invites', dictionary_invite) - } - - const dictionary_info_update: TablesInsert<'dictionary_info'> = { - id: dictionary_id, - created_by: jacob_ld_user_id, - updated_by: jacob_ld_user_id, - } - - if (fb_writeInCollaborators[dictionary_id]) { - dictionary_info_update.write_in_collaborators = [...fb_writeInCollaborators[dictionary_id].map(({ name }) => name)] - if (fb_writeInCollaborators[dictionary_id][0].createdBy) { - dictionary_info_update.created_by = get_supabase_user_id_from_firebase_uid(fb_writeInCollaborators[dictionary_id][0].createdBy) - } - if (fb_writeInCollaborators[dictionary_id][0].updatedBy) { - dictionary_info_update.updated_by = get_supabase_user_id_from_firebase_uid(fb_writeInCollaborators[dictionary_id][0].updatedBy) - } - } - - if (fb_dictionary_infos[dictionary_id]) { - if (fb_dictionary_infos[dictionary_id].about) - dictionary_info_update.about = fb_dictionary_infos[dictionary_id].about - if (fb_dictionary_infos[dictionary_id].grammar) - dictionary_info_update.grammar = fb_dictionary_infos[dictionary_id].grammar - if (fb_dictionary_infos[dictionary_id].citation) - dictionary_info_update.citation = fb_dictionary_infos[dictionary_id].citation - if (fb_dictionary_infos[dictionary_id].createdBy) - dictionary_info_update.created_by = get_supabase_user_id_from_firebase_uid(fb_dictionary_infos[dictionary_id].createdBy) - if (fb_dictionary_infos[dictionary_id].updatedBy) - dictionary_info_update.updated_by = get_supabase_user_id_from_firebase_uid(fb_dictionary_infos[dictionary_id].updatedBy) - } - - if (Object.keys(dictionary_info_update).length > 3) { - sql_statements += sql_file_string('dictionary_info', dictionary_info_update) - } - } - return sql_statements -} - -function seconds_to_timestamp_string(seconds: number): string { - return new Date(seconds * 1000).toISOString() -} diff --git a/packages/scripts/migrate-to-supabase/get-user-id.ts b/packages/scripts/migrate-to-supabase/get-user-id.ts deleted file mode 100644 index 557b35d8c..000000000 --- a/packages/scripts/migrate-to-supabase/get-user-id.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { log_once } from './log-once' - -let firebase_uid_to_supabase_user_ids: Record | null = null - -export async function load_fb_to_sb_user_ids() { - if (!firebase_uid_to_supabase_user_ids) { - // eslint-disable-next-line require-atomic-updates - firebase_uid_to_supabase_user_ids = (await import('./firestore-data/fb-sb-user-ids.json')).default - } -} - -export function get_supabase_user_id_from_firebase_uid(firebase_uid: string): string | null { - if (!firebase_uid) return null - - const supabase_user_id = firebase_uid_to_supabase_user_ids?.[firebase_uid] - if (!supabase_user_id) { - log_once(`No Supabase user found for Firebase UID: ${firebase_uid}`) - } - return supabase_user_id -} diff --git a/packages/scripts/migrate-to-supabase/log-once.ts b/packages/scripts/migrate-to-supabase/log-once.ts deleted file mode 100644 index 7ebcfcf91..000000000 --- a/packages/scripts/migrate-to-supabase/log-once.ts +++ /dev/null @@ -1,8 +0,0 @@ -const logged = new Set() - -export function log_once(msg: string) { - if (logged.has(msg)) - return - console.log(msg) - logged.add(msg) -} diff --git a/packages/scripts/migrate-to-supabase/notes.md b/packages/scripts/migrate-to-supabase/notes.md index fb21adf88..98e45ebc4 100644 --- a/packages/scripts/migrate-to-supabase/notes.md +++ b/packages/scripts/migrate-to-supabase/notes.md @@ -1,5 +1,5 @@ -## Clean Up -- entry history from pop-up entry modal +## Final Migration cleanup +- show entry history from pop-up entry modal - test admin rls, alternative is auth.jwt() read https://supabase.com/docs/guides/database/postgres/row-level-security#authjwt to see if better - Diego: AuthModal.svelte translations - review updated_by triggers across all tables @@ -14,7 +14,6 @@ - remove firebase vercel credentials - remove import_meta from content update endpoint - remove firebase in SQL -- remove firebase in scripts - remove unneeded urls from https://console.cloud.google.com/auth/clients/215143435444-fugm4gpav71r3l89n6i0iath4m436qnv.apps.googleusercontent.com?inv=1&invt=AboyXQ&project=talking-dictionaries-alpha - move featured images to photos table and make a connection to the dictionary - use line-clamp instead of truncateString in SelectedDict.svelte and also look at inline-children-elements purpose diff --git a/packages/scripts/migrate-to-supabase/timestamp_to_date.ts b/packages/scripts/migrate-to-supabase/timestamp_to_date.ts deleted file mode 100644 index f58e7c258..000000000 --- a/packages/scripts/migrate-to-supabase/timestamp_to_date.ts +++ /dev/null @@ -1,70 +0,0 @@ -import type { Timestamp } from 'firebase/firestore' - -export function convert_timestamp_to_date_object(timestamp: number | Date | Timestamp): Date | null { - if (timestamp instanceof Date) - return timestamp - - if (typeof timestamp === 'number') { - const SECONDS_LENGTH = 10 - const MILLISECONDS_LENGTH = 13 - if (timestamp.toString().length === SECONDS_LENGTH) { - const milliseconds = timestamp * 1000 - return new Date(milliseconds) - } - if (timestamp.toString().length === MILLISECONDS_LENGTH) - return new Date(timestamp) - - return null - } - // eslint-disable-next-line no-prototype-builtins - if (timestamp?.hasOwnProperty('toDate')) - return timestamp.toDate() - - return null -} - -if (import.meta.vitest) { - describe('convert_timestamp_to_date_object', () => { - const ts_in_milliseconds = 1620000000000 - - test('converts milliseconds', () => { - const expected = new Date(ts_in_milliseconds) - expect(convert_timestamp_to_date_object(ts_in_milliseconds)).toEqual(expected) - }) - - test('converts seconds', () => { - const ts_in_seconds = 1620000000 - const ts_converted_to_milliseconds = ts_in_seconds * 1000 - const expected = new Date(ts_converted_to_milliseconds) - expect(convert_timestamp_to_date_object(ts_in_seconds)).toEqual(expected) - }) - - test('converts a Firestore Timestamp', () => { - const mockToDate = function () { - // @ts-expect-error - return new Date(this.toMillis()) - } - const mockToMillis = function () { - // @ts-expect-error - return 1e3 * this.seconds + this.nanoseconds / 1e6 - } - const fs_timestamp = { - seconds: 1620000000, - nanoseconds: 0, - toDate: mockToDate, - toMillis: mockToMillis, - } as Timestamp - const expected = new Date(ts_in_milliseconds) - expect(convert_timestamp_to_date_object(fs_timestamp)).toEqual(expected) - }) - - test('leaves a date object alone', () => { - const now = new Date() - expect(convert_timestamp_to_date_object(now)).toBe(now) - }) - - test('handles undefined', () => { - expect(convert_timestamp_to_date_object(undefined)).toBe(null) - }) - }) -} diff --git a/packages/scripts/migrate-to-supabase/types.ts b/packages/scripts/migrate-to-supabase/types.ts deleted file mode 100644 index b74d8fcb1..000000000 --- a/packages/scripts/migrate-to-supabase/types.ts +++ /dev/null @@ -1,42 +0,0 @@ -import type { DictionaryPhoto, IFirestoreMetaData } from '@living-dictionaries/types' -import type { IPoint, IRegion, LngLatFull } from '@living-dictionaries/types/coordinates.interface' - -export interface IDictionary extends IFirestoreMetaData { - allContribute?: boolean // deprecated - alternateNames?: string[] - glossLanguages: string[] - name: string - location?: string - iso6393?: string - glottocode?: string - - coordinates?: { - _longitude: number - _latitude: number - } | LngLatFull // primary coordinate when displayed w/ many other dictionaries - points?: IPoint[] // other coordinate points where language spoken - regions?: IRegion[] // regions where language spoken - - public?: boolean - printAccess?: boolean - entryCount?: number // number | FieldValue; - copyright?: string // Allow custom copyright in case "Copyright _______ community" isn't appropriate for dictionary (eg. Tehuelche) - alternateOrthographies?: string[] // Alternate Orthography titles (first item corresponds to entry.lo, then entry.lo2, entry.lo3) - used to be called Local Orthography but that is a misnomer it's turning out - - videoAccess?: boolean // deprecated - - languageUsedByCommunity?: boolean - communityPermission?: 'yes' | 'no' | 'unknown' - authorConnection?: string - conLangDescription?: string - - featuredImage?: DictionaryPhoto - hideLivingTonguesLogo?: boolean - - // tdv1 (old Talking Dictionaries platform at Swarthmore) - publishYear?: number - population?: number - thumbnail?: string - url?: string - type?: 'tdv1' -} diff --git a/packages/scripts/migrate-to-supabase/users.ts b/packages/scripts/migrate-to-supabase/users.ts deleted file mode 100644 index 5b5a8e0c0..000000000 --- a/packages/scripts/migrate-to-supabase/users.ts +++ /dev/null @@ -1,90 +0,0 @@ -import fs from 'node:fs' -import path, { dirname } from 'node:path' -import { fileURLToPath } from 'node:url' -import type { UserRecord } from 'firebase-admin/auth' -import { auth } from '../config-firebase' -import { admin_supabase, postgres } from '../config-supabase' -import { write_users_insert } from './write-users-insert' - -const BATCH_SIZE = 1000 - -async function get_users(): Promise { - try { - const listUsersResult = await auth.listUsers() - const { users, pageToken } = listUsersResult - - console.log({ users: users.length, pageToken }) - - if (pageToken) { - const listUsersResult = await auth.listUsers(BATCH_SIZE, pageToken) - const { users: nextUsers } = listUsersResult - // const nextUsers = await get_users(pageToken) // had issue - return [...users, ...nextUsers] - } - - return users - } catch (error) { - console.log({ list_error: error }) - } -} - -const FOLDER = 'firestore-data' -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export async function write_users_to_disk() { - const users = await get_users() - - console.log(`Done fetching ${users.length} users.`) - - fs.writeFileSync(path.resolve(__dirname, FOLDER, 'firestore-users.json'), JSON.stringify(users, null, 2)) -} - -export async function sync_users_across_and_write_fb_sb_mappings() { - console.log('writing user mappings') - const firebase_uid_to_supabase_user_id: Record = {} - const { data: sb_users_1 } = await admin_supabase.from('user_emails') - .select('id, email') - .order('id', { ascending: true }) - .range(0, 999) - const { data: sb_users_2 } = await admin_supabase.from('user_emails') - .select('id, email') - .order('id', { ascending: true }) - .range(1000, 1999) - - const sb_users = [...sb_users_1, ...sb_users_2] - - const supabase_users_not_in_firebase = new Set(sb_users.map(sb_user => sb_user.email)) - const unmatched_firebase = [] - - const firebase_users = (await import('./firestore-data/firestore-users.json')).default - - for (const fb_user of firebase_users) { - const matching_sb_user = sb_users.find(sb_user => sb_user.email === fb_user.email) - - if (matching_sb_user) { - firebase_uid_to_supabase_user_id[fb_user.uid] = matching_sb_user.id - supabase_users_not_in_firebase.delete(matching_sb_user.email) - } else { - unmatched_firebase.push(fb_user) - const sql = write_users_insert([fb_user as UserRecord]) - console.info(sql) - await postgres.execute_query(sql) - } - } - - console.log({ unmatched_firebase: unmatched_firebase.length, sb_users: sb_users.length, firebase_users: firebase_users.length, supabase_users_not_in_firebase: supabase_users_not_in_firebase.size }) - - fs.writeFileSync(path.resolve(__dirname, FOLDER, 'fb-sb-user-ids.json'), JSON.stringify(firebase_uid_to_supabase_user_id, null, 2)) -} - -// export async function migrate_users() { -// const users = await get_users() -// console.log({ total_users: users.length }) -// for (const user of users) -// console.log(user.email) -// for (const user of users) -// console.log(user.toJSON()) -// const sql = write_users_insert(users) -// console.log(sql) -// await postgres.execute_query(sql) -// } diff --git a/packages/scripts/migrate-to-supabase/utils/remove-seconds-underscore.ts b/packages/scripts/migrate-to-supabase/utils/remove-seconds-underscore.ts deleted file mode 100644 index d2af613d7..000000000 --- a/packages/scripts/migrate-to-supabase/utils/remove-seconds-underscore.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { ActualDatabaseEntry } from '@living-dictionaries/types/entry.interface' - -export function remove_seconds_underscore(entry: ActualDatabaseEntry & Record) { - // @ts-expect-error - if (entry.updatedAt?._seconds) { - // @ts-expect-error - entry.updatedAt = { - // @ts-expect-error - seconds: entry.updatedAt._seconds, - } - } - // @ts-expect-error - if (entry.createdAt?._seconds) { - // @ts-expect-error - entry.createdAt = { - // @ts-expect-error - seconds: entry.createdAt._seconds, - } - } - // @ts-expect-error - if (entry.ua?._seconds) { - // @ts-expect-error - entry.ua = { - // @ts-expect-error - seconds: entry.ua._seconds, - } - } - // @ts-expect-error - if (entry.ca?._seconds) { - // @ts-expect-error - entry.ca = { - // @ts-expect-error - seconds: entry.ca._seconds, - } - } - return entry -} diff --git a/packages/scripts/package.json b/packages/scripts/package.json index 86da3f569..2b962777d 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -15,14 +15,11 @@ "main": "index.ts", "scripts": { "download-audio": "tsx download-audio -e prod", - "migrate-rest": "tsx migrate-to-supabase/editors-info-invites-partners.ts --firebase prod", - "migrate-rest:prod": "tsx migrate-to-supabase/editors-info-invites-partners.ts --firebase prod -e prod", "import-dictionary:dev:dry": "tsx import/import.ts --id example-v4", "import-dictionary:dev:live": "tsx import/import.ts --id example-v4 --live", "import-dictionary:prod:live": "tsx import/import.ts --id example-v4 -e prod --live", "update-locales": "tsx locales/update-locales.ts", "create-indexes": "tsx create-indexes/add-to-cloudflare.ts", - "migrate-users": "tsx migrate-to-supabase/auth.ts", "get-emails": "tsx refactor/get-email.ts -e prod", "test": "vitest", "test:import": "vitest --config ./vitest.config.import.ts", @@ -42,8 +39,6 @@ "csv-parse": "^5.3.0", "csvtojson": "^2.0.10", "dotenv": "^16.0.2", - "firebase": "^10.9.0", - "firebase-admin": "^12.7.0", "node-fetch": "^3.1.0", "pg": "^8.13.1", "stream-chain": "^2.2.5", diff --git a/packages/types/dictionary.interface.ts b/packages/types/dictionary.interface.ts deleted file mode 100644 index 307800e7b..000000000 --- a/packages/types/dictionary.interface.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { IFirestoreMetaData } from 'sveltefirets' -import type { PartnerPhoto } from './photo.interface' - -export interface IAbout extends IFirestoreMetaData { - about: string -} - -export interface IGrammar extends IFirestoreMetaData { - grammar: string -} - -export interface Citation extends IFirestoreMetaData { - citation: string -} - -export interface Partner extends IFirestoreMetaData { - name: string - logo?: PartnerPhoto -} diff --git a/packages/types/index.ts b/packages/types/index.ts index b006f1d1b..89be2e4a8 100644 --- a/packages/types/index.ts +++ b/packages/types/index.ts @@ -17,7 +17,6 @@ export type { ContentUpdateRequestBody } from './supabase/content-update.interfa export type { UnsupportedFields } from './supabase/unsupported.interface' export type { Database, Tables, TablesInsert, TablesUpdate } from './supabase/combined.types' export type { Orthography } from './supabase/orthography.interface' -export type { IFirestoreMetaData } from 'sveltefirets' export type DictionaryView = Tables<'dictionaries_view'> export interface PartnerWithPhoto { diff --git a/packages/types/invite.interface.ts b/packages/types/invite.interface.ts deleted file mode 100644 index caf612bdf..000000000 --- a/packages/types/invite.interface.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { IFirestoreMetaData } from 'sveltefirets' - -export interface IInvite extends IFirestoreMetaData { - inviterEmail: string - inviterName: string - dictionaryName: string - targetEmail: string - role: 'manager' | 'contributor' - status: 'queued' | 'sent' | 'claimed' | 'cancelled' -} - -export interface IHelper extends IFirestoreMetaData { - name: string -} diff --git a/packages/types/package.json b/packages/types/package.json index bf7ca25e9..56c020233 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -14,8 +14,6 @@ }, "main": "index.ts", "devDependencies": { - "firebase": "^10.9.0", - "sveltefirets": "0.0.42", "typescript": "^5.6.2", "vitest": "^2.1.4" } diff --git a/packages/types/photo.interface.ts b/packages/types/photo.interface.ts index 99ada73f3..9bf5039ec 100644 --- a/packages/types/photo.interface.ts +++ b/packages/types/photo.interface.ts @@ -1,10 +1,8 @@ -import type { Timestamp } from 'firebase/firestore' - export interface DictionaryPhoto { fb_storage_path: string specifiable_image_url: string // Google's Magic Image serving url reference which accepts requests for exact image size https://medium.com/google-cloud/uploading-resizing-and-serving-images-with-google-cloud-platform-ca9631a2c556 uid_added_by: string - timestamp?: Date | Timestamp + timestamp?: Date | { _seconds: number, _nanoseconds: number } } export interface PartnerPhoto { diff --git a/packages/types/user.interface.ts b/packages/types/user.interface.ts index 858aabea5..d14706e01 100644 --- a/packages/types/user.interface.ts +++ b/packages/types/user.interface.ts @@ -1,20 +1,3 @@ -import type { Timestamp } from 'firebase/firestore' -import type { IBaseUser } from 'sveltefirets' - -export interface IUser extends IBaseUser { - roles?: IRoles - managing?: string[] // dictionary Ids - can be deprected because using a collectionGroup query of 'managers' instead - contributing?: string[] // dictionary Ids - can be deprected because using a collectionGroup query 'contributors' instead - // starred?: string[]; // in future save dictionary Ids to user that they star, to allow them quick access back to those dictionaries - termsAgreement?: Timestamp - unsubscribe?: Timestamp -} - -export interface IRoles { - // editor?: boolean; // can edit and delete any content - admin?: number // 1 controls content; 2 controls user roles also -} - export interface GoogleAuthUserMetaData { // "iss": string, // "sub": string, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f622fecfe..c67b508d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,12 +86,6 @@ importers: dotenv: specifier: ^16.0.2 version: 16.0.2 - firebase: - specifier: ^10.9.0 - version: 10.9.0 - firebase-admin: - specifier: ^12.7.0 - version: 12.7.0(encoding@0.1.13) node-fetch: specifier: ^3.1.0 version: 3.2.3 @@ -287,12 +281,6 @@ importers: packages/types: devDependencies: - firebase: - specifier: ^10.9.0 - version: 10.9.0 - sveltefirets: - specifier: 0.0.42 - version: 0.0.42(firebase@10.9.0)(svelte@4.2.19) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -310,10 +298,6 @@ packages: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@antfu/eslint-config@2.27.3': resolution: {integrity: sha512-Y2Vh/LvPAaYoyLwCiZHJ7p76LEIGg6debeUA4Qs+KOrlGuXLQWRmdZlC6SB33UDNzXqkFeaXAlEcYUqvYoiMKA==} hasBin: true @@ -1453,260 +1437,6 @@ packages: resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fastify/busboy@2.1.0': - resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} - engines: {node: '>=14'} - - '@fastify/busboy@3.0.0': - resolution: {integrity: sha512-83rnH2nCvclWaPQQKvkJ2pdOjG4TZyEVuFDnlOF6KP08lDaaceVyw/W63mDuafQT+MKHCvXIPpE5uYWeM0rT4w==} - - '@firebase/analytics-compat@0.2.7': - resolution: {integrity: sha512-17VCly4P0VFBDqaaal7m1nhyYQwsygtaTpSsnc51sFPRrr9XIYtnD8ficon9fneEGEoJQ2g7OtASvhwX9EbK8g==} - peerDependencies: - '@firebase/app-compat': 0.x - - '@firebase/analytics-types@0.8.0': - resolution: {integrity: sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==} - - '@firebase/analytics@0.10.1': - resolution: {integrity: sha512-5mnH1aQa99J5lZMJwTNzIoRc4yGXHf+fOn+EoEWhCDA3XGPweGHcylCbqq+G1wVJmfILL57fohDMa8ftMZ+44g==} - peerDependencies: - '@firebase/app': 0.x - - '@firebase/app-check-compat@0.3.9': - resolution: {integrity: sha512-7LxyupQ8XeEHRh72mO+tqm69kHT6KbWi2KtFMGedJ6tNbwzFzojcXESMKN8RpADXbYoQgY3loWMJjMx4r2Zt7w==} - peerDependencies: - '@firebase/app-compat': 0.x - - '@firebase/app-check-interop-types@0.3.0': - resolution: {integrity: sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==} - - '@firebase/app-check-interop-types@0.3.2': - resolution: {integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==} - - '@firebase/app-check-types@0.5.0': - resolution: {integrity: sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==} - - '@firebase/app-check@0.8.2': - resolution: {integrity: sha512-A2B5+ldOguYAeqW1quFN5qNdruSNRrg4W59ag1Eq6QzxuHNIkrE+TrapfrW/z5NYFjCxAYqr/unVCgmk80Dwcg==} - peerDependencies: - '@firebase/app': 0.x - - '@firebase/app-compat@0.2.29': - resolution: {integrity: sha512-NqUdegXJfwphx9i/2bOE2CTZ55TC9bbDg+iwkxVShsPBJhD3CzQJkFhoDz4ccfbJaKZGsqjY3fisgX5kbDROnA==} - - '@firebase/app-types@0.9.0': - resolution: {integrity: sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==} - - '@firebase/app-types@0.9.2': - resolution: {integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==} - - '@firebase/app@0.9.29': - resolution: {integrity: sha512-HbKTjfmILklasIu/ij6zKnFf3SgLYXkBDVN7leJfVGmohl+zA7Ig+eXM1ZkT1pyBJ8FTYR+mlOJer/lNEnUCtw==} - - '@firebase/auth-compat@0.5.4': - resolution: {integrity: sha512-EtRVW9s0YsuJv3GnOGDoLUW3Pp9f3HcqWA2WK92E30Qa0FEVRwCSRLVQwn9td+SLVY3AP9gi/auC1q3osd4yCg==} - peerDependencies: - '@firebase/app-compat': 0.x - - '@firebase/auth-interop-types@0.2.1': - resolution: {integrity: sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==} - - '@firebase/auth-interop-types@0.2.3': - resolution: {integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==} - - '@firebase/auth-types@0.12.0': - resolution: {integrity: sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==} - peerDependencies: - '@firebase/app-types': 0.x - '@firebase/util': 1.x - - '@firebase/auth@1.6.2': - resolution: {integrity: sha512-BFo/Nj1AAbKLbFiUyXCcnT/bSqMJicFOgdTAKzlXvCul7+eUE29vWmzd1g59O3iKAxvv3+fbQYjQVJpNTTHIyw==} - peerDependencies: - '@firebase/app': 0.x - '@react-native-async-storage/async-storage': ^1.18.1 - peerDependenciesMeta: - '@react-native-async-storage/async-storage': - optional: true - - '@firebase/component@0.6.5': - resolution: {integrity: sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==} - - '@firebase/component@0.6.9': - resolution: {integrity: sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==} - - '@firebase/database-compat@1.0.3': - resolution: {integrity: sha512-7tHEOcMbK5jJzHWyphPux4osogH/adWwncxdMxdBpB9g1DNIyY4dcz1oJdlkXGM/i/AjUBesZsd5CuwTRTBNTw==} - - '@firebase/database-compat@1.0.8': - resolution: {integrity: sha512-OpeWZoPE3sGIRPBKYnW9wLad25RaWbGyk7fFQe4xnJQKRzlynWeFBSRRAoLE2Old01WXwskUiucNqUUVlFsceg==} - - '@firebase/database-types@1.0.1': - resolution: {integrity: sha512-Tmcmx5XgiI7UVF/4oGg2P3AOTfq3WKEPsm2yf+uXtN7uG/a4WTWhVMrXGYRY2ZUL1xPxv9V33wQRJ+CcrUhVXw==} - - '@firebase/database-types@1.0.5': - resolution: {integrity: sha512-fTlqCNwFYyq/C6W7AJ5OCuq5CeZuBEsEwptnVxlNPkWCo5cTTyukzAHRSO/jaQcItz33FfYrrFk1SJofcu2AaQ==} - - '@firebase/database@1.0.3': - resolution: {integrity: sha512-9fjqLt9JzL46gw9+NRqsgQEMjgRwfd8XtzcKqG+UYyhVeFCdVRQ0Wp6Dw/dvYHnbH5vNEKzNv36dcB4p+PIAAA==} - - '@firebase/database@1.0.8': - resolution: {integrity: sha512-dzXALZeBI1U5TXt6619cv0+tgEhJiwlUtQ55WNZY7vGAjv7Q1QioV969iYwt1AQQ0ovHnEW0YW9TiBfefLvErg==} - - '@firebase/firestore-compat@0.3.27': - resolution: {integrity: sha512-gY2q0fCDJvPg/IurZQbBM7MIVjxA1/LsvfgFOubUTrex5KTY9qm4/2V2R79eAs8Q+b4B8soDtlEjk6L8BW1Crw==} - peerDependencies: - '@firebase/app-compat': 0.x - - '@firebase/firestore-types@3.0.0': - resolution: {integrity: sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==} - peerDependencies: - '@firebase/app-types': 0.x - '@firebase/util': 1.x - - '@firebase/firestore@4.5.0': - resolution: {integrity: sha512-rXS6v4HbsN6vZQlq2fLW1ZHb+J5SnS+8Zqb/McbKFIrGYjPUZo5CyO75mkgtlR1tCYAwCebaqoEWb6JHgZv/ww==} - engines: {node: '>=10.10.0'} - peerDependencies: - '@firebase/app': 0.x - - '@firebase/functions-compat@0.3.8': - resolution: {integrity: sha512-VDHSw6UOu8RxfgAY/q8e+Jn+9Fh60Fc28yck0yfMsi2e0BiWgonIMWkFspFGGLgOJebTHl+hc+9v91rhzU6xlg==} - peerDependencies: - '@firebase/app-compat': 0.x - - '@firebase/functions-types@0.6.0': - resolution: {integrity: sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==} - - '@firebase/functions@0.11.2': - resolution: {integrity: sha512-2NULTYOZbu0rXczwfYdqQH0w1FmmYrKjTy1YPQSHLCAkMBdfewoKmVm4Lyo2vRn0H9ZndciLY7NszKDFt9MKCQ==} - peerDependencies: - '@firebase/app': 0.x - - '@firebase/installations-compat@0.2.5': - resolution: {integrity: sha512-usvoIaog5CHEw082HXLrKAZ1qd4hIC3N/LDe2NqBgI3pkGE/7auLVM4Gn5gvyryp0x8z/IP1+d9fkGUj2OaGLQ==} - peerDependencies: - '@firebase/app-compat': 0.x - - '@firebase/installations-types@0.5.0': - resolution: {integrity: sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==} - peerDependencies: - '@firebase/app-types': 0.x - - '@firebase/installations@0.6.5': - resolution: {integrity: sha512-0xxnQWw8rSRzu0ZOCkZaO+MJ0LkDAfwwTB2Z1SxRK6FAz5xkxD1ZUwM0WbCRni49PKubCrZYOJ6yg7tSjU7AKA==} - peerDependencies: - '@firebase/app': 0.x - - '@firebase/logger@0.4.0': - resolution: {integrity: sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==} - - '@firebase/logger@0.4.2': - resolution: {integrity: sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==} - - '@firebase/messaging-compat@0.2.6': - resolution: {integrity: sha512-Q2xC1s4L7Vpss7P7Gy6GuIS+xmJrf/vm9+gX76IK1Bo1TjoKwleCLHt1LHkPz5Rvqg5pTgzzI8qqPhBpZosFCg==} - peerDependencies: - '@firebase/app-compat': 0.x - - '@firebase/messaging-interop-types@0.2.0': - resolution: {integrity: sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==} - - '@firebase/messaging@0.12.6': - resolution: {integrity: sha512-IORsPp9IPWq4j4yEhTOZ6GAGi3gQwGc+4yexmTAlya+qeBRSdRnJg2iIU/aj+tcKDQYr9RQuQPgHHOdFIx//vA==} - peerDependencies: - '@firebase/app': 0.x - - '@firebase/performance-compat@0.2.5': - resolution: {integrity: sha512-jJwJkVyDcIMBaVGrZ6CRGs4m5FCZsWB5QCWYI3FdsHyIa9/TfteNDilxj9wGciF2naFIHDW7TgE69U5dAH9Ktg==} - peerDependencies: - '@firebase/app-compat': 0.x - - '@firebase/performance-types@0.2.0': - resolution: {integrity: sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==} - - '@firebase/performance@0.6.5': - resolution: {integrity: sha512-OzAGcWhOqEFH9GdwUuY0oC5FSlnMejcnmSAhR+EjpI7exdDvixyLyCR4txjSHYNTbumrFBG+EP8GO11CNXRaJA==} - peerDependencies: - '@firebase/app': 0.x - - '@firebase/remote-config-compat@0.2.5': - resolution: {integrity: sha512-ImkNnLuGrD/bylBHDJigSY6LMwRrwt37wQbsGZhWG4QQ6KLzHzSf0nnFRRFvkOZodEUE57Ib8l74d6Yn/6TDUQ==} - peerDependencies: - '@firebase/app-compat': 0.x - - '@firebase/remote-config-types@0.3.0': - resolution: {integrity: sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==} - - '@firebase/remote-config@0.4.5': - resolution: {integrity: sha512-rGLqc/4OmxrS39RA9kgwa6JmgWytQuMo+B8pFhmGp3d++x2Hf9j+MLQfhOLyyUo64fNw20J19mLXhrXvKHsjZQ==} - peerDependencies: - '@firebase/app': 0.x - - '@firebase/storage-compat@0.3.5': - resolution: {integrity: sha512-5dJXfY5NxCF5NAk4dLvJqC+m6cgcf0Fr29nrMHwhwI34pBheQq2PdRZqALsqZCES9dnHTuFNlqGQDpLr+Ph4rw==} - peerDependencies: - '@firebase/app-compat': 0.x - - '@firebase/storage-types@0.8.0': - resolution: {integrity: sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==} - peerDependencies: - '@firebase/app-types': 0.x - '@firebase/util': 1.x - - '@firebase/storage@0.12.2': - resolution: {integrity: sha512-MzanOBcxDx9oOwDaDPMuiYxd6CxcN1xZm+os5uNE3C1itbRKLhM9rzpODDKWzcbnHHFtXk3Q3lsK/d3Xa1WYYw==} - peerDependencies: - '@firebase/app': 0.x - - '@firebase/util@1.10.0': - resolution: {integrity: sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==} - - '@firebase/util@1.9.4': - resolution: {integrity: sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==} - - '@firebase/webchannel-wrapper@0.10.5': - resolution: {integrity: sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==} - - '@google-cloud/firestore@7.10.0': - resolution: {integrity: sha512-VFNhdHvfnmqcHHs6YhmSNHHxQqaaD64GwiL0c+e1qz85S8SWZPC2XFRf8p9yHRTF40Kow424s1KBU9f0fdQa+Q==} - engines: {node: '>=14.0.0'} - - '@google-cloud/paginator@5.0.2': - resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==} - engines: {node: '>=14.0.0'} - - '@google-cloud/projectify@4.0.0': - resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} - engines: {node: '>=14.0.0'} - - '@google-cloud/promisify@4.0.0': - resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} - engines: {node: '>=14'} - - '@google-cloud/storage@7.14.0': - resolution: {integrity: sha512-H41bPL2cMfSi4EEnFzKvg7XSb7T67ocSXrmF7MPjfgFB0L6CKGzfIYJheAZi1iqXjz6XaCT1OBf6HCG5vDBTOQ==} - engines: {node: '>=14'} - - '@grpc/grpc-js@1.12.2': - resolution: {integrity: sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg==} - engines: {node: '>=12.10.0'} - - '@grpc/grpc-js@1.9.13': - resolution: {integrity: sha512-OEZZu9v9AA+7/tghMDE8o5DAMD5THVnwSqDWuh7PPYO5287rTyqy0xEHT6/e4pbqSrhyLPdQFsam4TwFQVVIIw==} - engines: {node: ^8.13.0 || >=10.10.0} - - '@grpc/proto-loader@0.7.10': - resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} - engines: {node: '>=6'} - hasBin: true - - '@grpc/proto-loader@0.7.13': - resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} - engines: {node: '>=6'} - hasBin: true - '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -1734,10 +1464,6 @@ packages: resolution: {integrity: sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==} engines: {node: '>=6.0.0'} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1746,10 +1472,6 @@ packages: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -1762,9 +1484,6 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@js-sdsl/ordered-map@4.4.2': - resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@julr/unocss-preset-forms@0.0.5': resolution: {integrity: sha512-lUMhKc8KooObDWIs0wyqh903ix5a6PRHtq1RAszhyEoDR2aqbnfSXnv0QiG2lDp2AWafioNbgquFGiUyyJCDVg==} engines: {node: '>=16'} @@ -1805,10 +1524,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - '@orama/orama@3.0.1': resolution: {integrity: sha512-18hl0MiCLmumODHjrLzSdTb1Ny3Dh8tn44jwgx0LksCdvVAsr3jQvfr+hwrE7bVkap0wPELb/dnuJjvupKxheQ==} engines: {node: '>= 16.0.0'} @@ -2594,10 +2309,6 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - '@turf/along@7.0.0-alpha.1': resolution: {integrity: sha512-Z9jhKfcGiK+unsgkwBz06D5GGaokud8ce15MaQWVbDWm2od1O2durud7UCR1gFDUnpnIXhqIClkupP4WA4K7pQ==} @@ -2940,12 +2651,6 @@ packages: '@turf/voronoi@7.0.0-alpha.1': resolution: {integrity: sha512-CYnsXLiMvc/jUi4fIHm5c43nmBt/J3jZgwDbe/2nJqUxfVY3YHOKRzPwweskMMij/1IWkBJcWSK+7Qp0yUZ0Tg==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - - '@types/caseless@0.12.5': - resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} - '@types/ckeditor__ckeditor5-alignment@37.0.0': resolution: {integrity: sha512-xwwq80b3mJVp+Xuy1BBT+e7+lpASQJY/8K8CRsAqTPOelyBUFHeRx3Q04fc8rux5RtcZckZKrndT1KVyus14mQ==} deprecated: This is a stub types definition. @ckeditor/ckeditor5-alignment provides its own type definitions, so you do not need this installed. @@ -3061,9 +2766,6 @@ packages: resolution: {integrity: sha512-jnvvLJVkfSf3XYEO2PpWMisaofbS+c8bqJV/G66oHcBO2Y2AsuLmJErU0mZSwtBV9cYpiraLA13e6TWWhjqJ+Q==} deprecated: This is a stub types definition. @ckeditor/ckeditor5-word-count provides its own type definitions, so you do not need this installed. - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -3088,12 +2790,6 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - '@types/extend@3.0.4': resolution: {integrity: sha512-ArMouDUTJEz1SQRpFsT2rIw7DeqICFv5aaVzLSIYMYQSLcwcGOfT3VyglQs/p7K3F7fT4zxr0NWxYZIdifD6dA==} @@ -3112,21 +2808,12 @@ packages: '@types/hast@2.3.10': resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - '@types/json-schema@7.0.13': resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/jsonwebtoken@9.0.7': - resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==} - - '@types/long@4.0.2': - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - '@types/mapbox-gl@2.7.6': resolution: {integrity: sha512-EPIfNO7WApXaFM7DuJBj+kpXmqffqJHMJ3Q9gbV/nNL23XHR0PC5CCDYbAFa4tKErm0xJd9C5kPLF6KvA/cRcA==} @@ -3136,9 +2823,6 @@ packages: '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -3166,36 +2850,18 @@ packages: '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@types/qs@6.9.16': - resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/recordrtc@5.6.10': resolution: {integrity: sha512-IuJZgrnlsLgtD1mmGPM4v8HnqLuYZGt+YKUbJPhtDcI9DyOMNFSb4xeYn/Uwc2rJwoeHZ1YX4jpWCDnhoAbMPg==} - '@types/request@2.48.12': - resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} - '@types/semver@7.5.3': resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - '@types/stream-chain@2.1.0': resolution: {integrity: sha512-guDyAl6s/CAzXUOWpGK2bHvdiopLIwpGu8v10+lb9hnQOyo4oj/ZUQFOvqFjKGsE3wJP1fpIesCcMvbXuWsqOg==} '@types/stream-json@1.7.7': resolution: {integrity: sha512-hHG7cLQ09H/m9i0jzL6UJAeLLxIWej90ECn0svO4T8J0nGcl89xZDQ2ujT4WKlvg0GWkcxJbjIDzW/v7BYUM6Q==} - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/unist@2.0.10': resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} @@ -3466,10 +3132,6 @@ packages: abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -3503,10 +3165,6 @@ packages: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} engines: {node: '>= 14'} - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -3559,25 +3217,14 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - async-retry@1.3.3: - resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} @@ -3590,22 +3237,12 @@ packages: axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - bin-links@4.0.3: resolution: {integrity: sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3653,9 +3290,6 @@ packages: buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -4036,15 +3670,9 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - earcut@2.2.4: resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - electron-to-chromium@1.4.681: resolution: {integrity: sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==} @@ -4063,9 +3691,6 @@ packages: encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - engine.io-client@6.4.0: resolution: {integrity: sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==} @@ -4339,10 +3964,6 @@ packages: event-stream@3.3.4: resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -4361,10 +3982,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - farmhash-modern@1.1.0: - resolution: {integrity: sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==} - engines: {node: '>=18.0.0'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4390,17 +4007,9 @@ packages: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true - fast-xml-parser@4.5.0: - resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} - hasBin: true - fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - fdir@6.4.2: resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} peerDependencies: @@ -4460,13 +4069,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - firebase-admin@12.7.0: - resolution: {integrity: sha512-raFIrOyTqREbyXsNkSHyciQLfv8AUZazehPaQS1lZBSCDYW74FYXU0nQZa3qHI4K+hawohlDbywZ4+qce9YNxA==} - engines: {node: '>=14'} - - firebase@10.9.0: - resolution: {integrity: sha512-R8rDU3mg2dq0uPOoZ5Nc3BeZTbXxBPJS8HcZLtnV0f5/YrmpNsHngzmMHRVB+91T+ViJGVL/42dV23gS9w9ccw==} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -4483,10 +4085,6 @@ packages: debug: optional: true - form-data@2.5.2: - resolution: {integrity: sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==} - engines: {node: '>= 0.12'} - form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -4518,9 +4116,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -4529,14 +4124,6 @@ packages: engines: {node: '>=10'} deprecated: This package is no longer supported. - gaxios@6.7.1: - resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} - engines: {node: '>=14'} - - gcp-metadata@6.1.0: - resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} - engines: {node: '>=14'} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -4610,24 +4197,12 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - google-auth-library@9.14.2: - resolution: {integrity: sha512-R+FRIfk1GBo3RdlRYWPdwk8nmtVUOn6+BkDomAC46KoU8kzXzE1HLmOasSCbWUByMMAGkknVF0G5kQ69Vj7dlA==} - engines: {node: '>=14'} - - google-gax@4.4.1: - resolution: {integrity: sha512-Phyp9fMfA00J3sZbJxbbB4jC55b7DBjE3F6poyL3wKMEBVKA79q6BGuHcTiM28yOzVql0NDbRL8MLLh8Iwk9Dg==} - engines: {node: '>=14'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gtoken@7.1.0: - resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} - engines: {node: '>=14.0.0'} - gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -4718,22 +4293,12 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - html-entities@2.5.2: - resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} - html-void-elements@2.0.1: resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} html-whitespace-sensitive-tag-names@2.0.0: resolution: {integrity: sha512-SQdIvTTtnHAx72xGUIUudvVOCjeWvV1U7rvSFnNGxTGRw3ZC7RES4Gw6dm1nMYD60TXvm6zjk/bWqgNc5pjQaw==} - http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -4742,10 +4307,6 @@ packages: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} - human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -4761,9 +4322,6 @@ packages: idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} - idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} - ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -4905,9 +4463,6 @@ packages: joi@17.12.2: resolution: {integrity: sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==} - jose@4.15.9: - resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4937,9 +4492,6 @@ packages: engines: {node: '>=6'} hasBin: true - json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -4964,10 +4516,6 @@ packages: jsonc-parser@3.2.1: resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - jsts@2.7.1: resolution: {integrity: sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==} engines: {node: '>= 12'} @@ -4975,22 +4523,6 @@ packages: jszip@3.8.0: resolution: {integrity: sha512-cnpQrXvFSLdsR9KR5/x7zdf6c3m8IhZfZzSblFEHSqBaVwD2nvJ4CuCKLyvKvwBgZm08CgfSoiTBQLm5WW9hGw==} - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - - jwa@2.0.0: - resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} - - jwks-rsa@3.1.0: - resolution: {integrity: sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==} - engines: {node: '>=14'} - - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - - jws@4.0.0: - resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -5030,9 +4562,6 @@ packages: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} - limiter@1.1.5: - resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -5063,36 +4592,9 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -5122,9 +4624,6 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lru-memoizer@2.3.0: - resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} - lz-string@1.4.4: resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} hasBin: true @@ -5312,11 +4811,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -5434,10 +4928,6 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - node-gyp-build@4.8.2: resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} hasBin: true @@ -5483,10 +4973,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} @@ -5798,10 +5284,6 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - proto3-json-serializer@2.0.2: - resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} - engines: {node: '>=14.0.0'} - protobufjs@7.2.4: resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} engines: {node: '>=12.0.0'} @@ -5810,10 +5292,6 @@ packages: resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} engines: {node: '>=12.0.0'} - protobufjs@7.4.0: - resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} - engines: {node: '>=12.0.0'} - proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -5943,14 +5421,6 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - retry-request@7.0.2: - resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} - engines: {node: '>=14'} - - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -6179,15 +5649,9 @@ packages: stream-combiner@0.0.4: resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - stream-events@1.0.5: - resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} - stream-json@1.8.0: resolution: {integrity: sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==} - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -6243,9 +5707,6 @@ packages: strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - stubs@3.0.0: - resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} - style-mod@4.1.2: resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} @@ -6344,16 +5805,6 @@ packages: resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==} engines: {node: '>=16'} - svelte@4.2.19: - resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} - engines: {node: '>=16'} - - sveltefirets@0.0.42: - resolution: {integrity: sha512-xmyOCYFa8x+CaeM/8YvZHRPv+M82fYHmXKZG9BGdwje/2bGUSho+RHepbJL+eZLj5IgXhMhaC3BoRRMqREEZiw==} - peerDependencies: - firebase: ^9.21.0 || ^10.0.0 - svelte: ^3.58.0 || ^4.0.0 || ^5.0.0 - sweepline-intersections@1.5.0: resolution: {integrity: sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==} @@ -6373,10 +5824,6 @@ packages: resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} engines: {node: '>=10'} - teeny-request@9.0.0: - resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} - engines: {node: '>=14'} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -6519,10 +5966,6 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici@5.28.3: - resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} - engines: {node: '>=14.0'} - unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} @@ -6589,10 +6032,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -6729,14 +6168,6 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - - websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -6864,11 +6295,6 @@ snapshots: '@jridgewell/gen-mapping': 0.3.4 '@jridgewell/trace-mapping': 0.3.23 - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - '@antfu/eslint-config@2.27.3(@typescript-eslint/utils@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.1.6))(@vue/compiler-sfc@3.4.38)(eslint-plugin-svelte@2.43.0(eslint@9.9.1(jiti@1.21.6))(svelte@4.2.12))(eslint@9.9.1(jiti@1.21.6))(svelte-eslint-parser@0.41.0(svelte@4.2.12))(svelte@4.2.12)(typescript@5.1.6)(vitest@2.1.4)': dependencies: '@antfu/install-pkg': 0.4.1 @@ -8877,475 +8303,45 @@ snapshots: '@eslint/object-schema@2.1.4': {} - '@fastify/busboy@2.1.0': {} - - '@fastify/busboy@3.0.0': {} + '@hapi/hoek@9.3.0': {} - '@firebase/analytics-compat@0.2.7(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29)': + '@hapi/topo@5.1.0': dependencies: - '@firebase/analytics': 0.10.1(@firebase/app@0.9.29) - '@firebase/analytics-types': 0.8.0 - '@firebase/app-compat': 0.2.29 - '@firebase/component': 0.6.5 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - transitivePeerDependencies: - - '@firebase/app' + '@hapi/hoek': 9.3.0 - '@firebase/analytics-types@0.8.0': {} + '@humanwhocodes/module-importer@1.0.1': {} - '@firebase/analytics@0.10.1(@firebase/app@0.9.29)': - dependencies: - '@firebase/app': 0.9.29 - '@firebase/component': 0.6.5 - '@firebase/installations': 0.6.5(@firebase/app@0.9.29) - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 + '@humanwhocodes/retry@0.3.0': {} - '@firebase/app-check-compat@0.3.9(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29)': + '@iconify/json@2.2.263': dependencies: - '@firebase/app-check': 0.8.2(@firebase/app@0.9.29) - '@firebase/app-check-types': 0.5.0 - '@firebase/app-compat': 0.2.29 - '@firebase/component': 0.6.5 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - transitivePeerDependencies: - - '@firebase/app' - - '@firebase/app-check-interop-types@0.3.0': {} - - '@firebase/app-check-interop-types@0.3.2': {} + '@iconify/types': 2.0.0 + pathe: 1.1.2 - '@firebase/app-check-types@0.5.0': {} + '@iconify/types@2.0.0': {} - '@firebase/app-check@0.8.2(@firebase/app@0.9.29)': + '@iconify/utils@2.1.22': dependencies: - '@firebase/app': 0.9.29 - '@firebase/component': 0.6.5 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.7 + '@iconify/types': 2.0.0 + debug: 4.3.4 + kolorist: 1.8.0 + local-pkg: 0.5.0 + mlly: 1.6.1 + transitivePeerDependencies: + - supports-color - '@firebase/app-compat@0.2.29': + '@jridgewell/gen-mapping@0.3.4': dependencies: - '@firebase/app': 0.9.29 - '@firebase/component': 0.6.5 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - - '@firebase/app-types@0.9.0': {} - - '@firebase/app-types@0.9.2': {} - - '@firebase/app@0.9.29': - dependencies: - '@firebase/component': 0.6.5 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.4 - idb: 7.1.1 - tslib: 2.8.1 - - '@firebase/auth-compat@0.5.4(@firebase/app-compat@0.2.29)(@firebase/app-types@0.9.0)(@firebase/app@0.9.29)': - dependencies: - '@firebase/app-compat': 0.2.29 - '@firebase/auth': 1.6.2(@firebase/app@0.9.29) - '@firebase/auth-types': 0.12.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4) - '@firebase/component': 0.6.5 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - undici: 5.28.3 - transitivePeerDependencies: - - '@firebase/app' - - '@firebase/app-types' - - '@react-native-async-storage/async-storage' - - '@firebase/auth-interop-types@0.2.1': {} - - '@firebase/auth-interop-types@0.2.3': {} - - '@firebase/auth-types@0.12.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4)': - dependencies: - '@firebase/app-types': 0.9.0 - '@firebase/util': 1.9.4 - - '@firebase/auth@1.6.2(@firebase/app@0.9.29)': - dependencies: - '@firebase/app': 0.9.29 - '@firebase/component': 0.6.5 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - undici: 5.28.3 - - '@firebase/component@0.6.5': - dependencies: - '@firebase/util': 1.9.4 - tslib: 2.8.1 - - '@firebase/component@0.6.9': - dependencies: - '@firebase/util': 1.10.0 - tslib: 2.8.1 - - '@firebase/database-compat@1.0.3': - dependencies: - '@firebase/component': 0.6.5 - '@firebase/database': 1.0.3 - '@firebase/database-types': 1.0.1 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - - '@firebase/database-compat@1.0.8': - dependencies: - '@firebase/component': 0.6.9 - '@firebase/database': 1.0.8 - '@firebase/database-types': 1.0.5 - '@firebase/logger': 0.4.2 - '@firebase/util': 1.10.0 - tslib: 2.8.1 - - '@firebase/database-types@1.0.1': - dependencies: - '@firebase/app-types': 0.9.0 - '@firebase/util': 1.9.4 - - '@firebase/database-types@1.0.5': - dependencies: - '@firebase/app-types': 0.9.2 - '@firebase/util': 1.10.0 - - '@firebase/database@1.0.3': - dependencies: - '@firebase/app-check-interop-types': 0.3.0 - '@firebase/auth-interop-types': 0.2.1 - '@firebase/component': 0.6.5 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.4 - faye-websocket: 0.11.4 - tslib: 2.8.1 - - '@firebase/database@1.0.8': - dependencies: - '@firebase/app-check-interop-types': 0.3.2 - '@firebase/auth-interop-types': 0.2.3 - '@firebase/component': 0.6.9 - '@firebase/logger': 0.4.2 - '@firebase/util': 1.10.0 - faye-websocket: 0.11.4 - tslib: 2.8.1 - - '@firebase/firestore-compat@0.3.27(@firebase/app-compat@0.2.29)(@firebase/app-types@0.9.0)(@firebase/app@0.9.29)': - dependencies: - '@firebase/app-compat': 0.2.29 - '@firebase/component': 0.6.5 - '@firebase/firestore': 4.5.0(@firebase/app@0.9.29) - '@firebase/firestore-types': 3.0.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4) - '@firebase/util': 1.9.4 - tslib: 2.8.1 - transitivePeerDependencies: - - '@firebase/app' - - '@firebase/app-types' - - '@firebase/firestore-types@3.0.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4)': - dependencies: - '@firebase/app-types': 0.9.0 - '@firebase/util': 1.9.4 - - '@firebase/firestore@4.5.0(@firebase/app@0.9.29)': - dependencies: - '@firebase/app': 0.9.29 - '@firebase/component': 0.6.5 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.4 - '@firebase/webchannel-wrapper': 0.10.5 - '@grpc/grpc-js': 1.9.13 - '@grpc/proto-loader': 0.7.10 - tslib: 2.8.1 - undici: 5.28.3 - - '@firebase/functions-compat@0.3.8(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29)': - dependencies: - '@firebase/app-compat': 0.2.29 - '@firebase/component': 0.6.5 - '@firebase/functions': 0.11.2(@firebase/app@0.9.29) - '@firebase/functions-types': 0.6.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - transitivePeerDependencies: - - '@firebase/app' - - '@firebase/functions-types@0.6.0': {} - - '@firebase/functions@0.11.2(@firebase/app@0.9.29)': - dependencies: - '@firebase/app': 0.9.29 - '@firebase/app-check-interop-types': 0.3.0 - '@firebase/auth-interop-types': 0.2.1 - '@firebase/component': 0.6.5 - '@firebase/messaging-interop-types': 0.2.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - undici: 5.28.3 - - '@firebase/installations-compat@0.2.5(@firebase/app-compat@0.2.29)(@firebase/app-types@0.9.0)(@firebase/app@0.9.29)': - dependencies: - '@firebase/app-compat': 0.2.29 - '@firebase/component': 0.6.5 - '@firebase/installations': 0.6.5(@firebase/app@0.9.29) - '@firebase/installations-types': 0.5.0(@firebase/app-types@0.9.0) - '@firebase/util': 1.9.4 - tslib: 2.8.1 - transitivePeerDependencies: - - '@firebase/app' - - '@firebase/app-types' - - '@firebase/installations-types@0.5.0(@firebase/app-types@0.9.0)': - dependencies: - '@firebase/app-types': 0.9.0 - - '@firebase/installations@0.6.5(@firebase/app@0.9.29)': - dependencies: - '@firebase/app': 0.9.29 - '@firebase/component': 0.6.5 - '@firebase/util': 1.9.4 - idb: 7.1.1 - tslib: 2.8.1 - - '@firebase/logger@0.4.0': - dependencies: - tslib: 2.8.1 - - '@firebase/logger@0.4.2': - dependencies: - tslib: 2.8.1 - - '@firebase/messaging-compat@0.2.6(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29)': - dependencies: - '@firebase/app-compat': 0.2.29 - '@firebase/component': 0.6.5 - '@firebase/messaging': 0.12.6(@firebase/app@0.9.29) - '@firebase/util': 1.9.4 - tslib: 2.8.1 - transitivePeerDependencies: - - '@firebase/app' - - '@firebase/messaging-interop-types@0.2.0': {} - - '@firebase/messaging@0.12.6(@firebase/app@0.9.29)': - dependencies: - '@firebase/app': 0.9.29 - '@firebase/component': 0.6.5 - '@firebase/installations': 0.6.5(@firebase/app@0.9.29) - '@firebase/messaging-interop-types': 0.2.0 - '@firebase/util': 1.9.4 - idb: 7.1.1 - tslib: 2.8.1 - - '@firebase/performance-compat@0.2.5(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29)': - dependencies: - '@firebase/app-compat': 0.2.29 - '@firebase/component': 0.6.5 - '@firebase/logger': 0.4.0 - '@firebase/performance': 0.6.5(@firebase/app@0.9.29) - '@firebase/performance-types': 0.2.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - transitivePeerDependencies: - - '@firebase/app' - - '@firebase/performance-types@0.2.0': {} - - '@firebase/performance@0.6.5(@firebase/app@0.9.29)': - dependencies: - '@firebase/app': 0.9.29 - '@firebase/component': 0.6.5 - '@firebase/installations': 0.6.5(@firebase/app@0.9.29) - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - - '@firebase/remote-config-compat@0.2.5(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29)': - dependencies: - '@firebase/app-compat': 0.2.29 - '@firebase/component': 0.6.5 - '@firebase/logger': 0.4.0 - '@firebase/remote-config': 0.4.5(@firebase/app@0.9.29) - '@firebase/remote-config-types': 0.3.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - transitivePeerDependencies: - - '@firebase/app' - - '@firebase/remote-config-types@0.3.0': {} - - '@firebase/remote-config@0.4.5(@firebase/app@0.9.29)': - dependencies: - '@firebase/app': 0.9.29 - '@firebase/component': 0.6.5 - '@firebase/installations': 0.6.5(@firebase/app@0.9.29) - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - - '@firebase/storage-compat@0.3.5(@firebase/app-compat@0.2.29)(@firebase/app-types@0.9.0)(@firebase/app@0.9.29)': - dependencies: - '@firebase/app-compat': 0.2.29 - '@firebase/component': 0.6.5 - '@firebase/storage': 0.12.2(@firebase/app@0.9.29) - '@firebase/storage-types': 0.8.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4) - '@firebase/util': 1.9.4 - tslib: 2.8.1 - transitivePeerDependencies: - - '@firebase/app' - - '@firebase/app-types' - - '@firebase/storage-types@0.8.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4)': - dependencies: - '@firebase/app-types': 0.9.0 - '@firebase/util': 1.9.4 - - '@firebase/storage@0.12.2(@firebase/app@0.9.29)': - dependencies: - '@firebase/app': 0.9.29 - '@firebase/component': 0.6.5 - '@firebase/util': 1.9.4 - tslib: 2.8.1 - undici: 5.28.3 - - '@firebase/util@1.10.0': - dependencies: - tslib: 2.8.1 - - '@firebase/util@1.9.4': - dependencies: - tslib: 2.8.1 - - '@firebase/webchannel-wrapper@0.10.5': {} - - '@google-cloud/firestore@7.10.0(encoding@0.1.13)': - dependencies: - '@opentelemetry/api': 1.9.0 - fast-deep-equal: 3.1.3 - functional-red-black-tree: 1.0.1 - google-gax: 4.4.1(encoding@0.1.13) - protobufjs: 7.4.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - '@google-cloud/paginator@5.0.2': - dependencies: - arrify: 2.0.1 - extend: 3.0.2 - optional: true - - '@google-cloud/projectify@4.0.0': - optional: true - - '@google-cloud/promisify@4.0.0': - optional: true - - '@google-cloud/storage@7.14.0(encoding@0.1.13)': - dependencies: - '@google-cloud/paginator': 5.0.2 - '@google-cloud/projectify': 4.0.0 - '@google-cloud/promisify': 4.0.0 - abort-controller: 3.0.0 - async-retry: 1.3.3 - duplexify: 4.1.3 - fast-xml-parser: 4.5.0 - gaxios: 6.7.1(encoding@0.1.13) - google-auth-library: 9.14.2(encoding@0.1.13) - html-entities: 2.5.2 - mime: 3.0.0 - p-limit: 3.1.0 - retry-request: 7.0.2(encoding@0.1.13) - teeny-request: 9.0.0(encoding@0.1.13) - uuid: 8.3.2 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - '@grpc/grpc-js@1.12.2': - dependencies: - '@grpc/proto-loader': 0.7.13 - '@js-sdsl/ordered-map': 4.4.2 - optional: true - - '@grpc/grpc-js@1.9.13': - dependencies: - '@grpc/proto-loader': 0.7.10 - '@types/node': 18.18.0 - - '@grpc/proto-loader@0.7.10': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.2.3 - protobufjs: 7.2.5 - yargs: 17.7.2 - - '@grpc/proto-loader@0.7.13': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.2.3 - protobufjs: 7.4.0 - yargs: 17.7.2 - optional: true - - '@hapi/hoek@9.3.0': {} - - '@hapi/topo@5.1.0': - dependencies: - '@hapi/hoek': 9.3.0 - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.3.0': {} - - '@iconify/json@2.2.263': - dependencies: - '@iconify/types': 2.0.0 - pathe: 1.1.2 - - '@iconify/types@2.0.0': {} - - '@iconify/utils@2.1.22': - dependencies: - '@antfu/install-pkg': 0.1.1 - '@antfu/utils': 0.7.7 - '@iconify/types': 2.0.0 - debug: 4.3.4 - kolorist: 1.8.0 - local-pkg: 0.5.0 - mlly: 1.6.1 - transitivePeerDependencies: - - supports-color - - '@jridgewell/gen-mapping@0.3.4': - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.23 - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.23 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.1.2': {} - '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} '@jridgewell/sourcemap-codec@1.5.0': {} @@ -9360,9 +8356,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@js-sdsl/ordered-map@4.4.2': - optional: true - '@julr/unocss-preset-forms@0.0.5(unocss@0.58.5(postcss@8.4.47)(rollup@4.24.3)(vite@5.4.10(@types/node@22.8.6)))': dependencies: mini-svg-data-uri: 1.4.4 @@ -9427,9 +8420,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@opentelemetry/api@1.9.0': - optional: true - '@orama/orama@3.0.1': {} '@pkgr/core@0.1.1': {} @@ -10501,9 +9491,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@tootallnate/once@2.0.0': - optional: true - '@turf/along@7.0.0-alpha.1': dependencies: '@turf/bearing': 7.0.0-alpha.1 @@ -11424,14 +10411,6 @@ snapshots: '@turf/invariant': 7.0.0-alpha.1 d3-voronoi: 1.1.2 - '@types/body-parser@1.19.5': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 18.11.18 - - '@types/caseless@0.12.5': - optional: true - '@types/ckeditor__ckeditor5-alignment@37.0.0': dependencies: '@ckeditor/ckeditor5-alignment': 38.1.1 @@ -11583,10 +10562,6 @@ snapshots: dependencies: '@ckeditor/ckeditor5-word-count': 38.1.1 - '@types/connect@3.4.38': - dependencies: - '@types/node': 18.11.18 - '@types/cookie@0.6.0': {} '@types/d3-dsv@3.0.0': {} @@ -11613,20 +10588,6 @@ snapshots: '@types/estree@1.0.6': {} - '@types/express-serve-static-core@4.19.6': - dependencies: - '@types/node': 18.11.18 - '@types/qs': 6.9.16 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - - '@types/express@4.17.21': - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.9.16 - '@types/serve-static': 1.15.7 - '@types/extend@3.0.4': {} '@types/file-saver@2.0.5': {} @@ -11641,19 +10602,10 @@ snapshots: dependencies: '@types/unist': 2.0.10 - '@types/http-errors@2.0.4': {} - '@types/json-schema@7.0.13': {} '@types/json-schema@7.0.15': {} - '@types/jsonwebtoken@9.0.7': - dependencies: - '@types/node': 18.11.18 - - '@types/long@4.0.2': - optional: true - '@types/mapbox-gl@2.7.6': dependencies: '@types/geojson': 7946.0.10 @@ -11667,8 +10619,6 @@ snapshots: dependencies: '@types/unist': 2.0.10 - '@types/mime@1.3.5': {} - '@types/ms@0.7.34': {} '@types/node@18.11.18': {} @@ -11693,33 +10643,10 @@ snapshots: '@types/pug@2.0.10': {} - '@types/qs@6.9.16': {} - - '@types/range-parser@1.2.7': {} - '@types/recordrtc@5.6.10': {} - '@types/request@2.48.12': - dependencies: - '@types/caseless': 0.12.5 - '@types/node': 18.11.18 - '@types/tough-cookie': 4.0.5 - form-data: 2.5.2 - optional: true - '@types/semver@7.5.3': {} - '@types/send@0.17.4': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 18.11.18 - - '@types/serve-static@1.15.7': - dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 18.11.18 - '@types/send': 0.17.4 - '@types/stream-chain@2.1.0': dependencies: '@types/node': 18.18.0 @@ -11729,9 +10656,6 @@ snapshots: '@types/node': 18.18.0 '@types/stream-chain': 2.1.0 - '@types/tough-cookie@4.0.5': - optional: true - '@types/unist@2.0.10': {} '@types/ws@8.5.10': @@ -12126,7 +11050,7 @@ snapshots: sirv: 3.0.0 tinyglobby: 0.2.10 tinyrainbow: 1.2.0 - vitest: 2.1.4(@types/node@22.8.6)(@vitest/ui@2.1.4) + vitest: 2.1.4(@types/node@18.11.18)(@vitest/ui@2.1.4) '@vitest/utils@2.1.4': dependencies: @@ -12168,11 +11092,6 @@ snapshots: abbrev@1.1.1: {} - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - optional: true - acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -12203,13 +11122,6 @@ snapshots: transitivePeerDependencies: - supports-color - agent-base@7.1.1: - dependencies: - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - optional: true - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -12257,20 +11169,10 @@ snapshots: dependencies: dequal: 2.0.3 - aria-query@5.3.2: {} - array-union@2.1.0: {} - arrify@2.0.1: - optional: true - assertion-error@2.0.1: {} - async-retry@1.3.3: - dependencies: - retry: 0.13.1 - optional: true - async-sema@3.1.1: {} asynckit@0.4.0: {} @@ -12287,18 +11189,10 @@ snapshots: dependencies: dequal: 2.0.3 - axobject-query@4.1.0: {} - bail@2.0.2: {} balanced-match@1.0.2: {} - base64-js@1.5.1: - optional: true - - bignumber.js@9.1.2: - optional: true - bin-links@4.0.3: dependencies: cmd-shim: 6.0.2 @@ -12351,8 +11245,6 @@ snapshots: buffer-crc32@0.2.13: {} - buffer-equal-constant-time@1.0.1: {} - builtin-modules@3.3.0: {} cac@6.7.14: {} @@ -12690,20 +11582,8 @@ snapshots: duplexer@0.1.2: {} - duplexify@4.1.3: - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 3.6.2 - stream-shift: 1.0.3 - optional: true - earcut@2.2.4: {} - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - electron-to-chromium@1.4.681: {} electron-to-chromium@1.5.13: {} @@ -12719,11 +11599,6 @@ snapshots: iconv-lite: 0.6.3 optional: true - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - optional: true - engine.io-client@6.4.0: dependencies: '@socket.io/component-emitter': 3.1.0 @@ -13152,9 +12027,6 @@ snapshots: stream-combiner: 0.0.4 through: 2.3.8 - event-target-shim@5.0.1: - optional: true - eventemitter3@5.0.1: {} execa@5.1.1: @@ -13185,8 +12057,6 @@ snapshots: extend@3.0.2: {} - farmhash-modern@1.1.0: {} - fast-deep-equal@3.1.3: {} fast-glob@3.3.1: @@ -13217,19 +12087,10 @@ snapshots: dependencies: strnum: 1.0.5 - fast-xml-parser@4.5.0: - dependencies: - strnum: 1.0.5 - optional: true - fastq@1.17.1: dependencies: reusify: 1.0.4 - faye-websocket@0.11.4: - dependencies: - websocket-driver: 0.7.4 - fdir@6.4.2(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -13280,55 +12141,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - firebase-admin@12.7.0(encoding@0.1.13): - dependencies: - '@fastify/busboy': 3.0.0 - '@firebase/database-compat': 1.0.8 - '@firebase/database-types': 1.0.5 - '@types/node': 22.8.6 - farmhash-modern: 1.1.0 - jsonwebtoken: 9.0.2 - jwks-rsa: 3.1.0 - node-forge: 1.3.1 - uuid: 10.0.0 - optionalDependencies: - '@google-cloud/firestore': 7.10.0(encoding@0.1.13) - '@google-cloud/storage': 7.14.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - supports-color - - firebase@10.9.0: - dependencies: - '@firebase/analytics': 0.10.1(@firebase/app@0.9.29) - '@firebase/analytics-compat': 0.2.7(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29) - '@firebase/app': 0.9.29 - '@firebase/app-check': 0.8.2(@firebase/app@0.9.29) - '@firebase/app-check-compat': 0.3.9(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29) - '@firebase/app-compat': 0.2.29 - '@firebase/app-types': 0.9.0 - '@firebase/auth': 1.6.2(@firebase/app@0.9.29) - '@firebase/auth-compat': 0.5.4(@firebase/app-compat@0.2.29)(@firebase/app-types@0.9.0)(@firebase/app@0.9.29) - '@firebase/database': 1.0.3 - '@firebase/database-compat': 1.0.3 - '@firebase/firestore': 4.5.0(@firebase/app@0.9.29) - '@firebase/firestore-compat': 0.3.27(@firebase/app-compat@0.2.29)(@firebase/app-types@0.9.0)(@firebase/app@0.9.29) - '@firebase/functions': 0.11.2(@firebase/app@0.9.29) - '@firebase/functions-compat': 0.3.8(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29) - '@firebase/installations': 0.6.5(@firebase/app@0.9.29) - '@firebase/installations-compat': 0.2.5(@firebase/app-compat@0.2.29)(@firebase/app-types@0.9.0)(@firebase/app@0.9.29) - '@firebase/messaging': 0.12.6(@firebase/app@0.9.29) - '@firebase/messaging-compat': 0.2.6(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29) - '@firebase/performance': 0.6.5(@firebase/app@0.9.29) - '@firebase/performance-compat': 0.2.5(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29) - '@firebase/remote-config': 0.4.5(@firebase/app@0.9.29) - '@firebase/remote-config-compat': 0.2.5(@firebase/app-compat@0.2.29)(@firebase/app@0.9.29) - '@firebase/storage': 0.12.2(@firebase/app@0.9.29) - '@firebase/storage-compat': 0.3.5(@firebase/app-compat@0.2.29)(@firebase/app-types@0.9.0)(@firebase/app@0.9.29) - '@firebase/util': 1.9.4 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - flat-cache@4.0.1: dependencies: flatted: 3.3.1 @@ -13340,14 +12152,6 @@ snapshots: optionalDependencies: debug: 4.3.6 - form-data@2.5.2: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - safe-buffer: 5.2.1 - optional: true - form-data@4.0.0: dependencies: asynckit: 0.4.0 @@ -13374,9 +12178,6 @@ snapshots: function-bind@1.1.2: {} - functional-red-black-tree@1.0.1: - optional: true - functions-have-names@1.2.3: {} gauge@3.0.2: @@ -13391,27 +12192,6 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 - gaxios@6.7.1(encoding@0.1.13): - dependencies: - extend: 3.0.2 - https-proxy-agent: 7.0.5 - is-stream: 2.0.1 - node-fetch: 2.7.0(encoding@0.1.13) - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - gcp-metadata@6.1.0(encoding@0.1.13): - dependencies: - gaxios: 6.7.1(encoding@0.1.13) - json-bigint: 1.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - gensync@1.0.0-beta.2: {} geojson-equality@0.1.6: @@ -13483,51 +12263,10 @@ snapshots: globrex@0.1.2: {} - google-auth-library@9.14.2(encoding@0.1.13): - dependencies: - base64-js: 1.5.1 - ecdsa-sig-formatter: 1.0.11 - gaxios: 6.7.1(encoding@0.1.13) - gcp-metadata: 6.1.0(encoding@0.1.13) - gtoken: 7.1.0(encoding@0.1.13) - jws: 4.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - google-gax@4.4.1(encoding@0.1.13): - dependencies: - '@grpc/grpc-js': 1.12.2 - '@grpc/proto-loader': 0.7.13 - '@types/long': 4.0.2 - abort-controller: 3.0.0 - duplexify: 4.1.3 - google-auth-library: 9.14.2(encoding@0.1.13) - node-fetch: 2.7.0(encoding@0.1.13) - object-hash: 3.0.0 - proto3-json-serializer: 2.0.2 - protobufjs: 7.4.0 - retry-request: 7.0.2(encoding@0.1.13) - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - graceful-fs@4.2.11: {} graphemer@1.4.0: {} - gtoken@7.1.0(encoding@0.1.13): - dependencies: - gaxios: 6.7.1(encoding@0.1.13) - jws: 4.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - gzip-size@6.0.0: dependencies: duplexer: 0.1.2 @@ -13658,24 +12397,10 @@ snapshots: hosted-git-info@2.8.9: {} - html-entities@2.5.2: - optional: true - html-void-elements@2.0.1: {} html-whitespace-sensitive-tag-names@2.0.0: {} - http-parser-js@0.5.8: {} - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - optional: true - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -13690,14 +12415,6 @@ snapshots: transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.5: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - optional: true - human-signals@2.1.0: {} human-signals@5.0.0: {} @@ -13708,8 +12425,6 @@ snapshots: idb-keyval@6.2.1: {} - idb@7.1.1: {} - ignore@5.3.1: {} immediate@3.0.6: {} @@ -13824,8 +12539,6 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - jose@4.15.9: {} - js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -13842,11 +12555,6 @@ snapshots: jsesc@3.0.2: {} - json-bigint@1.0.0: - dependencies: - bignumber.js: 9.1.2 - optional: true - json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -13866,19 +12574,6 @@ snapshots: jsonc-parser@3.2.1: {} - jsonwebtoken@9.0.2: - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.6.3 - jsts@2.7.1: {} jszip@3.8.0: @@ -13888,41 +12583,6 @@ snapshots: readable-stream: 2.3.7 set-immediate-shim: 1.0.1 - jwa@1.4.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jwa@2.0.0: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - optional: true - - jwks-rsa@3.1.0: - dependencies: - '@types/express': 4.17.21 - '@types/jsonwebtoken': 9.0.7 - debug: 4.3.7 - jose: 4.15.9 - limiter: 1.1.5 - lru-memoizer: 2.3.0 - transitivePeerDependencies: - - supports-color - - jws@3.2.2: - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - - jws@4.0.0: - dependencies: - jwa: 2.0.0 - safe-buffer: 5.2.1 - optional: true - keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -13982,8 +12642,6 @@ snapshots: lilconfig@3.1.2: {} - limiter@1.1.5: {} - lines-and-columns@1.2.4: {} lint-staged@15.2.9: @@ -14027,26 +12685,8 @@ snapshots: lodash-es@4.17.21: {} - lodash.camelcase@4.3.0: {} - - lodash.clonedeep@4.5.0: {} - - lodash.includes@4.3.0: {} - - lodash.isboolean@3.0.3: {} - - lodash.isinteger@4.0.4: {} - - lodash.isnumber@3.0.3: {} - - lodash.isplainobject@4.0.6: {} - - lodash.isstring@4.0.1: {} - lodash.merge@4.6.2: {} - lodash.once@4.1.1: {} - lodash@4.17.21: {} log-update@6.1.0: @@ -14077,11 +12717,6 @@ snapshots: dependencies: yallist: 4.0.0 - lru-memoizer@2.3.0: - dependencies: - lodash.clonedeep: 4.5.0 - lru-cache: 6.0.0 - lz-string@1.4.4: {} magic-string@0.30.12: @@ -14454,9 +13089,6 @@ snapshots: dependencies: mime-db: 1.52.0 - mime@3.0.0: - optional: true - mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -14557,8 +13189,6 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-forge@1.3.1: {} - node-gyp-build@4.8.2: {} node-releases@2.0.14: {} @@ -14601,9 +13231,6 @@ snapshots: object-assign@4.1.1: {} - object-hash@3.0.0: - optional: true - object-is@1.1.5: dependencies: call-bind: 1.0.2 @@ -14892,11 +13519,6 @@ snapshots: property-information@6.5.0: {} - proto3-json-serializer@2.0.2: - dependencies: - protobufjs: 7.4.0 - optional: true - protobufjs@7.2.4: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -14927,22 +13549,6 @@ snapshots: '@types/node': 18.11.18 long: 5.2.3 - protobufjs@7.4.0: - 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': 18.11.18 - long: 5.2.3 - optional: true - proxy-from-env@1.1.0: {} ps-tree@1.2.0: @@ -15125,19 +13731,6 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - retry-request@7.0.2(encoding@0.1.13): - dependencies: - '@types/request': 2.48.12 - extend: 3.0.2 - teeny-request: 9.0.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - retry@0.13.1: - optional: true - reusify@1.0.4: {} rfdc@1.4.1: {} @@ -15392,18 +13985,10 @@ snapshots: dependencies: duplexer: 0.1.2 - stream-events@1.0.5: - dependencies: - stubs: 3.0.0 - optional: true - stream-json@1.8.0: dependencies: stream-chain: 2.2.5 - stream-shift@1.0.3: - optional: true - string-argv@0.3.2: {} string-width@4.2.3: @@ -15457,9 +14042,6 @@ snapshots: strnum@1.0.5: {} - stubs@3.0.0: - optional: true - style-mod@4.1.2: {} supabase@1.145.4: @@ -15565,28 +14147,6 @@ snapshots: magic-string: 0.30.7 periscopic: 3.1.0 - svelte@4.2.19: - dependencies: - '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - '@types/estree': 1.0.6 - acorn: 8.14.0 - aria-query: 5.3.2 - axobject-query: 4.1.0 - code-red: 1.0.4 - css-tree: 2.3.1 - estree-walker: 3.0.3 - is-reference: 3.0.2 - locate-character: 3.0.0 - magic-string: 0.30.12 - periscopic: 3.1.0 - - sveltefirets@0.0.42(firebase@10.9.0)(svelte@4.2.19): - dependencies: - firebase: 10.9.0 - svelte: 4.2.19 - sweepline-intersections@1.5.0: dependencies: tinyqueue: 2.0.3 @@ -15611,18 +14171,6 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - teeny-request@9.0.0(encoding@0.1.13): - dependencies: - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0(encoding@0.1.13) - stream-events: 1.0.5 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - text-table@0.2.0: {} through@2.3.8: {} @@ -15729,10 +14277,6 @@ snapshots: undici-types@6.19.8: {} - undici@5.28.3: - dependencies: - '@fastify/busboy': 2.1.0 - unified@10.1.2: dependencies: '@types/unist': 2.0.10 @@ -15834,8 +14378,6 @@ snapshots: util-deprecate@1.0.2: {} - uuid@10.0.0: {} - uuid@8.3.2: {} uuid@9.0.1: {} @@ -16043,14 +14585,6 @@ snapshots: webidl-conversions@3.0.1: {} - websocket-driver@0.7.4: - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - - websocket-extensions@0.1.4: {} - whatwg-url@5.0.0: dependencies: tr46: 0.0.3