react-intlayer
Version:
Easily internationalize i18n your React applications with type-safe multilingual content management.
243 lines (241 loc) • 11.7 kB
JavaScript
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