angular-intlayer 9.0.0-canary.9 → 9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/dist/cjs/UI/IntlayerNode.component.cjs +4 -5
  2. package/dist/cjs/UI/IntlayerNode.component.cjs.map +1 -1
  3. package/dist/cjs/_virtual/{_@oxc-project_runtime@0.127.0/helpers → _@oxc-project_runtime@0.140.0/helpers/esm}/decorate.cjs +2 -2
  4. package/dist/{esm/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.mjs → cjs/_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorateMetadata.cjs} +3 -2
  5. package/dist/cjs/analytics/exposureSink.cjs +27 -0
  6. package/dist/cjs/analytics/exposureSink.cjs.map +1 -0
  7. package/dist/cjs/analytics/index.cjs +9 -0
  8. package/dist/cjs/analytics/useAnalytics.cjs +84 -0
  9. package/dist/cjs/analytics/useAnalytics.cjs.map +1 -0
  10. package/dist/cjs/analytics/useConversion.cjs +36 -0
  11. package/dist/cjs/analytics/useConversion.cjs.map +1 -0
  12. package/dist/cjs/analytics/useExperiment.cjs +69 -0
  13. package/dist/cjs/analytics/useExperiment.cjs.map +1 -0
  14. package/dist/cjs/client/installIntlayer.cjs +9 -4
  15. package/dist/cjs/client/installIntlayer.cjs.map +1 -1
  16. package/dist/cjs/client/intlayerToken.cjs +0 -1
  17. package/dist/cjs/client/intlayerToken.cjs.map +1 -1
  18. package/dist/cjs/client/useDictionary.cjs +0 -1
  19. package/dist/cjs/client/useDictionary.cjs.map +1 -1
  20. package/dist/cjs/client/useDictionaryAsync.cjs +0 -1
  21. package/dist/cjs/client/useDictionaryAsync.cjs.map +1 -1
  22. package/dist/cjs/client/useDictionaryDynamic.cjs +0 -1
  23. package/dist/cjs/client/useDictionaryDynamic.cjs.map +1 -1
  24. package/dist/cjs/client/useIntlayer.cjs +0 -1
  25. package/dist/cjs/client/useIntlayer.cjs.map +1 -1
  26. package/dist/cjs/client/useLoadDynamic.cjs +0 -1
  27. package/dist/cjs/client/useLoadDynamic.cjs.map +1 -1
  28. package/dist/cjs/client/useLocale.cjs +0 -1
  29. package/dist/cjs/client/useLocale.cjs.map +1 -1
  30. package/dist/cjs/client/useLocaleStorage.cjs +0 -1
  31. package/dist/cjs/client/useLocaleStorage.cjs.map +1 -1
  32. package/dist/cjs/client/usePathname.cjs +0 -1
  33. package/dist/cjs/client/usePathname.cjs.map +1 -1
  34. package/dist/cjs/editor/ContentSelector.component.cjs +5 -6
  35. package/dist/cjs/editor/ContentSelector.component.cjs.map +1 -1
  36. package/dist/cjs/editor/EditorProvider.component.cjs +4 -5
  37. package/dist/cjs/editor/EditorProvider.component.cjs.map +1 -1
  38. package/dist/cjs/editor/useEditor.cjs +0 -1
  39. package/dist/cjs/editor/useEditor.cjs.map +1 -1
  40. package/dist/cjs/esbuild/plugin.cjs +19 -12
  41. package/dist/cjs/esbuild/plugin.cjs.map +1 -1
  42. package/dist/cjs/format/useCompact.cjs +0 -1
  43. package/dist/cjs/format/useCompact.cjs.map +1 -1
  44. package/dist/cjs/format/useCurrency.cjs +0 -1
  45. package/dist/cjs/format/useCurrency.cjs.map +1 -1
  46. package/dist/cjs/format/useDate.cjs +0 -1
  47. package/dist/cjs/format/useDate.cjs.map +1 -1
  48. package/dist/cjs/format/useIntl.cjs +0 -1
  49. package/dist/cjs/format/useIntl.cjs.map +1 -1
  50. package/dist/cjs/format/useList.cjs +0 -1
  51. package/dist/cjs/format/useList.cjs.map +1 -1
  52. package/dist/cjs/format/useNumber.cjs +0 -1
  53. package/dist/cjs/format/useNumber.cjs.map +1 -1
  54. package/dist/cjs/format/usePercentage.cjs +0 -1
  55. package/dist/cjs/format/usePercentage.cjs.map +1 -1
  56. package/dist/cjs/format/useRelativeTime.cjs +0 -1
  57. package/dist/cjs/format/useRelativeTime.cjs.map +1 -1
  58. package/dist/cjs/format/useUnit.cjs +0 -1
  59. package/dist/cjs/format/useUnit.cjs.map +1 -1
  60. package/dist/cjs/getDictionary.cjs +0 -1
  61. package/dist/cjs/getDictionary.cjs.map +1 -1
  62. package/dist/cjs/getIntlayer.cjs +0 -1
  63. package/dist/cjs/getIntlayer.cjs.map +1 -1
  64. package/dist/cjs/html/installIntlayerHTML.cjs +2 -3
  65. package/dist/cjs/html/installIntlayerHTML.cjs.map +1 -1
  66. package/dist/cjs/index.cjs +7 -0
  67. package/dist/cjs/markdown/installIntlayerMarkdown.cjs +2 -3
  68. package/dist/cjs/markdown/installIntlayerMarkdown.cjs.map +1 -1
  69. package/dist/cjs/plugins.cjs +29 -16
  70. package/dist/cjs/plugins.cjs.map +1 -1
  71. package/dist/cjs/renderIntlayerNode.cjs.map +1 -1
  72. package/dist/cjs/webpack/mergeConfig.cjs +1 -2
  73. package/dist/cjs/webpack/mergeConfig.cjs.map +1 -1
  74. package/dist/esm/UI/IntlayerNode.component.mjs +2 -2
  75. package/dist/esm/UI/IntlayerNode.component.mjs.map +1 -1
  76. package/dist/esm/_virtual/{_@oxc-project_runtime@0.127.0/helpers → _@oxc-project_runtime@0.140.0/helpers/esm}/decorate.mjs +2 -2
  77. package/dist/{cjs/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.cjs → esm/_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorateMetadata.mjs} +2 -3
  78. package/dist/esm/analytics/exposureSink.mjs +24 -0
  79. package/dist/esm/analytics/exposureSink.mjs.map +1 -0
  80. package/dist/esm/analytics/index.mjs +5 -0
  81. package/dist/esm/analytics/useAnalytics.mjs +82 -0
  82. package/dist/esm/analytics/useAnalytics.mjs.map +1 -0
  83. package/dist/esm/analytics/useConversion.mjs +35 -0
  84. package/dist/esm/analytics/useConversion.mjs.map +1 -0
  85. package/dist/esm/analytics/useExperiment.mjs +68 -0
  86. package/dist/esm/analytics/useExperiment.mjs.map +1 -0
  87. package/dist/esm/client/installIntlayer.mjs +9 -4
  88. package/dist/esm/client/installIntlayer.mjs.map +1 -1
  89. package/dist/esm/client/intlayerToken.mjs.map +1 -1
  90. package/dist/esm/client/useDictionary.mjs.map +1 -1
  91. package/dist/esm/client/useDictionaryAsync.mjs.map +1 -1
  92. package/dist/esm/client/useDictionaryDynamic.mjs.map +1 -1
  93. package/dist/esm/client/useIntlayer.mjs.map +1 -1
  94. package/dist/esm/client/useLoadDynamic.mjs.map +1 -1
  95. package/dist/esm/client/useLocale.mjs.map +1 -1
  96. package/dist/esm/client/useLocaleStorage.mjs.map +1 -1
  97. package/dist/esm/client/usePathname.mjs.map +1 -1
  98. package/dist/esm/editor/ContentSelector.component.mjs +2 -2
  99. package/dist/esm/editor/ContentSelector.component.mjs.map +1 -1
  100. package/dist/esm/editor/EditorProvider.component.mjs +2 -2
  101. package/dist/esm/editor/EditorProvider.component.mjs.map +1 -1
  102. package/dist/esm/editor/useEditor.mjs.map +1 -1
  103. package/dist/esm/esbuild/plugin.mjs +16 -8
  104. package/dist/esm/esbuild/plugin.mjs.map +1 -1
  105. package/dist/esm/format/useCompact.mjs.map +1 -1
  106. package/dist/esm/format/useCurrency.mjs.map +1 -1
  107. package/dist/esm/format/useDate.mjs.map +1 -1
  108. package/dist/esm/format/useIntl.mjs.map +1 -1
  109. package/dist/esm/format/useList.mjs.map +1 -1
  110. package/dist/esm/format/useNumber.mjs.map +1 -1
  111. package/dist/esm/format/usePercentage.mjs.map +1 -1
  112. package/dist/esm/format/useRelativeTime.mjs.map +1 -1
  113. package/dist/esm/format/useUnit.mjs.map +1 -1
  114. package/dist/esm/getDictionary.mjs.map +1 -1
  115. package/dist/esm/getIntlayer.mjs.map +1 -1
  116. package/dist/esm/html/installIntlayerHTML.mjs +1 -1
  117. package/dist/esm/html/installIntlayerHTML.mjs.map +1 -1
  118. package/dist/esm/index.mjs +4 -1
  119. package/dist/esm/markdown/installIntlayerMarkdown.mjs +1 -1
  120. package/dist/esm/markdown/installIntlayerMarkdown.mjs.map +1 -1
  121. package/dist/esm/plugins.mjs +30 -17
  122. package/dist/esm/plugins.mjs.map +1 -1
  123. package/dist/esm/renderIntlayerNode.mjs.map +1 -1
  124. package/dist/esm/webpack/mergeConfig.mjs.map +1 -1
  125. package/dist/types/UI/IntlayerNode.component.d.ts +0 -1
  126. package/dist/types/UI/IntlayerNode.component.d.ts.map +1 -1
  127. package/dist/types/analytics/exposureSink.d.ts +32 -0
  128. package/dist/types/analytics/exposureSink.d.ts.map +1 -0
  129. package/dist/types/analytics/index.d.ts +4 -0
  130. package/dist/types/analytics/useAnalytics.d.ts +36 -0
  131. package/dist/types/analytics/useAnalytics.d.ts.map +1 -0
  132. package/dist/types/analytics/useConversion.d.ts +38 -0
  133. package/dist/types/analytics/useConversion.d.ts.map +1 -0
  134. package/dist/types/analytics/useExperiment.d.ts +47 -0
  135. package/dist/types/analytics/useExperiment.d.ts.map +1 -0
  136. package/dist/types/client/installIntlayer.d.ts +2 -4
  137. package/dist/types/client/installIntlayer.d.ts.map +1 -1
  138. package/dist/types/client/intlayerToken.d.ts +1 -3
  139. package/dist/types/client/intlayerToken.d.ts.map +1 -1
  140. package/dist/types/client/useDictionary.d.ts +0 -1
  141. package/dist/types/client/useDictionary.d.ts.map +1 -1
  142. package/dist/types/client/useDictionaryAsync.d.ts +1 -3
  143. package/dist/types/client/useDictionaryAsync.d.ts.map +1 -1
  144. package/dist/types/client/useDictionaryDynamic.d.ts +1 -3
  145. package/dist/types/client/useDictionaryDynamic.d.ts.map +1 -1
  146. package/dist/types/client/useIntlayer.d.ts +0 -1
  147. package/dist/types/client/useIntlayer.d.ts.map +1 -1
  148. package/dist/types/client/useLoadDynamic.d.ts.map +1 -1
  149. package/dist/types/client/useLocale.d.ts +1 -5
  150. package/dist/types/client/useLocale.d.ts.map +1 -1
  151. package/dist/types/client/useLocaleStorage.d.ts +5 -7
  152. package/dist/types/client/useLocaleStorage.d.ts.map +1 -1
  153. package/dist/types/client/usePathname.d.ts +0 -1
  154. package/dist/types/client/usePathname.d.ts.map +1 -1
  155. package/dist/types/editor/ContentSelector.component.d.ts.map +1 -1
  156. package/dist/types/editor/EditorProvider.component.d.ts.map +1 -1
  157. package/dist/types/editor/useEditor.d.ts +1 -3
  158. package/dist/types/editor/useEditor.d.ts.map +1 -1
  159. package/dist/types/esbuild/plugin.d.ts +2 -2
  160. package/dist/types/esbuild/plugin.d.ts.map +1 -1
  161. package/dist/types/format/useCompact.d.ts +2 -5
  162. package/dist/types/format/useCompact.d.ts.map +1 -1
  163. package/dist/types/format/useCurrency.d.ts +2 -5
  164. package/dist/types/format/useCurrency.d.ts.map +1 -1
  165. package/dist/types/format/useDate.d.ts +3 -7
  166. package/dist/types/format/useDate.d.ts.map +1 -1
  167. package/dist/types/format/useIntl.d.ts +1 -3
  168. package/dist/types/format/useIntl.d.ts.map +1 -1
  169. package/dist/types/format/useList.d.ts +5 -8
  170. package/dist/types/format/useList.d.ts.map +1 -1
  171. package/dist/types/format/useNumber.d.ts +2 -5
  172. package/dist/types/format/useNumber.d.ts.map +1 -1
  173. package/dist/types/format/usePercentage.d.ts +2 -5
  174. package/dist/types/format/usePercentage.d.ts.map +1 -1
  175. package/dist/types/format/useRelativeTime.d.ts +2 -5
  176. package/dist/types/format/useRelativeTime.d.ts.map +1 -1
  177. package/dist/types/format/useUnit.d.ts +2 -5
  178. package/dist/types/format/useUnit.d.ts.map +1 -1
  179. package/dist/types/getDictionary.d.ts +0 -1
  180. package/dist/types/getDictionary.d.ts.map +1 -1
  181. package/dist/types/getIntlayer.d.ts +0 -1
  182. package/dist/types/getIntlayer.d.ts.map +1 -1
  183. package/dist/types/html/installIntlayerHTML.d.ts +0 -1
  184. package/dist/types/html/installIntlayerHTML.d.ts.map +1 -1
  185. package/dist/types/index.d.ts +7 -2
  186. package/dist/types/index.d.ts.map +1 -1
  187. package/dist/types/markdown/installIntlayerMarkdown.d.ts +0 -1
  188. package/dist/types/markdown/installIntlayerMarkdown.d.ts.map +1 -1
  189. package/dist/types/plugins.d.ts +0 -1
  190. package/dist/types/plugins.d.ts.map +1 -1
  191. package/dist/types/renderIntlayerNode.d.ts +1 -6
  192. package/dist/types/renderIntlayerNode.d.ts.map +1 -1
  193. package/dist/types/webpack/mergeConfig.d.ts +1 -1
  194. package/dist/types/webpack/mergeConfig.d.ts.map +1 -1
  195. package/package.json +15 -12
@@ -1,6 +1,7 @@
1
1
  import { renderIntlayerNode } from "./renderIntlayerNode.mjs";
2
+ import { reportExposure } from "./analytics/exposureSink.mjs";
2
3
  import { ContentSelectorWrapperComponent } from "./editor/ContentSelector.component.mjs";
3
- import { conditionPlugin, enumerationPlugin, fallbackPlugin, filePlugin, genderPlugin, nestedPlugin, pluralPlugin, translationPlugin } from "@intlayer/core/interpreter";
4
+ import { conditionPlugin, enumerationPlugin, fallbackPlugin, filePlugin, genderPlugin, isInterpolableWrapperNode, nestedPlugin, pluralPlugin, transformInterpolableNode, translationPlugin } from "@intlayer/core/interpreter";
4
5
  import { editor, internationalization } from "@intlayer/config/built";
5
6
  import { compile, getMarkdownMetadata } from "@intlayer/core/markdown";
6
7
  import * as NodeTypes from "@intlayer/types/nodeType";
@@ -37,18 +38,26 @@ const createRuntimeWithOverides = (baseRuntime, overrides) => ({
37
38
  const intlayerNodePlugins = {
38
39
  id: "intlayer-node-plugin",
39
40
  canHandle: (node) => typeof node === "bigint" || typeof node === "string" || typeof node === "number",
40
- transform: (_node, { children, ...rest }) => renderIntlayerNode({
41
- ...rest,
42
- value: children,
43
- children: () => ({
44
- component: process.env.INTLAYER_EDITOR_ENABLED === "false" || !editor.enabled ? children : ContentSelectorWrapperComponent,
45
- props: {
46
- dictionaryKey: rest.dictionaryKey,
47
- keyPath: rest.keyPath
48
- },
49
- children
50
- })
51
- })
41
+ transform: (_node, { children, ...rest }) => {
42
+ if (process.env.INTLAYER_ANALYTICS_ENABLED !== "false") reportExposure({
43
+ dictionaryKey: rest.dictionaryKey,
44
+ keyPath: rest.keyPath,
45
+ locale: rest.locale,
46
+ nodeType: "text"
47
+ });
48
+ return renderIntlayerNode({
49
+ ...rest,
50
+ value: children,
51
+ children: () => ({
52
+ component: process.env.INTLAYER_EDITOR_ENABLED === "false" || !editor.enabled ? children : ContentSelectorWrapperComponent,
53
+ props: {
54
+ dictionaryKey: rest.dictionaryKey,
55
+ keyPath: rest.keyPath
56
+ },
57
+ children
58
+ })
59
+ });
60
+ }
52
61
  };
53
62
  /** Markdown string plugin. Replaces string node with a component that render the markdown. */
54
63
  const markdownStringPlugin = process.env.INTLAYER_NODE_TYPE_MARKDOWN === "false" ? fallbackPlugin : {
@@ -154,13 +163,15 @@ const htmlPlugin = process.env.INTLAYER_NODE_TYPE_HTML === "false" ? fallbackPlu
154
163
  if (!components || typeof components === "object" && Object.keys(components).length === 0) return String(html);
155
164
  const htmlRuntime = _markdownInstall?.htmlRuntime;
156
165
  if (!htmlRuntime || !compile) return String(html);
157
- return compile(html, { runtime: createRuntimeWithOverides(htmlRuntime, components) });
166
+ const runtime = createRuntimeWithOverides(htmlRuntime, components);
167
+ return compile(html, { runtime });
158
168
  };
159
169
  if (prop === Symbol.toPrimitive) return () => {
160
170
  if (!components || typeof components === "object" && Object.keys(components).length === 0) return String(html);
161
171
  const htmlRuntime = _markdownInstall?.htmlRuntime;
162
172
  if (!htmlRuntime || !compile) return String(html);
163
- return compile(html, { runtime: createRuntimeWithOverides(htmlRuntime, components) });
173
+ const runtime = createRuntimeWithOverides(htmlRuntime, components);
174
+ return compile(html, { runtime });
164
175
  };
165
176
  if (prop === "use") return (userComponents) => {
166
177
  const mergedComponents = {
@@ -177,10 +188,12 @@ const htmlPlugin = process.env.INTLAYER_NODE_TYPE_HTML === "false" ? fallbackPlu
177
188
  const insertionPlugin = process.env.INTLAYER_NODE_TYPE_INSERTION === "false" ? fallbackPlugin : {
178
189
  id: "insertion-plugin",
179
190
  canHandle: (node) => typeof node === "object" && node?.nodeType === NodeTypes.INSERTION,
180
- transform: (node, props) => {
191
+ transform: (node, props, deepTransformNode) => {
181
192
  const { plugins, ...rest } = props;
193
+ const content = node[NodeTypes.INSERTION];
194
+ if (isInterpolableWrapperNode(content)) return (args = {}) => transformInterpolableNode(content, args, props, props.plugins, deepTransformNode);
182
195
  const render = (args = {}) => {
183
- let text = node[NodeTypes.INSERTION];
196
+ let text = content;
184
197
  if (args) Object.entries(args).forEach(([key, value]) => {
185
198
  text = text.replace(new RegExp(`{{\\s*${key}\\s*}}`, "g"), String(value));
186
199
  });
@@ -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 type IInterpreterPluginState as IInterpreterPluginStateCore,\n nestedPlugin,\n type Plugins,\n pluralPlugin,\n translationPlugin,\n} from '@intlayer/core/interpreter';\nimport type { MarkdownContent } from '@intlayer/core/markdown';\nimport { compile, getMarkdownMetadata } from '@intlayer/core/markdown';\nimport type { HTMLContent, InsertionContent } 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 { ContentSelectorWrapperComponent } from './editor/ContentSelector.component';\nimport { renderIntlayerNode } from './renderIntlayerNode';\n\nlet _markdownInstall: {\n htmlRuntime: any;\n useMarkdown: () => { renderMarkdown: (s: string, components?: any) => any };\n} | null = null;\nif (\n process.env.INTLAYER_NODE_TYPE_MARKDOWN !== 'false' ||\n process.env.INTLAYER_NODE_TYPE_HTML !== 'false'\n) {\n void import('./markdown/installIntlayerMarkdown').then((m) => {\n _markdownInstall = m as any;\n });\n}\n\n/** ---------------------------------------------\n * UTILS\n * --------------------------------------------- */\n\nconst createRuntimeWithOverides = (baseRuntime: any, overrides: any) => ({\n ...baseRuntime,\n createElement: (tag: string, props: any, ...children: any[]) => {\n const override = overrides?.[tag];\n\n if (override) {\n const newProps = { ...props, ...override };\n\n // Merge class attributes intelligently\n const originalClass = props?.class || props?.className;\n const overrideClass = override.class || override.className;\n\n if (originalClass && overrideClass) {\n newProps.class = `${originalClass} ${overrideClass}`;\n newProps.className = undefined;\n }\n\n return baseRuntime.createElement(tag, newProps, ...children);\n }\n\n return baseRuntime.createElement(tag, props, ...children);\n },\n});\n\n/** ---------------------------------------------\n * INTLAYER NODE PLUGIN\n * --------------------------------------------- */\n\nexport type IntlayerNodeCond<T> = T extends number | string\n ? IntlayerNode<T>\n : never;\n\nexport interface IntlayerNode<T, P = {}> {\n value: T;\n children?: any;\n additionalProps?: P;\n}\n\n/** Translation plugin. Replaces node with a locale string if nodeType = Translation. */\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, ...rest }) =>\n renderIntlayerNode({\n ...rest,\n value: children,\n children: () => ({\n component:\n process.env.INTLAYER_EDITOR_ENABLED === 'false' || !editor.enabled\n ? children\n : ContentSelectorWrapperComponent,\n props: {\n dictionaryKey: rest.dictionaryKey,\n keyPath: rest.keyPath,\n },\n children: children,\n }),\n }),\n};\n\n/**\n * MARKDOWN PLUGIN\n */\n\nexport type MarkdownStringCond<T> = T extends string\n ? IntlayerNode<string, { metadata: DeepTransformContent<string> }>\n : never;\n\n/** Markdown string plugin. Replaces string node with a component that render the markdown. */\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 {\n plugins, // Removed to avoid next error - Functions cannot be passed directly to Client Components\n ...rest\n } = props;\n\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, props) =>\n renderIntlayerNode({\n ...props,\n value: metadataNode,\n children: node,\n }),\n };\n\n // Transform metadata while keeping the same structure\n const metadataNodes = deepTransformNode(metadata, {\n plugins: [metadataPlugins],\n dictionaryKey: rest.dictionaryKey,\n keyPath: [],\n });\n\n const render = (components?: any) =>\n renderIntlayerNode({\n ...rest,\n value: node,\n children:\n process.env.INTLAYER_EDITOR_ENABLED === 'false' ||\n !editor.enabled\n ? () => {\n const { renderMarkdown } =\n _markdownInstall?.useMarkdown() ?? {\n renderMarkdown: () => node,\n };\n return renderMarkdown(node, components);\n }\n : () => ({\n component: ContentSelectorWrapperComponent,\n props: {\n dictionaryKey: rest.dictionaryKey,\n keyPath: rest.keyPath,\n ...components,\n },\n children: () => {\n const { renderMarkdown } =\n _markdownInstall?.useMarkdown() ?? {\n renderMarkdown: () => node,\n };\n return renderMarkdown(node, components);\n },\n }),\n additionalProps: {\n metadata: metadataNodes,\n },\n });\n\n const createProxy = (element: any, components?: any) =>\n new Proxy(element, {\n get(target, prop, receiver) {\n if (prop === 'value') {\n return node;\n }\n if (prop === 'metadata') {\n return metadataNodes;\n }\n\n if (prop === 'toString') {\n return () => {\n const htmlRuntime = _markdownInstall?.htmlRuntime;\n if (!htmlRuntime || !compile) return node;\n const runtime = components\n ? createRuntimeWithOverides(htmlRuntime, components)\n : htmlRuntime;\n return compile(node, { runtime }) as string;\n };\n }\n\n if (prop === Symbol.toPrimitive) {\n return () => {\n const htmlRuntime = _markdownInstall?.htmlRuntime;\n if (!htmlRuntime || !compile) return node;\n const runtime = components\n ? createRuntimeWithOverides(htmlRuntime, components)\n : htmlRuntime;\n return compile(node, { runtime }) as string;\n };\n }\n\n if (prop === 'use') {\n return (newComponents?: any) => {\n const mergedComponents = {\n ...components,\n ...newComponents,\n };\n return createProxy(\n render(mergedComponents),\n mergedComponents\n );\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as any;\n\n return createProxy(render() as any);\n },\n };\n\nexport type MarkdownCond<T, _S, _L extends LocalesValues> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.MARKDOWN]: infer M;\n tags?: infer U;\n metadata?: infer V;\n}\n ? IntlayerNode<\n M,\n {\n use: (components?: Record<keyof U, any>) => any;\n metadata: DeepTransformContent<V>;\n }\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 {\n type: NodeTypes.MARKDOWN,\n },\n ];\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\n/**\n * HTML conditional type.\n *\n * This ensures type safety:\n * - `html('<div>Hello <CustomComponent /></div>').use({ CustomComponent: ... })` - optional but typed\n */\nexport type HTMLPluginCond<T, _S, _L> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.HTML]: infer I;\n tags?: infer U;\n}\n ? IntlayerNode<\n I,\n {\n use: (components?: Record<keyof U, any>) => any;\n }\n >\n : never;\n\n/** HTML plugin. Replaces node with a function that takes components => IntlayerNode. */\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\n transform: (node: HTMLContent<string>, props) => {\n const html = node[NodeTypes.HTML];\n const { plugins, ...rest } = props;\n\n // Type-safe render function that accepts properly typed components\n const render = (userComponents?: any) =>\n renderIntlayerNode({\n ...rest,\n value: html,\n children:\n process.env.INTLAYER_EDITOR_ENABLED === 'false' ||\n !editor.enabled\n ? html\n : () => ({\n component: ContentSelectorWrapperComponent,\n props: {\n dictionaryKey: rest.dictionaryKey,\n keyPath: rest.keyPath,\n ...userComponents,\n },\n children: html,\n }),\n });\n\n const createProxy = (element: any, components?: any) =>\n new Proxy(element, {\n get(target, prop, receiver) {\n if (prop === 'value') {\n return html;\n }\n\n if (prop === 'toString') {\n return () => {\n if (\n !components ||\n (typeof components === 'object' &&\n Object.keys(components).length === 0)\n ) {\n return String(html);\n }\n const htmlRuntime = _markdownInstall?.htmlRuntime;\n if (!htmlRuntime || !compile) return String(html);\n const runtime = createRuntimeWithOverides(\n htmlRuntime,\n components\n );\n return compile(html, { runtime }) as string;\n };\n }\n\n if (prop === Symbol.toPrimitive) {\n return () => {\n if (\n !components ||\n (typeof components === 'object' &&\n Object.keys(components).length === 0)\n ) {\n return String(html);\n }\n const htmlRuntime = _markdownInstall?.htmlRuntime;\n if (!htmlRuntime || !compile) return String(html);\n const runtime = createRuntimeWithOverides(\n htmlRuntime,\n components\n );\n return compile(html, { runtime }) as string;\n };\n }\n\n if (prop === 'use') {\n // Return a properly typed function based on custom components\n return (userComponents?: any) => {\n const mergedComponents = {\n ...components,\n ...userComponents,\n };\n return createProxy(\n render(mergedComponents),\n mergedComponents\n );\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as any;\n\n return createProxy(render() as any);\n },\n };\n\n/** ---------------------------------------------\n * INSERTION PLUGIN\n * --------------------------------------------- */\n\n/**\n * Insertion conditional type.\n */\nexport type InsertionPluginCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.INSERTION]: infer _I;\n}\n ? (args: Record<string, string | number>) => string\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) => {\n const { plugins, ...rest } = props;\n\n // Return a function that performs the interpolation\n const render = (args: Record<string, string | number> = {}) => {\n let text = node[NodeTypes.INSERTION] as string;\n if (args) {\n Object.entries(args).forEach(([key, value]) => {\n text = text.replace(\n new RegExp(`{{\\\\s*${key}\\\\s*}}`, 'g'),\n String(value)\n );\n });\n }\n return text;\n };\n\n return renderIntlayerNode({\n ...rest,\n value: render as any,\n children: render,\n });\n },\n };\n\nexport interface IInterpreterPluginAngular<T, S, L extends LocalesValues> {\n angularIntlayerNode: IntlayerNodeCond<T>;\n angularMarkdown: MarkdownCond<T, S, L>;\n angularHtml: HTMLPluginCond<T, S, L>;\n angularInsertion: InsertionPluginCond<T>;\n}\n\n/**\n * Insert this type as param of `DeepTransformContent` to avoid `intlayer` package pollution.\n *\n * Otherwise the the `angular-intlayer` plugins will override the types of `intlayer` functions.\n */\nexport type IInterpreterPluginState = Omit<\n IInterpreterPluginStateCore,\n 'insertion' // Remove insertion type from core package\n> & {\n angularIntlayerNode: true;\n angularMarkdown: true;\n angularHtml: true;\n angularInsertion: 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 Angular 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: boolean = 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 intlayerNodePlugins,\n markdownPlugin,\n htmlPlugin,\n insertionPlugin,\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 type IInterpreterPluginState as IInterpreterPluginStateCore,\n isInterpolableWrapperNode,\n nestedPlugin,\n type Plugins,\n pluralPlugin,\n transformInterpolableNode,\n translationPlugin,\n} from '@intlayer/core/interpreter';\nimport type { MarkdownContent } from '@intlayer/core/markdown';\nimport { compile, getMarkdownMetadata } from '@intlayer/core/markdown';\nimport type { HTMLContent, InsertionContent } 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 { reportExposure } from './analytics/exposureSink';\nimport { ContentSelectorWrapperComponent } from './editor/ContentSelector.component';\nimport { renderIntlayerNode } from './renderIntlayerNode';\n\nlet _markdownInstall: {\n htmlRuntime: any;\n useMarkdown: () => { renderMarkdown: (s: string, components?: any) => any };\n} | null = null;\nif (\n process.env.INTLAYER_NODE_TYPE_MARKDOWN !== 'false' ||\n process.env.INTLAYER_NODE_TYPE_HTML !== 'false'\n) {\n void import('./markdown/installIntlayerMarkdown').then((m) => {\n _markdownInstall = m as any;\n });\n}\n\n/** ---------------------------------------------\n * UTILS\n * --------------------------------------------- */\n\nconst createRuntimeWithOverides = (baseRuntime: any, overrides: any) => ({\n ...baseRuntime,\n createElement: (tag: string, props: any, ...children: any[]) => {\n const override = overrides?.[tag];\n\n if (override) {\n const newProps = { ...props, ...override };\n\n // Merge class attributes intelligently\n const originalClass = props?.class || props?.className;\n const overrideClass = override.class || override.className;\n\n if (originalClass && overrideClass) {\n newProps.class = `${originalClass} ${overrideClass}`;\n newProps.className = undefined;\n }\n\n return baseRuntime.createElement(tag, newProps, ...children);\n }\n\n return baseRuntime.createElement(tag, props, ...children);\n },\n});\n\n/** ---------------------------------------------\n * INTLAYER NODE PLUGIN\n * --------------------------------------------- */\n\nexport type IntlayerNodeCond<T> = T extends number | string\n ? IntlayerNode<T>\n : never;\n\nexport interface IntlayerNode<T, P = {}> {\n value: T;\n children?: any;\n additionalProps?: P;\n}\n\n/** Translation plugin. Replaces node with a locale string if nodeType = Translation. */\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, ...rest }) => {\n // Node-level analytics: record which content is resolved for display.\n // No-op (and dead-code-eliminated) when analytics is disabled.\n if (process.env.INTLAYER_ANALYTICS_ENABLED !== 'false') {\n reportExposure({\n dictionaryKey: rest.dictionaryKey,\n keyPath: rest.keyPath,\n locale: rest.locale,\n nodeType: 'text',\n });\n }\n\n return renderIntlayerNode({\n ...rest,\n value: children,\n children: () => ({\n component:\n process.env.INTLAYER_EDITOR_ENABLED === 'false' || !editor.enabled\n ? children\n : ContentSelectorWrapperComponent,\n props: {\n dictionaryKey: rest.dictionaryKey,\n keyPath: rest.keyPath,\n },\n children: children,\n }),\n });\n },\n};\n\n/**\n * MARKDOWN PLUGIN\n */\n\nexport type MarkdownStringCond<T> = T extends string\n ? IntlayerNode<string, { metadata: DeepTransformContent<string> }>\n : never;\n\n/** Markdown string plugin. Replaces string node with a component that render the markdown. */\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 {\n plugins, // Removed to avoid next error - Functions cannot be passed directly to Client Components\n ...rest\n } = props;\n\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, props) =>\n renderIntlayerNode({\n ...props,\n value: metadataNode,\n children: node,\n }),\n };\n\n // Transform metadata while keeping the same structure\n const metadataNodes = deepTransformNode(metadata, {\n plugins: [metadataPlugins],\n dictionaryKey: rest.dictionaryKey,\n keyPath: [],\n });\n\n const render = (components?: any) =>\n renderIntlayerNode({\n ...rest,\n value: node,\n children:\n process.env.INTLAYER_EDITOR_ENABLED === 'false' ||\n !editor.enabled\n ? () => {\n const { renderMarkdown } =\n _markdownInstall?.useMarkdown() ?? {\n renderMarkdown: () => node,\n };\n return renderMarkdown(node, components);\n }\n : () => ({\n component: ContentSelectorWrapperComponent,\n props: {\n dictionaryKey: rest.dictionaryKey,\n keyPath: rest.keyPath,\n ...components,\n },\n children: () => {\n const { renderMarkdown } =\n _markdownInstall?.useMarkdown() ?? {\n renderMarkdown: () => node,\n };\n return renderMarkdown(node, components);\n },\n }),\n additionalProps: {\n metadata: metadataNodes,\n },\n });\n\n const createProxy = (element: any, components?: any) =>\n new Proxy(element, {\n get(target, prop, receiver) {\n if (prop === 'value') {\n return node;\n }\n if (prop === 'metadata') {\n return metadataNodes;\n }\n\n if (prop === 'toString') {\n return () => {\n const htmlRuntime = _markdownInstall?.htmlRuntime;\n if (!htmlRuntime || !compile) return node;\n const runtime = components\n ? createRuntimeWithOverides(htmlRuntime, components)\n : htmlRuntime;\n return compile(node, { runtime }) as string;\n };\n }\n\n if (prop === Symbol.toPrimitive) {\n return () => {\n const htmlRuntime = _markdownInstall?.htmlRuntime;\n if (!htmlRuntime || !compile) return node;\n const runtime = components\n ? createRuntimeWithOverides(htmlRuntime, components)\n : htmlRuntime;\n return compile(node, { runtime }) as string;\n };\n }\n\n if (prop === 'use') {\n return (newComponents?: any) => {\n const mergedComponents = {\n ...components,\n ...newComponents,\n };\n return createProxy(\n render(mergedComponents),\n mergedComponents\n );\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as any;\n\n return createProxy(render() as any);\n },\n };\n\nexport type MarkdownCond<T, _S, _L extends LocalesValues> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.MARKDOWN]: infer M;\n tags?: infer U;\n metadata?: infer V;\n}\n ? IntlayerNode<\n M,\n {\n use: (components?: Record<keyof U, any>) => any;\n metadata: DeepTransformContent<V>;\n }\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 {\n type: NodeTypes.MARKDOWN,\n },\n ];\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\n/**\n * HTML conditional type.\n *\n * This ensures type safety:\n * - `html('<div>Hello <CustomComponent /></div>').use({ CustomComponent: ... })` - optional but typed\n */\nexport type HTMLPluginCond<T, _S, _L> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.HTML]: infer I;\n tags?: infer U;\n}\n ? IntlayerNode<\n I,\n {\n use: (components?: Record<keyof U, any>) => any;\n }\n >\n : never;\n\n/** HTML plugin. Replaces node with a function that takes components => IntlayerNode. */\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\n transform: (node: HTMLContent<string>, props) => {\n const html = node[NodeTypes.HTML];\n const { plugins, ...rest } = props;\n\n // Type-safe render function that accepts properly typed components\n const render = (userComponents?: any) =>\n renderIntlayerNode({\n ...rest,\n value: html,\n children:\n process.env.INTLAYER_EDITOR_ENABLED === 'false' ||\n !editor.enabled\n ? html\n : () => ({\n component: ContentSelectorWrapperComponent,\n props: {\n dictionaryKey: rest.dictionaryKey,\n keyPath: rest.keyPath,\n ...userComponents,\n },\n children: html,\n }),\n });\n\n const createProxy = (element: any, components?: any) =>\n new Proxy(element, {\n get(target, prop, receiver) {\n if (prop === 'value') {\n return html;\n }\n\n if (prop === 'toString') {\n return () => {\n if (\n !components ||\n (typeof components === 'object' &&\n Object.keys(components).length === 0)\n ) {\n return String(html);\n }\n const htmlRuntime = _markdownInstall?.htmlRuntime;\n if (!htmlRuntime || !compile) return String(html);\n const runtime = createRuntimeWithOverides(\n htmlRuntime,\n components\n );\n return compile(html, { runtime }) as string;\n };\n }\n\n if (prop === Symbol.toPrimitive) {\n return () => {\n if (\n !components ||\n (typeof components === 'object' &&\n Object.keys(components).length === 0)\n ) {\n return String(html);\n }\n const htmlRuntime = _markdownInstall?.htmlRuntime;\n if (!htmlRuntime || !compile) return String(html);\n const runtime = createRuntimeWithOverides(\n htmlRuntime,\n components\n );\n return compile(html, { runtime }) as string;\n };\n }\n\n if (prop === 'use') {\n // Return a properly typed function based on custom components\n return (userComponents?: any) => {\n const mergedComponents = {\n ...components,\n ...userComponents,\n };\n return createProxy(\n render(mergedComponents),\n mergedComponents\n );\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as any;\n\n return createProxy(render() as any);\n },\n };\n\n/** ---------------------------------------------\n * INSERTION PLUGIN\n * --------------------------------------------- */\n\n/**\n * Insertion conditional type.\n */\nexport type InsertionPluginCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.INSERTION]: infer _I;\n}\n ? (args: Record<string, string | number>) => string\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 { plugins, ...rest } = props;\n const content = node[NodeTypes.INSERTION];\n\n // `html()`/`markdown()` nodes carry their `{{ … }}` placeholders\n // inside a raw string. Interpolate into that string, then re-run the\n // transform so the html/markdown renderer applies afterwards.\n if (isInterpolableWrapperNode(content)) {\n return (args: Record<string, string | number> = {}) =>\n transformInterpolableNode(\n content,\n args,\n props,\n props.plugins,\n deepTransformNode\n );\n }\n\n // Return a function that performs the interpolation\n const render = (args: Record<string, string | number> = {}) => {\n let text = content as string;\n if (args) {\n Object.entries(args).forEach(([key, value]) => {\n text = text.replace(\n new RegExp(`{{\\\\s*${key}\\\\s*}}`, 'g'),\n String(value)\n );\n });\n }\n return text;\n };\n\n return renderIntlayerNode({\n ...rest,\n value: render as any,\n children: render,\n });\n },\n };\n\nexport interface IInterpreterPluginAngular<T, S, L extends LocalesValues> {\n angularIntlayerNode: IntlayerNodeCond<T>;\n angularMarkdown: MarkdownCond<T, S, L>;\n angularHtml: HTMLPluginCond<T, S, L>;\n angularInsertion: InsertionPluginCond<T>;\n}\n\n/**\n * Insert this type as param of `DeepTransformContent` to avoid `intlayer` package pollution.\n *\n * Otherwise the the `angular-intlayer` plugins will override the types of `intlayer` functions.\n */\nexport type IInterpreterPluginState = Omit<\n IInterpreterPluginStateCore,\n 'insertion' // Remove insertion type from core package\n> & {\n angularIntlayerNode: true;\n angularMarkdown: true;\n angularHtml: true;\n angularInsertion: 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 Angular 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: boolean = 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 intlayerNodePlugins,\n markdownPlugin,\n htmlPlugin,\n insertionPlugin,\n ] as Plugins[];\n\n pluginsCache.set(cacheKey, plugins);\n\n return plugins;\n};\n"],"mappings":"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"}
@@ -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, AdditionalProps = {}> = ResolvedEditor<\n T,\n any\n> & {\n value: T;\n} & AdditionalProps &\n T;\n\ntype RenderIntlayerNodeProps<T> = {\n value: T;\n children: any;\n additionalProps?: { [key: string]: any };\n};\n\nexport const renderIntlayerNode = <\n T, // Broadened to support arrays, numbers, objects, etc.\n>({\n children,\n value,\n additionalProps = {},\n}: RenderIntlayerNodeProps<T>): IntlayerNode<T> => {\n // If children is null or undefined, return a simple object with the value\n if (children == null) {\n return new Proxy({} as any, {\n get(target, prop, receiver) {\n if (prop === 'value') return value;\n if (prop === Symbol.toPrimitive) return () => value ?? '';\n if (prop === 'toString') return () => String(value ?? '');\n if (prop === 'valueOf') return () => value;\n\n // Additional Props take precedence\n if (additionalProps && prop in additionalProps) {\n return additionalProps[prop as keyof typeof additionalProps];\n }\n\n // Delegate native methods/properties to the underlying value\n if (\n value !== null &&\n value !== undefined &&\n typeof prop === 'string' &&\n prop !== 'constructor' &&\n !(prop in target)\n ) {\n const valObj = Object(value); // Safely boxes primitives (e.g., 50 -> Number object)\n if (prop in valObj) {\n const valProp = valObj[prop];\n return typeof valProp === 'function'\n ? valProp.bind(value)\n : valProp;\n }\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as IntlayerNode<T>;\n }\n\n // Proxy target must be an object or function; wrap primitives\n const target =\n typeof children === 'object' || typeof children === 'function'\n ? children\n : ({} as any);\n\n // Return a Proxy that pretends to be the original content\n // but also has a .value getter and additional props.\n return new Proxy(target, {\n apply(target, thisArg, argumentsList) {\n if (typeof value === 'function') {\n return Reflect.apply(value as Function, thisArg, argumentsList);\n }\n return Reflect.apply(target as Function, thisArg, argumentsList);\n },\n get(target, prop, receiver) {\n if (prop === 'value') return value;\n if (prop === Symbol.toPrimitive) return () => value ?? '';\n if (prop === 'toString') return () => String(value ?? '');\n if (prop === 'valueOf') return () => value;\n\n // Additional Props take precedence\n if (additionalProps && prop in additionalProps) {\n return additionalProps[prop as keyof typeof additionalProps];\n }\n\n // Delegate native methods/properties to the underlying value\n if (\n value !== null &&\n value !== undefined &&\n typeof prop === 'string' &&\n prop !== 'constructor' &&\n !(prop in target)\n ) {\n const valObj = Object(value); // Safely boxes primitives (e.g., 50 -> Number object)\n if (prop in valObj) {\n const valProp = valObj[prop];\n return typeof valProp === 'function' ? valProp.bind(value) : valProp;\n }\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as IntlayerNode<T>;\n};\n"],"mappings":";AAgBA,MAAa,sBAEX,EACA,UACA,OACA,kBAAkB,EAAE,OAC6B;AAEjD,KAAI,YAAY,KACd,QAAO,IAAI,MAAM,EAAE,EAAS,EAC1B,IAAI,QAAQ,MAAM,UAAU;AAC1B,MAAI,SAAS,QAAS,QAAO;AAC7B,MAAI,SAAS,OAAO,YAAa,cAAa,SAAS;AACvD,MAAI,SAAS,WAAY,cAAa,OAAO,SAAS,GAAG;AACzD,MAAI,SAAS,UAAW,cAAa;AAGrC,MAAI,mBAAmB,QAAQ,gBAC7B,QAAO,gBAAgB;AAIzB,MACE,UAAU,QACV,UAAU,UACV,OAAO,SAAS,YAChB,SAAS,iBACT,EAAE,QAAQ,SACV;GACA,MAAM,SAAS,OAAO,MAAM;AAC5B,OAAI,QAAQ,QAAQ;IAClB,MAAM,UAAU,OAAO;AACvB,WAAO,OAAO,YAAY,aACtB,QAAQ,KAAK,MAAM,GACnB;;;AAIR,SAAO,QAAQ,IAAI,QAAQ,MAAM,SAAS;IAE7C,CAAC;AAWJ,QAAO,IAAI,MANT,OAAO,aAAa,YAAY,OAAO,aAAa,aAChD,WACC,EAAE,EAIgB;EACvB,MAAM,QAAQ,SAAS,eAAe;AACpC,OAAI,OAAO,UAAU,WACnB,QAAO,QAAQ,MAAM,OAAmB,SAAS,cAAc;AAEjE,UAAO,QAAQ,MAAM,QAAoB,SAAS,cAAc;;EAElE,IAAI,QAAQ,MAAM,UAAU;AAC1B,OAAI,SAAS,QAAS,QAAO;AAC7B,OAAI,SAAS,OAAO,YAAa,cAAa,SAAS;AACvD,OAAI,SAAS,WAAY,cAAa,OAAO,SAAS,GAAG;AACzD,OAAI,SAAS,UAAW,cAAa;AAGrC,OAAI,mBAAmB,QAAQ,gBAC7B,QAAO,gBAAgB;AAIzB,OACE,UAAU,QACV,UAAU,UACV,OAAO,SAAS,YAChB,SAAS,iBACT,EAAE,QAAQ,SACV;IACA,MAAM,SAAS,OAAO,MAAM;AAC5B,QAAI,QAAQ,QAAQ;KAClB,MAAM,UAAU,OAAO;AACvB,YAAO,OAAO,YAAY,aAAa,QAAQ,KAAK,MAAM,GAAG;;;AAIjE,UAAO,QAAQ,IAAI,QAAQ,MAAM,SAAS;;EAE7C,CAAC"}
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, AdditionalProps = {}> = ResolvedEditor<\n T,\n any\n> & {\n value: T;\n} & AdditionalProps &\n T;\n\ntype RenderIntlayerNodeProps<T> = {\n value: T;\n children: any;\n additionalProps?: { [key: string]: any };\n};\n\nexport const renderIntlayerNode = <\n T, // Broadened to support arrays, numbers, objects, etc.\n>({\n children,\n value,\n additionalProps = {},\n}: RenderIntlayerNodeProps<T>): IntlayerNode<T> => {\n // If children is null or undefined, return a simple object with the value\n if (children == null) {\n return new Proxy({} as any, {\n get(target, prop, receiver) {\n if (prop === 'value') return value;\n if (prop === Symbol.toPrimitive) return () => value ?? '';\n if (prop === 'toString') return () => String(value ?? '');\n if (prop === 'valueOf') return () => value;\n\n // Additional Props take precedence\n if (additionalProps && prop in additionalProps) {\n return additionalProps[prop as keyof typeof additionalProps];\n }\n\n // Delegate native methods/properties to the underlying value\n if (\n value !== null &&\n value !== undefined &&\n typeof prop === 'string' &&\n prop !== 'constructor' &&\n !(prop in target)\n ) {\n const valObj = Object(value); // Safely boxes primitives (e.g., 50 -> Number object)\n if (prop in valObj) {\n const valProp = valObj[prop];\n return typeof valProp === 'function'\n ? valProp.bind(value)\n : valProp;\n }\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as IntlayerNode<T>;\n }\n\n // Proxy target must be an object or function; wrap primitives\n const target =\n typeof children === 'object' || typeof children === 'function'\n ? children\n : ({} as any);\n\n // Return a Proxy that pretends to be the original content\n // but also has a .value getter and additional props.\n return new Proxy(target, {\n apply(target, thisArg, argumentsList) {\n if (typeof value === 'function') {\n return Reflect.apply(value as Function, thisArg, argumentsList);\n }\n return Reflect.apply(target as Function, thisArg, argumentsList);\n },\n get(target, prop, receiver) {\n if (prop === 'value') return value;\n if (prop === Symbol.toPrimitive) return () => value ?? '';\n if (prop === 'toString') return () => String(value ?? '');\n if (prop === 'valueOf') return () => value;\n\n // Additional Props take precedence\n if (additionalProps && prop in additionalProps) {\n return additionalProps[prop as keyof typeof additionalProps];\n }\n\n // Delegate native methods/properties to the underlying value\n if (\n value !== null &&\n value !== undefined &&\n typeof prop === 'string' &&\n prop !== 'constructor' &&\n !(prop in target)\n ) {\n const valObj = Object(value); // Safely boxes primitives (e.g., 50 -> Number object)\n if (prop in valObj) {\n const valProp = valObj[prop];\n return typeof valProp === 'function' ? valProp.bind(value) : valProp;\n }\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as IntlayerNode<T>;\n};\n"],"mappings":";AAgBA,MAAa,sBAEX,EACA,UACA,OACA,kBAAkB,CAAC,QAC8B;CAEjD,IAAI,YAAY,MACd,OAAO,IAAI,MAAM,CAAC,GAAU,EAC1B,IAAI,QAAQ,MAAM,UAAU;EAC1B,IAAI,SAAS,SAAS,OAAO;EAC7B,IAAI,SAAS,OAAO,aAAa,aAAa,SAAS;EACvD,IAAI,SAAS,YAAY,aAAa,OAAO,SAAS,EAAE;EACxD,IAAI,SAAS,WAAW,aAAa;EAGrC,IAAI,mBAAmB,QAAQ,iBAC7B,OAAO,gBAAgB;EAIzB,IACE,UAAU,QACV,UAAU,UACV,OAAO,SAAS,YAChB,SAAS,iBACT,EAAE,QAAQ,SACV;GACA,MAAM,SAAS,OAAO,KAAK;GAC3B,IAAI,QAAQ,QAAQ;IAClB,MAAM,UAAU,OAAO;IACvB,OAAO,OAAO,YAAY,aACtB,QAAQ,KAAK,KAAK,IAClB;GACN;EACF;EAEA,OAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;CAC3C,EACF,CAAC;CAWH,OAAO,IAAI,MANT,OAAO,aAAa,YAAY,OAAO,aAAa,aAChD,WACC,CAAC,GAIiB;EACvB,MAAM,QAAQ,SAAS,eAAe;GACpC,IAAI,OAAO,UAAU,YACnB,OAAO,QAAQ,MAAM,OAAmB,SAAS,aAAa;GAEhE,OAAO,QAAQ,MAAM,QAAoB,SAAS,aAAa;EACjE;EACA,IAAI,QAAQ,MAAM,UAAU;GAC1B,IAAI,SAAS,SAAS,OAAO;GAC7B,IAAI,SAAS,OAAO,aAAa,aAAa,SAAS;GACvD,IAAI,SAAS,YAAY,aAAa,OAAO,SAAS,EAAE;GACxD,IAAI,SAAS,WAAW,aAAa;GAGrC,IAAI,mBAAmB,QAAQ,iBAC7B,OAAO,gBAAgB;GAIzB,IACE,UAAU,QACV,UAAU,UACV,OAAO,SAAS,YAChB,SAAS,iBACT,EAAE,QAAQ,SACV;IACA,MAAM,SAAS,OAAO,KAAK;IAC3B,IAAI,QAAQ,QAAQ;KAClB,MAAM,UAAU,OAAO;KACvB,OAAO,OAAO,YAAY,aAAa,QAAQ,KAAK,KAAK,IAAI;IAC/D;GACF;GAEA,OAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;EAC3C;CACF,CAAC;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"mergeConfig.mjs","names":[],"sources":["../../../src/webpack/mergeConfig.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { resolve } from 'node:path';\nimport { getConfiguration } from '@intlayer/config/node';\nimport { getAlias } from '@intlayer/config/utils';\nimport { IntlayerPlugin } from '@intlayer/webpack'; // adjust path if needed\nimport { defu } from 'defu';\n\nconst _require =\n typeof require !== 'undefined' ? require : createRequire(import.meta.url);\nexport const mergeConfig = (\n baseConfig: import('webpack').Configuration\n): import('webpack').Configuration => {\n const intlayerConfig = getConfiguration();\n\n const config = {\n resolve: {\n alias: getAlias({\n configuration: intlayerConfig,\n formatter: (value: string) => resolve(value), // get absolute path\n }),\n },\n externals: {\n esbuild: 'esbuild',\n module: 'module',\n fs: 'fs',\n chokidar: 'chokidar',\n fsevents: 'fsevents',\n },\n module: {\n rules: [\n {\n test: /\\.node$/,\n loader: 'node-loader',\n },\n\n // Fix `import _48DQ2FD8DPGT8SPgqAmt from '../dictionary/app.json' with { type: 'json' };` syntax\n {\n test: /\\.mjs$/,\n include: [/[\\\\/]\\.intlayer[\\\\/]/],\n type: 'javascript/auto',\n enforce: 'pre',\n use: {\n loader: _require.resolve('babel-loader'),\n options: {\n presets: [\n [\n _require.resolve('@babel/preset-env'),\n { modules: 'commonjs' },\n ],\n ],\n plugins: [\n [\n _require.resolve('@babel/plugin-syntax-import-attributes'),\n { deprecatedAssert: true },\n ],\n ],\n },\n },\n },\n ],\n },\n plugins: [new IntlayerPlugin(intlayerConfig)],\n };\n\n return defu(config, baseConfig) as import('webpack').Configuration;\n};\n"],"mappings":";;;;;;;;;AAOA,MAAM,WACJ,qBAAmB,0BAAwB,cAAc,OAAO,KAAK,IAAI;AAC3E,MAAa,eACX,eACoC;CACpC,MAAM,iBAAiB,kBAAkB;AAoDzC,QAAO,KAAK;EAjDV,SAAS,EACP,OAAO,SAAS;GACd,eAAe;GACf,YAAY,UAAkB,QAAQ,MAAM;GAC7C,CAAC,EACH;EACD,WAAW;GACT,SAAS;GACT,QAAQ;GACR,IAAI;GACJ,UAAU;GACV,UAAU;GACX;EACD,QAAQ,EACN,OAAO,CACL;GACE,MAAM;GACN,QAAQ;GACT,EAGD;GACE,MAAM;GACN,SAAS,CAAC,uBAAuB;GACjC,MAAM;GACN,SAAS;GACT,KAAK;IACH,QAAQ,SAAS,QAAQ,eAAe;IACxC,SAAS;KACP,SAAS,CACP,CACE,SAAS,QAAQ,oBAAoB,EACrC,EAAE,SAAS,YAAY,CACxB,CACF;KACD,SAAS,CACP,CACE,SAAS,QAAQ,yCAAyC,EAC1D,EAAE,kBAAkB,MAAM,CAC3B,CACF;KACF;IACF;GACF,CACF,EACF;EACD,SAAS,CAAC,IAAI,eAAe,eAAe,CAAC;EAG7B,EAAE,WAAW"}
1
+ {"version":3,"file":"mergeConfig.mjs","names":[],"sources":["../../../src/webpack/mergeConfig.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { resolve } from 'node:path';\nimport { getConfiguration } from '@intlayer/config/node';\nimport { getAlias } from '@intlayer/config/utils';\nimport { IntlayerPlugin } from '@intlayer/webpack'; // adjust path if needed\nimport { defu } from 'defu';\n\nconst _require =\n typeof require !== 'undefined' ? require : createRequire(import.meta.url);\nexport const mergeConfig = (\n baseConfig: import('webpack').Configuration\n): import('webpack').Configuration => {\n const intlayerConfig = getConfiguration();\n\n const config = {\n resolve: {\n alias: getAlias({\n configuration: intlayerConfig,\n formatter: (value: string) => resolve(value), // get absolute path\n }),\n },\n externals: {\n esbuild: 'esbuild',\n module: 'module',\n fs: 'fs',\n chokidar: 'chokidar',\n fsevents: 'fsevents',\n },\n module: {\n rules: [\n {\n test: /\\.node$/,\n loader: 'node-loader',\n },\n\n // Fix `import _48DQ2FD8DPGT8SPgqAmt from '../dictionary/app.json' with { type: 'json' };` syntax\n {\n test: /\\.mjs$/,\n include: [/[\\\\/]\\.intlayer[\\\\/]/],\n type: 'javascript/auto',\n enforce: 'pre',\n use: {\n loader: _require.resolve('babel-loader'),\n options: {\n presets: [\n [\n _require.resolve('@babel/preset-env'),\n { modules: 'commonjs' },\n ],\n ],\n plugins: [\n [\n _require.resolve('@babel/plugin-syntax-import-attributes'),\n { deprecatedAssert: true },\n ],\n ],\n },\n },\n },\n ],\n },\n plugins: [new IntlayerPlugin(intlayerConfig)],\n };\n\n return defu(config, baseConfig) as import('webpack').Configuration;\n};\n"],"mappings":";;;;;;;;;AAOA,MAAM,WACJ,qBAAmB,0BAAwB,cAAc,OAAO,KAAK,GAAG;AAC1E,MAAa,eACX,eACoC;CACpC,MAAM,iBAAiB,iBAAiB;CAoDxC,OAAO,KAAK;EAjDV,SAAS,EACP,OAAO,SAAS;GACd,eAAe;GACf,YAAY,UAAkB,QAAQ,KAAK;EAC7C,CAAC,EACH;EACA,WAAW;GACT,SAAS;GACT,QAAQ;GACR,IAAI;GACJ,UAAU;GACV,UAAU;EACZ;EACA,QAAQ,EACN,OAAO,CACL;GACE,MAAM;GACN,QAAQ;EACV,GAGA;GACE,MAAM;GACN,SAAS,CAAC,sBAAsB;GAChC,MAAM;GACN,SAAS;GACT,KAAK;IACH,QAAQ,SAAS,QAAQ,cAAc;IACvC,SAAS;KACP,SAAS,CACP,CACE,SAAS,QAAQ,mBAAmB,GACpC,EAAE,SAAS,WAAW,CACxB,CACF;KACA,SAAS,CACP,CACE,SAAS,QAAQ,wCAAwC,GACzD,EAAE,kBAAkB,KAAK,CAC3B,CACF;IACF;GACF;EACF,CACF,EACF;EACA,SAAS,CAAC,IAAI,eAAe,cAAc,CAAC;CAG7B,GAAG,UAAU;AAChC"}
@@ -1,5 +1,4 @@
1
1
  import { OnChanges, SimpleChanges } from "@angular/core";
2
-
3
2
  //#region src/UI/IntlayerNode.component.d.ts
4
3
  /**
5
4
  * A transparent host element that renders Intlayer content nodes.
@@ -1 +1 @@
1
- {"version":3,"file":"IntlayerNode.component.d.ts","names":[],"sources":["../../../src/UI/IntlayerNode.component.ts"],"mappings":";;;;;AAyBA;;;;;;;;;;;cASa,qBAAA,YAAiC,SAAA;EACnC,IAAA;EAAA,QAED,GAAA;EAAA,QACA,KAAA;EAAA,QACA,GAAA;EAER,WAAA,CAAY,OAAA,EAAS,aAAA;EAAA,QAMb,MAAA;AAAA"}
1
+ {"version":3,"file":"IntlayerNode.component.d.ts","names":[],"sources":["../../../src/UI/IntlayerNode.component.ts"],"mappings":";;;;;;;;;;;;;;;cAkCa,iCAAiC;EACnC;UAED;UACA;UACA;EAER,YAAY,SAAS;UAMb"}
@@ -0,0 +1,32 @@
1
+ import { KeyPath } from "@intlayer/types/keyPath";
2
+ //#region src/analytics/exposureSink.d.ts
3
+ /**
4
+ * Node metadata reported for a content exposure. Kept dependency-free (types
5
+ * only) so the interpreter hot path in `plugins.ts` never statically imports
6
+ * `@intlayer/analytics` — the package stays optional and tree-shakeable.
7
+ */
8
+ type ExposureInput = {
9
+ dictionaryKey: string;
10
+ keyPath: KeyPath[];
11
+ locale?: string;
12
+ nodeType?: string;
13
+ };
14
+ /** Consumer of exposure reports, installed by `useAnalytics` after init. */
15
+ type ExposureSink = (input: ExposureInput) => void;
16
+ /**
17
+ * Installs (or clears) the exposure sink. `useAnalytics` sets this once the
18
+ * analytics client has loaded, and clears it on unmount.
19
+ *
20
+ * @param next - The sink to install, or `null` to clear.
21
+ */
22
+ declare const setExposureSink: (next: ExposureSink | null) => void;
23
+ /**
24
+ * Forwards a content exposure to the installed sink. A cheap null-check when
25
+ * analytics is not running, so it is safe to call from every node resolution.
26
+ *
27
+ * @param input - The node metadata to report.
28
+ */
29
+ declare const reportExposure: (input: ExposureInput) => void;
30
+ //#endregion
31
+ export { ExposureInput, ExposureSink, reportExposure, setExposureSink };
32
+ //# sourceMappingURL=exposureSink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exposureSink.d.ts","names":[],"sources":["../../../src/analytics/exposureSink.ts"],"mappings":";;;;;;;KAOY;EACV;EACA,SAAS;EACT;EACA;;;KAIU,gBAAgB,OAAO;;;;;;;cAUtB,kBAAe,MAAU;;;;;;;cAUzB,iBAAc,OAAW"}
@@ -0,0 +1,4 @@
1
+ import { provideIntlayerAnalytics, useAnalytics } from "./useAnalytics.js";
2
+ import { ConversionParams, useConversion } from "./useConversion.js";
3
+ import { ExperimentState, useExperiment } from "./useExperiment.js";
4
+ export { ConversionParams, ExperimentState, provideIntlayerAnalytics, useAnalytics, useConversion, useExperiment };
@@ -0,0 +1,36 @@
1
+ import { IntlayerProvider } from "../client/intlayerToken.js";
2
+ //#region src/analytics/useAnalytics.d.ts
3
+ /**
4
+ * Initializes the Intlayer analytics client singleton when analytics is
5
+ * enabled (mirrors {@link useEditor}). Records an initial page view, keeps the
6
+ * client aware of the current locale, and wires node-level content exposures.
7
+ *
8
+ * Must be called inside an Angular injection context (e.g. a component
9
+ * constructor, `provideAppInitializer`, or `runInInjectionContext`).
10
+ *
11
+ * @param client - The IntlayerProvider instance to sync locale from.
12
+ * When omitted the function injects `INTLAYER_TOKEN` from the DI tree,
13
+ * so it still works when called directly from a component.
14
+ */
15
+ declare const useAnalytics: (client?: IntlayerProvider | null) => void;
16
+ /**
17
+ * Angular provider that wires `useAnalytics` into the application
18
+ * initialisation phase via `provideAppInitializer`.
19
+ *
20
+ * `provideIntlayer()` already calls this internally, so you only need this
21
+ * function when you want to manage providers individually.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * // app.config.ts
26
+ * import { provideIntlayer, provideIntlayerAnalytics } from 'angular-intlayer';
27
+ *
28
+ * export const appConfig: ApplicationConfig = {
29
+ * providers: [provideIntlayer(), provideIntlayerAnalytics()],
30
+ * };
31
+ * ```
32
+ */
33
+ declare const provideIntlayerAnalytics: (client?: IntlayerProvider | null) => import("@angular/core").EnvironmentProviders;
34
+ //#endregion
35
+ export { provideIntlayerAnalytics, useAnalytics };
36
+ //# sourceMappingURL=useAnalytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAnalytics.d.ts","names":[],"sources":["../../../src/analytics/useAnalytics.ts"],"mappings":";;;;;;;;;;;;;;cA4Ba,eAAY,SAAa;;;;;;;;;;;;;;;;;;cAkGzB,2BAAwB,SAAa,oDAAuB"}
@@ -0,0 +1,38 @@
1
+ //#region src/analytics/useConversion.d.ts
2
+ /**
3
+ * Parameters describing a conversion to record.
4
+ */
5
+ type ConversionParams = {
6
+ /** The experiment this conversion is attributed to. */
7
+ experimentKey: string;
8
+ /** The variant the session was assigned. */
9
+ variant: string;
10
+ /** The goal reached (e.g. `"signup"`, `"cta_click"`). */
11
+ goal: string;
12
+ /** Optional numeric value (e.g. revenue). */
13
+ value?: number;
14
+ };
15
+ /**
16
+ * Returns a `trackConversion` callback for content A/B testing. Safe to call
17
+ * from any component: it resolves to a no-op when analytics is disabled or the
18
+ * client has not been initialized yet.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * export class CtaComponent {
23
+ * trackConversion = useConversion();
24
+ *
25
+ * onClick() {
26
+ * this.trackConversion({
27
+ * experimentKey: 'homepage-hero',
28
+ * variant: 'b',
29
+ * goal: 'cta_click',
30
+ * });
31
+ * }
32
+ * }
33
+ * ```
34
+ */
35
+ declare const useConversion: () => (params: ConversionParams) => void;
36
+ //#endregion
37
+ export { ConversionParams, useConversion };
38
+ //# sourceMappingURL=useConversion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConversion.d.ts","names":[],"sources":["../../../src/analytics/useConversion.ts"],"mappings":";;;;KAKY;;EAEV;;EAEA;;EAEA;;EAEA;;;;;;;;;;;;;;;;;;;;;;cAuBW,sBAAa,QACR"}
@@ -0,0 +1,47 @@
1
+ import { Signal } from "@angular/core";
2
+ //#region src/analytics/useExperiment.d.ts
3
+ /**
4
+ * The state of an A/B experiment for the current session.
5
+ */
6
+ type ExperimentState = {
7
+ /**
8
+ * The variant assigned to this session. Until assignment resolves (and on
9
+ * the server, or when analytics is disabled), this is the first variant —
10
+ * treat the first variant as the control.
11
+ */
12
+ variant: Signal<string>;
13
+ /**
14
+ * `true` once the variant has been deterministically assigned and its
15
+ * exposure recorded. Useful to defer rendering when a flash of the control
16
+ * variant is not acceptable.
17
+ */
18
+ isAssigned: Signal<boolean>;
19
+ };
20
+ /**
21
+ * Assigns this session to a variant of an A/B experiment and records the
22
+ * exposure, scoped to `experimentKey`, so the backend can compute per-variant
23
+ * conversion rates against `useConversion` events.
24
+ *
25
+ * Assignment is deterministic per session (no server round-trip, stable across
26
+ * re-mounts). The exposure is recorded once per call.
27
+ *
28
+ * Must be called inside an Angular injection context (e.g. a component
29
+ * constructor or field initializer).
30
+ *
31
+ * @param experimentKey - Unique key identifying the experiment.
32
+ * @param variants - The candidate variant names; the first one is the control.
33
+ * @param weights - Optional relative weights, one per variant (e.g. `[9, 1]`).
34
+ * @returns The {@link ExperimentState} for this session.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * export class HeroComponent {
39
+ * experiment = useExperiment('homepage-hero', ['a', 'b']);
40
+ * content = useIntlayer('hero');
41
+ * }
42
+ * ```
43
+ */
44
+ declare const useExperiment: (experimentKey: string, variants: string[], weights?: number[]) => ExperimentState;
45
+ //#endregion
46
+ export { ExperimentState, useExperiment };
47
+ //# sourceMappingURL=useExperiment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useExperiment.d.ts","names":[],"sources":["../../../src/analytics/useExperiment.ts"],"mappings":";;;;;KAMY;;;;;;EAMV,SAAS;;;;;;EAMT,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;cA2BD,gBAAa,uBACH,oBACH,uBAEjB"}
@@ -1,7 +1,5 @@
1
1
  import { INTLAYER_TOKEN, IntlayerProvider, createIntlayerClient } from "./intlayerToken.js";
2
- import * as _$_angular_core0 from "@angular/core";
3
2
  import { LocalesValues } from "@intlayer/types/module_augmentation";
4
-
5
3
  //#region src/client/installIntlayer.d.ts
6
4
  /**
7
5
  * Provides Intlayer to your Angular application.
@@ -26,8 +24,8 @@ import { LocalesValues } from "@intlayer/types/module_augmentation";
26
24
  * };
27
25
  * ```
28
26
  */
29
- declare const provideIntlayer: (locale?: LocalesValues, isCookieEnabled?: boolean) => (_$_angular_core0.EnvironmentProviders | {
30
- provide: _$_angular_core0.InjectionToken<IntlayerProvider>;
27
+ declare const provideIntlayer: (locale?: LocalesValues, isCookieEnabled?: boolean) => (import("@angular/core").EnvironmentProviders | {
28
+ provide: import("@angular/core").InjectionToken<IntlayerProvider>;
31
29
  useValue: IntlayerProvider;
32
30
  })[];
33
31
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"installIntlayer.d.ts","names":[],"sources":["../../../src/client/installIntlayer.ts"],"mappings":";;;;;;;AAiCA;;;;;;;;;;;;;;;;;;;;;cAAa,eAAA,GACX,MAAA,GAAS,aAAA,EACT,eAAA,gBADsB,gBAAA,CACA,oBAAA;;;;;;;cAaX,eAAA,GACX,MAAA,GAAS,aAAA,EACT,eAAA,eAAsB,gBAAA"}
1
+ {"version":3,"file":"installIntlayer.d.ts","names":[],"sources":["../../../src/client/installIntlayer.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;cAkCa,kBAAe,SACjB,eAAa,uDAAA;;;;;;;cAeX,kBAAe,SACjB,eAAa,8BAAA"}
@@ -1,10 +1,8 @@
1
- import * as _$_angular_core0 from "@angular/core";
2
1
  import { InjectionToken, Signal } from "@angular/core";
3
2
  import { LocalesValues } from "@intlayer/types/module_augmentation";
4
-
5
3
  //#region src/client/intlayerToken.d.ts
6
4
  declare class IntlayerProvider {
7
- isCookieEnabled: _$_angular_core0.WritableSignal<boolean>;
5
+ isCookieEnabled: import("@angular/core").WritableSignal<boolean>;
8
6
  private _locale;
9
7
  readonly locale: Signal<LocalesValues>;
10
8
  constructor();
@@ -1 +1 @@
1
- {"version":3,"file":"intlayerToken.d.ts","names":[],"sources":["../../../src/client/intlayerToken.ts"],"mappings":";;;;;cAKa,gBAAA;EACX,eAAA,EAD2B,gBAAA,CACZ,cAAA;EAAA,QACP,OAAA;EAAA,SAIC,MAAA,EAAQ,MAAA,CAAO,aAAA;;EAMxB,SAAA,GAAa,MAAA,EAAQ,aAAA;AAAA;AAAA,cAKV,cAAA,EAAc,cAAA,CAAA,gBAAA;;;;cAUd,oBAAA,GACX,MAAA,GAAS,aAAA,EACT,eAAA,eACC,gBAAA"}
1
+ {"version":3,"file":"intlayerToken.d.ts","names":[],"sources":["../../../src/client/intlayerToken.ts"],"mappings":";;;cAKa;EACX,yCAAe;UACP;WAIC,QAAQ,OAAO;EAExB;EAIA,YAAS,QAAY;;cAKV,gBAAc,eAAA;;;;cAUd,uBAAoB,SACtB,eAAa,8BAErB"}
@@ -2,7 +2,6 @@ import { DeepTransformContent } from "../plugins.js";
2
2
  import { Signal } from "@angular/core";
3
3
  import { DeclaredLocales, ExtractSelectorLocale, LocalesValues } from "@intlayer/types/module_augmentation";
4
4
  import { Dictionary, DictionarySelectorForGroup, QualifiedDictionaryGroup, ResolveQualifiedDictionaryContent } from "@intlayer/types/dictionary";
5
-
6
5
  //#region src/client/useDictionary.d.ts
7
6
  /**
8
7
  * Angular hook that transforms a dictionary (or qualified dictionary group)
@@ -1 +1 @@
1
- {"version":3,"file":"useDictionary.d.ts","names":[],"sources":["../../../src/client/useDictionary.ts"],"mappings":";;;;;;;;AAqBA;;cAAa,aAAA,mBACK,UAAA,GAAa,wBAAA,kBAEzB,aAAA,GACA,0BAAA,CAA2B,CAAA,IAAK,eAAA,EAEpC,UAAA,EAAY,CAAA,EACZ,gBAAA,GAAmB,CAAA,KAClB,MAAA,CACD,oBAAA,CACE,iCAAA,CAAkC,CAAA,EAAG,CAAA,GACrC,qBAAA,CAAsB,CAAA"}
1
+ {"version":3,"file":"useDictionary.d.ts","names":[],"sources":["../../../src/client/useDictionary.ts"],"mappings":";;;;;;;;;cAqBa,sBACL,UAAU,aAAa,gCACvB,UACF,gBACA,2BAA2B,KAAK,iBAAe,YAEvC,GAAC,mBACM,MAClB,OACD,qBACE,kCAAkC,GAAG,IACrC,sBAAsB"}
@@ -1,14 +1,12 @@
1
- import * as _$_angular_core0 from "@angular/core";
2
1
  import { LocalesValues, StrictModeLocaleMap } from "@intlayer/types/module_augmentation";
3
2
  import { Dictionary } from "@intlayer/types/dictionary";
4
-
5
3
  //#region src/client/useDictionaryAsync.d.ts
6
4
  /**
7
5
  * On the server side, Hook that transform a dictionary and return the content
8
6
  *
9
7
  * If the locale is not provided, it will use the locale from the client context
10
8
  */
11
- declare const useDictionaryAsync: <const T extends Dictionary>(dictionaryPromise: StrictModeLocaleMap<() => Promise<T>>, locale?: LocalesValues) => Promise<_$_angular_core0.Signal<unknown>>;
9
+ declare const useDictionaryAsync: <const T extends Dictionary>(dictionaryPromise: StrictModeLocaleMap<() => Promise<T>>, locale?: LocalesValues) => Promise<import("@angular/core").Signal<unknown>>;
12
10
  //#endregion
13
11
  export { useDictionaryAsync };
14
12
  //# sourceMappingURL=useDictionaryAsync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDictionaryAsync.d.ts","names":[],"sources":["../../../src/client/useDictionaryAsync.ts"],"mappings":";;;;;;;;AAiBA;;cAAa,kBAAA,mBAA4C,UAAA,EACvD,iBAAA,EAAmB,mBAAA,OAA0B,OAAA,CAAQ,CAAA,IACrD,MAAA,GAAS,aAAA,KAAa,OAAA,CAAA,gBAAA,CAAA,MAAA"}
1
+ {"version":3,"file":"useDictionaryAsync.d.ts","names":[],"sources":["../../../src/client/useDictionaryAsync.ts"],"mappings":";;;;;;;;cAiBa,2BAAkC,UAAU,YAAU,mBAC9C,0BAA0B,QAAQ,KAAG,SAC/C,kBAAa,gCAAA"}
@@ -1,8 +1,6 @@
1
- import * as _$_angular_core0 from "@angular/core";
2
1
  import { DictionaryKeys, DictionarySelectorForKey, LocalesValues, StrictModeLocaleMap } from "@intlayer/types/module_augmentation";
3
2
  import { Dictionary } from "@intlayer/types/dictionary";
4
3
  import { QualifiedDynamicLoaderMap } from "@intlayer/core/dictionaryManipulator";
5
-
6
4
  //#region src/client/useDictionaryDynamic.d.ts
7
5
  /**
8
6
  * Lazily loads a dictionary (plain or qualified) and returns its reactive
@@ -15,7 +13,7 @@ import { QualifiedDynamicLoaderMap } from "@intlayer/core/dictionaryManipulator"
15
13
  * If the locale is not provided (directly or through the selector), it will use
16
14
  * the locale from the client context.
17
15
  */
18
- declare const useDictionaryDynamic: <const T extends Dictionary, const K extends DictionaryKeys, const A extends LocalesValues | DictionarySelectorForKey<K> = LocalesValues>(dictionaryPromise: StrictModeLocaleMap<() => Promise<T>> | QualifiedDynamicLoaderMap, key: K, localeOrSelector?: A) => _$_angular_core0.Signal<any>;
16
+ declare const useDictionaryDynamic: <const T extends Dictionary, const K extends DictionaryKeys, const A extends LocalesValues | DictionarySelectorForKey<K> = LocalesValues>(dictionaryPromise: StrictModeLocaleMap<() => Promise<T>> | QualifiedDynamicLoaderMap, key: K, localeOrSelector?: A) => import("@angular/core").Signal<any>;
19
17
  //#endregion
20
18
  export { useDictionaryDynamic };
21
19
  //# sourceMappingURL=useDictionaryDynamic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDictionaryDynamic.d.ts","names":[],"sources":["../../../src/client/useDictionaryDynamic.ts"],"mappings":";;;;;;;;;AAiCA;;;;;;;;cAAa,oBAAA,mBACK,UAAA,kBACA,cAAA,kBACA,aAAA,GAAgB,wBAAA,CAAyB,CAAA,IAAK,aAAA,EAE9D,iBAAA,EACI,mBAAA,OAA0B,OAAA,CAAQ,CAAA,KAClC,yBAAA,EACJ,GAAA,EAAK,CAAA,EACL,gBAAA,GAAmB,CAAA,KAAC,gBAAA,CAAA,MAAA"}
1
+ {"version":3,"file":"useDictionaryDynamic.d.ts","names":[],"sources":["../../../src/client/useDictionaryDynamic.ts"],"mappings":";;;;;;;;;;;;;;;cAiCa,6BACL,UAAU,kBACV,UAAU,sBACV,UAAU,gBAAgB,yBAAyB,KAAK,eAAa,mBAGvE,0BAA0B,QAAQ,MAClC,2BAAyB,KACxB,GAAC,mBACa,8BAAC"}
@@ -1,7 +1,6 @@
1
1
  import { DeepTransformContent } from "../plugins.js";
2
2
  import { Signal } from "@angular/core";
3
3
  import { DeclaredLocales, DictionaryKeys, DictionaryRegistryResult, DictionarySelectorForKey, ExtractSelectorLocale, LocalesValues } from "@intlayer/types/module_augmentation";
4
-
5
4
  //#region src/client/useIntlayer.d.ts
6
5
  /** guard utility - true only for objects generated by `renderIntlayerNode()` */
7
6
  declare const isUpdatableNode: (val: unknown) => val is {
@@ -1 +1 @@
1
- {"version":3,"file":"useIntlayer.d.ts","names":[],"sources":["../../../src/client/useIntlayer.ts"],"mappings":";;;;;;cAea,eAAA,GACX,GAAA,cACC,GAAA;EAAS,QAAA,GAAW,CAAA;AAAA;;;;;;;;;AA8BvB;;;;;;;;;;;;;;;;;cAAa,WAAA,mBACK,cAAA,kBACA,aAAA,GAAgB,wBAAA,CAAyB,CAAA,IAAK,eAAA,EAE9D,GAAA,EAAK,CAAA,EACL,gBAAA,GAAmB,CAAA,KAClB,MAAA,CACD,oBAAA,CAAqB,wBAAA,CAAyB,CAAA,EAAG,CAAA,GAAI,qBAAA,CAAsB,CAAA"}
1
+ {"version":3,"file":"useIntlayer.d.ts","names":[],"sources":["../../../src/client/useIntlayer.ts"],"mappings":";;;;;cAea,kBAAe,iBAEzB;EAAS,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;cA8BV,oBACL,UAAU,sBACV,UAAU,gBAAgB,yBAAyB,KAAK,iBAAe,KAExE,GAAC,mBACa,MAClB,OACD,qBAAqB,yBAAyB,GAAG,IAAI,sBAAsB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useLoadDynamic.d.ts","names":[],"sources":["../../../src/client/useLoadDynamic.ts"],"mappings":";;AAQA;;;;;cAAa,cAAA,aAA4B,MAAA,eACvC,GAAA,UACA,OAAA,EAAS,OAAA,CAAQ,CAAA,MAChB,CAAA"}
1
+ {"version":3,"file":"useLoadDynamic.d.ts","names":[],"sources":["../../../src/client/useLoadDynamic.ts"],"mappings":";;;;;;;cAQa,iBAAkB,UAAU,qBAAmB,aAC/C,SACF,QAAQ,OAChB"}
@@ -1,6 +1,5 @@
1
1
  import { Signal } from "@angular/core";
2
2
  import { DeclaredLocales, LocalesValues } from "@intlayer/types/module_augmentation";
3
-
4
3
  //#region src/client/useLocale.d.ts
5
4
  type UseLocaleProps = {
6
5
  isCookieEnabled?: boolean;
@@ -39,10 +38,7 @@ type UseLocaleResult = {
39
38
  * }
40
39
  * ```
41
40
  */
42
- declare const useLocale: ({
43
- isCookieEnabled,
44
- onLocaleChange
45
- }?: UseLocaleProps) => UseLocaleResult;
41
+ declare const useLocale: ({ isCookieEnabled, onLocaleChange }?: UseLocaleProps) => UseLocaleResult;
46
42
  //#endregion
47
43
  export { UseLocaleProps, UseLocaleResult, useLocale };
48
44
  //# sourceMappingURL=useLocale.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useLocale.d.ts","names":[],"sources":["../../../src/client/useLocale.ts"],"mappings":";;;;KASY,cAAA;EACV,eAAA;EACA,cAAA,IAAkB,MAAA,EAAQ,eAAA;AAAA;AAAA,KAGhB,eAAA;EACV,MAAA,EAAQ,MAAA,CAAO,eAAA;EACf,aAAA,EAAe,eAAA;EACf,gBAAA,EAAkB,eAAA;EAClB,SAAA,GAAY,MAAA,EAAQ,aAAA;AAAA;;;AAJtB;;;;;;;;;;;;;;;;;;;;;;AAkCA;;;cAAa,SAAA;EAAa,eAAA;EAAA;AAAA,IAGvB,cAAA,KAAsB,eAAA"}
1
+ {"version":3,"file":"useLocale.d.ts","names":[],"sources":["../../../src/client/useLocale.ts"],"mappings":";;;KASY;EACV;EACA,kBAAkB,QAAQ;;KAGhB;EACV,QAAQ,OAAO;EACf,eAAe;EACf,kBAAkB;EAClB,YAAY,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA8BT,cAAS,iBAAA,mBAGnB,mBAAsB"}