From 3cb75f67c1fe342564abce0acd4aba95b64324b1 Mon Sep 17 00:00:00 2001 From: Wes Cole Date: Mon, 6 Oct 2025 10:17:16 -0400 Subject: [PATCH 01/19] Add the react, app-connect, and localizaton packages. --- .gitignore | 10 + AGENTS.md | 23 + README.md | 210 +- packages/.DS_Store | Bin 0 -> 6148 bytes packages/app-connect/.DS_Store | Bin 0 -> 6148 bytes packages/app-connect/Agents.md | 19 + packages/app-connect/README.md | 302 + packages/app-connect/biome.json | 20 + packages/app-connect/package.json | 77 + packages/app-connect/pnpm-lock.yaml | 8533 +++++++++++++++ packages/app-connect/src/.DS_Store | Bin 0 -> 6148 bytes packages/app-connect/src/errors/base-error.ts | 44 + .../src/errors/verification-errors.test.ts | 120 + .../src/errors/verification-errors.ts | 136 + packages/app-connect/src/express/index.ts | 56 + packages/app-connect/src/index.ts | 40 + packages/app-connect/src/next/index.ts | 30 + packages/app-connect/src/tanstack/index.ts | 78 + .../app-connect/src/types/error-schema.ts | 32 + packages/app-connect/src/types/result.ts | 30 + .../src/types/verifiable-request.ts | 23 + packages/app-connect/src/utils/config.ts | 68 + packages/app-connect/src/utils/logger.ts | 24 + packages/app-connect/src/utils/strings.ts | 17 + .../src/utils/verification.test.ts | 213 + .../app-connect/src/utils/verification.ts | 456 + packages/app-connect/src/utils/webhook.ts | 248 + packages/app-connect/tsconfig.json | 17 + packages/app-connect/tsdown.config.ts | 13 + packages/eslint-config-godaddy/README.md | 63 +- packages/localizations/.DS_Store | Bin 0 -> 6148 bytes packages/localizations/README.md | 65 + packages/localizations/package.json | 38 + packages/localizations/src/deDe.ts | 340 + packages/localizations/src/enIe.ts | 316 + packages/localizations/src/enUs.ts | 316 + packages/localizations/src/esAr.ts | 323 + packages/localizations/src/esCl.ts | 325 + packages/localizations/src/esCo.ts | 323 + packages/localizations/src/esEs.ts | 328 + packages/localizations/src/esMx.ts | 324 + packages/localizations/src/esPe.ts | 323 + packages/localizations/src/esUs.ts | 323 + packages/localizations/src/frCa.ts | 342 + packages/localizations/src/frFr.ts | 345 + packages/localizations/src/idId.ts | 316 + packages/localizations/src/index.ts | 20 + packages/localizations/src/itIt.ts | 340 + packages/localizations/src/ptBr.ts | 321 + packages/localizations/src/qaPs.ts | 325 + packages/localizations/src/trTr.ts | 316 + packages/localizations/src/viVn.ts | 316 + packages/localizations/src/zhCn.ts | 307 + packages/localizations/src/zhSg.ts | 307 + packages/localizations/tsconfig.json | 15 + packages/localizations/tsdown.config.ts | 8 + packages/react/.DS_Store | Bin 0 -> 6148 bytes packages/react/CHANGELOG.md | 291 + packages/react/README.md | 100 + packages/react/components.json | 21 + packages/react/package.json | 115 + packages/react/src/.DS_Store | Bin 0 -> 6148 bytes packages/react/src/components/.DS_Store | Bin 0 -> 6148 bytes .../checkout/address/address-form.tsx | 760 ++ .../checkout/address/country-region-data.ts | 6291 +++++++++++ .../checkout/address/get-country-region.ts | 39 + .../src/components/checkout/address/index.ts | 2 + .../address/utils/check-is-valid-address.ts | 26 + .../address/utils/check-is-valid-phone.ts | 7 + .../checkout/address/utils/format-address.ts | 38 + .../address/utils/is-address-complete.ts | 21 + .../utils/map-address-fields-to-input.ts | 17 + .../address/utils/use-address-matches.ts | 27 + .../address/utils/use-address-verification.ts | 57 + .../checkout/checkout-section-header.tsx | 31 + .../components/checkout/checkout-section.tsx | 16 + .../components/checkout/checkout-skeleton.tsx | 129 + .../src/components/checkout/checkout.tsx | 533 + .../checkout/contact/contact-form.tsx | 113 + .../checkout/contact/phone-input.tsx | 295 + .../checkout/delivery/delivery-method.tsx | 164 + .../utils/use-apply-delivery-method.ts | 18 + .../utils/use-apply-fulfillment-location.ts | 49 + .../discount/discount-apply-button.tsx | 43 + .../checkout/discount/discount-error-list.tsx | 26 + .../checkout/discount/discount-input.tsx | 41 + .../checkout/discount/discount-standalone.tsx | 252 + .../checkout/discount/discount-tag.tsx | 40 + .../checkout/discount/discounts.tsx | 31 + .../src/components/checkout/discount/index.ts | 6 + .../src/components/checkout/discount/types.ts | 11 + .../discount/utils/use-discount-apply.ts | 58 + .../utils/use-get-price-adjustments.ts | 34 + .../checkout/express-checkout/apple-pay.tsx | 24 + .../express-checkout-buttons.tsx | 90 + .../express-checkout/express-checkout.tsx | 150 + .../checkout/form/checkout-error-list.tsx | 51 + .../checkout/form/checkout-form-container.tsx | 86 + .../checkout/form/checkout-form.tsx | 491 + .../checkout/form/custom-form-provider.tsx | 146 + .../utils/get-required-fields-from-schema.ts | 49 + .../components/checkout/line-items/index.ts | 1 + .../line-items/line-item-skeleton.tsx | 33 + .../checkout/line-items/line-items.tsx | 174 + .../components/checkout/notes/notes-form.tsx | 95 + .../order/use-draft-order-products.ts | 42 + .../checkout/order/use-draft-order-sync.ts | 327 + .../checkout/order/use-draft-order-totals.ts | 18 + .../checkout/order/use-draft-order.ts | 39 + .../order/use-try-update-draft-order.ts | 26 + .../checkout/order/use-update-order.ts | 45 + .../checkout/order/use-update-taxes.ts | 65 + .../components/checkout/payment/card-icon.tsx | 53 + .../components/checkout/payment/card-info.ts | 300 + .../checkout-buttons/credit-card/godaddy.tsx | 46 + .../checkout-buttons/credit-card/square.tsx | 85 + .../checkout-buttons/credit-card/stripe.tsx | 39 + .../checkout-buttons/express/godaddy.tsx | 1192 +++ .../checkout-buttons/express/stripe.tsx | 67 + .../checkout-buttons/googlePay/godaddy.tsx | 5 + .../checkout-buttons/offline/default.tsx | 59 + .../checkout-buttons/paypal/paypal.tsx | 161 + .../payment/checkout-buttons/paze/godaddy.tsx | 245 + .../checkout/payment/expiration-date.tsx | 60 + .../checkout/payment/free-payment-form.tsx | 68 + .../checkout/payment/icons/Amex.tsx | 20 + .../checkout/payment/icons/ApplePay.tsx | 99 + .../checkout/payment/icons/Discover.tsx | 31 + .../checkout/payment/icons/GooglePay.tsx | 44 + .../checkout/payment/icons/Mastercard.tsx | 31 + .../checkout/payment/icons/PayPal.tsx | 33 + .../checkout/payment/icons/Paze.tsx | 36 + .../checkout/payment/icons/Visa.tsx | 24 + .../payment/icons/payment-address-toggle.tsx | 146 + .../checkout/payment/lazy-payment-loader.tsx | 279 + .../checkout/payment/month-year-mask.tsx | 63 + .../checkout/payment/payment-form.tsx | 485 + .../payment/payment-method-renderer.tsx | 43 + .../payment-methods/credit-card/container.tsx | 58 + .../payment-methods/credit-card/godaddy.tsx | 264 + .../credit-card/godaddy.unused.tsx | 126 + .../payment-methods/credit-card/square.tsx | 86 + .../payment-methods/credit-card/stripe.tsx | 61 + .../src/components/checkout/payment/types.ts | 159 + .../payment/utils/conditional-providers.tsx | 74 + .../checkout/payment/utils/poynt-provider.tsx | 41 + .../payment/utils/square-provider.tsx | 35 + .../payment/utils/stripe-provider.tsx | 62 + .../utils/use-build-payment-request.ts | 554 + .../payment/utils/use-confirm-checkout.ts | 190 + .../utils/use-get-selected-payment-method.ts | 23 + .../payment/utils/use-is-payment-disabled.ts | 8 + .../payment/utils/use-load-poynt-collect.ts | 33 + .../checkout/payment/utils/use-load-square.ts | 35 + .../payment/utils/use-poynt-collect-cdn.ts | 20 + .../payment/utils/use-stripe-checkout.ts | 127 + .../utils/use-stripe-payment-intent.ts | 156 + .../checkout/pickup/format-time.test.ts | 37 + .../checkout/pickup/local-pickup.tsx | 806 ++ .../pickup/utils/build-pickup-payload.ts | 57 + .../shipping/shipping-method-skeleton.tsx | 35 + .../checkout/shipping/shipping-method.tsx | 245 + .../shipping/utils/filter-shipping-methods.ts | 41 + .../utils/use-apply-shipping-method.ts | 82 + .../utils/use-draft-order-shipping-methods.ts | 30 + .../utils/use-draft-order-shipping.ts | 18 + .../utils/use-get-shipping-methods.ts | 23 + .../utils/use-remove-shipping-method.ts | 69 + .../src/components/checkout/target/target.tsx | 53 + .../checkout/taxes/utils/use-get-taxes.ts | 25 + .../components/checkout/tips/tips-form.tsx | 207 + .../checkout/totals/totals-skeleton.tsx | 35 + .../src/components/checkout/totals/totals.tsx | 150 + .../totals/utils/use-is-order-free.ts | 11 + .../components/checkout/ui/floating-label.tsx | 55 + .../checkout/utils/checkout-transformers.ts | 201 + .../react/src/components/ui/accordion.tsx | 59 + .../react/src/components/ui/autocomplete.tsx | 207 + packages/react/src/components/ui/button.tsx | 65 + packages/react/src/components/ui/calendar.tsx | 74 + packages/react/src/components/ui/checkbox.tsx | 34 + .../react/src/components/ui/collapsible.tsx | 11 + packages/react/src/components/ui/command.tsx | 154 + packages/react/src/components/ui/dialog.tsx | 122 + packages/react/src/components/ui/form.tsx | 189 + packages/react/src/components/ui/input.tsx | 33 + packages/react/src/components/ui/label.tsx | 24 + packages/react/src/components/ui/popover.tsx | 31 + .../react/src/components/ui/radio-group.tsx | 42 + .../react/src/components/ui/scroll-area.tsx | 46 + packages/react/src/components/ui/select.tsx | 172 + packages/react/src/components/ui/sheet.tsx | 140 + packages/react/src/components/ui/skeleton.tsx | 18 + packages/react/src/components/ui/switch.tsx | 27 + packages/react/src/components/ui/textarea.tsx | 26 + packages/react/src/components/ui/tooltip.tsx | 32 + packages/react/src/globals.css | 137 + packages/react/src/godaddy-provider.tsx | 120 + packages/react/src/hooks/use-mobile.tsx | 23 + packages/react/src/hooks/use-theme.tsx | 28 + packages/react/src/hooks/use-variables.tsx | 65 + packages/react/src/index.ts | 19 + packages/react/src/lib/godaddy/godaddy.ts | 489 + .../react/src/lib/godaddy/graphql-env.d.ts | 187 + packages/react/src/lib/godaddy/mutations.ts | 383 + packages/react/src/lib/godaddy/queries.ts | 523 + packages/react/src/lib/graphql-with-errors.ts | 54 + packages/react/src/lib/utils.ts | 6 + packages/react/src/preflight.css | 386 + packages/react/src/server.ts | 109 + packages/react/src/tests/setup.ts | 1 + .../react/src/tracking/event-properties.ts | 79 + packages/react/src/tracking/events.ts | 62 + packages/react/src/tracking/track.tsx | 246 + .../react/src/tracking/tracking-provider.tsx | 99 + packages/react/src/types.ts | 186 + packages/react/tsconfig.json | 29 + packages/react/tsdown.config.ts | 22 + packages/react/vitest.config.ts | 19 + pnpm-lock.yaml | 9332 ++++++++++++++--- 220 files changed, 49873 insertions(+), 1421 deletions(-) create mode 100644 AGENTS.md create mode 100644 packages/.DS_Store create mode 100644 packages/app-connect/.DS_Store create mode 100644 packages/app-connect/Agents.md create mode 100644 packages/app-connect/README.md create mode 100644 packages/app-connect/biome.json create mode 100644 packages/app-connect/package.json create mode 100644 packages/app-connect/pnpm-lock.yaml create mode 100644 packages/app-connect/src/.DS_Store create mode 100644 packages/app-connect/src/errors/base-error.ts create mode 100644 packages/app-connect/src/errors/verification-errors.test.ts create mode 100644 packages/app-connect/src/errors/verification-errors.ts create mode 100644 packages/app-connect/src/express/index.ts create mode 100644 packages/app-connect/src/index.ts create mode 100644 packages/app-connect/src/next/index.ts create mode 100644 packages/app-connect/src/tanstack/index.ts create mode 100644 packages/app-connect/src/types/error-schema.ts create mode 100644 packages/app-connect/src/types/result.ts create mode 100644 packages/app-connect/src/types/verifiable-request.ts create mode 100644 packages/app-connect/src/utils/config.ts create mode 100644 packages/app-connect/src/utils/logger.ts create mode 100644 packages/app-connect/src/utils/strings.ts create mode 100644 packages/app-connect/src/utils/verification.test.ts create mode 100644 packages/app-connect/src/utils/verification.ts create mode 100644 packages/app-connect/src/utils/webhook.ts create mode 100644 packages/app-connect/tsconfig.json create mode 100644 packages/app-connect/tsdown.config.ts create mode 100644 packages/localizations/.DS_Store create mode 100644 packages/localizations/README.md create mode 100644 packages/localizations/package.json create mode 100644 packages/localizations/src/deDe.ts create mode 100644 packages/localizations/src/enIe.ts create mode 100644 packages/localizations/src/enUs.ts create mode 100644 packages/localizations/src/esAr.ts create mode 100644 packages/localizations/src/esCl.ts create mode 100644 packages/localizations/src/esCo.ts create mode 100644 packages/localizations/src/esEs.ts create mode 100644 packages/localizations/src/esMx.ts create mode 100644 packages/localizations/src/esPe.ts create mode 100644 packages/localizations/src/esUs.ts create mode 100644 packages/localizations/src/frCa.ts create mode 100644 packages/localizations/src/frFr.ts create mode 100644 packages/localizations/src/idId.ts create mode 100644 packages/localizations/src/index.ts create mode 100644 packages/localizations/src/itIt.ts create mode 100644 packages/localizations/src/ptBr.ts create mode 100644 packages/localizations/src/qaPs.ts create mode 100644 packages/localizations/src/trTr.ts create mode 100644 packages/localizations/src/viVn.ts create mode 100644 packages/localizations/src/zhCn.ts create mode 100644 packages/localizations/src/zhSg.ts create mode 100644 packages/localizations/tsconfig.json create mode 100644 packages/localizations/tsdown.config.ts create mode 100644 packages/react/.DS_Store create mode 100644 packages/react/CHANGELOG.md create mode 100644 packages/react/README.md create mode 100644 packages/react/components.json create mode 100644 packages/react/package.json create mode 100644 packages/react/src/.DS_Store create mode 100644 packages/react/src/components/.DS_Store create mode 100644 packages/react/src/components/checkout/address/address-form.tsx create mode 100644 packages/react/src/components/checkout/address/country-region-data.ts create mode 100644 packages/react/src/components/checkout/address/get-country-region.ts create mode 100644 packages/react/src/components/checkout/address/index.ts create mode 100644 packages/react/src/components/checkout/address/utils/check-is-valid-address.ts create mode 100644 packages/react/src/components/checkout/address/utils/check-is-valid-phone.ts create mode 100644 packages/react/src/components/checkout/address/utils/format-address.ts create mode 100644 packages/react/src/components/checkout/address/utils/is-address-complete.ts create mode 100644 packages/react/src/components/checkout/address/utils/map-address-fields-to-input.ts create mode 100644 packages/react/src/components/checkout/address/utils/use-address-matches.ts create mode 100644 packages/react/src/components/checkout/address/utils/use-address-verification.ts create mode 100644 packages/react/src/components/checkout/checkout-section-header.tsx create mode 100644 packages/react/src/components/checkout/checkout-section.tsx create mode 100644 packages/react/src/components/checkout/checkout-skeleton.tsx create mode 100644 packages/react/src/components/checkout/checkout.tsx create mode 100644 packages/react/src/components/checkout/contact/contact-form.tsx create mode 100644 packages/react/src/components/checkout/contact/phone-input.tsx create mode 100644 packages/react/src/components/checkout/delivery/delivery-method.tsx create mode 100644 packages/react/src/components/checkout/delivery/utils/use-apply-delivery-method.ts create mode 100644 packages/react/src/components/checkout/delivery/utils/use-apply-fulfillment-location.ts create mode 100644 packages/react/src/components/checkout/discount/discount-apply-button.tsx create mode 100644 packages/react/src/components/checkout/discount/discount-error-list.tsx create mode 100644 packages/react/src/components/checkout/discount/discount-input.tsx create mode 100644 packages/react/src/components/checkout/discount/discount-standalone.tsx create mode 100644 packages/react/src/components/checkout/discount/discount-tag.tsx create mode 100644 packages/react/src/components/checkout/discount/discounts.tsx create mode 100644 packages/react/src/components/checkout/discount/index.ts create mode 100644 packages/react/src/components/checkout/discount/types.ts create mode 100644 packages/react/src/components/checkout/discount/utils/use-discount-apply.ts create mode 100644 packages/react/src/components/checkout/discount/utils/use-get-price-adjustments.ts create mode 100644 packages/react/src/components/checkout/express-checkout/apple-pay.tsx create mode 100644 packages/react/src/components/checkout/express-checkout/express-checkout-buttons.tsx create mode 100644 packages/react/src/components/checkout/express-checkout/express-checkout.tsx create mode 100644 packages/react/src/components/checkout/form/checkout-error-list.tsx create mode 100644 packages/react/src/components/checkout/form/checkout-form-container.tsx create mode 100644 packages/react/src/components/checkout/form/checkout-form.tsx create mode 100644 packages/react/src/components/checkout/form/custom-form-provider.tsx create mode 100644 packages/react/src/components/checkout/form/utils/get-required-fields-from-schema.ts create mode 100644 packages/react/src/components/checkout/line-items/index.ts create mode 100644 packages/react/src/components/checkout/line-items/line-item-skeleton.tsx create mode 100644 packages/react/src/components/checkout/line-items/line-items.tsx create mode 100644 packages/react/src/components/checkout/notes/notes-form.tsx create mode 100644 packages/react/src/components/checkout/order/use-draft-order-products.ts create mode 100644 packages/react/src/components/checkout/order/use-draft-order-sync.ts create mode 100644 packages/react/src/components/checkout/order/use-draft-order-totals.ts create mode 100644 packages/react/src/components/checkout/order/use-draft-order.ts create mode 100644 packages/react/src/components/checkout/order/use-try-update-draft-order.ts create mode 100644 packages/react/src/components/checkout/order/use-update-order.ts create mode 100644 packages/react/src/components/checkout/order/use-update-taxes.ts create mode 100644 packages/react/src/components/checkout/payment/card-icon.tsx create mode 100644 packages/react/src/components/checkout/payment/card-info.ts create mode 100644 packages/react/src/components/checkout/payment/checkout-buttons/credit-card/godaddy.tsx create mode 100644 packages/react/src/components/checkout/payment/checkout-buttons/credit-card/square.tsx create mode 100644 packages/react/src/components/checkout/payment/checkout-buttons/credit-card/stripe.tsx create mode 100644 packages/react/src/components/checkout/payment/checkout-buttons/express/godaddy.tsx create mode 100644 packages/react/src/components/checkout/payment/checkout-buttons/express/stripe.tsx create mode 100644 packages/react/src/components/checkout/payment/checkout-buttons/googlePay/godaddy.tsx create mode 100644 packages/react/src/components/checkout/payment/checkout-buttons/offline/default.tsx create mode 100644 packages/react/src/components/checkout/payment/checkout-buttons/paypal/paypal.tsx create mode 100644 packages/react/src/components/checkout/payment/checkout-buttons/paze/godaddy.tsx create mode 100644 packages/react/src/components/checkout/payment/expiration-date.tsx create mode 100644 packages/react/src/components/checkout/payment/free-payment-form.tsx create mode 100644 packages/react/src/components/checkout/payment/icons/Amex.tsx create mode 100644 packages/react/src/components/checkout/payment/icons/ApplePay.tsx create mode 100644 packages/react/src/components/checkout/payment/icons/Discover.tsx create mode 100644 packages/react/src/components/checkout/payment/icons/GooglePay.tsx create mode 100644 packages/react/src/components/checkout/payment/icons/Mastercard.tsx create mode 100644 packages/react/src/components/checkout/payment/icons/PayPal.tsx create mode 100644 packages/react/src/components/checkout/payment/icons/Paze.tsx create mode 100644 packages/react/src/components/checkout/payment/icons/Visa.tsx create mode 100644 packages/react/src/components/checkout/payment/icons/payment-address-toggle.tsx create mode 100644 packages/react/src/components/checkout/payment/lazy-payment-loader.tsx create mode 100644 packages/react/src/components/checkout/payment/month-year-mask.tsx create mode 100644 packages/react/src/components/checkout/payment/payment-form.tsx create mode 100644 packages/react/src/components/checkout/payment/payment-method-renderer.tsx create mode 100644 packages/react/src/components/checkout/payment/payment-methods/credit-card/container.tsx create mode 100644 packages/react/src/components/checkout/payment/payment-methods/credit-card/godaddy.tsx create mode 100644 packages/react/src/components/checkout/payment/payment-methods/credit-card/godaddy.unused.tsx create mode 100644 packages/react/src/components/checkout/payment/payment-methods/credit-card/square.tsx create mode 100644 packages/react/src/components/checkout/payment/payment-methods/credit-card/stripe.tsx create mode 100644 packages/react/src/components/checkout/payment/types.ts create mode 100644 packages/react/src/components/checkout/payment/utils/conditional-providers.tsx create mode 100644 packages/react/src/components/checkout/payment/utils/poynt-provider.tsx create mode 100644 packages/react/src/components/checkout/payment/utils/square-provider.tsx create mode 100644 packages/react/src/components/checkout/payment/utils/stripe-provider.tsx create mode 100644 packages/react/src/components/checkout/payment/utils/use-build-payment-request.ts create mode 100644 packages/react/src/components/checkout/payment/utils/use-confirm-checkout.ts create mode 100644 packages/react/src/components/checkout/payment/utils/use-get-selected-payment-method.ts create mode 100644 packages/react/src/components/checkout/payment/utils/use-is-payment-disabled.ts create mode 100644 packages/react/src/components/checkout/payment/utils/use-load-poynt-collect.ts create mode 100644 packages/react/src/components/checkout/payment/utils/use-load-square.ts create mode 100644 packages/react/src/components/checkout/payment/utils/use-poynt-collect-cdn.ts create mode 100644 packages/react/src/components/checkout/payment/utils/use-stripe-checkout.ts create mode 100644 packages/react/src/components/checkout/payment/utils/use-stripe-payment-intent.ts create mode 100644 packages/react/src/components/checkout/pickup/format-time.test.ts create mode 100644 packages/react/src/components/checkout/pickup/local-pickup.tsx create mode 100644 packages/react/src/components/checkout/pickup/utils/build-pickup-payload.ts create mode 100644 packages/react/src/components/checkout/shipping/shipping-method-skeleton.tsx create mode 100644 packages/react/src/components/checkout/shipping/shipping-method.tsx create mode 100644 packages/react/src/components/checkout/shipping/utils/filter-shipping-methods.ts create mode 100644 packages/react/src/components/checkout/shipping/utils/use-apply-shipping-method.ts create mode 100644 packages/react/src/components/checkout/shipping/utils/use-draft-order-shipping-methods.ts create mode 100644 packages/react/src/components/checkout/shipping/utils/use-draft-order-shipping.ts create mode 100644 packages/react/src/components/checkout/shipping/utils/use-get-shipping-methods.ts create mode 100644 packages/react/src/components/checkout/shipping/utils/use-remove-shipping-method.ts create mode 100644 packages/react/src/components/checkout/target/target.tsx create mode 100644 packages/react/src/components/checkout/taxes/utils/use-get-taxes.ts create mode 100644 packages/react/src/components/checkout/tips/tips-form.tsx create mode 100644 packages/react/src/components/checkout/totals/totals-skeleton.tsx create mode 100644 packages/react/src/components/checkout/totals/totals.tsx create mode 100644 packages/react/src/components/checkout/totals/utils/use-is-order-free.ts create mode 100644 packages/react/src/components/checkout/ui/floating-label.tsx create mode 100644 packages/react/src/components/checkout/utils/checkout-transformers.ts create mode 100644 packages/react/src/components/ui/accordion.tsx create mode 100644 packages/react/src/components/ui/autocomplete.tsx create mode 100644 packages/react/src/components/ui/button.tsx create mode 100644 packages/react/src/components/ui/calendar.tsx create mode 100644 packages/react/src/components/ui/checkbox.tsx create mode 100644 packages/react/src/components/ui/collapsible.tsx create mode 100644 packages/react/src/components/ui/command.tsx create mode 100644 packages/react/src/components/ui/dialog.tsx create mode 100644 packages/react/src/components/ui/form.tsx create mode 100644 packages/react/src/components/ui/input.tsx create mode 100644 packages/react/src/components/ui/label.tsx create mode 100644 packages/react/src/components/ui/popover.tsx create mode 100644 packages/react/src/components/ui/radio-group.tsx create mode 100644 packages/react/src/components/ui/scroll-area.tsx create mode 100644 packages/react/src/components/ui/select.tsx create mode 100644 packages/react/src/components/ui/sheet.tsx create mode 100644 packages/react/src/components/ui/skeleton.tsx create mode 100644 packages/react/src/components/ui/switch.tsx create mode 100644 packages/react/src/components/ui/textarea.tsx create mode 100644 packages/react/src/components/ui/tooltip.tsx create mode 100644 packages/react/src/globals.css create mode 100644 packages/react/src/godaddy-provider.tsx create mode 100644 packages/react/src/hooks/use-mobile.tsx create mode 100644 packages/react/src/hooks/use-theme.tsx create mode 100644 packages/react/src/hooks/use-variables.tsx create mode 100644 packages/react/src/index.ts create mode 100644 packages/react/src/lib/godaddy/godaddy.ts create mode 100644 packages/react/src/lib/godaddy/graphql-env.d.ts create mode 100644 packages/react/src/lib/godaddy/mutations.ts create mode 100644 packages/react/src/lib/godaddy/queries.ts create mode 100644 packages/react/src/lib/graphql-with-errors.ts create mode 100644 packages/react/src/lib/utils.ts create mode 100644 packages/react/src/preflight.css create mode 100644 packages/react/src/server.ts create mode 100644 packages/react/src/tests/setup.ts create mode 100644 packages/react/src/tracking/event-properties.ts create mode 100644 packages/react/src/tracking/events.ts create mode 100644 packages/react/src/tracking/track.tsx create mode 100644 packages/react/src/tracking/tracking-provider.tsx create mode 100644 packages/react/src/types.ts create mode 100644 packages/react/tsconfig.json create mode 100644 packages/react/tsdown.config.ts create mode 100644 packages/react/vitest.config.ts diff --git a/.gitignore b/.gitignore index 3e87859d..9de10ed5 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,13 @@ node_modules # Turbo artifacts .turbo + +dist + +# Playwright +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ + +schema.graphql diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..a8dcff2c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,23 @@ +# AGENTS.md - GoDaddy JavaScript Style Guide + +## Commands +- Root lint: `pnpm lint` (runs across all packages) +- Root test: `pnpm test` (runs all package tests in parallel) +- Package-specific: `cd packages/ && pnpm ` +- Single test: Navigate to package directory, then `pnpm test` +- Clean: `pnpm clean` (removes node_modules from all packages) + +## Architecture +- Monorepo with pnpm workspaces containing ESLint configs +- Main packages: `eslint-config-godaddy` (base), `eslint-config-godaddy-react`, `eslint-config-godaddy-typescript` +- `app-connect/` - Platform Applications Registry API (TypeScript with Biome) +- `react/` - React component library with GraphQL schema +- Uses changesets for versioning and publishing + +## Code Style +- ESLint configs define GoDaddy JavaScript standards for ES6+, React, TypeScript +- Base config enforces strict mode, jsdoc, mocha, and json rules +- TypeScript: strict typing, no `any`, functional approach over classes +- Naming: lowercase-with-dashes for directories, camelCase for variables +- Error handling: wrap async in try/catch, use Result types where applicable +- Testing: Mocha for base packages, Vitest for modern TypeScript packages diff --git a/README.md b/README.md index 4c478e08..80211d8b 100644 --- a/README.md +++ b/README.md @@ -1,178 +1,158 @@ -# godaddy-style +# GoDaddy JavaScript -Official GoDaddy JavaScript styleguide. It includes `eslint` packages for various use-cases and can be used as a standard in any new project. +[![npm downloads](https://img.shields.io/npm/dm/eslint-config-godaddy.svg)](https://www.npmjs.com/package/eslint-config-godaddy) +[![license](https://img.shields.io/npm/l/eslint-config-godaddy.svg)](https://github.com/godaddy/javascript/blob/main/LICENSE) +[![github stars](https://img.shields.io/github/stars/godaddy/javascript.svg?style=social&label=Star)](https://github.com/godaddy/javascript) -- [`eslint-config-godaddy`]: Base configuration for _non-React_, ES6 JavaScript applications -- [`eslint-config-godaddy-react`]: Configuration for ES6 React JavaScript applications -- [`eslint-config-godaddy-typescript`]: Configuration for ES6 TypeScript applications -- [`eslint-config-godaddy-react-typescript`]: Configuration for ES6 React JavaScript applications +Official collection of JavaScript libraries, tools, and configurations for building GoDaddy on the GoDaddy platform. This monorepo contains all the JavaScript SDKs, ESLint configurations, and React components under the `@godaddy` namespace. -There are many useful features: +## Getting Started -- **Standard. No configuration.** – Stop worrying about style and focus on your work. -- **Modern** – Uses modern linting tools like `eslint`. -- **Auto-fix** – Auto-fix is enabled by-default through in `eslint`. Many rules will fix themselves! - -This styleguide is used by dozens of product teams at GoDaddy. Have a question or comment? [Open an issue!](https://github.com/godaddy/javascript/issues/new) - -- [Installation](#installation) -- [Usage](#usage) -- [Additional Best Practices](#additional-best-practices) -- [FAQ](#faq) -- [Roadmap](#roadmap) -- [Contributors](https://github.com/godaddy/javascript/graphs/contributors) - -## Installation - -Install one of the provided packages depending on the kind of application you are developing: +### ESLint Configurations -``` sh -# Default with ES6 -npm i eslint-config-godaddy --save-dev +Choose the configuration that fits your project: -# OR (ES6 with React rules) -npm i eslint-config-godaddy-react --save-dev +```bash +# For ES6 JavaScript applications +npm install eslint-config-godaddy --save-dev -# OR (legacy ES5 with React rules) -npm i eslint-config-godaddy-es5 --save-dev +# For React applications +npm install eslint-config-godaddy-react --save-dev -# OR (ES6 with TypeScript rules) -npm i eslint-config-godaddy-typescript --save-dev +# For TypeScript applications +npm install eslint-config-godaddy-typescript --save-dev -# OR (ES6 with React and TypeScript rules) -npm i eslint-config-godaddy-react-typescript --save-dev +# For React + TypeScript applications +npm install eslint-config-godaddy-react-typescript --save-dev ``` -## Usage - -There are two ways to use this styleguide depending on your own tooling preference: directly using pre-included binaries or running `eslint` yourself with a custom `.eslintrc` config. +### Other Packages -### 2. Define your local `eslint.config.js|mjs` and run `eslint` yourself +```bash +# For GoDaddy platform integration +npm install @godaddy/app-connect -``` js -import GDConfig from 'eslint-config-godaddy'; -import { defineConfig } from 'eslint-define-config'; -export default defineConfig({ - extends: [ - GDConfig, - ], - rules: { - // Add your own rules here - 'no-console': 'warn', - }, -}); +# For React components with commerce APIs +npm install @godaddy/react ``` -The `--fix` option in `eslint` is [**only** available as a CLI option](https://github.com/eslint/eslint/issues/8041). Auto-fix will **_NOT be enabled_** unless you run `eslint --fix` in your `package.json`. +## Packages -``` js -{ - "scripts": { - "lint": "eslint --fix files/ you/ want-to/ lint/" - } -} -``` - -## Additional Best Practices +This monorepo contains the following packages: -This section is a place for additional best practices that may be useful but are not strictly enforced by this styleguide. Have something to add here? Great! [Submit a PR](#how-do-i-contribute). +| Package | Description | NPM | +|---------|-------------|-----| +| [`eslint-config-godaddy`](/packages/eslint-config-godaddy) | Base ESLint configuration for ES6 JavaScript | [![npm](https://img.shields.io/npm/v/eslint-config-godaddy.svg)](https://www.npmjs.com/package/eslint-config-godaddy) | +| [`eslint-config-godaddy-react`](/packages/eslint-config-godaddy-react) | ESLint configuration for React applications | [![npm](https://img.shields.io/npm/v/eslint-config-godaddy-react.svg)](https://www.npmjs.com/package/eslint-config-godaddy-react) | +| [`eslint-config-godaddy-typescript`](/packages/eslint-config-godaddy-typescript) | ESLint configuration for TypeScript applications | [![npm](https://img.shields.io/npm/v/eslint-config-godaddy-typescript.svg)](https://www.npmjs.com/package/eslint-config-godaddy-typescript) | +| [`eslint-config-godaddy-react-typescript`](/packages/eslint-config-godaddy-react-typescript) | ESLint configuration for React + TypeScript applications | [![npm](https://img.shields.io/npm/v/eslint-config-godaddy-react-typescript.svg)](https://www.npmjs.com/package/eslint-config-godaddy-react-typescript) | +| [`@godaddy/app-connect`](/packages/app-connect) | Platform integration tools for GoDaddy apps | [![npm](https://img.shields.io/npm/v/@godaddy/app-connect.svg)](https://www.npmjs.com/package/@godaddy/app-connect) | +| [`@godaddy/react`](/packages/react) | React components and commerce API integration | [![npm](https://img.shields.io/npm/v/@godaddy/react.svg)](https://www.npmjs.com/package/@godaddy/react) | -### React +## Why GoDaddy JavaScript? -- [AirBnB React Styleguide](https://github.com/airbnb/javascript/tree/master/react) +- **Standard. No configuration.** – Stop worrying about style and focus on your work. +- **Modern** – Uses modern linting tools like ESLint with support for ES6+, React, and TypeScript. +- **Auto-fix** – Auto-fix is enabled by default. Many rules will fix themselves! +- **Battle-tested** – Used by dozens of product teams at GoDaddy in production. -## FAQ +## Quick Start -## How do I override a specific rule ? +### ESLint Configuration -### 1. Add a `eslint.config.js|mjs` file at the root of your project +1. Install the appropriate configuration for your project +2. Create an `eslint.config.js` file: -``` js +```js import GDConfig from 'eslint-config-godaddy'; import { defineConfig } from 'eslint-define-config'; + export default defineConfig({ - extends: [ - GDConfig, - ], + extends: [GDConfig], rules: { - // Add your own rules here + // Add your custom rules here 'no-console': 'warn', }, }); ``` -### 2. Add a param to specify the path of your own `my-config.js|cjs|mjs` file in your `package.json` +3. Add a lint script to your `package.json`: -``` js +```json { "scripts": { - "eslint": "eslint -c myconfig.js lib/ test/", + "lint": "eslint --fix src/" } } ``` -## How do I contribute? +### Platform Integration -Fork this repository and submit a pull request. +For applications integrating with the GoDaddy platform: -### Local setup +```typescript +import { verifyAction } from '@godaddy/app-connect'; -This repo uses [pnpm] to install node_modules and handle script execution. Please install and setup `pnpm` after cloning and before installing packages. +// Verify requests from GoDaddy platform +const result = verifyAction(request); +if (result.success) { + // Process verified request +} +``` -For a first time setup make sure to run from the root of the monorepo. +## Release Notes -```bash -pnpm install -``` +Release information is available through: +- [GitHub Releases](https://github.com/godaddy/javascript/releases) page +- Individual `CHANGELOG.md` files within each package (e.g., [`packages/eslint-config-godaddy/CHANGELOG.md`](/packages/eslint-config-godaddy/CHANGELOG.md)) + +## How to Contribute -Since this repository uses npm workspaces it will install and hoist all `node_modules` to the root of the monorepo. +We welcome contributions! To get started: -### Submit a changeset +1. Fork this repository +2. Make your changes +3. Submit a pull request -This repository utilizes [changesets] to handle versioning and publishing as you submit a pull-request. -A changeset should be included with your pull-request to help the maintainers -understand the changes and to help with the release process. +### Local Development -To initiate a changeset run: +This repository uses [pnpm](https://pnpm.io/) for package management and workspace handling. ```bash -pnpm run changeset -``` +# Install dependencies +pnpm install -After which follow the command prompts to select which packages and which version each package should receive. +# Run tests across all packages +pnpm test -Commit and push the changeset to your branch to be included with your pull-request. +# Run linting across all packages +pnpm lint -## Publishing +# Create a changeset for your changes +pnpm changeset +``` + +### Submitting Changes -When a pull-request is merged into the `main`, the changeset will be used -to determine the next version of the package. +This repository uses [changesets](https://github.com/changesets/changesets) for versioning and publishing. Include a changeset with your pull request: -A "Version Packages" pull-request will be automatically created to bump the -versions. -If multiple PRs with changesets are merged, this PR will automatically update to -include all changesets. +```bash +pnpm changeset +``` -When all changes are ready to be published, repo admins can force squash merge -the "Version Packages" PR to main (CI worflows do not run on this automated branch). -This will trigger the CI to publish the packages to npm. +Follow the prompts to select which packages should receive version bumps. -## I disagree with a specific rule +## Support -Great. We'd love to talk about it. Fork this repository and submit a pull-request. +Have a question or found an issue? -## Help! It's not working for me +- [Open an issue](https://github.com/godaddy/javascript/issues/new) on GitHub +- Check out our [contributing guidelines](CONTRIBUTING.md) -No problem. Reach out to us by [opening an issue] +## License -## Roadmap +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. -- ESLint v9 support ([guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)) +--- -[opening an issue]: https://github.com/godaddy/javascript/issues -[`eslint-config-godaddy`]: /packages/eslint-config-godaddy -[`eslint-config-godaddy-react`]: /packages/eslint-config-godaddy-react -[`eslint-config-godaddy-typescript`]: /packages/eslint-config-godaddy-typescript -[`eslint-config-godaddy-react-typescript`]: /packages/eslint-config-godaddy-react-typescript -[changesets]: https://github.com/changesets/changesets -[pnpm]: https://pnpm.io/ +Built with ❤️ by the GoDaddy engineering team diff --git a/packages/.DS_Store b/packages/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..72eb11b73b20255e17bc9ac58c1e76d7e64efd92 GIT binary patch literal 6148 zcmeHKJx{|h5IvVxDzu2g0!)|*7KRQW#!v-`iKPQ8ZHfRXB^8tfF=Xa9@E4Gfx-qga zvhjO(=d;>G{SYh&!ChoO=X_^BKdW&~M5b}usT0+RsEoo`m`63ixSz|I6}+bkG;WND z61u{3M$uTbI)0-9ymu99Q4h}!c5SqO{rJ4zjFN7TX>We)m8M5_lQ3+@NgEO6_2c)G z+R@v=tmw`+qI(x37Tdee7?u_(2G0nrW4fd}U?0fLZ?c?e;bnhzbe8wi!}4HBc+VKW zn~b=BEhEdHs+Ree=o-I}7FLkcm{#ux`Q9wQ$Ca&D&o7goUHnnEXkj(V~gXn)}oxEuyI@}I7~sq9mR;{qj(L)8T^(Tz`$cF2oFsE N2sjzEQU!igflo)rd29dx literal 0 HcmV?d00001 diff --git a/packages/app-connect/.DS_Store b/packages/app-connect/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c2f49255975f1e06fc0d127fb893538948613a7a GIT binary patch literal 6148 zcmeHKJxc>Y5S=v_2!23H%hO5}k+fE4IKe`z6jq`p7ow2!f-(L50~;&-LAD`apP%BJ z-67fY615TuGqCe^cV>3x-f_FPL}Z$yq(M|Cq8b`wunx6A*v_paYcj*Z#;)lGn?D9&oeKw7xJ1MOVcKvI799(T~lg%BkE%`^mnnH z@zvxzU%#%4-RFI&Yw6lPL%;F&>)tz@a@`eh^++ARN}>s~B^JM?%dP5>yr-FU&Q#gz z=Of1x=Tuoe25@Gx)HWQdRtA&-Wnjht?++mwV8F}vH$=8 literal 0 HcmV?d00001 diff --git a/packages/app-connect/Agents.md b/packages/app-connect/Agents.md new file mode 100644 index 00000000..d466f4f0 --- /dev/null +++ b/packages/app-connect/Agents.md @@ -0,0 +1,19 @@ +# AGENT.md - Platform Applications Registry API + +## Commands +- Build: `pnpm build` +- Dev mode: `pnpm dev` +- Lint: `pnpm lint` (Biome linter) +- Type check: `pnpm check` (Biome checks) +- Test: `pnpm test`, `pnpm test:watch` + +## Code Style +- TypeScript with strict typing (no `any`) +- Functions must return `Result` type, check with `if (result.success)` +- Use Zod for validation +- Functional approach - minimal classes +- Naming: lowercase-with-dashes for directories +- Error handling: wrap async in try/catch at lowest level +- Tests: use Vitest with small, focused tests + +## Architecture \ No newline at end of file diff --git a/packages/app-connect/README.md b/packages/app-connect/README.md new file mode 100644 index 00000000..2f016527 --- /dev/null +++ b/packages/app-connect/README.md @@ -0,0 +1,302 @@ +# GoDaddy App Connect + +[![npm version](https://img.shields.io/npm/v/@godaddy/app-connect.svg)](https://www.npmjs.com/package/@godaddy/app-connect) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +A collection of tools and utilities for building applications that integrate with the GoDaddy platform. + +## Overview + +This library provides essential functionality for developers building applications that work with the GoDaddy platform. It handles platform integration concerns like request verification, webhook validation, authentication, and API communication. + +> **Note:** This library is under active development. Currently, it provides request verification and webhook subscription verification functionality, with more features planned for future releases. + +## Installation + +```bash +npm install @godaddy/app-connect +# or +yarn add @godaddy/app-connect +# or +pnpm add @godaddy/app-connect +``` + +This package provides framework-specific exports that can be imported directly: + +```typescript +// Express.js specific imports +import { createActionMiddleware, createWebhookMiddleware } from '@godaddy/app-connect/express'; + +// Next.js specific imports - Next.js App Router (13+) uses verifyAction directly +import { verifyAction, verifyWebhookSubscription, VerifiableRequest } from '@godaddy/app-connect/next'; +``` + +## Features + +### Request Verification + +Verify that incoming requests to your application are genuinely from the GoDaddy platform by validating cryptographic signatures added by GoDaddy's Traefik middleware. + +- ECDSA-P256-SHA256 signature verification +- Express.js and Next.js framework adapters (with dedicated subpath exports) +- Standardized GoDaddy error responses +- Configurable via environment variables or runtime options + +### Webhook Subscription Verification + +Verify that incoming webhook subscriptions are genuinely from the GoDaddy platform by validating HMAC signatures. + +- HMAC-SHA256 signature verification +- Support for webhook subscription verification header format +- Express.js middleware for easy integration +- Configurable via environment variables or runtime options + +## Usage + +### Configuration + +#### For Action Verification + +Set up the required public key via environment variable: + +``` +GODADDY_PUBLIC_KEY=base64_encoded_public_key +``` + +Or provide it directly in your code: + +```typescript +import { verifyAction } from '@godaddy/app-connect'; + +const result = verifyAction(request, { + publicKey: 'base64_encoded_public_key' +}); +``` + +#### For Webhook Verification + +Set up the webhook secret via environment variable: + +``` +GODADDY_WEBHOOK_SECRET=your_webhook_secret +``` + +Or provide it directly in your code: + +```typescript +import { verifyWebhookSubscription } from '@godaddy/app-connect'; + +const result = verifyWebhookSubscription(request, { + secret: 'your_webhook_secret' +}); +``` + +### Express.js Integration + +```typescript +import express from 'express'; +// Import directly from the express subpath +import { createActionMiddleware } from '@godaddy/app-connect/express'; + +const app = express(); + +// Add body parser middleware first +app.use(express.json()); + +// Add action verification middleware +app.post('/action-webhook', + createActionMiddleware(), + (req, res) => { + // If the request gets here, it's verified as a signed action + res.send('Verified action request received!'); +}); + +// For webhook subscriptions (separate endpoint with webhook verification) +app.post('/webhook-subscription', + createWebhookMiddleware(), // Import this from '@godaddy/app-connect/express' + (req, res) => { + // If the request gets here, it's a verified webhook subscription + res.send('Verified webhook subscription received!'); + } +); + +app.listen(3000); +``` + +### Next.js App Router Integration (Next.js 13+) + +```typescript +// app/api/example/route.ts +import { verifyAction, VerifiableRequest } from '@godaddy/app-connect/next'; + +export async function POST(request: Request) { + // Transform web standard Request to VerifiableRequest + const verifiableReq: VerifiableRequest = { + method: request.method, + url: request.url, + path: new URL(request.url).pathname, + query: Object.fromEntries(new URL(request.url).searchParams), + headers: Object.fromEntries(request.headers), + body: await request.json(), + }; + + // Verify the action request + const result = verifyAction(verifiableReq); + + if (!result.success) { + // Return error in GoDaddy format + return Response.json(result.error, { status: 401 }); + } + + // Process the request + return Response.json({ message: 'Verified request received!' }); +} +``` + +### Direct Verification + +#### Action Verification + +```typescript +import { verifyAction, VerifiableRequest } from '@godaddy/app-connect'; + +function processActionRequest(req) { + // Create a verifiable request object + const verifiableRequest: VerifiableRequest = { + method: req.method, + url: req.url, + path: req.path, + query: req.query, + headers: req.headers, + body: req.body + }; + + // Verify the action request + const result = verifyAction(verifiableRequest); + + if (!result.success) { + // Handle verification failure + console.error('Verification failed:', result.error); + return { error: result.error }; + } + + // Process verified request + return { success: true }; +} +``` + +#### Webhook Verification + +```typescript +import { verifyWebhookSubscription, VerifiableRequest } from '@godaddy/app-connect'; + +function processWebhookSubscription(req) { + // Create a verifiable request object + const verifiableRequest: VerifiableRequest = { + method: req.method, + url: req.url, + path: req.path, + query: req.query, + headers: req.headers, + body: req.body + }; + + // Verify the webhook subscription + const result = verifyWebhookSubscription(verifiableRequest); + + if (!result.success) { + // Handle verification failure + console.error('Webhook verification failed:', result.error); + return { error: result.error }; + } + + // Process verified webhook + return { success: true }; +} +``` + +## API Reference + +### Core Functions + +#### `verifyAction(request, options?): Result` + +Verifies that a request has a valid GoDaddy platform signature. + +- `request`: A `VerifiableRequest` object containing the request details +- `options`: Optional configuration including the public key + +Returns a `Result` object that indicates success or contains an error. + +#### `verifyWebhookSubscription(request, options?): Result` + +Verifies that a webhook subscription request has a valid HMAC signature. + +- `request`: A `VerifiableRequest` object containing the webhook request details +- `options`: Optional configuration including the webhook secret + +Returns a `Result` object that indicates success or contains an error. + +### Framework Adapters + +#### Express.js + +##### `createActionMiddleware(options?)` (from `@godaddy/app-connect/express`) + +Creates an Express.js middleware function for verifying action requests. + +##### `createWebhookMiddleware(options?)` (from `@godaddy/app-connect/express`) + +Creates an Express.js middleware function for verifying webhook subscription requests. + +##### `createExpressMiddleware(options?)` (from `@godaddy/app-connect`) + +Legacy approach: Creates an Express.js middleware function for verifying action requests. + +#### Next.js + +For Next.js App Router (13+), use verification functions directly in your route handlers. Import from: + +```typescript +import { verifyAction, verifyWebhookSubscription, VerifiableRequest } from '@godaddy/app-connect/next'; +``` + +See the [Next.js App Router Integration](#nextjs-app-router-integration-nextjs-13) example for action verification details. The pattern is similar for webhook verification. + +### Helper Functions + +#### `getWebhookSecret(options?): string` + +Retrieves the webhook secret for webhook subscription verification, from options or environment. + +### Error Types + +The library exports standardized error types that follow GoDaddy's error schema: + +#### Action Verification Errors + +- `MissingHeaderError`: When a required header is missing +- `ExpiredSignatureError`: When the signature timestamp is too old +- `InvalidSignatureError`: When the signature verification fails +- `InvalidAlgorithmError`: When the signature algorithm is not supported +- `InvalidVersionError`: When the signature version is not supported + +#### Webhook Verification Errors + +- `MissingWebhookHeaderError`: When a required webhook header is missing +- `InvalidWebhookSignatureError`: When the webhook signature verification fails + +## Upcoming Features + +- Additional authentication mechanisms +- Platform API client +- Event handling utilities +- More framework integrations + +## Contributing + +Contributions are welcome! Please feel free to submit a Pull Request. + +## License + +This project is licensed under the MIT License - see the LICENSE file for details. \ No newline at end of file diff --git a/packages/app-connect/biome.json b/packages/app-connect/biome.json new file mode 100644 index 00000000..cc198eac --- /dev/null +++ b/packages/app-connect/biome.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2 + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "semicolons": "always" + } + } +} diff --git a/packages/app-connect/package.json b/packages/app-connect/package.json new file mode 100644 index 00000000..98d6fbf9 --- /dev/null +++ b/packages/app-connect/package.json @@ -0,0 +1,77 @@ +{ + "name": "@godaddy/app-connect", + "version": "0.4.2", + "description": "GoDaddy App Connect - A verification library for GoDaddy Platform App requests", + "type": "module", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + }, + "./express": { + "types": "./dist/express/index.d.ts", + "import": "./dist/express/index.js", + "default": "./dist/express/index.js" + }, + "./next": { + "types": "./dist/next/index.d.ts", + "import": "./dist/next/index.js", + "default": "./dist/next/index.js" + }, + "./tanstack": { + "types": "./dist/tanstack/index.d.ts", + "import": "./dist/tanstack/index.js", + "default": "./dist/tanstack/index.js" + } + }, + "scripts": { + "dev": "tsdown --watch", + "build": "tsdown", + "typecheck": "tsc --noEmit", + "lint": "biome lint --write --unsafe ./src", + "check": "biome check --write --unsafe ./src", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "changeset": "changeset", + "version": "changeset version", + "release": "pnpm build && changeset publish", + "prepublishOnly": "pnpm build" + }, + "keywords": [ + "godaddy", + "platform", + "verification", + "signature" + ], + "author": "GoDaddy", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/godaddy/javascript.git" + }, + "dependencies": { + "@tanstack/react-router": "^1.127.9", + "@tanstack/react-start": "^1.127.9", + "pino": "^9.7.0", + "zod": "^3.22.4" + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@changesets/cli": "^2.29.4", + "@types/express": "^5.0.2", + "@types/node": "^22.13.1", + "pino-pretty": "^13.0.0", + "tsdown": "^0.15.6", + "typescript": "~5.7.3", + "vitest": "^1.2.2" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/" + } +} diff --git a/packages/app-connect/pnpm-lock.yaml b/packages/app-connect/pnpm-lock.yaml new file mode 100644 index 00000000..c009aeee --- /dev/null +++ b/packages/app-connect/pnpm-lock.yaml @@ -0,0 +1,8533 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@tanstack/react-router': + specifier: ^1.127.9 + version: 1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-start': + specifier: ^1.127.9 + version: 1.127.9(@netlify/blobs@9.1.2)(@tanstack/react-router@1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + pino: + specifier: ^9.7.0 + version: 9.7.0 + zod: + specifier: ^3.22.4 + version: 3.25.5 + devDependencies: + '@biomejs/biome': + specifier: 1.9.4 + version: 1.9.4 + '@changesets/cli': + specifier: ^2.29.4 + version: 2.29.4 + '@types/express': + specifier: ^5.0.2 + version: 5.0.2 + '@types/node': + specifier: ^20.11.16 + version: 20.17.48 + pino-pretty: + specifier: ^13.0.0 + version: 13.0.0 + tsup: + specifier: ^8.5.0 + version: 8.5.0(jiti@2.4.2)(postcss@8.5.3)(tsx@4.20.3)(typescript@5.8.3) + typescript: + specifier: ^5.3.3 + version: 5.8.3 + vitest: + specifier: ^1.2.2 + version: 1.6.1(@types/node@20.17.48)(terser@5.43.1) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.27.1': + resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.0': + resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.1': + resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@1.9.4': + resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.9.4': + resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.9.4': + resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.9.4': + resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.9.4': + resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.9.4': + resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.9.4': + resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.9.4': + resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.9.4': + resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@changesets/apply-release-plan@7.0.12': + resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} + + '@changesets/assemble-release-plan@6.0.8': + resolution: {integrity: sha512-y8+8LvZCkKJdbUlpXFuqcavpzJR80PN0OIfn8HZdwK7Sh6MgLXm4hKY5vu6/NDoKp8lAlM4ERZCqRMLxP4m+MQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.29.4': + resolution: {integrity: sha512-VW30x9oiFp/un/80+5jLeWgEU6Btj8IqOgI+X/zAYu4usVOWXjPIK5jSSlt5jsCU7/6Z7AxEkarxBxGUqkAmNg==} + hasBin: true + + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-release-plan@4.0.12': + resolution: {integrity: sha512-KukdEgaafnyGryUwpHG2kZ7xJquOmWWWk5mmoeQaSvZTWH1DC5D/Sw6ClgGFYtQnOMSQhgoEbDxAbpIIayKH1g==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + + '@cloudflare/kv-asset-handler@0.4.0': + resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} + engines: {node: '>=18.0.0'} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + + '@dependents/detective-less@5.0.1': + resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} + engines: {node: '>=18'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.6': + resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.6': + resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.6': + resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.6': + resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.6': + resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.6': + resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.6': + resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.6': + resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.6': + resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.6': + resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.6': + resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.6': + resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.6': + resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.6': + resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.6': + resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.6': + resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.6': + resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.6': + resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.6': + resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.6': + resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.6': + resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.6': + resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.6': + resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.6': + resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.6': + resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.6': + resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fastify/busboy@3.1.1': + resolution: {integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==} + + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.10': + resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@mapbox/node-pre-gyp@2.0.0': + resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} + engines: {node: '>=18'} + hasBin: true + + '@netlify/binary-info@1.0.0': + resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} + + '@netlify/blobs@9.1.2': + resolution: {integrity: sha512-7dMjExSH4zj4ShvLem49mE3mf0K171Tx2pV4WDWhJbRUWW3SJIR2qntz0LvUGS97N5HO1SmnzrgWUhEXCsApiw==} + engines: {node: ^14.16.0 || >=16.0.0} + + '@netlify/dev-utils@2.2.0': + resolution: {integrity: sha512-5XUvZuffe3KetyhbWwd4n2ktd7wraocCYw10tlM+/u/95iAz29GjNiuNxbCD1T6Bn1MyGc4QLVNKOWhzJkVFAw==} + engines: {node: ^14.16.0 || >=16.0.0} + + '@netlify/functions@3.1.10': + resolution: {integrity: sha512-sI93kcJ2cUoMgDRPnrEm0lZhuiDVDqM6ngS/UbHTApIH3+eg3yZM5p/0SDFQQq9Bad0/srFmgBmTdXushzY5kg==} + engines: {node: '>=14.0.0'} + + '@netlify/open-api@2.37.0': + resolution: {integrity: sha512-zXnRFkxgNsalSgU8/vwTWnav3R+8KG8SsqHxqaoJdjjJtnZR7wo3f+qqu4z+WtZ/4V7fly91HFUwZ6Uz2OdW7w==} + engines: {node: '>=14.8.0'} + + '@netlify/runtime-utils@1.3.1': + resolution: {integrity: sha512-7/vIJlMYrPJPlEW84V2yeRuG3QBu66dmlv9neTmZ5nXzwylhBEOhy11ai+34A8mHCSZI4mKns25w3HM9kaDdJg==} + engines: {node: '>=16.0.0'} + + '@netlify/serverless-functions-api@1.41.2': + resolution: {integrity: sha512-pfCkH50JV06SGMNsNPjn8t17hOcId4fA881HeYQgMBOrewjsw4csaYgHEnCxCEu24Y5x75E2ULbFpqm9CvRCqw==} + engines: {node: '>=18.0.0'} + + '@netlify/serverless-functions-api@2.1.3': + resolution: {integrity: sha512-bNlN/hpND8xFQzpjyKxm6vJayD+bPBlOvs4lWihE7WULrphuH1UuFsoVE5386bNNGH8Rs1IH01AFsl7ALQgOlQ==} + engines: {node: '>=18.0.0'} + + '@netlify/zip-it-and-ship-it@12.2.1': + resolution: {integrity: sha512-zAr+8Tg80y/sUbhdUkZsq4Uy1IMzkSB6H/sKRMrDQ2NJx4uPgf5X5jMdg9g2FljNcxzpfJwc1Gg4OXQrjD0Z4A==} + engines: {node: '>=18.14.0'} + hasBin: true + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oozcitak/dom@1.15.10': + resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} + engines: {node: '>=8.0'} + + '@oozcitak/infra@1.0.8': + resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} + engines: {node: '>=6.0'} + + '@oozcitak/url@1.0.4': + resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} + engines: {node: '>=8.0'} + + '@oozcitak/util@8.3.8': + resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} + engines: {node: '>=8.0'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-wasm@2.5.1': + resolution: {integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@poppinss/colors@4.1.5': + resolution: {integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==} + + '@poppinss/dumper@0.6.4': + resolution: {integrity: sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==} + + '@poppinss/exception@1.2.2': + resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} + + '@rolldown/pluginutils@1.0.0-beta.19': + resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} + + '@rollup/plugin-alias@5.1.1': + resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-commonjs@28.0.6': + resolution: {integrity: sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.1': + resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@6.0.2': + resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.41.0': + resolution: {integrity: sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.45.1': + resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.41.0': + resolution: {integrity: sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-arm64@4.45.1': + resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.41.0': + resolution: {integrity: sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.45.1': + resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.41.0': + resolution: {integrity: sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.45.1': + resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.41.0': + resolution: {integrity: sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-arm64@4.45.1': + resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.41.0': + resolution: {integrity: sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.45.1': + resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.41.0': + resolution: {integrity: sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.41.0': + resolution: {integrity: sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.41.0': + resolution: {integrity: sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.45.1': + resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.41.0': + resolution: {integrity: sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.45.1': + resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.41.0': + resolution: {integrity: sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': + resolution: {integrity: sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.41.0': + resolution: {integrity: sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.41.0': + resolution: {integrity: sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.45.1': + resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.41.0': + resolution: {integrity: sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.45.1': + resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.41.0': + resolution: {integrity: sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.45.1': + resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.41.0': + resolution: {integrity: sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.45.1': + resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.41.0': + resolution: {integrity: sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-arm64-msvc@4.45.1': + resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.41.0': + resolution: {integrity: sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.45.1': + resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.41.0': + resolution: {integrity: sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.45.1': + resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/is@7.0.2': + resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@speed-highlight/core@1.2.7': + resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + + '@tanstack/directive-functions-plugin@1.124.1': + resolution: {integrity: sha512-eZdsPCZz+7VIKiXAF5dNdLJBerAo4t79w/OQTWaKuqPLX1E9GQOKHsmTZChWeQbxPx+y+cOV3/0U/yKxtHsm0Q==} + engines: {node: '>=12'} + peerDependencies: + vite: '>=6.0.0' + + '@tanstack/history@1.121.34': + resolution: {integrity: sha512-YL8dGi5ZU+xvtav2boRlw4zrRghkY6hvdcmHhA0RGSJ/CBgzv+cbADW9eYJLx74XMZvIQ1pp6VMbrpXnnM5gHA==} + engines: {node: '>=12'} + + '@tanstack/react-router@1.127.9': + resolution: {integrity: sha512-/CKSrJV2sI0/fCSB7VsTl8YcT9bBTiQssIxmnPEkxfeaeVmkbtJ4OSeXs6y3iYAyPMpTuQ1K2BjyV2FjGqEFVw==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-client@1.127.9': + resolution: {integrity: sha512-Z42lqCc2nEwbMt4P8MjgCsYv6GiH+rVMtHN/Vap8Xw33GEJiiT9dYkuODv2Ryj9SfQ80t19cjhjar6eXMMlxIA==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-plugin@1.127.9': + resolution: {integrity: sha512-qzzvXqOIypXbgP75xfw1SG/kIbnLbRx6vbNW18PFLU5/FH2ch8ZYrZISNdIMu+rv0KO+Eyk5lUix+T40y/IQhQ==} + engines: {node: '>=12'} + peerDependencies: + '@vitejs/plugin-react': '>=4.3.4' + vite: '>=6.0.0' + + '@tanstack/react-start-server@1.127.9': + resolution: {integrity: sha512-bAtVN8SbFL06w53W0AX4fzI897T+x1pRVNDAABI6j3SIq9yf+UwspHWdTPcU9yWPzLXCws33Cl5XaXRN+CNG0Q==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start@1.127.9': + resolution: {integrity: sha512-lmXm5a71w/5IbJhrQzMlW6S2EluRfW+d4+7CP6Y6umApMqZuQJyyPEWalO72T44K/2yaJKaloazI7nxJ3Jz2CQ==} + engines: {node: '>=12'} + peerDependencies: + '@vitejs/plugin-react': '>=4.3.4' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + vite: '>=6.0.0' + + '@tanstack/react-store@0.7.3': + resolution: {integrity: sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/router-core@1.127.8': + resolution: {integrity: sha512-GYRmuvU9mcqu68GF56pNSE8TLGQ8jI0CsxuJXLwhwlawmnWGWeVo2L3g4ZOoK/lW6Mc5pr9OefkbEcyB/SFFNw==} + engines: {node: '>=12'} + + '@tanstack/router-generator@1.127.8': + resolution: {integrity: sha512-46gXnlBUWR4/MUbfZoiO2YNwKlySVEC6IYPzC33qIh4suXsOP9ovAJVGLxXHLB+1FtwQs6NfIoDR0nGsP18dBg==} + engines: {node: '>=12'} + + '@tanstack/router-plugin@1.127.9': + resolution: {integrity: sha512-Cu2zJTVJCvwoukGnhJy4r02U30WmgiT/7cGhARzOzhlfd3QXVdgj3jYi1DFh4nNMHHlJQQEz7zA1/0cX990sGA==} + engines: {node: '>=12'} + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.127.9 + vite: '>=5.0.0 || >=6.0.0' + vite-plugin-solid: ^2.11.2 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + + '@tanstack/router-utils@1.121.21': + resolution: {integrity: sha512-u7ubq1xPBtNiU7Fm+EOWlVWdgFLzuKOa1thhqdscVn8R4dNMUd1VoOjZ6AKmLw201VaUhFtlX+u0pjzI6szX7A==} + engines: {node: '>=12'} + + '@tanstack/server-functions-plugin@1.124.1': + resolution: {integrity: sha512-9GIu+PXu5itj+Q74FJQpd4WV3FikzkAAxvBl9hrnmiEwz+AGDZL0GOiGy++MdupHJXuHXXss9mHqKtNmw9wMdw==} + engines: {node: '>=12'} + + '@tanstack/start-client-core@1.127.8': + resolution: {integrity: sha512-02OoF94mGypYNvObd5sxAZ4ERigAzfOcs0dU4W6ZxdHc34kVWHyhll2QoBvjT2VUZTqi4jBajleilBgiaEDz6A==} + engines: {node: '>=12'} + + '@tanstack/start-plugin-core@1.127.9': + resolution: {integrity: sha512-XS1+LcAKdRr1L9fDmDS7sT0hBmi6mnT+3Y57PNQXLDXLYlXGEhEJxDOQOiGmIDtbQx8X86tAu2eDbUeqcaVKOQ==} + engines: {node: '>=12'} + peerDependencies: + vite: '>=6.0.0' + + '@tanstack/start-server-core@1.127.8': + resolution: {integrity: sha512-Xd1OHQzgff7KD/8VoTE/ewShZMAeHVqxvyNWCpi6kd5v/cQvbXit1ORvv7jNowSopURvmy+dYRVL47zI3Qc+kA==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-client@1.127.8': + resolution: {integrity: sha512-/3UTGFfySVrJNFoYmmdwuA3pRH+fjkrM+xsws00f42aa3bsS9Bg/eAUrRIkSqhmQFv+Z8nQMiZSjIXx1+0V7/g==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-fetcher@1.127.8': + resolution: {integrity: sha512-Q0k42kzOJXfwQK8b9KXNg39mLEJRs4AttfBRErHDmnEd6CsmFRNzQnjGDutOqRAmLvoHY7M97Iz+JDUiCI1CoA==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-server@1.127.4': + resolution: {integrity: sha512-e0KzPtot+Hedp243+Shly6tzgxRIBhVQG6u1IMYCsvLyLF5Z6mPzL/6BV9MUp6XiYUPpyMv3nYiM2BjLfAbagg==} + engines: {node: '>=12'} + + '@tanstack/store@0.7.2': + resolution: {integrity: sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==} + + '@tanstack/virtual-file-routes@1.121.21': + resolution: {integrity: sha512-3nuYsTyaq6ZN7jRZ9z6Gj3GXZqBOqOT0yzd/WZ33ZFfv4yVNIvsa5Lw+M1j3sgyEAxKMqGu/FaNi7FCjr3yOdw==} + engines: {node: '>=12'} + + '@types/babel__code-frame@7.0.6': + resolution: {integrity: sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + + '@types/express@5.0.2': + resolution: {integrity: sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@20.17.48': + resolution: {integrity: sha512-KpSfKOHPsiSC4IkZeu2LsusFwExAIVGkhG1KkbaBMLwau0uMhj0fCrvyg9ddM2sAvd+gtiBJLir4LAw1MNMIaw==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/project-service@8.37.0': + resolution: {integrity: sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/tsconfig-utils@8.37.0': + resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.37.0': + resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.37.0': + resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.37.0': + resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vercel/nft@0.29.4': + resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} + engines: {node: '>=18'} + hasBin: true + + '@vitejs/plugin-react@4.6.0': + resolution: {integrity: sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + + '@vue/compiler-core@3.5.17': + resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} + + '@vue/compiler-dom@3.5.17': + resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} + + '@vue/compiler-sfc@3.5.17': + resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} + + '@vue/compiler-ssr@3.5.17': + resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} + + '@vue/shared@3.5.17': + resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} + + '@whatwg-node/disposablestack@0.0.6': + resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/fetch@0.10.8': + resolution: {integrity: sha512-Rw9z3ctmeEj8QIB9MavkNJqekiu9usBCSMZa+uuAvM0lF3v70oQVCXNppMIqaV6OTZbdaHF1M2HLow58DEw+wg==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/node-fetch@0.7.21': + resolution: {integrity: sha512-QC16IdsEyIW7kZd77aodrMO7zAoDyyqRCTLg+qG4wqtP4JV9AA+p7/lgqMdD29XyiYdVvIdFrfI9yh7B1QvRvw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/promise-helpers@1.3.2': + resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} + engines: {node: '>=16.0.0'} + + '@whatwg-node/server@0.9.71': + resolution: {integrity: sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g==} + engines: {node: '>=18.0.0'} + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + ast-module-types@6.0.1: + resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} + engines: {node: '>=18'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + babel-dead-code-elimination@1.0.10: + resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.6.0: + resolution: {integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + c12@3.1.0: + resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + + caniuse-lite@1.0.30001727: + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.1.0: + resolution: {integrity: sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==} + engines: {node: '>=18.17'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compatx@0.2.0: + resolution: {integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + + cookie-es@2.0.0: + resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + copy-file@11.0.0: + resolution: {integrity: sha512-mFsNh/DIANLqFt5VHZoGirdg7bK5+oTWlhnGu6tgRhzBlnEKWaPX2xrFaLltii/6rmhqFMJqffUgknuRdpYlHw==} + engines: {node: '>=18'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + + croner@9.1.0: + resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} + engines: {node: '>=18.0'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + db0@0.3.2: + resolution: {integrity: sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==} + peerDependencies: + '@electric-sql/pglite': '*' + '@libsql/client': '*' + better-sqlite3: '*' + drizzle-orm: '*' + mysql2: '*' + sqlite3: '*' + peerDependenciesMeta: + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + better-sqlite3: + optional: true + drizzle-orm: + optional: true + mysql2: + optional: true + sqlite3: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decache@4.6.2: + resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + detective-amd@6.0.1: + resolution: {integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==} + engines: {node: '>=18'} + hasBin: true + + detective-cjs@6.0.1: + resolution: {integrity: sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==} + engines: {node: '>=18'} + + detective-es6@5.0.1: + resolution: {integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==} + engines: {node: '>=18'} + + detective-postcss@7.0.1: + resolution: {integrity: sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==} + engines: {node: ^14.0.0 || >=16.0.0} + peerDependencies: + postcss: ^8.4.47 + + detective-sass@6.0.1: + resolution: {integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==} + engines: {node: '>=18'} + + detective-scss@5.0.1: + resolution: {integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==} + engines: {node: '>=18'} + + detective-stylus@5.0.1: + resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} + engines: {node: '>=18'} + + detective-typescript@14.0.0: + resolution: {integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 + + detective-vue2@2.2.0: + resolution: {integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.185: + resolution: {integrity: sha512-dYOZfUk57hSMPePoIQ1fZWl1Fkj+OshhEVuPacNKWzC1efe56OsHY3l/jCfiAgIICOU3VgOIdoq7ahg7r7n6MQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.25.6: + resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + filter-obj@6.1.0: + resolution: {integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==} + engines: {node: '>=18'} + + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-amd-module-type@6.0.1: + resolution: {integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==} + engines: {node: '>=18'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port-please@3.2.0: + resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + + gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gzip-size@7.0.0: + resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + h3@1.13.0: + resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==} + + h3@1.15.3: + resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + httpxy@0.1.7: + resolution: {integrity: sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==} + + human-id@4.1.1: + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + hasBin: true + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + index-to-position@1.1.0: + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} + engines: {node: '>=18'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ioredis@5.6.1: + resolution: {integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==} + engines: {node: '>=12.22.0'} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-url-superb@4.0.0: + resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} + engines: {node: '>=10'} + + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isbot@5.1.28: + resolution: {integrity: sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + junk@4.0.1: + resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} + engines: {node: '>=12.20'} + + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + knitwork@1.2.0: + resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + lambda-local@2.2.0: + resolution: {integrity: sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==} + engines: {node: '>=8'} + hasBin: true + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + listhen@1.9.0: + resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} + hasBin: true + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + luxon@3.7.1: + resolution: {integrity: sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==} + engines: {node: '>=12'} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micro-api-client@3.3.0: + resolution: {integrity: sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mime@4.0.7: + resolution: {integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==} + engines: {node: '>=16'} + hasBin: true + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + module-definition@6.0.1: + resolution: {integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==} + engines: {node: '>=18'} + hasBin: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + netlify@13.3.5: + resolution: {integrity: sha512-Nc3loyVASW59W+8fLDZT1lncpG7llffyZ2o0UQLx/Fr20i7P8oP+lE7+TEcFvXj9IUWU6LjB9P3BH+iFGyp+mg==} + engines: {node: ^14.16.0 || >=16.0.0} + + nitropack@2.12.1: + resolution: {integrity: sha512-DEJJ9COcjzICujvx9DTugsjHi3k7EDlo3C7NKvtHLP21H3q6XR0ZLx/5wSU7EtVGUKkj3NQzpuxH/LWZXBUh7w==} + engines: {node: ^16.11.0 || >=17.0.0} + hasBin: true + peerDependencies: + xml2js: ^0.6.2 + peerDependenciesMeta: + xml2js: + optional: true + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-mock-http@1.0.1: + resolution: {integrity: sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + node-source-walk@7.0.1: + resolution: {integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==} + engines: {node: '>=18'} + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nypm@0.6.0: + resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ohash@1.1.6: + resolution: {integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + p-wait-for@5.0.2: + resolution: {integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==} + engines: {node: '>=12'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + parse-gitignore@2.0.0: + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-pretty@13.0.0: + resolution: {integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==} + hasBin: true + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.7.0: + resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} + hasBin: true + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.2.0: + resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-values-parser@6.0.2: + resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.2.9 + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + precinct@12.2.0: + resolution: {integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==} + engines: {node: '>=18'} + hasBin: true + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quote-unquote@1.0.0: + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-package-name@2.0.1: + resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup-plugin-visualizer@6.0.3: + resolution: {integrity: sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + rolldown: 1.x || ^1.0.0-beta + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + + rollup@4.41.0: + resolution: {integrity: sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.45.1: + resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + seroval-plugins@1.3.2: + resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.3.2: + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} + engines: {node: '>=10'} + + serve-placeholder@2.0.2: + resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@10.0.0: + resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} + engines: {node: '>=18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + engines: {node: '>=10'} + hasBin: true + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsx@4.20.3: + resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + unctx@2.4.1: + resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici@7.11.0: + resolution: {integrity: sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==} + engines: {node: '>=20.18.1'} + + unenv@1.10.0: + resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + + unenv@2.0.0-rc.18: + resolution: {integrity: sha512-O0oVQVJ2X3Q8H4HITJr4e2cWxMYBeZ+p8S25yoKCxVCgDWtIJDcgwWNonYz12tI3ylVQCRyPV/Bdq0KJeXo7AA==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unimport@5.1.0: + resolution: {integrity: sha512-wMmuG+wkzeHh2KCE6yiDlHmKelN8iE/maxkUYMbmrS6iV8+n6eP1TH3yKKlepuF4hrkepinEGmBXdfo9XZUvAw==} + engines: {node: '>=18.12.0'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + unixify@1.0.0: + resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} + engines: {node: '>=0.10.0'} + + unplugin-utils@0.2.4: + resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} + engines: {node: '>=18.12.0'} + + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + + unplugin@2.3.5: + resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} + engines: {node: '>=18.12.0'} + + unstorage@1.16.1: + resolution: {integrity: sha512-gdpZ3guLDhz+zWIlYP1UwQ259tG5T5vYRzDaHMkQ1bBY1SQPutvZnrRjTFaWUUpseErJIgAZS51h6NOcZVZiqQ==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + untun@0.1.3: + resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} + hasBin: true + + untyped@2.0.0: + resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} + hasBin: true + + unwasm@0.3.9: + resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + + urlpattern-polyfill@8.0.2: + resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + engines: {node: '>= 12.0.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@6.0.0: + resolution: {integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + xmlbuilder2@3.1.1: + resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} + engines: {node: '>=12.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.0-beta.8: + resolution: {integrity: sha512-rY2A2lSF7zC+l7HH9Mq+83D1dLlsPnEvy8jTouzaptDZM6geqZ3aJe/b7ULCwRURPtWV3vbDjA2DDMdoBol0HQ==} + engines: {node: '>=18'} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + + zod@3.25.5: + resolution: {integrity: sha512-ualArhgJydGAKkSdtxQyu6RXFW8nHFKWaw20jey8UFXU9uzkHYqWXJ93Iz+hUVVJb37VpF4LCCsOOfj6xaCVRQ==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.0': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.1 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.1 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.27.6': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.1 + + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.27.1': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + + '@babel/traverse@7.28.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.1 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.28.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@biomejs/biome@1.9.4': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.4 + '@biomejs/cli-darwin-x64': 1.9.4 + '@biomejs/cli-linux-arm64': 1.9.4 + '@biomejs/cli-linux-arm64-musl': 1.9.4 + '@biomejs/cli-linux-x64': 1.9.4 + '@biomejs/cli-linux-x64-musl': 1.9.4 + '@biomejs/cli-win32-arm64': 1.9.4 + '@biomejs/cli-win32-x64': 1.9.4 + + '@biomejs/cli-darwin-arm64@1.9.4': + optional: true + + '@biomejs/cli-darwin-x64@1.9.4': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.9.4': + optional: true + + '@biomejs/cli-linux-arm64@1.9.4': + optional: true + + '@biomejs/cli-linux-x64-musl@1.9.4': + optional: true + + '@biomejs/cli-linux-x64@1.9.4': + optional: true + + '@biomejs/cli-win32-arm64@1.9.4': + optional: true + + '@biomejs/cli-win32-x64@1.9.4': + optional: true + + '@changesets/apply-release-plan@7.0.12': + dependencies: + '@changesets/config': 3.1.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.2 + + '@changesets/assemble-release-plan@6.0.8': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.2 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.29.4': + dependencies: + '@changesets/apply-release-plan': 7.0.12 + '@changesets/assemble-release-plan': 6.0.8 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.12 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.2 + spawndamnit: 3.0.1 + term-size: 2.2.1 + + '@changesets/config@3.1.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.2 + + '@changesets/get-release-plan@4.0.12': + dependencies: + '@changesets/assemble-release-plan': 6.0.8 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.1': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.5': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.1 + prettier: 2.8.8 + + '@cloudflare/kv-asset-handler@0.4.0': + dependencies: + mime: 3.0.0 + + '@colors/colors@1.6.0': {} + + '@dabh/diagnostics@2.0.3': + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + + '@dependents/detective-less@5.0.1': + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.4': + optional: true + + '@esbuild/aix-ppc64@0.25.5': + optional: true + + '@esbuild/aix-ppc64@0.25.6': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.4': + optional: true + + '@esbuild/android-arm64@0.25.5': + optional: true + + '@esbuild/android-arm64@0.25.6': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.4': + optional: true + + '@esbuild/android-arm@0.25.5': + optional: true + + '@esbuild/android-arm@0.25.6': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.4': + optional: true + + '@esbuild/android-x64@0.25.5': + optional: true + + '@esbuild/android-x64@0.25.6': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.4': + optional: true + + '@esbuild/darwin-arm64@0.25.5': + optional: true + + '@esbuild/darwin-arm64@0.25.6': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.4': + optional: true + + '@esbuild/darwin-x64@0.25.5': + optional: true + + '@esbuild/darwin-x64@0.25.6': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.4': + optional: true + + '@esbuild/freebsd-arm64@0.25.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.6': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.4': + optional: true + + '@esbuild/freebsd-x64@0.25.5': + optional: true + + '@esbuild/freebsd-x64@0.25.6': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.4': + optional: true + + '@esbuild/linux-arm64@0.25.5': + optional: true + + '@esbuild/linux-arm64@0.25.6': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.4': + optional: true + + '@esbuild/linux-arm@0.25.5': + optional: true + + '@esbuild/linux-arm@0.25.6': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.4': + optional: true + + '@esbuild/linux-ia32@0.25.5': + optional: true + + '@esbuild/linux-ia32@0.25.6': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.4': + optional: true + + '@esbuild/linux-loong64@0.25.5': + optional: true + + '@esbuild/linux-loong64@0.25.6': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.4': + optional: true + + '@esbuild/linux-mips64el@0.25.5': + optional: true + + '@esbuild/linux-mips64el@0.25.6': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.4': + optional: true + + '@esbuild/linux-ppc64@0.25.5': + optional: true + + '@esbuild/linux-ppc64@0.25.6': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.4': + optional: true + + '@esbuild/linux-riscv64@0.25.5': + optional: true + + '@esbuild/linux-riscv64@0.25.6': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.4': + optional: true + + '@esbuild/linux-s390x@0.25.5': + optional: true + + '@esbuild/linux-s390x@0.25.6': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.4': + optional: true + + '@esbuild/linux-x64@0.25.5': + optional: true + + '@esbuild/linux-x64@0.25.6': + optional: true + + '@esbuild/netbsd-arm64@0.25.4': + optional: true + + '@esbuild/netbsd-arm64@0.25.5': + optional: true + + '@esbuild/netbsd-arm64@0.25.6': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.4': + optional: true + + '@esbuild/netbsd-x64@0.25.5': + optional: true + + '@esbuild/netbsd-x64@0.25.6': + optional: true + + '@esbuild/openbsd-arm64@0.25.4': + optional: true + + '@esbuild/openbsd-arm64@0.25.5': + optional: true + + '@esbuild/openbsd-arm64@0.25.6': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.4': + optional: true + + '@esbuild/openbsd-x64@0.25.5': + optional: true + + '@esbuild/openbsd-x64@0.25.6': + optional: true + + '@esbuild/openharmony-arm64@0.25.6': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.4': + optional: true + + '@esbuild/sunos-x64@0.25.5': + optional: true + + '@esbuild/sunos-x64@0.25.6': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.4': + optional: true + + '@esbuild/win32-arm64@0.25.5': + optional: true + + '@esbuild/win32-arm64@0.25.6': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.4': + optional: true + + '@esbuild/win32-ia32@0.25.5': + optional: true + + '@esbuild/win32-ia32@0.25.6': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.4': + optional: true + + '@esbuild/win32-x64@0.25.5': + optional: true + + '@esbuild/win32-x64@0.25.6': + optional: true + + '@fastify/busboy@3.1.1': {} + + '@ioredis/commands@1.2.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.10': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.27.1 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.27.1 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@mapbox/node-pre-gyp@2.0.0': + dependencies: + consola: 3.4.2 + detect-libc: 2.0.4 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.7.2 + tar: 7.4.3 + transitivePeerDependencies: + - encoding + - supports-color + + '@netlify/binary-info@1.0.0': {} + + '@netlify/blobs@9.1.2': + dependencies: + '@netlify/dev-utils': 2.2.0 + '@netlify/runtime-utils': 1.3.1 + + '@netlify/dev-utils@2.2.0': + dependencies: + '@whatwg-node/server': 0.9.71 + chokidar: 4.0.3 + decache: 4.6.2 + dot-prop: 9.0.0 + env-paths: 3.0.0 + find-up: 7.0.0 + lodash.debounce: 4.0.8 + netlify: 13.3.5 + parse-gitignore: 2.0.0 + uuid: 11.1.0 + write-file-atomic: 6.0.0 + + '@netlify/functions@3.1.10(rollup@4.45.1)': + dependencies: + '@netlify/blobs': 9.1.2 + '@netlify/dev-utils': 2.2.0 + '@netlify/serverless-functions-api': 1.41.2 + '@netlify/zip-it-and-ship-it': 12.2.1(rollup@4.45.1) + cron-parser: 4.9.0 + decache: 4.6.2 + extract-zip: 2.0.1 + is-stream: 4.0.1 + jwt-decode: 4.0.0 + lambda-local: 2.2.0 + read-package-up: 11.0.0 + source-map-support: 0.5.21 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@netlify/open-api@2.37.0': {} + + '@netlify/runtime-utils@1.3.1': {} + + '@netlify/serverless-functions-api@1.41.2': {} + + '@netlify/serverless-functions-api@2.1.3': {} + + '@netlify/zip-it-and-ship-it@12.2.1(rollup@4.45.1)': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + '@netlify/binary-info': 1.0.0 + '@netlify/serverless-functions-api': 2.1.3 + '@vercel/nft': 0.29.4(rollup@4.45.1) + archiver: 7.0.1 + common-path-prefix: 3.0.0 + copy-file: 11.0.0 + es-module-lexer: 1.7.0 + esbuild: 0.25.5 + execa: 8.0.1 + fast-glob: 3.3.3 + filter-obj: 6.1.0 + find-up: 7.0.0 + is-builtin-module: 3.2.1 + is-path-inside: 4.0.0 + junk: 4.0.1 + locate-path: 7.2.0 + merge-options: 3.0.4 + minimatch: 9.0.5 + normalize-path: 3.0.0 + p-map: 7.0.3 + path-exists: 5.0.0 + precinct: 12.2.0 + require-package-name: 2.0.1 + resolve: 2.0.0-next.5 + semver: 7.7.2 + tmp-promise: 3.0.3 + toml: 3.0.0 + unixify: 1.0.0 + urlpattern-polyfill: 8.0.2 + yargs: 17.7.2 + zod: 3.25.5 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@oozcitak/dom@1.15.10': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/url': 1.0.4 + '@oozcitak/util': 8.3.8 + + '@oozcitak/infra@1.0.8': + dependencies: + '@oozcitak/util': 8.3.8 + + '@oozcitak/url@1.0.4': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + + '@oozcitak/util@8.3.8': {} + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-wasm@2.5.1': + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.8 + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@poppinss/colors@4.1.5': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.4': + dependencies: + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.0.2 + supports-color: 10.0.0 + + '@poppinss/exception@1.2.2': {} + + '@rolldown/pluginutils@1.0.0-beta.19': {} + + '@rollup/plugin-alias@5.1.1(rollup@4.45.1)': + optionalDependencies: + rollup: 4.45.1 + + '@rollup/plugin-commonjs@28.0.6(rollup@4.45.1)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.4.4(picomatch@4.0.2) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.45.1 + + '@rollup/plugin-inject@5.0.5(rollup@4.45.1)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + estree-walker: 2.0.2 + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.45.1 + + '@rollup/plugin-json@6.1.0(rollup@4.45.1)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + optionalDependencies: + rollup: 4.45.1 + + '@rollup/plugin-node-resolve@16.0.1(rollup@4.45.1)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + optionalDependencies: + rollup: 4.45.1 + + '@rollup/plugin-replace@6.0.2(rollup@4.45.1)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.45.1 + + '@rollup/plugin-terser@0.4.4(rollup@4.45.1)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.43.1 + optionalDependencies: + rollup: 4.45.1 + + '@rollup/pluginutils@5.2.0(rollup@4.45.1)': + dependencies: + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.45.1 + + '@rollup/rollup-android-arm-eabi@4.41.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.45.1': + optional: true + + '@rollup/rollup-android-arm64@4.41.0': + optional: true + + '@rollup/rollup-android-arm64@4.45.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.41.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.45.1': + optional: true + + '@rollup/rollup-darwin-x64@4.41.0': + optional: true + + '@rollup/rollup-darwin-x64@4.45.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.41.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.45.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.41.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.45.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.41.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.41.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.41.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.45.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.41.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.45.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.41.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.45.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.41.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.45.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.41.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.45.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.41.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.45.1': + optional: true + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/is@7.0.2': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@speed-highlight/core@1.2.7': {} + + '@tanstack/directive-functions-plugin@1.124.1(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + '@tanstack/router-utils': 1.121.21 + babel-dead-code-elimination: 1.0.10 + tiny-invariant: 1.3.3 + vite: 5.4.19(@types/node@20.17.48)(terser@5.43.1) + transitivePeerDependencies: + - supports-color + + '@tanstack/history@1.121.34': {} + + '@tanstack/react-router@1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/history': 1.121.34 + '@tanstack/react-store': 0.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.127.8 + isbot: 5.1.28 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/react-start-client@1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/react-router': 1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.127.8 + '@tanstack/start-client-core': 1.127.8 + cookie-es: 1.2.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/react-start-plugin@1.127.9(@netlify/blobs@9.1.2)(@tanstack/react-router@1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)))(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1))': + dependencies: + '@tanstack/start-plugin-core': 1.127.9(@netlify/blobs@9.1.2)(@tanstack/react-router@1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + '@vitejs/plugin-react': 4.6.0(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + vite: 5.4.19(@types/node@20.17.48)(terser@5.43.1) + zod: 3.25.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@rsbuild/core' + - '@tanstack/react-router' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - rolldown + - sqlite3 + - supports-color + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + + '@tanstack/react-start-server@1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/history': 1.121.34 + '@tanstack/react-router': 1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.127.8 + '@tanstack/start-client-core': 1.127.8 + '@tanstack/start-server-core': 1.127.8 + h3: 1.13.0 + isbot: 5.1.28 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@tanstack/react-start@1.127.9(@netlify/blobs@9.1.2)(@tanstack/react-router@1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1))': + dependencies: + '@tanstack/react-start-client': 1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-start-plugin': 1.127.9(@netlify/blobs@9.1.2)(@tanstack/react-router@1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)))(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + '@tanstack/react-start-server': 1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/start-server-functions-client': 1.127.8(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + '@tanstack/start-server-functions-server': 1.127.4(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + '@vitejs/plugin-react': 4.6.0(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + vite: 5.4.19(@types/node@20.17.48)(terser@5.43.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@rsbuild/core' + - '@tanstack/react-router' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - rolldown + - sqlite3 + - supports-color + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + + '@tanstack/react-store@0.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/store': 0.7.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + use-sync-external-store: 1.5.0(react@19.1.0) + + '@tanstack/router-core@1.127.8': + dependencies: + '@tanstack/history': 1.121.34 + '@tanstack/store': 0.7.2 + cookie-es: 1.2.2 + seroval: 1.3.2 + seroval-plugins: 1.3.2(seroval@1.3.2) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/router-generator@1.127.8': + dependencies: + '@tanstack/router-core': 1.127.8 + '@tanstack/router-utils': 1.121.21 + '@tanstack/virtual-file-routes': 1.121.21 + prettier: 3.6.2 + recast: 0.23.11 + source-map: 0.7.4 + tsx: 4.20.3 + zod: 3.25.5 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.127.9(@tanstack/react-router@1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1))': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + '@tanstack/router-core': 1.127.8 + '@tanstack/router-generator': 1.127.8 + '@tanstack/router-utils': 1.121.21 + '@tanstack/virtual-file-routes': 1.121.21 + babel-dead-code-elimination: 1.0.10 + chokidar: 3.6.0 + unplugin: 2.3.5 + zod: 3.25.5 + optionalDependencies: + '@tanstack/react-router': 1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + vite: 5.4.19(@types/node@20.17.48)(terser@5.43.1) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.121.21': + dependencies: + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) + ansis: 4.1.0 + diff: 8.0.2 + transitivePeerDependencies: + - supports-color + + '@tanstack/server-functions-plugin@1.124.1(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + '@tanstack/directive-functions-plugin': 1.124.1(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + babel-dead-code-elimination: 1.0.10 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/start-client-core@1.127.8': + dependencies: + '@tanstack/router-core': 1.127.8 + cookie-es: 1.2.2 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/start-plugin-core@1.127.9(@netlify/blobs@9.1.2)(@tanstack/react-router@1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1))': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.28.0 + '@babel/types': 7.28.1 + '@tanstack/router-core': 1.127.8 + '@tanstack/router-generator': 1.127.8 + '@tanstack/router-plugin': 1.127.9(@tanstack/react-router@1.127.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + '@tanstack/router-utils': 1.121.21 + '@tanstack/server-functions-plugin': 1.124.1(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + '@tanstack/start-server-core': 1.127.8 + '@types/babel__code-frame': 7.0.6 + '@types/babel__core': 7.20.5 + babel-dead-code-elimination: 1.0.10 + cheerio: 1.1.0 + h3: 1.13.0 + nitropack: 2.12.1(@netlify/blobs@9.1.2) + pathe: 2.0.3 + ufo: 1.6.1 + vite: 5.4.19(@types/node@20.17.48)(terser@5.43.1) + xmlbuilder2: 3.1.1 + zod: 3.25.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@rsbuild/core' + - '@tanstack/react-router' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - rolldown + - sqlite3 + - supports-color + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + + '@tanstack/start-server-core@1.127.8': + dependencies: + '@tanstack/history': 1.121.34 + '@tanstack/router-core': 1.127.8 + '@tanstack/start-client-core': 1.127.8 + h3: 1.13.0 + isbot: 5.1.28 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + unctx: 2.4.1 + + '@tanstack/start-server-functions-client@1.127.8(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1))': + dependencies: + '@tanstack/server-functions-plugin': 1.124.1(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + '@tanstack/start-server-functions-fetcher': 1.127.8 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/start-server-functions-fetcher@1.127.8': + dependencies: + '@tanstack/router-core': 1.127.8 + '@tanstack/start-client-core': 1.127.8 + + '@tanstack/start-server-functions-server@1.127.4(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1))': + dependencies: + '@tanstack/server-functions-plugin': 1.124.1(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1)) + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/store@0.7.2': {} + + '@tanstack/virtual-file-routes@1.121.21': {} + + '@types/babel__code-frame@7.0.6': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.1 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + + '@types/babel__traverse@7.20.7': + dependencies: + '@babel/types': 7.28.1 + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.17.48 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 20.17.48 + + '@types/estree@1.0.7': {} + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@5.0.6': + dependencies: + '@types/node': 20.17.48 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@5.0.2': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 5.0.6 + '@types/serve-static': 1.15.7 + + '@types/http-errors@2.0.4': {} + + '@types/mime@1.3.5': {} + + '@types/node@12.20.55': {} + + '@types/node@20.17.48': + dependencies: + undici-types: 6.19.8 + + '@types/normalize-package-data@2.4.4': {} + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/resolve@1.20.2': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.17.48 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 20.17.48 + '@types/send': 0.17.4 + + '@types/triple-beam@1.3.5': {} + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.17.48 + optional: true + + '@typescript-eslint/project-service@8.37.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) + '@typescript-eslint/types': 8.37.0 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/types@8.37.0': {} + + '@typescript-eslint/typescript-estree@8.37.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.37.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/visitor-keys': 8.37.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.37.0': + dependencies: + '@typescript-eslint/types': 8.37.0 + eslint-visitor-keys: 4.2.1 + + '@vercel/nft@0.29.4(rollup@4.45.1)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.0 + '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + acorn: 8.14.1 + acorn-import-attributes: 1.9.5(acorn@8.14.1) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.2 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vitejs/plugin-react@4.6.0(vite@5.4.19(@types/node@20.17.48)(terser@5.43.1))': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) + '@rolldown/pluginutils': 1.0.0-beta.19 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 5.4.19(@types/node@20.17.48)(terser@5.43.1) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.1': + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + + '@vitest/runner@1.6.1': + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.1': + dependencies: + magic-string: 0.30.17 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.1': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.1': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@vue/compiler-core@3.5.17': + dependencies: + '@babel/parser': 7.28.0 + '@vue/shared': 3.5.17 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.17': + dependencies: + '@vue/compiler-core': 3.5.17 + '@vue/shared': 3.5.17 + + '@vue/compiler-sfc@3.5.17': + dependencies: + '@babel/parser': 7.28.0 + '@vue/compiler-core': 3.5.17 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-ssr': 3.5.17 + '@vue/shared': 3.5.17 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.17': + dependencies: + '@vue/compiler-dom': 3.5.17 + '@vue/shared': 3.5.17 + + '@vue/shared@3.5.17': {} + + '@whatwg-node/disposablestack@0.0.6': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/fetch@0.10.8': + dependencies: + '@whatwg-node/node-fetch': 0.7.21 + urlpattern-polyfill: 10.1.0 + + '@whatwg-node/node-fetch@0.7.21': + dependencies: + '@fastify/busboy': 3.1.1 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/promise-helpers@1.3.2': + dependencies: + tslib: 2.8.1 + + '@whatwg-node/server@0.9.71': + dependencies: + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.8 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + abbrev@3.0.1: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-import-attributes@1.9.5(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + acorn@8.15.0: {} + + agent-base@7.1.4: {} + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + ansis@4.1.0: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + array-union@2.1.0: {} + + assertion-error@1.1.0: {} + + ast-module-types@6.0.1: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + async-sema@3.1.1: {} + + async@3.2.6: {} + + atomic-sleep@1.0.0: {} + + b4a@1.6.7: {} + + babel-dead-code-elimination@1.0.10: + dependencies: + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + + balanced-match@1.0.2: {} + + bare-events@2.6.0: + optional: true + + base64-js@1.5.1: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + boolbase@1.0.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.1: + dependencies: + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.185 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + + buffer-crc32@0.2.13: {} + + buffer-crc32@1.0.0: {} + + buffer-from@1.1.2: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-modules@3.3.0: {} + + bundle-require@5.1.0(esbuild@0.25.4): + dependencies: + esbuild: 0.25.4 + load-tsconfig: 0.2.5 + + c12@3.1.0(magicast@0.3.5): + dependencies: + chokidar: 4.0.3 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 16.6.1 + exsolve: 1.0.7 + giget: 2.0.0 + jiti: 2.4.2 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.2.0 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsite@1.0.0: {} + + caniuse-lite@1.0.30001727: {} + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chardet@0.7.0: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.1.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.0.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.11.0 + whatwg-mimetype: 4.0.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@3.0.0: {} + + ci-info@3.9.0: {} + + citty@0.1.6: + dependencies: + consola: 3.4.2 + + clipboardy@4.0.0: + dependencies: + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cluster-key-slot@1.1.2: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@3.2.1: + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + + colorette@2.0.20: {} + + colorspace@1.1.4: + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + + commander@10.0.1: {} + + commander@12.1.0: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + common-path-prefix@3.0.0: {} + + commondir@1.0.1: {} + + compatx@0.2.0: {} + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + consola@3.4.2: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.2.2: {} + + cookie-es@2.0.0: {} + + cookie@1.0.2: {} + + copy-file@11.0.0: + dependencies: + graceful-fs: 4.2.11 + p-event: 6.0.1 + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + + cron-parser@4.9.0: + dependencies: + luxon: 3.7.1 + + croner@9.1.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + + data-uri-to-buffer@4.0.1: {} + + dateformat@4.6.3: {} + + db0@0.3.2: {} + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decache@4.6.2: + dependencies: + callsite: 1.0.0 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deepmerge@4.3.1: {} + + define-lazy-prop@2.0.0: {} + + defu@6.1.4: {} + + denque@2.1.0: {} + + depd@2.0.0: {} + + destr@2.0.5: {} + + detect-indent@6.1.0: {} + + detect-libc@1.0.3: {} + + detect-libc@2.0.4: {} + + detective-amd@6.0.1: + dependencies: + ast-module-types: 6.0.1 + escodegen: 2.1.0 + get-amd-module-type: 6.0.1 + node-source-walk: 7.0.1 + + detective-cjs@6.0.1: + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + + detective-es6@5.0.1: + dependencies: + node-source-walk: 7.0.1 + + detective-postcss@7.0.1(postcss@8.5.3): + dependencies: + is-url: 1.2.4 + postcss: 8.5.3 + postcss-values-parser: 6.0.2(postcss@8.5.3) + + detective-sass@6.0.1: + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + + detective-scss@5.0.1: + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + + detective-stylus@5.0.1: {} + + detective-typescript@14.0.0(typescript@5.8.3): + dependencies: + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + detective-vue2@2.2.0(typescript@5.8.3): + dependencies: + '@dependents/detective-less': 5.0.1 + '@vue/compiler-sfc': 3.5.17 + detective-es6: 5.0.1 + detective-sass: 6.0.1 + detective-scss: 5.0.1 + detective-stylus: 5.0.1 + detective-typescript: 14.0.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + diff-sequences@29.6.3: {} + + diff@8.0.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.185: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enabled@2.0.0: {} + + encodeurl@2.0.0: {} + + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@4.5.0: {} + + entities@6.0.1: {} + + env-paths@3.0.0: {} + + error-stack-parser-es@1.0.5: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + + esbuild@0.25.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 + + esbuild@0.25.6: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.6 + '@esbuild/android-arm': 0.25.6 + '@esbuild/android-arm64': 0.25.6 + '@esbuild/android-x64': 0.25.6 + '@esbuild/darwin-arm64': 0.25.6 + '@esbuild/darwin-x64': 0.25.6 + '@esbuild/freebsd-arm64': 0.25.6 + '@esbuild/freebsd-x64': 0.25.6 + '@esbuild/linux-arm': 0.25.6 + '@esbuild/linux-arm64': 0.25.6 + '@esbuild/linux-ia32': 0.25.6 + '@esbuild/linux-loong64': 0.25.6 + '@esbuild/linux-mips64el': 0.25.6 + '@esbuild/linux-ppc64': 0.25.6 + '@esbuild/linux-riscv64': 0.25.6 + '@esbuild/linux-s390x': 0.25.6 + '@esbuild/linux-x64': 0.25.6 + '@esbuild/netbsd-arm64': 0.25.6 + '@esbuild/netbsd-x64': 0.25.6 + '@esbuild/openbsd-arm64': 0.25.6 + '@esbuild/openbsd-x64': 0.25.6 + '@esbuild/openharmony-arm64': 0.25.6 + '@esbuild/sunos-x64': 0.25.6 + '@esbuild/win32-arm64': 0.25.6 + '@esbuild/win32-ia32': 0.25.6 + '@esbuild/win32-x64': 0.25.6 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@5.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-visitor-keys@4.2.1: {} + + esprima@4.0.1: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.7 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + exsolve@1.0.7: {} + + extendable-error@0.1.7: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + extract-zip@2.0.1: + dependencies: + debug: 4.4.1 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-copy@3.0.2: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fecha@4.2.3: {} + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + filter-obj@6.1.0: {} + + find-up-simple@1.0.1: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.17 + mlly: 1.7.4 + rollup: 4.41.0 + + fn.name@1.1.0: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fresh@2.0.0: {} + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-amd-module-type@6.0.1: + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-port-please@3.2.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + get-stream@8.0.1: {} + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + giget@2.0.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + node-fetch-native: 1.6.6 + nypm: 0.6.0 + pathe: 2.0.3 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + + gonzales-pe@4.3.0: + dependencies: + minimist: 1.2.8 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + gzip-size@7.0.0: + dependencies: + duplexer: 0.1.2 + + h3@1.13.0: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + ohash: 1.1.6 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + unenv: 1.10.0 + + h3@1.15.3: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.1 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + help-me@5.0.0: {} + + hookable@5.5.3: {} + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.1 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-shutdown@1.2.2: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + httpxy@0.1.7: {} + + human-id@4.1.1: {} + + human-signals@5.0.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + imurmurhash@0.1.4: {} + + index-to-position@1.1.0: {} + + inherits@2.0.4: {} + + ioredis@5.6.1: + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.4.1 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + + iron-webcrypto@1.2.1: {} + + is-arrayish@0.3.2: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-module@1.0.0: {} + + is-number@7.0.0: {} + + is-path-inside@4.0.0: {} + + is-plain-obj@2.1.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.7 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-stream@4.0.1: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-url-superb@4.0.0: {} + + is-url@1.2.4: {} + + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + is64bit@2.0.0: + dependencies: + system-architecture: 0.1.0 + + isarray@1.0.0: {} + + isbot@5.1.28: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@2.4.2: {} + + joycon@3.1.1: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsesc@3.1.0: {} + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + junk@4.0.1: {} + + jwt-decode@4.0.0: {} + + kleur@4.1.5: {} + + klona@2.0.6: {} + + knitwork@1.2.0: {} + + kuler@2.0.0: {} + + lambda-local@2.2.0: + dependencies: + commander: 10.0.1 + dotenv: 16.6.1 + winston: 3.17.0 + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + listhen@1.9.0: + dependencies: + '@parcel/watcher': 2.5.1 + '@parcel/watcher-wasm': 2.5.1 + citty: 0.1.6 + clipboardy: 4.0.0 + consola: 3.4.2 + crossws: 0.3.5 + defu: 6.1.4 + get-port-please: 3.2.0 + h3: 1.15.3 + http-shutdown: 1.2.2 + jiti: 2.4.2 + mlly: 1.7.4 + node-forge: 1.3.1 + pathe: 1.1.2 + std-env: 3.9.0 + ufo: 1.6.1 + untun: 0.1.3 + uqr: 0.1.2 + + load-tsconfig@0.2.5: {} + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.2.0 + quansync: 0.2.10 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.17.21: {} + + lodash.debounce@4.0.8: {} + + lodash.defaults@4.2.0: {} + + lodash.isarguments@3.1.0: {} + + lodash.sortby@4.7.0: {} + + lodash.startcase@4.4.0: {} + + lodash@4.17.21: {} + + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + luxon@3.7.1: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + source-map-js: 1.2.1 + + math-intrinsics@1.1.0: {} + + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micro-api-client@3.3.0: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.54.0: {} + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + mime@3.0.0: {} + + mime@4.0.7: {} + + mimic-fn@4.0.0: {} + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mkdirp@3.0.1: {} + + mlly@1.7.4: + dependencies: + acorn: 8.14.1 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + module-definition@6.0.1: + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + + mri@1.2.0: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + netlify@13.3.5: + dependencies: + '@netlify/open-api': 2.37.0 + lodash-es: 4.17.21 + micro-api-client: 3.3.0 + node-fetch: 3.3.2 + p-wait-for: 5.0.2 + qs: 6.14.0 + + nitropack@2.12.1(@netlify/blobs@9.1.2): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@netlify/functions': 3.1.10(rollup@4.45.1) + '@rollup/plugin-alias': 5.1.1(rollup@4.45.1) + '@rollup/plugin-commonjs': 28.0.6(rollup@4.45.1) + '@rollup/plugin-inject': 5.0.5(rollup@4.45.1) + '@rollup/plugin-json': 6.1.0(rollup@4.45.1) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.45.1) + '@rollup/plugin-replace': 6.0.2(rollup@4.45.1) + '@rollup/plugin-terser': 0.4.4(rollup@4.45.1) + '@vercel/nft': 0.29.4(rollup@4.45.1) + archiver: 7.0.1 + c12: 3.1.0(magicast@0.3.5) + chokidar: 4.0.3 + citty: 0.1.6 + compatx: 0.2.0 + confbox: 0.2.2 + consola: 3.4.2 + cookie-es: 2.0.0 + croner: 9.1.0 + crossws: 0.3.5 + db0: 0.3.2 + defu: 6.1.4 + destr: 2.0.5 + dot-prop: 9.0.0 + esbuild: 0.25.6 + escape-string-regexp: 5.0.0 + etag: 1.8.1 + exsolve: 1.0.7 + globby: 14.1.0 + gzip-size: 7.0.0 + h3: 1.15.3 + hookable: 5.5.3 + httpxy: 0.1.7 + ioredis: 5.6.1 + jiti: 2.4.2 + klona: 2.0.6 + knitwork: 1.2.0 + listhen: 1.9.0 + magic-string: 0.30.17 + magicast: 0.3.5 + mime: 4.0.7 + mlly: 1.7.4 + node-fetch-native: 1.6.6 + node-mock-http: 1.0.1 + ofetch: 1.4.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.2.0 + pretty-bytes: 6.1.1 + radix3: 1.1.2 + rollup: 4.45.1 + rollup-plugin-visualizer: 6.0.3(rollup@4.45.1) + scule: 1.3.0 + semver: 7.7.2 + serve-placeholder: 2.0.2 + serve-static: 2.2.0 + source-map: 0.7.4 + std-env: 3.9.0 + ufo: 1.6.1 + ultrahtml: 1.6.0 + uncrypto: 0.1.3 + unctx: 2.4.1 + unenv: 2.0.0-rc.18 + unimport: 5.1.0 + unplugin-utils: 0.2.4 + unstorage: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.6.1) + untyped: 2.0.0 + unwasm: 0.3.9 + youch: 4.1.0-beta.8 + youch-core: 0.3.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - rolldown + - sqlite3 + - supports-color + - uploadthing + + node-addon-api@7.1.1: {} + + node-domexception@1.0.0: {} + + node-fetch-native@1.6.6: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-forge@1.3.1: {} + + node-gyp-build@4.8.4: {} + + node-mock-http@1.0.1: {} + + node-releases@2.0.19: {} + + node-source-walk@7.0.1: + dependencies: + '@babel/parser': 7.28.0 + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + + normalize-path@3.0.0: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nypm@0.6.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.2.0 + tinyexec: 0.3.2 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.6 + ufo: 1.6.1 + + ohash@1.1.6: {} + + ohash@2.0.11: {} + + on-exit-leak-free@2.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + os-tmpdir@1.0.2: {} + + outdent@0.5.0: {} + + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.2.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@2.1.0: {} + + p-map@7.0.3: {} + + p-timeout@6.1.4: {} + + p-try@2.2.0: {} + + p-wait-for@5.0.2: + dependencies: + p-timeout: 6.1.4 + + package-json-from-dist@1.0.1: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.10 + + parse-gitignore@2.0.0: {} + + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.26.2 + index-to-position: 1.1.0 + type-fest: 4.41.0 + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + path-type@6.0.0: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + pathval@1.1.1: {} + + pend@1.2.0: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@4.0.1: {} + + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-pretty@13.0.0: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pump: 3.0.3 + secure-json-parse: 2.7.0 + sonic-boom: 4.2.0 + strip-json-comments: 3.1.1 + + pino-std-serializers@7.0.0: {} + + pino@9.7.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + + pirates@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.2.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.20.3): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.4.2 + postcss: 8.5.3 + tsx: 4.20.3 + + postcss-values-parser@6.0.2(postcss@8.5.3): + dependencies: + color-name: 1.1.4 + is-url-superb: 4.0.0 + postcss: 8.5.3 + quote-unquote: 1.0.0 + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + precinct@12.2.0: + dependencies: + '@dependents/detective-less': 5.0.1 + commander: 12.1.0 + detective-amd: 6.0.1 + detective-cjs: 6.0.1 + detective-es6: 5.0.1 + detective-postcss: 7.0.1(postcss@8.5.3) + detective-sass: 6.0.1 + detective-scss: 5.0.1 + detective-stylus: 5.0.1 + detective-typescript: 14.0.0(typescript@5.8.3) + detective-vue2: 2.2.0(typescript@5.8.3) + module-definition: 6.0.1 + node-source-walk: 7.0.1 + postcss: 8.5.3 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + prettier@2.8.8: {} + + prettier@3.6.2: {} + + pretty-bytes@6.1.1: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process-nextick-args@2.0.1: {} + + process-warning@5.0.0: {} + + process@0.11.10: {} + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + quansync@0.2.10: {} + + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + quote-unquote@1.0.0: {} + + radix3@1.1.2: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.5 + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-is@18.3.1: {} + + react-refresh@0.17.0: {} + + react@19.1.0: {} + + read-package-up@11.0.0: + dependencies: + find-up-simple: 1.0.1 + read-pkg: 9.0.1 + type-fest: 4.41.0 + + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 + unicorn-magic: 0.1.0 + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + real-require@0.2.0: {} + + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + redis-errors@1.2.0: {} + + redis-parser@3.0.0: + dependencies: + redis-errors: 1.2.0 + + remove-trailing-separator@1.1.0: {} + + require-directory@2.1.1: {} + + require-package-name@2.0.1: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rollup-plugin-visualizer@6.0.3(rollup@4.45.1): + dependencies: + open: 8.4.2 + picomatch: 4.0.2 + source-map: 0.7.4 + yargs: 17.7.2 + optionalDependencies: + rollup: 4.45.1 + + rollup@4.41.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.41.0 + '@rollup/rollup-android-arm64': 4.41.0 + '@rollup/rollup-darwin-arm64': 4.41.0 + '@rollup/rollup-darwin-x64': 4.41.0 + '@rollup/rollup-freebsd-arm64': 4.41.0 + '@rollup/rollup-freebsd-x64': 4.41.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.41.0 + '@rollup/rollup-linux-arm-musleabihf': 4.41.0 + '@rollup/rollup-linux-arm64-gnu': 4.41.0 + '@rollup/rollup-linux-arm64-musl': 4.41.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.41.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.41.0 + '@rollup/rollup-linux-riscv64-gnu': 4.41.0 + '@rollup/rollup-linux-riscv64-musl': 4.41.0 + '@rollup/rollup-linux-s390x-gnu': 4.41.0 + '@rollup/rollup-linux-x64-gnu': 4.41.0 + '@rollup/rollup-linux-x64-musl': 4.41.0 + '@rollup/rollup-win32-arm64-msvc': 4.41.0 + '@rollup/rollup-win32-ia32-msvc': 4.41.0 + '@rollup/rollup-win32-x64-msvc': 4.41.0 + fsevents: 2.3.3 + + rollup@4.45.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.45.1 + '@rollup/rollup-android-arm64': 4.45.1 + '@rollup/rollup-darwin-arm64': 4.45.1 + '@rollup/rollup-darwin-x64': 4.45.1 + '@rollup/rollup-freebsd-arm64': 4.45.1 + '@rollup/rollup-freebsd-x64': 4.45.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 + '@rollup/rollup-linux-arm-musleabihf': 4.45.1 + '@rollup/rollup-linux-arm64-gnu': 4.45.1 + '@rollup/rollup-linux-arm64-musl': 4.45.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-musl': 4.45.1 + '@rollup/rollup-linux-s390x-gnu': 4.45.1 + '@rollup/rollup-linux-x64-gnu': 4.45.1 + '@rollup/rollup-linux-x64-musl': 4.45.1 + '@rollup/rollup-win32-arm64-msvc': 4.45.1 + '@rollup/rollup-win32-ia32-msvc': 4.45.1 + '@rollup/rollup-win32-x64-msvc': 4.45.1 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + scheduler@0.26.0: {} + + scule@1.3.0: {} + + secure-json-parse@2.7.0: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + send@1.2.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + seroval-plugins@1.3.2(seroval@1.3.2): + dependencies: + seroval: 1.3.2 + + seroval@1.3.2: {} + + serve-placeholder@2.0.2: + dependencies: + defu: 6.1.4 + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + slash@3.0.0: {} + + slash@5.1.0: {} + + smob@1.5.0: {} + + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-license-ids@3.0.21: {} + + split2@4.2.0: {} + + sprintf-js@1.0.3: {} + + stack-trace@0.0.10: {} + + stackback@0.0.2: {} + + standard-as-callback@2.1.0: {} + + statuses@2.0.1: {} + + statuses@2.0.2: {} + + std-env@3.9.0: {} + + streamx@2.22.1: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.6.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + supports-color@10.0.0: {} + + supports-preserve-symlinks-flag@1.0.0: {} + + system-architecture@0.1.0: {} + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.1 + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + + term-size@2.2.1: {} + + terser@5.43.1: + dependencies: + '@jridgewell/source-map': 0.3.10 + acorn: 8.14.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + + text-hex@1.0.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + tiny-invariant@1.3.3: {} + + tiny-warning@1.0.3: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.3 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + tmp@0.2.3: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + toml@3.0.0: {} + + tr46@0.0.3: {} + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + triple-beam@1.4.1: {} + + ts-api-utils@2.1.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + ts-interface-checker@0.1.13: {} + + tslib@2.8.1: {} + + tsup@8.5.0(jiti@2.4.2)(postcss@8.5.3)(tsx@4.20.3)(typescript@5.8.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.4) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.1 + esbuild: 0.25.4 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.20.3) + resolve-from: 5.0.0 + rollup: 4.41.0 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.13 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.3 + typescript: 5.8.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + tsx@4.20.3: + dependencies: + esbuild: 0.25.4 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + + type-detect@4.1.0: {} + + type-fest@4.41.0: {} + + typescript@5.8.3: {} + + ufo@1.6.1: {} + + ultrahtml@1.6.0: {} + + uncrypto@0.1.3: {} + + unctx@2.4.1: + dependencies: + acorn: 8.14.1 + estree-walker: 3.0.3 + magic-string: 0.30.17 + unplugin: 2.3.5 + + undici-types@6.19.8: {} + + undici@7.11.0: {} + + unenv@1.10.0: + dependencies: + consola: 3.4.2 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.6 + pathe: 1.1.2 + + unenv@2.0.0-rc.18: + dependencies: + defu: 6.1.4 + exsolve: 1.0.7 + ohash: 2.0.11 + pathe: 2.0.3 + ufo: 1.6.1 + + unicorn-magic@0.1.0: {} + + unicorn-magic@0.3.0: {} + + unimport@5.1.0: + dependencies: + acorn: 8.15.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.1.1 + magic-string: 0.30.17 + mlly: 1.7.4 + pathe: 2.0.3 + picomatch: 4.0.2 + pkg-types: 2.2.0 + scule: 1.3.0 + strip-literal: 3.0.0 + tinyglobby: 0.2.14 + unplugin: 2.3.5 + unplugin-utils: 0.2.4 + + universalify@0.1.2: {} + + unixify@1.0.0: + dependencies: + normalize-path: 2.1.1 + + unplugin-utils@0.2.4: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.2 + + unplugin@1.16.1: + dependencies: + acorn: 8.14.1 + webpack-virtual-modules: 0.6.2 + + unplugin@2.3.5: + dependencies: + acorn: 8.14.1 + picomatch: 4.0.2 + webpack-virtual-modules: 0.6.2 + + unstorage@1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.6.1): + dependencies: + anymatch: 3.1.3 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.3 + lru-cache: 10.4.3 + node-fetch-native: 1.6.6 + ofetch: 1.4.1 + ufo: 1.6.1 + optionalDependencies: + '@netlify/blobs': 9.1.2 + db0: 0.3.2 + ioredis: 5.6.1 + + untun@0.1.3: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 1.1.2 + + untyped@2.0.0: + dependencies: + citty: 0.1.6 + defu: 6.1.4 + jiti: 2.4.2 + knitwork: 1.2.0 + scule: 1.3.0 + + unwasm@0.3.9: + dependencies: + knitwork: 1.2.0 + magic-string: 0.30.17 + mlly: 1.7.4 + pathe: 1.1.2 + pkg-types: 1.3.1 + unplugin: 1.16.1 + + update-browserslist-db@1.1.3(browserslist@4.25.1): + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uqr@0.1.2: {} + + urlpattern-polyfill@10.1.0: {} + + urlpattern-polyfill@8.0.2: {} + + use-sync-external-store@1.5.0(react@19.1.0): + dependencies: + react: 19.1.0 + + util-deprecate@1.0.2: {} + + uuid@11.1.0: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + vite-node@1.6.1(@types/node@20.17.48)(terser@5.43.1): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.19(@types/node@20.17.48)(terser@5.43.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.19(@types/node@20.17.48)(terser@5.43.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.41.0 + optionalDependencies: + '@types/node': 20.17.48 + fsevents: 2.3.3 + terser: 5.43.1 + + vitest@1.6.1(@types/node@20.17.48)(terser@5.43.1): + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.4.1 + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.17 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.9.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.19(@types/node@20.17.48)(terser@5.43.1) + vite-node: 1.6.1(@types/node@20.17.48)(terser@5.43.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.17.48 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + web-streams-polyfill@3.3.3: {} + + webidl-conversions@3.0.1: {} + + webidl-conversions@4.0.2: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.17.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@6.0.0: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + xmlbuilder2@3.1.1: + dependencies: + '@oozcitak/dom': 1.15.10 + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + js-yaml: 3.14.1 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@5.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@1.2.1: {} + + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.2 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.8: + dependencies: + '@poppinss/colors': 4.1.5 + '@poppinss/dumper': 0.6.4 + '@speed-highlight/core': 1.2.7 + cookie: 1.0.2 + youch-core: 0.3.3 + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 + + zod@3.25.5: {} diff --git a/packages/app-connect/src/.DS_Store b/packages/app-connect/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..76419a67e262027e533b4b03a546407d607d9b9c GIT binary patch literal 6148 zcmeHLO-{l<6n-NG32sQ-xYEY03*iQp;0d^Z@)I?JCHy3~>lHkKSMV0>HSqv$IfIGc zn;F}gw&>0n@*bJ_+Ba|def@wL3K6N!a@Zzn5>XwEF=(JG2_ENGh&`J*0xErt8O_Hx z?cN}sObgYL5C_D8|K-|S-EMyz_mQtRPO9f&XMItu8U9)` zy>-`#2$!IJ=vdJdDn>NVE2(`JD_kwlo8VhZ?mCk=Q?tFw*Td@}1@xd5E&MgD^5l-W z8jjbghIFpWUN&CBTc-tGgL|%VK=(d>;|%Hx0~AsS<3F)^r@4s`kv02m;x1IK#r1csadMivu;$RL!N3N%xd zeZ){^I`W~di!3Gv&2&cAJ%FuCsl literal 0 HcmV?d00001 diff --git a/packages/app-connect/src/errors/base-error.ts b/packages/app-connect/src/errors/base-error.ts new file mode 100644 index 00000000..ed8c9f1b --- /dev/null +++ b/packages/app-connect/src/errors/base-error.ts @@ -0,0 +1,44 @@ +import { randomUUID } from 'node:crypto'; +import type { ErrorDetails, GoDaddyError } from '../types/error-schema'; + +/** + * Base class for all verification errors that follow GoDaddy's error schema + */ +export class VerificationError extends Error implements GoDaddyError { + name: string; + correlationId: string; + details?: ErrorDetails[]; + informationLink?: string; + + constructor(options: { + name: string; + message: string; + correlationId?: string; + details?: ErrorDetails[]; + informationLink?: string; + }) { + super(options.message); + this.name = options.name; + this.correlationId = options.correlationId || randomUUID(); + this.details = options.details; + this.informationLink = options.informationLink; + + // Maintains proper stack trace for where our error was thrown (only available on V8) + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + } + + /** + * Converts the error to a JSON representation that follows the GoDaddy error schema + */ + toJSON(): GoDaddyError { + return { + name: this.name, + correlationId: this.correlationId, + message: this.message, + ...(this.informationLink && { informationLink: this.informationLink }), + ...(this.details && { details: this.details }), + }; + } +} diff --git a/packages/app-connect/src/errors/verification-errors.test.ts b/packages/app-connect/src/errors/verification-errors.test.ts new file mode 100644 index 00000000..9bf1e79e --- /dev/null +++ b/packages/app-connect/src/errors/verification-errors.test.ts @@ -0,0 +1,120 @@ +import { describe, expect, it } from 'vitest'; +import { + ExpiredSignatureError, + InvalidAlgorithmError, + InvalidSignatureError, + InvalidVersionError, + MissingHeaderError, +} from './verification-errors'; + +describe('Verification Errors', () => { + describe('MissingHeaderError', () => { + it('should format error with correct schema', () => { + const error = new MissingHeaderError({ + headerName: 'x-godaddy-signature', + }); + expect(error.name).toBe('MISSING_SIGNATURE_HEADER'); + expect(error.message).toBe( + 'Missing required header: x-godaddy-signature', + ); + expect(error.correlationId).toBeDefined(); + expect(error.details).toHaveLength(1); + expect(error.details?.[0].issue).toBe('MISSING_REQUIRED_HEADER'); + }); + + it('should use provided correlationId', () => { + const correlationId = '123e4567-e89b-12d3-a456-426614174000'; + const error = new MissingHeaderError({ + headerName: 'x-godaddy-signature', + correlationId, + }); + expect(error.correlationId).toBe(correlationId); + }); + }); + + describe('ExpiredSignatureError', () => { + it('should format error with correct schema', () => { + const timestamp = '2023-01-01T00:00:00Z'; + const error = new ExpiredSignatureError({ + timestamp, + maxAge: 300, + }); + expect(error.name).toBe('EXPIRED_SIGNATURE'); + expect(error.message).toBe(`Signature timestamp expired: ${timestamp}`); + expect(error.correlationId).toBeDefined(); + expect(error.details).toHaveLength(1); + expect(error.details?.[0].issue).toBe('SIGNATURE_EXPIRED'); + expect(error.details?.[0].value).toBe(timestamp); + }); + }); + + describe('InvalidSignatureError', () => { + it('should format error with correct schema', () => { + const error = new InvalidSignatureError(); + expect(error.name).toBe('INVALID_SIGNATURE'); + expect(error.message).toBe('The request signature is invalid'); + expect(error.correlationId).toBeDefined(); + expect(error.details).toHaveLength(1); + expect(error.details?.[0].issue).toBe('SIGNATURE_VERIFICATION_FAILED'); + }); + }); + + describe('InvalidAlgorithmError', () => { + it('should format error with correct schema', () => { + const algorithm = 'INVALID-ALG'; + const error = new InvalidAlgorithmError({ + algorithm, + }); + expect(error.name).toBe('INVALID_ALGORITHM'); + expect(error.message).toBe( + `Unsupported signature algorithm: ${algorithm}`, + ); + expect(error.correlationId).toBeDefined(); + expect(error.details).toHaveLength(1); + expect(error.details?.[0].issue).toBe('UNSUPPORTED_ALGORITHM'); + expect(error.details?.[0].value).toBe(algorithm); + }); + }); + + describe('InvalidVersionError', () => { + it('should format error with correct schema', () => { + const version = '2.0'; + const error = new InvalidVersionError({ + version, + }); + expect(error.name).toBe('INVALID_VERSION'); + expect(error.message).toBe(`Unsupported signature version: ${version}`); + expect(error.correlationId).toBeDefined(); + expect(error.details).toHaveLength(1); + expect(error.details?.[0].issue).toBe('UNSUPPORTED_VERSION'); + expect(error.details?.[0].value).toBe(version); + }); + }); + + describe('Error serialization', () => { + it('should correctly serialize to JSON', () => { + const correlationId = '123e4567-e89b-12d3-a456-426614174000'; + const error = new MissingHeaderError({ + headerName: 'x-godaddy-signature', + correlationId, + }); + + const serialized = error.toJSON(); + + expect(serialized).toEqual({ + name: 'MISSING_SIGNATURE_HEADER', + correlationId, + message: 'Missing required header: x-godaddy-signature', + details: [ + { + issue: 'MISSING_REQUIRED_HEADER', + description: + 'The x-godaddy-signature header is required for request verification', + field: 'x-godaddy-signature', + location: 'header', + }, + ], + }); + }); + }); +}); diff --git a/packages/app-connect/src/errors/verification-errors.ts b/packages/app-connect/src/errors/verification-errors.ts new file mode 100644 index 00000000..3077ec90 --- /dev/null +++ b/packages/app-connect/src/errors/verification-errors.ts @@ -0,0 +1,136 @@ +import { VerificationError } from './base-error'; + +/** + * Error thrown when a required signature header is missing + */ +export class MissingHeaderError extends VerificationError { + constructor({ + headerName, + correlationId, + }: { + headerName: string; + correlationId?: string; + }) { + super({ + name: 'MISSING_SIGNATURE_HEADER', + message: `Missing required header: ${headerName}`, + correlationId, + details: [ + { + issue: 'MISSING_REQUIRED_HEADER', + description: `The ${headerName} header is required for request verification`, + field: headerName, + location: 'header', // Now explicitly supported in the schema + }, + ], + }); + } +} + +/** + * Error thrown when the signature timestamp is too old + */ +export class ExpiredSignatureError extends VerificationError { + constructor({ + timestamp, + maxAge, + correlationId, + }: { + timestamp: string; + maxAge: number; + correlationId?: string; + }) { + super({ + name: 'EXPIRED_SIGNATURE', + message: `Signature timestamp expired: ${timestamp}`, + correlationId, + details: [ + { + issue: 'SIGNATURE_EXPIRED', + description: `Signature timestamp is older than ${maxAge} seconds`, + field: 'x-godaddy-signature-timestamp', + value: timestamp, + location: 'header', + }, + ], + }); + } +} + +/** + * Error thrown when signature verification fails + */ +export class InvalidSignatureError extends VerificationError { + constructor({ correlationId }: { correlationId?: string } = {}) { + super({ + name: 'INVALID_SIGNATURE', + message: 'The request signature is invalid', + correlationId, + details: [ + { + issue: 'SIGNATURE_VERIFICATION_FAILED', + description: + 'The request signature could not be verified with the provided public key', + field: 'x-godaddy-signature', + location: 'header', + }, + ], + }); + } +} + +/** + * Error thrown when the signature algorithm is not supported + */ +export class InvalidAlgorithmError extends VerificationError { + constructor({ + algorithm, + correlationId, + }: { + algorithm: string; + correlationId?: string; + }) { + super({ + name: 'INVALID_ALGORITHM', + message: `Unsupported signature algorithm: ${algorithm}`, + correlationId, + details: [ + { + issue: 'UNSUPPORTED_ALGORITHM', + description: 'Only ECDSA-P256-SHA256 is supported', + field: 'x-godaddy-signature-algorithm', + value: algorithm, + location: 'header', + }, + ], + }); + } +} + +/** + * Error thrown when the signature version is not supported + */ +export class InvalidVersionError extends VerificationError { + constructor({ + version, + correlationId, + }: { + version: string; + correlationId?: string; + }) { + super({ + name: 'INVALID_VERSION', + message: `Unsupported signature version: ${version}`, + correlationId, + details: [ + { + issue: 'UNSUPPORTED_VERSION', + description: 'Only version 1.0 is supported', + field: 'x-godaddy-signature-version', + value: version, + location: 'header', + }, + ], + }); + } +} diff --git a/packages/app-connect/src/express/index.ts b/packages/app-connect/src/express/index.ts new file mode 100644 index 00000000..c119675d --- /dev/null +++ b/packages/app-connect/src/express/index.ts @@ -0,0 +1,56 @@ +import type { NextFunction, Request, Response } from 'express'; +import type { VerifiableRequest } from '../types/verifiable-request'; +import type { + VerificationOptions, + WebhookVerificationOptions, +} from '../utils/config'; +import { verifyAction } from '../utils/verification'; +import { verifyWebhookSubscription } from '../utils/webhook'; + +/** + * Creates a middleware for Express.js that verifies signed action requests + */ +export function createActionMiddleware(options?: VerificationOptions) { + return async (req: Request, res: Response, next: NextFunction) => { + const verifiableRequest: VerifiableRequest = { + method: req.method, + url: req.originalUrl || req.url, + path: req.path, + query: req.query as Record, + headers: req.headers as Record, + body: req.body, + }; + + const result = await verifyAction(verifiableRequest, options); + + if (!result.success) { + return res.status(401).json(result.error); + } + + next(); + }; +} + +/** + * Creates a middleware for Express.js that verifies webhook subscription requests + */ +export function createWebhookMiddleware(options?: WebhookVerificationOptions) { + return (req: Request, res: Response, next: NextFunction) => { + const verifiableRequest: VerifiableRequest = { + method: req.method, + url: req.originalUrl || req.url, + path: req.path, + query: req.query as Record, + headers: req.headers as Record, + body: req.body, + }; + + const result = verifyWebhookSubscription(verifiableRequest, options); + + if (!result.success) { + return res.status(401).json(result.error); + } + + next(); + }; +} diff --git a/packages/app-connect/src/index.ts b/packages/app-connect/src/index.ts new file mode 100644 index 00000000..0094023e --- /dev/null +++ b/packages/app-connect/src/index.ts @@ -0,0 +1,40 @@ +// Export main verification functions +export { verifyAction } from './utils/verification'; +export { verifyWebhookSubscription } from './utils/webhook'; + +// Export framework adapters +export { createActionMiddleware, createWebhookMiddleware } from './express'; +export * as next from './next'; +export * as tanstack from './tanstack'; + +// Export types +export type { Result } from './types/result'; +export type { VerifiableRequest } from './types/verifiable-request'; + +// Export errors +export { VerificationError } from './errors/base-error'; +export { + MissingHeaderError, + ExpiredSignatureError, + InvalidSignatureError, + InvalidAlgorithmError, + InvalidVersionError, +} from './errors/verification-errors'; +// Export webhook verification types and errors +export { + InvalidWebhookSignatureError, + MissingWebhookHeaderError, +} from './utils/webhook'; + +// Export action verification types and options +export type { + VerificationOptions, + WebhookVerificationOptions, +} from './utils/config'; + +// Export error schema types +export type { + GoDaddyError, + ErrorDetails, + LinkDescription, +} from './types/error-schema'; diff --git a/packages/app-connect/src/next/index.ts b/packages/app-connect/src/next/index.ts new file mode 100644 index 00000000..7376395d --- /dev/null +++ b/packages/app-connect/src/next/index.ts @@ -0,0 +1,30 @@ +import type { VerifiableRequest } from '../types/verifiable-request'; +import type { + VerificationOptions, + WebhookVerificationOptions, +} from '../utils/config'; +import { verifyAction as coreVerifyAction } from '../utils/verification'; +import { verifyWebhookSubscription as coreVerifyWebhookSubscription } from '../utils/webhook'; + +// Re-export the VerifiableRequest type for Next.js users +export type { VerifiableRequest } from '../types/verifiable-request'; + +/** + * Verifies a signed action request in a Next.js environment + */ +export function verifyAction( + req: VerifiableRequest, + options?: VerificationOptions, +) { + return coreVerifyAction(req, options); +} + +/** + * Verifies a webhook subscription request in a Next.js environment + */ +export function verifyWebhookSubscription( + req: VerifiableRequest, + options?: WebhookVerificationOptions, +) { + return coreVerifyWebhookSubscription(req, options); +} diff --git a/packages/app-connect/src/tanstack/index.ts b/packages/app-connect/src/tanstack/index.ts new file mode 100644 index 00000000..240d659a --- /dev/null +++ b/packages/app-connect/src/tanstack/index.ts @@ -0,0 +1,78 @@ +import { createMiddleware } from '@tanstack/react-start'; +import type { VerifiableRequest } from '../types/verifiable-request'; +import type { + VerificationOptions, + WebhookVerificationOptions, +} from '../utils/config'; +import { verifyAction } from '../utils/verification'; +import { verifyWebhookSubscription } from '../utils/webhook'; + +/** + * Creates a middleware for TanStack Start that verifies signed action requests + */ +export function createActionMiddleware(options?: VerificationOptions) { + const middleware = createMiddleware({ type: 'request' }).server( + async ({ next, request }) => { + const url = new URL(request.url); + + const verifiableRequest: VerifiableRequest = { + method: request.method, + url: request.url, + path: url.pathname, + query: Object.fromEntries(url.searchParams), + // biome-ignore lint/suspicious/noExplicitAny: Headers type compatibility issue + headers: Object.fromEntries(request.headers as any), + body: request.body ? await request.json() : undefined, + }; + + const result = await verifyAction(verifiableRequest, options); + + if (!result.success) { + throw new Response(JSON.stringify(result.error), { + status: 401, + headers: { 'Content-Type': 'application/json' }, + }); + } + + return next(); + }, + ); + + // biome-ignore lint/suspicious/noExplicitAny: TanStack type inference issue + return middleware as any; +} + +/** + * Creates a middleware for TanStack Start that verifies webhook subscription requests + */ +export function createWebhookMiddleware(options?: WebhookVerificationOptions) { + const middleware = createMiddleware({ type: 'request' }).server( + async ({ next, request }) => { + const url = new URL(request.url); + + const verifiableRequest: VerifiableRequest = { + method: request.method, + url: request.url, + path: url.pathname, + query: Object.fromEntries(url.searchParams), + // biome-ignore lint/suspicious/noExplicitAny: Headers type compatibility issue + headers: Object.fromEntries(request.headers as any), + body: request.body ? await request.json() : undefined, + }; + + const result = verifyWebhookSubscription(verifiableRequest, options); + + if (!result.success) { + throw new Response(JSON.stringify(result.error), { + status: 401, + headers: { 'Content-Type': 'application/json' }, + }); + } + + return next(); + }, + ); + + // biome-ignore lint/suspicious/noExplicitAny: TanStack type inference issue + return middleware as any; +} diff --git a/packages/app-connect/src/types/error-schema.ts b/packages/app-connect/src/types/error-schema.ts new file mode 100644 index 00000000..06307a3b --- /dev/null +++ b/packages/app-connect/src/types/error-schema.ts @@ -0,0 +1,32 @@ +/** + * GoDaddy standard error schema + * Based on https://godaddy.com/schemas/common/error.v1 + */ + +export interface ErrorDetails { + field?: string; + value?: string; + location?: 'body' | 'path' | 'query' | 'header'; + issue: string; + description?: string; +} + +export interface LinkDescription { + href: string; + rel: string; + title?: string; + targetMediaType?: string; + targetSchema?: unknown; + method?: string; + submissionMediaType?: string; + submissionSchema?: unknown; +} + +export interface GoDaddyError { + name: string; + correlationId: string; + message: string; + informationLink?: string; + details?: ErrorDetails[]; + links?: LinkDescription[]; +} diff --git a/packages/app-connect/src/types/result.ts b/packages/app-connect/src/types/result.ts new file mode 100644 index 00000000..e7af1271 --- /dev/null +++ b/packages/app-connect/src/types/result.ts @@ -0,0 +1,30 @@ +import type { GoDaddyError } from './error-schema'; + +/** + * A Result type that represents either a successful operation or an error + */ +export interface Result { + success: boolean; + error?: GoDaddyError; + value?: T; +} + +/** + * Creates a successful result + */ +export function ok(value?: T): Result { + return { + success: true, + value, + }; +} + +/** + * Creates an error result + */ +export function error(err: GoDaddyError): Result { + return { + success: false, + error: err, + }; +} diff --git a/packages/app-connect/src/types/verifiable-request.ts b/packages/app-connect/src/types/verifiable-request.ts new file mode 100644 index 00000000..f62ce0ca --- /dev/null +++ b/packages/app-connect/src/types/verifiable-request.ts @@ -0,0 +1,23 @@ +/** + * Represents a request that can be verified + * This is a framework-agnostic representation of an HTTP request + */ +export interface VerifiableRequest { + /** The HTTP method (GET, POST, etc.) */ + method: string; + + /** The full URL of the request */ + url: string; + + /** The path component of the URL */ + path: string; + + /** The query parameters as a record */ + query: Record; + + /** The request headers as a record */ + headers: Record; + + /** The request body, if any */ + body?: unknown; +} diff --git a/packages/app-connect/src/utils/config.ts b/packages/app-connect/src/utils/config.ts new file mode 100644 index 00000000..b9893ccd --- /dev/null +++ b/packages/app-connect/src/utils/config.ts @@ -0,0 +1,68 @@ +import { base64ToArrayBuffer } from './strings'; + +/** + * Configuration options for request verification + */ +export interface VerificationOptions { + /** + * The public key to use for verification. + * If not provided, it will be read from the GODADDY_PUBLIC_KEY environment variable. + */ + publicKey?: string; + + /** + * The maximum age of a signature timestamp in seconds. + * Default is 300 seconds (5 minutes). + */ + maxTimestampAgeSeconds?: number; +} + +/** + * Configuration options for webhook subscription verification + */ +export interface WebhookVerificationOptions { + /** + * The secret to use for verification. + * If not provided, it will be read from the GODADDY_WEBHOOK_SECRET environment variable. + */ + secret?: string; +} + +/** + * Constants for verification + */ +export const VERIFICATION_CONSTANTS = { + SUPPORTED_ALGORITHM: 'ECDSA-P256-SHA256', + SUPPORTED_VERSION: '1.0', + DEFAULT_MAX_TIMESTAMP_AGE_SECONDS: 300, // 5 minutes +}; + +/** + * Gets the public key for verification + */ +export function getPublicKeyBuffer(options?: VerificationOptions): ArrayBuffer { + const publicKey = options?.publicKey || process.env.GODADDY_PUBLIC_KEY; + + if (!publicKey) { + throw new Error( + 'Public key is required for verification. Set GODADDY_PUBLIC_KEY environment variable or provide in options.', + ); + } + + return base64ToArrayBuffer(publicKey); +} + +/** + * Gets the webhook secret for verification + */ +export function getWebhookSecret(options?: WebhookVerificationOptions): string { + const secret = options?.secret || process.env.GODADDY_WEBHOOK_SECRET; + + if (!secret) { + throw new Error( + 'Webhook secret is required for verification. Set GODADDY_WEBHOOK_SECRET environment variable or provide in options.', + ); + } + + return secret; +} diff --git a/packages/app-connect/src/utils/logger.ts b/packages/app-connect/src/utils/logger.ts new file mode 100644 index 00000000..07d3a784 --- /dev/null +++ b/packages/app-connect/src/utils/logger.ts @@ -0,0 +1,24 @@ +import pino from 'pino'; + +/** + * Configure pino logger for structured logging + * Creates JSON formatted logs suitable for ECS and cloud environments + */ +export const logger = pino({ + level: process.env.LOG_LEVEL || 'debug', + // For ECS/production environments, use JSON format + // For test environments, also use JSON format to avoid transport issues + ...(process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'test' + ? {} + : { + transport: { + target: 'pino-pretty', + options: { + colorize: true, + translateTime: 'yyyy-mm-dd HH:MM:ss', + }, + }, + }), +}); + +export default logger; diff --git a/packages/app-connect/src/utils/strings.ts b/packages/app-connect/src/utils/strings.ts new file mode 100644 index 00000000..b7f21314 --- /dev/null +++ b/packages/app-connect/src/utils/strings.ts @@ -0,0 +1,17 @@ +export function base64ToArrayBuffer(base64: string): ArrayBuffer { + const binaryString = + typeof window !== 'undefined' + ? window.atob(base64) + : Buffer.from(base64, 'base64').toString('binary'); + const len = binaryString.length; + const bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes.buffer; +} + +// Helper to convert string to ArrayBuffer (UTF-8) +export function stringToArrayBuffer(str: string): ArrayBuffer { + return new TextEncoder().encode(str).buffer; +} diff --git a/packages/app-connect/src/utils/verification.test.ts b/packages/app-connect/src/utils/verification.test.ts new file mode 100644 index 00000000..6a641fc7 --- /dev/null +++ b/packages/app-connect/src/utils/verification.test.ts @@ -0,0 +1,213 @@ +import { describe, expect, it } from 'vitest'; +import type { VerifiableRequest } from '../types/verifiable-request'; +import { canonicalizeRequest, verifyAction } from './verification'; + +describe('Canonicalization', () => { + describe('canonicalizeRequest', () => { + it('should match Go signer canonical string exactly', () => { + // This is the exact request data that would produce the Go signer output + const testRequest: VerifiableRequest = { + method: 'POST', + path: '/v1/extensions/taxes-calculate', + headers: { + 'content-length': '513', + 'content-type': 'application/json', + 'x-store-id': 'f9b38cc4-b127-44a3-8a8c-401a1302a849', + // Add some headers that should be ignored + 'x-godaddy-signature': 'should-be-ignored', + 'user-agent': 'should-be-ignored', + authorization: 'should-be-ignored', + }, + body: { + destination: { + address: { + countryCode: 'US', + postalCode: '94105', + adminArea1: 'CA', + adminArea2: 'San Francisco', + }, + }, + lines: [ + { + id: 'line_item_1', + type: 'SKU', + subtotalPrice: { + value: 9999, + currencyCode: 'USD', + }, + quantity: 2, + unitPrice: { + value: 4999, + currencyCode: 'USD', + }, + classification: 'general', + origin: null, + destination: null, + }, + { + id: 'shipping', + type: 'SHIPPING', + subtotalPrice: { + value: 599, + currencyCode: 'USD', + }, + quantity: 1, + unitPrice: { + value: 599, + currencyCode: 'USD', + }, + origin: null, + destination: null, + }, + ], + }, + }; + + // Expected canonical string from Go signer (convert literal \n to actual newlines) + const expectedCanonical = + 'POST /v1/extensions/taxes-calculate\ncontent-length: 513\ncontent-type: application/json\nx-store-id: f9b38cc4-b127-44a3-8a8c-401a1302a849\n\n{"destination":{"address":{"countryCode":"US","postalCode":"94105","adminArea1":"CA","adminArea2":"San Francisco"}},"lines":[{"id":"line_item_1","type":"SKU","subtotalPrice":{"value":9999,"currencyCode":"USD"},"quantity":2,"unitPrice":{"value":4999,"currencyCode":"USD"},"classification":"general","origin":null,"destination":null},{"id":"shipping","type":"SHIPPING","subtotalPrice":{"value":599,"currencyCode":"USD"},"quantity":1,"unitPrice":{"value":599,"currencyCode":"USD"},"origin":null,"destination":null}]}'; + + const result = canonicalizeRequest(testRequest); + + // Debug output (keep console.log for test debugging) + console.log('Expected:', JSON.stringify(expectedCanonical)); + console.log('Actual :', JSON.stringify(result)); + + expect(result).toBe(expectedCanonical); + }); + + it('should handle query parameters in sorted order', () => { + const testRequest: VerifiableRequest = { + method: 'GET', + path: '/api/test', + query: { + z: 'last', + a: 'first', + m: 'middle', + }, + headers: { + 'content-type': 'application/json', + }, + }; + + const result = canonicalizeRequest(testRequest); + + // Should sort query params alphabetically: a, m, z + expect(result).toContain('GET /api/test?a=first&m=middle&z=last\n'); + }); + + it('should ignore non-allowed headers', () => { + const testRequest: VerifiableRequest = { + method: 'POST', + path: '/test', + headers: { + 'content-type': 'application/json', + authorization: 'Bearer token', // Should be ignored + 'user-agent': 'test-agent', // Should be ignored + 'x-custom-header': 'custom', // Should be ignored + 'x-godaddy-signature': 'sig', // Should be ignored + 'x-store-id': 'store123', + }, + }; + + const result = canonicalizeRequest(testRequest); + + // Should only include allowed headers + expect(result).toContain('content-type: application/json'); + expect(result).toContain('x-store-id: store123'); + expect(result).not.toContain('authorization'); + expect(result).not.toContain('user-agent'); + expect(result).not.toContain('x-custom-header'); + expect(result).not.toContain('x-godaddy-signature'); + }); + }); + + describe('verifyAction with real signature', () => { + it('should verify the provided signature and public key', async () => { + // Real signature and public key from the user + const signature = + 'OtanaOz66IJHZsMz0Id/W/h/GKY/8CdOu6nx9VlbgML+2IM3kF/ON2W4dM//dk2kjGWBLVp1OLxL2+fcBT9HQw=='; + const publicKeyBase64 = + 'MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPqMv7UipvIge7cD0tBc3eivMadZ6uS344tPKR5iUt7rYTcrRbUvPOG6SpdfsW2jPnuxx5Drq7zs9fXqmFE/SyA=='; + + // Create the same request that produced the Go signer canonical string + const testRequest: VerifiableRequest = { + method: 'POST', + path: '/v1/extensions/taxes-calculate', + headers: { + 'content-length': '513', + 'content-type': 'application/json', + 'x-store-id': 'f9b38cc4-b127-44a3-8a8c-401a1302a849', + // Add signature headers + 'x-godaddy-signature': signature, + 'x-godaddy-signature-algorithm': 'ECDSA-P256-SHA256', + 'x-godaddy-signature-version': '1.0', + 'x-godaddy-signature-timestamp': new Date().toISOString(), // Use current time + }, + body: { + destination: { + address: { + countryCode: 'US', + postalCode: '94105', + adminArea1: 'CA', + adminArea2: 'San Francisco', + }, + }, + lines: [ + { + id: 'line_item_1', + type: 'SKU', + subtotalPrice: { + value: 9999, + currencyCode: 'USD', + }, + quantity: 2, + unitPrice: { + value: 4999, + currencyCode: 'USD', + }, + classification: 'general', + origin: null, + destination: null, + }, + { + id: 'shipping', + type: 'SHIPPING', + subtotalPrice: { + value: 599, + currencyCode: 'USD', + }, + quantity: 1, + unitPrice: { + value: 599, + currencyCode: 'USD', + }, + origin: null, + destination: null, + }, + ], + }, + }; + + // Convert base64 public key to ArrayBuffer + const publicKeyBuffer = Uint8Array.from(atob(publicKeyBase64), (c) => + c.charCodeAt(0), + ).buffer; + + // Test with very generous timestamp tolerance + const result = await verifyAction(testRequest, { + publicKey: publicKeyBuffer, + maxTimestampAgeSeconds: 86400, // 24 hours tolerance + }); + + // Debug output (keep console.log for test debugging) + console.log('Verification result:', result); + + if (!result.success) { + console.log('Verification failed:', result.error); + } + + expect(result.success).toBe(true); + }); + }); +}); diff --git a/packages/app-connect/src/utils/verification.ts b/packages/app-connect/src/utils/verification.ts new file mode 100644 index 00000000..ba498549 --- /dev/null +++ b/packages/app-connect/src/utils/verification.ts @@ -0,0 +1,456 @@ +import * as crypto from 'node:crypto'; +import { VerificationError } from '../errors/base-error'; +import { + ExpiredSignatureError, + InvalidAlgorithmError, + InvalidSignatureError, + InvalidVersionError, + MissingHeaderError, +} from '../errors/verification-errors'; +import { type Result, error, ok } from '../types/result'; +import type { VerifiableRequest } from '../types/verifiable-request'; +import { + VERIFICATION_CONSTANTS, + type VerificationOptions, + type WebhookVerificationOptions, + getPublicKeyBuffer, + getWebhookSecret, +} from './config'; +import { logger } from './logger'; +import { base64ToArrayBuffer, stringToArrayBuffer } from './strings'; + +/** + * Headers that are included in the canonicalization for signatures + * IMPORTANT: Order must match the Go middleware exactly + */ +const HEADERS_TO_SIGN = ['content-length', 'content-type', 'x-store-id']; + +/** + * Canonicalizes a request for signature verification + * + * IMPORTANT: This must produce byte-for-byte identical output to the Go middleware's + * canonicalizeRequest function or signature verification will fail. + * Do not change the order of operations or formatting without testing against + * real signatures produced by the middleware. + */ +export function canonicalizeRequest(req: VerifiableRequest): string { + logger.info('Starting request canonicalization'); + + // 1. HTTP Method (Uppercase) + const method = req.method.toUpperCase(); + logger.debug({ method }, 'HTTP method processed'); + + // 2. URI Path with query parameters + let path = req.url || '/'; + + // Add query parameters if they exist + if (req.query && Object.keys(req.query).length > 0) { + const sortedEntries = Object.entries(req.query).sort(([a], [b]) => + a.localeCompare(b), + ); + const queryString = sortedEntries + .map(([key, value]) => `${key}=${value}`) + .join('&'); + path = `${path}?${queryString}`; + } + + logger.debug({ path }, 'Request path with query parameters'); + + // 3. Include headers in canonical form + const headerParts = []; + + // Create map of allowed headers for quick lookup + const allowedHeaders: Record = {}; + for (const header of HEADERS_TO_SIGN) { + allowedHeaders[header] = true; + } + + // Get all header keys and sort them + const headerKeys = Object.keys(req.headers).sort(); + + // Add headers in sorted order, but only those in the allow list + for (const key of headerKeys) { + const lowerKey = key.toLowerCase(); + + // Skip if not in allowed list or if it's a signature header + if ( + !allowedHeaders[lowerKey] || + lowerKey.startsWith('x-godaddy-signature') + ) { + continue; + } + + const values = req.headers[key]; + const headerValues = Array.isArray(values) ? values : [values]; + + for (const value of headerValues) { + if (value !== undefined && value !== null) { + const headerLine = `${lowerKey}: ${value}`; + logger.debug({ headerLine }, 'Added header to canonical string'); + headerParts.push(headerLine); + } + } + } + + // Create canonical string with method, path, and headers + let canonicalString = `${method} ${path}\n${headerParts.join('\n')}\n`; + + // Add request body if it exists + if (req.body && (req.headers['content-length'] || '0') !== '0') { + logger.debug('Adding request body to canonical string'); + // Add an extra blank line before the body + canonicalString += '\n'; + + // Add the body to the canonical string + // Use original body exactly as received to match Go middleware + const bodyContent = + typeof req.body === 'string' ? req.body : JSON.stringify(req.body); + canonicalString += bodyContent; + + logger.debug( + { bodyLength: bodyContent.length }, + 'Request body added to canonical string', + ); + } + + console.log('==== START CANONICAL STRING ==='); + console.log(canonicalString); + console.log('==== END CANONICAL STRING ==='); + // logger.debug({ canonicalString }, "Generated canonical string"); + + return canonicalString; +} + +/** + * Verifies a signed action request + */ +export async function verifyAction( + req: VerifiableRequest, + options?: VerificationOptions, +): Promise> { + try { + logger.info('Starting signature verification'); + + // Get required headers + const signatureHeader = req.headers['x-godaddy-signature']; + const algorithmHeader = req.headers['x-godaddy-signature-algorithm']; + const versionHeader = req.headers['x-godaddy-signature-version']; + const timestampHeader = req.headers['x-godaddy-signature-timestamp']; + + logger.debug( + { + signature: signatureHeader, + algorithm: algorithmHeader, + version: versionHeader, + timestamp: timestampHeader, + }, + 'Retrieved signature headers', + ); + + // Check if required headers exist + if (!signatureHeader) { + logger.warn('Missing required signature header'); + return error( + new MissingHeaderError({ headerName: 'x-godaddy-signature' }).toJSON(), + ); + } + + if (!algorithmHeader) { + logger.warn('Missing required algorithm header'); + return error( + new MissingHeaderError({ + headerName: 'x-godaddy-signature-algorithm', + }).toJSON(), + ); + } + + if (!versionHeader) { + logger.warn('Missing required version header'); + return error( + new MissingHeaderError({ + headerName: 'x-godaddy-signature-version', + }).toJSON(), + ); + } + + if (!timestampHeader) { + logger.warn('Missing required timestamp header'); + return error( + new MissingHeaderError({ + headerName: 'x-godaddy-signature-timestamp', + }).toJSON(), + ); + } + + // Validate algorithm + const algorithm = Array.isArray(algorithmHeader) + ? algorithmHeader[0] + : (algorithmHeader as string); + logger.debug( + { + algorithm, + expected: VERIFICATION_CONSTANTS.SUPPORTED_ALGORITHM, + }, + 'Validating algorithm', + ); + if (algorithm !== VERIFICATION_CONSTANTS.SUPPORTED_ALGORITHM) { + logger.warn( + { algorithm, expected: VERIFICATION_CONSTANTS.SUPPORTED_ALGORITHM }, + 'Invalid algorithm', + ); + return error(new InvalidAlgorithmError({ algorithm }).toJSON()); + } + + // Validate version + const version = Array.isArray(versionHeader) + ? versionHeader[0] + : (versionHeader as string); + logger.debug( + { + version, + expected: VERIFICATION_CONSTANTS.SUPPORTED_VERSION, + }, + 'Validating version', + ); + if (version !== VERIFICATION_CONSTANTS.SUPPORTED_VERSION) { + logger.warn( + { version, expected: VERIFICATION_CONSTANTS.SUPPORTED_VERSION }, + 'Invalid version', + ); + return error(new InvalidVersionError({ version }).toJSON()); + } + + // Validate timestamp + const timestamp = Array.isArray(timestampHeader) + ? timestampHeader[0] + : (timestampHeader as string); + const signatureTime = new Date(timestamp); + const now = new Date(); + const maxAge = + options?.maxTimestampAgeSeconds || + VERIFICATION_CONSTANTS.DEFAULT_MAX_TIMESTAMP_AGE_SECONDS; + + const timeDiffSeconds = (now.getTime() - signatureTime.getTime()) / 1000; + logger.debug( + { + timestamp, + currentTime: now.toISOString(), + timeDiffSeconds, + maxAge, + }, + 'Validating timestamp', + ); + + if (timeDiffSeconds > maxAge) { + logger.warn( + { timestamp, timeDiffSeconds, maxAge }, + 'Signature timestamp expired', + ); + return error(new ExpiredSignatureError({ timestamp, maxAge }).toJSON()); + } + + // Get the public key + const publicKeyBuffer = getPublicKeyBuffer(options); + logger.debug( + { + publicKeyLength: publicKeyBuffer.byteLength, + }, + 'Retrieved public key', + ); + + // Canonicalize the request + const canonicalString = canonicalizeRequest(req); + logger.debug({ canonicalString }, 'Generated canonical request string'); + const canonicalStringBuffer = stringToArrayBuffer(canonicalString); + const signatureBuffer = base64ToArrayBuffer(signatureHeader as string); + + // Try multiple verification methods + const publicKey = await crypto.subtle.importKey( + 'spki', + publicKeyBuffer, + { + name: 'ECDSA', + namedCurve: 'P-256', + }, + true, + ['verify'], + ); + + const isValid = await crypto.subtle.verify( + { + name: 'ECDSA', + hash: { name: 'SHA-256' }, + }, + publicKey, + signatureBuffer, + canonicalStringBuffer, + ); + + logger.info({ isValid }, 'Signature verification completed'); + + // Add more debugging suggestions if verification failed + if (!isValid) { + logger.warn('Signature verification failed'); + return error(new InvalidSignatureError().toJSON()); + } + + logger.info('Signature verification successful'); + return ok(); + } catch (err) { + logger.error({ err }, 'Error during signature verification'); + return error(new InvalidSignatureError().toJSON()); + } +} + +/** + * Error thrown when a required webhook header is missing + */ +export class MissingWebhookHeaderError extends VerificationError { + constructor(headerName: string) { + super({ + name: 'MISSING_WEBHOOK_HEADER', + message: `Missing required header: ${headerName}`, + details: [ + { + issue: 'MISSING_REQUIRED_HEADER', + description: `The ${headerName} header is required for webhook verification`, + field: headerName, + location: 'header', + }, + ], + }); + } +} + +/** + * Error thrown when webhook signature verification fails + */ +export class InvalidWebhookSignatureError extends VerificationError { + constructor() { + super({ + name: 'INVALID_WEBHOOK_SIGNATURE', + message: 'The webhook signature is invalid', + details: [ + { + issue: 'SIGNATURE_VERIFICATION_FAILED', + description: + 'The webhook signature could not be verified with the provided secret', + field: 'x-godaddy-webhook-signature', + location: 'header', + }, + ], + }); + } +} + +/** + * Verifies a webhook subscription request + */ +/** + * Recursively stringifies a JavaScript value into a canonical JSON string + * that exactly matches Go's json.Marshal(json.Unmarshal(data)) behavior. + * + * This is critical for signature verification to work correctly between + * the Go signer middleware and Node.js verification code. + * + * @param value The JavaScript value to stringify. + * @returns A canonical JSON string representation of the value. + */ +export function canonicalJsonStringify(value: unknown): string { + // Match Go's behavior for special values + if (value === null) { + return 'null'; + } + if (value === undefined) { + // Go omits undefined/nil fields with omitempty tag or converts to null + return 'null'; + } + + // Handle primitives + if (typeof value !== 'object') { + if (typeof value === 'number') { + // Go uses decimal notation for all numbers without scientific notation + // Format numbers using simple toString() to match Go's behavior + return value.toString(); + } + if (typeof value === 'boolean') { + return value ? 'true' : 'false'; + } + // Go escapes certain characters differently than JS + // But basic JSON.stringify is sufficient for most cases + return JSON.stringify(value); + } + + // Handle arrays - preserve order but canonicalize contents + if (Array.isArray(value)) { + const arrayElements = value.map((element) => + canonicalJsonStringify(element), + ); + return `[${arrayElements.join(',')}]`; + } + + // Handle objects - Go sorts keys with basic string comparison + // This is a critical difference from JS JSON.stringify which doesn't sort keys + const objectKeys = Object.keys(value).sort(); + + const keyValuePairs = objectKeys + .map((key) => { + const propValue = (value as Record)[key]; + // Skip undefined values to match Go's handling of nil with omitempty + if (propValue === undefined) { + return null; + } + const keyString = JSON.stringify(key); + const valueString = canonicalJsonStringify(propValue); + return `${keyString}:${valueString}`; + }) + .filter(Boolean); // Remove null entries (undefined values) + + return `{${keyValuePairs.join(',')}}`; +} + +/** + * Verifies a webhook subscription request + */ +export function verifyWebhookSubscription( + req: VerifiableRequest, + options?: WebhookVerificationOptions, +): Result { + try { + // Get required headers + const signatureHeader = req.headers['x-godaddy-webhook-signature']; + + // Check if required headers exist + if (!signatureHeader) { + return error( + new MissingWebhookHeaderError('x-godaddy-webhook-signature').toJSON(), + ); + } + + // Get the webhook secret + const secret = getWebhookSecret(options); + + // Create string to sign (request body) + const stringToSign = + typeof req.body === 'string' ? req.body : JSON.stringify(req.body || ''); + + // Create the signature + const expectedSignature = crypto + .createHmac('sha256', secret) + .update(stringToSign) + .digest('hex'); + + // Compare signatures + const providedSignature = Array.isArray(signatureHeader) + ? signatureHeader[0] + : (signatureHeader as string); + + if (providedSignature !== expectedSignature) { + return error(new InvalidWebhookSignatureError().toJSON()); + } + + return ok(); + } catch (err) { + return error(new InvalidWebhookSignatureError().toJSON()); + } +} diff --git a/packages/app-connect/src/utils/webhook.ts b/packages/app-connect/src/utils/webhook.ts new file mode 100644 index 00000000..6cc6b81c --- /dev/null +++ b/packages/app-connect/src/utils/webhook.ts @@ -0,0 +1,248 @@ +import * as crypto from 'node:crypto'; +import { type Result, error, ok } from '../types/result'; +import type { VerifiableRequest } from '../types/verifiable-request'; + +import { VerificationError } from '../errors/base-error'; +import type { WebhookVerificationOptions } from './config'; +import { logger } from './logger'; + +/** + * Error thrown when a webhook signature verification fails + */ +export class InvalidWebhookSignatureError extends VerificationError { + constructor({ correlationId }: { correlationId?: string } = {}) { + super({ + name: 'INVALID_WEBHOOK_SIGNATURE', + message: 'The webhook signature is invalid', + correlationId, + details: [ + { + issue: 'SIGNATURE_VERIFICATION_FAILED', + description: + 'The webhook signature could not be verified with the provided secret', + field: 'webhook-signature', + location: 'header', + }, + ], + }); + } +} + +/** + * Error thrown when a required webhook header is missing + */ +export class MissingWebhookHeaderError extends VerificationError { + constructor({ + headerName, + correlationId, + }: { + headerName: string; + correlationId?: string; + }) { + super({ + name: 'MISSING_WEBHOOK_HEADER', + message: `Missing required header: ${headerName}`, + correlationId, + details: [ + { + issue: 'MISSING_REQUIRED_HEADER', + description: `The ${headerName} header is required for webhook verification`, + field: headerName, + location: 'header', + }, + ], + }); + } +} + +/** + * Get the webhook secret from options or environment + * @throws Error if no webhook secret is available + */ +export function getWebhookSecret(options?: WebhookVerificationOptions): string { + // Try to get the webhook secret from options first + const secret = options?.secret || process.env.GODADDY_WEBHOOK_SECRET; + + if (!secret) { + throw new Error( + 'Webhook secret is required. Provide it via options or GODADDY_WEBHOOK_SECRET environment variable', + ); + } + + return secret; +} + +/** + * Generates an HMAC signature for webhook verification + * + * @param secret The webhook secret + * @param webhookId The webhook ID from the request header + * @param timestamp The timestamp from the request header + * @param payload The request body + * @returns The generated HMAC signature + */ +export function generateHmac( + secret: string, + webhookId: string, + timestamp: string, + payload: Buffer | string | Record | unknown, +): string { + let payloadStr: string; + + if (payload === undefined || payload === null) { + payloadStr = ''; + } else if (Buffer.isBuffer(payload)) { + payloadStr = payload.toString(); + } else if (typeof payload === 'string') { + payloadStr = payload; + } else if (typeof payload === 'object') { + // Handle objects by JSON stringifying them + payloadStr = JSON.stringify(payload); + } else { + // Convert anything else to string + payloadStr = String(payload); + } + + const toSignStr = `${webhookId}.${timestamp}.${payloadStr}`; + const toSignBytes = Buffer.from(toSignStr); + const hmacDigest = crypto + .createHmac('sha256', secret) + .update(toSignBytes) + .digest(); + return `V1,${hmacDigest.toString('base64')}`; +} + +/** + * Verifies a webhook subscription request using GoDaddy's HMAC signing mechanism + * + * @param req The request to verify + * @param options Options for verification including webhook secret + * @returns Result indicating success or failure with appropriate error + */ +export function verifyWebhookSubscription( + req: VerifiableRequest, + options?: WebhookVerificationOptions, +): Result { + const correlationId = crypto.randomUUID(); + + // Extract required headers + const signature = req.headers['webhook-signature']; + const webhookId = req.headers['webhook-id']; + const timestamp = req.headers['webhook-timestamp']; + + // Check all required headers exist + if (!signature) { + const err = new MissingWebhookHeaderError({ + headerName: 'webhook-signature', + correlationId, + }); + logger.debug( + { + error: err.name, + correlationId, + request: req, + }, + 'Webhook verification failed - missing signature header', + ); + return error(err.toJSON()); + } + + if (!webhookId) { + const err = new MissingWebhookHeaderError({ + headerName: 'webhook-id', + correlationId, + }); + logger.debug( + { + error: err.name, + correlationId, + request: req, + }, + 'Webhook verification failed - missing webhook-id header', + ); + return error(err.toJSON()); + } + + if (!timestamp) { + const err = new MissingWebhookHeaderError({ + headerName: 'webhook-timestamp', + correlationId, + }); + logger.debug( + { + error: err.name, + correlationId, + request: req, + }, + 'Webhook verification failed - missing webhook-timestamp header', + ); + return error(err.toJSON()); + } + + try { + // Get the webhook secret + const secret = getWebhookSecret(options); + + // Convert headers to string if they're arrays + const signatureStr = Array.isArray(signature) + ? signature[0] + : (signature as string); + const webhookIdStr = Array.isArray(webhookId) + ? webhookId[0] + : (webhookId as string); + const timestampStr = Array.isArray(timestamp) + ? timestamp[0] + : (timestamp as string); + + // Generate the expected HMAC signature + const expectedSignature = generateHmac( + secret, + webhookIdStr, + timestampStr, + req.body || '', + ); + + // Compare signatures + if (signatureStr !== expectedSignature) { + const err = new InvalidWebhookSignatureError({ correlationId }); + logger.debug( + { + error: err.name, + correlationId, + request: req, + }, + 'Webhook verification failed - invalid signature', + ); + return error(err.toJSON()); + } + + return ok(undefined); + } catch (err) { + if (err instanceof VerificationError) { + logger.debug( + { + error: err.name, + correlationId, + request: req, + }, + 'Webhook verification error', + ); + return error(err.toJSON()); + } + + // Generic verification failure + const verificationError = new InvalidWebhookSignatureError({ + correlationId, + }); + logger.debug( + { + originalError: err, + error: verificationError.name, + correlationId, + request: req, + }, + 'Webhook verification error - generic failure', + ); + return error(verificationError.toJSON()); + } +} diff --git a/packages/app-connect/tsconfig.json b/packages/app-connect/tsconfig.json new file mode 100644 index 00000000..c99b6cc0 --- /dev/null +++ b/packages/app-connect/tsconfig.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "isolatedModules": true, + "resolveJsonModule": true, + "moduleResolution": "bundler", + "module": "ESNext", + "target": "ES2022", + "lib": ["ES2022", "DOM"], + "allowImportingTsExtensions": true, + "noEmit": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true + }, + "exclude": ["node_modules", "**/*.test.ts"] +} \ No newline at end of file diff --git a/packages/app-connect/tsdown.config.ts b/packages/app-connect/tsdown.config.ts new file mode 100644 index 00000000..96e56fc9 --- /dev/null +++ b/packages/app-connect/tsdown.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'tsdown' + +export default defineConfig({ + entry: [ + 'src/index.ts', + 'src/express/index.ts', + 'src/next/index.ts', + 'src/tanstack/index.ts' + ], + plugins: [], + tsconfig: './tsconfig.json', + dts: true +}) diff --git a/packages/eslint-config-godaddy/README.md b/packages/eslint-config-godaddy/README.md index 98178ef4..739a6da6 100644 --- a/packages/eslint-config-godaddy/README.md +++ b/packages/eslint-config-godaddy/README.md @@ -1,26 +1,65 @@ # eslint-config-godaddy -Base configuration for _non-React_, JavaScript applications officially used at GoDaddy. +Base ESLint configuration for _non-React_, ES6 JavaScript applications officially used at GoDaddy. This styleguide is used by dozens of product teams at GoDaddy. Have a question or comment? [Open an issue!](https://github.com/godaddy/javascript/issues/new) +There are many useful features: + +- **Standard. No configuration.** – Stop worrying about style and focus on your work. +- **Modern** – Uses modern linting tools like `eslint`. +- **Auto-fix** – Auto-fix is enabled by-default through in `eslint`. Many rules will fix themselves! + ## Installation -``` sh -# Default with ES6 -npm i eslint-config-godaddy --save-dev +```sh +npm install eslint-config-godaddy --save-dev ``` ## Usage +There are two ways to use this styleguide depending on your own tooling preference: directly using pre-included binaries or running `eslint` yourself with a custom `eslint.config.js` config. + +### Define your local `eslint.config.js|mjs` and run `eslint` yourself + ```js +import GDConfig from 'eslint-config-godaddy'; +import { defineConfig } from 'eslint-define-config'; + +export default defineConfig({ + extends: [ + GDConfig, + ], + rules: { + // Add your own rules here + 'no-console': 'warn', + }, +}); +``` + +The `--fix` option in `eslint` is [**only** available as a CLI option](https://github.com/eslint/eslint/issues/8041). Auto-fix will **_NOT be enabled_** unless you run `eslint --fix` in your `package.json`. + +```json +{ + "scripts": { + "lint": "eslint --fix files/ you/ want-to/ lint/" + } +} +``` + +## FAQ + +### How do I override a specific rule? + +Add a `eslint.config.js|mjs` file at the root of your project: -import gdConfig from 'eslint-config-godaddy' +```js +import GDConfig from 'eslint-config-godaddy'; import { defineConfig } from 'eslint-define-config'; export default defineConfig({ extends: [ - gdConfig, + GDConfig, ], rules: { // Add your own rules here @@ -28,3 +67,15 @@ export default defineConfig({ }, }); ``` + +### How do I contribute? + +Fork this repository and submit a pull request. See the [main repository](https://github.com/godaddy/javascript) for detailed contribution guidelines. + +### I disagree with a specific rule + +Great. We'd love to talk about it. Fork this repository and submit a pull-request. + +### Help! It's not working for me + +No problem. Reach out to us by [opening an issue](https://github.com/godaddy/javascript/issues) diff --git a/packages/localizations/.DS_Store b/packages/localizations/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b4f5f15e5ca34590015f7717e0d66365eae79a40 GIT binary patch literal 6148 zcmeHKy-EW?5T5mp5H!)0TDeVHF@;zOXE;I7$~=I2iBTcvg(TM>_Ch)gGAg0JjKdc~e$s+0SqmjAUL%5} zciCvQlek}q7K1P#4E#3+=-Vy97K|W;0TjMpZ+F%oCt(=%k_hePll$(&c;juq7}NPN zrhk>+Cp0brK6Kz3hA?vWkWzP)_vPzX>)S7Dhg^S>8z%nX`zP+S?;v6Yp*p(w77cFp0S z0)sLN1HypIfM*_Sbp9XAzyG^Q@+1rh0}I7~^21ix#8~YK!I*Qj(S + + + ); +} +``` + +## Available Localizations + +- `frFr` - French (France) + +## Localization Structure + +Each localization export contains the following sections: + +- `general` - General UI text (optional, notes, quantity, etc.) +- `contact` - Contact form labels +- `pickup` - Local pickup configuration +- `delivery` - Delivery and shipping options +- `tips` - Tip/gratuity options +- `shipping` - Shipping address form +- `billing` - Billing address form +- `payment` - Payment methods and form +- `phone` - Phone number input +- `discounts` - Discount code functionality +- `totals` - Order totals and summary +- `lineItems` - Line item display +- `ui` - UI component labels and accessibility text +- `errors` - Error messages and validation +- `validation` - Form validation messages + +## Contributing + +To add a new localization: + +1. Create a new file in `src/` with the locale code (e.g., `esEs.ts` for Spanish) +2. Copy the structure from `frFr.ts` and translate all strings +3. Export the new localization in `src/index.ts` +4. Add documentation to this README + +## License + +MIT diff --git a/packages/localizations/package.json b/packages/localizations/package.json new file mode 100644 index 00000000..345d6601 --- /dev/null +++ b/packages/localizations/package.json @@ -0,0 +1,38 @@ +{ + "name": "@godaddy/localizations", + "version": "0.3.5", + "description": "Internationalization localizations for GoDaddy checkout components", + "type": "module", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "scripts": { + "dev": "tsdown --watch", + "build": "tsdown", + "typecheck": "tsc --noEmit" + }, + "keywords": [ + "godaddy", + "checkout", + "localization", + "i18n", + "internationalization" + ], + "license": "MIT", + "devDependencies": { + "@types/node": "^22.13.1", + "tsdown": "^0.15.6", + "typescript": "~5.7.3" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/" + } +} diff --git a/packages/localizations/src/deDe.ts b/packages/localizations/src/deDe.ts new file mode 100644 index 00000000..9bb64f30 --- /dev/null +++ b/packages/localizations/src/deDe.ts @@ -0,0 +1,340 @@ +export const deDe = { + general: { + optional: "optional", + notes: "Notizen", + quantity: "Menge", + free: "KOSTENLOS", + closed: "Geschlossen", + apply: "Anwenden", + checkoutDisabled: + "Der Checkout ist derzeit deaktiviert. Wir entschuldigen uns für die Unannehmlichkeiten.", + }, + contact: { + title: "Kontakt", + description: "", + email: "E-Mail", + }, + pickup: { + title: "Abholung vor Ort", + description: + "Wir werden uns bemühen, Ihre gewünschte Abholzeit einzuhalten. Die tatsächlichen Abholzeiten können variieren.", + location: "Abholort", + date: "Abholdatum", + time: "Bevorzugte Abholzeit", + selectStore: "Filiale auswählen", + selectDate: "Datum auswählen", + selectTime: "Abholzeit auswählen", + storeHours: "Öffnungszeiten", + seeDetails: "Details anzeigen", + noTimeSlots: + "Keine verfügbaren Zeitfenster für das ausgewählte Datum. Bitte wählen Sie ein anderes Datum.", + hoursDisplayed: "Zeiten werden in Ihrer lokalen Zeitzone angezeigt.", + storeOperatesIn: "Die Filiale arbeitet in der Zeitzone {timezone}.", + asap: "ASAP", + hour: "Stunde", + hours: "Stunden", + minutes: "Minuten", + searchCountry: "Land suchen...", + noCountryFound: "Kein Land gefunden.", + }, + days: { + sunday: "Sonntag", + monday: "Montag", + tuesday: "Dienstag", + wednesday: "Mittwoch", + thursday: "Donnerstag", + friday: "Freitag", + saturday: "Samstag", + }, + delivery: { + title: "Lieferung", + method: "Liefermethode", + shipping: "Versand", + shipToAddress: "An Ihre Adresse versenden", + localPickup: "Abholung vor Ort", + pickupFromStore: "In der Filiale abholen", + }, + tips: { + title: "Trinkgeld hinzufügen", + noTip: "Kein Trinkgeld", + customAmount: "Benutzerdefinierten Betrag", + customTipAmount: "Benutzerdefiniertes Trinkgeld", + placeholder: "0,00 €", + }, + shipping: { + title: "Versand", + description: "Lieferadresse", + method: "Versandart", + noShippingMethodAddress: + "Geben Sie Ihre Adresse ein, um verfügbare Versandmethoden zu sehen.", + noShippingMethods: "Keine Versandmethoden gefunden.", + phone: "Telefonnummer", + country: "Land", + selectCountry: "Land auswählen", + searchCountry: "Land suchen...", + noCountryFound: "Kein Land gefunden", + firstName: "Vorname", + lastName: "Nachname", + address1: "Adresse", + address2: "Wohnung, Suite usw.", + city: "Stadt", + region: "Bundesland/Provinz", + postalCode: "Postleitzahl", + notesPlaceholder: "Notizen oder besondere Anweisungen", + addressSuggestion: "Meinten Sie", + addressSuggestionEnd: "?", + noShippingOriginAddress: "Keine Versandursprungsadresse angegeben.", + }, + billing: { + title: "Abrechnung", + description: "Abrechnungsbeschreibung", + }, + payment: { + title: "Zahlung", + description: "Alle Zahlungen sind sicher und verschlüsselt.", + billingAddress: { + title: "Rechnungsadresse", + description: "Geben Sie Ihre Rechnungsadresse ein.", + useShippingAddress: "Lieferadresse als Rechnungsadresse verwenden", + }, + methods: { + creditCard: "Kredit- oder Debitkarte", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Offline-Zahlungen", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "Keine Zahlungsmethoden verfügbar", + cardNumber: "Kartennummer", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Ablaufdatum (MM / JJ)", + securityCode: "Sicherheitscode", + cvvPlaceholder: "CVV", + nameOnCard: "Name auf Karte", + payNow: "Jetzt bezahlen", + standardShipping: "Standardversand", + cardDetails: "Kartendetails", + payWithApplePay: "Mit Apple Pay bezahlen", + expirationDatePlaceholder: "MM / JJ", + failedToInitializePayment: "Zahlung konnte nicht initialisiert werden.", + orderTotal: "Bestellsumme", + subtotal: "Zwischensumme", + tax: "Steuer", + shipping: "Versand", + discount: "Gutschein", + processingPayment: "Zahlung wird verarbeitet...", + completingOrder: "Bestellung wird abgeschlossen...", + freePayment: "Schließen Sie Ihre kostenlose Bestellung ab", + }, + phone: { + placeholder: "(030) 555-1234", + searchCountry: "Land suchen...", + noCountryFound: "Kein Land gefunden.", + }, + discounts: { + placeholder: "Gutscheincode", + enterCode: "Gutscheincode eingeben", + apply: "Anwenden", + alreadyApplied: "Dieser Gutscheincode wurde bereits angewendet", + failedToApply: "Gutscheincode konnte nicht angewendet werden", + enterCodeValidation: "Bitte geben Sie einen Gutscheincode ein", + }, + totals: { + subtotal: "Zwischensumme", + discount: "Rabatt", + shipping: "Versand", + tip: "Trinkgeld", + estimatedTaxes: "Geschätzte Steuern", + totalDue: "Gesamtbetrag", + orderSummary: "Bestellübersicht", + itemCount: "Artikel", + noItems: "Keine Artikel", + }, + lineItems: { + note: "Hinweis:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Adresse", + suggestions: "Vorschläge", + }, + form: { + useFormFieldError: + "useFormField sollte innerhalb von verwendet werden", + }, + pagination: { + ariaLabel: "Seitennummerierung", + previousPageAriaLabel: "Zur vorherigen Seite gehen", + previous: "Zurück", + nextPageAriaLabel: "Zur nächsten Seite gehen", + next: "Weiter", + morePages: "Weitere Seiten", + }, + sidebar: { + useSidebarError: + "useSidebar muss innerhalb eines SidebarProvider verwendet werden.", + toggleSidebar: "Seitenleiste umschalten", + }, + accessibility: { + payWithApplePay: "Mit Apple Pay bezahlen", + applePayLogo: "Apple Pay Logo", + }, + }, + errors: { + failedToGetAccessToken: "Zugangstoken konnte nicht abgerufen werden", + invalidEnvironment: "Ungültige Umgebung", + noPublicAccessToken: "Kein öffentlicher Zugangstoken bereitgestellt", + noSessionToken: "Kein Sitzungstoken oder ID bereitgestellt", + errorCreatingSession: "Fehler beim Erstellen der Checkout-Sitzung:", + orderIdRequired: "Bestellnummer ist erforderlich", + errorTrackingEvent: "Fehler beim Verfolgen des Events", + errorInTrackingSubscriber: "Fehler im Tracking-Abonnenten", + useTrackingProviderError: + "useTracking muss innerhalb eines TrackingProvider verwendet werden", + usePoyntCollectProviderError: + "usePoyntCollect muss innerhalb eines PoyntCollectProvider verwendet werden", + useSquareProviderError: + "useSquare muss innerhalb eines SquareProvider verwendet werden", + errorProcessingPayment: "Fehler bei der Zahlungsverarbeitung", + stripeConfigMissing: + "Stripe-Konfiguration fehlt. Bitte überprüfen Sie Ihre Einstellungen.", + paymentSuccessful: "Zahlung erfolgreich", + paymentFailed: "Zahlung fehlgeschlagen", + paypalConfigMissing: + "PayPal-Konfiguration fehlt. Bitte überprüfen Sie Ihre Einstellungen.", + stripeNotReady: "Stripe nicht bereit", + cardElementNotFound: "CardElement nicht gefunden", + errorProcessingCardPayment: + "Fehler bei der Verarbeitung der Kartenzahlung.", + errorProcessingExpressPayment: + "Fehler bei der Verarbeitung der Express-Zahlung.", + failedToInitializePayment: "Zahlung konnte nicht initialisiert werden.", + invalidPhoneNumber: "Ungültige Telefonnummer", + }, + validation: { + phoneRequired: "Telefonnummer ist erforderlich", + emailRequired: "E-Mail eingeben", + emailInvalid: "Gültige E-Mail eingeben", + phoneTooLong: "Telefonnummer zu lang", + invalidShippingAddress: "Ungültige Lieferadresse", + invalidBillingAddress: "Ungültige Rechnungsadresse", + selectPaymentMethod: "Zahlungsmethode auswählen", + enterValidBillingPhone: "Gültige Rechnungstelefonnummer eingeben", + enterValidShippingPhone: "Gültige Liefertelefonnummer eingeben", + enterFirstName: "Vorname eingeben", + enterLastName: "Nachname eingeben", + enterAddress: "Adresse eingeben", + enterCity: "Stadt eingeben", + enterZipCode: "Postleitzahl eingeben", + enterZipPostalCode: "PLZ / Postleitzahl eingeben", + selectState: "Bundesland/Provinz auswählen", + selectCountry: "Land auswählen", + enterCountry: "Land eingeben", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Serverfehler", + SESSION_NOT_FOUND: "Sitzung nicht gefunden", + CHECKOUT_SESSION_RETRIEVAL_FAILED: + "Abrufen der Checkout-Sitzung fehlgeschlagen", + CHECKOUT_SESSION_NOT_FOUND: "Checkout-Sitzung nicht gefunden", + CHECKOUT_SESSION_FETCH_ERROR: + "Allgemeiner Abruffehler der Checkout-Sitzung", + DRAFT_ORDER_NOT_FOUND: "Entwurfsbestellung nicht gefunden", + CHECKOUT_SESSION_CREATION_FAILED: + "Erstellen der Checkout-Sitzung fehlgeschlagen", + CREATED_SESSION_DATA_NOT_FOUND: + "Daten der erstellten Sitzung nicht gefunden", + CHECKOUT_SESSION_CREATION_ERROR: + "Allgemeiner Erstellungsfehler der Checkout-Sitzung", + CHECKOUT_SESSION_UPDATE_FAILED: + "Aktualisierung der Checkout-Sitzung fehlgeschlagen", + UPDATED_SESSION_NOT_FOUND: "Aktualisierte Sitzung nicht gefunden", + CHECKOUT_SESSION_UPDATE_ERROR: + "Allgemeiner Aktualisierungsfehler der Checkout-Sitzung", + ORDER_API_NOT_FOUND: "Bestellungs-API-Datenquelle nicht gefunden", + DRAFT_ORDER_RETRIEVAL_FAILED: + "Abrufen der Entwurfsbestellung fehlgeschlagen", + DATA_SOURCES_NOT_FOUND: "Datenquellen nicht gefunden", + TRANSACTION_API_NOT_FOUND: "Transaktions-API-Datenquelle nicht gefunden", + TRANSACTION_PROCESSING_FAILED: + "Verarbeitung der Transaktion fehlgeschlagen", + TRANSACTION_CREATION_FAILED: + "Finden oder Erstellen der Transaktion fehlgeschlagen", + ORDER_OPENING_FAILED: "Öffnen der Bestellung fehlgeschlagen", + INVALID_FULFILLMENT_LOCATION: "Ungültiger Erfüllungsort", + NO_VALID_PICKUP_LOCATION: "Kein gültiger Abholort verfügbar", + DRAFT_ORDER_FETCH_FAILED: "Abrufen der Entwurfsbestellung fehlgeschlagen", + LINE_ITEMS_FETCH_FAILED: "Abrufen der Artikel fehlgeschlagen", + CURRENT_ORDER_FETCH_FAILED: + "Abrufen der aktuellen Entwurfsbestellung fehlgeschlagen", + DRAFT_ORDER_UPDATE_FAILED: + "Aktualisierung der Entwurfsbestellung fehlgeschlagen", + DISCOUNT_APPLICATION_FAILED: "Anwenden des Gutscheins fehlgeschlagen", + CONTEXT_UNAVAILABLE: "Sitzung oder Datenquellen nicht verfügbar", + SHIPPING_LINES_UPDATE_FAILED: + "Aktualisierung der Versandzeilen fehlgeschlagen", + ORDER_TOTALS_UPDATE_FAILED: + "Aktualisierung der Bestellsummen fehlgeschlagen", + SHIPPING_METHOD_APPLICATION_FAILED: + "Anwenden der Versandmethode fehlgeschlagen", + SKU_FETCH_FAILED: "Abrufen der SKUs fehlgeschlagen", + SHIPPING_RATES_CALCULATION_FAILED: + "Berechnung der Versandkosten fehlgeschlagen", + SHIPPING_METHOD_NOT_FOUND: "Versandmethode nicht gefunden", + SHIPPING_METHOD_REMOVAL_FAILED: + "Entfernen der Versandmethode fehlgeschlagen", + SHIPPING_ADDRESS_REQUIRED: "Lieferadresse erforderlich", + INVENTORY_VALIDATION_ERROR: "Lagervalidierungsfehler", + INSUFFICIENT_INVENTORY: "Unzureichender Lagerbestand", + INVALID_ORDER_STATUS: "Ungültiger Bestellstatus", + TRANSACTION_CREATION_ERROR: "Transaktionserstellungsfehler", + TRANSACTION_PROCESSING_ERROR: "Transaktionsverarbeitungsfehler", + UNKNOWN_ERROR: "Unbekannter Fehler", + FULFILLMENT_CREATION_ERROR: "Erfüllungserstellungsfehler", + TAX_CALCULATION_ERROR: "Steuerberechnungsfehler", + ADDRESS_VERIFICATION_ERROR: "Adressverifizierungsfehler", + ADDRESS_MATCHES_ERROR: "Adressenabgleichfehler", + SHIPPING_CONFLICT_ERROR: "Versandkonfliktfehler", + SHIPPING_ERROR: "Allgemeiner Versandfehler", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Preisanpassungsberechnungsfehler", + ORDER_FETCH_ERROR: "Bestellabruffehler", + DRAFT_ORDER_UPDATE_ERROR: "Entwurfsbestellungsaktualisierungsfehler", + DISCOUNT_APPLICATION_ERROR: "Gutscheinanwendungsfehler", + DRAFT_ORDER_OPEN_ERROR: "Entwurfsbestellungsöffnungsfehler", + ORDER_UPDATE_ERROR: "Bestellaktualisierungsfehler", + CATALOG_FETCH_ERROR: "Katalogabruffehler", + STORE_ID_NOT_FOUND: "Shop-ID nicht gefunden", + ORDER_NOT_DRAFT: "Bestellung ist nicht im Entwurfsstatus", + NO_LINE_ITEMS: "Keine Artikel gefunden", + BAD_USER_INPUT: "Ungültige Benutzereingabe", + MISSING_SHIPPING_ADDRESS: "Lieferadresse ist erforderlich", + MISSING_REQUIRED_FIELD: "Pflichtfeld fehlt", + CATALOG_API_ERROR: "Katalogservice-Fehler", + TAX_SERVICE_UNAVAILABLE: "Steuerservice ist nicht verfügbar", + SHIPPING_SERVICE_UNAVAILABLE: "Versandservice ist nicht verfügbar", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Preisanpassungsservice ist nicht verfügbar", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Berechnung der Preisanpassungen fehlgeschlagen", + SERVICE_UNAVAILABLE: "Service ist vorübergehend nicht verfügbar", + RATE_LIMITED: "Zu viele Anfragen, bitte versuchen Sie es später erneut", + TIMEOUT: "Zeitüberschreitung der Anfrage", + INTERNAL_ERROR: "Interner Serverfehler", + SHIPPING_POSTAL_CODE_REQUIRED: "Postleitzahl für Versand ist erforderlich", + SHIPPING_COUNTRY_CODE_REQUIRED: "Ländercode für Versand ist erforderlich", + SHIPPING_METHOD_REQUIRED: "Versandmethode ist erforderlich", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "Verifizierung der Lieferadresse fehlgeschlagen", + BILLING_ADDRESS_VERIFICATION_FAILED: + "Verifizierung der Rechnungsadresse fehlgeschlagen", + }, +}; diff --git a/packages/localizations/src/enIe.ts b/packages/localizations/src/enIe.ts new file mode 100644 index 00000000..60e4ee45 --- /dev/null +++ b/packages/localizations/src/enIe.ts @@ -0,0 +1,316 @@ +export const enIe = { + general: { + optional: "optional", + notes: "Notes", + quantity: "Quantity", + free: "FREE", + closed: "Closed", + apply: "Apply", + checkoutDisabled: + "Checkout is currently disabled. We apologise for the inconvenience.", + }, + contact: { + title: "Contact", + description: "", + email: "Email", + }, + pickup: { + title: "Local Pickup", + description: + "All efforts will be made to meet your expected pickup time. Actual pickup times may vary.", + location: "Pickup Location", + date: "Pickup Date", + time: "Preferred Pickup Time", + selectStore: "Select a store location", + selectDate: "Select a date", + selectTime: "Select a pickup time", + storeHours: "Store Hours", + seeDetails: "See details", + noTimeSlots: + "No available time slots for the selected date. Please select another date.", + hoursDisplayed: "Hours displayed in your local timezone.", + storeOperatesIn: "Store operates in {timezone} timezone.", + asap: "ASAP", + hour: "hour", + hours: "hours", + minutes: "minutes", + searchCountry: "Search country...", + noCountryFound: "No country found.", + }, + days: { + sunday: "Sunday", + monday: "Monday", + tuesday: "Tuesday", + wednesday: "Wednesday", + thursday: "Thursday", + friday: "Friday", + saturday: "Saturday", + }, + delivery: { + title: "Delivery", + method: "Delivery method", + shipping: "Shipping", + shipToAddress: "Ship to your address", + localPickup: "Local Pickup", + pickupFromStore: "Pick up from store location", + }, + tips: { + title: "Add a tip", + noTip: "No Tip", + customAmount: "Custom Amount", + customTipAmount: "Custom Tip Amount", + placeholder: "€0.00", + }, + shipping: { + title: "Shipping", + description: "Shipping address", + method: "Shipping method", + noShippingMethodAddress: + "Enter your address to see available shipping methods.", + noShippingMethods: "No shipping methods found.", + phone: "Phone Number", + country: "Country", + selectCountry: "Select country", + searchCountry: "Search country...", + noCountryFound: "No country found", + firstName: "First Name", + lastName: "Last Name", + address1: "Address", + address2: "Apartment, suite, etc. (optional)", + city: "City", + region: "State/County", + postalCode: "Postal Code", + notesPlaceholder: "Notes or special instructions", + addressSuggestion: "Did you mean", + addressSuggestionEnd: "?", + noShippingOriginAddress: "No shipping origin address provided.", + }, + billing: { + title: "Billing", + description: "Billing description", + }, + payment: { + title: "Payment", + description: "All payments are secure and encrypted.", + billingAddress: { + title: "Billing Address", + description: "Enter your billing address.", + useShippingAddress: "Use shipping address as billing address", + }, + methods: { + creditCard: "Credit or Debit Card", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Offline payments", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "No payment methods available", + cardNumber: "Card number", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Expiration date (MM / YY)", + securityCode: "Security code", + cvvPlaceholder: "CVV", + nameOnCard: "Name on card", + payNow: "Pay now", + standardShipping: "Standard Shipping", + cardDetails: "Card details", + payWithApplePay: "Pay with Apple Pay", + expirationDatePlaceholder: "MM / YY", + failedToInitializePayment: "Failed to initialise payment.", + orderTotal: "Order Total", + subtotal: "Subtotal", + tax: "VAT", + shipping: "Shipping", + discount: "Voucher", + processingPayment: "Processing payment...", + freePayment: "Complete your free order", + completingOrder: "Completing order...", + }, + phone: { + placeholder: "+353 1 234 5678", + searchCountry: "Search country...", + noCountryFound: "No country found.", + }, + discounts: { + placeholder: "Voucher code", + enterCode: "Enter voucher code", + apply: "Apply", + alreadyApplied: "This voucher code has already been applied", + failedToApply: "Failed to apply voucher code", + enterCodeValidation: "Please enter a voucher code", + }, + totals: { + subtotal: "Subtotal", + discount: "Discount", + shipping: "Shipping", + tip: "Tip", + estimatedTaxes: "Estimated VAT", + totalDue: "Total Due", + orderSummary: "Order Summary", + itemCount: "items", + noItems: "No items", + }, + lineItems: { + note: "Note:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Address", + suggestions: "Suggestions", + }, + form: { + useFormFieldError: "useFormField should be used within ", + }, + pagination: { + ariaLabel: "pagination", + previousPageAriaLabel: "Go to previous page", + previous: "Previous", + nextPageAriaLabel: "Go to next page", + next: "Next", + morePages: "More pages", + }, + sidebar: { + useSidebarError: "useSidebar must be used within a SidebarProvider.", + toggleSidebar: "Toggle Sidebar", + }, + accessibility: { + payWithApplePay: "Pay with Apple Pay", + applePayLogo: "Apple Pay Logo", + }, + }, + errors: { + failedToGetAccessToken: "Failed to get access token", + invalidEnvironment: "Invalid environment", + noPublicAccessToken: "No public access token provided", + noSessionToken: "No session token or ID provided", + errorCreatingSession: "Error creating checkout session:", + orderIdRequired: "Order ID is required", + errorTrackingEvent: "Error tracking event", + errorInTrackingSubscriber: "Error in tracking subscriber", + useTrackingProviderError: + "useTracking must be used within a TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect must be used within a PoyntCollectProvider", + useSquareProviderError: "useSquare must be used within a SquareProvider", + errorProcessingPayment: "Error processing payment", + stripeConfigMissing: + "Stripe configuration is missing. Please check your setup.", + paymentSuccessful: "Payment successful", + paymentFailed: "Payment failed", + paypalConfigMissing: + "PayPal configuration is missing. Please check your setup.", + stripeNotReady: "Stripe not ready", + cardElementNotFound: "CardElement not found", + errorProcessingCardPayment: "Error processing card payment.", + errorProcessingExpressPayment: "Error processing express payment.", + failedToInitializePayment: "Failed to initialise payment.", + invalidPhoneNumber: "invalid phone number", + }, + validation: { + phoneRequired: "Phone number is required", + emailRequired: "Enter an email", + emailInvalid: "Enter a valid email", + phoneTooLong: "Phone number too long", + invalidShippingAddress: "Invalid shipping address", + invalidBillingAddress: "Invalid billing address", + selectPaymentMethod: "Select a payment method", + enterValidBillingPhone: "Enter a valid billing phone number", + enterValidShippingPhone: "Enter a valid shipping phone number", + enterFirstName: "Enter a first name", + enterLastName: "Enter a last name", + enterAddress: "Enter an address", + enterCity: "Enter a city", + enterZipCode: "Enter a postal code", + enterZipPostalCode: "Enter a postal code", + selectState: "Select a county", + selectCountry: "Select a country", + enterCountry: "Enter a country", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Server error", + SESSION_NOT_FOUND: "Session not found", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Failed to retrieve checkout session", + CHECKOUT_SESSION_NOT_FOUND: "Checkout session not found", + CHECKOUT_SESSION_FETCH_ERROR: "General checkout session fetch error", + DRAFT_ORDER_NOT_FOUND: "Draft order not found", + CHECKOUT_SESSION_CREATION_FAILED: "Failed to create checkout session", + CREATED_SESSION_DATA_NOT_FOUND: "Created session data not found", + CHECKOUT_SESSION_CREATION_ERROR: "General checkout session creation error", + CHECKOUT_SESSION_UPDATE_FAILED: "Failed to update checkout session", + UPDATED_SESSION_NOT_FOUND: "Updated session not found", + CHECKOUT_SESSION_UPDATE_ERROR: "General checkout session update error", + ORDER_API_NOT_FOUND: "Order API data source not found", + DRAFT_ORDER_RETRIEVAL_FAILED: "Failed to retrieve draft order", + DATA_SOURCES_NOT_FOUND: "Data sources not found", + TRANSACTION_API_NOT_FOUND: "Transaction API data source not found", + TRANSACTION_PROCESSING_FAILED: "Failed to process transaction", + TRANSACTION_CREATION_FAILED: "Failed to find or create transaction", + ORDER_OPENING_FAILED: "Failed to open order", + INVALID_FULFILLMENT_LOCATION: "Invalid fulfillment location", + NO_VALID_PICKUP_LOCATION: "No valid pickup location available", + DRAFT_ORDER_FETCH_FAILED: "Failed to fetch draft order", + LINE_ITEMS_FETCH_FAILED: "Failed to fetch line items", + CURRENT_ORDER_FETCH_FAILED: "Failed to fetch current draft order", + DRAFT_ORDER_UPDATE_FAILED: "Failed to update draft order", + DISCOUNT_APPLICATION_FAILED: "Failed to apply voucher", + CONTEXT_UNAVAILABLE: "Session or data sources not available", + SHIPPING_LINES_UPDATE_FAILED: "Failed to update shipping lines", + ORDER_TOTALS_UPDATE_FAILED: "Failed to update order totals", + SHIPPING_METHOD_APPLICATION_FAILED: "Failed to apply shipping method", + SKU_FETCH_FAILED: "Failed to fetch SKUs", + SHIPPING_RATES_CALCULATION_FAILED: "Failed to calculate shipping rates", + SHIPPING_METHOD_NOT_FOUND: "Shipping method not found", + SHIPPING_METHOD_REMOVAL_FAILED: "Failed to remove shipping method", + SHIPPING_ADDRESS_REQUIRED: "Shipping address required", + INVENTORY_VALIDATION_ERROR: "Inventory validation error", + INSUFFICIENT_INVENTORY: "Insufficient inventory", + INVALID_ORDER_STATUS: "Invalid order status", + TRANSACTION_CREATION_ERROR: "Transaction creation error", + TRANSACTION_PROCESSING_ERROR: "Transaction processing error", + UNKNOWN_ERROR: "Unknown error", + FULFILLMENT_CREATION_ERROR: "Fulfillment creation error", + TAX_CALCULATION_ERROR: "VAT calculation error", + ADDRESS_VERIFICATION_ERROR: "Address verification error", + ADDRESS_MATCHES_ERROR: "Address matches error", + SHIPPING_CONFLICT_ERROR: "Shipping conflict error", + SHIPPING_ERROR: "General shipping error", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Price adjustment calculation error", + ORDER_FETCH_ERROR: "Order fetch error", + DRAFT_ORDER_UPDATE_ERROR: "Draft order update error", + DISCOUNT_APPLICATION_ERROR: "Voucher application error", + DRAFT_ORDER_OPEN_ERROR: "Draft order open error", + ORDER_UPDATE_ERROR: "Order update error", + CATALOG_FETCH_ERROR: "Catalogue fetch error", + STORE_ID_NOT_FOUND: "Store ID not found", + ORDER_NOT_DRAFT: "Order is not in draft status", + NO_LINE_ITEMS: "No line items found", + BAD_USER_INPUT: "Invalid user input", + MISSING_SHIPPING_ADDRESS: "Shipping address is required", + MISSING_REQUIRED_FIELD: "Required field is missing", + CATALOG_API_ERROR: "Catalogue service error", + TAX_SERVICE_UNAVAILABLE: "VAT service is unavailable", + SHIPPING_SERVICE_UNAVAILABLE: "Shipping service is unavailable", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Price adjustments service is unavailable", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Failed to calculate price adjustments", + SERVICE_UNAVAILABLE: "Service is temporarily unavailable", + RATE_LIMITED: "Too many requests, please try again later", + TIMEOUT: "Request timed out", + INTERNAL_ERROR: "Internal server error", + SHIPPING_POSTAL_CODE_REQUIRED: "Shipping postal code is required", + SHIPPING_COUNTRY_CODE_REQUIRED: "Shipping country code is required", + SHIPPING_METHOD_REQUIRED: "Shipping method is required", + SHIPPING_ADDRESS_VERIFICATION_FAILED: "Shipping address verification failed", + BILLING_ADDRESS_VERIFICATION_FAILED: "Billing address verification failed", + }, +}; \ No newline at end of file diff --git a/packages/localizations/src/enUs.ts b/packages/localizations/src/enUs.ts new file mode 100644 index 00000000..f4bf702e --- /dev/null +++ b/packages/localizations/src/enUs.ts @@ -0,0 +1,316 @@ +export const enUs = { + general: { + optional: "optional", + notes: "Notes", + quantity: "Quantity", + free: "FREE", + closed: "Closed", + apply: "Apply", + checkoutDisabled: + "Checkout is currently disabled. We apologize for the inconvenience.", + }, + contact: { + title: "Contact", + description: "", + email: "Email", + }, + pickup: { + title: "Local Pickup", + description: + "All efforts will be made to meet your expected pickup time. Actual pickup times may vary.", + location: "Pickup Location", + date: "Pickup Date", + time: "Preferred Pickup Time", + selectStore: "Select a store location", + selectDate: "Select a date", + selectTime: "Select a pickup time", + storeHours: "Store Hours", + seeDetails: "See details", + noTimeSlots: + "No available time slots for the selected date. Please select another date.", + hoursDisplayed: "Hours displayed in your local timezone.", + storeOperatesIn: "Store operates in {timezone} timezone.", + asap: "ASAP", + hour: "hour", + hours: "hours", + minutes: "minutes", + searchCountry: "Search country...", + noCountryFound: "No country found.", + }, + days: { + sunday: "Sunday", + monday: "Monday", + tuesday: "Tuesday", + wednesday: "Wednesday", + thursday: "Thursday", + friday: "Friday", + saturday: "Saturday", + }, + delivery: { + title: "Delivery", + method: "Delivery method", + shipping: "Shipping", + shipToAddress: "Ship to your address", + localPickup: "Local Pickup", + pickupFromStore: "Pick up from store location", + }, + tips: { + title: "Add a tip", + noTip: "No Tip", + customAmount: "Custom Amount", + customTipAmount: "Custom Tip Amount", + placeholder: "$0.00", + }, + shipping: { + title: "Shipping", + description: "Shipping address", + method: "Shipping method", + noShippingMethodAddress: + "Enter your address to see available shipping methods.", + noShippingMethods: "No shipping methods found.", + phone: "Phone Number", + country: "Country", + selectCountry: "Select country", + searchCountry: "Search country...", + noCountryFound: "No country found", + firstName: "First Name", + lastName: "Last Name", + address1: "Address", + address2: "Apartment, suite, etc. (optional)", + city: "City", + region: "State/Province", + postalCode: "Postal Code", + notesPlaceholder: "Notes or special instructions", + addressSuggestion: "Did you mean", + addressSuggestionEnd: "?", + noShippingOriginAddress: "No shipping origin address provided.", + }, + billing: { + title: "Billing", + description: "Billing description", + }, + payment: { + title: "Payment", + description: "All payments are secure and encrypted.", + billingAddress: { + title: "Billing Address", + description: "Enter your billing address.", + useShippingAddress: "Use shipping address as billing address", + }, + methods: { + creditCard: "Credit or Debit Card", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Offline payments", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "No payment methods available", + cardNumber: "Card number", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Expiration date (MM / YY)", + securityCode: "Security code", + cvvPlaceholder: "CVV", + nameOnCard: "Name on card", + payNow: "Pay now", + standardShipping: "Standard Shipping", + cardDetails: "Card details", + payWithApplePay: "Pay with Apple Pay", + expirationDatePlaceholder: "MM / YY", + failedToInitializePayment: "Failed to initialize payment.", + orderTotal: "Order Total", + subtotal: "Subtotal", + tax: "Tax", + shipping: "Shipping", + discount: "Coupon", + processingPayment: "Processing payment...", + freePayment: "Complete your free order", + completingOrder: "Completing order...", + }, + phone: { + placeholder: "(201) 555-1234", + searchCountry: "Search country...", + noCountryFound: "No country found.", + }, + discounts: { + placeholder: "Coupon code", + enterCode: "Enter coupon code", + apply: "Apply", + alreadyApplied: "This coupon code has already been applied", + failedToApply: "Failed to apply coupon code", + enterCodeValidation: "Please enter a coupon code", + }, + totals: { + subtotal: "Subtotal", + discount: "Discount", + shipping: "Shipping", + tip: "Tip", + estimatedTaxes: "Estimated taxes", + totalDue: "Total Due", + orderSummary: "Order Summary", + itemCount: "items", + noItems: "No items", + }, + lineItems: { + note: "Note:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Address", + suggestions: "Suggestions", + }, + form: { + useFormFieldError: "useFormField should be used within ", + }, + pagination: { + ariaLabel: "pagination", + previousPageAriaLabel: "Go to previous page", + previous: "Previous", + nextPageAriaLabel: "Go to next page", + next: "Next", + morePages: "More pages", + }, + sidebar: { + useSidebarError: "useSidebar must be used within a SidebarProvider.", + toggleSidebar: "Toggle Sidebar", + }, + accessibility: { + payWithApplePay: "Pay with Apple Pay", + applePayLogo: "Apple Pay Logo", + }, + }, + errors: { + failedToGetAccessToken: "Failed to get access token", + invalidEnvironment: "Invalid environment", + noPublicAccessToken: "No public access token provided", + noSessionToken: "No session token or ID provided", + errorCreatingSession: "Error creating checkout session:", + orderIdRequired: "Order ID is required", + errorTrackingEvent: "Error tracking event", + errorInTrackingSubscriber: "Error in tracking subscriber", + useTrackingProviderError: + "useTracking must be used within a TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect must be used within a PoyntCollectProvider", + useSquareProviderError: "useSquare must be used within a SquareProvider", + errorProcessingPayment: "Error processing payment", + stripeConfigMissing: + "Stripe configuration is missing. Please check your setup.", + paymentSuccessful: "Payment successful", + paymentFailed: "Payment failed", + paypalConfigMissing: + "PayPal configuration is missing. Please check your setup.", + stripeNotReady: "Stripe not ready", + cardElementNotFound: "CardElement not found", + errorProcessingCardPayment: "Error processing card payment.", + errorProcessingExpressPayment: "Error processing express payment.", + failedToInitializePayment: "Failed to initialize payment.", + invalidPhoneNumber: "invalid phone number", + }, + validation: { + phoneRequired: "Phone number is required", + emailRequired: "Enter an email", + emailInvalid: "Enter a valid email", + phoneTooLong: "Phone number too long", + invalidShippingAddress: "Invalid shipping address", + invalidBillingAddress: "Invalid billing address", + selectPaymentMethod: "Select a payment method", + enterValidBillingPhone: "Enter a valid billing phone number", + enterValidShippingPhone: "Enter a valid shipping phone number", + enterFirstName: "Enter a first name", + enterLastName: "Enter a last name", + enterAddress: "Enter an address", + enterCity: "Enter a city", + enterZipCode: "Enter a ZIP code", + enterZipPostalCode: "Enter a ZIP / postal code", + selectState: "Select a state/province", + selectCountry: "Select a country", + enterCountry: "Enter a country", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Server error", + SESSION_NOT_FOUND: "Session not found", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Failed to retrieve checkout session", + CHECKOUT_SESSION_NOT_FOUND: "Checkout session not found", + CHECKOUT_SESSION_FETCH_ERROR: "General checkout session fetch error", + DRAFT_ORDER_NOT_FOUND: "Draft order not found", + CHECKOUT_SESSION_CREATION_FAILED: "Failed to create checkout session", + CREATED_SESSION_DATA_NOT_FOUND: "Created session data not found", + CHECKOUT_SESSION_CREATION_ERROR: "General checkout session creation error", + CHECKOUT_SESSION_UPDATE_FAILED: "Failed to update checkout session", + UPDATED_SESSION_NOT_FOUND: "Updated session not found", + CHECKOUT_SESSION_UPDATE_ERROR: "General checkout session update error", + ORDER_API_NOT_FOUND: "Order API data source not found", + DRAFT_ORDER_RETRIEVAL_FAILED: "Failed to retrieve draft order", + DATA_SOURCES_NOT_FOUND: "Data sources not found", + TRANSACTION_API_NOT_FOUND: "Transaction API data source not found", + TRANSACTION_PROCESSING_FAILED: "Failed to process transaction", + TRANSACTION_CREATION_FAILED: "Failed to find or create transaction", + ORDER_OPENING_FAILED: "Failed to open order", + INVALID_FULFILLMENT_LOCATION: "Invalid fulfillment location", + NO_VALID_PICKUP_LOCATION: "No valid pickup location available", + DRAFT_ORDER_FETCH_FAILED: "Failed to fetch draft order", + LINE_ITEMS_FETCH_FAILED: "Failed to fetch line items", + CURRENT_ORDER_FETCH_FAILED: "Failed to fetch current draft order", + DRAFT_ORDER_UPDATE_FAILED: "Failed to update draft order", + DISCOUNT_APPLICATION_FAILED: "Failed to apply coupon", + CONTEXT_UNAVAILABLE: "Session or data sources not available", + SHIPPING_LINES_UPDATE_FAILED: "Failed to update shipping lines", + ORDER_TOTALS_UPDATE_FAILED: "Failed to update order totals", + SHIPPING_METHOD_APPLICATION_FAILED: "Failed to apply shipping method", + SKU_FETCH_FAILED: "Failed to fetch SKUs", + SHIPPING_RATES_CALCULATION_FAILED: "Failed to calculate shipping rates", + SHIPPING_METHOD_NOT_FOUND: "Shipping method not found", + SHIPPING_METHOD_REMOVAL_FAILED: "Failed to remove shipping method", + SHIPPING_ADDRESS_REQUIRED: "Shipping address required", + INVENTORY_VALIDATION_ERROR: "Inventory validation error", + INSUFFICIENT_INVENTORY: "Insufficient inventory", + INVALID_ORDER_STATUS: "Invalid order status", + TRANSACTION_CREATION_ERROR: "Transaction creation error", + TRANSACTION_PROCESSING_ERROR: "Transaction processing error", + UNKNOWN_ERROR: "Unknown error", + FULFILLMENT_CREATION_ERROR: "Fulfillment creation error", + TAX_CALCULATION_ERROR: "Tax calculation error", + ADDRESS_VERIFICATION_ERROR: "Address verification error", + ADDRESS_MATCHES_ERROR: "Address matches error", + SHIPPING_CONFLICT_ERROR: "Shipping conflict error", + SHIPPING_ERROR: "General shipping error", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Price adjustment calculation error", + ORDER_FETCH_ERROR: "Order fetch error", + DRAFT_ORDER_UPDATE_ERROR: "Draft order update error", + DISCOUNT_APPLICATION_ERROR: "Coupon application error", + DRAFT_ORDER_OPEN_ERROR: "Draft order open error", + ORDER_UPDATE_ERROR: "Order update error", + CATALOG_FETCH_ERROR: "Catalog fetch error", + STORE_ID_NOT_FOUND: "Store ID not found", + ORDER_NOT_DRAFT: "Order is not in draft status", + NO_LINE_ITEMS: "No line items found", + BAD_USER_INPUT: "Invalid user input", + MISSING_SHIPPING_ADDRESS: "Shipping address is required", + MISSING_REQUIRED_FIELD: "Required field is missing", + CATALOG_API_ERROR: "Catalog service error", + TAX_SERVICE_UNAVAILABLE: "Tax service is unavailable", + SHIPPING_SERVICE_UNAVAILABLE: "Shipping service is unavailable", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Price adjustments service is unavailable", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Failed to calculate price adjustments", + SERVICE_UNAVAILABLE: "Service is temporarily unavailable", + RATE_LIMITED: "Too many requests, please try again later", + TIMEOUT: "Request timed out", + INTERNAL_ERROR: "Internal server error", + SHIPPING_POSTAL_CODE_REQUIRED: "Shipping postal code is required", + SHIPPING_COUNTRY_CODE_REQUIRED: "Shipping country code is required", + SHIPPING_METHOD_REQUIRED: "Shipping method is required", + SHIPPING_ADDRESS_VERIFICATION_FAILED: "Shipping address verification failed", + BILLING_ADDRESS_VERIFICATION_FAILED: "Billing address verification failed", + }, +}; diff --git a/packages/localizations/src/esAr.ts b/packages/localizations/src/esAr.ts new file mode 100644 index 00000000..d2a6890b --- /dev/null +++ b/packages/localizations/src/esAr.ts @@ -0,0 +1,323 @@ +export const esAr = { + general: { + optional: "opcional", + notes: "Notas", + quantity: "Cantidad", + free: "GRATIS", + closed: "Cerrado", + apply: "Aplicar", + checkoutDisabled: + "El checkout está deshabilitado actualmente. Pedimos disculpas por las molestias.", + }, + contact: { + title: "Contacto", + description: "", + email: "Email", + }, + pickup: { + title: "Retiro en Local", + description: + "Haremos todo lo posible para cumplir con el horario de retiro solicitado. Los horarios reales pueden variar.", + location: "Ubicación de Retiro", + date: "Fecha de Retiro", + time: "Horario Preferido de Retiro", + selectStore: "Seleccioná una ubicación de local", + selectDate: "Seleccioná una fecha", + selectTime: "Seleccioná un horario de retiro", + storeHours: "Horarios del Local", + seeDetails: "Ver detalles", + noTimeSlots: + "No hay horarios disponibles para la fecha seleccionada. Por favor seleccioná otra fecha.", + hoursDisplayed: "Horarios mostrados en tu zona horaria local.", + storeOperatesIn: "El local opera en zona horaria {timezone}.", + asap: "LO ANTES POSIBLE", + hour: "hora", + hours: "horas", + minutes: "minutos", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + days: { + sunday: "Domingo", + monday: "Lunes", + tuesday: "Martes", + wednesday: "Miércoles", + thursday: "Jueves", + friday: "Viernes", + saturday: "Sábado", + }, + delivery: { + title: "Entrega", + method: "Método de entrega", + shipping: "Envío", + shipToAddress: "Enviar a tu dirección", + localPickup: "Retiro en Local", + pickupFromStore: "Retirar en ubicación del local", + }, + tips: { + title: "Agregar propina", + noTip: "Sin Propina", + customAmount: "Monto Personalizado", + customTipAmount: "Monto de Propina Personalizado", + placeholder: "$0,00", + }, + shipping: { + title: "Envío", + description: "Dirección de envío", + method: "Método de envío", + noShippingMethodAddress: + "Ingresá tu dirección para ver los métodos de envío disponibles.", + noShippingMethods: "No se encontraron métodos de envío.", + phone: "Número de Teléfono", + country: "País", + selectCountry: "Seleccionar país", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país", + firstName: "Nombre", + lastName: "Apellido", + address1: "Dirección", + address2: "Departamento, piso, etc.", + city: "Ciudad", + region: "Provincia/Estado", + postalCode: "Código Postal", + notesPlaceholder: "Notas o instrucciones especiales", + addressSuggestion: "¿Quisiste decir", + addressSuggestionEnd: "?", + noShippingOriginAddress: "No se proporcionó dirección de origen de envío.", + }, + billing: { + title: "Facturación", + description: "Descripción de facturación", + }, + payment: { + title: "Pago", + description: "Todos los pagos son seguros y encriptados.", + billingAddress: { + title: "Dirección de Facturación", + description: "Ingresá tu dirección de facturación.", + useShippingAddress: + "Usar dirección de envío como dirección de facturación", + }, + methods: { + creditCard: "Tarjeta de Crédito o Débito", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Pagos en efectivo", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "No hay métodos de pago disponibles", + cardNumber: "Número de tarjeta", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Fecha de vencimiento (MM / AA)", + securityCode: "Código de seguridad", + cvvPlaceholder: "CVV", + nameOnCard: "Nombre en la tarjeta", + payNow: "Pagar ahora", + standardShipping: "Envío Estándar", + cardDetails: "Detalles de la tarjeta", + payWithApplePay: "Pagar con Apple Pay", + expirationDatePlaceholder: "MM / AA", + failedToInitializePayment: "Error al inicializar el pago.", + orderTotal: "Total del Pedido", + subtotal: "Subtotal", + tax: "Impuestos", + shipping: "Envío", + discount: "Cupón", + processingPayment: "Procesando pago...", + completingOrder: "Completando pedido...", + freePayment: "Completa tu pedido gratuito", + }, + phone: { + placeholder: "(011) 1234-5678", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + discounts: { + placeholder: "Código de cupón", + enterCode: "Ingresar código de cupón", + apply: "Aplicar", + alreadyApplied: "Este código de cupón ya fue aplicado", + failedToApply: "Error al aplicar código de cupón", + enterCodeValidation: "Por favor ingresá un código de cupón", + }, + totals: { + subtotal: "Subtotal", + discount: "Descuento", + shipping: "Envío", + tip: "Propina", + estimatedTaxes: "Impuestos estimados", + totalDue: "Total a Pagar", + orderSummary: "Resumen del Pedido", + itemCount: "productos", + noItems: "Sin productos", + }, + lineItems: { + note: "Nota:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Dirección", + suggestions: "Sugerencias", + }, + form: { + useFormFieldError: "useFormField debe usarse dentro de ", + }, + pagination: { + ariaLabel: "paginación", + previousPageAriaLabel: "Ir a la página anterior", + previous: "Anterior", + nextPageAriaLabel: "Ir a la página siguiente", + next: "Siguiente", + morePages: "Más páginas", + }, + sidebar: { + useSidebarError: "useSidebar debe usarse dentro de un SidebarProvider.", + toggleSidebar: "Alternar Barra Lateral", + }, + accessibility: { + payWithApplePay: "Pagar con Apple Pay", + applePayLogo: "Logo de Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Error al obtener token de acceso", + invalidEnvironment: "Entorno inválido", + noPublicAccessToken: "No se proporcionó token de acceso público", + noSessionToken: "No se proporcionó token de sesión o ID", + errorCreatingSession: "Error al crear sesión de checkout:", + orderIdRequired: "Se requiere ID del pedido", + errorTrackingEvent: "Error al rastrear evento", + errorInTrackingSubscriber: "Error en suscriptor de rastreo", + useTrackingProviderError: + "useTracking debe usarse dentro de un TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect debe usarse dentro de un PoyntCollectProvider", + useSquareProviderError: "useSquare debe usarse dentro de un SquareProvider", + errorProcessingPayment: "Error al procesar el pago", + stripeConfigMissing: + "Falta configuración de Stripe. Por favor verificá tu configuración.", + paymentSuccessful: "Pago exitoso", + paymentFailed: "Error en el pago", + paypalConfigMissing: + "Falta configuración de PayPal. Por favor verificá tu configuración.", + stripeNotReady: "Stripe no está listo", + cardElementNotFound: "CardElement no encontrado", + errorProcessingCardPayment: "Error al procesar pago con tarjeta.", + errorProcessingExpressPayment: "Error al procesar pago express.", + failedToInitializePayment: "Error al inicializar el pago.", + invalidPhoneNumber: "número de teléfono inválido", + }, + validation: { + phoneRequired: "Se requiere número de teléfono", + emailRequired: "Ingresá un email", + emailInvalid: "Ingresá un email válido", + phoneTooLong: "Número de teléfono demasiado largo", + invalidShippingAddress: "Dirección de envío inválida", + invalidBillingAddress: "Dirección de facturación inválida", + selectPaymentMethod: "Seleccioná un método de pago", + enterValidBillingPhone: + "Ingresá un número de teléfono de facturación válido", + enterValidShippingPhone: "Ingresá un número de teléfono de envío válido", + enterFirstName: "Ingresá un nombre", + enterLastName: "Ingresá un apellido", + enterAddress: "Ingresá una dirección", + enterCity: "Ingresá una ciudad", + enterZipCode: "Ingresá un código postal", + enterZipPostalCode: "Ingresá un código postal", + selectState: "Seleccioná una provincia/región", + selectCountry: "Seleccioná un país", + enterCountry: "Ingresá un país", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Error del servidor", + SESSION_NOT_FOUND: "Sesión no encontrada", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Error al recuperar sesión de checkout", + CHECKOUT_SESSION_NOT_FOUND: "Sesión de checkout no encontrada", + CHECKOUT_SESSION_FETCH_ERROR: "Error general al obtener sesión de checkout", + DRAFT_ORDER_NOT_FOUND: "Borrador de pedido no encontrado", + CHECKOUT_SESSION_CREATION_FAILED: "Error al crear sesión de checkout", + CREATED_SESSION_DATA_NOT_FOUND: "Datos de sesión creada no encontrados", + CHECKOUT_SESSION_CREATION_ERROR: + "Error general al crear sesión de checkout", + CHECKOUT_SESSION_UPDATE_FAILED: "Error al actualizar sesión de checkout", + UPDATED_SESSION_NOT_FOUND: "Sesión actualizada no encontrada", + CHECKOUT_SESSION_UPDATE_ERROR: + "Error general al actualizar sesión de checkout", + ORDER_API_NOT_FOUND: "Fuente de datos de API de pedidos no encontrada", + DRAFT_ORDER_RETRIEVAL_FAILED: "Error al recuperar borrador de pedido", + DATA_SOURCES_NOT_FOUND: "Fuentes de datos no encontradas", + TRANSACTION_API_NOT_FOUND: + "Fuente de datos de API de transacciones no encontrada", + TRANSACTION_PROCESSING_FAILED: "Error al procesar transacción", + TRANSACTION_CREATION_FAILED: "Error al encontrar o crear transacción", + ORDER_OPENING_FAILED: "Error al abrir pedido", + INVALID_FULFILLMENT_LOCATION: "Ubicación de cumplimiento inválida", + NO_VALID_PICKUP_LOCATION: "No hay ubicación de retiro válida disponible", + DRAFT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido", + LINE_ITEMS_FETCH_FAILED: "Error al obtener elementos del pedido", + CURRENT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido actual", + DRAFT_ORDER_UPDATE_FAILED: "Error al actualizar borrador de pedido", + DISCOUNT_APPLICATION_FAILED: "Error al aplicar cupón", + CONTEXT_UNAVAILABLE: "Sesión o fuentes de datos no disponibles", + SHIPPING_LINES_UPDATE_FAILED: "Error al actualizar líneas de envío", + ORDER_TOTALS_UPDATE_FAILED: "Error al actualizar totales del pedido", + SHIPPING_METHOD_APPLICATION_FAILED: "Error al aplicar método de envío", + SKU_FETCH_FAILED: "Error al obtener SKUs", + SHIPPING_RATES_CALCULATION_FAILED: "Error al calcular tarifas de envío", + SHIPPING_METHOD_NOT_FOUND: "Método de envío no encontrado", + SHIPPING_METHOD_REMOVAL_FAILED: "Error al eliminar método de envío", + SHIPPING_ADDRESS_REQUIRED: "Se requiere dirección de envío", + INVENTORY_VALIDATION_ERROR: "Error de validación de inventario", + INSUFFICIENT_INVENTORY: "Inventario insuficiente", + INVALID_ORDER_STATUS: "Estado de pedido inválido", + TRANSACTION_CREATION_ERROR: "Error de creación de transacción", + TRANSACTION_PROCESSING_ERROR: "Error de procesamiento de transacción", + UNKNOWN_ERROR: "Error desconocido", + FULFILLMENT_CREATION_ERROR: "Error de creación de cumplimiento", + TAX_CALCULATION_ERROR: "Error de cálculo de impuestos", + ADDRESS_VERIFICATION_ERROR: "Error de verificación de dirección", + ADDRESS_MATCHES_ERROR: "Error de coincidencias de dirección", + SHIPPING_CONFLICT_ERROR: "Error de conflicto de envío", + SHIPPING_ERROR: "Error general de envío", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Error de cálculo de ajuste de precio", + ORDER_FETCH_ERROR: "Error al obtener pedido", + DRAFT_ORDER_UPDATE_ERROR: "Error al actualizar borrador de pedido", + DISCOUNT_APPLICATION_ERROR: "Error de aplicación de cupón", + DRAFT_ORDER_OPEN_ERROR: "Error al abrir borrador de pedido", + ORDER_UPDATE_ERROR: "Error al actualizar pedido", + CATALOG_FETCH_ERROR: "Error al obtener catálogo", + STORE_ID_NOT_FOUND: "ID de tienda no encontrado", + ORDER_NOT_DRAFT: "El pedido no está en estado de borrador", + NO_LINE_ITEMS: "No se encontraron artículos", + BAD_USER_INPUT: "Entrada de usuario inválida", + MISSING_SHIPPING_ADDRESS: "Se requiere dirección de envío", + MISSING_REQUIRED_FIELD: "Falta campo obligatorio", + CATALOG_API_ERROR: "Error de servicio de catálogo", + TAX_SERVICE_UNAVAILABLE: "Servicio de impuestos no disponible", + SHIPPING_SERVICE_UNAVAILABLE: "Servicio de envío no disponible", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Servicio de ajustes de precios no disponible", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Error al calcular ajustes de precios", + SERVICE_UNAVAILABLE: "Servicio temporalmente no disponible", + RATE_LIMITED: "Demasiadas solicitudes, por favor intentá más tarde", + TIMEOUT: "Tiempo de espera agotado", + INTERNAL_ERROR: "Error interno del servidor", + SHIPPING_POSTAL_CODE_REQUIRED: "Se requiere código postal de envío", + SHIPPING_COUNTRY_CODE_REQUIRED: "Se requiere código de país de envío", + SHIPPING_METHOD_REQUIRED: "Se requiere método de envío", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de envío", + BILLING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de facturación", + }, +}; diff --git a/packages/localizations/src/esCl.ts b/packages/localizations/src/esCl.ts new file mode 100644 index 00000000..9eee881c --- /dev/null +++ b/packages/localizations/src/esCl.ts @@ -0,0 +1,325 @@ +export const esCl = { + general: { + optional: "opcional", + notes: "Notas", + quantity: "Cantidad", + free: "GRATIS", + closed: "Cerrado", + apply: "Aplicar", + checkoutDisabled: + "El checkout está actualmente deshabilitado. Pedimos disculpas por las molestias.", + }, + contact: { + title: "Contacto", + description: "", + email: "Correo electrónico", + }, + pickup: { + title: "Retiro en Tienda", + description: + "Haremos todos los esfuerzos para cumplir con el horario de retiro solicitado. Los horarios de retiro pueden variar.", + location: "Ubicación de Retiro", + date: "Fecha de Retiro", + time: "Horario Preferido de Retiro", + selectStore: "Selecciona una ubicación de tienda", + selectDate: "Selecciona una fecha", + selectTime: "Selecciona un horario de retiro", + storeHours: "Horarios de la Tienda", + seeDetails: "Ver detalles", + noTimeSlots: + "No hay horarios disponibles para la fecha seleccionada. Por favor selecciona otra fecha.", + hoursDisplayed: "Horarios mostrados en tu zona horaria local.", + storeOperatesIn: "La tienda opera en zona horaria {timezone}.", + asap: "LO ANTES POSIBLE", + hour: "hora", + hours: "horas", + minutes: "minutos", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + days: { + sunday: "Domingo", + monday: "Lunes", + tuesday: "Martes", + wednesday: "Miércoles", + thursday: "Jueves", + friday: "Viernes", + saturday: "Sábado", + }, + delivery: { + title: "Entrega", + method: "Método de entrega", + shipping: "Envío", + shipToAddress: "Enviar a tu dirección", + localPickup: "Retiro en Tienda", + pickupFromStore: "Retirar en ubicación de tienda", + }, + tips: { + title: "Agregar propina", + noTip: "Sin Propina", + customAmount: "Monto Personalizado", + customTipAmount: "Monto de Propina Personalizado", + placeholder: "$0.00", + }, + shipping: { + title: "Envío", + description: "Dirección de envío", + method: "Método de envío", + noShippingMethodAddress: + "Ingresa tu dirección para ver los métodos de envío disponibles.", + noShippingMethods: "No se encontraron métodos de envío.", + phone: "Número de Teléfono", + country: "País", + selectCountry: "Seleccionar país", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país", + firstName: "Nombre", + lastName: "Apellido", + address1: "Dirección", + address2: "Departamento, oficina, etc.", + city: "Ciudad", + region: "Región", + postalCode: "Código Postal", + notesPlaceholder: "Notas o instrucciones especiales", + addressSuggestion: "¿Quisiste decir", + addressSuggestionEnd: "?", + noShippingOriginAddress: "No se proporcionó dirección de origen de envío.", + }, + billing: { + title: "Facturación", + description: "Descripción de facturación", + }, + payment: { + title: "Pago", + description: "Todos los pagos son seguros y encriptados.", + billingAddress: { + title: "Dirección de Facturación", + description: "Ingresa tu dirección de facturación.", + useShippingAddress: + "Usar dirección de envío como dirección de facturación", + }, + methods: { + creditCard: "Tarjeta de Crédito o Débito", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Pagos offline", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "No hay métodos de pago disponibles", + cardNumber: "Número de tarjeta", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Fecha de vencimiento (MM / AA)", + securityCode: "Código de seguridad", + cvvPlaceholder: "CVV", + nameOnCard: "Nombre en la tarjeta", + payNow: "Pagar ahora", + standardShipping: "Envío Estándar", + cardDetails: "Detalles de la tarjeta", + payWithApplePay: "Pagar con Apple Pay", + expirationDatePlaceholder: "MM / AA", + failedToInitializePayment: "Error al inicializar el pago.", + orderTotal: "Total del Pedido", + subtotal: "Subtotal", + tax: "Impuesto", + shipping: "Envío", + discount: "Cupón", + processingPayment: "Procesando pago...", + completingOrder: "Completando pedido...", + freePayment: "Completa tu pedido gratuito", + }, + phone: { + placeholder: "+56 9 1234 5678", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + discounts: { + placeholder: "Código de cupón", + enterCode: "Ingresa código de cupón", + apply: "Aplicar", + alreadyApplied: "Este código de cupón ya ha sido aplicado", + failedToApply: "Error al aplicar código de cupón", + enterCodeValidation: "Por favor ingresa un código de cupón", + }, + totals: { + subtotal: "Subtotal", + discount: "Descuento", + shipping: "Envío", + tip: "Propina", + estimatedTaxes: "Impuestos estimados", + totalDue: "Total a Pagar", + orderSummary: "Resumen del Pedido", + itemCount: "artículos", + noItems: "Sin artículos", + }, + lineItems: { + note: "Nota:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Dirección", + suggestions: "Sugerencias", + }, + form: { + useFormFieldError: "useFormField debe ser usado dentro de ", + }, + pagination: { + ariaLabel: "paginación", + previousPageAriaLabel: "Ir a la página anterior", + previous: "Anterior", + nextPageAriaLabel: "Ir a la página siguiente", + next: "Siguiente", + morePages: "Más páginas", + }, + sidebar: { + useSidebarError: + "useSidebar debe ser usado dentro de un SidebarProvider.", + toggleSidebar: "Alternar Barra Lateral", + }, + accessibility: { + payWithApplePay: "Pagar con Apple Pay", + applePayLogo: "Logo de Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Error al obtener token de acceso", + invalidEnvironment: "Ambiente inválido", + noPublicAccessToken: "No se proporcionó token de acceso público", + noSessionToken: "No se proporcionó token de sesión o ID", + errorCreatingSession: "Error al crear sesión de checkout:", + orderIdRequired: "Se requiere ID de pedido", + errorTrackingEvent: "Error al rastrear evento", + errorInTrackingSubscriber: "Error en suscriptor de rastreo", + useTrackingProviderError: + "useTracking debe ser usado dentro de un TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect debe ser usado dentro de un PoyntCollectProvider", + useSquareProviderError: + "useSquare debe ser usado dentro de un SquareProvider", + errorProcessingPayment: "Error al procesar pago", + stripeConfigMissing: + "Falta configuración de Stripe. Por favor revisa tu configuración.", + paymentSuccessful: "Pago exitoso", + paymentFailed: "Pago falló", + paypalConfigMissing: + "Falta configuración de PayPal. Por favor revisa tu configuración.", + stripeNotReady: "Stripe no está listo", + cardElementNotFound: "CardElement no encontrado", + errorProcessingCardPayment: "Error al procesar pago con tarjeta.", + errorProcessingExpressPayment: "Error al procesar pago express.", + failedToInitializePayment: "Error al inicializar pago.", + invalidPhoneNumber: "número de teléfono inválido", + }, + validation: { + phoneRequired: "Se requiere número de teléfono", + emailRequired: "Ingresa un correo electrónico", + emailInvalid: "Ingresa un correo electrónico válido", + phoneTooLong: "Número de teléfono muy largo", + invalidShippingAddress: "Dirección de envío inválida", + invalidBillingAddress: "Dirección de facturación inválida", + selectPaymentMethod: "Selecciona un método de pago", + enterValidBillingPhone: + "Ingresa un número de teléfono de facturación válido", + enterValidShippingPhone: "Ingresa un número de teléfono de envío válido", + enterFirstName: "Ingresa un nombre", + enterLastName: "Ingresa un apellido", + enterAddress: "Ingresa una dirección", + enterCity: "Ingresa una ciudad", + enterZipCode: "Ingresa un código postal", + enterZipPostalCode: "Ingresa un código postal", + selectState: "Selecciona una región/provincia", + selectCountry: "Selecciona un país", + enterCountry: "Ingresa un país", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Error del servidor", + SESSION_NOT_FOUND: "Sesión no encontrada", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Error al recuperar sesión de checkout", + CHECKOUT_SESSION_NOT_FOUND: "Sesión de checkout no encontrada", + CHECKOUT_SESSION_FETCH_ERROR: "Error general al obtener sesión de checkout", + DRAFT_ORDER_NOT_FOUND: "Borrador de pedido no encontrado", + CHECKOUT_SESSION_CREATION_FAILED: "Error al crear sesión de checkout", + CREATED_SESSION_DATA_NOT_FOUND: "Datos de sesión creada no encontrados", + CHECKOUT_SESSION_CREATION_ERROR: + "Error general al crear sesión de checkout", + CHECKOUT_SESSION_UPDATE_FAILED: "Error al actualizar sesión de checkout", + UPDATED_SESSION_NOT_FOUND: "Sesión actualizada no encontrada", + CHECKOUT_SESSION_UPDATE_ERROR: + "Error general al actualizar sesión de checkout", + ORDER_API_NOT_FOUND: "Fuente de datos de API de pedido no encontrada", + DRAFT_ORDER_RETRIEVAL_FAILED: "Error al recuperar borrador de pedido", + DATA_SOURCES_NOT_FOUND: "Fuentes de datos no encontradas", + TRANSACTION_API_NOT_FOUND: + "Fuente de datos de API de transacción no encontrada", + TRANSACTION_PROCESSING_FAILED: "Error al procesar transacción", + TRANSACTION_CREATION_FAILED: "Error al encontrar o crear transacción", + ORDER_OPENING_FAILED: "Error al abrir pedido", + INVALID_FULFILLMENT_LOCATION: "Ubicación de cumplimiento inválida", + NO_VALID_PICKUP_LOCATION: "No hay ubicación de retiro válida disponible", + DRAFT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido", + LINE_ITEMS_FETCH_FAILED: "Error al obtener artículos de línea", + CURRENT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido actual", + DRAFT_ORDER_UPDATE_FAILED: "Error al actualizar borrador de pedido", + DISCOUNT_APPLICATION_FAILED: "Error al aplicar cupón", + CONTEXT_UNAVAILABLE: "Sesión o fuentes de datos no disponibles", + SHIPPING_LINES_UPDATE_FAILED: "Error al actualizar líneas de envío", + ORDER_TOTALS_UPDATE_FAILED: "Error al actualizar totales de pedido", + SHIPPING_METHOD_APPLICATION_FAILED: "Error al aplicar método de envío", + SKU_FETCH_FAILED: "Error al obtener SKUs", + SHIPPING_RATES_CALCULATION_FAILED: "Error al calcular tarifas de envío", + SHIPPING_METHOD_NOT_FOUND: "Método de envío no encontrado", + SHIPPING_METHOD_REMOVAL_FAILED: "Error al eliminar método de envío", + SHIPPING_ADDRESS_REQUIRED: "Se requiere dirección de envío", + INVENTORY_VALIDATION_ERROR: "Error de validación de inventario", + INSUFFICIENT_INVENTORY: "Inventario insuficiente", + INVALID_ORDER_STATUS: "Estado de pedido inválido", + TRANSACTION_CREATION_ERROR: "Error de creación de transacción", + TRANSACTION_PROCESSING_ERROR: "Error de procesamiento de transacción", + UNKNOWN_ERROR: "Error desconocido", + FULFILLMENT_CREATION_ERROR: "Error de creación de cumplimiento", + TAX_CALCULATION_ERROR: "Error de cálculo de impuesto", + ADDRESS_VERIFICATION_ERROR: "Error de verificación de dirección", + ADDRESS_MATCHES_ERROR: "Error de coincidencias de dirección", + SHIPPING_CONFLICT_ERROR: "Error de conflicto de envío", + SHIPPING_ERROR: "Error general de envío", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Error de cálculo de ajuste de precio", + ORDER_FETCH_ERROR: "Error al obtener pedido", + DRAFT_ORDER_UPDATE_ERROR: "Error de actualización de borrador de pedido", + DISCOUNT_APPLICATION_ERROR: "Error de aplicación de cupón", + DRAFT_ORDER_OPEN_ERROR: "Error de apertura de borrador de pedido", + ORDER_UPDATE_ERROR: "Error de actualización de pedido", + CATALOG_FETCH_ERROR: "Error al obtener catálogo", + STORE_ID_NOT_FOUND: "ID de tienda no encontrado", + ORDER_NOT_DRAFT: "El pedido no está en estado de borrador", + NO_LINE_ITEMS: "No se encontraron artículos", + BAD_USER_INPUT: "Entrada de usuario inválida", + MISSING_SHIPPING_ADDRESS: "Se requiere dirección de envío", + MISSING_REQUIRED_FIELD: "Falta campo obligatorio", + CATALOG_API_ERROR: "Error de servicio de catálogo", + TAX_SERVICE_UNAVAILABLE: "Servicio de impuestos no disponible", + SHIPPING_SERVICE_UNAVAILABLE: "Servicio de envío no disponible", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Servicio de ajustes de precios no disponible", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Error al calcular ajustes de precios", + SERVICE_UNAVAILABLE: "Servicio temporalmente no disponible", + RATE_LIMITED: "Demasiadas solicitudes, por favor inténtelo más tarde", + TIMEOUT: "Tiempo de espera agotado", + INTERNAL_ERROR: "Error interno del servidor", + SHIPPING_POSTAL_CODE_REQUIRED: "Se requiere código postal de envío", + SHIPPING_COUNTRY_CODE_REQUIRED: "Se requiere código de país de envío", + SHIPPING_METHOD_REQUIRED: "Se requiere método de envío", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de envío", + BILLING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de facturación", + }, +}; diff --git a/packages/localizations/src/esCo.ts b/packages/localizations/src/esCo.ts new file mode 100644 index 00000000..ed642a41 --- /dev/null +++ b/packages/localizations/src/esCo.ts @@ -0,0 +1,323 @@ +export const esCo = { + general: { + optional: "opcional", + notes: "Notas", + quantity: "Cantidad", + free: "GRATIS", + closed: "Cerrado", + apply: "Aplicar", + checkoutDisabled: + "El checkout está deshabilitado actualmente. Pedimos disculpas por las molestias.", + }, + contact: { + title: "Contacto", + description: "", + email: "Correo electrónico", + }, + pickup: { + title: "Recogida en tienda", + description: + "Haremos todo lo posible para cumplir con la hora de recogida esperada. Las horas reales de recogida pueden variar.", + location: "Ubicación de recogida", + date: "Fecha de recogida", + time: "Hora preferida de recogida", + selectStore: "Selecciona una ubicación de tienda", + selectDate: "Selecciona una fecha", + selectTime: "Selecciona una hora de recogida", + storeHours: "Horarios de la tienda", + seeDetails: "Ver detalles", + noTimeSlots: + "No hay horarios disponibles para la fecha seleccionada. Por favor selecciona otra fecha.", + hoursDisplayed: "Horarios mostrados en tu zona horaria local.", + storeOperatesIn: "La tienda opera en zona horaria {timezone}.", + asap: "LO MÁS PRONTO POSIBLE", + hour: "hora", + hours: "horas", + minutes: "minutos", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + days: { + sunday: "Domingo", + monday: "Lunes", + tuesday: "Martes", + wednesday: "Miércoles", + thursday: "Jueves", + friday: "Viernes", + saturday: "Sábado", + }, + delivery: { + title: "Entrega", + method: "Método de entrega", + shipping: "Envío", + shipToAddress: "Enviar a tu dirección", + localPickup: "Recogida en tienda", + pickupFromStore: "Recoger en ubicación de la tienda", + }, + tips: { + title: "Agregar propina", + noTip: "Sin propina", + customAmount: "Monto personalizado", + customTipAmount: "Monto de propina personalizado", + placeholder: "$0.00", + }, + shipping: { + title: "Envío", + description: "Dirección de envío", + method: "Método de envío", + noShippingMethodAddress: + "Ingresa tu dirección para ver los métodos de envío disponibles.", + noShippingMethods: "No se encontraron métodos de envío.", + phone: "Número de teléfono", + country: "País", + selectCountry: "Seleccionar país", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país", + firstName: "Nombre", + lastName: "Apellido", + address1: "Dirección", + address2: "Apartamento, oficina, etc.", + city: "Ciudad", + region: "Departamento/Estado", + postalCode: "Código postal", + notesPlaceholder: "Notas o instrucciones especiales", + addressSuggestion: "¿Quisiste decir", + addressSuggestionEnd: "?", + noShippingOriginAddress: "No se proporcionó dirección de origen de envío.", + }, + billing: { + title: "Facturación", + description: "Descripción de facturación", + }, + payment: { + title: "Pago", + description: "Todos los pagos son seguros y encriptados.", + billingAddress: { + title: "Dirección de facturación", + description: "Ingresa tu dirección de facturación.", + useShippingAddress: + "Usar dirección de envío como dirección de facturación", + }, + methods: { + creditCard: "Tarjeta de crédito o débito", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Pagos sin conexión", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "No hay métodos de pago disponibles", + cardNumber: "Número de tarjeta", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Fecha de vencimiento (MM / AA)", + securityCode: "Código de seguridad", + cvvPlaceholder: "CVV", + nameOnCard: "Nombre en la tarjeta", + payNow: "Pagar ahora", + standardShipping: "Envío estándar", + cardDetails: "Detalles de la tarjeta", + payWithApplePay: "Pagar con Apple Pay", + expirationDatePlaceholder: "MM / AA", + failedToInitializePayment: "Error al inicializar el pago.", + orderTotal: "Total del pedido", + subtotal: "Subtotal", + tax: "Impuestos", + shipping: "Envío", + discount: "Cupón", + processingPayment: "Procesando pago...", + completingOrder: "Completando pedido...", + freePayment: "Completa tu pedido gratuito", + }, + phone: { + placeholder: "(057) 300 123 4567", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + discounts: { + placeholder: "Código de cupón", + enterCode: "Ingresa código de cupón", + apply: "Aplicar", + alreadyApplied: "Este código de cupón ya fue aplicado", + failedToApply: "Error al aplicar código de cupón", + enterCodeValidation: "Por favor ingresa un código de cupón", + }, + totals: { + subtotal: "Subtotal", + discount: "Descuento", + shipping: "Envío", + tip: "Propina", + estimatedTaxes: "Impuestos estimados", + totalDue: "Total a pagar", + orderSummary: "Resumen del pedido", + itemCount: "artículos", + noItems: "Sin artículos", + }, + lineItems: { + note: "Nota:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Dirección", + suggestions: "Sugerencias", + }, + form: { + useFormFieldError: "useFormField debe usarse dentro de ", + }, + pagination: { + ariaLabel: "paginación", + previousPageAriaLabel: "Ir a la página anterior", + previous: "Anterior", + nextPageAriaLabel: "Ir a la página siguiente", + next: "Siguiente", + morePages: "Más páginas", + }, + sidebar: { + useSidebarError: "useSidebar debe usarse dentro de un SidebarProvider.", + toggleSidebar: "Alternar barra lateral", + }, + accessibility: { + payWithApplePay: "Pagar con Apple Pay", + applePayLogo: "Logo de Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Error al obtener token de acceso", + invalidEnvironment: "Entorno inválido", + noPublicAccessToken: "No se proporcionó token de acceso público", + noSessionToken: "No se proporcionó token de sesión o cédula", + errorCreatingSession: "Error al crear sesión de checkout:", + orderIdRequired: "Se requiere cédula del pedido", + errorTrackingEvent: "Error al rastrear evento", + errorInTrackingSubscriber: "Error en suscriptor de rastreo", + useTrackingProviderError: + "useTracking debe usarse dentro de un TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect debe usarse dentro de un PoyntCollectProvider", + useSquareProviderError: "useSquare debe usarse dentro de un SquareProvider", + errorProcessingPayment: "Error al procesar el pago", + stripeConfigMissing: + "Falta configuración de Stripe. Por favor verifica tu configuración.", + paymentSuccessful: "Pago exitoso", + paymentFailed: "Error en el pago", + paypalConfigMissing: + "Falta configuración de PayPal. Por favor verifica tu configuración.", + stripeNotReady: "Stripe no está listo", + cardElementNotFound: "CardElement no encontrado", + errorProcessingCardPayment: "Error al procesar pago con tarjeta.", + errorProcessingExpressPayment: "Error al procesar pago express.", + failedToInitializePayment: "Error al inicializar el pago.", + invalidPhoneNumber: "número de teléfono inválido", + }, + validation: { + phoneRequired: "Se requiere número de teléfono", + emailRequired: "Ingresa un correo electrónico", + emailInvalid: "Ingresa un correo electrónico válido", + phoneTooLong: "Número de teléfono demasiado largo", + invalidShippingAddress: "Dirección de envío inválida", + invalidBillingAddress: "Dirección de facturación inválida", + selectPaymentMethod: "Selecciona un método de pago", + enterValidBillingPhone: + "Ingresa un número de teléfono de facturación válido", + enterValidShippingPhone: "Ingresa un número de teléfono de envío válido", + enterFirstName: "Ingresa un nombre", + enterLastName: "Ingresa un apellido", + enterAddress: "Ingresa una dirección", + enterCity: "Ingresa una ciudad", + enterZipCode: "Ingresa un código postal", + enterZipPostalCode: "Ingresa un código postal", + selectState: "Selecciona un departamento/región", + selectCountry: "Selecciona un país", + enterCountry: "Ingresa un país", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Error del servidor", + SESSION_NOT_FOUND: "Sesión no encontrada", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Error al recuperar sesión de checkout", + CHECKOUT_SESSION_NOT_FOUND: "Sesión de checkout no encontrada", + CHECKOUT_SESSION_FETCH_ERROR: "Error general al obtener sesión de checkout", + DRAFT_ORDER_NOT_FOUND: "Borrador de pedido no encontrado", + CHECKOUT_SESSION_CREATION_FAILED: "Error al crear sesión de checkout", + CREATED_SESSION_DATA_NOT_FOUND: "Datos de sesión creada no encontrados", + CHECKOUT_SESSION_CREATION_ERROR: + "Error general al crear sesión de checkout", + CHECKOUT_SESSION_UPDATE_FAILED: "Error al actualizar sesión de checkout", + UPDATED_SESSION_NOT_FOUND: "Sesión actualizada no encontrada", + CHECKOUT_SESSION_UPDATE_ERROR: + "Error general al actualizar sesión de checkout", + ORDER_API_NOT_FOUND: "Fuente de datos de API de pedidos no encontrada", + DRAFT_ORDER_RETRIEVAL_FAILED: "Error al recuperar borrador de pedido", + DATA_SOURCES_NOT_FOUND: "Fuentes de datos no encontradas", + TRANSACTION_API_NOT_FOUND: + "Fuente de datos de API de transacciones no encontrada", + TRANSACTION_PROCESSING_FAILED: "Error al procesar transacción", + TRANSACTION_CREATION_FAILED: "Error al encontrar o crear transacción", + ORDER_OPENING_FAILED: "Error al abrir pedido", + INVALID_FULFILLMENT_LOCATION: "Ubicación de cumplimiento inválida", + NO_VALID_PICKUP_LOCATION: "No hay ubicación de recogida válida disponible", + DRAFT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido", + LINE_ITEMS_FETCH_FAILED: "Error al obtener elementos del pedido", + CURRENT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido actual", + DRAFT_ORDER_UPDATE_FAILED: "Error al actualizar borrador de pedido", + DISCOUNT_APPLICATION_FAILED: "Error al aplicar cupón", + CONTEXT_UNAVAILABLE: "Sesión o fuentes de datos no disponibles", + SHIPPING_LINES_UPDATE_FAILED: "Error al actualizar líneas de envío", + ORDER_TOTALS_UPDATE_FAILED: "Error al actualizar totales del pedido", + SHIPPING_METHOD_APPLICATION_FAILED: "Error al aplicar método de envío", + SKU_FETCH_FAILED: "Error al obtener SKUs", + SHIPPING_RATES_CALCULATION_FAILED: "Error al calcular tarifas de envío", + SHIPPING_METHOD_NOT_FOUND: "Método de envío no encontrado", + SHIPPING_METHOD_REMOVAL_FAILED: "Error al eliminar método de envío", + SHIPPING_ADDRESS_REQUIRED: "Se requiere dirección de envío", + INVENTORY_VALIDATION_ERROR: "Error de validación de inventario", + INSUFFICIENT_INVENTORY: "Inventario insuficiente", + INVALID_ORDER_STATUS: "Estado de pedido inválido", + TRANSACTION_CREATION_ERROR: "Error de creación de transacción", + TRANSACTION_PROCESSING_ERROR: "Error de procesamiento de transacción", + UNKNOWN_ERROR: "Error desconocido", + FULFILLMENT_CREATION_ERROR: "Error de creación de cumplimiento", + TAX_CALCULATION_ERROR: "Error de cálculo de impuestos", + ADDRESS_VERIFICATION_ERROR: "Error de verificación de dirección", + ADDRESS_MATCHES_ERROR: "Error de coincidencias de dirección", + SHIPPING_CONFLICT_ERROR: "Error de conflicto de envío", + SHIPPING_ERROR: "Error general de envío", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Error de cálculo de ajuste de precio", + ORDER_FETCH_ERROR: "Error al obtener pedido", + DRAFT_ORDER_UPDATE_ERROR: "Error al actualizar borrador de pedido", + DISCOUNT_APPLICATION_ERROR: "Error de aplicación de cupón", + DRAFT_ORDER_OPEN_ERROR: "Error al abrir borrador de pedido", + ORDER_UPDATE_ERROR: "Error al actualizar pedido", + CATALOG_FETCH_ERROR: "Error al obtener catálogo", + STORE_ID_NOT_FOUND: "ID de tienda no encontrado", + ORDER_NOT_DRAFT: "El pedido no está en estado de borrador", + NO_LINE_ITEMS: "No se encontraron artículos", + BAD_USER_INPUT: "Entrada de usuario inválida", + MISSING_SHIPPING_ADDRESS: "Se requiere dirección de envío", + MISSING_REQUIRED_FIELD: "Falta campo obligatorio", + CATALOG_API_ERROR: "Error de servicio de catálogo", + TAX_SERVICE_UNAVAILABLE: "Servicio de impuestos no disponible", + SHIPPING_SERVICE_UNAVAILABLE: "Servicio de envío no disponible", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Servicio de ajustes de precios no disponible", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Error al calcular ajustes de precios", + SERVICE_UNAVAILABLE: "Servicio temporalmente no disponible", + RATE_LIMITED: "Demasiadas solicitudes, por favor inténtelo más tarde", + TIMEOUT: "Tiempo de espera agotado", + INTERNAL_ERROR: "Error interno del servidor", + SHIPPING_POSTAL_CODE_REQUIRED: "Se requiere código postal de envío", + SHIPPING_COUNTRY_CODE_REQUIRED: "Se requiere código de país de envío", + SHIPPING_METHOD_REQUIRED: "Se requiere método de envío", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de envío", + BILLING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de facturación", + }, +}; diff --git a/packages/localizations/src/esEs.ts b/packages/localizations/src/esEs.ts new file mode 100644 index 00000000..0b7baf40 --- /dev/null +++ b/packages/localizations/src/esEs.ts @@ -0,0 +1,328 @@ +export const esEs = { + general: { + optional: "opcional", + notes: "Notas", + quantity: "Cantidad", + free: "GRATIS", + closed: "Cerrado", + apply: "Aplicar", + checkoutDisabled: + "El checkout está deshabilitado actualmente. Pedimos disculpas por las molestias.", + }, + contact: { + title: "Contacto", + description: "", + email: "Correo electrónico", + }, + pickup: { + title: "Recogida local", + description: + "Haremos todo lo posible para cumplir con su hora de recogida esperada. Los horarios reales de recogida pueden variar.", + location: "Ubicación de recogida", + date: "Fecha de recogida", + time: "Hora de recogida preferida", + selectStore: "Selecciona una ubicación de tienda", + selectDate: "Selecciona una fecha", + selectTime: "Selecciona una hora de recogida", + storeHours: "Horario de la tienda", + seeDetails: "Ver detalles", + noTimeSlots: + "No hay horarios disponibles para la fecha seleccionada. Por favor selecciona otra fecha.", + hoursDisplayed: "Horarios mostrados en tu zona horaria local.", + storeOperatesIn: "La tienda opera en la zona horaria {timezone}.", + asap: "Lo antes posible", + hour: "hora", + hours: "horas", + minutes: "minutos", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + days: { + sunday: "Domingo", + monday: "Lunes", + tuesday: "Martes", + wednesday: "Miércoles", + thursday: "Jueves", + friday: "Viernes", + saturday: "Sábado", + }, + delivery: { + title: "Entrega", + method: "Método de entrega", + shipping: "Envío", + shipToAddress: "Enviar a tu dirección", + localPickup: "Recogida local", + pickupFromStore: "Recoger de la ubicación de la tienda", + }, + tips: { + title: "Añadir propina", + noTip: "Sin propina", + customAmount: "Cantidad personalizada", + customTipAmount: "Cantidad de propina personalizada", + placeholder: "$0.00", + }, + shipping: { + title: "Envío", + description: "Dirección de envío", + method: "Método de envío", + noShippingMethodAddress: + "Introduce tu dirección para ver los métodos de envío disponibles.", + noShippingMethods: "No se encontraron métodos de envío.", + phone: "Número de teléfono", + country: "País", + selectCountry: "Seleccionar país", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país", + firstName: "Nombre", + lastName: "Apellido", + address1: "Dirección", + address2: "Apartamento, suite, etc.", + city: "Ciudad", + region: "Estado/Provincia", + postalCode: "Código postal", + notesPlaceholder: "Notas o instrucciones especiales", + addressSuggestion: "¿Querías decir", + addressSuggestionEnd: "?", + noShippingOriginAddress: "No se proporcionó dirección de origen de envío.", + }, + billing: { + title: "Facturación", + description: "Descripción de facturación", + }, + payment: { + title: "Pago", + description: "Todos los pagos son seguros y están encriptados.", + billingAddress: { + title: "Dirección de facturación", + description: "Introduce tu dirección de facturación.", + useShippingAddress: + "Usar dirección de envío como dirección de facturación", + }, + methods: { + creditCard: "Tarjeta de crédito o débito", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Pagos sin conexión", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "No hay métodos de pago disponibles", + cardNumber: "Número de tarjeta", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Fecha de vencimiento (MM / AA)", + securityCode: "Código de seguridad", + cvvPlaceholder: "CVV", + nameOnCard: "Nombre en la tarjeta", + payNow: "Pagar ahora", + standardShipping: "Envío estándar", + cardDetails: "Detalles de la tarjeta", + payWithApplePay: "Pagar con Apple Pay", + expirationDatePlaceholder: "MM / AA", + failedToInitializePayment: "Error al inicializar el pago.", + orderTotal: "Total del pedido", + subtotal: "Subtotal", + tax: "Impuestos", + shipping: "Envío", + discount: "Cupón", + processingPayment: "Procesando pago...", + completingOrder: "Completando pedido...", + freePayment: "Completa tu pedido gratuito", + }, + phone: { + placeholder: "(201) 555-1234", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + discounts: { + placeholder: "Código de cupón", + enterCode: "Introduce código de cupón", + apply: "Aplicar", + alreadyApplied: "Este código de cupón ya ha sido aplicado", + failedToApply: "Error al aplicar el código de cupón", + enterCodeValidation: "Por favor introduce un código de cupón", + }, + totals: { + subtotal: "Subtotal", + discount: "Descuento", + shipping: "Envío", + tip: "Propina", + estimatedTaxes: "Impuestos estimados", + totalDue: "Total a pagar", + orderSummary: "Resumen del pedido", + itemCount: "artículos", + noItems: "Sin artículos", + }, + lineItems: { + note: "Nota:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Dirección", + suggestions: "Sugerencias", + }, + form: { + useFormFieldError: "useFormField debe usarse dentro de ", + }, + pagination: { + ariaLabel: "paginación", + previousPageAriaLabel: "Ir a la página anterior", + previous: "Anterior", + nextPageAriaLabel: "Ir a la siguiente página", + next: "Siguiente", + morePages: "Más páginas", + }, + sidebar: { + useSidebarError: "useSidebar debe usarse dentro de un SidebarProvider.", + toggleSidebar: "Alternar barra lateral", + }, + accessibility: { + payWithApplePay: "Pagar con Apple Pay", + applePayLogo: "Logo de Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Error al obtener el token de acceso", + invalidEnvironment: "Entorno inválido", + noPublicAccessToken: "No se proporcionó token de acceso público", + noSessionToken: "No se proporcionó token o ID de sesión", + errorCreatingSession: "Error al crear la sesión de checkout:", + orderIdRequired: "Se requiere ID de pedido", + errorTrackingEvent: "Error al rastrear evento", + errorInTrackingSubscriber: "Error en el suscriptor de rastreo", + useTrackingProviderError: + "useTracking debe usarse dentro de un TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect debe usarse dentro de un PoyntCollectProvider", + useSquareProviderError: "useSquare debe usarse dentro de un SquareProvider", + errorProcessingPayment: "Error al procesar el pago", + stripeConfigMissing: + "Falta la configuración de Stripe. Por favor verifica tu configuración.", + paymentSuccessful: "Pago exitoso", + paymentFailed: "Pago fallido", + paypalConfigMissing: + "Falta la configuración de PayPal. Por favor verifica tu configuración.", + stripeNotReady: "Stripe no está listo", + cardElementNotFound: "Elemento de tarjeta no encontrado", + errorProcessingCardPayment: "Error al procesar el pago con tarjeta.", + errorProcessingExpressPayment: "Error al procesar el pago exprés.", + failedToInitializePayment: "Error al inicializar el pago.", + invalidPhoneNumber: "número de teléfono inválido", + }, + validation: { + phoneRequired: "Se requiere número de teléfono", + emailRequired: "Introduce un correo electrónico", + emailInvalid: "Introduce un correo electrónico válido", + phoneTooLong: "Número de teléfono demasiado largo", + invalidShippingAddress: "Dirección de envío inválida", + invalidBillingAddress: "Dirección de facturación inválida", + selectPaymentMethod: "Selecciona un método de pago", + enterValidBillingPhone: + "Introduce un número de teléfono de facturación válido", + enterValidShippingPhone: "Introduce un número de teléfono de envío válido", + enterFirstName: "Introduce un nombre", + enterLastName: "Introduce un apellido", + enterAddress: "Introduce una dirección", + enterCity: "Introduce una ciudad", + enterZipCode: "Introduce un código postal", + enterZipPostalCode: "Introduce un código ZIP / postal", + selectState: "Selecciona un estado/provincia", + selectCountry: "Selecciona un país", + enterCountry: "Introduce un país", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Error del servidor", + SESSION_NOT_FOUND: "Sesión no encontrada", + CHECKOUT_SESSION_RETRIEVAL_FAILED: + "No se pudo recuperar la sesión de checkout", + CHECKOUT_SESSION_NOT_FOUND: "Sesión de checkout no encontrada", + CHECKOUT_SESSION_FETCH_ERROR: + "Error general al obtener la sesión de checkout", + DRAFT_ORDER_NOT_FOUND: "Borrador de pedido no encontrado", + CHECKOUT_SESSION_CREATION_FAILED: "No se pudo crear la sesión de checkout", + CREATED_SESSION_DATA_NOT_FOUND: "Datos de la sesión creada no encontrados", + CHECKOUT_SESSION_CREATION_ERROR: + "Error general al crear la sesión de checkout", + CHECKOUT_SESSION_UPDATE_FAILED: + "No se pudo actualizar la sesión de checkout", + UPDATED_SESSION_NOT_FOUND: "Sesión actualizada no encontrada", + CHECKOUT_SESSION_UPDATE_ERROR: + "Error general al actualizar la sesión de checkout", + ORDER_API_NOT_FOUND: "Fuente de datos de la API de pedidos no encontrada", + DRAFT_ORDER_RETRIEVAL_FAILED: "No se pudo recuperar el borrador de pedido", + DATA_SOURCES_NOT_FOUND: "Fuentes de datos no encontradas", + TRANSACTION_API_NOT_FOUND: + "Fuente de datos de la API de transacciones no encontrada", + TRANSACTION_PROCESSING_FAILED: "No se pudo procesar la transacción", + TRANSACTION_CREATION_FAILED: "No se pudo encontrar o crear la transacción", + ORDER_OPENING_FAILED: "No se pudo abrir el pedido", + INVALID_FULFILLMENT_LOCATION: "Ubicación de cumplimiento inválida", + NO_VALID_PICKUP_LOCATION: "No hay ubicación de recogida válida disponible", + DRAFT_ORDER_FETCH_FAILED: "No se pudo obtener el borrador de pedido", + LINE_ITEMS_FETCH_FAILED: "No se pudieron obtener los artículos", + CURRENT_ORDER_FETCH_FAILED: + "No se pudo obtener el borrador de pedido actual", + DRAFT_ORDER_UPDATE_FAILED: "No se pudo actualizar el borrador de pedido", + DISCOUNT_APPLICATION_FAILED: "No se pudo aplicar el cupón", + CONTEXT_UNAVAILABLE: "Sesión o fuentes de datos no disponibles", + SHIPPING_LINES_UPDATE_FAILED: "No se pudo actualizar las líneas de envío", + ORDER_TOTALS_UPDATE_FAILED: "No se pudo actualizar los totales del pedido", + SHIPPING_METHOD_APPLICATION_FAILED: "No se pudo aplicar el método de envío", + SKU_FETCH_FAILED: "No se pudieron obtener los SKUs", + SHIPPING_RATES_CALCULATION_FAILED: + "No se pudieron calcular las tarifas de envío", + SHIPPING_METHOD_NOT_FOUND: "Método de envío no encontrado", + SHIPPING_METHOD_REMOVAL_FAILED: "No se pudo eliminar el método de envío", + SHIPPING_ADDRESS_REQUIRED: "Se requiere dirección de envío", + INVENTORY_VALIDATION_ERROR: "Error de validación de inventario", + INSUFFICIENT_INVENTORY: "Inventario insuficiente", + INVALID_ORDER_STATUS: "Estado de pedido inválido", + TRANSACTION_CREATION_ERROR: "Error al crear la transacción", + TRANSACTION_PROCESSING_ERROR: "Error al procesar la transacción", + UNKNOWN_ERROR: "Error desconocido", + FULFILLMENT_CREATION_ERROR: "Error al crear el cumplimiento", + TAX_CALCULATION_ERROR: "Error al calcular los impuestos", + ADDRESS_VERIFICATION_ERROR: "Error al verificar la dirección", + ADDRESS_MATCHES_ERROR: "Error en la coincidencia de direcciones", + SHIPPING_CONFLICT_ERROR: "Error de conflicto de envío", + SHIPPING_ERROR: "Error general de envío", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Error al calcular el ajuste de precio", + ORDER_FETCH_ERROR: "Error al obtener el pedido", + DRAFT_ORDER_UPDATE_ERROR: "Error al actualizar el borrador de pedido", + DISCOUNT_APPLICATION_ERROR: "Error al aplicar el cupón", + DRAFT_ORDER_OPEN_ERROR: "Error al abrir el borrador de pedido", + ORDER_UPDATE_ERROR: "Error al actualizar el pedido", + CATALOG_FETCH_ERROR: "Error al obtener el catálogo", + STORE_ID_NOT_FOUND: "ID de tienda no encontrado", + ORDER_NOT_DRAFT: "El pedido no está en estado borrador", + NO_LINE_ITEMS: "No se encontraron artículos", + BAD_USER_INPUT: "Entrada de usuario inválida", + MISSING_SHIPPING_ADDRESS: "Se requiere dirección de envío", + MISSING_REQUIRED_FIELD: "Falta un campo requerido", + CATALOG_API_ERROR: "Error del servicio de catálogo", + TAX_SERVICE_UNAVAILABLE: "Servicio de impuestos no disponible", + SHIPPING_SERVICE_UNAVAILABLE: "Servicio de envío no disponible", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Servicio de ajustes de precio no disponible", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "No se pudieron calcular los ajustes de precio", + SERVICE_UNAVAILABLE: "Servicio temporalmente no disponible", + RATE_LIMITED: "Demasiadas solicitudes, intente nuevamente más tarde", + TIMEOUT: "Tiempo de espera agotado", + INTERNAL_ERROR: "Error interno del servidor", + SHIPPING_POSTAL_CODE_REQUIRED: "Se requiere código postal de envío", + SHIPPING_COUNTRY_CODE_REQUIRED: "Se requiere código de país de envío", + SHIPPING_METHOD_REQUIRED: "Se requiere método de envío", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de envío", + BILLING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de facturación", + }, +}; diff --git a/packages/localizations/src/esMx.ts b/packages/localizations/src/esMx.ts new file mode 100644 index 00000000..a509c999 --- /dev/null +++ b/packages/localizations/src/esMx.ts @@ -0,0 +1,324 @@ +export const esMx = { + general: { + optional: "opcional", + notes: "Notas", + quantity: "Cantidad", + free: "GRATIS", + closed: "Cerrado", + apply: "Aplicar", + checkoutDisabled: + "El checkout está deshabilitado temporalmente. Disculpe las molestias.", + }, + contact: { + title: "Contacto", + description: "", + email: "Correo electrónico", + }, + pickup: { + title: "Recolección en Tienda", + description: + "Haremos nuestro mejor esfuerzo para cumplir con su horario de recolección. Los horarios reales pueden variar.", + location: "Ubicación de Recolección", + date: "Fecha de Recolección", + time: "Horario Preferido de Recolección", + selectStore: "Seleccione una ubicación de tienda", + selectDate: "Seleccione una fecha", + selectTime: "Seleccione un horario de recolección", + storeHours: "Horarios de la Tienda", + seeDetails: "Ver detalles", + noTimeSlots: + "No hay horarios disponibles para la fecha seleccionada. Por favor seleccione otra fecha.", + hoursDisplayed: "Horarios mostrados en su zona horaria local.", + storeOperatesIn: "La tienda opera en zona horaria {timezone}.", + asap: "LO MÁS PRONTO POSIBLE", + hour: "hora", + hours: "horas", + minutes: "minutos", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + days: { + sunday: "Domingo", + monday: "Lunes", + tuesday: "Martes", + wednesday: "Miércoles", + thursday: "Jueves", + friday: "Viernes", + saturday: "Sábado", + }, + delivery: { + title: "Entrega", + method: "Método de entrega", + shipping: "Envío", + shipToAddress: "Enviar a su dirección", + localPickup: "Recolección en Tienda", + pickupFromStore: "Recoger en ubicación de tienda", + }, + tips: { + title: "Agregar propina", + noTip: "Sin Propina", + customAmount: "Cantidad Personalizada", + customTipAmount: "Cantidad de Propina Personalizada", + placeholder: "$0.00", + }, + shipping: { + title: "Envío", + description: "Dirección de envío", + method: "Método de envío", + noShippingMethodAddress: + "Ingrese su dirección para ver los métodos de envío disponibles.", + noShippingMethods: "No se encontraron métodos de envío.", + phone: "Número de Teléfono", + country: "País", + selectCountry: "Seleccionar país", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país", + firstName: "Nombre", + lastName: "Apellidos", + address1: "Dirección", + address2: "Departamento, suite, etc.", + city: "Ciudad", + region: "Estado/Provincia", + postalCode: "Código Postal", + notesPlaceholder: "Notas o instrucciones especiales", + addressSuggestion: "¿Quiso decir", + addressSuggestionEnd: "?", + noShippingOriginAddress: "No se proporcionó dirección de origen de envío.", + }, + billing: { + title: "Facturación", + description: "Descripción de facturación", + }, + payment: { + title: "Pago", + description: "Todos los pagos son seguros y cifrados.", + billingAddress: { + title: "Dirección de Facturación", + description: "Ingrese su dirección de facturación.", + useShippingAddress: + "Usar dirección de envío como dirección de facturación", + }, + methods: { + creditCard: "Tarjeta de Crédito o Débito", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Pagos fuera de línea", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "No hay métodos de pago disponibles", + cardNumber: "Número de tarjeta", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Fecha de vencimiento (MM / AA)", + securityCode: "Código de seguridad", + cvvPlaceholder: "CVV", + nameOnCard: "Nombre en la tarjeta", + payNow: "Pagar ahora", + standardShipping: "Envío Estándar", + cardDetails: "Detalles de la tarjeta", + payWithApplePay: "Pagar con Apple Pay", + expirationDatePlaceholder: "MM / AA", + failedToInitializePayment: "Error al inicializar el pago.", + orderTotal: "Total del Pedido", + subtotal: "Subtotal", + tax: "Impuestos", + shipping: "Envío", + discount: "Cupón", + processingPayment: "Procesando pago...", + completingOrder: "Completando pedido...", + freePayment: "Completa tu pedido gratuito", + }, + phone: { + placeholder: "(55) 1234-5678", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + discounts: { + placeholder: "Código de cupón", + enterCode: "Ingresar código de cupón", + apply: "Aplicar", + alreadyApplied: "Este código de cupón ya ha sido aplicado", + failedToApply: "Error al aplicar código de cupón", + enterCodeValidation: "Por favor ingrese un código de cupón", + }, + totals: { + subtotal: "Subtotal", + discount: "Descuento", + shipping: "Envío", + tip: "Propina", + estimatedTaxes: "Impuestos estimados", + totalDue: "Total a Pagar", + orderSummary: "Resumen del Pedido", + itemCount: "artículos", + noItems: "Sin artículos", + }, + lineItems: { + note: "Nota:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Dirección", + suggestions: "Sugerencias", + }, + form: { + useFormFieldError: "useFormField debe usarse dentro de ", + }, + pagination: { + ariaLabel: "paginación", + previousPageAriaLabel: "Ir a la página anterior", + previous: "Anterior", + nextPageAriaLabel: "Ir a la página siguiente", + next: "Siguiente", + morePages: "Más páginas", + }, + sidebar: { + useSidebarError: "useSidebar debe usarse dentro de un SidebarProvider.", + toggleSidebar: "Alternar Barra Lateral", + }, + accessibility: { + payWithApplePay: "Pagar con Apple Pay", + applePayLogo: "Logo de Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Error al obtener token de acceso", + invalidEnvironment: "Entorno inválido", + noPublicAccessToken: "No se proporcionó token de acceso público", + noSessionToken: "No se proporcionó token de sesión o ID", + errorCreatingSession: "Error al crear sesión de checkout:", + orderIdRequired: "Se requiere ID del pedido", + errorTrackingEvent: "Error al rastrear evento", + errorInTrackingSubscriber: "Error en suscriptor de seguimiento", + useTrackingProviderError: + "useTracking debe usarse dentro de un TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect debe usarse dentro de un PoyntCollectProvider", + useSquareProviderError: "useSquare debe usarse dentro de un SquareProvider", + errorProcessingPayment: "Error al procesar el pago", + stripeConfigMissing: + "Falta configuración de Stripe. Por favor verifique su configuración.", + paymentSuccessful: "Pago exitoso", + paymentFailed: "Error en el pago", + paypalConfigMissing: + "Falta configuración de PayPal. Por favor verifique su configuración.", + stripeNotReady: "Stripe no está listo", + cardElementNotFound: "CardElement no encontrado", + errorProcessingCardPayment: "Error al procesar pago con tarjeta.", + errorProcessingExpressPayment: "Error al procesar pago express.", + failedToInitializePayment: "Error al inicializar el pago.", + invalidPhoneNumber: "número de teléfono inválido", + }, + validation: { + phoneRequired: "Se requiere número de teléfono", + emailRequired: "Ingrese un correo electrónico", + emailInvalid: "Ingrese un correo electrónico válido", + phoneTooLong: "Número de teléfono demasiado largo", + invalidShippingAddress: "Dirección de envío inválida", + invalidBillingAddress: "Dirección de facturación inválida", + selectPaymentMethod: "Seleccione un método de pago", + enterValidBillingPhone: + "Ingrese un número de teléfono de facturación válido", + enterValidShippingPhone: "Ingrese un número de teléfono de envío válido", + enterFirstName: "Ingrese un nombre", + enterLastName: "Ingrese apellidos", + enterAddress: "Ingrese una dirección", + enterCity: "Ingrese una ciudad", + enterZipCode: "Ingrese un código postal", + enterZipPostalCode: "Ingrese un código postal", + selectState: "Seleccione un estado/provincia", + selectCountry: "Seleccione un país", + enterCountry: "Ingrese un país", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Error del servidor", + SESSION_NOT_FOUND: "Sesión no encontrada", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Error al recuperar sesión de checkout", + CHECKOUT_SESSION_NOT_FOUND: "Sesión de checkout no encontrada", + CHECKOUT_SESSION_FETCH_ERROR: "Error general al obtener sesión de checkout", + DRAFT_ORDER_NOT_FOUND: "Borrador de pedido no encontrado", + CHECKOUT_SESSION_CREATION_FAILED: "Error al crear sesión de checkout", + CREATED_SESSION_DATA_NOT_FOUND: "Datos de sesión creada no encontrados", + CHECKOUT_SESSION_CREATION_ERROR: + "Error general al crear sesión de checkout", + CHECKOUT_SESSION_UPDATE_FAILED: "Error al actualizar sesión de checkout", + UPDATED_SESSION_NOT_FOUND: "Sesión actualizada no encontrada", + CHECKOUT_SESSION_UPDATE_ERROR: + "Error general al actualizar sesión de checkout", + ORDER_API_NOT_FOUND: "Fuente de datos de API de pedidos no encontrada", + DRAFT_ORDER_RETRIEVAL_FAILED: "Error al recuperar borrador de pedido", + DATA_SOURCES_NOT_FOUND: "Fuentes de datos no encontradas", + TRANSACTION_API_NOT_FOUND: + "Fuente de datos de API de transacciones no encontrada", + TRANSACTION_PROCESSING_FAILED: "Error al procesar transacción", + TRANSACTION_CREATION_FAILED: "Error al encontrar o crear transacción", + ORDER_OPENING_FAILED: "Error al abrir pedido", + INVALID_FULFILLMENT_LOCATION: "Ubicación de cumplimiento inválida", + NO_VALID_PICKUP_LOCATION: + "No hay ubicación de recolección válida disponible", + DRAFT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido", + LINE_ITEMS_FETCH_FAILED: "Error al obtener elementos del pedido", + CURRENT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido actual", + DRAFT_ORDER_UPDATE_FAILED: "Error al actualizar borrador de pedido", + DISCOUNT_APPLICATION_FAILED: "Error al aplicar cupón", + CONTEXT_UNAVAILABLE: "Sesión o fuentes de datos no disponibles", + SHIPPING_LINES_UPDATE_FAILED: "Error al actualizar líneas de envío", + ORDER_TOTALS_UPDATE_FAILED: "Error al actualizar totales del pedido", + SHIPPING_METHOD_APPLICATION_FAILED: "Error al aplicar método de envío", + SKU_FETCH_FAILED: "Error al obtener SKUs", + SHIPPING_RATES_CALCULATION_FAILED: "Error al calcular tarifas de envío", + SHIPPING_METHOD_NOT_FOUND: "Método de envío no encontrado", + SHIPPING_METHOD_REMOVAL_FAILED: "Error al eliminar método de envío", + SHIPPING_ADDRESS_REQUIRED: "Se requiere dirección de envío", + INVENTORY_VALIDATION_ERROR: "Error de validación de inventario", + INSUFFICIENT_INVENTORY: "Inventario insuficiente", + INVALID_ORDER_STATUS: "Estado de pedido inválido", + TRANSACTION_CREATION_ERROR: "Error de creación de transacción", + TRANSACTION_PROCESSING_ERROR: "Error de procesamiento de transacción", + UNKNOWN_ERROR: "Error desconocido", + FULFILLMENT_CREATION_ERROR: "Error de creación de cumplimiento", + TAX_CALCULATION_ERROR: "Error de cálculo de impuestos", + ADDRESS_VERIFICATION_ERROR: "Error de verificación de dirección", + ADDRESS_MATCHES_ERROR: "Error de coincidencias de dirección", + SHIPPING_CONFLICT_ERROR: "Error de conflicto de envío", + SHIPPING_ERROR: "Error general de envío", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Error de cálculo de ajuste de precio", + ORDER_FETCH_ERROR: "Error al obtener pedido", + DRAFT_ORDER_UPDATE_ERROR: "Error al actualizar borrador de pedido", + DISCOUNT_APPLICATION_ERROR: "Error de aplicación de cupón", + DRAFT_ORDER_OPEN_ERROR: "Error al abrir borrador de pedido", + ORDER_UPDATE_ERROR: "Error al actualizar pedido", + CATALOG_FETCH_ERROR: "Error al obtener catálogo", + STORE_ID_NOT_FOUND: "ID de tienda no encontrado", + ORDER_NOT_DRAFT: "El pedido no está en estado de borrador", + NO_LINE_ITEMS: "No se encontraron artículos", + BAD_USER_INPUT: "Entrada de usuario inválida", + MISSING_SHIPPING_ADDRESS: "Se requiere dirección de envío", + MISSING_REQUIRED_FIELD: "Falta campo obligatorio", + CATALOG_API_ERROR: "Error de servicio de catálogo", + TAX_SERVICE_UNAVAILABLE: "Servicio de impuestos no disponible", + SHIPPING_SERVICE_UNAVAILABLE: "Servicio de envío no disponible", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Servicio de ajustes de precios no disponible", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Error al calcular ajustes de precios", + SERVICE_UNAVAILABLE: "Servicio temporalmente no disponible", + RATE_LIMITED: "Demasiadas solicitudes, por favor inténtelo más tarde", + TIMEOUT: "Tiempo de espera agotado", + INTERNAL_ERROR: "Error interno del servidor", + SHIPPING_POSTAL_CODE_REQUIRED: "Se requiere código postal de envío", + SHIPPING_COUNTRY_CODE_REQUIRED: "Se requiere código de país de envío", + SHIPPING_METHOD_REQUIRED: "Se requiere método de envío", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de envío", + BILLING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de facturación", + }, +}; diff --git a/packages/localizations/src/esPe.ts b/packages/localizations/src/esPe.ts new file mode 100644 index 00000000..13f401e6 --- /dev/null +++ b/packages/localizations/src/esPe.ts @@ -0,0 +1,323 @@ +export const esPe = { + general: { + optional: "opcional", + notes: "Notas", + quantity: "Cantidad", + free: "GRATIS", + closed: "Cerrado", + apply: "Aplicar", + checkoutDisabled: + "El checkout está deshabilitado actualmente. Disculpe las molestias.", + }, + contact: { + title: "Contacto", + description: "", + email: "Correo electrónico", + }, + pickup: { + title: "Recojo en Tienda", + description: + "Haremos todo lo posible para cumplir con el horario de recojo solicitado. Los horarios reales pueden variar.", + location: "Ubicación de Recojo", + date: "Fecha de Recojo", + time: "Horario Preferido de Recojo", + selectStore: "Seleccione una ubicación de tienda", + selectDate: "Seleccione una fecha", + selectTime: "Seleccione un horario de recojo", + storeHours: "Horarios de la Tienda", + seeDetails: "Ver detalles", + noTimeSlots: + "No hay horarios disponibles para la fecha seleccionada. Por favor seleccione otra fecha.", + hoursDisplayed: "Horarios mostrados en su zona horaria local.", + storeOperatesIn: "La tienda opera en zona horaria {timezone}.", + asap: "LO MÁS PRONTO POSIBLE", + hour: "hora", + hours: "horas", + minutes: "minutos", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + days: { + sunday: "Domingo", + monday: "Lunes", + tuesday: "Martes", + wednesday: "Miércoles", + thursday: "Jueves", + friday: "Viernes", + saturday: "Sábado", + }, + delivery: { + title: "Entrega", + method: "Método de entrega", + shipping: "Envío", + shipToAddress: "Enviar a su dirección", + localPickup: "Recojo en Tienda", + pickupFromStore: "Recoger en ubicación de la tienda", + }, + tips: { + title: "Agregar propina", + noTip: "Sin Propina", + customAmount: "Monto Personalizado", + customTipAmount: "Monto de Propina Personalizado", + placeholder: "S/ 0.00", + }, + shipping: { + title: "Envío", + description: "Dirección de envío", + method: "Método de envío", + noShippingMethodAddress: + "Ingrese su dirección para ver los métodos de envío disponibles.", + noShippingMethods: "No se encontraron métodos de envío.", + phone: "Número de Teléfono", + country: "País", + selectCountry: "Seleccionar país", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país", + firstName: "Nombres", + lastName: "Apellidos", + address1: "Dirección", + address2: "Departamento, piso, etc.", + city: "Ciudad", + region: "Departamento/Región", + postalCode: "Código Postal", + notesPlaceholder: "Notas o instrucciones especiales", + addressSuggestion: "¿Quiso decir", + addressSuggestionEnd: "?", + noShippingOriginAddress: "No se proporcionó dirección de origen de envío.", + }, + billing: { + title: "Facturación", + description: "Descripción de facturación", + }, + payment: { + title: "Pago", + description: "Todos los pagos son seguros y encriptados.", + billingAddress: { + title: "Dirección de Facturación", + description: "Ingrese su dirección de facturación.", + useShippingAddress: + "Usar dirección de envío como dirección de facturación", + }, + methods: { + creditCard: "Tarjeta de Crédito o Débito", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Pagos en efectivo", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "No hay métodos de pago disponibles", + cardNumber: "Número de tarjeta", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Fecha de vencimiento (MM / AA)", + securityCode: "Código de seguridad", + cvvPlaceholder: "CVV", + nameOnCard: "Nombre en la tarjeta", + payNow: "Pagar ahora", + standardShipping: "Envío Estándar", + cardDetails: "Detalles de la tarjeta", + payWithApplePay: "Pagar con Apple Pay", + expirationDatePlaceholder: "MM / AA", + failedToInitializePayment: "Error al inicializar el pago.", + orderTotal: "Total del Pedido", + subtotal: "Subtotal", + tax: "Impuestos", + shipping: "Envío", + discount: "Cupón", + processingPayment: "Procesando pago...", + completingOrder: "Completando pedido...", + freePayment: "Completa tu pedido gratuito", + }, + phone: { + placeholder: "(01) 234-5678", + searchCountry: "Buscar país...", + noCountryFound: "No se encontró el país.", + }, + discounts: { + placeholder: "Código de cupón", + enterCode: "Ingresar código de cupón", + apply: "Aplicar", + alreadyApplied: "Este código de cupón ya fue aplicado", + failedToApply: "Error al aplicar código de cupón", + enterCodeValidation: "Por favor ingrese un código de cupón", + }, + totals: { + subtotal: "Subtotal", + discount: "Descuento", + shipping: "Envío", + tip: "Propina", + estimatedTaxes: "Impuestos estimados", + totalDue: "Total a Pagar", + orderSummary: "Resumen del Pedido", + itemCount: "productos", + noItems: "Sin productos", + }, + lineItems: { + note: "Nota:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Dirección", + suggestions: "Sugerencias", + }, + form: { + useFormFieldError: "useFormField debe usarse dentro de ", + }, + pagination: { + ariaLabel: "paginación", + previousPageAriaLabel: "Ir a la página anterior", + previous: "Anterior", + nextPageAriaLabel: "Ir a la página siguiente", + next: "Siguiente", + morePages: "Más páginas", + }, + sidebar: { + useSidebarError: "useSidebar debe usarse dentro de un SidebarProvider.", + toggleSidebar: "Alternar Barra Lateral", + }, + accessibility: { + payWithApplePay: "Pagar con Apple Pay", + applePayLogo: "Logo de Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Error al obtener token de acceso", + invalidEnvironment: "Entorno inválido", + noPublicAccessToken: "No se proporcionó token de acceso público", + noSessionToken: "No se proporcionó token de sesión o ID", + errorCreatingSession: "Error al crear sesión de checkout:", + orderIdRequired: "Se requiere ID del pedido", + errorTrackingEvent: "Error al rastrear evento", + errorInTrackingSubscriber: "Error en suscriptor de rastreo", + useTrackingProviderError: + "useTracking debe usarse dentro de un TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect debe usarse dentro de un PoyntCollectProvider", + useSquareProviderError: "useSquare debe usarse dentro de un SquareProvider", + errorProcessingPayment: "Error al procesar el pago", + stripeConfigMissing: + "Falta configuración de Stripe. Por favor verifique su configuración.", + paymentSuccessful: "Pago exitoso", + paymentFailed: "Error en el pago", + paypalConfigMissing: + "Falta configuración de PayPal. Por favor verifique su configuración.", + stripeNotReady: "Stripe no está listo", + cardElementNotFound: "CardElement no encontrado", + errorProcessingCardPayment: "Error al procesar pago con tarjeta.", + errorProcessingExpressPayment: "Error al procesar pago express.", + failedToInitializePayment: "Error al inicializar el pago.", + invalidPhoneNumber: "número de teléfono inválido", + }, + validation: { + phoneRequired: "Se requiere número de teléfono", + emailRequired: "Ingrese un correo electrónico", + emailInvalid: "Ingrese un correo electrónico válido", + phoneTooLong: "Número de teléfono demasiado largo", + invalidShippingAddress: "Dirección de envío inválida", + invalidBillingAddress: "Dirección de facturación inválida", + selectPaymentMethod: "Seleccione un método de pago", + enterValidBillingPhone: + "Ingrese un número de teléfono de facturación válido", + enterValidShippingPhone: "Ingrese un número de teléfono de envío válido", + enterFirstName: "Ingrese sus nombres", + enterLastName: "Ingrese sus apellidos", + enterAddress: "Ingrese una dirección", + enterCity: "Ingrese una ciudad", + enterZipCode: "Ingrese un código postal", + enterZipPostalCode: "Ingrese un código postal", + selectState: "Seleccione un departamento/región", + selectCountry: "Seleccione un país", + enterCountry: "Ingrese un país", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Error del servidor", + SESSION_NOT_FOUND: "Sesión no encontrada", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Error al recuperar sesión de checkout", + CHECKOUT_SESSION_NOT_FOUND: "Sesión de checkout no encontrada", + CHECKOUT_SESSION_FETCH_ERROR: "Error general al obtener sesión de checkout", + DRAFT_ORDER_NOT_FOUND: "Borrador de pedido no encontrado", + CHECKOUT_SESSION_CREATION_FAILED: "Error al crear sesión de checkout", + CREATED_SESSION_DATA_NOT_FOUND: "Datos de sesión creada no encontrados", + CHECKOUT_SESSION_CREATION_ERROR: + "Error general al crear sesión de checkout", + CHECKOUT_SESSION_UPDATE_FAILED: "Error al actualizar sesión de checkout", + UPDATED_SESSION_NOT_FOUND: "Sesión actualizada no encontrada", + CHECKOUT_SESSION_UPDATE_ERROR: + "Error general al actualizar sesión de checkout", + ORDER_API_NOT_FOUND: "Fuente de datos de API de pedidos no encontrada", + DRAFT_ORDER_RETRIEVAL_FAILED: "Error al recuperar borrador de pedido", + DATA_SOURCES_NOT_FOUND: "Fuentes de datos no encontradas", + TRANSACTION_API_NOT_FOUND: + "Fuente de datos de API de transacciones no encontrada", + TRANSACTION_PROCESSING_FAILED: "Error al procesar transacción", + TRANSACTION_CREATION_FAILED: "Error al encontrar o crear transacción", + ORDER_OPENING_FAILED: "Error al abrir pedido", + INVALID_FULFILLMENT_LOCATION: "Ubicación de cumplimiento inválida", + NO_VALID_PICKUP_LOCATION: "No hay ubicación de recojo válida disponible", + DRAFT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido", + LINE_ITEMS_FETCH_FAILED: "Error al obtener elementos del pedido", + CURRENT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido actual", + DRAFT_ORDER_UPDATE_FAILED: "Error al actualizar borrador de pedido", + DISCOUNT_APPLICATION_FAILED: "Error al aplicar cupón", + CONTEXT_UNAVAILABLE: "Sesión o fuentes de datos no disponibles", + SHIPPING_LINES_UPDATE_FAILED: "Error al actualizar líneas de envío", + ORDER_TOTALS_UPDATE_FAILED: "Error al actualizar totales del pedido", + SHIPPING_METHOD_APPLICATION_FAILED: "Error al aplicar método de envío", + SKU_FETCH_FAILED: "Error al obtener SKUs", + SHIPPING_RATES_CALCULATION_FAILED: "Error al calcular tarifas de envío", + SHIPPING_METHOD_NOT_FOUND: "Método de envío no encontrado", + SHIPPING_METHOD_REMOVAL_FAILED: "Error al eliminar método de envío", + SHIPPING_ADDRESS_REQUIRED: "Se requiere dirección de envío", + INVENTORY_VALIDATION_ERROR: "Error de validación de inventario", + INSUFFICIENT_INVENTORY: "Inventario insuficiente", + INVALID_ORDER_STATUS: "Estado de pedido inválido", + TRANSACTION_CREATION_ERROR: "Error de creación de transacción", + TRANSACTION_PROCESSING_ERROR: "Error de procesamiento de transacción", + UNKNOWN_ERROR: "Error desconocido", + FULFILLMENT_CREATION_ERROR: "Error de creación de cumplimiento", + TAX_CALCULATION_ERROR: "Error de cálculo de impuestos", + ADDRESS_VERIFICATION_ERROR: "Error de verificación de dirección", + ADDRESS_MATCHES_ERROR: "Error de coincidencias de dirección", + SHIPPING_CONFLICT_ERROR: "Error de conflicto de envío", + SHIPPING_ERROR: "Error general de envío", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Error de cálculo de ajuste de precio", + ORDER_FETCH_ERROR: "Error al obtener pedido", + DRAFT_ORDER_UPDATE_ERROR: "Error al actualizar borrador de pedido", + DISCOUNT_APPLICATION_ERROR: "Error de aplicación de cupón", + DRAFT_ORDER_OPEN_ERROR: "Error al abrir borrador de pedido", + ORDER_UPDATE_ERROR: "Error al actualizar pedido", + CATALOG_FETCH_ERROR: "Error al obtener catálogo", + STORE_ID_NOT_FOUND: "ID de tienda no encontrado", + ORDER_NOT_DRAFT: "El pedido no está en estado de borrador", + NO_LINE_ITEMS: "No se encontraron artículos", + BAD_USER_INPUT: "Entrada de usuario inválida", + MISSING_SHIPPING_ADDRESS: "Se requiere dirección de envío", + MISSING_REQUIRED_FIELD: "Falta campo obligatorio", + CATALOG_API_ERROR: "Error de servicio de catálogo", + TAX_SERVICE_UNAVAILABLE: "Servicio de impuestos no disponible", + SHIPPING_SERVICE_UNAVAILABLE: "Servicio de envío no disponible", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Servicio de ajustes de precios no disponible", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Error al calcular ajustes de precios", + SERVICE_UNAVAILABLE: "Servicio temporalmente no disponible", + RATE_LIMITED: "Demasiadas solicitudes, por favor inténtelo más tarde", + TIMEOUT: "Tiempo de espera agotado", + INTERNAL_ERROR: "Error interno del servidor", + SHIPPING_POSTAL_CODE_REQUIRED: "Se requiere código postal de envío", + SHIPPING_COUNTRY_CODE_REQUIRED: "Se requiere código de país de envío", + SHIPPING_METHOD_REQUIRED: "Se requiere método de envío", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de envío", + BILLING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de facturación", + }, +}; diff --git a/packages/localizations/src/esUs.ts b/packages/localizations/src/esUs.ts new file mode 100644 index 00000000..783c8c4d --- /dev/null +++ b/packages/localizations/src/esUs.ts @@ -0,0 +1,323 @@ +export const esUs = { + general: { + optional: "opcional", + notes: "Notas", + quantity: "Cantidad", + free: "GRATIS", + closed: "Cerrado", + apply: "Aplicar", + checkoutDisabled: + "El checkout está deshabilitado temporalmente. Disculpe las molestias.", + }, + contact: { + title: "Contacto", + description: "", + email: "Email", + }, + pickup: { + title: "Recogida Local", + description: + "Haremos todo lo posible para cumplir con su hora de recogida esperada. Los horarios reales pueden variar.", + location: "Ubicación de Recogida", + date: "Fecha de Recogida", + time: "Hora Preferida de Recogida", + selectStore: "Seleccionar una tienda", + selectDate: "Seleccionar una fecha", + selectTime: "Seleccionar una hora de recogida", + storeHours: "Horarios de la Tienda", + seeDetails: "Ver detalles", + noTimeSlots: + "No hay horarios disponibles para la fecha seleccionada. Por favor seleccione otra fecha.", + hoursDisplayed: "Horarios mostrados en su zona horaria local.", + storeOperatesIn: "La tienda opera en la zona horaria {timezone}.", + asap: "Lo antes posible", + hour: "hora", + hours: "horas", + minutes: "minutos", + searchCountry: "Buscar país...", + noCountryFound: "País no encontrado.", + }, + days: { + sunday: "Domingo", + monday: "Lunes", + tuesday: "Martes", + wednesday: "Miércoles", + thursday: "Jueves", + friday: "Viernes", + saturday: "Sábado", + }, + delivery: { + title: "Entrega", + method: "Método de entrega", + shipping: "Envío", + shipToAddress: "Enviar a su dirección", + localPickup: "Recogida Local", + pickupFromStore: "Recoger en la tienda", + }, + tips: { + title: "Agregar propina", + noTip: "Sin Propina", + customAmount: "Cantidad Personalizada", + customTipAmount: "Cantidad de Propina Personalizada", + placeholder: "$0.00", + }, + shipping: { + title: "Envío", + description: "Dirección de envío", + method: "Método de envío", + noShippingMethodAddress: + "Ingrese su dirección para ver los métodos de envío disponibles.", + noShippingMethods: "No se encontraron métodos de envío.", + phone: "Número de Teléfono", + country: "País", + selectCountry: "Seleccionar país", + searchCountry: "Buscar país...", + noCountryFound: "País no encontrado", + firstName: "Nombre", + lastName: "Apellido", + address1: "Dirección", + address2: "Apartamento, suite, etc.", + city: "Ciudad", + region: "Estado/Provincia", + postalCode: "Código Postal", + notesPlaceholder: "Notas o instrucciones especiales", + addressSuggestion: "¿Quiso decir", + addressSuggestionEnd: "?", + noShippingOriginAddress: "No se proporcionó dirección de origen de envío.", + }, + billing: { + title: "Facturación", + description: "Descripción de facturación", + }, + payment: { + title: "Pago", + description: "Todos los pagos son seguros y encriptados.", + billingAddress: { + title: "Dirección de Facturación", + description: "Ingrese su dirección de facturación.", + useShippingAddress: + "Usar la dirección de envío como dirección de facturación", + }, + methods: { + creditCard: "Tarjeta de Crédito o Débito", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Pagos offline", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "No hay métodos de pago disponibles", + cardNumber: "Número de tarjeta", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Fecha de vencimiento (MM / AA)", + securityCode: "Código de seguridad", + cvvPlaceholder: "CVV", + nameOnCard: "Nombre en la tarjeta", + payNow: "Pagar ahora", + standardShipping: "Envío Estándar", + cardDetails: "Detalles de la tarjeta", + payWithApplePay: "Pagar con Apple Pay", + expirationDatePlaceholder: "MM / AA", + failedToInitializePayment: "Error al inicializar el pago.", + orderTotal: "Total del Pedido", + subtotal: "Subtotal", + tax: "Impuesto", + shipping: "Envío", + discount: "Cupón", + processingPayment: "Procesando pago...", + completingOrder: "Completando pedido...", + freePayment: "Completa tu pedido gratuito", + }, + phone: { + placeholder: "(201) 555-1234", + searchCountry: "Buscar país...", + noCountryFound: "País no encontrado.", + }, + discounts: { + placeholder: "Código de cupón", + enterCode: "Ingresar código de cupón", + apply: "Aplicar", + alreadyApplied: "Este código de cupón ya ha sido aplicado", + failedToApply: "Error al aplicar el código de cupón", + enterCodeValidation: "Por favor ingrese un código de cupón", + }, + totals: { + subtotal: "Subtotal", + discount: "Descuento", + shipping: "Envío", + tip: "Propina", + estimatedTaxes: "Impuestos estimados", + totalDue: "Total a Pagar", + orderSummary: "Resumen del Pedido", + itemCount: "artículos", + noItems: "Sin artículos", + }, + lineItems: { + note: "Nota:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Dirección", + suggestions: "Sugerencias", + }, + form: { + useFormFieldError: "useFormField debe usarse dentro de ", + }, + pagination: { + ariaLabel: "paginación", + previousPageAriaLabel: "Ir a la página anterior", + previous: "Anterior", + nextPageAriaLabel: "Ir a la página siguiente", + next: "Siguiente", + morePages: "Más páginas", + }, + sidebar: { + useSidebarError: "useSidebar debe usarse dentro de un SidebarProvider.", + toggleSidebar: "Alternar Sidebar", + }, + accessibility: { + payWithApplePay: "Pagar con Apple Pay", + applePayLogo: "Logo de Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Error al obtener el token de acceso", + invalidEnvironment: "Ambiente inválido", + noPublicAccessToken: "No se proporcionó token de acceso público", + noSessionToken: "No se proporcionó token de sesión o ID", + errorCreatingSession: "Error al crear sesión de checkout:", + orderIdRequired: "ID del pedido es requerido", + errorTrackingEvent: "Error al rastrear evento", + errorInTrackingSubscriber: "Error en el suscriptor de rastreo", + useTrackingProviderError: + "useTracking debe usarse dentro de un TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect debe usarse dentro de un PoyntCollectProvider", + useSquareProviderError: "useSquare debe usarse dentro de un SquareProvider", + errorProcessingPayment: "Error al procesar el pago", + stripeConfigMissing: + "La configuración de Stripe está faltando. Por favor verifique su configuración.", + paymentSuccessful: "Pago exitoso", + paymentFailed: "Pago falló", + paypalConfigMissing: + "La configuración de PayPal está faltando. Por favor verifique su configuración.", + stripeNotReady: "Stripe no está listo", + cardElementNotFound: "CardElement no encontrado", + errorProcessingCardPayment: "Error al procesar pago con tarjeta.", + errorProcessingExpressPayment: "Error al procesar pago express.", + failedToInitializePayment: "Error al inicializar el pago.", + invalidPhoneNumber: "número de teléfono inválido", + }, + validation: { + phoneRequired: "Número de teléfono es requerido", + emailRequired: "Ingrese un email", + emailInvalid: "Ingrese un email válido", + phoneTooLong: "Número de teléfono muy largo", + invalidShippingAddress: "Dirección de envío inválida", + invalidBillingAddress: "Dirección de facturación inválida", + selectPaymentMethod: "Seleccione un método de pago", + enterValidBillingPhone: + "Ingrese un número de teléfono de facturación válido", + enterValidShippingPhone: "Ingrese un número de teléfono de envío válido", + enterFirstName: "Ingrese un nombre", + enterLastName: "Ingrese un apellido", + enterAddress: "Ingrese una dirección", + enterCity: "Ingrese una ciudad", + enterZipCode: "Ingrese un ZIP code", + enterZipPostalCode: "Ingrese un ZIP / código postal", + selectState: "Seleccione un estado/provincia", + selectCountry: "Seleccione un país", + enterCountry: "Ingrese un país", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Error del servidor", + SESSION_NOT_FOUND: "Sesión no encontrada", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Error al recuperar sesión de checkout", + CHECKOUT_SESSION_NOT_FOUND: "Sesión de checkout no encontrada", + CHECKOUT_SESSION_FETCH_ERROR: "Error general al obtener sesión de checkout", + DRAFT_ORDER_NOT_FOUND: "Borrador de pedido no encontrado", + CHECKOUT_SESSION_CREATION_FAILED: "Error al crear sesión de checkout", + CREATED_SESSION_DATA_NOT_FOUND: "Datos de sesión creada no encontrados", + CHECKOUT_SESSION_CREATION_ERROR: + "Error general al crear sesión de checkout", + CHECKOUT_SESSION_UPDATE_FAILED: "Error al actualizar sesión de checkout", + UPDATED_SESSION_NOT_FOUND: "Sesión actualizada no encontrada", + CHECKOUT_SESSION_UPDATE_ERROR: + "Error general al actualizar sesión de checkout", + ORDER_API_NOT_FOUND: "Fuente de datos de Order API no encontrada", + DRAFT_ORDER_RETRIEVAL_FAILED: "Error al recuperar borrador de pedido", + DATA_SOURCES_NOT_FOUND: "Fuentes de datos no encontradas", + TRANSACTION_API_NOT_FOUND: + "Fuente de datos de Transaction API no encontrada", + TRANSACTION_PROCESSING_FAILED: "Error al procesar transacción", + TRANSACTION_CREATION_FAILED: "Error al encontrar o crear transacción", + ORDER_OPENING_FAILED: "Error al abrir pedido", + INVALID_FULFILLMENT_LOCATION: "Ubicación de cumplimiento inválida", + NO_VALID_PICKUP_LOCATION: "No hay ubicación de recogida válida disponible", + DRAFT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido", + LINE_ITEMS_FETCH_FAILED: "Error al obtener artículos de línea", + CURRENT_ORDER_FETCH_FAILED: "Error al obtener borrador de pedido actual", + DRAFT_ORDER_UPDATE_FAILED: "Error al actualizar borrador de pedido", + DISCOUNT_APPLICATION_FAILED: "Error al aplicar cupón", + CONTEXT_UNAVAILABLE: "Sesión o fuentes de datos no disponibles", + SHIPPING_LINES_UPDATE_FAILED: "Error al actualizar líneas de envío", + ORDER_TOTALS_UPDATE_FAILED: "Error al actualizar totales del pedido", + SHIPPING_METHOD_APPLICATION_FAILED: "Error al aplicar método de envío", + SKU_FETCH_FAILED: "Error al obtener SKUs", + SHIPPING_RATES_CALCULATION_FAILED: "Error al calcular tarifas de envío", + SHIPPING_METHOD_NOT_FOUND: "Método de envío no encontrado", + SHIPPING_METHOD_REMOVAL_FAILED: "Error al remover método de envío", + SHIPPING_ADDRESS_REQUIRED: "Dirección de envío requerida", + INVENTORY_VALIDATION_ERROR: "Error de validación de inventario", + INSUFFICIENT_INVENTORY: "Inventario insuficiente", + INVALID_ORDER_STATUS: "Estado de pedido inválido", + TRANSACTION_CREATION_ERROR: "Error de creación de transacción", + TRANSACTION_PROCESSING_ERROR: "Error de procesamiento de transacción", + UNKNOWN_ERROR: "Error desconocido", + FULFILLMENT_CREATION_ERROR: "Error de creación de cumplimiento", + TAX_CALCULATION_ERROR: "Error de cálculo de impuestos", + ADDRESS_VERIFICATION_ERROR: "Error de verificación de dirección", + ADDRESS_MATCHES_ERROR: "Error de coincidencias de dirección", + SHIPPING_CONFLICT_ERROR: "Error de conflicto de envío", + SHIPPING_ERROR: "Error general de envío", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Error de cálculo de ajuste de precio", + ORDER_FETCH_ERROR: "Error al obtener pedido", + DRAFT_ORDER_UPDATE_ERROR: "Error de actualización de borrador de pedido", + DISCOUNT_APPLICATION_ERROR: "Error de aplicación de cupón", + DRAFT_ORDER_OPEN_ERROR: "Error al abrir borrador de pedido", + ORDER_UPDATE_ERROR: "Error de actualización de pedido", + CATALOG_FETCH_ERROR: "Error al obtener catálogo", + STORE_ID_NOT_FOUND: "ID de tienda no encontrado", + ORDER_NOT_DRAFT: "El pedido no está en estado de borrador", + NO_LINE_ITEMS: "No se encontraron artículos", + BAD_USER_INPUT: "Entrada de usuario inválida", + MISSING_SHIPPING_ADDRESS: "Se requiere dirección de envío", + MISSING_REQUIRED_FIELD: "Falta campo obligatorio", + CATALOG_API_ERROR: "Error de servicio de catálogo", + TAX_SERVICE_UNAVAILABLE: "Servicio de impuestos no disponible", + SHIPPING_SERVICE_UNAVAILABLE: "Servicio de envío no disponible", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Servicio de ajustes de precios no disponible", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Error al calcular ajustes de precios", + SERVICE_UNAVAILABLE: "Servicio temporalmente no disponible", + RATE_LIMITED: "Demasiadas solicitudes, por favor inténtelo más tarde", + TIMEOUT: "Tiempo de espera agotado", + INTERNAL_ERROR: "Error interno del servidor", + SHIPPING_POSTAL_CODE_REQUIRED: "Se requiere código postal de envío", + SHIPPING_COUNTRY_CODE_REQUIRED: "Se requiere código de país de envío", + SHIPPING_METHOD_REQUIRED: "Se requiere método de envío", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de envío", + BILLING_ADDRESS_VERIFICATION_FAILED: + "Falló la verificación de dirección de facturación", + }, +}; diff --git a/packages/localizations/src/frCa.ts b/packages/localizations/src/frCa.ts new file mode 100644 index 00000000..b6dd6635 --- /dev/null +++ b/packages/localizations/src/frCa.ts @@ -0,0 +1,342 @@ +export const frCa = { + general: { + optional: "optionnel", + notes: "Notes", + quantity: "Quantité", + free: "GRATUIT", + closed: "Fermé", + apply: "Appliquer", + checkoutDisabled: + "Le checkout est présentement désactivé. Nous nous excusons pour l'inconvénient.", + }, + contact: { + title: "Contact", + description: "", + email: "Courriel", + }, + pickup: { + title: "Cueillette locale", + description: + "Tous les efforts seront déployés pour respecter votre heure de cueillette prévue. Les heures de cueillette réelles peuvent varier.", + location: "Lieu de cueillette", + date: "Date de cueillette", + time: "Heure de cueillette préférée", + selectStore: "Sélectionner un emplacement de magasin", + selectDate: "Sélectionner une date", + selectTime: "Sélectionner une heure de cueillette", + storeHours: "Heures d'ouverture", + seeDetails: "Voir les détails", + noTimeSlots: + "Aucune plage horaire disponible pour la date sélectionnée. Veuillez choisir une autre date.", + hoursDisplayed: "Heures affichées dans votre fuseau horaire local.", + storeOperatesIn: "Le magasin opère dans le fuseau horaire {timezone}.", + asap: "DÈS QUE POSSIBLE", + hour: "heure", + hours: "heures", + minutes: "minutes", + searchCountry: "Rechercher un pays...", + noCountryFound: "Aucun pays trouvé.", + }, + days: { + sunday: "Dimanche", + monday: "Lundi", + tuesday: "Mardi", + wednesday: "Mercredi", + thursday: "Jeudi", + friday: "Vendredi", + saturday: "Samedi", + }, + delivery: { + title: "Livraison", + method: "Méthode de livraison", + shipping: "Expédition", + shipToAddress: "Expédier à votre adresse", + localPickup: "Cueillette locale", + pickupFromStore: "Cueillir au magasin", + }, + tips: { + title: "Ajouter un pourboire", + noTip: "Aucun pourboire", + customAmount: "Montant personnalisé", + customTipAmount: "Montant de pourboire personnalisé", + placeholder: "0,00 $", + }, + shipping: { + title: "Expédition", + description: "Adresse d'expédition", + method: "Méthode d'expédition", + noShippingMethodAddress: + "Entrez votre adresse pour voir les méthodes d'expédition disponibles.", + noShippingMethods: "Aucune méthode d'expédition trouvée.", + phone: "Numéro de téléphone", + country: "Pays", + selectCountry: "Sélectionner un pays", + searchCountry: "Rechercher un pays...", + noCountryFound: "Aucun pays trouvé", + firstName: "Prénom", + lastName: "Nom de famille", + address1: "Adresse", + address2: "Appartement, suite, etc.", + city: "Ville", + region: "Province", + postalCode: "Code postal", + notesPlaceholder: "Notes ou instructions spéciales", + addressSuggestion: "Vouliez-vous dire", + addressSuggestionEnd: " ?", + noShippingOriginAddress: "Aucune adresse d'origine d'expédition fournie.", + }, + billing: { + title: "Facturation", + description: "Description de facturation", + }, + payment: { + title: "Paiement", + description: "Tous les paiements sont sécurisés et chiffrés.", + billingAddress: { + title: "Adresse de facturation", + description: "Entrez votre adresse de facturation.", + useShippingAddress: + "Utiliser l'adresse d'expédition comme adresse de facturation", + }, + methods: { + creditCard: "Carte de crédit ou de débit", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Paiements hors ligne", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "Aucune méthode de paiement disponible", + cardNumber: "Numéro de carte", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Date d'expiration (MM / AA)", + securityCode: "Code de sécurité", + cvvPlaceholder: "CVV", + nameOnCard: "Nom sur la carte", + payNow: "Payer maintenant", + standardShipping: "Expédition standard", + cardDetails: "Détails de la carte", + payWithApplePay: "Payer avec Apple Pay", + expirationDatePlaceholder: "MM / AA", + failedToInitializePayment: "Échec de l'initialisation du paiement.", + orderTotal: "Total de la commande", + subtotal: "Sous-total", + tax: "Taxe", + shipping: "Expédition", + discount: "Coupon", + processingPayment: "Traitement du paiement...", + completingOrder: "Finalisation de la commande...", + freePayment: "Terminez votre commande gratuite", + }, + phone: { + placeholder: "(514) 555-1234", + searchCountry: "Rechercher un pays...", + noCountryFound: "Aucun pays trouvé.", + }, + discounts: { + placeholder: "Code coupon", + enterCode: "Entrer le code coupon", + apply: "Appliquer", + alreadyApplied: "Ce code coupon a déjà été appliqué", + failedToApply: "Échec de l'application du code coupon", + enterCodeValidation: "Veuillez entrer un code coupon", + }, + totals: { + subtotal: "Sous-total", + discount: "Remise", + shipping: "Expédition", + tip: "Pourboire", + estimatedTaxes: "Taxes estimées", + totalDue: "Total à payer", + orderSummary: "Résumé de la commande", + itemCount: "articles", + noItems: "Aucun article", + }, + lineItems: { + note: "Note :", + }, + ui: { + autocomplete: { + addressPlaceholder: "Adresse", + suggestions: "Suggestions", + }, + form: { + useFormFieldError: "useFormField doit être utilisé dans ", + }, + pagination: { + ariaLabel: "pagination", + previousPageAriaLabel: "Aller à la page précédente", + previous: "Précédent", + nextPageAriaLabel: "Aller à la page suivante", + next: "Suivant", + morePages: "Plus de pages", + }, + sidebar: { + useSidebarError: "useSidebar doit être utilisé dans un SidebarProvider.", + toggleSidebar: "Basculer la barre latérale", + }, + accessibility: { + payWithApplePay: "Payer avec Apple Pay", + applePayLogo: "Logo Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Échec de l'obtention du jeton d'accès", + invalidEnvironment: "Environnement invalide", + noPublicAccessToken: "Aucun jeton d'accès public fourni", + noSessionToken: "Aucun jeton ou ID de session fourni", + errorCreatingSession: + "Erreur lors de la création de la session de checkout :", + orderIdRequired: "L'ID de commande est requis", + errorTrackingEvent: "Erreur lors du suivi d'événement", + errorInTrackingSubscriber: "Erreur dans l'abonné de suivi", + useTrackingProviderError: + "useTracking doit être utilisé dans un TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect doit être utilisé dans un PoyntCollectProvider", + useSquareProviderError: + "useSquare doit être utilisé dans un SquareProvider", + errorProcessingPayment: "Erreur lors du traitement du paiement", + stripeConfigMissing: + "La configuration Stripe est manquante. Veuillez vérifier votre installation.", + paymentSuccessful: "Paiement réussi", + paymentFailed: "Paiement échoué", + paypalConfigMissing: + "La configuration PayPal est manquante. Veuillez vérifier votre installation.", + stripeNotReady: "Stripe n'est pas prêt", + cardElementNotFound: "CardElement introuvable", + errorProcessingCardPayment: + "Erreur lors du traitement du paiement par carte.", + errorProcessingExpressPayment: + "Erreur lors du traitement du paiement express.", + failedToInitializePayment: "Échec de l'initialisation du paiement.", + invalidPhoneNumber: "numéro de téléphone invalide", + }, + validation: { + phoneRequired: "Le numéro de téléphone est requis", + emailRequired: "Entrez un courriel", + emailInvalid: "Entrez un courriel valide", + phoneTooLong: "Numéro de téléphone trop long", + invalidShippingAddress: "Adresse d'expédition invalide", + invalidBillingAddress: "Adresse de facturation invalide", + selectPaymentMethod: "Sélectionnez une méthode de paiement", + enterValidBillingPhone: + "Entrez un numéro de téléphone de facturation valide", + enterValidShippingPhone: + "Entrez un numéro de téléphone d'expédition valide", + enterFirstName: "Entrez un prénom", + enterLastName: "Entrez un nom de famille", + enterAddress: "Entrez une adresse", + enterCity: "Entrez une ville", + enterZipCode: "Entrez un code postal", + enterZipPostalCode: "Entrez un code postal", + selectState: "Sélectionnez une province/état", + selectCountry: "Sélectionnez un pays", + enterCountry: "Entrez un pays", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Erreur de serveur", + SESSION_NOT_FOUND: "Session introuvable", + CHECKOUT_SESSION_RETRIEVAL_FAILED: + "Échec de la récupération de la session de checkout", + CHECKOUT_SESSION_NOT_FOUND: "Session de checkout introuvable", + CHECKOUT_SESSION_FETCH_ERROR: + "Erreur générale de récupération de session de checkout", + DRAFT_ORDER_NOT_FOUND: "Brouillon de commande introuvable", + CHECKOUT_SESSION_CREATION_FAILED: + "Échec de la création de la session de checkout", + CREATED_SESSION_DATA_NOT_FOUND: "Données de session créée introuvables", + CHECKOUT_SESSION_CREATION_ERROR: + "Erreur générale de création de session de checkout", + CHECKOUT_SESSION_UPDATE_FAILED: + "Échec de la mise à jour de la session de checkout", + UPDATED_SESSION_NOT_FOUND: "Session mise à jour introuvable", + CHECKOUT_SESSION_UPDATE_ERROR: + "Erreur générale de mise à jour de session de checkout", + ORDER_API_NOT_FOUND: "Source de données API de commande introuvable", + DRAFT_ORDER_RETRIEVAL_FAILED: + "Échec de la récupération du brouillon de commande", + DATA_SOURCES_NOT_FOUND: "Sources de données introuvables", + TRANSACTION_API_NOT_FOUND: + "Source de données API de transaction introuvable", + TRANSACTION_PROCESSING_FAILED: "Échec du traitement de la transaction", + TRANSACTION_CREATION_FAILED: + "Échec de la recherche ou création de transaction", + ORDER_OPENING_FAILED: "Échec de l'ouverture de la commande", + INVALID_FULFILLMENT_LOCATION: "Lieu d'exécution invalide", + NO_VALID_PICKUP_LOCATION: "Aucun lieu de cueillette valide disponible", + DRAFT_ORDER_FETCH_FAILED: + "Échec de la récupération du brouillon de commande", + LINE_ITEMS_FETCH_FAILED: "Échec de la récupération des articles", + CURRENT_ORDER_FETCH_FAILED: + "Échec de la récupération du brouillon de commande actuel", + DRAFT_ORDER_UPDATE_FAILED: + "Échec de la mise à jour du brouillon de commande", + DISCOUNT_APPLICATION_FAILED: "Échec de l'application du coupon", + CONTEXT_UNAVAILABLE: "Session ou sources de données non disponibles", + SHIPPING_LINES_UPDATE_FAILED: + "Échec de la mise à jour des lignes d'expédition", + ORDER_TOTALS_UPDATE_FAILED: + "Échec de la mise à jour des totaux de commande", + SHIPPING_METHOD_APPLICATION_FAILED: + "Échec de l'application de la méthode d'expédition", + SKU_FETCH_FAILED: "Échec de la récupération des SKU", + SHIPPING_RATES_CALCULATION_FAILED: + "Échec du calcul des tarifs d'expédition", + SHIPPING_METHOD_NOT_FOUND: "Méthode d'expédition introuvable", + SHIPPING_METHOD_REMOVAL_FAILED: + "Échec de la suppression de la méthode d'expédition", + SHIPPING_ADDRESS_REQUIRED: "Adresse d'expédition requise", + INVENTORY_VALIDATION_ERROR: "Erreur de validation d'inventaire", + INSUFFICIENT_INVENTORY: "Inventaire insuffisant", + INVALID_ORDER_STATUS: "Statut de commande invalide", + TRANSACTION_CREATION_ERROR: "Erreur de création de transaction", + TRANSACTION_PROCESSING_ERROR: "Erreur de traitement de transaction", + UNKNOWN_ERROR: "Erreur inconnue", + FULFILLMENT_CREATION_ERROR: "Erreur de création d'exécution", + TAX_CALCULATION_ERROR: "Erreur de calcul de taxe", + ADDRESS_VERIFICATION_ERROR: "Erreur de vérification d'adresse", + ADDRESS_MATCHES_ERROR: "Erreur de correspondance d'adresse", + SHIPPING_CONFLICT_ERROR: "Erreur de conflit d'expédition", + SHIPPING_ERROR: "Erreur générale d'expédition", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Erreur de calcul d'ajustement de prix", + ORDER_FETCH_ERROR: "Erreur de récupération de commande", + DRAFT_ORDER_UPDATE_ERROR: "Erreur de mise à jour du brouillon de commande", + DISCOUNT_APPLICATION_ERROR: "Erreur d'application de coupon", + DRAFT_ORDER_OPEN_ERROR: "Erreur d'ouverture du brouillon de commande", + ORDER_UPDATE_ERROR: "Erreur de mise à jour de commande", + CATALOG_FETCH_ERROR: "Erreur de récupération de catalogue", + STORE_ID_NOT_FOUND: "ID de magasin non trouvé", + ORDER_NOT_DRAFT: "La commande n'est pas en statut de brouillon", + NO_LINE_ITEMS: "Aucun article trouvé", + BAD_USER_INPUT: "Saisie utilisateur invalide", + MISSING_SHIPPING_ADDRESS: "Adresse d'expédition requise", + MISSING_REQUIRED_FIELD: "Champ obligatoire manquant", + CATALOG_API_ERROR: "Erreur du service de catalogue", + TAX_SERVICE_UNAVAILABLE: "Service de taxes indisponible", + SHIPPING_SERVICE_UNAVAILABLE: "Service d'expédition indisponible", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Service d'ajustements de prix indisponible", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Échec du calcul des ajustements de prix", + SERVICE_UNAVAILABLE: "Service temporairement indisponible", + RATE_LIMITED: "Trop de demandes, veuillez réessayer plus tard", + TIMEOUT: "Délai d'attente dépassé", + INTERNAL_ERROR: "Erreur interne du serveur", + SHIPPING_POSTAL_CODE_REQUIRED: "Le code postal d'expédition est requis", + SHIPPING_COUNTRY_CODE_REQUIRED: "Le code de pays d'expédition est requis", + SHIPPING_METHOD_REQUIRED: "La méthode d'expédition est requise", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "La vérification de l'adresse d'expédition a échoué", + BILLING_ADDRESS_VERIFICATION_FAILED: + "La vérification de l'adresse de facturation a échoué", + }, +}; diff --git a/packages/localizations/src/frFr.ts b/packages/localizations/src/frFr.ts new file mode 100644 index 00000000..a3ea24ae --- /dev/null +++ b/packages/localizations/src/frFr.ts @@ -0,0 +1,345 @@ +export const frFr = { + general: { + optional: "optionnel", + notes: "Notes", + quantity: "Quantité", + free: "GRATUIT", + closed: "Fermé", + apply: "Appliquer", + checkoutDisabled: + "Le paiement est actuellement désactivé. Nous nous excusons pour la gêne occasionnée.", + }, + contact: { + title: "Contact", + description: "", + email: "Email", + }, + pickup: { + title: "Retrait en magasin", + description: + "Tous les efforts seront faits pour respecter votre heure de retrait prévue. Les heures de retrait réelles peuvent varier.", + location: "Lieu de retrait", + date: "Date de retrait", + time: "Heure de retrait préférée", + selectStore: "Sélectionner un magasin", + selectDate: "Sélectionner une date", + selectTime: "Sélectionner une heure de retrait", + storeHours: "Heures d'ouverture", + seeDetails: "Voir les détails", + noTimeSlots: + "Aucun créneau horaire disponible pour la date sélectionnée. Veuillez sélectionner une autre date.", + hoursDisplayed: "Heures affichées dans votre fuseau horaire local.", + storeOperatesIn: "Le magasin fonctionne dans le fuseau horaire {timezone}.", + asap: "ASAP", + hour: "heure", + hours: "heures", + minutes: "minutes", + searchCountry: "Rechercher un pays...", + noCountryFound: "Aucun pays trouvé.", + }, + days: { + sunday: "Dimanche", + monday: "Lundi", + tuesday: "Mardi", + wednesday: "Mercredi", + thursday: "Jeudi", + friday: "Vendredi", + saturday: "Samedi", + }, + delivery: { + title: "Livraison", + method: "Méthode de livraison", + shipping: "Expédition", + shipToAddress: "Livrer à votre adresse", + localPickup: "Retrait en magasin", + pickupFromStore: "Retirer en magasin", + }, + tips: { + title: "Ajouter un pourboire", + noTip: "Aucun pourboire", + customAmount: "Montant personnalisé", + customTipAmount: "Montant du pourboire personnalisé", + placeholder: "0,00 €", + }, + shipping: { + title: "Expédition", + description: "Adresse de livraison", + method: "Méthode d'expédition", + noShippingMethodAddress: + "Entrez votre adresse pour voir les méthodes de livraison disponibles.", + noShippingMethods: "Aucune méthode d'expédition trouvée.", + phone: "Numéro de téléphone", + country: "Pays", + selectCountry: "Sélectionner un pays", + searchCountry: "Rechercher un pays...", + noCountryFound: "Aucun pays trouvé", + firstName: "Prénom", + lastName: "Nom de famille", + address1: "Adresse", + address2: "Appartement, suite, etc.", + city: "Ville", + region: "État/Province", + postalCode: "Code postal", + notesPlaceholder: "Notes ou instructions spéciales", + addressSuggestion: "Vouliez-vous dire", + addressSuggestionEnd: " ?", + noShippingOriginAddress: "Aucune adresse d'origine d'expédition fournie.", + }, + billing: { + title: "Facturation", + description: "Description de la facturation", + }, + payment: { + title: "Paiement", + description: "Tous les paiements sont sécurisés et chiffrés.", + billingAddress: { + title: "Adresse de facturation", + description: "Entrez votre adresse de facturation.", + useShippingAddress: + "Utiliser l'adresse de livraison comme adresse de facturation", + }, + methods: { + creditCard: "Carte de crédit ou de débit", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Paiements hors ligne", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "Aucune méthode de paiement disponible", + cardNumber: "Numéro de carte", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Date d'expiration (MM / AA)", + securityCode: "Code de sécurité", + cvvPlaceholder: "CVV", + nameOnCard: "Nom sur la carte", + payNow: "Payer maintenant", + standardShipping: "Livraison standard", + cardDetails: "Détails de la carte", + payWithApplePay: "Payer avec Apple Pay", + expirationDatePlaceholder: "MM / AA", + failedToInitializePayment: "Échec de l'initialisation du paiement.", + orderTotal: "Total de la commande", + subtotal: "Sous-total", + tax: "Taxe", + shipping: "Expédition", + discount: "Coupon", + processingPayment: "Traitement du paiement...", + completingOrder: "Finalisation de la commande...", + freePayment: "Terminez votre commande gratuite", + }, + phone: { + placeholder: "01 23 45 67 89", + searchCountry: "Rechercher un pays...", + noCountryFound: "Aucun pays trouvé.", + }, + discounts: { + placeholder: "Code coupon", + enterCode: "Entrer le code coupon", + apply: "Appliquer", + alreadyApplied: "Ce code coupon a déjà été appliqué", + failedToApply: "Échec de l'application du code coupon", + enterCodeValidation: "Veuillez entrer un code coupon", + }, + totals: { + subtotal: "Sous-total", + discount: "Remise", + shipping: "Expédition", + tip: "Pourboire", + estimatedTaxes: "Taxes estimées", + totalDue: "Total à payer", + orderSummary: "Récapitulatif de la commande", + itemCount: "articles", + noItems: "Aucun article", + }, + lineItems: { + note: "Note :", + }, + ui: { + autocomplete: { + addressPlaceholder: "Adresse", + suggestions: "Suggestions", + }, + form: { + useFormFieldError: "useFormField doit être utilisé dans ", + }, + pagination: { + ariaLabel: "pagination", + previousPageAriaLabel: "Aller à la page précédente", + previous: "Précédent", + nextPageAriaLabel: "Aller à la page suivante", + next: "Suivant", + morePages: "Plus de pages", + }, + sidebar: { + useSidebarError: "useSidebar doit être utilisé dans un SidebarProvider.", + toggleSidebar: "Basculer la barre latérale", + }, + accessibility: { + payWithApplePay: "Payer avec Apple Pay", + applePayLogo: "Logo Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Échec de l'obtention du jeton d'accès", + invalidEnvironment: "Environnement invalide", + noPublicAccessToken: "Aucun jeton d'accès public fourni", + noSessionToken: "Aucun jeton de session ou ID fourni", + errorCreatingSession: + "Erreur lors de la création de la session de commande :", + orderIdRequired: "L'ID de commande est requis", + errorTrackingEvent: "Erreur lors du suivi de l'événement", + errorInTrackingSubscriber: "Erreur dans l'abonné de suivi", + useTrackingProviderError: + "useTracking doit être utilisé dans un TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect doit être utilisé dans un PoyntCollectProvider", + useSquareProviderError: + "useSquare doit être utilisé dans un SquareProvider", + errorProcessingPayment: "Erreur lors du traitement du paiement", + stripeConfigMissing: + "La configuration Stripe est manquante. Veuillez vérifier votre configuration.", + paymentSuccessful: "Paiement réussi", + paymentFailed: "Échec du paiement", + paypalConfigMissing: + "La configuration PayPal est manquante. Veuillez vérifier votre configuration.", + stripeNotReady: "Stripe n'est pas prêt", + cardElementNotFound: "Élément de carte non trouvé", + errorProcessingCardPayment: + "Erreur lors du traitement du paiement par carte.", + errorProcessingExpressPayment: + "Erreur lors du traitement du paiement express.", + failedToInitializePayment: "Échec de l'initialisation du paiement.", + invalidPhoneNumber: "numéro de téléphone invalide", + }, + validation: { + phoneRequired: "Le numéro de téléphone est requis", + emailRequired: "Entrez un email", + emailInvalid: "Entrez un email valide", + phoneTooLong: "Numéro de téléphone trop long", + invalidShippingAddress: "Adresse de livraison invalide", + invalidBillingAddress: "Adresse de facturation invalide", + selectPaymentMethod: "Sélectionnez une méthode de paiement", + enterValidBillingPhone: + "Entrez un numéro de téléphone de facturation valide", + enterValidShippingPhone: + "Entrez un numéro de téléphone de livraison valide", + enterFirstName: "Entrez un prénom", + enterLastName: "Entrez un nom de famille", + enterAddress: "Entrez une adresse", + enterCity: "Entrez une ville", + enterZipCode: "Entrez un code postal", + enterZipPostalCode: "Entrez un code ZIP / postal", + selectState: "Sélectionnez un état/province", + selectCountry: "Sélectionnez un pays", + enterCountry: "Entrez un pays", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Erreur du serveur", + SESSION_NOT_FOUND: "Session non trouvée", + CHECKOUT_SESSION_RETRIEVAL_FAILED: + "Échec de la récupération de la session de paiement", + CHECKOUT_SESSION_NOT_FOUND: "Session de paiement non trouvée", + CHECKOUT_SESSION_FETCH_ERROR: + "Erreur générale lors de la récupération de la session de paiement", + DRAFT_ORDER_NOT_FOUND: "Brouillon de commande non trouvé", + CHECKOUT_SESSION_CREATION_FAILED: + "Échec de la création de la session de paiement", + CREATED_SESSION_DATA_NOT_FOUND: "Données de session créées non trouvées", + CHECKOUT_SESSION_CREATION_ERROR: + "Erreur générale lors de la création de la session de paiement", + CHECKOUT_SESSION_UPDATE_FAILED: + "Échec de la mise à jour de la session de paiement", + UPDATED_SESSION_NOT_FOUND: "Session mise à jour non trouvée", + CHECKOUT_SESSION_UPDATE_ERROR: + "Erreur générale lors de la mise à jour de la session de paiement", + ORDER_API_NOT_FOUND: "Source de données de l'API de commande non trouvée", + DRAFT_ORDER_RETRIEVAL_FAILED: + "Échec de la récupération du brouillon de commande", + DATA_SOURCES_NOT_FOUND: "Sources de données non trouvées", + TRANSACTION_API_NOT_FOUND: + "Source de données de l'API de transaction non trouvée", + TRANSACTION_PROCESSING_FAILED: "Échec du traitement de la transaction", + TRANSACTION_CREATION_FAILED: + "Échec de la recherche ou de la création de la transaction", + ORDER_OPENING_FAILED: "Échec de l'ouverture de la commande", + INVALID_FULFILLMENT_LOCATION: "Lieu d'exécution invalide", + NO_VALID_PICKUP_LOCATION: "Aucun lieu de retrait valide disponible", + DRAFT_ORDER_FETCH_FAILED: + "Échec de la récupération du brouillon de commande", + LINE_ITEMS_FETCH_FAILED: "Échec de la récupération des articles", + CURRENT_ORDER_FETCH_FAILED: + "Échec de la récupération du brouillon de commande actuel", + DRAFT_ORDER_UPDATE_FAILED: + "Échec de la mise à jour du brouillon de commande", + DISCOUNT_APPLICATION_FAILED: "Échec de l'application du coupon", + CONTEXT_UNAVAILABLE: "Session ou sources de données non disponibles", + SHIPPING_LINES_UPDATE_FAILED: + "Échec de la mise à jour des lignes d'expédition", + ORDER_TOTALS_UPDATE_FAILED: + "Échec de la mise à jour des totaux de la commande", + SHIPPING_METHOD_APPLICATION_FAILED: + "Échec de l'application de la méthode d'expédition", + SKU_FETCH_FAILED: "Échec de la récupération des SKU", + SHIPPING_RATES_CALCULATION_FAILED: + "Échec du calcul des tarifs d'expédition", + SHIPPING_METHOD_NOT_FOUND: "Méthode d'expédition non trouvée", + SHIPPING_METHOD_REMOVAL_FAILED: + "Échec de la suppression de la méthode d'expédition", + SHIPPING_ADDRESS_REQUIRED: "Adresse de livraison requise", + INVENTORY_VALIDATION_ERROR: "Erreur de validation des stocks", + INSUFFICIENT_INVENTORY: "Stock insuffisant", + INVALID_ORDER_STATUS: "Statut de commande invalide", + TRANSACTION_CREATION_ERROR: "Erreur lors de la création de la transaction", + TRANSACTION_PROCESSING_ERROR: "Erreur lors du traitement de la transaction", + UNKNOWN_ERROR: "Erreur inconnue", + FULFILLMENT_CREATION_ERROR: "Erreur lors de la création de l'exécution", + TAX_CALCULATION_ERROR: "Erreur lors du calcul des taxes", + ADDRESS_VERIFICATION_ERROR: "Erreur de vérification de l'adresse", + ADDRESS_MATCHES_ERROR: "Erreur de correspondance d'adresse", + SHIPPING_CONFLICT_ERROR: "Conflit d'expédition", + SHIPPING_ERROR: "Erreur générale d'expédition", + PRICE_ADJUSTMENT_CALCULATION_ERROR: + "Erreur lors du calcul de l'ajustement de prix", + ORDER_FETCH_ERROR: "Erreur lors de la récupération de la commande", + DRAFT_ORDER_UPDATE_ERROR: + "Erreur lors de la mise à jour du brouillon de commande", + DISCOUNT_APPLICATION_ERROR: "Erreur lors de l'application du coupon", + DRAFT_ORDER_OPEN_ERROR: + "Erreur lors de l'ouverture du brouillon de commande", + ORDER_UPDATE_ERROR: "Erreur lors de la mise à jour de la commande", + CATALOG_FETCH_ERROR: "Erreur lors de la récupération du catalogue", + STORE_ID_NOT_FOUND: "ID de magasin introuvable", + ORDER_NOT_DRAFT: "La commande n'est pas en statut brouillon", + NO_LINE_ITEMS: "Aucun article trouvé", + BAD_USER_INPUT: "Saisie utilisateur invalide", + MISSING_SHIPPING_ADDRESS: "Adresse de livraison requise", + MISSING_REQUIRED_FIELD: "Champ requis manquant", + CATALOG_API_ERROR: "Erreur du service catalogue", + TAX_SERVICE_UNAVAILABLE: "Service de taxes indisponible", + SHIPPING_SERVICE_UNAVAILABLE: "Service de livraison indisponible", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Service d'ajustements de prix indisponible", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Échec du calcul des ajustements de prix", + SERVICE_UNAVAILABLE: "Service temporairement indisponible", + RATE_LIMITED: "Trop de requêtes, veuillez réessayer plus tard", + TIMEOUT: "Délai d'attente dépassé", + INTERNAL_ERROR: "Erreur interne du serveur", + SHIPPING_POSTAL_CODE_REQUIRED: "Le code postal d'expédition est requis", + SHIPPING_COUNTRY_CODE_REQUIRED: "Le code de pays d'expédition est requis", + SHIPPING_METHOD_REQUIRED: "La méthode d'expédition est requise", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "La vérification de l'adresse d'expédition a échoué", + BILLING_ADDRESS_VERIFICATION_FAILED: + "La vérification de l'adresse de facturation a échoué", + }, +}; diff --git a/packages/localizations/src/idId.ts b/packages/localizations/src/idId.ts new file mode 100644 index 00000000..07297661 --- /dev/null +++ b/packages/localizations/src/idId.ts @@ -0,0 +1,316 @@ +export const idId = { + general: { + optional: "opsional", + notes: "Catatan", + quantity: "Kuantitas", + free: "GRATIS", + closed: "Tutup", + apply: "Terapkan", + checkoutDisabled: + "Checkout saat ini dinonaktifkan. Kami mohon maaf atas ketidaknyamanannya.", + }, + contact: { + title: "Kontak", + description: "", + email: "Email", + }, + pickup: { + title: "Ambil di Toko", + description: + "Segala upaya akan dilakukan untuk memenuhi waktu pengambilan yang Anda harapkan. Waktu pengambilan aktual dapat bervariasi.", + location: "Lokasi Pengambilan", + date: "Tanggal Pengambilan", + time: "Waktu Pengambilan Pilihan", + selectStore: "Pilih lokasi toko", + selectDate: "Pilih tanggal", + selectTime: "Pilih waktu pengambilan", + storeHours: "Jam Toko", + seeDetails: "Lihat detail", + noTimeSlots: + "Tidak ada slot waktu tersedia untuk tanggal yang dipilih. Silakan pilih tanggal lain.", + hoursDisplayed: "Jam ditampilkan dalam zona waktu lokal Anda.", + storeOperatesIn: "Toko beroperasi dalam zona waktu {timezone}.", + asap: "SESEGERA MUNGKIN", + hour: "jam", + hours: "jam", + minutes: "menit", + searchCountry: "Cari negara...", + noCountryFound: "Negara tidak ditemukan.", + }, + days: { + sunday: "Minggu", + monday: "Senin", + tuesday: "Selasa", + wednesday: "Rabu", + thursday: "Kamis", + friday: "Jumat", + saturday: "Sabtu", + }, + delivery: { + title: "Pengiriman", + method: "Metode pengiriman", + shipping: "Pengiriman", + shipToAddress: "Kirim ke alamat Anda", + localPickup: "Ambil di Toko", + pickupFromStore: "Ambil dari lokasi toko", + }, + tips: { + title: "Tambahkan tip", + noTip: "Tanpa Tip", + customAmount: "Jumlah Kustom", + customTipAmount: "Jumlah Tip Kustom", + placeholder: "Rp0", + }, + shipping: { + title: "Pengiriman", + description: "Alamat pengiriman", + method: "Metode pengiriman", + noShippingMethodAddress: + "Masukkan alamat Anda untuk melihat metode pengiriman yang tersedia.", + noShippingMethods: "Tidak ada metode pengiriman ditemukan.", + phone: "Nomor Telepon", + country: "Negara", + selectCountry: "Pilih negara", + searchCountry: "Cari negara...", + noCountryFound: "Negara tidak ditemukan", + firstName: "Nama Depan", + lastName: "Nama Belakang", + address1: "Alamat", + address2: "Apartemen, suite, dll.", + city: "Kota", + region: "Provinsi", + postalCode: "Kode Pos", + notesPlaceholder: "Catatan atau instruksi khusus", + addressSuggestion: "Apakah maksud Anda", + addressSuggestionEnd: "?", + noShippingOriginAddress: "Alamat asal pengiriman tidak disediakan.", + }, + billing: { + title: "Penagihan", + description: "Deskripsi penagihan", + }, + payment: { + title: "Pembayaran", + description: "Semua pembayaran aman dan terenkripsi.", + billingAddress: { + title: "Alamat Penagihan", + description: "Masukkan alamat penagihan Anda.", + useShippingAddress: "Gunakan alamat pengiriman sebagai alamat penagihan", + }, + methods: { + creditCard: "Kartu Kredit atau Debit", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Pembayaran offline", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "Tidak ada metode pembayaran tersedia", + cardNumber: "Nomor kartu", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Tanggal kedaluwarsa (BB / TT)", + securityCode: "Kode keamanan", + cvvPlaceholder: "CVV", + nameOnCard: "Nama di kartu", + payNow: "Bayar sekarang", + standardShipping: "Pengiriman Standar", + cardDetails: "Detail kartu", + payWithApplePay: "Bayar dengan Apple Pay", + expirationDatePlaceholder: "BB / TT", + failedToInitializePayment: "Gagal menginisialisasi pembayaran.", + orderTotal: "Total Pesanan", + subtotal: "Subtotal", + tax: "Pajak", + shipping: "Pengiriman", + discount: "Kupon", + processingPayment: "Memproses pembayaran...", + completingOrder: "Menyelesaikan pesanan...", + freePayment: "Selesaikan pesanan gratis Anda", + }, + phone: { + placeholder: "(021) 123-4567", + searchCountry: "Cari negara...", + noCountryFound: "Negara tidak ditemukan.", + }, + discounts: { + placeholder: "Kode kupon", + enterCode: "Masukkan kode kupon", + apply: "Terapkan", + alreadyApplied: "Kode kupon ini sudah diterapkan", + failedToApply: "Gagal menerapkan kode kupon", + enterCodeValidation: "Silakan masukkan kode kupon", + }, + totals: { + subtotal: "Subtotal", + discount: "Diskon", + shipping: "Pengiriman", + tip: "Tip", + estimatedTaxes: "Perkiraan pajak", + totalDue: "Total Pembayaran", + orderSummary: "Ringkasan Pesanan", + itemCount: "item", + noItems: "Tidak ada item", + }, + lineItems: { + note: "Catatan:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Alamat", + suggestions: "Saran", + }, + form: { + useFormFieldError: "useFormField harus digunakan dalam ", + }, + pagination: { + ariaLabel: "paginasi", + previousPageAriaLabel: "Ke halaman sebelumnya", + previous: "Sebelumnya", + nextPageAriaLabel: "Ke halaman berikutnya", + next: "Berikutnya", + morePages: "Halaman lainnya", + }, + sidebar: { + useSidebarError: "useSidebar harus digunakan dalam SidebarProvider.", + toggleSidebar: "Toggle Sidebar", + }, + accessibility: { + payWithApplePay: "Bayar dengan Apple Pay", + applePayLogo: "Logo Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Gagal mendapatkan token akses", + invalidEnvironment: "Lingkungan tidak valid", + noPublicAccessToken: "Token akses publik tidak disediakan", + noSessionToken: "Token sesi atau ID tidak disediakan", + errorCreatingSession: "Error membuat sesi checkout:", + orderIdRequired: "ID pesanan diperlukan", + errorTrackingEvent: "Error melacak event", + errorInTrackingSubscriber: "Error dalam tracking subscriber", + useTrackingProviderError: + "useTracking harus digunakan dalam TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect harus digunakan dalam PoyntCollectProvider", + useSquareProviderError: "useSquare harus digunakan dalam SquareProvider", + errorProcessingPayment: "Error memproses pembayaran", + stripeConfigMissing: + "Konfigurasi Stripe tidak ada. Silakan periksa pengaturan Anda.", + paymentSuccessful: "Pembayaran berhasil", + paymentFailed: "Pembayaran gagal", + paypalConfigMissing: + "Konfigurasi PayPal tidak ada. Silakan periksa pengaturan Anda.", + stripeNotReady: "Stripe tidak siap", + cardElementNotFound: "CardElement tidak ditemukan", + errorProcessingCardPayment: "Error memproses pembayaran kartu.", + errorProcessingExpressPayment: "Error memproses pembayaran express.", + failedToInitializePayment: "Gagal menginisialisasi pembayaran.", + invalidPhoneNumber: "nomor telepon tidak valid", + }, + validation: { + phoneRequired: "Nomor telepon diperlukan", + emailRequired: "Masukkan email", + emailInvalid: "Masukkan email yang valid", + phoneTooLong: "Nomor telepon terlalu panjang", + invalidShippingAddress: "Alamat pengiriman tidak valid", + invalidBillingAddress: "Alamat penagihan tidak valid", + selectPaymentMethod: "Pilih metode pembayaran", + enterValidBillingPhone: "Masukkan nomor telepon penagihan yang valid", + enterValidShippingPhone: "Masukkan nomor telepon pengiriman yang valid", + enterFirstName: "Masukkan nama depan", + enterLastName: "Masukkan nama belakang", + enterAddress: "Masukkan alamat", + enterCity: "Masukkan kota", + enterZipCode: "Masukkan kode pos", + enterZipPostalCode: "Masukkan kode pos", + selectState: "Pilih provinsi", + selectCountry: "Pilih negara", + enterCountry: "Masukkan negara", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Error server", + SESSION_NOT_FOUND: "Sesi tidak ditemukan", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Gagal mengambil sesi checkout", + CHECKOUT_SESSION_NOT_FOUND: "Sesi checkout tidak ditemukan", + CHECKOUT_SESSION_FETCH_ERROR: "Error umum mengambil sesi checkout", + DRAFT_ORDER_NOT_FOUND: "Draft pesanan tidak ditemukan", + CHECKOUT_SESSION_CREATION_FAILED: "Gagal membuat sesi checkout", + CREATED_SESSION_DATA_NOT_FOUND: "Data sesi yang dibuat tidak ditemukan", + CHECKOUT_SESSION_CREATION_ERROR: "Error umum pembuatan sesi checkout", + CHECKOUT_SESSION_UPDATE_FAILED: "Gagal memperbarui sesi checkout", + UPDATED_SESSION_NOT_FOUND: "Sesi yang diperbarui tidak ditemukan", + CHECKOUT_SESSION_UPDATE_ERROR: "Error umum pembaruan sesi checkout", + ORDER_API_NOT_FOUND: "Sumber data API pesanan tidak ditemukan", + DRAFT_ORDER_RETRIEVAL_FAILED: "Gagal mengambil draft pesanan", + DATA_SOURCES_NOT_FOUND: "Sumber data tidak ditemukan", + TRANSACTION_API_NOT_FOUND: "Sumber data API transaksi tidak ditemukan", + TRANSACTION_PROCESSING_FAILED: "Gagal memproses transaksi", + TRANSACTION_CREATION_FAILED: "Gagal menemukan atau membuat transaksi", + ORDER_OPENING_FAILED: "Gagal membuka pesanan", + INVALID_FULFILLMENT_LOCATION: "Lokasi pemenuhan tidak valid", + NO_VALID_PICKUP_LOCATION: + "Tidak ada lokasi pengambilan yang valid tersedia", + DRAFT_ORDER_FETCH_FAILED: "Gagal mengambil draft pesanan", + LINE_ITEMS_FETCH_FAILED: "Gagal mengambil item pesanan", + CURRENT_ORDER_FETCH_FAILED: "Gagal mengambil draft pesanan saat ini", + DRAFT_ORDER_UPDATE_FAILED: "Gagal memperbarui draft pesanan", + DISCOUNT_APPLICATION_FAILED: "Gagal menerapkan kupon", + CONTEXT_UNAVAILABLE: "Sesi atau sumber data tidak tersedia", + SHIPPING_LINES_UPDATE_FAILED: "Gagal memperbarui jalur pengiriman", + ORDER_TOTALS_UPDATE_FAILED: "Gagal memperbarui total pesanan", + SHIPPING_METHOD_APPLICATION_FAILED: "Gagal menerapkan metode pengiriman", + SKU_FETCH_FAILED: "Gagal mengambil SKU", + SHIPPING_RATES_CALCULATION_FAILED: "Gagal menghitung tarif pengiriman", + SHIPPING_METHOD_NOT_FOUND: "Metode pengiriman tidak ditemukan", + SHIPPING_METHOD_REMOVAL_FAILED: "Gagal menghapus metode pengiriman", + SHIPPING_ADDRESS_REQUIRED: "Alamat pengiriman diperlukan", + INVENTORY_VALIDATION_ERROR: "Error validasi inventori", + INSUFFICIENT_INVENTORY: "Inventori tidak mencukupi", + INVALID_ORDER_STATUS: "Status pesanan tidak valid", + TRANSACTION_CREATION_ERROR: "Error pembuatan transaksi", + TRANSACTION_PROCESSING_ERROR: "Error pemrosesan transaksi", + UNKNOWN_ERROR: "Error tidak diketahui", + FULFILLMENT_CREATION_ERROR: "Error pembuatan pemenuhan", + TAX_CALCULATION_ERROR: "Error perhitungan pajak", + ADDRESS_VERIFICATION_ERROR: "Error verifikasi alamat", + ADDRESS_MATCHES_ERROR: "Error pencocokan alamat", + SHIPPING_CONFLICT_ERROR: "Error konflik pengiriman", + SHIPPING_ERROR: "Error pengiriman umum", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Error perhitungan penyesuaian harga", + ORDER_FETCH_ERROR: "Error mengambil pesanan", + DRAFT_ORDER_UPDATE_ERROR: "Error pembaruan draft pesanan", + DISCOUNT_APPLICATION_ERROR: "Error penerapan kupon", + DRAFT_ORDER_OPEN_ERROR: "Error membuka draft pesanan", + ORDER_UPDATE_ERROR: "Error pembaruan pesanan", + CATALOG_FETCH_ERROR: "Error mengambil katalog", + STORE_ID_NOT_FOUND: "ID toko tidak ditemukan", + ORDER_NOT_DRAFT: "Pesanan tidak dalam status draft", + NO_LINE_ITEMS: "Tidak ada item yang ditemukan", + BAD_USER_INPUT: "Input pengguna tidak valid", + MISSING_SHIPPING_ADDRESS: "Alamat pengiriman diperlukan", + MISSING_REQUIRED_FIELD: "Field wajib tidak ada", + CATALOG_API_ERROR: "Error layanan katalog", + TAX_SERVICE_UNAVAILABLE: "Layanan pajak tidak tersedia", + SHIPPING_SERVICE_UNAVAILABLE: "Layanan pengiriman tidak tersedia", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Layanan penyesuaian harga tidak tersedia", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: "Gagal menghitung penyesuaian harga", + SERVICE_UNAVAILABLE: "Layanan sementara tidak tersedia", + RATE_LIMITED: "Terlalu banyak permintaan, silakan coba lagi nanti", + TIMEOUT: "Waktu permintaan habis", + INTERNAL_ERROR: "Error internal server", + SHIPPING_POSTAL_CODE_REQUIRED: "Kode pos pengiriman diperlukan", + SHIPPING_COUNTRY_CODE_REQUIRED: "Kode negara pengiriman diperlukan", + SHIPPING_METHOD_REQUIRED: "Metode pengiriman diperlukan", + SHIPPING_ADDRESS_VERIFICATION_FAILED: "Verifikasi alamat pengiriman gagal", + BILLING_ADDRESS_VERIFICATION_FAILED: "Verifikasi alamat penagihan gagal", + }, +}; diff --git a/packages/localizations/src/index.ts b/packages/localizations/src/index.ts new file mode 100644 index 00000000..92eed3ba --- /dev/null +++ b/packages/localizations/src/index.ts @@ -0,0 +1,20 @@ +export { deDe } from "./deDe"; +export { enIe } from "./enIe"; +export { enUs } from "./enUs"; +export { esAr } from "./esAr"; +export { esCl } from "./esCl"; +export { esCo } from "./esCo"; +export { esEs } from "./esEs"; +export { esMx } from "./esMx"; +export { esPe } from "./esPe"; +export { esUs } from "./esUs"; +export { frCa } from "./frCa"; +export { frFr } from "./frFr"; +export { idId } from "./idId"; +export { itIt } from "./itIt"; +export { ptBr } from "./ptBr"; +export { qaPs } from "./qaPs"; +export { trTr } from "./trTr"; +export { viVn } from "./viVn"; +export { zhCn } from "./zhCn"; +export { zhSg } from "./zhSg"; diff --git a/packages/localizations/src/itIt.ts b/packages/localizations/src/itIt.ts new file mode 100644 index 00000000..155bc82c --- /dev/null +++ b/packages/localizations/src/itIt.ts @@ -0,0 +1,340 @@ +export const itIt = { + general: { + optional: "opzionale", + notes: "Note", + quantity: "Quantità", + free: "GRATUITO", + closed: "Chiuso", + apply: "Applica", + checkoutDisabled: + "Il checkout è attualmente disabilitato. Ci scusiamo per l'inconveniente.", + }, + contact: { + title: "Contatto", + description: "", + email: "Email", + }, + pickup: { + title: "Ritiro in Negozio", + description: + "Faremo ogni sforzo per rispettare l'orario di ritiro previsto. Gli orari di ritiro effettivi possono variare.", + location: "Punto di Ritiro", + date: "Data di Ritiro", + time: "Orario di Ritiro Preferito", + selectStore: "Seleziona un punto vendita", + selectDate: "Seleziona una data", + selectTime: "Seleziona un orario di ritiro", + storeHours: "Orari del Negozio", + seeDetails: "Vedi dettagli", + noTimeSlots: + "Nessuna fascia oraria disponibile per la data selezionata. Seleziona un'altra data.", + hoursDisplayed: "Orari visualizzati nel tuo fuso orario locale.", + storeOperatesIn: "Il negozio opera nel fuso orario {timezone}.", + asap: "IL PRIMA POSSIBILE", + hour: "ora", + hours: "ore", + minutes: "minuti", + searchCountry: "Cerca paese...", + noCountryFound: "Nessun paese trovato.", + }, + days: { + sunday: "Domenica", + monday: "Lunedì", + tuesday: "Martedì", + wednesday: "Mercoledì", + thursday: "Giovedì", + friday: "Venerdì", + saturday: "Sabato", + }, + delivery: { + title: "Consegna", + method: "Metodo di consegna", + shipping: "Spedizione", + shipToAddress: "Spedisci al tuo indirizzo", + localPickup: "Ritiro in Negozio", + pickupFromStore: "Ritira dal punto vendita", + }, + tips: { + title: "Aggiungi una mancia", + noTip: "Nessuna Mancia", + customAmount: "Importo Personalizzato", + customTipAmount: "Importo Mancia Personalizzato", + placeholder: "€0,00", + }, + shipping: { + title: "Spedizione", + description: "Indirizzo di spedizione", + method: "Metodo di spedizione", + noShippingMethodAddress: + "Inserisci il tuo indirizzo per vedere i metodi di spedizione disponibili.", + noShippingMethods: "Nessun metodo di spedizione trovato.", + phone: "Numero di Telefono", + country: "Paese", + selectCountry: "Seleziona paese", + searchCountry: "Cerca paese...", + noCountryFound: "Nessun paese trovato", + firstName: "Nome", + lastName: "Cognome", + address1: "Indirizzo", + address2: "Appartamento, scala, ecc.", + city: "Città", + region: "Regione/Provincia", + postalCode: "Codice Postale", + notesPlaceholder: "Note o istruzioni speciali", + addressSuggestion: "Intendevi", + addressSuggestionEnd: "?", + noShippingOriginAddress: "Nessun indirizzo di origine spedizione fornito.", + }, + billing: { + title: "Fatturazione", + description: "Descrizione fatturazione", + }, + payment: { + title: "Pagamento", + description: "Tutti i pagamenti sono sicuri e crittografati.", + billingAddress: { + title: "Indirizzo di Fatturazione", + description: "Inserisci il tuo indirizzo di fatturazione.", + useShippingAddress: + "Usa l'indirizzo di spedizione come indirizzo di fatturazione", + }, + methods: { + creditCard: "Carta di Credito o Debito", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Pagamenti offline", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "Nessun metodo di pagamento disponibile", + cardNumber: "Numero della carta", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Data di scadenza (MM / AA)", + securityCode: "Codice di sicurezza", + cvvPlaceholder: "CVV", + nameOnCard: "Nome sulla carta", + payNow: "Paga ora", + standardShipping: "Spedizione Standard", + cardDetails: "Dettagli della carta", + payWithApplePay: "Paga con Apple Pay", + expirationDatePlaceholder: "MM / AA", + failedToInitializePayment: "Errore nell'inizializzazione del pagamento.", + orderTotal: "Totale Ordine", + subtotal: "Subtotale", + tax: "Tasse", + shipping: "Spedizione", + discount: "Buono", + processingPayment: "Elaborazione pagamento...", + completingOrder: "Completamento dell'ordine...", + freePayment: "Completa il tuo ordine gratuito", + }, + phone: { + placeholder: "(02) 1234-5678", + searchCountry: "Cerca paese...", + noCountryFound: "Nessun paese trovato.", + }, + discounts: { + placeholder: "Codice buono", + enterCode: "Inserisci codice buono", + apply: "Applica", + alreadyApplied: "Questo codice buono è già stato applicato", + failedToApply: "Errore nell'applicazione del codice buono", + enterCodeValidation: "Inserisci un codice buono", + }, + totals: { + subtotal: "Subtotale", + discount: "Sconto", + shipping: "Spedizione", + tip: "Mancia", + estimatedTaxes: "Tasse stimate", + totalDue: "Totale Dovuto", + orderSummary: "Riepilogo Ordine", + itemCount: "articoli", + noItems: "Nessun articolo", + }, + lineItems: { + note: "Nota:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Indirizzo", + suggestions: "Suggerimenti", + }, + form: { + useFormFieldError: + "useFormField deve essere usato all'interno di ", + }, + pagination: { + ariaLabel: "paginazione", + previousPageAriaLabel: "Vai alla pagina precedente", + previous: "Precedente", + nextPageAriaLabel: "Vai alla pagina successiva", + next: "Successivo", + morePages: "Altre pagine", + }, + sidebar: { + useSidebarError: + "useSidebar deve essere usato all'interno di un SidebarProvider.", + toggleSidebar: "Attiva/Disattiva Barra Laterale", + }, + accessibility: { + payWithApplePay: "Paga con Apple Pay", + applePayLogo: "Logo Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Errore nel recupero del token di accesso", + invalidEnvironment: "Ambiente non valido", + noPublicAccessToken: "Nessun token di accesso pubblico fornito", + noSessionToken: "Nessun token di sessione o ID fornito", + errorCreatingSession: "Errore nella creazione della sessione di checkout:", + orderIdRequired: "ID ordine richiesto", + errorTrackingEvent: "Errore nel tracciamento dell'evento", + errorInTrackingSubscriber: "Errore nel sottoscrittore di tracciamento", + useTrackingProviderError: + "useTracking deve essere usato all'interno di un TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect deve essere usato all'interno di un PoyntCollectProvider", + useSquareProviderError: + "useSquare deve essere usato all'interno di un SquareProvider", + errorProcessingPayment: "Errore nell'elaborazione del pagamento", + stripeConfigMissing: + "Configurazione Stripe mancante. Controlla la tua configurazione.", + paymentSuccessful: "Pagamento riuscito", + paymentFailed: "Pagamento fallito", + paypalConfigMissing: + "Configurazione PayPal mancante. Controlla la tua configurazione.", + stripeNotReady: "Stripe non pronto", + cardElementNotFound: "CardElement non trovato", + errorProcessingCardPayment: + "Errore nell'elaborazione del pagamento con carta.", + errorProcessingExpressPayment: + "Errore nell'elaborazione del pagamento express.", + failedToInitializePayment: "Errore nell'inizializzazione del pagamento.", + invalidPhoneNumber: "numero di telefono non valido", + }, + validation: { + phoneRequired: "Numero di telefono richiesto", + emailRequired: "Inserisci un'email", + emailInvalid: "Inserisci un'email valida", + phoneTooLong: "Numero di telefono troppo lungo", + invalidShippingAddress: "Indirizzo di spedizione non valido", + invalidBillingAddress: "Indirizzo di fatturazione non valido", + selectPaymentMethod: "Seleziona un metodo di pagamento", + enterValidBillingPhone: + "Inserisci un numero di telefono di fatturazione valido", + enterValidShippingPhone: + "Inserisci un numero di telefono di spedizione valido", + enterFirstName: "Inserisci un nome", + enterLastName: "Inserisci un cognome", + enterAddress: "Inserisci un indirizzo", + enterCity: "Inserisci una città", + enterZipCode: "Inserisci un codice postale", + enterZipPostalCode: "Inserisci un codice postale", + selectState: "Seleziona una regione/provincia", + selectCountry: "Seleziona un paese", + enterCountry: "Inserisci un paese", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Errore del server", + SESSION_NOT_FOUND: "Sessione non trovata", + CHECKOUT_SESSION_RETRIEVAL_FAILED: + "Errore nel recupero della sessione di checkout", + CHECKOUT_SESSION_NOT_FOUND: "Sessione di checkout non trovata", + CHECKOUT_SESSION_FETCH_ERROR: + "Errore generale nel recupero della sessione di checkout", + DRAFT_ORDER_NOT_FOUND: "Bozza ordine non trovata", + CHECKOUT_SESSION_CREATION_FAILED: + "Errore nella creazione della sessione di checkout", + CREATED_SESSION_DATA_NOT_FOUND: "Dati della sessione creata non trovati", + CHECKOUT_SESSION_CREATION_ERROR: + "Errore generale nella creazione della sessione di checkout", + CHECKOUT_SESSION_UPDATE_FAILED: + "Errore nell'aggiornamento della sessione di checkout", + UPDATED_SESSION_NOT_FOUND: "Sessione aggiornata non trovata", + CHECKOUT_SESSION_UPDATE_ERROR: + "Errore generale nell'aggiornamento della sessione di checkout", + ORDER_API_NOT_FOUND: "Fonte dati API ordini non trovata", + DRAFT_ORDER_RETRIEVAL_FAILED: "Errore nel recupero della bozza ordine", + DATA_SOURCES_NOT_FOUND: "Fonti dati non trovate", + TRANSACTION_API_NOT_FOUND: "Fonte dati API transazioni non trovata", + TRANSACTION_PROCESSING_FAILED: "Errore nell'elaborazione della transazione", + TRANSACTION_CREATION_FAILED: + "Errore nella ricerca o creazione della transazione", + ORDER_OPENING_FAILED: "Errore nell'apertura dell'ordine", + INVALID_FULFILLMENT_LOCATION: "Posizione di evasione non valida", + NO_VALID_PICKUP_LOCATION: "Nessuna posizione di ritiro valida disponibile", + DRAFT_ORDER_FETCH_FAILED: "Errore nel recupero della bozza ordine", + LINE_ITEMS_FETCH_FAILED: "Errore nel recupero degli articoli", + CURRENT_ORDER_FETCH_FAILED: + "Errore nel recupero della bozza ordine corrente", + DRAFT_ORDER_UPDATE_FAILED: "Errore nell'aggiornamento della bozza ordine", + DISCOUNT_APPLICATION_FAILED: "Errore nell'applicazione del buono", + CONTEXT_UNAVAILABLE: "Sessione o fonti dati non disponibili", + SHIPPING_LINES_UPDATE_FAILED: + "Errore nell'aggiornamento delle linee di spedizione", + ORDER_TOTALS_UPDATE_FAILED: + "Errore nell'aggiornamento dei totali dell'ordine", + SHIPPING_METHOD_APPLICATION_FAILED: + "Errore nell'applicazione del metodo di spedizione", + SKU_FETCH_FAILED: "Errore nel recupero degli SKU", + SHIPPING_RATES_CALCULATION_FAILED: + "Errore nel calcolo delle tariffe di spedizione", + SHIPPING_METHOD_NOT_FOUND: "Metodo di spedizione non trovato", + SHIPPING_METHOD_REMOVAL_FAILED: + "Errore nella rimozione del metodo di spedizione", + SHIPPING_ADDRESS_REQUIRED: "Indirizzo di spedizione richiesto", + INVENTORY_VALIDATION_ERROR: "Errore di validazione inventario", + INSUFFICIENT_INVENTORY: "Inventario insufficiente", + INVALID_ORDER_STATUS: "Stato ordine non valido", + TRANSACTION_CREATION_ERROR: "Errore nella creazione della transazione", + TRANSACTION_PROCESSING_ERROR: "Errore nell'elaborazione della transazione", + UNKNOWN_ERROR: "Errore sconosciuto", + FULFILLMENT_CREATION_ERROR: "Errore nella creazione dell'evasione", + TAX_CALCULATION_ERROR: "Errore nel calcolo delle tasse", + ADDRESS_VERIFICATION_ERROR: "Errore nella verifica dell'indirizzo", + ADDRESS_MATCHES_ERROR: "Errore nelle corrispondenze dell'indirizzo", + SHIPPING_CONFLICT_ERROR: "Errore di conflitto nella spedizione", + SHIPPING_ERROR: "Errore generale di spedizione", + PRICE_ADJUSTMENT_CALCULATION_ERROR: + "Errore nel calcolo dell'aggiustamento prezzo", + ORDER_FETCH_ERROR: "Errore nel recupero dell'ordine", + DRAFT_ORDER_UPDATE_ERROR: "Errore nell'aggiornamento della bozza ordine", + DISCOUNT_APPLICATION_ERROR: "Errore nell'applicazione del buono", + DRAFT_ORDER_OPEN_ERROR: "Errore nell'apertura della bozza ordine", + ORDER_UPDATE_ERROR: "Errore nell'aggiornamento dell'ordine", + CATALOG_FETCH_ERROR: "Errore nel recupero del catalogo", + STORE_ID_NOT_FOUND: "ID negozio non trovato", + ORDER_NOT_DRAFT: "L'ordine non è in stato di bozza", + NO_LINE_ITEMS: "Nessun articolo trovato", + BAD_USER_INPUT: "Input utente non valido", + MISSING_SHIPPING_ADDRESS: "Indirizzo di spedizione richiesto", + MISSING_REQUIRED_FIELD: "Campo obbligatorio mancante", + CATALOG_API_ERROR: "Errore del servizio catalogo", + TAX_SERVICE_UNAVAILABLE: "Servizio tasse non disponibile", + SHIPPING_SERVICE_UNAVAILABLE: "Servizio di spedizione non disponibile", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Servizio di aggiustamento prezzi non disponibile", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Errore nel calcolo degli aggiustamenti prezzi", + SERVICE_UNAVAILABLE: "Servizio temporaneamente non disponibile", + RATE_LIMITED: "Troppe richieste, riprovare più tardi", + TIMEOUT: "Timeout della richiesta", + INTERNAL_ERROR: "Errore interno del server", + SHIPPING_POSTAL_CODE_REQUIRED: "Codice postale di spedizione obbligatorio", + SHIPPING_COUNTRY_CODE_REQUIRED: "Codice paese di spedizione obbligatorio", + SHIPPING_METHOD_REQUIRED: "Metodo di spedizione obbligatorio", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "Verifica indirizzo di spedizione fallita", + BILLING_ADDRESS_VERIFICATION_FAILED: + "Verifica indirizzo di fatturazione fallita", + }, +}; diff --git a/packages/localizations/src/ptBr.ts b/packages/localizations/src/ptBr.ts new file mode 100644 index 00000000..6b40cde8 --- /dev/null +++ b/packages/localizations/src/ptBr.ts @@ -0,0 +1,321 @@ +export const ptBr = { + general: { + optional: "opcional", + notes: "Observações", + quantity: "Quantidade", + free: "GRÁTIS", + closed: "Fechado", + apply: "Aplicar", + checkoutDisabled: + "O checkout está temporariamente indisponível. Pedimos desculpas pelo inconveniente.", + }, + contact: { + title: "Contato", + description: "", + email: "E-mail", + }, + pickup: { + title: "Retirada no Local", + description: + "Faremos todos os esforços para atender o horário de retirada esperado. Os horários reais de retirada podem variar.", + location: "Local de Retirada", + date: "Data de Retirada", + time: "Horário Preferido de Retirada", + selectStore: "Selecione uma loja", + selectDate: "Selecione uma data", + selectTime: "Selecione um horário de retirada", + storeHours: "Horário de Funcionamento", + seeDetails: "Ver detalhes", + noTimeSlots: + "Nenhum horário disponível para a data selecionada. Por favor, selecione outra data.", + hoursDisplayed: "Horários exibidos no seu fuso horário local.", + storeOperatesIn: "A loja funciona no fuso horário {timezone}.", + asap: "O MAIS RÁPIDO POSSÍVEL", + hour: "hora", + hours: "horas", + minutes: "minutos", + searchCountry: "Buscar país...", + noCountryFound: "Nenhum país encontrado.", + }, + days: { + sunday: "Domingo", + monday: "Segunda-feira", + tuesday: "Terça-feira", + wednesday: "Quarta-feira", + thursday: "Quinta-feira", + friday: "Sexta-feira", + saturday: "Sábado", + }, + delivery: { + title: "Entrega", + method: "Método de entrega", + shipping: "Envio", + shipToAddress: "Enviar para seu endereço", + localPickup: "Retirada no Local", + pickupFromStore: "Retirar na loja", + }, + tips: { + title: "Adicionar gorjeta", + noTip: "Sem Gorjeta", + customAmount: "Valor Personalizado", + customTipAmount: "Valor da Gorjeta Personalizada", + placeholder: "R$ 0,00", + }, + shipping: { + title: "Envio", + description: "Endereço de entrega", + method: "Método de envio", + noShippingMethodAddress: + "Digite seu endereço para ver os métodos de envio disponíveis.", + noShippingMethods: "Nenhum método de envio encontrado.", + phone: "Número de Telefone", + country: "País", + selectCountry: "Selecionar país", + searchCountry: "Buscar país...", + noCountryFound: "Nenhum país encontrado", + firstName: "Nome", + lastName: "Sobrenome", + address1: "Endereço", + address2: "Complemento (opcional)", + city: "Cidade", + region: "Estado", + postalCode: "CEP", + notesPlaceholder: "Observações ou instruções especiais", + addressSuggestion: "Você quis dizer", + addressSuggestionEnd: "?", + noShippingOriginAddress: "Endereço de origem de envio não fornecido.", + }, + billing: { + title: "Cobrança", + description: "Descrição da cobrança", + }, + payment: { + title: "Pagamento", + description: "Todos os pagamentos são seguros e criptografados.", + billingAddress: { + title: "Endereço de Cobrança", + description: "Digite seu endereço de cobrança.", + useShippingAddress: "Usar endereço de entrega como endereço de cobrança", + }, + methods: { + creditCard: "Cartão de Crédito ou Débito", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Pagamentos offline", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "Nenhum método de pagamento disponível", + cardNumber: "Número do cartão", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Data de validade (MM / AA)", + securityCode: "Código de segurança", + cvvPlaceholder: "CVV", + nameOnCard: "Nome no cartão", + payNow: "Pagar agora", + standardShipping: "Envio Padrão", + cardDetails: "Dados do cartão", + payWithApplePay: "Pagar com Apple Pay", + expirationDatePlaceholder: "MM / AA", + failedToInitializePayment: "Falha ao inicializar pagamento.", + orderTotal: "Total do Pedido", + subtotal: "Subtotal", + tax: "Impostos", + shipping: "Envio", + discount: "Cupom", + processingPayment: "Processando pagamento...", + completingOrder: "Concluindo pedido...", + freePayment: "Complete seu pedido gratuito", + }, + phone: { + placeholder: "(11) 99999-9999", + searchCountry: "Buscar país...", + noCountryFound: "Nenhum país encontrado.", + }, + discounts: { + placeholder: "Código de cupom", + enterCode: "Digite o código de cupom", + apply: "Aplicar", + alreadyApplied: "Este código de cupom já foi aplicado", + failedToApply: "Falha ao aplicar código de cupom", + enterCodeValidation: "Por favor, digite um código de cupom", + }, + totals: { + subtotal: "Subtotal", + discount: "Desconto", + shipping: "Envio", + tip: "Gorjeta", + estimatedTaxes: "Impostos estimados", + totalDue: "Total a Pagar", + orderSummary: "Resumo do Pedido", + itemCount: "itens", + noItems: "Nenhum item", + }, + lineItems: { + note: "Observação:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Endereço", + suggestions: "Sugestões", + }, + form: { + useFormFieldError: "useFormField deve ser usado dentro de ", + }, + pagination: { + ariaLabel: "paginação", + previousPageAriaLabel: "Ir para página anterior", + previous: "Anterior", + nextPageAriaLabel: "Ir para próxima página", + next: "Próximo", + morePages: "Mais páginas", + }, + sidebar: { + useSidebarError: + "useSidebar deve ser usado dentro de um SidebarProvider.", + toggleSidebar: "Alternar Barra Lateral", + }, + accessibility: { + payWithApplePay: "Pagar com Apple Pay", + applePayLogo: "Logo do Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Falha ao obter token de acesso", + invalidEnvironment: "Ambiente inválido", + noPublicAccessToken: "Nenhum token de acesso público fornecido", + noSessionToken: "Nenhum token de sessão ou ID fornecido", + errorCreatingSession: "Erro ao criar sessão de checkout:", + orderIdRequired: "ID do pedido é obrigatório", + errorTrackingEvent: "Erro ao rastrear evento", + errorInTrackingSubscriber: "Erro no assinante de rastreamento", + useTrackingProviderError: + "useTracking deve ser usado dentro de um TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect deve ser usado dentro de um PoyntCollectProvider", + useSquareProviderError: + "useSquare deve ser usado dentro de um SquareProvider", + errorProcessingPayment: "Erro ao processar pagamento", + stripeConfigMissing: + "Configuração do Stripe está faltando. Por favor, verifique sua configuração.", + paymentSuccessful: "Pagamento realizado com sucesso", + paymentFailed: "Falha no pagamento", + paypalConfigMissing: + "Configuração do PayPal está faltando. Por favor, verifique sua configuração.", + stripeNotReady: "Stripe não está pronto", + cardElementNotFound: "CardElement não encontrado", + errorProcessingCardPayment: "Erro ao processar pagamento com cartão.", + errorProcessingExpressPayment: "Erro ao processar pagamento expresso.", + failedToInitializePayment: "Falha ao inicializar pagamento.", + invalidPhoneNumber: "número de telefone inválido", + }, + validation: { + phoneRequired: "Número de telefone é obrigatório", + emailRequired: "Digite um e-mail", + emailInvalid: "Digite um e-mail válido", + phoneTooLong: "Número de telefone muito longo", + invalidShippingAddress: "Endereço de entrega inválido", + invalidBillingAddress: "Endereço de cobrança inválido", + selectPaymentMethod: "Selecione um método de pagamento", + enterValidBillingPhone: "Digite um número de telefone de cobrança válido", + enterValidShippingPhone: "Digite um número de telefone de entrega válido", + enterFirstName: "Digite o nome", + enterLastName: "Digite o sobrenome", + enterAddress: "Digite um endereço", + enterCity: "Digite uma cidade", + enterZipCode: "Digite um CEP", + enterZipPostalCode: "Digite um CEP", + selectState: "Selecione um estado/província", + selectCountry: "Selecione um país", + enterCountry: "Digite um país", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Erro no servidor", + SESSION_NOT_FOUND: "Sessão não encontrada", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Falha ao recuperar sessão de checkout", + CHECKOUT_SESSION_NOT_FOUND: "Sessão de checkout não encontrada", + CHECKOUT_SESSION_FETCH_ERROR: "Erro geral ao buscar sessão de checkout", + DRAFT_ORDER_NOT_FOUND: "Rascunho do pedido não encontrado", + CHECKOUT_SESSION_CREATION_FAILED: "Falha ao criar sessão de checkout", + CREATED_SESSION_DATA_NOT_FOUND: "Dados da sessão criada não encontrados", + CHECKOUT_SESSION_CREATION_ERROR: "Erro geral ao criar sessão de checkout", + CHECKOUT_SESSION_UPDATE_FAILED: "Falha ao atualizar sessão de checkout", + UPDATED_SESSION_NOT_FOUND: "Sessão atualizada não encontrada", + CHECKOUT_SESSION_UPDATE_ERROR: "Erro geral ao atualizar sessão de checkout", + ORDER_API_NOT_FOUND: "Fonte de dados da API de pedidos não encontrada", + DRAFT_ORDER_RETRIEVAL_FAILED: "Falha ao recuperar rascunho do pedido", + DATA_SOURCES_NOT_FOUND: "Fontes de dados não encontradas", + TRANSACTION_API_NOT_FOUND: + "Fonte de dados da API de transação não encontrada", + TRANSACTION_PROCESSING_FAILED: "Falha ao processar transação", + TRANSACTION_CREATION_FAILED: "Falha ao encontrar ou criar transação", + ORDER_OPENING_FAILED: "Falha ao abrir pedido", + INVALID_FULFILLMENT_LOCATION: "Local de atendimento inválido", + NO_VALID_PICKUP_LOCATION: "Nenhum local de retirada válido disponível", + DRAFT_ORDER_FETCH_FAILED: "Falha ao buscar rascunho do pedido", + LINE_ITEMS_FETCH_FAILED: "Falha ao buscar itens de linha", + CURRENT_ORDER_FETCH_FAILED: "Falha ao buscar rascunho do pedido atual", + DRAFT_ORDER_UPDATE_FAILED: "Falha ao atualizar rascunho do pedido", + DISCOUNT_APPLICATION_FAILED: "Falha ao aplicar cupom", + CONTEXT_UNAVAILABLE: "Sessão ou fontes de dados não disponíveis", + SHIPPING_LINES_UPDATE_FAILED: "Falha ao atualizar linhas de envio", + ORDER_TOTALS_UPDATE_FAILED: "Falha ao atualizar totais do pedido", + SHIPPING_METHOD_APPLICATION_FAILED: "Falha ao aplicar método de envio", + SKU_FETCH_FAILED: "Falha ao buscar SKUs", + SHIPPING_RATES_CALCULATION_FAILED: "Falha ao calcular taxas de envio", + SHIPPING_METHOD_NOT_FOUND: "Método de envio não encontrado", + SHIPPING_METHOD_REMOVAL_FAILED: "Falha ao remover método de envio", + SHIPPING_ADDRESS_REQUIRED: "Endereço de envio obrigatório", + INVENTORY_VALIDATION_ERROR: "Erro de validação de estoque", + INSUFFICIENT_INVENTORY: "Estoque insuficiente", + INVALID_ORDER_STATUS: "Status do pedido inválido", + TRANSACTION_CREATION_ERROR: "Erro na criação da transação", + TRANSACTION_PROCESSING_ERROR: "Erro no processamento da transação", + UNKNOWN_ERROR: "Erro desconhecido", + FULFILLMENT_CREATION_ERROR: "Erro na criação do atendimento", + TAX_CALCULATION_ERROR: "Erro no cálculo de impostos", + ADDRESS_VERIFICATION_ERROR: "Erro na verificação de endereço", + ADDRESS_MATCHES_ERROR: "Erro na correspondência de endereços", + SHIPPING_CONFLICT_ERROR: "Erro de conflito de envio", + SHIPPING_ERROR: "Erro geral de envio", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Erro no cálculo de ajuste de preço", + ORDER_FETCH_ERROR: "Erro ao buscar pedido", + DRAFT_ORDER_UPDATE_ERROR: "Erro ao atualizar rascunho do pedido", + DISCOUNT_APPLICATION_ERROR: "Erro na aplicação de cupom", + DRAFT_ORDER_OPEN_ERROR: "Erro ao abrir rascunho do pedido", + ORDER_UPDATE_ERROR: "Erro ao atualizar pedido", + CATALOG_FETCH_ERROR: "Erro ao buscar catálogo", + STORE_ID_NOT_FOUND: "ID da loja não encontrado", + ORDER_NOT_DRAFT: "O pedido não está em status de rascunho", + NO_LINE_ITEMS: "Nenhum item encontrado", + BAD_USER_INPUT: "Entrada de usuário inválida", + MISSING_SHIPPING_ADDRESS: "Endereço de entrega obrigatório", + MISSING_REQUIRED_FIELD: "Campo obrigatório ausente", + CATALOG_API_ERROR: "Erro do serviço de catálogo", + TAX_SERVICE_UNAVAILABLE: "Serviço de impostos indisponível", + SHIPPING_SERVICE_UNAVAILABLE: "Serviço de envio indisponível", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Serviço de ajustes de preço indisponível", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "Falha no cálculo de ajustes de preço", + SERVICE_UNAVAILABLE: "Serviço temporariamente indisponível", + RATE_LIMITED: "Muitas solicitações, tente novamente mais tarde", + TIMEOUT: "Tempo limite da solicitação esgotado", + INTERNAL_ERROR: "Erro interno do servidor", + SHIPPING_POSTAL_CODE_REQUIRED: "Código postal de envio é obrigatório", + SHIPPING_COUNTRY_CODE_REQUIRED: "Código do país de envio é obrigatório", + SHIPPING_METHOD_REQUIRED: "Método de envio é obrigatório", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "Falha na verificação do endereço de envio", + BILLING_ADDRESS_VERIFICATION_FAILED: + "Falha na verificação do endereço de cobrança", + }, +}; diff --git a/packages/localizations/src/qaPs.ts b/packages/localizations/src/qaPs.ts new file mode 100644 index 00000000..986279a7 --- /dev/null +++ b/packages/localizations/src/qaPs.ts @@ -0,0 +1,325 @@ +export const qaPs = { + general: { + optional: "[óþťîöñâl]", + notes: "[Ñöťéš]", + quantity: "[Qüâñťîťÿ]", + free: "[FRËË]", + closed: "[Çlöšéd]", + apply: "[Âþþlÿ]", + checkoutDisabled: + "[Çhéçkøüť îš çürrëñťlÿ dîšâblëd. Wé âþöløgîžé før ťhé îñçöñvéñîéñçé ând áppreciate your patience.]", + }, + contact: { + title: "[Çöñťâçť]", + description: "", + email: "[Émâîl Âddrëšš]", + }, + pickup: { + title: "[Löçâl Þîçküþ Šërvîçë]", + description: + "[Âll éffôrťš wîll bé mâdé ťö mëëť ÿöür ëxþëçťëd þîçküþ ťîmé. Âçťüâl þîçküþ ťîmëš mâÿ vârÿ dëþëñdîñg öñ çîrçümšťâñçëš.]", + location: "[Þîçküþ Löçâťîöñ Âddrëšš]", + date: "[Þîçküþ Dâťé]", + time: "[Þrëfërrëd Þîçküþ Ťîmé]", + selectStore: "[Šëlëçť â šťörë löçâťîöñ frôm ťhé lîšť]", + selectDate: "[Šëlëçť â dâťé frôm çâlëñdâr]", + selectTime: "[Šëlëçť â þîçküþ ťîmé šlöť]", + storeHours: "[Šťörë Hôürš Îñförmâťîöñ]", + seeDetails: "[Šëë mörë dëťâîlš]", + noTimeSlots: + "[Ñö âvâîlâblë ťîmé šlöťš fôr ťhé šëlëçťëd dâťé. Þlëâšé šëlëçť âñöťhër dâťé ôr çöñšîdër öťhër öþťîöñš.]", + hoursDisplayed: "[Hôürš dîšþlâÿëd îñ ÿöür löçâl ťîmëžöñë fôr çöñvëñîëñçë.]", + storeOperatesIn: "[Šťörë öþërâťëš îñ {timezone} ťîmëžöñë förmâť.]", + asap: "[ŠÂ̈P]", + hour: "[hôür]", + hours: "[hôürš]", + minutes: "[mîñüťëš]", + searchCountry: "[Šëârçh çöüñťrÿ bÿ ñâmë...]", + noCountryFound: "[Ñö çöüñťrÿ föüñd îñ šëârçh.]", + }, + days: { + sunday: "[Šüñdâÿ]", + monday: "[Möñdâÿ]", + tuesday: "[Ťüëšdâÿ]", + wednesday: "[Wëdñëšdâÿ]", + thursday: "[Ťhürškâÿ]", + friday: "[Frîdâÿ]", + saturday: "[Šâťürdâÿ]", + }, + delivery: { + title: "[Délîvërÿ Mëťhödš]", + method: "[Délîvërÿ mëťhöd šëlëçťîöñ]", + shipping: "[Šhîþþîñg Öþťîöñš]", + shipToAddress: "[Šhîþ ťö ÿöür šþëçîfîëd âddrëšš]", + localPickup: "[Löçâl Þîçküþ Šërvîçë]", + pickupFromStore: "[Þîçk üþ frôm šťörë löçâťîöñ]", + }, + tips: { + title: "[Âdd â ťîþ fôr šërvîçë]", + noTip: "[Ñö Ťîþ Âddëd]", + customAmount: "[Çüšťöm Âmöüñť Ëñťrÿ]", + customTipAmount: "[Çüšťöm Ťîþ Âmöüñť Vâlüë]", + placeholder: "[$0.00]", + }, + shipping: { + title: "[Šhîþþîñg Îñförmâťîöñ]", + description: "[Šhîþþîñg âddrëšš dëťâîlš]", + method: "[Šhîþþîñg mëťhöd šëlëçťîöñ]", + noShippingMethodAddress: + "[Ëñťër ÿöür âddrëšš ťö šëë âvâîlâblë šhîþþîñg mëťhödš fôr ÿöür löçâťîöñ.]", + noShippingMethods: "[Ñö šhîþþîñg mëťhödš föüñd fôr ţhîš löçâţîöñ.]", + phone: "[Þhöñë Ñümkër Îñförmâťîöñ]", + country: "[Çöüñţrÿ Šëlëçťîöñ]", + selectCountry: "[Šëlëçť çöüñţrÿ frôm lîšť]", + searchCountry: "[Šëârçh çöüñţrÿ bÿ ñâmë...]", + noCountryFound: "[Ñö çöüñţrÿ föüñd îñ šëârçh]", + firstName: "[Fîršť Ñâmë Îñþüť]", + lastName: "[Lâšť Ñâmë Îñþüť]", + address1: "[Âddrëšš Lîñë Önë]", + address2: "[Âþârţmëñť, šüîţë, ëţç. (öþţîöñâl îñþüť)]", + city: "[Çîţÿ Ñâmë]", + region: "[Šţâţë/Þrövîñçë Šëlëçţîöñ]", + postalCode: "[Þöšţâl Çödë Îñþüť]", + notesPlaceholder: "[Ñöţëš ör šþëçîâl îñšţrüçţîöñš fôr délîvërÿ]", + addressSuggestion: "[Dîd ÿöü mëâñ ţhîš âddrëšš]", + addressSuggestionEnd: "[?]", + noShippingOriginAddress: + "[Ñö šhîþþîñg örîgîñ âddrëšš þrövîdëd bÿ mërçhâñť.]", + }, + billing: { + title: "[Bîllîñg Îñförmâţîöñ]", + description: "[Bîllîñg îñförmâţîöñ dëšçrîþţîöñ]", + }, + payment: { + title: "[Þâÿmëñţ Îñförmâţîöñ]", + description: "[Âll þâÿmëñţš ârë šëçürë ând ëñçrÿþţëd för ÿöür šâfëţÿ.]", + billingAddress: { + title: "[Bîllîñg Âddrëšš Îñförmâţîöñ]", + description: "[Ëñţër ÿöür bîllîñg âddrëšš dëţâîlš.]", + useShippingAddress: "[Üšë šhîþþîñg âddrëšš âš bîllîñg âddrëšš]", + }, + methods: { + creditCard: "[Çrëdîţ ör Dëbîţ Çârd Þâÿmëñţ]", + paypal: "[ÞâÿÞâl Þâÿmëñţ Šërvîçë]", + applePay: "[Âþþlë Þâÿ Þâÿmëñţ]", + googlePay: "[Göögië Þâÿ Þâÿmëñţ]", + paze: "[Þâžë Þâÿmëñţ Šërvîçë]", + offline: "[Öfflîñë þâÿmëñţ mëţhödš]", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "[Ñö þâÿmëñţ mëţhödš âvâîlâblë âţ ţhîš ţîmë]", + cardNumber: "[Çârd ñümkër îñþüţ fîëld]", + cardNumberPlaceholder: "[1234 1234 1234 1234]", + expirationDate: "[Ëxþîrâţîöñ dâţë (MM / ÿÿ förmâţ)]", + securityCode: "[Šëçürîţÿ çödë vërîfîçâţîöñ]", + cvvPlaceholder: "[ÇVV]", + nameOnCard: "[Ñâmë öñ çârd âš šhöwñ]", + payNow: "[Þâÿ Ñöw Büţţöñ]", + standardShipping: "[Šţâñdârd Šhîþþîñg Öþţîöñ]", + cardDetails: "[Çârd dëţâîlš îñförmâţîöñ]", + payWithApplePay: "[Þâÿ wîţh Âþþlë Þâÿ šërvîçë]", + expirationDatePlaceholder: "[MM / ÿÿ]", + failedToInitializePayment: "[Fâîlëd ţö îñîţîâlîžë þâÿmëñţ þröçëšš.]", + orderTotal: "[Tötâl Ördër Âmöüñţ]", + subtotal: "[Šübţöţâl Âmöüñţ]", + tax: "[Ţâx Çâlçülâţîöñ]", + shipping: "[Šhîþþîñg Çöšţš]", + discount: "[Çöüþöñ Âmöüñţ]", + processingPayment: "[Þröçëššîñg þâÿmëñţ îñförmâţîöñ...]", + completingOrder: "[Completing order...]", + freePayment: "[Complete your free order]", + }, + phone: { + placeholder: "[(201) 555-1234]", + searchCountry: "[Šëârçh çöüñţrÿ bÿ ñâmë...]", + noCountryFound: "[Ñö çöüñţrÿ föüñd îñ šëârçh rëšülţš.]", + }, + discounts: { + placeholder: "[Çöüþöñ çödë îñþüţ]", + enterCode: "[Ëñţër çöüþöñ çödë hërë]", + apply: "[Âþþlÿ Çödë]", + alreadyApplied: "[Ţhîš çöüþöñ çödë hâš âlrëâdÿ bëëñ âþþlîëd ţö ţhîš ördër]", + failedToApply: "[Fâîlëd ţö âþþlÿ çöüþöñ çödë ţö ţhîš ördër]", + enterCodeValidation: "[Þlëâšë ëñţër â vâlîd çöüþöñ çödë]", + }, + totals: { + subtotal: "[Šübţöţâl Çâlçülâţîöñ]", + discount: "[Dîšçöüñţ]", + shipping: "[Šhîþþîñg Çöšţš]", + tip: "[Ţîþ Âmöüñţ]", + estimatedTaxes: "[Ëšţîmâţëd ţâxëš çâlçülâţîöñ]", + totalDue: "[Tötâl Âmöüñţ Düë]", + orderSummary: "[Ördër Šümmârÿ Dëţâîlš]", + itemCount: "[îţëmš îñ çârţ]", + noItems: "[Ñö îţëmš îñ çârţ]", + }, + lineItems: { + note: "[Ñöţë îñförmâţîöñ:]", + }, + ui: { + autocomplete: { + addressPlaceholder: "[Âddrëšš šëârçh îñþüţ]", + suggestions: "[Äüţöçömþlëţë šüggëšţîöñš]", + }, + form: { + useFormFieldError: + "[üšëFörmFîëld šhöüld bë üšëd wîţhîñ çömþöñëñţ]", + }, + pagination: { + ariaLabel: "[þâgîñâţîöñ ñâvîgâţîöñ]", + previousPageAriaLabel: "[Gö ţö þrëvîöüš þâgë îñ lîšţ]", + previous: "[Þrëvîöüš Þâgë]", + nextPageAriaLabel: "[Gö ţö ñëxţ þâgë îñ lîšţ]", + next: "[Ñëxţ Þâgë]", + morePages: "[Mörë þâgëš âvâîlâblë]", + }, + sidebar: { + useSidebarError: + "[üšëŠîdëbâr müšţ bë üšëd wîţhîñ â ŠîdëbârÞrövîdër çömþöñëñţ.]", + toggleSidebar: "[Tögglë Šîdëbâr Vîšîbîlîţÿ]", + }, + accessibility: { + payWithApplePay: "[Þâÿ wîţh Âþþlë Þâÿ šërvîçë]", + applePayLogo: "[Âþþlë Þâÿ Löğö Îmâgë]", + }, + }, + errors: { + failedToGetAccessToken: "[Fâîlëd ţö gëţ âççëšš ţökëñ frôm šërvër]", + invalidEnvironment: "[Îñvâlîd ëñvîröñmëñţ çönfîgürâţîöñ]", + noPublicAccessToken: "[Ñö þüblîç âççëšš ţökëñ þrövîdëd bÿ âþþlîçâţîöñ]", + noSessionToken: "[Ñö šëššîöñ ţökëñ ör ÎD þrövîdëd fôr âüţhëñţîçâţîöñ]", + errorCreatingSession: "[Ërrör çrëâţîñg çhëçköüţ šëššîöñ:]", + orderIdRequired: "[Ördër ÎD îš rëqüîrëd fôr þröçëššîñg]", + errorTrackingEvent: "[Ërrör ţrâçkîñg ëvëñţ îñ âñâlÿţîçš]", + errorInTrackingSubscriber: "[Ërrör îñ ţrâçkîñg šübšçrîbër šÿšţëm]", + useTrackingProviderError: + "[üšëŢrâçkîñg müšţ bë üšëd wîţhîñ â ŢrâçkîñgÞrövîdër çömþöñëñţ]", + usePoyntCollectProviderError: + "[üšëÞöÿñţÇöllëçţ müšţ bë üšëd wîţhîñ â ÞöÿñţÇöllëçţÞrövîdër çömþöñëñţ]", + useSquareProviderError: + "[üšëŠqüârë müšţ bë üšëd wîţhîñ â ŠqüârëÞrövîdër çömþöñëñţ]", + errorProcessingPayment: "[Ërrör þröçëššîñg þâÿmëñţ îñförmâţîöñ]", + stripeConfigMissing: + "[Šţrîþë çönfîgürâţîöñ îš mîššîñg. Þlëâšë çhëçk ÿöür šëţüþ.]", + paymentSuccessful: "[Þâÿmëñţ þröçëššëd šüççëššfüllÿ]", + paymentFailed: "[Þâÿmëñţ þröçëššîñg fâîlëd]", + paypalConfigMissing: + "[ÞâÿÞâl çönfîgürâţîöñ îš mîššîñg. Þlëâšë çhëçk ÿöür šëţüþ.]", + stripeNotReady: "[Šţrîþë šërvîçë ñöţ rëâdÿ fôr þröçëššîñg]", + cardElementNotFound: "[ÇârdËlëmëñţ çömþöñëñţ ñöţ föüñd îñ DÖM]", + errorProcessingCardPayment: "[Ërrör þröçëššîñg çârd þâÿmëñţ îñförmâţîöñ.]", + errorProcessingExpressPayment: "[Ërrör þröçëššîñg ëxþrëšš þâÿmëñţ mëţhöd.]", + failedToInitializePayment: "[Fâîlëd ţö îñîţîâlîžë þâÿmëñţ šÿšţëm.]", + invalidPhoneNumber: "[îñvâlîd þhöñë ñümkër förmâţ]", + }, + validation: { + phoneRequired: "[Þhöñë ñümkër îš rëqüîrëd fôr ţhîš ördër]", + emailRequired: "[Ëñţër âñ ëmâîl âddrëšš fôr çöñţâçţ]", + emailInvalid: "[Ëñţër â vâlîd ëmâîl âddrëšš förmâţ]", + phoneTooLong: "[Þhöñë ñümkër îš ţöö löñg fôr vâlîdâţîöñ]", + invalidShippingAddress: "[Îñvâlîd šhîþþîñg âddrëšš îñförmâţîöñ]", + invalidBillingAddress: "[Îñvâlîd bîllîñg âddrëšš îñförmâţîöñ]", + selectPaymentMethod: "[Šëlëçţ â þâÿmëñţ mëţhöd ţö çöñţîñüë]", + enterValidBillingPhone: "[Ëñţër â vâlîd bîllîñg þhöñë ñümkër]", + enterValidShippingPhone: "[Ëñţër â vâlîd šhîþþîñg þhöñë ñümkër]", + enterFirstName: "[Ëñţër â fîršţ ñâmë fôr îdëñţîfîçâţîöñ]", + enterLastName: "[Ëñţër â lâšţ ñâmë fôr îdëñţîfîçâţîöñ]", + enterAddress: "[Ëñţër âñ âddrëšš fôr délîvërÿ]", + enterCity: "[Ëñţër â çîţÿ ñâmë fôr löçâţîöñ]", + enterZipCode: "[Ëñţër â ŽÎÞ çödë fôr vërîfîçâţîöñ]", + enterZipPostalCode: "[Ëñţër â ŽÎÞ / þöšţâl çödë fôr vërîfîçâţîöñ]", + selectState: "[Šëlëçţ â šţâţë/þrövîñçë frôm ţhë âvâîlâblë öþţîöñš]", + selectCountry: "[Šëlëçţ â çöüñţrÿ frôm ţhë âvâîlâblë öþţîöñš]", + enterCountry: "[Ëñţër â çöüñţrÿ ñâmë fôr löçâţîöñ]", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "[Šërvër ërrör öççürrëd]", + SESSION_NOT_FOUND: "[Šëššîöñ ñöţ föüñd îñ šÿšţëm]", + CHECKOUT_SESSION_RETRIEVAL_FAILED: + "[Fâîlëd ţö rëţrîëvë çhëçköüţ šëššîöñ dâţâ]", + CHECKOUT_SESSION_NOT_FOUND: "[Çhëçköüţ šëššîöñ ñöţ föüñd îñ šÿšţëm]", + CHECKOUT_SESSION_FETCH_ERROR: + "[Gëñërâl çhëçköüţ šëššîöñ fëţçh ërrör öççürrëd]", + DRAFT_ORDER_NOT_FOUND: "[Drâfţ ördër ñöţ föüñd îñ šÿšţëm]", + CHECKOUT_SESSION_CREATION_FAILED: "[Fâîlëd ţö çrëâţë çhëçköüţ šëššîöñ]", + CREATED_SESSION_DATA_NOT_FOUND: "[Çrëâţëd šëššîöñ dâţâ ñöţ föüñd]", + CHECKOUT_SESSION_CREATION_ERROR: + "[Gëñërâl çhëçköüţ šëššîöñ çrëâţîöñ ërrör]", + CHECKOUT_SESSION_UPDATE_FAILED: "[Fâîlëd ţö üþdâţë çhëçköüţ šëššîöñ]", + UPDATED_SESSION_NOT_FOUND: "[Üþdâţëd šëššîöñ ñöţ föüñd]", + CHECKOUT_SESSION_UPDATE_ERROR: "[Gëñërâl çhëçköüţ šëššîöñ üþdâţë ërrör]", + ORDER_API_NOT_FOUND: "[Ördër ÂÞÎ dâţâ šöürçë ñöţ föüñd]", + DRAFT_ORDER_RETRIEVAL_FAILED: "[Fâîlëd ţö rëţrîëvë drâfţ ördër]", + DATA_SOURCES_NOT_FOUND: "[Dâţâ šöürçëš ñöţ föüñd îñ šÿšţëm]", + TRANSACTION_API_NOT_FOUND: "[Ţrâñšâçţîöñ ÂÞÎ dâţâ šöürçë ñöţ föüñd]", + TRANSACTION_PROCESSING_FAILED: "[Fâîlëd ţö þröçëšš ţrâñšâçţîöñ]", + TRANSACTION_CREATION_FAILED: "[Fâîlëd ţö fîñd ör çrëâţë ţrâñšâçţîöñ]", + ORDER_OPENING_FAILED: "[Fâîlëd ţö öþëñ ördër fôr þröçëššîñg]", + INVALID_FULFILLMENT_LOCATION: "[Îñvâlîd füllfîllmëñţ löçâţîöñ šþëçîfîëd]", + NO_VALID_PICKUP_LOCATION: "[Ñö vâlîd þîçküþ löçâţîöñ âvâîlâblë]", + DRAFT_ORDER_FETCH_FAILED: "[Fâîlëd ţö fëţçh drâfţ ördër dâţâ]", + LINE_ITEMS_FETCH_FAILED: "[Fâîlëd ţö fëţçh lîñë îţëmš îñförmâţîöñ]", + CURRENT_ORDER_FETCH_FAILED: "[Fâîlëd ţö fëţçh çürrëñţ drâfţ ördër]", + DRAFT_ORDER_UPDATE_FAILED: "[Fâîlëd ţö üþdâţë drâfţ ördër îñförmâţîöñ]", + DISCOUNT_APPLICATION_FAILED: "[Fâîlëd ţö âþþlÿ çöüþöñ ţö ördër]", + CONTEXT_UNAVAILABLE: "[Šëššîöñ ör dâţâ šöürçëš ñöţ âvâîlâblë]", + SHIPPING_LINES_UPDATE_FAILED: "[Fâîlëd ţö üþdâţë šhîþþîñg lîñëš]", + ORDER_TOTALS_UPDATE_FAILED: "[Fâîlëd ţö üþdâţë ördër ţöţâlš]", + SHIPPING_METHOD_APPLICATION_FAILED: "[Fâîlëd ţö âþþlÿ šhîþþîñg mëţhöd]", + SKU_FETCH_FAILED: "[Fâîlëd ţö fëţçh ŠKÜ îñförmâţîöñ]", + SHIPPING_RATES_CALCULATION_FAILED: "[Fâîlëd ţö çâlçülâţë šhîþþîñg râţëš]", + SHIPPING_METHOD_NOT_FOUND: "[Šhîþþîñg mëţhöd ñöţ föüñd îñ šÿšţëm]", + SHIPPING_METHOD_REMOVAL_FAILED: "[Fâîlëd ţö rëmövë šhîþþîñg mëţhöd]", + SHIPPING_ADDRESS_REQUIRED: "[Šhîþþîñg âddrëšš îš rëqüîrëd fôr þröçëššîñg]", + INVENTORY_VALIDATION_ERROR: "[Îñvëñţörÿ vâlîdâţîöñ ërrör öççürrëd]", + INSUFFICIENT_INVENTORY: "[Îñšüffîçîëñţ îñvëñţörÿ âvâîlâblë]", + INVALID_ORDER_STATUS: "[Îñvâlîd ördër šţâţüš föü þröçëššîñg]", + TRANSACTION_CREATION_ERROR: "[Ţrâñšâçţîöñ çrëâţîöñ ërrör öççürrëd]", + TRANSACTION_PROCESSING_ERROR: "[Ţrâñšâçţîöñ þröçëššîñg ërrör öççürrëd]", + UNKNOWN_ERROR: "[Üñknöwñ ërrör öççürrëd îñ šÿšţëm]", + FULFILLMENT_CREATION_ERROR: "[Füllfîllmëñţ çrëâţîöñ ërrör öççürrëd]", + TAX_CALCULATION_ERROR: "[Ţâx çâlçülâţîöñ ërrör öççürrëd]", + ADDRESS_VERIFICATION_ERROR: "[Âddrëšš vërîfîçâţîöñ ërrör öççürrëd]", + ADDRESS_MATCHES_ERROR: "[Âddrëšš mâţçhëš ërrör öççürrëd]", + SHIPPING_CONFLICT_ERROR: "[Šhîþþîñg çönflîçţ ërrör öççürrëd]", + SHIPPING_ERROR: "[Gëñërâl šhîþþîñg ërrör öççürrëd]", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "[Þrîçë âdjüšţmëñţ çâlçülâţîöñ ërrör]", + ORDER_FETCH_ERROR: "[Ördër fëţçh ërrör öççürrëd]", + DRAFT_ORDER_UPDATE_ERROR: "[Drâfţ ördër üþdâţë ërrör öççürrëd]", + DISCOUNT_APPLICATION_ERROR: "[Çöüþöñ âþþlîçâţîöñ ërrör öççürrëd]", + DRAFT_ORDER_OPEN_ERROR: "[Drâfţ ördër öþëñ ërrör öççürrëd]", + ORDER_UPDATE_ERROR: "[Ördër üþdâţë ërrör öççürrëd]", + CATALOG_FETCH_ERROR: "[Çâţâlög fëţçh ërrör öççürrëd]", + STORE_ID_NOT_FOUND: "[Šţörë ÎD ñöţ föüñd îñ šÿšţëm]", + ORDER_NOT_DRAFT: "[Ördër îš ñöţ îñ drâfţ šţâţüš]", + NO_LINE_ITEMS: "[Ñö lîñë îţëmš föüñd îñ ördër]", + BAD_USER_INPUT: "[Bâd üšër îñþüţ þrövîdëd]", + MISSING_SHIPPING_ADDRESS: "[Šhîþþîñg âddrëšš îš rëqüîrëd]", + MISSING_REQUIRED_FIELD: "[Rëqüîrëd fîëld îš mîššîñg]", + CATALOG_API_ERROR: "[Çâţâlög šërvîçë ërrör öççürrëd]", + TAX_SERVICE_UNAVAILABLE: "[Ţâx šërvîçë îš üñâvâîlâblë]", + SHIPPING_SERVICE_UNAVAILABLE: "[Šhîþþîñg šërvîçë îš üñâvâîlâblë]", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "[Þrîçë âdjüšţmëñţš šërvîçë îš üñâvâîlâblë]", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: + "[Fâîlëd ţö çâlçülâţë þrîçë âdjüšţmëñţš]", + SERVICE_UNAVAILABLE: "[Šërvîçë îš ţëmþörârîlÿ üñâvâîlâblë]", + RATE_LIMITED: "[Ţöö mâñÿ rëqüëšţš, þlëâšë ţrÿ âgâîñ lâţër]", + TIMEOUT: "[Rëqüëšţ ţîmëd öüţ]", + INTERNAL_ERROR: "[Îñţërñâl šërvër ërrör öççürrëd]", + SHIPPING_POSTAL_CODE_REQUIRED: "[Šhîþþîñg þöšţâl çödë îš rëqüîrëd]", + SHIPPING_COUNTRY_CODE_REQUIRED: "[Šhîþþîñg çöüñţrÿ çödë îš rëqüîrëd]", + SHIPPING_METHOD_REQUIRED: "[Šhîþþîñg mëţhöd îš rëqüîrëd]", + SHIPPING_ADDRESS_VERIFICATION_FAILED: + "[Šhîþþîñg âddrëšš vërîfîçâţîöñ fâîlëd]", + BILLING_ADDRESS_VERIFICATION_FAILED: + "[Bîllîñg âddrëšš vërîfîçâţîöñ fâîlëd]", + }, +}; diff --git a/packages/localizations/src/trTr.ts b/packages/localizations/src/trTr.ts new file mode 100644 index 00000000..1093ef3f --- /dev/null +++ b/packages/localizations/src/trTr.ts @@ -0,0 +1,316 @@ +export const trTr = { + general: { + optional: "isteğe bağlı", + notes: "Notlar", + quantity: "Miktar", + free: "ÜCRETSİZ", + closed: "Kapalı", + apply: "Uygula", + checkoutDisabled: + "Ödeme işlemi şu anda devre dışı. Yaşanan rahatsızlık için özür dileriz.", + }, + contact: { + title: "İletişim", + description: "", + email: "E-posta", + }, + pickup: { + title: "Mağazadan Teslim Alma", + description: + "Belirlediğiniz teslim alma saatini karşılamak için her türlü çaba gösterilecektir. Gerçek teslim alma saatleri değişebilir.", + location: "Teslim Alma Yeri", + date: "Teslim Alma Tarihi", + time: "Tercih Edilen Teslim Alma Saati", + selectStore: "Bir mağaza konumu seçin", + selectDate: "Bir tarih seçin", + selectTime: "Bir teslim alma saati seçin", + storeHours: "Mağaza Saatleri", + seeDetails: "Detayları görüntüle", + noTimeSlots: + "Seçilen tarih için uygun zaman dilimi bulunmamaktadır. Lütfen başka bir tarih seçin.", + hoursDisplayed: "Saatler yerel saat diliminizde gösterilmektedir.", + storeOperatesIn: "Mağaza {timezone} saat diliminde çalışmaktadır.", + asap: "EN KISA SÜREDE", + hour: "saat", + hours: "saat", + minutes: "dakika", + searchCountry: "Ülke ara...", + noCountryFound: "Ülke bulunamadı.", + }, + days: { + sunday: "Pazar", + monday: "Pazartesi", + tuesday: "Salı", + wednesday: "Çarşamba", + thursday: "Perşembe", + friday: "Cuma", + saturday: "Cumartesi", + }, + delivery: { + title: "Teslimat", + method: "Teslimat yöntemi", + shipping: "Kargo", + shipToAddress: "Adresinize kargo gönderin", + localPickup: "Mağazadan Teslim Alma", + pickupFromStore: "Mağaza konumundan teslim alın", + }, + tips: { + title: "Bahşiş ekleyin", + noTip: "Bahşiş Yok", + customAmount: "Özel Tutar", + customTipAmount: "Özel Bahşiş Tutarı", + placeholder: "₺0,00", + }, + shipping: { + title: "Kargo", + description: "Kargo adresi", + method: "Kargo yöntemi", + noShippingMethodAddress: + "Mevcut kargo yöntemlerini görmek için adresinizi girin.", + noShippingMethods: "Kargo yöntemi bulunamadı.", + phone: "Telefon Numarası", + country: "Ülke", + selectCountry: "Ülke seçin", + searchCountry: "Ülke ara...", + noCountryFound: "Ülke bulunamadı", + firstName: "Ad", + lastName: "Soyad", + address1: "Adres", + address2: "Daire, apartman vb. (isteğe bağlı)", + city: "Şehir", + region: "İl/Bölge", + postalCode: "Posta Kodu", + notesPlaceholder: "Notlar veya özel talimatlar", + addressSuggestion: "Şunu mu demek istediniz", + addressSuggestionEnd: "?", + noShippingOriginAddress: "Kargo çıkış adresi sağlanmamış.", + }, + billing: { + title: "Faturalama", + description: "Faturalama açıklaması", + }, + payment: { + title: "Ödeme", + description: "Tüm ödemeler güvenli ve şifrelidir.", + billingAddress: { + title: "Fatura Adresi", + description: "Fatura adresinizi girin.", + useShippingAddress: "Kargo adresini fatura adresi olarak kullan", + }, + methods: { + creditCard: "Kredi veya Banka Kartı", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Çevrimdışı ödemeler", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "Kullanılabilir ödeme yöntemi yok", + cardNumber: "Kart numarası", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Son kullanma tarihi (AA / YY)", + securityCode: "Güvenlik kodu", + cvvPlaceholder: "CVV", + nameOnCard: "Kart üzerindeki isim", + payNow: "Şimdi öde", + standardShipping: "Standart Kargo", + cardDetails: "Kart detayları", + payWithApplePay: "Apple Pay ile öde", + expirationDatePlaceholder: "AA / YY", + failedToInitializePayment: "Ödeme başlatılamadı.", + orderTotal: "Sipariş Toplamı", + subtotal: "Ara Toplam", + tax: "Vergi", + shipping: "Kargo", + discount: "Kupon", + processingPayment: "Ödeme işleniyor...", + completingOrder: "Sipariş tamamlanıyor...", + freePayment: "Ücretsiz siparişinizi tamamlayın", + }, + phone: { + placeholder: "(212) 555-1234", + searchCountry: "Ülke ara...", + noCountryFound: "Ülke bulunamadı.", + }, + discounts: { + placeholder: "Kupon kodu", + enterCode: "Kupon kodu girin", + apply: "Uygula", + alreadyApplied: "Bu kupon kodu zaten uygulanmış", + failedToApply: "Kupon kodu uygulanamadı", + enterCodeValidation: "Lütfen bir kupon kodu girin", + }, + totals: { + subtotal: "Ara Toplam", + discount: "İndirim", + shipping: "Kargo", + tip: "Bahşiş", + estimatedTaxes: "Tahmini vergiler", + totalDue: "Ödenecek Toplam", + orderSummary: "Sipariş Özeti", + itemCount: "ürün", + noItems: "Ürün yok", + }, + lineItems: { + note: "Not:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Adres", + suggestions: "Öneriler", + }, + form: { + useFormFieldError: "useFormField içinde kullanılmalıdır", + }, + pagination: { + ariaLabel: "sayfalama", + previousPageAriaLabel: "Önceki sayfaya git", + previous: "Önceki", + nextPageAriaLabel: "Sonraki sayfaya git", + next: "Sonraki", + morePages: "Daha fazla sayfa", + }, + sidebar: { + useSidebarError: "useSidebar bir SidebarProvider içinde kullanılmalıdır.", + toggleSidebar: "Kenar Çubuğunu Aç/Kapat", + }, + accessibility: { + payWithApplePay: "Apple Pay ile öde", + applePayLogo: "Apple Pay Logosu", + }, + }, + errors: { + failedToGetAccessToken: "Erişim belirteci alınamadı", + invalidEnvironment: "Geçersiz ortam", + noPublicAccessToken: "Genel erişim belirteci sağlanmamış", + noSessionToken: "Oturum belirteci veya kimliği sağlanmamış", + errorCreatingSession: "Ödeme oturumu oluşturma hatası:", + orderIdRequired: "Sipariş kimliği gerekli", + errorTrackingEvent: "Olay izleme hatası", + errorInTrackingSubscriber: "İzleme abonesi hatası", + useTrackingProviderError: + "useTracking bir TrackingProvider içinde kullanılmalıdır", + usePoyntCollectProviderError: + "usePoyntCollect bir PoyntCollectProvider içinde kullanılmalıdır", + useSquareProviderError: + "useSquare bir SquareProvider içinde kullanılmalıdır", + errorProcessingPayment: "Ödeme işleme hatası", + stripeConfigMissing: + "Stripe yapılandırması eksik. Lütfen kurulumunuzu kontrol edin.", + paymentSuccessful: "Ödeme başarılı", + paymentFailed: "Ödeme başarısız", + paypalConfigMissing: + "PayPal yapılandırması eksik. Lütfen kurulumunuzu kontrol edin.", + stripeNotReady: "Stripe hazır değil", + cardElementNotFound: "CardElement bulunamadı", + errorProcessingCardPayment: "Kart ödemesi işleme hatası.", + errorProcessingExpressPayment: "Hızlı ödeme işleme hatası.", + failedToInitializePayment: "Ödeme başlatılamadı.", + invalidPhoneNumber: "geçersiz telefon numarası", + }, + validation: { + phoneRequired: "Telefon numarası gerekli", + emailRequired: "E-posta girin", + emailInvalid: "Geçerli bir e-posta girin", + phoneTooLong: "Telefon numarası çok uzun", + invalidShippingAddress: "Geçersiz kargo adresi", + invalidBillingAddress: "Geçersiz fatura adresi", + selectPaymentMethod: "Bir ödeme yöntemi seçin", + enterValidBillingPhone: "Geçerli bir fatura telefon numarası girin", + enterValidShippingPhone: "Geçerli bir kargo telefon numarası girin", + enterFirstName: "Bir ad girin", + enterLastName: "Bir soyad girin", + enterAddress: "Bir adres girin", + enterCity: "Bir şehir girin", + enterZipCode: "Bir posta kodu girin", + enterZipPostalCode: "Bir posta kodu girin", + selectState: "Bir il/eyalet seçin", + selectCountry: "Bir ülke seçin", + enterCountry: "Bir ülke girin", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Sunucu hatası", + SESSION_NOT_FOUND: "Oturum bulunamadı", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Ödeme oturumu alınamadı", + CHECKOUT_SESSION_NOT_FOUND: "Ödeme oturumu bulunamadı", + CHECKOUT_SESSION_FETCH_ERROR: "Genel ödeme oturumu alma hatası", + DRAFT_ORDER_NOT_FOUND: "Taslak sipariş bulunamadı", + CHECKOUT_SESSION_CREATION_FAILED: "Ödeme oturumu oluşturulamadı", + CREATED_SESSION_DATA_NOT_FOUND: "Oluşturulan oturum verisi bulunamadı", + CHECKOUT_SESSION_CREATION_ERROR: "Genel ödeme oturumu oluşturma hatası", + CHECKOUT_SESSION_UPDATE_FAILED: "Ödeme oturumu güncellenemedi", + UPDATED_SESSION_NOT_FOUND: "Güncellenmiş oturum bulunamadı", + CHECKOUT_SESSION_UPDATE_ERROR: "Genel ödeme oturumu güncelleme hatası", + ORDER_API_NOT_FOUND: "Sipariş API veri kaynağı bulunamadı", + DRAFT_ORDER_RETRIEVAL_FAILED: "Taslak sipariş alınamadı", + DATA_SOURCES_NOT_FOUND: "Veri kaynakları bulunamadı", + TRANSACTION_API_NOT_FOUND: "İşlem API veri kaynağı bulunamadı", + TRANSACTION_PROCESSING_FAILED: "İşlem işlenemedi", + TRANSACTION_CREATION_FAILED: "İşlem bulunamadı veya oluşturulamadı", + ORDER_OPENING_FAILED: "Sipariş açılamadı", + INVALID_FULFILLMENT_LOCATION: "Geçersiz karşılama konumu", + NO_VALID_PICKUP_LOCATION: "Geçerli teslim alma konumu mevcut değil", + DRAFT_ORDER_FETCH_FAILED: "Taslak sipariş alınamadı", + LINE_ITEMS_FETCH_FAILED: "Satır öğeleri alınamadı", + CURRENT_ORDER_FETCH_FAILED: "Mevcut taslak sipariş alınamadı", + DRAFT_ORDER_UPDATE_FAILED: "Taslak sipariş güncellenemedi", + DISCOUNT_APPLICATION_FAILED: "Kupon uygulanamadı", + CONTEXT_UNAVAILABLE: "Oturum veya veri kaynakları mevcut değil", + SHIPPING_LINES_UPDATE_FAILED: "Kargo satırları güncellenemedi", + ORDER_TOTALS_UPDATE_FAILED: "Sipariş toplamları güncellenemedi", + SHIPPING_METHOD_APPLICATION_FAILED: "Kargo yöntemi uygulanamadı", + SKU_FETCH_FAILED: "SKU'lar alınamadı", + SHIPPING_RATES_CALCULATION_FAILED: "Kargo ücretleri hesaplanamadı", + SHIPPING_METHOD_NOT_FOUND: "Kargo yöntemi bulunamadı", + SHIPPING_METHOD_REMOVAL_FAILED: "Kargo yöntemi kaldırılamadı", + SHIPPING_ADDRESS_REQUIRED: "Kargo adresi gerekli", + INVENTORY_VALIDATION_ERROR: "Envanter doğrulama hatası", + INSUFFICIENT_INVENTORY: "Yetersiz envanter", + INVALID_ORDER_STATUS: "Geçersiz sipariş durumu", + TRANSACTION_CREATION_ERROR: "İşlem oluşturma hatası", + TRANSACTION_PROCESSING_ERROR: "İşlem işleme hatası", + UNKNOWN_ERROR: "Bilinmeyen hata", + FULFILLMENT_CREATION_ERROR: "Karşılama oluşturma hatası", + TAX_CALCULATION_ERROR: "Vergi hesaplama hatası", + ADDRESS_VERIFICATION_ERROR: "Adres doğrulama hatası", + ADDRESS_MATCHES_ERROR: "Adres eşleşme hatası", + SHIPPING_CONFLICT_ERROR: "Kargo çakışma hatası", + SHIPPING_ERROR: "Genel kargo hatası", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Fiyat ayarlama hesaplama hatası", + ORDER_FETCH_ERROR: "Sipariş alma hatası", + DRAFT_ORDER_UPDATE_ERROR: "Taslak sipariş güncelleme hatası", + DISCOUNT_APPLICATION_ERROR: "Kupon uygulama hatası", + DRAFT_ORDER_OPEN_ERROR: "Taslak sipariş açma hatası", + ORDER_UPDATE_ERROR: "Sipariş güncelleme hatası", + CATALOG_FETCH_ERROR: "Katalog alma hatası", + STORE_ID_NOT_FOUND: "Mağaza ID'si bulunamadı", + ORDER_NOT_DRAFT: "Sipariş taslak durumunda değil", + NO_LINE_ITEMS: "Hiç ürün bulunamadı", + BAD_USER_INPUT: "Geçersiz kullanıcı girişi", + MISSING_SHIPPING_ADDRESS: "Teslimat adresi gerekli", + MISSING_REQUIRED_FIELD: "Zorunlu alan eksik", + CATALOG_API_ERROR: "Katalog servisi hatası", + TAX_SERVICE_UNAVAILABLE: "Vergi servisi kullanılamıyor", + SHIPPING_SERVICE_UNAVAILABLE: "Kargo servisi kullanılamıyor", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Fiyat ayarlama servisi kullanılamıyor", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: "Fiyat ayarlamaları hesaplanamadı", + SERVICE_UNAVAILABLE: "Servis geçici olarak kullanılamıyor", + RATE_LIMITED: "Çok fazla istek, lütfen daha sonra tekrar deneyin", + TIMEOUT: "İstek zaman aşımına uğradı", + INTERNAL_ERROR: "Sunucu içi hatası", + SHIPPING_POSTAL_CODE_REQUIRED: "Kargo posta kodu gerekli", + SHIPPING_COUNTRY_CODE_REQUIRED: "Kargo ülke kodu gerekli", + SHIPPING_METHOD_REQUIRED: "Kargo yöntemi gerekli", + SHIPPING_ADDRESS_VERIFICATION_FAILED: "Kargo adresi doğrulaması başarısız", + BILLING_ADDRESS_VERIFICATION_FAILED: "Fatura adresi doğrulaması başarısız", + }, +}; diff --git a/packages/localizations/src/viVn.ts b/packages/localizations/src/viVn.ts new file mode 100644 index 00000000..138e65d6 --- /dev/null +++ b/packages/localizations/src/viVn.ts @@ -0,0 +1,316 @@ +export const viVn = { + general: { + optional: "tùy chọn", + notes: "Ghi chú", + quantity: "Số lượng", + free: "MIỄN PHÍ", + closed: "Đóng cửa", + apply: "Áp dụng", + checkoutDisabled: + "Thanh toán hiện tại đang bị vô hiệu hóa. Chúng tôi xin lỗi vì sự bất tiện này.", + }, + contact: { + title: "Liên hệ", + description: "", + email: "Email", + }, + pickup: { + title: "Nhận hàng tại cửa hàng", + description: + "Chúng tôi sẽ cố gắng hết sức để đáp ứng thời gian nhận hàng mong muốn của bạn. Thời gian nhận hàng thực tế có thể thay đổi.", + location: "Địa điểm nhận hàng", + date: "Ngày nhận hàng", + time: "Thời gian nhận hàng ưa thích", + selectStore: "Chọn một địa điểm cửa hàng", + selectDate: "Chọn ngày", + selectTime: "Chọn thời gian nhận hàng", + storeHours: "Giờ mở cửa", + seeDetails: "Xem chi tiết", + noTimeSlots: + "Không có khung thời gian nào trong ngày đã chọn. Vui lòng chọn ngày khác.", + hoursDisplayed: "Giờ hiển thị theo múi giờ địa phương của bạn.", + storeOperatesIn: "Cửa hàng hoạt động trong múi giờ {timezone}.", + asap: "CÀNG SỚM CÀNG TỐT", + hour: "giờ", + hours: "giờ", + minutes: "phút", + searchCountry: "Tìm kiếm quốc gia...", + noCountryFound: "Không tìm thấy quốc gia.", + }, + days: { + sunday: "Chủ nhật", + monday: "Thứ hai", + tuesday: "Thứ ba", + wednesday: "Thứ tư", + thursday: "Thứ năm", + friday: "Thứ sáu", + saturday: "Thứ bảy", + }, + delivery: { + title: "Giao hàng", + method: "Phương thức giao hàng", + shipping: "Vận chuyển", + shipToAddress: "Giao đến địa chỉ của bạn", + localPickup: "Nhận hàng tại cửa hàng", + pickupFromStore: "Nhận tại địa điểm cửa hàng", + }, + tips: { + title: "Thêm tiền tip", + noTip: "Không tip", + customAmount: "Số tiền tùy chỉnh", + customTipAmount: "Số tiền tip tùy chỉnh", + placeholder: "0₫", + }, + shipping: { + title: "Vận chuyển", + description: "Địa chỉ giao hàng", + method: "Phương thức vận chuyển", + noShippingMethodAddress: + "Nhập địa chỉ của bạn để xem các phương thức vận chuyển có sẵn.", + noShippingMethods: "Không tìm thấy phương thức vận chuyển nào.", + phone: "Số điện thoại", + country: "Quốc gia", + selectCountry: "Chọn quốc gia", + searchCountry: "Tìm kiếm quốc gia...", + noCountryFound: "Không tìm thấy quốc gia", + firstName: "Tên", + lastName: "Họ", + address1: "Địa chỉ", + address2: "Căn hộ, tầng, v.v. (tùy chọn)", + city: "Thành phố", + region: "Tỉnh/Thành phố", + postalCode: "Mã bưu điện", + notesPlaceholder: "Ghi chú hoặc hướng dẫn đặc biệt", + addressSuggestion: "Ý bạn có phải là", + addressSuggestionEnd: "?", + noShippingOriginAddress: "Không có địa chỉ gốc vận chuyển được cung cấp.", + }, + billing: { + title: "Thanh toán", + description: "Mô tả thanh toán", + }, + payment: { + title: "Thanh toán", + description: "Tất cả thanh toán đều được bảo mật và mã hóa.", + billingAddress: { + title: "Địa chỉ thanh toán", + description: "Nhập địa chỉ thanh toán của bạn.", + useShippingAddress: "Sử dụng địa chỉ giao hàng làm địa chỉ thanh toán", + }, + methods: { + creditCard: "Thẻ tín dụng hoặc thẻ ghi nợ", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "Thanh toán ngoại tuyến", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "Không có phương thức thanh toán nào", + cardNumber: "Số thẻ", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "Ngày hết hạn (MM / YY)", + securityCode: "Mã bảo mật", + cvvPlaceholder: "CVV", + nameOnCard: "Tên trên thẻ", + payNow: "Thanh toán ngay", + standardShipping: "Vận chuyển tiêu chuẩn", + cardDetails: "Chi tiết thẻ", + payWithApplePay: "Thanh toán bằng Apple Pay", + expirationDatePlaceholder: "MM / YY", + failedToInitializePayment: "Không thể khởi tạo thanh toán.", + orderTotal: "Tổng đơn hàng", + subtotal: "Tạm tính", + tax: "Thuế", + shipping: "Vận chuyển", + discount: "Phiếu giảm giá", + processingPayment: "Đang xử lý thanh toán...", + completingOrder: "Đang hoàn tất đơn hàng...", + freePayment: "Hoàn tất đơn hàng miễn phí của bạn", + }, + phone: { + placeholder: "(84) 123-456-789", + searchCountry: "Tìm kiếm quốc gia...", + noCountryFound: "Không tìm thấy quốc gia.", + }, + discounts: { + placeholder: "Mã phiếu giảm giá", + enterCode: "Nhập mã phiếu giảm giá", + apply: "Áp dụng", + alreadyApplied: "Mã phiếu giảm giá này đã được áp dụng", + failedToApply: "Không thể áp dụng mã phiếu giảm giá", + enterCodeValidation: "Vui lòng nhập mã phiếu giảm giá", + }, + totals: { + subtotal: "Tạm tính", + discount: "Giảm giá", + shipping: "Vận chuyển", + tip: "Tip", + estimatedTaxes: "Thuế ước tính", + totalDue: "Tổng cộng", + orderSummary: "Tóm tắt đơn hàng", + itemCount: "sản phẩm", + noItems: "Không có sản phẩm", + }, + lineItems: { + note: "Ghi chú:", + }, + ui: { + autocomplete: { + addressPlaceholder: "Địa chỉ", + suggestions: "Gợi ý", + }, + form: { + useFormFieldError: "useFormField phải được sử dụng trong ", + }, + pagination: { + ariaLabel: "phân trang", + previousPageAriaLabel: "Đi đến trang trước", + previous: "Trước", + nextPageAriaLabel: "Đi đến trang tiếp theo", + next: "Tiếp theo", + morePages: "Thêm trang", + }, + sidebar: { + useSidebarError: "useSidebar phải được sử dụng trong SidebarProvider.", + toggleSidebar: "Bật/Tắt thanh bên", + }, + accessibility: { + payWithApplePay: "Thanh toán bằng Apple Pay", + applePayLogo: "Logo Apple Pay", + }, + }, + errors: { + failedToGetAccessToken: "Không thể lấy mã truy cập", + invalidEnvironment: "Môi trường không hợp lệ", + noPublicAccessToken: "Không có mã truy cập công khai được cung cấp", + noSessionToken: "Không có mã phiên hoặc ID được cung cấp", + errorCreatingSession: "Lỗi tạo phiên thanh toán:", + orderIdRequired: "ID đơn hàng là bắt buộc", + errorTrackingEvent: "Lỗi theo dõi sự kiện", + errorInTrackingSubscriber: "Lỗi trong người đăng ký theo dõi", + useTrackingProviderError: + "useTracking phải được sử dụng trong TrackingProvider", + usePoyntCollectProviderError: + "usePoyntCollect phải được sử dụng trong PoyntCollectProvider", + useSquareProviderError: "useSquare phải được sử dụng trong SquareProvider", + errorProcessingPayment: "Lỗi xử lý thanh toán", + stripeConfigMissing: + "Cấu hình Stripe bị thiếu. Vui lòng kiểm tra thiết lập của bạn.", + paymentSuccessful: "Thanh toán thành công", + paymentFailed: "Thanh toán thất bại", + paypalConfigMissing: + "Cấu hình PayPal bị thiếu. Vui lòng kiểm tra thiết lập của bạn.", + stripeNotReady: "Stripe chưa sẵn sàng", + cardElementNotFound: "Không tìm thấy CardElement", + errorProcessingCardPayment: "Lỗi xử lý thanh toán thẻ.", + errorProcessingExpressPayment: "Lỗi xử lý thanh toán nhanh.", + failedToInitializePayment: "Không thể khởi tạo thanh toán.", + invalidPhoneNumber: "số điện thoại không hợp lệ", + }, + validation: { + phoneRequired: "Số điện thoại là bắt buộc", + emailRequired: "Nhập email", + emailInvalid: "Nhập email hợp lệ", + phoneTooLong: "Số điện thoại quá dài", + invalidShippingAddress: "Địa chỉ giao hàng không hợp lệ", + invalidBillingAddress: "Địa chỉ thanh toán không hợp lệ", + selectPaymentMethod: "Chọn phương thức thanh toán", + enterValidBillingPhone: "Nhập số điện thoại thanh toán hợp lệ", + enterValidShippingPhone: "Nhập số điện thoại giao hàng hợp lệ", + enterFirstName: "Nhập tên", + enterLastName: "Nhập họ", + enterAddress: "Nhập địa chỉ", + enterCity: "Nhập thành phố", + enterZipCode: "Nhập mã ZIP", + enterZipPostalCode: "Nhập mã ZIP / bưu điện", + selectState: "Chọn tỉnh/thành phố", + selectCountry: "Chọn quốc gia", + enterCountry: "Nhập quốc gia", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "Lỗi máy chủ", + SESSION_NOT_FOUND: "Không tìm thấy phiên", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "Không thể truy xuất phiên thanh toán", + CHECKOUT_SESSION_NOT_FOUND: "Không tìm thấy phiên thanh toán", + CHECKOUT_SESSION_FETCH_ERROR: "Lỗi truy xuất phiên thanh toán chung", + DRAFT_ORDER_NOT_FOUND: "Không tìm thấy đơn hàng nháp", + CHECKOUT_SESSION_CREATION_FAILED: "Không thể tạo phiên thanh toán", + CREATED_SESSION_DATA_NOT_FOUND: "Không tìm thấy dữ liệu phiên đã tạo", + CHECKOUT_SESSION_CREATION_ERROR: "Lỗi tạo phiên thanh toán chung", + CHECKOUT_SESSION_UPDATE_FAILED: "Không thể cập nhật phiên thanh toán", + UPDATED_SESSION_NOT_FOUND: "Không tìm thấy phiên đã cập nhật", + CHECKOUT_SESSION_UPDATE_ERROR: "Lỗi cập nhật phiên thanh toán chung", + ORDER_API_NOT_FOUND: "Không tìm thấy nguồn dữ liệu API đơn hàng", + DRAFT_ORDER_RETRIEVAL_FAILED: "Không thể truy xuất đơn hàng nháp", + DATA_SOURCES_NOT_FOUND: "Không tìm thấy nguồn dữ liệu", + TRANSACTION_API_NOT_FOUND: "Không tìm thấy nguồn dữ liệu API giao dịch", + TRANSACTION_PROCESSING_FAILED: "Không thể xử lý giao dịch", + TRANSACTION_CREATION_FAILED: "Không thể tìm hoặc tạo giao dịch", + ORDER_OPENING_FAILED: "Không thể mở đơn hàng", + INVALID_FULFILLMENT_LOCATION: "Địa điểm thực hiện không hợp lệ", + NO_VALID_PICKUP_LOCATION: "Không có địa điểm nhận hàng hợp lệ", + DRAFT_ORDER_FETCH_FAILED: "Không thể tải đơn hàng nháp", + LINE_ITEMS_FETCH_FAILED: "Không thể tải các mặt hàng", + CURRENT_ORDER_FETCH_FAILED: "Không thể tải đơn hàng nháp hiện tại", + DRAFT_ORDER_UPDATE_FAILED: "Không thể cập nhật đơn hàng nháp", + DISCOUNT_APPLICATION_FAILED: "Không thể áp dụng phiếu giảm giá", + CONTEXT_UNAVAILABLE: "Phiên hoặc nguồn dữ liệu không có sẵn", + SHIPPING_LINES_UPDATE_FAILED: "Không thể cập nhật dòng vận chuyển", + ORDER_TOTALS_UPDATE_FAILED: "Không thể cập nhật tổng đơn hàng", + SHIPPING_METHOD_APPLICATION_FAILED: + "Không thể áp dụng phương thức vận chuyển", + SKU_FETCH_FAILED: "Không thể tải SKU", + SHIPPING_RATES_CALCULATION_FAILED: "Không thể tính phí vận chuyển", + SHIPPING_METHOD_NOT_FOUND: "Không tìm thấy phương thức vận chuyển", + SHIPPING_METHOD_REMOVAL_FAILED: "Không thể xóa phương thức vận chuyển", + SHIPPING_ADDRESS_REQUIRED: "Cần có địa chỉ giao hàng", + INVENTORY_VALIDATION_ERROR: "Lỗi xác thực hàng tồn kho", + INSUFFICIENT_INVENTORY: "Hàng tồn kho không đủ", + INVALID_ORDER_STATUS: "Trạng thái đơn hàng không hợp lệ", + TRANSACTION_CREATION_ERROR: "Lỗi tạo giao dịch", + TRANSACTION_PROCESSING_ERROR: "Lỗi xử lý giao dịch", + UNKNOWN_ERROR: "Lỗi không xác định", + FULFILLMENT_CREATION_ERROR: "Lỗi tạo thực hiện", + TAX_CALCULATION_ERROR: "Lỗi tính thuế", + ADDRESS_VERIFICATION_ERROR: "Lỗi xác minh địa chỉ", + ADDRESS_MATCHES_ERROR: "Lỗi khớp địa chỉ", + SHIPPING_CONFLICT_ERROR: "Lỗi xung đột vận chuyển", + SHIPPING_ERROR: "Lỗi vận chuyển chung", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "Lỗi tính điều chỉnh giá", + ORDER_FETCH_ERROR: "Lỗi tải đơn hàng", + DRAFT_ORDER_UPDATE_ERROR: "Lỗi cập nhật đơn hàng nháp", + DISCOUNT_APPLICATION_ERROR: "Lỗi áp dụng phiếu giảm giá", + DRAFT_ORDER_OPEN_ERROR: "Lỗi mở đơn hàng nháp", + ORDER_UPDATE_ERROR: "Lỗi cập nhật đơn hàng", + CATALOG_FETCH_ERROR: "Lỗi tải danh mục", + STORE_ID_NOT_FOUND: "Không tìm thấy ID cửa hàng", + ORDER_NOT_DRAFT: "Đơn hàng không ở trạng thái nháp", + NO_LINE_ITEMS: "Không tìm thấy sản phẩm nào", + BAD_USER_INPUT: "Dữ liệu đầu vào không hợp lệ", + MISSING_SHIPPING_ADDRESS: "Địa chỉ giao hàng là bắt buộc", + MISSING_REQUIRED_FIELD: "Thiếu trường bắt buộc", + CATALOG_API_ERROR: "Lỗi dịch vụ danh mục", + TAX_SERVICE_UNAVAILABLE: "Dịch vụ thuế không khả dụng", + SHIPPING_SERVICE_UNAVAILABLE: "Dịch vụ vận chuyển không khả dụng", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: + "Dịch vụ điều chỉnh giá không khả dụng", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: "Không thể tính toán điều chỉnh giá", + SERVICE_UNAVAILABLE: "Dịch vụ tạm thời không khả dụng", + RATE_LIMITED: "Quá nhiều yêu cầu, vui lòng thử lại sau", + TIMEOUT: "Yêu cầu hết thời gian chờ", + INTERNAL_ERROR: "Lỗi máy chủ nội bộ", + SHIPPING_POSTAL_CODE_REQUIRED: "Mã bưu điện giao hàng là bắt buộc", + SHIPPING_COUNTRY_CODE_REQUIRED: "Mã quốc gia giao hàng là bắt buộc", + SHIPPING_METHOD_REQUIRED: "Phương thức giao hàng là bắt buộc", + SHIPPING_ADDRESS_VERIFICATION_FAILED: "Xác minh địa chỉ giao hàng thất bại", + BILLING_ADDRESS_VERIFICATION_FAILED: "Xác minh địa chỉ thanh toán thất bại", + }, +}; diff --git a/packages/localizations/src/zhCn.ts b/packages/localizations/src/zhCn.ts new file mode 100644 index 00000000..88660035 --- /dev/null +++ b/packages/localizations/src/zhCn.ts @@ -0,0 +1,307 @@ +export const zhCn = { + general: { + optional: "可选", + notes: "备注", + quantity: "数量", + free: "免费", + closed: "已关闭", + apply: "应用", + checkoutDisabled: "结账功能暂时不可用。为此造成的不便,我们深表歉意。", + }, + contact: { + title: "联系方式", + description: "", + email: "邮箱", + }, + pickup: { + title: "到店自提", + description: "我们将尽力满足您期望的取货时间。实际取货时间可能有所变化。", + location: "取货地点", + date: "取货日期", + time: "首选取货时间", + selectStore: "选择门店位置", + selectDate: "选择日期", + selectTime: "选择取货时间", + storeHours: "营业时间", + seeDetails: "查看详情", + noTimeSlots: "所选日期没有可用的时间段。请选择其他日期。", + hoursDisplayed: "显示时间为您所在的时区。", + storeOperatesIn: "门店营业时区为 {timezone}。", + asap: "尽快", + hour: "小时", + hours: "小时", + minutes: "分钟", + searchCountry: "搜索国家...", + noCountryFound: "未找到国家。", + }, + days: { + sunday: "星期日", + monday: "星期一", + tuesday: "星期二", + wednesday: "星期三", + thursday: "星期四", + friday: "星期五", + saturday: "星期六", + }, + delivery: { + title: "配送", + method: "配送方式", + shipping: "快递配送", + shipToAddress: "配送到您的地址", + localPickup: "到店自提", + pickupFromStore: "到门店取货", + }, + tips: { + title: "添加小费", + noTip: "无小费", + customAmount: "自定义金额", + customTipAmount: "自定义小费金额", + placeholder: "¥0.00", + }, + shipping: { + title: "配送", + description: "配送地址", + method: "配送方式", + noShippingMethodAddress: "请输入您的地址以查看可用的配送方式。", + noShippingMethods: "未找到配送方式。", + phone: "手机号码", + country: "国家", + selectCountry: "选择国家", + searchCountry: "搜索国家...", + noCountryFound: "未找到国家", + firstName: "名", + lastName: "姓", + address1: "地址", + address2: "公寓、套房等(可选)", + city: "城市", + region: "省/自治区/直辖市", + postalCode: "邮政编码", + notesPlaceholder: "备注或特殊说明", + addressSuggestion: "您是否指的是", + addressSuggestionEnd: "?", + noShippingOriginAddress: "未提供配送起始地址。", + }, + billing: { + title: "账单", + description: "账单说明", + }, + payment: { + title: "付款", + description: "所有付款均经过安全加密。", + billingAddress: { + title: "账单地址", + description: "请输入您的账单地址。", + useShippingAddress: "使用配送地址作为账单地址", + }, + methods: { + creditCard: "信用卡或储蓄卡", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "线下付款", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "暂无可用的付款方式", + cardNumber: "卡号", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "有效期(MM / YY)", + securityCode: "安全码", + cvvPlaceholder: "CVV", + nameOnCard: "持卡人姓名", + payNow: "立即付款", + standardShipping: "标准配送", + cardDetails: "卡片详情", + payWithApplePay: "使用 Apple Pay 付款", + expirationDatePlaceholder: "MM / YY", + failedToInitializePayment: "付款初始化失败。", + orderTotal: "订单总计", + subtotal: "小计", + tax: "税费", + shipping: "配送费", + discount: "优惠券", + processingPayment: "正在处理付款...", + completingOrder: "正在完成订单...", + freePayment: "完成您的免费订单", + }, + phone: { + placeholder: "13012345678", + searchCountry: "搜索国家...", + noCountryFound: "未找到国家。", + }, + discounts: { + placeholder: "优惠券代码", + enterCode: "输入优惠券代码", + apply: "应用", + alreadyApplied: "此优惠券代码已使用", + failedToApply: "优惠券代码使用失败", + enterCodeValidation: "请输入优惠券代码", + }, + totals: { + subtotal: "小计", + discount: "折扣", + shipping: "配送费", + tip: "小费", + estimatedTaxes: "预估税费", + totalDue: "应付总计", + orderSummary: "订单摘要", + itemCount: "件商品", + noItems: "无商品", + }, + lineItems: { + note: "备注:", + }, + ui: { + autocomplete: { + addressPlaceholder: "地址", + suggestions: "建议", + }, + form: { + useFormFieldError: "useFormField 应在 中使用", + }, + pagination: { + ariaLabel: "分页", + previousPageAriaLabel: "转到上一页", + previous: "上一页", + nextPageAriaLabel: "转到下一页", + next: "下一页", + morePages: "更多页面", + }, + sidebar: { + useSidebarError: "useSidebar 必须在 SidebarProvider 中使用。", + toggleSidebar: "切换侧边栏", + }, + accessibility: { + payWithApplePay: "使用 Apple Pay 付款", + applePayLogo: "Apple Pay 标志", + }, + }, + errors: { + failedToGetAccessToken: "获取访问令牌失败", + invalidEnvironment: "无效环境", + noPublicAccessToken: "未提供公共访问令牌", + noSessionToken: "未提供会话令牌或 ID", + errorCreatingSession: "创建结账会话时出错:", + orderIdRequired: "订单 ID 是必需的", + errorTrackingEvent: "跟踪事件出错", + errorInTrackingSubscriber: "跟踪订阅者出错", + useTrackingProviderError: "useTracking 必须在 TrackingProvider 中使用", + usePoyntCollectProviderError: + "usePoyntCollect 必须在 PoyntCollectProvider 中使用", + useSquareProviderError: "useSquare 必须在 SquareProvider 中使用", + errorProcessingPayment: "处理付款时出错", + stripeConfigMissing: "Stripe 配置缺失。请检查您的设置。", + paymentSuccessful: "付款成功", + paymentFailed: "付款失败", + paypalConfigMissing: "PayPal 配置缺失。请检查您的设置。", + stripeNotReady: "Stripe 未就绪", + cardElementNotFound: "未找到 CardElement", + errorProcessingCardPayment: "处理卡片付款时出错。", + errorProcessingExpressPayment: "处理快捷付款时出错。", + failedToInitializePayment: "付款初始化失败。", + invalidPhoneNumber: "手机号码无效", + }, + validation: { + phoneRequired: "手机号码是必需的", + emailRequired: "请输入邮箱", + emailInvalid: "请输入有效的邮箱", + phoneTooLong: "手机号码过长", + invalidShippingAddress: "配送地址无效", + invalidBillingAddress: "账单地址无效", + selectPaymentMethod: "选择付款方式", + enterValidBillingPhone: "请输入有效的账单手机号码", + enterValidShippingPhone: "请输入有效的配送手机号码", + enterFirstName: "请输入名", + enterLastName: "请输入姓", + enterAddress: "请输入地址", + enterCity: "请输入城市", + enterZipCode: "请输入邮政编码", + enterZipPostalCode: "请输入邮政编码", + selectState: "选择省份/地区", + selectCountry: "选择国家", + enterCountry: "请输入国家", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "服务器错误", + SESSION_NOT_FOUND: "会话未找到", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "获取结账会话失败", + CHECKOUT_SESSION_NOT_FOUND: "结账会话未找到", + CHECKOUT_SESSION_FETCH_ERROR: "结账会话获取错误", + DRAFT_ORDER_NOT_FOUND: "草稿订单未找到", + CHECKOUT_SESSION_CREATION_FAILED: "创建结账会话失败", + CREATED_SESSION_DATA_NOT_FOUND: "创建的会话数据未找到", + CHECKOUT_SESSION_CREATION_ERROR: "结账会话创建错误", + CHECKOUT_SESSION_UPDATE_FAILED: "更新结账会话失败", + UPDATED_SESSION_NOT_FOUND: "更新的会话未找到", + CHECKOUT_SESSION_UPDATE_ERROR: "结账会话更新错误", + ORDER_API_NOT_FOUND: "订单 API 数据源未找到", + DRAFT_ORDER_RETRIEVAL_FAILED: "获取草稿订单失败", + DATA_SOURCES_NOT_FOUND: "数据源未找到", + TRANSACTION_API_NOT_FOUND: "交易 API 数据源未找到", + TRANSACTION_PROCESSING_FAILED: "处理交易失败", + TRANSACTION_CREATION_FAILED: "查找或创建交易失败", + ORDER_OPENING_FAILED: "打开订单失败", + INVALID_FULFILLMENT_LOCATION: "履行地点无效", + NO_VALID_PICKUP_LOCATION: "没有有效的取货地点", + DRAFT_ORDER_FETCH_FAILED: "获取草稿订单失败", + LINE_ITEMS_FETCH_FAILED: "获取订单项目失败", + CURRENT_ORDER_FETCH_FAILED: "获取当前草稿订单失败", + DRAFT_ORDER_UPDATE_FAILED: "更新草稿订单失败", + DISCOUNT_APPLICATION_FAILED: "应用优惠券失败", + CONTEXT_UNAVAILABLE: "会话或数据源不可用", + SHIPPING_LINES_UPDATE_FAILED: "更新配送线路失败", + ORDER_TOTALS_UPDATE_FAILED: "更新订单总计失败", + SHIPPING_METHOD_APPLICATION_FAILED: "应用配送方式失败", + SKU_FETCH_FAILED: "获取 SKU 失败", + SHIPPING_RATES_CALCULATION_FAILED: "计算配送费率失败", + SHIPPING_METHOD_NOT_FOUND: "配送方式未找到", + SHIPPING_METHOD_REMOVAL_FAILED: "移除配送方式失败", + SHIPPING_ADDRESS_REQUIRED: "需要配送地址", + INVENTORY_VALIDATION_ERROR: "库存验证错误", + INSUFFICIENT_INVENTORY: "库存不足", + INVALID_ORDER_STATUS: "订单状态无效", + TRANSACTION_CREATION_ERROR: "交易创建错误", + TRANSACTION_PROCESSING_ERROR: "交易处理错误", + UNKNOWN_ERROR: "未知错误", + FULFILLMENT_CREATION_ERROR: "履行创建错误", + TAX_CALCULATION_ERROR: "税费计算错误", + ADDRESS_VERIFICATION_ERROR: "地址验证错误", + ADDRESS_MATCHES_ERROR: "地址匹配错误", + SHIPPING_CONFLICT_ERROR: "配送冲突错误", + SHIPPING_ERROR: "配送错误", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "价格调整计算错误", + ORDER_FETCH_ERROR: "订单获取错误", + DRAFT_ORDER_UPDATE_ERROR: "草稿订单更新错误", + DISCOUNT_APPLICATION_ERROR: "优惠券应用错误", + DRAFT_ORDER_OPEN_ERROR: "草稿订单打开错误", + ORDER_UPDATE_ERROR: "订单更新错误", + CATALOG_FETCH_ERROR: "目录获取错误", + STORE_ID_NOT_FOUND: "未找到商店ID", + ORDER_NOT_DRAFT: "订单不处于草稿状态", + NO_LINE_ITEMS: "未找到商品", + BAD_USER_INPUT: "用户输入无效", + MISSING_SHIPPING_ADDRESS: "需要配送地址", + MISSING_REQUIRED_FIELD: "缺少必填字段", + CATALOG_API_ERROR: "目录服务错误", + TAX_SERVICE_UNAVAILABLE: "税务服务不可用", + SHIPPING_SERVICE_UNAVAILABLE: "配送服务不可用", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: "价格调整服务不可用", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: "价格调整计算失败", + SERVICE_UNAVAILABLE: "服务暂时不可用", + RATE_LIMITED: "请求过多,请稍后再试", + TIMEOUT: "请求超时", + INTERNAL_ERROR: "内部服务器错误", + SHIPPING_POSTAL_CODE_REQUIRED: "配送邮政编码是必需的", + SHIPPING_COUNTRY_CODE_REQUIRED: "配送国家代码是必需的", + SHIPPING_METHOD_REQUIRED: "配送方式是必需的", + SHIPPING_ADDRESS_VERIFICATION_FAILED: "配送地址验证失败", + BILLING_ADDRESS_VERIFICATION_FAILED: "账单地址验证失败", + }, +}; diff --git a/packages/localizations/src/zhSg.ts b/packages/localizations/src/zhSg.ts new file mode 100644 index 00000000..a696239e --- /dev/null +++ b/packages/localizations/src/zhSg.ts @@ -0,0 +1,307 @@ +export const zhSg = { + general: { + optional: "可选", + notes: "备注", + quantity: "数量", + free: "免费", + closed: "已关闭", + apply: "应用", + checkoutDisabled: "结账目前不可用。给您带来不便,深表歉意。", + }, + contact: { + title: "联系信息", + description: "", + email: "电子邮箱", + }, + pickup: { + title: "门店自取", + description: "我们将尽力满足您的预期取货时间。实际取货时间可能有所不同。", + location: "取货地点", + date: "取货日期", + time: "首选取货时间", + selectStore: "选择门店地点", + selectDate: "选择日期", + selectTime: "选择取货时间", + storeHours: "营业时间", + seeDetails: "查看详情", + noTimeSlots: "所选日期没有可用的时间段。请选择其他日期。", + hoursDisplayed: "显示的时间为您当地时区。", + storeOperatesIn: "门店以 {timezone} 时区运营。", + asap: "尽快", + hour: "小时", + hours: "小时", + minutes: "分钟", + searchCountry: "搜索国家...", + noCountryFound: "未找到国家。", + }, + days: { + sunday: "星期日", + monday: "星期一", + tuesday: "星期二", + wednesday: "星期三", + thursday: "星期四", + friday: "星期五", + saturday: "星期六", + }, + delivery: { + title: "配送", + method: "配送方式", + shipping: "运送", + shipToAddress: "运送到您的地址", + localPickup: "门店自取", + pickupFromStore: "从门店地点取货", + }, + tips: { + title: "添加小费", + noTip: "无小费", + customAmount: "自定义金额", + customTipAmount: "自定义小费金额", + placeholder: "S$0.00", + }, + shipping: { + title: "运送", + description: "运送地址", + method: "运送方式", + noShippingMethodAddress: "输入您的地址以查看可用的运送方式。", + noShippingMethods: "未找到运送方式。", + phone: "电话号码", + country: "国家", + selectCountry: "选择国家", + searchCountry: "搜索国家...", + noCountryFound: "未找到国家", + firstName: "姓名", + lastName: "姓氏", + address1: "地址", + address2: "公寓、套房等(可选)", + city: "城市", + region: "州/省", + postalCode: "邮政编码", + notesPlaceholder: "备注或特殊说明", + addressSuggestion: "您是否意思是", + addressSuggestionEnd: "?", + noShippingOriginAddress: "未提供运送起始地址。", + }, + billing: { + title: "账单", + description: "账单描述", + }, + payment: { + title: "付款", + description: "所有付款都是安全且加密的。", + billingAddress: { + title: "账单地址", + description: "输入您的账单地址。", + useShippingAddress: "使用运送地址作为账单地址", + }, + methods: { + creditCard: "信用卡或借记卡", + paypal: "PayPal", + applePay: "Apple Pay", + googlePay: "Google Pay", + paze: "Paze", + offline: "线下付款", + }, + descriptions: { + creditCard: "", + paypal: "", + applePay: "", + googlePay: "", + paze: "", + offline: "", + }, + noMethodsAvailable: "无可用付款方式", + cardNumber: "卡号", + cardNumberPlaceholder: "1234 1234 1234 1234", + expirationDate: "有效期(MM / YY)", + securityCode: "安全码", + cvvPlaceholder: "CVV", + nameOnCard: "持卡人姓名", + payNow: "立即付款", + standardShipping: "标准运送", + cardDetails: "卡片详情", + payWithApplePay: "使用 Apple Pay 付款", + expirationDatePlaceholder: "MM / YY", + failedToInitializePayment: "付款初始化失败。", + orderTotal: "订单总额", + subtotal: "小计", + tax: "税费", + shipping: "运费", + discount: "优惠券", + processingPayment: "正在处理付款...", + completingOrder: "正在完成订单...", + freePayment: "完成您的免费订单", + }, + phone: { + placeholder: "+65 9123 4567", + searchCountry: "搜索国家...", + noCountryFound: "未找到国家。", + }, + discounts: { + placeholder: "优惠券代码", + enterCode: "输入优惠券代码", + apply: "应用", + alreadyApplied: "此优惠券代码已经应用", + failedToApply: "优惠券代码应用失败", + enterCodeValidation: "请输入优惠券代码", + }, + totals: { + subtotal: "小计", + discount: "折扣", + shipping: "运费", + tip: "小费", + estimatedTaxes: "预估税费", + totalDue: "应付总额", + orderSummary: "订单摘要", + itemCount: "件商品", + noItems: "无商品", + }, + lineItems: { + note: "备注:", + }, + ui: { + autocomplete: { + addressPlaceholder: "地址", + suggestions: "建议", + }, + form: { + useFormFieldError: "useFormField 应在 内使用", + }, + pagination: { + ariaLabel: "分页", + previousPageAriaLabel: "转到上一页", + previous: "上一页", + nextPageAriaLabel: "转到下一页", + next: "下一页", + morePages: "更多页面", + }, + sidebar: { + useSidebarError: "useSidebar 必须在 SidebarProvider 内使用。", + toggleSidebar: "切换侧边栏", + }, + accessibility: { + payWithApplePay: "使用 Apple Pay 付款", + applePayLogo: "Apple Pay 标志", + }, + }, + errors: { + failedToGetAccessToken: "获取访问令牌失败", + invalidEnvironment: "无效环境", + noPublicAccessToken: "未提供公共访问令牌", + noSessionToken: "未提供会话令牌或ID", + errorCreatingSession: "创建结账会话错误:", + orderIdRequired: "需要订单ID", + errorTrackingEvent: "跟踪事件错误", + errorInTrackingSubscriber: "跟踪订阅者错误", + useTrackingProviderError: "useTracking 必须在 TrackingProvider 内使用", + usePoyntCollectProviderError: + "usePoyntCollect 必须在 PoyntCollectProvider 内使用", + useSquareProviderError: "useSquare 必须在 SquareProvider 内使用", + errorProcessingPayment: "处理付款错误", + stripeConfigMissing: "Stripe 配置缺失。请检查您的设置。", + paymentSuccessful: "付款成功", + paymentFailed: "付款失败", + paypalConfigMissing: "PayPal 配置缺失。请检查您的设置。", + stripeNotReady: "Stripe 未就绪", + cardElementNotFound: "未找到 CardElement", + errorProcessingCardPayment: "处理卡片付款错误。", + errorProcessingExpressPayment: "处理快速付款错误。", + failedToInitializePayment: "付款初始化失败。", + invalidPhoneNumber: "无效电话号码", + }, + validation: { + phoneRequired: "电话号码必填", + emailRequired: "输入电子邮箱", + emailInvalid: "输入有效的电子邮箱", + phoneTooLong: "电话号码过长", + invalidShippingAddress: "无效运送地址", + invalidBillingAddress: "无效账单地址", + selectPaymentMethod: "选择付款方式", + enterValidBillingPhone: "输入有效的账单电话号码", + enterValidShippingPhone: "输入有效的运送电话号码", + enterFirstName: "输入姓名", + enterLastName: "输入姓氏", + enterAddress: "输入地址", + enterCity: "输入城市", + enterZipCode: "输入邮政编码", + enterZipPostalCode: "输入邮政编码", + selectState: "选择州/省", + selectCountry: "选择国家", + enterCountry: "输入国家", + }, + apiErrors: { + INTERNAL_SERVER_ERROR: "服务器错误", + SESSION_NOT_FOUND: "会话未找到", + CHECKOUT_SESSION_RETRIEVAL_FAILED: "检索结账会话失败", + CHECKOUT_SESSION_NOT_FOUND: "结账会话未找到", + CHECKOUT_SESSION_FETCH_ERROR: "结账会话获取错误", + DRAFT_ORDER_NOT_FOUND: "草稿订单未找到", + CHECKOUT_SESSION_CREATION_FAILED: "创建结账会话失败", + CREATED_SESSION_DATA_NOT_FOUND: "创建的会话数据未找到", + CHECKOUT_SESSION_CREATION_ERROR: "结账会话创建错误", + CHECKOUT_SESSION_UPDATE_FAILED: "更新结账会话失败", + UPDATED_SESSION_NOT_FOUND: "更新的会话未找到", + CHECKOUT_SESSION_UPDATE_ERROR: "结账会话更新错误", + ORDER_API_NOT_FOUND: "订单API数据源未找到", + DRAFT_ORDER_RETRIEVAL_FAILED: "检索草稿订单失败", + DATA_SOURCES_NOT_FOUND: "数据源未找到", + TRANSACTION_API_NOT_FOUND: "交易API数据源未找到", + TRANSACTION_PROCESSING_FAILED: "处理交易失败", + TRANSACTION_CREATION_FAILED: "查找或创建交易失败", + ORDER_OPENING_FAILED: "打开订单失败", + INVALID_FULFILLMENT_LOCATION: "无效的履行地点", + NO_VALID_PICKUP_LOCATION: "无有效的取货地点", + DRAFT_ORDER_FETCH_FAILED: "获取草稿订单失败", + LINE_ITEMS_FETCH_FAILED: "获取行项目失败", + CURRENT_ORDER_FETCH_FAILED: "获取当前草稿订单失败", + DRAFT_ORDER_UPDATE_FAILED: "更新草稿订单失败", + DISCOUNT_APPLICATION_FAILED: "应用优惠券失败", + CONTEXT_UNAVAILABLE: "会话或数据源不可用", + SHIPPING_LINES_UPDATE_FAILED: "更新运送行失败", + ORDER_TOTALS_UPDATE_FAILED: "更新订单总额失败", + SHIPPING_METHOD_APPLICATION_FAILED: "应用运送方式失败", + SKU_FETCH_FAILED: "获取SKU失败", + SHIPPING_RATES_CALCULATION_FAILED: "计算运送费率失败", + SHIPPING_METHOD_NOT_FOUND: "运送方式未找到", + SHIPPING_METHOD_REMOVAL_FAILED: "移除运送方式失败", + SHIPPING_ADDRESS_REQUIRED: "需要运送地址", + INVENTORY_VALIDATION_ERROR: "库存验证错误", + INSUFFICIENT_INVENTORY: "库存不足", + INVALID_ORDER_STATUS: "无效订单状态", + TRANSACTION_CREATION_ERROR: "交易创建错误", + TRANSACTION_PROCESSING_ERROR: "交易处理错误", + UNKNOWN_ERROR: "未知错误", + FULFILLMENT_CREATION_ERROR: "履行创建错误", + TAX_CALCULATION_ERROR: "税费计算错误", + ADDRESS_VERIFICATION_ERROR: "地址验证错误", + ADDRESS_MATCHES_ERROR: "地址匹配错误", + SHIPPING_CONFLICT_ERROR: "运送冲突错误", + SHIPPING_ERROR: "运送错误", + PRICE_ADJUSTMENT_CALCULATION_ERROR: "价格调整计算错误", + ORDER_FETCH_ERROR: "订单获取错误", + DRAFT_ORDER_UPDATE_ERROR: "草稿订单更新错误", + DISCOUNT_APPLICATION_ERROR: "优惠券应用错误", + DRAFT_ORDER_OPEN_ERROR: "草稿订单打开错误", + ORDER_UPDATE_ERROR: "订单更新错误", + CATALOG_FETCH_ERROR: "目录获取错误", + STORE_ID_NOT_FOUND: "未找到商店ID", + ORDER_NOT_DRAFT: "订单不处于草稿状态", + NO_LINE_ITEMS: "未找到商品", + BAD_USER_INPUT: "用户输入无效", + MISSING_SHIPPING_ADDRESS: "需要运送地址", + MISSING_REQUIRED_FIELD: "缺少必填字段", + CATALOG_API_ERROR: "目录服务错误", + TAX_SERVICE_UNAVAILABLE: "税务服务不可用", + SHIPPING_SERVICE_UNAVAILABLE: "运送服务不可用", + PRICE_ADJUSTMENTS_SERVICE_UNAVAILABLE: "价格调整服务不可用", + PRICE_ADJUSTMENTS_CALCULATION_FAILED: "价格调整计算失败", + SERVICE_UNAVAILABLE: "服务暂时不可用", + RATE_LIMITED: "请求过多,请稍后再试", + TIMEOUT: "请求超时", + INTERNAL_ERROR: "内部服务器错误", + SHIPPING_POSTAL_CODE_REQUIRED: "配送邮政编码是必需的", + SHIPPING_COUNTRY_CODE_REQUIRED: "配送国家代码是必需的", + SHIPPING_METHOD_REQUIRED: "配送方式是必需的", + SHIPPING_ADDRESS_VERIFICATION_FAILED: "配送地址验证失败", + BILLING_ADDRESS_VERIFICATION_FAILED: "账单地址验证失败", + }, +}; diff --git a/packages/localizations/tsconfig.json b/packages/localizations/tsconfig.json new file mode 100644 index 00000000..d8fb4de5 --- /dev/null +++ b/packages/localizations/tsconfig.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "isolatedModules": true, + "resolveJsonModule": true, + "moduleResolution": "bundler", + "module": "ESNext", + "target": "ES2022", + "lib": ["ES2022"], + "allowImportingTsExtensions": true, + "noEmit": true, + "skipLibCheck": true + }, + "exclude": ["node_modules"] +} diff --git a/packages/localizations/tsdown.config.ts b/packages/localizations/tsdown.config.ts new file mode 100644 index 00000000..898d0522 --- /dev/null +++ b/packages/localizations/tsdown.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'tsdown' + +export default defineConfig({ + entry: ['src/index.ts'], + plugins: [], + tsconfig: './tsconfig.json', + dts: true +}) diff --git a/packages/react/.DS_Store b/packages/react/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c4a78cef1da8960d23235731814f7d11902f0a77 GIT binary patch literal 6148 zcmeHKy-EW?5dPL2a%uv>O05pTR!nD?Gn`yGIL2 z_oUWrCvmUftqaP4GVtFR;BR*xn;2q*J__Hj|N7Y;CsEYuCM{a`D?$Bgf8%MV=+pVp zr+1n?C$?w{cPV0gAg@UO=7Y-wr4=5", + "react": ">=18", + "react-dom": ">=18", + "react-hook-form": ">=7" + }, + "dependencies": { + "@floating-ui/react": "^0.27.8", + "@godaddy/localizations": "workspace:*", + "@hookform/resolvers": "^4.0.0", + "@paypal/react-paypal-js": "^8.8.3", + "@radix-ui/react-accordion": "^1.2.3", + "@radix-ui/react-alert-dialog": "^1.1.6", + "@radix-ui/react-aspect-ratio": "^1.1.2", + "@radix-ui/react-avatar": "^1.1.3", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.3", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-radio-group": "^1.2.3", + "@radix-ui/react-scroll-area": "^1.2.3", + "@radix-ui/react-select": "^2.1.6", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-switch": "^1.1.3", + "@radix-ui/react-toast": "^1.2.6", + "@radix-ui/react-toggle": "^1.1.2", + "@radix-ui/react-toggle-group": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.8", + "@stripe/react-stripe-js": "^3.7.0", + "@stripe/stripe-js": "^7.3.1", + "@tailwindcss/cli": "^4.1.10", + "@tailwindcss/vite": "^4.1.4", + "@tanstack/react-pacer": "^0.2.0", + "@tanstack/react-query": "^5.66.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "1.0.0", + "date-fns": "^4.1.0", + "date-fns-tz": "^3.2.0", + "embla-carousel-react": "^8.5.2", + "gql.tada": "^1.8.10", + "graphql": "^16.10.0", + "graphql-request": "^5.2.0", + "lucide-react": "^0.475.0", + "react-day-picker": "8.10.1", + "react-phone-number-input": "^3.4.12", + "react-resizable-panels": "^2.1.7", + "tailwind-merge": "^3.0.1", + "tailwindcss": "^4.1.4", + "ulid": "^3.0.0", + "vaul": "^1.1.2", + "zod": "^3.24.1" + }, + "devDependencies": { + "@types/node": "^22.13.1", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.2.1", + "globals": "^15.14.0", + "jsdom": "^26.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-hook-form": "^7.54.2", + "tsdown": "^0.15.6", + "typescript": "~5.7.3", + "vite": "^5.1.6", + "vitest": "^3.0.6" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/" + } +} diff --git a/packages/react/src/.DS_Store b/packages/react/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f597e9137329f54b26597ea5ec0fc24aedb726aa GIT binary patch literal 6148 zcmeHKJxc>Y5S`5jBvC^O1qH!V(ApGQS)3t)g@xcB&_qcjIWHu!v5+h6t?g~CY{f>f z7OeaMV&e}G^v&*)+;WMPh{z1=zRk|ez1f%CZkC8t<@B&jR3f4r8e^t_ZiKO)Tf$Oy zW*VsUGeSC{BeXvC645dt3Wx%KO#yy)3sk3&0_vb2yua;6d9NM@9bIt#{9{~P5LT`_lfAO8m$Wjv(hSZ{-QyooqU2nXm=j*GD zXkPQg@`G?#$><1&pH`VaO>H`+n!}wseHwb=yr22t^=wY_+PpYt((CZ0?wBu&ee?)B zDRxtblW4~E#(9q)FYj9`cD;lAIQQrXhhLuu*!261 zYI)~&P1iCaZukv+7w6Ws%esjDi~=~b*>V#Gr56Q60a0L}0PhbT8l!J9GN`u>bovSa z%wSp@#w8vAJ&V4@$RIp0Wm17ARoN?sGU=H2Y@BZ~GHB9C*~^Er%*x(SlxD~CJsnQU zHz>U*APTq&q|L_?pZ{Cq@BeO+d=dpjfq$id%2fBN6)ee~t%=3)S?i(gqp@*ZWKgG| jv&XR>@KHRArVT!i2SDFqWDqkj`6HlZkWLi%RRz8P6mF`h literal 0 HcmV?d00001 diff --git a/packages/react/src/components/.DS_Store b/packages/react/src/components/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4ff7495d6d65c0b55ced0c49a16d8cbd570c4f8b GIT binary patch literal 6148 zcmeHKy-veG47NjuAXKR%6Ux8~bYNgRsvsEHvLnO7w=>Z$nl4)@Pq4qlHo$IZSKx15iQ zw&pP4C`#}yUCX=F+UdD^x3AZKI5~eDo@#x~sp^lKpM9M=d@preoB?OR8TfAupl6Gu zJBGeG1I~am&@v$3hYTthA~uHl>A<2R0B``a3idKfNKO_pL~IPBT>~bXi|M=_qznkP&&VV!Urx@Tt zUgQ(pQtYk0o0DFfK`)>p64w~EDcEQ$My#~rU8oA|nQVX|Vq*vk#Qz8=4Zb)7Kgz%x DJmyAi literal 0 HcmV?d00001 diff --git a/packages/react/src/components/checkout/address/address-form.tsx b/packages/react/src/components/checkout/address/address-form.tsx new file mode 100644 index 00000000..3653881e --- /dev/null +++ b/packages/react/src/components/checkout/address/address-form.tsx @@ -0,0 +1,760 @@ +"use client"; + +import { + countries, + getRegions, + hasRegionData, +} from "@/components/checkout/address/get-country-region"; +// TEMPORARY: Comment out autocomplete/verification imports - will be restored later +// import { checkIsValidAddress } from "@/components/checkout/address/utils/check-is-valid-address"; +// import { formatSingleLineAddress } from "@/components/checkout/address/utils/format-address"; +// import { isAddressComplete } from "@/components/checkout/address/utils/is-address-complete"; +import { mapAddressFieldsToInput } from "@/components/checkout/address/utils/map-address-fields-to-input"; +// import { useAddressMatches } from "@/components/checkout/address/utils/use-address-matches"; +// import { useAddressVerification } from "@/components/checkout/address/utils/use-address-verification"; +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { PhoneInput } from "@/components/checkout/contact/phone-input"; +import { useDraftOrder } from "@/components/checkout/order/use-draft-order"; +import { useDraftOrderFieldSync } from "@/components/checkout/order/use-draft-order-sync"; +// import { AutoComplete } from "@/components/ui/autocomplete"; +import { Button } from "@/components/ui/button"; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from "@/components/ui/command"; +import { + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { useGoDaddyContext } from "@/godaddy-provider"; +import { cn } from "@/lib/utils"; +import { eventIds } from "@/tracking/events"; +import { TrackingEventType, track } from "@/tracking/track"; +// import type { Address } from "@/types"; +import { useDebouncedValue } from "@tanstack/react-pacer"; +import { Check, ChevronsUpDown } from "lucide-react"; +import * as React from "react"; +import { useFormContext } from "react-hook-form"; + +export function AddressForm({ sectionKey }: { sectionKey: string }) { + const form = useFormContext(); + const { t } = useGoDaddyContext(); + const { isConfirmingCheckout, requiredFields } = useCheckoutContext(); + + const { data: draftOrder } = useDraftOrder(); + const countryTriggerRef = React.useRef(null); + const [triggerWidth, setTriggerWidth] = React.useState(null); + // TEMPORARY: Comment out suggested address state - will be restored later + // const [showSuggestedAddress, setShowSuggestedAddress] = React.useState(false); + const [isCountrySelectOpen, setCountrySelectOpen] = + React.useState(false); + + React.useEffect(() => { + function updateWidth() { + if (countryTriggerRef.current) { + setTriggerWidth(countryTriggerRef.current.clientWidth); + } + } + updateWidth(); + window.addEventListener("resize", updateWidth); + return () => window.removeEventListener("resize", updateWidth); + }, []); + + // TEMPORARY: Comment out address value watching for autocomplete - will be restored later + // const addressValue = form.watch(`${sectionKey}AddressLine1`); + const countryValue = form.watch(`${sectionKey}CountryCode`); + + // Reset AdminArea1 if current value is not valid for the selected country + React.useEffect(() => { + if (countryValue) { + const currentAdminArea1 = form.getValues(`${sectionKey}AdminArea1`); + if (hasRegionData(countryValue) && currentAdminArea1) { + const regions = getRegions(countryValue); + const isValidRegion = regions.some( + (region) => region.code === currentAdminArea1, + ); + if (!isValidRegion) { + form.setValue(`${sectionKey}AdminArea1`, "", { + shouldValidate: true, + shouldDirty: true, + shouldTouch: true, + }); + // Force validation for this specific field + form.trigger(`${sectionKey}AdminArea1`); + } + } + } + }, [countryValue, form, sectionKey]); + + const useShippingAddress = form.watch("paymentUseShippingAddress"); + + // const [debouncedAddressValue] = useDebouncedValue(addressValue, { + // wait: 200, + // }); + + const [ + firstName, + lastName, + addressLine1, + addressLine2, + addressLine3, + adminArea1, + adminArea2, + adminArea3, + adminArea4, + postalCode, + countryCode, + ] = form.watch([ + `${sectionKey}FirstName`, + `${sectionKey}LastName`, + `${sectionKey}AddressLine1`, + `${sectionKey}AddressLine2`, + `${sectionKey}AddressLine3`, + `${sectionKey}AdminArea1`, + `${sectionKey}AdminArea2`, + `${sectionKey}AdminArea3`, + `${sectionKey}AdminArea4`, + `${sectionKey}PostalCode`, + `${sectionKey}CountryCode`, + ]); + + const contact = React.useMemo( + () => ({ firstName, lastName }), + [firstName, lastName], + ); + + const [debouncedFullName] = useDebouncedValue( + Object.values(contact).join(""), + { + wait: 1000, + }, + ); + + // const addressMatchesQuery = useAddressMatches(debouncedAddressValue, { + // enabled: + // !!line1AddressIsDirty && + // !!debouncedAddressValue && + // countryValue === "US" && + // debouncedFullAddress === Object.values(address).join(""), + // }); + + // const shouldVerifyAddress = + // !!debouncedFullAddress && + // debouncedFullAddress !== "US" && + // addressLine1 !== "" && + // postalCode !== "" && + // countryCode !== "" && + // addressIsDirty && + // debouncedFullAddress === Object.values(address).join(""); + + // const verifyAddressQuery = useAddressVerification(address, { + // enabled: shouldVerifyAddress, + // }); + + // Check if name values differ from order values + const nameHasChanged = React.useMemo(() => { + if (!draftOrder) return true; // If no order, allow sync + const section = + sectionKey === "shipping" ? draftOrder.shipping : draftOrder.billing; + + return ( + (section?.firstName || "") !== (firstName || "") || + (section?.lastName || "") !== (lastName || "") + ); + }, [draftOrder, sectionKey, firstName, lastName]); + + const shouldVerifyName = + nameHasChanged && // Only sync if values differ from order + debouncedFullName !== "" && + debouncedFullName === Object.values(contact).join(""); + + useDraftOrderFieldSync({ + key: "name", + data: contact, + deps: [contact], + enabled: shouldVerifyName, + fieldNames: [`${sectionKey}FirstName`, `${sectionKey}LastName`], + mapToInput: (data) => { + return mapAddressFieldsToInput( + { + firstName: data.firstName.trim(), + lastName: data.lastName.trim(), + }, + sectionKey as "shipping" | "billing", + useShippingAddress, + ); + }, + }); + + // TEMPORARY: Comment out address validation logic - will be restored later + // const isAddressValid = React.useMemo(() => { + // if ( + // verifyAddressQuery.status === "success" && + // !verifyAddressQuery.isLoading && + // verifyAddressQuery.data?.[0] && + // address && + // addressIsDirty && + // debouncedFullAddress === Object.values(address).join("") + // ) { + // return checkIsValidAddress(address, verifyAddressQuery.data[0]); + // } + // return false; + // }, [ + // verifyAddressQuery.status, + // verifyAddressQuery.isLoading, + // verifyAddressQuery.data, + // address, + // debouncedFullAddress, + // addressIsDirty, + // ]); + + // TEMPORARY: Comment out suggested address effect - will be restored later + // React.useEffect(() => { + // if ( + // verifyAddressQuery.status === "success" && + // !verifyAddressQuery.isFetching && + // !isAddressValid && + // !!addressIsDirty + // ) { + // setShowSuggestedAddress(true); + // form.setValue(`${sectionKey}Valid`, false, { shouldValidate: true }); + // } else { + // setShowSuggestedAddress(false); + // form.setValue(`${sectionKey}Valid`, true, { shouldValidate: true }); + // } + // }, [ + // isAddressValid, + // verifyAddressQuery.status, + // verifyAddressQuery.isFetching, + // form.setValue, + // sectionKey, + // addressIsDirty, + // ]); + + // TEMPORARY: Simplified draft order sync without validation dependencies + const address = React.useMemo( + () => ({ + addressLine1, + addressLine2, + addressLine3, + adminArea1, + adminArea2, + adminArea3, + adminArea4, + postalCode, + countryCode, + }), + [ + addressLine1, + addressLine2, + addressLine3, + adminArea1, + adminArea2, + adminArea3, + adminArea4, + postalCode, + countryCode, + ], + ); + + const [debouncedFullAddress] = useDebouncedValue( + Object.values(address).join(""), + { wait: 1000 }, + ); + + // Get existing order address data for comparison + const orderAddress = React.useMemo(() => { + if (!draftOrder) return null; + const section = + sectionKey === "shipping" ? draftOrder.shipping : draftOrder.billing; + return section + ? { + addressLine1: section?.address?.addressLine1 || "", + addressLine2: section?.address?.addressLine2 || "", + addressLine3: section?.address?.addressLine3 || "", + adminArea1: section?.address?.adminArea1 || "", + adminArea2: section?.address?.adminArea2 || "", + adminArea3: section?.address?.adminArea3 || "", + adminArea4: section?.address?.adminArea4 || "", + postalCode: section?.address?.postalCode || "", + countryCode: section?.address?.countryCode || "", + } + : null; + }, [draftOrder, sectionKey]); + + // Check if current form values differ from order values + const addressHasChanged = React.useMemo(() => { + if (!orderAddress) return true; // If no order address, allow sync + + return ( + orderAddress.addressLine1 !== (addressLine1 || "") || + orderAddress.addressLine2 !== (addressLine2 || "") || + orderAddress.addressLine3 !== (addressLine3 || "") || + orderAddress.adminArea1 !== (adminArea1 || "") || + orderAddress.adminArea2 !== (adminArea2 || "") || + orderAddress.adminArea3 !== (adminArea3 || "") || + orderAddress.adminArea4 !== (adminArea4 || "") || + orderAddress.postalCode !== (postalCode || "") || + orderAddress.countryCode !== (countryCode || "") + ); + }, [ + orderAddress, + addressLine1, + addressLine2, + addressLine3, + adminArea1, + adminArea2, + adminArea3, + adminArea4, + postalCode, + countryCode, + ]); + + const shouldUpdateAddress = Boolean( + addressHasChanged && // Only sync if values differ from order + !!debouncedFullAddress && + addressLine1?.trim() !== "" && + postalCode?.trim() !== "" && + countryCode?.trim() !== "" && + debouncedFullAddress === Object.values(address).join("") && + debouncedFullAddress.trim() !== "", + ); + + useDraftOrderFieldSync({ + key: "address", + data: address, + deps: [address, shouldUpdateAddress], + enabled: shouldUpdateAddress, + fieldNames: [ + `${sectionKey}AddressLine1`, + `${sectionKey}AddressLine2`, + `${sectionKey}City`, + `${sectionKey}AdminArea1`, + `${sectionKey}PostalCode`, + `${sectionKey}CountryCode`, + ], + mapToInput: (data) => { + return mapAddressFieldsToInput( + { + address: data, + }, + sectionKey as "shipping" | "billing", + useShippingAddress, + ); + }, + }); + + // TEMPORARY: Comment out address update handler - will be restored later + // function handleUpdateAddress(address?: Address) { + // if (!address) return; + + // const fieldMap: Record = { + // AddressLine1: address.addressLine1, + // AddressLine2: address.addressLine2, + // AdminArea3: address.adminArea3, + // AdminArea1: address.adminArea1, + // PostalCode: address.postalCode, + // }; + + // for (const [key, value] of Object.entries(fieldMap)) { + // if (value) { + // form.setValue(`${sectionKey}${key}`, value, { shouldValidate: true }); + // } + // } + // } + + return ( +
+ ( + + {t.shipping.country} + + + + + + + + + + + {t.shipping.noCountryFound} + + {countries.map((country) => ( + { + // Get current country before setting the new one + const previousCountry = form.getValues( + `${sectionKey}CountryCode`, + ); + const isChangingCountryType = + (hasRegionData(previousCountry) && + !hasRegionData(country.value)) || + (!hasRegionData(previousCountry) && + hasRegionData(country.value)); + + // Set the new country value + form.setValue( + `${sectionKey}CountryCode`, + country.value, + { + shouldValidate: true, + }, + ); + + // Reset AdminArea1 field when changing country types or when current value is invalid + const currentAdminArea1 = form.getValues( + `${sectionKey}AdminArea1`, + ); + const newCountryRegions = getRegions(country.value); + const isCurrentValueValid = newCountryRegions.some( + (region) => region.code === currentAdminArea1, + ); + + if ( + isChangingCountryType || + (hasRegionData(country.value) && + !isCurrentValueValid) + ) { + form.setValue(`${sectionKey}AdminArea1`, "", { + shouldDirty: true, + }); + } + + // Track country selection event + track({ + eventId: eventIds.changeCountry, + type: TrackingEventType.CLICK, + properties: { + sectionKey, + countryCode: country.value, + countryName: country.label, + }, + }); + + setCountrySelectOpen(false); + }} + disabled={isConfirmingCheckout} + > + {country.label} + + + ))} + + + + + + + + )} + /> + +
+ ( + + + {t.shipping.firstName} ({t.general.optional}) + + + + + + + )} + /> + ( + + {t.shipping.lastName} + + + + + + )} + /> +
+ + ( + + {t.shipping.address1} + + {/* TEMPORARY: Comment out autocomplete for US addresses - will be restored later */} + {/* {countryValue === "US" ? ( + + handleUpdateAddress(address as Address) + } + isLoading={ + addressMatchesQuery?.isLoading || + addressMatchesQuery?.isFetching + } + hasError={!!fieldState.error} + /> + ) : ( */} + + {/* )} */} + + + {/* TEMPORARY: Comment out validation error display - will be restored later */} + {/* {form?.formState?.errors?.[`${sectionKey}Valid`]?.message ? ( +

+ {String(form.formState.errors[`${sectionKey}Valid`]?.message)} +

+ ) : null} */} +
+ )} + /> + + ( + + {t.shipping.address2} + + + + + + )} + /> + +
+ ( + + {t.shipping.city} + + + + + + )} + /> + ( + + {t.shipping.region} + + {hasRegionData(countryValue) ? ( + + ) : ( + + )} + + + + )} + /> + + ( + + {t.shipping.postalCode} + + + + + + )} + /> +
+ {/* TEMPORARY: Comment out suggested address display - will be restored later */} + {/* {showSuggestedAddress ? ( +
+ {t.shipping.addressSuggestion}{" "} + + {t.shipping.addressSuggestionEnd} +
+ ) : null} */} + + +
+ ); +} diff --git a/packages/react/src/components/checkout/address/country-region-data.ts b/packages/react/src/components/checkout/address/country-region-data.ts new file mode 100644 index 00000000..d9c8e994 --- /dev/null +++ b/packages/react/src/components/checkout/address/country-region-data.ts @@ -0,0 +1,6291 @@ +export const AF = [ + "Afghanistan", + "AF", + [ + ["Badakhshan", "BDS"], + ["Badghis", "BDG"], + ["Baghlan", "BGL"], + ["Balkh", "BAL"], + ["Bamyan", "BAM"], + ["Daykundi", "DAY"], + ["Farah", "FRA"], + ["Faryab", "FYB"], + ["Ghazni", "GHA"], + ["Ghor", "GHO"], + ["Helmand", "HEL"], + ["Herat", "HER"], + ["Jowzjan", "JOW"], + ["Kabul", "KAB"], + ["Kandahar", "KAN"], + ["Kapisa", "KAP"], + ["Khost", "KHO"], + ["Kunar", "KNR"], + ["Kunduz", "KDZ"], + ["Laghman", "LAG"], + ["Logar", "LOW"], + ["Maidan Wardak", "WAR"], + ["Nangarhar", "NAN"], + ["Nimruz", "NIM"], + ["Nuristan", "NUR"], + ["Paktia", "PIA"], + ["Paktika", "PKA"], + ["Panjshir", "PAN"], + ["Parwan", "PAR"], + ["Samangan", "SAM"], + ["Sar-e Pol", "SAR"], + ["Takhar", "TAK"], + ["Urozgan", "ORU"], + ["Zabul", "ZAB"], + ], +]; +export const AX = [ + "Åland Islands", + "AX", + [ + ["Brändö", "BR"], + ["Eckerö", "EC"], + ["Finström", "FN"], + ["Föglö", "FG"], + ["Geta", "GT"], + ["Hammarland", "HM"], + ["Jomala", "JM"], + ["Kumlinge", "KM"], + ["Kökar", "KK"], + ["Lemland", "LE"], + ["Lumparland", "LU"], + ["Mariehamn", "MH"], + ["Saltvik", "SV"], + ["Sottunga", "ST"], + ["Sund", "SD"], + ["Vårdö", "VR"], + ], +]; +export const AL = [ + "Albania", + "AL", + [ + ["Berat", "01"], + ["Dibër", "09"], + ["Durrës", "02"], + ["Elbasan", "03"], + ["Fier", "04"], + ["Gjirokastër", "05"], + ["Korçë", "06"], + ["Kukës", "07"], + ["Lezhë", "08"], + ["Shkodër", "10"], + ["Tirana", "11"], + ["Vlorë", "12"], + ], +]; +export const DZ = [ + "Algeria", + "DZ", + [ + ["Adrar", "01"], + ["Aïn Defla", "44"], + ["Aïn Témouchent", "46"], + ["Algiers", "16"], + ["Annaba", "23"], + ["Batna", "05"], + ["Béchar", "08"], + ["Béjaïa", "06"], + ["Biskra", "07"], + ["Blida", "09"], + ["Bordj Bou Arréridj", "34"], + ["Bouïra", "10"], + ["Boumerdès", "35"], + ["Chlef", "02"], + ["Constantine", "25"], + ["Djelfa", "17"], + ["El Bayadh", "32"], + ["El Oued", "39"], + ["El Tarf", "36"], + ["Ghardaïa", "47"], + ["Guelma", "24"], + ["Illizi", "33"], + ["Jijel", "18"], + ["Khenchela", "40"], + ["Laghouat", "03"], + ["Mascara", "29"], + ["Médéa", "26"], + ["Mila", "43"], + ["Mostaganem", "27"], + ["Msila", "28"], + ["Naâma", "45"], + ["Oran", "31"], + ["Ouargla", "30"], + ["Oum el Bouaghi", "04"], + ["Relizane", "48"], + ["Saïda", "20"], + ["Sétif", "19"], + ["Sidi Bel Abbès", "22"], + ["Skikda", "21"], + ["Souk Ahras", "41"], + ["Tamanghasset", "11"], + ["Tébessa", "12"], + ["Tiaret", "14"], + ["Tindouf", "37"], + ["Tipaza", "42"], + ["Tissemsilt", "38"], + ["Tizi Ouzou", "15"], + ["Tlemcen", "13"], + ], +]; +export const AS = [ + "American Samoa", + "AS", + [ + ["Tutuila", "01"], + ["Aunu'u", "02"], + ["Ta'ū", "03"], + ["Ofu‑Olosega", "04"], + ["Rose Atoll", "21"], + ["Swains Island", "22"], + ], +]; +export const AD = [ + "Andorra", + "AD", + [ + ["Andorra la Vella", "07"], + ["Canillo", "02"], + ["Encamp", "03"], + ["Escaldes-Engordany", "08"], + ["La Massana", "04"], + ["Ordino", "05"], + ["Sant Julià de Lòria", "06"], + ], +]; +export const AO = [ + "Angola", + "AO", + [ + ["Bengo", "BGO"], + ["Benguela", "BGU"], + ["Bié", "BIE"], + ["Cabinda", "CAB"], + ["Cuando Cubango", "CCU"], + ["Cuanza Norte", "CNO"], + ["Cuanza Sul", "CUS"], + ["Cunene", "CNN"], + ["Huambo", "HUA"], + ["Huíla", "HUI"], + ["Luanda", "LUA"], + ["Lunda Norte", "LNO"], + ["Lunda Sul", "LSU"], + ["Malanje", "MAL"], + ["Moxico", "MOX"], + ["Namibe", "NAM"], + ["Uíge", "UIG"], + ["Zaire", "ZAI"], + ], +]; +export const AI = [ + "Anguilla", + "AI", + [ + ["Anguilla", "01"], + ["Anguillita Island", "02"], + ["Blowing Rock", "03"], + ["Cove Cay", "04"], + ["Crocus Cay", "05"], + ["Deadman's Cay", "06"], + ["Dog Island", "07"], + ["East Cay", "08"], + ["Little Island", "09"], + ["Little Scrub Island", "10"], + ["Mid Cay", "11"], + ["North Cay", "12"], + ["Prickly Pear Cays", "13"], + ["Rabbit Island", "14"], + ["Sandy Island/Sand Island", "15"], + ["Scilly Cay", "16"], + ["Scrub Island", "17"], + ["Seal Island", "18"], + ["Sombrero/Hat Island", "19"], + ["South Cay", "20"], + ["South Wager Island", "21"], + ["West Cay", "22"], + ], +]; +export const AQ = ["Antarctica", "AQ", [["Antarctica", "AQ"]]]; +export const AG = [ + "Antigua and Barbuda", + "AG", + [ + ["Antigua Island", "01"], + ["Barbuda Island", "02"], + ["Bird Island", "04"], + ["Bishop Island", "05"], + ["Blake Island", "06"], + ["Crump Island", "09"], + ["Dulcina Island", "10"], + ["Exchange Island", "11"], + ["Five Islands", "12"], + ["Great Bird Island", "13"], + ["Green Island", "14"], + ["Guiana Island", "15"], + ["Hawes Island", "17"], + ["Hells Gate Island", "16"], + ["Henry Island", "18"], + ["Johnson Island", "19"], + ["Kid Island", "20"], + ["Lobster Island", "22"], + ["Maiden Island", "24"], + ["Moor Island", "25"], + ["Nanny Island", "26"], + ["Pelican Island", "27"], + ["Prickly Pear Island", "28"], + ["Rabbit Island", "29"], + ["Red Head Island", "31"], + ["Redonda Island", "03"], + ["Sandy Island", "32"], + ["Smith Island", "33"], + ["The Sisters", "34"], + ["Vernon Island", "35"], + ["Wicked Will Island", "36"], + ["York Island", "37"], + ], +]; +export const AR = [ + "Argentina", + "AR", + [ + ["Buenos Aires", "B"], + ["Capital Federal", "C"], + ["Catamarca", "K"], + ["Chaco", "H"], + ["Chubut", "U"], + ["Córdoba", "X"], + ["Corrientes", "W"], + ["Entre Ríos", "E"], + ["Formosa", "P"], + ["Jujuy", "Y"], + ["La Pampa", "L"], + ["La Rioja", "F"], + ["Mendoza", "M"], + ["Misiones", "N"], + ["Neuquén", "Q"], + ["Río Negro", "R"], + ["Salta", "A"], + ["San Juan", "J"], + ["San Luis", "D"], + ["Santa Cruz", "Z"], + ["Santa Fe", "S"], + ["Santiago del Estero", "G"], + ["Tierra del Fuego", "V"], + ["Tucumán", "T"], + ], +]; +export const AM = [ + "Armenia", + "AM", + [ + ["Aragatsotn", "AG"], + ["Ararat", "AR"], + ["Armavir", "AV"], + ["Gegharkunik", "GR"], + ["Kotayk", "KT"], + ["Lori", "LO"], + ["Shirak", "SH"], + ["Syunik", "SU"], + ["Tavush", "TV"], + ["Vayots Dzor", "VD"], + ["Yerevan", "ER"], + ], +]; +export const AW = ["Aruba", "AW", [["Aruba", "AW"]]]; +export const AU = [ + "Australia", + "AU", + [ + ["Australian Capital Territory", "ACT"], + ["New South Wales", "NSW"], + ["Northern Territory", "NT"], + ["Queensland", "QLD"], + ["South Australia", "SA"], + ["Tasmania", "TAS"], + ["Victoria", "VIC"], + ["Western Australia", "WA"], + ], +]; +export const AT = [ + "Austria", + "AT", + [ + ["Burgenland", "1"], + ["Kärnten", "2"], + ["Niederösterreich", "3"], + ["Oberösterreich", "4"], + ["Salzburg", "5"], + ["Steiermark", "6"], + ["Tirol", "7"], + ["Vorarlberg", "8"], + ["Wien", "9"], + ], +]; +export const AZ = [ + "Azerbaijan", + "AZ", + [ + ["Abşeron", "ABS"], + ["Ağcabədi", "AGC"], + ["Ağdam", "AGM"], + ["Ağdaş", "AGS"], + ["Ağstafa", "AGA"], + ["Ağsu", "AGU"], + ["Astara", "AST"], + ["Bakı", "BAK"], + ["Babək", "BAB"], + ["Balakən", "BAL"], + ["Bərdə", "BAR"], + ["Beyləqan", "BEY"], + ["Biləsuvar", "BIL"], + ["Cəbrayıl", "CAB"], + ["Cəlilabad", "CAL"], + ["Culfa", "CUL"], + ["Daşkəsən", "DAS"], + ["Füzuli", "FUZ"], + ["Gədəbəy", "GAD"], + ["Goranboy", "GOR"], + ["Göyçay", "GOY"], + ["Göygöl", "GYG"], + ["Hacıqabul", "HAC"], + ["İmişli", "IMI"], + ["İsmayıllı", "ISM"], + ["Kəlbəcər", "KAL"], + ["Kǝngǝrli", "KAN"], + ["Kürdəmir", "KUR"], + ["Laçın", "LAC"], + ["Lənkəran", "LAN"], + ["Lerik", "LER"], + ["Masallı", "MAS"], + ["Neftçala", "NEF"], + ["Oğuz", "OGU"], + ["Ordubad", "ORD"], + ["Qəbələ", "QAB"], + ["Qax", "QAX"], + ["Qazax", "QAZ"], + ["Qobustan", "QOB"], + ["Quba", "QBA"], + ["Qubadli", "QBI"], + ["Qusar", "QUS"], + ["Saatlı", "SAT"], + ["Sabirabad", "SAB"], + ["Şabran", "SBN"], + ["Sədərək", "SAD"], + ["Şahbuz", "SAH"], + ["Şəki", "SAK"], + ["Salyan", "SAL"], + ["Şamaxı", "SMI"], + ["Şəmkir", "SKR"], + ["Samux", "SMX"], + ["Şərur", "SAR"], + ["Siyəzən", "SIY"], + ["Şuşa", "SUS"], + ["Tərtər", "TAR"], + ["Tovuz", "TOV"], + ["Ucar", "UCA"], + ["Xaçmaz", "XAC"], + ["Xızı", "XIZ"], + ["Xocalı", "XCI"], + ["Xocavənd", "XVD"], + ["Yardımlı", "YAR"], + ["Yevlax", "YEV"], + ["Zəngilan", "ZAN"], + ["Zaqatala", "ZAQ"], + ["Zərdab", "ZAR"], + ], +]; +export const BS = [ + "Bahamas", + "BS", + [ + ["Acklins Island", "01"], + ["Berry Islands", "22"], + ["Bimini", "02"], + ["Black Point", "23"], + ["Cat Island", "03"], + ["Central Abaco", "24"], + ["Crooked Island and Long Cay", "28"], + ["East Grand Bahama", "29"], + ["Exuma", "04"], + ["Freeport", "05"], + ["Fresh Creek", "06"], + ["Governor's Harbour", "07"], + ["Green Turtle Cay", "08"], + ["Harbour Island", "09"], + ["High Rock", "10"], + ["Inagua", "11"], + ["Kemps Bay", "12"], + ["Long Island", "13"], + ["Marsh Harbour", "14"], + ["Mayaguana", "15"], + ["Moore’s Island", "40"], + ["New Providence", "16"], + ["Nichollstown and Berry Islands", "17"], + ["North Abaco", "42"], + ["North Andros", "41"], + ["North Eleuthera", "33"], + ["Ragged Island", "18"], + ["Rock Sound", "19"], + ["San Salvador and Rum Cay", "20"], + ["Sandy Point", "21"], + ["South Abaco", "35"], + ["South Andros", "36"], + ["South Eleuthera", "37"], + ["West Grand Bahama", "39"], + ["Central Andros", "43"], + ["Central Eleuthera", "44"], + ["Grand Cay", "45"], + ["Hope Town", "46"], + ["Mangrove Cay", "47"], + ["Spanish Wells", "48"], + ], +]; +export const BH = [ + "Bahrain", + "BH", + [ + ["Al Janūbīyah", "14"], + ["Al Manāmah", "13"], + ["Al Muḩarraq", "15"], + ["Al Wusţá", "16"], + ["Ash Shamālīyah", "17"], + ], +]; +export const BD = [ + "Bangladesh", + "BD", + [ + ["Barisal", "A"], + ["Chittagong", "B"], + ["Dhaka", "C"], + ["Khulna", "D"], + ["Mymensingh", "M"], + ["Rajshahi", "E"], + ["Rangpur", "F"], + ["Sylhet", "G"], + ], +]; +export const BB = [ + "Barbados", + "BB", + [ + ["Christ Church", "01"], + ["Saint Andrew", "02"], + ["Saint George", "03"], + ["Saint James", "04"], + ["Saint John", "05"], + ["Saint Joseph", "06"], + ["Saint Lucy", "07"], + ["Saint Michael", "08"], + ["Saint Peter", "09"], + ["Saint Philip", "10"], + ["Saint Thomas", "11"], + ], +]; +export const BY = [ + "Belarus", + "BY", + [ + ["Brest voblast", "BR"], + ["Gorod Minsk", "HM"], + ["Homiel voblast", "HO"], + ["Hrodna voblast", "HR"], + ["Mahilyow voblast", "MA"], + ["Minsk voblast", "MI"], + ["Vitsebsk voblast", "VI"], + ], +]; +export const BE = [ + "Belgium", + "BE", + [ + ["Brussels", "BRU"], + ["Flanders", "VLG"], + ["Wallonia", "WAL"], + ], +]; +export const BZ = [ + "Belize", + "BZ", + [ + ["Belize District", "BZ"], + ["Cayo District", "CY"], + ["Corozal District", "CZL"], + ["Orange Walk District", "OW"], + ["Stann Creek District", "SC"], + ["Toledo District", "TOL"], + ], +]; +export const BJ = [ + "Benin", + "BJ", + [ + ["Alibori", "AL"], + ["Atakora", "AK"], + ["Atlantique", "AQ"], + ["Borgou", "BO"], + ["Collines Department", "CO"], + ["Donga", "DO"], + ["Kouffo", "KO"], + ["Littoral Department", "LI"], + ["Mono Department", "MO"], + ["Ouémé", "OU"], + ["Plateau", "PL"], + ["Zou", "ZO"], + ], +]; +export const BM = [ + "Bermuda", + "BM", + [ + ["City of Hamilton", "03"], + ["Devonshire Parish", "01"], + ["Hamilton Parish", "02"], + ["Paget Parish", "04"], + ["Pembroke Parish", "05"], + ["Sandys Parish", "08"], + ["Smith's Parish", "09"], + ["Southampton Parish", "10"], + ["St. George's Parish", "07"], + ["Town of St. George", "06"], + ["Warwick Parish", "11"], + ], +]; +export const BT = [ + "Bhutan", + "BT", + [ + ["Bumthang", "33"], + ["Chhukha", "12"], + ["Dagana", "22"], + ["Gasa", "GA"], + ["Haa", "13"], + ["Lhuntse", "44"], + ["Mongar", "42"], + ["Paro", "11"], + ["Pemagatshel", "43"], + ["Punakha", "23"], + ["Samdrup Jongkhar", "45"], + ["Samtse", "14"], + ["Sarpang", "31"], + ["Thimphu", "15"], + ["Trashigang", "41"], + ["Trashiyangtse", "TY"], + ["Trongsa", "32"], + ["Tsirang", "21"], + ["Wangdue Phodrang", "24"], + ["Zhemgang", "34"], + ], +]; +export const BO = [ + "Bolivia", + "BO", + [ + ["Beni", "BE"], + ["Chuquisaca", "CH"], + ["Cochabamba", "CB"], + ["La Paz", "LP"], + ["Oruro", "OR"], + ["Pando", "PD"], + ["Potosí", "PT"], + ["Santa Cruz", "SC"], + ["Tarija", "TJ"], + ], +]; +export const BQ = [ + "Bonaire, Sint Eustatius and Saba", + "BQ", + [ + ["Bonaire", "BO"], + ["Saba Isand", "SA"], + ["Sint Eustatius", "SE"], + ], +]; +export const BA = [ + "Bosnia and Herzegovina", + "BA", + [ + ["Brčko Distrikt", "BRC"], + ["Federacija Bosne i Hercegovine", "BIH"], + ["Republika Srpska", "SRP"], + ], +]; +export const BW = [ + "Botswana", + "BW", + [ + ["Central", "CE"], + ["Ghanzi", "GH"], + ["Kgalagadi", "KG"], + ["Kgatleng", "KL"], + ["Kweneng", "KW"], + ["North West", "NW"], + ["North-East", "NE"], + ["South East", "SE"], + ["Southern", "SO"], + ], +]; +export const BV = ["Bouvet Island", "BV", [["Bouvet Island", "BV"]]]; +export const BR = [ + "Brazil", + "BR", + [ + ["Acre", "AC"], + ["Alagoas", "AL"], + ["Amapá", "AP"], + ["Amazonas", "AM"], + ["Bahia", "BA"], + ["Ceará", "CE"], + ["Distrito Federal", "DF"], + ["Espírito Santo", "ES"], + ["Goiás", "GO"], + ["Maranhão", "MA"], + ["Mato Grosso", "MT"], + ["Mato Grosso do Sul", "MS"], + ["Minas Gerais", "MG"], + ["Pará", "PA"], + ["Paraíba", "PB"], + ["Paraná", "PR"], + ["Pernambuco", "PE"], + ["Piauí", "PI"], + ["Rio de Janeiro", "RJ"], + ["Rio Grande do Norte", "RN"], + ["Rio Grande do Sul", "RS"], + ["Rondônia", "RO"], + ["Roraima", "RR"], + ["Santa Catarina", "SC"], + ["São Paulo", "SP"], + ["Sergipe", "SE"], + ["Tocantins", "TO"], + ], +]; +export const IO = [ + "British Indian Ocean Territory", + "IO", + [["British Indian Ocean Territory", "IO"]], +]; +export const BN = [ + "Brunei Darussalam", + "BN", + [ + ["Belait", "BE"], + ["Brunei Muara", "BM"], + ["Temburong", "TE"], + ["Tutong", "TU"], + ], +]; +export const BG = [ + "Bulgaria", + "BG", + [ + ["Blagoevgrad", "01"], + ["Burgas", "02"], + ["Dobrich", "08"], + ["Gabrovo", "07"], + ["Jambol", "28"], + ["Khaskovo", "26"], + ["Kjustendil", "10"], + ["Kurdzhali", "09"], + ["Lovech", "11"], + ["Montana", "12"], + ["Pazardzhik", "13"], + ["Pernik", "14"], + ["Pleven", "15"], + ["Plovdiv", "16"], + ["Razgrad", "17"], + ["Ruse", "18"], + ["Shumen", "27"], + ["Silistra", "19"], + ["Sliven", "20"], + ["Smoljan", "21"], + ["Sofija", "23"], + ["Sofija-Grad", "22"], + ["Stara Zagora", "24"], + ["Turgovishhe", "25"], + ["Varna", "03"], + ["Veliko Turnovo", "04"], + ["Vidin", "05"], + ["Vraca", "06"], + ], +]; +export const BF = [ + "Burkina Faso", + "BF", + [ + ["Balé", "BAL"], + ["Bam/Lake Bam", "BAM"], + ["Banwa Province", "BAN"], + ["Bazèga", "BAZ"], + ["Bougouriba", "BGR"], + ["Boulgou Province", "BLG"], + ["Boulkiemdé", "BLK"], + ["Comoé/Komoe", "COM"], + ["Ganzourgou Province", "GAN"], + ["Gnagna", "GNA"], + ["Gourma Province", "GOU"], + ["Houet", "HOU"], + ["Ioba", "IOB"], + ["Kadiogo", "KAD"], + ["Kénédougou", "KEN"], + ["Komondjari", "KMD"], + ["Kompienga", "KMP"], + ["Kossi Province", "KOS"], + ["Koulpélogo", "KOP"], + ["Kouritenga", "KOT"], + ["Kourwéogo", "KOW"], + ["Léraba", "LER"], + ["Loroum", "LOR"], + ["Mouhoun", "MOU"], + ["Namentenga", "NAM"], + ["Naouri/Nahouri", "NAO"], + ["Nayala", "NAY"], + ["Noumbiel", "NOU"], + ["Oubritenga", "OUB"], + ["Oudalan", "OUD"], + ["Passoré", "PAS"], + ["Poni", "PON"], + ["Sanguié", "SNG"], + ["Sanmatenga", "SMT"], + ["Séno", "SEN"], + ["Sissili", "SIS"], + ["Soum", "SOM"], + ["Sourou", "SOR"], + ["Tapoa", "TAP"], + ["Tui/Tuy", "TUI"], + ["Yagha", "YAG"], + ["Yatenga", "YAT"], + ["Ziro", "ZIR"], + ["Zondoma", "ZON"], + ["Zoundwéogo", "ZOU"], + ], +]; +export const BI = [ + "Burundi", + "BI", + [ + ["Bubanza", "BB"], + ["Bujumbura Mairie", "BM"], + ["Bujumbura Rural", "BL"], + ["Bururi", "BR"], + ["Cankuzo", "CA"], + ["Cibitoke", "CI"], + ["Gitega", "GI"], + ["Karuzi", "KR"], + ["Kayanza", "KY"], + ["Kirundo", "KI"], + ["Makamba", "MA"], + ["Muramvya", "MU"], + ["Muyinga", "MY"], + ["Mwaro", "MW"], + ["Ngozi", "NG"], + ["Rutana", "RT"], + ["Ruyigi", "RY"], + ], +]; +export const KH = [ + "Cambodia", + "KH", + [ + ["Baat Dambang", "2"], + ["Banteay Mean Chey", "1"], + ["Kampong Chaam", "3"], + ["Kampong Chhnang", "4"], + ["Kampong Spueu", "5"], + ["Kampong Thum", "6"], + ["Kampot", "7"], + ["Kandaal", "8"], + ["Kaoh Kong", "9"], + ["Kracheh", "10"], + ["Krong Kaeb", "23"], + ["Krong Pailin", "24"], + ["Krong Preah Sihanouk", "18"], + ["Mondol Kiri", "11"], + ["Otdar Mean Chey", "22"], + ["Phnom Penh", "12"], + ["Pousaat", "15"], + ["Preah Vihear", "13"], + ["Prey Veaeng", "14"], + ["Rotanah Kiri", "16"], + ["Siem Reab", "17"], + ["Stueng Treng", "19"], + ["Svaay Rieng", "20"], + ["Taakaev", "21"], + ["Tbong Khmum", "25"], + ], +]; +export const CM = [ + "Cameroon", + "CM", + [ + ["Adamaoua", "AD"], + ["Centre", "CE"], + ["Est", "ES"], + ["Extrême-Nord", "EN"], + ["Littoral", "LT"], + ["Nord", "NO"], + ["Nord-Ouest", "NW"], + ["Ouest", "OU"], + ["Sud", "SU"], + ["Sud-Ouest", "SW"], + ], +]; +export const CA = [ + "Canada", + "CA", + [ + ["Alberta", "AB"], + ["British Columbia", "BC"], + ["Manitoba", "MB"], + ["New Brunswick", "NB"], + ["Newfoundland and Labrador", "NL"], + ["Northwest Territories", "NT"], + ["Nova Scotia", "NS"], + ["Nunavut", "NU"], + ["Ontario", "ON"], + ["Prince Edward Island", "PE"], + ["Quebec", "QC"], + ["Saskatchewan", "SK"], + ["Yukon", "YT"], + ], +]; +export const CV = [ + "Cape Verde", + "CV", + [ + ["Boa Vista", "BV"], + ["Brava", "BR"], + ["Calheta de São Miguel", "CS"], + ["Maio", "MA"], + ["Mosteiros", "MO"], + ["Paúl", "PA"], + ["Porto Novo", "PN"], + ["Praia", "PR"], + ["Ribeira Brava", "RB"], + ["Ribeira Grande", "RG"], + ["Sal", "SL"], + ["Santa Catarina", "CA"], + ["Santa Cruz", "CR"], + ["São Domingos", "SD"], + ["São Filipe", "SF"], + ["São Nicolau", "SN"], + ["São Vicente", "SV"], + ["Tarrafal", "TA"], + ["Tarrafal de São Nicolau", "TS"], + ], +]; +export const KY = [ + "Cayman Islands", + "KY", + [ + ["Bodden Town", "BT"], + ["East End", "EE"], + ["George Town", "GT"], + ["North Side", "NS"], + ["Sister Islands", "SI"], + ["West Bay", "WB"], + ], +]; +export const CF = [ + "Central African Republic", + "CF", + [ + ["Bamingui-Bangoran", "BB"], + ["Bangui", "BGF"], + ["Basse-Kotto", "BK"], + ["Haute-Kotto", "HK"], + ["Haut-Mbomou", "HM"], + ["Kémo", "KG"], + ["Lobaye", "LB"], + ["Mambéré-Kadéï", "HS"], + ["Mbomou", "MB"], + ["Nana-Grebizi", "10"], + ["Nana-Mambéré", "NM"], + ["Ombella-M'Poko", "MP"], + ["Ouaka", "UK"], + ["Ouham", "AC"], + ["Ouham Péndé", "OP"], + ["Sangha-Mbaéré", "SE"], + ["Vakaga", "VK"], + ], +]; +export const TD = [ + "Chad", + "TD", + [ + ["Bahr el Ghazal", "BG"], + ["Batha", "BA"], + ["Borkou", "BO"], + ["Chari-Baguirmi", "CB"], + ["Ennedi-Est", "EE"], + ["Ennedi-Ouest", "EO"], + ["Guéra", "GR"], + ["Hadjer Lamis", "HL"], + ["Kanem", "KA"], + ["Lac", "LC"], + ["Logone Occidental", "LO"], + ["Logone Oriental", "LR"], + ["Mondoul", "MA"], + ["Mayo-Kébbi-Est", "ME"], + ["Moyen-Chari", "MC"], + ["Ouaddai", "OD"], + ["Salamat", "SA"], + ["Sila", "SI"], + ["Tandjilé", "TA"], + ["Tibesti", "TI"], + ["Ville de Ndjamena", "ND"], + ["Wadi Fira", "WF"], + ], +]; +export const CL = [ + "Chile", + "CL", + [ + ["Aisén del General Carlos Ibáñez del Campo", "AI"], + ["Antofagasta", "AN"], + ["Araucanía", "AR"], + ["Arica y Parinacota", "AP"], + ["Atacama", "AT"], + ["Bío-Bío", "BI"], + ["Coquimbo", "CO"], + ["Libertador General Bernardo O'Higgins", "LI"], + ["Los Lagos", "LL"], + ["Los Ríos", "LR"], + ["Magallanes y Antartica Chilena", "MA"], + ["Marga-Marga", ""], + ["Maule", "ML"], + ["Ñuble", "NB"], + ["Región Metropolitana de Santiago", "RM"], + ["Tarapacá", "TA"], + ["Valparaíso", "VS"], + ], +]; +export const CN = [ + "China", + "CN", + [ + ["Anhui", "AH"], + ["Beijing", "BJ"], + ["Chongqing", "CQ"], + ["Fujian", "FJ"], + ["Gansu", "GS"], + ["Guangdong", "GD"], + ["Guangxi", "GX"], + ["Guizhou", "GZ"], + ["Hainan", "HI"], + ["Hebei", "HE"], + ["Heilongjiang", "HL"], + ["Henan", "HA"], + ["Hong Kong", "HK"], + ["Hubei", "HB"], + ["Hunan", "HN"], + ["Inner Mongolia", "NM"], + ["Jiangsu", "JS"], + ["Jiangxi", "JX"], + ["Jilin", "JL"], + ["Liaoning", "LN"], + ["Macau", "MO"], + ["Ningxia", "NX"], + ["Qinghai", "QH"], + ["Shaanxi", "SN"], + ["Shandong", "SD"], + ["Shanghai", "SH"], + ["Shanxi", "SX"], + ["Sichuan", "SC"], + ["Tianjin", "TJ"], + ["Tibet", "XZ"], + ["Xinjiang", "XJ"], + ["Yunnan", "YN"], + ["Zhejiang", "ZJ"], + ], +]; +export const CX = ["Christmas Island", "CX", [["Christmas Island", "CX"]]]; +export const CC = [ + "Cocos (Keeling) Islands", + "CC", + [ + ["Direction Island", "DI"], + ["Home Island", "HM"], + ["Horsburgh Island", "HR"], + ["North Keeling Island", "NK"], + ["South Island", "SI"], + ["West Island", "WI"], + ], +]; +export const CO = [ + "Colombia", + "CO", + [ + ["Amazonas", "AMA"], + ["Antioquia", "ANT"], + ["Arauca", "ARA"], + ["Archipiélago de San Andrés", "SAP"], + ["Atlántico", "ATL"], + ["Bogotá D.C.", "DC"], + ["Bolívar", "BOL"], + ["Boyacá", "BOY"], + ["Caldas", "CAL"], + ["Caquetá", "CAQ"], + ["Casanare", "CAS"], + ["Cauca", "CAU"], + ["Cesar", "CES"], + ["Chocó", "CHO"], + ["Córdoba", "COR"], + ["Cundinamarca", "CUN"], + ["Guainía", "GUA"], + ["Guaviare", "GUV"], + ["Huila", "HUI"], + ["La Guajira", "LAG"], + ["Magdalena", "MAG"], + ["Meta", "MET"], + ["Nariño", "NAR"], + ["Norte de Santander", "NSA"], + ["Putumayo", "PUT"], + ["Quindío", "QUI"], + ["Risaralda", "RIS"], + ["Santander", "SAN"], + ["Sucre", "SUC"], + ["Tolima", "TOL"], + ["Valle del Cauca", "VAC"], + ["Vaupés", "VAU"], + ["Vichada", "VID"], + ], +]; +export const KM = [ + "Comoros", + "KM", + [ + ["Andjazîdja", "G"], + ["Andjouân", "A"], + ["Moûhîlî", "M"], + ], +]; +export const CG = [ + "Congo, Republic of the (Brazzaville)", + "CG", + [ + ["Bouenza", "11"], + ["Brazzaville", "BZV"], + ["Cuvette", "8"], + ["Cuvette-Ouest", "15"], + ["Kouilou", "5"], + ["Lékoumou", "2"], + ["Likouala", "7"], + ["Niari", "9"], + ["Plateaux", "14"], + ["Pointe-Noire", "16"], + ["Pool", "12"], + ["Sangha", "13"], + ], +]; +export const CD = [ + "Congo, the Democratic Republic of the (Kinshasa)", + "CD", + [ + ["Bandundu", "BN"], + ["Bas-Congo", "BC"], + ["Équateur", "EQ"], + ["Kasaï-Occidental", "KE"], + ["Kasaï-Oriental", "KW"], + ["Katanga", "KA"], + ["Kinshasa", "KN"], + ["Maniema", "MA"], + ["Nord-Kivu", "NK"], + ["Orientale", "OR"], + ["Sud-Kivu", "SK"], + ], +]; +export const CK = [ + "Cook Islands", + "CK", + [ + ["Aitutaki", "undefined"], + ["Atiu", "undefined"], + ["Avarua", "undefined"], + ["Mangaia", "undefined"], + ["Manihiki", "undefined"], + ["Ma'uke", "undefined"], + ["Mitiaro", "undefined"], + ["Nassau", "undefined"], + ["Palmerston", "undefined"], + ["Penrhyn", "undefined"], + ["Pukapuka", "undefined"], + ["Rakahanga", "undefined"], + ], +]; +export const CR = [ + "Costa Rica", + "CR", + [ + ["Alajuela", "2"], + ["Cartago", "3"], + ["Guanacaste", "5"], + ["Heredia", "4"], + ["Limón", "7"], + ["Puntarenas", "6"], + ["San José", "1"], + ], +]; +export const CI = [ + "Côte d'Ivoire, Republic of", + "CI", + [ + ["Agnéby", "16"], + ["Bafing", "17"], + ["Bas-Sassandra", "09"], + ["Denguélé", "10"], + ["Dix-Huit Montagnes", "06"], + ["Fromager", "18"], + ["Haut-Sassandra", "02"], + ["Lacs", "07"], + ["Lagunes", "01"], + ["Marahoué", "12"], + ["Moyen-Cavally", "19"], + ["Moyen-Comoé", "05"], + ["N'zi-Comoé", "11"], + ["Savanes", "03"], + ["Sud-Bandama", "15"], + ["Sud-Comoé", "13"], + ["Vallée du Bandama", "04"], + ["Worodougou", "14"], + ["Zanzan", "08"], + ], +]; +export const HR = [ + "Croatia", + "HR", + [ + ["Bjelovarsko-bilogorska županija", "07"], + ["Brodsko-posavska županija", "12"], + ["Dubrovačko-neretvanska županija", "19"], + ["Grad Zagreb", "21"], + ["Istarska županija", "18"], + ["Karlovačka županija", "04"], + ["Koprivničko-križevačka županija", "06"], + ["Krapinsko-zagorska županija", "02"], + ["Ličko-senjska županija", "09"], + ["Međimurska županija", "20"], + ["Osječko-baranjska županija", "14"], + ["Požeško-slavonska županija", "11"], + ["Primorsko-goranska županija", "08"], + ["Sisačko-moslavačka županija", "03"], + ["Splitsko-dalmatinska županija", "17"], + ["Šibensko-kninska županija", "15"], + ["Varaždinska županija", "05"], + ["Virovitičko-podravska županija", "10"], + ["Vukovarsko-srijemska županija", "16"], + ["Zadarska županija", "13"], + ["Zagrebačka županija", "01"], + ], +]; +export const CU = [ + "Cuba", + "CU", + [ + ["Artemisa", "15"], + ["Camagüey", "09"], + ["Ciego de Ávila", "08"], + ["Cienfuegos", "06"], + ["Granma", "12"], + ["Guantánamo", "14"], + ["Holguín", "11"], + ["Isla de la Juventud", "99"], + ["La Habana", "03"], + ["Las Tunas", "10"], + ["Matanzas", "04"], + ["Mayabeque", "16"], + ["Pinar del Río", "01"], + ["Sancti Spíritus", "07"], + ["Santiago de Cuba", "13"], + ["Villa Clara", "05"], + ], +]; +export const CW = ["Curaçao", "CW", [["Curaçao", "CW"]]]; +export const CY = [ + "Cyprus", + "CY", + [ + ["Ammochostos", "04"], + ["Keryneia", "06"], + ["Larnaka", "03"], + ["Lefkosia", "01"], + ["Lemesos", "02"], + ["Pafos", "05"], + ], +]; +export const CZ = [ + "Czech Republic", + "CZ", + [ + ["Hlavní město Praha", "10"], + ["Jihočeský kraj", "31"], + ["Jihomoravský kraj", "64"], + ["Karlovarský kraj", "41"], + ["Královéhradecký kraj", "52"], + ["Liberecký kraj", "51"], + ["Moravskoslezský kraj", "80"], + ["Olomoucký kraj", "71"], + ["Pardubický kraj", "53"], + ["Plzeňský kraj", "32"], + ["Středočeský kraj", "20"], + ["Ústecký kraj", "42"], + ["Vysočina", "63"], + ["Zlínský kraj", "72"], + ], +]; +export const DK = [ + "Denmark", + "DK", + [ + ["Hovedstaden", "DK-84"], + ["Midtjylland", "DK-82"], + ["Nordjylland", "DK-81"], + ["Sjælland", "DK-85"], + ["Syddanmark", "DK-83"], + ], +]; +export const DJ = [ + "Djibouti", + "DJ", + [ + ["Ali Sabieh", "AS"], + ["Arta", "AR"], + ["Dikhil", "DI"], + ["Obock", "OB"], + ["Tadjourah", "TA"], + ], +]; +export const DM = [ + "Dominica", + "DM", + [ + ["Saint Andrew Parish", "02"], + ["Saint David Parish", "03"], + ["Saint George Parish", "04"], + ["Saint John Parish", "05"], + ["Saint Joseph Parish", "06"], + ["Saint Luke Parish", "07"], + ["Saint Mark Parish", "08"], + ["Saint Patrick Parish", "09"], + ["Saint Paul Parish", "10"], + ["Saint Peter Parish", "11"], + ], +]; +export const DO = [ + "Dominican Republic", + "DO", + [ + ["Cibao Central", "02"], + ["Del Valle", "37"], + ["Distrito Nacional", "01"], + ["Enriquillo", "38"], + ["Norcentral", "04"], + ["Nordeste", "33"], + ["Noroeste", "34"], + ["Norte", "35"], + ["Valdesia", "42"], + ], +]; +export const EC = [ + "Ecuador", + "EC", + [ + ["Azuay", "A"], + ["Bolívar", "B"], + ["Cañar", "F"], + ["Carchi", "C"], + ["Chimborazo", "H"], + ["Cotopaxi", "X"], + ["El Oro", "O"], + ["Esmeraldas", "E"], + ["Galápagos", "W"], + ["Guayas", "G"], + ["Imbabura", "I"], + ["Loja", "L"], + ["Los Ríos", "R"], + ["Manabí", "M"], + ["Morona-Santiago", "S"], + ["Napo", "N"], + ["Orellana", "D"], + ["Pastaza", "Y"], + ["Pichincha", "P"], + ["Santa Elena", "SE"], + ["Santo Domingo de los Tsáchilas", "SD"], + ["Sucumbíos", "U"], + ["Tungurahua", "T"], + ["Zamora-Chinchipe", "Z"], + ], +]; +export const EG = [ + "Egypt", + "EG", + [ + ["Alexandria", "ALX"], + ["Aswan", "ASN"], + ["Asyout", "AST"], + ["Bani Sueif", "BNS"], + ["Beheira", "BH"], + ["Cairo", "C"], + ["Daqahlia", "DK"], + ["Dumiat", "DT"], + ["El Bahr El Ahmar", "BA"], + ["El Ismailia", "IS"], + ["El Suez", "SUZ"], + ["El Wadi El Gedeed", "WAD"], + ["Fayoum", "FYM"], + ["Gharbia", "GH"], + ["Giza", "GZ"], + ["Helwan", "HU"], + ["Kafr El Sheikh", "KFS"], + ["Luxor", "LX"], + ["Matrouh", "MT"], + ["Menia", "MN"], + ["Menofia", "MNF"], + ["North Sinai", "SIN"], + ["Port Said", "PTS"], + ["Qalubia", "KB"], + ["Qena", "KN"], + ["Sharqia", "SHR"], + ["Sixth of October", "SU"], + ["Sohag", "SHG"], + ["South Sinai", "JS"], + ], +]; +export const SV = [ + "El Salvador", + "SV", + [ + ["Ahuachapán", "AH"], + ["Cabañas", "CA"], + ["Cuscatlán", "CU"], + ["Chalatenango", "CH"], + ["La Libertad", "LI"], + ["La Paz", "PA"], + ["La Unión", "UN"], + ["Morazán", "MO"], + ["San Miguel", "SM"], + ["San Salvador", "SS"], + ["Santa Ana", "SA"], + ["San Vicente", "SV"], + ["Sonsonate", "SO"], + ["Usulután", "US"], + ], +]; +export const GQ = [ + "Equatorial Guinea", + "GQ", + [ + ["Annobón", "AN"], + ["Bioko Norte", "BN"], + ["Bioko Sur", "BS"], + ["Centro Sur", "CS"], + ["Kié-Ntem", "KN"], + ["Litoral", "LI"], + ["Wele-Nzas", "WN"], + ], +]; +export const ER = [ + "Eritrea", + "ER", + [ + ["Anseba", "AN"], + ["Debub", "DU"], + ["Debub-Keih-Bahri", "DK"], + ["Gash-Barka", "GB"], + ["Maekel", "MA"], + ["Semien-Keih-Bahri", "SK"], + ], +]; +export const EE = [ + "Estonia", + "EE", + [ + ["Harjumaa (Tallinn)", "37"], + ["Hiiumaa (Kardla)", "39"], + ["Ida-Virumaa (Johvi)", "44"], + ["Järvamaa (Paide)", "41"], + ["Jõgevamaa (Jogeva)", "49"], + ["Läänemaa", "57"], + ["Lääne-Virumaa (Rakvere)", "59"], + ["Pärnumaa (Parnu)", "67"], + ["Põlvamaa (Polva)", "65"], + ["Raplamaa (Rapla)", "70"], + ["Saaremaa (Kuessaare)", "74"], + ["Tartumaa (Tartu)", "78"], + ["Valgamaa (Valga)", "82"], + ["Viljandimaa (Viljandi)", "84"], + ["Võrumaa (Voru)", "86"], + ], +]; +export const ET = [ + "Ethiopia", + "ET", + [ + ["Addis Ababa", "AA"], + ["Afar", "AF"], + ["Amhara", "AM"], + ["Benshangul-Gumaz", "BE"], + ["Dire Dawa", "DD"], + ["Gambela", "GA"], + ["Harari", "HA"], + ["Oromia", "OR"], + ["Somali", "SO"], + ["Southern Nations Nationalities and People's Region", "SN"], + ["Tigray", "TI"], + ], +]; +export const FK = [ + "Falkland Islands (Islas Malvinas)", + "FK", + [["Falkland Islands (Islas Malvinas)", "undefined"]], +]; +export const FO = [ + "Faroe Islands", + "FO", + [ + ["Bordoy", "undefined"], + ["Eysturoy", "undefined"], + ["Mykines", "undefined"], + ["Sandoy", "undefined"], + ["Skuvoy", "undefined"], + ["Streymoy", "undefined"], + ["Suduroy", "undefined"], + ["Tvoroyri", "undefined"], + ["Vagar", "undefined"], + ], +]; +export const FJ = [ + "Fiji", + "FJ", + [ + ["Ba", "01"], + ["Bua", "02"], + ["Cakaudrove", "03"], + ["Kadavu", "04"], + ["Lau", "05"], + ["Lomaiviti", "06"], + ["Macuata", "07"], + ["Nadroga and Navosa", "08"], + ["Naitasiri", "09"], + ["Namosi", "10"], + ["Ra", "11"], + ["Rewa", "12"], + ["Rotuma", "R"], + ["Serua", "13"], + ["Tailevu", "14"], + ], +]; +export const FI = [ + "Finland", + "FI", + [ + ["Ahvenanmaan maakunta", "FI-01"], + ["Etelä-Karjala", "FI-02"], + ["Etelä-Pohjanmaa", "FI-03"], + ["Etelä-Savo", "FI-04"], + ["Kainuu", "FI-05"], + ["Kanta-Häme", "FI-06"], + ["Keski-Pohjanmaa", "FI-07"], + ["Keski-Suomi", "FI-08"], + ["Kymenlaakso", "FI-09"], + ["Lappi", "FI-10"], + ["Pirkanmaa", "FI-11"], + ["Pohjanmaa", "FI-12"], + ["Pohjois-Karjala", "FI-13"], + ["Pohjois-Pohjanmaa", "FI-14"], + ["Pohjois-Savo", "FI-15"], + ["Päijät-Häme", "FI-16"], + ["Satakunta", "FI-17"], + ["Uusimaa", "FI-18"], + ["Varsinais-Suomi", "FI-19"], + ], +]; +export const FR = [ + "France", + "FR", + [ + ["Auvergne-Rhône-Alpes", "ARA"], + ["Bourgogne-Franche-Comté", "BFC"], + ["Bretagne", "BRE"], + ["Centre-Val de Loire", "CVL"], + ["Corse", "COR"], + ["Grand Est", "GES"], + ["Hauts-de-France", "HDF"], + ["Île-de-France", "IDF"], + ["Normandie", "NOR"], + ["Nouvelle-Aquitaine", "NAQ"], + ["Occitanie", "OCC"], + ["Pays de la Loire", "PDL"], + ["Provence-Alpes-Côte d'Azur", "PAC"], + ["Clipperton", "CP"], + ["Guadeloupe", "GP"], + ["Guyane", "GF"], + ["Martinique", "MQ"], + ["Mayotte", "YT"], + ["Nouvelle-Calédonie", "NC"], + ["Polynésie", "PF"], + ["Saint-Pierre-et-Miquelon", "PM"], + ["Saint Barthélemy", "BL"], + ["Saint Martin", "MF"], + ["Réunion", "RE"], + ["Terres Australes Françaises", "TF"], + ["Wallis-et-Futuna", "WF"], + ], +]; +export const GF = ["French Guiana", "GF", [["French Guiana", "undefined"]]]; +export const PF = [ + "French Polynesia", + "PF", + [ + ["Archipel des Marquises", "undefined"], + ["Archipel des Tuamotu", "undefined"], + ["Archipel des Tubuai", "undefined"], + ["Iles du Vent", "undefined"], + ["Iles Sous-le-Vent", "undefined"], + ], +]; +export const TF = [ + "French Southern and Antarctic Lands", + "TF", + [ + ["Adelie Land", "undefined"], + ["Ile Crozet", "undefined"], + ["Iles Kerguelen", "undefined"], + ["Iles Saint-Paul et Amsterdam", "undefined"], + ], +]; +export const GA = [ + "Gabon", + "GA", + [ + ["Estuaire", "1"], + ["Haut-Ogooué", "2"], + ["Moyen-Ogooué", "3"], + ["Ngounié", "4"], + ["Nyanga", "5"], + ["Ogooué-Ivindo", "6"], + ["Ogooué-Lolo", "7"], + ["Ogooué-Maritime", "8"], + ["Woleu-Ntem", "9"], + ], +]; +export const GM = [ + "Gambia, The", + "GM", + [ + ["Banjul", "B"], + ["Central River", "M"], + ["Lower River", "L"], + ["North Bank", "N"], + ["Upper River", "U"], + ["Western", "W"], + ], +]; +export const GE = [ + "Georgia", + "GE", + [ + ["Abkhazia (Sokhumi)", "AB"], + ["Ajaria (Bat'umi)", "AJ"], + ["Guria", "GU"], + ["Imereti", "IM"], + ["K'akheti", "KA"], + ["Kvemo Kartli", "KK"], + ["Mtshkheta-Mtianeti", "MM"], + ["Rach'a-Lexhkumi-KvemoSvaneti", "RL"], + ["Samegrelo-Zemo Svaneti", "SZ"], + ["Samtskhe-Javakheti", "SJ"], + ["Shida Kartli", "SK"], + ["Tbilisi", "TB"], + ], +]; +export const DE = [ + "Germany", + "DE", + [ + ["Baden-Württemberg", "BW"], + ["Bayern", "BY"], + ["Berlin", "BE"], + ["Brandenburg", "BB"], + ["Bremen", "HB"], + ["Hamburg", "HH"], + ["Hessen", "HE"], + ["Mecklenburg-Vorpommern", "MV"], + ["Niedersachsen", "NI"], + ["Nordrhein-Westfalen", "NW"], + ["Rheinland-Pfalz", "RP"], + ["Saarland", "SL"], + ["Sachsen", "SN"], + ["Sachsen-Anhalt", "ST"], + ["Schleswig-Holstein", "SH"], + ["Thüringen", "TH"], + ], +]; +export const GH = [ + "Ghana", + "GH", + [ + ["Ahafo", "AF"], + ["Ashanti", "AH"], + ["Bono", "BO"], + ["Bono East", "BE"], + ["Central", "CP"], + ["Eastern", "EP"], + ["Greater Accra", "AA"], + ["Northern", "NP"], + ["North East", "NE"], + ["Oti", "OT"], + ["Savannah", "SV"], + ["Upper East", "UE"], + ["Upper West", "UW"], + ["Volta", "TV"], + ["Western", "WP"], + ["Western North", "WN"], + ], +]; +export const GI = ["Gibraltar", "GI", [["Gibraltar", "undefined"]]]; +export const GR = [ + "Greece", + "GR", + [ + ["Anatolikí Makedonía kai Thráki", "A"], + ["Attikḯ", "I"], + ["Dytikí Elláda", "G"], + ["Dytikí Makedonía", "C"], + ["Ionía Nísia", "F"], + ["Kentrikí Makedonía", "B"], + ["Krítí", "M"], + ["Notío Aigaío", "L"], + ["Peloponnísos", "J"], + ["Stereá Elláda", "H"], + ["Thessalía", "E"], + ["Voreío Aigaío", "K"], + ["Ípeiros", "D"], + ["Ágion Óros", "69"], + ], +]; +export const GL = [ + "Greenland", + "GL", + [ + ["Kommune Kujalleq", "KU"], + ["Kommuneqarfik Sermersooq", "SM"], + ["Qaasuitsup Kommunia", "QA"], + ["Qeqqata Kommunia", "QE"], + ], +]; +export const GD = [ + "Grenada", + "GD", + [ + ["Saint Andrew", "01"], + ["Saint David", "02"], + ["Saint George", "03"], + ["Saint John", "04"], + ["Saint Mark", "05"], + ["Saint Patrick", "06"], + ["Southern Grenadine Islands", "10"], + ], +]; +export const GP = ["Guadeloupe", "GP", [["Guadeloupe", "undefined"]]]; +export const GU = ["Guam", "GU", [["Guam", "undefined"]]]; +export const GT = [ + "Guatemala", + "GT", + [ + ["Alta Verapaz", "AV"], + ["Baja Verapaz", "BV"], + ["Chimaltenango", "CM"], + ["Chiquimula", "CQ"], + ["El Progreso", "PR"], + ["Escuintla", "ES"], + ["Guatemala", "GU"], + ["Huehuetenango", "HU"], + ["Izabal", "IZ"], + ["Jalapa", "JA"], + ["Jutiapa", "JU"], + ["Petén", "PE"], + ["Quetzaltenango", "QZ"], + ["Quiché", "QC"], + ["Retalhuleu", "Re"], + ["Sacatepéquez", "SA"], + ["San Marcos", "SM"], + ["Santa Rosa", "SR"], + ["Sololá", "SO"], + ["Suchitepéquez", "SU"], + ["Totonicapán", "TO"], + ["Zacapa", "ZA"], + ], +]; +export const GG = [ + "Guernsey", + "GG", + [ + ["Castel", "undefined"], + ["Forest", "undefined"], + ["St. Andrew", "undefined"], + ["St. Martin", "undefined"], + ["St. Peter Port", "undefined"], + ["St. Pierre du Bois", "undefined"], + ["St. Sampson", "undefined"], + ["St. Saviour", "undefined"], + ["Torteval", "undefined"], + ["Vale", "undefined"], + ], +]; +export const GN = [ + "Guinea", + "GN", + [ + ["Boké", "B"], + ["Conakry", "C"], + ["Faranah", "F"], + ["Kankan", "K"], + ["Kindia", "D"], + ["Labé", "L"], + ["Mamou", "M"], + ["Nzérékoré", "N"], + ], +]; +export const GW = [ + "Guinea-Bissau", + "GW", + [ + ["Bafatá", "BA"], + ["Biombo", "BM"], + ["Bissau", "BS"], + ["Bolama-Bijagos", "BL"], + ["Cacheu", "CA"], + ["Gabú", "GA"], + ["Oio", "OI"], + ["Quinara", "QU"], + ["Tombali", "TO"], + ], +]; +export const GY = [ + "Guyana", + "GY", + [ + ["Barima-Waini", "BA"], + ["Cuyuni-Mazaruni", "CU"], + ["Demerara-Mahaica", "DE"], + ["East Berbice-Corentyne", "EB"], + ["Essequibo Islands-West Demerara", "ES"], + ["Mahaica-Berbice", "MA"], + ["Pomeroon-Supenaam", "PM"], + ["Potaro-Siparuni", "PT"], + ["Upper Demerara-Berbice", "UD"], + ["Upper Takutu-Upper Essequibo", "UT"], + ], +]; +export const HT = [ + "Haiti", + "HT", + [ + ["Artibonite", "AR"], + ["Centre", "CE"], + ["Grand'Anse", "GA"], + ["Nippes", "NI"], + ["Nord", "ND"], + ["Nord-Est", "NE"], + ["Nord-Ouest", "NO"], + ["Ouest", "OU"], + ["Sud", "SD"], + ["Sud-Est", "SE"], + ], +]; +export const HM = [ + "Heard Island and McDonald Islands", + "HM", + [["Heard Island and McDonald Islands", "undefined"]], +]; +export const VA = [ + "Holy See (Vatican City)", + "VA", + [["Holy See (Vatican City)", "01"]], +]; +export const HN = [ + "Honduras", + "HN", + [ + ["Atlántida", "AT"], + ["Choluteca", "CH"], + ["Colón", "CL"], + ["Comayagua", "CM"], + ["Copán", "CP"], + ["Cortés", "CR"], + ["El Paraíso", "EP"], + ["Francisco Morazán", "FM"], + ["Gracias a Dios", "GD"], + ["Intibucá", "IN"], + ["Islas de la Bahía", "IB"], + ["La Paz", "LP"], + ["Lempira", "LE"], + ["Ocotepeque", "OC"], + ["Olancho", "OL"], + ["Santa Bárbara", "SB"], + ["Valle", "VA"], + ["Yoro", "YO"], + ], +]; +export const HK = ["Hong Kong", "HK", [["Hong Kong", "HK"]]]; +export const HU = [ + "Hungary", + "HU", + [ + ["Bács-Kiskun", "BK"], + ["Baranya", "BA"], + ["Békés", "BE"], + ["Békéscsaba", "BC"], + ["Borsod-Abauj-Zemplen", "BZ"], + ["Budapest", "BU"], + ["Csongrád", "CS"], + ["Debrecen", "DE"], + ["Dunaújváros", "DU"], + ["Eger", "EG"], + ["Érd", "ER"], + ["Fejér", "FE"], + ["Győr", "GY"], + ["Győr-Moson-Sopron", "GS"], + ["Hajdú-Bihar", "HB"], + ["Heves", "HE"], + ["Hódmezővásárhely", "HV"], + ["Jász-Nagykun-Szolnok", "JN"], + ["Kaposvár", "KV"], + ["Kecskemét", "KM"], + ["Komárom-Esztergom", "KE"], + ["Miskolc", "MI"], + ["Nagykanizsa", "NK"], + ["Nógrád", "NO"], + ["Nyíregyháza", "NY"], + ["Pécs", "PS"], + ["Pest", "PE"], + ["Salgótarján", "ST"], + ["Somogy", "SO"], + ["Sopron", "SN"], + ["Szabolcs-á-Bereg", "SZ"], + ["Szeged", "SD"], + ["Székesfehérvár", "SF"], + ["Szekszárd", "SS"], + ["Szolnok", "SK"], + ["Szombathely", "SH"], + ["Tatabánya", "TB"], + ["Tolna", "TO"], + ["Vas", "VA"], + ["Veszprém", "VE"], + ["Veszprém (City)", "VM"], + ["Zala", "ZA"], + ["Zalaegerszeg", "ZE"], + ], +]; +export const IS = [ + "Iceland", + "IS", + [ + ["Austurland", "7"], + ["Höfuðborgarsvæði", "1"], + ["Norðurland eystra", "6"], + ["Norðurland vestra", "5"], + ["Suðurland", "8"], + ["Suðurnes", "2"], + ["Vestfirðir", "4"], + ["Vesturland", "3"], + ], +]; +export const IN = [ + "India", + "IN", + [ + ["Andaman and Nicobar Islands", "AN"], + ["Andhra Pradesh", "AP"], + ["Arunachal Pradesh", "AR"], + ["Assam", "AS"], + ["Bihar", "BR"], + ["Chandigarh", "CH"], + ["Chhattisgarh", "CT"], + ["Dadra and Nagar Haveli and Daman and Diu", "DH"], + ["Delhi", "DL"], + ["Goa", "GA"], + ["Gujarat", "GJ"], + ["Haryana", "HR"], + ["Himachal Pradesh", "HP"], + ["Jammu and Kashmir", "JK"], + ["Jharkhand", "JH"], + ["Karnataka", "KA"], + ["Kerala", "KL"], + ["Ladakh", "LA"], + ["Lakshadweep", "LD"], + ["Madhya Pradesh", "MP"], + ["Maharashtra", "MH"], + ["Manipur", "MN"], + ["Meghalaya", "ML"], + ["Mizoram", "MZ"], + ["Nagaland", "NL"], + ["Odisha", "OR"], + ["Puducherry", "PY"], + ["Punjab", "PB"], + ["Rajasthan", "RJ"], + ["Sikkim", "SK"], + ["Tamil Nadu", "TN"], + ["Telangana", "TG"], + ["Tripura", "TR"], + ["Uttarakhand", "UT"], + ["Uttar Pradesh", "UP"], + ["West Bengal", "WB"], + ], +]; +export const ID = [ + "Indonesia", + "ID", + [ + ["Aceh", "AC"], + ["Bali", "BA"], + ["Bangka Belitung", "BB"], + ["Banten", "BT"], + ["Bengkulu", "BE"], + ["Gorontalo", "GO"], + ["Jakarta Raya", "JK"], + ["Jambi", "JA"], + ["Jawa Barat", "JB"], + ["Jawa Tengah", "JT"], + ["Jawa Timur", "JI"], + ["Kalimantan Barat", "KB"], + ["Kalimantan Selatan", "KS"], + ["Kalimantan Tengah", "KT"], + ["Kalimantan Timur", "KI"], + ["Kalimantan Utara", "KU"], + ["Kepulauan Riau", "KR"], + ["Lampung", "LA"], + ["Maluku", "MA"], + ["Maluku Utara", "MU"], + ["Nusa Tenggara Barat", "NB"], + ["Nusa Tenggara Timur", "NT"], + ["Papua", "PA"], + ["Papua Barat", "PB"], + ["Riau", "RI"], + ["Sulawesi Selatan", "SR"], + ["Sulawesi Tengah", "ST"], + ["Sulawesi Tenggara", "SG"], + ["Sulawesi Utara", "SA"], + ["Sumatera Barat", "SB"], + ["Sumatera Selatan", "SS"], + ["Sumatera Utara", "SU"], + ["Yogyakarta", "YO"], + ], +]; +export const IR = [ + "Iran, Islamic Republic of", + "IR", + [ + ["Alborz", "32"], + ["Ardabīl", "03"], + ["Āz̄arbāyjān-e Gharbī", "02"], + ["Āz̄arbāyjān-e Sharqī", "01"], + ["Būshehr", "06"], + ["Chahār Maḩāl va Bakhtīārī", "08"], + ["Eşfahān", "04"], + ["Fārs", "14"], + ["Gīlān", "19"], + ["Golestān", "27"], + ["Hamadān", "24"], + ["Hormozgān", "23"], + ["Īlām", "05"], + ["Kermān", "15"], + ["Kermānshāh", "17"], + ["Khorāsān-e Jonūbī", "29"], + ["Khorāsān-e Raẕavī", "30"], + ["Khorāsān-e Shomālī", "61"], + ["Khūzestān", "10"], + ["Kohgīlūyeh va Bowyer Aḩmad", "18"], + ["Kordestān", "16"], + ["Lorestān", "20"], + ["Markazi", "22"], + ["Māzandarān", "21"], + ["Qazvīn", "28"], + ["Qom", "26"], + ["Semnān", "12"], + ["Sīstān va Balūchestān", "13"], + ["Tehrān", "07"], + ["Yazd", "25"], + ["Zanjān", "11"], + ], +]; +export const IQ = [ + "Iraq", + "IQ", + [ + ["Al Anbār", "AN"], + ["Al Başrah", "BA"], + ["Al Muthanná", "MU"], + ["Al Qādisīyah", "QA"], + ["An Najaf", "NA"], + ["Arbīl", "AR"], + ["As Sulaymānīyah", "SU"], + ["Bābil", "BB"], + ["Baghdād", "BG"], + ["Dohuk", "DA"], + ["Dhī Qār", "DQ"], + ["Diyālá", "DI"], + ["Karbalā'", "KA"], + ["Kirkuk", "KI"], + ["Maysān", "MA"], + ["Nīnawá", "NI"], + ["Şalāḩ ad Dīn", "SD"], + ["Wāsiţ", "WA"], + ], +]; +export const IE = [ + "Ireland", + "IE", + [ + ["Carlow", "CW"], + ["Cavan", "CN"], + ["Clare", "CE"], + ["Cork", "CO"], + ["Donegal", "DL"], + ["Dublin", "D"], + ["Galway", "G"], + ["Kerry", "KY"], + ["Kildare", "KE"], + ["Kilkenny", "KK"], + ["Laois", "LS"], + ["Leitrim", "LM"], + ["Limerick", "LK"], + ["Longford", "LD"], + ["Louth", "LH"], + ["Mayo", "MO"], + ["Meath", "MH"], + ["Monaghan", "MN"], + ["Offaly", "OY"], + ["Roscommon", "RN"], + ["Sligo", "SO"], + ["Tipperary", "TA"], + ["Waterford", "WD"], + ["Westmeath", "WH"], + ["Wexford", "WX"], + ["Wicklow", "WW"], + ], +]; +export const IM = ["Isle of Man", "IM", [["Isle of Man", "undefined"]]]; +export const IL = [ + "Israel", + "IL", + [ + ["HaDarom", "D"], + ["HaMerkaz", "M"], + ["HaTsafon", "Z"], + ["H̱efa", "HA"], + ["Tel-Aviv", "TA"], + ["Yerushalayim", "JM"], + ], +]; +export const IT = [ + "Italy", + "IT", + [ + ["Abruzzo", "65"], + ["Basilicata", "77"], + ["Calabria", "78"], + ["Campania", "72"], + ["Emilia-Romagna", "45"], + ["Friuli-Venezia Giulia", "36"], + ["Lazio", "62"], + ["Liguria", "42"], + ["Lombardia", "25"], + ["Marche", "57"], + ["Molise", "67"], + ["Piemonte", "21"], + ["Puglia", "75"], + ["Sardegna", "88"], + ["Sicilia", "82"], + ["Toscana", "52"], + ["Trentino-Alto Adige", "32"], + ["Umbria", "55"], + ["Valle d'Aosta", "23"], + ["Veneto", "34"], + ], +]; +export const JM = [ + "Jamaica", + "JM", + [ + ["Clarendon", "13"], + ["Hanover", "09"], + ["Kingston", "01"], + ["Manchester", "12"], + ["Portland", "04"], + ["Saint Andrew", "02"], + ["Saint Ann", "06"], + ["Saint Catherine", "14"], + ["Saint Elizabeth", "11"], + ["Saint James", "08"], + ["Saint Mary", "05"], + ["Saint Thomas", "03"], + ["Trelawny", "07"], + ["Westmoreland", "10"], + ], +]; +export const JP = [ + "Japan", + "JP", + [ + ["Aichi", "23"], + ["Akita", "05"], + ["Aomori", "02"], + ["Chiba", "12"], + ["Ehime", "38"], + ["Fukui", "18"], + ["Fukuoka", "40"], + ["Fukushima", "07"], + ["Gifu", "21"], + ["Gunma", "10"], + ["Hiroshima", "34"], + ["Hokkaido", "01"], + ["Hyogo", "28"], + ["Ibaraki", "08"], + ["Ishikawa", "17"], + ["Iwate", "03"], + ["Kagawa", "37"], + ["Kagoshima", "46"], + ["Kanagawa", "14"], + ["Kochi", "39"], + ["Kumamoto", "43"], + ["Kyoto", "26"], + ["Mie", "24"], + ["Miyagi", "04"], + ["Miyazaki", "45"], + ["Nagano", "20"], + ["Nagasaki", "42"], + ["Nara", "29"], + ["Niigata", "15"], + ["Oita", "44"], + ["Okayama", "33"], + ["Okinawa", "47"], + ["Osaka", "27"], + ["Saga", "41"], + ["Saitama", "11"], + ["Shiga", "25"], + ["Shimane", "32"], + ["Shizuoka", "22"], + ["Tochigi", "09"], + ["Tokushima", "36"], + ["Tokyo", "13"], + ["Tottori", "31"], + ["Toyama", "16"], + ["Wakayama", "30"], + ["Yamagata", "06"], + ["Yamaguchi", "35"], + ["Yamanashi", "19"], + ], +]; +export const JE = ["Jersey", "JE", [["Jersey", "undefined"]]]; +export const JO = [ + "Jordan", + "JO", + [ + ["‘Ajlūn", "AJ"], + ["Al 'Aqabah", "AQ"], + ["Al Balqā’", "BA"], + ["Al Karak", "KA"], + ["Al Mafraq", "MA"], + ["Al ‘A̅şimah", "AM"], + ["Aţ Ţafīlah", "AT"], + ["Az Zarqā’", "AZ"], + ["Irbid", "IR"], + ["Jarash", "JA"], + ["Ma‘ān", "MN"], + ["Mādabā", "MD"], + ], +]; +export const KZ = [ + "Kazakhstan", + "KZ", + [ + ["Almaty", "ALA"], + ["Aqmola", "AKM"], + ["Aqtobe", "AKT"], + ["Astana", "AST"], + ["Atyrau", "ATY"], + ["Batys Qazaqstan", "ZAP"], + ["Bayqongyr", "undefined"], + ["Mangghystau", "MAN"], + ["Ongtustik Qazaqstan", "YUZ"], + ["Pavlodar", "PAV"], + ["Qaraghandy", "KAR"], + ["Qostanay", "KUS"], + ["Qyzylorda", "KZY"], + ["Shyghys Qazaqstan", "VOS"], + ["Soltustik Qazaqstan", "SEV"], + ["Zhambyl", "ZHA"], + ], +]; +export const KE = [ + "Kenya", + "KE", + [ + ["Baringo", "01"], + ["Bomet", "02"], + ["Bungoma", "03"], + ["Busia", "04"], + ["Eleyo/Marakwet", "05"], + ["Embu", "06"], + ["Garissa", "07"], + ["Homa Bay", "08"], + ["Isiolo", "09"], + ["Kajiado", "10"], + ["Kakamega", "11"], + ["Kericho", "12"], + ["Kiambu", "13"], + ["Kilifi", "14"], + ["Kirinyaga", "15"], + ["Kisii", "16"], + ["Kisumu", "17"], + ["Kitui", "18"], + ["Kwale", "19"], + ["Laikipia", "20"], + ["Lamu", "21"], + ["Machakos", "22"], + ["Makueni", "23"], + ["Mandera", "24"], + ["Marsabit", "25"], + ["Meru", "26"], + ["Migori", "27"], + ["Mombasa", "28"], + ["Murang'a", "29"], + ["Nairobi City", "30"], + ["Nakuru", "31"], + ["Nandi", "32"], + ["Narok", "33"], + ["Nyamira", "34"], + ["Nyandarua", "35"], + ["Nyeri", "36"], + ["Samburu", "37"], + ["Siaya", "38"], + ["Taita/Taveta", "39"], + ["Tana River", "40"], + ["Tharaka-Nithi", "41"], + ["Trans Nzoia", "42"], + ["Turkana", "43"], + ["Uasin Gishu", "44"], + ["Vihiga", "45"], + ["Wajir", "46"], + ["West Pokot", "47"], + ], +]; +export const KI = [ + "Kiribati", + "KI", + [ + ["Abaiang", "undefined"], + ["Abemama", "undefined"], + ["Aranuka", "undefined"], + ["Arorae", "undefined"], + ["Banaba", "undefined"], + ["Beru", "undefined"], + ["Butaritari", "undefined"], + ["Central Gilberts", "undefined"], + ["Gilbert Islands", "G"], + ["Kanton", "undefined"], + ["Kiritimati", "undefined"], + ["Kuria", "undefined"], + ["Line Islands", "L"], + ["Maiana", "undefined"], + ["Makin", "undefined"], + ["Marakei", "undefined"], + ["Nikunau", "undefined"], + ["Nonouti", "undefined"], + ["Northern Gilberts", "undefined"], + ["Onotoa", "undefined"], + ["Phoenix Islands", "P"], + ["Southern Gilberts", "undefined"], + ["Tabiteuea", "undefined"], + ["Tabuaeran", "undefined"], + ["Tamana", "undefined"], + ["Tarawa", "undefined"], + ["Teraina", "undefined"], + ], +]; +export const KP = [ + "Korea, Democratic People's Republic of", + "KP", + [ + ["Chagang-do (Chagang Province)", "04"], + ["Hamgyong-bukto (North Hamgyong Province)", "09"], + ["Hamgyong-namdo (South Hamgyong Province)", "08"], + ["Hwanghae-bukto (North Hwanghae Province)", "06"], + ["Hwanghae-namdo (South Hwanghae Province)", "05"], + ["Kangwon-do (Kangwon Province)", "07"], + ["Nasŏn (Najin-Sŏnbong)", "13"], + ["P'yongan-bukto (North P'yongan Province)", "03"], + ["P'yongan-namdo (South P'yongan Province)", "02"], + ["P'yongyang-si (P'yongyang City)", "01"], + ["Yanggang-do (Yanggang Province)", "10"], + ], +]; +export const KR = [ + "Korea, Republic of", + "KR", + [ + ["Chungcheongbuk-do", "43"], + ["Chungcheongnam-do", "44"], + ["Jeju-teukbyeoljachido", "49"], + ["Jeollabuk-do", "45"], + ["Jeollanam-do", "46"], + ["Incheon-gwangyeoksi", "28"], + ["Gangwon-do", "42"], + ["Gwangju-gwangyeoksi", "29"], + ["Gyeonggi-do", "41"], + ["Gyeongsangbuk-do", "47"], + ["Gyeongsangnam-do", "48"], + ["Busan-gwangyeoksi", "26"], + ["Seoul-teukbyeolsi", "11"], + ["Sejong-teukbyeoljachisi", "50"], + ["Daegu-gwangyeoksi", "27"], + ["Daejeon-gwangyeoksi", "30"], + ["Ulsan-gwangyeoksi", "31"], + ], +]; +export const XK = [ + "Kosovo", + "XK", + [ + ["Farizaj", "FZ"], + ["Gjakova", "GK"], + ["Gjilan", "GL"], + ["Mitrovica", "MI"], + ["Peja/Peć", "PE"], + ["Pristina", "PR"], + ["Prizren", "PZ"], + ], +]; +export const KW = [ + "Kuwait", + "KW", + [ + ["Al Aḩmadi", "AH"], + ["Al Farwānīyah", "FA"], + ["Al Jahrā’", "JA"], + ["Al ‘Āşimah", "KU"], + ["Ḩawallī", "HA"], + ["Mubārak al Kabir", "MU"], + ], +]; +export const KG = [ + "Kyrgyzstan", + "KG", + [ + ["Batken Oblasty", "B"], + ["Bishkek Shaary", "GB"], + ["Chuy Oblasty (Bishkek)", "C"], + ["Jalal-Abad Oblasty", "J"], + ["Naryn Oblasty", "N"], + ["Osh Oblasty", "O"], + ["Talas Oblasty", "T"], + ["Ysyk-Kol Oblasty (Karakol)", "Y"], + ], +]; +export const LA = [ + "Laos", + "LA", + [ + ["Attapu", "AT"], + ["Bokèo", "BK"], + ["Bolikhamxai", "BL"], + ["Champasak", "CH"], + ["Houaphan", "HO"], + ["Khammouan", "KH"], + ["Louang Namtha", "LM"], + ["Louangphabang", "LP"], + ["Oudômxai", "OU"], + ["Phôngsali", "PH"], + ["Salavan", "SL"], + ["Savannakhét", "SV"], + ["Vientiane", "VI"], + ["Xaignabouli", "XA"], + ["Xékong", "XE"], + ["Xaisomboun", "XS"], + ["Xiangkhouang", "XI"], + ], +]; +export const LV = [ + "Latvia", + "LV", + [ + ["Aglona", "001"], + ["Aizkraukle", "002"], + ["Aizpute", "003"], + ["Aknīste", "004"], + ["Aloja", "005"], + ["Alsunga", "06"], + ["Alūksne", "007"], + ["Amata", "008"], + ["Ape", "009"], + ["Auce", "010"], + ["Ādaži", "011"], + ["Babīte", "012"], + ["Baldone", "013"], + ["Baltinava", "014"], + ["Balvi", "015"], + ["Bauska", "016"], + ["Beverīna", "017"], + ["Brocēni", "018"], + ["Burtnieki", "019"], + ["Carnikava", "020"], + ["Cesvaine", "021"], + ["Cēsis", "022"], + ["Cibla", "023"], + ["Dagda", "024"], + ["Daugavpils", "025"], + ["Daugavpils (City)", "DGV"], + ["Dobele", "026"], + ["Dundaga", "027"], + ["Durbe", "028"], + ["Engure", "029"], + ["Ērgļi", "030"], + ["Garkalne", "031"], + ["Grobiņa", "032"], + ["Gulbene", "033"], + ["Iecava", "034"], + ["Ikšķile", "035"], + ["Ilūkste", "036"], + ["Inčukalns", "037"], + ["Jaunjelgava", "038"], + ["Jaunpiebalga", "039"], + ["Jaunpils", "040"], + ["Jelgava", "041"], + ["Jelgava (City)", "JEL"], + ["Jēkabpils", "042"], + ["Jēkabpils (City)", "JKB"], + ["Jūrmala (City)", "JUR"], + ["Kandava", "043"], + ["Kārsava", "044"], + ["Kocēni", "045"], + ["Koknese", "046"], + ["Krāslava", "047"], + ["Krimulda", "048"], + ["Krustpils", "049"], + ["Kuldīga", "050"], + ["Ķegums", "051"], + ["Ķekava", "052"], + ["Lielvārde", "053"], + ["Liepāja", "LPX"], + ["Limbaži", "054"], + ["Līgatne", "055"], + ["Līvāni", "056"], + ["Lubāna", "057"], + ["Ludza", "058"], + ["Madona", "059"], + ["Mazsalaca", "060"], + ["Mālpils", "061"], + ["Mārupe", "062"], + ["Mērsrags", "063"], + ["Naukšēni", "064"], + ["Nereta", "065"], + ["Nīca", "066"], + ["Ogre", "067"], + ["Olaine", "068"], + ["Ozolnieki", "069"], + ["Pārgauja", "070"], + ["Pāvilosta", "071"], + ["Pļaviņas", "072"], + ["Preiļi", "073"], + ["Priekule", "074"], + ["Priekuļi", "075"], + ["Rauna", "076"], + ["Rēzekne", "077"], + ["Rēzekne (City)", "REZ"], + ["Riebiņi", "078"], + ["Rīga", "RIX"], + ["Roja", "079"], + ["Ropaži", "080"], + ["Rucava", "081"], + ["Rugāji", "082"], + ["Rundāle", "083"], + ["Rūjiena", "084"], + ["Sala", "085"], + ["Salacgrīva", "086"], + ["Salaspils", "087"], + ["Saldus", "088"], + ["Saulkrasti", "089"], + ["Sēja", "090"], + ["Sigulda", "091"], + ["Skrīveri", "092"], + ["Skrunda", "093"], + ["Smiltene", "094"], + ["Stopiņi", "095"], + ["Strenči", "096"], + ["Talsi", "097"], + ["Tērvete", "098"], + ["Tukums", "099"], + ["Vaiņode", "100"], + ["Valka", "101"], + ["Valmiera", "VMR"], + ["Varakļāni", "102"], + ["Vārkava", "103"], + ["Vecpiebalga", "104"], + ["Vecumnieki", "105"], + ["Ventspils", "106"], + ["Ventspils (City)", "VEN"], + ["Viesīte", "107"], + ["Viļaka", "108"], + ["Viļāni", "109"], + ["Zilupe", "110"], + ], +]; +export const LB = [ + "Lebanon", + "LB", + [ + ["Aakkâr", "AK"], + ["Baalbelk-Hermel", "BH"], + ["Béqaa", "BI"], + ["Beyrouth", "BA"], + ["Liban-Nord", "AS"], + ["Liban-Sud", "JA"], + ["Mont-Liban", "JL"], + ["Nabatîyé", "NA"], + ], +]; +export const LS = [ + "Lesotho", + "LS", + [ + ["Berea", "D"], + ["Butha-Buthe", "B"], + ["Leribe", "C"], + ["Mafeteng", "E"], + ["Maseru", "A"], + ["Mohales Hoek", "F"], + ["Mokhotlong", "J"], + ["Qacha's Nek", "H"], + ["Quthing", "G"], + ["Thaba-Tseka", "K"], + ], +]; +export const LR = [ + "Liberia", + "LR", + [ + ["Bomi", "BM"], + ["Bong", "BG"], + ["Gbarpolu", "GP"], + ["Grand Bassa", "GB"], + ["Grand Cape Mount", "CM"], + ["Grand Gedeh", "GG"], + ["Grand Kru", "GK"], + ["Lofa", "LO"], + ["Margibi", "MG"], + ["Maryland", "MY"], + ["Montserrado", "MO"], + ["Nimba", "NI"], + ["River Cess", "RI"], + ["River Geee", "RG"], + ["Sinoe", "SI"], + ], +]; +export const LY = [ + "Libya", + "LY", + [ + ["Al Buţnān", "BU"], + ["Al Jabal al Akhḑar", "JA"], + ["Al Jabal al Gharbī", "JG"], + ["Al Jafārah", "JI"], + ["Al Jufrah", "JU"], + ["Al Kufrah", "FK"], + ["Al Marj", "MJ"], + ["Al Marquab", "MB"], + ["Al Wāḩāt", "WA"], + ["An Nuqaţ al Khams", "NQ"], + ["Az Zāwiyah", "ZA"], + ["Banghāzī", "BA"], + ["Darnah", "DR"], + ["Ghāt", "GH"], + ["Mişrātah", "MI"], + ["Murzuq", "MQ"], + ["Nālūt", "NL"], + ["Sabhā", "SB"], + ["Surt", "SR"], + ["Ţarābulus", "TB"], + ["Yafran", "WD"], + ["Wādī ash Shāţiʾ", "WS"], + ], +]; +export const LI = [ + "Liechtenstein", + "LI", + [ + ["Balzers", "01"], + ["Eschen", "02"], + ["Gamprin", "03"], + ["Mauren", "04"], + ["Planken", "05"], + ["Ruggell", "06"], + ["Schaan", "07"], + ["Schellenberg", "08"], + ["Triesen", "09"], + ["Triesenberg", "10"], + ["Vaduz", "11"], + ], +]; +export const LT = [ + "Lithuania", + "LT", + [ + ["Alytaus", "AL"], + ["Kauno", "KU"], + ["Klaipėdos", "KL"], + ["Marijampolės", "MR"], + ["Panevėžio", "PN"], + ["Šiaulių", "SA"], + ["Tauragės", "TA"], + ["Telšių", "TE"], + ["Utenos", "UT"], + ["Vilniaus", "VL"], + ], +]; +export const LU = [ + "Luxembourg", + "LU", + [ + ["Capellen", "CA"], + ["Clevaux", "CL"], + ["Diekirch", "DI"], + ["Echternach", "EC"], + ["Esch-sur-Alzette", "ES"], + ["Grevenmacher", "GR"], + ["Luxembourg", "LU"], + ["Mersch", "ME"], + ["Redange", "RD"], + ["Remich", "RM"], + ["Vianden", "VD"], + ["Wiltz", "WI"], + ], +]; +export const MO = ["Macao", "MO", [["Macao", "undefined"]]]; +export const MK = [ + "Macedonia, Republic of", + "MK", + [ + ["Aračinovo", "02"], + ["Berovo", "03"], + ["Bitola", "04"], + ["Bogdanci", "05"], + ["Bogovinje", "06"], + ["Bosilovo", "07"], + ["Brvenica", "08"], + ["Centar Župa", "78"], + ["Čaška", "80"], + ["Češinovo-Obleševo", "81"], + ["Čučer Sandevo", "82"], + ["Debar", "21"], + ["Debarca", "22"], + ["Delčevo", "23"], + ["Demir Hisar", "25"], + ["Demir Kapija", "24"], + ["Doran", "26"], + ["Dolneni", "27"], + ["Gevgelija", "18"], + ["Gostivar", "19"], + ["Gradsko", "20"], + ["Ilinden", "34"], + ["Jegunovce", "35"], + ["Karbinci", "37"], + ["Kavadarci", "36"], + ["Kičevo", "40"], + ["Kočani", "42"], + ["Konče", "41"], + ["Kratovo", "43"], + ["Kriva Palanka", "44"], + ["Krivogaštani", "45"], + ["Kruševo", "46"], + ["Kumanovo", "47"], + ["Lipkovo", "48"], + ["Lozovo", "49"], + ["Makedonska Kamenica", "51"], + ["Makedonski Brod", "52"], + ["Mavrovo i Rostuša", "50"], + ["Mogila", "53"], + ["Negotino", "54"], + ["Novaci", "55"], + ["Novo Selo", "56"], + ["Ohrid", "58"], + ["Pehčevo", "60"], + ["Petrovec", "59"], + ["Plasnica", "61"], + ["Prilep", "62"], + ["Probištip", "63"], + ["Radoviš", ""], + ["Rankovce", "65"], + ["Resen", "66"], + ["Rosoman", "67"], + ["Skopje", "85"], + ["Sopište", "70"], + ["Staro Nagoričane", "71"], + ["Struga", "72"], + ["Strumica", "73"], + ["Studeničani", "74"], + ["Sveti Nikole", "69"], + ["Štip", "83"], + ["Tearce", "75"], + ["Tetovo", "76"], + ["Valandovo", "10"], + ["Vasilevo", "11"], + ["Veles", "13"], + ["Vevčani", "12"], + ["Vinica", "14"], + ["Vrapčište", "16"], + ["Zelenikovo", "32"], + ["Zrnovci", "33"], + ["Želino", "30"], + ], +]; +export const MG = [ + "Madagascar", + "MG", + [ + ["Antananarivo", "T"], + ["Antsiranana", "D"], + ["Fianarantsoa", "F"], + ["Mahajanga", "M"], + ["Toamasina", "A"], + ["Toliara", "U"], + ], +]; +export const MW = [ + "Malawi", + "MW", + [ + ["Balaka", "BA"], + ["Blantyre", "BL"], + ["Chikwawa", "CK"], + ["Chiradzulu", "CR"], + ["Chitipa", "CT"], + ["Dedza", "DE"], + ["Dowa", "DO"], + ["Karonga", "KR"], + ["Kasungu", "KS"], + ["Likoma", "LK"], + ["Lilongwe", "LI"], + ["Machinga", "MH"], + ["Mangochi", "MG"], + ["Mchinji", "MC"], + ["Mulanje", "MU"], + ["Mwanza", "MW"], + ["Mzimba", "MZ"], + ["Nkhata Bay", "NE"], + ["Nkhotakota", "NB"], + ["Nsanje", "NS"], + ["Ntcheu", "NU"], + ["Ntchisi", "NI"], + ["Phalombe", "PH"], + ["Rumphi", "RU"], + ["Salima", "SA"], + ["Thyolo", "TH"], + ["Zomba", "ZO"], + ], +]; +export const MY = [ + "Malaysia", + "MY", + [ + ["Johor", "01"], + ["Kedah", "02"], + ["Kelantan", "03"], + ["Melaka", "04"], + ["Negeri Sembilan", "05"], + ["Pahang", "06"], + ["Perak", "08"], + ["Perlis", "09"], + ["Pulau Pinang", "07"], + ["Sabah", "12"], + ["Sarawak", "13"], + ["Selangor", "10"], + ["Terengganu", "11"], + ["Wilayah Persekutuan (Kuala Lumpur)", "14"], + ["Wilayah Persekutuan (Labuan)", "15"], + ["Wilayah Persekutuan (Putrajaya)", "16"], + ], +]; +export const MV = [ + "Maldives", + "MV", + [ + ["Alifu Alifu", "02"], + ["Alifu Dhaalu", "00"], + ["Baa", "20"], + ["Dhaalu", "17"], + ["Faafu", "14"], + ["Gaafu Alifu", "27"], + ["Gaafu Dhaalu", "28"], + ["Gnaviyani", "29"], + ["Haa Alifu", "07"], + ["Haa Dhaalu", "23"], + ["Kaafu", "26"], + ["Laamu", "05"], + ["Lhaviyani", "03"], + ["Malé", "MLE"], + ["Meemu", "12"], + ["Noonu", "25"], + ["Raa", "13"], + ["Seenu", "01"], + ["Shaviyani", "24"], + ["Thaa", "08"], + ["Vaavu", "04"], + ], +]; +export const ML = [ + "Mali", + "ML", + [ + ["Bamako", "BKO"], + ["Gao", "7"], + ["Kayes", "1"], + ["Kidal", "8"], + ["Koulikoro", "2"], + ["Mopti", "5"], + ["Segou", "4"], + ["Sikasso", "3"], + ["Tombouctou", "6"], + ["Taoudénit", "9"], + ["Ménaka", "10"], + ], +]; +export const MT = [ + "Malta", + "MT", + [ + ["Attard", "01"], + ["Balzan", "02"], + ["Birgu", "03"], + ["Birkirkara", "04"], + ["Birżebbuġa", "05"], + ["Bormla", "06"], + ["Dingli", "07"], + ["Fgura", "08"], + ["Floriana", "09"], + ["Fontana", "10"], + ["Guda", "11"], + ["Gżira", "12"], + ["Għajnsielem", "13"], + ["Għarb", "14"], + ["Għargħur", "15"], + ["Għasri", "16"], + ["Għaxaq", "17"], + ["Ħamrun", "18"], + ["Iklin", "19"], + ["Isla", "20"], + ["Kalkara", "21"], + ["Kerċem", "22"], + ["Kirkop", "23"], + ["Lija", "24"], + ["Luqa", "25"], + ["Marsa", "26"], + ["Marsaskala", "27"], + ["Marsaxlokk", "28"], + ["Mdina", "29"], + ["Mellieħa", "30"], + ["Mġarr", "31"], + ["Mosta", "32"], + ["Mqabba", "33"], + ["Msida", "34"], + ["Mtarfa", "35"], + ["Munxar", "36"], + ["Nadur", "37"], + ["Naxxar", "38"], + ["Paola", "39"], + ["Pembroke", "40"], + ["Pietà", "41"], + ["Qala", "42"], + ["Qormi", "43"], + ["Qrendi", "44"], + ["Rabat Għawdex", "45"], + ["Rabat Malta", "46"], + ["Safi", "47"], + ["San Ġiljan", "48"], + ["San Ġwann", "49"], + ["San Lawrenz", "50"], + ["San Pawl il-Baħar", "51"], + ["Sannat", "52"], + ["Santa Luċija", "53"], + ["Santa Venera", "54"], + ["Siġġiewi", "55"], + ["Sliema", "56"], + ["Swieqi", "57"], + ["Tai Xbiex", "58"], + ["Tarzien", "59"], + ["Valletta", "60"], + ["Xagħra", "61"], + ["Xewkija", "62"], + ["Xgħajra", "63"], + ["Żabbar", "64"], + ["Żebbuġ Għawde", "65"], + ["Żebbuġ Malta", "66"], + ["Żejtun", "67"], + ["Żurrieq", "68"], + ], +]; +export const MH = [ + "Marshall Islands", + "MH", + [ + ["Ailinglaplap", "ALL"], + ["Ailuk", "ALK"], + ["Arno", "ARN"], + ["Aur", "AUR"], + ["Bikini and Kili", "KIL"], + ["Ebon", "EBO"], + ["Jabat", "JAB"], + ["Jaluit", "JAL"], + ["Kwajalein", "KWA"], + ["Lae", "LAE"], + ["Lib", "LIB"], + ["Likiep", "LIK"], + ["Majuro", "MAJ"], + ["Maloelap", "MAL"], + ["Mejit", "MEJ"], + ["Namdrik", "NMK"], + ["Namu", "NMU"], + ["Rongelap", "RON"], + ["Ujae", "UJA"], + ["Utrik", "UTI"], + ["Wotho", "WTH"], + ["Wotje", "WTJ"], + ], +]; +export const MQ = ["Martinique", "MQ", [["Martinique", "undefined"]]]; +export const MR = [ + "Mauritania", + "MR", + [ + ["Adrar", "07"], + ["Assaba", "03"], + ["Brakna", "05"], + ["Dakhlet Nouadhibou", "08"], + ["Gorgol", "04"], + ["Guidimaka", "10"], + ["Hodh Ech Chargui", "01"], + ["Hodh El Gharbi", "02"], + ["Inchiri", "12"], + ["Nouakchott Nord", "14"], + ["Nouakchott Ouest", "13"], + ["Nouakchott Sud", "15"], + ["Tagant", "09"], + ["Tiris Zemmour", "11"], + ["Trarza", "06"], + ], +]; +export const MU = [ + "Mauritius", + "MU", + [ + ["Agalega Islands", "AG"], + ["Beau Bassin-Rose Hill", "BR"], + ["Black River", "BL"], + ["Cargados Carajos Shoals", "CC"], + ["Curepipe", "CU"], + ["Flacq", "FL"], + ["Grand Port", "GP"], + ["Moka", "MO"], + ["Pamplemousses", "PA"], + ["Plaines Wilhems", "PW"], + ["Port Louis (City)", "PU"], + ["Port Louis", "PL"], + ["Riviere du Rempart", "RR"], + ["Rodrigues Island", "RO"], + ["Savanne", "SA"], + ["Vacoas-Phoenix", "CP"], + ], +]; +export const YT = [ + "Mayotte", + "YT", + [ + ["Dzaoudzi", "01"], + ["Pamandzi", "02"], + ["Mamoudzou", "03"], + ["Dembeni", "04"], + ["Bandrélé", "05"], + ["Kani-Kéli", "06"], + ["Bouéni", "07"], + ["Chirongui", "08"], + ["Sada", "09"], + ["Ouangani", "10"], + ["Chiconi", "11"], + ["Tsingoni", "12"], + ["M'Tsangamouji", "13"], + ["Acoua", "14"], + ["Mtsamboro", "15"], + ["Bandraboua", "16"], + ["Koungou", "17"], + ], +]; +export const MX = [ + "Mexico", + "MX", + [ + ["Aguascalientes", "AGU"], + ["Baja California", "BCN"], + ["Baja California Sur", "BCS"], + ["Campeche", "CAM"], + ["Ciudad de México", "CMX"], + ["Chiapas", "CHP"], + ["Chihuahua", "CHH"], + ["Coahuila de Zaragoza", "COA"], + ["Colima", "COL"], + ["Durango", "DUR"], + ["Estado de México", "MEX"], + ["Guanajuato", "GUA"], + ["Guerrero", "GRO"], + ["Hidalgo", "HID"], + ["Jalisco", "JAL"], + ["Michoacán de Ocampo", "MIC"], + ["Morelos", "MOR"], + ["Nayarit", "NAY"], + ["Nuevo León", "NLE"], + ["Oaxaca", "OAX"], + ["Puebla", "PUE"], + ["Querétaro de Arteaga", "QUE"], + ["Quintana Roo", "ROO"], + ["San Luis Potosí", "SLP"], + ["Sinaloa", "SIN"], + ["Sonora", "SON"], + ["Tabasco", "TAB"], + ["Tamaulipas", "TAM"], + ["Tlaxcala", "TLA"], + ["Veracruz", "VER"], + ["Yucatán", "YUC"], + ["Zacatecas", "ZAC"], + ], +]; +export const FM = [ + "Micronesia, Federated States of", + "FM", + [ + ["Chuuk (Truk)", "TRK"], + ["Kosrae", "KSA"], + ["Pohnpei", "PNI"], + ["Yap", "YAP"], + ], +]; +export const MD = [ + "Moldova", + "MD", + [ + ["Anenii Noi", "AN"], + ["Basarabeasca", "BS"], + ["Bălți", "BA"], + ["Bender", "BD"], + ["Briceni", "BR"], + ["Cahul", "CA"], + ["Cantemir", "CT"], + ["Călărași", "CL"], + ["Căușeni", "CS"], + ["Chișinău", "CU"], + ["Cimișlia", "CM"], + ["Criuleni", "CR"], + ["Dondușeni", "DO"], + ["Drochia", "DR"], + ["Dubăsari", "DU"], + ["Edineț", "ED"], + ["Fălești", "FA"], + ["Florești", "FL"], + ["Găgăuzia", "GA"], + ["Glodeni", "GL"], + ["Hîncești", "HI"], + ["Ialoveni", "IA"], + ["Leova", "LE"], + ["Nisporeni", "NI"], + ["Ocnița", "OC"], + ["Orhei", "OR"], + ["Rezina", "RE"], + ["Rîșcani", "RI"], + ["Sîngerei", "SI"], + ["Soroca", "SO"], + ["Stânga Nistrului", "SN"], + ["Strășeni", "ST"], + ["Șoldănești", "SD"], + ["Ștefan Vodă", "SV"], + ["Taraclia", "TA"], + ["Telenești", "TE"], + ["Ungheni", "UN"], + ], +]; +export const MC = [ + "Monaco", + "MC", + [ + ["Colle", "CL"], + ["Condamine", "CO"], + ["Fontvieille", "FO"], + ["Gare", "GA"], + ["Jardin Exotique", "JE"], + ["Larvotto", "LA"], + ["Malbousquet", "MA"], + ["Monaco-Ville", "MO"], + ["Moneghetti", "MG"], + ["Monte-Carlo", "MC"], + ["Moulins", "MU"], + ["Port-Hercule", "PH"], + ["Saint-Roman", "SR"], + ["Sainte-Dévote", "SD"], + ["Source", "SO"], + ["Spélugues", "SP"], + ["Vallon de la Rousse", "VR"], + ], +]; +export const MN = [ + "Mongolia", + "MN", + [ + ["Arhangay", "073"], + ["Bayan-Olgiy", "071"], + ["Bayanhongor", "069"], + ["Bulgan", "067"], + ["Darhan", "037"], + ["Dornod", "061"], + ["Dornogovi", "063"], + ["Dundgovi", "059"], + ["Dzavhan", "057"], + ["Govi-Altay", "065"], + ["Govi-Sumber", "064"], + ["Hovd", "043"], + ["Hovsgol", "041"], + ["Omnogovi", "053"], + ["Ovorhangay", "055"], + ["Selenge", "049"], + ["Suhbaatar", "051"], + ["Tov", "047"], + ["Ulaanbaatar", "1"], + ["Uvs", "046"], + ["Erdenet", "074"], + ], +]; +export const ME = [ + "Montenegro", + "ME", + [ + ["Andrijevica", "01"], + ["Bar", "02"], + ["Berane", "03"], + ["Bijelo Polje", "04"], + ["Budva", "05"], + ["Cetinje", "06"], + ["Danilovgrad", "07"], + ["Gusinje", "22"], + ["Herceg Novi", "08"], + ["Kolašin", "09"], + ["Kotor", "10"], + ["Mojkovac", "11"], + ["Nikšić", "12"], + ["Petnica", "23"], + ["Plav", "13"], + ["Plužine", "14"], + ["Pljevlja", "15"], + ["Podgorica", "16"], + ["Rožaje", "17"], + ["Šavnik", "18"], + ["Tivat", "19"], + ["Ulcinj", "20"], + ["Žabljak", "21"], + ], +]; +export const MS = [ + "Montserrat", + "MS", + [ + ["Saint Anthony", "undefined"], + ["Saint Georges", "undefined"], + ["Saint Peter's", "undefined"], + ], +]; +export const MA = [ + "Morocco", + "MA", + [ + ["Tanger-Tétouan-Al Hoceïma", "MA-01"], + ["L'Oriental", "MA-02"], + ["Fès-Meknès", "MA-03"], + ["Rabat-Salé-Kénitra", "MA-04"], + ["Béni Mellal-Khénifra", "MA-05"], + ["Casablanca-Settat", "MA-06"], + ["Marrakech-Safi", "MA-07"], + ["Drâa-Tafilalet", "MA-08"], + ["Souss-Massa", "MA-09"], + ["Guelmim-Oued Noun", "MA-10"], + ["Laâyoune-Sakia El Hamra", "MA-11"], + ["Dakhla-Oued Ed-Dahab", "MA-12"], + ], +]; +export const MZ = [ + "Mozambique", + "MZ", + [ + ["Cabo Delgado", "P"], + ["Gaza", "G"], + ["Inhambane", "I"], + ["Manica", "B"], + ["Maputo", "L"], + ["Maputo (City)", "MPM"], + ["Nampula", "N"], + ["Niassa", "A"], + ["Sofala", "S"], + ["Tete", "T"], + ["Zambezia", "Q"], + ], +]; +export const MM = [ + "Myanmar", + "MM", + [ + ["Ayeyarwady", "07"], + ["Bago", "02"], + ["Chin", "14"], + ["Kachin", "11"], + ["Kayah", "12"], + ["Kayin", "13"], + ["Magway", "03"], + ["Mandalay", "04"], + ["Mon", "15"], + ["Nay Pyi Taw", "18"], + ["Rakhine", "16"], + ["Sagaing", "01"], + ["Shan", "17"], + ["Tanintharyi", "05"], + ["Yangon", "06"], + ], +]; +export const NA = [ + "Namibia", + "NA", + [ + ["Erongo", "ER"], + ["Hardap", "HA"], + ["Kavango East", "KE"], + ["Kavango West", "KW"], + ["Karas", "KA"], + ["Khomas", "KH"], + ["Kunene", "KU"], + ["Ohangwena", "OW"], + ["Omaheke", "OH"], + ["Omusati", "OS"], + ["Oshana", "ON"], + ["Oshikoto", "OT"], + ["Otjozondjupa", "OD"], + ["Zambezi", "CA"], + ], +]; +export const NR = [ + "Nauru", + "NR", + [ + ["Aiwo", "01"], + ["Anabar", "02"], + ["Anetan", "03"], + ["Anibare", "04"], + ["Baiti", "05"], + ["Boe", "06"], + ["Buada", "07"], + ["Denigomodu", "08"], + ["Ewa", "09"], + ["Ijuw", "10"], + ["Meneng", "11"], + ["Nibok", "12"], + ["Uaboe", "13"], + ["Yaren", "14"], + ], +]; +export const NP = [ + "Nepal", + "NP", + [ + ["Province No. 1", "1"], + ["Madhesh Province", "2"], + ["Bagmati Province", "3"], + ["Gandaki Province", "4"], + ["Lumbini Province", "5"], + ["Karnali Province", "6"], + ["Sudurpashchim Province", "7"], + ], +]; +export const NL = [ + "Netherlands", + "NL", + [ + ["Drenthe", "DR"], + ["Flevoland", "FL"], + ["Friesland", "FR"], + ["Gelderland", "GE"], + ["Groningen", "GR"], + ["Limburg", "LI"], + ["Noord-Brabant", "NB"], + ["Noord-Holland", "NH"], + ["Overijssel", "OV"], + ["Utrecht", "UT"], + ["Zeeland", "ZE"], + ["Zuid-Holland", "ZH"], + ], +]; +export const NC = [ + "New Caledonia", + "NC", + [ + ["Iles Loyaute", "undefined"], + ["Nord", "undefined"], + ["Sud", "undefined"], + ], +]; +export const NZ = [ + "New Zealand", + "NZ", + [ + ["Auckland", "AUK"], + ["Bay of Plenty", "BOP"], + ["Canterbury", "CAN"], + ["Gisborne", "GIS"], + ["Hawke's Bay", "HKB"], + ["Marlborough", "MBH"], + ["Manawatu-Wanganui", "MWT"], + ["Northland", "NTL"], + ["Nelson", "NSN"], + ["Otago", "OTA"], + ["Southland", "STL"], + ["Taranaki", "TKI"], + ["Tasman", "TAS"], + ["Waikato", "WKO"], + ["Wellington", "WGN"], + ["West Coast", "WTC"], + ["Chatham Islands Territory", "CIT"], + ], +]; +export const NI = [ + "Nicaragua", + "NI", + [ + ["Boaco", "BO"], + ["Carazo", "CA"], + ["Chinandega", "CI"], + ["Chontales", "CO"], + ["Estelí", "ES"], + ["Granada", "GR"], + ["Jinotega", "JI"], + ["León", "LE"], + ["Madriz", "MD"], + ["Managua", "MN"], + ["Masaya", "MS"], + ["Matagalpa", "MT"], + ["Nueva Segovia", "NS"], + ["Río San Juan", "SJ"], + ["Rivas", "RI"], + ["Atlántico Norte", "AN"], + ["Atlántico Sur", "AS"], + ], +]; +export const NE = [ + "Niger", + "NE", + [ + ["Agadez", "1"], + ["Diffa", "2"], + ["Dosso", "3"], + ["Maradi", "4"], + ["Niamey", "8"], + ["Tahoua", "5"], + ["Tillabéri", "6"], + ["Zinder", "7"], + ], +]; +export const NG = [ + "Nigeria", + "NG", + [ + ["Abia", "AB"], + ["Abuja Federal Capital Territory", "FC"], + ["Adamawa", "AD"], + ["Akwa Ibom", "AK"], + ["Anambra", "AN"], + ["Bauchi", "BA"], + ["Bayelsa", "BY"], + ["Benue", "BE"], + ["Borno", "BO"], + ["Cross River", "CR"], + ["Delta", "DE"], + ["Ebonyi", "EB"], + ["Edo", "ED"], + ["Ekiti", "EK"], + ["Enugu", "EN"], + ["Gombe", "GO"], + ["Imo", "IM"], + ["Jigawa", "JI"], + ["Kaduna", "KD"], + ["Kano", "KN"], + ["Katsina", "KT"], + ["Kebbi", "KE"], + ["Kogi", "KO"], + ["Kwara", "KW"], + ["Lagos", "LA"], + ["Nasarawa", "NA"], + ["Niger", "NI"], + ["Ogun", "OG"], + ["Ondo", "ON"], + ["Osun", "OS"], + ["Oyo", "OY"], + ["Plateau", "PL"], + ["Rivers", "RI"], + ["Sokoto", "SO"], + ["Taraba", "TA"], + ["Yobe", "YO"], + ["Zamfara", "ZA"], + ], +]; +export const NU = ["Niue", "NU", [["Niue", "undefined"]]]; +export const NF = ["Norfolk Island", "NF", [["Norfolk Island", "undefined"]]]; +export const MP = [ + "Northern Mariana Islands", + "MP", + [ + ["Northern Islands", "undefined"], + ["Rota", "undefined"], + ["Saipan", "undefined"], + ["Tinian", "undefined"], + ], +]; +export const NO = [ + "Norway", + "NO", + [ + ["Akershus", "02"], + ["Aust-Agder", "09"], + ["Buskerud", "06"], + ["Finnmark", "20"], + ["Hedmark", "04"], + ["Hordaland", "12"], + ["Møre og Romsdal", "15"], + ["Nordland", "18"], + ["Nord-Trøndelag", "17"], + ["Oppland", "05"], + ["Oslo", "03"], + ["Rogaland", "11"], + ["Sogn og Fjordane", "14"], + ["Sør-Trøndelag", "16"], + ["Telemark", "08"], + ["Troms", "19"], + ["Vest-Agder", "10"], + ["Vestfold", "07"], + ["Østfold", "01"], + ["Jan Mayen", "22"], + ["Svalbard", "21"], + ], +]; +export const OM = [ + "Oman", + "OM", + [ + ["Ad Dakhiliyah", "DA"], + ["Al Buraymi", "BU"], + ["Al Wusta", "WU"], + ["Az Zahirah", "ZA"], + ["Janub al Batinah", "BS"], + ["Janub ash Sharqiyah", "SS"], + ["Masqat", "MA"], + ["Musandam", "MU"], + ["Shamal al Batinah", "BJ"], + ["Shamal ash Sharqiyah", "SJ"], + ["Zufar", "ZU"], + ], +]; +export const PK = [ + "Pakistan", + "PK", + [ + ["Azad Kashmir", "JK"], + ["Balochistan", "BA"], + ["Gilgit-Baltistan", "GB"], + ["Islamabad", "IS"], + ["Khaibar Pakhtunkhwa", "KP"], + ["Punjab", "PB"], + ["Sindh", "SD"], + ["Federally Administered Tribal Areas", "TA"], + ], +]; +export const PW = [ + "Palau", + "PW", + [ + ["Aimeliik", "002"], + ["Airai", "004"], + ["Angaur", "010"], + ["Hatobohei", "050"], + ["Kayangel", "100"], + ["Koror", "150"], + ["Melekeok", "212"], + ["Ngaraard", "214"], + ["Ngarchelong", "218"], + ["Ngardmau", "222"], + ["Ngatpang", "224"], + ["Ngchesar", "226"], + ["Ngeremlengui", "227"], + ["Ngiwal", "228"], + ["Peleliu", "350"], + ["Sonsoral", "370"], + ], +]; +export const PS = [ + "Palestine", + "PS", + [ + ["Ak Khalīl", "HBN"], + ["Al Quds", "JEM"], + ["Arīḩā wal Aghwār", "JRH"], + ["Bayt Laḩm", "BTH"], + ["Dayr al Balaḩ", "DEB"], + ["Ghazzah", "GZA"], + ["Janīn", "JEN"], + ["Khān Yūnis", "KYS"], + ["Nāblus", "NBS"], + ["Qalqīyah", "QQA"], + ["Rafaḩ", "RFH"], + ["Rām Allāh wal Bīrah", "RBH"], + ["Salfīt", "SLT"], + ["Shamāl Ghazzah", "NGZ"], + ["Ţūbās", "TBS"], + ["Ţūlkarm", "TKM"], + ], +]; +export const PA = [ + "Panama", + "PA", + [ + ["Bocas del Toro", "1"], + ["Chiriquí", "4"], + ["Coclé", "2"], + ["Colón", "3"], + ["Darién", "5"], + ["Emberá", "EM"], + ["Herrera", "6"], + ["Kuna Yala", "KY"], + ["Los Santos", "7"], + ["Ngäbe-Buglé", "NB"], + ["Panamá", "8"], + ["Panamá Oeste", "10"], + ["Veraguas", "9"], + ], +]; +export const PG = [ + "Papua New Guinea", + "PG", + [ + ["Bougainville", "NSB"], + ["Central", "CPM"], + ["Chimbu", "CPK"], + ["East New Britain", "EBR"], + ["East Sepik", "ESW"], + ["Eastern Highlands", "EHG"], + ["Enga", "EPW"], + ["Gulf", "GPK"], + ["Hela", "HLA"], + ["Jiwaka", "JWK"], + ["Madang", "MOM"], + ["Manus", "MRL"], + ["Milne Bay", "MBA"], + ["Morobe", "MPL"], + ["Port Moresby", "NCD"], + ["New Ireland", "NIK"], + ["Northern", "NPP"], + ["Southern Highlands", "SHM"], + ["West New Britain", "WBK"], + ["West Sepik", "SAN"], + ["Western", "WPD"], + ["Western Highlands", "WHM"], + ], +]; +export const PY = [ + "Paraguay", + "PY", + [ + ["Alto Paraguay", "16"], + ["Alto Parana", "10"], + ["Amambay", "13"], + ["Asuncion", "ASU"], + ["Caaguazu", "5"], + ["Caazapa", "6"], + ["Canindeyu", "14"], + ["Central", "11"], + ["Concepcion", "1"], + ["Cordillera", "3"], + ["Boqueron", "17"], + ["Guaira", "4"], + ["Itapua", "7"], + ["Misiones", "8"], + ["Neembucu", "12"], + ["Paraguari", "9"], + ["Presidente Hayes", "15"], + ["San Pedro", "2"], + ], +]; +export const PE = [ + "Peru", + "PE", + [ + ["Amazonas", "AMA"], + ["Ancash", "ANC"], + ["Apurimac", "APU"], + ["Arequipa", "ARE"], + ["Ayacucho", "AYA"], + ["Cajamarca", "CAJ"], + ["Callao", "CAL"], + ["Cusco", "CUS"], + ["Huancavelica", "HUV"], + ["Huanuco", "HUC"], + ["Ica", "ICA"], + ["Junin", "JUN"], + ["La Libertad", "LAL"], + ["Lambayeque", "LAM"], + ["Lima", "LIM"], + ["Loreto", "LOR"], + ["Madre de Dios", "MDD"], + ["Moquegua", "MOQ"], + ["Municipalidad Metropolitana de Lima", "LMA"], + ["Pasco", "PAS"], + ["Piura", "PIU"], + ["Puno", "PUN"], + ["San Martin", "SAM"], + ["Tacna", "TAC"], + ["Tumbes", "TUM"], + ["Ucayali", "UCA"], + ], +]; +export const PH = [ + "Philippines", + "PH", + [ + ["Autonomous Region in Muslim Mindanao", "PH-14"], + ["Bicol", "PH-05"], + ["Cagayan Valley", "PH-02"], + ["Calabarzon", "PH-40"], + ["Caraga", "PH-13"], + ["Central Luzon", "PH-03"], + ["Central Visayas", "PH-07"], + ["Cordillera Administrative Region", "PH-15"], + ["Davao", "PH-11"], + ["Eastern Visayas", "PH-08"], + ["Ilocos", "PH-01"], + ["Mimaropa", "PH-41"], + ["National Capital Region", "PH-00"], + ["Northern Mindanao", "PH-10"], + ["Soccsksargen", "PH-12"], + ["Western Visayas", "PH-06"], + ["Zamboanga Peninsula", "PH-09"], + ], +]; +export const PN = ["Pitcairn", "PN", [["Pitcairn Islands", "undefined"]]]; +export const PL = [ + "Poland", + "PL", + [ + ["Dolnośląskie", "02"], + ["Kujawsko-pomorskie", "04"], + ["Łódzkie", "10"], + ["Lubelskie", "06"], + ["Lubuskie", "08"], + ["Małopolskie", "12"], + ["Mazowieckie", "14"], + ["Opolskie", "16"], + ["Podkarpackie", "18"], + ["Podlaskie", "20"], + ["Pomorskie", "22"], + ["Śląskie", "24"], + ["Świętokrzyskie", "26"], + ["Warmińsko-mazurskie", "28"], + ["Wielkopolskie", "30"], + ["Zachodniopomorskie", "32"], + ], +]; +export const PT = [ + "Portugal", + "PT", + [ + ["Açores", "20"], + ["Aveiro", "01"], + ["Beja", "02"], + ["Braga", "03"], + ["Bragança", "04"], + ["Castelo Branco", "05"], + ["Coimbra", "06"], + ["Évora", "07"], + ["Faro", "08"], + ["Guarda", "09"], + ["Leiria", "10"], + ["Lisboa", "11"], + ["Madeira", "30"], + ["Portalegre", "12"], + ["Porto", "13"], + ["Santarém", "14"], + ["Setúbal", "15"], + ["Viana do Castelo", "16"], + ["Vila Real", "17"], + ["Viseu", "18"], + ], +]; +export const PR = [ + "Puerto Rico", + "PR", + [ + ["Adjuntas", "undefined"], + ["Aguada", "undefined"], + ["Aguadilla", "undefined"], + ["Aguas Buenas", "undefined"], + ["Aibonito", "undefined"], + ["Anasco", "undefined"], + ["Arecibo", "undefined"], + ["Arroyo", "undefined"], + ["Barceloneta", "undefined"], + ["Barranquitas", "undefined"], + ["Bayamon", "undefined"], + ["Cabo Rojo", "undefined"], + ["Caguas", "undefined"], + ["Camuy", "undefined"], + ["Canovanas", "undefined"], + ["Carolina", "undefined"], + ["Cat", "undefined"], + ["Ceiba", "undefined"], + ["Ciales", "undefined"], + ["Cidra", "undefined"], + ["Coamo", "undefined"], + ["Comerio", "undefined"], + ["Corozal", "undefined"], + ["Culebra", "undefined"], + ["Dorado", "undefined"], + ["Fajardo", "undefined"], + ["Florida", "undefined"], + ["Guanica", "undefined"], + ["Guayama", "undefined"], + ["Guayanilla", "undefined"], + ["Guaynabo", "undefined"], + ["Gurabo", "undefined"], + ["Hatillo", "undefined"], + ["Hormigueros", "undefined"], + ["Humacao", "undefined"], + ["Isabe", "undefined"], + ["Juana Diaz", "undefined"], + ["Juncos", "undefined"], + ["Lajas", "undefined"], + ["Lares", "undefined"], + ["Las Marias", "undefined"], + ["Las oiza", "undefined"], + ["Luquillo", "undefined"], + ["Manati", "undefined"], + ["Maricao", "undefined"], + ["Maunabo", "undefined"], + ["Mayaguez", "undefined"], + ["Moca", "undefined"], + ["Morovis", "undefined"], + ["Naguabo", "undefined"], + ["Naranjito", "undefined"], + ["Orocovis", "undefined"], + ["Patillas", "undefined"], + ["Penuelas", "undefined"], + ["Ponce", "undefined"], + ["Quebradillas", "undefined"], + ["Rincon", "undefined"], + ["Rio Grande", "undefined"], + ["Sabana linas", "undefined"], + ["San German", "undefined"], + ["San Juan", "undefined"], + ["San Lorenzo", "undefined"], + ["San Sebastian", "undefined"], + ["Santa Isabel", "undefined"], + ["Toa Alta", "undefined"], + ["Toa Baja", "undefined"], + ["Trujillo Alto", "undefined"], + ["Utuado", "undefined"], + ["Vega Alta", "undefined"], + ["Vega ues", "undefined"], + ["Villalba", "undefined"], + ["Yabucoa", "undefined"], + ["Yauco", "undefined"], + ], +]; +export const QA = [ + "Qatar", + "QA", + [ + ["Ad Dawḩah", "DA"], + ["Al Khawr wa adh Dhakhīrah", "KH"], + ["Al Wakrah", "WA"], + ["Ar Rayyān", "RA"], + ["Ash Shamāl", "MS"], + ["Az̧ Za̧`āyin", "ZA"], + ["Umm Şalāl", "US"], + ], +]; +export const RE = ["Réunion", "RE", [["Réunion", "undefined"]]]; +export const RO = [ + "Romania", + "RO", + [ + ["Alba", "RO-AB"], + ["Arad", "RO-AR"], + ["Arges", "RO-AG"], + ["Bacau", "RO-BC"], + ["Bihor", "RO-BH"], + ["Bistrita-Nasaud", "RO-BN"], + ["Botosani", "RO-BT"], + ["Braila", "RO-BR"], + ["Brasov", "RO-BV"], + ["Bucharest", "RO-B"], + ["Buzau", "RO-BZ"], + ["Calarasi", "RO-CL"], + ["Caras-Severin", "RO-CS"], + ["Cluj", "RO-CJ"], + ["Constanta", "RO-CT"], + ["Covasna", "RO-CV"], + ["Dambovita", "RO-DB"], + ["Dolj", "RO-DJ"], + ["Galati", "RO-GL"], + ["Giurgiu", "RO-GR"], + ["Gorj", "RO-GJ"], + ["Harghita", "RO-HR"], + ["Hunedoara", "RO-HD"], + ["Ialomita", "RO-IL"], + ["Iasi", "RO-IS"], + ["Ilfov", "RO-IF"], + ["Maramures", "RO-MM"], + ["Mehedinti", "RO-MH"], + ["Mures", "RO-MS"], + ["Neamt", "RO-NT"], + ["Olt", "RO-OT"], + ["Prahova", "RO-PH"], + ["Salaj", "RO-SJ"], + ["Satu Mare", "RO-SM"], + ["Sibiu", "RO-SB"], + ["Suceava", "RO-SV"], + ["Teleorman", "RO-TR"], + ["Timis", "RO-TM"], + ["Tulcea", "RO-TL"], + ["Valcea", "RO-VL"], + ["Vaslui", "RO-VS"], + ["Vrancea", "RO-VN"], + ], +]; +export const RU = [ + "Russian Federation", + "RU", + [ + ["Republic of Adygea", "AD"], + ["Republic of Altai (Gorno-Altaysk)", "AL"], + ["Altai Krai", "ALT"], + ["Amur Oblast", "AMU"], + ["Arkhangelsk Oblast", "ARK"], + ["Astrakhan Oblast", "AST"], + ["Republic of Bashkortostan", "BA"], + ["Belgorod Oblast", "BEL"], + ["Bryansk Oblast", "BRY"], + ["Republic of Buryatia", "BU"], + ["Chechen Republic", "CE"], + ["Chelyabinsk Oblast", "CHE"], + ["Chukotka Autonomous Okrug", "CHU"], + ["Chuvash Republic", "CU"], + ["Republic of Dagestan", "DA"], + ["Republic of Ingushetia", "IN"], + ["Irkutsk Oblast", "IRK"], + ["Ivanovo Oblast", "IVA"], + ["Jewish Autonomous Oblast", "JEW"], + ["Kabardino-Balkar Republic", "KB"], + ["Kaliningrad Oblast", "KLN"], + ["Republic of Kalmykia", "KL"], + ["Kaluga Oblast", "KLU"], + ["Kamchatka Krai", "KAM"], + ["Karachay-Cherkess Republic", "KC"], + ["Republic of Karelia", "KR"], + ["Khabarovsk Krai", "KHA"], + ["Republic of Khakassia", "KK"], + ["Khanty-Mansi Autonomous Okrug - Yugra", "KHM"], + ["Kemerovo Oblast", "KEM"], + ["Kirov Oblast", "KIR"], + ["Komi Republic", "KO"], + ["Kostroma Oblast", "KOS"], + ["Krasnodar Krai", "KDA"], + ["Krasnoyarsk Krai", "KYA"], + ["Kurgan Oblast", "KGN"], + ["Kursk Oblast", "KRS"], + ["Leningrad Oblast", "LEN"], + ["Lipetsk Oblast", "LIP"], + ["Magadan Oblast", "MAG"], + ["Mari El Republic", "ME"], + ["Republic of Mordovia", "MO"], + ["Moscow Oblast", "MOS"], + ["Moscow", "MOW"], + ["Murmansk Oblast", "MU"], + ["Nenets Autonomous Okrug", "NEN"], + ["Nizhny Novgorod Oblast", "NIZ"], + ["Novgorod Oblast", "NGR"], + ["Novosibirsk Oblast", "NVS"], + ["Omsk Oblast", "OMS"], + ["Orenburg Oblast", "ORE"], + ["Oryol Oblast", "ORL"], + ["Penza Oblast", "PNZ"], + ["Perm Krai", "PER"], + ["Primorsky Krai", "PRI"], + ["Pskov Oblast", "PSK"], + ["Rostov Oblast", "ROS"], + ["Ryazan Oblast", "RYA"], + ["Saint Petersburg", "SPE"], + ["Sakha (Yakutia) Republic", "SA"], + ["Sakhalin Oblast", "SAK"], + ["Samara Oblast", "SAM"], + ["Saratov Oblast", "SAR"], + ["Republic of North Ossetia-Alania", "NOA"], + ["Smolensk Oblast", "SMO"], + ["Stavropol Krai", "STA"], + ["Sverdlovsk Oblast", "SVE"], + ["Tambov Oblast", "TAM"], + ["Republic of Tatarstan", "TA"], + ["Tomsk Oblast", "TOM"], + ["Tuva Republic", "TU"], + ["Tula Oblast", "TUL"], + ["Tver Oblast", "TVE"], + ["Tyumen Oblast", "TYU"], + ["Udmurt Republic", "UD"], + ["Ulyanovsk Oblast", "ULY"], + ["Vladimir Oblast", "VLA"], + ["Volgograd Oblast", "VGG"], + ["Vologda Oblast", "VLG"], + ["Voronezh Oblast", "VOR"], + ["Yamalo-Nenets Autonomous Okrug", "YAN"], + ["Yaroslavl Oblast", "YAR"], + ["Zabaykalsky Krai", "ZAB"], + ], +]; +export const RW = [ + "Rwanda", + "RW", + [ + ["Kigali", "01"], + ["Eastern", "02"], + ["Northern", "03"], + ["Western", "04"], + ["Southern", "05"], + ], +]; +export const BL = [ + "Saint Barthélemy", + "BL", + [ + ["Au Vent", "02"], + ["Sous le Vent", "01"], + ], +]; +export const SH = [ + "Saint Helena, Ascension and Tristan da Cunha", + "SH", + [ + ["Ascension", "AC"], + ["Saint Helena", "HL"], + ["Tristan da Cunha", "TA"], + ], +]; +export const KN = [ + "Saint Kitts and Nevis", + "KN", + [ + ["Saint Kitts", "K"], + ["Nevis", "N"], + ], +]; +export const LC = [ + "Saint Lucia", + "LC", + [ + ["Anse-la-Raye", "01"], + ["Canaries", "12"], + ["Castries", "02"], + ["Choiseul", "03"], + ["Dennery", "05"], + ["Gros Islet", "06"], + ["Laborie", "07"], + ["Micoud", "08"], + ["Soufriere", "10"], + ["Vieux Fort", "11"], + ], +]; +export const MF = ["Saint Martin", "MF", [["Saint Martin", "undefined"]]]; +export const PM = [ + "Saint Pierre and Miquelon", + "PM", + [ + ["Miquelon", "undefined"], + ["Saint Pierre", "undefined"], + ], +]; +export const VC = [ + "Saint Vincent and the Grenadines", + "VC", + [ + ["Charlotte", "01"], + ["Grenadines", "06"], + ["Saint Andrew", "02"], + ["Saint David", "03"], + ["Saint George", "04"], + ["Saint Patrick", "05"], + ], +]; +export const WS = [ + "Samoa", + "WS", + [ + ["A'ana", "AA"], + ["Aiga-i-le-Tai", "AL"], + ["Atua", "AT"], + ["Fa'asaleleaga", "FA"], + ["Gaga'emauga", "GE"], + ["Gagaifomauga", "GI"], + ["Palauli", "PA"], + ["Satupa'itea", "SA"], + ["Tuamasaga", "TU"], + ["Va'a-o-Fonoti", "VF"], + ["Vaisigano", "VS"], + ], +]; +export const SM = [ + "San Marino", + "SM", + [ + ["Acquaviva", "01"], + ["Borgo Maggiore", "06"], + ["Chiesanuova", "02"], + ["Domagnano", "03"], + ["Faetano", "04"], + ["Fiorentino", "05"], + ["Montegiardino", "08"], + ["San Marino", "07"], + ["Serravalle", "09"], + ], +]; +export const ST = [ + "Sao Tome and Principe", + "ST", + [ + ["Principe", "P"], + ["Sao Tome", "S"], + ], +]; +export const SA = [ + "Saudi Arabia", + "SA", + [ + ["'Asir", "14"], + ["Al Bahah", "11"], + ["Al Hudud ash Shamaliyah", "08"], + ["Al Jawf", "12"], + ["Al Madinah al Munawwarah", "03"], + ["Al Qasim", "05"], + ["Ar Riyad", "01"], + ["Ash Sharqiyah", "04"], + ["Ha'il", "06"], + ["Jazan", "09"], + ["Makkah al Mukarramah", "02"], + ["Najran", "10"], + ["Tabuk", "07"], + ], +]; +export const SN = [ + "Senegal", + "SN", + [ + ["Dakar", "DK"], + ["Diourbel", "DB"], + ["Fatick", "FK"], + ["Kaffrine", "KA"], + ["Kaolack", "KL"], + ["Kedougou", "KE"], + ["Kolda", "KD"], + ["Louga", "LG"], + ["Matam", "MT"], + ["Saint-Louis", "SL"], + ["Sedhiou", "SE"], + ["Tambacounda", "TC"], + ["Thies", "TH"], + ["Ziguinchor", "ZG"], + ], +]; +export const RS = [ + "Serbia", + "RS", + [ + ["Beograd (Belgrade)", "00"], + ["Borski", "14"], + ["Braničevski", "11"], + ["Jablanički", "23"], + ["Južnobački", "06"], + ["Južnobanatski", "04"], + ["Kolubarski", "09"], + ["Kosovski", "25"], + ["Kosovsko-Mitrovački", "28"], + ["Kosovsko-Pomoravski", "29"], + ["Mačvanski", "08"], + ["Moravički", "17"], + ["Nišavski", "20"], + ["Pčinjski", "24"], + ["Pećki", "26"], + ["Pirotski", "22"], + ["Podunavski", "10"], + ["Pomoravski", "13"], + ["Prizrenski", "27"], + ["Rasinski", "19"], + ["Raški", "18"], + ["Severnobački", "01"], + ["Severnobanatski", "03"], + ["Srednjebanatski", "02"], + ["Sremski", "07"], + ["Šumadijski", "12"], + ["Toplički", "21"], + ["Zaječarski", "15"], + ["Zapadnobački", "05"], + ["Zlatiborski", "16"], + ], +]; +export const SC = [ + "Seychelles", + "SC", + [ + ["Anse aux Pins", "01"], + ["Anse Boileau", "02"], + ["Anse Etoile", "03"], + ["Anse Royale", "05"], + ["Anu Cap", "04"], + ["Baie Lazare", "06"], + ["Baie Sainte Anne", "07"], + ["Beau Vallon", "08"], + ["Bel Air", "09"], + ["Bel Ombre", "10"], + ["Cascade", "11"], + ["Glacis", "12"], + ["Grand'Anse Mahe", "13"], + ["Grand'Anse Praslin", "14"], + ["La Digue", "15"], + ["La Riviere Anglaise", "16"], + ["Les Mamelles", "24"], + ["Mont Buxton", "17"], + ["Mont Fleuri", "18"], + ["Plaisance", "19"], + ["Pointe La Rue", "20"], + ["Port Glaud", "21"], + ["Roche Caiman", "25"], + ["Saint Louis", "22"], + ["Takamaka", "23"], + ], +]; +export const SL = [ + "Sierra Leone", + "SL", + [ + ["Eastern", "E"], + ["Northern", "N"], + ["Southern", "S"], + ["Western", "W"], + ], +]; +export const SG = [ + "Singapore", + "SG", + [ + ["Central Singapore", "01"], + ["North East", "02"], + ["North West", "03"], + ["South East", "04"], + ["South West", "05"], + ], +]; +export const SX = [ + "Sint Maarten (Dutch part)", + "SX", + [["Sint Maarten", "undefined"]], +]; +export const SK = [ + "Slovakia", + "SK", + [ + ["Banskobystricky", "BC"], + ["Bratislavsky", "BL"], + ["Kosicky", "KI"], + ["Nitriansky", "NI"], + ["Presovsky", "PV"], + ["Trenciansky", "TC"], + ["Trnavsky", "TA"], + ["Zilinsky", "ZI"], + ], +]; +export const SI = [ + "Slovenia", + "SI", + [ + ["Ajdovscina", "001"], + ["Apace", "195"], + ["Beltinci", "002"], + ["Benedikt", "148"], + ["Bistrica ob Sotli", "149"], + ["Bled", "003"], + ["Bloke", "150"], + ["Bohinj", "004"], + ["Borovnica", "005"], + ["Bovec", "006"], + ["Braslovce", "151"], + ["Brda", "007"], + ["Brezice", "009"], + ["Brezovica", "008"], + ["Cankova", "152"], + ["Celje", "011"], + ["Cerklje na Gorenjskem", "012"], + ["Cerknica", "013"], + ["Cerkno", "014"], + ["Cerkvenjak", "153"], + ["Cirkulane", "196"], + ["Crensovci", "015"], + ["Crna na Koroskem", "016"], + ["Crnomelj", "017"], + ["Destrnik", "018"], + ["Divaca", "019"], + ["Dobje", "154"], + ["Dobrepolje", "020"], + ["Dobrna", "155"], + ["Dobrova-Polhov Gradec", "021"], + ["Dobrovnik", "156"], + ["Dol pri Ljubljani", "022"], + ["Dolenjske Toplice", "157"], + ["Domzale", "023"], + ["Dornava", "024"], + ["Dravograd", "025"], + ["Duplek", "026"], + ["Gorenja Vas-Poljane", "027"], + ["Gorisnica", "028"], + ["Gorje", "207"], + ["Gornja Radgona", "029"], + ["Gornji Grad", "030"], + ["Gornji Petrovci", "031"], + ["Grad", "158"], + ["Grosuplje", "032"], + ["Hajdina", "159"], + ["Hoce-Slivnica", "160"], + ["Hodos", "161"], + ["Horjul", "162"], + ["Hrastnik", "034"], + ["Hrpelje-Kozina", "035"], + ["Idrija", "036"], + ["Ig", "037"], + ["Ilirska Bistrica", "038"], + ["Ivancna Gorica", "039"], + ["Izola", "040"], + ["Jesenice", "041"], + ["Jursinci", "042"], + ["Kamnik", "043"], + ["Kanal", "044"], + ["Kidricevo", "045"], + ["Kobarid", "046"], + ["Kobilje", "047"], + ["Kocevje", "048"], + ["Komen", "049"], + ["Komenda", "164"], + ["Koper", "050"], + ["Kodanjevica na Krki", "197"], + ["Kostel", "165"], + ["Kozje", "051"], + ["Kranj", "052"], + ["Kranjska Gora", "053"], + ["Krizevci", "166"], + ["Krsko", "054"], + ["Kungota", "055"], + ["Kuzma", "056"], + ["Lasko", "057"], + ["Lenart", "058"], + ["Lendava", "059"], + ["Litija", "060"], + ["Ljubljana", "061"], + ["Ljubno", "062"], + ["Ljutomer", "063"], + ["Log-Dragomer", "208"], + ["Logatec", "064"], + ["Loska Dolina", "065"], + ["Loski Potok", "066"], + ["Lovrenc na Pohorju", "167"], + ["Lukovica", "068"], + ["Luce", "067"], + ["Majsperk", "069"], + ["Makole", "198"], + ["Maribor", "070"], + ["Markovci", "168"], + ["Medvode", "071"], + ["Menges", "072"], + ["Metlika", "073"], + ["Mezica", "074"], + ["Miklavz na Dravskem Polju", "169"], + ["Miren-Kostanjevica", "075"], + ["Mirna", "212"], + ["Mirna Pec", "170"], + ["Mislinja", "076"], + ["Mokronog-Trebelno", "199"], + ["Moravce", "077"], + ["Moravske Toplice", "078"], + ["Mozirje", "079"], + ["Murska Sobota", "080"], + ["Naklo", "082"], + ["Nazarje", "083"], + ["Nova Gorica", "084"], + ["Novo Mesto", "085"], + ["Odranci", "086"], + ["Ormoz", "087"], + ["Osilnica", "088"], + ["Pesnica", "089"], + ["Piran", "090"], + ["Pivka", "091"], + ["Podcetrtek", "092"], + ["Podlehnik", "172"], + ["Podvelka", "093"], + ["Poljcane", "200"], + ["Postojna", "094"], + ["Prebold", "174"], + ["Preddvor", "095"], + ["Prevalje", "175"], + ["Ptuj", "096"], + ["Race-Fram", "098"], + ["Radece", "099"], + ["Radenci", "100"], + ["Radlje ob Dravi", "101"], + ["Radovljica", "102"], + ["Ravne na Koroskem", "103"], + ["Razkrizje", "176"], + ["Recica ob Savinji", "209"], + ["Rence-Vogrsko", "201"], + ["Ribnica", "104"], + ["Ribnica na Poboriu", "177"], + ["Rogaska Slatina", "106"], + ["Rogasovci", "105"], + ["Rogatec", "107"], + ["Ruse", "108"], + ["Salovci", "033"], + ["Selnica ob Dravi", "178"], + ["Semic", "109"], + ["Sempeter-Vrtojba", "183"], + ["Sencur", "117"], + ["Sentilj", "118"], + ["Sentjernej", "119"], + ["Sentjur", "120"], + ["Sentrupert", "211"], + ["Sevnica", "110"], + ["Sezana", "111"], + ["Skocjan", "121"], + ["Skofja Loka", "122"], + ["Skofljica", "123"], + ["Slovenj Gradec", "112"], + ["Slovenska Bistrica", "113"], + ["Slovenske Konjice", "114"], + ["Smarje pri elsah", "124"], + ["Smarjeske Toplice", "206"], + ["Smartno ob Paki", "125"], + ["Smartno pri Litiji", "194"], + ["Sodrazica", "179"], + ["Solcava", "180"], + ["Sostanj", "126"], + ["Sredisce ob Dravi", "202"], + ["Starse", "115"], + ["Store", "127"], + ["Straza", "203"], + ["Sveta Ana", "181"], + ["Sveta Trojica v Slovenskih Goricah", "204"], + ["Sveta Andraz v Slovenskih Goricah", "182"], + ["Sveti Jurij", "116"], + ["Sveti Jurij v Slovenskih Goricah", "210"], + ["Sveti Tomaz", "205"], + ["Tabor", "184"], + ["Tisina", "010"], + ["Tolmin", "128"], + ["Trbovlje", "129"], + ["Trebnje", "130"], + ["Trnovska Vas", "185"], + ["Trzin", "186"], + ["Trzic", "131"], + ["Turnisce", "132"], + ["Velenje", "133"], + ["Velika Polana", "187"], + ["Velike Lasce", "134"], + ["Verzej", "188"], + ["Videm", "135"], + ["Vipava", "136"], + ["Vitanje", "137"], + ["Vodice", "138"], + ["Vojnik", "139"], + ["Vransko", "189"], + ["Vrhnika", "140"], + ["Vuzenica", "141"], + ["Zagorje ob Savi", "142"], + ["Zavrc", "143"], + ["Zrece", "144"], + ["Zalec", "190"], + ["Zelezniki", "146"], + ["Zetale", "191"], + ["Ziri", "147"], + ["Zirovnica", "192"], + ["Zuzemberk", "193"], + ], +]; +export const SB = [ + "Solomon Islands", + "SB", + [ + ["Central", "CE"], + ["Choiseul", "CH"], + ["Guadalcanal", "GU"], + ["Honiara", "CT"], + ["Isabel", "IS"], + ["Makira-Ulawa", "MK"], + ["Malaita", "ML"], + ["Rennell and Bellona", "RB"], + ["Temotu", "TE"], + ["Western", "WE"], + ], +]; +export const SO = [ + "Somalia", + "SO", + [ + ["Awdal", "AW"], + ["Bakool", "BK"], + ["Banaadir", "BN"], + ["Bari", "BR"], + ["Bay", "BY"], + ["Galguduud", "GA"], + ["Gedo", "GE"], + ["Hiiraan", "HI"], + ["Jubbada Dhexe", "JD"], + ["Jubbada Hoose", "JH"], + ["Mudug", "MU"], + ["Nugaal", "NU"], + ["Sanaag", "SA"], + ["Shabeellaha Dhexe", "SD"], + ["Shabeellaha Hoose", "SH"], + ["Sool", "SO"], + ["Togdheer", "TO"], + ["Woqooyi Galbeed", "WO"], + ], +]; +export const ZA = [ + "South Africa", + "ZA", + [ + ["Eastern Cape", "EC"], + ["Free State", "FS"], + ["Gauteng", "GT"], + ["KwaZulu-Natal", "NL"], + ["Limpopo", "LP"], + ["Mpumalanga", "MP"], + ["Northern Cape", "NC"], + ["North West", "NW"], + ["Western Cape", "WC"], + ], +]; +export const GS = [ + "South Georgia and South Sandwich Islands", + "GS", + [ + ["Bird Island", "undefined"], + ["Bristol Island", "undefined"], + ["Clerke Rocks", "undefined"], + ["Montagu Island", "undefined"], + ["Saunders Island", "undefined"], + ["South Georgia", "undefined"], + ["Southern Thule", "undefined"], + ["Traversay Islands", "undefined"], + ], +]; +export const SS = [ + "South Sudan", + "SS", + [ + ["Central Equatoria", "CE"], + ["Eastern Equatoria", "EE"], + ["Jonglei", "JG"], + ["Lakes", "LK"], + ["Northern Bahr el Ghazal", "BN"], + ["Unity", "UY"], + ["Upper Nile", "NU"], + ["Warrap", "WR"], + ["Western Bahr el Ghazal", "BW"], + ["Western Equatoria", "EW"], + ], +]; +export const ES = [ + "Spain", + "ES", + [ + ["Andalucìa", "AN"], + ["Albacete", "AB"], + ["Alicante", "A"], + ["Almería", "AL"], + ["Araba/Álava", "VI"], + ["Asturias", "O"], + ["Ávila", "AV"], + ["Aragòn", "AR"], + ["Badajoz", "BA"], + ["Barcelona", "B"], + ["Bizkaia", "BI"], + ["Burgos", "BU"], + ["Cáceres", "CC"], + ["Cádiz", "CA"], + ["Canarias", "CN"], + ["Cantabria", "S"], + ["Castellón/Castelló", "CS"], + ["Ceuta", "CE"], + ["Ciudad Real", "CR"], + ["Córdoba", "CO"], + ["A Coruña", "C"], + ["Cuenca", "CU"], + ["Gipuzkoa", "SS"], + ["Girona", "GI"], + ["Granada", "GR"], + ["Guadalajara", "GU"], + ["Huelva", "H"], + ["Huesca", "HU"], + ["Illes Balears", "PM"], + ["Jaén", "J"], + ["León", "LE"], + ["Lleida", "L"], + ["Lugo", "LU"], + ["Madrid", "M"], + ["Málaga", "MA"], + ["Melilla", "ML"], + ["Murcia", "MU"], + ["Navarra/Nafarroa", "NA"], + ["Ourense", "OR"], + ["Palencia", "P"], + ["Las Palmas", "GC"], + ["Pontevedra", "PO"], + ["La Rioja", "LO"], + ["Salamanca", "SA"], + ["Santa Cruz de Tenerife", "TF"], + ["Segovia", "SG"], + ["Sevilla", "SE"], + ["Soria", "SO"], + ["Tarragona", "T"], + ["Teruel", "TE"], + ["Toledo", "TO"], + ["Valencia/València", "V"], + ["Valladolid", "VA"], + ["Zamora", "ZA"], + ["Zaragoza", "Z"], + ], +]; +export const LK = [ + "Sri Lanka", + "LK", + [ + ["Basnahira", "1"], + ["Dakunu", "3"], + ["Madhyama", "2"], + ["Naegenahira", "5"], + ["Sabaragamuwa", "9"], + ["Uturu", "4"], + ["Uturumaeda", "7"], + ["Vayamba", "6"], + ["Uva", "8"], + ], +]; +export const SD = [ + "Sudan", + "SD", + [ + ["Al Bahr al Ahmar", "RS"], + ["Al Jazirah", "GZ"], + ["Al Khartum", "KH"], + ["Al Qadarif", "GD"], + ["An Nil al Abyad", "NW"], + ["An Nil al Azraq", "NB"], + ["Ash Shamaliyah", "NO"], + ["Gharb Darfur", "DW"], + ["Gharb Kurdufan", "GK"], + ["Janub Darfur", "DS"], + ["Janub Kurdufan", "KS"], + ["Kassala", "KA"], + ["Nahr an Nil", "NR"], + ["Shamal Darfur", "DN"], + ["Sharq Darfur", "DE"], + ["Shiamal Kurdufan", "KN"], + ["Sinnar", "SI"], + ["Wasat Darfur Zalinjay", "DC"], + ], +]; +export const SR = [ + "Suriname", + "SR", + [ + ["Brokopondo", "BR"], + ["Commewijne", "CM"], + ["Coronie", "CR"], + ["Marowijne", "MA"], + ["Nickerie", "NI"], + ["Para", "PR"], + ["Paramaribo", "PM"], + ["Saramacca", "SA"], + ["Sipaliwini", "SI"], + ["Wanica", "WA"], + ], +]; +export const SZ = [ + "Eswatini", + "SZ", + [ + ["Hhohho", "HH"], + ["Lubombo", "LU"], + ["Manzini", "MA"], + ["Shiselweni", "SH"], + ], +]; +export const SE = [ + "Sweden", + "SE", + [ + ["Blekinge", "K"], + ["Dalarna", "W"], + ["Gävleborg", "X"], + ["Gotland", "I"], + ["Halland", "N"], + ["Jämtland", "Z"], + ["Jönköping", "F"], + ["Kalmar", "H"], + ["Kronoberg", "G"], + ["Norrbotten", "BD"], + ["Örebro", "T"], + ["Östergötland", "E"], + ["Skåne", "M"], + ["Södermanland", "D"], + ["Stockholm", "AB"], + ["Uppsala", "C"], + ["Värmland", "S"], + ["Västerbotten", "AC"], + ["Västernorrland", "Y"], + ["Västmanland", "U"], + ["Västra Götaland", "O"], + ], +]; +export const CH = [ + "Switzerland", + "CH", + [ + ["Aargau", "AG"], + ["Appenzell Ausserrhoden", "AR"], + ["Appenzell Innerhoden", "AI"], + ["Basel-Landschaft", "BL"], + ["Basel-Stadt", "BS"], + ["Bern", "BE"], + ["Fribourg", "FR"], + ["Genève", "GE"], + ["Glarus", "GL"], + ["Graubünden", "GR"], + ["Jura", "JU"], + ["Luzern", "LU"], + ["Neuchâtel", "NE"], + ["Nidwalden", "NW"], + ["Obwalden", "OW"], + ["Sankt Gallen", "SG"], + ["Schaffhausen", "SH"], + ["Schwyz", "SZ"], + ["Solothurn", "SO"], + ["Thurgau", "TG"], + ["Ticino", "TI"], + ["Uri", "UR"], + ["Valais", "VS"], + ["Vaud", "VD"], + ["Zug", "ZG"], + ["Zürich", "ZH"], + ], +]; +export const SY = [ + "Syrian Arab Republic", + "SY", + [ + ["Al Hasakah", "HA"], + ["Al Ladhiqiyah", "LA"], + ["Al Qunaytirah", "QU"], + ["Ar Raqqah", "RA"], + ["As Suwayda'", "SU"], + ["Dar'a", "DR"], + ["Dayr az Zawr", "DY"], + ["Dimashq", "DI"], + ["Halab", "HL"], + ["Hamah", "HM"], + ["Hims", "HI"], + ["Idlib", "ID"], + ["Rif Dimashq", "RD"], + ["Tartus", "TA"], + ], +]; +export const TW = [ + "Taiwan", + "TW", + [ + ["Changhua", "CHA"], + ["Chiayi", "CYQ"], + ["Hsinchu", "HSQ"], + ["Hualien", "HUA"], + ["Kaohsiung", "KHH"], + ["Keelung", "KEE"], + ["Kinmen", "KIN"], + ["Lienchiang", "LIE"], + ["Miaoli", "MIA"], + ["Nantou", "NAN"], + ["Penghu", "PEN"], + ["New Taipei", "NWT"], + ["Pingtung", "PIF"], + ["Taichung", "TXG"], + ["Tainan", "TNN"], + ["Taipei", "TPE"], + ["Taitung", "TTT"], + ["Taoyuan", "TAO"], + ["Yilan", "ILA"], + ["Yunlin", "YUN"], + ], +]; +export const TJ = [ + "Tajikistan", + "TJ", + [ + ["Dushanbe", "DU"], + ["Kŭhistoni Badakhshon", "GB"], + ["Khatlon", "KT"], + ["Sughd", "SU"], + ], +]; +export const TZ = [ + "Tanzania, United Republic of", + "TZ", + [ + ["Arusha", "01"], + ["Coast", "19"], + ["Dar es Salaam", "02"], + ["Dodoma", "03"], + ["Iringa", "04"], + ["Kagera", "05"], + ["Kigoma", "08"], + ["Kilimanjaro", "09"], + ["Lindi", "12"], + ["Manyara", "26"], + ["Mara", "13"], + ["Mbeya", "14"], + ["Morogoro", "16"], + ["Mtwara", "17"], + ["Mwanza", "18"], + ["Pemba North", "06"], + ["Pemba South", "10"], + ["Rukwa", "20"], + ["Ruvuma", "21"], + ["Shinyanga", "22"], + ["Singida", "23"], + ["Tabora", "24"], + ["Tanga", "25"], + ["Zanzibar North", "07"], + ["Zanzibar Central/South", "11"], + ["Zanzibar Urban/West", "15"], + ], +]; +export const TH = [ + "Thailand", + "TH", + [ + ["Amnat Charoen", "37"], + ["Ang Thong", "15"], + ["Bueng Kan", "38"], + ["Buri Ram", "31"], + ["Chachoengsao", "24"], + ["Chai Nat", "18"], + ["Chaiyaphum", "36"], + ["Chanthaburi", "22"], + ["Chiang Mai", "50"], + ["Chiang Rai", "57"], + ["Chon Buri", "20"], + ["Chumphon", "86"], + ["Kalasin", "46"], + ["Kamphaeng Phet", "62"], + ["Kanchanaburi", "71"], + ["Khon Kaen", "40"], + ["Krabi", "81"], + ["Krung Thep Mahanakhon (Bangkok)", "10"], + ["Lampang", "52"], + ["Lamphun", "51"], + ["Loei", "42"], + ["Lop Buri", "16"], + ["Mae Hong Son", "58"], + ["Maha Sarakham", "44"], + ["Mukdahan", "49"], + ["Nakhon Nayok", "26"], + ["Nakhon Phathom", "73"], + ["Nakhon Phanom", "48"], + ["Nakhon Ratchasima", "30"], + ["Nakhon Sawan", "60"], + ["Nakhon Si Thammarat", "80"], + ["Nan", "55"], + ["Narathiwat", "96"], + ["Nong Bua Lam Phu", "39"], + ["Nong Khai", "43"], + ["Nonthaburi", "12"], + ["Pathum Thani", "13"], + ["Pattani", "94"], + ["Phangnga", "82"], + ["Phatthalung", "93"], + ["Phayao", "56"], + ["Phetchabun", "67"], + ["Phetchaburi", "76"], + ["Phichit", "66"], + ["Phitsanulok", "65"], + ["Phra Nakhon Si Ayutthaya", "14"], + ["Phrae", "54"], + ["Phuket", "83"], + ["Prachin Buri", "25"], + ["Prachuap Khiri Khan", "77"], + ["Ranong", "85"], + ["Ratchaburi", "70"], + ["Rayong", "21"], + ["Roi Et", "45"], + ["Sa Kaeo", "27"], + ["Sakon Nakhon", "47"], + ["Samut Prakan", "11"], + ["Samut Sakhon", "74"], + ["Samut Songkhram", "75"], + ["Saraburi", "19"], + ["Satun", "91"], + ["Sing Buri", "17"], + ["Si Sa ket", "33"], + ["Songkhla", "90"], + ["Sukhothai", "64"], + ["Suphan Buri", "72"], + ["Surat Thani", "84"], + ["Surin", "32"], + ["Tak", "63"], + ["Trang", "92"], + ["Trat", "23"], + ["Ubon Ratchathani", "34"], + ["Udon Thani", "41"], + ["Uthai Thani", "61"], + ["Uttaradit", "53"], + ["Yala", "95"], + ["Yasothon", "35"], + ], +]; +export const TL = [ + "Timor-Leste", + "TL", + [ + ["Aileu", "AL"], + ["Ainaro", "AN"], + ["Baucau", "BA"], + ["Bobonaro", "BO"], + ["Cova Lima", "CO"], + ["Dili", "DI"], + ["Ermera", "ER"], + ["Lautem", "LA"], + ["Liquica", "LI"], + ["Manatuto", "MT"], + ["Manufahi", "MF"], + ["Oecussi", "OE"], + ["Viqueque", "VI"], + ], +]; +export const TG = [ + "Togo", + "TG", + [ + ["Centre", "C"], + ["Kara", "K"], + ["Maritime", "M"], + ["Plateaux", "P"], + ["Savannes", "S"], + ], +]; +export const TK = [ + "Tokelau", + "TK", + [ + ["Atafu", "undefined"], + ["Fakaofo", "undefined"], + ["Nukunonu", "undefined"], + ], +]; +export const TO = [ + "Tonga", + "TO", + [ + ["'Eua", "01"], + ["Ha'apai", "02"], + ["Niuas", "03"], + ["Tongatapu", "04"], + ["Vava'u", "05"], + ], +]; +export const TT = [ + "Trinidad and Tobago", + "TT", + [ + ["Arima", "ARI"], + ["Chaguanas", "CHA"], + ["Couva-Tabaquite-Talparo", "CTT"], + ["Diefo Martin", "DMN"], + ["Mayaro-Rio Claro", "MRC"], + ["Penal-Debe", "PED"], + ["Point Fortin", "PTF"], + ["Port-of-Spain", "POS"], + ["Princes Town", "PRT"], + ["San Fernando", "SFO"], + ["San Juan-Laventille", "SJL"], + ["Sangre Grande", "SGE"], + ["Siparia", "SIP"], + ["Tobago", "TOB"], + ["Tunapuna-Piarco", "TUP"], + ], +]; +export const TN = [ + "Tunisia", + "TN", + [ + ["Ariana", "12"], + ["Beja", "31"], + ["Ben Arous", "13"], + ["Bizerte", "23"], + ["Gabes", "81"], + ["Gafsa", "71"], + ["Jendouba", "32"], + ["Kairouan", "41"], + ["Kasserine", "42"], + ["Kebili", "73"], + ["Kef", "33"], + ["Mahdia", "53"], + ["Medenine", "82"], + ["Monastir", "52"], + ["Nabeul", "21"], + ["Sfax", "61"], + ["Sidi Bouzid", "43"], + ["Siliana", "34"], + ["Sousse", "51"], + ["Tataouine", "83"], + ["Tozeur", "72"], + ["Tunis", "11"], + ["Zaghouan", "22"], + ], +]; +export const TR = [ + "Turkey", + "TR", + [ + ["Adana", "01"], + ["Adiyaman", "02"], + ["Afyonkarahisar", "03"], + ["Agri", "04"], + ["Aksaray", "68"], + ["Amasya", "05"], + ["Ankara", "06"], + ["Antalya", "07"], + ["Ardahan", "75"], + ["Artvin", "08"], + ["Aydin", "09"], + ["Balikesir", "10"], + ["Bartin", "74"], + ["Batman", "72"], + ["Bayburt", "69"], + ["Bilecik", "11"], + ["Bingol", "12"], + ["Bitlis", "13"], + ["Bolu", "14"], + ["Burdur", "15"], + ["Bursa", "16"], + ["Canakkale", "17"], + ["Cankiri", "18"], + ["Corum", "19"], + ["Denizli", "20"], + ["Diyarbakir", "21"], + ["Duzce", "81"], + ["Edirne", "22"], + ["Elazig", "23"], + ["Erzincan", "24"], + ["Erzurum", "25"], + ["Eskisehir", "26"], + ["Gaziantep", "27"], + ["Giresun", "28"], + ["Gumushane", "29"], + ["Hakkari", "30"], + ["Hatay", "31"], + ["Igdir", "76"], + ["Isparta", "32"], + ["Istanbul", "34"], + ["Izmir", "35"], + ["Kahramanmaras", "46"], + ["Karabuk", "78"], + ["Karaman", "70"], + ["Kars", "36"], + ["Kastamonu", "37"], + ["Kayseri", "38"], + ["Kilis", "79"], + ["Kirikkale", "71"], + ["Kirklareli", "39"], + ["Kirsehir", "40"], + ["Kocaeli", "41"], + ["Konya", "42"], + ["Kutahya", "43"], + ["Malatya", "44"], + ["Manisa", "45"], + ["Mardin", "47"], + ["Mersin", "33"], + ["Mugla", "48"], + ["Mus", "49"], + ["Nevsehir", "50"], + ["Nigde", "51"], + ["Ordu", "52"], + ["Osmaniye", "80"], + ["Rize", "53"], + ["Sakarya", "54"], + ["Samsun", "55"], + ["Sanliurfa", "63"], + ["Siirt", "56"], + ["Sinop", "57"], + ["Sirnak", "73"], + ["Sivas", "58"], + ["Tekirdag", "59"], + ["Tokat", "60"], + ["Trabzon", "61"], + ["Tunceli", "62"], + ["Usak", "64"], + ["Van", "65"], + ["Yalova", "77"], + ["Yozgat", "66"], + ["Zonguldak", "67"], + ], +]; +export const TM = [ + "Turkmenistan", + "TM", + [ + ["Ahal", "A"], + ["Asgabat", "S"], + ["Balkan", "B"], + ["Dashoguz", "D"], + ["Lebap", "L"], + ["Mary", "M"], + ], +]; +export const TC = [ + "Turks and Caicos Islands", + "TC", + [["Turks and Caicos Islands", "undefined"]], +]; +export const TV = [ + "Tuvalu", + "TV", + [ + ["Funafuti", "FUN"], + ["Nanumanga", "NMG"], + ["Nanumea", "NMA"], + ["Niutao", "NIT"], + ["Nui", "NUI"], + ["Nukufetau", "NKF"], + ["Nukulaelae", "NKL"], + ["Vaitupu", "VAU"], + ], +]; +export const UG = [ + "Uganda", + "UG", + [ + ["Abim", "317"], + ["Adjumani", "301"], + ["Amolatar", "314"], + ["Amuria", "216"], + ["Amuru", "319"], + ["Apac", "302"], + ["Arua", "303"], + ["Budaka", "217"], + ["Bududa", "223"], + ["Bugiri", "201"], + ["Bukedea", "224"], + ["Bukwa", "218"], + ["Buliisa", "419"], + ["Bundibugyo", "401"], + ["Bushenyi", "402"], + ["Busia", "202"], + ["Butaleja", "219"], + ["Dokolo", "318"], + ["Gulu", "304"], + ["Hoima", "403"], + ["Ibanda", "416"], + ["Iganga", "203"], + ["Isingiro", "417"], + ["Jinja", "204"], + ["Kaabong", "315"], + ["Kabale", "404"], + ["Kabarole", "405"], + ["Kaberamaido", "213"], + ["Kalangala", "101"], + ["Kaliro", "220"], + ["Kampala", "102"], + ["Kamuli", "205"], + ["Kamwenge", "413"], + ["Kanungu", "414"], + ["Kapchorwa", "206"], + ["Kasese", "406"], + ["Katakwi", "207"], + ["Kayunga", "112"], + ["Kibaale", "407"], + ["Kiboga", "103"], + ["Kiruhura", "418"], + ["Kisoro", "408"], + ["Kitgum", "305"], + ["Koboko", "316"], + ["Kotido", "306"], + ["Kumi", "208"], + ["Kyenjojo", "415"], + ["Lira", "307"], + ["Luwero", "104"], + ["Lyantonde", "116"], + ["Manafwa", "221"], + ["Maracha", "320"], + ["Masaka", "105"], + ["Masindi", "409"], + ["Mayuge", "214"], + ["Mbale", "209"], + ["Mbarara", "410"], + ["Mityana", "114"], + ["Moroto", "308"], + ["Moyo", "309"], + ["Mpigi", "106"], + ["Mubende", "107"], + ["Mukono", "108"], + ["Nakapiripirit", "311"], + ["Nakaseke", "115"], + ["Nakasongola", "109"], + ["Namutumba", "222"], + ["Nebbi", "310"], + ["Ntungamo", "411"], + ["Oyam", "321"], + ["Pader", "312"], + ["Pallisa", "210"], + ["Rakai", "110"], + ["Rukungiri", "412"], + ["Sembabule", "111"], + ["Sironko", "215"], + ["Soroti", "211"], + ["Tororo", "212"], + ["Wakiso", "113"], + ["Yumbe", "313"], + ], +]; +export const UA = [ + "Ukraine", + "UA", + [ + ["Cherkaska oblast", "71"], + ["Chernihivska oblast", "74"], + ["Chernivetska oblast", "77"], + ["Dnipropetrovska oblast", "12"], + ["Donetska oblast", "14"], + ["Ivano-Frankivska oblast", "26"], + ["Kharkivska oblast", "63"], + ["Khersonska oblast", "65"], + ["Khmelnytska oblast", "68"], + ["Kyivska oblast", "32"], + ["Kirovohradska oblast", "35"], + ["Luhanska oblast", "09"], + ["Lvivska oblast", "46"], + ["Mykolaivska oblast", "48"], + ["Odeska oblast", "51"], + ["Poltavska oblast", "53"], + ["Rivnenska oblast", "56"], + ["Sumska oblast", "59"], + ["Ternopilska oblast", "61"], + ["Vinnytska oblast", "05"], + ["Volynska oblast", "07"], + ["Zakarpatska oblast", "21"], + ["Zaporizka oblast", "23"], + ["Zhytomyrska oblast", "18"], + ["Avtonomna Respublika Krym", "43"], + ["Kyiv", "30"], + ["Sevastopol", "40"], + ], +]; +export const AE = [ + "United Arab Emirates", + "AE", + [ + ["Abu Dhabi", "AZ"], + ["Ajman", "AJ"], + ["Dubai", "DU"], + ["Fujairah", "FU"], + ["Ras al Khaimah", "RK"], + ["Sharjah", "SH"], + ["Umm Al Quwain", "UQ"], + ], +]; +export const GB = [ + "United Kingdom", + "GB", + [ + ["Aberdeen City", "ABE"], + ["Aberdeenshire", "ABD"], + ["Angus", "ANS"], + ["Antrim and Newtownabbey", "ANN"], + ["Ards and North Down", "AND"], + ["Argyll and Bute", "AGB"], + ["Armagh City, Banbridge and Craigavon", "ABC"], + ["Barking and Dagenham", "BDG"], + ["Barnet", "BNE"], + ["Barnsley", "BNS"], + ["Bath and North East Somerset", "BAS"], + ["Bedford", "BDF"], + ["Belfast City", "BFS"], + ["Berkshire", "BRK"], + ["Bexley", "BEX"], + ["Birmingham", "BIR"], + ["Blackburn with Darwen", "BBD"], + ["Blackpool", "BPL"], + ["Blaenau Gwent", "BGW"], + ["Bolton", "BOL"], + ["Bournemouth, Christchurch and Poole", "BCP"], + ["Bracknell Forest", "BRC"], + ["Bradford", "BRD"], + ["Brent", "BEN"], + ["Bridgend", "BGE"], + ["Brighton and Hove", "BNH"], + ["Bristol, City of", "BST"], + ["Bromley", "BRY"], + ["Buckinghamshire", "BKM"], + ["Bury", "BUR"], + ["Caerphilly", "CAY"], + ["Calderdale", "CLD"], + ["Cambridgeshire", "CAM"], + ["Camden", "CMD"], + ["Cardiff", "CRF"], + ["Carmarthenshire", "CMN"], + ["Causeway Coast and Glens", "CCG"], + ["Central Bedfordshire", "CBF"], + ["Ceredigion", "CGN"], + ["Cheshire East", "CHE"], + ["Cheshire West and Chester", "CHW"], + ["Clackmannanshire", "CLK"], + ["Conwy", "CWY"], + ["Cornwall", "CON"], + ["Coventry", "COV"], + ["Croydon", "CRY"], + ["Cumbria", "CMA"], + ["Darlington", "DAL"], + ["Denbighshire", "DEN"], + ["Derby", "DER"], + ["Derbyshire", "DBY"], + ["Derry and Strabane", "DRS"], + ["Devon", "DEV"], + ["Doncaster", "DNC"], + ["Dorset", "DOR"], + ["Dudley", "DUD"], + ["Dumfries and Galloway", "DGY"], + ["Dundee City", "DND"], + ["Durham, County", "DUR"], + ["Ealing", "EAL"], + ["East Ayrshire", "EAY"], + ["East Dunbartonshire", "EDU"], + ["East Lothian", "ELN"], + ["East Renfrewshire", "ERW"], + ["East Riding of Yorkshire", "ERY"], + ["East Sussex", "ESX"], + ["Edinburgh, City of", "EDH"], + ["Eilean Siar", "ELS"], + ["Enfield", "ENF"], + ["Essex", "ESS"], + ["Falkirk", "FAL"], + ["Fermanagh and Omagh", "FMO"], + ["Fife", "FIF"], + ["Flintshire", "FLN"], + ["Gateshead", "GAT"], + ["Glasgow City", "GLG"], + ["Gloucestershire", "GLS"], + ["Greenwich", "GRE"], + ["Gwynedd", "GWN"], + ["Hackney", "HCK"], + ["Halton", "HAL"], + ["Hammersmith and Fulham", "HMF"], + ["Hampshire", "HAM"], + ["Haringey", "HRY"], + ["Harrow", "HRW"], + ["Hartlepool", "HPL"], + ["Havering", "HAV"], + ["Herefordshire", "HEF"], + ["Hertfordshire", "HRT"], + ["Highland", "HLD"], + ["Hillingdon", "HIL"], + ["Hounslow", "HNS"], + ["Inverclyde", "IVC"], + ["Isle of Anglesey", "AGY"], + ["Isle of Wight", "IOW"], + ["Isles of Scilly", "IOS"], + ["Islington", "ISL"], + ["Kensington and Chelsea", "KEC"], + ["Kent", "KEN"], + ["Kingston upon Hull", "KHL"], + ["Kingston upon Thames", "KTT"], + ["Kirklees", "KIR"], + ["Knowsley", "KWL"], + ["Lambeth", "LBH"], + ["Lancashire", "LAN"], + ["Leeds", "LDS"], + ["Leicester", "LCE"], + ["Leicestershire", "LEC"], + ["Lewisham", "LEW"], + ["Lincolnshire", "LIN"], + ["Lisburn and Castlereagh", "LBC"], + ["Liverpool", "LIV"], + ["London, City of", "LND"], + ["Luton", "LUT"], + ["Manchester", "MAN"], + ["Medway", "MDW"], + ["Merthyr Tydfil", "MTY"], + ["Merton", "MRT"], + ["Mid and East Antrim", "MEA"], + ["Mid-Ulster", "MUL"], + ["Middlesbrough", "MDB"], + ["Midlothian", "MLN"], + ["Milton Keynes", "MIK"], + ["Monmouthshire", "MON"], + ["Moray", "MRY"], + ["Neath Port Talbot", "NTL"], + ["Newcastle upon Tyne", "NET"], + ["Newham", "NWM"], + ["Newport", "NWP"], + ["Newry, Mourne and Down", "NMD"], + ["Norfolk", "NFK"], + ["North Ayrshire", "NAY"], + ["North East Lincolnshire", "NEL"], + ["North Lanarkshire", "NLK"], + ["North Lincolnshire", "NLN"], + ["North Somerset", "NSM"], + ["North Tyneside", "NTY"], + ["North Yorkshire", "NYK"], + ["Northamptonshire", "NTH"], + ["Northumberland", "NBL"], + ["Nottingham", "NGM"], + ["Nottinghamshire", "NTT"], + ["Oldham", "OLD"], + ["Orkney Islands", "ORK"], + ["Oxfordshire", "OXF"], + ["Pembrokeshire", "PEM"], + ["Perth and Kinross", "PKN"], + ["Peterborough", "PTE"], + ["Plymouth", "PLY"], + ["Portsmouth", "POR"], + ["Powys", "POW"], + ["Reading", "RDG"], + ["Redbridge", "RDB"], + ["Redcar and Cleveland", "RCC"], + ["Renfrewshire", "RFW"], + ["Rhondda Cynon Taff", "RCT"], + ["Richmond upon Thames", "RIC"], + ["Rochdale", "RCH"], + ["Rotherham", "ROT"], + ["Rutland", "RUT"], + ["Salford", "SLF"], + ["Sandwell", "SAW"], + ["Scottish Borders", "SCB"], + ["Sefton", "SFT"], + ["Sheffield", "SHF"], + ["Shetland Islands", "ZET"], + ["Shropshire", "SHR"], + ["Slough", "SLG"], + ["Solihull", "SOL"], + ["Somerset", "SOM"], + ["South Ayrshire", "SAY"], + ["South Gloucestershire", "SGC"], + ["South Lanarkshire", "SLK"], + ["South Tyneside", "STY"], + ["Southampton", "STH"], + ["Southend-on-Sea", "SOS"], + ["Southwark", "SWK"], + ["St. Helens", "SHN"], + ["Staffordshire", "STS"], + ["Stirling", "STG"], + ["Stockport", "SKP"], + ["Stockton-on-Tees", "STT"], + ["Stoke-on-Trent", "STE"], + ["Suffolk", "SFK"], + ["Sunderland", "SND"], + ["Surrey", "SRY"], + ["Sutton", "STN"], + ["Swansea", "SWA"], + ["Swindon", "SWD"], + ["Tameside", "TAM"], + ["Telford and Wrekin", "TFW"], + ["Thurrock", "THR"], + ["Torbay", "TOB"], + ["Torfaen", "TOF"], + ["Tower Hamlets", "TWH"], + ["Trafford", "TRF"], + ["Vale of Glamorgan, The", "VGL"], + ["Wakefield", "WKF"], + ["Walsall", "WLL"], + ["Waltham Forest", "WFT"], + ["Wandsworth", "WND"], + ["Warrington", "WRT"], + ["Warwickshire", "WAR"], + ["West Berkshire", "WBK"], + ["West Dunbartonshire", "WDU"], + ["West Lothian", "WLN"], + ["West Sussex", "WSX"], + ["Westminster", "WSM"], + ["Wigan", "WGN"], + ["Wiltshire", "WIL"], + ["Windsor and Maidenhead", "WNM"], + ["Wirral", "WRL"], + ["Wokingham", "WOK"], + ["Wolverhampton", "WLV"], + ["Worcestershire", "WOR"], + ["Wrexham", "WRX"], + ["York", "YOR"], + ], +]; +export const US = [ + "United States", + "US", + [ + ["Alabama", "AL"], + ["Alaska", "AK"], + ["American Samoa", "AS"], + ["Arizona", "AZ"], + ["Arkansas", "AR"], + ["California", "CA"], + ["Colorado", "CO"], + ["Connecticut", "CT"], + ["Delaware", "DE"], + ["District of Columbia", "DC"], + ["Micronesia", "FM"], + ["Florida", "FL"], + ["Georgia", "GA"], + ["Guam", "GU"], + ["Hawaii", "HI"], + ["Idaho", "ID"], + ["Illinois", "IL"], + ["Indiana", "IN"], + ["Iowa", "IA"], + ["Kansas", "KS"], + ["Kentucky", "KY"], + ["Louisiana", "LA"], + ["Maine", "ME"], + ["Marshall Islands", "MH"], + ["Maryland", "MD"], + ["Massachusetts", "MA"], + ["Michigan", "MI"], + ["Minnesota", "MN"], + ["Mississippi", "MS"], + ["Missouri", "MO"], + ["Montana", "MT"], + ["Nebraska", "NE"], + ["Nevada", "NV"], + ["New Hampshire", "NH"], + ["New Jersey", "NJ"], + ["New Mexico", "NM"], + ["New York", "NY"], + ["North Carolina", "NC"], + ["North Dakota", "ND"], + ["Northern Mariana Islands", "MP"], + ["Ohio", "OH"], + ["Oklahoma", "OK"], + ["Oregon", "OR"], + ["Palau", "PW"], + ["Pennsylvania", "PA"], + ["Puerto Rico", "PR"], + ["Rhode Island", "RI"], + ["South Carolina", "SC"], + ["South Dakota", "SD"], + ["Tennessee", "TN"], + ["Texas", "TX"], + ["Utah", "UT"], + ["Vermont", "VT"], + ["Virgin Islands", "VI"], + ["Virginia", "VA"], + ["Washington", "WA"], + ["West Virginia", "WV"], + ["Wisconsin", "WI"], + ["Wyoming", "WY"], + ["Armed Forces Americas", "AA"], + ["Armed Forces Europe, Canada, Africa and Middle East", "AE"], + ["Armed Forces Pacific", "AP"], + ], +]; +export const UM = [ + "United States Minor Outlying Islands", + "UM", + [ + ["Baker Island", "81"], + ["Howland Island", "84"], + ["Jarvis Island", "86"], + ["Johnston Atoll", "67"], + ["Kingman Reef", "89"], + ["Midway Islands", "71"], + ["Navassa Island", "76"], + ["Palmyra Atoll", "95"], + ["Wake Island", "79"], + ["Bajo Nuevo Bank", "BN"], + ["Serranilla Bank", "SB"], + ], +]; +export const UY = [ + "Uruguay", + "UY", + [ + ["Artigas", "AR"], + ["Canelones", "CA"], + ["Cerro Largo", "CL"], + ["Colonia", "CO"], + ["Durazno", "DU"], + ["Flores", "FS"], + ["Florida", "FD"], + ["Lavalleja", "LA"], + ["Maldonado", "MA"], + ["Montevideo", "MO"], + ["Paysandú", "PA"], + ["Río Negro", "RN"], + ["Rivera", "RV"], + ["Rocha", "RO"], + ["Salto", "SA"], + ["San José", "SJ"], + ["Soriano", "SO"], + ["Tacuarembó", "TA"], + ["Treinta y Tres", "TT"], + ], +]; +export const UZ = [ + "Uzbekistan", + "UZ", + [ + ["Toshkent shahri", "TK"], + ["Andijon", "AN"], + ["Buxoro", "BU"], + ["Farg‘ona", "FA"], + ["Jizzax", "JI"], + ["Namangan", "NG"], + ["Navoiy", "NW"], + ["Qashqadaryo (Qarshi)", "QA"], + ["Samarqand", "SA"], + ["Sirdaryo (Guliston)", "SI"], + ["Surxondaryo (Termiz)", "SU"], + ["Toshkent wiloyati", "TO"], + ["Xorazm (Urganch)", "XO"], + ["Qoraqalpog‘iston Respublikasi (Nukus)", "QR"], + ], +]; +export const VU = [ + "Vanuatu", + "VU", + [ + ["Malampa", "MAP"], + ["Pénama", "PAM"], + ["Sanma", "SAM"], + ["Shéfa", "SEE"], + ["Taféa", "TAE"], + ["Torba", "TOB"], + ], +]; +export const VE = [ + "Venezuela, Bolivarian Republic of", + "VE", + [ + ["Dependencias Federales", "W"], + ["Distrito Federal", "A"], + ["Amazonas", "Z"], + ["Anzoátegui", "B"], + ["Apure", "C"], + ["Aragua", "D"], + ["Barinas", "E"], + ["Bolívar", "F"], + ["Carabobo", "G"], + ["Cojedes", "H"], + ["Delta Amacuro", "Y"], + ["Falcón", "I"], + ["Guárico", "J"], + ["Lara", "K"], + ["Mérida", "L"], + ["Miranda", "M"], + ["Monagas", "N"], + ["Nueva Esparta", "O"], + ["Portuguesa", "P"], + ["Sucre", "R"], + ["Táchira", "S"], + ["Trujillo", "T"], + ["Vargas", "X"], + ["Yaracuy", "U"], + ["Zulia", "V"], + ], +]; +export const VN = [ + "Vietnam", + "VN", + [ + ["An Giang", "44"], + ["Bà Rịa - Vũng Tàu", "43"], + ["Bình Dương", "57"], + ["Bình Phước", "58"], + ["Bình Định", "31"], + ["Bình Thuận", "40"], + ["Bạc Liêu", "55"], + ["Bắc Giang", "54"], + ["Bắc Kạn", "53"], + ["Bắc Ninh", "56"], + ["Bến Tre", "50"], + ["Cao Bằng", "04"], + ["Cà Mau", "59"], + ["Đắk Lắk", "33"], + ["Đắk Nông", "72"], + ["Điện Biên", "71"], + ["Đồng Nai", "39"], + ["Đồng Tháp", "45"], + ["Gia Lai", "30"], + ["Hà Giang", "03"], + ["Hà Nam", "63"], + ["Hà Tây", "15"], + ["Hà Tĩnh", "23"], + ["Hải Dương", "61"], + ["Hậu Giang", "73"], + ["Hòa Bình", "14"], + ["Hưng Yên", "66"], + ["Khánh Hòa", "34"], + ["Kiên Giang", "47"], + ["Kon Tum", "28"], + ["Lai Châu", "01"], + ["Lâm Đồng", "35"], + ["Lạng Sơn", "09"], + ["Lào Cai", "02"], + ["Long An", "41"], + ["Nam Định", "67"], + ["Nghệ An", "22"], + ["Ninh Bình", "18"], + ["Ninh Thuận", "36"], + ["Phú Thọ", "68"], + ["Phú Yên", "32"], + ["Quảng Bình", "24"], + ["Quảng Nam", "27"], + ["Quảng Ngãi", "29"], + ["Quảng Ninh", "13"], + ["Quảng Trị", "25"], + ["Sóc Trăng", "52"], + ["Sơn La", "05"], + ["Tây Ninh", "37"], + ["Thái Bình", "20"], + ["Thái Nguyên", "69"], + ["Thanh Hóa", "21"], + ["Thừa Thiên–Huế", "26"], + ["Tiền Giang", "46"], + ["Trà Vinh", "51"], + ["Tuyên Quang", "07"], + ["Vĩnh Long", "49"], + ["Vĩnh Phúc", "70"], + ["Yên Bái", "06"], + ["Cần Thơ", "CT"], + ["Đà Nẵng", "DN"], + ["Hà Nội", "HN"], + ["Hải Phòng", "HP"], + ["Hồ Chí Minh (Sài Gòn)", "SG"], + ], +]; +export const VG = [ + "Virgin Islands, British", + "VG", + [ + ["Anegada", "ANG"], + ["Jost Van Dyke", "JVD"], + ["Tortola", "TTA"], + ["Virgin Gorda", "VGD"], + ], +]; +export const VI = [ + "Virgin Islands, U.S.", + "VI", + [ + ["St. Thomas", "STH"], + ["St. John", "SJO"], + ["St. Croix", "SCR"], + ], +]; +export const WF = [ + "Wallis and Futuna", + "WF", + [ + ["Alo", "ALO"], + ["Sigave", "SIG"], + ["Wallis", "WAL"], + ], +]; +export const EH = [ + "Western Sahara", + "EH", + [ + ["Es Smara", "ESM"], + ["Boujdour", "BOD"], + ["Laâyoune", "LAA"], + ["Aousserd", "AOU"], + ["Oued ed Dahab", "OUD"], + ], +]; +export const YE = [ + "Yemen", + "YE", + [ + ["Abyān", "AB"], + ["'Adan", "AD"], + ["Aḑ Ḑāli'", "DA"], + ["Al Bayḑā'", "BA"], + ["Al Ḩudaydah", "HU"], + ["Al Jawf", "JA"], + ["Al Mahrah", "MR"], + ["Al Maḩwīt", "MW"], + ["'Amrān", "AM"], + ["Dhamār", "DH"], + ["Ḩaḑramawt", "HD"], + ["Ḩajjah", "HJ"], + ["Ibb", "IB"], + ["Laḩij", "LA"], + ["Ma'rib", "MA"], + ["Raymah", "RA"], + ["Şā‘dah", "SD"], + ["Şan‘ā'", "SN"], + ["Shabwah", "SH"], + ["Tā‘izz", "TA"], + ], +]; +export const ZM = [ + "Zambia", + "ZM", + [ + ["Central", "02"], + ["Copperbelt", "08"], + ["Eastern", "03"], + ["Luapula", "04"], + ["Lusaka", "09"], + ["Muchinga", "10"], + ["Northern", "05"], + ["North-Western", "06"], + ["Southern", "07"], + ["Western", "01"], + ], +]; +export const ZW = [ + "Zimbabwe", + "ZW", + [ + ["Bulawayo", "BU"], + ["Harare", "HA"], + ["Manicaland", "MA"], + ["Mashonaland Central", "MC"], + ["Mashonaland East", "ME"], + ["Mashonaland West", "MW"], + ["Masvingo", "MV"], + ["Matabeleland North", "MN"], + ["Matabeleland South", "MS"], + ["Midlands", "MI"], + ], +]; + +export const allCountries = [ + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + XK, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW, +]; + +export const countryTuples = [ + ["Afghanistan", "AF"], + ["Åland Islands", "AX"], + ["Albania", "AL"], + ["Algeria", "DZ"], + ["American Samoa", "AS"], + ["Andorra", "AD"], + ["Angola", "AO"], + ["Anguilla", "AI"], + ["Antarctica", "AQ"], + ["Antigua and Barbuda", "AG"], + ["Argentina", "AR"], + ["Armenia", "AM"], + ["Aruba", "AW"], + ["Australia", "AU"], + ["Austria", "AT"], + ["Azerbaijan", "AZ"], + ["Bahamas", "BS"], + ["Bahrain", "BH"], + ["Bangladesh", "BD"], + ["Barbados", "BB"], + ["Belarus", "BY"], + ["Belgium", "BE"], + ["Belize", "BZ"], + ["Benin", "BJ"], + ["Bermuda", "BM"], + ["Bhutan", "BT"], + ["Bolivia", "BO"], + ["Bonaire, Sint Eustatius and Saba", "BQ"], + ["Bosnia and Herzegovina", "BA"], + ["Botswana", "BW"], + ["Bouvet Island", "BV"], + ["Brazil", "BR"], + ["British Indian Ocean Territory", "IO"], + ["Brunei Darussalam", "BN"], + ["Bulgaria", "BG"], + ["Burkina Faso", "BF"], + ["Burundi", "BI"], + ["Cambodia", "KH"], + ["Cameroon", "CM"], + ["Canada", "CA"], + ["Cape Verde", "CV"], + ["Cayman Islands", "KY"], + ["Central African Republic", "CF"], + ["Chad", "TD"], + ["Chile", "CL"], + ["China", "CN"], + ["Christmas Island", "CX"], + ["Cocos (Keeling) Islands", "CC"], + ["Colombia", "CO"], + ["Comoros", "KM"], + ["Congo, Republic of the (Brazzaville)", "CG"], + ["Congo, the Democratic Republic of the (Kinshasa)", "CD"], + ["Cook Islands", "CK"], + ["Costa Rica", "CR"], + ["Côte d'Ivoire, Republic of", "CI"], + ["Croatia", "HR"], + ["Cuba", "CU"], + ["Curaçao", "CW"], + ["Cyprus", "CY"], + ["Czech Republic", "CZ"], + ["Denmark", "DK"], + ["Djibouti", "DJ"], + ["Dominica", "DM"], + ["Dominican Republic", "DO"], + ["Ecuador", "EC"], + ["Egypt", "EG"], + ["El Salvador", "SV"], + ["Equatorial Guinea", "GQ"], + ["Eritrea", "ER"], + ["Estonia", "EE"], + ["Ethiopia", "ET"], + ["Falkland Islands (Islas Malvinas)", "FK"], + ["Faroe Islands", "FO"], + ["Fiji", "FJ"], + ["Finland", "FI"], + ["France", "FR"], + ["French Guiana", "GF"], + ["French Polynesia", "PF"], + ["French Southern and Antarctic Lands", "TF"], + ["Gabon", "GA"], + ["Gambia, The", "GM"], + ["Georgia", "GE"], + ["Germany", "DE"], + ["Ghana", "GH"], + ["Gibraltar", "GI"], + ["Greece", "GR"], + ["Greenland", "GL"], + ["Grenada", "GD"], + ["Guadeloupe", "GP"], + ["Guam", "GU"], + ["Guatemala", "GT"], + ["Guernsey", "GG"], + ["Guinea", "GN"], + ["Guinea-Bissau", "GW"], + ["Guyana", "GY"], + ["Haiti", "HT"], + ["Heard Island and McDonald Islands", "HM"], + ["Holy See (Vatican City)", "VA"], + ["Honduras", "HN"], + ["Hong Kong", "HK"], + ["Hungary", "HU"], + ["Iceland", "IS"], + ["India", "IN"], + ["Indonesia", "ID"], + ["Iran, Islamic Republic of", "IR"], + ["Iraq", "IQ"], + ["Ireland", "IE"], + ["Isle of Man", "IM"], + ["Israel", "IL"], + ["Italy", "IT"], + ["Jamaica", "JM"], + ["Japan", "JP"], + ["Jersey", "JE"], + ["Jordan", "JO"], + ["Kazakhstan", "KZ"], + ["Kenya", "KE"], + ["Kiribati", "KI"], + ["Korea, Democratic People's Republic of", "KP"], + ["Korea, Republic of", "KR"], + ["Kosovo", "XK"], + ["Kuwait", "KW"], + ["Kyrgyzstan", "KG"], + ["Laos", "LA"], + ["Latvia", "LV"], + ["Lebanon", "LB"], + ["Lesotho", "LS"], + ["Liberia", "LR"], + ["Libya", "LY"], + ["Liechtenstein", "LI"], + ["Lithuania", "LT"], + ["Luxembourg", "LU"], + ["Macao", "MO"], + ["Macedonia, Republic of", "MK"], + ["Madagascar", "MG"], + ["Malawi", "MW"], + ["Malaysia", "MY"], + ["Maldives", "MV"], + ["Mali", "ML"], + ["Malta", "MT"], + ["Marshall Islands", "MH"], + ["Martinique", "MQ"], + ["Mauritania", "MR"], + ["Mauritius", "MU"], + ["Mayotte", "YT"], + ["Mexico", "MX"], + ["Micronesia, Federated States of", "FM"], + ["Moldova", "MD"], + ["Monaco", "MC"], + ["Mongolia", "MN"], + ["Montenegro", "ME"], + ["Montserrat", "MS"], + ["Morocco", "MA"], + ["Mozambique", "MZ"], + ["Myanmar", "MM"], + ["Namibia", "NA"], + ["Nauru", "NR"], + ["Nepal", "NP"], + ["Netherlands", "NL"], + ["New Caledonia", "NC"], + ["New Zealand", "NZ"], + ["Nicaragua", "NI"], + ["Niger", "NE"], + ["Nigeria", "NG"], + ["Niue", "NU"], + ["Norfolk Island", "NF"], + ["Northern Mariana Islands", "MP"], + ["Norway", "NO"], + ["Oman", "OM"], + ["Pakistan", "PK"], + ["Palau", "PW"], + ["Palestine", "PS"], + ["Panama", "PA"], + ["Papua New Guinea", "PG"], + ["Paraguay", "PY"], + ["Peru", "PE"], + ["Philippines", "PH"], + ["Pitcairn", "PN"], + ["Poland", "PL"], + ["Portugal", "PT"], + ["Puerto Rico", "PR"], + ["Qatar", "QA"], + ["Réunion", "RE"], + ["Romania", "RO"], + ["Russian Federation", "RU"], + ["Rwanda", "RW"], + ["Saint Barthélemy", "BL"], + ["Saint Helena, Ascension and Tristan da Cunha", "SH"], + ["Saint Kitts and Nevis", "KN"], + ["Saint Lucia", "LC"], + ["Saint Martin", "MF"], + ["Saint Pierre and Miquelon", "PM"], + ["Saint Vincent and the Grenadines", "VC"], + ["Samoa", "WS"], + ["San Marino", "SM"], + ["Sao Tome and Principe", "ST"], + ["Saudi Arabia", "SA"], + ["Senegal", "SN"], + ["Serbia", "RS"], + ["Seychelles", "SC"], + ["Sierra Leone", "SL"], + ["Singapore", "SG"], + ["Sint Maarten (Dutch part)", "SX"], + ["Slovakia", "SK"], + ["Slovenia", "SI"], + ["Solomon Islands", "SB"], + ["Somalia", "SO"], + ["South Africa", "ZA"], + ["South Georgia and South Sandwich Islands", "GS"], + ["South Sudan", "SS"], + ["Spain", "ES"], + ["Sri Lanka", "LK"], + ["Sudan", "SD"], + ["Suriname", "SR"], + ["Eswatini", "SZ"], + ["Sweden", "SE"], + ["Switzerland", "CH"], + ["Syrian Arab Republic", "SY"], + ["Taiwan", "TW"], + ["Tajikistan", "TJ"], + ["Tanzania, United Republic of", "TZ"], + ["Thailand", "TH"], + ["Timor-Leste", "TL"], + ["Togo", "TG"], + ["Tokelau", "TK"], + ["Tonga", "TO"], + ["Trinidad and Tobago", "TT"], + ["Tunisia", "TN"], + ["Turkey", "TR"], + ["Turkmenistan", "TM"], + ["Turks and Caicos Islands", "TC"], + ["Tuvalu", "TV"], + ["Uganda", "UG"], + ["Ukraine", "UA"], + ["United Arab Emirates", "AE"], + ["United Kingdom", "GB"], + ["United States", "US"], + ["United States Minor Outlying Islands", "UM"], + ["Uruguay", "UY"], + ["Uzbekistan", "UZ"], + ["Vanuatu", "VU"], + ["Venezuela, Bolivarian Republic of", "VE"], + ["Vietnam", "VN"], + ["Virgin Islands, British", "VG"], + ["Virgin Islands, U.S.", "VI"], + ["Wallis and Futuna", "WF"], + ["Western Sahara", "EH"], + ["Yemen", "YE"], + ["Zambia", "ZM"], + ["Zimbabwe", "ZW"], +]; diff --git a/packages/react/src/components/checkout/address/get-country-region.ts b/packages/react/src/components/checkout/address/get-country-region.ts new file mode 100644 index 00000000..ffaa4caf --- /dev/null +++ b/packages/react/src/components/checkout/address/get-country-region.ts @@ -0,0 +1,39 @@ +import { allCountries, countryTuples } from "./country-region-data"; + +export interface Country { + label: string; + value: string; +} + +export const countries: Country[] = countryTuples.map(([label, value]) => ({ + label, + value, +})); + +export function hasRegionData(countryCode: string): boolean { + const countryData = allCountries.find( + (country) => country[1] === countryCode, + ); + return !!( + countryData?.[2] && + Array.isArray(countryData[2]) && + countryData[2].length > 0 + ); +} + +export function getRegions( + countryCode: string, +): { label: string; code: string }[] { + const countryData = allCountries.find( + (country) => country[1] === countryCode, + ); + + if (!countryData || !countryData[2] || !Array.isArray(countryData[2])) { + return []; + } + + return countryData[2].map((region: string[]) => ({ + label: region[0], + code: region[1], + })); +} diff --git a/packages/react/src/components/checkout/address/index.ts b/packages/react/src/components/checkout/address/index.ts new file mode 100644 index 00000000..69677221 --- /dev/null +++ b/packages/react/src/components/checkout/address/index.ts @@ -0,0 +1,2 @@ +export * from "./address-form"; +export * from "./get-country-region"; diff --git a/packages/react/src/components/checkout/address/utils/check-is-valid-address.ts b/packages/react/src/components/checkout/address/utils/check-is-valid-address.ts new file mode 100644 index 00000000..1dd74953 --- /dev/null +++ b/packages/react/src/components/checkout/address/utils/check-is-valid-address.ts @@ -0,0 +1,26 @@ +import type { Address } from "@/types"; + +const convertCountryCode = ( + country?: string | null, +): string | null | undefined => { + if (country === "USA") return "US"; + return country; +}; + +export function checkIsValidAddress( + address: Address, + verifiedAddress?: Address, +) { + return ( + address.addressLine1?.toLowerCase() === + verifiedAddress?.addressLine1?.toLowerCase() && + address.adminArea1?.toLowerCase() === + verifiedAddress?.adminArea1?.toLowerCase() && + address.adminArea3?.toLowerCase() === + verifiedAddress?.adminArea3?.toLowerCase() && + address.postalCode?.toLowerCase() === + verifiedAddress?.postalCode?.toLowerCase() && + address.countryCode?.toLowerCase() === + convertCountryCode(verifiedAddress?.countryCode)?.toLowerCase() + ); +} diff --git a/packages/react/src/components/checkout/address/utils/check-is-valid-phone.ts b/packages/react/src/components/checkout/address/utils/check-is-valid-phone.ts new file mode 100644 index 00000000..afa48a80 --- /dev/null +++ b/packages/react/src/components/checkout/address/utils/check-is-valid-phone.ts @@ -0,0 +1,7 @@ +import { isPossiblePhoneNumber } from "react-phone-number-input"; + +export function checkIsValidPhone(phoneNumber: string): boolean { + if (!phoneNumber) return false; + + return isPossiblePhoneNumber(phoneNumber); +} diff --git a/packages/react/src/components/checkout/address/utils/format-address.ts b/packages/react/src/components/checkout/address/utils/format-address.ts new file mode 100644 index 00000000..ccc7b735 --- /dev/null +++ b/packages/react/src/components/checkout/address/utils/format-address.ts @@ -0,0 +1,38 @@ +import type { Address } from "@/types"; + +export function formatSingleLineAddress(address?: Address): string { + if (!address) return ""; + + const { + addressLine1, + addressLine2, + addressLine3, + adminArea1, + adminArea2, + adminArea3, + adminArea4, + postalCode, + countryCode, + } = address; + + const parts = [ + addressLine1, + addressLine2, + addressLine3, + adminArea4, + adminArea3, + adminArea2, + adminArea1, + postalCode, + countryCode, + ]; + + const seen = new Set(); + const formattedParts = parts.filter((part): part is string => { + if (!part || seen.has(part)) return false; + seen.add(part); + return true; + }); + + return formattedParts.join(", "); +} diff --git a/packages/react/src/components/checkout/address/utils/is-address-complete.ts b/packages/react/src/components/checkout/address/utils/is-address-complete.ts new file mode 100644 index 00000000..c4226f5d --- /dev/null +++ b/packages/react/src/components/checkout/address/utils/is-address-complete.ts @@ -0,0 +1,21 @@ +/** + * Utility to check if an address has all required fields for shipping/tax calculations. + * + * @param address - Address object to validate + * @returns true if all required fields are present and non-empty + */ +export function isAddressComplete(address: { + addressLine1?: string; + adminArea1?: string; + adminArea2?: string; + postalCode?: string; + countryCode?: string; +}): boolean { + return !!( + address.addressLine1?.trim() && + address.adminArea1?.trim() && + address.adminArea2?.trim() && + address.postalCode?.trim() && + address.countryCode?.trim() + ); +} diff --git a/packages/react/src/components/checkout/address/utils/map-address-fields-to-input.ts b/packages/react/src/components/checkout/address/utils/map-address-fields-to-input.ts new file mode 100644 index 00000000..dd6c5bc6 --- /dev/null +++ b/packages/react/src/components/checkout/address/utils/map-address-fields-to-input.ts @@ -0,0 +1,17 @@ +import type { UpdateDraftOrderInput } from "@/types"; + +export function mapAddressFieldsToInput>( + fields: T, + sectionKey: "shipping" | "billing", + useShippingAddress: boolean, +): Omit { + const input: Omit = {}; + if (sectionKey === "shipping" && useShippingAddress) { + input.shipping = { ...fields }; + input.billing = { ...fields }; + } else { + input[sectionKey] = { ...fields }; + } + + return input; +} diff --git a/packages/react/src/components/checkout/address/utils/use-address-matches.ts b/packages/react/src/components/checkout/address/utils/use-address-matches.ts new file mode 100644 index 00000000..008b8900 --- /dev/null +++ b/packages/react/src/components/checkout/address/utils/use-address-matches.ts @@ -0,0 +1,27 @@ +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { getAddressMatches } from "@/lib/godaddy/godaddy"; +import { useQuery } from "@tanstack/react-query"; + +/** + * Hook to fetch address matches for address autocomplete + * @param debouncedAddressValue The debounced address value to search for + * @param options Additional options for the query + * @param options.enabled Whether the query should be enabled + * @returns Query result with address matches data + */ +export function useAddressMatches( + debouncedAddressValue: string, + options: { + enabled: boolean; + } = { enabled: true }, +) { + const { session } = useCheckoutContext(); + + return useQuery({ + queryKey: ["addressMatchesQuery", debouncedAddressValue], + queryFn: () => getAddressMatches({ query: debouncedAddressValue }, session), + enabled: !!debouncedAddressValue && !!session?.id && options.enabled, + placeholderData: (prev) => prev, + select: (data) => data.checkoutSession?.addresses, + }); +} diff --git a/packages/react/src/components/checkout/address/utils/use-address-verification.ts b/packages/react/src/components/checkout/address/utils/use-address-verification.ts new file mode 100644 index 00000000..607c30f7 --- /dev/null +++ b/packages/react/src/components/checkout/address/utils/use-address-verification.ts @@ -0,0 +1,57 @@ +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { verifyAddress } from "@/lib/godaddy/godaddy"; +import { useQuery } from "@tanstack/react-query"; + +/** + * Address input for verification + */ +export interface AddressVerificationInput { + addressLine1: string; + addressLine2: string; + addressLine3: string; + postalCode: string; + countryCode: string; + adminArea1?: string; + adminArea2?: string; + adminArea3?: string; + adminArea4?: string; +} + +/** + * Hook to verify an address + * @param address The address to verify + * @param options Additional options for the query + * @param options.enabled Whether the query should be enabled + * @returns Query result with verified address data + */ +export function useAddressVerification( + address: AddressVerificationInput, + options: { + enabled: boolean; + } = { enabled: true }, +) { + const { session } = useCheckoutContext(); + + const queryKey = [ + "verifyAddressQuery", + { + addressLine1: address.addressLine1.toLowerCase(), + postalCode: address.postalCode.toLowerCase(), + countryCode: address.countryCode.toLowerCase(), + city: address.adminArea2?.toLowerCase(), + state: address.adminArea1?.toLowerCase(), + }, + ]; + + return useQuery({ + queryKey, + queryFn: async () => verifyAddress(address, session), + enabled: + options.enabled && + !!session?.id && + !!address.addressLine1 && + !!address.postalCode && + !!address.countryCode, + select: (data) => data.verifyAddress, + }); +} diff --git a/packages/react/src/components/checkout/checkout-section-header.tsx b/packages/react/src/components/checkout/checkout-section-header.tsx new file mode 100644 index 00000000..821e9fb6 --- /dev/null +++ b/packages/react/src/components/checkout/checkout-section-header.tsx @@ -0,0 +1,31 @@ +import { cn } from "@/lib/utils"; + +export function CheckoutSectionHeader({ + title, + description, + className, + classNames, +}: React.PropsWithChildren<{ + title?: string; + description?: string; + className?: string; + classNames?: { + title?: string; + description?: string; + }; +}>) { + return ( +
+
+ {title ? ( +

{title}

+ ) : null} + {description ? ( +

+ {description} +

+ ) : null} +
+
+ ); +} diff --git a/packages/react/src/components/checkout/checkout-section.tsx b/packages/react/src/components/checkout/checkout-section.tsx new file mode 100644 index 00000000..9f4ba84c --- /dev/null +++ b/packages/react/src/components/checkout/checkout-section.tsx @@ -0,0 +1,16 @@ +import { cn } from "@/lib/utils"; + +export function CheckoutSection({ + children, + className, + style, +}: React.PropsWithChildren<{ + className?: string; + style?: React.CSSProperties; +}>) { + return ( +
+ {children} +
+ ); +} diff --git a/packages/react/src/components/checkout/checkout-skeleton.tsx b/packages/react/src/components/checkout/checkout-skeleton.tsx new file mode 100644 index 00000000..67146dd0 --- /dev/null +++ b/packages/react/src/components/checkout/checkout-skeleton.tsx @@ -0,0 +1,129 @@ +import { LineItemSkeleton } from "@/components/checkout/line-items/line-item-skeleton"; +import { TotalsSkeleton } from "@/components/checkout/totals/totals-skeleton"; +import { Skeleton } from "@/components/ui/skeleton"; +import { CheckoutSection } from "./checkout-section"; + +function CheckoutSectionHeaderSkeleton() { + return ( +
+ + +
+ ); +} + +export function CheckoutSkeleton({ direction }: { direction?: string }) { + return ( +
+
+ {/* Left column - Forms */} +
+
+
+
+ {/* Contact section skeleton */} + + +
+ +
+
+ + {/* Delivery section skeleton */} + + +
+ {[1, 2].map((i, index) => ( +
+
+ +
+ + +
+
+
+ +
+
+ ))} +
+
+ + {/* Payment section skeleton */} + + +
+ +
+ + +
+ +
+
+
+ +
+ +
+
+
+
+ + {/* Right column - Order summary */} +
+
+ {/* Mobile view */} +
+ {/* Collapsible summary header for mobile */} +
+
+ + +
+ +
+ +
+ + {/* Desktop view - always visible */} +
+ + +
+
+
+
+
+ ); +} diff --git a/packages/react/src/components/checkout/checkout.tsx b/packages/react/src/components/checkout/checkout.tsx new file mode 100644 index 00000000..9e22c168 --- /dev/null +++ b/packages/react/src/components/checkout/checkout.tsx @@ -0,0 +1,533 @@ +"use client"; + +import { hasRegionData } from "@/components/checkout/address"; +import { checkIsValidPhone } from "@/components/checkout/address/utils/check-is-valid-phone"; +import { DeliveryMethods } from "@/components/checkout/delivery/delivery-method"; +import { getRequiredFieldsFromSchema } from "@/components/checkout/form/utils/get-required-fields-from-schema"; +import { type GoDaddyVariables, useGoDaddyContext } from "@/godaddy-provider"; +import { type Theme, useTheme } from "@/hooks/use-theme"; +import { useVariables } from "@/hooks/use-variables"; +import { TrackingProvider } from "@/tracking/tracking-provider"; +import type { CheckoutSession } from "@/types"; +import React, { type ReactNode } from "react"; +import { z } from "zod"; +import { CheckoutFormContainer } from "./form/checkout-form-container"; +import type { Target } from "./target/target"; + +// Utility function for redirecting to success URL after checkout +export function redirectToSuccessUrl(successUrl?: string): void { + if (successUrl && typeof window !== "undefined") { + window.location.href = successUrl; + } +} + +export interface CheckoutElements { + input?: string; + select?: string; + button?: string; + card?: string; + checkbox?: string; + radio?: string; +} + +interface Appearance { + theme?: Theme; + elements?: CheckoutElements; + variables?: Omit; +} + +export type LayoutSection = + | "express-checkout" + | "contact" + | "shipping" + | "payment" + | "pickup" + | "tips" + | "delivery"; + +export const LayoutSections = { + EXPRESS_CHECKOUT: "express-checkout", + CONTACT: "contact", + SHIPPING: "shipping", + PAYMENT: "payment", + PICKUP: "pickup", + DELIVERY: "delivery", + TIPS: "tips", +} as const; + +export type StripeConfig = { + publishableKey: string; + testMode?: boolean; +}; + +export type GodaddyPaymentsConfig = { + businessId: string; + appId: string; +}; + +export type SquareConfig = { + locationId: string; + appId: string; +}; + +export type PayPalConfig = { + clientId: string; + disableFunding?: Array<"credit" | "card" | "paylater" | "venmo">; +}; + +interface CheckoutContextValue { + elements?: CheckoutElements; + targets?: Partial ReactNode>>; + session?: CheckoutSession; + isCheckoutDisabled?: boolean; + stripeConfig?: StripeConfig; + godaddyPaymentsConfig?: GodaddyPaymentsConfig; + squareConfig?: SquareConfig; + paypalConfig?: PayPalConfig; + isConfirmingCheckout: boolean; + setIsConfirmingCheckout: (isConfirming: boolean) => void; + checkoutErrors?: string[] | undefined; + setCheckoutErrors: (error?: string[] | undefined) => void; + requiredFields?: { [key: string]: boolean }; +} +/** + * Non-digit regex. + */ +const NON_DIGIT_REGEX = /\D/g; + +export function _isLuhnAlgo(input: string): boolean { + // Remove any non-digit chars + const number = input.replace(NON_DIGIT_REGEX, ""); + + // Create necessary variables + let length = number.length; + let bit = 1; + let sum = 0; + + // Calculate sum of algorithm + while (length) { + const value = +number[--length]; + bit ^= 1; + sum += bit ? [0, 2, 4, 6, 8, 1, 3, 5, 7, 9][value] : value; + } + + // Return whether its valid + return sum % 10 === 0; +} + +export const checkoutContext = React.createContext({ + isConfirmingCheckout: false, + setIsConfirmingCheckout: () => {}, + checkoutErrors: undefined, + setCheckoutErrors: () => {}, +}); + +export const useCheckoutContext = () => React.useContext(checkoutContext); + +export const baseCheckoutSchema = z.object({ + contactEmail: z + .string() + .min(1, "Enter an email") + .email("Enter a valid email"), + deliveryMethod: z.nativeEnum(DeliveryMethods).describe("fulfillmentModes"), + paymentUseShippingAddress: z.boolean().default(true), + shippingFirstName: z.string().max(60), + shippingLastName: z.string().max(60), + shippingPhone: z.string().max(15, "Phone number too long").optional(), + shippingAddressLine1: z.string().max(300), + shippingAddressLine2: z.string().max(300).optional(), + shippingAddressLine3: z.string().max(300).optional(), + shippingAdminArea4: z + .string() + .max(100) + .describe("The neighborhood") + .optional(), + shippingAdminArea3: z + .string() + .max(100) + .describe("City, town, or village") + .optional(), + shippingAdminArea2: z.string().max(100).describe("Sub-locality or suburb"), + shippingAdminArea1: z.string().max(100).describe("State or province"), + shippingPostalCode: z.string().max(60), + shippingCountryCode: z.string().max(2), + shippingMethod: z.string().optional(), + shippingValid: z.literal(true, { + errorMap: () => ({ message: "Invalid shipping address" }), + }), + billingFirstName: z.string().max(60), + billingLastName: z.string().max(60), + billingPhone: z.string().max(15, "Phone number too long").optional(), + billingAddressLine1: z.string().max(300), + billingAddressLine2: z.string().max(300).optional(), + billingAddressLine3: z.string().max(300).optional(), + billingAdminArea4: z + .string() + .max(100) + .describe("The neighborhood") + .optional(), + billingAdminArea3: z + .string() + .max(100) + .describe("City, town, or village") + .optional(), + billingAdminArea2: z.string().max(100).describe("Sub-locality or suburb"), + billingAdminArea1: z.string().max(100).describe("State or province"), + billingPostalCode: z.string().max(60), + billingCountryCode: z.string().max(2), + billingValid: z.literal(true, { + errorMap: () => ({ message: "Invalid billing address" }), + }), + paymentCardNumber: z.string().optional(), + paymentCardNumberDisplay: z.string().optional(), + paymentCardType: z.string().optional(), + paymentExpiryDate: z.string().optional(), + paymentMonth: z.string().nullish(), + paymentYear: z.string().nullish(), + paymentSecurityCode: z.string().optional(), + paymentNameOnCard: z.string().optional(), + notes: z.string().optional(), + pickupDate: z.union([z.string(), z.date()]).nullish(), + pickupTime: z.string().nullish(), + pickupLocationId: z.string().nullish(), + pickupLeadTime: z.number().nullish(), + pickupTimezone: z.string().nullish(), + tipAmount: z.number().optional(), + tipPercentage: z.number().optional(), + paymentMethod: z.string().min(1, "Select a payment method"), + stripePaymentIntent: z.string().optional(), + stripePaymentIntentId: z.string().optional(), +}); // We cannot use refine here, as it would not allow extending the schema with session overrides. + +export type CheckoutFormSchema = Partial<{ + [K in keyof z.infer]: z.ZodTypeAny; +}> & + z.ZodRawShape; + +export type CheckoutFormData = z.infer; + +export interface CheckoutProps { + session: CheckoutSession | undefined; + appearance?: Appearance; + isCheckoutDisabled?: boolean; + stripeConfig?: StripeConfig; + godaddyPaymentsConfig?: GodaddyPaymentsConfig; + squareConfig?: SquareConfig; + paypalConfig?: PayPalConfig; + layout?: LayoutSection[]; + direction?: "ltr" | "rtl"; + showStoreHours?: boolean; + enableTracking?: boolean; + targets?: Partial ReactNode>>; + checkoutFormSchema?: CheckoutFormSchema; + defaultValues?: Pick; +} + +export function Checkout(props: CheckoutProps) { + const { + session, + checkoutFormSchema, + enableTracking = false, + stripeConfig, + godaddyPaymentsConfig, + squareConfig, + paypalConfig, + isCheckoutDisabled, + } = props; + + const [isConfirmingCheckout, setIsConfirmingCheckout] = React.useState(false); + const [checkoutErrors, setCheckoutErrors] = React.useState< + string[] | undefined + >(undefined); + const { t } = useGoDaddyContext(); + + useTheme(); + useVariables(props?.appearance?.variables); + + const formSchema = React.useMemo(() => { + const extendedSchema = checkoutFormSchema + ? baseCheckoutSchema.extend(checkoutFormSchema) + : baseCheckoutSchema; + + return extendedSchema.superRefine((data, ctx) => { + if (data.billingPhone) { + if (!checkIsValidPhone(String(data?.billingPhone))) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Enter a valid billing phone number", + path: ["billingPhone"], + }); + } + } + + if (data.shippingPhone) { + if (!checkIsValidPhone(String(data?.shippingPhone))) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Enter a valid shipping phone number", + path: ["shippingPhone"], + }); + } + } + // Skip validation if payment method isn't credit card + // const selectedMethod = data.paymentMethod + // ? session?.paymentMethods?.[ + // data.paymentMethod as keyof typeof session.paymentMethods + // ] + // : null; + + // if ( + // data.paymentMethod === PaymentMethodType.CREDIT_CARD && + // selectedMethod?.processor === PaymentProvider.GODADDY + // ) { + // // Validate card number presence + // if (!data.paymentCardNumber) { + // ctx.addIssue({ + // code: z.ZodIssueCode.custom, + // message: "Enter a card number", + // path: ["paymentCardNumber"], + // }); + // } + // + // // Validate card number display and format + // if (!data.paymentCardNumberDisplay) { + // ctx.addIssue({ + // code: z.ZodIssueCode.custom, + // message: "Enter a card number", + // path: ["paymentCardNumberDisplay"], + // }); + // } else { + // // Card number format validation + // const SANITIZE_REGEX = /[- ]/g; + // const CREDIT_CARD_REGEX = + // /^(?:\d{14,19}|\d{4}(?: \d{3,6}){2,4}|\d{4}(?:-\d{3,6}){2,4})$/; + // const PROVIDER_REGEX_LIST = [ + // // American Express + // /^3[47]\d{13}$/, + // // Diners Club + // /^3(?:0[0-5]|[68]\d)\d{11,13}$/, + // // Discover + // /^6(?:011|5\d{2})\d{12,15}$/, + // // JCB + // /^(?:2131|1800|35\d{3})\d{11}$/, + // // Mastercard + // /^5[1-5]\d{2}|(?:222\d|22[3-9]\d|2[3-6]\d{2}|27[01]\d|2720)\d{12}$/, + // // UnionPay + // /^(?:6[27]\d{14,17}|81\d{14,17})$/, + // // Visa + // /^4\d{12}(?:\d{3,6})?$/, + // ]; + // + // const sanitized = String(data.paymentCardNumberDisplay).replace( + // SANITIZE_REGEX, + // "", + // ); + // + // const isValid = + // CREDIT_CARD_REGEX.test(String(data?.paymentCardNumberDisplay)) && + // sanitized && + // PROVIDER_REGEX_LIST.some((regex) => regex.test(sanitized)) && + // _isLuhnAlgo(sanitized); + // + // if (!isValid) { + // ctx.addIssue({ + // code: z.ZodIssueCode.custom, + // message: "Enter a valid card number", + // path: ["paymentCardNumberDisplay"], + // }); + // } + // } + // + // // Validate expiry date + // if (!data.paymentExpiryDate) { + // ctx.addIssue({ + // code: z.ZodIssueCode.custom, + // message: "Enter an expiration date", + // path: ["paymentExpiryDate"], + // }); + // } else { + // const [monthInput, yearInput] = String(data.paymentExpiryDate) + // .split(" / ") + // .map((str) => str.trim()); + // + // if (!monthInput || !yearInput) { + // ctx.addIssue({ + // code: z.ZodIssueCode.custom, + // message: "Enter a valid expiration date", + // path: ["paymentExpiryDate"], + // }); + // return; + // } + // + // const month = Number.parseInt(monthInput, 10); + // const year = Number.parseInt(yearInput, 10) + 2000; + // + // if (Number.isNaN(month) || Number.isNaN(year)) { + // ctx.addIssue({ + // code: z.ZodIssueCode.custom, + // message: "Enter a valid expiration date", + // path: ["paymentExpiryDate"], + // }); + // return; + // } + // + // if (month < 1 || month > 12) { + // ctx.addIssue({ + // code: z.ZodIssueCode.custom, + // message: "Enter a valid month", + // path: ["paymentExpiryDate"], + // }); + // return; + // } + // + // // Last day of the month + // const expiryDate = new Date(year, month, 0, 23, 59, 59, 999); + // + // if (Number.isNaN(expiryDate.getTime())) { + // ctx.addIssue({ + // code: z.ZodIssueCode.custom, + // message: "Enter a valid expiration date", + // path: ["paymentExpiryDate"], + // }); + // return; + // } + // + // const now = new Date(); + // if (expiryDate <= now) { + // ctx.addIssue({ + // code: z.ZodIssueCode.custom, + // message: "Enter a valid future date", + // path: ["paymentExpiryDate"], + // }); + // } + // } + // + // // Validate security code + // if (!data.paymentSecurityCode) { + // ctx.addIssue({ + // code: z.ZodIssueCode.custom, + // message: "Enter a security code", + // path: ["paymentSecurityCode"], + // }); + // } + // + // // Validate name on card + // if (!data.paymentNameOnCard) { + // ctx.addIssue({ + // code: z.ZodIssueCode.custom, + // message: "Enter the name on card", + // path: ["paymentNameOnCard"], + // }); + // } + //} + + // Billing address validation - only required if not using shipping address OR pickup + const requireBillingAddress = + !data.paymentUseShippingAddress || data.deliveryMethod === "PICKUP"; + + if (requireBillingAddress) { + // Basic billing fields required for all countries + const billingFields = [ + { key: "billingFirstName", message: t.validation.enterFirstName }, + { key: "billingLastName", message: t.validation.enterLastName }, + { key: "billingAddressLine1", message: t.validation.enterAddress }, + { key: "billingAdminArea2", message: t.validation.enterCity }, + { + key: "billingPostalCode", + message: t.validation.enterZipPostalCode, + }, + { key: "billingCountryCode", message: t.validation.enterCountry }, + ]; + + if (hasRegionData(String(data.billingCountryCode))) { + billingFields.push({ + key: "billingAdminArea1", + message: t.validation.selectState, + }); + } + + for (const { key, message } of billingFields) { + if (!data[key as keyof typeof data]) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message, + path: [key], + }); + } + } + } + + // Shipping address validation - only required if delivery method is SHIP + const requireShippingAddress = + data.deliveryMethod === DeliveryMethods.SHIP; + + if (requireShippingAddress) { + // Basic shipping fields required for all countries + const shippingFields = [ + { key: "shippingFirstName", message: t.validation.enterFirstName }, + { key: "shippingLastName", message: t.validation.enterLastName }, + { key: "shippingAddressLine1", message: t.validation.enterAddress }, + { key: "shippingAdminArea2", message: t.validation.enterCity }, + { + key: "shippingPostalCode", + message: t.validation.enterZipPostalCode, + }, + { key: "shippingCountryCode", message: t.validation.enterCountry }, + ]; + + if (hasRegionData(String(data.shippingCountryCode))) { + shippingFields.push({ + key: "shippingAdminArea1", + message: t.validation.selectState, + }); + } + + for (const { key, message } of shippingFields) { + if (!data[key as keyof typeof data]) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message, + path: [key], + }); + } + } + } + }); + }, [checkoutFormSchema, t]); + // }, [checkoutFormSchema, session?.paymentMethods]); + + const requiredFields = React.useMemo(() => { + return getRequiredFieldsFromSchema(formSchema); + }, [formSchema]); + + return ( + + + + + + ); +} diff --git a/packages/react/src/components/checkout/contact/contact-form.tsx b/packages/react/src/components/checkout/contact/contact-form.tsx new file mode 100644 index 00000000..957e892b --- /dev/null +++ b/packages/react/src/components/checkout/contact/contact-form.tsx @@ -0,0 +1,113 @@ +"use client"; + +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { useDraftOrder } from "@/components/checkout/order/use-draft-order"; +import { useDraftOrderFieldSync } from "@/components/checkout/order/use-draft-order-sync"; +import { + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { useGoDaddyContext } from "@/godaddy-provider"; +import { eventIds } from "@/tracking/events"; +import { TrackingEventType, track } from "@/tracking/track"; +import { useDebouncedValue } from "@tanstack/react-pacer"; +import { useMemo } from "react"; +import { useFormContext } from "react-hook-form"; + +export function ContactForm() { + const form = useFormContext(); + const { t } = useGoDaddyContext(); + const { isConfirmingCheckout, requiredFields } = useCheckoutContext(); + const { data: draftOrder } = useDraftOrder(); + + const contactEmail = form.watch("contactEmail"); + + // Check if email values differ from order values + const emailHasChanged = useMemo(() => { + if (!draftOrder) return true; // If no order, allow sync + + const shippingEmailMissing = !draftOrder?.shipping?.email; + const billingEmailMissing = !draftOrder?.billing?.email; + + const shippingIsDifferent = draftOrder?.shipping?.email !== contactEmail; + const billingIsDifferent = draftOrder?.billing?.email !== contactEmail; + + return ( + !!contactEmail?.trim() && + (shippingEmailMissing || + billingEmailMissing || + shippingIsDifferent || + billingIsDifferent) + ); + }, [draftOrder, contactEmail]); + + const [email] = useDebouncedValue(contactEmail, { + wait: 1000, + }); + + useDraftOrderFieldSync({ + key: "email", + data: email, + deps: [email, emailHasChanged, draftOrder], + enabled: + emailHasChanged && + email?.trim() && + email === contactEmail && + !!draftOrder, + fieldNames: ["contactEmail"], + mapToInput: (email) => { + if (!draftOrder) return {}; + + const shippingIsDifferent = draftOrder?.shipping?.email !== email; + const billingIsDifferent = draftOrder?.billing?.email !== email; + + return { + ...(shippingIsDifferent ? { shipping: { email: email?.trim() } } : {}), + ...(billingIsDifferent ? { billing: { email: email?.trim() } } : {}), + }; + }, + }); + + return ( +
+ ( + + {t.contact.email} + + { + field.onBlur(); + + // Only track on blur if value is present and valid + if (e.target.value && !fieldState.error) { + track({ + eventId: eventIds.changeEmail, + type: TrackingEventType.CLICK, + properties: { + hasValue: !!e.target.value, + isValid: !fieldState.error, + }, + }); + } + }} + /> + + + + )} + /> +
+ ); +} diff --git a/packages/react/src/components/checkout/contact/phone-input.tsx b/packages/react/src/components/checkout/contact/phone-input.tsx new file mode 100644 index 00000000..5e08c0c2 --- /dev/null +++ b/packages/react/src/components/checkout/contact/phone-input.tsx @@ -0,0 +1,295 @@ +"use client"; + +import { checkIsValidPhone } from "@/components/checkout/address/utils/check-is-valid-phone"; +import { mapAddressFieldsToInput } from "@/components/checkout/address/utils/map-address-fields-to-input"; +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { useDraftOrder } from "@/components/checkout/order/use-draft-order"; +import { useDraftOrderFieldSync } from "@/components/checkout/order/use-draft-order-sync"; +import { Button } from "@/components/ui/button"; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from "@/components/ui/command"; +import { + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { useGoDaddyContext } from "@/godaddy-provider"; +import { cn } from "@/lib/utils"; +import { eventIds } from "@/tracking/events"; +import { TrackingEventType, track } from "@/tracking/track"; +import { useDebouncedValue } from "@tanstack/react-pacer"; +import { CheckIcon, ChevronsUpDown } from "lucide-react"; +import React from "react"; +import { useFormContext } from "react-hook-form"; +import * as RPNInput from "react-phone-number-input"; +import flags from "react-phone-number-input/flags"; + +function FlagComponent({ country, countryName }: RPNInput.FlagProps) { + const Flag = flags[country]; + + return ( + + {Flag && } + + ); +} + +const PhoneTextInput = React.memo( + React.forwardRef< + HTMLInputElement, + React.ComponentProps<"input"> & { hasError?: boolean } + >(({ className, hasError, ...props }, ref) => ( + + )), +); + +interface CountryEntry { + label: string; + value: RPNInput.Country | undefined; +} + +interface CountrySelectProps { + disabled?: boolean; + value: RPNInput.Country; + options: CountryEntry[]; + onChange: (country: RPNInput.Country) => void; + hasError?: boolean; +} + +function CountrySelect({ + disabled, + value: selectedCountry, + options: countryList, + onChange, + hasError, +}: CountrySelectProps) { + const { t } = useGoDaddyContext(); + const scrollAreaRef = React.useRef(null); + const [searchValue, setSearchValue] = React.useState(""); + return ( + + + + + + + { + setSearchValue(value); + setTimeout(() => { + if (scrollAreaRef.current) { + const viewportElement = scrollAreaRef.current.querySelector( + "[data-radix-scroll-area-viewport]", + ); + if (viewportElement) { + viewportElement.scrollTop = 0; + } + } + }, 0); + }} + placeholder={t.phone.searchCountry} + /> + + + {t.phone.noCountryFound} + + {countryList.map(({ value, label }) => + value ? ( + + ) : null, + )} + + + + + + + ); +} + +interface CountrySelectOptionProps extends RPNInput.FlagProps { + selectedCountry: RPNInput.Country; + onChange: (country: RPNInput.Country) => void; +} + +const CountrySelectOption = ({ + country, + countryName, + selectedCountry, + onChange, +}: CountrySelectOptionProps) => { + return ( + { + onChange(country); + + // Track phone country selection + track({ + eventId: eventIds.changePhoneCountry, + type: TrackingEventType.CLICK, + properties: { + country, + countryName, + countryCode: `+${RPNInput.getCountryCallingCode(country)}`, + }, + }); + }} + > + + {countryName} + {`+${RPNInput.getCountryCallingCode(country)}`} + + + ); +}; + +export function PhoneInput({ + sectionKey, + disabled, +}: { sectionKey: string; disabled?: boolean }) { + const form = useFormContext(); + const { t } = useGoDaddyContext(); + const { session, requiredFields } = useCheckoutContext(); + const { data: draftOrder } = useDraftOrder(); + + const phoneValue = form.watch(`${sectionKey}Phone`); + const useShippingAddress = form.watch("paymentUseShippingAddress"); + + const [phone] = useDebouncedValue(phoneValue, { + wait: 1000, + }); + + const isValidPhone = React.useMemo(() => checkIsValidPhone(phone), [phone]); + + // Check if phone value differs from order value + const phoneHasChanged = React.useMemo(() => { + if (!draftOrder) return true; // If no order, allow sync + const section = + sectionKey === "shipping" ? draftOrder.shipping : draftOrder.billing; + return (section?.phone || "") !== (phone || ""); + }, [draftOrder, sectionKey, phone]); + + useDraftOrderFieldSync({ + key: "phone", + data: phone, + deps: [phone, isValidPhone], + enabled: + phoneHasChanged && // Only sync if values differ from order + phone === phoneValue && + (phone + ? isValidPhone && phone?.trim() !== "" + : !phone && phoneValue === ""), + fieldNames: [`${sectionKey}Phone`], + mapToInput: (data) => + mapAddressFieldsToInput( + { phone: data }, + sectionKey as "shipping" | "billing", + useShippingAddress, + ), + }); + + return session?.enablePhoneCollection ? ( + ( + + {t.shipping.phone} + + { + // Allow truly empty values + const newValue = value ?? ""; + field.onChange(newValue); + + // Track phone number change + if (newValue) { + track({ + eventId: eventIds.changePhoneNumber, + type: TrackingEventType.CLICK, + properties: { + sectionKey, + hasValue: !!newValue, + isValid: checkIsValidPhone(newValue), + }, + }); + } + }} + onBlur={field.onBlur} + disabled={disabled} + smartCaret={false} + addInternationalOption={false} + international={false} + flagComponent={FlagComponent} + inputComponent={React.useCallback( + (props: React.ComponentProps<"input">) => ( + + ), + [fieldState.error, sectionKey], + )} + countrySelectComponent={React.useCallback( + (props: CountrySelectProps) => ( + + ), + [fieldState.error], + )} + className="flex rounded-md" + /> + + + + )} + /> + ) : null; +} diff --git a/packages/react/src/components/checkout/delivery/delivery-method.tsx b/packages/react/src/components/checkout/delivery/delivery-method.tsx new file mode 100644 index 00000000..c157c731 --- /dev/null +++ b/packages/react/src/components/checkout/delivery/delivery-method.tsx @@ -0,0 +1,164 @@ +import { + type CheckoutFormData, + useCheckoutContext, +} from "@/components/checkout/checkout"; +import { useApplyDeliveryMethod } from "@/components/checkout/delivery/utils/use-apply-delivery-method"; +import { useRemoveShippingMethod } from "@/components/checkout/shipping/utils/use-remove-shipping-method"; +import { FormControl, FormField, FormItem } from "@/components/ui/form"; +import { Label } from "@/components/ui/label"; +import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; +import { useGoDaddyContext } from "@/godaddy-provider"; +import { TrackingEventType, track } from "@/tracking/track"; +import { Store, Truck } from "lucide-react"; +import { useFormContext } from "react-hook-form"; + +export enum DeliveryMethods { + NONE = "NONE", + PICKUP = "PICKUP", + SHIP = "SHIP", + CURBSIDE = "CURBSIDE", + DELIVERY = "DELIVERY", + DRIVE_THRU = "DRIVE_THRU", + FOR_HERE = "FOR_HERE", + TO_GO = "TO_GO", + DIGITAL = "DIGITAL", + PURCHASE = "PURCHASE", + GENERAL_CONTAINER = "GENERAL_CONTAINER", + QUICK_STAY = "QUICK_STAY", + REGULAR_STAY = "REGULAR_STAY", + NON_LODGING_NRR = "NON_LODGING_NRR", + NON_LODGING_SALE = "NON_LODGING_SALE", + GIFT_CARD = "GIFT_CARD", +} + +export interface DeliveryMethod { + id: CheckoutFormData["deliveryMethod"]; + name: string; + description: string; + icon: React.ReactNode; +} + +const DELIVERY_METHODS: DeliveryMethod[] = [ + { + id: DeliveryMethods.SHIP, + name: "Shipping", // This will be replaced with localized version in component + description: "Ship to your address", // This will be replaced with localized version in component + icon: , + }, + { + id: DeliveryMethods.PICKUP, + name: "Local Pickup", // This will be replaced with localized version in component + description: "Pick up from store location", // This will be replaced with localized version in component + icon: , + }, +]; + +export function DeliveryMethodForm() { + const { t } = useGoDaddyContext(); + const form = useFormContext(); + const { session, isConfirmingCheckout } = useCheckoutContext(); + const removeShippingMethod = useRemoveShippingMethod(); + const applyDeliveryMethod = useApplyDeliveryMethod(); + const shippingMethod = form.watch("shippingMethod"); + + const handleDeliveryMethodChange = (value: DeliveryMethods) => { + form.setValue("deliveryMethod", value); + if (value === DeliveryMethods.PICKUP) { + if (shippingMethod) { + removeShippingMethod.mutate(shippingMethod); + form.setValue("shippingMethod", undefined); + } + } else { + applyDeliveryMethod.mutate(value); + } + track({ + eventId: "change_delivery_method.click", + type: TrackingEventType.CLICK, + properties: { + deliveryMethod: value, + }, + }); + }; + + const availableMethods = [ + DELIVERY_METHODS[0], + ...(session?.enableLocalPickup ? [DELIVERY_METHODS[1]] : []), + ]; + + return ( +
+
+ +
+ {availableMethods.length === 1 ? ( + + ) : ( + ( + + + + {availableMethods.map((method, index) => ( + + ))} + + + + )} + /> + )} +
+ ); +} diff --git a/packages/react/src/components/checkout/delivery/utils/use-apply-delivery-method.ts b/packages/react/src/components/checkout/delivery/utils/use-apply-delivery-method.ts new file mode 100644 index 00000000..c33cf107 --- /dev/null +++ b/packages/react/src/components/checkout/delivery/utils/use-apply-delivery-method.ts @@ -0,0 +1,18 @@ +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { applyDeliveryMethod } from "@/lib/godaddy/godaddy"; +import type { ApplyCheckoutSessionDeliveryMethodInput } from "@/types"; +import { useMutation } from "@tanstack/react-query"; + +export function useApplyDeliveryMethod() { + const { session } = useCheckoutContext(); + + return useMutation({ + mutationKey: ["apply-delivery-method", { sessionId: session?.id }], + mutationFn: async ( + mode: ApplyCheckoutSessionDeliveryMethodInput["input"]["mode"], + ) => { + if (!session) return; + return await applyDeliveryMethod({ mode }, session); + }, + }); +} diff --git a/packages/react/src/components/checkout/delivery/utils/use-apply-fulfillment-location.ts b/packages/react/src/components/checkout/delivery/utils/use-apply-fulfillment-location.ts new file mode 100644 index 00000000..0b8f1c3c --- /dev/null +++ b/packages/react/src/components/checkout/delivery/utils/use-apply-fulfillment-location.ts @@ -0,0 +1,49 @@ +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { useUpdateTaxes } from "@/components/checkout/order/use-update-taxes"; +import { applyFulfillmentLocation } from "@/lib/godaddy/godaddy"; +import type { ApplyCheckoutSessionFulfillmentLocationInput } from "@/types"; +import { useMutation } from "@tanstack/react-query"; + +export function useApplyFulfillmentLocation() { + const { session } = useCheckoutContext(); + const updateTaxes = useUpdateTaxes(); + + return useMutation({ + mutationKey: ["apply-fulfillment-location", { sessionId: session?.id }], + mutationFn: async ({ + fulfillmentLocationId, + }: { + fulfillmentLocationId: ApplyCheckoutSessionFulfillmentLocationInput["input"]["fulfillmentLocationId"]; + locationAddress?: { + addressLine1?: string | null; + addressLine2?: string | null; + addressLine3?: string | null; + adminArea1?: string | null; + adminArea2?: string | null; + adminArea3?: string | null; + countryCode?: string | null; + postalCode?: string | null; + }; + }) => { + // Don't process empty string or undefined location IDs + if (!session || !fulfillmentLocationId) return; + + return await applyFulfillmentLocation({ fulfillmentLocationId }, session); + }, + onSuccess: (_data, { locationAddress }) => { + if (!session) return; + + if (session?.enableTaxCollection && locationAddress) { + updateTaxes.mutate(locationAddress); + } + }, + onError: (error, { locationAddress }) => { + // Graceful degradation: still calculate taxes with pickup location address + // even if fulfillment location API fails + if (session?.enableTaxCollection && locationAddress) { + console.log("Calculating taxes despite fulfillment location failure"); + updateTaxes.mutate(locationAddress); + } + }, + }); +} diff --git a/packages/react/src/components/checkout/discount/discount-apply-button.tsx b/packages/react/src/components/checkout/discount/discount-apply-button.tsx new file mode 100644 index 00000000..a022fcd6 --- /dev/null +++ b/packages/react/src/components/checkout/discount/discount-apply-button.tsx @@ -0,0 +1,43 @@ +"use client"; + +import { Button } from "@/components/ui/button"; +import { useGoDaddyContext } from "@/godaddy-provider"; +import { Loader2 } from "lucide-react"; +import type { ComponentProps } from "react"; + +export type ApplyButtonProps = ComponentProps & { + isSubmitting?: boolean; +}; + +export function DiscountApplyButton({ + onClick, + disabled, + isSubmitting, + className, + ...rest +}: ApplyButtonProps) { + const { t } = useGoDaddyContext(); + return ( +
+ +
+ ); +} diff --git a/packages/react/src/components/checkout/discount/discount-error-list.tsx b/packages/react/src/components/checkout/discount/discount-error-list.tsx new file mode 100644 index 00000000..846e7862 --- /dev/null +++ b/packages/react/src/components/checkout/discount/discount-error-list.tsx @@ -0,0 +1,26 @@ +import { useGoDaddyContext } from "@/godaddy-provider"; +import { CircleAlert } from "lucide-react"; +import React from "react"; + +export function DiscountErrorList({ + checkoutErrors, +}: { checkoutErrors?: string[] }) { + const { t } = useGoDaddyContext(); + + if (!checkoutErrors?.length) return null; + + return ( +
+
+ +
    + {checkoutErrors?.map((code) => ( +
  • + {t.apiErrors?.[code as keyof typeof t.apiErrors] || code} +
  • + ))} +
+
+
+ ); +} diff --git a/packages/react/src/components/checkout/discount/discount-input.tsx b/packages/react/src/components/checkout/discount/discount-input.tsx new file mode 100644 index 00000000..7472fddb --- /dev/null +++ b/packages/react/src/components/checkout/discount/discount-input.tsx @@ -0,0 +1,41 @@ +import { Input } from "@/components/ui/input"; +import { useGoDaddyContext } from "@/godaddy-provider"; +import type { ChangeEvent, ComponentProps } from "react"; +import { forwardRef } from "react"; + +type DiscountInputProps = Omit, "onChange"> & { + hasError?: boolean; + onChange?: (e: ChangeEvent) => void; + onKeyDown?: (e: React.KeyboardEvent) => void; +}; + +export const DiscountInput = forwardRef( + ({ hasError, onChange, onKeyDown, ...props }, ref) => { + const { t } = useGoDaddyContext(); + // Handle input change to automatically remove spaces + const handleChange = (e: ChangeEvent) => { + // Keep original event but modify the value to trim spaces + const originalValue = e.target.value; + e.target.value = originalValue.replace(/\s+/g, ""); + + // Call the original onChange if provided + if (onChange) { + onChange(e); + } + }; + + return ( +
+ +
+ ); + }, +); diff --git a/packages/react/src/components/checkout/discount/discount-standalone.tsx b/packages/react/src/components/checkout/discount/discount-standalone.tsx new file mode 100644 index 00000000..c3edebeb --- /dev/null +++ b/packages/react/src/components/checkout/discount/discount-standalone.tsx @@ -0,0 +1,252 @@ +"use client"; + +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { DiscountApplyButton } from "@/components/checkout/discount/discount-apply-button"; +import { DiscountErrorList } from "@/components/checkout/discount/discount-error-list"; +import { DiscountInput } from "@/components/checkout/discount/discount-input"; +import { useDiscountApply } from "@/components/checkout/discount/utils/use-discount-apply"; +import { useDraftOrder } from "@/components/checkout/order/use-draft-order"; +import { useGoDaddyContext } from "@/godaddy-provider"; +import { GraphQLErrorWithCodes } from "@/lib/graphql-with-errors"; +import { eventIds } from "@/tracking/events"; +import { TrackingEventType, track } from "@/tracking/track"; +import React, { useState } from "react"; +import { Discounts } from "./discounts"; +import type { DiscountFormProps } from "./types"; + +export function DiscountStandalone({ + initialDiscounts = [], + onDiscountsChange, + onError, +}: DiscountFormProps) { + const { t } = useGoDaddyContext(); + const { isConfirmingCheckout } = useCheckoutContext(); + const { data: draftOrder } = useDraftOrder(); + + // Get current discount codes from order-level, line item-level, and shipping line-level discounts + const currentDiscountCodes = React.useMemo(() => { + if (!draftOrder) return []; + + const allCodes = new Set(); + + // Add order-level discount codes + if (draftOrder.discounts) { + for (const discount of draftOrder.discounts) { + if (discount.code) { + allCodes.add(discount.code); + } + } + } + + // Add line item-level discount codes + if (draftOrder.lineItems) { + for (const lineItem of draftOrder.lineItems) { + if (lineItem.discounts) { + for (const discount of lineItem.discounts) { + if (discount.code) { + allCodes.add(discount.code); + } + } + } + } + } + + // Add shipping line-level discount codes + if (draftOrder.shippingLines) { + for (const shippingLine of draftOrder.shippingLines) { + if (shippingLine.discounts) { + for (const discount of shippingLine.discounts) { + if (discount.code) { + allCodes.add(discount.code); + } + } + } + } + } + + return Array.from(allCodes); + }, [draftOrder]); + + const [discountCode, setDiscountCode] = useState(""); + const [formErrors, setFormErrors] = useState(undefined); + const [isSubmitting, setIsSubmitting] = useState(false); + const [isRemovingDiscount, setIsRemovingDiscount] = useState< + string | undefined + >(undefined); + const applyDiscount = useDiscountApply(); + + const handleInputChange = (e: React.ChangeEvent) => { + setDiscountCode(e.target.value); + setFormErrors(undefined); + }; + + const handleApply = async () => { + // Validation + + if (!discountCode.trim()) { + setFormErrors([t.discounts.enterCodeValidation]); + return; + } + + try { + setIsSubmitting(true); + // Normalize the discount code to uppercase for consistency + const normalizedCode = discountCode.trim(); + + // Check if the code already exists + if (currentDiscountCodes.includes(normalizedCode)) { + setFormErrors([t.discounts.alreadyApplied]); + return; + } + + // Apply discount with current codes + new code + const newDiscountCodes = [...currentDiscountCodes, normalizedCode]; + await applyDiscount.mutateAsync({ + discountCodes: newDiscountCodes, + }); + + // Track successful discount application + track({ + eventId: eventIds.applyCoupon, + type: TrackingEventType.CLICK, + properties: { + success: true, + discountCount: newDiscountCodes.length, + }, + }); + + // Call the change handler if provided + onDiscountsChange?.(newDiscountCodes); + + // Reset the input + setDiscountCode(""); + setFormErrors(undefined); + } catch (error) { + if (error instanceof GraphQLErrorWithCodes) { + setFormErrors(error.codes); + + // Track discount error + track({ + eventId: eventIds.discountError, + type: TrackingEventType.EVENT, + properties: { + success: false, + errorCodes: error.codes.join(","), + }, + }); + } else { + const genericError = new Error(t.discounts.failedToApply); + setFormErrors([t.discounts.failedToApply]); + onError?.(genericError); + + // Track generic discount error + track({ + eventId: eventIds.discountError, + type: TrackingEventType.EVENT, + properties: { + success: false, + errorType: "generic", + }, + }); + } + } finally { + setIsSubmitting(false); + } + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter" && discountCode.trim()) { + e.preventDefault(); + handleApply(); + } + }; + + const handleRemoveDiscount = async (discountToRemove: string) => { + const newDiscountCodes = currentDiscountCodes.filter( + (d) => d !== discountToRemove, + ); + + try { + setIsRemovingDiscount(discountToRemove); + await applyDiscount.mutateAsync({ + discountCodes: newDiscountCodes, + }); + + // Track discount removal + track({ + eventId: eventIds.removeDiscount, + type: TrackingEventType.CLICK, + properties: { + success: true, + discountCount: newDiscountCodes.length, + }, + }); + + onDiscountsChange?.(newDiscountCodes); + setIsRemovingDiscount(undefined); + } catch (error) { + if (error instanceof GraphQLErrorWithCodes) { + setFormErrors(error.codes); + + // Track discount error + track({ + eventId: eventIds.discountError, + type: TrackingEventType.EVENT, + properties: { + success: false, + errorCodes: error.codes.join(","), + }, + }); + } else { + const genericError = new Error(t.discounts.failedToApply); + setFormErrors([t.discounts.failedToApply]); + onError?.(genericError); + + // Track generic discount error + track({ + eventId: eventIds.discountError, + type: TrackingEventType.EVENT, + properties: { + success: false, + errorType: "generic", + }, + }); + } + } + }; + + return ( +
+
+
+ +
+ +
+ + + {currentDiscountCodes.length > 0 && ( +
+ +
+ )} +
+ ); +} diff --git a/packages/react/src/components/checkout/discount/discount-tag.tsx b/packages/react/src/components/checkout/discount/discount-tag.tsx new file mode 100644 index 00000000..14c64439 --- /dev/null +++ b/packages/react/src/components/checkout/discount/discount-tag.tsx @@ -0,0 +1,40 @@ +import { Loader2, TagIcon, X } from "lucide-react"; + +import { Button } from "@/components/ui/button"; + +interface DiscountTagProps { + discount: string; + onRemove?: () => void; + isRemoving?: boolean; +} + +export function DiscountTag({ + discount, + onRemove, + isRemoving, +}: DiscountTagProps) { + return ( +
+
+ +
+ {discount} + {onRemove && ( + + )} +
+ ); +} diff --git a/packages/react/src/components/checkout/discount/discounts.tsx b/packages/react/src/components/checkout/discount/discounts.tsx new file mode 100644 index 00000000..5ed93458 --- /dev/null +++ b/packages/react/src/components/checkout/discount/discounts.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { DiscountTag } from "@/components/checkout/discount/discount-tag"; +import type { DiscountsProps } from "./types"; + +export function Discounts({ + discounts, + onRemove, + isRemovingDiscount, +}: DiscountsProps) { + // const { data: orderData } = useOrder({ orderId: "test" }); + + if (!discounts.length) return null; + + // remove duplicate discounts + const uniqueDiscountsSet = new Set(discounts?.map((d) => d)); + const uniqueDiscounts = Array.from(uniqueDiscountsSet); + + return ( +
+ {uniqueDiscounts?.map?.((discount) => ( + onRemove(discount)} + /> + ))} +
+ ); +} diff --git a/packages/react/src/components/checkout/discount/index.ts b/packages/react/src/components/checkout/discount/index.ts new file mode 100644 index 00000000..e435640f --- /dev/null +++ b/packages/react/src/components/checkout/discount/index.ts @@ -0,0 +1,6 @@ +export * from "./types"; +export * from "./utils/use-discount-apply"; +export * from "./discount-tag"; +export * from "./discounts"; +export * from "./discount-input"; +export * from "./discount-apply-button"; diff --git a/packages/react/src/components/checkout/discount/types.ts b/packages/react/src/components/checkout/discount/types.ts new file mode 100644 index 00000000..6bd1afe5 --- /dev/null +++ b/packages/react/src/components/checkout/discount/types.ts @@ -0,0 +1,11 @@ +export interface DiscountFormProps { + initialDiscounts?: string[]; + onDiscountsChange?: (discounts: string[]) => void; + onError?: (error: Error) => void; +} + +export interface DiscountsProps { + discounts: string[]; + onRemove: (id: string) => void; + isRemovingDiscount?: string; +} diff --git a/packages/react/src/components/checkout/discount/utils/use-discount-apply.ts b/packages/react/src/components/checkout/discount/utils/use-discount-apply.ts new file mode 100644 index 00000000..fb9934b4 --- /dev/null +++ b/packages/react/src/components/checkout/discount/utils/use-discount-apply.ts @@ -0,0 +1,58 @@ +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { DeliveryMethods } from "@/components/checkout/delivery/delivery-method"; +import { useUpdateTaxes } from "@/components/checkout/order/use-update-taxes"; +import { applyDiscount } from "@/lib/godaddy/godaddy"; +import type { ApplyCheckoutSessionDiscountInput } from "@/types"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { useFormContext } from "react-hook-form"; + +export function useDiscountApply() { + const { session } = useCheckoutContext(); + const form = useFormContext(); + const queryClient = useQueryClient(); + const updateTaxes = useUpdateTaxes(); + + return useMutation({ + mutationKey: ["apply-discount", { sessionId: session?.id }], + mutationFn: async ({ + discountCodes, + }: { + discountCodes: ApplyCheckoutSessionDiscountInput["input"]["discountCodes"]; + }) => { + if (!session) return; + return await applyDiscount(discountCodes, session); + }, + onSuccess: () => { + if (!session) return; + + if (session?.enableTaxCollection) { + // If the delivery method is pickup, we need to update taxes based on the pickup location + // Otherwise, we can just update taxes without a specific address + // TODO: Move this to API layer + const deliveryMethod = form.getValues("deliveryMethod"); + const isPickup = deliveryMethod === DeliveryMethods.PICKUP; + + if (isPickup) { + const pickupLocationId = form.getValues("pickupLocationId"); + const locationAddress = session?.locations?.find( + (loc) => loc.id === pickupLocationId, + )?.address; + + if (locationAddress) { + updateTaxes.mutate(locationAddress); + } + } else { + updateTaxes.mutate(undefined); + } + } else { + queryClient.invalidateQueries({ + queryKey: ["draft-order-totals", { id: session?.id }], + }); + } + + queryClient.invalidateQueries({ + queryKey: ["draft-order", { id: session?.id }], + }); + }, + }); +} diff --git a/packages/react/src/components/checkout/discount/utils/use-get-price-adjustments.ts b/packages/react/src/components/checkout/discount/utils/use-get-price-adjustments.ts new file mode 100644 index 00000000..951541e1 --- /dev/null +++ b/packages/react/src/components/checkout/discount/utils/use-get-price-adjustments.ts @@ -0,0 +1,34 @@ +import type { DraftOrderPriceAdjustmentsQueryInput } from "@/types"; + +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { getDraftOrderPriceAdjustments } from "@/lib/godaddy/godaddy"; +import { useMutation } from "@tanstack/react-query"; + +export function useGetPriceAdjustments() { + const { session } = useCheckoutContext(); + + return useMutation({ + mutationKey: [ + "get-price-adjustments-by-discount-code", + { sessionId: session?.id }, + ], + mutationFn: async ({ + discountCodes, + shippingLines, + }: { + discountCodes: DraftOrderPriceAdjustmentsQueryInput["discountCodes"]; + shippingLines?: DraftOrderPriceAdjustmentsQueryInput["shippingLines"]; + }) => { + if (!session) return; + + const data = await getDraftOrderPriceAdjustments( + session, + discountCodes, + shippingLines, + ); + + return data.checkoutSession?.draftOrder?.calculatedAdjustments + ?.totalDiscountAmount?.value; + }, + }); +} diff --git a/packages/react/src/components/checkout/express-checkout/apple-pay.tsx b/packages/react/src/components/checkout/express-checkout/apple-pay.tsx new file mode 100644 index 00000000..48562581 --- /dev/null +++ b/packages/react/src/components/checkout/express-checkout/apple-pay.tsx @@ -0,0 +1,24 @@ +// placeholder for apple pay + +import { useGoDaddyContext } from "@/godaddy-provider"; + +export function ApplePay() { + const { t } = useGoDaddyContext(); + return ( + + ); +} diff --git a/packages/react/src/components/checkout/express-checkout/express-checkout-buttons.tsx b/packages/react/src/components/checkout/express-checkout/express-checkout-buttons.tsx new file mode 100644 index 00000000..6251f9d6 --- /dev/null +++ b/packages/react/src/components/checkout/express-checkout/express-checkout-buttons.tsx @@ -0,0 +1,90 @@ +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { CheckoutSection } from "@/components/checkout/checkout-section"; +import { PaymentMethodRenderer } from "@/components/checkout/payment/payment-method-renderer"; +import { Target } from "@/components/checkout/target/target"; +import { eventIds } from "@/tracking/events"; +import { TrackingEventType, track } from "@/tracking/track"; +import type { AvailablePaymentProviders, PaymentMethodValue } from "@/types"; +import React from "react"; + +export function ExpressCheckoutButtons() { + const { session } = useCheckoutContext(); + + // Track express checkout impression when the component loads + React.useEffect(() => { + track({ + eventId: eventIds.expressCheckoutImpression, + type: TrackingEventType.IMPRESSION, + properties: { + availableMethods: Object.keys(session?.paymentMethods || {}) + .filter((provider) => { + const method = + session?.paymentMethods?.[provider as PaymentMethodValue]; + return ( + method && + Array.isArray(method.checkoutTypes) && + method.checkoutTypes.includes("express") + ); + }) + .join(","), + }, + }); + }, [session?.paymentMethods]); + + const expressProviders = React.useMemo(() => { + if (!session?.paymentMethods) return []; + + return Object.entries(session.paymentMethods) + .filter( + ([, method]) => + method && + Array.isArray(method.checkoutTypes) && + method.checkoutTypes.includes("express"), + ) + .map(([provider]) => provider); + }, [session?.paymentMethods]); + + const availableExpressButtons = expressProviders + .map((provider) => { + const processor = + session?.paymentMethods?.[provider as PaymentMethodValue]?.processor; + + return ( + + ); + }) + .filter(Boolean); + + if (availableExpressButtons.length === 0) { + return null; + } + + return ( + + +
+
{availableExpressButtons}
+
+ +
+ + + ); +} diff --git a/packages/react/src/components/checkout/express-checkout/express-checkout.tsx b/packages/react/src/components/checkout/express-checkout/express-checkout.tsx new file mode 100644 index 00000000..87941383 --- /dev/null +++ b/packages/react/src/components/checkout/express-checkout/express-checkout.tsx @@ -0,0 +1,150 @@ +"use client"; + +import { + type CheckoutElements, + type CheckoutProps, + checkoutContext, + useCheckoutContext, +} from "@/components/checkout/checkout"; +import { CheckoutSection } from "@/components/checkout/checkout-section"; +import { PaymentMethodRenderer } from "@/components/checkout/payment/payment-method-renderer"; +import { ConditionalExpressProviders } from "@/components/checkout/payment/utils/conditional-providers"; +import { Target } from "@/components/checkout/target/target"; +import type { GoDaddyVariables } from "@/godaddy-provider"; +import { type Theme, useTheme } from "@/hooks/use-theme"; +import { useVariables } from "@/hooks/use-variables"; +import { TrackingProvider } from "@/tracking/tracking-provider"; +import type { + AvailablePaymentProviders, + CheckoutSession, + PaymentMethodValue, +} from "@/types"; +import React, { type ReactNode } from "react"; + +interface ExpressCheckoutAppearance { + theme?: Theme; + elements?: CheckoutElements; + variables?: Omit; +} + +export interface ExpressCheckoutProps { + session: CheckoutSession | undefined; + appearance?: ExpressCheckoutAppearance; + stripeConfig?: CheckoutProps["stripeConfig"]; + godaddyPaymentsConfig?: CheckoutProps["godaddyPaymentsConfig"]; + squareConfig?: CheckoutProps["squareConfig"]; + paypalConfig?: CheckoutProps["paypalConfig"]; + direction?: "ltr" | "rtl"; + enableTracking?: boolean; + targets?: Partial ReactNode>>; +} + +function DraftOrderExpressCheckoutButtons() { + const { session } = useCheckoutContext(); + + const expressProviders = React.useMemo(() => { + if (!session?.paymentMethods) return []; + + return Object.entries(session.paymentMethods) + .filter( + ([, method]) => + method && + Array.isArray(method.checkoutTypes) && + method.checkoutTypes.includes("express"), + ) + .map(([provider]) => provider); + }, [session?.paymentMethods]); + + const availableExpressButtons = expressProviders + .map((provider) => { + const processor = + session?.paymentMethods?.[provider as PaymentMethodValue]?.processor; + + return ( + + ); + }) + .filter(Boolean); + + if (availableExpressButtons.length === 0) { + return null; + } + + return ( + + +
{availableExpressButtons}
+ +
+ ); +} + +export function DraftOrderExpressCheckout(props: ExpressCheckoutProps) { + const { + session, + enableTracking = false, + stripeConfig, + godaddyPaymentsConfig, + squareConfig, + paypalConfig, + } = props; + + useTheme(); + useVariables(props?.appearance?.variables); + + const [isConfirmingCheckout, setIsConfirmingCheckout] = React.useState(false); + const [checkoutErrors, setCheckoutErrors] = React.useState< + string[] | undefined + >(undefined); + + // Create a context value with only the session and payment configurations + const contextValue = { + elements: props?.appearance?.elements, + targets: props?.targets, + session, + stripeConfig, + godaddyPaymentsConfig, + squareConfig, + paypalConfig, + isConfirmingCheckout, + setIsConfirmingCheckout, + checkoutErrors, + setCheckoutErrors, + }; + + // Only render if there are express payment methods available + const hasExpressPaymentMethods = React.useMemo(() => { + if (!session?.paymentMethods) return false; + + return Object.values(session.paymentMethods).some( + (method) => + method && + Array.isArray(method.checkoutTypes) && + method.checkoutTypes.includes("express"), + ); + }, [session?.paymentMethods]); + + if (!hasExpressPaymentMethods) { + return null; + } + + return ( + + + + + + + + + + ); +} diff --git a/packages/react/src/components/checkout/form/checkout-error-list.tsx b/packages/react/src/components/checkout/form/checkout-error-list.tsx new file mode 100644 index 00000000..9a968c87 --- /dev/null +++ b/packages/react/src/components/checkout/form/checkout-error-list.tsx @@ -0,0 +1,51 @@ +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { useGoDaddyContext } from "@/godaddy-provider"; +import { eventIds } from "@/tracking/events"; +import { TrackingEventType, track } from "@/tracking/track"; +import { CircleAlert } from "lucide-react"; +import React from "react"; + +export function CheckoutErrorList() { + const { t } = useGoDaddyContext(); + const { checkoutErrors, isCheckoutDisabled } = useCheckoutContext(); + const ref = React.useRef(null); + + React.useEffect(() => { + if (checkoutErrors?.length && ref.current) { + ref.current.scrollIntoView({ behavior: "smooth", block: "center" }); + + // Track checkout errors + track({ + eventId: eventIds.formError, + type: TrackingEventType.EVENT, + properties: { + errorCodes: checkoutErrors.join(","), + errorCount: checkoutErrors.length, + }, + }); + } + }, [checkoutErrors]); + + if (!checkoutErrors?.length && !isCheckoutDisabled) return null; + + return ( +
+
+ +
    + {checkoutErrors?.map((code) => ( +
  • + {t.apiErrors?.[code as keyof typeof t.apiErrors] || code} +
  • + ))} + {isCheckoutDisabled && ( +
  • {t.general.checkoutDisabled}
  • + )} +
+
+
+ ); +} diff --git a/packages/react/src/components/checkout/form/checkout-form-container.tsx b/packages/react/src/components/checkout/form/checkout-form-container.tsx new file mode 100644 index 00000000..c8a317cb --- /dev/null +++ b/packages/react/src/components/checkout/form/checkout-form-container.tsx @@ -0,0 +1,86 @@ +import { + type CheckoutProps, + useCheckoutContext, +} from "@/components/checkout/checkout"; +import { CheckoutSkeleton } from "@/components/checkout/checkout-skeleton"; +import { CheckoutForm } from "@/components/checkout/form/checkout-form"; +import { + useDraftOrder, + useDraftOrderLineItems, +} from "@/components/checkout/order/use-draft-order"; +import { useDraftOrderProductsMap } from "@/components/checkout/order/use-draft-order-products"; +import { useUpdateTaxes } from "@/components/checkout/order/use-update-taxes"; +import { + mapOrderToFormValues, + mapSkusToItemsDisplay, +} from "@/components/checkout/utils/checkout-transformers"; +import { useEffect, useMemo, useRef } from "react"; +import type { z } from "zod"; + +interface CheckoutFormContainerProps extends Omit { + // biome-ignore lint/suspicious/noExplicitAny: TODO: Fix this + schema: z.ZodObject | z.ZodEffects; +} + +export function CheckoutFormContainer({ + schema, + ...props +}: CheckoutFormContainerProps) { + const { session, isConfirmingCheckout } = useCheckoutContext(); + + const draftOrderQuery = useDraftOrder(); + const draftOrderLineItemsQuery = useDraftOrderLineItems(); + const skusMap = useDraftOrderProductsMap(); + const updateTaxes = useUpdateTaxes(); + + const { data: order } = draftOrderQuery; + const { data: lineItems } = draftOrderLineItemsQuery; + + const items = useMemo( + () => mapSkusToItemsDisplay(lineItems, skusMap), + [lineItems, skusMap], + ); + + const formValues = useMemo( + () => ({ + ...mapOrderToFormValues(order, props.defaultValues), + }), + [order, props.defaultValues], + ); + + const hasCalledUpdateTaxes = useRef(false); + + useEffect(() => { + if ( + !hasCalledUpdateTaxes.current && + order && + (order.billing?.address || order.shipping?.address) && + session?.enableTaxCollection + ) { + updateTaxes.mutate(undefined); + hasCalledUpdateTaxes.current = true; + } + }, [order, updateTaxes, session]); + + if (!isConfirmingCheckout && !draftOrderQuery.isLoading && !order) { + const returnUrl = session?.returnUrl; + if (returnUrl) { + window.location.href = returnUrl; + return null; + } + } + + if (draftOrderQuery.isLoading) { + return ; + } + + return ( + + ); +} diff --git a/packages/react/src/components/checkout/form/checkout-form.tsx b/packages/react/src/components/checkout/form/checkout-form.tsx new file mode 100644 index 00000000..008ba235 --- /dev/null +++ b/packages/react/src/components/checkout/form/checkout-form.tsx @@ -0,0 +1,491 @@ +import { AddressForm } from "@/components/checkout/address"; +import { + type CheckoutFormData, + type CheckoutProps, + LayoutSections, + useCheckoutContext, +} from "@/components/checkout/checkout"; +import { CheckoutSection } from "@/components/checkout/checkout-section"; +import { CheckoutSectionHeader } from "@/components/checkout/checkout-section-header"; +import { ContactForm } from "@/components/checkout/contact/contact-form"; +import { + DeliveryMethodForm, + DeliveryMethods, +} from "@/components/checkout/delivery/delivery-method"; +import { ExpressCheckoutButtons } from "@/components/checkout/express-checkout/express-checkout-buttons"; +import { CheckoutErrorList } from "@/components/checkout/form/checkout-error-list"; +import { + DraftOrderLineItems, + type Product, +} from "@/components/checkout/line-items/line-items"; +import { NotesForm } from "@/components/checkout/notes/notes-form"; +import { useDraftOrderTotals } from "@/components/checkout/order/use-draft-order-totals"; +import { PaymentForm } from "@/components/checkout/payment/payment-form"; +import { + ConditionalExpressProviders, + ConditionalPaymentProviders, +} from "@/components/checkout/payment/utils/conditional-providers"; +import { LocalPickupForm } from "@/components/checkout/pickup/local-pickup"; +import { ShippingMethodForm } from "@/components/checkout/shipping/shipping-method"; +import { Target } from "@/components/checkout/target/target"; +import { TipsForm } from "@/components/checkout/tips/tips-form"; +import { DraftOrderTotals } from "@/components/checkout/totals/totals"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { useGoDaddyContext } from "@/godaddy-provider"; +import { eventIds } from "@/tracking/events"; +import { TrackingEventType, track } from "@/tracking/track"; +import { CheckoutType, PaymentMethodType } from "@/types"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useIsMutating } from "@tanstack/react-query"; +import React, { useEffect, useRef } from "react"; +import { useForm } from "react-hook-form"; +import type { z } from "zod"; +import { FreePaymentForm } from "../payment/free-payment-form"; +import { CustomFormProvider } from "./custom-form-provider"; + +const deliveryMethodToGridArea: Record = { + SHIP: "shipping", + PICKUP: "pickup", + DELIVERY: "delivery", + DIGITAL: "digital", +}; + +interface CheckoutFormProps extends Omit { + // biome-ignore lint/suspicious/noExplicitAny: TODO: Fix this + schema: z.ZodObject | z.ZodEffects; + defaultValues?: Pick; + items: Product[]; +} + +export function CheckoutForm({ + schema, + defaultValues, + items, + ...props +}: CheckoutFormProps) { + const { t } = useGoDaddyContext(); + const { session, isCheckoutDisabled } = useCheckoutContext(); + + const form = useForm({ + resolver: zodResolver(schema), + defaultValues: defaultValues ?? {}, + reValidateMode: "onBlur", + mode: "onBlur", + }); + + const deliveryMethod = form.watch("deliveryMethod"); + const tipAmount = form.watch("tipAmount"); + const isPickup = deliveryMethod === DeliveryMethods.PICKUP; + const isShipping = deliveryMethod === DeliveryMethods.SHIP; + const isUpdatingShipping = + useIsMutating({ + mutationKey: ["apply-shipping-method", { sessionId: session?.id }], + }) > 0; + + const isUpdatingTaxes = + useIsMutating({ + mutationKey: ["update-draft-order-taxes", { id: session?.id }], + }) > 0; + + // // Get active discount codes + // const discountCodes = + // (order?.discounts?.map((d) => d.code).filter(Boolean) as string[]) || []; + + const draftOrderTotalsQuery = useDraftOrderTotals(); + + const { data: totals, isLoading: totalsLoading } = draftOrderTotalsQuery; + + // Order summary calculations + const subtotal = (totals?.subTotal?.value || 0) / 100; + const orderDiscount = (totals?.discountTotal?.value || 0) / 100; + const shipping = (totals?.shippingTotal?.value || 0) / 100; + const taxTotal = (totals?.taxTotal?.value || 0) / 100; + const orderTotal = (totals?.total?.value || 0) / 100; + const tipTotal = (tipAmount || 0) / 100; + const currencyCode = totals?.total?.currencyCode || "USD"; + const itemCount = items.reduce((sum, item) => sum + (item?.quantity || 0), 0); + + const isFree = orderTotal <= 0; + const showExpressButtons = (totals?.subTotal?.value || 0) > 0; + + useEffect(() => { + if (!totalsLoading && isFree) { + form.setValue("paymentMethod", PaymentMethodType.OFFLINE); + } + }, [form, totalsLoading, isFree]); + + // Track checkout start impression when the component first renders + const hasTrackedCheckoutStart = useRef(false); + useEffect(() => { + if (!hasTrackedCheckoutStart.current && !totalsLoading) { + track({ + eventId: eventIds.checkoutStart, + type: TrackingEventType.IMPRESSION, + properties: { + subtotal: Math.round(subtotal * 100), + total: Math.round(orderTotal * 100), + itemCount, + currencyCode, + }, + }); + hasTrackedCheckoutStart.current = true; + } + }, [subtotal, orderTotal, itemCount, currencyCode, totalsLoading]); + + const lineItemDiscounts = items.reduce((sum, item) => { + if (item?.discounts && Array.isArray(item.discounts)) { + return ( + sum + + item.discounts.reduce( + (dSum, discount) => dSum + (discount.amount?.value || 0), + 0, + ) + ); + } + return sum; + }, 0); + + const totalSavings = Math.abs(orderDiscount + lineItemDiscounts); + + const [gridTemplateAreas, sectionLength] = React.useMemo(() => { + const { enableTips, paymentMethods } = session || {}; + if (!props?.layout) { + const enableExpressCheckout = Object.values(paymentMethods ?? {}).some( + (method) => + method && + Array.isArray(method.checkoutTypes) && + method.checkoutTypes.includes(CheckoutType.EXPRESS), + ); + const defaultTemplate = ` ${enableExpressCheckout ? "'express-checkout'" : ""} 'contact' 'delivery' '${deliveryMethodToGridArea[deliveryMethod]}' ${enableTips ? "'tips'" : ""} 'payment'`; + // Return consistent tuple type: [string, number] + let totalSections = 3; + enableTips && totalSections++; + enableExpressCheckout && totalSections++; + return [defaultTemplate, totalSections]; + } + + // Filter out sections that shouldn't be shown based on delivery method + const filteredLayout = props.layout.filter((section) => { + if (section !== "shipping" && section !== "pickup") { + return true; + } + + // Only include shipping section if deliveryMethod is SHIP + if (section === "shipping" && deliveryMethod === DeliveryMethods.SHIP) { + return true; + } + + // Only include pickup section if deliveryMethod is PICKUP + return section === "pickup" && deliveryMethod === DeliveryMethods.PICKUP; + }); + + // Get all available section values + const sectionValues = Object.values(LayoutSections); + + const missingLayoutSections = sectionValues.filter((section) => { + if (section === "shipping" && deliveryMethod !== DeliveryMethods.SHIP) { + return false; + } + if (section === "pickup" && deliveryMethod !== DeliveryMethods.PICKUP) { + return false; + } + + if (!enableTips && section === "tips") { + return false; + } + return !filteredLayout.includes(section); + }); + + // Add missing sections to the end of the layout + const completeLayout = [...filteredLayout, ...missingLayoutSections]; + + return [`'${completeLayout.join("' '")}'`, completeLayout.length]; + }, [props?.layout, deliveryMethod, session]); + + React.useEffect(() => { + if (deliveryMethod) { + form.reset(form.getValues(), { + keepDirty: false, + }); + } + /* reset pickup fields if switching to shipping */ + if (isShipping) { + form.setValue("pickupLocationId", null); + form.setValue("pickupDate", ""); + form.setValue("pickupTime", ""); + } + }, [deliveryMethod, isShipping, form]); + + const onSubmit = async (data: CheckoutFormData) => { + console.log(data); + + // Track checkout form submission + track({ + eventId: eventIds.submitCheckoutForm, + type: TrackingEventType.CLICK, + properties: { + success: true, + deliveryMethod: data.deliveryMethod, + hasShippingAddress: !!data.shippingAddressLine1, + hasBillingAddress: !!data.billingAddressLine1, + total: Math.round(orderTotal * 100), + }, + }); + }; + + const onInvalid = (errors: typeof form.formState.errors) => { + // console.log({ formValues: form.getValues() }); + // console.log("Invalid fields:", errors); + + // Track form validation errors + track({ + eventId: eventIds.formValidationError, + type: TrackingEventType.EVENT, + properties: { + errorFields: Object.keys(errors).join(","), + errorCount: Object.keys(errors).length, + }, + }); + }; + + return ( + +
+ +
+ {/* Left column - Forms */} +
+
+ + +
+
+ {!isCheckoutDisabled && showExpressButtons ? ( + + + + ) : null} + + + + + + + + + + + + + + {session?.enableTips && ( + + + + + + + )} + {isPickup && session?.enableLocalPickup && ( + + + + + + + + )} + {isShipping && ( + + + +
+ {session?.enableShippingAddressCollection ? ( + + ) : null} + {session?.shipping?.originAddress ? ( + + ) : ( +
+

+ {t?.shipping?.noShippingOriginAddress} +

+
+ )} + {session?.enableNotesCollection ? : null} +
+ +
+ )} + + + +
+ {!isCheckoutDisabled ? ( + !isFree ? ( + + + + ) : ( + + ) + ) : null} +
+ +
+
+
+ +
+
+ + {/* Right column - Order summary */} +
+
+ +
+ + + +
+ + {t.totals.orderSummary} + + + {new Intl.NumberFormat("en-us", { + style: "currency", + currency: currencyCode, + }).format(orderTotal)} + +
+
+ +
+ + + +
+
+
+
+
+ +
+ + + +
+ +
+
+
+ +
+
+ ); +} diff --git a/packages/react/src/components/checkout/form/custom-form-provider.tsx b/packages/react/src/components/checkout/form/custom-form-provider.tsx new file mode 100644 index 00000000..950ad077 --- /dev/null +++ b/packages/react/src/components/checkout/form/custom-form-provider.tsx @@ -0,0 +1,146 @@ +import React, { useMemo, useState, useEffect } from "react"; +import { FormProvider } from "react-hook-form"; +import type { FieldPath, UseFormReturn, UseFormTrigger } from "react-hook-form"; +import { type CheckoutFormData, useCheckoutContext } from "../checkout"; +import { DeliveryMethods } from "../delivery/delivery-method"; + +/** + * Custom FormProvider that extends React Hook Form's FormProvider + * to add smart validation that respects unregistered fields + */ +export function CustomFormProvider< + TFormValues extends Record = CheckoutFormData, +>({ + children, + ...methods +}: { children: React.ReactNode } & UseFormReturn) { + // Original methods reference to use in the enhancedTrigger + const methodsRef = React.useRef(methods); + const { session } = useCheckoutContext(); + // Use state to force re-render + const [, setForceUpdate] = useState({}); + + // Update the ref on every render + useEffect(() => { + methodsRef.current = methods; + }); + + // Subscribe to formState changes + useEffect(() => { + // Access specific properties to create a subscription + const { errors, isValidating } = methods.formState; + + // Intentionally logging subscription values to prevent tree-shaking + if (session?.environment === "dev") { + console.debug("Form state subscription active", { + isValidating, + hasErrors: !!Object.keys(errors || {}).length, + }); + } + }, [methods.formState, session]); + + // biome-ignore lint/correctness/useExhaustiveDependencies: using methodsRef instead of methods directly + const enhancedMethods = useMemo(() => { + // Override the trigger function with a type-safe version that ensures error messages are displayed + const enhancedTrigger: UseFormTrigger = async ( + name?: + | FieldPath + | ReadonlyArray> + | Array>, + options?: { shouldFocus?: boolean }, + ) => { + try { + const currentMethods = methodsRef.current; + + // Always enable shouldFocus by default unless explicitly disabled + const triggerOptions = { shouldFocus: true, ...options }; + + let result: boolean; + + // If specific fields are provided, use the original trigger + if (name) { + if (session?.environment === "dev") { + console.log("Triggering validation for specific fields:", name); + } + // Use original methods directly to ensure formState is properly updated + result = await methods.trigger(name, triggerOptions); + } + // Get the current delivery method using type assertion for safety + else { + const values = currentMethods.getValues(); + const deliveryMethod = values.deliveryMethod as unknown as string; + const paymentUseShippingAddress = + values.paymentUseShippingAddress as unknown as boolean; + const isPickup = deliveryMethod === DeliveryMethods.PICKUP; + const isShipping = deliveryMethod === DeliveryMethods.SHIP; + const requireBillingAddress = !paymentUseShippingAddress || isPickup; + + // Get all field names and filter based on conditions + const allFieldNames = Object.keys(values); + let fieldNames = [...allFieldNames] as Array>; + + /* If using shipping address for billing (and not pickup), filter out billing-related field validations */ + if (!requireBillingAddress) { + fieldNames = fieldNames.filter( + (fieldName) => !fieldName.startsWith("billing"), + ); + } + + /* If the delivery method is not shipping (i.e. pickup), filter out shipping-related field validations */ + if (!isShipping) { + fieldNames = fieldNames.filter( + (fieldName) => !fieldName.startsWith("shipping"), + ); + } + + // Log if in dev mode + if (session?.environment === "dev") { + if (paymentUseShippingAddress || isPickup) { + console.log( + "Triggering validation for filtered fields:", + fieldNames, + ); + } else { + console.log("Triggering validation for all fields"); + } + } + + // Trigger validation only on the filtered fields if any condition is true, + // otherwise trigger on all fields + if (paymentUseShippingAddress || isPickup) { + result = await methods.trigger(fieldNames, triggerOptions); + } else { + result = await methods.trigger(undefined, triggerOptions); + } + } + + // Force update to ensure error messages show immediately + setTimeout(() => { + setForceUpdate({}); + }, 0); + + return result; + } catch (error) { + if (session?.environment === "dev") { + console.error("Error in enhanced trigger:", error); + } + return false; + } + }; + + // Return the enhanced methods object with properly typed trigger and original state + const result = { + ...methods, + trigger: enhancedTrigger, + } as UseFormReturn; + + // Make sure we're not losing formState reactivity + Object.defineProperty(result, "formState", { + get: () => methodsRef.current.formState, + }); + + return result; + }, []); + + return {children}; +} diff --git a/packages/react/src/components/checkout/form/utils/get-required-fields-from-schema.ts b/packages/react/src/components/checkout/form/utils/get-required-fields-from-schema.ts new file mode 100644 index 00000000..b4f34d96 --- /dev/null +++ b/packages/react/src/components/checkout/form/utils/get-required-fields-from-schema.ts @@ -0,0 +1,49 @@ +import { + ZodDefault, + ZodEffects, + ZodObject, + ZodOptional, + type ZodTypeAny, + type z, +} from "zod"; + +/** + * Recursively unwrap ZodEffects / ZodDefault to the core schema + */ +function unwrap(schema: ZodTypeAny): ZodTypeAny { + if (schema instanceof ZodEffects) { + return unwrap(schema._def.schema); + } + if (schema instanceof ZodDefault) { + return unwrap(schema._def.innerType); + } + return schema; +} + +/** + * Extract required/optional flags from a Zod schema + */ +export function getRequiredFieldsFromSchema< + // biome-ignore lint/suspicious/noExplicitAny: We really don't know the shape of the schema here + T extends ZodObject | ZodEffects, +>(schema: T) { + const unwrapped = unwrap(schema); + + if (!(unwrapped instanceof ZodObject)) { + throw new Error("getRequiredFields only works on ZodObject schemas"); + } + + const shape = unwrapped.shape; + const requiredMap: Record = {}; + + for (const key in shape) { + let field: ZodTypeAny = shape[key]; + field = unwrap(field); // in case inner fields are wrapped too + + requiredMap[key] = !(field instanceof ZodOptional); + } + + return requiredMap as { + [K in keyof z.infer]: boolean; + }; +} diff --git a/packages/react/src/components/checkout/line-items/index.ts b/packages/react/src/components/checkout/line-items/index.ts new file mode 100644 index 00000000..9e0fec54 --- /dev/null +++ b/packages/react/src/components/checkout/line-items/index.ts @@ -0,0 +1 @@ +export * from "./line-items"; diff --git a/packages/react/src/components/checkout/line-items/line-item-skeleton.tsx b/packages/react/src/components/checkout/line-items/line-item-skeleton.tsx new file mode 100644 index 00000000..75f63721 --- /dev/null +++ b/packages/react/src/components/checkout/line-items/line-item-skeleton.tsx @@ -0,0 +1,33 @@ +import { Skeleton } from "@/components/ui/skeleton"; + +export function LineItemSkeleton() { + return ( +
+ {Array.from({ length: 3 }).map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: For Skeleton +
+
+ +
+
+
+
+ + + + + + +
+
+
+ +
+
+
+
+
+ ))} +
+ ); +} diff --git a/packages/react/src/components/checkout/line-items/line-items.tsx b/packages/react/src/components/checkout/line-items/line-items.tsx new file mode 100644 index 00000000..fdd2195e --- /dev/null +++ b/packages/react/src/components/checkout/line-items/line-items.tsx @@ -0,0 +1,174 @@ +// import { Badge } from "@/components/ui/badge"; +import { useGoDaddyContext } from "@/godaddy-provider"; +import type { SKUProduct } from "@/types"; +import { Image } from "lucide-react"; + +export interface Note { + content: string | null; + id: string | null; +} + +export interface CostAdjustment { + currencyCode?: string; + value?: number; +} + +export interface AddonValue { + amountIncreased?: number; + costAdjustment?: CostAdjustment; + name?: string; +} + +export interface SelectedAddon { + attribute?: string; + sku?: string; + values?: AddonValue[]; +} + +export interface SelectedOption { + attribute?: string; + values?: string[]; +} + +export type ProductDiscount = { + amount: { + currencyCode: string; + value: number; + }; + code: string; + name: string; + ratePercentage: number | null; +}; + +export type Product = Partial & { + image: string; + quantity: number; + originalPrice: number; + price: number; + notes?: Note[] | null; + addons?: SelectedAddon[]; + selectedOptions?: SelectedOption[]; + discounts?: ProductDiscount[]; +}; + +export interface DraftOrderLineItemsProps { + items: Product[]; + currencyCode?: string; +} + +export function DraftOrderLineItems({ + items, + currencyCode = "USD", +}: DraftOrderLineItemsProps) { + const { t } = useGoDaddyContext(); + + return ( +
+ {items.map((item) => ( +
+ {item.image ? ( +
+ {item.name} +
+ ) : ( +
+ +
+ )} +
+
+
+ + {item.name} + {item?.selectedOptions?.length ? ( + + ( + {item.selectedOptions + .flatMap((option) => option.values || []) + .join(" / ")} + ) + + ) : null} + + + {item?.addons?.map((addon: SelectedAddon, index: number) => ( + + {addon.attribute}: + {addon.values?.map((value) => ( + + {value.name} + {/*{value?.costAdjustment?.value*/} + {/* ? `(+$${(value?.costAdjustment?.value / 100).toFixed(2)})`*/} + {/* : null}*/} + + ))} + + ))} + {item.notes?.length ? ( + <> + {t.lineItems.note} + {item.notes?.map((note) => ( + {note.content} + ))} + + ) : null} + + + {t.general.quantity}: {item.quantity} + + {/*{item?.discounts?.length ? (*/} + {/*
*/} + {/* */} + {/* {item?.discounts?.[0].code} (-$*/} + {/* {(item?.discounts?.[0].amount?.value || 0) / 100})*/} + {/* */} + {/*
*/} + {/*) : null}*/} +
+ {item.originalPrice && item.quantity ? ( +
+
+ + {new Intl.NumberFormat("en-us", { + style: "currency", + currency: currencyCode, + }).format(item.originalPrice * item.quantity)} + + {/*{item.originalPrice * item.quantity > item.price && (*/} + {/*
*/} + {/* {new Intl.NumberFormat("en-us", {*/} + {/* style: "currency",*/} + {/* currency: currencyCode,*/} + {/* }).format(item.originalPrice * item.quantity)}*/} + {/*
*/} + {/*)}*/} + {/**/} + {/* {new Intl.NumberFormat("en-us", {*/} + {/* style: "currency",*/} + {/* currency: currencyCode,*/} + {/* }).format(item.price)}*/} + {/**/} +
+
+ ) : null} +
+
+
+ ))} +
+ ); +} diff --git a/packages/react/src/components/checkout/notes/notes-form.tsx b/packages/react/src/components/checkout/notes/notes-form.tsx new file mode 100644 index 00000000..ce591c96 --- /dev/null +++ b/packages/react/src/components/checkout/notes/notes-form.tsx @@ -0,0 +1,95 @@ +"use client"; + +import { useCheckoutContext } from "@/components/checkout/checkout"; +import { useDraftOrder } from "@/components/checkout/order/use-draft-order"; +import { useDraftOrderFieldSync } from "@/components/checkout/order/use-draft-order-sync"; +import { + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Textarea } from "@/components/ui/textarea"; +import { useGoDaddyContext } from "@/godaddy-provider"; +import { eventIds } from "@/tracking/events"; +import { TrackingEventType, track } from "@/tracking/track"; +import { useDebouncedValue } from "@tanstack/react-pacer"; +import React from "react"; +import { useFormContext } from "react-hook-form"; + +export function NotesForm() { + const form = useFormContext(); + const { t } = useGoDaddyContext(); + const { isConfirmingCheckout, requiredFields } = useCheckoutContext(); + const { data: draftOrder } = useDraftOrder(); + + const notesField = form.watch("notes"); + + const [notes] = useDebouncedValue(notesField, { + wait: 1000, + }); + + // Track when notes are added (debounced) + React.useEffect(() => { + if (notes && notes.trim() !== "") { + track({ + eventId: eventIds.addOrderNote, + type: TrackingEventType.CLICK, + properties: { + hasNotes: true, + noteLength: notes.length, + }, + }); + } + }, [notes]); + + // Check if notes value differs from order value + const notesHasChanged = React.useMemo(() => { + if (!draftOrder) return true; // If no order, allow sync + const orderNotes = + draftOrder.notes?.find((note) => note.authorType === "CUSTOMER") + ?.content || ""; + return orderNotes !== (notes || ""); + }, [draftOrder, notes]); + + useDraftOrderFieldSync({ + key: "notes", + data: notes, + deps: [notes, notesHasChanged], + enabled: notesHasChanged && (notes?.trim() || "") !== "", + fieldNames: ["notes"], + preserveFormData: false, + mapToInput: (notes) => ({ + notes: notes?.trim() + ? [ + { + authorType: "CUSTOMER", + content: notes.trim(), + }, + ] + : null, + }), + }); + + return ( +
+ ( + + {t.general.notes} +