@carto/ps-utils 2.0.1 → 2.1.0

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 (46) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +436 -74
  4. package/dist/index.js.map +1 -1
  5. package/dist/types/clipboard/copy.d.ts +4 -6
  6. package/dist/types/colors/carto-palettes/carto-palettes.d.ts +47 -0
  7. package/dist/types/colors/hex-to-rgba/hex-to-rgba.d.ts +7 -16
  8. package/dist/types/colors/palette-to-hex/palette-to-hex.d.ts +19 -0
  9. package/dist/types/colors/palette-to-hex/palette-to-hex.test.d.ts +1 -0
  10. package/dist/types/colors/rgba-to-hex/rgba-to-hex.d.ts +7 -19
  11. package/dist/types/debounce/debounce.d.ts +12 -2
  12. package/dist/types/formatters/constants.d.ts +23 -1
  13. package/dist/types/formatters/date/format-date.d.ts +13 -8
  14. package/dist/types/formatters/number/format-number.d.ts +17 -20
  15. package/dist/types/index.d.ts +3 -0
  16. package/dist/types/strings/match-text/match-text.d.ts +10 -6
  17. package/dist/types/strings/normalize/normalize.d.ts +6 -9
  18. package/dist/types/strings/routes/replace-route.d.ts +10 -14
  19. package/package.json +7 -3
  20. package/src/clipboard/copy.test.ts +49 -0
  21. package/src/clipboard/copy.ts +18 -0
  22. package/src/colors/carto-palettes/carto-palettes.ts +355 -0
  23. package/src/colors/hex-to-rgba/hex-to-rgba.test.ts +82 -0
  24. package/src/colors/hex-to-rgba/hex-to-rgba.ts +67 -0
  25. package/src/colors/palette-to-hex/palette-to-hex.test.ts +60 -0
  26. package/src/colors/palette-to-hex/palette-to-hex.ts +45 -0
  27. package/src/colors/rgba-to-hex/rgba-to-hex.test.ts +34 -0
  28. package/src/colors/rgba-to-hex/rgba-to-hex.ts +42 -0
  29. package/src/colors/rgba-to-hex/types.ts +9 -0
  30. package/src/debounce/debounce.test.ts +21 -0
  31. package/src/debounce/debounce.ts +29 -0
  32. package/src/formatters/constants.ts +49 -0
  33. package/src/formatters/date/format-date.test.ts +36 -0
  34. package/src/formatters/date/format-date.ts +34 -0
  35. package/src/formatters/number/format-number.test.ts +49 -0
  36. package/src/formatters/number/format-number.ts +68 -0
  37. package/src/index.ts +18 -0
  38. package/src/strings/match-text/match-text.test.ts +38 -0
  39. package/src/strings/match-text/match-text.ts +36 -0
  40. package/src/strings/match-text/types.ts +15 -0
  41. package/src/strings/normalize/normalize.test.ts +12 -0
  42. package/src/strings/normalize/normalize.ts +22 -0
  43. package/src/strings/normalize/types.ts +15 -0
  44. package/src/strings/routes/replace-route.test.ts +64 -0
  45. package/src/strings/routes/replace-route.ts +39 -0
  46. package/src/strings/routes/types.ts +2 -0
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});async function m(t){try{await navigator.clipboard.writeText(t)}catch(r){throw new Error(r)}}function l(t,r=1){if(!t){console.warn(`hexToRgba: ${t} invalid hexadecimal format`);return}if(r<0||r>1){console.warn(`hexToRgba: ${r} invalid alpha format`);return}if(t!=null&&t.includes("#")&&(t=t.slice(1)),!/[0-9A-Fa-f]{6}/g.test(t)&&!/[0-9A-Fa-f]{3}/g.test(t)&&!/[0-9A-Fa-f]{2}/g.test(t)){console.warn(`hexToRgba: ${t} invalid hexadecimal format`);return}const n=t.length;n<6&&(t=t.slice(0,6-n).repeat(6/n));const e=parseInt(t.length===3?t.slice(0,1).repeat(2):t.slice(0,2),16),o=parseInt(t.length===3?t.slice(1,2).repeat(2):t.slice(2,4),16),i=parseInt(t.length===3?t.slice(2,3).repeat(2):t.slice(4,6),16);return[e,o,i,r*255]}function y(t,{withPrefix:r=!0}={}){if(!(t!=null&&t.length)){console.warn("rgbaToHex: invalid array or empty values");return}if(t.some(o=>o<0||o>255)){console.warn(`rgbaToHex: [${t.toString()}] invalid array value format`);return}const e=t.map(o=>o.toString(16).padStart(2,"0")).join("");return`${r?"#":""}${e}`}function p(t,r){return(...o)=>{clearTimeout(0),setTimeout(()=>t(...o),r)}}const a={NUMBER:{style:"decimal",maximumFractionDigits:1,minimumFractionDigits:0,notation:"compact",compactDisplay:"short"},CURRENCY:{style:"currency",currency:"USD",maximumFractionDigits:2,minimumFractionDigits:2,notation:"compact",compactDisplay:"short"},DATE:{year:"numeric",month:"2-digit",day:"2-digit"}};function T(t,r,n){return Intl.DateTimeFormat(r,n).format(t)}function f(t,r,n){return Intl.NumberFormat(r,n).format(t)}function R(t,r,n={}){return f(t,r,{...a.NUMBER,...n})}function D(t,r,n={}){return f(t,r,{...a.CURRENCY,...n})}function s(t,{format:r="NFD",replaceUnicode:n="[̀-ͯ]"}={}){const e=new RegExp(n,"g");return t.normalize(r).replace(e,"")}function F(t,r,{matchFn:n,normalizeOptions:e}={}){let o=t;return typeof t=="string"&&(o=new RegExp(s(t.toLowerCase(),e),"gi")),Array.isArray(r)?r.filter(i=>{const u=n?n(i):i;return s(u).match(o)}):s(r).match(o)?r:null}const b=/:+[a-z]+/gi;function w(t,r=[]){let n=t;const e=n.match(b)??[],o=Array.isArray(r);return e.forEach((i,u)=>{let c;if(o)c=r[u];else{const g=i.substring(1);c=r[g]}n=n.replace(i,(c==null?void 0:c.toString())??"")}),n}exports.DEFAULT_FORMATTERS_CONFIG=a;exports.copy=m;exports.debounce=p;exports.formatCurrency=D;exports.formatDate=T;exports.formatNumber=R;exports.hexToRgba=l;exports.matchText=F;exports.normalize=s;exports.replaceRoute=w;exports.rgbaToHex=y;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});async function l(e){try{await navigator.clipboard.writeText(e)}catch(a){throw new Error(a)}}const b={ag_GrnYl:["#245668","#0F7279","#0D8F81","#39AB7E","#6EC574","#A9DC67","#EDEF5D"],ag_Sunset:["#4b2991","#872ca2","#c0369d","#ea4f88","#fa7876","#f6a97a","#edd9a3"],BluGrn:["#c4e6c3","#96d2a4","#6dbc90","#4da284","#36877a","#266b6e","#1d4f60"],BluYl:["#f7feae","#b7e6a5","#7ccba2","#46aea0","#089099","#00718b","#045275"],BrwnYl:["#ede5cf","#e0c2a2","#d39c83","#c1766f","#a65461","#813753","#541f3f"],Burg:["#ffc6c4","#f4a3a8","#e38191","#cc607d","#ad466c","#8b3058","#672044"],BurgYl:["#fbe6c5","#f5ba98","#ee8a82","#dc7176","#c8586c","#9c3f5d","#70284a"],DarkMint:["#d2fbd4","#a5dbc2","#7bbcb0","#559c9e","#3a7c89","#235d72","#123f5a"],Emrld:["#d3f2a3","#97e196","#6cc08b","#4c9b82","#217a79","#105965","#074050"],Magenta:["#f3cbd3","#eaa9bd","#dd88ac","#ca699d","#b14d8e","#91357d","#6c2167"],Mint:["#e4f1e1","#b4d9cc","#89c0b6","#63a6a0","#448c8a","#287274","#0d585f"],OrYel:["#ecda9a","#efc47e","#f3ad6a","#f7945d","#f97b57","#f66356","#ee4d5a"],Peach:["#fde0c5","#facba6","#f8b58b","#f59e72","#f2855d","#ef6a4c","#eb4a40"],PinkYl:["#fef6b5","#ffdd9a","#ffc285","#ffa679","#fa8a76","#f16d7a","#e15383"],Purp:["#f3e0f7","#e4c7f1","#d1afe8","#b998dd","#9f82ce","#826dba","#63589f"],PurpOr:["#f9ddda","#f2b9c4","#e597b9","#ce78b3","#ad5fad","#834ba0","#573b88"],RedOr:["#f6d2a9","#f5b78e","#f19c7c","#ea8171","#dd686c","#ca5268","#b13f64"],Sunset:["#f3e79b","#fac484","#f8a07e","#eb7f86","#ce6693","#a059a0","#5c53a5"],SunsetDark:["#fcde9c","#faa476","#f0746e","#e34f6f","#dc3977","#b9257a","#7c1d6f"],Teal:["#d1eeea","#a8dbd9","#85c4c9","#68abb8","#4f90a6","#3b738f","#2a5674"],TealGrn:["#b0f2bc","#89e8ac","#67dba5","#4cc8a3","#38b2a3","#2c98a0","#257d98"],ArmyRose:["#798234","#a3ad62","#d0d3a2","#fdfbe4","#f0c6c3","#df91a3","#d46780"],Earth:["#A16928","#bd925a","#d6bd8d","#edeac2","#b5c8b8","#79a7ac","#2887a1"],Fall:["#3d5941","#778868","#b5b991","#f6edbd","#edbb8a","#de8a5a","#ca562c"],Geyser:["#008080","#70a494","#b4c8a8","#f6edbd","#edbb8a","#de8a5a","#ca562c"],TealRose:["#009392","#72aaa1","#b1c7b3","#f1eac8","#e5b9ad","#d98994","#d0587e"],Temps:["#009392","#39b185","#9ccb86","#e9e29c","#eeb479","#e88471","#cf597e"],Tropic:["#009B9E","#42B7B9","#A7D3D4","#F1F1F1","#E4C1D9","#D691C1","#C75DAB"],Antique:["#855C75","#D9AF6B","#AF6458","#736F4C","#526A83","#625377","#68855C","#9C9C5E","#A06177","#8C785D","#467378","#7C7C7C"],Bold:["#7F3C8D","#11A579","#3969AC","#F2B701","#E73F74","#80BA5A","#E68310","#008695","#CF1C90","#f97b72","#4b4b8f","#A5AA99"],Pastel:["#66C5CC","#F6CF71","#F89C74","#DCB0F2","#87C55F","#9EB9F3","#FE88B1","#C9DB74","#8BE0A4","#B497E7","#D3B484","#B3B3B3"],Prism:["#5F4690","#1D6996","#38A6A5","#0F8554","#73AF48","#EDAD08","#E17C05","#CC503E","#94346E","#6F4070","#994E95","#666666"],Safe:["#88CCEE","#CC6677","#DDCC77","#117733","#332288","#AA4499","#44AA99","#999933","#882255","#661100","#6699CC","#888888"],Vivid:["#E58606","#5D69B1","#52BCA3","#99C945","#CC61B0","#24796C","#DAA51B","#2F8AC4","#764E9F","#ED645A","#CC3A8E","#A5AA99"]};function C(e,a=1){if(!e){console.warn(`hexToRgba: ${e} invalid hexadecimal format`);return}if(a<0||a>1){console.warn(`hexToRgba: ${a} invalid alpha format`);return}if(e?.includes("#")&&(e=e.slice(1)),!/[0-9A-Fa-f]{6}/g.test(e)&&!/[0-9A-Fa-f]{3}/g.test(e)&&!/[0-9A-Fa-f]{2}/g.test(e)){console.warn(`hexToRgba: ${e} invalid hexadecimal format`);return}const t=e.length;t<6&&(e=e.slice(0,6-t).repeat(6/t));const c=parseInt(e.length===3?e.slice(0,1).repeat(2):e.slice(0,2),16),r=parseInt(e.length===3?e.slice(1,2).repeat(2):e.slice(2,4),16),n=parseInt(e.length===3?e.slice(2,3).repeat(2):e.slice(4,6),16);return[c,r,n,a*255]}const A=new Map(Object.entries(b).map(([e,a])=>[e.toLowerCase(),a]));function E(e){const a=A.get(e.toLowerCase());if(!a){console.warn(`paletteToHex: ${e} unknown palette`);return}return a.slice()}function g(e,{withPrefix:a=!0}={}){if(!e?.length){console.warn("rgbaToHex: invalid array or empty values");return}if(e.some(r=>r<0||r>255)){console.warn(`rgbaToHex: [${e.toString()}] invalid array value format`);return}const c=e.map(r=>r.toString(16).padStart(2,"0")).join("");return`${a?"#":""}${c}`}function F(e,a){let t;return(...r)=>{clearTimeout(t),t=setTimeout(()=>e(...r),a)}}const f={NUMBER:{style:"decimal",maximumFractionDigits:1,minimumFractionDigits:0,notation:"compact",compactDisplay:"short"},CURRENCY:{style:"currency",currency:"USD",maximumFractionDigits:2,minimumFractionDigits:2,notation:"compact",compactDisplay:"short"},DATE:{year:"numeric",month:"2-digit",day:"2-digit"}};function D(e,a,t={}){const r=t.dateStyle!==void 0||t.timeStyle!==void 0?t:{...f.DATE,...t};return Intl.DateTimeFormat(a,r).format(e)}function s(e,a,t){return Intl.NumberFormat(a,t).format(e)}function m(e,a,t={}){return s(e,a,{...f.NUMBER,...t})}function T(e,a,t={}){return s(e,a,{...f.CURRENCY,...t})}function o(e,{format:a="NFD",replaceUnicode:t="[̀-ͯ]"}={}){const c=new RegExp(t,"g");return e.normalize(a).replace(c,"")}function p(e,a,{matchFn:t,normalizeOptions:c}={}){let r=e;return typeof e=="string"&&(r=new RegExp(o(e.toLowerCase(),c),"gi")),Array.isArray(a)?a.filter(n=>{const i=t?t(n):n;return o(i).match(r)}):o(a).match(r)?a:null}const y=/:+[a-z]+/gi;function B(e,a=[]){let t=e;const c=t.match(y)??[],r=Array.isArray(a);return c.forEach((n,i)=>{let d;if(r)d=a[i];else{const u=n.substring(1);d=a[u]}t=t.replace(n,d?.toString()??"")}),t}exports.CARTO_PALETTES=b;exports.DEFAULT_FORMATTERS_CONFIG=f;exports.copy=l;exports.debounce=F;exports.formatCurrency=T;exports.formatDate=D;exports.formatNumber=m;exports.hexToRgba=C;exports.matchText=p;exports.normalize=o;exports.paletteToHex=E;exports.replaceRoute=B;exports.rgbaToHex=g;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/clipboard/copy.ts","../src/colors/hex-to-rgba/hex-to-rgba.ts","../src/colors/rgba-to-hex/rgba-to-hex.ts","../src/debounce/debounce.ts","../src/formatters/constants.ts","../src/formatters/date/format-date.ts","../src/formatters/number/format-number.ts","../src/strings/normalize/normalize.ts","../src/strings/match-text/match-text.ts","../src/strings/routes/replace-route.ts"],"sourcesContent":["/**\n * This function is a helper function to copy text to the clipboard.\n *\n * @param {string} text - The text to copy to the clipboard.\n *\n * @returns {void}\n *\n *\n * @example\n * ```ts\n * copy('Hello world!')\n * ```\n */\nexport async function copy(text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text)\n } catch (e: unknown) {\n throw new Error(e as string) // copy failed.\n }\n}\n","/**\n * It converts a hexadecimal color to an array of numbers\n *\n * @param {string} hexadecimal - hexadecimal string, including # or not\n * @param {number} alpha - opacity of final color, value must be between 0-1\n *\n * @returns An array of numbers.\n *\n * @example\n *\n * 6 digits hexadecimal:\n * ```ts\n * hexToRgba('#d1d1d1', 1)\n * ```\n * 3 digits hexadecimal:\n * ```ts\n * hexToRgba('#d1d', 1)\n * ```\n * 2 digits hexadecimal:\n * ```ts\n * hexToRgba('#d1', 1)\n * ```\n */\nexport function hexToRgba(\n hexadecimal: string,\n alpha = 1,\n): [number, number, number, number] | undefined {\n if (!hexadecimal) {\n // eslint-disable-next-line no-console\n console.warn(`hexToRgba: ${hexadecimal} invalid hexadecimal format`)\n return\n }\n if (alpha < 0 || alpha > 1) {\n // eslint-disable-next-line no-console\n console.warn(`hexToRgba: ${alpha} invalid alpha format`)\n return\n }\n if (hexadecimal?.includes('#')) {\n hexadecimal = hexadecimal.slice(1)\n }\n if (\n !/[0-9A-Fa-f]{6}/g.test(hexadecimal) &&\n !/[0-9A-Fa-f]{3}/g.test(hexadecimal) &&\n !/[0-9A-Fa-f]{2}/g.test(hexadecimal)\n ) {\n // eslint-disable-next-line no-console\n console.warn(`hexToRgba: ${hexadecimal} invalid hexadecimal format`)\n return\n }\n\n const length = hexadecimal.length\n\n if (length < 6) {\n hexadecimal = hexadecimal.slice(0, 6 - length).repeat(6 / length)\n }\n\n const r = parseInt(\n hexadecimal.length === 3\n ? hexadecimal.slice(0, 1).repeat(2)\n : hexadecimal.slice(0, 2),\n 16,\n )\n const g = parseInt(\n hexadecimal.length === 3\n ? hexadecimal.slice(1, 2).repeat(2)\n : hexadecimal.slice(2, 4),\n 16,\n )\n const b = parseInt(\n hexadecimal.length === 3\n ? hexadecimal.slice(2, 3).repeat(2)\n : hexadecimal.slice(4, 6),\n 16,\n )\n return [r, g, b, alpha * 255]\n}\n","import type { RgbaToHexOptions } from './types'\n\n/**\n * It converts an array of RGBA values to a hexadecimal string.\n *\n * @param {number[]} rgba - rgba array, including alpha or not\n * @param {RgbaToHexOptions} options - options to parse\n *\n * @returns A string\n *\n * @example\n *\n * Without alpha value:\n * ```ts\n * rgbaDeckGLToHex([0, 0, 0]) // => '#000000'\n * ```\n *\n * With alpha value:\n * ```ts\n * rgbaDeckGLToHex([0, 0, 0, 1]) // => '#000000FF'\n * ```\n *\n * Without prefix:\n * ```ts\n * rgbaDeckGLToHex([0, 0, 0], { withPrefix: false }) // => '000000'\n * ```\n *\n */\nexport function rgbaToHex(\n rgba: number[] | undefined,\n { withPrefix = true }: RgbaToHexOptions = {},\n): string | undefined {\n if (!rgba?.length) {\n // eslint-disable-next-line no-console\n console.warn(`rgbaToHex: invalid array or empty values`)\n return\n }\n\n const hasInvalidValue = rgba.some((value) => value < 0 || value > 255)\n if (hasInvalidValue) {\n // eslint-disable-next-line no-console\n console.warn(`rgbaToHex: [${rgba.toString()}] invalid array value format`)\n return\n }\n\n const hexadecimal = rgba\n .map((value) => {\n const hex = value.toString(16)\n return hex.padStart(2, '0')\n })\n .join('')\n\n return `${withPrefix ? '#' : ''}${hexadecimal}`\n}\n","/**\n * Returns a debounced version of the provided function.\n * @param func - The function to debounce.\n * @param {number} waitFor - The number of milliseconds to wait before invoking the debounced function.\n * @returns A debounced version of the provided function.\n */\nexport function debounce<F extends (...args: unknown[]) => unknown>(\n func: F,\n waitFor: number,\n): (...args: Parameters<F>) => ReturnType<F> {\n const timeout = 0\n\n const debounced = (...args: Parameters<F>) => {\n clearTimeout(timeout)\n setTimeout(() => func(...args), waitFor)\n }\n\n return debounced as (...args: Parameters<F>) => ReturnType<F>\n}\n","export const DEFAULT_FORMATTERS_CONFIG: Record<\n string,\n Intl.NumberFormatOptions | Intl.DateTimeFormatOptions\n> = {\n NUMBER: {\n style: 'decimal',\n maximumFractionDigits: 1,\n minimumFractionDigits: 0,\n notation: 'compact',\n compactDisplay: 'short',\n },\n\n CURRENCY: {\n style: 'currency',\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n notation: 'compact',\n compactDisplay: 'short',\n },\n DATE: {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n },\n} as const\n","/**\n * Formats a Date or number to a string based on the given options.\n * This function could be used to format a Date, in Date format or miliseconds, in specific locale and options.\n * @public\n *\n * @export\n * @param {number | Date} value\n * @param {string | string[]} locales\n * @param {Intl.DateTimeFormatOptions} [options]\n * @return {string}\n */\nexport function formatDate(\n value: number | Date,\n locales: string | string[],\n options?: Intl.DateTimeFormatOptions,\n): string {\n return Intl.DateTimeFormat(locales, options).format(value)\n}\n","import { DEFAULT_FORMATTERS_CONFIG } from '../constants'\n\n/**\n * Formats a number to a string based on the given options.\n * This function could be used to format a number as a percentage, currency or unit in specific locale.\n * @public\n *\n * @example\n *\n * Without specific locale:\n * ```ts\n * format(3001) // => '3,001'\n * ```\n *\n * With specific locale:\n * ```ts\n * format(3001, 'es-ES') // => '3001'\n * ```\n *\n * With specific style:\n * ```ts\n * format(45, 'es-ES', {\n * style: 'unit',\n * unit: 'liter',\n * unitDisplay: 'long',\n * }) // => '45 litros'\n * ```\n *\n * @export\n * @param {number} value - The number to be formatted.\n * @param {string} [locale] - The locale to be used.\n * @param {Intl.NumberFormatOptions} [options] - The options to be used.\n * @return {string}\n */\nfunction format(\n value: number,\n locale: string,\n options?: Intl.NumberFormatOptions,\n): string {\n return Intl.NumberFormat(locale, options).format(value)\n}\n\n/**\n * Formats a number to a string.\n * @public\n *\n * @example\n *\n * ```ts\n * formatNumber(3001, 'es-ES') // => '3 mil'\n * ```\n *\n * @export\n * @param {number} value - The number to be formatted.\n * @param {string} locale - The locale to be used.\n * @param {Intl.NumberFormatOptions} [options] - The options to be used.\n * @return {string}\n */\nexport function formatNumber(\n value: number,\n locale: string,\n options: Intl.NumberFormatOptions = {},\n): string {\n return format(value, locale, {\n ...DEFAULT_FORMATTERS_CONFIG.NUMBER,\n ...options,\n })\n}\n\n/**\n * Formats a number to a currency string.\n * @public\n *\n * @example\n *\n * ```ts\n * formatCurrency(3001, 'en-US') // => '$3.00K'\n * ```\n *\n * @export\n * @param {number} value - The number to be formatted.\n * @param {string} locale - The locale to be used.\n * @param {Intl.NumberFormatOptions} [options] - The options to be used.\n * @return {string}\n */\nexport function formatCurrency(\n value: number,\n locale: string,\n options: Intl.NumberFormatOptions = {},\n): string {\n return format(value, locale, {\n ...DEFAULT_FORMATTERS_CONFIG.CURRENCY,\n ...options,\n })\n}\n","import type { NormalizeOptions } from './types'\n\n/**\n * It takes a string and returns a string normalized.\n * @param {string} data - The data to be normalized.\n * @param {NormalizeOptions} options - data - The string to be normalized.\n * @returns A string\n *\n * @remarks\n * The normalization by default is NFD\n *\n * @example\n *\n * ```ts\n * normalize('foo bar')\n * ```\n *\n */\nexport function normalize(\n data: string,\n { format = 'NFD', replaceUnicode = '[\\u0300-\\u036f]' }: NormalizeOptions = {},\n): string {\n const unicode = new RegExp(replaceUnicode, 'g')\n return data.normalize(format).replace(unicode, '')\n}\n","import type { MatchTextOptions } from './types'\nimport { normalize } from '../normalize/normalize'\n\n/**\n * It takes a string, an array of strings, and an optional object of options, and returns an\n * array of strings that match the input string\n * @param {string | RegExp} text - The text to match against.\n * @param {T[] | string} data - The data to match against.\n * @param {MatchTextOptions} options - The options to use.\n *\n * @returns {T[] | string | null} - The matched data or null.\n *\n */\nexport function matchText<T>(\n value: string | RegExp,\n data: T[] | string,\n { matchFn, normalizeOptions }: MatchTextOptions<T> = {},\n): T[] | string | null {\n let regex = value\n if (typeof value === 'string') {\n regex = new RegExp(normalize(value.toLowerCase(), normalizeOptions), 'gi')\n }\n\n if (!Array.isArray(data)) {\n return normalize(data).match(regex) ? data : null\n }\n\n return data.filter((match) => {\n const newData = (matchFn ? matchFn(match) : match) as string\n return normalize(newData).match(regex)\n })\n}\n","import type { Route, Values } from './types'\n\nconst regex = /:+[a-z]+/gi\n\n/**\n * Replace route with values from array or object.\n * @param {Route} data\n * @param {Values} values\n *\n * @returns {Route}\n *\n * @example\n * ```ts\n * replaceRoute('/user/:id', { id: 1 }) // /user/1\n * replaceRoute('/user/:id/:name', [1, 'John']) // /user/1/John\n * ```\n *\n * @remarks\n * This function is used to replace the route with the values from the array or object. If the values are not found, it will replace it with `undefined`.\n *\n * ```ts\n * replaceRoute('/user/:id/:name', [1]) // /user/1/undefined\n * ```\n *\n **/\nexport function replaceRoute(data: Route, values: Values = []): Route {\n let _data = data\n const templates = _data.match(regex) ?? []\n const isArray = Array.isArray(values)\n\n templates.forEach((template, index) => {\n let value\n if (!isArray) {\n const key = template.substring(1)\n value = values[key]\n } else {\n value = values[index]\n }\n _data = _data.replace(template, value?.toString() ?? '')\n })\n\n return _data\n}\n"],"names":["copy","text","e","hexToRgba","hexadecimal","alpha","length","r","g","b","rgbaToHex","rgba","withPrefix","value","debounce","func","waitFor","args","DEFAULT_FORMATTERS_CONFIG","formatDate","locales","options","format","locale","formatNumber","formatCurrency","normalize","data","replaceUnicode","unicode","matchText","matchFn","normalizeOptions","regex","match","newData","replaceRoute","values","_data","templates","isArray","template","index","key"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/clipboard/copy.ts","../src/colors/carto-palettes/carto-palettes.ts","../src/colors/hex-to-rgba/hex-to-rgba.ts","../src/colors/palette-to-hex/palette-to-hex.ts","../src/colors/rgba-to-hex/rgba-to-hex.ts","../src/debounce/debounce.ts","../src/formatters/constants.ts","../src/formatters/date/format-date.ts","../src/formatters/number/format-number.ts","../src/strings/normalize/normalize.ts","../src/strings/match-text/match-text.ts","../src/strings/routes/replace-route.ts"],"sourcesContent":["/**\n * Asynchronously copies text content to the user's clipboard using the Clipboard API.\n *\n * @param text - The text content to copy to the clipboard.\n * @returns A promise that resolves when the text is successfully copied, or rejects with an error.\n *\n * @example\n * ```ts\n * await copy('Hello world!')\n * ```\n */\nexport async function copy(text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text)\n } catch (e: unknown) {\n throw new Error(e as string) // copy failed.\n }\n}\n","/**\n * CARTOColors palettes (name -> hex ramp), full CARTO-native set: sequential\n * (incl. aggregation), diverging and qualitative. Each entry is the palette's\n * largest class-count ramp, verbatim. Kept inline so the package stays\n * zero-dependency; ColorBrewer (`cb_*`) palettes are intentionally excluded.\n *\n * Data: CARTOColors - https://github.com/CartoDB/cartocolor - CC-BY-4.0.\n * Generated from cartocolor@5.0.2 (unmodified beyond taking each max ramp).\n */\nexport const CARTO_PALETTES = {\n // Sequential (+ aggregation)\n ag_GrnYl: [\n '#245668',\n '#0F7279',\n '#0D8F81',\n '#39AB7E',\n '#6EC574',\n '#A9DC67',\n '#EDEF5D',\n ],\n ag_Sunset: [\n '#4b2991',\n '#872ca2',\n '#c0369d',\n '#ea4f88',\n '#fa7876',\n '#f6a97a',\n '#edd9a3',\n ],\n BluGrn: [\n '#c4e6c3',\n '#96d2a4',\n '#6dbc90',\n '#4da284',\n '#36877a',\n '#266b6e',\n '#1d4f60',\n ],\n BluYl: [\n '#f7feae',\n '#b7e6a5',\n '#7ccba2',\n '#46aea0',\n '#089099',\n '#00718b',\n '#045275',\n ],\n BrwnYl: [\n '#ede5cf',\n '#e0c2a2',\n '#d39c83',\n '#c1766f',\n '#a65461',\n '#813753',\n '#541f3f',\n ],\n Burg: [\n '#ffc6c4',\n '#f4a3a8',\n '#e38191',\n '#cc607d',\n '#ad466c',\n '#8b3058',\n '#672044',\n ],\n BurgYl: [\n '#fbe6c5',\n '#f5ba98',\n '#ee8a82',\n '#dc7176',\n '#c8586c',\n '#9c3f5d',\n '#70284a',\n ],\n DarkMint: [\n '#d2fbd4',\n '#a5dbc2',\n '#7bbcb0',\n '#559c9e',\n '#3a7c89',\n '#235d72',\n '#123f5a',\n ],\n Emrld: [\n '#d3f2a3',\n '#97e196',\n '#6cc08b',\n '#4c9b82',\n '#217a79',\n '#105965',\n '#074050',\n ],\n Magenta: [\n '#f3cbd3',\n '#eaa9bd',\n '#dd88ac',\n '#ca699d',\n '#b14d8e',\n '#91357d',\n '#6c2167',\n ],\n Mint: [\n '#e4f1e1',\n '#b4d9cc',\n '#89c0b6',\n '#63a6a0',\n '#448c8a',\n '#287274',\n '#0d585f',\n ],\n OrYel: [\n '#ecda9a',\n '#efc47e',\n '#f3ad6a',\n '#f7945d',\n '#f97b57',\n '#f66356',\n '#ee4d5a',\n ],\n Peach: [\n '#fde0c5',\n '#facba6',\n '#f8b58b',\n '#f59e72',\n '#f2855d',\n '#ef6a4c',\n '#eb4a40',\n ],\n PinkYl: [\n '#fef6b5',\n '#ffdd9a',\n '#ffc285',\n '#ffa679',\n '#fa8a76',\n '#f16d7a',\n '#e15383',\n ],\n Purp: [\n '#f3e0f7',\n '#e4c7f1',\n '#d1afe8',\n '#b998dd',\n '#9f82ce',\n '#826dba',\n '#63589f',\n ],\n PurpOr: [\n '#f9ddda',\n '#f2b9c4',\n '#e597b9',\n '#ce78b3',\n '#ad5fad',\n '#834ba0',\n '#573b88',\n ],\n RedOr: [\n '#f6d2a9',\n '#f5b78e',\n '#f19c7c',\n '#ea8171',\n '#dd686c',\n '#ca5268',\n '#b13f64',\n ],\n Sunset: [\n '#f3e79b',\n '#fac484',\n '#f8a07e',\n '#eb7f86',\n '#ce6693',\n '#a059a0',\n '#5c53a5',\n ],\n SunsetDark: [\n '#fcde9c',\n '#faa476',\n '#f0746e',\n '#e34f6f',\n '#dc3977',\n '#b9257a',\n '#7c1d6f',\n ],\n Teal: [\n '#d1eeea',\n '#a8dbd9',\n '#85c4c9',\n '#68abb8',\n '#4f90a6',\n '#3b738f',\n '#2a5674',\n ],\n TealGrn: [\n '#b0f2bc',\n '#89e8ac',\n '#67dba5',\n '#4cc8a3',\n '#38b2a3',\n '#2c98a0',\n '#257d98',\n ],\n\n // Diverging\n ArmyRose: [\n '#798234',\n '#a3ad62',\n '#d0d3a2',\n '#fdfbe4',\n '#f0c6c3',\n '#df91a3',\n '#d46780',\n ],\n Earth: [\n '#A16928',\n '#bd925a',\n '#d6bd8d',\n '#edeac2',\n '#b5c8b8',\n '#79a7ac',\n '#2887a1',\n ],\n Fall: [\n '#3d5941',\n '#778868',\n '#b5b991',\n '#f6edbd',\n '#edbb8a',\n '#de8a5a',\n '#ca562c',\n ],\n Geyser: [\n '#008080',\n '#70a494',\n '#b4c8a8',\n '#f6edbd',\n '#edbb8a',\n '#de8a5a',\n '#ca562c',\n ],\n TealRose: [\n '#009392',\n '#72aaa1',\n '#b1c7b3',\n '#f1eac8',\n '#e5b9ad',\n '#d98994',\n '#d0587e',\n ],\n Temps: [\n '#009392',\n '#39b185',\n '#9ccb86',\n '#e9e29c',\n '#eeb479',\n '#e88471',\n '#cf597e',\n ],\n Tropic: [\n '#009B9E',\n '#42B7B9',\n '#A7D3D4',\n '#F1F1F1',\n '#E4C1D9',\n '#D691C1',\n '#C75DAB',\n ],\n\n // Qualitative\n Antique: [\n '#855C75',\n '#D9AF6B',\n '#AF6458',\n '#736F4C',\n '#526A83',\n '#625377',\n '#68855C',\n '#9C9C5E',\n '#A06177',\n '#8C785D',\n '#467378',\n '#7C7C7C',\n ],\n Bold: [\n '#7F3C8D',\n '#11A579',\n '#3969AC',\n '#F2B701',\n '#E73F74',\n '#80BA5A',\n '#E68310',\n '#008695',\n '#CF1C90',\n '#f97b72',\n '#4b4b8f',\n '#A5AA99',\n ],\n Pastel: [\n '#66C5CC',\n '#F6CF71',\n '#F89C74',\n '#DCB0F2',\n '#87C55F',\n '#9EB9F3',\n '#FE88B1',\n '#C9DB74',\n '#8BE0A4',\n '#B497E7',\n '#D3B484',\n '#B3B3B3',\n ],\n Prism: [\n '#5F4690',\n '#1D6996',\n '#38A6A5',\n '#0F8554',\n '#73AF48',\n '#EDAD08',\n '#E17C05',\n '#CC503E',\n '#94346E',\n '#6F4070',\n '#994E95',\n '#666666',\n ],\n Safe: [\n '#88CCEE',\n '#CC6677',\n '#DDCC77',\n '#117733',\n '#332288',\n '#AA4499',\n '#44AA99',\n '#999933',\n '#882255',\n '#661100',\n '#6699CC',\n '#888888',\n ],\n Vivid: [\n '#E58606',\n '#5D69B1',\n '#52BCA3',\n '#99C945',\n '#CC61B0',\n '#24796C',\n '#DAA51B',\n '#2F8AC4',\n '#764E9F',\n '#ED645A',\n '#CC3A8E',\n '#A5AA99',\n ],\n} satisfies Record<string, readonly string[]>\n\n/** A known CARTOColors palette name. */\nexport type PaletteName = keyof typeof CARTO_PALETTES\n","/**\n * Converts a hexadecimal color string to an RGBA array, useful for deck.gl layer styling and canvas operations.\n *\n * @param hexadecimal - Hex color string (supports `#ffffff`, `ffffff`, `#fff`, `fff`, `#ff` formats).\n * @param alpha - Opacity level from 0 (transparent) to 1 (opaque). Default is `1`.\n * @returns An `[r, g, b, a]` array with values 0-255, or `undefined` for invalid inputs.\n *\n * @example\n * ```ts\n * hexToRgba('#ff0000', 0.8) // [255, 0, 0, 204]\n * hexToRgba('#f00', 0.5) // [255, 0, 0, 127.5]\n * hexToRgba('00ff00') // [0, 255, 0, 255]\n * ```\n */\nexport function hexToRgba(\n hexadecimal: string,\n alpha = 1,\n): [number, number, number, number] | undefined {\n if (!hexadecimal) {\n // eslint-disable-next-line no-console\n console.warn(`hexToRgba: ${hexadecimal} invalid hexadecimal format`)\n return\n }\n if (alpha < 0 || alpha > 1) {\n // eslint-disable-next-line no-console\n console.warn(`hexToRgba: ${alpha} invalid alpha format`)\n return\n }\n if (hexadecimal?.includes('#')) {\n hexadecimal = hexadecimal.slice(1)\n }\n if (\n !/[0-9A-Fa-f]{6}/g.test(hexadecimal) &&\n !/[0-9A-Fa-f]{3}/g.test(hexadecimal) &&\n !/[0-9A-Fa-f]{2}/g.test(hexadecimal)\n ) {\n // eslint-disable-next-line no-console\n console.warn(`hexToRgba: ${hexadecimal} invalid hexadecimal format`)\n return\n }\n\n const length = hexadecimal.length\n\n if (length < 6) {\n hexadecimal = hexadecimal.slice(0, 6 - length).repeat(6 / length)\n }\n\n const r = parseInt(\n hexadecimal.length === 3\n ? hexadecimal.slice(0, 1).repeat(2)\n : hexadecimal.slice(0, 2),\n 16,\n )\n const g = parseInt(\n hexadecimal.length === 3\n ? hexadecimal.slice(1, 2).repeat(2)\n : hexadecimal.slice(2, 4),\n 16,\n )\n const b = parseInt(\n hexadecimal.length === 3\n ? hexadecimal.slice(2, 3).repeat(2)\n : hexadecimal.slice(4, 6),\n 16,\n )\n return [r, g, b, alpha * 255]\n}\n","import {\n CARTO_PALETTES,\n type PaletteName,\n} from '../carto-palettes/carto-palettes'\n\n/** Lowercased name → ramp, for case-insensitive resolution. */\nconst PALETTES_BY_LOWER = new Map<string, readonly string[]>(\n Object.entries(CARTO_PALETTES).map(([name, colors]) => [\n name.toLowerCase(),\n colors,\n ]),\n)\n\n/**\n * Resolves a CARTOColors palette name to its hex ramp.\n *\n * Matching is case-insensitive (`'sunset'` resolves `'Sunset'`). Returns the\n * palette's largest class-count ramp. To get RGBA tuples, compose with\n * `hexToRgba`: `paletteToHex('Sunset')?.map((hex) => hexToRgba(hex))`.\n *\n * @param name - CARTOColors palette name (e.g. `'Sunset'`), any casing.\n * @returns A fresh `string[]` of hex stops (a copy — safe to mutate), or\n * `undefined` for an unknown palette.\n *\n * @example\n * ```ts\n * paletteToHex('Sunset') // ['#f3e79b', …, '#5c53a5']\n * paletteToHex('sunset') // ['#f3e79b', …, '#5c53a5']\n * ```\n */\nexport function paletteToHex(\n // `PaletteName | (string & {})` keeps autocomplete for known names while\n // still accepting arbitrary casing (which isn't a `PaletteName` literal).\n name: PaletteName | (string & {}),\n): string[] | undefined {\n // Static snapshot of cartocolor's max class-count ramp per palette; if\n // per-class-count ramps are ever needed, source them from `cartocolor`.\n const hexes = PALETTES_BY_LOWER.get(name.toLowerCase())\n if (!hexes) {\n // eslint-disable-next-line no-console\n console.warn(`paletteToHex: ${name} unknown palette`)\n return\n }\n return hexes.slice()\n}\n","import type { RgbaToHexOptions } from './types'\n\n/**\n * Converts an RGBA color array to a hexadecimal string, ideal for converting deck.gl colors to CSS-compatible format.\n *\n * @param rgba - Array of RGBA values (each 0-255). Accepts `[r, g, b]` or `[r, g, b, a]`.\n * @param options - Options including `withPrefix` to control `#` prefix (default: `true`).\n * @returns The hex color string, or `undefined` for invalid inputs.\n *\n * @example\n * ```ts\n * rgbaToHex([255, 0, 0]) // '#ff0000'\n * rgbaToHex([255, 0, 0, 128]) // '#ff000080'\n * rgbaToHex([0, 255, 0], { withPrefix: false }) // '00ff00'\n * ```\n */\nexport function rgbaToHex(\n rgba: number[] | undefined,\n { withPrefix = true }: RgbaToHexOptions = {},\n): string | undefined {\n if (!rgba?.length) {\n // eslint-disable-next-line no-console\n console.warn(`rgbaToHex: invalid array or empty values`)\n return\n }\n\n const hasInvalidValue = rgba.some((value) => value < 0 || value > 255)\n if (hasInvalidValue) {\n // eslint-disable-next-line no-console\n console.warn(`rgbaToHex: [${rgba.toString()}] invalid array value format`)\n return\n }\n\n const hexadecimal = rgba\n .map((value) => {\n const hex = value.toString(16)\n return hex.padStart(2, '0')\n })\n .join('')\n\n return `${withPrefix ? '#' : ''}${hexadecimal}`\n}\n","/**\n * Creates a debounced version of a function that delays execution until after the specified wait time has elapsed since the last invocation.\n *\n * @param func - The function to debounce.\n * @param waitFor - The delay in milliseconds to wait before executing.\n * @returns A debounced version of the provided function.\n *\n * @example\n * ```ts\n * const debouncedSearch = debounce((query: string) => {\n * fetchResults(query)\n * }, 300)\n *\n * debouncedSearch('hello') // Only executes after 300ms of inactivity\n * ```\n */\nexport function debounce<F extends (...args: unknown[]) => unknown>(\n func: F,\n waitFor: number,\n): (...args: Parameters<F>) => ReturnType<F> {\n let timeout: ReturnType<typeof setTimeout>\n\n const debounced = (...args: Parameters<F>) => {\n clearTimeout(timeout)\n timeout = setTimeout(() => func(...args), waitFor)\n }\n\n return debounced as (...args: Parameters<F>) => ReturnType<F>\n}\n","/**\n * Default configuration options for the formatter utilities (`formatNumber`, `formatCurrency`, `formatDate`).\n *\n * @remarks\n * Contains preset `Intl.NumberFormatOptions` and `Intl.DateTimeFormatOptions` for three keys:\n * - `NUMBER` - Compact decimal notation with 1 fraction digit.\n * - `CURRENCY` - Compact USD currency with 2 fraction digits.\n * - `DATE` - Numeric year, 2-digit month and day.\n *\n * @example\n * ```ts\n * import { DEFAULT_FORMATTERS_CONFIG } from '@carto/ps-utils'\n *\n * // Override defaults for a custom number format\n * const options = { ...DEFAULT_FORMATTERS_CONFIG.NUMBER, maximumFractionDigits: 3 }\n * ```\n */\nexport type DefaultFormatterKey = 'NUMBER' | 'CURRENCY' | 'DATE'\n\nexport const DEFAULT_FORMATTERS_CONFIG: Record<\n string,\n Intl.NumberFormatOptions | Intl.DateTimeFormatOptions\n> & {\n NUMBER: Intl.NumberFormatOptions\n CURRENCY: Intl.NumberFormatOptions\n DATE: Intl.DateTimeFormatOptions\n} = {\n NUMBER: {\n style: 'decimal',\n maximumFractionDigits: 1,\n minimumFractionDigits: 0,\n notation: 'compact',\n compactDisplay: 'short',\n },\n\n CURRENCY: {\n style: 'currency',\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n notation: 'compact',\n compactDisplay: 'short',\n },\n DATE: {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n },\n}\n","import { DEFAULT_FORMATTERS_CONFIG } from '../constants'\n\n/**\n * Formats a date or timestamp according to locale-specific conventions using the `Intl.DateTimeFormat` API.\n *\n * @param value - The date to format (Date object or timestamp in milliseconds).\n * @param locales - Locale identifier(s) for formatting (e.g., `'en-US'`, `'fr-FR'`).\n * @param options - Date/time formatting options to override the defaults (numeric year, 2-digit month and day).\n * When `dateStyle` or `timeStyle` is provided the defaults are not applied, as they are incompatible with\n * individual date/time component options.\n * @returns The formatted date string.\n *\n * @example\n * ```ts\n * formatDate(new Date('2024-03-15'), 'en-US') // \"03/15/2024\"\n * formatDate(new Date('2024-03-15'), 'en-US', { month: 'long' }) // \"March 15, 2024\"\n * ```\n */\nexport function formatDate(\n value: number | Date,\n locales: string | string[],\n options: Intl.DateTimeFormatOptions = {},\n): string {\n const hasStyle = options.dateStyle !== undefined || options.timeStyle !== undefined\n\n const formatterOptions: Intl.DateTimeFormatOptions = hasStyle\n ? options\n : {\n ...DEFAULT_FORMATTERS_CONFIG.DATE,\n ...options,\n }\n\n return Intl.DateTimeFormat(locales, formatterOptions).format(value)\n}\n","import { DEFAULT_FORMATTERS_CONFIG } from '../constants'\n\n/**\n * Formats a number using `Intl.NumberFormat` with the given locale and options.\n *\n * @param value - The number to format.\n * @param locale - The locale identifier (e.g., `'en-US'`, `'es-ES'`).\n * @param options - `Intl.NumberFormatOptions` for customization (style, unit, etc.).\n * @returns The formatted number string.\n */\nfunction format(\n value: number,\n locale: string,\n options?: Intl.NumberFormatOptions,\n): string {\n return Intl.NumberFormat(locale, options).format(value)\n}\n\n/**\n * Formats a number with locale-aware separators, compact notation, and customizable precision.\n *\n * @param value - The number to format.\n * @param locale - The locale identifier (e.g., `'en-US'`, `'es-ES'`).\n * @param options - `Intl.NumberFormatOptions` to override the defaults (compact decimal with 1 fraction digit).\n * @returns The formatted number string.\n *\n * @example\n * ```ts\n * formatNumber(123456, 'en-US') // \"123.5K\"\n * formatNumber(1234567, 'en-US') // \"1.2M\"\n * formatNumber(123456, 'es-ES') // \"123 mil\"\n * ```\n */\nexport function formatNumber(\n value: number,\n locale: string,\n options: Intl.NumberFormatOptions = {},\n): string {\n return format(value, locale, {\n ...DEFAULT_FORMATTERS_CONFIG.NUMBER,\n ...options,\n })\n}\n\n/**\n * Formats a number as a currency value with proper symbols and regional conventions.\n *\n * @param value - The monetary value to format.\n * @param locale - The locale identifier (e.g., `'en-US'`, `'fr-FR'`).\n * @param options - `Intl.NumberFormatOptions` to override the defaults (compact USD with 2 fraction digits).\n * @returns The formatted currency string.\n *\n * @example\n * ```ts\n * formatCurrency(123456, 'en-US') // \"$123.46K\"\n * formatCurrency(123456, 'fr-FR', { currency: 'EUR' }) // \"123,46 k €\"\n * ```\n */\nexport function formatCurrency(\n value: number,\n locale: string,\n options: Intl.NumberFormatOptions = {},\n): string {\n return format(value, locale, {\n ...DEFAULT_FORMATTERS_CONFIG.CURRENCY,\n ...options,\n })\n}\n","import type { NormalizeOptions } from './types'\n\n/**\n * Normalizes a Unicode string by removing diacritics and special characters for consistent text comparison.\n *\n * @param data - The string to normalize.\n * @param options - Normalization options including Unicode form and replacement pattern.\n * @returns The normalized string with diacritics removed.\n *\n * @example\n * ```ts\n * normalize('café') // 'cafe'\n * normalize('São Paulo') // 'Sao Paulo'\n * ```\n */\nexport function normalize(\n data: string,\n { format = 'NFD', replaceUnicode = '[\\u0300-\\u036f]' }: NormalizeOptions = {},\n): string {\n const unicode = new RegExp(replaceUnicode, 'g')\n return data.normalize(format).replace(unicode, '')\n}\n","import type { MatchTextOptions } from './types'\nimport { normalize } from '../normalize/normalize'\n\n/**\n * Performs intelligent text matching with optional Unicode normalization and custom matching functions.\n *\n * @param value - The text or RegExp pattern to match against.\n * @param data - The data to search (array of items or a single string).\n * @param options - Optional configuration for custom match function and normalization.\n * @returns Matched items from an array, the original string if it matches, or `null`.\n *\n * @example\n * ```ts\n * matchText('york', ['New York', 'Los Angeles']) // ['New York']\n * matchText('barce', locations, { matchFn: (item) => item.name })\n * ```\n */\nexport function matchText<T>(\n value: string | RegExp,\n data: T[] | string,\n { matchFn, normalizeOptions }: MatchTextOptions<T> = {},\n): T[] | string | null {\n let regex = value\n if (typeof value === 'string') {\n regex = new RegExp(normalize(value.toLowerCase(), normalizeOptions), 'gi')\n }\n\n if (!Array.isArray(data)) {\n return normalize(data).match(regex) ? data : null\n }\n\n return data.filter((match) => {\n const newData = (matchFn ? matchFn(match) : match) as string\n return normalize(newData).match(regex)\n })\n}\n","import type { Route, Values } from './types'\n\nconst regex = /:+[a-z]+/gi\n\n/**\n * Dynamically replaces route parameters (`:paramName`) with values from an object or array.\n *\n * @param data - The route template string containing `:paramName` placeholders.\n * @param values - An object or array of values to substitute into the route.\n * @returns The route string with parameters replaced.\n *\n * @remarks\n * Missing values are replaced with an empty string.\n *\n * @example\n * ```ts\n * replaceRoute('/user/:id', { id: '123' }) // '/user/123'\n * replaceRoute('/tiles/:z/:x/:y', { z: 10, x: 512, y: 256 }) // '/tiles/10/512/256'\n * replaceRoute('/user/:id/:name', ['123', 'john']) // '/user/123/john'\n * ```\n */\nexport function replaceRoute(data: Route, values: Values = []): Route {\n let _data = data\n const templates = _data.match(regex) ?? []\n const isArray = Array.isArray(values)\n\n templates.forEach((template, index) => {\n let value\n if (!isArray) {\n const key = template.substring(1)\n value = values[key]\n } else {\n value = values[index]\n }\n _data = _data.replace(template, value?.toString() ?? '')\n })\n\n return _data\n}\n"],"names":["copy","text","e","CARTO_PALETTES","hexToRgba","hexadecimal","alpha","length","r","g","b","PALETTES_BY_LOWER","name","colors","paletteToHex","hexes","rgbaToHex","rgba","withPrefix","value","debounce","func","waitFor","timeout","args","DEFAULT_FORMATTERS_CONFIG","formatDate","locales","options","formatterOptions","format","locale","formatNumber","formatCurrency","normalize","data","replaceUnicode","unicode","matchText","matchFn","normalizeOptions","regex","match","newData","replaceRoute","values","_data","templates","isArray","template","index","key"],"mappings":"gFAWA,eAAsBA,EAAKC,EAA6B,CACtD,GAAI,CACF,MAAM,UAAU,UAAU,UAAUA,CAAI,CAC1C,OAASC,EAAY,CACnB,MAAM,IAAI,MAAMA,CAAW,CAC7B,CACF,CCRO,MAAMC,EAAiB,CAE5B,SAAU,CACR,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,UAAW,CACT,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,SAAU,CACR,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,QAAS,CACP,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,WAAY,CACV,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,QAAS,CACP,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAIF,SAAU,CACR,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,SAAU,CACR,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAIF,QAAS,CACP,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,EAEF,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SAAA,CAEJ,ECjVO,SAASC,EACdC,EACAC,EAAQ,EACsC,CAC9C,GAAI,CAACD,EAAa,CAEhB,QAAQ,KAAK,cAAcA,CAAW,6BAA6B,EACnE,MACF,CACA,GAAIC,EAAQ,GAAKA,EAAQ,EAAG,CAE1B,QAAQ,KAAK,cAAcA,CAAK,uBAAuB,EACvD,MACF,CAIA,GAHID,GAAa,SAAS,GAAG,IAC3BA,EAAcA,EAAY,MAAM,CAAC,GAGjC,CAAC,kBAAkB,KAAKA,CAAW,GACnC,CAAC,kBAAkB,KAAKA,CAAW,GACnC,CAAC,kBAAkB,KAAKA,CAAW,EACnC,CAEA,QAAQ,KAAK,cAAcA,CAAW,6BAA6B,EACnE,MACF,CAEA,MAAME,EAASF,EAAY,OAEvBE,EAAS,I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"}