vanilla-intlayer 8.7.14 → 8.9.0
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.
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/cjs/client/index.cjs +24 -1
- package/dist/cjs/client/installIntlayer.cjs +98 -1
- package/dist/cjs/client/installIntlayer.cjs.map +1 -0
- package/dist/cjs/client/useDictionary.cjs +59 -1
- package/dist/cjs/client/useDictionary.cjs.map +1 -0
- package/dist/cjs/client/useDictionaryDynamic.cjs +93 -1
- package/dist/cjs/client/useDictionaryDynamic.cjs.map +1 -0
- package/dist/cjs/client/useIntlayer.cjs +65 -1
- package/dist/cjs/client/useIntlayer.cjs.map +1 -0
- package/dist/cjs/client/useLocale.cjs +58 -1
- package/dist/cjs/client/useLocale.cjs.map +1 -0
- package/dist/cjs/client/useLocaleStorage.cjs +51 -1
- package/dist/cjs/client/useLocaleStorage.cjs.map +1 -0
- package/dist/cjs/client/useRewriteURL.cjs +46 -1
- package/dist/cjs/client/useRewriteURL.cjs.map +1 -0
- package/dist/cjs/editor/useEditor.cjs +49 -1
- package/dist/cjs/editor/useEditor.cjs.map +1 -0
- package/dist/cjs/format/index.cjs +20 -1
- package/dist/cjs/format/useCompact.cjs +17 -1
- package/dist/cjs/format/useCompact.cjs.map +1 -0
- package/dist/cjs/format/useCurrency.cjs +17 -1
- package/dist/cjs/format/useCurrency.cjs.map +1 -0
- package/dist/cjs/format/useDate.cjs +26 -1
- package/dist/cjs/format/useDate.cjs.map +1 -0
- package/dist/cjs/format/useIntl.cjs +44 -1
- package/dist/cjs/format/useIntl.cjs.map +1 -0
- package/dist/cjs/format/useList.cjs +17 -1
- package/dist/cjs/format/useList.cjs.map +1 -0
- package/dist/cjs/format/useNumber.cjs +20 -1
- package/dist/cjs/format/useNumber.cjs.map +1 -0
- package/dist/cjs/format/usePercentage.cjs +17 -1
- package/dist/cjs/format/usePercentage.cjs.map +1 -0
- package/dist/cjs/format/useRelativeTime.cjs +17 -1
- package/dist/cjs/format/useRelativeTime.cjs.map +1 -0
- package/dist/cjs/format/useUnit.cjs +17 -1
- package/dist/cjs/format/useUnit.cjs.map +1 -0
- package/dist/cjs/getDictionary.cjs +11 -1
- package/dist/cjs/getDictionary.cjs.map +1 -0
- package/dist/cjs/getIntlayer.cjs +11 -1
- package/dist/cjs/getIntlayer.cjs.map +1 -0
- package/dist/cjs/html/HTMLRenderer.cjs +22 -1
- package/dist/cjs/html/HTMLRenderer.cjs.map +1 -0
- package/dist/cjs/html/index.cjs +9 -1
- package/dist/cjs/html/installIntlayerHTML.cjs +91 -1
- package/dist/cjs/html/installIntlayerHTML.cjs.map +1 -0
- package/dist/cjs/html/types.cjs +0 -1
- package/dist/cjs/index.cjs +37 -1
- package/dist/cjs/markdown/MarkdownRenderer.cjs +41 -1
- package/dist/cjs/markdown/MarkdownRenderer.cjs.map +1 -0
- package/dist/cjs/markdown/compiler.cjs +37 -1
- package/dist/cjs/markdown/compiler.cjs.map +1 -0
- package/dist/cjs/markdown/index.cjs +11 -1
- package/dist/cjs/markdown/installIntlayerMarkdown.cjs +98 -1
- package/dist/cjs/markdown/installIntlayerMarkdown.cjs.map +1 -0
- package/dist/cjs/markdown/runtime.cjs +87 -1
- package/dist/cjs/markdown/runtime.cjs.map +1 -0
- package/dist/cjs/plugins.cjs +240 -1
- package/dist/cjs/plugins.cjs.map +1 -0
- package/dist/cjs/renderIntlayerNode.cjs +44 -1
- package/dist/cjs/renderIntlayerNode.cjs.map +1 -0
- package/dist/esm/client/index.mjs +9 -8
- package/dist/esm/client/installIntlayer.mjs +93 -2
- package/dist/esm/client/installIntlayer.mjs.map +1 -0
- package/dist/esm/client/useDictionary.mjs +55 -8
- package/dist/esm/client/useDictionary.mjs.map +1 -0
- package/dist/esm/client/useDictionaryDynamic.mjs +82 -28
- package/dist/esm/client/useDictionaryDynamic.mjs.map +1 -0
- package/dist/esm/client/useIntlayer.mjs +61 -8
- package/dist/esm/client/useIntlayer.mjs.map +1 -0
- package/dist/esm/client/useLocale.mjs +51 -17
- package/dist/esm/client/useLocale.mjs.map +1 -0
- package/dist/esm/client/useLocaleStorage.mjs +39 -13
- package/dist/esm/client/useLocaleStorage.mjs.map +1 -0
- package/dist/esm/client/useRewriteURL.mjs +40 -12
- package/dist/esm/client/useRewriteURL.mjs.map +1 -0
- package/dist/esm/editor/useEditor.mjs +47 -2
- package/dist/esm/editor/useEditor.mjs.map +1 -0
- package/dist/esm/format/index.mjs +11 -10
- package/dist/esm/format/useCompact.mjs +11 -8
- package/dist/esm/format/useCompact.mjs.map +1 -0
- package/dist/esm/format/useCurrency.mjs +11 -8
- package/dist/esm/format/useCurrency.mjs.map +1 -0
- package/dist/esm/format/useDate.mjs +18 -12
- package/dist/esm/format/useDate.mjs.map +1 -0
- package/dist/esm/format/useIntl.mjs +36 -8
- package/dist/esm/format/useIntl.mjs.map +1 -0
- package/dist/esm/format/useList.mjs +11 -8
- package/dist/esm/format/useList.mjs.map +1 -0
- package/dist/esm/format/useNumber.mjs +14 -8
- package/dist/esm/format/useNumber.mjs.map +1 -0
- package/dist/esm/format/usePercentage.mjs +11 -8
- package/dist/esm/format/usePercentage.mjs.map +1 -0
- package/dist/esm/format/useRelativeTime.mjs +11 -8
- package/dist/esm/format/useRelativeTime.mjs.map +1 -0
- package/dist/esm/format/useUnit.mjs +11 -8
- package/dist/esm/format/useUnit.mjs.map +1 -0
- package/dist/esm/getDictionary.mjs +7 -4
- package/dist/esm/getDictionary.mjs.map +1 -0
- package/dist/esm/getIntlayer.mjs +7 -4
- package/dist/esm/getIntlayer.mjs.map +1 -0
- package/dist/esm/html/HTMLRenderer.mjs +17 -5
- package/dist/esm/html/HTMLRenderer.mjs.map +1 -0
- package/dist/esm/html/index.mjs +4 -3
- package/dist/esm/html/installIntlayerHTML.mjs +81 -13
- package/dist/esm/html/installIntlayerHTML.mjs.map +1 -0
- package/dist/esm/index.mjs +13 -12
- package/dist/esm/markdown/MarkdownRenderer.mjs +36 -16
- package/dist/esm/markdown/MarkdownRenderer.mjs.map +1 -0
- package/dist/esm/markdown/compiler.mjs +28 -4
- package/dist/esm/markdown/compiler.mjs.map +1 -0
- package/dist/esm/markdown/index.mjs +5 -4
- package/dist/esm/markdown/installIntlayerMarkdown.mjs +86 -23
- package/dist/esm/markdown/installIntlayerMarkdown.mjs.map +1 -0
- package/dist/esm/markdown/runtime.mjs +60 -28
- package/dist/esm/markdown/runtime.mjs.map +1 -0
- package/dist/esm/plugins.mjs +187 -133
- package/dist/esm/plugins.mjs.map +1 -0
- package/dist/esm/renderIntlayerNode.mjs +32 -15
- package/dist/esm/renderIntlayerNode.mjs.map +1 -0
- package/dist/types/client/index.d.ts +8 -0
- package/dist/{client → types/client}/installIntlayer.d.ts +27 -20
- package/dist/types/client/installIntlayer.d.ts.map +1 -0
- package/dist/{client → types/client}/useDictionary.d.ts +22 -17
- package/dist/types/client/useDictionary.d.ts.map +1 -0
- package/dist/{client → types/client}/useDictionaryDynamic.d.ts +10 -5
- package/dist/types/client/useDictionaryDynamic.d.ts.map +1 -0
- package/dist/{client → types/client}/useIntlayer.d.ts +9 -4
- package/dist/types/client/useIntlayer.d.ts.map +1 -0
- package/dist/{client → types/client}/useLocale.d.ts +14 -10
- package/dist/types/client/useLocale.d.ts.map +1 -0
- package/dist/types/client/useLocaleStorage.d.ts +37 -0
- package/dist/types/client/useLocaleStorage.d.ts.map +1 -0
- package/dist/{client → types/client}/useRewriteURL.d.ts +5 -1
- package/dist/types/client/useRewriteURL.d.ts.map +1 -0
- package/dist/{editor → types/editor}/useEditor.d.ts +5 -1
- package/dist/types/editor/useEditor.d.ts.map +1 -0
- package/dist/types/format/index.d.ts +10 -0
- package/dist/types/format/useCompact.d.ts +7 -0
- package/dist/types/format/useCompact.d.ts.map +1 -0
- package/dist/types/format/useCurrency.d.ts +7 -0
- package/dist/types/format/useCurrency.d.ts.map +1 -0
- package/dist/types/format/useDate.d.ts +10 -0
- package/dist/types/format/useDate.d.ts.map +1 -0
- package/dist/{format → types/format}/useIntl.d.ts +10 -5
- package/dist/types/format/useIntl.d.ts.map +1 -0
- package/dist/types/format/useList.d.ts +7 -0
- package/dist/types/format/useList.d.ts.map +1 -0
- package/dist/types/format/useNumber.d.ts +10 -0
- package/dist/types/format/useNumber.d.ts.map +1 -0
- package/dist/types/format/usePercentage.d.ts +7 -0
- package/dist/types/format/usePercentage.d.ts.map +1 -0
- package/dist/types/format/useRelativeTime.d.ts +7 -0
- package/dist/types/format/useRelativeTime.d.ts.map +1 -0
- package/dist/types/format/useUnit.d.ts +7 -0
- package/dist/types/format/useUnit.d.ts.map +1 -0
- package/dist/types/getDictionary.d.ts +9 -0
- package/dist/types/getDictionary.d.ts.map +1 -0
- package/dist/types/getIntlayer.d.ts +8 -0
- package/dist/types/getIntlayer.d.ts.map +1 -0
- package/dist/types/html/HTMLRenderer.d.ts +21 -0
- package/dist/types/html/HTMLRenderer.d.ts.map +1 -0
- package/dist/types/html/index.d.ts +4 -0
- package/dist/{html → types/html}/installIntlayerHTML.d.ts +18 -13
- package/dist/types/html/installIntlayerHTML.d.ts.map +1 -0
- package/dist/{html → types/html}/types.d.ts +12 -14
- package/dist/types/html/types.d.ts.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/markdown/MarkdownRenderer.d.ts +32 -0
- package/dist/types/markdown/MarkdownRenderer.d.ts.map +1 -0
- package/dist/types/markdown/compiler.d.ts +23 -0
- package/dist/types/markdown/compiler.d.ts.map +1 -0
- package/dist/types/markdown/index.d.ts +4 -0
- package/dist/types/markdown/installIntlayerMarkdown.d.ts +71 -0
- package/dist/types/markdown/installIntlayerMarkdown.d.ts.map +1 -0
- package/dist/types/markdown/runtime.d.ts +16 -0
- package/dist/types/markdown/runtime.d.ts.map +1 -0
- package/dist/types/plugins.d.ts +80 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/types/renderIntlayerNode.d.ts +31 -0
- package/dist/types/renderIntlayerNode.d.ts.map +1 -0
- package/package.json +10 -13
- package/dist/client/index.d.ts +0 -7
- package/dist/client/useLocaleStorage.d.ts +0 -31
- package/dist/format/index.d.ts +0 -9
- package/dist/format/useCompact.d.ts +0 -2
- package/dist/format/useCurrency.d.ts +0 -2
- package/dist/format/useDate.d.ts +0 -5
- package/dist/format/useList.d.ts +0 -2
- package/dist/format/useNumber.d.ts +0 -5
- package/dist/format/usePercentage.d.ts +0 -2
- package/dist/format/useRelativeTime.d.ts +0 -2
- package/dist/format/useUnit.d.ts +0 -2
- package/dist/getDictionary.d.ts +0 -4
- package/dist/getIntlayer.d.ts +0 -3
- package/dist/html/HTMLRenderer.d.ts +0 -14
- package/dist/html/index.d.ts +0 -3
- package/dist/index.d.ts +0 -11
- package/dist/installIntlayer-C99qMzFH.mjs +0 -47
- package/dist/installIntlayer-CxkE8IxM.js +0 -1
- package/dist/markdown/MarkdownRenderer.d.ts +0 -22
- package/dist/markdown/compiler.d.ts +0 -19
- package/dist/markdown/index.d.ts +0 -3
- package/dist/markdown/installIntlayerMarkdown.d.ts +0 -70
- package/dist/markdown/runtime.d.ts +0 -12
- package/dist/plugins-Bp8aaTny.js +0 -1
- package/dist/plugins.d.ts +0 -78
- package/dist/renderIntlayerNode.d.ts +0 -22
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownRenderer.cjs","names":["compileMarkdown","useMarkdown"],"sources":["../../../src/markdown/MarkdownRenderer.ts"],"sourcesContent":["import type { HTMLComponents } from '../html/types';\nimport { compileMarkdown, type MarkdownCompilerOptions } from './compiler';\nimport {\n type MarkdownProviderOptions,\n type RenderMarkdownFunction,\n useMarkdown,\n} from './installIntlayerMarkdown';\n\nexport type RenderMarkdownProps = MarkdownProviderOptions & {\n components?: HTMLComponents<'permissive', {}>;\n wrapper?: string;\n};\n\n/**\n * Renders markdown to an HTML string without using the global provider.\n *\n * @example\n * ```ts\n * import { renderMarkdown } from 'vanilla-intlayer/markdown';\n *\n * document.querySelector('#content').innerHTML = renderMarkdown('# Hello **World**');\n * ```\n */\nexport const renderMarkdown = (\n content: string,\n {\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n }: RenderMarkdownProps = {}\n): string => {\n const options: MarkdownCompilerOptions = {\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n };\n return compileMarkdown(content, options);\n};\n\n/**\n * Returns a render function that uses the global provider's configuration\n * (installed via `installIntlayerMarkdown`), falling back to `compileMarkdown`.\n */\nexport const useMarkdownRenderer = (\n props: RenderMarkdownProps = {}\n): ((content: string) => string | Promise<string>) => {\n const provider = useMarkdown();\n\n return (content: string) =>\n provider.renderMarkdown(\n content,\n {\n forceBlock: props.forceBlock,\n forceInline: props.forceInline,\n preserveFrontmatter: props.preserveFrontmatter,\n tagfilter: props.tagfilter,\n },\n props.components,\n props.wrapper\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,MAAa,kBACX,SACA,EACE,YACA,aACA,qBACA,cACuB,EAAE,KAChB;AAOX,QAAOA,0CAAgB,SAAS;EAL9B;EACA;EACA;EACA;EAEqC,CAAC;;;;;;AAO1C,MAAa,uBACX,QAA6B,EAAE,KACqB;CACpD,MAAM,WAAWC,sDAAa;AAE9B,SAAQ,YACN,SAAS,eACP,SACA;EACE,YAAY,MAAM;EAClB,aAAa,MAAM;EACnB,qBAAqB,MAAM;EAC3B,WAAW,MAAM;EAClB,EACD,MAAM,YACN,MAAM,QACP"}
|
|
@@ -1 +1,37 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
3
|
+
const require_markdown_runtime = require('./runtime.cjs');
|
|
4
|
+
let _intlayer_core_markdown = require("@intlayer/core/markdown");
|
|
5
|
+
|
|
6
|
+
//#region src/markdown/compiler.ts
|
|
7
|
+
/**
|
|
8
|
+
* Vanilla JS adapter for the framework-agnostic markdown processor.
|
|
9
|
+
*
|
|
10
|
+
* Compiles markdown to an HTML string for use with `innerHTML` or the
|
|
11
|
+
* `renderMarkdown` utility.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Compile markdown to an HTML string.
|
|
15
|
+
*
|
|
16
|
+
* The resulting string can be inserted into the DOM via `element.innerHTML`
|
|
17
|
+
* or the `renderMarkdown` helper.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { compileMarkdown } from 'vanilla-intlayer/markdown';
|
|
22
|
+
*
|
|
23
|
+
* document.querySelector('#content').innerHTML = compileMarkdown('# Hello **World**');
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
const compileMarkdown = (markdown = "", options = {}) => (0, _intlayer_core_markdown.compileWithOptions)(markdown, require_markdown_runtime.default, options);
|
|
27
|
+
const compiler = compileMarkdown;
|
|
28
|
+
const compile = compileMarkdown;
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
exports.RuleType = _intlayer_core_markdown.RuleType;
|
|
32
|
+
exports.compile = compile;
|
|
33
|
+
exports.compileMarkdown = compileMarkdown;
|
|
34
|
+
exports.compiler = compiler;
|
|
35
|
+
exports.sanitizer = _intlayer_core_markdown.sanitizer;
|
|
36
|
+
exports.slugify = _intlayer_core_markdown.slugify;
|
|
37
|
+
//# sourceMappingURL=compiler.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.cjs","names":["vanillaRuntime"],"sources":["../../../src/markdown/compiler.ts"],"sourcesContent":["/**\n * Vanilla JS adapter for the framework-agnostic markdown processor.\n *\n * Compiles markdown to an HTML string for use with `innerHTML` or the\n * `renderMarkdown` utility.\n */\n\nimport {\n type CompileOptions,\n compileWithOptions,\n sanitizer as defaultSanitizer,\n slugify as defaultSlugify,\n RuleType,\n} from '@intlayer/core/markdown';\nimport { vanillaRuntime } from './runtime';\n\n// Re-export utilities for compatibility\nexport { defaultSanitizer as sanitizer, defaultSlugify as slugify, RuleType };\n\nexport type MarkdownCompilerOptions = CompileOptions;\n\n/**\n * Compile markdown to an HTML string.\n *\n * The resulting string can be inserted into the DOM via `element.innerHTML`\n * or the `renderMarkdown` helper.\n *\n * @example\n * ```ts\n * import { compileMarkdown } from 'vanilla-intlayer/markdown';\n *\n * document.querySelector('#content').innerHTML = compileMarkdown('# Hello **World**');\n * ```\n */\nexport const compileMarkdown = (\n markdown = '',\n options: MarkdownCompilerOptions = {}\n): string => compileWithOptions(markdown, vanillaRuntime, options) as string;\n\n// Aliases for consistency with other adapters\nexport const compiler = compileMarkdown;\nexport const compile = compileMarkdown;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAa,mBACX,WAAW,IACX,UAAmC,EAAE,qDACP,UAAUA,kCAAgB,QAAQ;AAGlE,MAAa,WAAW;AACxB,MAAa,UAAU"}
|
|
@@ -1 +1,11 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_markdown_compiler = require('./compiler.cjs');
|
|
3
|
+
const require_markdown_installIntlayerMarkdown = require('./installIntlayerMarkdown.cjs');
|
|
4
|
+
const require_markdown_MarkdownRenderer = require('./MarkdownRenderer.cjs');
|
|
5
|
+
|
|
6
|
+
exports.compileMarkdown = require_markdown_compiler.compileMarkdown;
|
|
7
|
+
exports.installIntlayerMarkdown = require_markdown_installIntlayerMarkdown.installIntlayerMarkdown;
|
|
8
|
+
exports.installIntlayerMarkdownDynamic = require_markdown_installIntlayerMarkdown.installIntlayerMarkdownDynamic;
|
|
9
|
+
exports.renderMarkdown = require_markdown_MarkdownRenderer.renderMarkdown;
|
|
10
|
+
exports.useMarkdown = require_markdown_installIntlayerMarkdown.useMarkdown;
|
|
11
|
+
exports.useMarkdownRenderer = require_markdown_MarkdownRenderer.useMarkdownRenderer;
|
|
@@ -1 +1,98 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_markdown_compiler = require('./compiler.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/markdown/installIntlayerMarkdown.ts
|
|
5
|
+
/**
|
|
6
|
+
* Singleton instance
|
|
7
|
+
*/
|
|
8
|
+
let instance = null;
|
|
9
|
+
/**
|
|
10
|
+
* Create and return a single IntlayerMarkdownProvider instance.
|
|
11
|
+
*/
|
|
12
|
+
const createIntlayerMarkdownClient = (renderMarkdown, components) => {
|
|
13
|
+
if (instance) return instance;
|
|
14
|
+
instance = {
|
|
15
|
+
components,
|
|
16
|
+
renderMarkdown
|
|
17
|
+
};
|
|
18
|
+
return instance;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Install the Intlayer Markdown provider for your vanilla JS application.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { installIntlayerMarkdown } from 'vanilla-intlayer/markdown';
|
|
26
|
+
*
|
|
27
|
+
* installIntlayerMarkdown({ forceBlock: true });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
const installIntlayerMarkdown = (pluginOptions) => {
|
|
31
|
+
let renderMarkdown;
|
|
32
|
+
let providerComponents;
|
|
33
|
+
if (typeof pluginOptions === "function") renderMarkdown = pluginOptions;
|
|
34
|
+
else {
|
|
35
|
+
const { components, wrapper, forceBlock, forceInline, preserveFrontmatter, tagfilter, renderMarkdown: customRender } = pluginOptions ?? {};
|
|
36
|
+
providerComponents = components;
|
|
37
|
+
if (customRender) renderMarkdown = customRender;
|
|
38
|
+
else {
|
|
39
|
+
const internalOptions = {
|
|
40
|
+
forceBlock,
|
|
41
|
+
forceInline,
|
|
42
|
+
preserveFrontmatter,
|
|
43
|
+
tagfilter
|
|
44
|
+
};
|
|
45
|
+
renderMarkdown = (markdown, options, _componentsOverride, _wrapperOverride) => require_markdown_compiler.compileMarkdown(markdown, {
|
|
46
|
+
...internalOptions,
|
|
47
|
+
forceBlock: options?.forceBlock ?? internalOptions.forceBlock,
|
|
48
|
+
forceInline: options?.forceInline ?? internalOptions.forceInline,
|
|
49
|
+
preserveFrontmatter: options?.preserveFrontmatter ?? internalOptions.preserveFrontmatter,
|
|
50
|
+
tagfilter: options?.tagfilter ?? internalOptions.tagfilter
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return createIntlayerMarkdownClient(renderMarkdown, providerComponents);
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Access the installed IntlayerMarkdownProvider.
|
|
58
|
+
* Returns a fallback renderer that compiles with default options if no
|
|
59
|
+
* provider has been installed.
|
|
60
|
+
*/
|
|
61
|
+
const useMarkdown = () => {
|
|
62
|
+
if (instance) return instance;
|
|
63
|
+
return { renderMarkdown: (markdown) => require_markdown_compiler.compileMarkdown(markdown) };
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Asynchronously install a markdown renderer whose implementation is loaded
|
|
67
|
+
* via a dynamic `import()`.
|
|
68
|
+
*
|
|
69
|
+
* Use this to keep the markdown compiler out of the initial bundle — the
|
|
70
|
+
* loader is only called the first time this function is executed.
|
|
71
|
+
*
|
|
72
|
+
* The returned promise resolves once the provider is ready. Any calls to
|
|
73
|
+
* `useMarkdown()` before the promise resolves will use the fallback
|
|
74
|
+
* (raw-string) renderer.
|
|
75
|
+
*
|
|
76
|
+
* @param loader - A zero-argument async function that resolves to either a
|
|
77
|
+
* `RenderMarkdownFunction` or an `IntlayerMarkdownPluginOptions` object.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* // Load a custom markdown renderer (e.g. marked) only when needed
|
|
82
|
+
* await installIntlayerMarkdownDynamic(async () => {
|
|
83
|
+
* const { marked } = await import('marked');
|
|
84
|
+
* return (markdown) => marked(markdown) as string;
|
|
85
|
+
* });
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
const installIntlayerMarkdownDynamic = async (loader) => {
|
|
89
|
+
if (instance) return instance;
|
|
90
|
+
return installIntlayerMarkdown(await loader());
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
//#endregion
|
|
94
|
+
exports.createIntlayerMarkdownClient = createIntlayerMarkdownClient;
|
|
95
|
+
exports.installIntlayerMarkdown = installIntlayerMarkdown;
|
|
96
|
+
exports.installIntlayerMarkdownDynamic = installIntlayerMarkdownDynamic;
|
|
97
|
+
exports.useMarkdown = useMarkdown;
|
|
98
|
+
//# sourceMappingURL=installIntlayerMarkdown.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installIntlayerMarkdown.cjs","names":["compileMarkdown"],"sources":["../../../src/markdown/installIntlayerMarkdown.ts"],"sourcesContent":["import type { HTMLComponents } from '../html/types';\nimport { compileMarkdown, type MarkdownCompilerOptions } from './compiler';\n\nexport type MarkdownProviderOptions = {\n /** Forces the compiler to always output content with a block-level wrapper. */\n forceBlock?: boolean;\n /** Forces the compiler to always output content with an inline wrapper. */\n forceInline?: boolean;\n /** Whether to preserve frontmatter in the markdown content. */\n preserveFrontmatter?: boolean;\n /** Whether to use the GitHub Tag Filter. */\n tagfilter?: boolean;\n};\n\nexport type RenderMarkdownOptions = MarkdownProviderOptions & {\n components?: HTMLComponents<'permissive', {}>;\n wrapper?: string;\n};\n\nexport type RenderMarkdownFunction = (\n markdown: string,\n options?: MarkdownProviderOptions,\n components?: HTMLComponents<'permissive', {}>,\n wrapper?: string\n) => string | Promise<string>;\n\n/**\n * Singleton instance\n */\nlet instance: IntlayerMarkdownProvider | null = null;\n\nexport type IntlayerMarkdownProvider = {\n components?: HTMLComponents<'permissive', {}>;\n renderMarkdown: RenderMarkdownFunction;\n};\n\nexport type IntlayerMarkdownPluginOptions = MarkdownProviderOptions & {\n components?: HTMLComponents<'permissive', {}>;\n wrapper?: string;\n renderMarkdown?: RenderMarkdownFunction;\n};\n\n/**\n * Create and return a single IntlayerMarkdownProvider instance.\n */\nexport const createIntlayerMarkdownClient = (\n renderMarkdown: RenderMarkdownFunction,\n components?: HTMLComponents<'permissive', {}>\n): IntlayerMarkdownProvider => {\n if (instance) return instance;\n\n instance = { components, renderMarkdown };\n return instance;\n};\n\n/**\n * Install the Intlayer Markdown provider for your vanilla JS application.\n *\n * @example\n * ```ts\n * import { installIntlayerMarkdown } from 'vanilla-intlayer/markdown';\n *\n * installIntlayerMarkdown({ forceBlock: true });\n * ```\n */\nexport const installIntlayerMarkdown = (\n pluginOptions?: IntlayerMarkdownPluginOptions | RenderMarkdownFunction\n): IntlayerMarkdownProvider => {\n let renderMarkdown: RenderMarkdownFunction;\n let providerComponents: HTMLComponents<'permissive', {}> | undefined;\n\n if (typeof pluginOptions === 'function') {\n renderMarkdown = pluginOptions;\n } else {\n const {\n components,\n wrapper,\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n renderMarkdown: customRender,\n } = pluginOptions ?? {};\n\n providerComponents = components;\n\n if (customRender) {\n renderMarkdown = customRender;\n } else {\n const internalOptions: MarkdownCompilerOptions = {\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n };\n\n renderMarkdown = (\n markdown,\n options,\n _componentsOverride,\n _wrapperOverride\n ) =>\n compileMarkdown(markdown, {\n ...internalOptions,\n forceBlock: options?.forceBlock ?? internalOptions.forceBlock,\n forceInline: options?.forceInline ?? internalOptions.forceInline,\n preserveFrontmatter:\n options?.preserveFrontmatter ?? internalOptions.preserveFrontmatter,\n tagfilter: options?.tagfilter ?? internalOptions.tagfilter,\n });\n }\n }\n\n return createIntlayerMarkdownClient(renderMarkdown, providerComponents);\n};\n\n/**\n * Access the installed IntlayerMarkdownProvider.\n * Returns a fallback renderer that compiles with default options if no\n * provider has been installed.\n */\nexport const useMarkdown = (): IntlayerMarkdownProvider => {\n if (instance) return instance;\n\n return {\n renderMarkdown: (markdown) => compileMarkdown(markdown),\n };\n};\n\n/**\n * Asynchronously install a markdown renderer whose implementation is loaded\n * via a dynamic `import()`.\n *\n * Use this to keep the markdown compiler out of the initial bundle — the\n * loader is only called the first time this function is executed.\n *\n * The returned promise resolves once the provider is ready. Any calls to\n * `useMarkdown()` before the promise resolves will use the fallback\n * (raw-string) renderer.\n *\n * @param loader - A zero-argument async function that resolves to either a\n * `RenderMarkdownFunction` or an `IntlayerMarkdownPluginOptions` object.\n *\n * @example\n * ```ts\n * // Load a custom markdown renderer (e.g. marked) only when needed\n * await installIntlayerMarkdownDynamic(async () => {\n * const { marked } = await import('marked');\n * return (markdown) => marked(markdown) as string;\n * });\n * ```\n */\nexport const installIntlayerMarkdownDynamic = async (\n loader: () => Promise<IntlayerMarkdownPluginOptions | RenderMarkdownFunction>\n): Promise<IntlayerMarkdownProvider> => {\n if (instance) return instance;\n const pluginOptions = await loader();\n return installIntlayerMarkdown(pluginOptions);\n};\n"],"mappings":";;;;;;;AA6BA,IAAI,WAA4C;;;;AAgBhD,MAAa,gCACX,gBACA,eAC6B;AAC7B,KAAI,SAAU,QAAO;AAErB,YAAW;EAAE;EAAY;EAAgB;AACzC,QAAO;;;;;;;;;;;;AAaT,MAAa,2BACX,kBAC6B;CAC7B,IAAI;CACJ,IAAI;AAEJ,KAAI,OAAO,kBAAkB,WAC3B,kBAAiB;MACZ;EACL,MAAM,EACJ,YACA,SACA,YACA,aACA,qBACA,WACA,gBAAgB,iBACd,iBAAiB,EAAE;AAEvB,uBAAqB;AAErB,MAAI,aACF,kBAAiB;OACZ;GACL,MAAM,kBAA2C;IAC/C;IACA;IACA;IACA;IACD;AAED,qBACE,UACA,SACA,qBACA,qBAEAA,0CAAgB,UAAU;IACxB,GAAG;IACH,YAAY,SAAS,cAAc,gBAAgB;IACnD,aAAa,SAAS,eAAe,gBAAgB;IACrD,qBACE,SAAS,uBAAuB,gBAAgB;IAClD,WAAW,SAAS,aAAa,gBAAgB;IAClD,CAAC;;;AAIR,QAAO,6BAA6B,gBAAgB,mBAAmB;;;;;;;AAQzE,MAAa,oBAA8C;AACzD,KAAI,SAAU,QAAO;AAErB,QAAO,EACL,iBAAiB,aAAaA,0CAAgB,SAAS,EACxD;;;;;;;;;;;;;;;;;;;;;;;;;AA0BH,MAAa,iCAAiC,OAC5C,WACsC;AACtC,KAAI,SAAU,QAAO;AAErB,QAAO,wBAAwB,MADH,QAAQ,CACS"}
|
|
@@ -1 +1,87 @@
|
|
|
1
|
-
Object.defineProperties(exports,{__esModule:{value
|
|
1
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
2
|
+
|
|
3
|
+
//#region src/markdown/runtime.ts
|
|
4
|
+
const SELF_CLOSING_TAGS = new Set([
|
|
5
|
+
"area",
|
|
6
|
+
"base",
|
|
7
|
+
"br",
|
|
8
|
+
"col",
|
|
9
|
+
"embed",
|
|
10
|
+
"hr",
|
|
11
|
+
"img",
|
|
12
|
+
"input",
|
|
13
|
+
"link",
|
|
14
|
+
"meta",
|
|
15
|
+
"param",
|
|
16
|
+
"source",
|
|
17
|
+
"track",
|
|
18
|
+
"wbr"
|
|
19
|
+
]);
|
|
20
|
+
const buildPropsString = (props) => {
|
|
21
|
+
if (!props) return "";
|
|
22
|
+
return Object.entries(props).filter(([, v]) => v !== void 0 && v !== null).map(([k, v]) => {
|
|
23
|
+
if (typeof v === "boolean") return v ? k : "";
|
|
24
|
+
if (k === "_innerHTML") return "";
|
|
25
|
+
return `${k}="${String(v).replace(/&/g, "&").replace(/"/g, """)}"`;
|
|
26
|
+
}).filter(Boolean).join(" ");
|
|
27
|
+
};
|
|
28
|
+
const VANILLA_FRAGMENT = "__vanilla_fragment__";
|
|
29
|
+
/**
|
|
30
|
+
* Vanilla-specific MarkdownRuntime that produces HTML strings.
|
|
31
|
+
*/
|
|
32
|
+
const vanillaRuntime = {
|
|
33
|
+
createElement: (type, props, ...children) => {
|
|
34
|
+
const childStr = children.flat(Infinity).join("");
|
|
35
|
+
if (type === VANILLA_FRAGMENT) return childStr;
|
|
36
|
+
if (typeof type === "string") {
|
|
37
|
+
const propsStr = buildPropsString(props);
|
|
38
|
+
const propsWithSpace = propsStr ? ` ${propsStr}` : "";
|
|
39
|
+
const innerHTML = props?._innerHTML;
|
|
40
|
+
if (SELF_CLOSING_TAGS.has(type)) return `<${type}${propsWithSpace}>`;
|
|
41
|
+
if (innerHTML !== void 0) return `<${type}${propsWithSpace}>${innerHTML}</${type}>`;
|
|
42
|
+
return `<${type}${propsWithSpace}>${childStr}</${type}>`;
|
|
43
|
+
}
|
|
44
|
+
if (typeof type === "function") try {
|
|
45
|
+
const result = type({
|
|
46
|
+
...props,
|
|
47
|
+
children: childStr
|
|
48
|
+
});
|
|
49
|
+
return typeof result === "string" ? result : childStr;
|
|
50
|
+
} catch {
|
|
51
|
+
return childStr;
|
|
52
|
+
}
|
|
53
|
+
return childStr;
|
|
54
|
+
},
|
|
55
|
+
cloneElement: (element, _props, ..._children) => {
|
|
56
|
+
return typeof element === "string" ? element : String(element ?? "");
|
|
57
|
+
},
|
|
58
|
+
Fragment: VANILLA_FRAGMENT,
|
|
59
|
+
/**
|
|
60
|
+
* Normalize props to standard HTML attribute names.
|
|
61
|
+
*/
|
|
62
|
+
normalizeProps: (_tag, props) => {
|
|
63
|
+
const normalized = {};
|
|
64
|
+
for (const [key, value] of Object.entries(props)) if (key === "className") normalized.class = value;
|
|
65
|
+
else if (key === "htmlFor") normalized.for = value;
|
|
66
|
+
else if (key === "dangerouslySetInnerHTML" && value?.__html) normalized._innerHTML = value.__html;
|
|
67
|
+
else normalized[key] = value;
|
|
68
|
+
return normalized;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Creates a vanilla runtime with a custom createElement for advanced use cases.
|
|
73
|
+
*/
|
|
74
|
+
const createVanillaRuntime = (options = {}) => {
|
|
75
|
+
const { onCreateElement } = options;
|
|
76
|
+
if (onCreateElement) return {
|
|
77
|
+
...vanillaRuntime,
|
|
78
|
+
createElement: (type, props, ...children) => onCreateElement(type, props, children)
|
|
79
|
+
};
|
|
80
|
+
return vanillaRuntime;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
//#endregion
|
|
84
|
+
exports.createVanillaRuntime = createVanillaRuntime;
|
|
85
|
+
exports.default = vanillaRuntime;
|
|
86
|
+
exports.vanillaRuntime = vanillaRuntime;
|
|
87
|
+
//# sourceMappingURL=runtime.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.cjs","names":[],"sources":["../../../src/markdown/runtime.ts"],"sourcesContent":["/**\n * Vanilla JS adapter for the framework-agnostic markdown processor.\n *\n * Builds HTML strings which can be inserted into the DOM via `innerHTML`\n * or the `renderMarkdown` utility.\n */\n\nimport type { HTMLTag, MarkdownRuntime } from '@intlayer/core/markdown';\n\nconst SELF_CLOSING_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\nconst buildPropsString = (props: Record<string, any> | null): string => {\n if (!props) return '';\n\n return Object.entries(props)\n .filter(([, v]) => v !== undefined && v !== null)\n .map(([k, v]) => {\n if (typeof v === 'boolean') return v ? k : '';\n if (k === '_innerHTML') return ''; // handled separately\n return `${k}=\"${String(v).replace(/&/g, '&').replace(/\"/g, '"')}\"`;\n })\n .filter(Boolean)\n .join(' ');\n};\n\nconst VANILLA_FRAGMENT = '__vanilla_fragment__';\n\n/**\n * Vanilla-specific MarkdownRuntime that produces HTML strings.\n */\nexport const vanillaRuntime: MarkdownRuntime = {\n createElement: (\n type: any,\n props: Record<string, any> | null,\n ...children: any[]\n ): string => {\n const childStr = children.flat(Infinity).join('');\n\n if (type === VANILLA_FRAGMENT) return childStr;\n\n if (typeof type === 'string') {\n const propsStr = buildPropsString(props);\n const propsWithSpace = propsStr ? ` ${propsStr}` : '';\n const innerHTML = props?._innerHTML;\n\n if (SELF_CLOSING_TAGS.has(type)) {\n return `<${type}${propsWithSpace}>`;\n }\n\n if (innerHTML !== undefined) {\n return `<${type}${propsWithSpace}>${innerHTML}</${type}>`;\n }\n\n return `<${type}${propsWithSpace}>${childStr}</${type}>`;\n }\n\n // Function component override — returns a string\n if (typeof type === 'function') {\n try {\n const result = type({ ...props, children: childStr });\n return typeof result === 'string' ? result : childStr;\n } catch {\n return childStr;\n }\n }\n\n return childStr;\n },\n\n cloneElement: (\n element: unknown,\n _props: Record<string, any>,\n ..._children: any[]\n ): string => {\n return typeof element === 'string' ? element : String(element ?? '');\n },\n\n Fragment: VANILLA_FRAGMENT as any,\n\n /**\n * Normalize props to standard HTML attribute names.\n */\n normalizeProps: (\n _tag: HTMLTag,\n props: Record<string, any>\n ): Record<string, any> => {\n const normalized: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (key === 'className') {\n normalized.class = value;\n } else if (key === 'htmlFor') {\n normalized.for = value;\n } else if (key === 'dangerouslySetInnerHTML' && value?.__html) {\n normalized._innerHTML = value.__html;\n } else {\n normalized[key] = value;\n }\n }\n\n return normalized;\n },\n};\n\n/**\n * Creates a vanilla runtime with a custom createElement for advanced use cases.\n */\nexport const createVanillaRuntime = (\n options: {\n onCreateElement?: (\n type: any,\n props: Record<string, any> | null,\n children: any[]\n ) => string;\n } = {}\n): MarkdownRuntime => {\n const { onCreateElement } = options;\n\n if (onCreateElement) {\n return {\n ...vanillaRuntime,\n createElement: (\n type: any,\n props: Record<string, any> | null,\n ...children: any[]\n ): string => onCreateElement(type, props, children),\n };\n }\n\n return vanillaRuntime;\n};\n\nexport default vanillaRuntime;\n"],"mappings":";;;AASA,MAAM,oBAAoB,IAAI,IAAI;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,oBAAoB,UAA8C;AACtE,KAAI,CAAC,MAAO,QAAO;AAEnB,QAAO,OAAO,QAAQ,MAAM,CACzB,QAAQ,GAAG,OAAO,MAAM,UAAa,MAAM,KAAK,CAChD,KAAK,CAAC,GAAG,OAAO;AACf,MAAI,OAAO,MAAM,UAAW,QAAO,IAAI,IAAI;AAC3C,MAAI,MAAM,aAAc,QAAO;AAC/B,SAAO,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC,QAAQ,MAAM,QAAQ,CAAC,QAAQ,MAAM,SAAS,CAAC;GACzE,CACD,OAAO,QAAQ,CACf,KAAK,IAAI;;AAGd,MAAM,mBAAmB;;;;AAKzB,MAAa,iBAAkC;CAC7C,gBACE,MACA,OACA,GAAG,aACQ;EACX,MAAM,WAAW,SAAS,KAAK,SAAS,CAAC,KAAK,GAAG;AAEjD,MAAI,SAAS,iBAAkB,QAAO;AAEtC,MAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,WAAW,iBAAiB,MAAM;GACxC,MAAM,iBAAiB,WAAW,IAAI,aAAa;GACnD,MAAM,YAAY,OAAO;AAEzB,OAAI,kBAAkB,IAAI,KAAK,CAC7B,QAAO,IAAI,OAAO,eAAe;AAGnC,OAAI,cAAc,OAChB,QAAO,IAAI,OAAO,eAAe,GAAG,UAAU,IAAI,KAAK;AAGzD,UAAO,IAAI,OAAO,eAAe,GAAG,SAAS,IAAI,KAAK;;AAIxD,MAAI,OAAO,SAAS,WAClB,KAAI;GACF,MAAM,SAAS,KAAK;IAAE,GAAG;IAAO,UAAU;IAAU,CAAC;AACrD,UAAO,OAAO,WAAW,WAAW,SAAS;UACvC;AACN,UAAO;;AAIX,SAAO;;CAGT,eACE,SACA,QACA,GAAG,cACQ;AACX,SAAO,OAAO,YAAY,WAAW,UAAU,OAAO,WAAW,GAAG;;CAGtE,UAAU;;;;CAKV,iBACE,MACA,UACwB;EACxB,MAAM,aAAkC,EAAE;AAE1C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,KAAI,QAAQ,YACV,YAAW,QAAQ;WACV,QAAQ,UACjB,YAAW,MAAM;WACR,QAAQ,6BAA6B,OAAO,OACrD,YAAW,aAAa,MAAM;MAE9B,YAAW,OAAO;AAItB,SAAO;;CAEV;;;;AAKD,MAAa,wBACX,UAMI,EAAE,KACc;CACpB,MAAM,EAAE,oBAAoB;AAE5B,KAAI,gBACF,QAAO;EACL,GAAG;EACH,gBACE,MACA,OACA,GAAG,aACQ,gBAAgB,MAAM,OAAO,SAAS;EACpD;AAGH,QAAO"}
|
package/dist/cjs/plugins.cjs
CHANGED
|
@@ -1 +1,240 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
3
|
+
const require_renderIntlayerNode = require('./renderIntlayerNode.cjs');
|
|
4
|
+
let _intlayer_core_interpreter = require("@intlayer/core/interpreter");
|
|
5
|
+
let _intlayer_config_built = require("@intlayer/config/built");
|
|
6
|
+
let _intlayer_core_markdown = require("@intlayer/core/markdown");
|
|
7
|
+
let _intlayer_types_nodeType = require("@intlayer/types/nodeType");
|
|
8
|
+
_intlayer_types_nodeType = require_runtime.__toESM(_intlayer_types_nodeType);
|
|
9
|
+
|
|
10
|
+
//#region src/plugins.ts
|
|
11
|
+
const escapeHtmlAttr = (str) => str.replace(/&/g, "&").replace(/"/g, """);
|
|
12
|
+
const escapeHtmlText = (str) => str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
13
|
+
const intlayerNodePlugins = {
|
|
14
|
+
id: "intlayer-node-plugin",
|
|
15
|
+
canHandle: (node) => typeof node === "bigint" || typeof node === "string" || typeof node === "number",
|
|
16
|
+
transform: (_node, { children, keyPath, dictionaryKey, ...rest }) => {
|
|
17
|
+
if (process.env["INTLAYER_EDITOR_ENABLED"] !== "false" && _intlayer_config_built.editor.enabled) {
|
|
18
|
+
const rawStr = String(children ?? "");
|
|
19
|
+
const keyPathJson = JSON.stringify(keyPath ?? []);
|
|
20
|
+
const dictKey = String(dictionaryKey ?? "");
|
|
21
|
+
/**
|
|
22
|
+
* In editor mode, string coercion returns the wrapper HTML so that
|
|
23
|
+
* `element.innerHTML = content.title` automatically inserts the
|
|
24
|
+
* `<intlayer-content-selector-wrapper>` into the DOM.
|
|
25
|
+
*/
|
|
26
|
+
const htmlStr = `<intlayer-content-selector-wrapper key-path="${escapeHtmlAttr(keyPathJson)}" dictionary-key="${escapeHtmlAttr(dictKey)}">${escapeHtmlText(rawStr)}</intlayer-content-selector-wrapper>`;
|
|
27
|
+
return require_renderIntlayerNode.renderIntlayerNode({
|
|
28
|
+
...rest,
|
|
29
|
+
value: children,
|
|
30
|
+
children: htmlStr,
|
|
31
|
+
keyPath,
|
|
32
|
+
dictionaryKey,
|
|
33
|
+
additionalProps: { toElement: () => {
|
|
34
|
+
const wrapper = document.createElement("intlayer-content-selector-wrapper");
|
|
35
|
+
wrapper.setAttribute("key-path", keyPathJson);
|
|
36
|
+
wrapper.setAttribute("dictionary-key", dictKey);
|
|
37
|
+
wrapper.textContent = rawStr;
|
|
38
|
+
return wrapper;
|
|
39
|
+
} }
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return require_renderIntlayerNode.renderIntlayerNode({
|
|
43
|
+
...rest,
|
|
44
|
+
value: children,
|
|
45
|
+
children
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const insertionPlugin = process.env["INTLAYER_NODE_TYPE_INSERTION"] === "false" ? _intlayer_core_interpreter.fallbackPlugin : {
|
|
50
|
+
id: "insertion-plugin",
|
|
51
|
+
canHandle: (node) => typeof node === "object" && node?.nodeType === _intlayer_types_nodeType.INSERTION,
|
|
52
|
+
transform: (node, props, deepTransformNode) => {
|
|
53
|
+
const newKeyPath = [...props.keyPath, { type: _intlayer_types_nodeType.INSERTION }];
|
|
54
|
+
const children = node[_intlayer_types_nodeType.INSERTION];
|
|
55
|
+
const insertionStringPlugin = {
|
|
56
|
+
id: "insertion-string-plugin",
|
|
57
|
+
canHandle: (node) => typeof node === "string",
|
|
58
|
+
transform: (node, subProps, deepTransformNode) => {
|
|
59
|
+
const transformedResult = deepTransformNode(node, {
|
|
60
|
+
...subProps,
|
|
61
|
+
children: node,
|
|
62
|
+
plugins: (props.plugins ?? []).filter((plugin) => plugin.id !== "intlayer-node-plugin")
|
|
63
|
+
});
|
|
64
|
+
return (values) => {
|
|
65
|
+
const result = (0, _intlayer_core_interpreter.splitInsertionTemplate)(transformedResult, values);
|
|
66
|
+
const resultStr = result.isSimple ? result.parts : result.parts.join("");
|
|
67
|
+
return deepTransformNode(resultStr, {
|
|
68
|
+
...subProps,
|
|
69
|
+
plugins: props.plugins,
|
|
70
|
+
children: resultStr
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const transformed = deepTransformNode(children, {
|
|
76
|
+
...props,
|
|
77
|
+
children,
|
|
78
|
+
keyPath: newKeyPath,
|
|
79
|
+
plugins: [insertionStringPlugin, ...props.plugins ?? []]
|
|
80
|
+
});
|
|
81
|
+
if (typeof children === "object" && children !== null && "nodeType" in children && [_intlayer_types_nodeType.ENUMERATION, _intlayer_types_nodeType.CONDITION].includes(children.nodeType)) return (values) => (arg) => {
|
|
82
|
+
const inner = transformed(arg);
|
|
83
|
+
return typeof inner === "function" ? inner(values) : inner;
|
|
84
|
+
};
|
|
85
|
+
return transformed;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
/** ---------------------------------------------
|
|
89
|
+
* MARKDOWN PLUGIN
|
|
90
|
+
* --------------------------------------------- */
|
|
91
|
+
const vanillaRuntime = {
|
|
92
|
+
createElement: (tag, props, ...children) => {
|
|
93
|
+
const attrs = Object.entries(props || {}).filter(([key]) => key !== "children" && key !== "key" && key !== "_innerHTML").map(([key, value]) => `${key}="${value}"`).join(" ");
|
|
94
|
+
const innerHTML = props?._innerHTML;
|
|
95
|
+
const childrenStr = innerHTML !== void 0 ? innerHTML : children.flat(Infinity).join("");
|
|
96
|
+
return `<${tag}${attrs ? ` ${attrs}` : ""}>${childrenStr}</${tag}>`;
|
|
97
|
+
},
|
|
98
|
+
normalizeProps: (_tag, props) => {
|
|
99
|
+
const normalized = {};
|
|
100
|
+
for (const [key, value] of Object.entries(props)) if (key === "className") normalized.class = value;
|
|
101
|
+
else if (key === "htmlFor") normalized.for = value;
|
|
102
|
+
else if (key === "dangerouslySetInnerHTML" && value?.__html) normalized._innerHTML = value.__html;
|
|
103
|
+
else normalized[key] = value;
|
|
104
|
+
return normalized;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
const markdownStringPlugin = process.env["INTLAYER_NODE_TYPE_MARKDOWN"] === "false" ? _intlayer_core_interpreter.fallbackPlugin : {
|
|
108
|
+
id: "markdown-string-plugin",
|
|
109
|
+
canHandle: (node) => typeof node === "string",
|
|
110
|
+
transform: (node, props, deepTransformNode) => {
|
|
111
|
+
const { plugins: _plugins, ...rest } = props;
|
|
112
|
+
const metadataNodes = deepTransformNode((0, _intlayer_core_markdown.getMarkdownMetadata)(node) ?? {}, {
|
|
113
|
+
plugins: [{
|
|
114
|
+
id: "markdown-metadata-plugin",
|
|
115
|
+
canHandle: (metadataNode) => typeof metadataNode === "string" || typeof metadataNode === "number" || typeof metadataNode === "boolean" || !metadataNode,
|
|
116
|
+
transform: (metadataNode, subProps) => require_renderIntlayerNode.renderIntlayerNode({
|
|
117
|
+
...subProps,
|
|
118
|
+
value: metadataNode,
|
|
119
|
+
children: node
|
|
120
|
+
})
|
|
121
|
+
}],
|
|
122
|
+
dictionaryKey: rest.dictionaryKey,
|
|
123
|
+
keyPath: []
|
|
124
|
+
});
|
|
125
|
+
const compile = (components = {}) => (0, _intlayer_core_markdown.compileWithOptions)(node, {
|
|
126
|
+
...vanillaRuntime,
|
|
127
|
+
createElement: (tag, props, ...children) => {
|
|
128
|
+
const override = components[tag];
|
|
129
|
+
if (typeof override === "function") return override({
|
|
130
|
+
...props,
|
|
131
|
+
children: children.join("")
|
|
132
|
+
});
|
|
133
|
+
return vanillaRuntime.createElement(tag, props, ...children);
|
|
134
|
+
}
|
|
135
|
+
}, {});
|
|
136
|
+
const value = compile();
|
|
137
|
+
let children = node;
|
|
138
|
+
if (process.env["INTLAYER_EDITOR_ENABLED"] !== "false" && _intlayer_config_built.editor.enabled) {
|
|
139
|
+
const keyPathJson = JSON.stringify(props.keyPath ?? []);
|
|
140
|
+
const dictKey = String(props.dictionaryKey ?? "");
|
|
141
|
+
children = `<intlayer-content-selector-wrapper key-path="${escapeHtmlAttr(keyPathJson)}" dictionary-key="${escapeHtmlAttr(dictKey)}">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;
|
|
142
|
+
}
|
|
143
|
+
return require_renderIntlayerNode.renderIntlayerNode({
|
|
144
|
+
...props,
|
|
145
|
+
value,
|
|
146
|
+
children,
|
|
147
|
+
additionalProps: {
|
|
148
|
+
metadata: metadataNodes,
|
|
149
|
+
use: (components) => compile(components)
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const markdownPlugin = process.env["INTLAYER_NODE_TYPE_MARKDOWN"] === "false" ? _intlayer_core_interpreter.fallbackPlugin : {
|
|
155
|
+
id: "markdown-plugin",
|
|
156
|
+
canHandle: (node) => typeof node === "object" && node?.nodeType === _intlayer_types_nodeType.MARKDOWN,
|
|
157
|
+
transform: (node, props, deepTransformNode) => {
|
|
158
|
+
const newKeyPath = [...props.keyPath, { type: _intlayer_types_nodeType.MARKDOWN }];
|
|
159
|
+
const children = node[_intlayer_types_nodeType.MARKDOWN];
|
|
160
|
+
return deepTransformNode(children, {
|
|
161
|
+
...props,
|
|
162
|
+
children,
|
|
163
|
+
keyPath: newKeyPath,
|
|
164
|
+
plugins: [markdownStringPlugin, ...props.plugins ?? []]
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
const htmlPlugin = process.env["INTLAYER_NODE_TYPE_HTML"] === "false" ? _intlayer_core_interpreter.fallbackPlugin : {
|
|
169
|
+
id: "html-plugin",
|
|
170
|
+
canHandle: (node) => typeof node === "object" && node?.nodeType === _intlayer_types_nodeType.HTML,
|
|
171
|
+
transform: (node, props) => {
|
|
172
|
+
const htmlStr = node[_intlayer_types_nodeType.HTML];
|
|
173
|
+
const use = (components = {}) => {
|
|
174
|
+
const result = (0, _intlayer_core_interpreter.getHTML)(htmlStr, new Proxy(components, { get(target, prop) {
|
|
175
|
+
if (typeof prop === "string" && prop in target) {
|
|
176
|
+
const Component = target[prop];
|
|
177
|
+
return (props) => {
|
|
178
|
+
const children = Array.isArray(props.children) ? props.children.join("") : props.children;
|
|
179
|
+
return Component({
|
|
180
|
+
...props,
|
|
181
|
+
children
|
|
182
|
+
});
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
if (typeof prop === "string" && /^[a-z][a-z0-9]*$/.test(prop)) return (props) => {
|
|
186
|
+
const attrs = Object.entries(props).filter(([key]) => key !== "children" && key !== "key").map(([key, value]) => `${key}="${value}"`).join(" ");
|
|
187
|
+
const children = Array.isArray(props.children) ? props.children.join("") : props.children;
|
|
188
|
+
return `<${prop}${attrs ? ` ${attrs}` : ""}>${children}</${prop}>`;
|
|
189
|
+
};
|
|
190
|
+
} }));
|
|
191
|
+
return Array.isArray(result) ? result.join("") : result;
|
|
192
|
+
};
|
|
193
|
+
const value = use();
|
|
194
|
+
let children = htmlStr;
|
|
195
|
+
if (process.env["INTLAYER_EDITOR_ENABLED"] !== "false" && _intlayer_config_built.editor.enabled) {
|
|
196
|
+
const keyPathJson = JSON.stringify(props.keyPath ?? []);
|
|
197
|
+
const dictKey = String(props.dictionaryKey ?? "");
|
|
198
|
+
children = `<intlayer-content-selector-wrapper key-path="${escapeHtmlAttr(keyPathJson)}" dictionary-key="${escapeHtmlAttr(dictKey)}">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;
|
|
199
|
+
}
|
|
200
|
+
return require_renderIntlayerNode.renderIntlayerNode({
|
|
201
|
+
...props,
|
|
202
|
+
value,
|
|
203
|
+
children,
|
|
204
|
+
additionalProps: { use: (components) => use(components) }
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
const pluginsCache = /* @__PURE__ */ new Map();
|
|
209
|
+
/**
|
|
210
|
+
* Get the plugins array for Vanilla content transformation.
|
|
211
|
+
* This function is used by both getIntlayer and getDictionary to ensure consistent plugin configuration.
|
|
212
|
+
*/
|
|
213
|
+
const getPlugins = (locale, fallback = true) => {
|
|
214
|
+
const cacheKey = `${locale ?? _intlayer_config_built.internationalization.defaultLocale}_${fallback}`;
|
|
215
|
+
if (pluginsCache.has(cacheKey)) return pluginsCache.get(cacheKey);
|
|
216
|
+
const plugins = [
|
|
217
|
+
(0, _intlayer_core_interpreter.translationPlugin)(locale ?? _intlayer_config_built.internationalization.defaultLocale, fallback ? _intlayer_config_built.internationalization.defaultLocale : void 0),
|
|
218
|
+
_intlayer_core_interpreter.enumerationPlugin,
|
|
219
|
+
(0, _intlayer_core_interpreter.pluralPlugin)(locale ?? _intlayer_config_built.internationalization.defaultLocale),
|
|
220
|
+
_intlayer_core_interpreter.conditionPlugin,
|
|
221
|
+
(0, _intlayer_core_interpreter.nestedPlugin)(locale ?? _intlayer_config_built.internationalization.defaultLocale),
|
|
222
|
+
_intlayer_core_interpreter.filePlugin,
|
|
223
|
+
_intlayer_core_interpreter.genderPlugin,
|
|
224
|
+
intlayerNodePlugins,
|
|
225
|
+
insertionPlugin,
|
|
226
|
+
markdownPlugin,
|
|
227
|
+
htmlPlugin
|
|
228
|
+
];
|
|
229
|
+
pluginsCache.set(cacheKey, plugins);
|
|
230
|
+
return plugins;
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
//#endregion
|
|
234
|
+
exports.getPlugins = getPlugins;
|
|
235
|
+
exports.htmlPlugin = htmlPlugin;
|
|
236
|
+
exports.insertionPlugin = insertionPlugin;
|
|
237
|
+
exports.intlayerNodePlugins = intlayerNodePlugins;
|
|
238
|
+
exports.markdownPlugin = markdownPlugin;
|
|
239
|
+
exports.markdownStringPlugin = markdownStringPlugin;
|
|
240
|
+
//# sourceMappingURL=plugins.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.cjs","names":["editor","renderIntlayerNode","fallbackPlugin","NodeTypes","internationalization","enumerationPlugin","conditionPlugin","filePlugin","genderPlugin"],"sources":["../../src/plugins.ts"],"sourcesContent":["import { editor, internationalization } from '@intlayer/config/built';\nimport {\n conditionPlugin,\n type DeepTransformContent as DeepTransformContentCore,\n enumerationPlugin,\n fallbackPlugin,\n filePlugin,\n genderPlugin,\n getHTML,\n type IInterpreterPluginState as IInterpreterPluginStateCore,\n nestedPlugin,\n type Plugins,\n pluralPlugin,\n splitInsertionTemplate,\n translationPlugin,\n} from '@intlayer/core/interpreter';\nimport {\n compileWithOptions,\n getMarkdownMetadata,\n} from '@intlayer/core/markdown';\nimport type {\n HTMLContent,\n InsertionContent,\n MarkdownContent,\n} from '@intlayer/core/transpiler';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport type {\n DeclaredLocales,\n LocalesValues,\n} from '@intlayer/types/module_augmentation';\nimport type { NodeType } from '@intlayer/types/nodeType';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport type { HTMLComponents } from './html/types';\nimport {\n type IntlayerNode as IntlayerNodeCore,\n renderIntlayerNode,\n} from './renderIntlayerNode';\n\n/** ---------------------------------------------\n * INTLAYER NODE PLUGIN\n * --------------------------------------------- */\n\nexport type IntlayerNodeCond<T> = T extends number | string\n ? IntlayerNode<T>\n : never;\n\nexport type IntlayerNode<T, P = {}> = IntlayerNodeCore<T> & P;\n\nconst escapeHtmlAttr = (str: string): string =>\n str.replace(/&/g, '&').replace(/\"/g, '"');\n\nconst escapeHtmlText = (str: string): string =>\n str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n\nexport const intlayerNodePlugins: Plugins = {\n id: 'intlayer-node-plugin',\n canHandle: (node) =>\n typeof node === 'bigint' ||\n typeof node === 'string' ||\n typeof node === 'number',\n transform: (_node, { children, keyPath, dictionaryKey, ...rest }) => {\n if (process.env['INTLAYER_EDITOR_ENABLED'] !== 'false' && editor.enabled) {\n const rawStr = String(children ?? '');\n const keyPathJson = JSON.stringify(keyPath ?? []);\n const dictKey = String(dictionaryKey ?? '');\n\n /**\n * In editor mode, string coercion returns the wrapper HTML so that\n * `element.innerHTML = content.title` automatically inserts the\n * `<intlayer-content-selector-wrapper>` into the DOM.\n */\n const htmlStr = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(rawStr)}</intlayer-content-selector-wrapper>`;\n\n return renderIntlayerNode({\n ...rest,\n value: children as string,\n children: htmlStr,\n keyPath,\n dictionaryKey,\n additionalProps: {\n toElement: (): HTMLElement => {\n const wrapper = document.createElement(\n 'intlayer-content-selector-wrapper'\n );\n wrapper.setAttribute('key-path', keyPathJson);\n wrapper.setAttribute('dictionary-key', dictKey);\n wrapper.textContent = rawStr;\n return wrapper;\n },\n },\n });\n }\n\n return renderIntlayerNode({\n ...rest,\n value: children as string,\n children,\n });\n },\n};\n\n/** ---------------------------------------------\n * INSERTION PLUGIN\n * --------------------------------------------- */\n\nexport type InsertionCond<T, _S, L extends LocalesValues> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.INSERTION]: infer I;\n fields: readonly (infer F)[];\n}\n ? <V extends { [K in Extract<F, string>]: string | number }>(\n values: V\n ) => I extends string ? IntlayerNode<string> : DeepTransformContent<I, L>\n : never;\n\nexport const insertionPlugin: Plugins =\n process.env['INTLAYER_NODE_TYPE_INSERTION'] === 'false'\n ? fallbackPlugin\n : {\n id: 'insertion-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.INSERTION,\n transform: (node: InsertionContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n { type: NodeTypes.INSERTION },\n ];\n\n const children = node[NodeTypes.INSERTION];\n\n const insertionStringPlugin: Plugins = {\n id: 'insertion-string-plugin',\n canHandle: (node) => typeof node === 'string',\n transform: (node: string, subProps, deepTransformNode) => {\n const transformedResult = deepTransformNode(node, {\n ...subProps,\n children: node,\n plugins: (props.plugins ?? ([] as Plugins[])).filter(\n (plugin) => plugin.id !== 'intlayer-node-plugin'\n ),\n });\n\n return (\n values: {\n [K in InsertionContent['fields'][number]]: string | number;\n }\n ) => {\n const result = splitInsertionTemplate(\n transformedResult,\n values\n );\n const resultStr = result.isSimple\n ? (result.parts as string)\n : (result.parts as string[]).join('');\n\n return deepTransformNode(resultStr, {\n ...subProps,\n plugins: props.plugins,\n children: resultStr,\n });\n };\n },\n };\n\n const transformed = deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [insertionStringPlugin, ...(props.plugins ?? [])],\n });\n\n if (\n typeof children === 'object' &&\n children !== null &&\n 'nodeType' in children &&\n (\n [NodeTypes.ENUMERATION, NodeTypes.CONDITION] as NodeType[]\n ).includes(children.nodeType as NodeType)\n ) {\n return (values: any) => (arg: any) => {\n const inner = (transformed as (a: any) => any)(arg);\n return typeof inner === 'function' ? inner(values) : inner;\n };\n }\n\n return transformed;\n },\n };\n\n/** ---------------------------------------------\n * MARKDOWN PLUGIN\n * --------------------------------------------- */\n\nconst vanillaRuntime = {\n createElement: (tag: string, props: any, ...children: any[]) => {\n const attrs = Object.entries(props || {})\n .filter(\n ([key]) => key !== 'children' && key !== 'key' && key !== '_innerHTML'\n )\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n const innerHTML = props?._innerHTML;\n const childrenStr =\n innerHTML !== undefined ? innerHTML : children.flat(Infinity).join('');\n return `<${tag}${attrs ? ` ${attrs}` : ''}>${childrenStr}</${tag}>`;\n },\n normalizeProps: (_tag: string, props: Record<string, any>) => {\n const normalized: Record<string, any> = {};\n for (const [key, value] of Object.entries(props)) {\n if (key === 'className') {\n normalized.class = value;\n } else if (key === 'htmlFor') {\n normalized.for = value;\n } else if (key === 'dangerouslySetInnerHTML' && (value as any)?.__html) {\n normalized._innerHTML = (value as any).__html;\n } else {\n normalized[key] = value;\n }\n }\n return normalized;\n },\n};\n\nexport type MarkdownStringCond<T> = T extends string\n ? IntlayerNode<\n string,\n {\n metadata: DeepTransformContent<string>;\n /** Returns the rendered markdown; render with .use(). */\n use: (components?: HTMLComponents<'permissive', {}>) => string;\n }\n >\n : never;\n\nexport const markdownStringPlugin: Plugins =\n process.env['INTLAYER_NODE_TYPE_MARKDOWN'] === 'false'\n ? fallbackPlugin\n : {\n id: 'markdown-string-plugin',\n canHandle: (node) => typeof node === 'string',\n transform: (node: string, props, deepTransformNode) => {\n const { plugins: _plugins, ...rest } = props;\n const metadata = getMarkdownMetadata(node) ?? {};\n\n const metadataPlugins: Plugins = {\n id: 'markdown-metadata-plugin',\n canHandle: (metadataNode) =>\n typeof metadataNode === 'string' ||\n typeof metadataNode === 'number' ||\n typeof metadataNode === 'boolean' ||\n !metadataNode,\n transform: (metadataNode, subProps) =>\n renderIntlayerNode({\n ...subProps,\n value: metadataNode,\n children: node,\n }),\n };\n\n const metadataNodes = deepTransformNode(metadata, {\n plugins: [metadataPlugins],\n dictionaryKey: rest.dictionaryKey,\n keyPath: [],\n });\n\n const compile = (components: any = {}) =>\n compileWithOptions(\n node,\n {\n ...vanillaRuntime,\n createElement: (tag: any, props: any, ...children: any[]) => {\n const override = components[tag];\n if (typeof override === 'function') {\n return override({ ...props, children: children.join('') });\n }\n return vanillaRuntime.createElement(tag, props, ...children);\n },\n },\n {}\n ) as any;\n\n const value = compile();\n let children = node;\n\n if (\n process.env['INTLAYER_EDITOR_ENABLED'] !== 'false' &&\n editor.enabled\n ) {\n const keyPathJson = JSON.stringify(props.keyPath ?? []);\n const dictKey = String(props.dictionaryKey ?? '');\n children = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;\n }\n\n return renderIntlayerNode({\n ...props,\n value,\n children,\n additionalProps: {\n metadata: metadataNodes,\n use: (components?: any) => compile(components),\n },\n }) as any;\n },\n };\n\nexport type MarkdownCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.MARKDOWN]: infer M;\n metadata?: infer U;\n tags?: infer U;\n}\n ? {\n use: (components?: HTMLComponents<'permissive', U>) => IntlayerNode<M>;\n metadata: DeepTransformContent<U>;\n }\n : never;\n\nexport const markdownPlugin: Plugins =\n process.env['INTLAYER_NODE_TYPE_MARKDOWN'] === 'false'\n ? fallbackPlugin\n : {\n id: 'markdown-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.MARKDOWN,\n transform: (node: MarkdownContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n { type: NodeTypes.MARKDOWN },\n ];\n const children = node[NodeTypes.MARKDOWN];\n\n return deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [markdownStringPlugin, ...(props.plugins ?? [])],\n });\n },\n };\n\n/** ---------------------------------------------\n * HTML PLUGIN\n * --------------------------------------------- */\n\nexport type HTMLPluginCond<T> = T extends {\n nodeType: NodeType | string;\n [NodeTypes.HTML]: infer I;\n tags?: infer U;\n}\n ? {\n use: (components?: HTMLComponents<'permissive', U>) => IntlayerNode<I>;\n }\n : never;\n\nexport const htmlPlugin: Plugins =\n process.env['INTLAYER_NODE_TYPE_HTML'] === 'false'\n ? fallbackPlugin\n : {\n id: 'html-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeTypes.HTML,\n transform: (node: HTMLContent<string>, props) => {\n const htmlStr = node[NodeTypes.HTML];\n\n const use = (components: Record<string, any> = {}) => {\n const wrappedComponents = new Proxy(components, {\n get(target, prop) {\n if (typeof prop === 'string' && prop in target) {\n const Component = target[prop];\n return (props: any) => {\n const children = Array.isArray(props.children)\n ? props.children.join('')\n : props.children;\n return Component({ ...props, children });\n };\n }\n if (typeof prop === 'string' && /^[a-z][a-z0-9]*$/.test(prop)) {\n return (props: any) => {\n const attrs = Object.entries(props)\n .filter(([key]) => key !== 'children' && key !== 'key')\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n const children = Array.isArray(props.children)\n ? props.children.join('')\n : props.children;\n return `<${prop}${attrs ? ` ${attrs}` : ''}>${children}</${prop}>`;\n };\n }\n return undefined;\n },\n });\n\n const result = getHTML(htmlStr, wrappedComponents as any);\n return Array.isArray(result) ? result.join('') : result;\n };\n\n const value = use();\n let children = htmlStr;\n\n if (\n process.env['INTLAYER_EDITOR_ENABLED'] !== 'false' &&\n editor.enabled\n ) {\n const keyPathJson = JSON.stringify(props.keyPath ?? []);\n const dictKey = String(props.dictionaryKey ?? '');\n children = `<intlayer-content-selector-wrapper key-path=\"${escapeHtmlAttr(keyPathJson)}\" dictionary-key=\"${escapeHtmlAttr(dictKey)}\">${escapeHtmlText(value)}</intlayer-content-selector-wrapper>`;\n }\n\n return renderIntlayerNode({\n ...props,\n value,\n children,\n additionalProps: {\n use: (components?: any) => use(components),\n },\n });\n },\n };\n\n/** ---------------------------------------------\n * PLUGINS RESULT\n * --------------------------------------------- */\n\nexport interface IInterpreterPluginVanilla<T, S, L extends LocalesValues> {\n vanillaIntlayerNode: IntlayerNodeCond<T>;\n vanillaInsertion: InsertionCond<T, S, L>;\n vanillaMarkdown: MarkdownCond<T>;\n vanillaHtml: HTMLPluginCond<T>;\n}\n\n/**\n * Insert this type as param of `DeepTransformContent` to avoid `intlayer` package pollution.\n *\n * Otherwise the `vanilla-intlayer` plugins will override the types of `intlayer` functions.\n * Use `getIntlayer` from `vanilla-intlayer` (not from `intlayer`) to get properly typed\n * `IntlayerNode` wrappers with `.value` access on string/number content.\n */\nexport type IInterpreterPluginState = Omit<\n IInterpreterPluginStateCore,\n 'insertion'\n> & {\n vanillaIntlayerNode: true;\n vanillaInsertion: true;\n vanillaMarkdown: true;\n vanillaHtml: true;\n};\n\nexport type DeepTransformContent<\n T,\n L extends LocalesValues = DeclaredLocales,\n> = DeepTransformContentCore<T, IInterpreterPluginState, L>;\n\nconst pluginsCache = new Map<string, Plugins[]>();\n\n/**\n * Get the plugins array for Vanilla content transformation.\n * This function is used by both getIntlayer and getDictionary to ensure consistent plugin configuration.\n */\nexport const getPlugins = (\n locale?: LocalesValues,\n fallback = true\n): Plugins[] => {\n const currentLocale = locale ?? internationalization.defaultLocale;\n const cacheKey = `${currentLocale}_${fallback}`;\n\n if (pluginsCache.has(cacheKey)) {\n return pluginsCache.get(cacheKey)!;\n }\n\n const plugins = [\n translationPlugin(\n locale ?? internationalization.defaultLocale,\n fallback ? internationalization.defaultLocale : undefined\n ),\n enumerationPlugin,\n pluralPlugin(locale ?? internationalization.defaultLocale),\n conditionPlugin,\n nestedPlugin(locale ?? internationalization.defaultLocale),\n filePlugin,\n genderPlugin,\n intlayerNodePlugins,\n insertionPlugin,\n markdownPlugin,\n htmlPlugin,\n ] as Plugins[];\n\n pluginsCache.set(cacheKey, plugins);\n\n return plugins;\n};\n"],"mappings":";;;;;;;;;;AAgDA,MAAM,kBAAkB,QACtB,IAAI,QAAQ,MAAM,QAAQ,CAAC,QAAQ,MAAM,SAAS;AAEpD,MAAM,kBAAkB,QACtB,IAAI,QAAQ,MAAM,QAAQ,CAAC,QAAQ,MAAM,OAAO,CAAC,QAAQ,MAAM,OAAO;AAExE,MAAa,sBAA+B;CAC1C,IAAI;CACJ,YAAY,SACV,OAAO,SAAS,YAChB,OAAO,SAAS,YAChB,OAAO,SAAS;CAClB,YAAY,OAAO,EAAE,UAAU,SAAS,eAAe,GAAG,WAAW;AACnE,MAAI,QAAQ,IAAI,+BAA+B,WAAWA,8BAAO,SAAS;GACxE,MAAM,SAAS,OAAO,YAAY,GAAG;GACrC,MAAM,cAAc,KAAK,UAAU,WAAW,EAAE,CAAC;GACjD,MAAM,UAAU,OAAO,iBAAiB,GAAG;;;;;;GAO3C,MAAM,UAAU,gDAAgD,eAAe,YAAY,CAAC,oBAAoB,eAAe,QAAQ,CAAC,IAAI,eAAe,OAAO,CAAC;AAEnK,UAAOC,8CAAmB;IACxB,GAAG;IACH,OAAO;IACP,UAAU;IACV;IACA;IACA,iBAAiB,EACf,iBAA8B;KAC5B,MAAM,UAAU,SAAS,cACvB,oCACD;AACD,aAAQ,aAAa,YAAY,YAAY;AAC7C,aAAQ,aAAa,kBAAkB,QAAQ;AAC/C,aAAQ,cAAc;AACtB,YAAO;OAEV;IACF,CAAC;;AAGJ,SAAOA,8CAAmB;GACxB,GAAG;GACH,OAAO;GACP;GACD,CAAC;;CAEL;AAgBD,MAAa,kBACX,QAAQ,IAAI,oCAAoC,UAC5CC,4CACA;CACE,IAAI;CACJ,YAAY,SACV,OAAO,SAAS,YAAY,MAAM,aAAaC,yBAAU;CAC3D,YAAY,MAAwB,OAAO,sBAAsB;EAC/D,MAAM,aAAwB,CAC5B,GAAG,MAAM,SACT,EAAE,MAAMA,yBAAU,WAAW,CAC9B;EAED,MAAM,WAAW,KAAKA,yBAAU;EAEhC,MAAM,wBAAiC;GACrC,IAAI;GACJ,YAAY,SAAS,OAAO,SAAS;GACrC,YAAY,MAAc,UAAU,sBAAsB;IACxD,MAAM,oBAAoB,kBAAkB,MAAM;KAChD,GAAG;KACH,UAAU;KACV,UAAU,MAAM,WAAY,EAAE,EAAgB,QAC3C,WAAW,OAAO,OAAO,uBAC3B;KACF,CAAC;AAEF,YACE,WAGG;KACH,MAAM,gEACJ,mBACA,OACD;KACD,MAAM,YAAY,OAAO,WACpB,OAAO,QACP,OAAO,MAAmB,KAAK,GAAG;AAEvC,YAAO,kBAAkB,WAAW;MAClC,GAAG;MACH,SAAS,MAAM;MACf,UAAU;MACX,CAAC;;;GAGP;EAED,MAAM,cAAc,kBAAkB,UAAU;GAC9C,GAAG;GACH;GACA,SAAS;GACT,SAAS,CAAC,uBAAuB,GAAI,MAAM,WAAW,EAAE,CAAE;GAC3D,CAAC;AAEF,MACE,OAAO,aAAa,YACpB,aAAa,QACb,cAAc,YAEZ,CAACA,yBAAU,aAAaA,yBAAU,UAAU,CAC5C,SAAS,SAAS,SAAqB,CAEzC,SAAQ,YAAiB,QAAa;GACpC,MAAM,QAAS,YAAgC,IAAI;AACnD,UAAO,OAAO,UAAU,aAAa,MAAM,OAAO,GAAG;;AAIzD,SAAO;;CAEV;;;;AAMP,MAAM,iBAAiB;CACrB,gBAAgB,KAAa,OAAY,GAAG,aAAoB;EAC9D,MAAM,QAAQ,OAAO,QAAQ,SAAS,EAAE,CAAC,CACtC,QACE,CAAC,SAAS,QAAQ,cAAc,QAAQ,SAAS,QAAQ,aAC3D,CACA,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,IAAI,MAAM,GAAG,CAC1C,KAAK,IAAI;EACZ,MAAM,YAAY,OAAO;EACzB,MAAM,cACJ,cAAc,SAAY,YAAY,SAAS,KAAK,SAAS,CAAC,KAAK,GAAG;AACxE,SAAO,IAAI,MAAM,QAAQ,IAAI,UAAU,GAAG,GAAG,YAAY,IAAI,IAAI;;CAEnE,iBAAiB,MAAc,UAA+B;EAC5D,MAAM,aAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,KAAI,QAAQ,YACV,YAAW,QAAQ;WACV,QAAQ,UACjB,YAAW,MAAM;WACR,QAAQ,6BAA8B,OAAe,OAC9D,YAAW,aAAc,MAAc;MAEvC,YAAW,OAAO;AAGtB,SAAO;;CAEV;AAaD,MAAa,uBACX,QAAQ,IAAI,mCAAmC,UAC3CD,4CACA;CACE,IAAI;CACJ,YAAY,SAAS,OAAO,SAAS;CACrC,YAAY,MAAc,OAAO,sBAAsB;EACrD,MAAM,EAAE,SAAS,UAAU,GAAG,SAAS;EAkBvC,MAAM,gBAAgB,mEAjBe,KAAK,IAAI,EAAE,EAiBE;GAChD,SAAS,CAAC;IAfV,IAAI;IACJ,YAAY,iBACV,OAAO,iBAAiB,YACxB,OAAO,iBAAiB,YACxB,OAAO,iBAAiB,aACxB,CAAC;IACH,YAAY,cAAc,aACxBD,8CAAmB;KACjB,GAAG;KACH,OAAO;KACP,UAAU;KACX,CAAC;IAIqB,CAAC;GAC1B,eAAe,KAAK;GACpB,SAAS,EAAE;GACZ,CAAC;EAEF,MAAM,WAAW,aAAkB,EAAE,qDAEjC,MACA;GACE,GAAG;GACH,gBAAgB,KAAU,OAAY,GAAG,aAAoB;IAC3D,MAAM,WAAW,WAAW;AAC5B,QAAI,OAAO,aAAa,WACtB,QAAO,SAAS;KAAE,GAAG;KAAO,UAAU,SAAS,KAAK,GAAG;KAAE,CAAC;AAE5D,WAAO,eAAe,cAAc,KAAK,OAAO,GAAG,SAAS;;GAE/D,EACD,EAAE,CACH;EAEH,MAAM,QAAQ,SAAS;EACvB,IAAI,WAAW;AAEf,MACE,QAAQ,IAAI,+BAA+B,WAC3CD,8BAAO,SACP;GACA,MAAM,cAAc,KAAK,UAAU,MAAM,WAAW,EAAE,CAAC;GACvD,MAAM,UAAU,OAAO,MAAM,iBAAiB,GAAG;AACjD,cAAW,gDAAgD,eAAe,YAAY,CAAC,oBAAoB,eAAe,QAAQ,CAAC,IAAI,eAAe,MAAM,CAAC;;AAG/J,SAAOC,8CAAmB;GACxB,GAAG;GACH;GACA;GACA,iBAAiB;IACf,UAAU;IACV,MAAM,eAAqB,QAAQ,WAAW;IAC/C;GACF,CAAC;;CAEL;AAcP,MAAa,iBACX,QAAQ,IAAI,mCAAmC,UAC3CC,4CACA;CACE,IAAI;CACJ,YAAY,SACV,OAAO,SAAS,YAAY,MAAM,aAAaC,yBAAU;CAC3D,YAAY,MAAuB,OAAO,sBAAsB;EAC9D,MAAM,aAAwB,CAC5B,GAAG,MAAM,SACT,EAAE,MAAMA,yBAAU,UAAU,CAC7B;EACD,MAAM,WAAW,KAAKA,yBAAU;AAEhC,SAAO,kBAAkB,UAAU;GACjC,GAAG;GACH;GACA,SAAS;GACT,SAAS,CAAC,sBAAsB,GAAI,MAAM,WAAW,EAAE,CAAE;GAC1D,CAAC;;CAEL;AAgBP,MAAa,aACX,QAAQ,IAAI,+BAA+B,UACvCD,4CACA;CACE,IAAI;CACJ,YAAY,SACV,OAAO,SAAS,YAAY,MAAM,aAAaC,yBAAU;CAC3D,YAAY,MAA2B,UAAU;EAC/C,MAAM,UAAU,KAAKA,yBAAU;EAE/B,MAAM,OAAO,aAAkC,EAAE,KAAK;GA4BpD,MAAM,iDAAiB,SAAS,IA3BF,MAAM,YAAY,EAC9C,IAAI,QAAQ,MAAM;AAChB,QAAI,OAAO,SAAS,YAAY,QAAQ,QAAQ;KAC9C,MAAM,YAAY,OAAO;AACzB,aAAQ,UAAe;MACrB,MAAM,WAAW,MAAM,QAAQ,MAAM,SAAS,GAC1C,MAAM,SAAS,KAAK,GAAG,GACvB,MAAM;AACV,aAAO,UAAU;OAAE,GAAG;OAAO;OAAU,CAAC;;;AAG5C,QAAI,OAAO,SAAS,YAAY,mBAAmB,KAAK,KAAK,CAC3D,SAAQ,UAAe;KACrB,MAAM,QAAQ,OAAO,QAAQ,MAAM,CAChC,QAAQ,CAAC,SAAS,QAAQ,cAAc,QAAQ,MAAM,CACtD,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,IAAI,MAAM,GAAG,CAC1C,KAAK,IAAI;KACZ,MAAM,WAAW,MAAM,QAAQ,MAAM,SAAS,GAC1C,MAAM,SAAS,KAAK,GAAG,GACvB,MAAM;AACV,YAAO,IAAI,OAAO,QAAQ,IAAI,UAAU,GAAG,GAAG,SAAS,IAAI,KAAK;;MAKvE,CAEgD,CAAQ;AACzD,UAAO,MAAM,QAAQ,OAAO,GAAG,OAAO,KAAK,GAAG,GAAG;;EAGnD,MAAM,QAAQ,KAAK;EACnB,IAAI,WAAW;AAEf,MACE,QAAQ,IAAI,+BAA+B,WAC3CH,8BAAO,SACP;GACA,MAAM,cAAc,KAAK,UAAU,MAAM,WAAW,EAAE,CAAC;GACvD,MAAM,UAAU,OAAO,MAAM,iBAAiB,GAAG;AACjD,cAAW,gDAAgD,eAAe,YAAY,CAAC,oBAAoB,eAAe,QAAQ,CAAC,IAAI,eAAe,MAAM,CAAC;;AAG/J,SAAOC,8CAAmB;GACxB,GAAG;GACH;GACA;GACA,iBAAiB,EACf,MAAM,eAAqB,IAAI,WAAW,EAC3C;GACF,CAAC;;CAEL;AAmCP,MAAM,+BAAe,IAAI,KAAwB;;;;;AAMjD,MAAa,cACX,QACA,WAAW,SACG;CAEd,MAAM,WAAW,GADK,UAAUG,4CAAqB,cACnB,GAAG;AAErC,KAAI,aAAa,IAAI,SAAS,CAC5B,QAAO,aAAa,IAAI,SAAS;CAGnC,MAAM,UAAU;oDAEZ,UAAUA,4CAAqB,eAC/B,WAAWA,4CAAqB,gBAAgB,OACjD;EACDC;+CACa,UAAUD,4CAAqB,cAAc;EAC1DE;+CACa,UAAUF,4CAAqB,cAAc;EAC1DG;EACAC;EACA;EACA;EACA;EACA;EACD;AAED,cAAa,IAAI,UAAU,QAAQ;AAEnC,QAAO"}
|
|
@@ -1 +1,44 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
//#region src/renderIntlayerNode.ts
|
|
4
|
+
const renderIntlayerNode = ({ value, children, additionalProps = {} }) => {
|
|
5
|
+
let _value = value;
|
|
6
|
+
const displayOverride = typeof children === "string" && children !== String(value ?? "") ? children : null;
|
|
7
|
+
const node = {
|
|
8
|
+
toString: () => displayOverride ?? String(_value ?? ""),
|
|
9
|
+
valueOf: () => _value,
|
|
10
|
+
[Symbol.toPrimitive]: () => displayOverride ?? _value,
|
|
11
|
+
toJSON: () => _value,
|
|
12
|
+
get raw() {
|
|
13
|
+
return _value;
|
|
14
|
+
},
|
|
15
|
+
set raw(value) {
|
|
16
|
+
_value = value;
|
|
17
|
+
},
|
|
18
|
+
get value() {
|
|
19
|
+
return _value;
|
|
20
|
+
},
|
|
21
|
+
__update(next) {
|
|
22
|
+
_value = next?.raw ?? next?.value ?? next;
|
|
23
|
+
},
|
|
24
|
+
...additionalProps
|
|
25
|
+
};
|
|
26
|
+
if (_value !== null && _value !== void 0) {
|
|
27
|
+
const valObj = Object(_value);
|
|
28
|
+
const proto = Object.getPrototypeOf(valObj);
|
|
29
|
+
for (const prop of Object.getOwnPropertyNames(proto)) {
|
|
30
|
+
if (prop === "constructor" || prop in node) continue;
|
|
31
|
+
const valProp = valObj[prop];
|
|
32
|
+
if (typeof valProp === "function") Object.defineProperty(node, prop, {
|
|
33
|
+
value: valProp.bind(_value),
|
|
34
|
+
writable: true,
|
|
35
|
+
configurable: true
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return node;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
exports.renderIntlayerNode = renderIntlayerNode;
|
|
44
|
+
//# sourceMappingURL=renderIntlayerNode.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderIntlayerNode.cjs","names":[],"sources":["../../src/renderIntlayerNode.ts"],"sourcesContent":["import type { ResolvedEditor } from '@intlayer/types/module_augmentation';\n\nexport type IntlayerNode<T = string> = ResolvedEditor<\n T & {\n raw: T;\n value: T;\n toString: () => string;\n valueOf: () => T;\n toJSON: () => T;\n __update: (next: IntlayerNode<T>) => void;\n },\n {\n raw: T;\n value: T;\n toString: () => string;\n valueOf: () => T;\n toJSON: () => T;\n __update: (next: IntlayerNode<T>) => void;\n }\n> &\n T;\n\nexport const renderIntlayerNode = <\n T, // Broadened to support arrays, numbers, objects, etc.\n>({\n value,\n children,\n additionalProps = {},\n}: {\n value: T;\n children?: any;\n additionalProps?: Record<string, unknown>;\n [key: string]: unknown;\n}): IntlayerNode<T> => {\n let _value = value;\n\n // When children is a string that differs from value, it acts as a display\n // override (e.g. editor HTML wrapper). Otherwise toString/toPrimitive reflect\n // the live _value so that __update propagates.\n const displayOverride =\n typeof children === 'string' && children !== String(value ?? '')\n ? children\n : null;\n\n const node = {\n toString: () => displayOverride ?? String(_value ?? ''),\n valueOf: () => _value,\n [Symbol.toPrimitive]: () => displayOverride ?? _value,\n toJSON: () => _value,\n\n get raw() {\n return _value;\n },\n set raw(value: T) {\n _value = value;\n },\n\n get value() {\n return _value;\n },\n\n __update(next: any) {\n _value = next?.raw ?? next?.value ?? next;\n },\n\n ...additionalProps,\n };\n\n // Delegate native methods from the underlying value (any type) to node.\n if (_value !== null && _value !== undefined) {\n const valObj = Object(_value); // Safely boxes primitives (e.g., 50 -> Number object)\n const proto = Object.getPrototypeOf(valObj);\n for (const prop of Object.getOwnPropertyNames(proto)) {\n if (prop === 'constructor' || prop in node) continue;\n const valProp = valObj[prop]; // read from instance so length/index values are correct\n if (typeof valProp === 'function') {\n Object.defineProperty(node, prop, {\n value: valProp.bind(_value),\n writable: true,\n configurable: true,\n });\n }\n }\n }\n\n return node as unknown as IntlayerNode<T>;\n};\n"],"mappings":";;;AAsBA,MAAa,sBAEX,EACA,OACA,UACA,kBAAkB,EAAE,OAMC;CACrB,IAAI,SAAS;CAKb,MAAM,kBACJ,OAAO,aAAa,YAAY,aAAa,OAAO,SAAS,GAAG,GAC5D,WACA;CAEN,MAAM,OAAO;EACX,gBAAgB,mBAAmB,OAAO,UAAU,GAAG;EACvD,eAAe;GACd,OAAO,oBAAoB,mBAAmB;EAC/C,cAAc;EAEd,IAAI,MAAM;AACR,UAAO;;EAET,IAAI,IAAI,OAAU;AAChB,YAAS;;EAGX,IAAI,QAAQ;AACV,UAAO;;EAGT,SAAS,MAAW;AAClB,YAAS,MAAM,OAAO,MAAM,SAAS;;EAGvC,GAAG;EACJ;AAGD,KAAI,WAAW,QAAQ,WAAW,QAAW;EAC3C,MAAM,SAAS,OAAO,OAAO;EAC7B,MAAM,QAAQ,OAAO,eAAe,OAAO;AAC3C,OAAK,MAAM,QAAQ,OAAO,oBAAoB,MAAM,EAAE;AACpD,OAAI,SAAS,iBAAiB,QAAQ,KAAM;GAC5C,MAAM,UAAU,OAAO;AACvB,OAAI,OAAO,YAAY,WACrB,QAAO,eAAe,MAAM,MAAM;IAChC,OAAO,QAAQ,KAAK,OAAO;IAC3B,UAAU;IACV,cAAc;IACf,CAAC;;;AAKR,QAAO"}
|