From 481d07918b2f6dd6eeabbfaa472b589de8d4fd31 Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Mon, 18 May 2026 15:51:34 +0100 Subject: [PATCH 1/3] fix: "overwritten" hard to translate --- .../modals/FileUploadConflictModal.vue | 28 +++++++++++-------- packages/ui/src/locales/en-US/index.json | 6 ++-- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/ui/src/layouts/shared/files-tab/components/modals/FileUploadConflictModal.vue b/packages/ui/src/layouts/shared/files-tab/components/modals/FileUploadConflictModal.vue index 1e3d7fb3dc..61e7f43c94 100644 --- a/packages/ui/src/layouts/shared/files-tab/components/modals/FileUploadConflictModal.vue +++ b/packages/ui/src/layouts/shared/files-tab/components/modals/FileUploadConflictModal.vue @@ -28,7 +28,7 @@
@@ -38,14 +38,17 @@ class="w-[1px] h-2 relative top-1" >
- {{ - formatMessage(messages.overwrittenLabel) - }} - - {{ file }} + + + + @@ -76,6 +79,7 @@ import { computed, ref } from 'vue' import Admonition from '#ui/components/base/Admonition.vue' import ButtonStyled from '#ui/components/base/ButtonStyled.vue' +import IntlFormatted from '#ui/components/base/IntlFormatted.vue' import NewModal from '#ui/components/modal/NewModal.vue' import { defineMessages, useVIntl } from '#ui/composables/i18n' import { commonMessages } from '#ui/utils/common-messages' @@ -105,9 +109,9 @@ const messages = defineMessages({ id: 'files.conflict-modal.overwritten-count', defaultMessage: '{count} overwritten', }, - overwrittenLabel: { - id: 'files.conflict-modal.overwritten-label', - defaultMessage: 'Overwritten', + overwriteFileLabel: { + id: 'files.conflict-modal.overwrite-file-label', + defaultMessage: 'Will overwrite {path}', }, overwriteButton: { id: 'files.conflict-modal.overwrite-button', diff --git a/packages/ui/src/locales/en-US/index.json b/packages/ui/src/locales/en-US/index.json index 2083686ccd..0b3c88d9de 100644 --- a/packages/ui/src/locales/en-US/index.json +++ b/packages/ui/src/locales/en-US/index.json @@ -830,6 +830,9 @@ "files.conflict-modal.overwrite-button": { "defaultMessage": "Overwrite" }, + "files.conflict-modal.overwrite-file-label": { + "defaultMessage": "Will overwrite {path}" + }, "files.conflict-modal.overwrite-many-warning": { "defaultMessage": "Over 100 files will be overwritten if you proceed with extraction; here are some of them." }, @@ -839,9 +842,6 @@ "files.conflict-modal.overwritten-count": { "defaultMessage": "{count} overwritten" }, - "files.conflict-modal.overwritten-label": { - "defaultMessage": "Overwritten" - }, "files.conflict-modal.warning-header": { "defaultMessage": "Files will be overwritten" }, From 9561f921ef3c89e3e88953b90ad266d80106b10d Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Mon, 18 May 2026 16:01:42 +0100 Subject: [PATCH 2/3] fix: plural + s issues --- .../app-frontend/src/locales/en-US/index.json | 12 +++-- .../app-frontend/src/pages/instance/Index.vue | 25 ++++++++-- apps/app-frontend/src/pages/instance/Mods.vue | 6 +-- .../components/ui/admin/BatchCreditModal.vue | 18 ++++--- .../src/components/ui/admin/TransferModal.vue | 18 ++++++- .../ui/moderation/ModerationTechRevCard.vue | 13 ++++- apps/frontend/src/locales/en-US/index.json | 28 ++++++++++- apps/frontend/src/pages/[type]/[id].vue | 4 +- apps/frontend/src/pages/admin/affiliates.vue | 16 +++++- .../src/pages/admin/servers/transfers.vue | 12 ++++- .../src/pages/dashboard/notifications.vue | 15 +++++- .../organization/[id]/settings/projects.vue | 16 ++++-- apps/frontend/src/pages/settings/index.vue | 3 -- apps/frontend/src/pages/user/[id].vue | 10 ++-- .../billing/ServersPurchase3Review.vue | 17 +++++-- .../servers/labels/ServerUptimeLabel.vue | 30 +++++++++-- .../ui/src/layouts/shared/console/layout.vue | 11 +++- .../components/ContentSelectionBar.vue | 34 +++++++------ .../modals/ConfirmDeletionModal.vue | 6 ++- .../components/modals/ModpackContentModal.vue | 2 +- .../composables/content-filtering.ts | 2 +- .../src/layouts/shared/content-tab/layout.vue | 10 ++-- .../shared/server-settings/pages/general.vue | 15 +++++- .../wrapped/hosting/manage/backups.vue | 6 ++- packages/ui/src/locales/en-US/index.json | 50 ++++++++++++++----- 25 files changed, 294 insertions(+), 85 deletions(-) diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json index 51757b059d..b705f8a235 100644 --- a/apps/app-frontend/src/locales/en-US/index.json +++ b/apps/app-frontend/src/locales/en-US/index.json @@ -200,9 +200,6 @@ "app.instance.modpack-already-installed.instance": { "message": "Instance" }, - "app.instance.mods.content-type-project": { - "message": "project" - }, "app.instance.mods.project-was-added": { "message": "\"{name}\" was added" }, @@ -218,6 +215,15 @@ "app.instance.mods.successfully-uploaded": { "message": "Successfully uploaded" }, + "app.instance.overview.time-played.hours": { + "message": "{count, plural, one {# hour} other {# hours}}" + }, + "app.instance.overview.time-played.minutes": { + "message": "{count, plural, one {# minute} other {# minutes}}" + }, + "app.instance.overview.time-played.seconds": { + "message": "{count, plural, one {# second} other {# seconds}}" + }, "app.instance.worlds.add-server": { "message": "Add server" }, diff --git a/apps/app-frontend/src/pages/instance/Index.vue b/apps/app-frontend/src/pages/instance/Index.vue index f3c76fa531..83f164bdf5 100644 --- a/apps/app-frontend/src/pages/instance/Index.vue +++ b/apps/app-frontend/src/pages/instance/Index.vue @@ -288,6 +288,7 @@ import { Avatar, ButtonStyled, ContentPageHeader, + defineMessages, injectNotificationManager, NavTabs, OverflowMenu, @@ -295,6 +296,7 @@ import { ServerPing, ServerRecentPlays, ServerRegion, + useVIntl, } from '@modrinth/ui' import { useQueryClient } from '@tanstack/vue-query' import { convertFileSrc } from '@tauri-apps/api/core' @@ -321,6 +323,23 @@ import { injectServerInstall } from '@/providers/server-install' import { handleSevereError } from '@/store/error.js' import { useBreadcrumbs } from '@/store/state' +const { formatMessage } = useVIntl() + +const messages = defineMessages({ + timePlayedHours: { + id: 'app.instance.overview.time-played.hours', + defaultMessage: '{count, plural, one {# hour} other {# hours}}', + }, + timePlayedMinutes: { + id: 'app.instance.overview.time-played.minutes', + defaultMessage: '{count, plural, one {# minute} other {# minutes}}', + }, + timePlayedSeconds: { + id: 'app.instance.overview.time-played.seconds', + defaultMessage: '{count, plural, one {# second} other {# seconds}}', + }, +}) + dayjs.extend(duration) dayjs.extend(relativeTime) @@ -649,16 +668,16 @@ const timePlayedHumanized = computed(() => { const duration = dayjs.duration(timePlayed.value, 'seconds') const hours = Math.floor(duration.asHours()) if (hours >= 1) { - return hours + ' hour' + (hours > 1 ? 's' : '') + return formatMessage(messages.timePlayedHours, { count: hours }) } const minutes = Math.floor(duration.asMinutes()) if (minutes >= 1) { - return minutes + ' minute' + (minutes > 1 ? 's' : '') + return formatMessage(messages.timePlayedMinutes, { count: minutes }) } const seconds = Math.floor(duration.asSeconds()) - return seconds + ' second' + (seconds > 1 ? 's' : '') + return formatMessage(messages.timePlayedSeconds, { count: seconds }) }) onUnmounted(() => { diff --git a/apps/app-frontend/src/pages/instance/Mods.vue b/apps/app-frontend/src/pages/instance/Mods.vue index 12469f5c27..541efc68b8 100644 --- a/apps/app-frontend/src/pages/instance/Mods.vue +++ b/apps/app-frontend/src/pages/instance/Mods.vue @@ -142,10 +142,6 @@ const messages = defineMessages({ id: 'app.instance.mods.projects-were-added', defaultMessage: '{count} projects were added', }, - contentTypeProject: { - id: 'app.instance.mods.content-type-project', - defaultMessage: 'project', - }, }) let savedModalState: ModpackContentModalState | null = null @@ -781,7 +777,7 @@ provideContentManager({ isPackLocked, isBusy: isInstanceBusy, isBulkOperating, - contentTypeLabel: ref(formatMessage(messages.contentTypeProject)), + contentTypeLabel: ref('project'), toggleEnabled: toggleDisableDebounced, bulkEnableItems: (items: ContentItem[]) => Promise.all(items.filter((item) => !item.enabled).map((item) => toggleDisableMod(item))).then( diff --git a/apps/frontend/src/components/ui/admin/BatchCreditModal.vue b/apps/frontend/src/components/ui/admin/BatchCreditModal.vue index 8d48651ebf..f52221f120 100644 --- a/apps/frontend/src/components/ui/admin/BatchCreditModal.vue +++ b/apps/frontend/src/components/ui/admin/BatchCreditModal.vue @@ -100,8 +100,7 @@ input-class="!bg-surface-3" /> - To make up for it, we've added {{ days }} day{{ pluralize(days) }} to your Modrinth - Servers subscription. + {{ formatMessage(messages.creditEmailSubscriptionDays, { days }) }} Your next charge was scheduled for {credit.previous_due} and will now be on @@ -133,11 +132,13 @@ import { CheckIcon, PlusIcon, XIcon } from '@modrinth/assets' import { ButtonStyled, Combobox, + defineMessages, injectNotificationManager, NewModal, StyledInput, TagItem, Toggle, + useVIntl, } from '@modrinth/ui' import { DEFAULT_CREDIT_EMAIL_MESSAGE } from '@modrinth/utils/utils.ts' import { computed, ref } from 'vue' @@ -146,6 +147,15 @@ import { useBaseFetch } from '#imports' import { useServersFetch } from '~/composables/servers/servers-fetch.ts' const { addNotification } = injectNotificationManager() +const { formatMessage } = useVIntl() + +const messages = defineMessages({ + creditEmailSubscriptionDays: { + id: 'admin.batch-credit.email-preview.subscription-days', + defaultMessage: + "To make up for it, we've added {days, plural, one {# day} other {# days}} to your Modrinth Servers subscription.", + }, +}) const modal = ref>() @@ -252,10 +262,6 @@ async function apply() { } } -function pluralize(n: number): string { - return n === 1 ? '' : 's' -} - defineExpose({ show, hide, diff --git a/apps/frontend/src/components/ui/admin/TransferModal.vue b/apps/frontend/src/components/ui/admin/TransferModal.vue index bf5e1e2307..05e42304ef 100644 --- a/apps/frontend/src/components/ui/admin/TransferModal.vue +++ b/apps/frontend/src/components/ui/admin/TransferModal.vue @@ -34,7 +34,7 @@ placeholder="123e4569-e89b-12d3-a456-426614174005 123e9569-e89b-12d3-a456-413678919876" /> - {{ parsedServerIds.length }} server{{ parsedServerIds.length === 1 ? '' : 's' }} selected + {{ formatMessage(messages.selectedServers, { count: parsedServerIds.length }) }} @@ -198,11 +198,13 @@ import { ButtonStyled, Chips, Combobox, + defineMessages, injectNotificationManager, NewModal, StyledInput, TagItem, Toggle, + useVIntl, } from '@modrinth/ui' import dayjs from 'dayjs' import { computed, ref } from 'vue' @@ -214,6 +216,18 @@ const emit = defineEmits<{ }>() const { addNotification } = injectNotificationManager() +const { formatMessage } = useVIntl() + +const messages = defineMessages({ + selectedServers: { + id: 'admin.transfer-modal.selected-servers', + defaultMessage: '{count, plural, one {# server selected} other {# servers selected}}', + }, + unknownNodes: { + id: 'admin.transfer-modal.unknown-nodes', + defaultMessage: '{count, plural, one {Unknown node} other {Unknown nodes}}', + }, +}) const modal = ref>() @@ -303,7 +317,7 @@ function addNodes() { if (unknownNodes.length > 0) { addNotification({ - title: `Unknown node${unknownNodes.length > 1 ? 's' : ''}`, + title: formatMessage(messages.unknownNodes, { count: unknownNodes.length }), text: unknownNodes.join(', '), type: 'error', }) diff --git a/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue index 07991f83d4..9f0af6ba00 100644 --- a/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue +++ b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue @@ -23,6 +23,7 @@ import { ButtonStyled, Collapsible, CollapsibleRegion, + defineMessages, getProjectTypeIcon, injectModrinthClient, injectNotificationManager, @@ -30,6 +31,7 @@ import { type OverflowMenuOption, useFormatBytes, useFormatDateTime, + useVIntl, } from '@modrinth/ui' import { NavTabs } from '@modrinth/ui' import { @@ -58,6 +60,15 @@ const formatDateTimeUtc = useFormatDateTime({ timeZone: 'UTC', }) const formatBytes = useFormatBytes() +const { formatMessage } = useVIntl() + +const messages = defineMessages({ + otherTracesAlsoMarked: { + id: 'moderation.tech-review.other-traces-also-marked', + defaultMessage: + '({count, plural, one {# other trace also marked} other {# other traces also marked}})', + }, +}) type FlattenedFileReport = Labrinth.TechReview.Internal.FileReport & { id: string @@ -531,7 +542,7 @@ async function updateDetailStatus(detailId: string, verdict: 'safe' | 'unsafe') const otherText = otherMatchedCount > 0 - ? ` (${otherMatchedCount} other trace${otherMatchedCount === 1 ? '' : 's'} also marked)` + ? ` ${formatMessage(messages.otherTracesAlsoMarked, { count: otherMatchedCount })}` : '' if (verdict === 'safe') { diff --git a/apps/frontend/src/locales/en-US/index.json b/apps/frontend/src/locales/en-US/index.json index 4638aaf646..c124e47daa 100644 --- a/apps/frontend/src/locales/en-US/index.json +++ b/apps/frontend/src/locales/en-US/index.json @@ -5,9 +5,24 @@ "action.continue": { "message": "Continue" }, + "admin.affiliates.affiliate-code-count": { + "message": "{count, plural, one {# affiliate code} other {# affiliate codes}}" + }, + "admin.batch-credit.email-preview.subscription-days": { + "message": "To make up for it, we've added {days, plural, one {# day} other {# days}} to your Modrinth Servers subscription." + }, "admin.billing.error.not-found": { "message": "User not found" }, + "admin.server-transfers.transfer-count": { + "message": "{count, plural, one {# transfer} other {# transfers}}" + }, + "admin.transfer-modal.selected-servers": { + "message": "{count, plural, one {# server selected} other {# servers selected}}" + }, + "admin.transfer-modal.unknown-nodes": { + "message": "{count, plural, one {Unknown node} other {Unknown nodes}}" + }, "app-marketing.download.description": { "message": "Our desktop app is available across all platforms, choose your desired version." }, @@ -2090,6 +2105,9 @@ "moderation.page.technicalReview": { "message": "Tech review" }, + "moderation.tech-review.other-traces-also-marked": { + "message": "({count, plural, one {# other trace also marked} other {# other traces also marked}})" + }, "muralpay.account-type.checking": { "message": "Checking" }, @@ -2357,6 +2375,9 @@ "muralpay.warning.wallet-address": { "message": "Double-check your wallet address. Funds sent to an incorrect address cannot be recovered." }, + "organization.settings.projects.edit-links.affected-projects": { + "message": "Changes will be applied to {count, plural, one {# project} other {# projects}}." + }, "profile.bio.fallback.creator": { "message": "A Modrinth creator." }, @@ -2381,6 +2402,9 @@ "profile.button.set-affiliate": { "message": "Set as affiliate" }, + "profile.collection.projects-count": { + "message": "{count, plural, one {# project} other {# projects}}" + }, "profile.details.label.auth-providers": { "message": "Auth providers" }, @@ -2898,10 +2922,10 @@ "message": "Visit projects dashboard" }, "project.stats.downloads-label": { - "message": "download{count, plural, one {} other {s}}" + "message": "{count, plural, one {download} other {downloads}}" }, "project.stats.followers-label": { - "message": "follower{count, plural, one {} other {s}}" + "message": "{count, plural, one {follower} other {followers}}" }, "project.status.archived.message": { "message": "{title} has been archived. {title} will not receive any further updates unless the author decides to unarchive the project." diff --git a/apps/frontend/src/pages/[type]/[id].vue b/apps/frontend/src/pages/[type]/[id].vue index 0e4ae85771..bd1d122fda 100644 --- a/apps/frontend/src/pages/[type]/[id].vue +++ b/apps/frontend/src/pages/[type]/[id].vue @@ -1368,7 +1368,7 @@ const messages = defineMessages({ }, downloadsStat: { id: 'project.stats.downloads-label', - defaultMessage: 'download{count, plural, one {} other {s}}', + defaultMessage: '{count, plural, one {download} other {downloads}}', }, errorLoadingProject: { id: 'project.error.loading', @@ -1398,7 +1398,7 @@ const messages = defineMessages({ }, followersStat: { id: 'project.stats.followers-label', - defaultMessage: 'follower{count, plural, one {} other {s}}', + defaultMessage: '{count, plural, one {follower} other {followers}}', }, galleryTab: { id: 'project.gallery.title', diff --git a/apps/frontend/src/pages/admin/affiliates.vue b/apps/frontend/src/pages/admin/affiliates.vue index 92925757ce..aa7ac40e48 100644 --- a/apps/frontend/src/pages/admin/affiliates.vue +++ b/apps/frontend/src/pages/admin/affiliates.vue @@ -61,8 +61,10 @@ {{ userGroup.user.username }} - {{ userGroup.affiliates.length }} affiliate code{{ - userGroup.affiliates.length === 1 ? '' : 's' + {{ + formatMessage(messages.affiliateCodeCount, { + count: userGroup.affiliates.length, + }) }} @@ -92,9 +94,11 @@ import { Avatar, ButtonStyled, ConfirmModal, + defineMessages, injectModrinthClient, injectNotificationManager, StyledInput, + useVIntl, } from '@modrinth/ui' import type { User } from '@modrinth/utils' import { useQuery } from '@tanstack/vue-query' @@ -102,6 +106,14 @@ import { computed, ref } from 'vue' const client = injectModrinthClient() const { handleError } = injectNotificationManager() +const { formatMessage } = useVIntl() + +const messages = defineMessages({ + affiliateCodeCount: { + id: 'admin.affiliates.affiliate-code-count', + defaultMessage: '{count, plural, one {# affiliate code} other {# affiliate codes}}', + }, +}) type UserGroup = { user: User diff --git a/apps/frontend/src/pages/admin/servers/transfers.vue b/apps/frontend/src/pages/admin/servers/transfers.vue index 04627f4885..f8665953ff 100644 --- a/apps/frontend/src/pages/admin/servers/transfers.vue +++ b/apps/frontend/src/pages/admin/servers/transfers.vue @@ -65,7 +65,7 @@ - {{ batch.log_count }} transfer{{ batch.log_count === 1 ? '' : 's' }} + {{ formatMessage(messages.transferCount, { count: batch.log_count }) }} diff --git a/packages/ui/src/layouts/shared/content-tab/components/modals/ContentInstallModal.vue b/packages/ui/src/layouts/shared/content-tab/components/modals/ContentInstallModal.vue index 946d80c76f..8a351a180f 100644 --- a/packages/ui/src/layouts/shared/content-tab/components/modals/ContentInstallModal.vue +++ b/packages/ui/src/layouts/shared/content-tab/components/modals/ContentInstallModal.vue @@ -49,7 +49,13 @@ {{ formatMessage(messages.instanceType) }} - +
diff --git a/packages/ui/src/locales/en-US/index.json b/packages/ui/src/locales/en-US/index.json index 6aaafc3d41..81d5aa52b5 100644 --- a/packages/ui/src/locales/en-US/index.json +++ b/packages/ui/src/locales/en-US/index.json @@ -65,17 +65,8 @@ "billing.resubscribe-modal.failed-load": { "defaultMessage": "Failed to load subscription details." }, - "billing.resubscribe-modal.interval.five-days": { - "defaultMessage": "/5 days" - }, - "billing.resubscribe-modal.interval.monthly": { - "defaultMessage": "/month" - }, - "billing.resubscribe-modal.interval.quarterly": { - "defaultMessage": "/quarter" - }, - "billing.resubscribe-modal.interval.yearly": { - "defaultMessage": "/year" + "billing.resubscribe-modal.interval": { + "defaultMessage": "{intervalOption, select, fiveDays {/5 days} monthly {/month} quarterly {/quarter} yearly {/year} other {{interval}}}" }, "billing.resubscribe-modal.next-charge": { "defaultMessage": "Your next charge will be on {date}." @@ -2334,7 +2325,7 @@ "defaultMessage": "JCB" }, "payment-method.mastercard": { - "defaultMessage": "MasterCard" + "defaultMessage": "Mastercard" }, "payment-method.paypal": { "defaultMessage": "PayPal" @@ -3411,7 +3402,7 @@ "defaultMessage": "No servers yet" }, "servers.list-empty.one-click-mod-installs-description": { - "defaultMessage": "Pick your favourite mods and we handle the rest." + "defaultMessage": "Pick your favorite mods and we handle the rest." }, "servers.list-empty.one-click-mod-installs-title": { "defaultMessage": "One-click mod installs" @@ -3450,16 +3441,16 @@ "defaultMessage": "New" }, "servers.listing.notice.files-kept-for-download": { - "defaultMessage": "Your files will be kept for {daysRemaining} more {daysRemaining, plural, one {day} other {days} }. Contact support to download the files before they are deleted. " + "defaultMessage": "Your files will be kept for {daysRemaining} more {daysRemaining, plural, one {day} other {days}}. Contact support to download the files before they are deleted." }, "servers.listing.notice.files-preserved-after-cancellation": { "defaultMessage": "Your files will be preserved for 30 days after cancellation." }, "servers.listing.notice.moderated": { - "defaultMessage": "Your server has been suspended by moderation action. " + "defaultMessage": "Your server has been suspended by moderation action." }, "servers.listing.notice.pending-change": { - "defaultMessage": "Your server will {verb} to the {planSize} Plan on {formattedDate}. " + "defaultMessage": "Your server will {verb, select, downgrade {downgrade} other {upgrade}} to the {planSize} Plan on {formattedDate}." }, "servers.listing.notice.provisioning": { "defaultMessage": "Please wait while we set up your server. This can take up to 10 minutes." @@ -3468,7 +3459,7 @@ "defaultMessage": "Your subscription was cancelled." }, "servers.listing.notice.subscription-cancelled-on-date": { - "defaultMessage": "Your subscription was cancelled on {formattedDate}. " + "defaultMessage": "Your subscription was cancelled on {formattedDate}." }, "servers.listing.notice.subscription-cancelled-payment-failed": { "defaultMessage": "Your subscription was cancelled due to payment failure." @@ -3653,6 +3644,9 @@ "servers.purchase.step.payment.title": { "defaultMessage": "Payment method" }, + "servers.purchase.step.plan.billed": { + "defaultMessage": "billed {interval, select, monthly {monthly} quarterly {quarterly} yearly {yearly} other {{interval}}}" + }, "servers.purchase.step.plan.billing-subtitle": { "defaultMessage": "Available in North America, Europe, and Southeast Asia." }, diff --git a/packages/ui/src/utils/common-messages.ts b/packages/ui/src/utils/common-messages.ts index 2c5fc25b02..525539b4cf 100644 --- a/packages/ui/src/utils/common-messages.ts +++ b/packages/ui/src/utils/common-messages.ts @@ -1083,7 +1083,7 @@ export const paymentMethodMessages = defineMessages({ }, mastercard: { id: 'payment-method.mastercard', - defaultMessage: 'MasterCard', + defaultMessage: 'Mastercard', }, paypal: { id: 'payment-method.paypal', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6373263bbc..b34f6590af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,6 +25,9 @@ importers: '@types/node': specifier: ^24 version: 24.12.2 + '@typescript-eslint/typescript-estree': + specifier: ^8.59.2 + version: 8.59.2(typescript@5.9.3) '@vue/compiler-dom': specifier: ^3.5.26 version: 3.5.27 @@ -170,7 +173,7 @@ importers: devDependencies: '@eslint/compat': specifier: ^1.1.1 - version: 1.4.1(eslint@9.39.2(jiti@1.21.7)) + version: 1.4.1(eslint@9.39.2(jiti@2.6.1)) '@formatjs/cli': specifier: ^6.2.12 version: 6.12.2(@vue/compiler-core@3.5.27)(vue@3.5.27(typescript@5.9.3)) @@ -179,22 +182,22 @@ importers: version: link:../../packages/tooling-config '@nuxt/eslint-config': specifier: ^0.5.6 - version: 0.5.7(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + version: 0.5.7(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@taijased/vue-render-tracker': specifier: ^1.0.7 version: 1.0.7(vue@3.5.27(typescript@5.9.3)) '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.4(vite@8.0.3(@types/node@24.12.2)(esbuild@0.27.3)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) + version: 6.0.4(vite@8.0.3(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) autoprefixer: specifier: ^10.4.19 version: 10.4.24(postcss@8.5.6) eslint: specifier: ^9.9.1 - version: 9.39.2(jiti@1.21.7) + version: 9.39.2(jiti@2.6.1) eslint-plugin-turbo: specifier: ^2.5.4 - version: 2.8.2(eslint@9.39.2(jiti@1.21.7))(turbo@2.8.2) + version: 2.8.2(eslint@9.39.2(jiti@2.6.1))(turbo@2.8.2) postcss: specifier: ^8.4.39 version: 8.5.6 @@ -212,7 +215,7 @@ importers: version: 5.9.3 vite: specifier: ^8.0.0 - version: 8.0.3(@types/node@24.12.2)(esbuild@0.27.3)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) + version: 8.0.3(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) vue-component-type-helpers: specifier: ^3.1.8 version: 3.2.4 @@ -775,7 +778,7 @@ importers: version: 5.2.4(vite@5.4.21(@types/node@24.12.2)(lightningcss@1.32.0)(sass@1.97.3)(terser@5.46.0))(vue@3.5.27(typescript@5.9.3)) eslint-plugin-storybook: specifier: ^10.1.10 - version: 10.2.4(eslint@9.39.2(jiti@2.6.1))(storybook@10.2.4(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + version: 10.2.4(eslint@9.39.2(jiti@1.21.7))(storybook@10.2.4(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) storybook: specifier: ^10.1.10 version: 10.2.4(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -4548,6 +4551,12 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.59.2': + resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/scope-manager@8.54.0': resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4558,6 +4567,12 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.59.2': + resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/type-utils@8.54.0': resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4569,12 +4584,22 @@ packages: resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.59.2': + resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.54.0': resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.59.2': + resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.54.0': resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4586,6 +4611,10 @@ packages: resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.59.2': + resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -5249,6 +5278,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + bare-events@2.8.2: resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} peerDependencies: @@ -5299,6 +5332,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -6112,6 +6149,10 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.2: resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -7505,6 +7546,10 @@ packages: resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} engines: {node: 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -9171,6 +9216,12 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -11125,12 +11176,6 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@1.4.1(eslint@9.39.2(jiti@1.21.7))': - dependencies: - '@eslint/core': 0.17.0 - optionalDependencies: - eslint: 9.39.2(jiti@1.21.7) - '@eslint/compat@1.4.1(eslint@9.39.2(jiti@2.6.1))': dependencies: '@eslint/core': 0.17.0 @@ -11756,31 +11801,6 @@ snapshots: - utf-8-validate - vue - '@nuxt/eslint-config@0.5.7(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': - dependencies: - '@eslint/js': 9.39.2 - '@nuxt/eslint-plugin': 0.5.7(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@stylistic/eslint-plugin': 2.13.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - eslint: 9.39.2(jiti@1.21.7) - eslint-config-flat-gitignore: 0.3.0(eslint@9.39.2(jiti@1.21.7)) - eslint-flat-config-utils: 0.4.0 - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-jsdoc: 50.8.0(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-regexp: 2.10.0(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-unicorn: 55.0.0(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-vue: 9.33.0(eslint@9.39.2(jiti@1.21.7)) - globals: 15.15.0 - local-pkg: 0.5.1 - pathe: 1.1.2 - vue-eslint-parser: 9.4.3(eslint@9.39.2(jiti@1.21.7)) - transitivePeerDependencies: - - '@typescript-eslint/utils' - - eslint-import-resolver-node - - supports-color - - typescript - '@nuxt/eslint-config@0.5.7(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint/js': 9.39.2 @@ -11806,15 +11826,6 @@ snapshots: - supports-color - typescript - '@nuxt/eslint-plugin@0.5.7(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - eslint: 9.39.2(jiti@1.21.7) - transitivePeerDependencies: - - supports-color - - typescript - '@nuxt/eslint-plugin@0.5.7(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.54.0 @@ -13289,18 +13300,6 @@ snapshots: '@stripe/stripe-js@7.9.0': {} - '@stylistic/eslint-plugin@2.13.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - eslint: 9.39.2(jiti@1.21.7) - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - estraverse: 5.3.0 - picomatch: 4.0.3 - transitivePeerDependencies: - - supports-color - - typescript - '@stylistic/eslint-plugin@2.13.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -13713,22 +13712,6 @@ snapshots: dependencies: '@types/node': 24.12.2 - '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.54.0 - eslint: 9.39.2(jiti@1.21.7) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -13745,34 +13728,31 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 - eslint: 9.39.2(jiti@1.21.7) + eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.59.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@5.9.3) + '@typescript-eslint/types': 8.59.2 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -13787,17 +13767,9 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - debug: 4.4.3 - eslint: 9.39.2(jiti@1.21.7) - ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 - transitivePeerDependencies: - - supports-color '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: @@ -13813,6 +13785,8 @@ snapshots: '@typescript-eslint/types@8.54.0': {} + '@typescript-eslint/types@8.59.2': {} + '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) @@ -13828,6 +13802,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.59.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.59.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@5.9.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) @@ -13855,6 +13844,11 @@ snapshots: '@typescript-eslint/types': 8.54.0 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.59.2': + dependencies: + '@typescript-eslint/types': 8.59.2 + eslint-visitor-keys: 5.0.1 + '@ungap/structured-clone@1.3.0': {} '@unhead/vue@2.1.2(vue@3.5.27(typescript@5.9.3))': @@ -13969,12 +13963,6 @@ snapshots: vite: 7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) vue: 3.5.27(typescript@5.9.3) - '@vitejs/plugin-vue@6.0.4(vite@8.0.3(@types/node@24.12.2)(esbuild@0.27.3)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))': - dependencies: - '@rolldown/pluginutils': 1.0.0-rc.2 - vite: 8.0.3(@types/node@24.12.2)(esbuild@0.27.3)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) - vue: 3.5.27(typescript@5.9.3) - '@vitejs/plugin-vue@6.0.4(vite@8.0.3(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 @@ -14716,6 +14704,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + bare-events@2.8.2: {} base-64@1.0.0: {} @@ -14764,6 +14754,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -15504,12 +15498,6 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-flat-gitignore@0.3.0(eslint@9.39.2(jiti@1.21.7)): - dependencies: - '@eslint/compat': 1.4.1(eslint@9.39.2(jiti@1.21.7)) - eslint: 9.39.2(jiti@1.21.7) - find-up-simple: 1.0.1 - eslint-config-flat-gitignore@0.3.0(eslint@9.39.2(jiti@2.6.1)): dependencies: '@eslint/compat': 1.4.1(eslint@9.39.2(jiti@2.6.1)) @@ -15531,23 +15519,6 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7)): - dependencies: - '@typescript-eslint/types': 8.54.0 - comment-parser: 1.4.5 - debug: 4.4.3 - eslint: 9.39.2(jiti@1.21.7) - eslint-import-context: 0.1.9(unrs-resolver@1.11.1) - is-glob: 4.0.3 - minimatch: 10.1.2 - semver: 7.7.3 - stable-hash-x: 0.2.0 - unrs-resolver: 1.11.1 - optionalDependencies: - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - transitivePeerDependencies: - - supports-color - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): dependencies: '@typescript-eslint/types': 8.54.0 @@ -15565,22 +15536,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jsdoc@50.8.0(eslint@9.39.2(jiti@1.21.7)): - dependencies: - '@es-joy/jsdoccomment': 0.50.2 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint: 9.39.2(jiti@1.21.7) - espree: 10.4.0 - esquery: 1.7.0 - parse-imports-exports: 0.2.4 - semver: 7.7.3 - spdx-expression-parse: 4.0.0 - transitivePeerDependencies: - - supports-color - eslint-plugin-jsdoc@50.8.0(eslint@9.39.2(jiti@2.6.1)): dependencies: '@es-joy/jsdoccomment': 0.50.2 @@ -15606,17 +15561,6 @@ snapshots: optionalDependencies: eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-regexp@2.10.0(eslint@9.39.2(jiti@1.21.7)): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) - '@eslint-community/regexpp': 4.12.2 - comment-parser: 1.4.5 - eslint: 9.39.2(jiti@1.21.7) - jsdoc-type-pratt-parser: 4.8.0 - refa: 0.12.1 - regexp-ast-analysis: 0.7.1 - scslre: 0.3.0 - eslint-plugin-regexp@2.10.0(eslint@9.39.2(jiti@2.6.1)): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) @@ -15632,47 +15576,21 @@ snapshots: dependencies: eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-storybook@10.2.4(eslint@9.39.2(jiti@2.6.1))(storybook@10.2.4(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3): + eslint-plugin-storybook@10.2.4(eslint@9.39.2(jiti@1.21.7))(storybook@10.2.4(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) storybook: 10.2.4(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-turbo@2.8.2(eslint@9.39.2(jiti@1.21.7))(turbo@2.8.2): - dependencies: - dotenv: 16.0.3 - eslint: 9.39.2(jiti@1.21.7) - turbo: 2.8.2 - eslint-plugin-turbo@2.8.2(eslint@9.39.2(jiti@2.6.1))(turbo@2.8.2): dependencies: dotenv: 16.0.3 eslint: 9.39.2(jiti@2.6.1) turbo: 2.8.2 - eslint-plugin-unicorn@55.0.0(eslint@9.39.2(jiti@1.21.7)): - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) - ci-info: 4.4.0 - clean-regexp: 1.0.0 - core-js-compat: 3.48.0 - eslint: 9.39.2(jiti@1.21.7) - esquery: 1.7.0 - globals: 15.15.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.1.0 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.10.0 - semver: 7.7.3 - strip-indent: 3.0.0 - eslint-plugin-unicorn@55.0.0(eslint@9.39.2(jiti@2.6.1)): dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -15707,20 +15625,6 @@ snapshots: '@stylistic/eslint-plugin': 2.13.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-vue@9.33.0(eslint@9.39.2(jiti@1.21.7)): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) - eslint: 9.39.2(jiti@1.21.7) - globals: 13.24.0 - natural-compare: 1.4.0 - nth-check: 2.1.1 - postcss-selector-parser: 6.1.2 - semver: 7.7.3 - vue-eslint-parser: 9.4.3(eslint@9.39.2(jiti@1.21.7)) - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - supports-color - eslint-plugin-vue@9.33.0(eslint@9.39.2(jiti@2.6.1)): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) @@ -15749,6 +15653,8 @@ snapshots: eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.1: {} + eslint@9.39.2(jiti@1.21.7): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) @@ -17571,6 +17477,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.1 + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -19677,6 +19587,10 @@ snapshots: dependencies: typescript: 5.9.3 + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-dedent@2.2.0: {} ts-interface-checker@0.1.13: {} @@ -20142,22 +20056,6 @@ snapshots: terser: 5.46.0 yaml: 2.8.2 - vite@8.0.3(@types/node@24.12.2)(esbuild@0.27.3)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2): - dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.8 - rolldown: 1.0.0-rc.12 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 24.12.2 - esbuild: 0.27.3 - fsevents: 2.3.3 - jiti: 1.21.7 - sass: 1.97.3 - terser: 5.46.0 - yaml: 2.8.2 - vite@8.0.3(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2): dependencies: lightningcss: 1.32.0 @@ -20334,19 +20232,6 @@ snapshots: transitivePeerDependencies: - supports-color - vue-eslint-parser@9.4.3(eslint@9.39.2(jiti@1.21.7)): - dependencies: - debug: 4.4.3 - eslint: 9.39.2(jiti@1.21.7) - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.7.0 - lodash: 4.17.23 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - vue-eslint-parser@9.4.3(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 4.4.3 diff --git a/scripts/coverage-i18n.ts b/scripts/coverage-i18n.ts index 499e904193..c28636ed99 100644 --- a/scripts/coverage-i18n.ts +++ b/scripts/coverage-i18n.ts @@ -1,18 +1,18 @@ -import { parse as parseVue } from '@vue/compiler-sfc' +import type { TSESTree } from '@typescript-eslint/typescript-estree' +import { AST_NODE_TYPES, parse as parseTs } from '@typescript-eslint/typescript-estree' import { - parse as parseTemplate, NodeTypes, + parse as parseTemplate, + type AttributeNode, + type ElementNode, type RootNode, type TemplateChildNode, - type ElementNode, - type AttributeNode, type TextNode, } from '@vue/compiler-dom' -import { parse as parseTs, AST_NODE_TYPES } from '@typescript-eslint/typescript-estree' -import type { TSESTree } from '@typescript-eslint/typescript-estree' +import { parse as parseVue } from '@vue/compiler-sfc' import chalk from 'chalk' -import * as fs from 'fs' -import * as path from 'path' +import * as fs from 'node:fs' +import * as path from 'node:path' interface FileResult { path: string @@ -77,7 +77,13 @@ const TRANSLATABLE_ATTRS = new Set([ ]) // i18n symbols that indicate i18n usage -const I18N_SYMBOLS = ['useVIntl', 'defineMessage', 'defineMessages', 'IntlFormatted', 'useI18n'] as const +const I18N_SYMBOLS = [ + 'useVIntl', + 'defineMessage', + 'defineMessages', + 'IntlFormatted', + 'useI18n', +] as const const I18N_CALL_PATTERNS = ['formatMessage', '$t'] as const function findVueFiles(dir: string): string[] { @@ -88,7 +94,11 @@ function findVueFiles(dir: string): string[] { for (const entry of entries) { const fullPath = path.join(currentDir, entry.name) if (entry.isDirectory()) { - if (!entry.name.startsWith('.') && entry.name !== 'node_modules' && entry.name !== 'legal') { + if ( + !entry.name.startsWith('.') && + entry.name !== 'node_modules' && + entry.name !== 'legal' + ) { walk(fullPath) } } else if (entry.isFile() && entry.name.endsWith('.vue')) { @@ -207,8 +217,13 @@ function countI18nCallsInExpression(expression: string): number { } } // Also handle this.formatMessage() or intl.formatMessage() - if (callee.type === AST_NODE_TYPES.MemberExpression && callee.property.type === AST_NODE_TYPES.Identifier) { - if (I18N_CALL_PATTERNS.includes(callee.property.name as (typeof I18N_CALL_PATTERNS)[number])) { + if ( + callee.type === AST_NODE_TYPES.MemberExpression && + callee.property.type === AST_NODE_TYPES.Identifier + ) { + if ( + I18N_CALL_PATTERNS.includes(callee.property.name as (typeof I18N_CALL_PATTERNS)[number]) + ) { count++ } } @@ -553,11 +568,7 @@ function main() { const rootDir = path.resolve(__dirname, '..') // Directories to scan for Vue files - const scanDirs = [ - 'apps/frontend/src', - 'apps/app-frontend/src', - 'packages/ui/src', - ] + const scanDirs = ['apps/frontend/src', 'apps/app-frontend/src', 'packages/ui/src'] if (!jsonOutput) { console.log()