{
  "version": 3,
  "sources": ["../src/create-i18n.ts"],
  "sourcesContent": ["/**\n * External dependencies\n */\nimport type { TanninLocaleDomain } from 'tannin';\nimport Tannin from 'tannin';\n\n/**\n * WordPress dependencies\n */\nimport type { Hooks } from '@wordpress/hooks';\n\n/**\n * Internal dependencies\n */\nimport type {\n\tgetFilterDomain,\n\tI18n,\n\tLocaleData,\n\tSubscribeCallback,\n\tTransformedText,\n\tUnsubscribeCallback,\n} from './types';\n/**\n * Default locale data to use for Tannin domain when not otherwise provided.\n * Assumes an English plural forms expression.\n */\nconst DEFAULT_LOCALE_DATA: LocaleData = {\n\t'': {\n\t\tplural_forms( n: number ) {\n\t\t\treturn n === 1 ? 0 : 1;\n\t\t},\n\t},\n};\n\n/*\n * Regular expression that matches i18n hooks like `i18n.gettext`, `i18n.ngettext`,\n * `i18n.gettext_domain` or `i18n.ngettext_with_context` or `i18n.has_translation`.\n */\nconst I18N_HOOK_REGEXP = /^i18n\\.(n?gettext|has_translation)(_|$)/;\n\n/**\n * Create an i18n instance\n *\n * @param [initialData]   Locale data configuration.\n * @param [initialDomain] Domain for which configuration applies.\n * @param [hooks]         Hooks implementation.\n *\n * @return I18n instance.\n */\nexport const createI18n = < TextDomain extends string >(\n\tinitialData?: LocaleData< TextDomain >,\n\tinitialDomain?: TextDomain,\n\thooks?: Hooks\n): I18n< TextDomain > => {\n\t/**\n\t * The underlying instance of Tannin to which exported functions interface.\n\t */\n\tconst tannin = new Tannin( {} );\n\n\tconst listeners = new Set< () => void >();\n\n\tconst notifyListeners = () => {\n\t\tlisteners.forEach( ( listener ) => listener() );\n\t};\n\n\t/**\n\t * Subscribe to changes of locale data.\n\t *\n\t * @param callback Subscription callback.\n\t * @return Unsubscribe callback.\n\t */\n\tconst subscribe = ( callback: SubscribeCallback ): UnsubscribeCallback => {\n\t\tlisteners.add( callback );\n\t\treturn () => listeners.delete( callback );\n\t};\n\n\tconst getLocaleData: I18n< TextDomain >[ 'getLocaleData' ] = (\n\t\tdomain = 'default' as TextDomain\n\t) => tannin.data[ domain ] as LocaleData< TextDomain >;\n\n\t/**\n\t * @param [data]\n\t * @param [domain]\n\t */\n\tconst doSetLocaleData = (\n\t\tdata?: LocaleData,\n\t\tdomain: TextDomain = 'default' as TextDomain\n\t) => {\n\t\ttannin.data[ domain ] = {\n\t\t\t...tannin.data[ domain ],\n\t\t\t...data,\n\t\t} as TanninLocaleDomain;\n\n\t\t// Populate default domain configuration (supported locale date which omits\n\t\t// a plural forms expression).\n\t\ttannin.data[ domain ][ '' ] = {\n\t\t\t...DEFAULT_LOCALE_DATA[ '' ],\n\t\t\t...tannin.data[ domain ]?.[ '' ],\n\t\t};\n\n\t\t// Clean up cached plural forms functions cache as it might be updated.\n\t\tdelete tannin.pluralForms[ domain ];\n\t};\n\n\tconst setLocaleData: I18n< TextDomain >[ 'setLocaleData' ] = (\n\t\tdata,\n\t\tdomain\n\t) => {\n\t\tdoSetLocaleData( data, domain );\n\t\tnotifyListeners();\n\t};\n\n\tconst addLocaleData: I18n< TextDomain >[ 'addLocaleData' ] = (\n\t\tdata,\n\t\tdomain = 'default' as TextDomain\n\t) => {\n\t\ttannin.data[ domain ] = {\n\t\t\t...tannin.data[ domain ],\n\t\t\t...data,\n\t\t\t// Populate default domain configuration (supported locale date which omits\n\t\t\t// a plural forms expression).\n\t\t\t'': {\n\t\t\t\t...DEFAULT_LOCALE_DATA[ '' ],\n\t\t\t\t...tannin.data[ domain ]?.[ '' ],\n\t\t\t\t...data?.[ '' ],\n\t\t\t},\n\t\t} as TanninLocaleDomain;\n\n\t\t// Clean up cached plural forms functions cache as it might be updated.\n\t\tdelete tannin.pluralForms[ domain ];\n\n\t\tnotifyListeners();\n\t};\n\n\tconst resetLocaleData: I18n< TextDomain >[ 'resetLocaleData' ] = (\n\t\tdata,\n\t\tdomain\n\t) => {\n\t\t// Reset all current Tannin locale data.\n\t\ttannin.data = {};\n\n\t\t// Reset cached plural forms functions cache.\n\t\ttannin.pluralForms = {};\n\n\t\tsetLocaleData( data, domain );\n\t};\n\n\t/**\n\t * Wrapper for Tannin's `dcnpgettext`. Populates default locale data if not\n\t * otherwise previously assigned.\n\t *\n\t * @param domain   Domain to retrieve the translated text.\n\t * @param context  Context information for the translators.\n\t * @param single   Text to translate if non-plural. Used as\n\t *                 fallback return value on a caught error.\n\t * @param [plural] The text to be used if the number is\n\t *                 plural.\n\t * @param [number] The number to compare against to use\n\t *                 either the singular or plural form.\n\t *\n\t * @return The translated string.\n\t */\n\tconst dcnpgettext = (\n\t\tdomain = 'default' as TextDomain,\n\t\tcontext: string | void,\n\t\tsingle: string,\n\t\tplural?: string,\n\t\tnumber?: number\n\t): string => {\n\t\tif ( ! tannin.data[ domain ] ) {\n\t\t\t// Use `doSetLocaleData` to set silently, without notifying listeners.\n\t\t\tdoSetLocaleData( undefined, domain );\n\t\t}\n\n\t\treturn tannin.dcnpgettext( domain, context, single, plural, number );\n\t};\n\n\tconst getFilterDomain: getFilterDomain = ( domain ) => domain || 'default';\n\n\tconst __: I18n< TextDomain >[ '__' ] = ( text, domain ) => {\n\t\tlet translation = dcnpgettext( domain, undefined, text );\n\t\tif ( ! hooks ) {\n\t\t\treturn translation as TransformedText< typeof text >;\n\t\t}\n\n\t\t/**\n\t\t * Filters text with its translation.\n\t\t *\n\t\t * @param translation Translated text.\n\t\t * @param text        Text to translate.\n\t\t * @param domain      Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = hooks.applyFilters(\n\t\t\t'i18n.gettext',\n\t\t\ttranslation,\n\t\t\ttext,\n\t\t\tdomain\n\t\t) as TransformedText< typeof text >;\n\n\t\treturn hooks.applyFilters(\n\t\t\t'i18n.gettext_' + getFilterDomain( domain ),\n\t\t\ttranslation,\n\t\t\ttext,\n\t\t\tdomain\n\t\t) as TransformedText< typeof text >;\n\t};\n\n\tconst _x: I18n< TextDomain >[ '_x' ] = ( text, context, domain ) => {\n\t\tlet translation = dcnpgettext( domain, context, text );\n\t\tif ( ! hooks ) {\n\t\t\treturn translation as TransformedText< typeof text >;\n\t\t}\n\n\t\t/**\n\t\t * Filters text with its translation based on context information.\n\t\t *\n\t\t * @param translation Translated text.\n\t\t * @param text        Text to translate.\n\t\t * @param context     Context information for the translators.\n\t\t * @param domain      Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = hooks.applyFilters(\n\t\t\t'i18n.gettext_with_context',\n\t\t\ttranslation,\n\t\t\ttext,\n\t\t\tcontext,\n\t\t\tdomain\n\t\t) as TransformedText< typeof text >;\n\n\t\treturn hooks.applyFilters(\n\t\t\t'i18n.gettext_with_context_' + getFilterDomain( domain ),\n\t\t\ttranslation,\n\t\t\ttext,\n\t\t\tcontext,\n\t\t\tdomain\n\t\t) as TransformedText< typeof text >;\n\t};\n\n\tconst _n: I18n< TextDomain >[ '_n' ] = (\n\t\tsingle,\n\t\tplural,\n\t\tnumber,\n\t\tdomain\n\t) => {\n\t\tlet translation = dcnpgettext(\n\t\t\tdomain,\n\t\t\tundefined,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber\n\t\t);\n\t\tif ( ! hooks ) {\n\t\t\treturn translation as TransformedText<\n\t\t\t\ttypeof single | typeof plural\n\t\t\t>;\n\t\t}\n\n\t\t/**\n\t\t * Filters the singular or plural form of a string.\n\t\t *\n\t\t * @param translation Translated text.\n\t\t * @param single      The text to be used if the number is singular.\n\t\t * @param plural      The text to be used if the number is plural.\n\t\t * @param number      The number to compare against to use either the singular or plural form.\n\t\t * @param domain      Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = hooks.applyFilters(\n\t\t\t'i18n.ngettext',\n\t\t\ttranslation,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber,\n\t\t\tdomain\n\t\t) as TransformedText< typeof single | typeof plural >;\n\n\t\treturn hooks.applyFilters(\n\t\t\t'i18n.ngettext_' + getFilterDomain( domain ),\n\t\t\ttranslation,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber,\n\t\t\tdomain\n\t\t) as TransformedText< typeof single | typeof plural >;\n\t};\n\n\tconst _nx: I18n< TextDomain >[ '_nx' ] = (\n\t\tsingle,\n\t\tplural,\n\t\tnumber,\n\t\tcontext,\n\t\tdomain\n\t) => {\n\t\tlet translation = dcnpgettext(\n\t\t\tdomain,\n\t\t\tcontext,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber\n\t\t);\n\t\tif ( ! hooks ) {\n\t\t\treturn translation as TransformedText<\n\t\t\t\ttypeof single | typeof plural\n\t\t\t>;\n\t\t}\n\n\t\t/**\n\t\t * Filters the singular or plural form of a string with gettext context.\n\t\t *\n\t\t * @param translation Translated text.\n\t\t * @param single      The text to be used if the number is singular.\n\t\t * @param plural      The text to be used if the number is plural.\n\t\t * @param number      The number to compare against to use either the singular or plural form.\n\t\t * @param context     Context information for the translators.\n\t\t * @param domain      Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = hooks.applyFilters(\n\t\t\t'i18n.ngettext_with_context',\n\t\t\ttranslation,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber,\n\t\t\tcontext,\n\t\t\tdomain\n\t\t) as TransformedText< typeof single | typeof plural >;\n\n\t\treturn hooks.applyFilters(\n\t\t\t'i18n.ngettext_with_context_' + getFilterDomain( domain ),\n\t\t\ttranslation,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber,\n\t\t\tcontext,\n\t\t\tdomain\n\t\t) as TransformedText< typeof single | typeof plural >;\n\t};\n\n\tconst isRTL: I18n< TextDomain >[ 'isRTL' ] = () => {\n\t\treturn 'rtl' === _x( 'ltr', 'text direction' );\n\t};\n\n\tconst hasTranslation: I18n< TextDomain >[ 'hasTranslation' ] = (\n\t\tsingle,\n\t\tcontext,\n\t\tdomain\n\t) => {\n\t\tconst key = context ? context + '\\u0004' + single : single;\n\t\tlet result = !! tannin.data?.[ domain ?? 'default' ]?.[ key ];\n\t\tif ( hooks ) {\n\t\t\t/**\n\t\t\t * Filters the presence of a translation in the locale data.\n\t\t\t *\n\t\t\t * @param hasTranslation Whether the translation is present or not..\n\t\t\t * @param single         The singular form of the translated text (used as key in locale data)\n\t\t\t * @param context        Context information for the translators.\n\t\t\t * @param domain         Text domain. Unique identifier for retrieving translated strings.\n\t\t\t */\n\t\t\tresult = hooks.applyFilters(\n\t\t\t\t'i18n.has_translation',\n\t\t\t\tresult,\n\t\t\t\tsingle,\n\t\t\t\tcontext,\n\t\t\t\tdomain\n\t\t\t) as boolean;\n\n\t\t\tresult = hooks.applyFilters(\n\t\t\t\t'i18n.has_translation_' + getFilterDomain( domain ),\n\t\t\t\tresult,\n\t\t\t\tsingle,\n\t\t\t\tcontext,\n\t\t\t\tdomain\n\t\t\t) as boolean;\n\t\t}\n\t\treturn result;\n\t};\n\n\tif ( initialData ) {\n\t\tsetLocaleData( initialData, initialDomain );\n\t}\n\n\tif ( hooks ) {\n\t\t/**\n\t\t * @param hookName\n\t\t */\n\t\tconst onHookAddedOrRemoved = ( hookName: string ) => {\n\t\t\tif ( I18N_HOOK_REGEXP.test( hookName ) ) {\n\t\t\t\tnotifyListeners();\n\t\t\t}\n\t\t};\n\n\t\thooks.addAction( 'hookAdded', 'core/i18n', onHookAddedOrRemoved );\n\t\thooks.addAction( 'hookRemoved', 'core/i18n', onHookAddedOrRemoved );\n\t}\n\n\treturn {\n\t\tgetLocaleData,\n\t\tsetLocaleData,\n\t\taddLocaleData,\n\t\tresetLocaleData,\n\t\tsubscribe,\n\t\t__,\n\t\t_x,\n\t\t_n,\n\t\t_nx,\n\t\tisRTL,\n\t\thasTranslation,\n\t};\n};\n"],
  "mappings": "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",
  "names": []
}
