diff --git a/package.json b/package.json index c6a6671a6a..a4f6dc429f 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "@cypress/request/uuid": "11.1.1", "@ptc-org/nestjs-query-typeorm/uuid": "11.1.1", "googleapis-common/uuid": "11.1.1", + "googleapis/googleapis-common": "8.0.1", "@cyntler/react-doc-viewer/ajv": "8.20.0", "wrangler/esbuild": "0.28.1", "@react-email/ui/esbuild": "0.28.1", @@ -55,7 +56,7 @@ "storybook/esbuild": "0.28.1", "zapier-platform-cli/esbuild": "0.28.1" }, - "//resolutions": "Each entry is load-bearing: it forces a version OUTSIDE some parent's declared range where no fixed upstream release exists; remove each once its blocker ships. @remote-dom/react/@types/react ^19.2.0 -> React type-identity dedup, SCOPED to @remote-dom/react only (every other package resolves @types/react 19 naturally from the workspace ^19.2.0 ranges). @remote-dom/react (transitive via twenty-front-component-renderer) lists @types/react ^18 in its own dependencies and nests its own copy; React 18 and 19 declare ReactNode differently (19 adds bigint + Promise, drops ReactFragment's {}), so the two copies are mutually non-assignable and break twenty-front's typecheck (~156 TS2322 errors). Range-aligning our own packages can't fix a third-party's transitive @types pin, hence this single scoped override (only @types/react splits; runtime react/react-dom are peer-deps that converge naturally, and @types/react-dom does not nest a copy). Drop once @remote-dom/react widens @types/react to ^19 (latest 1.2.2 still pins ^18; tracked upstream in Shopify/remote-dom#153). graphql 16.8.1 -> singleton pin held below msw's ^16.12.0 dep and @nestjs/graphql's ^16.11.0 peer; drop after a validated repo-wide bump to latest 16.x; graphql-redis-subscriptions/ioredis 5.10.1 -> TS type-identity dedup: twenty-server passes its ioredis client into RedisPubSub, so this must equal the exact ioredis version pinned by twenty-server and bullmq (bump in lockstep); @types/qs 6.9.16 -> holdback below the 6.9.17 ParsedQs typing break (node-saml wants ^6.9.18); @opentelemetry/api 1.9.1 -> singleton guard for the NoopMeterProvider bug (#20231): ai 6.0.x pins 1.9.0 exact vs @sentry/node ^1.9.1, drop when workspace ai >=6.0.178 AND @scalar/agent-chat moves off ai 6.0.33; chokidar ^3 -> NestJS CLI watch needs fsevents on macOS, removed in chokidar 4/5 (#20316); tmp ^0.2.7 -> CVE, zapier-platform-cli 19 (latest) pins 0.2.5 and inquirer 7/8's external-editor wants ^0.0.33; make-fetch-happen ^15 + @electron/{rebuild,node-gyp}/tar ^7.5.16 -> tar CVE eviction for the @electron/rebuild 3.x toolchain (rebuild 3.x pins tar ^6, its node-gyp fork pins tar ^6.2.1 + mfh ^10), drop when electron-forge declares @electron/rebuild >=4; @angular-devkit/core 19.2.24 -> picomatch CVE, blocked on @nestjs/cli >11.0.23 fixing the dist/src output regression (repo held at 11.0.16); yeoman-environment 6.0.1 -> CVE, zapier-platform-cli 19 (latest) pins 4.4.3; webpack-dev-server 5.2.4 -> CVE, @electron-forge/plugin-webpack (incl. 8.x alphas) still declares ^4; express/qs + @cypress/request/qs 6.15.2 -> qs CVE for old express 4.22.0/4.22.1 pinned by @mintlify/previewing and verdaccio (verdaccio also pins @cypress/request 3.0.10; all other qs parents resolve safe naturally); next/postcss 8.5.15 -> postcss CVE, every stable next pins 8.4.31 exact (fix only in 16.3.0 canaries; @react-email/ui also pins next 16.2.6); /uuid 11.1.1 -> uuid CVE for parents pinning uuid <11 with no fixed release (sockjs dormant since 2021; @cypress/request 3.0.10 via verdaccio; @ptc-org/nestjs-query-typeorm at latest; googleapis 105 -> common 8 drops uuid but needs the googleapis >=152 migration). Preserves the intentional uuid 13.x; @cyntler/react-doc-viewer/ajv 8.20.0 -> CVE, upstream (latest 1.17.1) pins ajv ^7 but never imports it, forcing v8 is safe; */esbuild 0.28.1 -> two esbuild advisories both fixed in 0.28.1: the Deno-module binary-integrity RCE GHSA-gv7w-rqvm-qjhr (vulnerable >=0.17.0 <0.28.1) and the earlier dev-server path-traversal GHSA-g7r4-m6w7-qqqr (Windows, >=0.27.3 <0.28.1). The Deno advisory's range covers every esbuild <0.28.1, so it re-exposed older transitive copies too. Preference is to fix by upgrading the parent, not by resolution -- done where it works: @size-limit/preset-small-lib+size-limit (now ^12.1.0, pin esbuild ^0.28.0) were bumped and resolve to 0.28.1 on their own, NO resolution needed. The seven resolutions below are for parents that cannot be cleanly upgraded. Six pin a vulnerable esbuild OUTSIDE the 0.28.1 range in their latest release: wrangler exact-pins 0.27.3 (still 0.27.3 in latest 4.100.0); @react-email/ui exact-pins 0.28.0 (still 0.28.0 in latest 6.6.0); @opennextjs/aws exact-pins 0.25.4 (still 0.25.4 in latest 4.0.3); zapier-platform-cli exact-pins 0.25.8 (latest 19.0.0); @lingui/cli pins ^0.25.1 -> caps <0.26 (still ^0.25.1 in latest 6.3.0); storybook pins a range topping out at ^0.27.0 -> caps <0.28 (still capped in latest 10.4.4). react-email allows ^0.28.0 but the npmMinimalAgeGate down-selects it to the still-vulnerable 0.28.0 until 0.28.1 ages past the gate (published 2026-06-11). tsx needs NO resolution: its ^4.x ranges resolve to 4.22.x which pins esbuild ~0.28.0 -> 0.28.1 on its own. (tsx had briefly been pinned to 4.21.0 because tsx 4.22's --import tsx/esm loader feeds esbuild-downleveled enums into jest's type-checking ts-node config compiler, yielding a spurious TS7022 in server-integration-test; that is now fixed at the source by dropping --import tsx/esm from the integration jest invocation in twenty-server project.json (it had been swept in by the Storybook 10 upgrade and is not needed there): ts-node alone now compiles the config + globalSetup, so there is no esbuild enum downleveling to trip TS7022 and decorator metadata is still emitted. tsx version is now irrelevant to the tests, so the pin was dropped.) Drop each entry once its parent ships a range that resolves to >=0.28.1 on its own (react-email drops once 0.28.1 clears the age gate). Our own twenty-client-sdk raises its esbuild floor to ^0.28.1 directly in its package.json instead of via a resolution", + "//resolutions": "Each entry is load-bearing: it forces a version OUTSIDE some parent's declared range where no fixed upstream release exists; remove each once its blocker ships. @remote-dom/react/@types/react ^19.2.0 -> React type-identity dedup, SCOPED to @remote-dom/react only (every other package resolves @types/react 19 naturally from the workspace ^19.2.0 ranges). @remote-dom/react (transitive via twenty-front-component-renderer) lists @types/react ^18 in its own dependencies and nests its own copy; React 18 and 19 declare ReactNode differently (19 adds bigint + Promise, drops ReactFragment's {}), so the two copies are mutually non-assignable and break twenty-front's typecheck (~156 TS2322 errors). Range-aligning our own packages can't fix a third-party's transitive @types pin, hence this single scoped override (only @types/react splits; runtime react/react-dom are peer-deps that converge naturally, and @types/react-dom does not nest a copy). Drop once @remote-dom/react widens @types/react to ^19 (latest 1.2.2 still pins ^18; tracked upstream in Shopify/remote-dom#153). graphql 16.8.1 -> singleton pin held below msw's ^16.12.0 dep and @nestjs/graphql's ^16.11.0 peer; drop after a validated repo-wide bump to latest 16.x; graphql-redis-subscriptions/ioredis 5.10.1 -> TS type-identity dedup: twenty-server passes its ioredis client into RedisPubSub, so this must equal the exact ioredis version pinned by twenty-server and bullmq (bump in lockstep); @types/qs 6.9.16 -> holdback below the 6.9.17 ParsedQs typing break (node-saml wants ^6.9.18); @opentelemetry/api 1.9.1 -> singleton guard for the NoopMeterProvider bug (#20231): ai 6.0.x pins 1.9.0 exact vs @sentry/node ^1.9.1, drop when workspace ai >=6.0.178 AND @scalar/agent-chat moves off ai 6.0.33; chokidar ^3 -> NestJS CLI watch needs fsevents on macOS, removed in chokidar 4/5 (#20316); tmp ^0.2.7 -> CVE, zapier-platform-cli 19 (latest) pins 0.2.5 and inquirer 7/8's external-editor wants ^0.0.33; make-fetch-happen ^15 + @electron/{rebuild,node-gyp}/tar ^7.5.16 -> tar CVE eviction for the @electron/rebuild 3.x toolchain (rebuild 3.x pins tar ^6, its node-gyp fork pins tar ^6.2.1 + mfh ^10), drop when electron-forge declares @electron/rebuild >=4; @angular-devkit/core 19.2.24 -> picomatch CVE, blocked on @nestjs/cli >11.0.23 fixing the dist/src output regression (repo held at 11.0.16); yeoman-environment 6.0.1 -> CVE, zapier-platform-cli 19 (latest) pins 4.4.3; webpack-dev-server 5.2.4 -> CVE, @electron-forge/plugin-webpack (incl. 8.x alphas) still declares ^4; express/qs + @cypress/request/qs 6.15.2 -> qs CVE for old express 4.22.0/4.22.1 pinned by @mintlify/previewing and verdaccio (verdaccio also pins @cypress/request 3.0.10; all other qs parents resolve safe naturally); next/postcss 8.5.15 -> postcss CVE, every stable next pins 8.4.31 exact (fix only in 16.3.0 canaries; @react-email/ui also pins next 16.2.6); /uuid 11.1.1 -> uuid CVE for parents pinning uuid <11 with no fixed release (sockjs dormant since 2021; @cypress/request 3.0.10 via verdaccio; @ptc-org/nestjs-query-typeorm at latest; googleapis 105 -> common 8 drops uuid but needs the googleapis >=152 migration). Preserves the intentional uuid 13.x; @cyntler/react-doc-viewer/ajv 8.20.0 -> CVE, upstream (latest 1.17.1) pins ajv ^7 but never imports it, forcing v8 is safe; */esbuild 0.28.1 -> two esbuild advisories both fixed in 0.28.1: the Deno-module binary-integrity RCE GHSA-gv7w-rqvm-qjhr (vulnerable >=0.17.0 <0.28.1) and the earlier dev-server path-traversal GHSA-g7r4-m6w7-qqqr (Windows, >=0.27.3 <0.28.1). The Deno advisory's range covers every esbuild <0.28.1, so it re-exposed older transitive copies too. Preference is to fix by upgrading the parent, not by resolution -- done where it works: @size-limit/preset-small-lib+size-limit (now ^12.1.0, pin esbuild ^0.28.0) were bumped and resolve to 0.28.1 on their own, NO resolution needed. The seven resolutions below are for parents that cannot be cleanly upgraded. Six pin a vulnerable esbuild OUTSIDE the 0.28.1 range in their latest release: wrangler exact-pins 0.27.3 (still 0.27.3 in latest 4.100.0); @react-email/ui exact-pins 0.28.0 (still 0.28.0 in latest 6.6.0); @opennextjs/aws exact-pins 0.25.4 (still 0.25.4 in latest 4.0.3); zapier-platform-cli exact-pins 0.25.8 (latest 19.0.0); @lingui/cli pins ^0.25.1 -> caps <0.26 (still ^0.25.1 in latest 6.3.0); storybook pins a range topping out at ^0.27.0 -> caps <0.28 (still capped in latest 10.4.4). react-email allows ^0.28.0 but the npmMinimalAgeGate down-selects it to the still-vulnerable 0.28.0 until 0.28.1 ages past the gate (published 2026-06-11). tsx needs NO resolution: its ^4.x ranges resolve to 4.22.x which pins esbuild ~0.28.0 -> 0.28.1 on its own. (tsx had briefly been pinned to 4.21.0 because tsx 4.22's --import tsx/esm loader feeds esbuild-downleveled enums into jest's type-checking ts-node config compiler, yielding a spurious TS7022 in server-integration-test; that is now fixed at the source by dropping --import tsx/esm from the integration jest invocation in twenty-server project.json (it had been swept in by the Storybook 10 upgrade and is not needed there): ts-node alone now compiles the config + globalSetup, so there is no esbuild enum downleveling to trip TS7022 and decorator metadata is still emitted. tsx version is now irrelevant to the tests, so the pin was dropped.) Drop each entry once its parent ships a range that resolves to >=0.28.1 on its own (react-email drops once 0.28.1 clears the age gate). Our own twenty-client-sdk raises its esbuild floor to ^0.28.1 directly in its package.json instead of via a resolution. googleapis/googleapis-common 8.0.1 -> singleton dedup for the googleapis 173 upgrade. googleapis-common 8.0.2 (published 2026-06-04, AFTER googleapis 173 on 2026-05-28) regressed its google-auth-library dep from a range to exact 10.5.0 (and gaxios to exact 7.1.3), while googleapis itself pulls google-auth-library ^10.2.0 (10.7.0); the two mismatched copies make OAuth2Client's type-identity diverge between the client our provider builds (via googleapis -> 10.7.0) and the one gmail/calendar method options expect (via googleapis-common -> 10.5.0), breaking every gmail/calendar service typecheck (TS2322/TS2769). The parents are already at latest (googleapis 173.0.0, googleapis-common 8.0.2) so we cannot fix by upgrading; instead we pin googleapis' googleapis-common back to 8.0.1, the last version with RANGE deps (google-auth-library ^10.1.0, gaxios ^7.0.0-rc.4) -- and the version googleapis 173 originally shipped against. Ranges resolve to the same hoisted versions googleapis uses, so google-auth-library AND gaxios both collapse to a single copy with no further resolution (a global google-auth-library pin would only dedup one of the two). Scoped to googleapis since it is the sole googleapis-common 8.x consumer. Drop once googleapis-common 8.0.3+ restores range deps or googleapis bumps to a common that does.", "version": "0.2.1", "nx": {}, "scripts": { diff --git a/packages/twenty-front/package.json b/packages/twenty-front/package.json index 2880291e7f..35cae84917 100644 --- a/packages/twenty-front/package.json +++ b/packages/twenty-front/package.json @@ -84,8 +84,8 @@ "country-flag-icons": "^1.5.11", "cron-parser": "5.1.1", "d3-shape": "^3.2.0", - "date-fns": "^2.30.0", - "date-fns-tz": "^2.0.0", + "date-fns": "^4.4.0", + "date-fns-tz": "^3.2.0", "deep-equal": "^2.2.2", "file-saver": "^2.0.5", "framer-motion": "^11.18.0", diff --git a/packages/twenty-front/src/modules/localization/utils/formatDateISOStringToDateTime.ts b/packages/twenty-front/src/modules/localization/utils/formatDateISOStringToDateTime.ts index 50407e17fb..209e2d3540 100644 --- a/packages/twenty-front/src/modules/localization/utils/formatDateISOStringToDateTime.ts +++ b/packages/twenty-front/src/modules/localization/utils/formatDateISOStringToDateTime.ts @@ -1,6 +1,6 @@ import { type DateFormat } from '@/localization/constants/DateFormat'; import { type TimeFormat } from '@/localization/constants/TimeFormat'; -import { isValid } from 'date-fns'; +import { isValid, type Locale } from 'date-fns'; import { formatInTimeZone } from 'date-fns-tz'; export const formatDateISOStringToDateTime = ({ diff --git a/packages/twenty-front/src/modules/localization/utils/formatTimeZoneLabel.ts b/packages/twenty-front/src/modules/localization/utils/formatTimeZoneLabel.ts index f9640e2c25..b318759b63 100644 --- a/packages/twenty-front/src/modules/localization/utils/formatTimeZoneLabel.ts +++ b/packages/twenty-front/src/modules/localization/utils/formatTimeZoneLabel.ts @@ -1,5 +1,5 @@ import { formatInTimeZone } from 'date-fns-tz'; -import defaultLocale from 'date-fns/locale/en-US'; +import { enUS as defaultLocale } from 'date-fns/locale/en-US'; /** * Formats a IANA time zone to a select option label. diff --git a/packages/twenty-front/src/modules/object-record/record-aggregate/utils/transformAggregateRawValueIntoAggregateDisplayValue.ts b/packages/twenty-front/src/modules/object-record/record-aggregate/utils/transformAggregateRawValueIntoAggregateDisplayValue.ts index 6a682ad234..000b5d6720 100644 --- a/packages/twenty-front/src/modules/object-record/record-aggregate/utils/transformAggregateRawValueIntoAggregateDisplayValue.ts +++ b/packages/twenty-front/src/modules/object-record/record-aggregate/utils/transformAggregateRawValueIntoAggregateDisplayValue.ts @@ -1,3 +1,5 @@ +import { type Locale } from 'date-fns'; + import { type DateFormat } from '@/localization/constants/DateFormat'; import { type TimeFormat } from '@/localization/constants/TimeFormat'; import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; diff --git a/packages/twenty-front/src/modules/ui/field/display/utils/__tests__/getDateFnsLocale.test.ts b/packages/twenty-front/src/modules/ui/field/display/utils/__tests__/getDateFnsLocale.test.ts new file mode 100644 index 0000000000..a2a9dbf285 --- /dev/null +++ b/packages/twenty-front/src/modules/ui/field/display/utils/__tests__/getDateFnsLocale.test.ts @@ -0,0 +1,29 @@ +import { getDateFnsLocale } from '@/ui/field/display/utils/getDateFnsLocale'; + +describe('getDateFnsLocale', () => { + it('should load the default en-US locale', async () => { + const locale = await getDateFnsLocale('en-US'); + + expect(locale).toBeDefined(); + expect(locale?.code).toBe('en-US'); + expect(typeof locale?.formatDistance).toBe('function'); + }); + + it('should load a non-default locale (fr-FR)', async () => { + const locale = await getDateFnsLocale('fr-FR'); + + expect(locale).toBeDefined(); + expect(locale?.code).toBe('fr'); + }); + + it('should fall back to en-US for an unknown locale', async () => { + const locale = await getDateFnsLocale('zz-ZZ'); + + expect(locale?.code).toBe('en-US'); + }); + + it('should fall back to en-US for nullish input', async () => { + expect((await getDateFnsLocale(undefined))?.code).toBe('en-US'); + expect((await getDateFnsLocale(null))?.code).toBe('en-US'); + }); +}); diff --git a/packages/twenty-front/src/modules/ui/field/display/utils/getDateFnsLocale.ts b/packages/twenty-front/src/modules/ui/field/display/utils/getDateFnsLocale.ts index 5fa8dc5bbd..3a437e6a51 100644 --- a/packages/twenty-front/src/modules/ui/field/display/utils/getDateFnsLocale.ts +++ b/packages/twenty-front/src/modules/ui/field/display/utils/getDateFnsLocale.ts @@ -1,3 +1,5 @@ +import { isObject } from '@sniptt/guards'; +import { type Locale } from 'date-fns'; import { type APP_LOCALES } from 'twenty-shared/translations'; type AppLocale = keyof typeof APP_LOCALES; @@ -69,8 +71,13 @@ export const getDateFnsLocaleImport = (locale: AppLocale) => { } }; -export const getDateFnsLocale = async (localeString?: string | null) => { +const isDateFnsLocale = (value: unknown): value is Locale => + isObject(value) && 'code' in value && 'formatLong' in value; + +export const getDateFnsLocale = async ( + localeString?: string | null, +): Promise => { return getDateFnsLocaleImport(localeString as AppLocale) - .then((m) => m.default as unknown as Locale) - .catch((_e) => undefined); + .then((localeModule) => Object.values(localeModule).find(isDateFnsLocale)) + .catch(() => undefined); }; diff --git a/packages/twenty-front/src/modules/workflow/workflow-trigger/utils/getTriggerScheduleDescription.ts b/packages/twenty-front/src/modules/workflow/workflow-trigger/utils/getTriggerScheduleDescription.ts index 9e27ed5851..d45693714b 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-trigger/utils/getTriggerScheduleDescription.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-trigger/utils/getTriggerScheduleDescription.ts @@ -1,3 +1,5 @@ +import { type Locale } from 'date-fns'; + import { type WorkflowCronTrigger } from '@/workflow/types/Workflow'; import { describeCronExpression } from '@/workflow/workflow-trigger/utils/cron-to-human/describeCronExpression'; import { convertScheduleToCronExpression } from '@/workflow/workflow-trigger/utils/cron-to-human/utils/convertScheduleToCronExpression'; diff --git a/packages/twenty-front/src/utils/string/formatDateString.ts b/packages/twenty-front/src/utils/string/formatDateString.ts index 484fd797ff..7cd6a68181 100644 --- a/packages/twenty-front/src/utils/string/formatDateString.ts +++ b/packages/twenty-front/src/utils/string/formatDateString.ts @@ -1,3 +1,5 @@ +import { type Locale } from 'date-fns'; + import { type DateFormat } from '@/localization/constants/DateFormat'; import { formatDateISOStringToCustomUnicodeFormat } from '@/localization/utils/formatDateISOStringToCustomUnicodeFormat'; import { formatDateISOStringToDate } from '@/localization/utils/formatDateISOStringToDate'; diff --git a/packages/twenty-server/jest-integration.config.ts b/packages/twenty-server/jest-integration.config.ts index 3fc1da2a96..ddfa4d9062 100644 --- a/packages/twenty-server/jest-integration.config.ts +++ b/packages/twenty-server/jest-integration.config.ts @@ -24,7 +24,7 @@ const jestConfig: JestConfigWithTsJest = { silent: false, errorOnDeprecated: true, maxConcurrency: 1, - moduleFileExtensions: ['js', 'json', 'ts'], + moduleFileExtensions: ['js', 'mjs', 'json', 'ts'], rootDir: '.', testEnvironment: 'node', testPathIgnorePatterns: [ @@ -37,8 +37,14 @@ const jestConfig: JestConfigWithTsJest = { globalTeardown: '/test/integration/utils/teardown-test.ts', testTimeout: 20000, maxWorkers: 1, + // jsdom 29 pulls ESM-only transitive deps (parse5, entities, tough-cookie, + // @exodus/bytes via html-encoding-sniffer, @csstools/@asamuzakjp css engine); + // let swc transform them (and .mjs below) so jest can require jsdom. + transformIgnorePatterns: [ + '/node_modules/(?!(jsdom|html-encoding-sniffer|whatwg-encoding|@exodus|parse5|entities|tough-cookie|@csstools|@asamuzakjp)/)', + ], transform: { - '^.+\\.(t|j)s$': [ + '^.+\\.(t|j|mj)s$': [ '@swc/jest', { jsc: { diff --git a/packages/twenty-server/jest.config.mjs b/packages/twenty-server/jest.config.mjs index a845969ef3..8ffcb033b2 100644 --- a/packages/twenty-server/jest.config.mjs +++ b/packages/twenty-server/jest.config.mjs @@ -17,11 +17,15 @@ const jestConfig = { testEnvironment: 'node', setupFilesAfterEnv: ['./setupTests.ts'], transformIgnorePatterns: [ - '/node_modules/(?!(file-type|@file-type|strtok3|token-types|@borewit|@tokenizer|uint8array-extras|read-next-line|digest-fetch|md5|js-sha256|js-sha512|base-64|charenc|crypt|email-reply-parser)/)', + // jsdom 29 pulls ESM-only transitive deps (parse5, entities, tough-cookie, + // @exodus/bytes via html-encoding-sniffer, @csstools/@asamuzakjp css engine). + // jest's CJS runtime can't load their `export` syntax, so let swc transform them. + '/node_modules/(?!(file-type|@file-type|strtok3|token-types|@borewit|@tokenizer|uint8array-extras|read-next-line|digest-fetch|md5|js-sha256|js-sha512|base-64|charenc|crypt|email-reply-parser|jsdom|html-encoding-sniffer|whatwg-encoding|@exodus|parse5|entities|tough-cookie|@csstools|@asamuzakjp)/)', ], testRegex: '.*\\.spec\\.ts$', transform: { - '^.+\\.(t|j)s$': [ + // include .mjs so swc transforms ESM-only deps (e.g. jsdom's @csstools/* .mjs) + '^.+\\.(t|j|mj)s$': [ '@swc/jest', { jsc: { @@ -52,7 +56,7 @@ const jestConfig = { '^test/(.*)': '/test/$1', '^file-type$': require.resolve('file-type'), }, - moduleFileExtensions: ['js', 'json', 'ts'], + moduleFileExtensions: ['js', 'mjs', 'json', 'ts'], modulePathIgnorePatterns: ['/dist'], fakeTimers: { enableGlobally: true, diff --git a/packages/twenty-server/package.json b/packages/twenty-server/package.json index f4697b0e0d..d819df7fda 100644 --- a/packages/twenty-server/package.json +++ b/packages/twenty-server/package.json @@ -92,17 +92,17 @@ "connect-redis": "^7.1.1", "cron-parser": "5.1.1", "dataloader": "2.2.2", - "date-fns": "2.30.0", + "date-fns": "4.4.0", "digest-fetch": "^3.1.1", "dompurify": "^3.4.0", "dotenv": "16.4.5", "email-reply-parser": "^2.3.5", - "express": "4.22.2", + "express": "5.2.1", "express-session": "^1.18.2", "file-type": "^21.3.2", "fuse.js": "^7.1.0", - "gaxios": "5.1.3", - "googleapis": "105.0.0", + "gaxios": "7.1.5", + "googleapis": "173.0.0", "graphql": "16.8.1", "graphql-fields": "2.0.3", "graphql-redis-subscriptions": "2.7.0", @@ -115,7 +115,7 @@ "html-to-text": "^9.0.5", "imapflow": "1.3.6", "ioredis": "5.10.1", - "jsdom": "^26.1.0", + "jsdom": "^29.1.1", "json-schema": "0.4.0", "jsonwebtoken": "9.0.2", "libphonenumber-js": "1.11.5", @@ -159,7 +159,7 @@ "rxjs": "7.8.1", "semver": "7.6.3", "sns-payload-validator": "^2.1.0", - "stripe": "19.3.1", + "stripe": "20.4.1", "tar": "^7.5.9", "temporal-polyfill": "^0.3.0", "tsconfig-paths": "^4.2.0", diff --git a/packages/twenty-server/src/engine/core-modules/billing-webhook/__mocks__/stripe-subscription-updated-events.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/__mocks__/stripe-subscription-updated-events.ts index c342d88e2b..32ef85bf09 100644 --- a/packages/twenty-server/src/engine/core-modules/billing-webhook/__mocks__/stripe-subscription-updated-events.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/__mocks__/stripe-subscription-updated-events.ts @@ -33,6 +33,7 @@ export const mockStripeSubscriptionUpdatedEventWithoutUpdatedItem: Stripe.Custom created: 1745007630, currency: 'usd', customer: 'cus_S9eiHiQ8lNbIkL', + customer_account: null, days_until_due: null, default_payment_method: null, default_source: null, @@ -189,6 +190,7 @@ export const mockStripeSubscriptionUpdatedEventWithUpdatedItemOnly: Stripe.Custo created: 1745007630, currency: 'usd', customer: 'cus_S9eiHiQ8lNbIkL', + customer_account: null, days_until_due: null, default_payment_method: null, default_source: null, @@ -412,6 +414,7 @@ export const mockStripeSubscriptionUpdatedEventWithDeletedItem: Stripe.CustomerS created: 1745007630, currency: 'usd', customer: 'cus_S9eiHiQ8lNbIkL', + customer_account: null, days_until_due: null, default_payment_method: null, default_source: null, diff --git a/packages/twenty-server/src/engine/core-modules/file/utils/__tests__/sanitize-file.utils.spec.ts b/packages/twenty-server/src/engine/core-modules/file/utils/__tests__/sanitize-file.utils.spec.ts new file mode 100644 index 0000000000..c30051b3cb --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/file/utils/__tests__/sanitize-file.utils.spec.ts @@ -0,0 +1,57 @@ +import { sanitizeFile } from 'src/engine/core-modules/file/utils/sanitize-file.utils'; + +describe('sanitizeFile', () => { + it('should strip '; + + const sanitized = sanitizeFile({ + file: malicious, + ext: 'svg', + mimeType: 'image/svg+xml', + }) as string; + + expect(sanitized).not.toContain(' { + const malicious = + ''; + + const sanitized = sanitizeFile({ + file: Buffer.from(malicious, 'utf-8'), + ext: 'svg', + mimeType: 'image/svg+xml', + }) as string; + + expect(sanitized).not.toContain('onerror'); + expect(sanitized).not.toContain('alert(1)'); + }); + + it('should sanitize when only the mime type indicates SVG', () => { + const malicious = + ''; + + const sanitized = sanitizeFile({ + file: malicious, + ext: 'bin', + mimeType: 'image/svg+xml', + }) as string; + + expect(sanitized).not.toContain(' { + const file = Buffer.from('not an svg'); + + const result = sanitizeFile({ + file, + ext: 'png', + mimeType: 'image/png', + }); + + expect(result).toBe(file); + }); +}); diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/drivers/google-calendar/services/google-calendar-get-events.service.ts b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/drivers/google-calendar/services/google-calendar-get-events.service.ts index 50c45b3e8c..f576f45524 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/drivers/google-calendar/services/google-calendar-get-events.service.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/drivers/google-calendar/services/google-calendar-get-events.service.ts @@ -1,5 +1,6 @@ import { Injectable, Logger } from '@nestjs/common'; +import { isString } from '@sniptt/guards'; import { type GaxiosError } from 'gaxios'; import { google, type calendar_v3 as calendarV3 } from 'googleapis'; @@ -89,7 +90,7 @@ export class GoogleCalendarGetEventsService { error, ); if ( - error.code && + isString(error.code) && [ 'ECONNRESET', 'ENOTFOUND', diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/mocks/create-mock-gaxios-error.util.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/mocks/create-mock-gaxios-error.util.ts new file mode 100644 index 0000000000..019bacf30d --- /dev/null +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/mocks/create-mock-gaxios-error.util.ts @@ -0,0 +1,52 @@ +import { GaxiosError, type GaxiosResponse } from 'gaxios'; + +const MOCK_URL = new URL('https://gmail.googleapis.com/mocks'); + +const createMockGaxiosResponse = ( + status: number, + statusText: string, + data: T, +): GaxiosResponse => { + const headers = new Headers(); + + const response: GaxiosResponse = { + config: { url: MOCK_URL, headers: new Headers() }, + data, + status, + statusText, + headers, + ok: status >= 200 && status < 300, + redirected: false, + type: 'default', + url: MOCK_URL.toString(), + body: null, + bodyUsed: true, + arrayBuffer: () => Promise.resolve(new ArrayBuffer(0)), + blob: () => Promise.resolve(new Blob()), + bytes: () => Promise.resolve(new Uint8Array()), + formData: () => Promise.resolve(new FormData()), + json: () => Promise.resolve(data), + text: () => Promise.resolve(''), + clone: () => response, + }; + + return response; +}; + +export const createMockGaxiosError = ({ + message, + status, + statusText = '', + data, +}: { + message: string; + status: number; + statusText?: string; + data: T; +}): GaxiosError => { + return new GaxiosError( + message, + { url: MOCK_URL, headers: new Headers() }, + createMockGaxiosResponse(status, statusText, data), + ); +}; diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/mocks/gmail-api-error-mocks.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/mocks/gmail-api-error-mocks.ts index c5ba34d656..30485c753b 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/mocks/gmail-api-error-mocks.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/mocks/gmail-api-error-mocks.ts @@ -1,4 +1,6 @@ -import { GaxiosError } from 'gaxios'; +import { type GaxiosError } from 'gaxios'; + +import { createMockGaxiosError } from 'src/modules/messaging/message-import-manager/drivers/gmail/mocks/create-mock-gaxios-error.util'; type ErrorConfig = { reason: string; @@ -66,27 +68,21 @@ export const getGmailApiError = ({ const errorMessage = message ?? config.message; - return new GaxiosError( - errorMessage, - { url: 'https://gmail.googleapis.com/mocks' }, - { - status: code, - statusText: config.message, - data: { - error: { - code, - message: errorMessage, - errors: [ - { - message: errorMessage, - reason: config.reason, - }, - ], - }, + return createMockGaxiosError({ + message: errorMessage, + status: code, + statusText: config.message, + data: { + error: { + code, + message: errorMessage, + errors: [ + { + message: errorMessage, + reason: config.reason, + }, + ], }, - headers: {}, - config: { url: 'https://gmail.googleapis.com/mocks' }, - request: { responseURL: 'https://gmail.googleapis.com/mocks' }, }, - ); + }); }; diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/utils/__tests__/is-gmail-api-error.util.spec.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/utils/__tests__/is-gmail-api-error.util.spec.ts index 00aaed43a7..4c9b16f41d 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/utils/__tests__/is-gmail-api-error.util.spec.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/utils/__tests__/is-gmail-api-error.util.spec.ts @@ -1,27 +1,22 @@ import { GaxiosError } from 'gaxios'; +import { createMockGaxiosError } from 'src/modules/messaging/message-import-manager/drivers/gmail/mocks/create-mock-gaxios-error.util'; import { isGmailApiError } from 'src/modules/messaging/message-import-manager/drivers/gmail/utils/is-gmail-api-error.util'; describe('isGmailApiError', () => { it('should detect Gmail API error shape even when instanceof GaxiosError fails', () => { - const originalError = new GaxiosError( - 'Rate limit exceeded', - {}, - { - status: 429, - statusText: 'Too Many Requests', - headers: {}, - config: {}, - request: { responseURL: '' }, - data: { - error: { - errors: [ - { reason: 'rateLimitExceeded', message: 'Rate limit exceeded' }, - ], - }, + const originalError = createMockGaxiosError({ + message: 'Rate limit exceeded', + status: 429, + statusText: 'Too Many Requests', + data: { + error: { + errors: [ + { reason: 'rateLimitExceeded', message: 'Rate limit exceeded' }, + ], }, }, - ); + }); const serialized = JSON.parse(JSON.stringify(originalError)); diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/utils/__tests__/parse-gmail-message-list-fetch-error.spec.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/utils/__tests__/parse-gmail-message-list-fetch-error.spec.ts index 4ed6004413..2efd40b937 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/utils/__tests__/parse-gmail-message-list-fetch-error.spec.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/utils/__tests__/parse-gmail-message-list-fetch-error.spec.ts @@ -1,9 +1,8 @@ -import { GaxiosError } from 'gaxios'; - import { MessageImportDriverException, MessageImportDriverExceptionCode, } from 'src/modules/messaging/message-import-manager/drivers/exceptions/message-import-driver.exception'; +import { createMockGaxiosError } from 'src/modules/messaging/message-import-manager/drivers/gmail/mocks/create-mock-gaxios-error.util'; import { getGmailApiError } from 'src/modules/messaging/message-import-manager/drivers/gmail/mocks/gmail-api-error-mocks'; import { parseGmailApiError } from 'src/modules/messaging/message-import-manager/drivers/gmail/utils/parse-gmail-api-error.util'; @@ -125,18 +124,12 @@ describe('parseGmailApiError', () => { }); it('should handle 500 OAuth internal_failure error', () => { - const error = new GaxiosError( - 'internal_failure', - { url: 'https://oauth2.googleapis.com/token' }, - { - status: 500, - statusText: 'Internal Server Error', - data: { error: 'internal_failure' }, - headers: {}, - config: { url: 'https://oauth2.googleapis.com/token' }, - request: { responseURL: 'https://oauth2.googleapis.com/token' }, - }, - ); + const error = createMockGaxiosError({ + message: 'internal_failure', + status: 500, + statusText: 'Internal Server Error', + data: { error: 'internal_failure' }, + }); const exception = parseGmailApiError(error); expect(exception).toBeInstanceOf(MessageImportDriverException); diff --git a/packages/twenty-server/test/integration/billing/utils/create-mock-stripe-subscription-created-data.util.ts b/packages/twenty-server/test/integration/billing/utils/create-mock-stripe-subscription-created-data.util.ts index bfe3bd7397..7e2ceb8efd 100644 --- a/packages/twenty-server/test/integration/billing/utils/create-mock-stripe-subscription-created-data.util.ts +++ b/packages/twenty-server/test/integration/billing/utils/create-mock-stripe-subscription-created-data.util.ts @@ -7,6 +7,7 @@ export const createMockStripeSubscriptionCreatedData = ( object: 'subscription', id: 'sub_default', customer: 'cus_default1', + customer_account: null, status: 'active', items: { data: [ diff --git a/packages/twenty-ui-deprecated/package.json b/packages/twenty-ui-deprecated/package.json index d452027e20..a9cd83db07 100644 --- a/packages/twenty-ui-deprecated/package.json +++ b/packages/twenty-ui-deprecated/package.json @@ -52,7 +52,7 @@ "@radix-ui/colors": "^3.0.0", "@sniptt/guards": "^0.2.0", "@tabler/icons-react": "^3.31.0", - "date-fns": "^2.30.0", + "date-fns": "^4.4.0", "framer-motion": "^11.18.0", "glob": "^11.1.0", "jotai": "^2.17.1", diff --git a/packages/twenty-ui/package.json b/packages/twenty-ui/package.json index 2e68854aba..a2c8313250 100644 --- a/packages/twenty-ui/package.json +++ b/packages/twenty-ui/package.json @@ -73,7 +73,7 @@ "@sniptt/guards": "^0.2.0", "@tabler/icons-react": "^3.31.0", "clsx": "^2.1.1", - "date-fns": "^2.30.0", + "date-fns": "^4.4.0", "framer-motion": "^11.18.0", "glob": "^11.1.0", "jotai": "^2.17.1", diff --git a/yarn.lock b/yarn.lock index 077eb55084..742d75cf81 100644 --- a/yarn.lock +++ b/yarn.lock @@ -610,6 +610,46 @@ __metadata: languageName: node linkType: hard +"@asamuzakjp/css-color@npm:^5.1.11": + version: 5.1.11 + resolution: "@asamuzakjp/css-color@npm:5.1.11" + dependencies: + "@asamuzakjp/generational-cache": "npm:^1.0.1" + "@csstools/css-calc": "npm:^3.2.0" + "@csstools/css-color-parser": "npm:^4.1.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + checksum: 10c0/32720bdff8daea6a8847aba6cdfae55baa3b4a2690b51d21db7f0382bbd183f3d9f2d5126df50afd889062635684b2819e47113629ee2e80c99389e75f48d060 + languageName: node + linkType: hard + +"@asamuzakjp/dom-selector@npm:^7.1.1": + version: 7.1.1 + resolution: "@asamuzakjp/dom-selector@npm:7.1.1" + dependencies: + "@asamuzakjp/generational-cache": "npm:^1.0.1" + "@asamuzakjp/nwsapi": "npm:^2.3.9" + bidi-js: "npm:^1.0.3" + css-tree: "npm:^3.2.1" + is-potential-custom-element-name: "npm:^1.0.1" + checksum: 10c0/8cec1c618781c94de5836a215bbe5aafb4d8b835b18c51faf8547f4574afa39f92def3951e40123860062467613dd825f1e1600ff32e8045cc099a91796dcfb8 + languageName: node + linkType: hard + +"@asamuzakjp/generational-cache@npm:^1.0.1": + version: 1.0.1 + resolution: "@asamuzakjp/generational-cache@npm:1.0.1" + checksum: 10c0/1de62de43764e13fca3b9a31b7ea9b1bf0780fe053d266e40378a19ff8c66b543e011e6a0df02d410cd59bf981126706f176cdbb938985165202c4a079fe1057 + languageName: node + linkType: hard + +"@asamuzakjp/nwsapi@npm:^2.3.9": + version: 2.3.9 + resolution: "@asamuzakjp/nwsapi@npm:2.3.9" + checksum: 10c0/869b81382e775499c96c45c6dbe0d0766a6da04bcf0abb79f5333535c4e19946851acaa43398f896e2ecc5a1de9cf3db7cf8c4b1afac1ee3d15e21584546d74d + languageName: node + linkType: hard + "@ast-grep/napi-darwin-arm64@npm:0.40.5": version: 0.40.5 resolution: "@ast-grep/napi-darwin-arm64@npm:0.40.5" @@ -4807,6 +4847,17 @@ __metadata: languageName: node linkType: hard +"@bramus/specificity@npm:^2.4.2": + version: 2.4.2 + resolution: "@bramus/specificity@npm:2.4.2" + dependencies: + css-tree: "npm:^3.0.0" + bin: + specificity: bin/cli.js + checksum: 10c0/c5f4e04e0bca0d2202598207a5eb0733c8109d12a68a329caa26373bec598d99db5bb785b8865fefa00fc01b08c6068138807ceb11a948fe15e904ed6cf4ba72 + languageName: node + linkType: hard + "@bufbuild/protobuf@npm:^2.5.0": version: 2.12.0 resolution: "@bufbuild/protobuf@npm:2.12.0" @@ -5153,6 +5204,13 @@ __metadata: languageName: node linkType: hard +"@csstools/color-helpers@npm:^6.0.2": + version: 6.0.2 + resolution: "@csstools/color-helpers@npm:6.0.2" + checksum: 10c0/4c66574563d7c960010c11e41c2673675baff07c427cca6e8dddffa5777de45770d13ff3efce1c0642798089ad55de52870d9d8141f78db3fa5bba012f2d3789 + languageName: node + linkType: hard + "@csstools/css-calc@npm:^2.1.3, @csstools/css-calc@npm:^2.1.4": version: 2.1.4 resolution: "@csstools/css-calc@npm:2.1.4" @@ -5163,6 +5221,16 @@ __metadata: languageName: node linkType: hard +"@csstools/css-calc@npm:^3.2.0, @csstools/css-calc@npm:^3.2.1": + version: 3.2.1 + resolution: "@csstools/css-calc@npm:3.2.1" + peerDependencies: + "@csstools/css-parser-algorithms": ^4.0.0 + "@csstools/css-tokenizer": ^4.0.0 + checksum: 10c0/0191c8d1cd4dffa0d3b6bfd1e78a721934b1d7a6c972966e4fdaa72208c6789e8ff443ee81764a32f1e6107825695b5524ef2b4dc1681b5b29230f2a1277e5df + languageName: node + linkType: hard + "@csstools/css-color-parser@npm:^3.0.9": version: 3.0.10 resolution: "@csstools/css-color-parser@npm:3.0.10" @@ -5176,6 +5244,19 @@ __metadata: languageName: node linkType: hard +"@csstools/css-color-parser@npm:^4.1.0": + version: 4.1.3 + resolution: "@csstools/css-color-parser@npm:4.1.3" + dependencies: + "@csstools/color-helpers": "npm:^6.0.2" + "@csstools/css-calc": "npm:^3.2.1" + peerDependencies: + "@csstools/css-parser-algorithms": ^4.0.0 + "@csstools/css-tokenizer": ^4.0.0 + checksum: 10c0/1adf0f7eb285549a41a472f3a758d616c4d6f82e5aa96ab6d061335202f27b933e2f412fceec166a39e75c723defdf7112fc2d7b915070fd91e27d3c69071248 + languageName: node + linkType: hard + "@csstools/css-parser-algorithms@npm:^3.0.4": version: 3.0.5 resolution: "@csstools/css-parser-algorithms@npm:3.0.5" @@ -5185,6 +5266,27 @@ __metadata: languageName: node linkType: hard +"@csstools/css-parser-algorithms@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/css-parser-algorithms@npm:4.0.0" + peerDependencies: + "@csstools/css-tokenizer": ^4.0.0 + checksum: 10c0/94558c2428d6ef0ddef542e86e0a8376aa1263a12a59770abb13ba50d7b83086822c75433f32aa2e7fef00555e1cc88292f9ca5bce79aed232bb3fed73b1528d + languageName: node + linkType: hard + +"@csstools/css-syntax-patches-for-csstree@npm:^1.1.3": + version: 1.1.5 + resolution: "@csstools/css-syntax-patches-for-csstree@npm:1.1.5" + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + checksum: 10c0/a31f0cfb74e2b5ce8a283c47969a202fc3b23c3ee05c6b6beab7f5c14d89c50b82533e446df74f7df0bf88bf23810ed59431353db26e00d5b013995c1ebf07a2 + languageName: node + linkType: hard + "@csstools/css-tokenizer@npm:^3.0.3": version: 3.0.4 resolution: "@csstools/css-tokenizer@npm:3.0.4" @@ -5192,6 +5294,13 @@ __metadata: languageName: node linkType: hard +"@csstools/css-tokenizer@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/css-tokenizer@npm:4.0.0" + checksum: 10c0/669cf3d0f9c8e1ffdf8c9955ad8beba0c8cfe03197fe29a4fcbd9ee6f7a18856cfa42c62670021a75183d9ab37f5d14a866e6a9df753a6c07f59e36797a9ea9f + languageName: node + linkType: hard + "@cyntler/react-doc-viewer@npm:^1.17.0": version: 1.17.1 resolution: "@cyntler/react-doc-viewer@npm:1.17.1" @@ -6399,6 +6508,18 @@ __metadata: languageName: node linkType: hard +"@exodus/bytes@npm:^1.11.0, @exodus/bytes@npm:^1.15.0, @exodus/bytes@npm:^1.6.0": + version: 1.15.1 + resolution: "@exodus/bytes@npm:1.15.1" + peerDependencies: + "@noble/hashes": ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + "@noble/hashes": + optional: true + checksum: 10c0/333056a6953bbf875d9f3b86c32314de29458d842e5f56f6ef8034b18c2d9660184550093d1bae5de0064043d5e23f54cc03148798d9d29cf5167ac03f2e9f8c + languageName: node + linkType: hard + "@faker-js/faker@npm:9.8.0": version: 9.8.0 resolution: "@faker-js/faker@npm:9.8.0" @@ -26962,7 +27083,7 @@ __metadata: languageName: node linkType: hard -"arrify@npm:^2.0.0, arrify@npm:^2.0.1": +"arrify@npm:^2.0.1": version: 2.0.1 resolution: "arrify@npm:2.0.1" checksum: 10c0/3fb30b5e7c37abea1907a60b28a554d2f0fc088757ca9bf5b684786e583fdf14360721eb12575c1ce6f995282eab936712d3c4389122682eafab0e0b57f78dbb @@ -27834,7 +27955,7 @@ __metadata: languageName: node linkType: hard -"bidi-js@npm:^1.0.2": +"bidi-js@npm:^1.0.2, bidi-js@npm:^1.0.3": version: 1.0.3 resolution: "bidi-js@npm:1.0.3" dependencies: @@ -30253,7 +30374,7 @@ __metadata: languageName: node linkType: hard -"css-tree@npm:3.2.1": +"css-tree@npm:3.2.1, css-tree@npm:^3.0.0, css-tree@npm:^3.2.1": version: 3.2.1 resolution: "css-tree@npm:3.2.1" dependencies: @@ -30681,6 +30802,16 @@ __metadata: languageName: node linkType: hard +"data-urls@npm:^7.0.0": + version: 7.0.0 + resolution: "data-urls@npm:7.0.0" + dependencies: + whatwg-mimetype: "npm:^5.0.0" + whatwg-url: "npm:^16.0.0" + checksum: 10c0/08d88ef50d8966a070ffdaa703e1e4b29f01bb2da364dfbc1612b1c2a4caa8045802c9532d81347b21781100132addb36a585071c8323b12cce97973961dee9f + languageName: node + linkType: hard + "data-view-buffer@npm:^1.0.2": version: 1.0.2 resolution: "data-view-buffer@npm:1.0.2" @@ -30728,16 +30859,23 @@ __metadata: languageName: node linkType: hard -"date-fns-tz@npm:^2.0.0": - version: 2.0.1 - resolution: "date-fns-tz@npm:2.0.1" +"date-fns-tz@npm:^3.2.0": + version: 3.2.0 + resolution: "date-fns-tz@npm:3.2.0" peerDependencies: - date-fns: 2.x - checksum: 10c0/f860dda9e3d38bc99dc325c678cafb94b3a18c12b1fea0e2f4e451396ea6c4cacced683066c669a67ec380f64fdda83aa4c414a207029b647faa2b76b2a5c6e3 + date-fns: ^3.0.0 || ^4.0.0 + checksum: 10c0/3f43300a4335d59f3515dc5196c66b4b56ef2af129eb82e4445ce0983e8ef31a5d038bc0406d669946bbbcf52ed953527527aa28b4a810995d6631a54655abcc languageName: node linkType: hard -"date-fns@npm:2.30.0, date-fns@npm:^2.30.0": +"date-fns@npm:4.4.0, date-fns@npm:^4.1.0, date-fns@npm:^4.4.0": + version: 4.4.0 + resolution: "date-fns@npm:4.4.0" + checksum: 10c0/988f0a13db183f5dfc85c36bbb6847a9c135a9225888bbea4005876ec15539a8613c21a07370a4e7ea543918d5a1cafb423c528b42cdbbde5fdfddb178126b21 + languageName: node + linkType: hard + +"date-fns@npm:^2.30.0": version: 2.30.0 resolution: "date-fns@npm:2.30.0" dependencies: @@ -30753,13 +30891,6 @@ __metadata: languageName: node linkType: hard -"date-fns@npm:^4.1.0": - version: 4.4.0 - resolution: "date-fns@npm:4.4.0" - checksum: 10c0/988f0a13db183f5dfc85c36bbb6847a9c135a9225888bbea4005876ec15539a8613c21a07370a4e7ea543918d5a1cafb423c528b42cdbbde5fdfddb178126b21 - languageName: node - linkType: hard - "dateformat@npm:^5.0.3": version: 5.0.3 resolution: "dateformat@npm:5.0.3" @@ -30872,6 +31003,13 @@ __metadata: languageName: node linkType: hard +"decimal.js@npm:^10.6.0": + version: 10.6.0 + resolution: "decimal.js@npm:10.6.0" + checksum: 10c0/07d69fbcc54167a340d2d97de95f546f9ff1f69d2b45a02fd7a5292412df3cd9eb7e23065e532a318f5474a2e1bccf8392fdf0443ef467f97f3bf8cb0477e5aa + languageName: node + linkType: hard + "decode-bmp@npm:^0.2.0": version: 0.2.1 resolution: "decode-bmp@npm:0.2.1" @@ -32131,6 +32269,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^8.0.0": + version: 8.0.0 + resolution: "entities@npm:8.0.0" + checksum: 10c0/938e631664c19451823344a351aeeafd74fae2d5fa51e4d5b6ff635afaefd4bacf0f609989888c04c42733f46ffdac15211608267ebb02488005891a4793e94d + languageName: node + linkType: hard + "env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -33062,7 +33207,43 @@ __metadata: languageName: node linkType: hard -"express@npm:4.22.2, express@npm:^4.17.1, express@npm:^4.18.2, express@npm:^4.21.2, express@npm:^4.22.1": +"express@npm:5.2.1, express@npm:^5.1.0": + version: 5.2.1 + resolution: "express@npm:5.2.1" + dependencies: + accepts: "npm:^2.0.0" + body-parser: "npm:^2.2.1" + content-disposition: "npm:^1.0.0" + content-type: "npm:^1.0.5" + cookie: "npm:^0.7.1" + cookie-signature: "npm:^1.2.1" + debug: "npm:^4.4.0" + depd: "npm:^2.0.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + finalhandler: "npm:^2.1.0" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + merge-descriptors: "npm:^2.0.0" + mime-types: "npm:^3.0.0" + on-finished: "npm:^2.4.1" + once: "npm:^1.4.0" + parseurl: "npm:^1.3.3" + proxy-addr: "npm:^2.0.7" + qs: "npm:^6.14.0" + range-parser: "npm:^1.2.1" + router: "npm:^2.2.0" + send: "npm:^1.1.0" + serve-static: "npm:^2.2.0" + statuses: "npm:^2.0.1" + type-is: "npm:^2.0.1" + vary: "npm:^1.1.2" + checksum: 10c0/45e8c841ad188a41402ddcd1294901e861ee0819f632fb494f2ed344ef9c43315d294d443fb48d594e6586a3b779785120f43321417adaef8567316a55072949 + languageName: node + linkType: hard + +"express@npm:^4.17.1, express@npm:^4.18.2, express@npm:^4.21.2, express@npm:^4.22.1": version: 4.22.2 resolution: "express@npm:4.22.2" dependencies: @@ -33101,42 +33282,6 @@ __metadata: languageName: node linkType: hard -"express@npm:5.2.1, express@npm:^5.1.0": - version: 5.2.1 - resolution: "express@npm:5.2.1" - dependencies: - accepts: "npm:^2.0.0" - body-parser: "npm:^2.2.1" - content-disposition: "npm:^1.0.0" - content-type: "npm:^1.0.5" - cookie: "npm:^0.7.1" - cookie-signature: "npm:^1.2.1" - debug: "npm:^4.4.0" - depd: "npm:^2.0.0" - encodeurl: "npm:^2.0.0" - escape-html: "npm:^1.0.3" - etag: "npm:^1.8.1" - finalhandler: "npm:^2.1.0" - fresh: "npm:^2.0.0" - http-errors: "npm:^2.0.0" - merge-descriptors: "npm:^2.0.0" - mime-types: "npm:^3.0.0" - on-finished: "npm:^2.4.1" - once: "npm:^1.4.0" - parseurl: "npm:^1.3.3" - proxy-addr: "npm:^2.0.7" - qs: "npm:^6.14.0" - range-parser: "npm:^1.2.1" - router: "npm:^2.2.0" - send: "npm:^1.1.0" - serve-static: "npm:^2.2.0" - statuses: "npm:^2.0.1" - type-is: "npm:^2.0.1" - vary: "npm:^1.1.2" - checksum: 10c0/45e8c841ad188a41402ddcd1294901e861ee0819f632fb494f2ed344ef9c43315d294d443fb48d594e6586a3b779785120f43321417adaef8567316a55072949 - languageName: node - linkType: hard - "exsolve@npm:^1.0.7": version: 1.0.8 resolution: "exsolve@npm:1.0.8" @@ -33391,13 +33536,6 @@ __metadata: languageName: node linkType: hard -"fast-text-encoding@npm:^1.0.0": - version: 1.0.6 - resolution: "fast-text-encoding@npm:1.0.6" - checksum: 10c0/e1d0381bda229c92c7906f63308f3b9caca8c78b732768b1ee16f560089ed21bc159bbe1434138ccd3815931ec8d4785bdade1ad1c45accfdf27ac6606ac67d2 - languageName: node - linkType: hard - "fast-uri@npm:^3.0.1": version: 3.1.2 resolution: "fast-uri@npm:3.1.2" @@ -34402,15 +34540,14 @@ __metadata: languageName: node linkType: hard -"gaxios@npm:5.1.3, gaxios@npm:^5.0.0, gaxios@npm:^5.0.1": - version: 5.1.3 - resolution: "gaxios@npm:5.1.3" +"gaxios@npm:7.1.5, gaxios@npm:^7.0.0, gaxios@npm:^7.0.0-rc.4, gaxios@npm:^7.1.4": + version: 7.1.5 + resolution: "gaxios@npm:7.1.5" dependencies: extend: "npm:^3.0.2" - https-proxy-agent: "npm:^5.0.0" - is-stream: "npm:^2.0.0" - node-fetch: "npm:^2.6.9" - checksum: 10c0/eb1fd1910491c18445b4e22932098346b3c16917caa3b71567abba296e2d3dcf53d4ede47825ec06223f8943ea35744553d66238c5ad8f3f7835d9dc8ed540ba + https-proxy-agent: "npm:^7.0.1" + node-fetch: "npm:^3.3.2" + checksum: 10c0/a3d12a9d2b781c548b40b4f2d7792281d091b63ffdd92713301a6e55bc9072fe7c1c54fa014416ca1fcdba40c171389bd409d0e3e326f4ae5ae60b25ae8ea540 languageName: node linkType: hard @@ -34421,13 +34558,14 @@ __metadata: languageName: node linkType: hard -"gcp-metadata@npm:^5.3.0": - version: 5.3.0 - resolution: "gcp-metadata@npm:5.3.0" +"gcp-metadata@npm:8.1.2": + version: 8.1.2 + resolution: "gcp-metadata@npm:8.1.2" dependencies: - gaxios: "npm:^5.0.0" + gaxios: "npm:^7.0.0" + google-logging-utils: "npm:^1.0.0" json-bigint: "npm:^1.0.0" - checksum: 10c0/c0570f8ed821429444d6d9d46279831aa1b68092bd5f394928dd816c39904721f8a80ed463fcbeb607a469b1917fe24dad0e66dc4a94388620c9172a54fb5a5f + checksum: 10c0/15a61231a9410dc11c2828d2c9fdc8b0a939f1af746195c44edc6f2ffea0acab52cef3a7b9828069a36fd5d68bda730f7328a415fe42a01258f6e249dfba6908 languageName: node linkType: hard @@ -34969,55 +35107,54 @@ __metadata: languageName: node linkType: hard -"google-auth-library@npm:^8.0.2": - version: 8.9.0 - resolution: "google-auth-library@npm:8.9.0" +"google-auth-library@npm:^10.1.0, google-auth-library@npm:^10.2.0": + version: 10.7.0 + resolution: "google-auth-library@npm:10.7.0" dependencies: - arrify: "npm:^2.0.0" base64-js: "npm:^1.3.0" ecdsa-sig-formatter: "npm:^1.0.11" - fast-text-encoding: "npm:^1.0.0" - gaxios: "npm:^5.0.0" - gcp-metadata: "npm:^5.3.0" - gtoken: "npm:^6.1.0" + gaxios: "npm:^7.1.4" + gcp-metadata: "npm:8.1.2" + google-logging-utils: "npm:1.1.3" jws: "npm:^4.0.0" - lru-cache: "npm:^6.0.0" - checksum: 10c0/a9b101e15ba0457d3abe548b59323211f2c34071721da73a74ba6a773e199e73736910fd7d39b0c978eb7655220ae6f90f4e0b5665419d298ab544f9159d1625 + checksum: 10c0/e8827ff84a69bbd6573229d8245d8fbb8870304e255c213571541d039c33764a6f4a8d773c002a16d6d75e35b9a596310b5c6f8e25b189a02eb4cebd6f022321 languageName: node linkType: hard -"google-p12-pem@npm:^4.0.0": - version: 4.0.1 - resolution: "google-p12-pem@npm:4.0.1" - dependencies: - node-forge: "npm:^1.3.1" - bin: - gp12-pem: build/src/bin/gp12-pem.js - checksum: 10c0/2cd15077cb2179306870223c65b49d38f0860bd8cc60da8072cc632c9aad8cb7e61e46e63d72e8ef3fca27ad9e6b8870db6cc809839f279382d9cc4d891a9a7b +"google-logging-utils@npm:1.1.3": + version: 1.1.3 + resolution: "google-logging-utils@npm:1.1.3" + checksum: 10c0/e65201c7e96543bd1423b9324013736646b9eed60941e0bfa47b9bfd146d2f09cf3df1c99ca60b7d80a726075263ead049ee72de53372cb8458c3bc55c2c1e59 languageName: node linkType: hard -"googleapis-common@npm:^6.0.0": - version: 6.0.4 - resolution: "googleapis-common@npm:6.0.4" +"google-logging-utils@npm:^1.0.0": + version: 1.1.4 + resolution: "google-logging-utils@npm:1.1.4" + checksum: 10c0/860873974dd31678553f1074eb8fcf49c6417807086f4645ee8d4eaa81e8dce39f8f7a4b6856be4fda6e5d812b2df10e7abeb6dfe28353d28724cf81357c5a53 + languageName: node + linkType: hard + +"googleapis-common@npm:8.0.1": + version: 8.0.1 + resolution: "googleapis-common@npm:8.0.1" dependencies: extend: "npm:^3.0.2" - gaxios: "npm:^5.0.1" - google-auth-library: "npm:^8.0.2" + gaxios: "npm:^7.0.0-rc.4" + google-auth-library: "npm:^10.1.0" qs: "npm:^6.7.0" url-template: "npm:^2.0.8" - uuid: "npm:^9.0.0" - checksum: 10c0/7db7b6010d0ea00c01c74cb4ed1a7f8df7d6477a13b49a9bcf799cade322eb3e3a89655651f20cb5208f6d7d68b5a96f44befa35578bc290c732f7547fa31795 + checksum: 10c0/ee939fdfcaea32c528e7be64621b3e6b35e612f2456c8d4aca835e0a01ccec52f4ea2ac9509b083128398631a6cd66512c400adb4d0375a4638c55888ccdea7f languageName: node linkType: hard -"googleapis@npm:105.0.0": - version: 105.0.0 - resolution: "googleapis@npm:105.0.0" +"googleapis@npm:173.0.0": + version: 173.0.0 + resolution: "googleapis@npm:173.0.0" dependencies: - google-auth-library: "npm:^8.0.2" - googleapis-common: "npm:^6.0.0" - checksum: 10c0/10e409a22958d587aed898681501a630a39189ef00373a99549bc4eb3f47bdf29d61ec797f151285337880728674c57c0b76284e165683fb6408645d4dbfc4ae + google-auth-library: "npm:^10.2.0" + googleapis-common: "npm:^8.0.0" + checksum: 10c0/29a4814292ae98390d6db26deeb299160f07730f59075193fec54300035e7d6919e0bec4e45cf4b109370b7a2ebbee186ad9c12ee931a3cf02a40b2c9132d802 languageName: node linkType: hard @@ -35375,17 +35512,6 @@ __metadata: languageName: node linkType: hard -"gtoken@npm:^6.1.0": - version: 6.1.2 - resolution: "gtoken@npm:6.1.2" - dependencies: - gaxios: "npm:^5.0.1" - google-p12-pem: "npm:^4.0.0" - jws: "npm:^4.0.0" - checksum: 10c0/d660fbb8ad00a9f5b6eb426090593cb2a07d63dc22a11b0cf155d43779b6078f804e3467e37deb9a1c078ae34e683070279dc5a1577c50e0e3166a6a6748d98e - languageName: node - linkType: hard - "guess-json-indent@npm:^3.0.1": version: 3.0.1 resolution: "guess-json-indent@npm:3.0.1" @@ -36093,6 +36219,15 @@ __metadata: languageName: node linkType: hard +"html-encoding-sniffer@npm:^6.0.0": + version: 6.0.0 + resolution: "html-encoding-sniffer@npm:6.0.0" + dependencies: + "@exodus/bytes": "npm:^1.6.0" + checksum: 10c0/66dc3f6f5539cc3beb814fcbfae7eacf4ec38cf824d6e1425b72039b51a40f4456bd8541ba66f4f4fe09cdf885ab5cd5bae6ec6339d6895a930b2fdb83c53025 + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -36388,7 +36523,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:5.0.1, https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": +"https-proxy-agent@npm:5.0.1, https-proxy-agent@npm:^5.0.1": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: @@ -39287,7 +39422,7 @@ __metadata: languageName: node linkType: hard -"jsdom@npm:^26.0.0, jsdom@npm:^26.1.0": +"jsdom@npm:^26.0.0": version: 26.1.0 resolution: "jsdom@npm:26.1.0" dependencies: @@ -39320,6 +39455,40 @@ __metadata: languageName: node linkType: hard +"jsdom@npm:^29.1.1": + version: 29.1.1 + resolution: "jsdom@npm:29.1.1" + dependencies: + "@asamuzakjp/css-color": "npm:^5.1.11" + "@asamuzakjp/dom-selector": "npm:^7.1.1" + "@bramus/specificity": "npm:^2.4.2" + "@csstools/css-syntax-patches-for-csstree": "npm:^1.1.3" + "@exodus/bytes": "npm:^1.15.0" + css-tree: "npm:^3.2.1" + data-urls: "npm:^7.0.0" + decimal.js: "npm:^10.6.0" + html-encoding-sniffer: "npm:^6.0.0" + is-potential-custom-element-name: "npm:^1.0.1" + lru-cache: "npm:^11.3.5" + parse5: "npm:^8.0.1" + saxes: "npm:^6.0.0" + symbol-tree: "npm:^3.2.4" + tough-cookie: "npm:^6.0.1" + undici: "npm:^7.25.0" + w3c-xmlserializer: "npm:^5.0.0" + webidl-conversions: "npm:^8.0.1" + whatwg-mimetype: "npm:^5.0.0" + whatwg-url: "npm:^16.0.1" + xml-name-validator: "npm:^5.0.0" + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 10c0/20e2174b09d9d06393cb48e1392b7a1cb7191d6656a6f7b3b8fbf9853b4ab0ef60b4a42c2c55f71b55ca5da50ffa75bcdc6986210963182e7993c6f9cd4f499b + languageName: node + linkType: hard + "jsep@npm:^1.2.0, jsep@npm:^1.4.0": version: 1.4.0 resolution: "jsep@npm:1.4.0" @@ -40665,7 +40834,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": +"lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1, lru-cache@npm:^11.3.5": version: 11.5.1 resolution: "lru-cache@npm:11.5.1" checksum: 10c0/7b341cea79a8efe9c6a6f20c8757a77eca5b25d7ff983ccf4e11e547b81f6787824baa1c84705251dff84ab4ffac85717ac354b9d02e465f86a9f8b166409979 @@ -43247,7 +43416,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:2, node-fetch@npm:2.7.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.9, node-fetch@npm:^2.7.0": +"node-fetch@npm:2, node-fetch@npm:2.7.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:^2.7.0": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -43286,13 +43455,6 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^1.3.1": - version: 1.4.0 - resolution: "node-forge@npm:1.4.0" - checksum: 10c0/67330a5f1f95257a4c8a93b7d555abe87b5f15e350123aa396c97a21a8ca94f9c6549008eb2c73668a91e0d7e3a905785acbd8f8bd0751c29401292011f8f8e1 - languageName: node - linkType: hard - "node-gyp-build-optional-packages@npm:5.2.2": version: 5.2.2 resolution: "node-gyp-build-optional-packages@npm:5.2.2" @@ -43946,9 +44108,9 @@ __metadata: linkType: hard "oidc-token-hash@npm:^5.0.3": - version: 5.0.3 - resolution: "oidc-token-hash@npm:5.0.3" - checksum: 10c0/d0dc0551406f09577874155cc83cf69c39e4b826293d50bb6c37936698aeca17d4bcee356ab910c859e53e83f2728a2acbd041020165191353b29de51fbca615 + version: 5.2.0 + resolution: "oidc-token-hash@npm:5.2.0" + checksum: 10c0/4fa9a6f0a27c0b304aa2e4a37e433e871fb2e71418b62ada7305022ed7c70a4b325a81a4ee9661bf0c456cda0acdbeb564e68659bd6fe6a192b20bdec11688ea languageName: node linkType: hard @@ -44136,14 +44298,14 @@ __metadata: linkType: hard "openid-client@npm:^5.7.0": - version: 5.7.0 - resolution: "openid-client@npm:5.7.0" + version: 5.7.1 + resolution: "openid-client@npm:5.7.1" dependencies: jose: "npm:^4.15.9" lru-cache: "npm:^6.0.0" object-hash: "npm:^2.2.0" oidc-token-hash: "npm:^5.0.3" - checksum: 10c0/02e42c66415581262c0372e178dba2bc958f1b5cfd2eb502b4f71b7718fc11dfac37b12117b1c73cff5dc80f5871cd830e175aae95ae212fbd353f3efa1de091 + checksum: 10c0/6aae649758562002eace7574b6eda02be7eddbb0df61eef497ae98b7a4a0ae4c6b09f3f0c1b9b6cb7fcc0c70bbde2576691bf31b870db1f19ab634c1def10bc7 languageName: node linkType: hard @@ -45140,6 +45302,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^8.0.1": + version: 8.0.1 + resolution: "parse5@npm:8.0.1" + dependencies: + entities: "npm:^8.0.0" + checksum: 10c0/c3c1c5aab55f6e4be5245599790e56e64be7764a4a0edd7f98db4fe3bb380f63add752fa047dff0496446c25f4104f0c7c1967723de640bde92306a7bb67ed2f + languageName: node + linkType: hard + "parseley@npm:^0.12.0": version: 0.12.1 resolution: "parseley@npm:0.12.1" @@ -51552,21 +51723,7 @@ __metadata: languageName: node linkType: hard -"stripe@npm:19.3.1": - version: 19.3.1 - resolution: "stripe@npm:19.3.1" - dependencies: - qs: "npm:^6.11.0" - peerDependencies: - "@types/node": ">=16" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/986b42cf25993ad7ee6aa378bac581dc6b403b8424cfb0363595062c0d4afcf79b5a15f05ee08dc9b9e93d3559c3ec9f300f786c61a3be1fdb89851660f8af8d - languageName: node - linkType: hard - -"stripe@npm:^20.3.1": +"stripe@npm:20.4.1, stripe@npm:^20.3.1": version: 20.4.1 resolution: "stripe@npm:20.4.1" peerDependencies: @@ -52737,6 +52894,15 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^6.0.1": + version: 6.0.1 + resolution: "tough-cookie@npm:6.0.1" + dependencies: + tldts: "npm:^7.0.5" + checksum: 10c0/ec70bd6b1215efe4ed31a158f0be3e4c9088fcbd8620edc23a5860d4f3d85c757b77e274baaa700f7b25e409f4181552ed189603c2b2e1a9f88104da3a61a37d + languageName: node + linkType: hard + "tr46@npm:^5.1.0": version: 5.1.1 resolution: "tr46@npm:5.1.1" @@ -52746,6 +52912,15 @@ __metadata: languageName: node linkType: hard +"tr46@npm:^6.0.0": + version: 6.0.0 + resolution: "tr46@npm:6.0.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10c0/83130df2f649228aa91c17754b66248030a3af34911d713b5ea417066fa338aa4bc8668d06bd98aa21a2210f43fc0a3db8b9099e7747fb5830e40e39a6a1058e + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -53367,8 +53542,8 @@ __metadata: country-flag-icons: "npm:^1.5.11" cron-parser: "npm:5.1.1" d3-shape: "npm:^3.2.0" - date-fns: "npm:^2.30.0" - date-fns-tz: "npm:^2.0.0" + date-fns: "npm:^4.4.0" + date-fns-tz: "npm:^3.2.0" deep-equal: "npm:^2.2.2" dotenv-cli: "npm:^7.4.4" esbuild: "npm:^0.28.1" @@ -53628,17 +53803,17 @@ __metadata: connect-redis: "npm:^7.1.1" cron-parser: "npm:5.1.1" dataloader: "npm:2.2.2" - date-fns: "npm:2.30.0" + date-fns: "npm:4.4.0" digest-fetch: "npm:^3.1.1" dompurify: "npm:^3.4.0" dotenv: "npm:16.4.5" email-reply-parser: "npm:^2.3.5" - express: "npm:4.22.2" + express: "npm:5.2.1" express-session: "npm:^1.18.2" file-type: "npm:^21.3.2" fuse.js: "npm:^7.1.0" - gaxios: "npm:5.1.3" - googleapis: "npm:105.0.0" + gaxios: "npm:7.1.5" + googleapis: "npm:173.0.0" graphql: "npm:16.8.1" graphql-fields: "npm:2.0.3" graphql-redis-subscriptions: "npm:2.7.0" @@ -53653,7 +53828,7 @@ __metadata: ioredis: "npm:5.10.1" jest: "npm:29.7.0" jest-environment-node: "npm:^29.4.1" - jsdom: "npm:^26.1.0" + jsdom: "npm:^29.1.1" json-schema: "npm:0.4.0" jsonwebtoken: "npm:9.0.2" libphonenumber-js: "npm:1.11.5" @@ -53699,7 +53874,7 @@ __metadata: rxjs: "npm:7.8.1" semver: "npm:7.6.3" sns-payload-validator: "npm:^2.1.0" - stripe: "npm:19.3.1" + stripe: "npm:20.4.1" supertest: "npm:^6.1.3" tar: "npm:^7.5.9" temporal-polyfill: "npm:^0.3.0" @@ -53801,7 +53976,7 @@ __metadata: babel-plugin-inline-import: "npm:^3.0.0" babel-plugin-inline-react-svg: "npm:^2.0.2" babel-plugin-module-resolver: "npm:^5.0.2" - date-fns: "npm:^2.30.0" + date-fns: "npm:^4.4.0" esbuild: "npm:^0.28.1" framer-motion: "npm:^11.18.0" glob: "npm:^11.1.0" @@ -53857,7 +54032,7 @@ __metadata: "@vitejs/plugin-react-swc": "npm:^4.3.1" "@vitest/browser-playwright": "npm:^4.1.0" clsx: "npm:^2.1.1" - date-fns: "npm:^2.30.0" + date-fns: "npm:^4.4.0" esbuild: "npm:^0.28.1" framer-motion: "npm:^11.18.0" glob: "npm:^11.1.0" @@ -54522,6 +54697,13 @@ __metadata: languageName: node linkType: hard +"undici@npm:^7.25.0": + version: 7.27.2 + resolution: "undici@npm:7.27.2" + checksum: 10c0/714632147c80eb8eda8a52df51b481d346df5e035ccc1d87eb3bbcb8f92ec25d7cbbe81abdeae5db4e37a93e490c8d2fa2359ecdca4b2c5c6c513dcd2626ad47 + languageName: node + linkType: hard + "unenv@npm:2.0.0-rc.24": version: 2.0.0-rc.24 resolution: "unenv@npm:2.0.0-rc.24" @@ -55965,6 +56147,13 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^8.0.1": + version: 8.0.1 + resolution: "webidl-conversions@npm:8.0.1" + checksum: 10c0/3f6f327ca5fa0c065ed8ed0ef3b72f33623376e68f958e9b7bd0df49fdb0b908139ac2338d19fb45bd0e05595bda96cb6d1622222a8b413daa38a17aacc4dd46 + languageName: node + linkType: hard + "webpack-dev-middleware@npm:^7.4.2": version: 7.4.5 resolution: "webpack-dev-middleware@npm:7.4.5" @@ -56232,6 +56421,13 @@ __metadata: languageName: node linkType: hard +"whatwg-mimetype@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-mimetype@npm:5.0.0" + checksum: 10c0/eead164fe73a00dd82f817af6fc0bd22e9c273e1d55bf4bc6bdf2da7ad8127fca82ef00ea6a37892f5f5641f8e34128e09508f92126086baba126b9e0d57feb4 + languageName: node + linkType: hard + "whatwg-url@npm:^14.0.0, whatwg-url@npm:^14.1.1": version: 14.2.0 resolution: "whatwg-url@npm:14.2.0" @@ -56242,6 +56438,17 @@ __metadata: languageName: node linkType: hard +"whatwg-url@npm:^16.0.0, whatwg-url@npm:^16.0.1": + version: 16.0.1 + resolution: "whatwg-url@npm:16.0.1" + dependencies: + "@exodus/bytes": "npm:^1.11.0" + tr46: "npm:^6.0.0" + webidl-conversions: "npm:^8.0.1" + checksum: 10c0/e75565566abf3a2cdbd9f06c965dbcccee6ec4e9f0d3728ad5e08ceb9944279848bcaa211d35a29cb6d2df1e467dd05cfb59fbddf8a0adcd7d0bce9ffb703fd2 + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0"