From dc6c346daddaae6de78a54e44f59a8964bd08fb1 Mon Sep 17 00:00:00 2001 From: spaenleh Date: Tue, 10 Mar 2026 15:32:02 +0100 Subject: [PATCH 1/2] fix: use h5p integration url from the backend --- .github/workflows/deploy-storybook.yml | 1 - .github/workflows/deploy.yml | 1 - .github/workflows/test.yml | 1 - README.md | 9 +++------ mise.toml | 2 +- openapi-ts.config.ts | 2 +- package.json | 2 +- src/config/env.ts | 3 --- src/locales/en/common.json | 1 + .../builder/components/item/ItemContent.tsx | 13 +++++++++++-- src/modules/player/item/Item.tsx | 8 ++++++-- src/openapi/client/client.gen.ts | 2 +- src/openapi/client/types.gen.ts | 18 +++++++----------- src/vite-env.d.ts | 1 - vite.config.ts | 1 - 15 files changed, 32 insertions(+), 33 deletions(-) diff --git a/.github/workflows/deploy-storybook.yml b/.github/workflows/deploy-storybook.yml index 1d76c40c7..45f8d6816 100644 --- a/.github/workflows/deploy-storybook.yml +++ b/.github/workflows/deploy-storybook.yml @@ -27,7 +27,6 @@ jobs: - name: Build storybook run: mise run build-storybook env: - VITE_GRAASP_H5P_INTEGRATION_URL: http://mock.value.com VITE_GRAASP_REDIRECTION_HOST: http://go.mock.com - name: Upload artifact diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 8042da8bc..be95f919f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -54,7 +54,6 @@ jobs: VITE_UMAMI_WEBSITE_ID: ${{ secrets.VITE_UMAMI_WEBSITE_ID }} VITE_UMAMI_HOST: ${{ vars.VITE_UMAMI_HOST }} VITE_RECAPTCHA: ${{ secrets.VITE_RECAPTCHA_SITE_KEY }} - VITE_GRAASP_H5P_INTEGRATION_URL: ${{ vars.VITE_GRAASP_H5P_INTEGRATION_URL }} VITE_GRAASP_REDIRECTION_HOST: ${{ vars.VITE_GRAASP_REDIRECTION_HOST }} run: mise run build shell: bash diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 01f183971..57a844fe3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,7 +36,6 @@ jobs: run: mise build env: VITE_RECAPTCHA: 123456789 - VITE_GRAASP_H5P_INTEGRATION_URL: http://integration.url/mock-value.html VITE_GRAASP_REDIRECTION_HOST: http://go.mock.com - name: Unit tests diff --git a/README.md b/README.md index 21ae3d07f..d3e95c806 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,6 @@ VITE_SENTRY_DSN= # some value VITE_RECAPTCHA= # some value -VITE_GRAASP_H5P_INTEGRATION_URL= # the origin for the h5p integration VITE_GRAASP_REDIRECTION_HOST=http://localhost:3114/redirect ``` @@ -57,10 +56,9 @@ This mode runs the app from the static build and uses a lot less RAM compared to 1. You need to have a `.env.production` file with the following content: - ```dotenv - VITE_GRAASP_H5P_INTEGRATION_URL=http://localhost:3000/items/h5p-assets/ - VITE_GRAASP_REDIRECTION_HOST=http://localhost:3114/redirect - ``` + ```dotenv + VITE_GRAASP_REDIRECTION_HOST=http://localhost:3114/redirect + ``` 1. Build the project `pnpm build` 1. Preview the project `pnpm preview` @@ -74,7 +72,6 @@ Using the following command, you should be able to build an image that contains ```sh docker build -t client-local \ - --build-arg VITE_GRAASP_H5P_INTEGRATION_URL=http://localhost:3000/items/h5p-integration \ --build-arg VITE_RECAPTCHA= \ --build-arg VITE_GRAASP_REDIRECTION_HOST=http://localhost:3000/short-links \ . diff --git a/mise.toml b/mise.toml index 8f803d761..22ecc2bd6 100644 --- a/mise.toml +++ b/mise.toml @@ -11,7 +11,7 @@ postinstall = 'npx corepack enable' experimental = true [env] -_.path = ['./node_modules/.bin'] +_.path = ['{{config_root}}/node_modules/.bin'] [tasks.pnpm-install] description = 'Installs dependencies with pnpm' diff --git a/openapi-ts.config.ts b/openapi-ts.config.ts index 553a33e4f..db432b3e3 100644 --- a/openapi-ts.config.ts +++ b/openapi-ts.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from '@hey-api/openapi-ts'; import { API_HOST } from './src/config/env'; export default defineConfig({ - input: `${API_HOST}/api/docs/json`, + input: `${API_HOST}/docs/json`, output: { format: 'prettier', lint: 'eslint', diff --git a/package.json b/package.json index 35724fb2e..29b4ec502 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "engines": { "node": ">=22" }, - "packageManager": "pnpm@10.22.0", + "packageManager": "pnpm@10.32.0", "type": "module", "dependencies": { "@air/react-drag-to-select": "5.0.11", diff --git a/src/config/env.ts b/src/config/env.ts index 573186f8a..c388fe896 100644 --- a/src/config/env.ts +++ b/src/config/env.ts @@ -23,9 +23,6 @@ export const RECAPTCHA_SITE_KEY = import.meta.env.VITE_RECAPTCHA; * It's value is required in production since it is not recommended to use the fallback backend endpoint. * The backend endpoint is considered in-secure when the app and the backend are hosted on a domain where cookies are shared. */ -export const H5P_INTEGRATION_URL = - import.meta.env.VITE_GRAASP_H5P_INTEGRATION_URL ?? - `${API_HOST}/items/h5p-assets/integration.html`; // Question: should we host the pdf player assets inside the public directory here instead of at another bucket ? // Are there any security implications if it is hosted on the same domain as the app code ? diff --git a/src/locales/en/common.json b/src/locales/en/common.json index 81481653c..649777124 100644 --- a/src/locales/en/common.json +++ b/src/locales/en/common.json @@ -41,6 +41,7 @@ }, "ERRORS": { "UNEXPECTED": "An unexpected Error occurred", + "NO_INTEGRATION_URL": "No integration URL found for this H5P item", "NETWORK": { "TITLE": "Network Error", "TEXT": "There seems to be a problem joining the server. Please try again later" diff --git a/src/modules/builder/components/item/ItemContent.tsx b/src/modules/builder/components/item/ItemContent.tsx index c8eae4401..25a9f754a 100644 --- a/src/modules/builder/components/item/ItemContent.tsx +++ b/src/modules/builder/components/item/ItemContent.tsx @@ -15,7 +15,7 @@ import { type AuthenticatedUser, useAuth } from '@/AuthContext'; import { Editor } from '@/components/page/Editor'; import { PageReader } from '@/components/page/PageReader'; import { DEFAULT_LANG, NS } from '@/config/constants'; -import { API_HOST, GRAASP_ASSETS_URL, H5P_INTEGRATION_URL } from '@/config/env'; +import { API_HOST, GRAASP_ASSETS_URL } from '@/config/env'; import { hooks } from '@/config/queryClient'; import { DOCUMENT_ITEM_TEXT_EDITOR_ID, @@ -163,18 +163,27 @@ const AppContent = ({ * Helper component to render typed H5P items */ const H5PContent = ({ item }: { item: H5PItemType }): JSX.Element => { + const { t } = useTranslation(NS.Common); const extra = getH5PExtra(item?.extra); if (!extra?.contentId) { return ; } + if (!extra?.integrationUrl) { + return ( + + {t('ERRORS.NO_INTEGRATION_URL')} + + ); + } + return ( ); }; diff --git a/src/modules/player/item/Item.tsx b/src/modules/player/item/Item.tsx index 96209f824..b3cda60b2 100644 --- a/src/modules/player/item/Item.tsx +++ b/src/modules/player/item/Item.tsx @@ -25,7 +25,7 @@ import { useAuth } from '@/AuthContext'; import { PageReader } from '@/components/page/PageReader'; import { Button } from '@/components/ui/Button'; import { NS } from '@/config/constants'; -import { API_HOST, GRAASP_ASSETS_URL, H5P_INTEGRATION_URL } from '@/config/env'; +import { API_HOST, GRAASP_ASSETS_URL } from '@/config/env'; import { hooks } from '@/config/queryClient'; import { buildAppId, @@ -259,16 +259,20 @@ const H5PContent = ({ item }: { item: H5PItemType }): JSX.Element => { const { onCollapse } = useCollapseAction(item.id); const contentId = item?.extra?.h5p?.contentId; + const integrationUrl = item?.extra?.h5p?.integrationUrl; if (!contentId) { return {t('ERRORS.UNEXPECTED')}; } + if (!integrationUrl) { + return {t('ERRORS.NO_INTEGRATION_URL')}; + } return ( diff --git a/src/openapi/client/client.gen.ts b/src/openapi/client/client.gen.ts index 9c8cd8416..dae84fa9f 100644 --- a/src/openapi/client/client.gen.ts +++ b/src/openapi/client/client.gen.ts @@ -15,5 +15,5 @@ import { createClientConfig } from '../clientConfig.ts'; export type CreateClientConfig = (override?: Config) => Config & T>; export const client = createClient(createClientConfig(createConfig({ - baseUrl: 'http://localhost:3001' + baseUrl: 'http://localhost:3000' }))); diff --git a/src/openapi/client/types.gen.ts b/src/openapi/client/types.gen.ts index 82c4c742d..2c2925bfe 100644 --- a/src/openapi/client/types.gen.ts +++ b/src/openapi/client/types.gen.ts @@ -1,7 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts export type ClientOptions = { - baseUrl: 'http://localhost:3001' | (string & {}); + baseUrl: 'http://localhost:3000' | (string & {}); }; /** @@ -618,6 +618,10 @@ export type H5pItem = { contentId: string; h5pFilePath: string; contentFilePath: string; + /** + * url of the h5p integration + */ + integrationUrl?: string; }; }; }; @@ -731,7 +735,7 @@ export type Item = AppItem | DocumentItem | EmbeddedLinkItem | EtherpadItem | Fi /** * Packed Item - * Item with additional information + * Item with additional information for simple display */ export type PackedItem = (AppItem | DocumentItem | EmbeddedLinkItem | EtherpadItem | FileItem | FolderItem | H5pItem | PageItem | ShortcutItem) & { creator: NullableMember; @@ -919,10 +923,6 @@ export type AppActionLegacy = { }; type: string; createdAt: string; - /** - * Legacy property provided for convenience. Please migrate to using the `account` prop instead. - * @deprecated - */ member: MinimalAccount; }; @@ -960,10 +960,6 @@ export type AppDataWithLegacyProps = { creator: NullableMinimalAccount; createdAt: string; updatedAt: string; - /** - * Legacy property provided for convenience. Please migrate to using the `account` prop instead. - * @deprecated - */ member: MinimalAccount; }; @@ -7188,7 +7184,7 @@ export type GetItemError = GetItemErrors[keyof GetItemErrors]; export type GetItemResponses = { /** - * Item with additional information + * Item with additional information for simple display */ 200: PackedItem; }; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 7ece54a88..73be18af1 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -9,7 +9,6 @@ interface ImportMetaEnv { readonly VITE_SENTRY_DSN: string; readonly VITE_RECAPTCHA: string; readonly VITE_SHOW_NOTIFICATIONS: string; - readonly VITE_GRAASP_H5P_INTEGRATION_URL: string; readonly VITE_GRAASP_REDIRECTION_HOST: string; } diff --git a/vite.config.ts b/vite.config.ts index 68b5a3076..f1f03b38d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -22,7 +22,6 @@ const config = ({ mode }: { mode: string }): UserConfig => { // ensure required variables are present if (mode === 'production') { - requireEnvVariable('VITE_GRAASP_H5P_INTEGRATION_URL'); requireEnvVariable('VITE_GRAASP_REDIRECTION_HOST'); } From b8554ede96f44c9650e30a8f73989955fe526819 Mon Sep 17 00:00:00 2001 From: spaenleh Date: Tue, 10 Mar 2026 16:09:46 +0100 Subject: [PATCH 2/2] fix: update packages --- package.json | 2 +- pnpm-lock.yaml | 34 ++++++++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 29b4ec502..19d90623d 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "@emotion/react": "11.14.0", "@emotion/styled": "11.14.1", "@fontsource-variable/nunito": "5.2.7", - "@graasp/sdk": "github:graasp/graasp-sdk#factories", + "@graasp/sdk": "5.18.1", "@graasp/stylis-plugin-rtl": "2.2.0", "@lexical/link": "0.33.1", "@lexical/react": "0.33.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb07b5a0d..b18703fc3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,8 +27,8 @@ importers: specifier: 5.2.7 version: 5.2.7 '@graasp/sdk': - specifier: github:graasp/graasp-sdk#factories - version: https://codeload.github.com/graasp/graasp-sdk/tar.gz/2fa699e3f2b98708b92d82cda3c080db01a7b073(date-fns@4.1.0)(uuid@11.1.0) + specifier: 5.18.1 + version: 5.18.1(date-fns@4.1.0)(uuid@11.1.0) '@graasp/stylis-plugin-rtl': specifier: 2.2.0 version: 2.2.0(stylis@4.3.6) @@ -1666,9 +1666,8 @@ packages: '@fontsource-variable/nunito@5.2.7': resolution: {integrity: sha512-2N8QhatkyKgSUbAGZO2FYLioxA32+RyI1EplVLawbpkGjUeui9Qg9VMrpkCaik1ydjFjfLV+kzQ0cGEsMrMenQ==} - '@graasp/sdk@https://codeload.github.com/graasp/graasp-sdk/tar.gz/2fa699e3f2b98708b92d82cda3c080db01a7b073': - resolution: {tarball: https://codeload.github.com/graasp/graasp-sdk/tar.gz/2fa699e3f2b98708b92d82cda3c080db01a7b073} - version: 5.18.0 + '@graasp/sdk@5.18.1': + resolution: {integrity: sha512-cVurhwVjOxaj067PACrucDUt5nKG2aRVcIaTMTi53ZlWQtT0mmiBTliT4UfnqwgfFA4/iwJU/xveyqsbR4ME+A==} peerDependencies: date-fns: ^4 uuid: ^11.0.0 @@ -2033,21 +2032,25 @@ packages: resolution: {integrity: sha512-TS9wmx9B/v1f/bNXu3lIEcdNIyS0m0H0+95YIWSTGG3q2cK3FVlyUiiAieZRUzXTN89n6JXtua6dK/TVCqbmkQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@oxlint/linux-arm64-musl@1.19.0': resolution: {integrity: sha512-o5RAxQfVEu7LsBUwSjEDNdM8sla8WlLMRULsTP3vgxyy1eLJxo2u+4McKtM9/P2KiZQw3NylDoaxU4Z4j/XeRQ==} cpu: [arm64] os: [linux] + libc: [musl] '@oxlint/linux-x64-gnu@1.19.0': resolution: {integrity: sha512-QDgAP4TxXsupFEsEGYnaAaKXQQD1lJSi5Htl/b0Vl2xPz8BVBRH+bNDwVGEHVTxT7jdnO2gTEOmfEzOkRJprUQ==} cpu: [x64] os: [linux] + libc: [glibc] '@oxlint/linux-x64-musl@1.19.0': resolution: {integrity: sha512-iOQooyYzy7RR2yHNM8oHd2Zw6CdU7/G2Uf5ryFi/cF5NV5zlSH//QSkWwrk/kLF69wKqwE8S8snV7WnRA/tXjA==} cpu: [x64] os: [linux] + libc: [musl] '@oxlint/win32-arm64@1.19.0': resolution: {integrity: sha512-bvgA2fGpdBF/DpB5hZYQzx5fFFiiHxIiPF5zp24czvsIRkezVi9ZH04lCIVkMBxgvKhnU2jLXAn6E1Mbo4QrFw==} @@ -2131,56 +2134,67 @@ packages: resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.52.3': resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.52.3': resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.52.3': resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.52.3': resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.52.3': resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.52.3': resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.52.3': resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.52.3': resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.52.3': resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.52.3': resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openharmony-arm64@4.52.3': resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==} @@ -2779,41 +2793,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -8343,7 +8365,7 @@ snapshots: '@fontsource-variable/nunito@5.2.7': {} - '@graasp/sdk@https://codeload.github.com/graasp/graasp-sdk/tar.gz/2fa699e3f2b98708b92d82cda3c080db01a7b073(date-fns@4.1.0)(uuid@11.1.0)': + '@graasp/sdk@5.18.1(date-fns@4.1.0)(uuid@11.1.0)': dependencies: '@faker-js/faker': 9.9.0 date-fns: 4.1.0