vanilla-intlayer 9.5.9 → 9.5.10

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.
@@ -1,9 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_client_useLocaleStorage = require('./useLocaleStorage.cjs');
2
3
  const require_client_installIntlayer = require('./installIntlayer.cjs');
3
4
  const require_client_useDictionary = require('./useDictionary.cjs');
4
5
  const require_client_useDictionaryDynamic = require('./useDictionaryDynamic.cjs');
5
6
  const require_client_useIntlayer = require('./useIntlayer.cjs');
6
- const require_client_useLocaleStorage = require('./useLocaleStorage.cjs');
7
7
  const require_client_useLocale = require('./useLocale.cjs');
8
8
  const require_client_usePathname = require('./usePathname.cjs');
9
9
  const require_client_useRewriteURL = require('./useRewriteURL.cjs');
@@ -11,6 +11,7 @@ const require_client_useRewriteURL = require('./useRewriteURL.cjs');
11
11
  exports.IntlayerClient = require_client_installIntlayer.IntlayerClient;
12
12
  exports.createIntlayerClient = require_client_installIntlayer.createIntlayerClient;
13
13
  exports.getIntlayerClient = require_client_installIntlayer.getIntlayerClient;
14
+ exports.getLocaleInStorage = require_client_useLocaleStorage.getLocaleInStorage;
14
15
  exports.installIntlayer = require_client_installIntlayer.installIntlayer;
15
16
  exports.localeCookie = require_client_useLocaleStorage.localeCookie;
16
17
  exports.localeInStorage = require_client_useLocaleStorage.localeInStorage;
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_editor_useEditor = require('../editor/useEditor.cjs');
3
+ const require_client_useLocaleStorage = require('./useLocaleStorage.cjs');
3
4
  let _intlayer_config_built = require("@intlayer/config/built");
4
5
  let _intlayer_config_client = require("@intlayer/config/client");
5
6
 
@@ -12,7 +13,7 @@ var IntlayerClient = class {
12
13
  constructor(locale, isCookieEnabled = true, variant) {
13
14
  const { defaultLocale } = _intlayer_config_built.internationalization ?? {};
14
15
  (0, _intlayer_config_client.setIntlayerIdentifier)();
15
- this._locale = locale ?? defaultLocale;
16
+ this._locale = locale ?? require_client_useLocaleStorage.getLocaleInStorage() ?? defaultLocale;
16
17
  this._variant = variant;
17
18
  this.isCookieEnabled = isCookieEnabled;
18
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"installIntlayer.cjs","names":["internationalization"],"sources":["../../../src/client/installIntlayer.ts"],"sourcesContent":["import { internationalization } from '@intlayer/config/built';\nimport { setIntlayerIdentifier } from '@intlayer/config/client';\nimport type {\n LocalesValues,\n ProviderVariant,\n} from '@intlayer/types/module_augmentation';\nimport { useEditor } from '../editor/useEditor';\n\ntype LocaleListener = (locale: LocalesValues) => void;\n\nexport class IntlayerClient {\n private _locale: LocalesValues;\n private _variant: ProviderVariant | undefined;\n private _listeners: Set<LocaleListener> = new Set();\n isCookieEnabled: boolean;\n\n constructor(\n locale?: LocalesValues,\n isCookieEnabled = true,\n variant?: ProviderVariant\n ) {\n const { defaultLocale } = internationalization ?? {};\n\n setIntlayerIdentifier();\n\n this._locale =\n (locale as LocalesValues) ?? (defaultLocale as LocalesValues);\n this._variant = variant;\n this.isCookieEnabled = isCookieEnabled;\n }\n\n get locale(): LocalesValues {\n return this._locale;\n }\n\n /**\n * Ambient variant applied to every dictionary read, the same way `locale` is.\n * Overridden per call by an explicit selector.\n */\n get variant(): ProviderVariant | undefined {\n return this._variant;\n }\n\n setLocale(newLocale: LocalesValues): void {\n this._locale = newLocale;\n for (const listener of this._listeners) {\n listener(newLocale);\n }\n }\n\n setVariant(newVariant: ProviderVariant | undefined): void {\n this._variant = newVariant;\n this.notify();\n }\n\n subscribe(listener: LocaleListener): () => void {\n this._listeners.add(listener);\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n /**\n * Fire all listeners with the current locale without changing it.\n * Used to trigger re-renders after async data loads.\n */\n notify(): void {\n for (const listener of this._listeners) {\n listener(this._locale);\n }\n }\n}\n\n/**\n * Singleton instance\n */\nlet instance: IntlayerClient | null = null;\n\n/**\n * Create and return a single IntlayerClient instance.\n */\nexport const createIntlayerClient = (\n locale?: LocalesValues,\n isCookieEnabled = true,\n variant?: ProviderVariant\n): IntlayerClient => {\n if (instance) return instance;\n\n instance = new IntlayerClient(locale, isCookieEnabled, variant);\n return instance;\n};\n\n/**\n * Get the current IntlayerClient instance, creating one with defaults if needed.\n */\nexport const getIntlayerClient = (): IntlayerClient => {\n if (!instance) {\n instance = new IntlayerClient();\n }\n return instance;\n};\n\n/**\n * Install Intlayer into your vanilla JS application.\n *\n * Call this once at application startup, before any Intlayer APIs are used.\n *\n * When called with a `config` argument, `window.INTLAYER_CONFIG` is set so\n * that `@intlayer/config/built` resolves the correct values in the browser\n * without requiring module aliasing in the bundler configuration.\n *\n * @param locale - Initial locale (defaults to config defaultLocale).\n * @param isCookieEnabled - Whether to persist locale in cookies/localStorage.\n * @param variant - Ambient variant applied to every dictionary read — for a\n * dimension fixed for the whole session (tenant, school type, plan tier…)\n * that no call site should have to pass by hand. Accepts a name\n * (`'school1'`), an ordered preference chain (`['school1', 'default']`), or a\n * per-key map (`{ key1: 'school1', default: 'base' }`). A plain object is\n * always the per-key map; nest a structured variant as\n * `{ default: { id: 'prod_abc' } }`. A call-site selector always wins.\n * @param config - Optional Intlayer configuration. When provided, sets\n * `window.INTLAYER_CONFIG` with the browser-safe subset of the config so\n * the application works without a Vite/webpack plugin alias.\n * @returns The IntlayerClient singleton.\n *\n * @example\n * ```ts\n * import { installIntlayer } from 'vanilla-intlayer';\n *\n * // With explicit config (no build plugin alias needed):\n * installIntlayer('en', true, {\n * internationalization: { locales: ['en', 'fr'], defaultLocale: 'en' },\n * });\n *\n * // With build plugin (alias handles config automatically):\n * installIntlayer('en');\n * ```\n */\nexport const installIntlayer = ({\n locale,\n isCookieEnabled,\n variant,\n}: {\n locale?: LocalesValues;\n isCookieEnabled?: boolean;\n variant?: ProviderVariant;\n} = {}): IntlayerClient => {\n const client = createIntlayerClient(locale, isCookieEnabled, variant);\n\n useEditor();\n\n return client;\n};\n"],"mappings":";;;;;;AAUA,IAAa,iBAAb,MAA4B;CAC1B,AAAQ;CACR,AAAQ;CACR,AAAQ,6BAAkC,IAAI,IAAI;CAClD;CAEA,YACE,QACA,kBAAkB,MAClB,SACA;EACA,MAAM,EAAE,kBAAkBA,+CAAwB,CAAC;EAEnD,mDAAsB;EAEtB,KAAK,UACF,UAA6B;EAChC,KAAK,WAAW;EAChB,KAAK,kBAAkB;CACzB;CAEA,IAAI,SAAwB;EAC1B,OAAO,KAAK;CACd;;;;;CAMA,IAAI,UAAuC;EACzC,OAAO,KAAK;CACd;CAEA,UAAU,WAAgC;EACxC,KAAK,UAAU;EACf,KAAK,MAAM,YAAY,KAAK,YAC1B,SAAS,SAAS;CAEtB;CAEA,WAAW,YAA+C;EACxD,KAAK,WAAW;EAChB,KAAK,OAAO;CACd;CAEA,UAAU,UAAsC;EAC9C,KAAK,WAAW,IAAI,QAAQ;EAC5B,aAAa;GACX,KAAK,WAAW,OAAO,QAAQ;EACjC;CACF;;;;;CAMA,SAAe;EACb,KAAK,MAAM,YAAY,KAAK,YAC1B,SAAS,KAAK,OAAO;CAEzB;AACF;;;;AAKA,IAAI,WAAkC;;;;AAKtC,MAAa,wBACX,QACA,kBAAkB,MAClB,YACmB;CACnB,IAAI,UAAU,OAAO;CAErB,WAAW,IAAI,eAAe,QAAQ,iBAAiB,OAAO;CAC9D,OAAO;AACT;;;;AAKA,MAAa,0BAA0C;CACrD,IAAI,CAAC,UACH,WAAW,IAAI,eAAe;CAEhC,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,MAAa,mBAAmB,EAC9B,QACA,iBACA,YAKE,CAAC,MAAsB;CACzB,MAAM,SAAS,qBAAqB,QAAQ,iBAAiB,OAAO;CAEpE,mCAAU;CAEV,OAAO;AACT"}
1
+ {"version":3,"file":"installIntlayer.cjs","names":["internationalization","getLocaleInStorage"],"sources":["../../../src/client/installIntlayer.ts"],"sourcesContent":["import { internationalization } from '@intlayer/config/built';\nimport { setIntlayerIdentifier } from '@intlayer/config/client';\nimport type {\n LocalesValues,\n ProviderVariant,\n} from '@intlayer/types/module_augmentation';\nimport { useEditor } from '../editor/useEditor';\nimport { getLocaleInStorage } from './useLocaleStorage';\n\ntype LocaleListener = (locale: LocalesValues) => void;\n\nexport class IntlayerClient {\n private _locale: LocalesValues;\n private _variant: ProviderVariant | undefined;\n private _listeners: Set<LocaleListener> = new Set();\n isCookieEnabled: boolean;\n\n constructor(\n locale?: LocalesValues,\n isCookieEnabled = true,\n variant?: ProviderVariant\n ) {\n const { defaultLocale } = internationalization ?? {};\n\n setIntlayerIdentifier();\n\n // Returning visitors keep their language when no locale is passed\n this._locale =\n (locale as LocalesValues) ??\n getLocaleInStorage() ??\n (defaultLocale as LocalesValues);\n this._variant = variant;\n this.isCookieEnabled = isCookieEnabled;\n }\n\n get locale(): LocalesValues {\n return this._locale;\n }\n\n /**\n * Ambient variant applied to every dictionary read, the same way `locale` is.\n * Overridden per call by an explicit selector.\n */\n get variant(): ProviderVariant | undefined {\n return this._variant;\n }\n\n setLocale(newLocale: LocalesValues): void {\n this._locale = newLocale;\n for (const listener of this._listeners) {\n listener(newLocale);\n }\n }\n\n setVariant(newVariant: ProviderVariant | undefined): void {\n this._variant = newVariant;\n this.notify();\n }\n\n subscribe(listener: LocaleListener): () => void {\n this._listeners.add(listener);\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n /**\n * Fire all listeners with the current locale without changing it.\n * Used to trigger re-renders after async data loads.\n */\n notify(): void {\n for (const listener of this._listeners) {\n listener(this._locale);\n }\n }\n}\n\n/**\n * Singleton instance\n */\nlet instance: IntlayerClient | null = null;\n\n/**\n * Create and return a single IntlayerClient instance.\n */\nexport const createIntlayerClient = (\n locale?: LocalesValues,\n isCookieEnabled = true,\n variant?: ProviderVariant\n): IntlayerClient => {\n if (instance) return instance;\n\n instance = new IntlayerClient(locale, isCookieEnabled, variant);\n return instance;\n};\n\n/**\n * Get the current IntlayerClient instance, creating one with defaults if needed.\n */\nexport const getIntlayerClient = (): IntlayerClient => {\n if (!instance) {\n instance = new IntlayerClient();\n }\n return instance;\n};\n\n/**\n * Install Intlayer into your vanilla JS application.\n *\n * Call this once at application startup, before any Intlayer APIs are used.\n *\n * When called with a `config` argument, `window.INTLAYER_CONFIG` is set so\n * that `@intlayer/config/built` resolves the correct values in the browser\n * without requiring module aliasing in the bundler configuration.\n *\n * @param locale - Initial locale (defaults to config defaultLocale).\n * @param isCookieEnabled - Whether to persist locale in cookies/localStorage.\n * @param variant - Ambient variant applied to every dictionary read — for a\n * dimension fixed for the whole session (tenant, school type, plan tier…)\n * that no call site should have to pass by hand. Accepts a name\n * (`'school1'`), an ordered preference chain (`['school1', 'default']`), or a\n * per-key map (`{ key1: 'school1', default: 'base' }`). A plain object is\n * always the per-key map; nest a structured variant as\n * `{ default: { id: 'prod_abc' } }`. A call-site selector always wins.\n * @param config - Optional Intlayer configuration. When provided, sets\n * `window.INTLAYER_CONFIG` with the browser-safe subset of the config so\n * the application works without a Vite/webpack plugin alias.\n * @returns The IntlayerClient singleton.\n *\n * @example\n * ```ts\n * import { installIntlayer } from 'vanilla-intlayer';\n *\n * // With explicit config (no build plugin alias needed):\n * installIntlayer('en', true, {\n * internationalization: { locales: ['en', 'fr'], defaultLocale: 'en' },\n * });\n *\n * // With build plugin (alias handles config automatically):\n * installIntlayer('en');\n * ```\n */\nexport const installIntlayer = ({\n locale,\n isCookieEnabled,\n variant,\n}: {\n locale?: LocalesValues;\n isCookieEnabled?: boolean;\n variant?: ProviderVariant;\n} = {}): IntlayerClient => {\n const client = createIntlayerClient(locale, isCookieEnabled, variant);\n\n useEditor();\n\n return client;\n};\n"],"mappings":";;;;;;;AAWA,IAAa,iBAAb,MAA4B;CAC1B,AAAQ;CACR,AAAQ;CACR,AAAQ,6BAAkC,IAAI,IAAI;CAClD;CAEA,YACE,QACA,kBAAkB,MAClB,SACA;EACA,MAAM,EAAE,kBAAkBA,+CAAwB,CAAC;EAEnD,mDAAsB;EAGtB,KAAK,UACF,UACDC,mDAAmB,KAClB;EACH,KAAK,WAAW;EAChB,KAAK,kBAAkB;CACzB;CAEA,IAAI,SAAwB;EAC1B,OAAO,KAAK;CACd;;;;;CAMA,IAAI,UAAuC;EACzC,OAAO,KAAK;CACd;CAEA,UAAU,WAAgC;EACxC,KAAK,UAAU;EACf,KAAK,MAAM,YAAY,KAAK,YAC1B,SAAS,SAAS;CAEtB;CAEA,WAAW,YAA+C;EACxD,KAAK,WAAW;EAChB,KAAK,OAAO;CACd;CAEA,UAAU,UAAsC;EAC9C,KAAK,WAAW,IAAI,QAAQ;EAC5B,aAAa;GACX,KAAK,WAAW,OAAO,QAAQ;EACjC;CACF;;;;;CAMA,SAAe;EACb,KAAK,MAAM,YAAY,KAAK,YAC1B,SAAS,KAAK,OAAO;CAEzB;AACF;;;;AAKA,IAAI,WAAkC;;;;AAKtC,MAAa,wBACX,QACA,kBAAkB,MAClB,YACmB;CACnB,IAAI,UAAU,OAAO;CAErB,WAAW,IAAI,eAAe,QAAQ,iBAAiB,OAAO;CAC9D,OAAO;AACT;;;;AAKA,MAAa,0BAA0C;CACrD,IAAI,CAAC,UACH,WAAW,IAAI,eAAe;CAEhC,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,MAAa,mBAAmB,EAC9B,QACA,iBACA,YAKE,CAAC,MAAsB;CACzB,MAAM,SAAS,qBAAqB,QAAQ,iBAAiB,OAAO;CAEpE,mCAAU;CAEV,OAAO;AACT"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_client_installIntlayer = require('./installIntlayer.cjs');
3
2
  const require_client_useLocaleStorage = require('./useLocaleStorage.cjs');
3
+ const require_client_installIntlayer = require('./installIntlayer.cjs');
4
4
  let _intlayer_config_built = require("@intlayer/config/built");
5
5
 
6
6
  //#region src/client/useLocale.ts
@@ -3,9 +3,19 @@ let _intlayer_core_utils = require("@intlayer/core/utils");
3
3
 
4
4
  //#region src/client/useLocaleStorage.ts
5
5
  /**
6
+ * Reads the locale persisted in the browser storage (cookie, localStorage…).
7
+ *
8
+ * Unlike `localeInStorage`, read on first call rather than at import, then
9
+ * cached until the next `setLocaleInStorage`. Never cached on the server.
10
+ */
11
+ const getLocaleInStorage = _intlayer_core_utils.getCachedLocaleFromStorageClient;
12
+ /**
6
13
  * Get the current locale from storage (cookie or localStorage).
14
+ *
15
+ * Read once at import time; marked pure so bundlers drop the read when nothing
16
+ * imports it.
7
17
  */
8
- const localeInStorage = (0, _intlayer_core_utils.getLocaleFromStorageClient)(_intlayer_core_utils.localeStorageOptions);
18
+ const localeInStorage = /* @__PURE__ */ (0, _intlayer_core_utils.getLocaleFromStorageClient)(_intlayer_core_utils.localeStorageOptions);
9
19
  /**
10
20
  * @deprecated Use localeInStorage instead.
11
21
  */
@@ -40,6 +50,7 @@ const useLocaleStorage = (isCookieEnabled) => {
40
50
  const useLocaleCookie = useLocaleStorage;
41
51
 
42
52
  //#endregion
53
+ exports.getLocaleInStorage = getLocaleInStorage;
43
54
  exports.localeCookie = localeCookie;
44
55
  exports.localeInStorage = localeInStorage;
45
56
  exports.setLocaleCookie = setLocaleCookie;
@@ -1 +1 @@
1
- {"version":3,"file":"useLocaleStorage.cjs","names":["getLocaleFromStorageClient","localeStorageOptions","setLocaleInStorageCore","LocaleStorageClient"],"sources":["../../../src/client/useLocaleStorage.ts"],"sourcesContent":["import {\n getLocaleFromStorageClient,\n LocaleStorageClient,\n localeStorageOptions,\n setLocaleInStorageClient as setLocaleInStorageCore,\n} from '@intlayer/core/utils';\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\n\n/**\n * Get the current locale from storage (cookie or localStorage).\n */\nexport const localeInStorage = getLocaleFromStorageClient(localeStorageOptions);\n\n/**\n * @deprecated Use localeInStorage instead.\n */\nexport const localeCookie = localeInStorage;\n\n/**\n * Persist the locale to storage (cookie and/or localStorage).\n */\nexport const setLocaleInStorage = (\n locale: LocalesValues,\n isCookieEnabled: boolean\n) =>\n setLocaleInStorageCore(locale, {\n ...localeStorageOptions,\n isCookieEnabled,\n });\n\n/**\n * @deprecated Use setLocaleInStorage instead.\n */\nexport const setLocaleCookie = setLocaleInStorage;\n\n/**\n * Returns the current locale from storage and a setter.\n */\nexport const useLocaleStorage = (isCookieEnabled?: boolean) => {\n const storage = LocaleStorageClient({\n ...localeStorageOptions,\n isCookieEnabled,\n });\n\n return {\n localeStorage: storage.getLocale(),\n setLocaleStorage: storage.setLocale,\n };\n};\n\n/**\n * @deprecated Use useLocaleStorage instead.\n */\nexport const useLocaleCookie = useLocaleStorage;\n"],"mappings":";;;;;;;AAWA,MAAa,sBAAkBA,iDAA2BC,yCAAoB;;;;AAK9E,MAAa,eAAe;;;;AAK5B,MAAa,sBACX,QACA,wBAEAC,+CAAuB,QAAQ;CAC7B,GAAGD;CACH;AACF,CAAC;;;;AAKH,MAAa,kBAAkB;;;;AAK/B,MAAa,oBAAoB,oBAA8B;CAC7D,MAAM,cAAUE,0CAAoB;EAClC,GAAGF;EACH;CACF,CAAC;CAED,OAAO;EACL,eAAe,QAAQ,UAAU;EACjC,kBAAkB,QAAQ;CAC5B;AACF;;;;AAKA,MAAa,kBAAkB"}
1
+ {"version":3,"file":"useLocaleStorage.cjs","names":["getCachedLocaleFromStorageClient","localeStorageOptions","setLocaleInStorageCore","LocaleStorageClient"],"sources":["../../../src/client/useLocaleStorage.ts"],"sourcesContent":["import {\n getCachedLocaleFromStorageClient,\n getLocaleFromStorageClient,\n LocaleStorageClient,\n localeStorageOptions,\n setLocaleInStorageClient as setLocaleInStorageCore,\n} from '@intlayer/core/utils';\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\n\n/**\n * Reads the locale persisted in the browser storage (cookie, localStorage…).\n *\n * Unlike `localeInStorage`, read on first call rather than at import, then\n * cached until the next `setLocaleInStorage`. Never cached on the server.\n */\nexport const getLocaleInStorage = getCachedLocaleFromStorageClient;\n\n/**\n * Get the current locale from storage (cookie or localStorage).\n *\n * Read once at import time; marked pure so bundlers drop the read when nothing\n * imports it.\n */\nexport const localeInStorage =\n /* @__PURE__ */ getLocaleFromStorageClient(localeStorageOptions);\n\n/**\n * @deprecated Use localeInStorage instead.\n */\nexport const localeCookie = localeInStorage;\n\n/**\n * Persist the locale to storage (cookie and/or localStorage).\n */\nexport const setLocaleInStorage = (\n locale: LocalesValues,\n isCookieEnabled: boolean\n) =>\n setLocaleInStorageCore(locale, {\n ...localeStorageOptions,\n isCookieEnabled,\n });\n\n/**\n * @deprecated Use setLocaleInStorage instead.\n */\nexport const setLocaleCookie = setLocaleInStorage;\n\n/**\n * Returns the current locale from storage and a setter.\n */\nexport const useLocaleStorage = (isCookieEnabled?: boolean) => {\n const storage = LocaleStorageClient({\n ...localeStorageOptions,\n isCookieEnabled,\n });\n\n return {\n localeStorage: storage.getLocale(),\n setLocaleStorage: storage.setLocale,\n };\n};\n\n/**\n * @deprecated Use useLocaleStorage instead.\n */\nexport const useLocaleCookie = useLocaleStorage;\n"],"mappings":";;;;;;;;;;AAeA,MAAa,qBAAqBA;;;;;;;AAQlC,MAAa,kBACK,qEAA2BC,yCAAoB;;;;AAKjE,MAAa,eAAe;;;;AAK5B,MAAa,sBACX,QACA,wBAEAC,+CAAuB,QAAQ;CAC7B,GAAGD;CACH;AACF,CAAC;;;;AAKH,MAAa,kBAAkB;;;;AAK/B,MAAa,oBAAoB,oBAA8B;CAC7D,MAAM,cAAUE,0CAAoB;EAClC,GAAGF;EACH;CACF,CAAC;CAED,OAAO;EACL,eAAe,QAAQ,UAAU;EACjC,kBAAkB,QAAQ;CAC5B;AACF;;;;AAKA,MAAa,kBAAkB"}
@@ -3,11 +3,11 @@ const require_plugins = require('./plugins.cjs');
3
3
  const require_getDictionary = require('./getDictionary.cjs');
4
4
  const require_getIntlayer = require('./getIntlayer.cjs');
5
5
  const require_editor_useEditor = require('./editor/useEditor.cjs');
6
+ const require_client_useLocaleStorage = require('./client/useLocaleStorage.cjs');
6
7
  const require_client_installIntlayer = require('./client/installIntlayer.cjs');
7
8
  const require_client_useDictionary = require('./client/useDictionary.cjs');
8
9
  const require_client_useDictionaryDynamic = require('./client/useDictionaryDynamic.cjs');
9
10
  const require_client_useIntlayer = require('./client/useIntlayer.cjs');
10
- const require_client_useLocaleStorage = require('./client/useLocaleStorage.cjs');
11
11
  const require_client_useLocale = require('./client/useLocale.cjs');
12
12
  const require_client_usePathname = require('./client/usePathname.cjs');
13
13
  const require_client_useRewriteURL = require('./client/useRewriteURL.cjs');
@@ -17,6 +17,7 @@ exports.createIntlayerClient = require_client_installIntlayer.createIntlayerClie
17
17
  exports.getDictionary = require_getDictionary.getDictionary;
18
18
  exports.getIntlayer = require_getIntlayer.getIntlayer;
19
19
  exports.getIntlayerClient = require_client_installIntlayer.getIntlayerClient;
20
+ exports.getLocaleInStorage = require_client_useLocaleStorage.getLocaleInStorage;
20
21
  exports.getPlugins = require_plugins.getPlugins;
21
22
  exports.htmlPlugin = require_plugins.htmlPlugin;
22
23
  exports.insertionPlugin = require_plugins.insertionPlugin;
@@ -13,7 +13,7 @@ const escapeHtmlText = (str) => str.replace(/&/g, "&amp;").replace(/</g, "&lt;")
13
13
  const intlayerNodePlugins = {
14
14
  id: "intlayer-node-plugin",
15
15
  canHandle: (node) => typeof node === "bigint" || typeof node === "string" || typeof node === "number",
16
- transform: (_node, { children, keyPath, dictionaryKey, ...rest }) => {
16
+ transform: (_node, { children, keyPath, dictionaryKey }) => {
17
17
  if (process.env.INTLAYER_EDITOR_ENABLED !== "false" && _intlayer_config_built.editor.enabled) {
18
18
  const rawStr = String(children ?? "");
19
19
  const keyPathJson = JSON.stringify(keyPath ?? []);
@@ -25,7 +25,6 @@ const intlayerNodePlugins = {
25
25
  */
26
26
  const htmlStr = `<intlayer-content-selector-wrapper key-path="${escapeHtmlAttr(keyPathJson)}" dictionary-key="${escapeHtmlAttr(dictKey)}">${escapeHtmlText(rawStr)}</intlayer-content-selector-wrapper>`;
27
27
  return require_renderIntlayerNode.renderIntlayerNode({
28
- ...rest,
29
28
  value: children,
30
29
  children: htmlStr,
31
30
  keyPath,
@@ -40,7 +39,6 @@ const intlayerNodePlugins = {
40
39
  });
41
40
  }
42
41
  return require_renderIntlayerNode.renderIntlayerNode({
43
- ...rest,
44
42
  value: children,
45
43
  children
46
44
  });
@@ -211,7 +209,8 @@ const pluginsCache = /* @__PURE__ */ new Map();
211
209
  const getPlugins = (locale, fallback = true) => {
212
210
  const cacheKey = `${locale ?? _intlayer_config_built.internationalization.defaultLocale}_${fallback}`;
213
211
  if (pluginsCache.has(cacheKey)) return pluginsCache.get(cacheKey);
214
- const plugins = [
212
+ const enabledPlugins = [
213
+ intlayerNodePlugins,
215
214
  (0, _intlayer_core_interpreter.translationPlugin)(locale ?? _intlayer_config_built.internationalization.defaultLocale, fallback ? _intlayer_config_built.internationalization.defaultLocale : void 0),
216
215
  _intlayer_core_interpreter.enumerationPlugin,
217
216
  (0, _intlayer_core_interpreter.pluralPlugin)(locale ?? _intlayer_config_built.internationalization.defaultLocale),
@@ -220,13 +219,12 @@ const getPlugins = (locale, fallback = true) => {
220
219
  _intlayer_core_interpreter.filePlugin,
221
220
  _intlayer_core_interpreter.genderPlugin,
222
221
  _intlayer_core_interpreter.selectPlugin,
223
- intlayerNodePlugins,
224
222
  insertionPlugin,
225
223
  markdownPlugin,
226
224
  htmlPlugin
227
- ];
228
- pluginsCache.set(cacheKey, plugins);
229
- return plugins;
225
+ ].filter((plugin) => plugin !== _intlayer_core_interpreter.fallbackPlugin);
226
+ pluginsCache.set(cacheKey, enabledPlugins);
227
+ return enabledPlugins;
230
228
  };
231
229
 
232
230
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.cjs","names":["editor","renderIntlayerNode","fallbackPlugin","NodeTypes","isInterpolableWrapperNode","transformInterpolableNode","splitInsertionTemplate","resolveInsertedSelector","getMarkdownMetadata","compileWithOptions","getHTML","internationalization","translationPlugin","enumerationPlugin","pluralPlugin","conditionPlugin","nestedPlugin","filePlugin","genderPlugin","selectPlugin"],"sources":["../../src/plugins.ts"],"sourcesContent":["import { editor, internationalization } from '@intlayer/config/built';\nimport {\n conditionPlugin,\n type DeepTransformContent as DeepTransformContentCore,\n enumerationPlugin,\n fallbackPlugin,\n filePlugin,\n genderPlugin,\n getHTML,\n type IInterpreterPluginState as IInterpreterPluginStateCore,\n isInterpolableWrapperNode,\n nestedPlugin,\n type Plugins,\n pluralPlugin,\n resolveInsertedSelector,\n selectPlugin,\n splitInsertionTemplate,\n transformInterpolableNode,\n translationPlugin,\n} from '@intlayer/core/interpreter';\nimport {\n compileWithOptions,\n getMarkdownMetadata,\n} from '@intlayer/core/markdown';\nimport type {\n HTMLContent,\n InsertionContent,\n MarkdownContent,\n} from '@intlayer/core/transpiler';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport type {\n DeclaredLocales,\n LocalesValues,\n} from '@intlayer/types/module_augmentation';\nimport type { NodeType } from '@intlayer/types/nodeType';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport type { HTMLComponents } from './html/types';\nimport {\n type IntlayerNode as IntlayerNodeCore,\n renderIntlayerNode,\n} from './renderIntlayerNode';\n\n/** ---------------------------------------------\n * INTLAYER NODE PLUGIN\n * --------------------------------------------- */\n\nexport type IntlayerNodeCond<T> = T extends number | string\n ? IntlayerNode<T>\n : never;\n\nexport type IntlayerNode<T, P = {}> = IntlayerNodeCore<T> & P;\n\nconst escapeHtmlAttr = (str: string): string =>\n str.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n\nconst escapeHtmlText = (str: string): string =>\n str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\nexport const intlayerNodePlugins: Plugins = {\n id: 'intlayer-node-plugin',\n canHandle: (node) =>\n typeof node === 'bigint' ||\n typeof node === 'string' ||\n typeof node === 'number',\n transform: (_node, { children, keyPath, dictionaryKey, ...rest }) => {\n if (process.env.INTLAYER_EDITOR_ENABLED !== 'false' && editor.enabled) {\n const rawStr = String(children ?? '');\n const keyPathJson = JSON.stringify(keyPath ?? []);\n const dictKey = String(dictionaryKey ?? '');\n\n /**\n * In editor mode, string coercion returns the wrapper HTML so that\n * `element.innerHTML = content.title` automatically inserts the\n * `<intlayer-content-selector-wrapper>` into the DOM.\n */\n const htmlStr = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(rawStr)}</intlayer-content-selector-wrapper>`;\n\n return renderIntlayerNode({\n ...rest,\n value: children as string,\n children: htmlStr,\n keyPath,\n dictionaryKey,\n additionalProps: {\n toElement: (): HTMLElement => {\n const wrapper = document.createElement(\n 'intlayer-content-selector-wrapper'\n );\n wrapper.setAttribute('key-path', keyPathJson);\n wrapper.setAttribute('dictionary-key', dictKey);\n wrapper.textContent = rawStr;\n return wrapper;\n },\n },\n });\n }\n\n return renderIntlayerNode({\n ...rest,\n value: children as string,\n children,\n });\n },\n};\n\n/** ---------------------------------------------\n * INSERTION PLUGIN\n * --------------------------------------------- */\n\nexport type InsertionCond<T, _S, L extends LocalesValues> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.INSERTION]: infer I;\n fields: readonly (infer F)[];\n}\n ? <V extends { [K in Extract<F, string>]: string | number }>(\n values: V\n ) => I extends string ? IntlayerNode<string> : DeepTransformContent<I, L>\n : never;\n\nexport const insertionPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_INSERTION === 'false'\n ? fallbackPlugin\n : {\n id: 'insertion-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.INSERTION,\n transform: (node: InsertionContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n { type: NodeTypes.INSERTION },\n ];\n\n const children = node[NodeTypes.INSERTION];\n\n const insertionStringPlugin: Plugins = {\n id: 'insertion-string-plugin',\n canHandle: (node) =>\n typeof node === 'string' || isInterpolableWrapperNode(node),\n transform: (node, subProps, deepTransformNode) => {\n // `html()`/`markdown()` nodes carry their `{{ … }}` placeholders\n // inside a raw string. Interpolate into that string, then re-run\n // the transform so the html/markdown renderer applies afterwards.\n if (isInterpolableWrapperNode(node)) {\n return (\n values: {\n [K in InsertionContent['fields'][number]]: string | number;\n }\n ) =>\n transformInterpolableNode(\n node,\n values,\n subProps,\n props.plugins,\n deepTransformNode\n );\n }\n\n const transformedResult = deepTransformNode(node, {\n ...subProps,\n children: node,\n plugins: (props.plugins ?? ([] as Plugins[])).filter(\n (plugin) => plugin.id !== 'intlayer-node-plugin'\n ),\n });\n\n return (\n values: {\n [K in InsertionContent['fields'][number]]: string | number;\n }\n ) => {\n const result = splitInsertionTemplate(\n transformedResult,\n values\n );\n const resultStr = result.isSimple\n ? (result.parts as string)\n : (result.parts as string[]).join('');\n\n return deepTransformNode(resultStr, {\n ...subProps,\n plugins: props.plugins,\n children: resultStr,\n });\n };\n },\n };\n\n const transformed = deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [insertionStringPlugin, ...(props.plugins ?? [])],\n });\n\n return resolveInsertedSelector(children, transformed);\n },\n };\n\n/** ---------------------------------------------\n * MARKDOWN PLUGIN\n * --------------------------------------------- */\n\nconst vanillaRuntime = {\n createElement: (tag: string, props: any, ...children: any[]) => {\n const attrs = Object.entries(props || {})\n .filter(\n ([key]) => key !== 'children' && key !== 'key' && key !== '_innerHTML'\n )\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n const innerHTML = props?._innerHTML;\n const childrenStr =\n innerHTML !== undefined ? innerHTML : children.flat(Infinity).join('');\n return `<${tag}${attrs ? ` ${attrs}` : ''}>${childrenStr}</${tag}>`;\n },\n normalizeProps: (_tag: string, props: Record<string, any>) => {\n const normalized: Record<string, any> = {};\n for (const [key, value] of Object.entries(props)) {\n if (key === 'className') {\n normalized.class = value;\n } else if (key === 'htmlFor') {\n normalized.for = value;\n } else if (key === 'dangerouslySetInnerHTML' && (value as any)?.__html) {\n normalized._innerHTML = (value as any).__html;\n } else {\n normalized[key] = value;\n }\n }\n return normalized;\n },\n};\n\nexport type MarkdownStringCond<T> = T extends string\n ? IntlayerNode<\n string,\n {\n metadata: DeepTransformContent<string>;\n /** Returns the rendered markdown; render with .use(). */\n use: (components?: HTMLComponents<'permissive', {}>) => string;\n }\n >\n : never;\n\nexport const markdownStringPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_MARKDOWN === 'false'\n ? fallbackPlugin\n : {\n id: 'markdown-string-plugin',\n canHandle: (node) => typeof node === 'string',\n transform: (node: string, props, deepTransformNode) => {\n const { plugins: _plugins, ...rest } = props;\n const metadata = getMarkdownMetadata(node) ?? {};\n\n const metadataPlugins: Plugins = {\n id: 'markdown-metadata-plugin',\n canHandle: (metadataNode) =>\n typeof metadataNode === 'string' ||\n typeof metadataNode === 'number' ||\n typeof metadataNode === 'boolean' ||\n !metadataNode,\n transform: (metadataNode, subProps) =>\n renderIntlayerNode({\n ...subProps,\n value: metadataNode,\n children: node,\n }),\n };\n\n const metadataNodes = deepTransformNode(metadata, {\n plugins: [metadataPlugins],\n dictionaryKey: rest.dictionaryKey,\n keyPath: [],\n });\n\n const compile = (components: any = {}) =>\n compileWithOptions(\n node,\n {\n ...vanillaRuntime,\n createElement: (tag: any, props: any, ...children: any[]) => {\n const override = components[tag];\n if (typeof override === 'function') {\n return override({ ...props, children: children.join('') });\n }\n return vanillaRuntime.createElement(tag, props, ...children);\n },\n },\n {}\n ) as any;\n\n const value = compile();\n let children = node;\n\n if (\n process.env.INTLAYER_EDITOR_ENABLED !== 'false' &&\n editor.enabled\n ) {\n const keyPathJson = JSON.stringify(props.keyPath ?? []);\n const dictKey = String(props.dictionaryKey ?? '');\n children = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;\n }\n\n return renderIntlayerNode({\n ...props,\n value,\n children,\n additionalProps: {\n metadata: metadataNodes,\n use: (components?: any) => compile(components),\n },\n }) as any;\n },\n };\n\nexport type MarkdownCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.MARKDOWN]: infer M;\n metadata?: infer U;\n tags?: infer U;\n}\n ? {\n use: (components?: HTMLComponents<'permissive', U>) => IntlayerNode<M>;\n metadata: DeepTransformContent<U>;\n }\n : never;\n\nexport const markdownPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_MARKDOWN === 'false'\n ? fallbackPlugin\n : {\n id: 'markdown-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.MARKDOWN,\n transform: (node: MarkdownContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n { type: NodeTypes.MARKDOWN },\n ];\n const children = node[NodeTypes.MARKDOWN];\n\n return deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [markdownStringPlugin, ...(props.plugins ?? [])],\n });\n },\n };\n\n/** ---------------------------------------------\n * HTML PLUGIN\n * --------------------------------------------- */\n\nexport type HTMLPluginCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.HTML]: infer I;\n tags?: infer U;\n}\n ? {\n use: (components?: HTMLComponents<'permissive', U>) => IntlayerNode<I>;\n }\n : never;\n\nexport const htmlPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_HTML === 'false'\n ? fallbackPlugin\n : {\n id: 'html-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.HTML,\n transform: (node: HTMLContent<string>, props) => {\n const htmlStr = node[NodeTypes.HTML];\n\n const use = (components: Record<string, any> = {}) => {\n const wrappedComponents = new Proxy(components, {\n get(target, prop) {\n if (typeof prop === 'string' && prop in target) {\n const Component = target[prop];\n return (props: any) => {\n const children = Array.isArray(props.children)\n ? props.children.join('')\n : props.children;\n return Component({ ...props, children });\n };\n }\n if (typeof prop === 'string' && /^[a-z][a-z0-9]*$/.test(prop)) {\n return (props: any) => {\n const attrs = Object.entries(props)\n .filter(([key]) => key !== 'children' && key !== 'key')\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n const children = Array.isArray(props.children)\n ? props.children.join('')\n : props.children;\n return `<${prop}${attrs ? ` ${attrs}` : ''}>${children}</${prop}>`;\n };\n }\n return undefined;\n },\n });\n\n const result = getHTML(htmlStr, wrappedComponents as any);\n return Array.isArray(result) ? result.join('') : result;\n };\n\n const value = use();\n let children = htmlStr;\n\n if (\n process.env.INTLAYER_EDITOR_ENABLED !== 'false' &&\n editor.enabled\n ) {\n const keyPathJson = JSON.stringify(props.keyPath ?? []);\n const dictKey = String(props.dictionaryKey ?? '');\n children = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;\n }\n\n return renderIntlayerNode({\n ...props,\n value,\n children,\n additionalProps: {\n use: (components?: any) => use(components),\n },\n });\n },\n };\n\n/** ---------------------------------------------\n * PLUGINS RESULT\n * --------------------------------------------- */\n\nexport interface IInterpreterPluginVanilla<T, S, L extends LocalesValues> {\n vanillaIntlayerNode: IntlayerNodeCond<T>;\n vanillaInsertion: InsertionCond<T, S, L>;\n vanillaMarkdown: MarkdownCond<T>;\n vanillaHtml: HTMLPluginCond<T>;\n}\n\n/**\n * Insert this type as param of `DeepTransformContent` to avoid `intlayer` package pollution.\n *\n * Otherwise the `vanilla-intlayer` plugins will override the types of `intlayer` functions.\n * Use `getIntlayer` from `vanilla-intlayer` (not from `intlayer`) to get properly typed\n * `IntlayerNode` wrappers with `.value` access on string/number content.\n */\nexport type IInterpreterPluginState = Omit<\n IInterpreterPluginStateCore,\n 'insertion'\n> & {\n vanillaIntlayerNode: true;\n vanillaInsertion: true;\n vanillaMarkdown: true;\n vanillaHtml: true;\n};\n\nexport type DeepTransformContent<\n T,\n L extends LocalesValues = DeclaredLocales,\n> = DeepTransformContentCore<T, IInterpreterPluginState, L>;\n\nconst pluginsCache = new Map<string, Plugins[]>();\n\n/**\n * Get the plugins array for Vanilla content transformation.\n * This function is used by both getIntlayer and getDictionary to ensure consistent plugin configuration.\n */\nexport const getPlugins = (\n locale?: LocalesValues,\n fallback = true\n): Plugins[] => {\n const currentLocale = locale ?? internationalization.defaultLocale;\n const cacheKey = `${currentLocale}_${fallback}`;\n\n if (pluginsCache.has(cacheKey)) {\n return pluginsCache.get(cacheKey)!;\n }\n\n const plugins = [\n translationPlugin(\n locale ?? internationalization.defaultLocale,\n fallback ? internationalization.defaultLocale : undefined\n ),\n enumerationPlugin,\n pluralPlugin(locale ?? internationalization.defaultLocale),\n conditionPlugin,\n nestedPlugin(locale ?? internationalization.defaultLocale),\n filePlugin,\n genderPlugin,\n selectPlugin,\n intlayerNodePlugins,\n insertionPlugin,\n markdownPlugin,\n htmlPlugin,\n ] as Plugins[];\n\n pluginsCache.set(cacheKey, plugins);\n\n return plugins;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugins.cjs","names":["editor","renderIntlayerNode","fallbackPlugin","NodeTypes","isInterpolableWrapperNode","transformInterpolableNode","splitInsertionTemplate","resolveInsertedSelector","getMarkdownMetadata","compileWithOptions","getHTML","internationalization","translationPlugin","enumerationPlugin","pluralPlugin","conditionPlugin","nestedPlugin","filePlugin","genderPlugin","selectPlugin"],"sources":["../../src/plugins.ts"],"sourcesContent":["import { editor, internationalization } from '@intlayer/config/built';\nimport {\n conditionPlugin,\n type DeepTransformContent as DeepTransformContentCore,\n enumerationPlugin,\n fallbackPlugin,\n filePlugin,\n genderPlugin,\n getHTML,\n type IInterpreterPluginState as IInterpreterPluginStateCore,\n isInterpolableWrapperNode,\n nestedPlugin,\n type Plugins,\n pluralPlugin,\n resolveInsertedSelector,\n selectPlugin,\n splitInsertionTemplate,\n transformInterpolableNode,\n translationPlugin,\n} from '@intlayer/core/interpreter';\nimport {\n compileWithOptions,\n getMarkdownMetadata,\n} from '@intlayer/core/markdown';\nimport type {\n HTMLContent,\n InsertionContent,\n MarkdownContent,\n} from '@intlayer/core/transpiler';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport type {\n DeclaredLocales,\n LocalesValues,\n} from '@intlayer/types/module_augmentation';\nimport type { NodeType } from '@intlayer/types/nodeType';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport type { HTMLComponents } from './html/types';\nimport {\n type IntlayerNode as IntlayerNodeCore,\n renderIntlayerNode,\n} from './renderIntlayerNode';\n\n/** ---------------------------------------------\n * INTLAYER NODE PLUGIN\n * --------------------------------------------- */\n\nexport type IntlayerNodeCond<T> = T extends number | string\n ? IntlayerNode<T>\n : never;\n\nexport type IntlayerNode<T, P = {}> = IntlayerNodeCore<T> & P;\n\nconst escapeHtmlAttr = (str: string): string =>\n str.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n\nconst escapeHtmlText = (str: string): string =>\n str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\nexport const intlayerNodePlugins: Plugins = {\n id: 'intlayer-node-plugin',\n canHandle: (node) =>\n typeof node === 'bigint' ||\n typeof node === 'string' ||\n typeof node === 'number',\n transform: (_node, { children, keyPath, dictionaryKey }) => {\n if (process.env.INTLAYER_EDITOR_ENABLED !== 'false' && editor.enabled) {\n const rawStr = String(children ?? '');\n const keyPathJson = JSON.stringify(keyPath ?? []);\n const dictKey = String(dictionaryKey ?? '');\n\n /**\n * In editor mode, string coercion returns the wrapper HTML so that\n * `element.innerHTML = content.title` automatically inserts the\n * `<intlayer-content-selector-wrapper>` into the DOM.\n */\n const htmlStr = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(rawStr)}</intlayer-content-selector-wrapper>`;\n\n return renderIntlayerNode({\n value: children as string,\n children: htmlStr,\n keyPath,\n dictionaryKey,\n additionalProps: {\n toElement: (): HTMLElement => {\n const wrapper = document.createElement(\n 'intlayer-content-selector-wrapper'\n );\n wrapper.setAttribute('key-path', keyPathJson);\n wrapper.setAttribute('dictionary-key', dictKey);\n wrapper.textContent = rawStr;\n return wrapper;\n },\n },\n });\n }\n\n return renderIntlayerNode({\n value: children as string,\n children,\n });\n },\n};\n\n/** ---------------------------------------------\n * INSERTION PLUGIN\n * --------------------------------------------- */\n\nexport type InsertionCond<T, _S, L extends LocalesValues> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.INSERTION]: infer I;\n fields: readonly (infer F)[];\n}\n ? <V extends { [K in Extract<F, string>]: string | number }>(\n values: V\n ) => I extends string ? IntlayerNode<string> : DeepTransformContent<I, L>\n : never;\n\nexport const insertionPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_INSERTION === 'false'\n ? fallbackPlugin\n : {\n id: 'insertion-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.INSERTION,\n transform: (node: InsertionContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n { type: NodeTypes.INSERTION },\n ];\n\n const children = node[NodeTypes.INSERTION];\n\n const insertionStringPlugin: Plugins = {\n id: 'insertion-string-plugin',\n canHandle: (node) =>\n typeof node === 'string' || isInterpolableWrapperNode(node),\n transform: (node, subProps, deepTransformNode) => {\n // `html()`/`markdown()` nodes carry their `{{ … }}` placeholders\n // inside a raw string. Interpolate into that string, then re-run\n // the transform so the html/markdown renderer applies afterwards.\n if (isInterpolableWrapperNode(node)) {\n return (\n values: {\n [K in InsertionContent['fields'][number]]: string | number;\n }\n ) =>\n transformInterpolableNode(\n node,\n values,\n subProps,\n props.plugins,\n deepTransformNode\n );\n }\n\n const transformedResult = deepTransformNode(node, {\n ...subProps,\n children: node,\n plugins: (props.plugins ?? ([] as Plugins[])).filter(\n (plugin) => plugin.id !== 'intlayer-node-plugin'\n ),\n });\n\n return (\n values: {\n [K in InsertionContent['fields'][number]]: string | number;\n }\n ) => {\n const result = splitInsertionTemplate(\n transformedResult,\n values\n );\n const resultStr = result.isSimple\n ? (result.parts as string)\n : (result.parts as string[]).join('');\n\n return deepTransformNode(resultStr, {\n ...subProps,\n plugins: props.plugins,\n children: resultStr,\n });\n };\n },\n };\n\n const transformed = deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [insertionStringPlugin, ...(props.plugins ?? [])],\n });\n\n return resolveInsertedSelector(children, transformed);\n },\n };\n\n/** ---------------------------------------------\n * MARKDOWN PLUGIN\n * --------------------------------------------- */\n\nconst vanillaRuntime = {\n createElement: (tag: string, props: any, ...children: any[]) => {\n const attrs = Object.entries(props || {})\n .filter(\n ([key]) => key !== 'children' && key !== 'key' && key !== '_innerHTML'\n )\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n const innerHTML = props?._innerHTML;\n const childrenStr =\n innerHTML !== undefined ? innerHTML : children.flat(Infinity).join('');\n return `<${tag}${attrs ? ` ${attrs}` : ''}>${childrenStr}</${tag}>`;\n },\n normalizeProps: (_tag: string, props: Record<string, any>) => {\n const normalized: Record<string, any> = {};\n for (const [key, value] of Object.entries(props)) {\n if (key === 'className') {\n normalized.class = value;\n } else if (key === 'htmlFor') {\n normalized.for = value;\n } else if (key === 'dangerouslySetInnerHTML' && (value as any)?.__html) {\n normalized._innerHTML = (value as any).__html;\n } else {\n normalized[key] = value;\n }\n }\n return normalized;\n },\n};\n\nexport type MarkdownStringCond<T> = T extends string\n ? IntlayerNode<\n string,\n {\n metadata: DeepTransformContent<string>;\n /** Returns the rendered markdown; render with .use(). */\n use: (components?: HTMLComponents<'permissive', {}>) => string;\n }\n >\n : never;\n\nexport const markdownStringPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_MARKDOWN === 'false'\n ? fallbackPlugin\n : {\n id: 'markdown-string-plugin',\n canHandle: (node) => typeof node === 'string',\n transform: (node: string, props, deepTransformNode) => {\n const { plugins: _plugins, ...rest } = props;\n const metadata = getMarkdownMetadata(node) ?? {};\n\n const metadataPlugins: Plugins = {\n id: 'markdown-metadata-plugin',\n canHandle: (metadataNode) =>\n typeof metadataNode === 'string' ||\n typeof metadataNode === 'number' ||\n typeof metadataNode === 'boolean' ||\n !metadataNode,\n transform: (metadataNode, subProps) =>\n renderIntlayerNode({\n ...subProps,\n value: metadataNode,\n children: node,\n }),\n };\n\n const metadataNodes = deepTransformNode(metadata, {\n plugins: [metadataPlugins],\n dictionaryKey: rest.dictionaryKey,\n keyPath: [],\n });\n\n const compile = (components: any = {}) =>\n compileWithOptions(\n node,\n {\n ...vanillaRuntime,\n createElement: (tag: any, props: any, ...children: any[]) => {\n const override = components[tag];\n if (typeof override === 'function') {\n return override({ ...props, children: children.join('') });\n }\n return vanillaRuntime.createElement(tag, props, ...children);\n },\n },\n {}\n ) as any;\n\n const value = compile();\n let children = node;\n\n if (\n process.env.INTLAYER_EDITOR_ENABLED !== 'false' &&\n editor.enabled\n ) {\n const keyPathJson = JSON.stringify(props.keyPath ?? []);\n const dictKey = String(props.dictionaryKey ?? '');\n children = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;\n }\n\n return renderIntlayerNode({\n ...props,\n value,\n children,\n additionalProps: {\n metadata: metadataNodes,\n use: (components?: any) => compile(components),\n },\n }) as any;\n },\n };\n\nexport type MarkdownCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.MARKDOWN]: infer M;\n metadata?: infer U;\n tags?: infer U;\n}\n ? {\n use: (components?: HTMLComponents<'permissive', U>) => IntlayerNode<M>;\n metadata: DeepTransformContent<U>;\n }\n : never;\n\nexport const markdownPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_MARKDOWN === 'false'\n ? fallbackPlugin\n : {\n id: 'markdown-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.MARKDOWN,\n transform: (node: MarkdownContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n { type: NodeTypes.MARKDOWN },\n ];\n const children = node[NodeTypes.MARKDOWN];\n\n return deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [markdownStringPlugin, ...(props.plugins ?? [])],\n });\n },\n };\n\n/** ---------------------------------------------\n * HTML PLUGIN\n * --------------------------------------------- */\n\nexport type HTMLPluginCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.HTML]: infer I;\n tags?: infer U;\n}\n ? {\n use: (components?: HTMLComponents<'permissive', U>) => IntlayerNode<I>;\n }\n : never;\n\nexport const htmlPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_HTML === 'false'\n ? fallbackPlugin\n : {\n id: 'html-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.HTML,\n transform: (node: HTMLContent<string>, props) => {\n const htmlStr = node[NodeTypes.HTML];\n\n const use = (components: Record<string, any> = {}) => {\n const wrappedComponents = new Proxy(components, {\n get(target, prop) {\n if (typeof prop === 'string' && prop in target) {\n const Component = target[prop];\n return (props: any) => {\n const children = Array.isArray(props.children)\n ? props.children.join('')\n : props.children;\n return Component({ ...props, children });\n };\n }\n if (typeof prop === 'string' && /^[a-z][a-z0-9]*$/.test(prop)) {\n return (props: any) => {\n const attrs = Object.entries(props)\n .filter(([key]) => key !== 'children' && key !== 'key')\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n const children = Array.isArray(props.children)\n ? props.children.join('')\n : props.children;\n return `<${prop}${attrs ? ` ${attrs}` : ''}>${children}</${prop}>`;\n };\n }\n return undefined;\n },\n });\n\n const result = getHTML(htmlStr, wrappedComponents as any);\n return Array.isArray(result) ? result.join('') : result;\n };\n\n const value = use();\n let children = htmlStr;\n\n if (\n process.env.INTLAYER_EDITOR_ENABLED !== 'false' &&\n editor.enabled\n ) {\n const keyPathJson = JSON.stringify(props.keyPath ?? []);\n const dictKey = String(props.dictionaryKey ?? '');\n children = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;\n }\n\n return renderIntlayerNode({\n ...props,\n value,\n children,\n additionalProps: {\n use: (components?: any) => use(components),\n },\n });\n },\n };\n\n/** ---------------------------------------------\n * PLUGINS RESULT\n * --------------------------------------------- */\n\nexport interface IInterpreterPluginVanilla<T, S, L extends LocalesValues> {\n vanillaIntlayerNode: IntlayerNodeCond<T>;\n vanillaInsertion: InsertionCond<T, S, L>;\n vanillaMarkdown: MarkdownCond<T>;\n vanillaHtml: HTMLPluginCond<T>;\n}\n\n/**\n * Insert this type as param of `DeepTransformContent` to avoid `intlayer` package pollution.\n *\n * Otherwise the `vanilla-intlayer` plugins will override the types of `intlayer` functions.\n * Use `getIntlayer` from `vanilla-intlayer` (not from `intlayer`) to get properly typed\n * `IntlayerNode` wrappers with `.value` access on string/number content.\n */\nexport type IInterpreterPluginState = Omit<\n IInterpreterPluginStateCore,\n 'insertion'\n> & {\n vanillaIntlayerNode: true;\n vanillaInsertion: true;\n vanillaMarkdown: true;\n vanillaHtml: true;\n};\n\nexport type DeepTransformContent<\n T,\n L extends LocalesValues = DeclaredLocales,\n> = DeepTransformContentCore<T, IInterpreterPluginState, L>;\n\nconst pluginsCache = new Map<string, Plugins[]>();\n\n/**\n * Get the plugins array for Vanilla content transformation.\n * This function is used by both getIntlayer and getDictionary to ensure consistent plugin configuration.\n */\nexport const getPlugins = (\n locale?: LocalesValues,\n fallback = true\n): Plugins[] => {\n const currentLocale = locale ?? internationalization.defaultLocale;\n const cacheKey = `${currentLocale}_${fallback}`;\n\n if (pluginsCache.has(cacheKey)) {\n return pluginsCache.get(cacheKey)!;\n }\n\n const plugins = [\n // First: most nodes are plain strings, which every other plugin rejects\n intlayerNodePlugins,\n translationPlugin(\n locale ?? internationalization.defaultLocale,\n fallback ? internationalization.defaultLocale : undefined\n ),\n enumerationPlugin,\n pluralPlugin(locale ?? internationalization.defaultLocale),\n conditionPlugin,\n nestedPlugin(locale ?? internationalization.defaultLocale),\n filePlugin,\n genderPlugin,\n selectPlugin,\n insertionPlugin,\n markdownPlugin,\n htmlPlugin,\n ] as Plugins[];\n\n // Plugins disabled at build time never match: skip them on every node\n const enabledPlugins = plugins.filter((plugin) => plugin !== fallbackPlugin);\n\n pluginsCache.set(cacheKey, enabledPlugins);\n\n return enabledPlugins;\n};\n"],"mappings":"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"}
@@ -1,9 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ let _intlayer_core_utils = require("@intlayer/core/utils");
3
+
2
4
  //#region src/renderIntlayerNode.ts
3
5
  const renderIntlayerNode = ({ value, children, additionalProps = {} }) => {
4
6
  let _value = value;
5
7
  const displayOverride = typeof children === "string" && children !== String(value ?? "") ? children : null;
6
- const node = {
8
+ return {
9
+ __proto__: (0, _intlayer_core_utils.getIntlayerNodePrototype)(value),
7
10
  toString: () => displayOverride ?? String(_value ?? ""),
8
11
  valueOf: () => _value,
9
12
  [Symbol.toPrimitive]: () => displayOverride ?? _value,
@@ -22,20 +25,6 @@ const renderIntlayerNode = ({ value, children, additionalProps = {} }) => {
22
25
  },
23
26
  ...additionalProps
24
27
  };
25
- if (_value !== null && _value !== void 0) {
26
- const valObj = Object(_value);
27
- const proto = Object.getPrototypeOf(valObj);
28
- for (const prop of Object.getOwnPropertyNames(proto)) {
29
- if (prop === "constructor" || prop in node) continue;
30
- const valProp = valObj[prop];
31
- if (typeof valProp === "function") Object.defineProperty(node, prop, {
32
- value: valProp.bind(_value),
33
- writable: true,
34
- configurable: true
35
- });
36
- }
37
- }
38
- return node;
39
28
  };
40
29
 
41
30
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"renderIntlayerNode.cjs","names":[],"sources":["../../src/renderIntlayerNode.ts"],"sourcesContent":["import type { ResolvedEditor } from '@intlayer/types/module_augmentation';\n\nexport type IntlayerNode<T = string> = ResolvedEditor<\n T & {\n raw: T;\n value: T;\n toString: () => string;\n valueOf: () => T;\n toJSON: () => T;\n __update: (next: IntlayerNode<T>) => void;\n },\n {\n raw: T;\n value: T;\n toString: () => string;\n valueOf: () => T;\n toJSON: () => T;\n __update: (next: IntlayerNode<T>) => void;\n }\n> &\n T;\n\nexport const renderIntlayerNode = <\n T, // Broadened to support arrays, numbers, objects, etc.\n>({\n value,\n children,\n additionalProps = {},\n}: {\n value: T;\n children?: any;\n additionalProps?: Record<string, unknown>;\n [key: string]: unknown;\n}): IntlayerNode<T> => {\n let _value = value;\n\n // When children is a string that differs from value, it acts as a display\n // override (e.g. editor HTML wrapper). Otherwise toString/toPrimitive reflect\n // the live _value so that __update propagates.\n const displayOverride =\n typeof children === 'string' && children !== String(value ?? '')\n ? children\n : null;\n\n const node = {\n toString: () => displayOverride ?? String(_value ?? ''),\n valueOf: () => _value,\n [Symbol.toPrimitive]: () => displayOverride ?? _value,\n toJSON: () => _value,\n\n get raw() {\n return _value;\n },\n set raw(value: T) {\n _value = value;\n },\n\n get value() {\n return _value;\n },\n\n __update(next: any) {\n _value = next?.raw ?? next?.value ?? next;\n },\n\n ...additionalProps,\n };\n\n // Delegate native methods from the underlying value (any type) to node.\n if (_value !== null && _value !== undefined) {\n const valObj = Object(_value); // Safely boxes primitives (e.g., 50 -> Number object)\n const proto = Object.getPrototypeOf(valObj);\n for (const prop of Object.getOwnPropertyNames(proto)) {\n if (prop === 'constructor' || prop in node) continue;\n const valProp = valObj[prop]; // read from instance so length/index values are correct\n if (typeof valProp === 'function') {\n Object.defineProperty(node, prop, {\n value: valProp.bind(_value),\n writable: true,\n configurable: true,\n });\n }\n }\n }\n\n return node as unknown as IntlayerNode<T>;\n};\n"],"mappings":";;AAsBA,MAAa,sBAEX,EACA,OACA,UACA,kBAAkB,CAAC,QAME;CACrB,IAAI,SAAS;CAKb,MAAM,kBACJ,OAAO,aAAa,YAAY,aAAa,OAAO,SAAS,EAAE,IAC3D,WACA;CAEN,MAAM,OAAO;EACX,gBAAgB,mBAAmB,OAAO,UAAU,EAAE;EACtD,eAAe;GACd,OAAO,oBAAoB,mBAAmB;EAC/C,cAAc;EAEd,IAAI,MAAM;GACR,OAAO;EACT;EACA,IAAI,IAAI,OAAU;GAChB,SAAS;EACX;EAEA,IAAI,QAAQ;GACV,OAAO;EACT;EAEA,SAAS,MAAW;GAClB,SAAS,MAAM,OAAO,MAAM,SAAS;EACvC;EAEA,GAAG;CACL;CAGA,IAAI,WAAW,QAAQ,WAAW,QAAW;EAC3C,MAAM,SAAS,OAAO,MAAM;EAC5B,MAAM,QAAQ,OAAO,eAAe,MAAM;EAC1C,KAAK,MAAM,QAAQ,OAAO,oBAAoB,KAAK,GAAG;GACpD,IAAI,SAAS,iBAAiB,QAAQ,MAAM;GAC5C,MAAM,UAAU,OAAO;GACvB,IAAI,OAAO,YAAY,YACrB,OAAO,eAAe,MAAM,MAAM;IAChC,OAAO,QAAQ,KAAK,MAAM;IAC1B,UAAU;IACV,cAAc;GAChB,CAAC;EAEL;CACF;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"renderIntlayerNode.cjs","names":["getIntlayerNodePrototype"],"sources":["../../src/renderIntlayerNode.ts"],"sourcesContent":["import { getIntlayerNodePrototype } from '@intlayer/core/utils';\nimport type { ResolvedEditor } from '@intlayer/types/module_augmentation';\n\nexport type IntlayerNode<T = string> = ResolvedEditor<\n T & {\n raw: T;\n value: T;\n toString: () => string;\n valueOf: () => T;\n toJSON: () => T;\n __update: (next: IntlayerNode<T>) => void;\n },\n {\n raw: T;\n value: T;\n toString: () => string;\n valueOf: () => T;\n toJSON: () => T;\n __update: (next: IntlayerNode<T>) => void;\n }\n> &\n T;\n\nexport const renderIntlayerNode = <\n T, // Broadened to support arrays, numbers, objects, etc.\n>({\n value,\n children,\n additionalProps = {},\n}: {\n value: T;\n children?: any;\n additionalProps?: Record<string, unknown>;\n [key: string]: unknown;\n}): IntlayerNode<T> => {\n let _value = value;\n\n // When children is a string that differs from value, it acts as a display\n // override (e.g. editor HTML wrapper). Otherwise toString/toPrimitive reflect\n // the live _value so that __update propagates.\n const displayOverride =\n typeof children === 'string' && children !== String(value ?? '')\n ? children\n : null;\n\n const node = {\n // Serves the value's members: `node.toUpperCase()`, `'trim' in node`\n __proto__: getIntlayerNodePrototype(value),\n\n toString: () => displayOverride ?? String(_value ?? ''),\n valueOf: () => _value,\n [Symbol.toPrimitive]: () => displayOverride ?? _value,\n toJSON: () => _value,\n\n get raw() {\n return _value;\n },\n set raw(value: T) {\n _value = value;\n },\n\n get value() {\n return _value;\n },\n\n __update(next: any) {\n _value = next?.raw ?? next?.value ?? next;\n },\n\n ...additionalProps,\n };\n\n return node as unknown as IntlayerNode<T>;\n};\n"],"mappings":";;;;AAuBA,MAAa,sBAEX,EACA,OACA,UACA,kBAAkB,CAAC,QAME;CACrB,IAAI,SAAS;CAKb,MAAM,kBACJ,OAAO,aAAa,YAAY,aAAa,OAAO,SAAS,EAAE,IAC3D,WACA;CA6BN,OAAO;EAzBL,eAAWA,+CAAyB,KAAK;EAEzC,gBAAgB,mBAAmB,OAAO,UAAU,EAAE;EACtD,eAAe;GACd,OAAO,oBAAoB,mBAAmB;EAC/C,cAAc;EAEd,IAAI,MAAM;GACR,OAAO;EACT;EACA,IAAI,IAAI,OAAU;GAChB,SAAS;EACX;EAEA,IAAI,QAAQ;GACV,OAAO;EACT;EAEA,SAAS,MAAW;GAClB,SAAS,MAAM,OAAO,MAAM,SAAS;EACvC;EAEA,GAAG;CAGK;AACZ"}
@@ -1,10 +1,10 @@
1
+ import { getLocaleInStorage, localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useLocaleCookie, useLocaleStorage } from "./useLocaleStorage.mjs";
1
2
  import { IntlayerClient, createIntlayerClient, getIntlayerClient, installIntlayer } from "./installIntlayer.mjs";
2
3
  import { useDictionary } from "./useDictionary.mjs";
3
4
  import { useDictionaryDynamic } from "./useDictionaryDynamic.mjs";
4
5
  import { useIntlayer } from "./useIntlayer.mjs";
5
- import { localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useLocaleCookie, useLocaleStorage } from "./useLocaleStorage.mjs";
6
6
  import { useLocale } from "./useLocale.mjs";
7
7
  import { usePathname } from "./usePathname.mjs";
8
8
  import { useRewriteURL } from "./useRewriteURL.mjs";
9
9
 
10
- export { IntlayerClient, createIntlayerClient, getIntlayerClient, installIntlayer, localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useDictionary, useDictionaryDynamic, useIntlayer, useLocale, useLocaleCookie, useLocaleStorage, usePathname, useRewriteURL };
10
+ export { IntlayerClient, createIntlayerClient, getIntlayerClient, getLocaleInStorage, installIntlayer, localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useDictionary, useDictionaryDynamic, useIntlayer, useLocale, useLocaleCookie, useLocaleStorage, usePathname, useRewriteURL };
@@ -1,4 +1,5 @@
1
1
  import { useEditor } from "../editor/useEditor.mjs";
2
+ import { getLocaleInStorage } from "./useLocaleStorage.mjs";
2
3
  import { internationalization } from "@intlayer/config/built";
3
4
  import { setIntlayerIdentifier } from "@intlayer/config/client";
4
5
 
@@ -11,7 +12,7 @@ var IntlayerClient = class {
11
12
  constructor(locale, isCookieEnabled = true, variant) {
12
13
  const { defaultLocale } = internationalization ?? {};
13
14
  setIntlayerIdentifier();
14
- this._locale = locale ?? defaultLocale;
15
+ this._locale = locale ?? getLocaleInStorage() ?? defaultLocale;
15
16
  this._variant = variant;
16
17
  this.isCookieEnabled = isCookieEnabled;
17
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"installIntlayer.mjs","names":[],"sources":["../../../src/client/installIntlayer.ts"],"sourcesContent":["import { internationalization } from '@intlayer/config/built';\nimport { setIntlayerIdentifier } from '@intlayer/config/client';\nimport type {\n LocalesValues,\n ProviderVariant,\n} from '@intlayer/types/module_augmentation';\nimport { useEditor } from '../editor/useEditor';\n\ntype LocaleListener = (locale: LocalesValues) => void;\n\nexport class IntlayerClient {\n private _locale: LocalesValues;\n private _variant: ProviderVariant | undefined;\n private _listeners: Set<LocaleListener> = new Set();\n isCookieEnabled: boolean;\n\n constructor(\n locale?: LocalesValues,\n isCookieEnabled = true,\n variant?: ProviderVariant\n ) {\n const { defaultLocale } = internationalization ?? {};\n\n setIntlayerIdentifier();\n\n this._locale =\n (locale as LocalesValues) ?? (defaultLocale as LocalesValues);\n this._variant = variant;\n this.isCookieEnabled = isCookieEnabled;\n }\n\n get locale(): LocalesValues {\n return this._locale;\n }\n\n /**\n * Ambient variant applied to every dictionary read, the same way `locale` is.\n * Overridden per call by an explicit selector.\n */\n get variant(): ProviderVariant | undefined {\n return this._variant;\n }\n\n setLocale(newLocale: LocalesValues): void {\n this._locale = newLocale;\n for (const listener of this._listeners) {\n listener(newLocale);\n }\n }\n\n setVariant(newVariant: ProviderVariant | undefined): void {\n this._variant = newVariant;\n this.notify();\n }\n\n subscribe(listener: LocaleListener): () => void {\n this._listeners.add(listener);\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n /**\n * Fire all listeners with the current locale without changing it.\n * Used to trigger re-renders after async data loads.\n */\n notify(): void {\n for (const listener of this._listeners) {\n listener(this._locale);\n }\n }\n}\n\n/**\n * Singleton instance\n */\nlet instance: IntlayerClient | null = null;\n\n/**\n * Create and return a single IntlayerClient instance.\n */\nexport const createIntlayerClient = (\n locale?: LocalesValues,\n isCookieEnabled = true,\n variant?: ProviderVariant\n): IntlayerClient => {\n if (instance) return instance;\n\n instance = new IntlayerClient(locale, isCookieEnabled, variant);\n return instance;\n};\n\n/**\n * Get the current IntlayerClient instance, creating one with defaults if needed.\n */\nexport const getIntlayerClient = (): IntlayerClient => {\n if (!instance) {\n instance = new IntlayerClient();\n }\n return instance;\n};\n\n/**\n * Install Intlayer into your vanilla JS application.\n *\n * Call this once at application startup, before any Intlayer APIs are used.\n *\n * When called with a `config` argument, `window.INTLAYER_CONFIG` is set so\n * that `@intlayer/config/built` resolves the correct values in the browser\n * without requiring module aliasing in the bundler configuration.\n *\n * @param locale - Initial locale (defaults to config defaultLocale).\n * @param isCookieEnabled - Whether to persist locale in cookies/localStorage.\n * @param variant - Ambient variant applied to every dictionary read — for a\n * dimension fixed for the whole session (tenant, school type, plan tier…)\n * that no call site should have to pass by hand. Accepts a name\n * (`'school1'`), an ordered preference chain (`['school1', 'default']`), or a\n * per-key map (`{ key1: 'school1', default: 'base' }`). A plain object is\n * always the per-key map; nest a structured variant as\n * `{ default: { id: 'prod_abc' } }`. A call-site selector always wins.\n * @param config - Optional Intlayer configuration. When provided, sets\n * `window.INTLAYER_CONFIG` with the browser-safe subset of the config so\n * the application works without a Vite/webpack plugin alias.\n * @returns The IntlayerClient singleton.\n *\n * @example\n * ```ts\n * import { installIntlayer } from 'vanilla-intlayer';\n *\n * // With explicit config (no build plugin alias needed):\n * installIntlayer('en', true, {\n * internationalization: { locales: ['en', 'fr'], defaultLocale: 'en' },\n * });\n *\n * // With build plugin (alias handles config automatically):\n * installIntlayer('en');\n * ```\n */\nexport const installIntlayer = ({\n locale,\n isCookieEnabled,\n variant,\n}: {\n locale?: LocalesValues;\n isCookieEnabled?: boolean;\n variant?: ProviderVariant;\n} = {}): IntlayerClient => {\n const client = createIntlayerClient(locale, isCookieEnabled, variant);\n\n useEditor();\n\n return client;\n};\n"],"mappings":";;;;;AAUA,IAAa,iBAAb,MAA4B;CAC1B,AAAQ;CACR,AAAQ;CACR,AAAQ,6BAAkC,IAAI,IAAI;CAClD;CAEA,YACE,QACA,kBAAkB,MAClB,SACA;EACA,MAAM,EAAE,kBAAkB,wBAAwB,CAAC;EAEnD,sBAAsB;EAEtB,KAAK,UACF,UAA6B;EAChC,KAAK,WAAW;EAChB,KAAK,kBAAkB;CACzB;CAEA,IAAI,SAAwB;EAC1B,OAAO,KAAK;CACd;;;;;CAMA,IAAI,UAAuC;EACzC,OAAO,KAAK;CACd;CAEA,UAAU,WAAgC;EACxC,KAAK,UAAU;EACf,KAAK,MAAM,YAAY,KAAK,YAC1B,SAAS,SAAS;CAEtB;CAEA,WAAW,YAA+C;EACxD,KAAK,WAAW;EAChB,KAAK,OAAO;CACd;CAEA,UAAU,UAAsC;EAC9C,KAAK,WAAW,IAAI,QAAQ;EAC5B,aAAa;GACX,KAAK,WAAW,OAAO,QAAQ;EACjC;CACF;;;;;CAMA,SAAe;EACb,KAAK,MAAM,YAAY,KAAK,YAC1B,SAAS,KAAK,OAAO;CAEzB;AACF;;;;AAKA,IAAI,WAAkC;;;;AAKtC,MAAa,wBACX,QACA,kBAAkB,MAClB,YACmB;CACnB,IAAI,UAAU,OAAO;CAErB,WAAW,IAAI,eAAe,QAAQ,iBAAiB,OAAO;CAC9D,OAAO;AACT;;;;AAKA,MAAa,0BAA0C;CACrD,IAAI,CAAC,UACH,WAAW,IAAI,eAAe;CAEhC,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,MAAa,mBAAmB,EAC9B,QACA,iBACA,YAKE,CAAC,MAAsB;CACzB,MAAM,SAAS,qBAAqB,QAAQ,iBAAiB,OAAO;CAEpE,UAAU;CAEV,OAAO;AACT"}
1
+ {"version":3,"file":"installIntlayer.mjs","names":[],"sources":["../../../src/client/installIntlayer.ts"],"sourcesContent":["import { internationalization } from '@intlayer/config/built';\nimport { setIntlayerIdentifier } from '@intlayer/config/client';\nimport type {\n LocalesValues,\n ProviderVariant,\n} from '@intlayer/types/module_augmentation';\nimport { useEditor } from '../editor/useEditor';\nimport { getLocaleInStorage } from './useLocaleStorage';\n\ntype LocaleListener = (locale: LocalesValues) => void;\n\nexport class IntlayerClient {\n private _locale: LocalesValues;\n private _variant: ProviderVariant | undefined;\n private _listeners: Set<LocaleListener> = new Set();\n isCookieEnabled: boolean;\n\n constructor(\n locale?: LocalesValues,\n isCookieEnabled = true,\n variant?: ProviderVariant\n ) {\n const { defaultLocale } = internationalization ?? {};\n\n setIntlayerIdentifier();\n\n // Returning visitors keep their language when no locale is passed\n this._locale =\n (locale as LocalesValues) ??\n getLocaleInStorage() ??\n (defaultLocale as LocalesValues);\n this._variant = variant;\n this.isCookieEnabled = isCookieEnabled;\n }\n\n get locale(): LocalesValues {\n return this._locale;\n }\n\n /**\n * Ambient variant applied to every dictionary read, the same way `locale` is.\n * Overridden per call by an explicit selector.\n */\n get variant(): ProviderVariant | undefined {\n return this._variant;\n }\n\n setLocale(newLocale: LocalesValues): void {\n this._locale = newLocale;\n for (const listener of this._listeners) {\n listener(newLocale);\n }\n }\n\n setVariant(newVariant: ProviderVariant | undefined): void {\n this._variant = newVariant;\n this.notify();\n }\n\n subscribe(listener: LocaleListener): () => void {\n this._listeners.add(listener);\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n /**\n * Fire all listeners with the current locale without changing it.\n * Used to trigger re-renders after async data loads.\n */\n notify(): void {\n for (const listener of this._listeners) {\n listener(this._locale);\n }\n }\n}\n\n/**\n * Singleton instance\n */\nlet instance: IntlayerClient | null = null;\n\n/**\n * Create and return a single IntlayerClient instance.\n */\nexport const createIntlayerClient = (\n locale?: LocalesValues,\n isCookieEnabled = true,\n variant?: ProviderVariant\n): IntlayerClient => {\n if (instance) return instance;\n\n instance = new IntlayerClient(locale, isCookieEnabled, variant);\n return instance;\n};\n\n/**\n * Get the current IntlayerClient instance, creating one with defaults if needed.\n */\nexport const getIntlayerClient = (): IntlayerClient => {\n if (!instance) {\n instance = new IntlayerClient();\n }\n return instance;\n};\n\n/**\n * Install Intlayer into your vanilla JS application.\n *\n * Call this once at application startup, before any Intlayer APIs are used.\n *\n * When called with a `config` argument, `window.INTLAYER_CONFIG` is set so\n * that `@intlayer/config/built` resolves the correct values in the browser\n * without requiring module aliasing in the bundler configuration.\n *\n * @param locale - Initial locale (defaults to config defaultLocale).\n * @param isCookieEnabled - Whether to persist locale in cookies/localStorage.\n * @param variant - Ambient variant applied to every dictionary read — for a\n * dimension fixed for the whole session (tenant, school type, plan tier…)\n * that no call site should have to pass by hand. Accepts a name\n * (`'school1'`), an ordered preference chain (`['school1', 'default']`), or a\n * per-key map (`{ key1: 'school1', default: 'base' }`). A plain object is\n * always the per-key map; nest a structured variant as\n * `{ default: { id: 'prod_abc' } }`. A call-site selector always wins.\n * @param config - Optional Intlayer configuration. When provided, sets\n * `window.INTLAYER_CONFIG` with the browser-safe subset of the config so\n * the application works without a Vite/webpack plugin alias.\n * @returns The IntlayerClient singleton.\n *\n * @example\n * ```ts\n * import { installIntlayer } from 'vanilla-intlayer';\n *\n * // With explicit config (no build plugin alias needed):\n * installIntlayer('en', true, {\n * internationalization: { locales: ['en', 'fr'], defaultLocale: 'en' },\n * });\n *\n * // With build plugin (alias handles config automatically):\n * installIntlayer('en');\n * ```\n */\nexport const installIntlayer = ({\n locale,\n isCookieEnabled,\n variant,\n}: {\n locale?: LocalesValues;\n isCookieEnabled?: boolean;\n variant?: ProviderVariant;\n} = {}): IntlayerClient => {\n const client = createIntlayerClient(locale, isCookieEnabled, variant);\n\n useEditor();\n\n return client;\n};\n"],"mappings":";;;;;;AAWA,IAAa,iBAAb,MAA4B;CAC1B,AAAQ;CACR,AAAQ;CACR,AAAQ,6BAAkC,IAAI,IAAI;CAClD;CAEA,YACE,QACA,kBAAkB,MAClB,SACA;EACA,MAAM,EAAE,kBAAkB,wBAAwB,CAAC;EAEnD,sBAAsB;EAGtB,KAAK,UACF,UACD,mBAAmB,KAClB;EACH,KAAK,WAAW;EAChB,KAAK,kBAAkB;CACzB;CAEA,IAAI,SAAwB;EAC1B,OAAO,KAAK;CACd;;;;;CAMA,IAAI,UAAuC;EACzC,OAAO,KAAK;CACd;CAEA,UAAU,WAAgC;EACxC,KAAK,UAAU;EACf,KAAK,MAAM,YAAY,KAAK,YAC1B,SAAS,SAAS;CAEtB;CAEA,WAAW,YAA+C;EACxD,KAAK,WAAW;EAChB,KAAK,OAAO;CACd;CAEA,UAAU,UAAsC;EAC9C,KAAK,WAAW,IAAI,QAAQ;EAC5B,aAAa;GACX,KAAK,WAAW,OAAO,QAAQ;EACjC;CACF;;;;;CAMA,SAAe;EACb,KAAK,MAAM,YAAY,KAAK,YAC1B,SAAS,KAAK,OAAO;CAEzB;AACF;;;;AAKA,IAAI,WAAkC;;;;AAKtC,MAAa,wBACX,QACA,kBAAkB,MAClB,YACmB;CACnB,IAAI,UAAU,OAAO;CAErB,WAAW,IAAI,eAAe,QAAQ,iBAAiB,OAAO;CAC9D,OAAO;AACT;;;;AAKA,MAAa,0BAA0C;CACrD,IAAI,CAAC,UACH,WAAW,IAAI,eAAe;CAEhC,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,MAAa,mBAAmB,EAC9B,QACA,iBACA,YAKE,CAAC,MAAsB;CACzB,MAAM,SAAS,qBAAqB,QAAQ,iBAAiB,OAAO;CAEpE,UAAU;CAEV,OAAO;AACT"}
@@ -1,5 +1,5 @@
1
- import { getIntlayerClient } from "./installIntlayer.mjs";
2
1
  import { setLocaleInStorage } from "./useLocaleStorage.mjs";
2
+ import { getIntlayerClient } from "./installIntlayer.mjs";
3
3
  import { internationalization } from "@intlayer/config/built";
4
4
 
5
5
  //#region src/client/useLocale.ts
@@ -1,10 +1,20 @@
1
- import { LocaleStorageClient, getLocaleFromStorageClient, localeStorageOptions, setLocaleInStorageClient } from "@intlayer/core/utils";
1
+ import { LocaleStorageClient, getCachedLocaleFromStorageClient, getLocaleFromStorageClient, localeStorageOptions, setLocaleInStorageClient } from "@intlayer/core/utils";
2
2
 
3
3
  //#region src/client/useLocaleStorage.ts
4
4
  /**
5
+ * Reads the locale persisted in the browser storage (cookie, localStorage…).
6
+ *
7
+ * Unlike `localeInStorage`, read on first call rather than at import, then
8
+ * cached until the next `setLocaleInStorage`. Never cached on the server.
9
+ */
10
+ const getLocaleInStorage = getCachedLocaleFromStorageClient;
11
+ /**
5
12
  * Get the current locale from storage (cookie or localStorage).
13
+ *
14
+ * Read once at import time; marked pure so bundlers drop the read when nothing
15
+ * imports it.
6
16
  */
7
- const localeInStorage = getLocaleFromStorageClient(localeStorageOptions);
17
+ const localeInStorage = /* @__PURE__ */ getLocaleFromStorageClient(localeStorageOptions);
8
18
  /**
9
19
  * @deprecated Use localeInStorage instead.
10
20
  */
@@ -39,5 +49,5 @@ const useLocaleStorage = (isCookieEnabled) => {
39
49
  const useLocaleCookie = useLocaleStorage;
40
50
 
41
51
  //#endregion
42
- export { localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useLocaleCookie, useLocaleStorage };
52
+ export { getLocaleInStorage, localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useLocaleCookie, useLocaleStorage };
43
53
  //# sourceMappingURL=useLocaleStorage.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useLocaleStorage.mjs","names":["setLocaleInStorageCore"],"sources":["../../../src/client/useLocaleStorage.ts"],"sourcesContent":["import {\n getLocaleFromStorageClient,\n LocaleStorageClient,\n localeStorageOptions,\n setLocaleInStorageClient as setLocaleInStorageCore,\n} from '@intlayer/core/utils';\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\n\n/**\n * Get the current locale from storage (cookie or localStorage).\n */\nexport const localeInStorage = getLocaleFromStorageClient(localeStorageOptions);\n\n/**\n * @deprecated Use localeInStorage instead.\n */\nexport const localeCookie = localeInStorage;\n\n/**\n * Persist the locale to storage (cookie and/or localStorage).\n */\nexport const setLocaleInStorage = (\n locale: LocalesValues,\n isCookieEnabled: boolean\n) =>\n setLocaleInStorageCore(locale, {\n ...localeStorageOptions,\n isCookieEnabled,\n });\n\n/**\n * @deprecated Use setLocaleInStorage instead.\n */\nexport const setLocaleCookie = setLocaleInStorage;\n\n/**\n * Returns the current locale from storage and a setter.\n */\nexport const useLocaleStorage = (isCookieEnabled?: boolean) => {\n const storage = LocaleStorageClient({\n ...localeStorageOptions,\n isCookieEnabled,\n });\n\n return {\n localeStorage: storage.getLocale(),\n setLocaleStorage: storage.setLocale,\n };\n};\n\n/**\n * @deprecated Use useLocaleStorage instead.\n */\nexport const useLocaleCookie = useLocaleStorage;\n"],"mappings":";;;;;;AAWA,MAAa,kBAAkB,2BAA2B,oBAAoB;;;;AAK9E,MAAa,eAAe;;;;AAK5B,MAAa,sBACX,QACA,oBAEAA,yBAAuB,QAAQ;CAC7B,GAAG;CACH;AACF,CAAC;;;;AAKH,MAAa,kBAAkB;;;;AAK/B,MAAa,oBAAoB,oBAA8B;CAC7D,MAAM,UAAU,oBAAoB;EAClC,GAAG;EACH;CACF,CAAC;CAED,OAAO;EACL,eAAe,QAAQ,UAAU;EACjC,kBAAkB,QAAQ;CAC5B;AACF;;;;AAKA,MAAa,kBAAkB"}
1
+ {"version":3,"file":"useLocaleStorage.mjs","names":["setLocaleInStorageCore"],"sources":["../../../src/client/useLocaleStorage.ts"],"sourcesContent":["import {\n getCachedLocaleFromStorageClient,\n getLocaleFromStorageClient,\n LocaleStorageClient,\n localeStorageOptions,\n setLocaleInStorageClient as setLocaleInStorageCore,\n} from '@intlayer/core/utils';\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\n\n/**\n * Reads the locale persisted in the browser storage (cookie, localStorage…).\n *\n * Unlike `localeInStorage`, read on first call rather than at import, then\n * cached until the next `setLocaleInStorage`. Never cached on the server.\n */\nexport const getLocaleInStorage = getCachedLocaleFromStorageClient;\n\n/**\n * Get the current locale from storage (cookie or localStorage).\n *\n * Read once at import time; marked pure so bundlers drop the read when nothing\n * imports it.\n */\nexport const localeInStorage =\n /* @__PURE__ */ getLocaleFromStorageClient(localeStorageOptions);\n\n/**\n * @deprecated Use localeInStorage instead.\n */\nexport const localeCookie = localeInStorage;\n\n/**\n * Persist the locale to storage (cookie and/or localStorage).\n */\nexport const setLocaleInStorage = (\n locale: LocalesValues,\n isCookieEnabled: boolean\n) =>\n setLocaleInStorageCore(locale, {\n ...localeStorageOptions,\n isCookieEnabled,\n });\n\n/**\n * @deprecated Use setLocaleInStorage instead.\n */\nexport const setLocaleCookie = setLocaleInStorage;\n\n/**\n * Returns the current locale from storage and a setter.\n */\nexport const useLocaleStorage = (isCookieEnabled?: boolean) => {\n const storage = LocaleStorageClient({\n ...localeStorageOptions,\n isCookieEnabled,\n });\n\n return {\n localeStorage: storage.getLocale(),\n setLocaleStorage: storage.setLocale,\n };\n};\n\n/**\n * @deprecated Use useLocaleStorage instead.\n */\nexport const useLocaleCookie = useLocaleStorage;\n"],"mappings":";;;;;;;;;AAeA,MAAa,qBAAqB;;;;;;;AAQlC,MAAa,kBACK,2CAA2B,oBAAoB;;;;AAKjE,MAAa,eAAe;;;;AAK5B,MAAa,sBACX,QACA,oBAEAA,yBAAuB,QAAQ;CAC7B,GAAG;CACH;AACF,CAAC;;;;AAKH,MAAa,kBAAkB;;;;AAK/B,MAAa,oBAAoB,oBAA8B;CAC7D,MAAM,UAAU,oBAAoB;EAClC,GAAG;EACH;CACF,CAAC;CAED,OAAO;EACL,eAAe,QAAQ,UAAU;EACjC,kBAAkB,QAAQ;CAC5B;AACF;;;;AAKA,MAAa,kBAAkB"}
@@ -2,13 +2,13 @@ import { getPlugins, htmlPlugin, insertionPlugin, intlayerNodePlugins, markdownP
2
2
  import { getDictionary } from "./getDictionary.mjs";
3
3
  import { getIntlayer } from "./getIntlayer.mjs";
4
4
  import { useEditor } from "./editor/useEditor.mjs";
5
+ import { getLocaleInStorage, localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useLocaleCookie, useLocaleStorage } from "./client/useLocaleStorage.mjs";
5
6
  import { IntlayerClient, createIntlayerClient, getIntlayerClient, installIntlayer } from "./client/installIntlayer.mjs";
6
7
  import { useDictionary } from "./client/useDictionary.mjs";
7
8
  import { useDictionaryDynamic } from "./client/useDictionaryDynamic.mjs";
8
9
  import { useIntlayer } from "./client/useIntlayer.mjs";
9
- import { localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useLocaleCookie, useLocaleStorage } from "./client/useLocaleStorage.mjs";
10
10
  import { useLocale } from "./client/useLocale.mjs";
11
11
  import { usePathname } from "./client/usePathname.mjs";
12
12
  import { useRewriteURL } from "./client/useRewriteURL.mjs";
13
13
 
14
- export { IntlayerClient, createIntlayerClient, getDictionary, getIntlayer, getIntlayerClient, getPlugins, htmlPlugin, insertionPlugin, installIntlayer, intlayerNodePlugins, localeCookie, localeInStorage, markdownPlugin, markdownStringPlugin, setLocaleCookie, setLocaleInStorage, useDictionary, useDictionaryDynamic, useEditor, useIntlayer, useLocale, useLocaleCookie, useLocaleStorage, usePathname, useRewriteURL };
14
+ export { IntlayerClient, createIntlayerClient, getDictionary, getIntlayer, getIntlayerClient, getLocaleInStorage, getPlugins, htmlPlugin, insertionPlugin, installIntlayer, intlayerNodePlugins, localeCookie, localeInStorage, markdownPlugin, markdownStringPlugin, setLocaleCookie, setLocaleInStorage, useDictionary, useDictionaryDynamic, useEditor, useIntlayer, useLocale, useLocaleCookie, useLocaleStorage, usePathname, useRewriteURL };
@@ -10,7 +10,7 @@ const escapeHtmlText = (str) => str.replace(/&/g, "&amp;").replace(/</g, "&lt;")
10
10
  const intlayerNodePlugins = {
11
11
  id: "intlayer-node-plugin",
12
12
  canHandle: (node) => typeof node === "bigint" || typeof node === "string" || typeof node === "number",
13
- transform: (_node, { children, keyPath, dictionaryKey, ...rest }) => {
13
+ transform: (_node, { children, keyPath, dictionaryKey }) => {
14
14
  if (process.env.INTLAYER_EDITOR_ENABLED !== "false" && editor.enabled) {
15
15
  const rawStr = String(children ?? "");
16
16
  const keyPathJson = JSON.stringify(keyPath ?? []);
@@ -22,7 +22,6 @@ const intlayerNodePlugins = {
22
22
  */
23
23
  const htmlStr = `<intlayer-content-selector-wrapper key-path="${escapeHtmlAttr(keyPathJson)}" dictionary-key="${escapeHtmlAttr(dictKey)}">${escapeHtmlText(rawStr)}</intlayer-content-selector-wrapper>`;
24
24
  return renderIntlayerNode({
25
- ...rest,
26
25
  value: children,
27
26
  children: htmlStr,
28
27
  keyPath,
@@ -37,7 +36,6 @@ const intlayerNodePlugins = {
37
36
  });
38
37
  }
39
38
  return renderIntlayerNode({
40
- ...rest,
41
39
  value: children,
42
40
  children
43
41
  });
@@ -208,7 +206,8 @@ const pluginsCache = /* @__PURE__ */ new Map();
208
206
  const getPlugins = (locale, fallback = true) => {
209
207
  const cacheKey = `${locale ?? internationalization.defaultLocale}_${fallback}`;
210
208
  if (pluginsCache.has(cacheKey)) return pluginsCache.get(cacheKey);
211
- const plugins = [
209
+ const enabledPlugins = [
210
+ intlayerNodePlugins,
212
211
  translationPlugin(locale ?? internationalization.defaultLocale, fallback ? internationalization.defaultLocale : void 0),
213
212
  enumerationPlugin,
214
213
  pluralPlugin(locale ?? internationalization.defaultLocale),
@@ -217,13 +216,12 @@ const getPlugins = (locale, fallback = true) => {
217
216
  filePlugin,
218
217
  genderPlugin,
219
218
  selectPlugin,
220
- intlayerNodePlugins,
221
219
  insertionPlugin,
222
220
  markdownPlugin,
223
221
  htmlPlugin
224
- ];
225
- pluginsCache.set(cacheKey, plugins);
226
- return plugins;
222
+ ].filter((plugin) => plugin !== fallbackPlugin);
223
+ pluginsCache.set(cacheKey, enabledPlugins);
224
+ return enabledPlugins;
227
225
  };
228
226
 
229
227
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.mjs","names":[],"sources":["../../src/plugins.ts"],"sourcesContent":["import { editor, internationalization } from '@intlayer/config/built';\nimport {\n conditionPlugin,\n type DeepTransformContent as DeepTransformContentCore,\n enumerationPlugin,\n fallbackPlugin,\n filePlugin,\n genderPlugin,\n getHTML,\n type IInterpreterPluginState as IInterpreterPluginStateCore,\n isInterpolableWrapperNode,\n nestedPlugin,\n type Plugins,\n pluralPlugin,\n resolveInsertedSelector,\n selectPlugin,\n splitInsertionTemplate,\n transformInterpolableNode,\n translationPlugin,\n} from '@intlayer/core/interpreter';\nimport {\n compileWithOptions,\n getMarkdownMetadata,\n} from '@intlayer/core/markdown';\nimport type {\n HTMLContent,\n InsertionContent,\n MarkdownContent,\n} from '@intlayer/core/transpiler';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport type {\n DeclaredLocales,\n LocalesValues,\n} from '@intlayer/types/module_augmentation';\nimport type { NodeType } from '@intlayer/types/nodeType';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport type { HTMLComponents } from './html/types';\nimport {\n type IntlayerNode as IntlayerNodeCore,\n renderIntlayerNode,\n} from './renderIntlayerNode';\n\n/** ---------------------------------------------\n * INTLAYER NODE PLUGIN\n * --------------------------------------------- */\n\nexport type IntlayerNodeCond<T> = T extends number | string\n ? IntlayerNode<T>\n : never;\n\nexport type IntlayerNode<T, P = {}> = IntlayerNodeCore<T> & P;\n\nconst escapeHtmlAttr = (str: string): string =>\n str.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n\nconst escapeHtmlText = (str: string): string =>\n str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\nexport const intlayerNodePlugins: Plugins = {\n id: 'intlayer-node-plugin',\n canHandle: (node) =>\n typeof node === 'bigint' ||\n typeof node === 'string' ||\n typeof node === 'number',\n transform: (_node, { children, keyPath, dictionaryKey, ...rest }) => {\n if (process.env.INTLAYER_EDITOR_ENABLED !== 'false' && editor.enabled) {\n const rawStr = String(children ?? '');\n const keyPathJson = JSON.stringify(keyPath ?? []);\n const dictKey = String(dictionaryKey ?? '');\n\n /**\n * In editor mode, string coercion returns the wrapper HTML so that\n * `element.innerHTML = content.title` automatically inserts the\n * `<intlayer-content-selector-wrapper>` into the DOM.\n */\n const htmlStr = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(rawStr)}</intlayer-content-selector-wrapper>`;\n\n return renderIntlayerNode({\n ...rest,\n value: children as string,\n children: htmlStr,\n keyPath,\n dictionaryKey,\n additionalProps: {\n toElement: (): HTMLElement => {\n const wrapper = document.createElement(\n 'intlayer-content-selector-wrapper'\n );\n wrapper.setAttribute('key-path', keyPathJson);\n wrapper.setAttribute('dictionary-key', dictKey);\n wrapper.textContent = rawStr;\n return wrapper;\n },\n },\n });\n }\n\n return renderIntlayerNode({\n ...rest,\n value: children as string,\n children,\n });\n },\n};\n\n/** ---------------------------------------------\n * INSERTION PLUGIN\n * --------------------------------------------- */\n\nexport type InsertionCond<T, _S, L extends LocalesValues> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.INSERTION]: infer I;\n fields: readonly (infer F)[];\n}\n ? <V extends { [K in Extract<F, string>]: string | number }>(\n values: V\n ) => I extends string ? IntlayerNode<string> : DeepTransformContent<I, L>\n : never;\n\nexport const insertionPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_INSERTION === 'false'\n ? fallbackPlugin\n : {\n id: 'insertion-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.INSERTION,\n transform: (node: InsertionContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n { type: NodeTypes.INSERTION },\n ];\n\n const children = node[NodeTypes.INSERTION];\n\n const insertionStringPlugin: Plugins = {\n id: 'insertion-string-plugin',\n canHandle: (node) =>\n typeof node === 'string' || isInterpolableWrapperNode(node),\n transform: (node, subProps, deepTransformNode) => {\n // `html()`/`markdown()` nodes carry their `{{ … }}` placeholders\n // inside a raw string. Interpolate into that string, then re-run\n // the transform so the html/markdown renderer applies afterwards.\n if (isInterpolableWrapperNode(node)) {\n return (\n values: {\n [K in InsertionContent['fields'][number]]: string | number;\n }\n ) =>\n transformInterpolableNode(\n node,\n values,\n subProps,\n props.plugins,\n deepTransformNode\n );\n }\n\n const transformedResult = deepTransformNode(node, {\n ...subProps,\n children: node,\n plugins: (props.plugins ?? ([] as Plugins[])).filter(\n (plugin) => plugin.id !== 'intlayer-node-plugin'\n ),\n });\n\n return (\n values: {\n [K in InsertionContent['fields'][number]]: string | number;\n }\n ) => {\n const result = splitInsertionTemplate(\n transformedResult,\n values\n );\n const resultStr = result.isSimple\n ? (result.parts as string)\n : (result.parts as string[]).join('');\n\n return deepTransformNode(resultStr, {\n ...subProps,\n plugins: props.plugins,\n children: resultStr,\n });\n };\n },\n };\n\n const transformed = deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [insertionStringPlugin, ...(props.plugins ?? [])],\n });\n\n return resolveInsertedSelector(children, transformed);\n },\n };\n\n/** ---------------------------------------------\n * MARKDOWN PLUGIN\n * --------------------------------------------- */\n\nconst vanillaRuntime = {\n createElement: (tag: string, props: any, ...children: any[]) => {\n const attrs = Object.entries(props || {})\n .filter(\n ([key]) => key !== 'children' && key !== 'key' && key !== '_innerHTML'\n )\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n const innerHTML = props?._innerHTML;\n const childrenStr =\n innerHTML !== undefined ? innerHTML : children.flat(Infinity).join('');\n return `<${tag}${attrs ? ` ${attrs}` : ''}>${childrenStr}</${tag}>`;\n },\n normalizeProps: (_tag: string, props: Record<string, any>) => {\n const normalized: Record<string, any> = {};\n for (const [key, value] of Object.entries(props)) {\n if (key === 'className') {\n normalized.class = value;\n } else if (key === 'htmlFor') {\n normalized.for = value;\n } else if (key === 'dangerouslySetInnerHTML' && (value as any)?.__html) {\n normalized._innerHTML = (value as any).__html;\n } else {\n normalized[key] = value;\n }\n }\n return normalized;\n },\n};\n\nexport type MarkdownStringCond<T> = T extends string\n ? IntlayerNode<\n string,\n {\n metadata: DeepTransformContent<string>;\n /** Returns the rendered markdown; render with .use(). */\n use: (components?: HTMLComponents<'permissive', {}>) => string;\n }\n >\n : never;\n\nexport const markdownStringPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_MARKDOWN === 'false'\n ? fallbackPlugin\n : {\n id: 'markdown-string-plugin',\n canHandle: (node) => typeof node === 'string',\n transform: (node: string, props, deepTransformNode) => {\n const { plugins: _plugins, ...rest } = props;\n const metadata = getMarkdownMetadata(node) ?? {};\n\n const metadataPlugins: Plugins = {\n id: 'markdown-metadata-plugin',\n canHandle: (metadataNode) =>\n typeof metadataNode === 'string' ||\n typeof metadataNode === 'number' ||\n typeof metadataNode === 'boolean' ||\n !metadataNode,\n transform: (metadataNode, subProps) =>\n renderIntlayerNode({\n ...subProps,\n value: metadataNode,\n children: node,\n }),\n };\n\n const metadataNodes = deepTransformNode(metadata, {\n plugins: [metadataPlugins],\n dictionaryKey: rest.dictionaryKey,\n keyPath: [],\n });\n\n const compile = (components: any = {}) =>\n compileWithOptions(\n node,\n {\n ...vanillaRuntime,\n createElement: (tag: any, props: any, ...children: any[]) => {\n const override = components[tag];\n if (typeof override === 'function') {\n return override({ ...props, children: children.join('') });\n }\n return vanillaRuntime.createElement(tag, props, ...children);\n },\n },\n {}\n ) as any;\n\n const value = compile();\n let children = node;\n\n if (\n process.env.INTLAYER_EDITOR_ENABLED !== 'false' &&\n editor.enabled\n ) {\n const keyPathJson = JSON.stringify(props.keyPath ?? []);\n const dictKey = String(props.dictionaryKey ?? '');\n children = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;\n }\n\n return renderIntlayerNode({\n ...props,\n value,\n children,\n additionalProps: {\n metadata: metadataNodes,\n use: (components?: any) => compile(components),\n },\n }) as any;\n },\n };\n\nexport type MarkdownCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.MARKDOWN]: infer M;\n metadata?: infer U;\n tags?: infer U;\n}\n ? {\n use: (components?: HTMLComponents<'permissive', U>) => IntlayerNode<M>;\n metadata: DeepTransformContent<U>;\n }\n : never;\n\nexport const markdownPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_MARKDOWN === 'false'\n ? fallbackPlugin\n : {\n id: 'markdown-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.MARKDOWN,\n transform: (node: MarkdownContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n { type: NodeTypes.MARKDOWN },\n ];\n const children = node[NodeTypes.MARKDOWN];\n\n return deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [markdownStringPlugin, ...(props.plugins ?? [])],\n });\n },\n };\n\n/** ---------------------------------------------\n * HTML PLUGIN\n * --------------------------------------------- */\n\nexport type HTMLPluginCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.HTML]: infer I;\n tags?: infer U;\n}\n ? {\n use: (components?: HTMLComponents<'permissive', U>) => IntlayerNode<I>;\n }\n : never;\n\nexport const htmlPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_HTML === 'false'\n ? fallbackPlugin\n : {\n id: 'html-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.HTML,\n transform: (node: HTMLContent<string>, props) => {\n const htmlStr = node[NodeTypes.HTML];\n\n const use = (components: Record<string, any> = {}) => {\n const wrappedComponents = new Proxy(components, {\n get(target, prop) {\n if (typeof prop === 'string' && prop in target) {\n const Component = target[prop];\n return (props: any) => {\n const children = Array.isArray(props.children)\n ? props.children.join('')\n : props.children;\n return Component({ ...props, children });\n };\n }\n if (typeof prop === 'string' && /^[a-z][a-z0-9]*$/.test(prop)) {\n return (props: any) => {\n const attrs = Object.entries(props)\n .filter(([key]) => key !== 'children' && key !== 'key')\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n const children = Array.isArray(props.children)\n ? props.children.join('')\n : props.children;\n return `<${prop}${attrs ? ` ${attrs}` : ''}>${children}</${prop}>`;\n };\n }\n return undefined;\n },\n });\n\n const result = getHTML(htmlStr, wrappedComponents as any);\n return Array.isArray(result) ? result.join('') : result;\n };\n\n const value = use();\n let children = htmlStr;\n\n if (\n process.env.INTLAYER_EDITOR_ENABLED !== 'false' &&\n editor.enabled\n ) {\n const keyPathJson = JSON.stringify(props.keyPath ?? []);\n const dictKey = String(props.dictionaryKey ?? '');\n children = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;\n }\n\n return renderIntlayerNode({\n ...props,\n value,\n children,\n additionalProps: {\n use: (components?: any) => use(components),\n },\n });\n },\n };\n\n/** ---------------------------------------------\n * PLUGINS RESULT\n * --------------------------------------------- */\n\nexport interface IInterpreterPluginVanilla<T, S, L extends LocalesValues> {\n vanillaIntlayerNode: IntlayerNodeCond<T>;\n vanillaInsertion: InsertionCond<T, S, L>;\n vanillaMarkdown: MarkdownCond<T>;\n vanillaHtml: HTMLPluginCond<T>;\n}\n\n/**\n * Insert this type as param of `DeepTransformContent` to avoid `intlayer` package pollution.\n *\n * Otherwise the `vanilla-intlayer` plugins will override the types of `intlayer` functions.\n * Use `getIntlayer` from `vanilla-intlayer` (not from `intlayer`) to get properly typed\n * `IntlayerNode` wrappers with `.value` access on string/number content.\n */\nexport type IInterpreterPluginState = Omit<\n IInterpreterPluginStateCore,\n 'insertion'\n> & {\n vanillaIntlayerNode: true;\n vanillaInsertion: true;\n vanillaMarkdown: true;\n vanillaHtml: true;\n};\n\nexport type DeepTransformContent<\n T,\n L extends LocalesValues = DeclaredLocales,\n> = DeepTransformContentCore<T, IInterpreterPluginState, L>;\n\nconst pluginsCache = new Map<string, Plugins[]>();\n\n/**\n * Get the plugins array for Vanilla content transformation.\n * This function is used by both getIntlayer and getDictionary to ensure consistent plugin configuration.\n */\nexport const getPlugins = (\n locale?: LocalesValues,\n fallback = true\n): Plugins[] => {\n const currentLocale = locale ?? internationalization.defaultLocale;\n const cacheKey = `${currentLocale}_${fallback}`;\n\n if (pluginsCache.has(cacheKey)) {\n return pluginsCache.get(cacheKey)!;\n }\n\n const plugins = [\n translationPlugin(\n locale ?? internationalization.defaultLocale,\n fallback ? internationalization.defaultLocale : undefined\n ),\n enumerationPlugin,\n pluralPlugin(locale ?? internationalization.defaultLocale),\n conditionPlugin,\n nestedPlugin(locale ?? internationalization.defaultLocale),\n filePlugin,\n genderPlugin,\n selectPlugin,\n intlayerNodePlugins,\n insertionPlugin,\n markdownPlugin,\n htmlPlugin,\n ] as Plugins[];\n\n pluginsCache.set(cacheKey, plugins);\n\n return plugins;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugins.mjs","names":[],"sources":["../../src/plugins.ts"],"sourcesContent":["import { editor, internationalization } from '@intlayer/config/built';\nimport {\n conditionPlugin,\n type DeepTransformContent as DeepTransformContentCore,\n enumerationPlugin,\n fallbackPlugin,\n filePlugin,\n genderPlugin,\n getHTML,\n type IInterpreterPluginState as IInterpreterPluginStateCore,\n isInterpolableWrapperNode,\n nestedPlugin,\n type Plugins,\n pluralPlugin,\n resolveInsertedSelector,\n selectPlugin,\n splitInsertionTemplate,\n transformInterpolableNode,\n translationPlugin,\n} from '@intlayer/core/interpreter';\nimport {\n compileWithOptions,\n getMarkdownMetadata,\n} from '@intlayer/core/markdown';\nimport type {\n HTMLContent,\n InsertionContent,\n MarkdownContent,\n} from '@intlayer/core/transpiler';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport type {\n DeclaredLocales,\n LocalesValues,\n} from '@intlayer/types/module_augmentation';\nimport type { NodeType } from '@intlayer/types/nodeType';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport type { HTMLComponents } from './html/types';\nimport {\n type IntlayerNode as IntlayerNodeCore,\n renderIntlayerNode,\n} from './renderIntlayerNode';\n\n/** ---------------------------------------------\n * INTLAYER NODE PLUGIN\n * --------------------------------------------- */\n\nexport type IntlayerNodeCond<T> = T extends number | string\n ? IntlayerNode<T>\n : never;\n\nexport type IntlayerNode<T, P = {}> = IntlayerNodeCore<T> & P;\n\nconst escapeHtmlAttr = (str: string): string =>\n str.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n\nconst escapeHtmlText = (str: string): string =>\n str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\nexport const intlayerNodePlugins: Plugins = {\n id: 'intlayer-node-plugin',\n canHandle: (node) =>\n typeof node === 'bigint' ||\n typeof node === 'string' ||\n typeof node === 'number',\n transform: (_node, { children, keyPath, dictionaryKey }) => {\n if (process.env.INTLAYER_EDITOR_ENABLED !== 'false' && editor.enabled) {\n const rawStr = String(children ?? '');\n const keyPathJson = JSON.stringify(keyPath ?? []);\n const dictKey = String(dictionaryKey ?? '');\n\n /**\n * In editor mode, string coercion returns the wrapper HTML so that\n * `element.innerHTML = content.title` automatically inserts the\n * `<intlayer-content-selector-wrapper>` into the DOM.\n */\n const htmlStr = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(rawStr)}</intlayer-content-selector-wrapper>`;\n\n return renderIntlayerNode({\n value: children as string,\n children: htmlStr,\n keyPath,\n dictionaryKey,\n additionalProps: {\n toElement: (): HTMLElement => {\n const wrapper = document.createElement(\n 'intlayer-content-selector-wrapper'\n );\n wrapper.setAttribute('key-path', keyPathJson);\n wrapper.setAttribute('dictionary-key', dictKey);\n wrapper.textContent = rawStr;\n return wrapper;\n },\n },\n });\n }\n\n return renderIntlayerNode({\n value: children as string,\n children,\n });\n },\n};\n\n/** ---------------------------------------------\n * INSERTION PLUGIN\n * --------------------------------------------- */\n\nexport type InsertionCond<T, _S, L extends LocalesValues> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.INSERTION]: infer I;\n fields: readonly (infer F)[];\n}\n ? <V extends { [K in Extract<F, string>]: string | number }>(\n values: V\n ) => I extends string ? IntlayerNode<string> : DeepTransformContent<I, L>\n : never;\n\nexport const insertionPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_INSERTION === 'false'\n ? fallbackPlugin\n : {\n id: 'insertion-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.INSERTION,\n transform: (node: InsertionContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n { type: NodeTypes.INSERTION },\n ];\n\n const children = node[NodeTypes.INSERTION];\n\n const insertionStringPlugin: Plugins = {\n id: 'insertion-string-plugin',\n canHandle: (node) =>\n typeof node === 'string' || isInterpolableWrapperNode(node),\n transform: (node, subProps, deepTransformNode) => {\n // `html()`/`markdown()` nodes carry their `{{ … }}` placeholders\n // inside a raw string. Interpolate into that string, then re-run\n // the transform so the html/markdown renderer applies afterwards.\n if (isInterpolableWrapperNode(node)) {\n return (\n values: {\n [K in InsertionContent['fields'][number]]: string | number;\n }\n ) =>\n transformInterpolableNode(\n node,\n values,\n subProps,\n props.plugins,\n deepTransformNode\n );\n }\n\n const transformedResult = deepTransformNode(node, {\n ...subProps,\n children: node,\n plugins: (props.plugins ?? ([] as Plugins[])).filter(\n (plugin) => plugin.id !== 'intlayer-node-plugin'\n ),\n });\n\n return (\n values: {\n [K in InsertionContent['fields'][number]]: string | number;\n }\n ) => {\n const result = splitInsertionTemplate(\n transformedResult,\n values\n );\n const resultStr = result.isSimple\n ? (result.parts as string)\n : (result.parts as string[]).join('');\n\n return deepTransformNode(resultStr, {\n ...subProps,\n plugins: props.plugins,\n children: resultStr,\n });\n };\n },\n };\n\n const transformed = deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [insertionStringPlugin, ...(props.plugins ?? [])],\n });\n\n return resolveInsertedSelector(children, transformed);\n },\n };\n\n/** ---------------------------------------------\n * MARKDOWN PLUGIN\n * --------------------------------------------- */\n\nconst vanillaRuntime = {\n createElement: (tag: string, props: any, ...children: any[]) => {\n const attrs = Object.entries(props || {})\n .filter(\n ([key]) => key !== 'children' && key !== 'key' && key !== '_innerHTML'\n )\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n const innerHTML = props?._innerHTML;\n const childrenStr =\n innerHTML !== undefined ? innerHTML : children.flat(Infinity).join('');\n return `<${tag}${attrs ? ` ${attrs}` : ''}>${childrenStr}</${tag}>`;\n },\n normalizeProps: (_tag: string, props: Record<string, any>) => {\n const normalized: Record<string, any> = {};\n for (const [key, value] of Object.entries(props)) {\n if (key === 'className') {\n normalized.class = value;\n } else if (key === 'htmlFor') {\n normalized.for = value;\n } else if (key === 'dangerouslySetInnerHTML' && (value as any)?.__html) {\n normalized._innerHTML = (value as any).__html;\n } else {\n normalized[key] = value;\n }\n }\n return normalized;\n },\n};\n\nexport type MarkdownStringCond<T> = T extends string\n ? IntlayerNode<\n string,\n {\n metadata: DeepTransformContent<string>;\n /** Returns the rendered markdown; render with .use(). */\n use: (components?: HTMLComponents<'permissive', {}>) => string;\n }\n >\n : never;\n\nexport const markdownStringPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_MARKDOWN === 'false'\n ? fallbackPlugin\n : {\n id: 'markdown-string-plugin',\n canHandle: (node) => typeof node === 'string',\n transform: (node: string, props, deepTransformNode) => {\n const { plugins: _plugins, ...rest } = props;\n const metadata = getMarkdownMetadata(node) ?? {};\n\n const metadataPlugins: Plugins = {\n id: 'markdown-metadata-plugin',\n canHandle: (metadataNode) =>\n typeof metadataNode === 'string' ||\n typeof metadataNode === 'number' ||\n typeof metadataNode === 'boolean' ||\n !metadataNode,\n transform: (metadataNode, subProps) =>\n renderIntlayerNode({\n ...subProps,\n value: metadataNode,\n children: node,\n }),\n };\n\n const metadataNodes = deepTransformNode(metadata, {\n plugins: [metadataPlugins],\n dictionaryKey: rest.dictionaryKey,\n keyPath: [],\n });\n\n const compile = (components: any = {}) =>\n compileWithOptions(\n node,\n {\n ...vanillaRuntime,\n createElement: (tag: any, props: any, ...children: any[]) => {\n const override = components[tag];\n if (typeof override === 'function') {\n return override({ ...props, children: children.join('') });\n }\n return vanillaRuntime.createElement(tag, props, ...children);\n },\n },\n {}\n ) as any;\n\n const value = compile();\n let children = node;\n\n if (\n process.env.INTLAYER_EDITOR_ENABLED !== 'false' &&\n editor.enabled\n ) {\n const keyPathJson = JSON.stringify(props.keyPath ?? []);\n const dictKey = String(props.dictionaryKey ?? '');\n children = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;\n }\n\n return renderIntlayerNode({\n ...props,\n value,\n children,\n additionalProps: {\n metadata: metadataNodes,\n use: (components?: any) => compile(components),\n },\n }) as any;\n },\n };\n\nexport type MarkdownCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.MARKDOWN]: infer M;\n metadata?: infer U;\n tags?: infer U;\n}\n ? {\n use: (components?: HTMLComponents<'permissive', U>) => IntlayerNode<M>;\n metadata: DeepTransformContent<U>;\n }\n : never;\n\nexport const markdownPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_MARKDOWN === 'false'\n ? fallbackPlugin\n : {\n id: 'markdown-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.MARKDOWN,\n transform: (node: MarkdownContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n { type: NodeTypes.MARKDOWN },\n ];\n const children = node[NodeTypes.MARKDOWN];\n\n return deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [markdownStringPlugin, ...(props.plugins ?? [])],\n });\n },\n };\n\n/** ---------------------------------------------\n * HTML PLUGIN\n * --------------------------------------------- */\n\nexport type HTMLPluginCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.HTML]: infer I;\n tags?: infer U;\n}\n ? {\n use: (components?: HTMLComponents<'permissive', U>) => IntlayerNode<I>;\n }\n : never;\n\nexport const htmlPlugin: Plugins =\n process.env.INTLAYER_NODE_TYPE_HTML === 'false'\n ? fallbackPlugin\n : {\n id: 'html-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.HTML,\n transform: (node: HTMLContent<string>, props) => {\n const htmlStr = node[NodeTypes.HTML];\n\n const use = (components: Record<string, any> = {}) => {\n const wrappedComponents = new Proxy(components, {\n get(target, prop) {\n if (typeof prop === 'string' && prop in target) {\n const Component = target[prop];\n return (props: any) => {\n const children = Array.isArray(props.children)\n ? props.children.join('')\n : props.children;\n return Component({ ...props, children });\n };\n }\n if (typeof prop === 'string' && /^[a-z][a-z0-9]*$/.test(prop)) {\n return (props: any) => {\n const attrs = Object.entries(props)\n .filter(([key]) => key !== 'children' && key !== 'key')\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n const children = Array.isArray(props.children)\n ? props.children.join('')\n : props.children;\n return `<${prop}${attrs ? ` ${attrs}` : ''}>${children}</${prop}>`;\n };\n }\n return undefined;\n },\n });\n\n const result = getHTML(htmlStr, wrappedComponents as any);\n return Array.isArray(result) ? result.join('') : result;\n };\n\n const value = use();\n let children = htmlStr;\n\n if (\n process.env.INTLAYER_EDITOR_ENABLED !== 'false' &&\n editor.enabled\n ) {\n const keyPathJson = JSON.stringify(props.keyPath ?? []);\n const dictKey = String(props.dictionaryKey ?? '');\n children = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;\n }\n\n return renderIntlayerNode({\n ...props,\n value,\n children,\n additionalProps: {\n use: (components?: any) => use(components),\n },\n });\n },\n };\n\n/** ---------------------------------------------\n * PLUGINS RESULT\n * --------------------------------------------- */\n\nexport interface IInterpreterPluginVanilla<T, S, L extends LocalesValues> {\n vanillaIntlayerNode: IntlayerNodeCond<T>;\n vanillaInsertion: InsertionCond<T, S, L>;\n vanillaMarkdown: MarkdownCond<T>;\n vanillaHtml: HTMLPluginCond<T>;\n}\n\n/**\n * Insert this type as param of `DeepTransformContent` to avoid `intlayer` package pollution.\n *\n * Otherwise the `vanilla-intlayer` plugins will override the types of `intlayer` functions.\n * Use `getIntlayer` from `vanilla-intlayer` (not from `intlayer`) to get properly typed\n * `IntlayerNode` wrappers with `.value` access on string/number content.\n */\nexport type IInterpreterPluginState = Omit<\n IInterpreterPluginStateCore,\n 'insertion'\n> & {\n vanillaIntlayerNode: true;\n vanillaInsertion: true;\n vanillaMarkdown: true;\n vanillaHtml: true;\n};\n\nexport type DeepTransformContent<\n T,\n L extends LocalesValues = DeclaredLocales,\n> = DeepTransformContentCore<T, IInterpreterPluginState, L>;\n\nconst pluginsCache = new Map<string, Plugins[]>();\n\n/**\n * Get the plugins array for Vanilla content transformation.\n * This function is used by both getIntlayer and getDictionary to ensure consistent plugin configuration.\n */\nexport const getPlugins = (\n locale?: LocalesValues,\n fallback = true\n): Plugins[] => {\n const currentLocale = locale ?? internationalization.defaultLocale;\n const cacheKey = `${currentLocale}_${fallback}`;\n\n if (pluginsCache.has(cacheKey)) {\n return pluginsCache.get(cacheKey)!;\n }\n\n const plugins = [\n // First: most nodes are plain strings, which every other plugin rejects\n intlayerNodePlugins,\n translationPlugin(\n locale ?? internationalization.defaultLocale,\n fallback ? internationalization.defaultLocale : undefined\n ),\n enumerationPlugin,\n pluralPlugin(locale ?? internationalization.defaultLocale),\n conditionPlugin,\n nestedPlugin(locale ?? internationalization.defaultLocale),\n filePlugin,\n genderPlugin,\n selectPlugin,\n insertionPlugin,\n markdownPlugin,\n htmlPlugin,\n ] as Plugins[];\n\n // Plugins disabled at build time never match: skip them on every node\n const enabledPlugins = plugins.filter((plugin) => plugin !== fallbackPlugin);\n\n pluginsCache.set(cacheKey, enabledPlugins);\n\n return enabledPlugins;\n};\n"],"mappings":"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"}
@@ -1,8 +1,11 @@
1
+ import { getIntlayerNodePrototype } from "@intlayer/core/utils";
2
+
1
3
  //#region src/renderIntlayerNode.ts
2
4
  const renderIntlayerNode = ({ value, children, additionalProps = {} }) => {
3
5
  let _value = value;
4
6
  const displayOverride = typeof children === "string" && children !== String(value ?? "") ? children : null;
5
- const node = {
7
+ return {
8
+ __proto__: getIntlayerNodePrototype(value),
6
9
  toString: () => displayOverride ?? String(_value ?? ""),
7
10
  valueOf: () => _value,
8
11
  [Symbol.toPrimitive]: () => displayOverride ?? _value,
@@ -21,20 +24,6 @@ const renderIntlayerNode = ({ value, children, additionalProps = {} }) => {
21
24
  },
22
25
  ...additionalProps
23
26
  };
24
- if (_value !== null && _value !== void 0) {
25
- const valObj = Object(_value);
26
- const proto = Object.getPrototypeOf(valObj);
27
- for (const prop of Object.getOwnPropertyNames(proto)) {
28
- if (prop === "constructor" || prop in node) continue;
29
- const valProp = valObj[prop];
30
- if (typeof valProp === "function") Object.defineProperty(node, prop, {
31
- value: valProp.bind(_value),
32
- writable: true,
33
- configurable: true
34
- });
35
- }
36
- }
37
- return node;
38
27
  };
39
28
 
40
29
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"renderIntlayerNode.mjs","names":[],"sources":["../../src/renderIntlayerNode.ts"],"sourcesContent":["import type { ResolvedEditor } from '@intlayer/types/module_augmentation';\n\nexport type IntlayerNode<T = string> = ResolvedEditor<\n T & {\n raw: T;\n value: T;\n toString: () => string;\n valueOf: () => T;\n toJSON: () => T;\n __update: (next: IntlayerNode<T>) => void;\n },\n {\n raw: T;\n value: T;\n toString: () => string;\n valueOf: () => T;\n toJSON: () => T;\n __update: (next: IntlayerNode<T>) => void;\n }\n> &\n T;\n\nexport const renderIntlayerNode = <\n T, // Broadened to support arrays, numbers, objects, etc.\n>({\n value,\n children,\n additionalProps = {},\n}: {\n value: T;\n children?: any;\n additionalProps?: Record<string, unknown>;\n [key: string]: unknown;\n}): IntlayerNode<T> => {\n let _value = value;\n\n // When children is a string that differs from value, it acts as a display\n // override (e.g. editor HTML wrapper). Otherwise toString/toPrimitive reflect\n // the live _value so that __update propagates.\n const displayOverride =\n typeof children === 'string' && children !== String(value ?? '')\n ? children\n : null;\n\n const node = {\n toString: () => displayOverride ?? String(_value ?? ''),\n valueOf: () => _value,\n [Symbol.toPrimitive]: () => displayOverride ?? _value,\n toJSON: () => _value,\n\n get raw() {\n return _value;\n },\n set raw(value: T) {\n _value = value;\n },\n\n get value() {\n return _value;\n },\n\n __update(next: any) {\n _value = next?.raw ?? next?.value ?? next;\n },\n\n ...additionalProps,\n };\n\n // Delegate native methods from the underlying value (any type) to node.\n if (_value !== null && _value !== undefined) {\n const valObj = Object(_value); // Safely boxes primitives (e.g., 50 -> Number object)\n const proto = Object.getPrototypeOf(valObj);\n for (const prop of Object.getOwnPropertyNames(proto)) {\n if (prop === 'constructor' || prop in node) continue;\n const valProp = valObj[prop]; // read from instance so length/index values are correct\n if (typeof valProp === 'function') {\n Object.defineProperty(node, prop, {\n value: valProp.bind(_value),\n writable: true,\n configurable: true,\n });\n }\n }\n }\n\n return node as unknown as IntlayerNode<T>;\n};\n"],"mappings":";AAsBA,MAAa,sBAEX,EACA,OACA,UACA,kBAAkB,CAAC,QAME;CACrB,IAAI,SAAS;CAKb,MAAM,kBACJ,OAAO,aAAa,YAAY,aAAa,OAAO,SAAS,EAAE,IAC3D,WACA;CAEN,MAAM,OAAO;EACX,gBAAgB,mBAAmB,OAAO,UAAU,EAAE;EACtD,eAAe;GACd,OAAO,oBAAoB,mBAAmB;EAC/C,cAAc;EAEd,IAAI,MAAM;GACR,OAAO;EACT;EACA,IAAI,IAAI,OAAU;GAChB,SAAS;EACX;EAEA,IAAI,QAAQ;GACV,OAAO;EACT;EAEA,SAAS,MAAW;GAClB,SAAS,MAAM,OAAO,MAAM,SAAS;EACvC;EAEA,GAAG;CACL;CAGA,IAAI,WAAW,QAAQ,WAAW,QAAW;EAC3C,MAAM,SAAS,OAAO,MAAM;EAC5B,MAAM,QAAQ,OAAO,eAAe,MAAM;EAC1C,KAAK,MAAM,QAAQ,OAAO,oBAAoB,KAAK,GAAG;GACpD,IAAI,SAAS,iBAAiB,QAAQ,MAAM;GAC5C,MAAM,UAAU,OAAO;GACvB,IAAI,OAAO,YAAY,YACrB,OAAO,eAAe,MAAM,MAAM;IAChC,OAAO,QAAQ,KAAK,MAAM;IAC1B,UAAU;IACV,cAAc;GAChB,CAAC;EAEL;CACF;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"renderIntlayerNode.mjs","names":[],"sources":["../../src/renderIntlayerNode.ts"],"sourcesContent":["import { getIntlayerNodePrototype } from '@intlayer/core/utils';\nimport type { ResolvedEditor } from '@intlayer/types/module_augmentation';\n\nexport type IntlayerNode<T = string> = ResolvedEditor<\n T & {\n raw: T;\n value: T;\n toString: () => string;\n valueOf: () => T;\n toJSON: () => T;\n __update: (next: IntlayerNode<T>) => void;\n },\n {\n raw: T;\n value: T;\n toString: () => string;\n valueOf: () => T;\n toJSON: () => T;\n __update: (next: IntlayerNode<T>) => void;\n }\n> &\n T;\n\nexport const renderIntlayerNode = <\n T, // Broadened to support arrays, numbers, objects, etc.\n>({\n value,\n children,\n additionalProps = {},\n}: {\n value: T;\n children?: any;\n additionalProps?: Record<string, unknown>;\n [key: string]: unknown;\n}): IntlayerNode<T> => {\n let _value = value;\n\n // When children is a string that differs from value, it acts as a display\n // override (e.g. editor HTML wrapper). Otherwise toString/toPrimitive reflect\n // the live _value so that __update propagates.\n const displayOverride =\n typeof children === 'string' && children !== String(value ?? '')\n ? children\n : null;\n\n const node = {\n // Serves the value's members: `node.toUpperCase()`, `'trim' in node`\n __proto__: getIntlayerNodePrototype(value),\n\n toString: () => displayOverride ?? String(_value ?? ''),\n valueOf: () => _value,\n [Symbol.toPrimitive]: () => displayOverride ?? _value,\n toJSON: () => _value,\n\n get raw() {\n return _value;\n },\n set raw(value: T) {\n _value = value;\n },\n\n get value() {\n return _value;\n },\n\n __update(next: any) {\n _value = next?.raw ?? next?.value ?? next;\n },\n\n ...additionalProps,\n };\n\n return node as unknown as IntlayerNode<T>;\n};\n"],"mappings":";;;AAuBA,MAAa,sBAEX,EACA,OACA,UACA,kBAAkB,CAAC,QAME;CACrB,IAAI,SAAS;CAKb,MAAM,kBACJ,OAAO,aAAa,YAAY,aAAa,OAAO,SAAS,EAAE,IAC3D,WACA;CA6BN,OAAO;EAzBL,WAAW,yBAAyB,KAAK;EAEzC,gBAAgB,mBAAmB,OAAO,UAAU,EAAE;EACtD,eAAe;GACd,OAAO,oBAAoB,mBAAmB;EAC/C,cAAc;EAEd,IAAI,MAAM;GACR,OAAO;EACT;EACA,IAAI,IAAI,OAAU;GAChB,SAAS;EACX;EAEA,IAAI,QAAQ;GACV,OAAO;EACT;EAEA,SAAS,MAAW;GAClB,SAAS,MAAM,OAAO,MAAM,SAAS;EACvC;EAEA,GAAG;CAGK;AACZ"}
@@ -3,7 +3,7 @@ import { WithOnChange, useDictionary } from "./useDictionary.js";
3
3
  import { useDictionaryDynamic } from "./useDictionaryDynamic.js";
4
4
  import { useIntlayer } from "./useIntlayer.js";
5
5
  import { UseLocaleProps, UseLocaleResult, useLocale } from "./useLocale.js";
6
- import { localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useLocaleCookie, useLocaleStorage } from "./useLocaleStorage.js";
6
+ import { getLocaleInStorage, localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useLocaleCookie, useLocaleStorage } from "./useLocaleStorage.js";
7
7
  import { UsePathnameResult, usePathname } from "./usePathname.js";
8
8
  import { useRewriteURL } from "./useRewriteURL.js";
9
- export { IntlayerClient, UseLocaleProps, UseLocaleResult, UsePathnameResult, WithOnChange, createIntlayerClient, getIntlayerClient, installIntlayer, localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useDictionary, useDictionaryDynamic, useIntlayer, useLocale, useLocaleCookie, useLocaleStorage, usePathname, useRewriteURL };
9
+ export { IntlayerClient, UseLocaleProps, UseLocaleResult, UsePathnameResult, WithOnChange, createIntlayerClient, getIntlayerClient, getLocaleInStorage, installIntlayer, localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useDictionary, useDictionaryDynamic, useIntlayer, useLocale, useLocaleCookie, useLocaleStorage, usePathname, useRewriteURL };
@@ -1 +1 @@
1
- {"version":3,"file":"installIntlayer.d.ts","names":[],"sources":["../../../src/client/installIntlayer.ts"],"mappings":";;KAQK,kBAAkB,QAAQ;qBAElB;UACH;UACA;UACA;EACR;EAEA,YACE,SAAS,eACT,2BACA,UAAU;MAYR,UAAU;;;;;MAQV,WAAW;EAIf,UAAU,WAAW;EAOrB,WAAW,YAAY;EAKvB,UAAU,UAAU;;;;;EAWpB;;;;;qBAeW,uBAAoB,SACtB,eAAa,2BAAA,UAEZ,oBACT;;;;qBAUU,yBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA2CxB,oBAAe,QAAA,iBAAA;EAK1B,SAAS;EACT;EACA,UAAU;MACH"}
1
+ {"version":3,"file":"installIntlayer.d.ts","names":[],"sources":["../../../src/client/installIntlayer.ts"],"mappings":";;KASK,kBAAkB,QAAQ;qBAElB;UACH;UACA;UACA;EACR;EAEA,YACE,SAAS,eACT,2BACA,UAAU;MAeR,UAAU;;;;;MAQV,WAAW;EAIf,UAAU,WAAW;EAOrB,WAAW,YAAY;EAKvB,UAAU,UAAU;;;;;EAWpB;;;;;qBAeW,uBAAoB,SACtB,eAAa,2BAAA,UAEZ,oBACT;;;;qBAUU,yBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA2CxB,oBAAe,QAAA,iBAAA;EAK1B,SAAS;EACT;EACA,UAAU;MACH"}
@@ -1,13 +1,23 @@
1
1
  import { LocalesValues } from "@intlayer/types/module_augmentation";
2
2
  //#region src/client/useLocaleStorage.d.ts
3
+ /**
4
+ * Reads the locale persisted in the browser storage (cookie, localStorage…).
5
+ *
6
+ * Unlike `localeInStorage`, read on first call rather than at import, then
7
+ * cached until the next `setLocaleInStorage`. Never cached on the server.
8
+ */
9
+ export declare const getLocaleInStorage: () => import("@intlayer/types").Locale | undefined;
3
10
  /**
4
11
  * Get the current locale from storage (cookie or localStorage).
12
+ *
13
+ * Read once at import time; marked pure so bundlers drop the read when nothing
14
+ * imports it.
5
15
  */
6
- export declare const localeInStorage: import("intlayer").Locale;
16
+ export declare const localeInStorage: import("@intlayer/types").Locale;
7
17
  /**
8
18
  * @deprecated Use localeInStorage instead.
9
19
  */
10
- export declare const localeCookie: import("intlayer").Locale;
20
+ export declare const localeCookie: import("@intlayer/types").Locale;
11
21
  /**
12
22
  * Persist the locale to storage (cookie and/or localStorage).
13
23
  */
@@ -20,7 +30,7 @@ export declare const setLocaleCookie: typeof setLocaleInStorage;
20
30
  * Returns the current locale from storage and a setter.
21
31
  */
22
32
  export declare const useLocaleStorage: (isCookieEnabled?: boolean) => {
23
- localeStorage: import("intlayer").Locale;
33
+ localeStorage: import("@intlayer/types").Locale;
24
34
  setLocaleStorage: (locale: LocalesValues) => void;
25
35
  };
26
36
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"useLocaleStorage.d.ts","names":[],"sources":["../../../src/client/useLocaleStorage.ts"],"mappings":";;;;;qBAWa,oCAAe;;;;qBAKf,iCAAY;;;;qBAKZ,qBAAkB,QACrB,eAAa;;;;qBAWV,wBAAe;;;;qBAKf,mBAAgB;EAOzB,kCAAa;EACb,mBAAgB,QAAA;;;;;qBAOP,wBAAe"}
1
+ {"version":3,"file":"useLocaleStorage.d.ts","names":[],"sources":["../../../src/client/useLocaleStorage.ts"],"mappings":";;;;;;;;qBAea,oDAAkB;;;;;;;qBAQlB,2CAAe;;;;qBAMf,wCAAY;;;;qBAKZ,qBAAkB,QACrB,eAAa;;;;qBAWV,wBAAe;;;;qBAKf,mBAAgB;EAOzB,yCAAa;EACb,mBAAgB,QAAA;;;;;qBAOP,wBAAe"}
@@ -4,7 +4,7 @@ import { WithOnChange, useDictionary } from "./client/useDictionary.js";
4
4
  import { useDictionaryDynamic } from "./client/useDictionaryDynamic.js";
5
5
  import { useIntlayer } from "./client/useIntlayer.js";
6
6
  import { UseLocaleProps, UseLocaleResult, useLocale } from "./client/useLocale.js";
7
- import { localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useLocaleCookie, useLocaleStorage } from "./client/useLocaleStorage.js";
7
+ import { getLocaleInStorage, localeCookie, localeInStorage, setLocaleCookie, setLocaleInStorage, useLocaleCookie, useLocaleStorage } from "./client/useLocaleStorage.js";
8
8
  import { UsePathnameResult, usePathname } from "./client/usePathname.js";
9
9
  import { useRewriteURL } from "./client/useRewriteURL.js";
10
10
  import "./client/index.js";
@@ -17,5 +17,5 @@ declare module '@intlayer/core/interpreter' {
17
17
  interface IInterpreterPlugin<T, S, L extends LocalesValues> extends IInterpreterPluginVanilla<T, S, L> {}
18
18
  }
19
19
  //#endregion
20
- export { DeepTransformContent, HTMLPluginCond, IInterpreterPluginState, IInterpreterPluginVanilla, InsertionCond, IntlayerClient, IntlayerNode, IntlayerNodeCond, MarkdownCond, MarkdownStringCond, UseLocaleProps, UseLocaleResult, UsePathnameResult, WithOnChange, createIntlayerClient, getDictionary, getIntlayer, getIntlayerClient, getPlugins, htmlPlugin, insertionPlugin, installIntlayer, intlayerNodePlugins, localeCookie, localeInStorage, markdownPlugin, markdownStringPlugin, setLocaleCookie, setLocaleInStorage, useDictionary, useDictionaryDynamic, useEditor, useIntlayer, useLocale, useLocaleCookie, useLocaleStorage, usePathname, useRewriteURL };
20
+ export { DeepTransformContent, HTMLPluginCond, IInterpreterPluginState, IInterpreterPluginVanilla, InsertionCond, IntlayerClient, IntlayerNode, IntlayerNodeCond, MarkdownCond, MarkdownStringCond, UseLocaleProps, UseLocaleResult, UsePathnameResult, WithOnChange, createIntlayerClient, getDictionary, getIntlayer, getIntlayerClient, getLocaleInStorage, getPlugins, htmlPlugin, insertionPlugin, installIntlayer, intlayerNodePlugins, localeCookie, localeInStorage, markdownPlugin, markdownStringPlugin, setLocaleCookie, setLocaleInStorage, useDictionary, useDictionaryDynamic, useEditor, useIntlayer, useLocale, useLocaleCookie, useLocaleStorage, usePathname, useRewriteURL };
21
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.ts","names":[],"sources":["../../src/plugins.ts"],"mappings":";;;;;;;;;;YA8CY,iBAAiB,KAAK,4BAC9B,aAAa;YAGL,aAAa,GAAG,UAAU,eAAiB,KAAK;qBAQ/C,qBAAqB;;;;YAmDtB,cAAc,GAAG,IAAI,UAAU,iBAAiB;EAC1D,UAAU;GACT,UAAU,kBAAkB;EAC7B,wBAAwB;KAErB,aAAa,KAAK,QAAQ,iCACzB,QAAQ,MACL,mBAAmB,uBAAuB,qBAAqB,GAAG;qBAG9D,iBAAiB;YAiHlB,mBAAmB,KAAK,mBAChC;EAGI,UAAU;;EAEV,MAAM,aAAa;;qBAKd,sBAAsB;YAuEvB,aAAa,KAAK;EAC5B,UAAU;GACT,UAAU,iBAAiB;EAC5B,iBAAiB;EACjB,aAAa;;EAGT,MAAM,aAAa,6BAA6B,OAAO,aAAa;EACpE,UAAU,qBAAqB;;qBAIxB,gBAAgB;;;;YA2BjB,eAAe,KAAK;EAC9B,UAAU;GACT,UAAU,aAAa;EACxB,aAAa;;EAGT,MAAM,aAAa,6BAA6B,OAAO,aAAa;;qBAI7D,YAAY;;;;iBAqER,0BAA0B,GAAG,GAAG,UAAU;EACzD,qBAAqB,iBAAiB;EACtC,kBAAkB,cAAc,GAAG,GAAG;EACtC,iBAAiB,aAAa;EAC9B,aAAa,eAAe;;;;;;;;;YAUlB,0BAA0B,KACpC;EAGA;EACA;EACA;EACA;;YAGU,qBACV,GACA,UAAU,gBAAgB,mBACxB,uBAAyB,GAAG,yBAAyB;;;;;qBAQ5C,aAAU,SACZ,eAAa,uBAErB"}
1
+ {"version":3,"file":"plugins.d.ts","names":[],"sources":["../../src/plugins.ts"],"mappings":";;;;;;;;;;YA8CY,iBAAiB,KAAK,4BAC9B,aAAa;YAGL,aAAa,GAAG,UAAU,eAAiB,KAAK;qBAQ/C,qBAAqB;;;;YAiDtB,cAAc,GAAG,IAAI,UAAU,iBAAiB;EAC1D,UAAU;GACT,UAAU,kBAAkB;EAC7B,wBAAwB;KAErB,aAAa,KAAK,QAAQ,iCACzB,QAAQ,MACL,mBAAmB,uBAAuB,qBAAqB,GAAG;qBAG9D,iBAAiB;YAiHlB,mBAAmB,KAAK,mBAChC;EAGI,UAAU;;EAEV,MAAM,aAAa;;qBAKd,sBAAsB;YAuEvB,aAAa,KAAK;EAC5B,UAAU;GACT,UAAU,iBAAiB;EAC5B,iBAAiB;EACjB,aAAa;;EAGT,MAAM,aAAa,6BAA6B,OAAO,aAAa;EACpE,UAAU,qBAAqB;;qBAIxB,gBAAgB;;;;YA2BjB,eAAe,KAAK;EAC9B,UAAU;GACT,UAAU,aAAa;EACxB,aAAa;;EAGT,MAAM,aAAa,6BAA6B,OAAO,aAAa;;qBAI7D,YAAY;;;;iBAqER,0BAA0B,GAAG,GAAG,UAAU;EACzD,qBAAqB,iBAAiB;EACtC,kBAAkB,cAAc,GAAG,GAAG;EACtC,iBAAiB,aAAa;EAC9B,aAAa,eAAe;;;;;;;;;YAUlB,0BAA0B,KACpC;EAGA;EACA;EACA;EACA;;YAGU,qBACV,GACA,UAAU,gBAAgB,mBACxB,uBAAyB,GAAG,yBAAyB;;;;;qBAQ5C,aAAU,SACZ,eAAa,uBAErB"}
@@ -1 +1 @@
1
- {"version":3,"file":"renderIntlayerNode.d.ts","names":[],"sources":["../../src/renderIntlayerNode.ts"],"mappings":";;YAEY,aAAa,cAAc,eACrC;EACE,KAAK;EACL,OAAO;EACP;EACA,eAAe;EACf,cAAc;EACd,WAAW,MAAM,aAAa;;EAG9B,KAAK;EACL,OAAO;EACP;EACA,eAAe;EACf,cAAc;EACd,WAAW,MAAM,aAAa;KAGhC;qBAEW,qBACX,KAAC,OAAA,UAAA;EAMD,OAAO;EACP;EACA,kBAAkB;GACjB;MACC,aAAa"}
1
+ {"version":3,"file":"renderIntlayerNode.d.ts","names":[],"sources":["../../src/renderIntlayerNode.ts"],"mappings":";;YAGY,aAAa,cAAc,eACrC;EACE,KAAK;EACL,OAAO;EACP;EACA,eAAe;EACf,cAAc;EACd,WAAW,MAAM,aAAa;;EAG9B,KAAK;EACL,OAAO;EACP;EACA,eAAe;EACf,cAAc;EACd,WAAW,MAAM,aAAa;KAGhC;qBAEW,qBACX,KAAC,OAAA,UAAA;EAMD,OAAO;EACP;EACA,kBAAkB;GACjB;MACC,aAAa"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vanilla-intlayer",
3
- "version": "9.5.9",
3
+ "version": "9.5.10",
4
4
  "private": false,
5
5
  "description": "Easily internationalize i18n your Vanilla JS, HTML, and PHP applications with type-safe multilingual content management.",
6
6
  "keywords": [
@@ -102,11 +102,11 @@
102
102
  "typecheck": "tsc --noEmit --project tsconfig.types.json"
103
103
  },
104
104
  "dependencies": {
105
- "@intlayer/api": "9.5.9",
106
- "@intlayer/config": "9.5.9",
107
- "@intlayer/core": "9.5.9",
108
- "@intlayer/editor": "9.5.9",
109
- "@intlayer/types": "9.5.9"
105
+ "@intlayer/api": "9.5.10",
106
+ "@intlayer/config": "9.5.10",
107
+ "@intlayer/core": "9.5.10",
108
+ "@intlayer/editor": "9.5.10",
109
+ "@intlayer/types": "9.5.10"
110
110
  },
111
111
  "devDependencies": {
112
112
  "@types/node": "^22",
@@ -116,10 +116,10 @@
116
116
  "rimraf": "6.1.3",
117
117
  "tsdown": "0.23.0",
118
118
  "typescript": "7.0.2",
119
- "vitest": "5.0.1"
119
+ "vitest": "5.0.2"
120
120
  },
121
121
  "peerDependencies": {
122
- "intlayer": "9.5.9"
122
+ "intlayer": "9.5.10"
123
123
  },
124
124
  "peerDependenciesMeta": {
125
125
  "intlayer": {