diff --git a/packages/backend/src/routes/uploadRoutes.tsx b/packages/backend/src/routes/uploadRoutes.tsx index 09bf880..fab13ed 100644 --- a/packages/backend/src/routes/uploadRoutes.tsx +++ b/packages/backend/src/routes/uploadRoutes.tsx @@ -29,6 +29,7 @@ export const uploadPlugin: FastifyPluginAsyncTypebox = async (fastify, _) => { publicRead: true, }); + // await db.pictures.create({ data: { id, url, reportId, createdAt: new Date() } }); await db.pictures.update({ where: { id }, data: { url } }); reply.send(); diff --git a/packages/frontend/src/envVars.ts b/packages/frontend/src/envVars.ts index c32f0d9..727673d 100644 --- a/packages/frontend/src/envVars.ts +++ b/packages/frontend/src/envVars.ts @@ -7,7 +7,9 @@ const envSchema = z.object({ VITE_ELECTRIC_URL: z.string(), }); -export const ENV = envSchema.parse(isDev ? import.meta.env : window.ENV); +const isBrowser = typeof window === "undefined"; + +export const ENV = envSchema.parse(isDev || isBrowser ? import.meta.env : window.ENV); declare global { interface Window { ENV: typeof ENV; diff --git a/packages/frontend/src/features/InfoForm.tsx b/packages/frontend/src/features/InfoForm.tsx index 0c18b69..ad125a4 100644 --- a/packages/frontend/src/features/InfoForm.tsx +++ b/packages/frontend/src/features/InfoForm.tsx @@ -18,7 +18,7 @@ import { useUser } from "../contexts/AuthContext"; import { db } from "../db"; import { useIsFormDisabled } from "./DisabledContext"; import { ServiceInstructeurSelect } from "./ServiceInstructeurSelect"; -import { getPicturesStore, syncImages } from "./idb"; +import { getPicturesStore, getToUploadStore, syncImages } from "./idb"; export const InfoForm = () => { const form = useFormContext(); @@ -212,22 +212,17 @@ const UploadImage = ({ reportId }: { reportId: string }) => { const onChange = async (e: ChangeEvent) => { const picturesStore = getPicturesStore(); + const toUploadStore = getToUploadStore(); const id = v4(); const file = e.target.files?.[0]; if (!file) return; const buffer = await getArrayBufferFromBlob(file); - set(id, buffer, picturesStore); - - await db.pictures.create({ - data: { - id, - reportId, - createdAt: new Date(), - }, - }); + await set(id, buffer, picturesStore); + await set(id, reportId, toUploadStore); + await db.pictures.create({ data: { id, reportId, createdAt: new Date() } }); syncImages(); }; diff --git a/packages/frontend/src/features/idb.ts b/packages/frontend/src/features/idb.ts index 3ebbda6..c6b79c1 100644 --- a/packages/frontend/src/features/idb.ts +++ b/packages/frontend/src/features/idb.ts @@ -1,6 +1,7 @@ import { createStore } from "idb-keyval"; export const getPicturesStore = () => createStore("toSync", "images"); +export const getToUploadStore = () => createStore("toUpload", "images"); export const syncImages = async () => { console.log("sync"); diff --git a/packages/frontend/src/service-worker/electric.ts b/packages/frontend/src/service-worker/electric.ts index e648b5c..9960f9a 100644 --- a/packages/frontend/src/service-worker/electric.ts +++ b/packages/frontend/src/service-worker/electric.ts @@ -9,7 +9,6 @@ export const initElectric = async () => { url: ENV.VITE_ELECTRIC_URL, } satisfies ElectricConfig; const conn = await ElectricDatabase.init("crvif.db", "/"); - const electric = await electrify(conn, schema, config); const db = electric.db; diff --git a/packages/frontend/src/service-worker/sw.ts b/packages/frontend/src/service-worker/sw.ts index 7a5fb59..8450bc8 100644 --- a/packages/frontend/src/service-worker/sw.ts +++ b/packages/frontend/src/service-worker/sw.ts @@ -1,9 +1,7 @@ import { precacheAndRoute } from "workbox-precaching"; import { api, getTokenFromIdb } from "../api"; -import { getPicturesStore } from "../features/idb"; -import { del, get, keys } from "idb-keyval"; -import { initElectric } from "./electric"; -import { Pictures } from "@cr-vif/electric-client/frontend"; +import { getPicturesStore, getToUploadStore } from "../features/idb"; +import { get, keys, del } from "idb-keyval"; declare let self: ServiceWorkerGlobalScope; @@ -15,29 +13,16 @@ self.addEventListener("sync", async (event: any) => { event.waitUntil(syncMissingPictures()); }); -const ref = { - db: null as Awaited>["db"] | null, -}; - -const getDb = async () => { - if (!ref.db) { - ref.db = (await initElectric()).db; - } - - return ref.db; -}; - const syncMissingPictures = async (retries = 3) => { try { const token = await getTokenFromIdb(); if (!token) return void console.log("no token"); - const db = await getDb(); - const pictures = await db.pictures.findMany({ where: { url: null } }); + const pictureIds = await keys(getToUploadStore()); - console.log("syncing", pictures.length, "missing pictures"); + console.log("syncing", pictureIds.length, "missing pictures"); - await syncPicturesById(pictures, token); + await syncPicturesById(pictureIds as string[], token); } catch (e) { if (retries > 0) { console.log("retrying in 5s", e); @@ -47,53 +32,57 @@ const syncMissingPictures = async (retries = 3) => { throw e; } - - // await cleanupOldCaches(); }; -const syncPicturesById = async (ids: Pictures[], token: string) => { +const syncPicturesById = async (ids: string[], token: string) => { const store = getPicturesStore(); + const toUploadStore = getToUploadStore(); + const localIds = await keys(store); - const missingIds = ids.filter((pic) => localIds.includes(pic.id)); + const missingIds = ids.filter((picId) => localIds.includes(picId)); + + for (const picId of missingIds) { + const reportId = await get(picId, toUploadStore); - for (const pic of missingIds) { - console.log("syncing picture", pic); - const buffer = await get(pic.id, store); + console.log("syncing picture", picId); + const buffer = await get(picId, store); if (!buffer) { - console.log("missing buffer for id", pic.id); + console.log("missing buffer for id", picId); continue; } const formData = new FormData(); formData.append("file", new Blob([buffer]), "file"); - formData.append("reportId", pic.reportId!); - formData.append("pictureId", pic.id); + formData.append("reportId", reportId); + formData.append("pictureId", picId); await api.post("/api/upload/image", { body: formData, - query: { reportId: pic.reportId, id: pic.id }, + query: { reportId: reportId, id: picId }, header: { Authorization: `Bearer ${token}` }, } as any); + await del(picId, toUploadStore); + console.log("done"); } }; -const cleanupOldCaches = async () => { - const db = await getDb(); +// const cleanupOldCaches = async () => { +// const db = await getDb(); - const keysToKeep = await db.pictures.findMany({ where: { url: null } }); +// const keysToKeep = await db.pictures.findMany({ where: { url: null } }); - const store = getPicturesStore(); - const localIds = await keys(store); +// const store = getPicturesStore(); +// const localIds = await keys(store); - const keysToDelete = localIds.filter((id) => !keysToKeep.some((pic) => pic.id === id)); +// const keysToDelete = localIds.filter((id) => !keysToKeep.some((pic) => pic.id === id)); - console.log("deleting", keysToDelete.length, "old pictures"); +// console.log("deleting", keysToDelete.length, "old pictures"); - for (const key of keysToDelete) { - await del(key, store); - } +// for (const key of keysToDelete) { +// await del(key, store); +// } - console.log("done"); -}; +// console.log("done"); +// }; diff --git a/packages/frontend/vite.config.ts b/packages/frontend/vite.config.ts index 05bef40..5d20f23 100644 --- a/packages/frontend/vite.config.ts +++ b/packages/frontend/vite.config.ts @@ -4,6 +4,7 @@ import { TanStackRouterVite } from "@tanstack/router-vite-plugin"; import wasm from "vite-plugin-wasm"; import { VitePWA } from "vite-plugin-pwa"; import topLevelAwait from "vite-plugin-top-level-await"; + // https://vitejs.dev/config/ export default defineConfig({ plugins: [ @@ -12,6 +13,7 @@ export default defineConfig({ wasm(), VitePWA({ devOptions: { enabled: true, type: "module" }, + registerType: "autoUpdate", manifest: { id: "gouv.beta.compte-rendu-vif", @@ -25,6 +27,7 @@ export default defineConfig({ injectManifest: { maximumFileSizeToCacheInBytes: 2097152 * 3, globPatterns: ["**/*.{svg,woff2,js,wasm,css,html,png}"], + rollupFormat: "es", }, includeAssets: ["**/*.{svg,woff2,wasm}"], strategies: "injectManifest", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1681647..fbb73ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1325,20 +1325,12 @@ packages: tslib: 2.6.2 dev: false - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 - /@babel/code-frame@7.24.7: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.24.7 picocolors: 1.0.0 - dev: true /@babel/compat-data@7.24.1: resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} @@ -1354,15 +1346,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.7 '@babel/generator': 7.24.1 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) '@babel/helpers': 7.24.1 - '@babel/parser': 7.24.1 - '@babel/template': 7.24.0 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -1398,7 +1390,7 @@ packages: resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -1417,7 +1409,7 @@ packages: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true /@babel/helper-annotate-as-pure@7.24.7: @@ -1538,8 +1530,8 @@ packages: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 /@babel/helper-function-name@7.24.7: resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} @@ -1553,7 +1545,7 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 /@babel/helper-hoist-variables@7.24.7: resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} @@ -1566,7 +1558,7 @@ packages: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true /@babel/helper-member-expression-to-functions@7.24.7: @@ -1583,7 +1575,7 @@ packages: resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 /@babel/helper-module-imports@7.24.7: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} @@ -1606,7 +1598,7 @@ packages: '@babel/helper-module-imports': 7.24.3 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.7 /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} @@ -1628,7 +1620,7 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true /@babel/helper-optimise-call-expression@7.24.7: @@ -1692,7 +1684,7 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 /@babel/helper-simple-access@7.24.7: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} @@ -1708,7 +1700,7 @@ packages: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true /@babel/helper-skip-transparent-expression-wrappers@7.24.7: @@ -1725,7 +1717,7 @@ packages: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 /@babel/helper-split-export-declaration@7.24.7: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} @@ -1734,23 +1726,13 @@ packages: '@babel/types': 7.24.7 dev: true - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} - /@babel/helper-string-parser@7.24.7: resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.24.7: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} @@ -1777,9 +1759,9 @@ packages: resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.0 + '@babel/template': 7.24.7 '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color @@ -1791,15 +1773,6 @@ packages: '@babel/types': 7.24.7 dev: true - /@babel/highlight@7.24.2: - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 - /@babel/highlight@7.24.7: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} @@ -1808,14 +1781,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - dev: true - - /@babel/parser@7.24.1: - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.24.0 /@babel/parser@7.24.7: resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} @@ -1823,7 +1788,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.24.7 - dev: true /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==} @@ -2546,7 +2510,7 @@ packages: '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.24.7): @@ -2796,9 +2760,10 @@ packages: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + dev: true /@babel/template@7.24.7: resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} @@ -2807,20 +2772,19 @@ packages: '@babel/code-frame': 7.24.7 '@babel/parser': 7.24.7 '@babel/types': 7.24.7 - dev: true /@babel/traverse@7.24.1: resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.7 '@babel/generator': 7.24.1 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -2848,9 +2812,10 @@ packages: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.24.7: resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} @@ -2859,7 +2824,6 @@ packages: '@babel/helper-string-parser': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - dev: true /@biomejs/biome@1.6.4: resolution: {integrity: sha512-3groVd2oWsLC0ZU+XXgHSNbq31lUcOCBkCcA7sAQGBopHcmL+jmmdoWlY3S61zIh+f2mqQTQte1g6PZKb3JJjA==} @@ -3271,7 +3235,7 @@ packages: /@databases/pg@5.5.0(typescript@5.4.5): resolution: {integrity: sha512-WIojK9AYIlNi5YRfc5YUOow3PQ82ClmwT9HG3nEsKLUERYieoVmHMYDQLS0ry6FjgJx+2yFs7LCw4kZpWu1TBw==} dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.7 '@databases/escape-identifier': 1.0.3 '@databases/pg-config': 3.2.0(typescript@5.4.5) '@databases/pg-connection-string': 1.0.0 @@ -6814,8 +6778,8 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 @@ -6824,20 +6788,20 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 dev: true /@types/babel__traverse@7.20.5: resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true /@types/better-sqlite3@7.6.9: @@ -7163,7 +7127,7 @@ packages: /@vue/compiler-core@3.4.19: resolution: {integrity: sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==} dependencies: - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.7 '@vue/shared': 3.4.19 entities: 4.5.0 estree-walker: 2.0.2 @@ -7180,7 +7144,7 @@ packages: /@vue/compiler-sfc@2.7.16: resolution: {integrity: sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==} dependencies: - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.7 postcss: 8.4.38 source-map: 0.6.1 optionalDependencies: @@ -7190,7 +7154,7 @@ packages: /@vue/compiler-sfc@3.4.19: resolution: {integrity: sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==} dependencies: - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.7 '@vue/compiler-core': 3.4.19 '@vue/compiler-dom': 3.4.19 '@vue/compiler-ssr': 3.4.19 @@ -13260,7 +13224,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4