@fluid-app/portal-sdk 0.1.383 → 0.1.384

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/{OrdersScreen-BoluH8wK.cjs → OrdersScreen-BG6zoehy.cjs} +2 -2
  2. package/dist/{OrdersScreen-BR7-m0Ym.cjs → OrdersScreen-BMnnZh8v.cjs} +2 -2
  3. package/dist/{OrdersScreen-BR7-m0Ym.cjs.map → OrdersScreen-BMnnZh8v.cjs.map} +1 -1
  4. package/dist/{OrdersScreen-CrdNO3th.mjs → OrdersScreen-D30UcCb9.mjs} +2 -2
  5. package/dist/{OrdersScreen-DlaN-Yrw.mjs → OrdersScreen-jCE23-nN.mjs} +2 -2
  6. package/dist/{OrdersScreen-DlaN-Yrw.mjs.map → OrdersScreen-jCE23-nN.mjs.map} +1 -1
  7. package/dist/{ProfileScreen-D7BmHBW5.mjs → ProfileScreen-Bu55j8bD.mjs} +3 -3
  8. package/dist/{ProfileScreen-v7ysdaAK.cjs → ProfileScreen-CAmRD0vt.cjs} +3 -3
  9. package/dist/{ProfileScreen-v7ysdaAK.cjs.map → ProfileScreen-CAmRD0vt.cjs.map} +1 -1
  10. package/dist/{ProfileScreen-BxwpqfXf.mjs → ProfileScreen-D5-4xHyf.mjs} +3 -3
  11. package/dist/{ProfileScreen-BxwpqfXf.mjs.map → ProfileScreen-D5-4xHyf.mjs.map} +1 -1
  12. package/dist/{ProfileScreen-CefRZdeE.cjs → ProfileScreen-Zl1bPxXG.cjs} +3 -3
  13. package/dist/{ShopScreen-DTuot9zV.cjs → ShopScreen-BGsmn1iD.cjs} +1 -1
  14. package/dist/{ShopScreen-DES8W4tq.cjs → ShopScreen-BcmLO7P5.cjs} +8 -3
  15. package/dist/{ShopScreen-DES8W4tq.cjs.map → ShopScreen-BcmLO7P5.cjs.map} +1 -1
  16. package/dist/{ShopScreen-B8LI7rEq.mjs → ShopScreen-ChngOndQ.mjs} +1 -1
  17. package/dist/{ShopScreen-DCAzbIo5.mjs → ShopScreen-bF8kdNws.mjs} +8 -3
  18. package/dist/{ShopScreen-DCAzbIo5.mjs.map → ShopScreen-bF8kdNws.mjs.map} +1 -1
  19. package/dist/{SubscriptionsScreen-CWBMeU5v.cjs → SubscriptionsScreen-BZBppAEb.cjs} +3 -3
  20. package/dist/{SubscriptionsScreen-bKgaLi3-.cjs → SubscriptionsScreen-Chg41CCa.cjs} +3 -3
  21. package/dist/{SubscriptionsScreen-bKgaLi3-.cjs.map → SubscriptionsScreen-Chg41CCa.cjs.map} +1 -1
  22. package/dist/{SubscriptionsScreen-07UYSCSY.mjs → SubscriptionsScreen-RClWcQ88.mjs} +3 -3
  23. package/dist/{SubscriptionsScreen-07UYSCSY.mjs.map → SubscriptionsScreen-RClWcQ88.mjs.map} +1 -1
  24. package/dist/{SubscriptionsScreen-OO7vI8em.mjs → SubscriptionsScreen-eF122WP7.mjs} +3 -3
  25. package/dist/{display-JuYIguJK.cjs → display-DKzN3DZd.cjs} +9 -3
  26. package/dist/display-DKzN3DZd.cjs.map +1 -0
  27. package/dist/{display-B3BfkaBm.mjs → display-vZrlWWCP.mjs} +9 -3
  28. package/dist/display-vZrlWWCP.mjs.map +1 -0
  29. package/dist/index.cjs +14 -14
  30. package/dist/index.d.cts.map +1 -1
  31. package/dist/index.d.mts.map +1 -1
  32. package/dist/index.mjs +14 -14
  33. package/dist/{use-portal-card-add-3ds-flow-Am5y9gt3.mjs → use-portal-card-add-3ds-flow-CHdZounD.mjs} +2 -2
  34. package/dist/{use-portal-card-add-3ds-flow-Am5y9gt3.mjs.map → use-portal-card-add-3ds-flow-CHdZounD.mjs.map} +1 -1
  35. package/dist/{use-portal-card-add-3ds-flow-Yr0Qttv5.cjs → use-portal-card-add-3ds-flow-u-PUJ_-8.cjs} +2 -2
  36. package/dist/{use-portal-card-add-3ds-flow-Yr0Qttv5.cjs.map → use-portal-card-add-3ds-flow-u-PUJ_-8.cjs.map} +1 -1
  37. package/package.json +18 -18
  38. package/dist/display-B3BfkaBm.mjs.map +0 -1
  39. package/dist/display-JuYIguJK.cjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluid-app/portal-sdk",
3
- "version": "0.1.383",
3
+ "version": "0.1.384",
4
4
  "description": "SDK for building custom Fluid portals",
5
5
  "files": [
6
6
  "dist",
@@ -77,53 +77,53 @@
77
77
  "tsdown": "^0.21.0",
78
78
  "typescript": "^5",
79
79
  "zod": "4.3.5",
80
- "@fluid-app/address-autocomplete": "0.1.0",
81
80
  "@fluid-app/address-fields": "0.1.0",
82
- "@fluid-app/auth": "0.1.0",
81
+ "@fluid-app/address-autocomplete": "0.1.0",
83
82
  "@fluid-app/api-client-core": "0.1.0",
84
- "@fluid-app/cart-ui": "0.1.23",
83
+ "@fluid-app/auth": "0.1.0",
84
+ "@fluid-app/cart-ui": "0.1.24",
85
85
  "@fluid-app/company-switcher-ui": "0.1.0",
86
+ "@fluid-app/contacts-core": "0.1.0",
86
87
  "@fluid-app/contacts-ui": "0.1.0",
87
88
  "@fluid-app/file-picker-core": "0.1.0",
88
- "@fluid-app/file-picker-api-client": "0.1.0",
89
- "@fluid-app/contacts-core": "0.1.0",
90
89
  "@fluid-app/fluid-pay-core": "0.1.0",
91
- "@fluid-app/fluid-pay-ui": "0.1.0",
90
+ "@fluid-app/file-picker-api-client": "0.1.0",
92
91
  "@fluid-app/i18n": "0.1.0",
93
92
  "@fluid-app/messaging-api-client": "0.1.0",
94
93
  "@fluid-app/messaging-core": "0.1.0",
95
- "@fluid-app/messaging-ui": "0.1.0",
96
- "@fluid-app/mysite-core": "0.1.0",
97
94
  "@fluid-app/mysite-ui": "0.1.0",
95
+ "@fluid-app/fluid-pay-ui": "0.1.0",
98
96
  "@fluid-app/orders-core": "0.1.0",
99
97
  "@fluid-app/orders-ui": "0.1.0",
98
+ "@fluid-app/mysite-core": "0.1.0",
100
99
  "@fluid-app/payments-display": "0.1.0",
101
100
  "@fluid-app/portal-app-download-ui": "0.1.0",
102
- "@fluid-app/portal-core": "0.1.23",
103
- "@fluid-app/portal-preview": "0.1.0",
101
+ "@fluid-app/messaging-ui": "0.1.0",
104
102
  "@fluid-app/portal-pro-upgrade-ui": "0.1.0",
105
- "@fluid-app/portal-react": "0.1.0",
106
103
  "@fluid-app/portal-tenant-api-client": "0.1.0",
104
+ "@fluid-app/portal-preview": "0.1.0",
105
+ "@fluid-app/portal-core": "0.1.23",
106
+ "@fluid-app/portal-react": "0.1.0",
107
107
  "@fluid-app/portal-tenant-contacts-api-client": "0.1.0",
108
108
  "@fluid-app/portal-tenant-content-api-client": "0.1.0",
109
109
  "@fluid-app/portal-tenant-mysite-api-client": "0.1.0",
110
- "@fluid-app/portal-tenant-pay-api-client": "0.1.0",
111
110
  "@fluid-app/portal-tenant-store-api-client": "0.1.0",
112
111
  "@fluid-app/portal-widgets": "0.1.22",
113
112
  "@fluid-app/products-api-client": "0.1.0",
114
- "@fluid-app/products-core": "0.1.0",
113
+ "@fluid-app/portal-tenant-pay-api-client": "0.1.0",
115
114
  "@fluid-app/profile-core": "0.1.0",
116
- "@fluid-app/profile-ui": "0.1.0",
117
115
  "@fluid-app/query-persister": "0.1.0",
118
116
  "@fluid-app/shareables-core": "0.1.0",
119
- "@fluid-app/shareables-ui": "0.1.0",
117
+ "@fluid-app/products-core": "0.1.0",
118
+ "@fluid-app/profile-ui": "0.1.0",
120
119
  "@fluid-app/shop-core": "0.1.0",
121
- "@fluid-app/shop-ui": "0.1.0",
120
+ "@fluid-app/shareables-ui": "0.1.0",
122
121
  "@fluid-app/store-core": "0.1.0",
122
+ "@fluid-app/typescript-config": "0.0.0",
123
123
  "@fluid-app/subscriptions-core": "0.1.0",
124
124
  "@fluid-app/subscriptions-ui": "0.1.0",
125
+ "@fluid-app/shop-ui": "0.1.0",
125
126
  "@fluid-app/ui-primitives": "0.1.13",
126
- "@fluid-app/typescript-config": "0.0.0",
127
127
  "@fluid-app/widget-runtime": "0.1.0"
128
128
  },
129
129
  "peerDependencies": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"display-B3BfkaBm.mjs","names":[],"sources":["../../../payments/display/src/brands.ts","../../../payments/display/src/display.ts"],"sourcesContent":["import type {\n ApmBrand,\n CardBrand,\n PaymentBrand,\n SupportedWalletBadgeBrand,\n WalletBrand,\n} from \"./ports\";\n\nexport const PAYMENT_ICON_BASE_URL =\n \"https://assets.fluid.app/images/payment_icons\";\nexport const GENERIC_PAYMENT_ICON_URL = `${PAYMENT_ICON_BASE_URL}/generic.svg`;\n\nconst CARD_BRANDS = new Set<PaymentBrand>([\n \"visa\",\n \"mastercard\",\n \"amex\",\n \"discover\",\n \"jcb\",\n]);\n\nconst WALLET_BRANDS = new Set<PaymentBrand>([\n \"apple_pay\",\n \"google_pay\",\n \"samsung_pay\",\n]);\n\nconst SUPPORTED_WALLET_BADGE_BRANDS = new Set<PaymentBrand>([\n \"apple_pay\",\n \"google_pay\",\n]);\n\nconst CARD_BRAND_NAME: Record<CardBrand, string> = {\n visa: \"Visa\",\n mastercard: \"Mastercard\",\n amex: \"American Express\",\n discover: \"Discover\",\n jcb: \"JCB\",\n};\n\nconst WALLET_BRAND_NAME: Record<WalletBrand, string> = {\n apple_pay: \"Apple Pay\",\n google_pay: \"Google Pay\",\n samsung_pay: \"Samsung Pay\",\n};\n\nconst APM_BRAND_NAME: Record<ApmBrand, string> = {\n paypal: \"PayPal\",\n venmo: \"Venmo\",\n klarna: \"Klarna\",\n affirm: \"Affirm\",\n afterpay: \"Afterpay\",\n bread: \"Bread\",\n skrill: \"Skrill\",\n ideal: \"iDEAL\",\n bancontact: \"Bancontact\",\n eps: \"EPS\",\n blik: \"BLIK\",\n trustly: \"Trustly\",\n oxxo: \"OXXO\",\n pix: \"Pix\",\n yape: \"Yape\",\n satispay: \"Satispay\",\n alipay: \"Alipay\",\n unionpay: \"UnionPay\",\n gcash: \"GCash\",\n grabpay: \"GrabPay\",\n maya: \"Maya\",\n upi: \"UPI\",\n};\n\nconst BRAND_ALIASES: Record<string, PaymentBrand> = {\n visa: \"visa\",\n mastercard: \"mastercard\",\n master: \"mastercard\",\n \"master card\": \"mastercard\",\n mc: \"mastercard\",\n amex: \"amex\",\n \"american express\": \"amex\",\n americanexpress: \"amex\",\n discover: \"discover\",\n disc: \"discover\",\n jcb: \"jcb\",\n paypal: \"paypal\",\n venmo: \"venmo\",\n \"apple pay\": \"apple_pay\",\n applepay: \"apple_pay\",\n \"google pay\": \"google_pay\",\n googlepay: \"google_pay\",\n \"samsung pay\": \"samsung_pay\",\n samsungpay: \"samsung_pay\",\n klarna: \"klarna\",\n affirm: \"affirm\",\n afterpay: \"afterpay\",\n clearpay: \"afterpay\",\n bread: \"bread\",\n skrill: \"skrill\",\n ideal: \"ideal\",\n bancontact: \"bancontact\",\n eps: \"eps\",\n blik: \"blik\",\n trustly: \"trustly\",\n oxxo: \"oxxo\",\n pix: \"pix\",\n yape: \"yape\",\n satispay: \"satispay\",\n alipay: \"alipay\",\n unionpay: \"unionpay\",\n gcash: \"gcash\",\n grabpay: \"grabpay\",\n maya: \"maya\",\n paymaya: \"maya\",\n upi: \"upi\",\n \"upi india\": \"upi\",\n};\n\nconst BRAND_ASSET_SLUG: Record<PaymentBrand, string> = {\n visa: \"visa\",\n mastercard: \"master\",\n amex: \"american_express\",\n discover: \"discover\",\n jcb: \"jcb\",\n apple_pay: \"apple_pay\",\n google_pay: \"google_pay\",\n samsung_pay: \"samsung_pay\",\n paypal: \"paypal\",\n venmo: \"venmo\",\n klarna: \"klarna\",\n affirm: \"affirm\",\n afterpay: \"afterpay\",\n bread: \"bread\",\n skrill: \"skrill\",\n ideal: \"ideal\",\n bancontact: \"bancontact\",\n eps: \"eps\",\n blik: \"blik\",\n trustly: \"trustly\",\n oxxo: \"oxxo\",\n pix: \"pix\",\n yape: \"yape\",\n satispay: \"satispay\",\n alipay: \"alipay\",\n unionpay: \"unionpay\",\n gcash: \"gcash\",\n grabpay: \"grabpay\",\n maya: \"maya\",\n upi: \"upi\",\n};\n\nexport function normalizeBrand(\n raw: string | null | undefined,\n): PaymentBrand | null {\n const key = normalizeBrandKey(raw);\n if (!key) return null;\n return BRAND_ALIASES[key] ?? null;\n}\n\nexport function brandIconUrl(brand: string | null | undefined): string {\n const canonical = normalizeBrand(brand);\n if (!canonical) return GENERIC_PAYMENT_ICON_URL;\n return `${PAYMENT_ICON_BASE_URL}/${BRAND_ASSET_SLUG[canonical]}.svg`;\n}\n\nexport function getPaymentBrandName(\n brand: string | null | undefined,\n): string | null {\n const canonical = normalizeBrand(brand);\n if (!canonical) return null;\n const cardBrand = normalizeCardBrand(canonical);\n if (cardBrand) return CARD_BRAND_NAME[cardBrand];\n const walletBrand = normalizeWalletBrand(canonical);\n if (walletBrand) return WALLET_BRAND_NAME[walletBrand];\n const apmBrand = normalizeApmBrand(canonical);\n return apmBrand ? APM_BRAND_NAME[apmBrand] : null;\n}\n\nexport function getCardBrandName(\n brand: string | null | undefined,\n): string | null {\n const canonical = normalizeCardBrand(brand);\n return canonical ? CARD_BRAND_NAME[canonical] : null;\n}\n\nexport function apmBrandName(raw: string | null | undefined): string | null {\n const canonical = normalizeApmBrand(raw);\n return canonical ? APM_BRAND_NAME[canonical] : null;\n}\n\nexport function normalizeCardBrand(\n brand: string | null | undefined,\n): CardBrand | null {\n const canonical = normalizeBrand(brand);\n return canonical != null && CARD_BRANDS.has(canonical)\n ? (canonical as CardBrand)\n : null;\n}\n\nexport function normalizeWalletBrand(\n brand: string | null | undefined,\n): WalletBrand | null {\n const canonical = normalizeBrand(brand);\n return canonical != null && WALLET_BRANDS.has(canonical)\n ? (canonical as WalletBrand)\n : null;\n}\n\nexport function normalizeSupportedWalletBadgeBrand(\n brand: string | null | undefined,\n): SupportedWalletBadgeBrand | null {\n const canonical = normalizeBrand(brand);\n return canonical != null && SUPPORTED_WALLET_BADGE_BRANDS.has(canonical)\n ? (canonical as SupportedWalletBadgeBrand)\n : null;\n}\n\nexport function normalizeApmBrand(\n brand: string | null | undefined,\n): ApmBrand | null {\n const canonical = normalizeBrand(brand);\n return canonical != null && canonical in APM_BRAND_NAME\n ? (canonical as ApmBrand)\n : null;\n}\n\nexport function isCardBrand(brand: string | null | undefined): boolean {\n return normalizeCardBrand(brand) != null;\n}\n\nexport function isWalletBrand(brand: string | null | undefined): boolean {\n return normalizeWalletBrand(brand) != null;\n}\n\nexport function isSupportedWalletBadgeBrand(\n brand: string | null | undefined,\n): boolean {\n return normalizeSupportedWalletBadgeBrand(brand) != null;\n}\n\nexport function isApmBrand(brand: string | null | undefined): boolean {\n return normalizeApmBrand(brand) != null;\n}\n\nexport function isGenericCardLabel(value: string | null | undefined): boolean {\n const key = normalizeBrandKey(value)?.replace(/\\s+/g, \"_\");\n return key === \"card\" || key === \"credit_card\";\n}\n\nfunction normalizeBrandKey(raw: string | null | undefined): string | null {\n const key = raw\n ?.trim()\n .toLowerCase()\n .replace(/[_-]+/g, \" \")\n .replace(/\\s+/g, \" \");\n return key ? key : null;\n}\n","import {\n GENERIC_PAYMENT_ICON_URL,\n apmBrandName,\n brandIconUrl,\n getPaymentBrandName,\n isGenericCardLabel,\n normalizeApmBrand,\n normalizeBrand,\n normalizeSupportedWalletBadgeBrand,\n} from \"./brands\";\nimport type {\n ApmBrand,\n NonCardPaymentMethodDisplayPort,\n PaymentLogoDisplay,\n PaymentMethodDisplayPort,\n ResolvedPaymentMethodDisplay,\n WalletBadgeDisplay,\n} from \"./ports\";\n\ntype ApmIdentifierClass = \"email\" | \"handle\" | \"bank\" | \"none\";\n\nconst APM_IDENTIFIER_CLASS: Record<ApmBrand, ApmIdentifierClass> = {\n paypal: \"email\",\n venmo: \"handle\",\n upi: \"handle\",\n ideal: \"bank\",\n bancontact: \"bank\",\n eps: \"bank\",\n klarna: \"none\",\n affirm: \"none\",\n afterpay: \"none\",\n bread: \"none\",\n skrill: \"email\",\n blik: \"none\",\n trustly: \"none\",\n oxxo: \"none\",\n pix: \"none\",\n yape: \"none\",\n satispay: \"none\",\n alipay: \"none\",\n unionpay: \"none\",\n gcash: \"none\",\n grabpay: \"none\",\n maya: \"none\",\n};\n\nconst DEFAULT_PAYMENT_ALT = \"Payment method\";\nconst MASK_DOT = \"•\";\n\nexport const PAYMENT_TYPE_LABELS: Record<string, string> = {\n card: \"Credit Card\",\n credit_card: \"Credit Card\",\n paypal: \"PayPal\",\n braintree_paypal: \"PayPal\",\n apple_pay: \"Apple Pay\",\n google_pay: \"Google Pay\",\n affirm: \"Affirm\",\n klarna: \"Klarna\",\n bread: \"Bread\",\n iap: \"In-App Purchase\",\n citcon: \"Citcon\",\n ppro: \"PPRO\",\n dlocal: \"dLocal\",\n droplet: \"Droplet\",\n} as const satisfies Record<string, string>;\n\nexport type MaskedCardLabelSegment =\n | { kind: \"dots\"; count: number }\n | { kind: \"gap\" }\n | { kind: \"text\"; value: string };\n\nexport function normalizePaymentDescriptor(\n value: string | null | undefined,\n): string | null {\n const normalized = value\n ?.replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .trim()\n .toLowerCase()\n .replace(/[_-]+/g, \" \")\n .replace(/\\s+/g, \" \");\n\n return normalized || null;\n}\n\nexport function isCardPaymentDescriptor(\n value: string | null | undefined,\n): boolean {\n const descriptor = normalizePaymentDescriptor(value);\n return descriptor === \"card\" || descriptor === \"credit card\";\n}\n\nexport function paymentDescriptorLabel(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n const normalized = normalizePaymentDescriptor(value);\n if (!normalized) continue;\n const key = normalized.replace(/\\s+/g, \"_\");\n return PAYMENT_TYPE_LABELS[key] ?? value?.trim() ?? null;\n }\n\n return null;\n}\n\nexport function maskCardNumber(\n lastFour: string | null | undefined,\n brand?: string | null | undefined,\n): string {\n const tail = trimToNull(lastFour) ?? \"••••\";\n if (normalizeBrand(brand) === \"amex\") return `•••• •••••• •${tail}`;\n return `•••• •••• •••• ${tail}`;\n}\n\nexport function cardDisplayLabel(\n lastFour: string | null | undefined,\n brand?: string | null | undefined,\n): string {\n const labelBrand = trimToNull(brand);\n const mask = maskCardNumber(lastFour, labelBrand);\n if (\n labelBrand &&\n normalizeBrand(labelBrand) == null &&\n !isGenericCardLabel(labelBrand)\n ) {\n return `${labelBrand} ${mask}`;\n }\n return mask;\n}\n\nexport function maskedCardLabelSegments(\n label: string | null | undefined,\n): MaskedCardLabelSegment[] | null {\n const value = trimToNull(label);\n if (!value) return null;\n\n const segments: MaskedCardLabelSegment[] = [];\n let hasDots = false;\n\n const parts = value.split(/\\s+/);\n\n for (const [index, part] of parts.entries()) {\n if (!/^[•\\d]+$/.test(part)) return null;\n if (index > 0) segments.push({ kind: \"gap\" });\n\n let dotCount = 0;\n while (part[dotCount] === MASK_DOT) dotCount += 1;\n\n const remainder = part.slice(dotCount);\n if (remainder.includes(MASK_DOT)) return null;\n\n if (dotCount > 0) {\n hasDots = true;\n segments.push({ kind: \"dots\", count: dotCount });\n }\n\n if (remainder) {\n segments.push({ kind: \"text\", value: remainder });\n }\n }\n\n return hasDots ? segments : null;\n}\n\nexport function maskEmail(email: string | null | undefined): string | null {\n const normalizedEmail = trimToNull(email);\n if (!normalizedEmail) return null;\n const at = normalizedEmail.indexOf(\"@\");\n if (at <= 0) return normalizedEmail;\n const local = normalizedEmail.slice(0, at);\n const domain = normalizedEmail.slice(at);\n if (local.length <= 2) return `${local[0] ?? \"\"}••${domain}`;\n const dots = \"•\".repeat(Math.min(local.length - 2, 6));\n return `${local[0]}${dots}${local[local.length - 1]}${domain}`;\n}\n\nexport function apmIdentifier(\n paymentMethod: NonCardPaymentMethodDisplayPort,\n): string | null {\n const brand = normalizeApmBrand(\n paymentMethod.brand ?? paymentMethod.fallbackLabel,\n );\n const identifierClass = brand != null ? APM_IDENTIFIER_CLASS[brand] : \"none\";\n\n switch (identifierClass) {\n case \"email\":\n return maskEmail(paymentMethod.emailAddress);\n case \"handle\":\n return trimToNull(paymentMethod.accountHandle);\n case \"bank\":\n return bankIdentifier(paymentMethod);\n case \"none\":\n return null;\n }\n}\n\nexport function nonCardDisplayLabel(\n paymentMethod: NonCardPaymentMethodDisplayPort,\n): string {\n return (\n apmIdentifier(paymentMethod) ??\n apmBrandName(paymentMethod.brand ?? paymentMethod.fallbackLabel) ??\n getPaymentBrandName(paymentMethod.brand ?? paymentMethod.fallbackLabel) ??\n trimToNull(paymentMethod.fallbackLabel) ??\n DEFAULT_PAYMENT_ALT\n );\n}\n\nexport function resolvePaymentLogo({\n brand,\n logoUrl,\n alt,\n}: {\n brand?: string | null;\n logoUrl?: string | null;\n alt?: string | null;\n}): PaymentLogoDisplay {\n const canonical = normalizeBrand(brand);\n const apiLogoUrl = trimToNull(logoUrl);\n const fallbackUrl = apiLogoUrl ?? GENERIC_PAYMENT_ICON_URL;\n\n return {\n primaryUrl: canonical ? brandIconUrl(canonical) : fallbackUrl,\n fallbackUrl: canonical ? fallbackUrl : GENERIC_PAYMENT_ICON_URL,\n alt:\n trimToNull(alt) ??\n getPaymentBrandName(brand) ??\n trimToNull(brand) ??\n DEFAULT_PAYMENT_ALT,\n brand: canonical,\n };\n}\n\nexport function resolveWalletBadge(\n walletBrand: string | null | undefined,\n): WalletBadgeDisplay | null {\n const brand = normalizeSupportedWalletBadgeBrand(walletBrand);\n if (!brand) return null;\n return {\n brand,\n label: getPaymentBrandName(brand) ?? DEFAULT_PAYMENT_ALT,\n };\n}\n\nexport function resolvePaymentMethodDisplay(\n paymentMethod: PaymentMethodDisplayPort,\n): ResolvedPaymentMethodDisplay {\n if (paymentMethod.kind === \"card\") {\n const label = cardDisplayLabel(paymentMethod.last4, paymentMethod.brand);\n const logo = resolvePaymentLogo({\n brand: paymentMethod.brand,\n logoUrl: paymentMethod.logoUrl,\n alt: getPaymentBrandName(paymentMethod.brand) ?? \"Card\",\n });\n const walletBadge = resolveWalletBadge(paymentMethod.walletBrand);\n return {\n kind: \"card\",\n label,\n logo,\n brand: logo.brand,\n walletBadge,\n accessibilityLabel: formatAccessibilityLabel(logo.alt, label),\n };\n }\n\n const brand = paymentMethod.brand ?? paymentMethod.fallbackLabel;\n const label = nonCardDisplayLabel(paymentMethod);\n const logo = resolvePaymentLogo({\n brand,\n logoUrl: paymentMethod.logoUrl,\n alt: getPaymentBrandName(brand) ?? paymentMethod.fallbackLabel,\n });\n return {\n kind: \"non_card\",\n label,\n logo,\n brand: logo.brand,\n walletBadge: null,\n accessibilityLabel: formatAccessibilityLabel(logo.alt, label),\n };\n}\n\nfunction bankIdentifier(\n paymentMethod: NonCardPaymentMethodDisplayPort,\n): string | null {\n const bankName = trimToNull(paymentMethod.bankName);\n const accountLast4 = trimToNull(paymentMethod.accountLast4);\n const maskedAccount = accountLast4 ? `••${accountLast4}` : null;\n if (bankName && maskedAccount) return `${bankName} ${maskedAccount}`;\n return bankName ?? maskedAccount;\n}\n\nfunction formatAccessibilityLabel(alt: string, label: string): string {\n return alt === label ? label : `${alt} ${label}`;\n}\n\nfunction trimToNull(value: string | null | undefined): string | null {\n const trimmed = value?.trim();\n return trimmed ? trimmed : null;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"display-JuYIguJK.cjs","names":[],"sources":["../../../payments/display/src/brands.ts","../../../payments/display/src/display.ts"],"sourcesContent":["import type {\n ApmBrand,\n CardBrand,\n PaymentBrand,\n SupportedWalletBadgeBrand,\n WalletBrand,\n} from \"./ports\";\n\nexport const PAYMENT_ICON_BASE_URL =\n \"https://assets.fluid.app/images/payment_icons\";\nexport const GENERIC_PAYMENT_ICON_URL = `${PAYMENT_ICON_BASE_URL}/generic.svg`;\n\nconst CARD_BRANDS = new Set<PaymentBrand>([\n \"visa\",\n \"mastercard\",\n \"amex\",\n \"discover\",\n \"jcb\",\n]);\n\nconst WALLET_BRANDS = new Set<PaymentBrand>([\n \"apple_pay\",\n \"google_pay\",\n \"samsung_pay\",\n]);\n\nconst SUPPORTED_WALLET_BADGE_BRANDS = new Set<PaymentBrand>([\n \"apple_pay\",\n \"google_pay\",\n]);\n\nconst CARD_BRAND_NAME: Record<CardBrand, string> = {\n visa: \"Visa\",\n mastercard: \"Mastercard\",\n amex: \"American Express\",\n discover: \"Discover\",\n jcb: \"JCB\",\n};\n\nconst WALLET_BRAND_NAME: Record<WalletBrand, string> = {\n apple_pay: \"Apple Pay\",\n google_pay: \"Google Pay\",\n samsung_pay: \"Samsung Pay\",\n};\n\nconst APM_BRAND_NAME: Record<ApmBrand, string> = {\n paypal: \"PayPal\",\n venmo: \"Venmo\",\n klarna: \"Klarna\",\n affirm: \"Affirm\",\n afterpay: \"Afterpay\",\n bread: \"Bread\",\n skrill: \"Skrill\",\n ideal: \"iDEAL\",\n bancontact: \"Bancontact\",\n eps: \"EPS\",\n blik: \"BLIK\",\n trustly: \"Trustly\",\n oxxo: \"OXXO\",\n pix: \"Pix\",\n yape: \"Yape\",\n satispay: \"Satispay\",\n alipay: \"Alipay\",\n unionpay: \"UnionPay\",\n gcash: \"GCash\",\n grabpay: \"GrabPay\",\n maya: \"Maya\",\n upi: \"UPI\",\n};\n\nconst BRAND_ALIASES: Record<string, PaymentBrand> = {\n visa: \"visa\",\n mastercard: \"mastercard\",\n master: \"mastercard\",\n \"master card\": \"mastercard\",\n mc: \"mastercard\",\n amex: \"amex\",\n \"american express\": \"amex\",\n americanexpress: \"amex\",\n discover: \"discover\",\n disc: \"discover\",\n jcb: \"jcb\",\n paypal: \"paypal\",\n venmo: \"venmo\",\n \"apple pay\": \"apple_pay\",\n applepay: \"apple_pay\",\n \"google pay\": \"google_pay\",\n googlepay: \"google_pay\",\n \"samsung pay\": \"samsung_pay\",\n samsungpay: \"samsung_pay\",\n klarna: \"klarna\",\n affirm: \"affirm\",\n afterpay: \"afterpay\",\n clearpay: \"afterpay\",\n bread: \"bread\",\n skrill: \"skrill\",\n ideal: \"ideal\",\n bancontact: \"bancontact\",\n eps: \"eps\",\n blik: \"blik\",\n trustly: \"trustly\",\n oxxo: \"oxxo\",\n pix: \"pix\",\n yape: \"yape\",\n satispay: \"satispay\",\n alipay: \"alipay\",\n unionpay: \"unionpay\",\n gcash: \"gcash\",\n grabpay: \"grabpay\",\n maya: \"maya\",\n paymaya: \"maya\",\n upi: \"upi\",\n \"upi india\": \"upi\",\n};\n\nconst BRAND_ASSET_SLUG: Record<PaymentBrand, string> = {\n visa: \"visa\",\n mastercard: \"master\",\n amex: \"american_express\",\n discover: \"discover\",\n jcb: \"jcb\",\n apple_pay: \"apple_pay\",\n google_pay: \"google_pay\",\n samsung_pay: \"samsung_pay\",\n paypal: \"paypal\",\n venmo: \"venmo\",\n klarna: \"klarna\",\n affirm: \"affirm\",\n afterpay: \"afterpay\",\n bread: \"bread\",\n skrill: \"skrill\",\n ideal: \"ideal\",\n bancontact: \"bancontact\",\n eps: \"eps\",\n blik: \"blik\",\n trustly: \"trustly\",\n oxxo: \"oxxo\",\n pix: \"pix\",\n yape: \"yape\",\n satispay: \"satispay\",\n alipay: \"alipay\",\n unionpay: \"unionpay\",\n gcash: \"gcash\",\n grabpay: \"grabpay\",\n maya: \"maya\",\n upi: \"upi\",\n};\n\nexport function normalizeBrand(\n raw: string | null | undefined,\n): PaymentBrand | null {\n const key = normalizeBrandKey(raw);\n if (!key) return null;\n return BRAND_ALIASES[key] ?? null;\n}\n\nexport function brandIconUrl(brand: string | null | undefined): string {\n const canonical = normalizeBrand(brand);\n if (!canonical) return GENERIC_PAYMENT_ICON_URL;\n return `${PAYMENT_ICON_BASE_URL}/${BRAND_ASSET_SLUG[canonical]}.svg`;\n}\n\nexport function getPaymentBrandName(\n brand: string | null | undefined,\n): string | null {\n const canonical = normalizeBrand(brand);\n if (!canonical) return null;\n const cardBrand = normalizeCardBrand(canonical);\n if (cardBrand) return CARD_BRAND_NAME[cardBrand];\n const walletBrand = normalizeWalletBrand(canonical);\n if (walletBrand) return WALLET_BRAND_NAME[walletBrand];\n const apmBrand = normalizeApmBrand(canonical);\n return apmBrand ? APM_BRAND_NAME[apmBrand] : null;\n}\n\nexport function getCardBrandName(\n brand: string | null | undefined,\n): string | null {\n const canonical = normalizeCardBrand(brand);\n return canonical ? CARD_BRAND_NAME[canonical] : null;\n}\n\nexport function apmBrandName(raw: string | null | undefined): string | null {\n const canonical = normalizeApmBrand(raw);\n return canonical ? APM_BRAND_NAME[canonical] : null;\n}\n\nexport function normalizeCardBrand(\n brand: string | null | undefined,\n): CardBrand | null {\n const canonical = normalizeBrand(brand);\n return canonical != null && CARD_BRANDS.has(canonical)\n ? (canonical as CardBrand)\n : null;\n}\n\nexport function normalizeWalletBrand(\n brand: string | null | undefined,\n): WalletBrand | null {\n const canonical = normalizeBrand(brand);\n return canonical != null && WALLET_BRANDS.has(canonical)\n ? (canonical as WalletBrand)\n : null;\n}\n\nexport function normalizeSupportedWalletBadgeBrand(\n brand: string | null | undefined,\n): SupportedWalletBadgeBrand | null {\n const canonical = normalizeBrand(brand);\n return canonical != null && SUPPORTED_WALLET_BADGE_BRANDS.has(canonical)\n ? (canonical as SupportedWalletBadgeBrand)\n : null;\n}\n\nexport function normalizeApmBrand(\n brand: string | null | undefined,\n): ApmBrand | null {\n const canonical = normalizeBrand(brand);\n return canonical != null && canonical in APM_BRAND_NAME\n ? (canonical as ApmBrand)\n : null;\n}\n\nexport function isCardBrand(brand: string | null | undefined): boolean {\n return normalizeCardBrand(brand) != null;\n}\n\nexport function isWalletBrand(brand: string | null | undefined): boolean {\n return normalizeWalletBrand(brand) != null;\n}\n\nexport function isSupportedWalletBadgeBrand(\n brand: string | null | undefined,\n): boolean {\n return normalizeSupportedWalletBadgeBrand(brand) != null;\n}\n\nexport function isApmBrand(brand: string | null | undefined): boolean {\n return normalizeApmBrand(brand) != null;\n}\n\nexport function isGenericCardLabel(value: string | null | undefined): boolean {\n const key = normalizeBrandKey(value)?.replace(/\\s+/g, \"_\");\n return key === \"card\" || key === \"credit_card\";\n}\n\nfunction normalizeBrandKey(raw: string | null | undefined): string | null {\n const key = raw\n ?.trim()\n .toLowerCase()\n .replace(/[_-]+/g, \" \")\n .replace(/\\s+/g, \" \");\n return key ? key : null;\n}\n","import {\n GENERIC_PAYMENT_ICON_URL,\n apmBrandName,\n brandIconUrl,\n getPaymentBrandName,\n isGenericCardLabel,\n normalizeApmBrand,\n normalizeBrand,\n normalizeSupportedWalletBadgeBrand,\n} from \"./brands\";\nimport type {\n ApmBrand,\n NonCardPaymentMethodDisplayPort,\n PaymentLogoDisplay,\n PaymentMethodDisplayPort,\n ResolvedPaymentMethodDisplay,\n WalletBadgeDisplay,\n} from \"./ports\";\n\ntype ApmIdentifierClass = \"email\" | \"handle\" | \"bank\" | \"none\";\n\nconst APM_IDENTIFIER_CLASS: Record<ApmBrand, ApmIdentifierClass> = {\n paypal: \"email\",\n venmo: \"handle\",\n upi: \"handle\",\n ideal: \"bank\",\n bancontact: \"bank\",\n eps: \"bank\",\n klarna: \"none\",\n affirm: \"none\",\n afterpay: \"none\",\n bread: \"none\",\n skrill: \"email\",\n blik: \"none\",\n trustly: \"none\",\n oxxo: \"none\",\n pix: \"none\",\n yape: \"none\",\n satispay: \"none\",\n alipay: \"none\",\n unionpay: \"none\",\n gcash: \"none\",\n grabpay: \"none\",\n maya: \"none\",\n};\n\nconst DEFAULT_PAYMENT_ALT = \"Payment method\";\nconst MASK_DOT = \"•\";\n\nexport const PAYMENT_TYPE_LABELS: Record<string, string> = {\n card: \"Credit Card\",\n credit_card: \"Credit Card\",\n paypal: \"PayPal\",\n braintree_paypal: \"PayPal\",\n apple_pay: \"Apple Pay\",\n google_pay: \"Google Pay\",\n affirm: \"Affirm\",\n klarna: \"Klarna\",\n bread: \"Bread\",\n iap: \"In-App Purchase\",\n citcon: \"Citcon\",\n ppro: \"PPRO\",\n dlocal: \"dLocal\",\n droplet: \"Droplet\",\n} as const satisfies Record<string, string>;\n\nexport type MaskedCardLabelSegment =\n | { kind: \"dots\"; count: number }\n | { kind: \"gap\" }\n | { kind: \"text\"; value: string };\n\nexport function normalizePaymentDescriptor(\n value: string | null | undefined,\n): string | null {\n const normalized = value\n ?.replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .trim()\n .toLowerCase()\n .replace(/[_-]+/g, \" \")\n .replace(/\\s+/g, \" \");\n\n return normalized || null;\n}\n\nexport function isCardPaymentDescriptor(\n value: string | null | undefined,\n): boolean {\n const descriptor = normalizePaymentDescriptor(value);\n return descriptor === \"card\" || descriptor === \"credit card\";\n}\n\nexport function paymentDescriptorLabel(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n const normalized = normalizePaymentDescriptor(value);\n if (!normalized) continue;\n const key = normalized.replace(/\\s+/g, \"_\");\n return PAYMENT_TYPE_LABELS[key] ?? value?.trim() ?? null;\n }\n\n return null;\n}\n\nexport function maskCardNumber(\n lastFour: string | null | undefined,\n brand?: string | null | undefined,\n): string {\n const tail = trimToNull(lastFour) ?? \"••••\";\n if (normalizeBrand(brand) === \"amex\") return `•••• •••••• •${tail}`;\n return `•••• •••• •••• ${tail}`;\n}\n\nexport function cardDisplayLabel(\n lastFour: string | null | undefined,\n brand?: string | null | undefined,\n): string {\n const labelBrand = trimToNull(brand);\n const mask = maskCardNumber(lastFour, labelBrand);\n if (\n labelBrand &&\n normalizeBrand(labelBrand) == null &&\n !isGenericCardLabel(labelBrand)\n ) {\n return `${labelBrand} ${mask}`;\n }\n return mask;\n}\n\nexport function maskedCardLabelSegments(\n label: string | null | undefined,\n): MaskedCardLabelSegment[] | null {\n const value = trimToNull(label);\n if (!value) return null;\n\n const segments: MaskedCardLabelSegment[] = [];\n let hasDots = false;\n\n const parts = value.split(/\\s+/);\n\n for (const [index, part] of parts.entries()) {\n if (!/^[•\\d]+$/.test(part)) return null;\n if (index > 0) segments.push({ kind: \"gap\" });\n\n let dotCount = 0;\n while (part[dotCount] === MASK_DOT) dotCount += 1;\n\n const remainder = part.slice(dotCount);\n if (remainder.includes(MASK_DOT)) return null;\n\n if (dotCount > 0) {\n hasDots = true;\n segments.push({ kind: \"dots\", count: dotCount });\n }\n\n if (remainder) {\n segments.push({ kind: \"text\", value: remainder });\n }\n }\n\n return hasDots ? segments : null;\n}\n\nexport function maskEmail(email: string | null | undefined): string | null {\n const normalizedEmail = trimToNull(email);\n if (!normalizedEmail) return null;\n const at = normalizedEmail.indexOf(\"@\");\n if (at <= 0) return normalizedEmail;\n const local = normalizedEmail.slice(0, at);\n const domain = normalizedEmail.slice(at);\n if (local.length <= 2) return `${local[0] ?? \"\"}••${domain}`;\n const dots = \"•\".repeat(Math.min(local.length - 2, 6));\n return `${local[0]}${dots}${local[local.length - 1]}${domain}`;\n}\n\nexport function apmIdentifier(\n paymentMethod: NonCardPaymentMethodDisplayPort,\n): string | null {\n const brand = normalizeApmBrand(\n paymentMethod.brand ?? paymentMethod.fallbackLabel,\n );\n const identifierClass = brand != null ? APM_IDENTIFIER_CLASS[brand] : \"none\";\n\n switch (identifierClass) {\n case \"email\":\n return maskEmail(paymentMethod.emailAddress);\n case \"handle\":\n return trimToNull(paymentMethod.accountHandle);\n case \"bank\":\n return bankIdentifier(paymentMethod);\n case \"none\":\n return null;\n }\n}\n\nexport function nonCardDisplayLabel(\n paymentMethod: NonCardPaymentMethodDisplayPort,\n): string {\n return (\n apmIdentifier(paymentMethod) ??\n apmBrandName(paymentMethod.brand ?? paymentMethod.fallbackLabel) ??\n getPaymentBrandName(paymentMethod.brand ?? paymentMethod.fallbackLabel) ??\n trimToNull(paymentMethod.fallbackLabel) ??\n DEFAULT_PAYMENT_ALT\n );\n}\n\nexport function resolvePaymentLogo({\n brand,\n logoUrl,\n alt,\n}: {\n brand?: string | null;\n logoUrl?: string | null;\n alt?: string | null;\n}): PaymentLogoDisplay {\n const canonical = normalizeBrand(brand);\n const apiLogoUrl = trimToNull(logoUrl);\n const fallbackUrl = apiLogoUrl ?? GENERIC_PAYMENT_ICON_URL;\n\n return {\n primaryUrl: canonical ? brandIconUrl(canonical) : fallbackUrl,\n fallbackUrl: canonical ? fallbackUrl : GENERIC_PAYMENT_ICON_URL,\n alt:\n trimToNull(alt) ??\n getPaymentBrandName(brand) ??\n trimToNull(brand) ??\n DEFAULT_PAYMENT_ALT,\n brand: canonical,\n };\n}\n\nexport function resolveWalletBadge(\n walletBrand: string | null | undefined,\n): WalletBadgeDisplay | null {\n const brand = normalizeSupportedWalletBadgeBrand(walletBrand);\n if (!brand) return null;\n return {\n brand,\n label: getPaymentBrandName(brand) ?? DEFAULT_PAYMENT_ALT,\n };\n}\n\nexport function resolvePaymentMethodDisplay(\n paymentMethod: PaymentMethodDisplayPort,\n): ResolvedPaymentMethodDisplay {\n if (paymentMethod.kind === \"card\") {\n const label = cardDisplayLabel(paymentMethod.last4, paymentMethod.brand);\n const logo = resolvePaymentLogo({\n brand: paymentMethod.brand,\n logoUrl: paymentMethod.logoUrl,\n alt: getPaymentBrandName(paymentMethod.brand) ?? \"Card\",\n });\n const walletBadge = resolveWalletBadge(paymentMethod.walletBrand);\n return {\n kind: \"card\",\n label,\n logo,\n brand: logo.brand,\n walletBadge,\n accessibilityLabel: formatAccessibilityLabel(logo.alt, label),\n };\n }\n\n const brand = paymentMethod.brand ?? paymentMethod.fallbackLabel;\n const label = nonCardDisplayLabel(paymentMethod);\n const logo = resolvePaymentLogo({\n brand,\n logoUrl: paymentMethod.logoUrl,\n alt: getPaymentBrandName(brand) ?? paymentMethod.fallbackLabel,\n });\n return {\n kind: \"non_card\",\n label,\n logo,\n brand: logo.brand,\n walletBadge: null,\n accessibilityLabel: formatAccessibilityLabel(logo.alt, label),\n };\n}\n\nfunction bankIdentifier(\n paymentMethod: NonCardPaymentMethodDisplayPort,\n): string | null {\n const bankName = trimToNull(paymentMethod.bankName);\n const accountLast4 = trimToNull(paymentMethod.accountLast4);\n const maskedAccount = accountLast4 ? `••${accountLast4}` : null;\n if (bankName && maskedAccount) return `${bankName} ${maskedAccount}`;\n return bankName ?? maskedAccount;\n}\n\nfunction formatAccessibilityLabel(alt: string, label: string): string {\n return alt === label ? label : `${alt} ${label}`;\n}\n\nfunction trimToNull(value: string | null | undefined): string | null {\n const trimmed = value?.trim();\n return trimmed ? trimmed : null;\n}\n"],"mappings":"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"}