{"version":3,"sources":["../src/slugify.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { remove as stripAccents } from 'diacritics';\n\nfunction getSafeRegexpString(input: string): string {\n  return input\n    .split(\"\")\n    .map((char) => `\\\\${char}`)\n    .join(\"\");\n}\n\n/**\n * Format a string by removing spaces, non-alphabetical caracters and by\n * adding delimiter\n */\nfunction format(\n  input: string,\n  delimiter: string,\n  ignoreInvalid = false\n): string {\n  const harmonized = stripAccents(input).trim().toLowerCase();\n  const safeDelimiter = getSafeRegexpString(delimiter);\n\n  if (ignoreInvalid) {\n    return harmonized.replace(/\\s+/g, delimiter);\n  }\n\n  return harmonized\n    .replace(new RegExp(`[^a-z0-9${safeDelimiter}]+`, \"g\"), delimiter) // Replace all non-valid caracters by delimiter\n    .replace(new RegExp(`${safeDelimiter}+`, \"g\"), delimiter) // Remove multiple delimiters repetition\n    .replace(new RegExp(`^${safeDelimiter}`, \"g\"), \"\") // remove delimiter at the beginning\n    .replace(new RegExp(`${safeDelimiter}$`, \"g\"), \"\"); // remove delimiter at the end\n};\n\ninterface SlugifyOptions {\n  delimiter?: string;\n  prefix?: string;\n}\n\n/**\n * Slugify a React node\n */\nexport default function slugify(\n  node: ReactNode,\n  options: SlugifyOptions = { delimiter: \"-\", prefix: \"\" }\n): string {\n  if (!options.delimiter) options.delimiter = \"-\";\n  if (!options.prefix) options.prefix = \"\";\n\n  // null, undefined, falsy\n  if (!node || typeof node === \"boolean\") {\n    return \"\";\n  }\n\n  const { delimiter, prefix } = options;\n\n  // boolean\n  if (typeof node === \"boolean\") {\n    return \"\"; // not much we can do here\n  }\n\n  // string, number\n  if (typeof node === \"string\" || typeof node === \"number\" || typeof node === \"bigint\") {\n    const harmonizedPrefix = format(prefix, delimiter, true);\n    const harmonizedNode = format(String(node), delimiter);\n\n    if (harmonizedPrefix) {\n      return `${harmonizedPrefix}${delimiter}${harmonizedNode}`;\n    }\n\n    return harmonizedNode;\n  }\n\n  // ReactPortal\n  if (\"children\" in node) {\n    return slugify(node.children);\n  }\n\n  // ReactElement\n  if (\"props\" in node) {\n    if (typeof node.props !== \"object\" || !node.props) {\n      return \"\";\n    }\n\n    if (\"children\" in node.props)\n\n      return slugify(node.props.children as ReactNode, options);\n  }\n\n  // ReactFragment (including array of nodes)\n  if (Symbol.iterator in node) {\n    return slugify(\n      Array.from(node)\n        .map((subNode) => slugify(subNode, { delimiter }))\n        .join(delimiter),\n      options\n    );\n  }\n\n  if (node instanceof Promise) {\n    throw new Error(\"react-slugify does not support Promises\");\n  }\n\n  // unhandled case\n  return \"\";\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAAuC;AAEvC,SAAS,oBAAoB,OAAuB;AAClD,SAAO,MACJ,MAAM,EAAE,EACR,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EACzB,KAAK,EAAE;AACZ;AAMA,SAAS,OACP,OACA,WACA,gBAAgB,OACR;AACR,QAAM,iBAAa,kBAAAA,QAAa,KAAK,EAAE,KAAK,EAAE,YAAY;AAC1D,QAAM,gBAAgB,oBAAoB,SAAS;AAEnD,MAAI,eAAe;AACjB,WAAO,WAAW,QAAQ,QAAQ,SAAS;AAAA,EAC7C;AAEA,SAAO,WACJ,QAAQ,IAAI,OAAO,WAAW,aAAa,MAAM,GAAG,GAAG,SAAS,EAChE,QAAQ,IAAI,OAAO,GAAG,aAAa,KAAK,GAAG,GAAG,SAAS,EACvD,QAAQ,IAAI,OAAO,IAAI,aAAa,IAAI,GAAG,GAAG,EAAE,EAChD,QAAQ,IAAI,OAAO,GAAG,aAAa,KAAK,GAAG,GAAG,EAAE;AACrD;AAUe,SAAR,QACL,MACA,UAA0B,EAAE,WAAW,KAAK,QAAQ,GAAG,GAC/C;AACR,MAAI,CAAC,QAAQ,UAAW,SAAQ,YAAY;AAC5C,MAAI,CAAC,QAAQ,OAAQ,SAAQ,SAAS;AAGtC,MAAI,CAAC,QAAQ,OAAO,SAAS,WAAW;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,WAAW,OAAO,IAAI;AAG9B,MAAI,OAAO,SAAS,WAAW;AAC7B,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACpF,UAAM,mBAAmB,OAAO,QAAQ,WAAW,IAAI;AACvD,UAAM,iBAAiB,OAAO,OAAO,IAAI,GAAG,SAAS;AAErD,QAAI,kBAAkB;AACpB,aAAO,GAAG,gBAAgB,GAAG,SAAS,GAAG,cAAc;AAAA,IACzD;AAEA,WAAO;AAAA,EACT;AAGA,MAAI,cAAc,MAAM;AACtB,WAAO,QAAQ,KAAK,QAAQ;AAAA,EAC9B;AAGA,MAAI,WAAW,MAAM;AACnB,QAAI,OAAO,KAAK,UAAU,YAAY,CAAC,KAAK,OAAO;AACjD,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,KAAK;AAErB,aAAO,QAAQ,KAAK,MAAM,UAAuB,OAAO;AAAA,EAC5D;AAGA,MAAI,OAAO,YAAY,MAAM;AAC3B,WAAO;AAAA,MACL,MAAM,KAAK,IAAI,EACZ,IAAI,CAAC,YAAY,QAAQ,SAAS,EAAE,UAAU,CAAC,CAAC,EAChD,KAAK,SAAS;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS;AAC3B,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAGA,SAAO;AACT;","names":["stripAccents"]}