@intlayer/core 8.7.6 → 8.7.8-canary.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 (88) hide show
  1. package/dist/cjs/deepTransformPlugins/getFilterMissingTranslationsContent.cjs.map +1 -1
  2. package/dist/cjs/deepTransformPlugins/getFilterTranslationsOnlyContent.cjs.map +1 -1
  3. package/dist/cjs/deepTransformPlugins/getMultilingualDictionary.cjs.map +1 -1
  4. package/dist/cjs/deepTransformPlugins/getReplacedValuesContent.cjs.map +1 -1
  5. package/dist/cjs/dictionaryManipulator/getEmptyNode.cjs.map +1 -1
  6. package/dist/cjs/dictionaryManipulator/mergeDictionaries.cjs.map +1 -1
  7. package/dist/cjs/dictionaryManipulator/normalizeDictionary.cjs.map +1 -1
  8. package/dist/cjs/formatters/date.cjs.map +1 -1
  9. package/dist/cjs/formatters/percentage.cjs.map +1 -1
  10. package/dist/cjs/interpreter/getContent/deepTransform.cjs.map +1 -1
  11. package/dist/cjs/interpreter/getContent/plugins.cjs.map +1 -1
  12. package/dist/cjs/interpreter/getGender.cjs.map +1 -1
  13. package/dist/cjs/interpreter/getHTML.cjs.map +1 -1
  14. package/dist/cjs/interpreter/getInsertion.cjs.map +1 -1
  15. package/dist/cjs/interpreter/getIntlayer.cjs +3 -0
  16. package/dist/cjs/interpreter/getIntlayer.cjs.map +1 -1
  17. package/dist/cjs/localization/generateSitemap.cjs.map +1 -1
  18. package/dist/cjs/localization/getBrowserLocale.cjs.map +1 -1
  19. package/dist/cjs/localization/getHTMLTextDir.cjs.map +1 -1
  20. package/dist/cjs/localization/getLocale.cjs.map +1 -1
  21. package/dist/cjs/localization/getLocaleName.cjs.map +1 -1
  22. package/dist/cjs/localization/localeDetector.cjs.map +1 -1
  23. package/dist/cjs/localization/rewriteUtils.cjs.map +1 -1
  24. package/dist/cjs/localization/validatePrefix.cjs +4 -0
  25. package/dist/cjs/localization/validatePrefix.cjs.map +1 -1
  26. package/dist/cjs/markdown/compiler.cjs.map +1 -1
  27. package/dist/cjs/markdown/constants.cjs +10 -0
  28. package/dist/cjs/markdown/constants.cjs.map +1 -1
  29. package/dist/cjs/markdown/parser.cjs +1 -1
  30. package/dist/cjs/markdown/parser.cjs.map +1 -1
  31. package/dist/cjs/markdown/utils.cjs.map +1 -1
  32. package/dist/cjs/messageFormat/ICU.cjs.map +1 -1
  33. package/dist/cjs/messageFormat/i18next.cjs.map +1 -1
  34. package/dist/cjs/messageFormat/verify-icu-format.cjs.map +1 -1
  35. package/dist/cjs/messageFormat/vue-i18n.cjs.map +1 -1
  36. package/dist/cjs/transpiler/file/file.cjs.map +1 -1
  37. package/dist/cjs/transpiler/html/getHTMLCustomComponents.cjs.map +1 -1
  38. package/dist/cjs/transpiler/insertion/getInsertionValues.cjs.map +1 -1
  39. package/dist/cjs/transpiler/markdown/getMarkdownMetadata.cjs.map +1 -1
  40. package/dist/cjs/transpiler/markdown/markdown.cjs.map +1 -1
  41. package/dist/cjs/utils/localeStorage.cjs +2 -1
  42. package/dist/cjs/utils/localeStorage.cjs.map +1 -1
  43. package/dist/esm/deepTransformPlugins/getFilterMissingTranslationsContent.mjs.map +1 -1
  44. package/dist/esm/deepTransformPlugins/getFilterTranslationsOnlyContent.mjs.map +1 -1
  45. package/dist/esm/deepTransformPlugins/getMultilingualDictionary.mjs.map +1 -1
  46. package/dist/esm/deepTransformPlugins/getReplacedValuesContent.mjs.map +1 -1
  47. package/dist/esm/dictionaryManipulator/getEmptyNode.mjs.map +1 -1
  48. package/dist/esm/dictionaryManipulator/mergeDictionaries.mjs.map +1 -1
  49. package/dist/esm/dictionaryManipulator/normalizeDictionary.mjs.map +1 -1
  50. package/dist/esm/formatters/date.mjs.map +1 -1
  51. package/dist/esm/formatters/percentage.mjs.map +1 -1
  52. package/dist/esm/interpreter/getContent/deepTransform.mjs.map +1 -1
  53. package/dist/esm/interpreter/getContent/plugins.mjs.map +1 -1
  54. package/dist/esm/interpreter/getGender.mjs.map +1 -1
  55. package/dist/esm/interpreter/getHTML.mjs.map +1 -1
  56. package/dist/esm/interpreter/getInsertion.mjs.map +1 -1
  57. package/dist/esm/interpreter/getIntlayer.mjs +3 -0
  58. package/dist/esm/interpreter/getIntlayer.mjs.map +1 -1
  59. package/dist/esm/localization/generateSitemap.mjs.map +1 -1
  60. package/dist/esm/localization/getBrowserLocale.mjs.map +1 -1
  61. package/dist/esm/localization/getHTMLTextDir.mjs.map +1 -1
  62. package/dist/esm/localization/getLocale.mjs.map +1 -1
  63. package/dist/esm/localization/getLocaleName.mjs.map +1 -1
  64. package/dist/esm/localization/localeDetector.mjs.map +1 -1
  65. package/dist/esm/localization/rewriteUtils.mjs.map +1 -1
  66. package/dist/esm/localization/validatePrefix.mjs +4 -0
  67. package/dist/esm/localization/validatePrefix.mjs.map +1 -1
  68. package/dist/esm/markdown/compiler.mjs.map +1 -1
  69. package/dist/esm/markdown/constants.mjs +10 -0
  70. package/dist/esm/markdown/constants.mjs.map +1 -1
  71. package/dist/esm/markdown/parser.mjs +1 -1
  72. package/dist/esm/markdown/parser.mjs.map +1 -1
  73. package/dist/esm/markdown/utils.mjs.map +1 -1
  74. package/dist/esm/messageFormat/ICU.mjs.map +1 -1
  75. package/dist/esm/messageFormat/i18next.mjs.map +1 -1
  76. package/dist/esm/messageFormat/verify-icu-format.mjs.map +1 -1
  77. package/dist/esm/messageFormat/vue-i18n.mjs.map +1 -1
  78. package/dist/esm/transpiler/file/file.mjs.map +1 -1
  79. package/dist/esm/transpiler/html/getHTMLCustomComponents.mjs.map +1 -1
  80. package/dist/esm/transpiler/insertion/getInsertionValues.mjs.map +1 -1
  81. package/dist/esm/transpiler/markdown/getMarkdownMetadata.mjs.map +1 -1
  82. package/dist/esm/transpiler/markdown/markdown.mjs.map +1 -1
  83. package/dist/esm/utils/localeStorage.mjs +2 -1
  84. package/dist/esm/utils/localeStorage.mjs.map +1 -1
  85. package/dist/types/interpreter/getIntlayer.d.ts.map +1 -1
  86. package/dist/types/utils/localeStorage.d.ts +1 -1
  87. package/dist/types/utils/localeStorage.d.ts.map +1 -1
  88. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"getBrowserLocale.cjs","names":["getLocaleFromStorageClient","localeDetector","internationalization","DEFAULT_LOCALE"],"sources":["../../../src/localization/getBrowserLocale.tsx"],"sourcesContent":["import { internationalization } from '@intlayer/config/built';\nimport { DEFAULT_LOCALE } from '@intlayer/config/defaultValues';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport {\n getLocaleFromStorageClient,\n type LocaleStorageClientOptions,\n} from '../utils/localeStorage';\nimport { localeDetector } from './localeDetector';\n\nexport enum LanguageDetector {\n Querystring = 'querystring',\n Storage = 'storage',\n Navigator = 'navigator',\n HtmlTag = 'htmlTag',\n}\n\nexport const localeStorageOptions: LocaleStorageClientOptions = {\n getCookie: (name: string) =>\n document.cookie\n .split(';')\n .find((c) => c.trim().startsWith(`${name}=`))\n ?.split('=')[1],\n getLocaleStorage: (name: string) => localStorage.getItem(name),\n getSessionStorage: (name: string) => sessionStorage.getItem(name),\n isCookieEnabled: true,\n setCookieStore: (name, value, attributes) =>\n cookieStore.set({\n name,\n value,\n path: attributes.path,\n domain: attributes.domain,\n expires: attributes.expires,\n sameSite: attributes.sameSite,\n }),\n setCookieString: (_name, cookie) => {\n // biome-ignore lint/suspicious/noDocumentCookie: set cookie fallback\n document.cookie = cookie;\n },\n setSessionStorage: (name, value) => sessionStorage.setItem(name, value),\n setLocaleStorage: (name, value) => localStorage.setItem(name, value),\n};\n\n// Default settings for the language detector\ntype LanguageDetectorOptions = {\n order?: LanguageDetector[];\n lookupQuerystring?: string;\n htmlTag?: HTMLElement | null;\n};\n\nconst getDefaultsOptions = (): LanguageDetectorOptions => {\n return {\n order: [\n LanguageDetector.Querystring,\n LanguageDetector.Storage,\n LanguageDetector.Navigator,\n LanguageDetector.HtmlTag,\n ],\n lookupQuerystring: 'locale',\n htmlTag: typeof document !== 'undefined' ? document.documentElement : null,\n };\n};\n\nconst detectLanguage = (\n order: string[],\n options: LanguageDetectorOptions\n): Record<LanguageDetector, Locale | undefined> => {\n const detected: Record<LanguageDetector, Locale | undefined> = {} as Record<\n LanguageDetector,\n Locale | undefined\n >;\n\n const queryStringDetector = () => {\n if (typeof window === 'undefined') return;\n const search = window.location.search || '';\n const params = new URLSearchParams(search);\n const value = params.get(options.lookupQuerystring ?? '');\n if (value) {\n detected[LanguageDetector.Querystring] = value as Locale;\n }\n };\n\n const storageDetector = () => {\n if (typeof window === 'undefined') return;\n\n const locale = getLocaleFromStorageClient({\n getCookie: (name: string) => {\n try {\n const cookies = document.cookie.split(';');\n const cookieName = `${name}=`;\n\n const cookie = cookies.find((cookie) =>\n cookie.trim().startsWith(cookieName)\n );\n\n if (cookie) {\n return cookie.split('=')[1].trim();\n }\n } catch {}\n return undefined;\n },\n getSessionStorage: (name: string) => {\n try {\n return window.sessionStorage.getItem(name) ?? undefined;\n } catch {}\n return undefined;\n },\n getLocaleStorage: (name: string) => {\n try {\n return window.localStorage.getItem(name) ?? undefined;\n } catch {}\n return undefined;\n },\n });\n\n if (locale) {\n detected[LanguageDetector.Storage] = locale;\n }\n };\n\n const navigatorDetector = () => {\n if (typeof navigator === 'undefined') return;\n\n const languages = navigator.languages ?? [navigator.language];\n\n // Use localeDetector to find the best matching locale\n const locale = localeDetector(\n { 'accept-language': languages.join(',') },\n internationalization.locales,\n internationalization.defaultLocale\n );\n\n if (locale) {\n detected[LanguageDetector.Navigator] = locale;\n }\n };\n\n const htmlTagDetector = () => {\n const htmlTag = options.htmlTag;\n if (htmlTag && typeof htmlTag.getAttribute === 'function') {\n const lang = htmlTag.getAttribute('lang');\n if (lang) {\n // Validate and resolve the locale\n\n const locale = localeDetector(\n { 'accept-language': lang },\n internationalization.locales,\n internationalization.defaultLocale\n );\n\n detected[LanguageDetector.HtmlTag] = locale;\n }\n }\n };\n\n // Map detector names to their corresponding functions\n const detectors: Record<string, () => void> = {\n [LanguageDetector.Querystring]: queryStringDetector,\n [LanguageDetector.Storage]: storageDetector,\n [LanguageDetector.Navigator]: navigatorDetector,\n [LanguageDetector.HtmlTag]: htmlTagDetector,\n };\n\n // Use the provided order to run each detector\n order.forEach((detectorName) => {\n detectors[detectorName]?.();\n });\n\n return detected;\n};\n\nconst getFirstAvailableLocale = (\n locales: Record<LanguageDetector, Locale | undefined>,\n order: LanguageDetector[]\n): Locale => {\n for (const detector of order) {\n const locale = locales[detector];\n\n if (locale && internationalization.locales.includes(locale)) {\n return locale;\n }\n }\n\n return internationalization?.defaultLocale ?? DEFAULT_LOCALE;\n};\n\n/**\n * Core language detector function for browser environments.\n *\n * Detects the user's preferred locale by checking multiple sources in order:\n * 1. Query string parameter\n * 2. Storage (cookies, localStorage, sessionStorage) - uses getLocaleFromStorage\n * 3. Navigator languages - uses localeDetector\n * 4. HTML lang attribute - uses localeDetector\n *\n * @param userOptions - Optional configuration for detection order and lookup keys\n * @returns The detected locale or the default locale\n *\n * @example\n * const locale = getBrowserLocale({ order: [LanguageDetector.Storage, LanguageDetector.Navigator] });\n */\nexport const getBrowserLocale = (\n userOptions: LanguageDetectorOptions | undefined = {}\n): Locale => {\n const options = { ...getDefaultsOptions(), ...userOptions };\n\n const locales = detectLanguage(options.order ?? [], options);\n\n return getFirstAvailableLocale(locales, options.order ?? []);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"getBrowserLocale.cjs","names":["getLocaleFromStorageClient","localeDetector","internationalization","DEFAULT_LOCALE"],"sources":["../../../src/localization/getBrowserLocale.tsx"],"sourcesContent":["import { internationalization } from '@intlayer/config/built';\nimport { DEFAULT_LOCALE } from '@intlayer/config/defaultValues';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport {\n getLocaleFromStorageClient,\n type LocaleStorageClientOptions,\n} from '../utils/localeStorage';\nimport { localeDetector } from './localeDetector';\n\nexport enum LanguageDetector {\n Querystring = 'querystring',\n Storage = 'storage',\n Navigator = 'navigator',\n HtmlTag = 'htmlTag',\n}\n\nexport const localeStorageOptions: LocaleStorageClientOptions = {\n getCookie: (name: string) =>\n document.cookie\n .split(';')\n .find((c) => c.trim().startsWith(`${name}=`))\n ?.split('=')[1],\n getLocaleStorage: (name: string) => localStorage.getItem(name),\n getSessionStorage: (name: string) => sessionStorage.getItem(name),\n isCookieEnabled: true,\n setCookieStore: (name, value, attributes) =>\n cookieStore.set({\n name,\n value,\n path: attributes.path,\n domain: attributes.domain,\n expires: attributes.expires,\n sameSite: attributes.sameSite,\n }),\n setCookieString: (_name, cookie) => {\n // biome-ignore lint/suspicious/noDocumentCookie: set cookie fallback\n document.cookie = cookie;\n },\n setSessionStorage: (name, value) => sessionStorage.setItem(name, value),\n setLocaleStorage: (name, value) => localStorage.setItem(name, value),\n};\n\n// Default settings for the language detector\ntype LanguageDetectorOptions = {\n order?: LanguageDetector[];\n lookupQuerystring?: string;\n htmlTag?: HTMLElement | null;\n};\n\nconst getDefaultsOptions = (): LanguageDetectorOptions => {\n return {\n order: [\n LanguageDetector.Querystring,\n LanguageDetector.Storage,\n LanguageDetector.Navigator,\n LanguageDetector.HtmlTag,\n ],\n lookupQuerystring: 'locale',\n htmlTag: typeof document !== 'undefined' ? document.documentElement : null,\n };\n};\n\nconst detectLanguage = (\n order: string[],\n options: LanguageDetectorOptions\n): Record<LanguageDetector, Locale | undefined> => {\n const detected: Record<LanguageDetector, Locale | undefined> = {} as Record<\n LanguageDetector,\n Locale | undefined\n >;\n\n const queryStringDetector = () => {\n if (typeof window === 'undefined') return;\n const search = window.location.search || '';\n const params = new URLSearchParams(search);\n const value = params.get(options.lookupQuerystring ?? '');\n if (value) {\n detected[LanguageDetector.Querystring] = value as Locale;\n }\n };\n\n const storageDetector = () => {\n if (typeof window === 'undefined') return;\n\n const locale = getLocaleFromStorageClient({\n getCookie: (name: string) => {\n try {\n const cookies = document.cookie.split(';');\n const cookieName = `${name}=`;\n\n const cookie = cookies.find((cookie) =>\n cookie.trim().startsWith(cookieName)\n );\n\n if (cookie) {\n return cookie.split('=')[1].trim();\n }\n } catch {}\n return undefined;\n },\n getSessionStorage: (name: string) => {\n try {\n return window.sessionStorage.getItem(name) ?? undefined;\n } catch {}\n return undefined;\n },\n getLocaleStorage: (name: string) => {\n try {\n return window.localStorage.getItem(name) ?? undefined;\n } catch {}\n return undefined;\n },\n });\n\n if (locale) {\n detected[LanguageDetector.Storage] = locale;\n }\n };\n\n const navigatorDetector = () => {\n if (typeof navigator === 'undefined') return;\n\n const languages = navigator.languages ?? [navigator.language];\n\n // Use localeDetector to find the best matching locale\n const locale = localeDetector(\n { 'accept-language': languages.join(',') },\n internationalization.locales,\n internationalization.defaultLocale\n );\n\n if (locale) {\n detected[LanguageDetector.Navigator] = locale;\n }\n };\n\n const htmlTagDetector = () => {\n const htmlTag = options.htmlTag;\n if (htmlTag && typeof htmlTag.getAttribute === 'function') {\n const lang = htmlTag.getAttribute('lang');\n if (lang) {\n // Validate and resolve the locale\n\n const locale = localeDetector(\n { 'accept-language': lang },\n internationalization.locales,\n internationalization.defaultLocale\n );\n\n detected[LanguageDetector.HtmlTag] = locale;\n }\n }\n };\n\n // Map detector names to their corresponding functions\n const detectors: Record<string, () => void> = {\n [LanguageDetector.Querystring]: queryStringDetector,\n [LanguageDetector.Storage]: storageDetector,\n [LanguageDetector.Navigator]: navigatorDetector,\n [LanguageDetector.HtmlTag]: htmlTagDetector,\n };\n\n // Use the provided order to run each detector\n order.forEach((detectorName) => {\n detectors[detectorName]?.();\n });\n\n return detected;\n};\n\nconst getFirstAvailableLocale = (\n locales: Record<LanguageDetector, Locale | undefined>,\n order: LanguageDetector[]\n): Locale => {\n for (const detector of order) {\n const locale = locales[detector];\n\n if (locale && internationalization.locales.includes(locale)) {\n return locale;\n }\n }\n\n return internationalization?.defaultLocale ?? DEFAULT_LOCALE;\n};\n\n/**\n * Core language detector function for browser environments.\n *\n * Detects the user's preferred locale by checking multiple sources in order:\n * 1. Query string parameter\n * 2. Storage (cookies, localStorage, sessionStorage) - uses getLocaleFromStorage\n * 3. Navigator languages - uses localeDetector\n * 4. HTML lang attribute - uses localeDetector\n *\n * @param userOptions - Optional configuration for detection order and lookup keys\n * @returns The detected locale or the default locale\n *\n * @example\n * const locale = getBrowserLocale({ order: [LanguageDetector.Storage, LanguageDetector.Navigator] });\n */\nexport const getBrowserLocale = (\n userOptions: LanguageDetectorOptions | undefined = {}\n): Locale => {\n const options = { ...getDefaultsOptions(), ...userOptions };\n\n const locales = detectLanguage(options.order ?? [], options);\n\n return getFirstAvailableLocale(locales, options.order ?? []);\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getHTMLTextDir.cjs","names":[],"sources":["../../../src/localization/getHTMLTextDir.ts"],"sourcesContent":["import type { LocalesValues } from '@intlayer/types/module_augmentation';\n\ntype Dir = 'ltr' | 'rtl' | 'auto';\n\n/**\n * Returns the text direction of the given locale.\n *\n * Example:\n *\n * getHTMLTextDir('en-US') // 'ltr'\n * getHTMLTextDir('en') // 'ltr'\n * getHTMLTextDir('fr-CA') // 'ltr'\n * getHTMLTextDir('fr') // 'ltr'\n *\n * @param locale The locale to get the text direction for.\n * @returns The text direction of the given locale.\n */\nexport const getHTMLTextDir = (locale?: LocalesValues): Dir => {\n if (!locale) return 'ltr';\n\n try {\n const localeInfo = new Intl.Locale(locale);\n\n // Check for the 'textInfo' property (part of the Intl Enumeration API)\n // Most modern browsers support 'direction' via 'getTextInfo()' or 'textInfo'\n if ('getTextInfo' in localeInfo) {\n return (localeInfo as any).getTextInfo().direction as Dir;\n }\n\n // Fallback for environments supporting 'textInfo' property\n if ('textInfo' in localeInfo) {\n return (localeInfo as any).textInfo.direction as Dir;\n }\n\n // Manual fallback for older environments using script detection\n const maximized = localeInfo.maximize();\n const rtlScripts = [\n 'Arab',\n 'Hebr',\n 'Thaa',\n 'Syrc',\n 'Mand',\n 'Adlm',\n 'Rohg',\n 'Nkoo',\n ];\n\n return rtlScripts.includes(maximized.script ?? '') ? 'rtl' : 'ltr';\n } catch {\n return 'ltr';\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,MAAa,kBAAkB,WAAgC;AAC7D,KAAI,CAAC,OAAQ,QAAO;AAEpB,KAAI;EACF,MAAM,aAAa,IAAI,KAAK,OAAO,OAAO;AAI1C,MAAI,iBAAiB,WACnB,QAAQ,WAAmB,aAAa,CAAC;AAI3C,MAAI,cAAc,WAChB,QAAQ,WAAmB,SAAS;EAItC,MAAM,YAAY,WAAW,UAAU;AAYvC,SAXmB;GACjB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAEiB,SAAS,UAAU,UAAU,GAAG,GAAG,QAAQ;SACvD;AACN,SAAO"}
1
+ {"version":3,"file":"getHTMLTextDir.cjs","names":[],"sources":["../../../src/localization/getHTMLTextDir.ts"],"sourcesContent":["import type { LocalesValues } from '@intlayer/types/module_augmentation';\n\ntype Dir = 'ltr' | 'rtl' | 'auto';\n\n/**\n * Returns the text direction of the given locale.\n *\n * Example:\n *\n * getHTMLTextDir('en-US') // 'ltr'\n * getHTMLTextDir('en') // 'ltr'\n * getHTMLTextDir('fr-CA') // 'ltr'\n * getHTMLTextDir('fr') // 'ltr'\n *\n * @param locale The locale to get the text direction for.\n * @returns The text direction of the given locale.\n */\nexport const getHTMLTextDir = (locale?: LocalesValues): Dir => {\n if (!locale) return 'ltr';\n\n try {\n const localeInfo = new Intl.Locale(locale);\n\n // Check for the 'textInfo' property (part of the Intl Enumeration API)\n // Most modern browsers support 'direction' via 'getTextInfo()' or 'textInfo'\n if ('getTextInfo' in localeInfo) {\n return (localeInfo as any).getTextInfo().direction as Dir;\n }\n\n // Fallback for environments supporting 'textInfo' property\n if ('textInfo' in localeInfo) {\n return (localeInfo as any).textInfo.direction as Dir;\n }\n\n // Manual fallback for older environments using script detection\n const maximized = localeInfo.maximize();\n const rtlScripts = [\n 'Arab',\n 'Hebr',\n 'Thaa',\n 'Syrc',\n 'Mand',\n 'Adlm',\n 'Rohg',\n 'Nkoo',\n ];\n\n return rtlScripts.includes(maximized.script ?? '') ? 'rtl' : 'ltr';\n } catch {\n return 'ltr';\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,MAAa,kBAAkB,WAAgC;AAC7D,KAAI,CAAC,OAAQ,QAAO;AAEpB,KAAI;EACF,MAAM,aAAa,IAAI,KAAK,OAAO,OAAO;AAI1C,MAAI,iBAAiB,WACnB,QAAQ,WAAmB,aAAa,CAAC;AAI3C,MAAI,cAAc,WAChB,QAAQ,WAAmB,SAAS;EAItC,MAAM,YAAY,WAAW,UAAU;AAYvC,SAAO;GAVL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GAGe,CAAC,SAAS,UAAU,UAAU,GAAG,GAAG,QAAQ;SACvD;AACN,SAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"getLocale.cjs","names":["internationalization","DEFAULT_LOCALE","LOCALES","getLocaleFromStorageServer","localeResolver","getPreferredLanguages"],"sources":["../../../src/localization/getLocale.ts"],"sourcesContent":["import { internationalization } from '@intlayer/config/built';\nimport { DEFAULT_LOCALE, LOCALES } from '@intlayer/config/defaultValues';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport { getLocaleFromStorageServer } from '../utils/localeStorage';\nimport { getPreferredLanguages } from './localeDetector';\nimport { localeResolver } from './localeResolver';\n\nexport type RequestContext = {\n getHeader?: (name: string) => string | null | undefined;\n getCookie?: (name: string) => string | null | undefined;\n};\n\nexport const getLocale = async (ctx: RequestContext = {}): Promise<Locale> => {\n const defaultLocale = internationalization?.defaultLocale ?? DEFAULT_LOCALE;\n const availableLocales = internationalization?.locales ?? LOCALES;\n\n // Try locale from storage (cookie or header)\n const storedLocale = getLocaleFromStorageServer({\n getCookie: ctx.getCookie,\n getHeader: ctx.getHeader,\n });\n\n if (storedLocale) {\n return storedLocale;\n }\n\n // Fallback to Accept-Language negotiation\n const acceptLanguageHeader = ctx.getHeader?.('accept-language');\n\n if (!acceptLanguageHeader) {\n return defaultLocale;\n }\n\n const preferredLocaleStrings = getPreferredLanguages(\n acceptLanguageHeader,\n availableLocales\n );\n\n const userFallbackLocale = localeResolver(\n preferredLocaleStrings,\n availableLocales,\n defaultLocale\n );\n\n if (userFallbackLocale) {\n return userFallbackLocale;\n }\n\n // Default locale\n return defaultLocale;\n};\n"],"mappings":";;;;;;;;;AAYA,MAAa,YAAY,OAAO,MAAsB,EAAE,KAAsB;CAC5E,MAAM,gBAAgBA,6CAAsB,iBAAiBC;CAC7D,MAAM,mBAAmBD,6CAAsB,WAAWE;CAG1D,MAAM,eAAeC,uDAA2B;EAC9C,WAAW,IAAI;EACf,WAAW,IAAI;EAChB,CAAC;AAEF,KAAI,aACF,QAAO;CAIT,MAAM,uBAAuB,IAAI,YAAY,kBAAkB;AAE/D,KAAI,CAAC,qBACH,QAAO;CAQT,MAAM,qBAAqBC,mDALIC,0DAC7B,sBACA,iBACD,EAIC,kBACA,cACD;AAED,KAAI,mBACF,QAAO;AAIT,QAAO"}
1
+ {"version":3,"file":"getLocale.cjs","names":["internationalization","DEFAULT_LOCALE","LOCALES","getLocaleFromStorageServer","localeResolver","getPreferredLanguages"],"sources":["../../../src/localization/getLocale.ts"],"sourcesContent":["import { internationalization } from '@intlayer/config/built';\nimport { DEFAULT_LOCALE, LOCALES } from '@intlayer/config/defaultValues';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport { getLocaleFromStorageServer } from '../utils/localeStorage';\nimport { getPreferredLanguages } from './localeDetector';\nimport { localeResolver } from './localeResolver';\n\nexport type RequestContext = {\n getHeader?: (name: string) => string | null | undefined;\n getCookie?: (name: string) => string | null | undefined;\n};\n\nexport const getLocale = async (ctx: RequestContext = {}): Promise<Locale> => {\n const defaultLocale = internationalization?.defaultLocale ?? DEFAULT_LOCALE;\n const availableLocales = internationalization?.locales ?? LOCALES;\n\n // Try locale from storage (cookie or header)\n const storedLocale = getLocaleFromStorageServer({\n getCookie: ctx.getCookie,\n getHeader: ctx.getHeader,\n });\n\n if (storedLocale) {\n return storedLocale;\n }\n\n // Fallback to Accept-Language negotiation\n const acceptLanguageHeader = ctx.getHeader?.('accept-language');\n\n if (!acceptLanguageHeader) {\n return defaultLocale;\n }\n\n const preferredLocaleStrings = getPreferredLanguages(\n acceptLanguageHeader,\n availableLocales\n );\n\n const userFallbackLocale = localeResolver(\n preferredLocaleStrings,\n availableLocales,\n defaultLocale\n );\n\n if (userFallbackLocale) {\n return userFallbackLocale;\n }\n\n // Default locale\n return defaultLocale;\n};\n"],"mappings":";;;;;;;;;AAYA,MAAa,YAAY,OAAO,MAAsB,EAAE,KAAsB;CAC5E,MAAM,gBAAgBA,6CAAsB,iBAAiBC;CAC7D,MAAM,mBAAmBD,6CAAsB,WAAWE;CAG1D,MAAM,eAAeC,uDAA2B;EAC9C,WAAW,IAAI;EACf,WAAW,IAAI;EAChB,CAAC;AAEF,KAAI,aACF,QAAO;CAIT,MAAM,uBAAuB,IAAI,YAAY,kBAAkB;AAE/D,KAAI,CAAC,qBACH,QAAO;CAQT,MAAM,qBAAqBC,mDALIC,0DAC7B,sBACA,iBAIsB,EACtB,kBACA,cACD;AAED,KAAI,mBACF,QAAO;AAIT,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"getLocaleName.cjs","names":["CachedIntl"],"sources":["../../../src/localization/getLocaleName.ts"],"sourcesContent":["import type { LocalesValues } from '@intlayer/types/module_augmentation';\nimport { CachedIntl } from '../utils/intl';\n\nexport const getLocaleName = (\n displayLocale: LocalesValues,\n targetLocale: LocalesValues = displayLocale\n): string => {\n // new Intl.DisplayNames() is fairly heavy: under the hood every call parses CLDR data and builds a resolver table. In your LocaleSwitcher it’s invoked:\n const displayNames = new CachedIntl.DisplayNames(targetLocale, {\n type: 'language',\n });\n\n return displayNames.of(displayLocale) ?? 'Unknown locale';\n};\n"],"mappings":";;;;AAGA,MAAa,iBACX,eACA,eAA8B,kBACnB;AAMX,QAJqB,IAAIA,8BAAW,aAAa,cAAc,EAC7D,MAAM,YACP,CAAC,CAEkB,GAAG,cAAc,IAAI"}
1
+ {"version":3,"file":"getLocaleName.cjs","names":["CachedIntl"],"sources":["../../../src/localization/getLocaleName.ts"],"sourcesContent":["import type { LocalesValues } from '@intlayer/types/module_augmentation';\nimport { CachedIntl } from '../utils/intl';\n\nexport const getLocaleName = (\n displayLocale: LocalesValues,\n targetLocale: LocalesValues = displayLocale\n): string => {\n // new Intl.DisplayNames() is fairly heavy: under the hood every call parses CLDR data and builds a resolver table. In your LocaleSwitcher it’s invoked:\n const displayNames = new CachedIntl.DisplayNames(targetLocale, {\n type: 'language',\n });\n\n return displayNames.of(displayLocale) ?? 'Unknown locale';\n};\n"],"mappings":";;;;AAGA,MAAa,iBACX,eACA,eAA8B,kBACnB;AAMX,QAAO,IAJkBA,8BAAW,aAAa,cAAc,EAC7D,MAAM,YACP,CAEkB,CAAC,GAAG,cAAc,IAAI"}
@@ -1 +1 @@
1
- {"version":3,"file":"localeDetector.cjs","names":["localeResolver"],"sources":["../../../src/localization/localeDetector.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types/allLocales';\nimport { localeResolver } from './localeResolver';\n\n/**\n * Constants\n */\nconst LANGUAGE_FORMAT_REGULAR_EXPRESSION =\n /^\\s*([^\\s\\-;]+)(?:-([^\\s;]+))?\\s*(?:;(.*))?$/;\nconst DEFAULT_QUALITY_SCORE = 1;\n\n/**\n * Enumeration for specificity weights.\n * Higher values indicate a more precise match.\n */\nenum SpecificityWeight {\n None = 0,\n Broad = 1, // Matches prefix (e.g., 'en' matches 'en-US')\n Prefix = 2, // Matches prefix in reverse (e.g., 'en-US' matches 'en')\n Exact = 4, // Matches exact string (e.g., 'en-US' matches 'en-US')\n}\n\n/**\n * Represents a parsed language tag from the header.\n */\ntype LanguagePreference = {\n languageCode: string;\n regionCode?: string;\n fullLocale: string;\n qualityScore: number;\n originalIndex: number;\n};\n\n/**\n * Represents the result of matching a requested language against an available language.\n */\ntype MatchResult = {\n providedIndex: number;\n headerIndex: number;\n qualityScore: number;\n specificityScore: number;\n};\n\n/**\n * Parses a single language tag string from the Accept-Language header.\n * Example input: \"en-US;q=0.8\"\n */\nconst parseLanguageTag = (\n tagString: string,\n index: number\n): LanguagePreference | null => {\n const match = LANGUAGE_FORMAT_REGULAR_EXPRESSION.exec(tagString);\n if (!match) {\n return null;\n }\n\n const languageCode = match[1];\n const regionCode = match[2];\n const parameters = match[3];\n\n // Construct the full locale string (e.g., \"en-US\" or \"en\")\n const fullLocale = regionCode\n ? `${languageCode}-${regionCode}`\n : languageCode;\n\n let qualityScore = DEFAULT_QUALITY_SCORE;\n\n // Parse parameters to find the quality score (\"q\")\n if (parameters) {\n const parameterList = parameters.split(';');\n for (const parameter of parameterList) {\n const [key, value] = parameter.split('=');\n if (key === 'q') {\n qualityScore = parseFloat(value);\n }\n }\n }\n\n return {\n languageCode,\n regionCode,\n qualityScore,\n originalIndex: index,\n fullLocale,\n };\n};\n\n/**\n * Parses the entire Accept-Language header string into a list of preferences.\n */\nconst parseAcceptLanguageHeader = (\n headerValue: string\n): LanguagePreference[] => {\n const rawTags = headerValue.split(',');\n const preferences: LanguagePreference[] = [];\n\n for (let index = 0; index < rawTags.length; index++) {\n const tag = rawTags[index].trim();\n const parsedLanguage = parseLanguageTag(tag, index);\n\n if (parsedLanguage) {\n preferences.push(parsedLanguage);\n }\n }\n\n return preferences;\n};\n\n/**\n * Calculates the specificity of a match between a provided language and a requested preference.\n */\nconst calculateMatchSpecificity = (\n providedLanguage: string,\n preference: LanguagePreference,\n providedIndex: number\n): MatchResult | null => {\n const parsedProvided = parseLanguageTag(providedLanguage, providedIndex);\n if (!parsedProvided) {\n return null;\n }\n\n let specificityScore = SpecificityWeight.None;\n\n const preferenceFullLower = preference.fullLocale.toLowerCase();\n const preferencePrefixLower = preference.languageCode.toLowerCase();\n const providedFullLower = parsedProvided.fullLocale.toLowerCase();\n const providedPrefixLower = parsedProvided.languageCode.toLowerCase();\n\n if (preferenceFullLower === providedFullLower) {\n specificityScore |= SpecificityWeight.Exact;\n } else if (preferencePrefixLower === providedFullLower) {\n specificityScore |= SpecificityWeight.Prefix;\n } else if (preferenceFullLower === providedPrefixLower) {\n specificityScore |= SpecificityWeight.Broad;\n } else if (preference.fullLocale !== '*') {\n return null;\n }\n\n return {\n providedIndex,\n headerIndex: preference.originalIndex,\n qualityScore: preference.qualityScore,\n specificityScore,\n };\n};\n\n/**\n * Determines the best match for a specific available language against the list of user accepted languages.\n */\nconst getBestMatchForLanguage = (\n providedLanguage: string,\n acceptedPreferences: LanguagePreference[],\n providedIndex: number\n): MatchResult => {\n // Initialize with a non-match priority\n let bestMatch: MatchResult = {\n headerIndex: -1,\n qualityScore: 0,\n specificityScore: 0,\n providedIndex,\n };\n\n for (const preference of acceptedPreferences) {\n const matchSpec = calculateMatchSpecificity(\n providedLanguage,\n preference,\n providedIndex\n );\n\n if (matchSpec) {\n // Compare current best match with new match\n const scoreDifference =\n bestMatch.specificityScore - matchSpec.specificityScore ||\n bestMatch.qualityScore - matchSpec.qualityScore ||\n bestMatch.headerIndex - matchSpec.headerIndex;\n\n // If the new match is better (difference < 0), update priority\n if (scoreDifference < 0) {\n bestMatch = matchSpec;\n }\n }\n }\n\n return bestMatch;\n};\n\n/**\n * Comparator function to sort language matches.\n * Sorting order:\n * 1. Quality Score (Descending)\n * 2. Specificity Score (Descending)\n * 3. Order in Header (Ascending - lower index is better)\n * 4. Order in Provided List (Ascending)\n */\nconst compareMatchResults = (a: MatchResult, b: MatchResult): number => {\n return (\n b.qualityScore - a.qualityScore ||\n b.specificityScore - a.specificityScore ||\n a.headerIndex - b.headerIndex ||\n a.providedIndex - b.providedIndex ||\n 0\n );\n};\n\n/**\n * Derives the list of preferred languages based on the Accept-Language header\n * and an optional list of available languages.\n */\nexport const getPreferredLanguages = (\n acceptHeader: string | undefined,\n availableLanguages?: string[]\n): string[] => {\n // RFC 2616 sec 14.4: no header implies '*'\n const headerValue = acceptHeader === undefined ? '*' : acceptHeader || '';\n const acceptedPreferences = parseAcceptLanguageHeader(headerValue);\n\n // If no specific languages are provided to filter against, return the header languages sorted by quality\n if (!availableLanguages) {\n return acceptedPreferences\n .filter((preference) => preference.qualityScore > 0)\n .sort((a, b) => b.qualityScore - a.qualityScore) // Simple sort by quality\n .map((preference) => preference.fullLocale);\n }\n\n // Map available languages to their match priority against the header\n const matchResults = availableLanguages.map((language, index) =>\n getBestMatchForLanguage(language, acceptedPreferences, index)\n );\n\n return matchResults\n .filter((result) => result.qualityScore > 0)\n .sort(compareMatchResults)\n .map((result) => availableLanguages[result.providedIndex]);\n};\n\n/**\n * Detects the locale from the request headers.\n *\n * Headers are provided by the browser/client and can be used to determine the user's preferred language.\n * This function intersects the user's `Accept-Language` header with the application's available locales.\n */\nexport const localeDetector = (\n headers: Record<string, string | undefined>,\n availableLocales?: Locale[],\n defaultLocale?: Locale\n): Locale => {\n const acceptLanguageHeader = headers['accept-language'];\n\n const preferredLocaleStrings = getPreferredLanguages(\n acceptLanguageHeader,\n availableLocales as string[]\n );\n\n return localeResolver(\n preferredLocaleStrings as Locale[],\n availableLocales,\n defaultLocale\n );\n};\n"],"mappings":";;;;;;;AAMA,MAAM,qCACJ;AACF,MAAM,wBAAwB;;;;;AAsC9B,MAAM,oBACJ,WACA,UAC8B;CAC9B,MAAM,QAAQ,mCAAmC,KAAK,UAAU;AAChE,KAAI,CAAC,MACH,QAAO;CAGT,MAAM,eAAe,MAAM;CAC3B,MAAM,aAAa,MAAM;CACzB,MAAM,aAAa,MAAM;CAGzB,MAAM,aAAa,aACf,GAAG,aAAa,GAAG,eACnB;CAEJ,IAAI,eAAe;AAGnB,KAAI,YAAY;EACd,MAAM,gBAAgB,WAAW,MAAM,IAAI;AAC3C,OAAK,MAAM,aAAa,eAAe;GACrC,MAAM,CAAC,KAAK,SAAS,UAAU,MAAM,IAAI;AACzC,OAAI,QAAQ,IACV,gBAAe,WAAW,MAAM;;;AAKtC,QAAO;EACL;EACA;EACA;EACA,eAAe;EACf;EACD;;;;;AAMH,MAAM,6BACJ,gBACyB;CACzB,MAAM,UAAU,YAAY,MAAM,IAAI;CACtC,MAAM,cAAoC,EAAE;AAE5C,MAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS;EAEnD,MAAM,iBAAiB,iBADX,QAAQ,OAAO,MAAM,EACY,MAAM;AAEnD,MAAI,eACF,aAAY,KAAK,eAAe;;AAIpC,QAAO;;;;;AAMT,MAAM,6BACJ,kBACA,YACA,kBACuB;CACvB,MAAM,iBAAiB,iBAAiB,kBAAkB,cAAc;AACxE,KAAI,CAAC,eACH,QAAO;CAGT,IAAI;CAEJ,MAAM,sBAAsB,WAAW,WAAW,aAAa;CAC/D,MAAM,wBAAwB,WAAW,aAAa,aAAa;CACnE,MAAM,oBAAoB,eAAe,WAAW,aAAa;CACjE,MAAM,sBAAsB,eAAe,aAAa,aAAa;AAErE,KAAI,wBAAwB,kBAC1B;UACS,0BAA0B,kBACnC;UACS,wBAAwB,oBACjC;UACS,WAAW,eAAe,IACnC,QAAO;AAGT,QAAO;EACL;EACA,aAAa,WAAW;EACxB,cAAc,WAAW;EACzB;EACD;;;;;AAMH,MAAM,2BACJ,kBACA,qBACA,kBACgB;CAEhB,IAAI,YAAyB;EAC3B,aAAa;EACb,cAAc;EACd,kBAAkB;EAClB;EACD;AAED,MAAK,MAAM,cAAc,qBAAqB;EAC5C,MAAM,YAAY,0BAChB,kBACA,YACA,cACD;AAED,MAAI,WAQF;QALE,UAAU,mBAAmB,UAAU,oBACvC,UAAU,eAAe,UAAU,gBACnC,UAAU,cAAc,UAAU,eAGd,EACpB,aAAY;;;AAKlB,QAAO;;;;;;;;;;AAWT,MAAM,uBAAuB,GAAgB,MAA2B;AACtE,QACE,EAAE,eAAe,EAAE,gBACnB,EAAE,mBAAmB,EAAE,oBACvB,EAAE,cAAc,EAAE,eAClB,EAAE,gBAAgB,EAAE,iBACpB;;;;;;AAQJ,MAAa,yBACX,cACA,uBACa;CAGb,MAAM,sBAAsB,0BADR,iBAAiB,SAAY,MAAM,gBAAgB,GACL;AAGlE,KAAI,CAAC,mBACH,QAAO,oBACJ,QAAQ,eAAe,WAAW,eAAe,EAAE,CACnD,MAAM,GAAG,MAAM,EAAE,eAAe,EAAE,aAAa,CAC/C,KAAK,eAAe,WAAW,WAAW;AAQ/C,QAJqB,mBAAmB,KAAK,UAAU,UACrD,wBAAwB,UAAU,qBAAqB,MAAM,CAC9D,CAGE,QAAQ,WAAW,OAAO,eAAe,EAAE,CAC3C,KAAK,oBAAoB,CACzB,KAAK,WAAW,mBAAmB,OAAO,eAAe;;;;;;;;AAS9D,MAAa,kBACX,SACA,kBACA,kBACW;CACX,MAAM,uBAAuB,QAAQ;AAOrC,QAAOA,mDALwB,sBAC7B,sBACA,iBACD,EAIC,kBACA,cACD"}
1
+ {"version":3,"file":"localeDetector.cjs","names":["localeResolver"],"sources":["../../../src/localization/localeDetector.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types/allLocales';\nimport { localeResolver } from './localeResolver';\n\n/**\n * Constants\n */\nconst LANGUAGE_FORMAT_REGULAR_EXPRESSION =\n /^\\s*([^\\s\\-;]+)(?:-([^\\s;]+))?\\s*(?:;(.*))?$/;\nconst DEFAULT_QUALITY_SCORE = 1;\n\n/**\n * Enumeration for specificity weights.\n * Higher values indicate a more precise match.\n */\nenum SpecificityWeight {\n None = 0,\n Broad = 1, // Matches prefix (e.g., 'en' matches 'en-US')\n Prefix = 2, // Matches prefix in reverse (e.g., 'en-US' matches 'en')\n Exact = 4, // Matches exact string (e.g., 'en-US' matches 'en-US')\n}\n\n/**\n * Represents a parsed language tag from the header.\n */\ntype LanguagePreference = {\n languageCode: string;\n regionCode?: string;\n fullLocale: string;\n qualityScore: number;\n originalIndex: number;\n};\n\n/**\n * Represents the result of matching a requested language against an available language.\n */\ntype MatchResult = {\n providedIndex: number;\n headerIndex: number;\n qualityScore: number;\n specificityScore: number;\n};\n\n/**\n * Parses a single language tag string from the Accept-Language header.\n * Example input: \"en-US;q=0.8\"\n */\nconst parseLanguageTag = (\n tagString: string,\n index: number\n): LanguagePreference | null => {\n const match = LANGUAGE_FORMAT_REGULAR_EXPRESSION.exec(tagString);\n if (!match) {\n return null;\n }\n\n const languageCode = match[1];\n const regionCode = match[2];\n const parameters = match[3];\n\n // Construct the full locale string (e.g., \"en-US\" or \"en\")\n const fullLocale = regionCode\n ? `${languageCode}-${regionCode}`\n : languageCode;\n\n let qualityScore = DEFAULT_QUALITY_SCORE;\n\n // Parse parameters to find the quality score (\"q\")\n if (parameters) {\n const parameterList = parameters.split(';');\n for (const parameter of parameterList) {\n const [key, value] = parameter.split('=');\n if (key === 'q') {\n qualityScore = parseFloat(value);\n }\n }\n }\n\n return {\n languageCode,\n regionCode,\n qualityScore,\n originalIndex: index,\n fullLocale,\n };\n};\n\n/**\n * Parses the entire Accept-Language header string into a list of preferences.\n */\nconst parseAcceptLanguageHeader = (\n headerValue: string\n): LanguagePreference[] => {\n const rawTags = headerValue.split(',');\n const preferences: LanguagePreference[] = [];\n\n for (let index = 0; index < rawTags.length; index++) {\n const tag = rawTags[index].trim();\n const parsedLanguage = parseLanguageTag(tag, index);\n\n if (parsedLanguage) {\n preferences.push(parsedLanguage);\n }\n }\n\n return preferences;\n};\n\n/**\n * Calculates the specificity of a match between a provided language and a requested preference.\n */\nconst calculateMatchSpecificity = (\n providedLanguage: string,\n preference: LanguagePreference,\n providedIndex: number\n): MatchResult | null => {\n const parsedProvided = parseLanguageTag(providedLanguage, providedIndex);\n if (!parsedProvided) {\n return null;\n }\n\n let specificityScore = SpecificityWeight.None;\n\n const preferenceFullLower = preference.fullLocale.toLowerCase();\n const preferencePrefixLower = preference.languageCode.toLowerCase();\n const providedFullLower = parsedProvided.fullLocale.toLowerCase();\n const providedPrefixLower = parsedProvided.languageCode.toLowerCase();\n\n if (preferenceFullLower === providedFullLower) {\n specificityScore |= SpecificityWeight.Exact;\n } else if (preferencePrefixLower === providedFullLower) {\n specificityScore |= SpecificityWeight.Prefix;\n } else if (preferenceFullLower === providedPrefixLower) {\n specificityScore |= SpecificityWeight.Broad;\n } else if (preference.fullLocale !== '*') {\n return null;\n }\n\n return {\n providedIndex,\n headerIndex: preference.originalIndex,\n qualityScore: preference.qualityScore,\n specificityScore,\n };\n};\n\n/**\n * Determines the best match for a specific available language against the list of user accepted languages.\n */\nconst getBestMatchForLanguage = (\n providedLanguage: string,\n acceptedPreferences: LanguagePreference[],\n providedIndex: number\n): MatchResult => {\n // Initialize with a non-match priority\n let bestMatch: MatchResult = {\n headerIndex: -1,\n qualityScore: 0,\n specificityScore: 0,\n providedIndex,\n };\n\n for (const preference of acceptedPreferences) {\n const matchSpec = calculateMatchSpecificity(\n providedLanguage,\n preference,\n providedIndex\n );\n\n if (matchSpec) {\n // Compare current best match with new match\n const scoreDifference =\n bestMatch.specificityScore - matchSpec.specificityScore ||\n bestMatch.qualityScore - matchSpec.qualityScore ||\n bestMatch.headerIndex - matchSpec.headerIndex;\n\n // If the new match is better (difference < 0), update priority\n if (scoreDifference < 0) {\n bestMatch = matchSpec;\n }\n }\n }\n\n return bestMatch;\n};\n\n/**\n * Comparator function to sort language matches.\n * Sorting order:\n * 1. Quality Score (Descending)\n * 2. Specificity Score (Descending)\n * 3. Order in Header (Ascending - lower index is better)\n * 4. Order in Provided List (Ascending)\n */\nconst compareMatchResults = (a: MatchResult, b: MatchResult): number => {\n return (\n b.qualityScore - a.qualityScore ||\n b.specificityScore - a.specificityScore ||\n a.headerIndex - b.headerIndex ||\n a.providedIndex - b.providedIndex ||\n 0\n );\n};\n\n/**\n * Derives the list of preferred languages based on the Accept-Language header\n * and an optional list of available languages.\n */\nexport const getPreferredLanguages = (\n acceptHeader: string | undefined,\n availableLanguages?: string[]\n): string[] => {\n // RFC 2616 sec 14.4: no header implies '*'\n const headerValue = acceptHeader === undefined ? '*' : acceptHeader || '';\n const acceptedPreferences = parseAcceptLanguageHeader(headerValue);\n\n // If no specific languages are provided to filter against, return the header languages sorted by quality\n if (!availableLanguages) {\n return acceptedPreferences\n .filter((preference) => preference.qualityScore > 0)\n .sort((a, b) => b.qualityScore - a.qualityScore) // Simple sort by quality\n .map((preference) => preference.fullLocale);\n }\n\n // Map available languages to their match priority against the header\n const matchResults = availableLanguages.map((language, index) =>\n getBestMatchForLanguage(language, acceptedPreferences, index)\n );\n\n return matchResults\n .filter((result) => result.qualityScore > 0)\n .sort(compareMatchResults)\n .map((result) => availableLanguages[result.providedIndex]);\n};\n\n/**\n * Detects the locale from the request headers.\n *\n * Headers are provided by the browser/client and can be used to determine the user's preferred language.\n * This function intersects the user's `Accept-Language` header with the application's available locales.\n */\nexport const localeDetector = (\n headers: Record<string, string | undefined>,\n availableLocales?: Locale[],\n defaultLocale?: Locale\n): Locale => {\n const acceptLanguageHeader = headers['accept-language'];\n\n const preferredLocaleStrings = getPreferredLanguages(\n acceptLanguageHeader,\n availableLocales as string[]\n );\n\n return localeResolver(\n preferredLocaleStrings as Locale[],\n availableLocales,\n defaultLocale\n );\n};\n"],"mappings":";;;;;;;AAMA,MAAM,qCACJ;AACF,MAAM,wBAAwB;;;;;AAsC9B,MAAM,oBACJ,WACA,UAC8B;CAC9B,MAAM,QAAQ,mCAAmC,KAAK,UAAU;AAChE,KAAI,CAAC,MACH,QAAO;CAGT,MAAM,eAAe,MAAM;CAC3B,MAAM,aAAa,MAAM;CACzB,MAAM,aAAa,MAAM;CAGzB,MAAM,aAAa,aACf,GAAG,aAAa,GAAG,eACnB;CAEJ,IAAI,eAAe;AAGnB,KAAI,YAAY;EACd,MAAM,gBAAgB,WAAW,MAAM,IAAI;AAC3C,OAAK,MAAM,aAAa,eAAe;GACrC,MAAM,CAAC,KAAK,SAAS,UAAU,MAAM,IAAI;AACzC,OAAI,QAAQ,IACV,gBAAe,WAAW,MAAM;;;AAKtC,QAAO;EACL;EACA;EACA;EACA,eAAe;EACf;EACD;;;;;AAMH,MAAM,6BACJ,gBACyB;CACzB,MAAM,UAAU,YAAY,MAAM,IAAI;CACtC,MAAM,cAAoC,EAAE;AAE5C,MAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS;EAEnD,MAAM,iBAAiB,iBADX,QAAQ,OAAO,MACgB,EAAE,MAAM;AAEnD,MAAI,eACF,aAAY,KAAK,eAAe;;AAIpC,QAAO;;;;;AAMT,MAAM,6BACJ,kBACA,YACA,kBACuB;CACvB,MAAM,iBAAiB,iBAAiB,kBAAkB,cAAc;AACxE,KAAI,CAAC,eACH,QAAO;CAGT,IAAI;CAEJ,MAAM,sBAAsB,WAAW,WAAW,aAAa;CAC/D,MAAM,wBAAwB,WAAW,aAAa,aAAa;CACnE,MAAM,oBAAoB,eAAe,WAAW,aAAa;CACjE,MAAM,sBAAsB,eAAe,aAAa,aAAa;AAErE,KAAI,wBAAwB,kBAC1B;UACS,0BAA0B,kBACnC;UACS,wBAAwB,oBACjC;UACS,WAAW,eAAe,IACnC,QAAO;AAGT,QAAO;EACL;EACA,aAAa,WAAW;EACxB,cAAc,WAAW;EACzB;EACD;;;;;AAMH,MAAM,2BACJ,kBACA,qBACA,kBACgB;CAEhB,IAAI,YAAyB;EAC3B,aAAa;EACb,cAAc;EACd,kBAAkB;EAClB;EACD;AAED,MAAK,MAAM,cAAc,qBAAqB;EAC5C,MAAM,YAAY,0BAChB,kBACA,YACA,cACD;AAED,MAAI,WAQF;QALE,UAAU,mBAAmB,UAAU,oBACvC,UAAU,eAAe,UAAU,gBACnC,UAAU,cAAc,UAAU,eAGd,EACpB,aAAY;;;AAKlB,QAAO;;;;;;;;;;AAWT,MAAM,uBAAuB,GAAgB,MAA2B;AACtE,QACE,EAAE,eAAe,EAAE,gBACnB,EAAE,mBAAmB,EAAE,oBACvB,EAAE,cAAc,EAAE,eAClB,EAAE,gBAAgB,EAAE,iBACpB;;;;;;AAQJ,MAAa,yBACX,cACA,uBACa;CAGb,MAAM,sBAAsB,0BADR,iBAAiB,SAAY,MAAM,gBAAgB,GACL;AAGlE,KAAI,CAAC,mBACH,QAAO,oBACJ,QAAQ,eAAe,WAAW,eAAe,EAAE,CACnD,MAAM,GAAG,MAAM,EAAE,eAAe,EAAE,aAAa,CAC/C,KAAK,eAAe,WAAW,WAAW;AAQ/C,QAJqB,mBAAmB,KAAK,UAAU,UACrD,wBAAwB,UAAU,qBAAqB,MAAM,CAG5C,CAChB,QAAQ,WAAW,OAAO,eAAe,EAAE,CAC3C,KAAK,oBAAoB,CACzB,KAAK,WAAW,mBAAmB,OAAO,eAAe;;;;;;;;AAS9D,MAAa,kBACX,SACA,kBACA,kBACW;CACX,MAAM,uBAAuB,QAAQ;AAOrC,QAAOA,mDALwB,sBAC7B,sBACA,iBAIsB,EACtB,kBACA,cACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"rewriteUtils.cjs","names":[],"sources":["../../../src/localization/rewriteUtils.ts"],"sourcesContent":["// ── Tree-shake constants ──────────────────────────────────────────────────────\n// When these env vars are injected at build time, bundlers eliminate the\n// branches guarded by these constants.\n\n/**\n * True when rewrite rules are explicitly disabled at build time\n * (INTLAYER_ROUTING_REWRITE_RULES === 'false').\n */\nconst TREE_SHAKE_REWRITE =\n process.env['INTLAYER_ROUTING_REWRITE_RULES'] === 'false';\n\nimport type { Locale } from '@intlayer/types/allLocales';\nimport type {\n RewriteObject,\n RewriteRules,\n RoutingConfig,\n} from '@intlayer/types/config';\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\n\nexport type LocalizedPathResult = {\n path: string;\n isRewritten: boolean;\n};\n\n/**\n * Normalizes legacy Record format or extracts specialized rules from RewriteObject.\n */\nexport const getRewriteRules = (\n rewrite: RoutingConfig['rewrite'],\n context: keyof RewriteObject = 'url'\n): RewriteRules | undefined => {\n if (!rewrite || TREE_SHAKE_REWRITE) return undefined;\n\n if ('url' in rewrite) {\n return (rewrite as RewriteObject)[context];\n }\n\n // Normalize legacy format\n return {\n rules: Object.entries(rewrite).map(([canonical, localized]) => ({\n // Normalize canonical path\n canonical: canonical.startsWith('/')\n ? canonical.replace(/\\[([^\\]]+)\\]/g, ':$1')\n : `/${canonical.replace(/\\[([^\\]]+)\\]/g, ':$1')}`,\n\n // Normalize localized path\n localized: Object.fromEntries(\n Object.entries(localized).map(([locale, pattern]) => {\n const normalizedPattern = pattern?.startsWith('/')\n ? pattern.replace(/\\[([^\\]]+)\\]/g, ':$1')\n : `/${(pattern || '').replace(/\\[([^\\]]+)\\]/g, ':$1')}`;\n return [locale, normalizedPattern];\n })\n ),\n })),\n };\n};\n\n/**\n * Converts normalized pattern to Regex.\n * Internal syntax supports:\n * - :param -> ([^/]+) (one segment)\n * - :param* -> (.*) (zero or more segments)\n * - :param+ -> (.+) (one or more segments)\n * - :param? -> ([^/]*) (zero or one segment)\n */\nconst patternToRegex = (pattern: string) => {\n const regexString = pattern\n .replace(/\\//g, '\\\\/') // Escape slashes\n .replace(/\\\\\\/:(?:[^/\\\\*+?]+)\\*/g, '(?:\\\\/(.*))?') // /:param*\n .replace(/\\\\\\/:(?:[^/\\\\*+?]+)\\?/g, '(?:\\\\/([^\\\\/]+))?') // /:param?\n .replace(/:([^/\\\\*+?]+)\\*/g, '(.*)') // :param* (if no leading slash)\n .replace(/:([^/\\\\*+?]+)\\?/g, '([^\\\\/]*)') // :param? (if no leading slash)\n .replace(/:([^/\\\\*+?]+)\\+/g, '(.+)') // :param+\n .replace(/:([^/\\\\*+?]+)/g, '([^\\\\/]+)'); // :param\n\n return new RegExp(`^${regexString}$`);\n};\n\n/**\n * Replaces route parameters in a path with provided values.\n */\nconst fillPath = (pattern: string, params: string[]) => {\n let index = 0;\n return (\n pattern\n .replace(/:([^/\\\\*+?]+)[*+?]?/g, () => params[index++] ?? '')\n .replace(/\\/+/g, '/')\n .replace(/\\/$/, '') || '/'\n );\n};\n\n/**\n * Extract values from a URL based on a pattern.\n */\nconst extractParams = (url: string, pattern: string): string[] | null => {\n const regex = patternToRegex(pattern);\n const match = url.match(regex);\n return match ? match.slice(1) : null;\n};\n\n/**\n * Given a localized URL (e.g., \"/produits/123\"), finds the canonical internal path (e.g., \"/products/123\").\n * If locale is provided, only check for that locale. Otherwise, check for all locales.\n */\nexport const getCanonicalPath = (\n localizedPath: string,\n locale?: Locale,\n rewriteRules?: RewriteRules\n): string => {\n if (!rewriteRules || TREE_SHAKE_REWRITE) return localizedPath;\n\n for (const rule of rewriteRules.rules) {\n const { canonical, localized } = rule;\n const localesToCheck = locale ? [locale] : Object.keys(localized);\n\n for (const loc of localesToCheck) {\n const localizedPattern = localized[loc as keyof typeof localized];\n\n if (!localizedPattern) continue;\n\n const params = extractParams(localizedPath, localizedPattern);\n\n if (params) {\n return fillPath(canonical, params);\n }\n }\n }\n\n return localizedPath;\n};\n\n/**\n * Given a canonical path (e.g., \"/products/123\"), finds the localized URL pattern (e.g., \"/produits/123\").\n */\nexport const getLocalizedPath = (\n canonicalPath: string,\n locale: LocalesValues,\n rewriteRules?: RewriteRules\n): LocalizedPathResult => {\n if (!rewriteRules || TREE_SHAKE_REWRITE)\n return { path: canonicalPath, isRewritten: false };\n\n for (const rule of rewriteRules.rules) {\n const { canonical, localized } = rule;\n\n // Check if the input path matches a configured canonical pattern\n const params = extractParams(canonicalPath, canonical);\n\n if (params) {\n const targetPattern = localized[locale as keyof typeof localized];\n\n if (targetPattern) {\n return {\n path: fillPath(targetPattern, params),\n isRewritten: true,\n };\n }\n }\n }\n\n return { path: canonicalPath, isRewritten: false };\n};\n\n/**\n * Returns the internal path for a given canonical path and locale.\n * Ensures the locale prefix is present exactly once.\n */\nexport const getInternalPath = (\n canonicalPath: string,\n locale: Locale\n): string => {\n const pathWithLeadingSlash = canonicalPath.startsWith('/')\n ? canonicalPath\n : `/${canonicalPath}`;\n\n if (\n pathWithLeadingSlash.startsWith(`/${locale}/`) ||\n pathWithLeadingSlash === `/${locale}`\n ) {\n return pathWithLeadingSlash;\n }\n\n return `/${locale}${pathWithLeadingSlash === '/' ? '' : pathWithLeadingSlash}`;\n};\n\n/**\n * Given a current pathname and locale, returns the pretty localized path if a rewrite rule exists and the path is not already localized.\n */\nexport const getRewritePath = (\n pathname: string,\n locale: Locale,\n rewrite?: RoutingConfig['rewrite']\n): string | undefined => {\n if (TREE_SHAKE_REWRITE) return undefined;\n const rules = getRewriteRules(rewrite, 'url');\n if (!rules) return undefined;\n\n // Identify canonical path (relative to root, no locale prefix expected in 'url' context)\n const canonicalPath = getCanonicalPath(pathname, undefined, rules);\n\n // Get the localized path for the current locale\n const { path: localizedPath, isRewritten } = getLocalizedPath(\n canonicalPath,\n locale,\n rules\n );\n\n if (isRewritten && localizedPath !== pathname) {\n return localizedPath;\n }\n\n return undefined;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"rewriteUtils.cjs","names":[],"sources":["../../../src/localization/rewriteUtils.ts"],"sourcesContent":["// ── Tree-shake constants ──────────────────────────────────────────────────────\n// When these env vars are injected at build time, bundlers eliminate the\n// branches guarded by these constants.\n\n/**\n * True when rewrite rules are explicitly disabled at build time\n * (INTLAYER_ROUTING_REWRITE_RULES === 'false').\n */\nconst TREE_SHAKE_REWRITE =\n process.env['INTLAYER_ROUTING_REWRITE_RULES'] === 'false';\n\nimport type { Locale } from '@intlayer/types/allLocales';\nimport type {\n RewriteObject,\n RewriteRules,\n RoutingConfig,\n} from '@intlayer/types/config';\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\n\nexport type LocalizedPathResult = {\n path: string;\n isRewritten: boolean;\n};\n\n/**\n * Normalizes legacy Record format or extracts specialized rules from RewriteObject.\n */\nexport const getRewriteRules = (\n rewrite: RoutingConfig['rewrite'],\n context: keyof RewriteObject = 'url'\n): RewriteRules | undefined => {\n if (!rewrite || TREE_SHAKE_REWRITE) return undefined;\n\n if ('url' in rewrite) {\n return (rewrite as RewriteObject)[context];\n }\n\n // Normalize legacy format\n return {\n rules: Object.entries(rewrite).map(([canonical, localized]) => ({\n // Normalize canonical path\n canonical: canonical.startsWith('/')\n ? canonical.replace(/\\[([^\\]]+)\\]/g, ':$1')\n : `/${canonical.replace(/\\[([^\\]]+)\\]/g, ':$1')}`,\n\n // Normalize localized path\n localized: Object.fromEntries(\n Object.entries(localized).map(([locale, pattern]) => {\n const normalizedPattern = pattern?.startsWith('/')\n ? pattern.replace(/\\[([^\\]]+)\\]/g, ':$1')\n : `/${(pattern || '').replace(/\\[([^\\]]+)\\]/g, ':$1')}`;\n return [locale, normalizedPattern];\n })\n ),\n })),\n };\n};\n\n/**\n * Converts normalized pattern to Regex.\n * Internal syntax supports:\n * - :param -> ([^/]+) (one segment)\n * - :param* -> (.*) (zero or more segments)\n * - :param+ -> (.+) (one or more segments)\n * - :param? -> ([^/]*) (zero or one segment)\n */\nconst patternToRegex = (pattern: string) => {\n const regexString = pattern\n .replace(/\\//g, '\\\\/') // Escape slashes\n .replace(/\\\\\\/:(?:[^/\\\\*+?]+)\\*/g, '(?:\\\\/(.*))?') // /:param*\n .replace(/\\\\\\/:(?:[^/\\\\*+?]+)\\?/g, '(?:\\\\/([^\\\\/]+))?') // /:param?\n .replace(/:([^/\\\\*+?]+)\\*/g, '(.*)') // :param* (if no leading slash)\n .replace(/:([^/\\\\*+?]+)\\?/g, '([^\\\\/]*)') // :param? (if no leading slash)\n .replace(/:([^/\\\\*+?]+)\\+/g, '(.+)') // :param+\n .replace(/:([^/\\\\*+?]+)/g, '([^\\\\/]+)'); // :param\n\n return new RegExp(`^${regexString}$`);\n};\n\n/**\n * Replaces route parameters in a path with provided values.\n */\nconst fillPath = (pattern: string, params: string[]) => {\n let index = 0;\n return (\n pattern\n .replace(/:([^/\\\\*+?]+)[*+?]?/g, () => params[index++] ?? '')\n .replace(/\\/+/g, '/')\n .replace(/\\/$/, '') || '/'\n );\n};\n\n/**\n * Extract values from a URL based on a pattern.\n */\nconst extractParams = (url: string, pattern: string): string[] | null => {\n const regex = patternToRegex(pattern);\n const match = url.match(regex);\n return match ? match.slice(1) : null;\n};\n\n/**\n * Given a localized URL (e.g., \"/produits/123\"), finds the canonical internal path (e.g., \"/products/123\").\n * If locale is provided, only check for that locale. Otherwise, check for all locales.\n */\nexport const getCanonicalPath = (\n localizedPath: string,\n locale?: Locale,\n rewriteRules?: RewriteRules\n): string => {\n if (!rewriteRules || TREE_SHAKE_REWRITE) return localizedPath;\n\n for (const rule of rewriteRules.rules) {\n const { canonical, localized } = rule;\n const localesToCheck = locale ? [locale] : Object.keys(localized);\n\n for (const loc of localesToCheck) {\n const localizedPattern = localized[loc as keyof typeof localized];\n\n if (!localizedPattern) continue;\n\n const params = extractParams(localizedPath, localizedPattern);\n\n if (params) {\n return fillPath(canonical, params);\n }\n }\n }\n\n return localizedPath;\n};\n\n/**\n * Given a canonical path (e.g., \"/products/123\"), finds the localized URL pattern (e.g., \"/produits/123\").\n */\nexport const getLocalizedPath = (\n canonicalPath: string,\n locale: LocalesValues,\n rewriteRules?: RewriteRules\n): LocalizedPathResult => {\n if (!rewriteRules || TREE_SHAKE_REWRITE)\n return { path: canonicalPath, isRewritten: false };\n\n for (const rule of rewriteRules.rules) {\n const { canonical, localized } = rule;\n\n // Check if the input path matches a configured canonical pattern\n const params = extractParams(canonicalPath, canonical);\n\n if (params) {\n const targetPattern = localized[locale as keyof typeof localized];\n\n if (targetPattern) {\n return {\n path: fillPath(targetPattern, params),\n isRewritten: true,\n };\n }\n }\n }\n\n return { path: canonicalPath, isRewritten: false };\n};\n\n/**\n * Returns the internal path for a given canonical path and locale.\n * Ensures the locale prefix is present exactly once.\n */\nexport const getInternalPath = (\n canonicalPath: string,\n locale: Locale\n): string => {\n const pathWithLeadingSlash = canonicalPath.startsWith('/')\n ? canonicalPath\n : `/${canonicalPath}`;\n\n if (\n pathWithLeadingSlash.startsWith(`/${locale}/`) ||\n pathWithLeadingSlash === `/${locale}`\n ) {\n return pathWithLeadingSlash;\n }\n\n return `/${locale}${pathWithLeadingSlash === '/' ? '' : pathWithLeadingSlash}`;\n};\n\n/**\n * Given a current pathname and locale, returns the pretty localized path if a rewrite rule exists and the path is not already localized.\n */\nexport const getRewritePath = (\n pathname: string,\n locale: Locale,\n rewrite?: RoutingConfig['rewrite']\n): string | undefined => {\n if (TREE_SHAKE_REWRITE) return undefined;\n const rules = getRewriteRules(rewrite, 'url');\n if (!rules) return undefined;\n\n // Identify canonical path (relative to root, no locale prefix expected in 'url' context)\n const canonicalPath = getCanonicalPath(pathname, undefined, rules);\n\n // Get the localized path for the current locale\n const { path: localizedPath, isRewritten } = getLocalizedPath(\n canonicalPath,\n locale,\n rules\n );\n\n if (isRewritten && localizedPath !== pathname) {\n return localizedPath;\n }\n\n return undefined;\n};\n"],"mappings":"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"}
@@ -47,6 +47,10 @@ const validatePrefix = (locale, options) => {
47
47
  isValid: true,
48
48
  localePrefix: void 0
49
49
  };
50
+ if (locale && !/^[a-z]{2,3}(-[a-zA-Z]{2,4})?$/.test(locale)) return {
51
+ isValid: true,
52
+ localePrefix: void 0
53
+ };
50
54
  return {
51
55
  isValid: locales.some((localeEl) => localeEl === locale),
52
56
  localePrefix
@@ -1 +1 @@
1
- {"version":3,"file":"validatePrefix.cjs","names":["resolveRoutingConfig","getPrefix"],"sources":["../../../src/localization/validatePrefix.ts"],"sourcesContent":["// ── Tree-shake constants ──────────────────────────────────────────────────────\n// When these env vars are injected at build time, bundlers eliminate the\n// branches guarded by these constants.\n\n/**\n * True when the build-time routing mode is known and is NOT 'no-prefix'.\n */\nconst TREE_SHAKE_NO_PREFIX =\n process.env['INTLAYER_ROUTING_MODE'] &&\n process.env['INTLAYER_ROUTING_MODE'] !== 'no-prefix';\n\n/**\n * True when the build-time routing mode is known and is NOT 'search-params'.\n */\nconst TREE_SHAKE_SEARCH_PARAMS =\n process.env['INTLAYER_ROUTING_MODE'] &&\n process.env['INTLAYER_ROUTING_MODE'] !== 'search-params';\n\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\nimport {\n getPrefix,\n type RoutingOptions,\n resolveRoutingConfig,\n} from './getPrefix';\n\nexport type ValidatePrefixResult = {\n isValid: boolean;\n localePrefix: string | undefined;\n};\n\n/**\n * Checks whether a given locale is valid based on the configured locales.\n *\n * @param locale - The locale value to validate. Can be `undefined` or `null`.\n * @param options - Optional configuration to override default settings.\n * @param options.locales - Array of valid locales. Defaults to the configured internationalization locales.\n * @param options.defaultLocale - The default locale to use as fallback. Defaults to the configured default locale.\n * @param options.mode - The routing mode (`'prefix'`, `'prefix-all'`, or `'no-prefix'`). Defaults to the configured routing mode.\n * @returns An object containing the validation result and the locale prefix.\n *\n * @example\n * // Check if 'en' is a valid locale\n * const { isValid, localePrefix } = validatePrefix('en');\n *\n * @example\n * // Check with custom options\n * const { isValid, localePrefix } = validatePrefix('fr', {\n * locales: ['en', 'fr', 'es'],\n * defaultLocale: 'en',\n * mode: 'prefix-all',\n * });\n */\nexport const validatePrefix = (\n locale: LocalesValues | undefined | null,\n options?: RoutingOptions\n): ValidatePrefixResult => {\n const { defaultLocale, mode, locales } = resolveRoutingConfig(options);\n\n if (\n (!TREE_SHAKE_NO_PREFIX && mode === 'no-prefix') ||\n (!TREE_SHAKE_SEARCH_PARAMS && mode === 'search-params')\n ) {\n return { isValid: true, localePrefix: undefined };\n }\n\n const { localePrefix } = getPrefix(locale || defaultLocale, {\n mode,\n locales,\n defaultLocale,\n });\n\n if (localePrefix === locale && locale === undefined) {\n return { isValid: true, localePrefix: undefined };\n }\n\n const isValid = locales.some((localeEl) => localeEl === locale);\n\n return { isValid, localePrefix };\n};\n"],"mappings":";;;;;;;AAOA,MAAM,uBACJ,QAAQ,IAAI,4BACZ,QAAQ,IAAI,6BAA6B;;;;AAK3C,MAAM,2BACJ,QAAQ,IAAI,4BACZ,QAAQ,IAAI,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;AAoC3C,MAAa,kBACX,QACA,YACyB;CACzB,MAAM,EAAE,eAAe,MAAM,YAAYA,oDAAqB,QAAQ;AAEtE,KACG,CAAC,wBAAwB,SAAS,eAClC,CAAC,4BAA4B,SAAS,gBAEvC,QAAO;EAAE,SAAS;EAAM,cAAc;EAAW;CAGnD,MAAM,EAAE,iBAAiBC,yCAAU,UAAU,eAAe;EAC1D;EACA;EACA;EACD,CAAC;AAEF,KAAI,iBAAiB,UAAU,WAAW,OACxC,QAAO;EAAE,SAAS;EAAM,cAAc;EAAW;AAKnD,QAAO;EAAE,SAFO,QAAQ,MAAM,aAAa,aAAa,OAAO;EAE7C;EAAc"}
1
+ {"version":3,"file":"validatePrefix.cjs","names":["resolveRoutingConfig","getPrefix"],"sources":["../../../src/localization/validatePrefix.ts"],"sourcesContent":["// ── Tree-shake constants ──────────────────────────────────────────────────────\n// When these env vars are injected at build time, bundlers eliminate the\n// branches guarded by these constants.\n\n/**\n * True when the build-time routing mode is known and is NOT 'no-prefix'.\n */\nconst TREE_SHAKE_NO_PREFIX =\n process.env['INTLAYER_ROUTING_MODE'] &&\n process.env['INTLAYER_ROUTING_MODE'] !== 'no-prefix';\n\n/**\n * True when the build-time routing mode is known and is NOT 'search-params'.\n */\nconst TREE_SHAKE_SEARCH_PARAMS =\n process.env['INTLAYER_ROUTING_MODE'] &&\n process.env['INTLAYER_ROUTING_MODE'] !== 'search-params';\n\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\nimport {\n getPrefix,\n type RoutingOptions,\n resolveRoutingConfig,\n} from './getPrefix';\n\nexport type ValidatePrefixResult = {\n isValid: boolean;\n localePrefix: string | undefined;\n};\n\n/**\n * Checks whether a given locale is valid based on the configured locales.\n *\n * @param locale - The locale value to validate. Can be `undefined` or `null`.\n * @param options - Optional configuration to override default settings.\n * @param options.locales - Array of valid locales. Defaults to the configured internationalization locales.\n * @param options.defaultLocale - The default locale to use as fallback. Defaults to the configured default locale.\n * @param options.mode - The routing mode (`'prefix'`, `'prefix-all'`, or `'no-prefix'`). Defaults to the configured routing mode.\n * @returns An object containing the validation result and the locale prefix.\n *\n * @example\n * // Check if 'en' is a valid locale\n * const { isValid, localePrefix } = validatePrefix('en');\n *\n * @example\n * // Check with custom options\n * const { isValid, localePrefix } = validatePrefix('fr', {\n * locales: ['en', 'fr', 'es'],\n * defaultLocale: 'en',\n * mode: 'prefix-all',\n * });\n */\nexport const validatePrefix = (\n locale: LocalesValues | undefined | null,\n options?: RoutingOptions\n): ValidatePrefixResult => {\n const { defaultLocale, mode, locales } = resolveRoutingConfig(options);\n\n if (\n (!TREE_SHAKE_NO_PREFIX && mode === 'no-prefix') ||\n (!TREE_SHAKE_SEARCH_PARAMS && mode === 'search-params')\n ) {\n return { isValid: true, localePrefix: undefined };\n }\n\n const { localePrefix } = getPrefix(locale || defaultLocale, {\n mode,\n locales,\n defaultLocale,\n });\n\n if (localePrefix === locale && locale === undefined) {\n return { isValid: true, localePrefix: undefined };\n }\n\n // A segment that doesn't match a locale code pattern (e.g. 'concept', 'compiler')\n // is a content slug from a default-locale URL, not an invalid locale attempt.\n if (locale && !/^[a-z]{2,3}(-[a-zA-Z]{2,4})?$/.test(locale)) {\n return { isValid: true, localePrefix: undefined };\n }\n\n const isValid = locales.some((localeEl) => localeEl === locale);\n\n return { isValid, localePrefix };\n};\n"],"mappings":";;;;;;;AAOA,MAAM,uBACJ,QAAQ,IAAI,4BACZ,QAAQ,IAAI,6BAA6B;;;;AAK3C,MAAM,2BACJ,QAAQ,IAAI,4BACZ,QAAQ,IAAI,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;AAoC3C,MAAa,kBACX,QACA,YACyB;CACzB,MAAM,EAAE,eAAe,MAAM,YAAYA,oDAAqB,QAAQ;AAEtE,KACG,CAAC,wBAAwB,SAAS,eAClC,CAAC,4BAA4B,SAAS,gBAEvC,QAAO;EAAE,SAAS;EAAM,cAAc;EAAW;CAGnD,MAAM,EAAE,iBAAiBC,yCAAU,UAAU,eAAe;EAC1D;EACA;EACA;EACD,CAAC;AAEF,KAAI,iBAAiB,UAAU,WAAW,OACxC,QAAO;EAAE,SAAS;EAAM,cAAc;EAAW;AAKnD,KAAI,UAAU,CAAC,gCAAgC,KAAK,OAAO,CACzD,QAAO;EAAE,SAAS;EAAM,cAAc;EAAW;AAKnD,QAAO;EAAE,SAFO,QAAQ,MAAM,aAAa,aAAa,OAExC;EAAE;EAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.cjs","names":["get","cx","defaultSlugify","defaultSanitizer","NAMED_CODES_TO_UNICODE","ORDERED_LIST_R","UNORDERED_LIST_R","ORDERED_LIST_ITEM_R","UNORDERED_LIST_ITEM_R","ORDERED_LIST_ITEM_PREFIX_R","UNORDERED_LIST_ITEM_PREFIX_R","allowInline","LIST_LOOKBEHIND_R","Priority","BLOCK_END_R","trimEnd","some","RuleType","blockRegex","BLOCKQUOTE_R","BLOCKQUOTE_TRIM_LEFT_MULTILINE_R","BLOCKQUOTE_ALERT_R","parseBlock","parseInline","anyScopeRegex","BREAK_LINE_R","captureNothing","BREAK_THEMATIC_R","CODE_BLOCK_R","unescapeString","CODE_BLOCK_FENCED_R","simpleInlineRegex","CODE_INLINE_R","FOOTNOTE_R","renderNothing","inlineRegex","FOOTNOTE_REFERENCE_R","GFM_TASK_R","HEADING_ATX_COMPLIANT_R","HEADING_R","HEADING_SETEXT_R","HTML_BLOCK_ELEMENT_R","HTML_LEFT_TRIM_AMOUNT_R","trimLeadingWhitespaceOutsideFences","DO_NOT_PROCESS_HTML_ELEMENTS","HTML_COMMENT_R","HTML_SELF_CLOSING_ELEMENT_R","CUSTOM_COMPONENT_R","parseCaptureInline","parseSimpleInline","LINK_AUTOLINK_R","startsWith","LINK_AUTOLINK_BARE_URL_R","CONSECUTIVE_NEWLINE_R","REFERENCE_IMAGE_OR_LINK","REFERENCE_IMAGE_R","REFERENCE_LINK_R","NP_TABLE_R","parseTableAlign","parseTableCells","parseTableRow","SHORTCODE_R","TEXT_PLAIN_R","HTML_CHAR_CODE_R","TEXT_BOLD_R","TEXT_EMPHASIZED_R","TEXT_ESCAPED_R","TEXT_MARKED_R","TEXT_STRIKETHROUGHED_R","ATTR_EXTRACTOR_R","normalizeAttributeKey","unquote","ATTRIBUTE_TO_NODE_PROP_MAP","attributeValueToNodePropValue","TRIM_STARTING_NEWLINES","PARAGRAPH_R","parserFor","renderFor","createRenderer","FRONT_MATTER_R","SHOULD_RENDER_AS_BLOCK_R"],"sources":["../../../src/markdown/compiler.ts"],"sourcesContent":["import {\n ATTR_EXTRACTOR_R,\n ATTRIBUTE_TO_NODE_PROP_MAP,\n BLOCK_END_R,\n BLOCKQUOTE_ALERT_R,\n BLOCKQUOTE_R,\n BLOCKQUOTE_TRIM_LEFT_MULTILINE_R,\n BREAK_LINE_R,\n BREAK_THEMATIC_R,\n CODE_BLOCK_FENCED_R,\n CODE_BLOCK_R,\n CODE_INLINE_R,\n CONSECUTIVE_NEWLINE_R,\n CUSTOM_COMPONENT_R,\n DO_NOT_PROCESS_HTML_ELEMENTS,\n FOOTNOTE_R,\n FOOTNOTE_REFERENCE_R,\n FRONT_MATTER_R,\n GFM_TASK_R,\n HEADING_ATX_COMPLIANT_R,\n HEADING_R,\n HEADING_SETEXT_R,\n HTML_BLOCK_ELEMENT_R,\n HTML_CHAR_CODE_R,\n HTML_COMMENT_R,\n HTML_LEFT_TRIM_AMOUNT_R,\n HTML_SELF_CLOSING_ELEMENT_R,\n LINK_AUTOLINK_BARE_URL_R,\n LINK_AUTOLINK_R,\n LIST_LOOKBEHIND_R,\n type ListType,\n NAMED_CODES_TO_UNICODE,\n NP_TABLE_R,\n ORDERED,\n ORDERED_LIST_ITEM_PREFIX_R,\n ORDERED_LIST_ITEM_R,\n ORDERED_LIST_R,\n PARAGRAPH_R,\n Priority,\n REFERENCE_IMAGE_OR_LINK,\n REFERENCE_IMAGE_R,\n REFERENCE_LINK_R,\n RuleType,\n SHORTCODE_R,\n SHOULD_RENDER_AS_BLOCK_R,\n TEXT_BOLD_R,\n TEXT_EMPHASIZED_R,\n TEXT_ESCAPED_R,\n TEXT_MARKED_R,\n TEXT_PLAIN_R,\n TEXT_STRIKETHROUGHED_R,\n TRIM_STARTING_NEWLINES,\n UNORDERED,\n UNORDERED_LIST_ITEM_PREFIX_R,\n UNORDERED_LIST_ITEM_R,\n UNORDERED_LIST_R,\n} from './constants';\nimport { parserFor } from './parser';\nimport { createRenderer, renderFor } from './renderer';\nimport type {\n CompileOptions,\n ComponentOverrides as ComponentDefinition,\n HeadingNode,\n HTMLTag,\n MarkdownContext,\n MarkdownOptions,\n MarkdownRuntime,\n OrderedListNode,\n ParseState,\n Rule,\n Rules,\n TableNode,\n UnorderedListNode,\n} from './types';\nimport {\n allowInline,\n anyScopeRegex,\n attributeValueToNodePropValue,\n blockRegex,\n captureNothing,\n cx,\n sanitizer as defaultSanitizer,\n slugify as defaultSlugify,\n get,\n inlineRegex,\n normalizeAttributeKey,\n parseBlock,\n parseCaptureInline,\n parseInline,\n parseSimpleInline,\n parseTableAlign,\n parseTableCells,\n parseTableRow,\n renderNothing,\n simpleInlineRegex,\n some,\n startsWith,\n trimEnd,\n trimLeadingWhitespaceOutsideFences,\n unescapeString,\n unquote,\n} from './utils';\n\ntype CreateElementFunction = (\n tag: any,\n props: Record<string, any> | null,\n ...children: any[]\n) => unknown;\n\ntype FootnoteDef = { footnote: string; identifier: string };\n\nconst IMAGE_R = /^!\\[(.*?)\\]\\( *((?:\\([^)]*\\)|[^() ])*) *\"?([^)\"]*)?\"?\\)/;\nconst LINK_INSIDE =\n '(?:\\\\[[^\\\\[\\\\]]*(?:\\\\[[^\\\\[\\\\]]*\\\\][^\\\\[\\\\]]*)*\\\\]|[^\\\\[\\\\]])*';\nconst LINK_HREF_AND_TITLE =\n '\\\\s*<?((?:\\\\([^)]*\\\\)|[^\\\\s\\\\\\\\]|\\\\\\\\.)*?)>?(?:\\\\s+[\\'\"]([\\\\s\\\\S]*?)[\\'\"])?\\\\s*';\nconst LINK_R = new RegExp(\n `^\\\\[(${LINK_INSIDE})\\\\]\\\\(${LINK_HREF_AND_TITLE}\\\\)`\n);\n\nconst getTag = (tag: any, components: ComponentDefinition<any>): any => {\n if (typeof tag !== 'string') return tag;\n let override = get(components, tag);\n\n if (!override && typeof tag === 'string') {\n const lowercaseTag = tag.toLowerCase();\n // Try case-insensitive lookup\n const key = Object.keys(components).find(\n (k) => k.toLowerCase() === lowercaseTag\n );\n if (key) {\n override = get(components, key);\n }\n }\n\n if (!override) return tag;\n\n return override;\n};\n\nconst createElementFactory = (\n ctx: MarkdownContext<any>,\n options: MarkdownOptions\n): CreateElementFunction => {\n const { runtime, components = {} } = ctx;\n const filteredTags = options.tagfilter\n ? [\n 'title',\n 'textarea',\n 'style',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'script',\n 'plaintext',\n ]\n : [];\n\n return (\n tag: any,\n props: Record<string, any> | null,\n ...children: any[]\n ): unknown => {\n if (typeof tag === 'string' && filteredTags.includes(tag.toLowerCase())) {\n return null;\n }\n\n const isStringTag = typeof tag === 'string';\n\n const className = cx(props?.className, props?.class);\n\n const mergedProps: Record<string, any> = {};\n let classNameHandled = false;\n\n // Preserve attribute order while merging className\n if (props) {\n for (const key in props) {\n const value = props[key];\n\n if (value === undefined || value === null) continue;\n\n if (key === 'className' || key === 'class') {\n if (!classNameHandled) {\n if (className) mergedProps.className = className;\n classNameHandled = true;\n }\n } else {\n mergedProps[key] = value;\n }\n }\n }\n\n if (!classNameHandled && className) {\n mergedProps.className = className;\n }\n\n let finalProps = mergedProps;\n\n if (runtime.normalizeProps && isStringTag)\n finalProps = runtime.normalizeProps(tag as string, mergedProps);\n const component = getTag(tag, components);\n\n return runtime.createElement(\n component,\n finalProps,\n ...(children.length === 1 ? [children[0]] : children)\n );\n };\n};\n\nconst createRules = (\n createElement: CreateElementFunction,\n ctx: MarkdownContext<any>,\n options: MarkdownOptions,\n footnotes: FootnoteDef[],\n refs: Record<string, { target: string; title?: string }>,\n attrStringToMap: (tag: HTMLTag, str: string) => Record<string, any> | null,\n containsBlockSyntax: (input: string) => boolean,\n nonParagraphBlockSyntaxes: RegExp[]\n): Rules => {\n const slug = (input: string) => {\n if (process.env.NODE_ENV === 'test' && input === '中文') {\n const def = defaultSlugify(input);\n console.log('Slug check:', {\n input,\n ctxSlugify: !!ctx.slugify,\n defaultSlugifyResult: def,\n });\n }\n return ctx.slugify\n ? ctx.slugify(input, defaultSlugify)\n : defaultSlugify(input);\n };\n const sanitize = ctx.sanitizer ?? defaultSanitizer;\n const namedCodesToUnicode = ctx.namedCodesToUnicode\n ? { ...NAMED_CODES_TO_UNICODE, ...ctx.namedCodesToUnicode }\n : NAMED_CODES_TO_UNICODE;\n\n const generateListRule = (\n type: ListType\n ): Rule<OrderedListNode | UnorderedListNode> => {\n const ordered = type === ORDERED;\n const LIST_R = ordered ? ORDERED_LIST_R : UNORDERED_LIST_R;\n const LIST_ITEM_R = ordered ? ORDERED_LIST_ITEM_R : UNORDERED_LIST_ITEM_R;\n const LIST_ITEM_PREFIX_R = ordered\n ? ORDERED_LIST_ITEM_PREFIX_R\n : UNORDERED_LIST_ITEM_PREFIX_R;\n\n return {\n _qualify: (source) => LIST_ITEM_PREFIX_R.test(source),\n _match: allowInline((source, state) => {\n const isStartOfLine = LIST_LOOKBEHIND_R.exec(state.prevCapture ?? '');\n const isListAllowed = state.list ?? (!state.inline && !state.simple);\n\n if (isStartOfLine && isListAllowed) {\n const matchSource = (isStartOfLine[1] || '') + source;\n\n return LIST_R.exec(matchSource);\n }\n\n return null;\n }),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const bullet = capture[2];\n const startValue = ordered ? +bullet.slice(0, -1) : undefined;\n const items = capture[0]\n .replace(BLOCK_END_R, '\\n')\n .match(LIST_ITEM_R) as string[];\n\n if (!items) return { items: [], ordered, start: startValue } as any;\n\n let lastItemWasAParagraph = false;\n\n const result = items.map((item, i) => {\n const prefixCapture = LIST_ITEM_PREFIX_R.exec(item);\n const space = prefixCapture ? prefixCapture[0].length : 0;\n const spaceRegex = new RegExp(`^ {1,${space}}`, 'gm');\n const content = item\n .replace(spaceRegex, '')\n .replace(LIST_ITEM_PREFIX_R, '');\n const isLastItem = i === items.length - 1;\n const containsBlocks = content.indexOf('\\n\\n') !== -1;\n const thisItemIsAParagraph =\n containsBlocks || (isLastItem && lastItemWasAParagraph);\n lastItemWasAParagraph = thisItemIsAParagraph;\n\n const oldStateInline = state.inline;\n const oldStateList = state.list;\n state.list = true;\n\n let adjustedContent: string;\n\n if (thisItemIsAParagraph) {\n state.inline = false;\n adjustedContent = `${trimEnd(content)}\\n\\n`;\n } else {\n state.inline = true;\n adjustedContent = trimEnd(content);\n }\n\n const parsed = parse(adjustedContent, state);\n state.inline = oldStateInline;\n state.list = oldStateList;\n\n return parsed;\n });\n\n return { items: result, ordered, start: startValue } as any;\n },\n _render(node, output, state = {}) {\n const Tag = node.ordered ? 'ol' : 'ul';\n const props: Record<string, any> = { key: state.key };\n\n if (node.ordered && node.start != null) props.start = node.start;\n\n return createElement(\n Tag,\n props,\n ...node.items.map((item, i) =>\n createElement('li', { key: i }, output(item, state))\n )\n );\n },\n };\n };\n\n const matchParagraph = (\n source: string,\n state: ParseState\n ): RegExpMatchArray | null => {\n if (\n state.inline ||\n state.simple ||\n (state.inHTML &&\n source.indexOf('\\n\\n') === -1 &&\n state.prevCapture?.indexOf('\\n\\n') === -1)\n )\n return null;\n let start = 0;\n while (true) {\n const newlineIndex = source.indexOf('\\n', start);\n const line = source.slice(\n start,\n newlineIndex === -1 ? undefined : newlineIndex + 1\n );\n\n if (some(nonParagraphBlockSyntaxes, line)) break;\n\n if (newlineIndex === -1 || !line.trim()) break;\n start = newlineIndex + 1;\n }\n const match = source.slice(0, start);\n // Align with original simple-markdown behavior: capture the whole match including newlines\n\n if (match === '') return null;\n const captured = trimEnd(match);\n\n if (captured === '') return null;\n\n return [match, undefined, captured] as unknown as RegExpMatchArray;\n };\n\n const rules: Rules = {\n [RuleType.blockQuote]: {\n _qualify: ['>'],\n _match: blockRegex(BLOCKQUOTE_R),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const matchAlert = capture[0]\n .replace(BLOCKQUOTE_TRIM_LEFT_MULTILINE_R, '')\n .match(BLOCKQUOTE_ALERT_R);\n const alert = matchAlert?.[1];\n const content = matchAlert?.[2] ?? '';\n const hasNewline = content.indexOf('\\n') !== -1;\n const children = hasNewline\n ? parseBlock(parse, content, state)\n : parseInline(parse, content, state);\n\n return { alert, children };\n },\n _render(node, output, state = {}) {\n const props: Record<string, any> = { key: state.key };\n\n if (node.alert) {\n props.className = `markdown-alert-${slug(node.alert.toLowerCase())}`;\n node.children.unshift({\n attrs: {},\n children: [{ type: RuleType.text, text: node.alert }],\n noInnerParse: true,\n type: RuleType.htmlBlock,\n tag: 'header',\n } as any);\n }\n\n return createElement('blockquote', props, output(node.children, state));\n },\n },\n [RuleType.breakLine]: {\n _qualify: [' '],\n _match: anyScopeRegex(BREAK_LINE_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render(_, __, state = {}) {\n return createElement('br', { key: state.key });\n },\n },\n [RuleType.breakThematic]: {\n _qualify: ['--', '__', '**', '- ', '* ', '_ '],\n _match: blockRegex(BREAK_THEMATIC_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render(_, __, state = {}) {\n return createElement('hr', { key: state.key });\n },\n },\n [RuleType.codeBlock]: {\n _qualify: [' '],\n _match: blockRegex(CODE_BLOCK_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n type: RuleType.codeBlock,\n lang: undefined,\n text: unescapeString(trimEnd(capture[0].replace(/^ {4}/gm, ''))),\n };\n },\n _render(node, _, state = {}) {\n const attrs = { ...((node as any).attrs ?? {}) } as Record<string, any>;\n const langClass = node.lang ? `lang-${node.lang}` : 'lang-plaintext';\n attrs.className = attrs.className\n ? `${attrs.className} ${langClass}`\n : langClass;\n\n if (node.lang && !attrs.lang) attrs.lang = node.lang;\n\n return createElement(\n 'pre',\n { key: state.key },\n createElement('code', attrs, node.text)\n );\n },\n },\n [RuleType.codeFenced]: {\n _qualify: ['```', '~~~'],\n _match: blockRegex(CODE_BLOCK_FENCED_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n attrs: attrStringToMap('code', capture[3] ?? ''),\n lang: capture[2] || undefined,\n text: capture[4],\n type: RuleType.codeBlock,\n };\n },\n },\n [RuleType.codeInline]: {\n _qualify: ['`'],\n _match: simpleInlineRegex(CODE_INLINE_R),\n _order: Priority.LOW,\n _parse(capture) {\n return { text: unescapeString(capture[2]) };\n },\n _render(node, _, state = {}) {\n return createElement('code', { key: state.key }, node.text);\n },\n },\n [RuleType.footnote]: {\n _qualify: ['[^'],\n _match: blockRegex(FOOTNOTE_R),\n _order: Priority.MAX,\n _parse(capture) {\n footnotes.push({ footnote: capture[2], identifier: capture[1] });\n\n return {};\n },\n _render: renderNothing,\n },\n [RuleType.footnoteReference]: {\n _qualify: ['[^'],\n _match: inlineRegex(FOOTNOTE_REFERENCE_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return { target: `#${slug(capture[1])}`, text: capture[1] };\n },\n _render(node, _, state = {}) {\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitize(node.target, 'a', 'href') ?? undefined,\n },\n createElement('sup', { key: state.key }, node.text)\n );\n },\n },\n [RuleType.gfmTask]: {\n _qualify: ['[ ]', '[x]'],\n _match: inlineRegex(GFM_TASK_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return { completed: capture[1].toLowerCase() === 'x' };\n },\n _render(node, _, state = {}) {\n return createElement('input', {\n checked: node.completed,\n key: state.key,\n readOnly: true,\n type: 'checkbox',\n });\n },\n },\n [RuleType.heading]: {\n _qualify: ['#'],\n _match: blockRegex(\n options.enforceAtxHeadings ? HEADING_ATX_COMPLIANT_R : HEADING_R\n ),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n return {\n children: parseInline(parse, capture[2], state),\n id: slug(capture[2]),\n level: capture[1].length as HeadingNode['level'],\n };\n },\n _render(node, output, state = {}) {\n return createElement(\n `h${node.level}` as HTMLTag,\n { id: node.id, key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.headingSetext]: {\n _qualify: (source) => {\n const nlIndex = source.indexOf('\\n');\n\n return (\n nlIndex > 0 &&\n nlIndex < source.length - 1 &&\n (source[nlIndex + 1] === '=' || source[nlIndex + 1] === '-')\n );\n },\n _match: blockRegex(HEADING_SETEXT_R),\n _order: Priority.MAX,\n _parse(capture, parse, state) {\n return {\n children: parseInline(parse, capture[1], state),\n level: capture[2] === '=' ? 1 : 2,\n type: RuleType.heading,\n };\n },\n },\n [RuleType.htmlBlock]: {\n _qualify: (source) => {\n if (options.disableParsingRawHTML) return false;\n\n const match = source.match(/^ *<([a-z][a-z0-9:-]*)\\b/i);\n if (!match) return false;\n const tag = match[1];\n\n return source.toLowerCase().indexOf(`</${tag.toLowerCase()}>`) !== -1;\n },\n _match: anyScopeRegex(HTML_BLOCK_ELEMENT_R),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const m = capture[3].match(HTML_LEFT_TRIM_AMOUNT_R);\n const whitespace = m?.[1] ?? '';\n const trimmed = trimLeadingWhitespaceOutsideFences(\n capture[3],\n whitespace\n );\n const parseFunc = containsBlockSyntax(trimmed)\n ? parseBlock\n : parseInline;\n const tagName = capture[1].trim();\n const noInnerParse =\n DO_NOT_PROCESS_HTML_ELEMENTS.indexOf(tagName.toLowerCase()) !== -1;\n const tag = (noInnerParse ? tagName.toLowerCase() : tagName) as HTMLTag;\n const ast: any = {\n attrs: attrStringToMap(tag, capture[2] ?? ''),\n noInnerParse,\n tag,\n };\n state.inAnchor = state.inAnchor || tagName.toLowerCase() === 'a';\n\n if (noInnerParse) {\n ast.text = capture[3];\n } else {\n const prevInHTML = state.inHTML;\n state.inHTML = true;\n ast.children = parseFunc(parse, trimmed, state);\n state.inHTML = prevInHTML;\n }\n state.inAnchor = false;\n\n return ast;\n },\n _render(node, output, state = {}) {\n return createElement(\n node.tag,\n { key: state.key, ...(node.attrs ?? {}) },\n node.text ?? (node.children ? output(node.children, state) : '')\n );\n },\n },\n [RuleType.htmlComment]: {\n _qualify: ['<!'],\n _match: anyScopeRegex(HTML_COMMENT_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render: renderNothing,\n },\n [RuleType.htmlSelfClosing]: {\n _qualify: (source) => {\n if (options.disableParsingRawHTML) return false;\n\n return /^ *<([a-zA-Z][a-zA-Z0-9:]*)[\\s>/]/.test(source);\n },\n _match: anyScopeRegex(HTML_SELF_CLOSING_ELEMENT_R),\n _order: Priority.HIGH,\n _parse(capture) {\n const tag = capture[1].trim() as HTMLTag;\n\n return { attrs: attrStringToMap(tag, capture[2] || ''), tag };\n },\n _render(node, _, state = {}) {\n return createElement(node.tag, {\n key: state.key,\n ...(node.attrs ?? {}),\n });\n },\n },\n [RuleType.customComponent]: {\n _qualify: (source) => /^ *<([A-Z][a-zA-Z0-9]*)/.test(source),\n _match: anyScopeRegex(CUSTOM_COMPONENT_R),\n _order: Priority.MAX,\n _parse(capture, parse, state) {\n const m = capture[3].match(HTML_LEFT_TRIM_AMOUNT_R);\n const whitespace = m?.[1] ?? '';\n const trimmed = trimLeadingWhitespaceOutsideFences(\n capture[3],\n whitespace\n );\n const parseFunc = containsBlockSyntax(trimmed)\n ? parseBlock\n : parseInline;\n const tag = capture[1].trim();\n const ast: any = {\n attrs: attrStringToMap(tag as HTMLTag, capture[2] ?? ''),\n noInnerParse: false,\n tag,\n };\n const prevInHTML = state.inHTML;\n state.inHTML = true;\n ast.children = parseFunc(parse, trimmed, state);\n state.inHTML = prevInHTML;\n\n return ast;\n },\n _render(node, output, state = {}) {\n return createElement(\n node.tag as HTMLTag,\n { key: state.key, ...(node.attrs ?? {}) },\n node.text ?? (node.children ? output(node.children, state) : '')\n );\n },\n },\n [RuleType.paragraph]: {\n _match: matchParagraph,\n _order: Priority.LOW,\n _parse: parseCaptureInline,\n _render(node, output, state = {}) {\n return createElement(\n 'p',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.image]: {\n _qualify: ['!['],\n _match: simpleInlineRegex(IMAGE_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return {\n alt: unescapeString(capture[1]),\n target: unescapeString(capture[2]),\n title: unescapeString(capture[3]),\n };\n },\n _render(node, _, state = {}) {\n return createElement('img', {\n key: state.key,\n alt: node.alt ?? undefined,\n title: node.title ?? undefined,\n src: sanitize(node.target, 'img', 'src') ?? undefined,\n });\n },\n },\n [RuleType.link]: {\n _qualify: ['['],\n _match: inlineRegex(LINK_R),\n _order: Priority.LOW,\n _parse(capture, parse, state) {\n return {\n children: parseSimpleInline(parse, capture[1], state),\n target: unescapeString(capture[2]),\n title: unescapeString(capture[3]),\n };\n },\n _render(node, output, state = {}) {\n const sanitizedHref = sanitize(node.target, 'a', 'href');\n if (\n process.env.NODE_ENV === 'test' &&\n node.target.includes('javascript:')\n ) {\n console.log('Compiler sanitize result:', {\n target: node.target,\n sanitizedHref,\n finalHref: sanitizedHref ?? undefined,\n });\n }\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitizedHref ?? undefined,\n title: node.title ?? undefined,\n },\n output(node.children, state)\n );\n },\n },\n [RuleType.linkAngleBraceStyleDetector]: {\n _qualify: ['<'],\n _match: inlineRegex(LINK_AUTOLINK_R),\n _order: Priority.MAX,\n _parse(capture) {\n let target = capture[1];\n let isEmail = false;\n\n if (target.indexOf('@') !== -1 && target.indexOf('//') === -1) {\n isEmail = true;\n target = target.replace('mailto:', '');\n }\n\n return {\n children: [{ text: target, type: RuleType.text }],\n target: isEmail ? `mailto:${target}` : target,\n type: RuleType.link,\n };\n },\n },\n [RuleType.linkBareUrlDetector]: {\n _qualify: (source, state) =>\n !!(\n state.inline &&\n !state.inAnchor &&\n !options.disableAutoLink &&\n (startsWith(source, 'http://') || startsWith(source, 'https://'))\n ),\n _match: inlineRegex(LINK_AUTOLINK_BARE_URL_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n children: [{ text: capture[1], type: RuleType.text }],\n target: capture[1],\n type: RuleType.link,\n };\n },\n },\n [RuleType.newlineCoalescer]: {\n _match: blockRegex(CONSECUTIVE_NEWLINE_R),\n _order: Priority.LOW,\n _parse: captureNothing,\n _render() {\n return '\\n';\n },\n },\n [RuleType.orderedList]: generateListRule(ORDERED),\n [RuleType.unorderedList]: generateListRule(UNORDERED),\n [RuleType.ref]: {\n _qualify: ['['],\n _match: anyScopeRegex(REFERENCE_IMAGE_OR_LINK),\n _order: Priority.MAX,\n _parse(capture) {\n refs[capture[1]] = { target: capture[2], title: capture[4] };\n\n return {};\n },\n _render: renderNothing,\n },\n [RuleType.refImage]: {\n _qualify: ['!['],\n _match: simpleInlineRegex(REFERENCE_IMAGE_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n alt: capture[1] ? unescapeString(capture[1]) : undefined,\n ref: capture[2],\n };\n },\n _render(node, _, state = {}) {\n const ref = refs[node.ref];\n\n if (!ref) return null;\n\n return createElement('img', {\n key: state.key,\n alt: node.alt,\n src: sanitize(ref.target, 'img', 'src') ?? undefined,\n title: ref.title,\n });\n },\n },\n [RuleType.refLink]: {\n _qualify: (source) => source[0] === '[' && source.indexOf('](') === -1,\n _match: inlineRegex(REFERENCE_LINK_R),\n _order: Priority.MAX,\n _parse(capture, parse, state) {\n return {\n children: parseSimpleInline(parse, capture[1], state),\n fallbackChildren: capture[0],\n ref: capture[2],\n };\n },\n _render(node, output, state = {}) {\n const ref = refs[node.ref];\n\n if (!ref)\n return createElement(\n 'span',\n { key: state.key },\n node.fallbackChildren\n );\n\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitize(ref.target, 'a', 'href') ?? undefined,\n title: ref.title,\n },\n output(node.children, state)\n );\n },\n },\n [RuleType.table]: {\n _qualify: ['|'],\n _match: blockRegex(NP_TABLE_R),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n state.inline = true;\n const align = capture[2] ? parseTableAlign(capture[2]) : [];\n const cells = capture[3]\n ? parseTableCells(capture[3], parse, state)\n : [];\n const header = parseTableRow(capture[1], parse, state, !!cells.length);\n state.inline = false;\n\n return cells.length\n ? { align, cells, header, type: RuleType.table }\n : { children: header.flat(), type: RuleType.paragraph };\n },\n _render(node, output, state = {}) {\n const table = node as TableNode;\n const getStyle = (i: number) =>\n table.align[i] && table.align[i] !== 'left'\n ? { textAlign: table.align[i] }\n : {};\n\n return createElement(\n 'table',\n { key: state.key },\n createElement(\n 'thead',\n null,\n createElement(\n 'tr',\n null,\n ...table.header.map((c, i) =>\n createElement(\n 'th',\n { key: i, style: getStyle(i) },\n output(c, state)\n )\n )\n )\n ),\n createElement(\n 'tbody',\n null,\n ...table.cells.map((row, i) =>\n createElement(\n 'tr',\n { key: i },\n ...row.map((c, j) =>\n createElement(\n 'td',\n { key: j, style: getStyle(j) },\n output(c, state)\n )\n )\n )\n )\n )\n );\n },\n },\n [RuleType.tableSeparator]: {\n _match: (source, state) =>\n state.inTable && source[0] === '|' ? /^\\|/.exec(source) : null,\n _order: Priority.HIGH,\n _parse() {\n return { type: RuleType.tableSeparator };\n },\n _render() {\n return ' | ';\n },\n },\n [RuleType.text]: {\n _match: allowInline((source, _state) => {\n const shortMatch = SHORTCODE_R.exec(source);\n\n if (shortMatch) return shortMatch;\n\n return TEXT_PLAIN_R.exec(source) || /^[\\s\\S]/.exec(source);\n }),\n _order: Priority.MIN,\n _parse(capture) {\n const text = capture[0];\n\n return {\n text:\n text.indexOf('&') === -1\n ? text\n : text.replace(HTML_CHAR_CODE_R, (f, i) => {\n if (i.startsWith('#x'))\n return String.fromCharCode(parseInt(i.slice(2), 16));\n if (i.startsWith('#'))\n return String.fromCharCode(parseInt(i.slice(1), 10));\n return namedCodesToUnicode[i] || f;\n }),\n };\n },\n _render(node) {\n return node.text;\n },\n },\n [RuleType.textBolded]: {\n _qualify: ['**', '__'],\n _match: simpleInlineRegex(TEXT_BOLD_R),\n _order: Priority.MED,\n _parse(capture, parse, state) {\n return { children: parse(capture[2], state) };\n },\n _render(node, output, state = {}) {\n return createElement(\n 'strong',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textEmphasized]: {\n _qualify: ['*', '_'],\n _match: simpleInlineRegex(TEXT_EMPHASIZED_R),\n _order: Priority.LOW,\n _parse(capture, parse, state) {\n return { children: parse(capture[2], state) };\n },\n _render(node, output, state = {}) {\n return createElement(\n 'em',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textEscaped]: {\n _qualify: ['\\\\'],\n _match: simpleInlineRegex(TEXT_ESCAPED_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return { text: capture[1], type: RuleType.text };\n },\n },\n [RuleType.textMarked]: {\n _qualify: ['=='],\n _match: simpleInlineRegex(TEXT_MARKED_R),\n _order: Priority.LOW,\n _parse: parseCaptureInline,\n _render(node, output, state = {}) {\n return createElement(\n 'mark',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textStrikethroughed]: {\n _qualify: ['~~'],\n _match: simpleInlineRegex(TEXT_STRIKETHROUGHED_R),\n _order: Priority.LOW,\n _parse: parseCaptureInline,\n _render(node, output, state = {}) {\n return createElement(\n 'del',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n };\n\n return rules;\n};\n\n// Removed compilerCache completely to avoid issues with props changes not invalidating cache\n// const compilerCache = new Map<string, unknown>();\n\nexport const compile = (\n markdown: string = '',\n ctx: MarkdownContext<any>,\n options: MarkdownOptions = {}\n): unknown => {\n // const cacheKey = JSON.stringify({\n // markdown,\n // options,\n // components: ctx.components ? Object.keys(ctx.components) : [],\n // });\n\n // if (compilerCache.has(cacheKey)) {\n // return compilerCache.get(cacheKey);\n // }\n\n const components = ctx.components ?? {};\n const slug = (input: string) => {\n if (process.env.NODE_ENV === 'test' && input === '中文') {\n const def = defaultSlugify(input);\n console.log('Slug check:', {\n input,\n ctxSlugify: !!ctx.slugify,\n defaultSlugifyResult: def,\n });\n }\n return ctx.slugify\n ? ctx.slugify(input, defaultSlugify)\n : defaultSlugify(input);\n };\n const createElement = createElementFactory(ctx, options);\n const footnotes: FootnoteDef[] = [];\n const refs: Record<string, { target: string; title?: string }> = {};\n\n const attrStringToMap = (\n tag: HTMLTag,\n str: string\n ): Record<string, any> | null => {\n if (!str || !str.trim()) return null;\n const attributes = str.match(ATTR_EXTRACTOR_R);\n\n if (!attributes) return null;\n\n return attributes.reduce((map: any, raw) => {\n const delimiterIdx = raw.indexOf('=');\n\n if (delimiterIdx !== -1) {\n const key = normalizeAttributeKey(raw.slice(0, delimiterIdx)).trim();\n const value = unquote(raw.slice(delimiterIdx + 1).trim());\n const mappedKey = ATTRIBUTE_TO_NODE_PROP_MAP[key] ?? key;\n\n if (mappedKey === 'ref') return map;\n map[mappedKey] = attributeValueToNodePropValue(\n tag,\n key,\n value,\n ctx.sanitizer ?? defaultSanitizer\n );\n\n if (\n typeof map[mappedKey] === 'string' &&\n (HTML_BLOCK_ELEMENT_R.test(map[mappedKey]) ||\n HTML_SELF_CLOSING_ELEMENT_R.test(map[mappedKey]))\n ) {\n map[mappedKey] = compileInner(map[mappedKey].trim());\n }\n } else if (raw !== 'style') {\n map[ATTRIBUTE_TO_NODE_PROP_MAP[raw] ?? raw] = true;\n }\n\n return map;\n }, {});\n };\n\n const nonParagraphBlockSyntaxes = [\n BLOCKQUOTE_R,\n CODE_BLOCK_FENCED_R,\n CODE_BLOCK_R,\n options.enforceAtxHeadings ? HEADING_ATX_COMPLIANT_R : HEADING_R,\n HEADING_SETEXT_R,\n NP_TABLE_R,\n ORDERED_LIST_R,\n UNORDERED_LIST_R,\n CUSTOM_COMPONENT_R,\n ];\n\n const containsBlockSyntax = (input: string): boolean => {\n const cleaned = input.replace(TRIM_STARTING_NEWLINES, '');\n const slice = cleaned.length > 2048 ? cleaned.slice(0, 2048) : cleaned;\n const syntaxes = options.disableParsingRawHTML\n ? nonParagraphBlockSyntaxes\n : [\n ...nonParagraphBlockSyntaxes,\n PARAGRAPH_R,\n HTML_BLOCK_ELEMENT_R,\n HTML_COMMENT_R,\n HTML_SELF_CLOSING_ELEMENT_R,\n CUSTOM_COMPONENT_R,\n ];\n\n return some(syntaxes as RegExp[], slice);\n };\n\n const baseRules = createRules(\n createElement,\n ctx,\n options,\n footnotes,\n refs,\n attrStringToMap,\n containsBlockSyntax,\n nonParagraphBlockSyntaxes\n );\n\n const rules = options.disableParsingRawHTML\n ? Object.keys(baseRules).reduce((acc, key) => {\n if (key !== RuleType.htmlBlock && key !== RuleType.htmlSelfClosing) {\n acc[key] = baseRules[key];\n }\n\n return acc;\n }, {} as Rules)\n : baseRules;\n\n const parser = parserFor(rules);\n const emitter = renderFor(createRenderer(rules, options.renderRule));\n\n const compileInner = (input: string): unknown => {\n const result = options.preserveFrontmatter\n ? input\n : input.replace(FRONT_MATTER_R, '');\n const inline =\n options.forceInline ||\n (!options.forceBlock &&\n SHOULD_RENDER_AS_BLOCK_R.test(\n result.replace(TRIM_STARTING_NEWLINES, '')\n ) === false);\n const arr = emitter(\n parser(\n inline\n ? result\n : `${trimEnd(result).replace(TRIM_STARTING_NEWLINES, '')}\\n\\n`,\n { inline }\n ),\n { inline }\n ) as unknown as any[];\n while (\n typeof arr[arr.length - 1] === 'string' &&\n !arr[arr.length - 1].trim()\n )\n arr.pop();\n\n if (options.wrapper === null) return arr;\n const wrapper = options.wrapper ?? (inline ? 'span' : 'div');\n\n if (arr.length > 1 || options.forceWrapper)\n return createElement(wrapper, { key: 'outer' }, arr);\n\n if (arr.length === 1) {\n const node = arr[0];\n\n if (typeof node === 'string') {\n const spanProps: Record<string, any> = { key: 'outer' };\n\n if (!inline && components) {\n const pOverrideProps = (get(components, 'p.props', {}) ??\n {}) as Record<string, any>;\n const mergedClassName = cx(\n spanProps.className,\n pOverrideProps.className\n );\n const finalSpanProps: Record<string, any> = {\n ...spanProps,\n ...pOverrideProps,\n };\n\n if (mergedClassName) finalSpanProps.className = mergedClassName;\n\n return createElement('span', finalSpanProps, node);\n }\n\n return createElement('span', spanProps, node);\n }\n\n return node;\n }\n\n return createElement(wrapper, { key: 'outer' }, null);\n };\n\n if (typeof markdown !== 'string') {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n 'intlayer: the first argument must be a string. Received',\n typeof markdown\n );\n }\n throw new Error('intlayer: the first argument must be a string');\n }\n\n const node = compileInner(markdown);\n\n const result = footnotes.length\n ? createElement(\n 'div',\n null,\n node,\n createElement(\n 'footer',\n { key: 'footer' },\n ...footnotes.map((def) =>\n createElement(\n 'div',\n { id: slug(def.identifier), key: def.identifier },\n def.identifier,\n emitter(parser(def.footnote, { inline: true }), { inline: true })\n )\n )\n )\n )\n : node;\n\n // compilerCache.set(cacheKey, result);\n\n return result;\n};\n\nexport const createCompiler =\n (ctx: MarkdownContext<any>) =>\n (markdown: string, options?: MarkdownOptions): unknown =>\n compile(markdown, ctx, options);\n\nexport const compileWithOptions = (\n markdown: string,\n runtime: MarkdownRuntime,\n options: CompileOptions<any> = {}\n): unknown => {\n const {\n components,\n namedCodesToUnicode,\n sanitizer,\n slugify,\n ...compilerOptions\n } = options;\n\n return compile(\n markdown,\n { runtime, components, namedCodesToUnicode, sanitizer, slugify },\n compilerOptions\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"compiler.cjs","names":["get","cx","defaultSlugify","defaultSanitizer","NAMED_CODES_TO_UNICODE","ORDERED_LIST_R","UNORDERED_LIST_R","ORDERED_LIST_ITEM_R","UNORDERED_LIST_ITEM_R","ORDERED_LIST_ITEM_PREFIX_R","UNORDERED_LIST_ITEM_PREFIX_R","allowInline","LIST_LOOKBEHIND_R","Priority","BLOCK_END_R","trimEnd","some","RuleType","blockRegex","BLOCKQUOTE_R","BLOCKQUOTE_TRIM_LEFT_MULTILINE_R","BLOCKQUOTE_ALERT_R","parseBlock","parseInline","anyScopeRegex","BREAK_LINE_R","captureNothing","BREAK_THEMATIC_R","CODE_BLOCK_R","unescapeString","CODE_BLOCK_FENCED_R","simpleInlineRegex","CODE_INLINE_R","FOOTNOTE_R","renderNothing","inlineRegex","FOOTNOTE_REFERENCE_R","GFM_TASK_R","HEADING_ATX_COMPLIANT_R","HEADING_R","HEADING_SETEXT_R","HTML_BLOCK_ELEMENT_R","HTML_LEFT_TRIM_AMOUNT_R","trimLeadingWhitespaceOutsideFences","DO_NOT_PROCESS_HTML_ELEMENTS","HTML_COMMENT_R","HTML_SELF_CLOSING_ELEMENT_R","CUSTOM_COMPONENT_R","parseCaptureInline","parseSimpleInline","LINK_AUTOLINK_R","startsWith","LINK_AUTOLINK_BARE_URL_R","CONSECUTIVE_NEWLINE_R","REFERENCE_IMAGE_OR_LINK","REFERENCE_IMAGE_R","REFERENCE_LINK_R","NP_TABLE_R","parseTableAlign","parseTableCells","parseTableRow","SHORTCODE_R","TEXT_PLAIN_R","HTML_CHAR_CODE_R","TEXT_BOLD_R","TEXT_EMPHASIZED_R","TEXT_ESCAPED_R","TEXT_MARKED_R","TEXT_STRIKETHROUGHED_R","ATTR_EXTRACTOR_R","normalizeAttributeKey","unquote","ATTRIBUTE_TO_NODE_PROP_MAP","attributeValueToNodePropValue","TRIM_STARTING_NEWLINES","PARAGRAPH_R","parserFor","renderFor","createRenderer","FRONT_MATTER_R","SHOULD_RENDER_AS_BLOCK_R"],"sources":["../../../src/markdown/compiler.ts"],"sourcesContent":["import {\n ATTR_EXTRACTOR_R,\n ATTRIBUTE_TO_NODE_PROP_MAP,\n BLOCK_END_R,\n BLOCKQUOTE_ALERT_R,\n BLOCKQUOTE_R,\n BLOCKQUOTE_TRIM_LEFT_MULTILINE_R,\n BREAK_LINE_R,\n BREAK_THEMATIC_R,\n CODE_BLOCK_FENCED_R,\n CODE_BLOCK_R,\n CODE_INLINE_R,\n CONSECUTIVE_NEWLINE_R,\n CUSTOM_COMPONENT_R,\n DO_NOT_PROCESS_HTML_ELEMENTS,\n FOOTNOTE_R,\n FOOTNOTE_REFERENCE_R,\n FRONT_MATTER_R,\n GFM_TASK_R,\n HEADING_ATX_COMPLIANT_R,\n HEADING_R,\n HEADING_SETEXT_R,\n HTML_BLOCK_ELEMENT_R,\n HTML_CHAR_CODE_R,\n HTML_COMMENT_R,\n HTML_LEFT_TRIM_AMOUNT_R,\n HTML_SELF_CLOSING_ELEMENT_R,\n LINK_AUTOLINK_BARE_URL_R,\n LINK_AUTOLINK_R,\n LIST_LOOKBEHIND_R,\n type ListType,\n NAMED_CODES_TO_UNICODE,\n NP_TABLE_R,\n ORDERED,\n ORDERED_LIST_ITEM_PREFIX_R,\n ORDERED_LIST_ITEM_R,\n ORDERED_LIST_R,\n PARAGRAPH_R,\n Priority,\n REFERENCE_IMAGE_OR_LINK,\n REFERENCE_IMAGE_R,\n REFERENCE_LINK_R,\n RuleType,\n SHORTCODE_R,\n SHOULD_RENDER_AS_BLOCK_R,\n TEXT_BOLD_R,\n TEXT_EMPHASIZED_R,\n TEXT_ESCAPED_R,\n TEXT_MARKED_R,\n TEXT_PLAIN_R,\n TEXT_STRIKETHROUGHED_R,\n TRIM_STARTING_NEWLINES,\n UNORDERED,\n UNORDERED_LIST_ITEM_PREFIX_R,\n UNORDERED_LIST_ITEM_R,\n UNORDERED_LIST_R,\n} from './constants';\nimport { parserFor } from './parser';\nimport { createRenderer, renderFor } from './renderer';\nimport type {\n CompileOptions,\n ComponentOverrides as ComponentDefinition,\n HeadingNode,\n HTMLTag,\n MarkdownContext,\n MarkdownOptions,\n MarkdownRuntime,\n OrderedListNode,\n ParseState,\n Rule,\n Rules,\n TableNode,\n UnorderedListNode,\n} from './types';\nimport {\n allowInline,\n anyScopeRegex,\n attributeValueToNodePropValue,\n blockRegex,\n captureNothing,\n cx,\n sanitizer as defaultSanitizer,\n slugify as defaultSlugify,\n get,\n inlineRegex,\n normalizeAttributeKey,\n parseBlock,\n parseCaptureInline,\n parseInline,\n parseSimpleInline,\n parseTableAlign,\n parseTableCells,\n parseTableRow,\n renderNothing,\n simpleInlineRegex,\n some,\n startsWith,\n trimEnd,\n trimLeadingWhitespaceOutsideFences,\n unescapeString,\n unquote,\n} from './utils';\n\ntype CreateElementFunction = (\n tag: any,\n props: Record<string, any> | null,\n ...children: any[]\n) => unknown;\n\ntype FootnoteDef = { footnote: string; identifier: string };\n\nconst IMAGE_R = /^!\\[(.*?)\\]\\( *((?:\\([^)]*\\)|[^() ])*) *\"?([^)\"]*)?\"?\\)/;\nconst LINK_INSIDE =\n '(?:\\\\[[^\\\\[\\\\]]*(?:\\\\[[^\\\\[\\\\]]*\\\\][^\\\\[\\\\]]*)*\\\\]|[^\\\\[\\\\]])*';\nconst LINK_HREF_AND_TITLE =\n '\\\\s*<?((?:\\\\([^)]*\\\\)|[^\\\\s\\\\\\\\]|\\\\\\\\.)*?)>?(?:\\\\s+[\\'\"]([\\\\s\\\\S]*?)[\\'\"])?\\\\s*';\nconst LINK_R = new RegExp(\n `^\\\\[(${LINK_INSIDE})\\\\]\\\\(${LINK_HREF_AND_TITLE}\\\\)`\n);\n\nconst getTag = (tag: any, components: ComponentDefinition<any>): any => {\n if (typeof tag !== 'string') return tag;\n let override = get(components, tag);\n\n if (!override && typeof tag === 'string') {\n const lowercaseTag = tag.toLowerCase();\n // Try case-insensitive lookup\n const key = Object.keys(components).find(\n (k) => k.toLowerCase() === lowercaseTag\n );\n if (key) {\n override = get(components, key);\n }\n }\n\n if (!override) return tag;\n\n return override;\n};\n\nconst createElementFactory = (\n ctx: MarkdownContext<any>,\n options: MarkdownOptions\n): CreateElementFunction => {\n const { runtime, components = {} } = ctx;\n const filteredTags = options.tagfilter\n ? [\n 'title',\n 'textarea',\n 'style',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'script',\n 'plaintext',\n ]\n : [];\n\n return (\n tag: any,\n props: Record<string, any> | null,\n ...children: any[]\n ): unknown => {\n if (typeof tag === 'string' && filteredTags.includes(tag.toLowerCase())) {\n return null;\n }\n\n const isStringTag = typeof tag === 'string';\n\n const className = cx(props?.className, props?.class);\n\n const mergedProps: Record<string, any> = {};\n let classNameHandled = false;\n\n // Preserve attribute order while merging className\n if (props) {\n for (const key in props) {\n const value = props[key];\n\n if (value === undefined || value === null) continue;\n\n if (key === 'className' || key === 'class') {\n if (!classNameHandled) {\n if (className) mergedProps.className = className;\n classNameHandled = true;\n }\n } else {\n mergedProps[key] = value;\n }\n }\n }\n\n if (!classNameHandled && className) {\n mergedProps.className = className;\n }\n\n let finalProps = mergedProps;\n\n if (runtime.normalizeProps && isStringTag)\n finalProps = runtime.normalizeProps(tag as string, mergedProps);\n const component = getTag(tag, components);\n\n return runtime.createElement(\n component,\n finalProps,\n ...(children.length === 1 ? [children[0]] : children)\n );\n };\n};\n\nconst createRules = (\n createElement: CreateElementFunction,\n ctx: MarkdownContext<any>,\n options: MarkdownOptions,\n footnotes: FootnoteDef[],\n refs: Record<string, { target: string; title?: string }>,\n attrStringToMap: (tag: HTMLTag, str: string) => Record<string, any> | null,\n containsBlockSyntax: (input: string) => boolean,\n nonParagraphBlockSyntaxes: RegExp[]\n): Rules => {\n const slug = (input: string) => {\n if (process.env.NODE_ENV === 'test' && input === '中文') {\n const def = defaultSlugify(input);\n console.log('Slug check:', {\n input,\n ctxSlugify: !!ctx.slugify,\n defaultSlugifyResult: def,\n });\n }\n return ctx.slugify\n ? ctx.slugify(input, defaultSlugify)\n : defaultSlugify(input);\n };\n const sanitize = ctx.sanitizer ?? defaultSanitizer;\n const namedCodesToUnicode = ctx.namedCodesToUnicode\n ? { ...NAMED_CODES_TO_UNICODE, ...ctx.namedCodesToUnicode }\n : NAMED_CODES_TO_UNICODE;\n\n const generateListRule = (\n type: ListType\n ): Rule<OrderedListNode | UnorderedListNode> => {\n const ordered = type === ORDERED;\n const LIST_R = ordered ? ORDERED_LIST_R : UNORDERED_LIST_R;\n const LIST_ITEM_R = ordered ? ORDERED_LIST_ITEM_R : UNORDERED_LIST_ITEM_R;\n const LIST_ITEM_PREFIX_R = ordered\n ? ORDERED_LIST_ITEM_PREFIX_R\n : UNORDERED_LIST_ITEM_PREFIX_R;\n\n return {\n _qualify: (source) => LIST_ITEM_PREFIX_R.test(source),\n _match: allowInline((source, state) => {\n const isStartOfLine = LIST_LOOKBEHIND_R.exec(state.prevCapture ?? '');\n const isListAllowed = state.list ?? (!state.inline && !state.simple);\n\n if (isStartOfLine && isListAllowed) {\n const matchSource = (isStartOfLine[1] || '') + source;\n\n return LIST_R.exec(matchSource);\n }\n\n return null;\n }),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const bullet = capture[2];\n const startValue = ordered ? +bullet.slice(0, -1) : undefined;\n const items = capture[0]\n .replace(BLOCK_END_R, '\\n')\n .match(LIST_ITEM_R) as string[];\n\n if (!items) return { items: [], ordered, start: startValue } as any;\n\n let lastItemWasAParagraph = false;\n\n const result = items.map((item, i) => {\n const prefixCapture = LIST_ITEM_PREFIX_R.exec(item);\n const space = prefixCapture ? prefixCapture[0].length : 0;\n const spaceRegex = new RegExp(`^ {1,${space}}`, 'gm');\n const content = item\n .replace(spaceRegex, '')\n .replace(LIST_ITEM_PREFIX_R, '');\n const isLastItem = i === items.length - 1;\n const containsBlocks = content.indexOf('\\n\\n') !== -1;\n const thisItemIsAParagraph =\n containsBlocks || (isLastItem && lastItemWasAParagraph);\n lastItemWasAParagraph = thisItemIsAParagraph;\n\n const oldStateInline = state.inline;\n const oldStateList = state.list;\n state.list = true;\n\n let adjustedContent: string;\n\n if (thisItemIsAParagraph) {\n state.inline = false;\n adjustedContent = `${trimEnd(content)}\\n\\n`;\n } else {\n state.inline = true;\n adjustedContent = trimEnd(content);\n }\n\n const parsed = parse(adjustedContent, state);\n state.inline = oldStateInline;\n state.list = oldStateList;\n\n return parsed;\n });\n\n return { items: result, ordered, start: startValue } as any;\n },\n _render(node, output, state = {}) {\n const Tag = node.ordered ? 'ol' : 'ul';\n const props: Record<string, any> = { key: state.key };\n\n if (node.ordered && node.start != null) props.start = node.start;\n\n return createElement(\n Tag,\n props,\n ...node.items.map((item, i) =>\n createElement('li', { key: i }, output(item, state))\n )\n );\n },\n };\n };\n\n const matchParagraph = (\n source: string,\n state: ParseState\n ): RegExpMatchArray | null => {\n if (\n state.inline ||\n state.simple ||\n (state.inHTML &&\n source.indexOf('\\n\\n') === -1 &&\n state.prevCapture?.indexOf('\\n\\n') === -1)\n )\n return null;\n let start = 0;\n while (true) {\n const newlineIndex = source.indexOf('\\n', start);\n const line = source.slice(\n start,\n newlineIndex === -1 ? undefined : newlineIndex + 1\n );\n\n if (some(nonParagraphBlockSyntaxes, line)) break;\n\n if (newlineIndex === -1 || !line.trim()) break;\n start = newlineIndex + 1;\n }\n const match = source.slice(0, start);\n // Align with original simple-markdown behavior: capture the whole match including newlines\n\n if (match === '') return null;\n const captured = trimEnd(match);\n\n if (captured === '') return null;\n\n return [match, undefined, captured] as unknown as RegExpMatchArray;\n };\n\n const rules: Rules = {\n [RuleType.blockQuote]: {\n _qualify: ['>'],\n _match: blockRegex(BLOCKQUOTE_R),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const matchAlert = capture[0]\n .replace(BLOCKQUOTE_TRIM_LEFT_MULTILINE_R, '')\n .match(BLOCKQUOTE_ALERT_R);\n const alert = matchAlert?.[1];\n const content = matchAlert?.[2] ?? '';\n const hasNewline = content.indexOf('\\n') !== -1;\n const children = hasNewline\n ? parseBlock(parse, content, state)\n : parseInline(parse, content, state);\n\n return { alert, children };\n },\n _render(node, output, state = {}) {\n const props: Record<string, any> = { key: state.key };\n\n if (node.alert) {\n props.className = `markdown-alert-${slug(node.alert.toLowerCase())}`;\n node.children.unshift({\n attrs: {},\n children: [{ type: RuleType.text, text: node.alert }],\n noInnerParse: true,\n type: RuleType.htmlBlock,\n tag: 'header',\n } as any);\n }\n\n return createElement('blockquote', props, output(node.children, state));\n },\n },\n [RuleType.breakLine]: {\n _qualify: [' '],\n _match: anyScopeRegex(BREAK_LINE_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render(_, __, state = {}) {\n return createElement('br', { key: state.key });\n },\n },\n [RuleType.breakThematic]: {\n _qualify: ['--', '__', '**', '- ', '* ', '_ '],\n _match: blockRegex(BREAK_THEMATIC_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render(_, __, state = {}) {\n return createElement('hr', { key: state.key });\n },\n },\n [RuleType.codeBlock]: {\n _qualify: [' '],\n _match: blockRegex(CODE_BLOCK_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n type: RuleType.codeBlock,\n lang: undefined,\n text: unescapeString(trimEnd(capture[0].replace(/^ {4}/gm, ''))),\n };\n },\n _render(node, _, state = {}) {\n const attrs = { ...((node as any).attrs ?? {}) } as Record<string, any>;\n const langClass = node.lang ? `lang-${node.lang}` : 'lang-plaintext';\n attrs.className = attrs.className\n ? `${attrs.className} ${langClass}`\n : langClass;\n\n if (node.lang && !attrs.lang) attrs.lang = node.lang;\n\n return createElement(\n 'pre',\n { key: state.key },\n createElement('code', attrs, node.text)\n );\n },\n },\n [RuleType.codeFenced]: {\n _qualify: ['```', '~~~'],\n _match: blockRegex(CODE_BLOCK_FENCED_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n attrs: attrStringToMap('code', capture[3] ?? ''),\n lang: capture[2] || undefined,\n text: capture[4],\n type: RuleType.codeBlock,\n };\n },\n },\n [RuleType.codeInline]: {\n _qualify: ['`'],\n _match: simpleInlineRegex(CODE_INLINE_R),\n _order: Priority.LOW,\n _parse(capture) {\n return { text: unescapeString(capture[2]) };\n },\n _render(node, _, state = {}) {\n return createElement('code', { key: state.key }, node.text);\n },\n },\n [RuleType.footnote]: {\n _qualify: ['[^'],\n _match: blockRegex(FOOTNOTE_R),\n _order: Priority.MAX,\n _parse(capture) {\n footnotes.push({ footnote: capture[2], identifier: capture[1] });\n\n return {};\n },\n _render: renderNothing,\n },\n [RuleType.footnoteReference]: {\n _qualify: ['[^'],\n _match: inlineRegex(FOOTNOTE_REFERENCE_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return { target: `#${slug(capture[1])}`, text: capture[1] };\n },\n _render(node, _, state = {}) {\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitize(node.target, 'a', 'href') ?? undefined,\n },\n createElement('sup', { key: state.key }, node.text)\n );\n },\n },\n [RuleType.gfmTask]: {\n _qualify: ['[ ]', '[x]'],\n _match: inlineRegex(GFM_TASK_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return { completed: capture[1].toLowerCase() === 'x' };\n },\n _render(node, _, state = {}) {\n return createElement('input', {\n checked: node.completed,\n key: state.key,\n readOnly: true,\n type: 'checkbox',\n });\n },\n },\n [RuleType.heading]: {\n _qualify: ['#'],\n _match: blockRegex(\n options.enforceAtxHeadings ? HEADING_ATX_COMPLIANT_R : HEADING_R\n ),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n return {\n children: parseInline(parse, capture[2], state),\n id: slug(capture[2]),\n level: capture[1].length as HeadingNode['level'],\n };\n },\n _render(node, output, state = {}) {\n return createElement(\n `h${node.level}` as HTMLTag,\n { id: node.id, key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.headingSetext]: {\n _qualify: (source) => {\n const nlIndex = source.indexOf('\\n');\n\n return (\n nlIndex > 0 &&\n nlIndex < source.length - 1 &&\n (source[nlIndex + 1] === '=' || source[nlIndex + 1] === '-')\n );\n },\n _match: blockRegex(HEADING_SETEXT_R),\n _order: Priority.MAX,\n _parse(capture, parse, state) {\n return {\n children: parseInline(parse, capture[1], state),\n level: capture[2] === '=' ? 1 : 2,\n type: RuleType.heading,\n };\n },\n },\n [RuleType.htmlBlock]: {\n _qualify: (source) => {\n if (options.disableParsingRawHTML) return false;\n\n const match = source.match(/^ *<([a-z][a-z0-9:-]*)\\b/i);\n if (!match) return false;\n const tag = match[1];\n\n return source.toLowerCase().indexOf(`</${tag.toLowerCase()}>`) !== -1;\n },\n _match: anyScopeRegex(HTML_BLOCK_ELEMENT_R),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const m = capture[3].match(HTML_LEFT_TRIM_AMOUNT_R);\n const whitespace = m?.[1] ?? '';\n const trimmed = trimLeadingWhitespaceOutsideFences(\n capture[3],\n whitespace\n );\n const parseFunc = containsBlockSyntax(trimmed)\n ? parseBlock\n : parseInline;\n const tagName = capture[1].trim();\n const noInnerParse =\n DO_NOT_PROCESS_HTML_ELEMENTS.indexOf(tagName.toLowerCase()) !== -1;\n const tag = (noInnerParse ? tagName.toLowerCase() : tagName) as HTMLTag;\n const ast: any = {\n attrs: attrStringToMap(tag, capture[2] ?? ''),\n noInnerParse,\n tag,\n };\n state.inAnchor = state.inAnchor || tagName.toLowerCase() === 'a';\n\n if (noInnerParse) {\n ast.text = capture[3];\n } else {\n const prevInHTML = state.inHTML;\n state.inHTML = true;\n ast.children = parseFunc(parse, trimmed, state);\n state.inHTML = prevInHTML;\n }\n state.inAnchor = false;\n\n return ast;\n },\n _render(node, output, state = {}) {\n return createElement(\n node.tag,\n { key: state.key, ...(node.attrs ?? {}) },\n node.text ?? (node.children ? output(node.children, state) : '')\n );\n },\n },\n [RuleType.htmlComment]: {\n _qualify: ['<!'],\n _match: anyScopeRegex(HTML_COMMENT_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render: renderNothing,\n },\n [RuleType.htmlSelfClosing]: {\n _qualify: (source) => {\n if (options.disableParsingRawHTML) return false;\n\n return /^ *<([a-zA-Z][a-zA-Z0-9:]*)[\\s>/]/.test(source);\n },\n _match: anyScopeRegex(HTML_SELF_CLOSING_ELEMENT_R),\n _order: Priority.HIGH,\n _parse(capture) {\n const tag = capture[1].trim() as HTMLTag;\n\n return { attrs: attrStringToMap(tag, capture[2] || ''), tag };\n },\n _render(node, _, state = {}) {\n return createElement(node.tag, {\n key: state.key,\n ...(node.attrs ?? {}),\n });\n },\n },\n [RuleType.customComponent]: {\n _qualify: (source) => /^ *<([A-Z][a-zA-Z0-9]*)/.test(source),\n _match: anyScopeRegex(CUSTOM_COMPONENT_R),\n _order: Priority.MAX,\n _parse(capture, parse, state) {\n const m = capture[3].match(HTML_LEFT_TRIM_AMOUNT_R);\n const whitespace = m?.[1] ?? '';\n const trimmed = trimLeadingWhitespaceOutsideFences(\n capture[3],\n whitespace\n );\n const parseFunc = containsBlockSyntax(trimmed)\n ? parseBlock\n : parseInline;\n const tag = capture[1].trim();\n const ast: any = {\n attrs: attrStringToMap(tag as HTMLTag, capture[2] ?? ''),\n noInnerParse: false,\n tag,\n };\n const prevInHTML = state.inHTML;\n state.inHTML = true;\n ast.children = parseFunc(parse, trimmed, state);\n state.inHTML = prevInHTML;\n\n return ast;\n },\n _render(node, output, state = {}) {\n return createElement(\n node.tag as HTMLTag,\n { key: state.key, ...(node.attrs ?? {}) },\n node.text ?? (node.children ? output(node.children, state) : '')\n );\n },\n },\n [RuleType.paragraph]: {\n _match: matchParagraph,\n _order: Priority.LOW,\n _parse: parseCaptureInline,\n _render(node, output, state = {}) {\n return createElement(\n 'p',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.image]: {\n _qualify: ['!['],\n _match: simpleInlineRegex(IMAGE_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return {\n alt: unescapeString(capture[1]),\n target: unescapeString(capture[2]),\n title: unescapeString(capture[3]),\n };\n },\n _render(node, _, state = {}) {\n return createElement('img', {\n key: state.key,\n alt: node.alt ?? undefined,\n title: node.title ?? undefined,\n src: sanitize(node.target, 'img', 'src') ?? undefined,\n });\n },\n },\n [RuleType.link]: {\n _qualify: ['['],\n _match: inlineRegex(LINK_R),\n _order: Priority.LOW,\n _parse(capture, parse, state) {\n return {\n children: parseSimpleInline(parse, capture[1], state),\n target: unescapeString(capture[2]),\n title: unescapeString(capture[3]),\n };\n },\n _render(node, output, state = {}) {\n const sanitizedHref = sanitize(node.target, 'a', 'href');\n if (\n process.env.NODE_ENV === 'test' &&\n node.target.includes('javascript:')\n ) {\n console.log('Compiler sanitize result:', {\n target: node.target,\n sanitizedHref,\n finalHref: sanitizedHref ?? undefined,\n });\n }\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitizedHref ?? undefined,\n title: node.title ?? undefined,\n },\n output(node.children, state)\n );\n },\n },\n [RuleType.linkAngleBraceStyleDetector]: {\n _qualify: ['<'],\n _match: inlineRegex(LINK_AUTOLINK_R),\n _order: Priority.MAX,\n _parse(capture) {\n let target = capture[1];\n let isEmail = false;\n\n if (target.indexOf('@') !== -1 && target.indexOf('//') === -1) {\n isEmail = true;\n target = target.replace('mailto:', '');\n }\n\n return {\n children: [{ text: target, type: RuleType.text }],\n target: isEmail ? `mailto:${target}` : target,\n type: RuleType.link,\n };\n },\n },\n [RuleType.linkBareUrlDetector]: {\n _qualify: (source, state) =>\n !!(\n state.inline &&\n !state.inAnchor &&\n !options.disableAutoLink &&\n (startsWith(source, 'http://') || startsWith(source, 'https://'))\n ),\n _match: inlineRegex(LINK_AUTOLINK_BARE_URL_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n children: [{ text: capture[1], type: RuleType.text }],\n target: capture[1],\n type: RuleType.link,\n };\n },\n },\n [RuleType.newlineCoalescer]: {\n _match: blockRegex(CONSECUTIVE_NEWLINE_R),\n _order: Priority.LOW,\n _parse: captureNothing,\n _render() {\n return '\\n';\n },\n },\n [RuleType.orderedList]: generateListRule(ORDERED),\n [RuleType.unorderedList]: generateListRule(UNORDERED),\n [RuleType.ref]: {\n _qualify: ['['],\n _match: anyScopeRegex(REFERENCE_IMAGE_OR_LINK),\n _order: Priority.MAX,\n _parse(capture) {\n refs[capture[1]] = { target: capture[2], title: capture[4] };\n\n return {};\n },\n _render: renderNothing,\n },\n [RuleType.refImage]: {\n _qualify: ['!['],\n _match: simpleInlineRegex(REFERENCE_IMAGE_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n alt: capture[1] ? unescapeString(capture[1]) : undefined,\n ref: capture[2],\n };\n },\n _render(node, _, state = {}) {\n const ref = refs[node.ref];\n\n if (!ref) return null;\n\n return createElement('img', {\n key: state.key,\n alt: node.alt,\n src: sanitize(ref.target, 'img', 'src') ?? undefined,\n title: ref.title,\n });\n },\n },\n [RuleType.refLink]: {\n _qualify: (source) => source[0] === '[' && source.indexOf('](') === -1,\n _match: inlineRegex(REFERENCE_LINK_R),\n _order: Priority.MAX,\n _parse(capture, parse, state) {\n return {\n children: parseSimpleInline(parse, capture[1], state),\n fallbackChildren: capture[0],\n ref: capture[2],\n };\n },\n _render(node, output, state = {}) {\n const ref = refs[node.ref];\n\n if (!ref)\n return createElement(\n 'span',\n { key: state.key },\n node.fallbackChildren\n );\n\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitize(ref.target, 'a', 'href') ?? undefined,\n title: ref.title,\n },\n output(node.children, state)\n );\n },\n },\n [RuleType.table]: {\n _qualify: ['|'],\n _match: blockRegex(NP_TABLE_R),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n state.inline = true;\n const align = capture[2] ? parseTableAlign(capture[2]) : [];\n const cells = capture[3]\n ? parseTableCells(capture[3], parse, state)\n : [];\n const header = parseTableRow(capture[1], parse, state, !!cells.length);\n state.inline = false;\n\n return cells.length\n ? { align, cells, header, type: RuleType.table }\n : { children: header.flat(), type: RuleType.paragraph };\n },\n _render(node, output, state = {}) {\n const table = node as TableNode;\n const getStyle = (i: number) =>\n table.align[i] && table.align[i] !== 'left'\n ? { textAlign: table.align[i] }\n : {};\n\n return createElement(\n 'table',\n { key: state.key },\n createElement(\n 'thead',\n null,\n createElement(\n 'tr',\n null,\n ...table.header.map((c, i) =>\n createElement(\n 'th',\n { key: i, style: getStyle(i) },\n output(c, state)\n )\n )\n )\n ),\n createElement(\n 'tbody',\n null,\n ...table.cells.map((row, i) =>\n createElement(\n 'tr',\n { key: i },\n ...row.map((c, j) =>\n createElement(\n 'td',\n { key: j, style: getStyle(j) },\n output(c, state)\n )\n )\n )\n )\n )\n );\n },\n },\n [RuleType.tableSeparator]: {\n _match: (source, state) =>\n state.inTable && source[0] === '|' ? /^\\|/.exec(source) : null,\n _order: Priority.HIGH,\n _parse() {\n return { type: RuleType.tableSeparator };\n },\n _render() {\n return ' | ';\n },\n },\n [RuleType.text]: {\n _match: allowInline((source, _state) => {\n const shortMatch = SHORTCODE_R.exec(source);\n\n if (shortMatch) return shortMatch;\n\n return TEXT_PLAIN_R.exec(source) || /^[\\s\\S]/.exec(source);\n }),\n _order: Priority.MIN,\n _parse(capture) {\n const text = capture[0];\n\n return {\n text:\n text.indexOf('&') === -1\n ? text\n : text.replace(HTML_CHAR_CODE_R, (f, i) => {\n if (i.startsWith('#x'))\n return String.fromCharCode(parseInt(i.slice(2), 16));\n if (i.startsWith('#'))\n return String.fromCharCode(parseInt(i.slice(1), 10));\n return namedCodesToUnicode[i] || f;\n }),\n };\n },\n _render(node) {\n return node.text;\n },\n },\n [RuleType.textBolded]: {\n _qualify: ['**', '__'],\n _match: simpleInlineRegex(TEXT_BOLD_R),\n _order: Priority.MED,\n _parse(capture, parse, state) {\n return { children: parse(capture[2], state) };\n },\n _render(node, output, state = {}) {\n return createElement(\n 'strong',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textEmphasized]: {\n _qualify: ['*', '_'],\n _match: simpleInlineRegex(TEXT_EMPHASIZED_R),\n _order: Priority.LOW,\n _parse(capture, parse, state) {\n return { children: parse(capture[2], state) };\n },\n _render(node, output, state = {}) {\n return createElement(\n 'em',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textEscaped]: {\n _qualify: ['\\\\'],\n _match: simpleInlineRegex(TEXT_ESCAPED_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return { text: capture[1], type: RuleType.text };\n },\n },\n [RuleType.textMarked]: {\n _qualify: ['=='],\n _match: simpleInlineRegex(TEXT_MARKED_R),\n _order: Priority.LOW,\n _parse: parseCaptureInline,\n _render(node, output, state = {}) {\n return createElement(\n 'mark',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textStrikethroughed]: {\n _qualify: ['~~'],\n _match: simpleInlineRegex(TEXT_STRIKETHROUGHED_R),\n _order: Priority.LOW,\n _parse: parseCaptureInline,\n _render(node, output, state = {}) {\n return createElement(\n 'del',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n };\n\n return rules;\n};\n\n// Removed compilerCache completely to avoid issues with props changes not invalidating cache\n// const compilerCache = new Map<string, unknown>();\n\nexport const compile = (\n markdown: string = '',\n ctx: MarkdownContext<any>,\n options: MarkdownOptions = {}\n): unknown => {\n // const cacheKey = JSON.stringify({\n // markdown,\n // options,\n // components: ctx.components ? Object.keys(ctx.components) : [],\n // });\n\n // if (compilerCache.has(cacheKey)) {\n // return compilerCache.get(cacheKey);\n // }\n\n const components = ctx.components ?? {};\n const slug = (input: string) => {\n if (process.env.NODE_ENV === 'test' && input === '中文') {\n const def = defaultSlugify(input);\n console.log('Slug check:', {\n input,\n ctxSlugify: !!ctx.slugify,\n defaultSlugifyResult: def,\n });\n }\n return ctx.slugify\n ? ctx.slugify(input, defaultSlugify)\n : defaultSlugify(input);\n };\n const createElement = createElementFactory(ctx, options);\n const footnotes: FootnoteDef[] = [];\n const refs: Record<string, { target: string; title?: string }> = {};\n\n const attrStringToMap = (\n tag: HTMLTag,\n str: string\n ): Record<string, any> | null => {\n if (!str || !str.trim()) return null;\n const attributes = str.match(ATTR_EXTRACTOR_R);\n\n if (!attributes) return null;\n\n return attributes.reduce((map: any, raw) => {\n const delimiterIdx = raw.indexOf('=');\n\n if (delimiterIdx !== -1) {\n const key = normalizeAttributeKey(raw.slice(0, delimiterIdx)).trim();\n const value = unquote(raw.slice(delimiterIdx + 1).trim());\n const mappedKey = ATTRIBUTE_TO_NODE_PROP_MAP[key] ?? key;\n\n if (mappedKey === 'ref') return map;\n map[mappedKey] = attributeValueToNodePropValue(\n tag,\n key,\n value,\n ctx.sanitizer ?? defaultSanitizer\n );\n\n if (\n typeof map[mappedKey] === 'string' &&\n (HTML_BLOCK_ELEMENT_R.test(map[mappedKey]) ||\n HTML_SELF_CLOSING_ELEMENT_R.test(map[mappedKey]))\n ) {\n map[mappedKey] = compileInner(map[mappedKey].trim());\n }\n } else if (raw !== 'style') {\n map[ATTRIBUTE_TO_NODE_PROP_MAP[raw] ?? raw] = true;\n }\n\n return map;\n }, {});\n };\n\n const nonParagraphBlockSyntaxes = [\n BLOCKQUOTE_R,\n CODE_BLOCK_FENCED_R,\n CODE_BLOCK_R,\n options.enforceAtxHeadings ? HEADING_ATX_COMPLIANT_R : HEADING_R,\n HEADING_SETEXT_R,\n NP_TABLE_R,\n ORDERED_LIST_R,\n UNORDERED_LIST_R,\n CUSTOM_COMPONENT_R,\n ];\n\n const containsBlockSyntax = (input: string): boolean => {\n const cleaned = input.replace(TRIM_STARTING_NEWLINES, '');\n const slice = cleaned.length > 2048 ? cleaned.slice(0, 2048) : cleaned;\n const syntaxes = options.disableParsingRawHTML\n ? nonParagraphBlockSyntaxes\n : [\n ...nonParagraphBlockSyntaxes,\n PARAGRAPH_R,\n HTML_BLOCK_ELEMENT_R,\n HTML_COMMENT_R,\n HTML_SELF_CLOSING_ELEMENT_R,\n CUSTOM_COMPONENT_R,\n ];\n\n return some(syntaxes as RegExp[], slice);\n };\n\n const baseRules = createRules(\n createElement,\n ctx,\n options,\n footnotes,\n refs,\n attrStringToMap,\n containsBlockSyntax,\n nonParagraphBlockSyntaxes\n );\n\n const rules = options.disableParsingRawHTML\n ? Object.keys(baseRules).reduce((acc, key) => {\n if (key !== RuleType.htmlBlock && key !== RuleType.htmlSelfClosing) {\n acc[key] = baseRules[key];\n }\n\n return acc;\n }, {} as Rules)\n : baseRules;\n\n const parser = parserFor(rules);\n const emitter = renderFor(createRenderer(rules, options.renderRule));\n\n const compileInner = (input: string): unknown => {\n const result = options.preserveFrontmatter\n ? input\n : input.replace(FRONT_MATTER_R, '');\n const inline =\n options.forceInline ||\n (!options.forceBlock &&\n SHOULD_RENDER_AS_BLOCK_R.test(\n result.replace(TRIM_STARTING_NEWLINES, '')\n ) === false);\n const arr = emitter(\n parser(\n inline\n ? result\n : `${trimEnd(result).replace(TRIM_STARTING_NEWLINES, '')}\\n\\n`,\n { inline }\n ),\n { inline }\n ) as unknown as any[];\n while (\n typeof arr[arr.length - 1] === 'string' &&\n !arr[arr.length - 1].trim()\n )\n arr.pop();\n\n if (options.wrapper === null) return arr;\n const wrapper = options.wrapper ?? (inline ? 'span' : 'div');\n\n if (arr.length > 1 || options.forceWrapper)\n return createElement(wrapper, { key: 'outer' }, arr);\n\n if (arr.length === 1) {\n const node = arr[0];\n\n if (typeof node === 'string') {\n const spanProps: Record<string, any> = { key: 'outer' };\n\n if (!inline && components) {\n const pOverrideProps = (get(components, 'p.props', {}) ??\n {}) as Record<string, any>;\n const mergedClassName = cx(\n spanProps.className,\n pOverrideProps.className\n );\n const finalSpanProps: Record<string, any> = {\n ...spanProps,\n ...pOverrideProps,\n };\n\n if (mergedClassName) finalSpanProps.className = mergedClassName;\n\n return createElement('span', finalSpanProps, node);\n }\n\n return createElement('span', spanProps, node);\n }\n\n return node;\n }\n\n return createElement(wrapper, { key: 'outer' }, null);\n };\n\n if (typeof markdown !== 'string') {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n 'intlayer: the first argument must be a string. Received',\n typeof markdown\n );\n }\n throw new Error('intlayer: the first argument must be a string');\n }\n\n const node = compileInner(markdown);\n\n const result = footnotes.length\n ? createElement(\n 'div',\n null,\n node,\n createElement(\n 'footer',\n { key: 'footer' },\n ...footnotes.map((def) =>\n createElement(\n 'div',\n { id: slug(def.identifier), key: def.identifier },\n def.identifier,\n emitter(parser(def.footnote, { inline: true }), { inline: true })\n )\n )\n )\n )\n : node;\n\n // compilerCache.set(cacheKey, result);\n\n return result;\n};\n\nexport const createCompiler =\n (ctx: MarkdownContext<any>) =>\n (markdown: string, options?: MarkdownOptions): unknown =>\n compile(markdown, ctx, options);\n\nexport const compileWithOptions = (\n markdown: string,\n runtime: MarkdownRuntime,\n options: CompileOptions<any> = {}\n): unknown => {\n const {\n components,\n namedCodesToUnicode,\n sanitizer,\n slugify,\n ...compilerOptions\n } = options;\n\n return compile(\n markdown,\n { runtime, components, namedCodesToUnicode, sanitizer, slugify },\n compilerOptions\n );\n};\n"],"mappings":"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"}
@@ -17,13 +17,18 @@ const RuleType = {
17
17
  gfmTask: "8",
18
18
  heading: "9",
19
19
  headingSetext: "10",
20
+ /** only available if not `disableHTMLParsing` */
20
21
  htmlBlock: "11",
21
22
  htmlComment: "12",
23
+ /** only available if not `disableHTMLParsing` */
22
24
  htmlSelfClosing: "13",
25
+ /** Custom components like <Tabs>, <TabItem> */
23
26
  customComponent: "34",
24
27
  image: "14",
25
28
  link: "15",
29
+ /** emits a `link` 'node', does not render directly */
26
30
  linkAngleBraceStyleDetector: "16",
31
+ /** emits a `link` 'node', does not render directly */
27
32
  linkBareUrlDetector: "17",
28
33
  newlineCoalescer: "19",
29
34
  orderedList: "20",
@@ -48,10 +53,15 @@ if (process.env.NODE_ENV === "test") Object.keys(RuleType).forEach((key) => {
48
53
  * Priority levels for rule ordering.
49
54
  */
50
55
  const Priority = {
56
+ /** anything that must scan the tree before everything else */
51
57
  MAX: 0,
58
+ /** scans for block-level constructs */
52
59
  HIGH: 1,
60
+ /** inline w/ more priority than other inline */
53
61
  MED: 2,
62
+ /** inline elements */
54
63
  LOW: 3,
64
+ /** bare text and stuff that is considered leftovers */
55
65
  MIN: 4
56
66
  };
57
67
  /** Threshold for performance logging (in milliseconds) */