UNPKG

react-intlayer

Version:

Easily internationalize i18n your React applications with type-safe multilingual content management.

243 lines (241 loc) 11.7 kB
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); const require_runtime = require('./_virtual/_rolldown/runtime.cjs'); const require_client_useLoadDynamic = require('./client/useLoadDynamic.cjs'); const require_editor_ContentSelector = require('./editor/ContentSelector.cjs'); const require_IntlayerNode = require('./IntlayerNode.cjs'); const require_reactElement_renderReactElement = require('./reactElement/renderReactElement.cjs'); let _intlayer_config_built = require("@intlayer/config/built"); let _intlayer_core_interpreter = require("@intlayer/core/interpreter"); let _intlayer_core_markdown = require("@intlayer/core/markdown"); let _intlayer_types_nodeType = require("@intlayer/types/nodeType"); _intlayer_types_nodeType = require_runtime.__toESM(_intlayer_types_nodeType); let react = require("react"); let react_jsx_runtime = require("react/jsx-runtime"); //#region src/plugins.tsx const markdownRendererModulePromise = process.env["INTLAYER_NODE_TYPE_MARKDOWN"] !== "false" ? Promise.resolve().then(() => require("./markdown/MarkdownRendererPlugin.cjs")).then((m) => m.MarkdownRendererPlugin) : null; const htmlRendererModulePromise = process.env["INTLAYER_NODE_TYPE_HTML"] !== "false" ? Promise.resolve().then(() => require("./html/HTMLRendererPlugin.cjs")).then((m) => m.HTMLRendererPlugin) : null; /** Translation plugin. Replaces node with a locale string if nodeType = Translation. */ const intlayerNodePlugins = { id: "intlayer-node-plugin", canHandle: (node) => typeof node === "bigint" || typeof node === "string" || typeof node === "number", transform: (_node, { plugins, ...rest }) => require_IntlayerNode.renderIntlayerNode({ ...rest, value: rest.children, children: process.env["INTLAYER_EDITOR_ENABLED"] !== "false" && _intlayer_config_built.editor.enabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_editor_ContentSelector.ContentSelector, { ...rest, children: rest.children }) : rest.children }) }; /** Translation plugin. Replaces node with a locale string if nodeType = Translation. */ const reactNodePlugins = process.env["INTLAYER_NODE_TYPE_REACT_NODE"] === "false" ? _intlayer_core_interpreter.fallbackPlugin : { id: "react-node-plugin", canHandle: (node) => typeof node === "object" && typeof node?.props !== "undefined" && typeof node.key !== "undefined", transform: (node, { plugins, ...rest }) => require_IntlayerNode.renderIntlayerNode({ ...rest, value: "[[react-element]]", children: process.env["INTLAYER_EDITOR_ENABLED"] !== "false" && _intlayer_config_built.editor.enabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_editor_ContentSelector.ContentSelector, { ...rest, children: require_reactElement_renderReactElement.renderReactElement(node) }) : require_reactElement_renderReactElement.renderReactElement(node) }) }; /** * Split insertion string and join with React nodes using shared core logic */ const splitAndJoinInsertion = (template, values) => { const result = (0, _intlayer_core_interpreter.splitInsertionTemplate)(template, values); if (result.isSimple) return result.parts; return (0, react.createElement)(react.Fragment, null, ...result.parts.map((part, index) => (0, react.createElement)(react.Fragment, { key: index }, part))); }; /** Insertion plugin for React. Handles component/node insertion. */ const insertionPlugin = process.env["INTLAYER_NODE_TYPE_INSERTION"] === "false" ? _intlayer_core_interpreter.fallbackPlugin : { id: "insertion-plugin", canHandle: (node) => typeof node === "object" && node?.nodeType === _intlayer_types_nodeType.INSERTION, transform: (node, props, deepTransformNode) => { const newKeyPath = [...props.keyPath, { type: _intlayer_types_nodeType.INSERTION }]; const children = node[_intlayer_types_nodeType.INSERTION]; /** Insertion string plugin. Replaces string node with a component that render the insertion. */ const insertionStringPlugin = { id: "insertion-string-plugin", canHandle: (node) => typeof node === "string", transform: (node, subProps, deepTransformNode) => { const transformedResult = deepTransformNode(node, { ...subProps, children: node, plugins: [...(props.plugins ?? []).filter((plugin) => plugin.id !== "intlayer-node-plugin")] }); return (values) => { const result = splitAndJoinInsertion(transformedResult, values); return deepTransformNode(result, { ...subProps, plugins: props.plugins, children: result }); }; } }; const result = deepTransformNode(children, { ...props, children, keyPath: newKeyPath, plugins: [insertionStringPlugin, ...props.plugins ?? []] }); if (typeof children === "object" && children !== null && "nodeType" in children && [_intlayer_types_nodeType.ENUMERATION, _intlayer_types_nodeType.CONDITION].includes(children.nodeType)) return (values) => (arg) => { const inner = result(arg); if (typeof inner === "function") return inner(values); return inner; }; return result; } }; const MarkdownSuspenseRenderer = ({ children, ...props }) => { return (0, react.createElement)(require_client_useLoadDynamic.useLoadDynamic("markdown-renderer-plugin", markdownRendererModulePromise), { ...props, children }); }; /** Markdown string plugin. Replaces string node with a component that render the markdown. */ const markdownStringPlugin = process.env["INTLAYER_NODE_TYPE_MARKDOWN"] === "false" ? _intlayer_core_interpreter.fallbackPlugin : { id: "markdown-string-plugin", canHandle: (node) => typeof node === "string", transform: (node, props, deepTransformNode) => { const { plugins, ...rest } = props; const metadataNodes = deepTransformNode((0, _intlayer_core_markdown.getMarkdownMetadata)(node) ?? {}, { plugins: [{ id: "markdown-metadata-plugin", canHandle: (metadataNode) => typeof metadataNode === "string" || typeof metadataNode === "number" || typeof metadataNode === "boolean" || !metadataNode, transform: (metadataNode, props) => require_IntlayerNode.renderIntlayerNode({ ...props, value: metadataNode, children: process.env["INTLAYER_EDITOR_ENABLED"] !== "false" && _intlayer_config_built.editor.enabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_editor_ContentSelector.ContentSelector, { ...rest, children: node }) : node }) }], dictionaryKey: rest.dictionaryKey, keyPath: [] }); const render = (components) => require_IntlayerNode.renderIntlayerNode({ ...props, value: node, children: process.env["INTLAYER_EDITOR_ENABLED"] !== "false" && _intlayer_config_built.editor.enabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_editor_ContentSelector.ContentSelector, { ...rest, children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MarkdownSuspenseRenderer, { ...rest, components, children: node }) }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MarkdownSuspenseRenderer, { ...rest, components, children: node }), additionalProps: { metadata: metadataNodes } }); const element = render(); return new Proxy(element, { get(target, prop, receiver) { if (prop === "value") return node; if (prop === Symbol.toPrimitive) return () => node; if (prop === "toString") return () => node; if (prop === "valueOf") return () => node; if (typeof prop === "string" && prop !== "constructor") { const method = String.prototype[prop]; if (typeof method === "function") return method.bind(node); } if (prop === "metadata") return metadataNodes; if (prop === "use") return (components) => render(components); return Reflect.get(target, prop, receiver); } }); } }; const markdownPlugin = process.env["INTLAYER_NODE_TYPE_MARKDOWN"] === "false" ? _intlayer_core_interpreter.fallbackPlugin : { id: "markdown-plugin", canHandle: (node) => typeof node === "object" && node?.nodeType === _intlayer_types_nodeType.MARKDOWN, transform: (node, props, deepTransformNode) => { const newKeyPath = [...props.keyPath, { type: _intlayer_types_nodeType.MARKDOWN }]; const children = node[_intlayer_types_nodeType.MARKDOWN]; return deepTransformNode(children, { ...props, children, keyPath: newKeyPath, plugins: [markdownStringPlugin, ...props.plugins ?? []] }); } }; const HTMLSuspenseRenderer = (props) => { return (0, react.createElement)(require_client_useLoadDynamic.useLoadDynamic("html-renderer-plugin", htmlRendererModulePromise), props); }; /** HTML plugin. Replaces node with a function that takes components => ReactNode. */ const htmlPlugin = process.env["INTLAYER_NODE_TYPE_HTML"] === "false" ? _intlayer_core_interpreter.fallbackPlugin : { id: "html-plugin", canHandle: (node) => typeof node === "object" && node?.nodeType === _intlayer_types_nodeType.HTML, transform: (node, props) => { const html = node[_intlayer_types_nodeType.HTML]; const { plugins, ...rest } = props; const render = (userComponents) => require_IntlayerNode.renderIntlayerNode({ ...rest, value: html, children: process.env["INTLAYER_EDITOR_ENABLED"] !== "false" && _intlayer_config_built.editor.enabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_editor_ContentSelector.ContentSelector, { ...rest, children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HTMLSuspenseRenderer, { ...rest, html, userComponents }) }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HTMLSuspenseRenderer, { ...rest, html, userComponents }) }); const element = render(); return new Proxy(element, { get(target, prop, receiver) { if (prop === "value") return html; if (prop === Symbol.toPrimitive) return () => html; if (prop === "toString") return () => html; if (prop === "valueOf") return () => html; if (typeof prop === "string" && prop !== "constructor") { const method = String.prototype[prop]; if (typeof method === "function") return method.bind(html); } if (prop === "use") return (userComponents) => render(userComponents); return Reflect.get(target, prop, receiver); } }); } }; const pluginsCache = /* @__PURE__ */ new Map(); /** * Get the plugins array for React content transformation. * This function is used by both getIntlayer and getDictionary to ensure consistent plugin configuration. */ const getPlugins = (locale, fallback = true) => { const cacheKey = `${locale ?? _intlayer_config_built.internationalization.defaultLocale}_${fallback}`; if (pluginsCache.has(cacheKey)) return pluginsCache.get(cacheKey); const plugins = [ (0, _intlayer_core_interpreter.translationPlugin)(locale ?? _intlayer_config_built.internationalization.defaultLocale, fallback ? _intlayer_config_built.internationalization.defaultLocale : void 0), _intlayer_core_interpreter.enumerationPlugin, (0, _intlayer_core_interpreter.pluralPlugin)(locale ?? _intlayer_config_built.internationalization.defaultLocale), _intlayer_core_interpreter.conditionPlugin, (0, _intlayer_core_interpreter.nestedPlugin)(locale ?? _intlayer_config_built.internationalization.defaultLocale), _intlayer_core_interpreter.filePlugin, _intlayer_core_interpreter.genderPlugin, intlayerNodePlugins, reactNodePlugins, insertionPlugin, markdownPlugin, htmlPlugin ]; pluginsCache.set(cacheKey, plugins); return plugins; }; //#endregion exports.getPlugins = getPlugins; exports.htmlPlugin = htmlPlugin; exports.insertionPlugin = insertionPlugin; exports.intlayerNodePlugins = intlayerNodePlugins; exports.markdownPlugin = markdownPlugin; exports.markdownStringPlugin = markdownStringPlugin; exports.reactNodePlugins = reactNodePlugins; //# sourceMappingURL=plugins.cjs.map