@ox-content/vite-plugin-react 2.76.0 → 2.79.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/index.cjs CHANGED
@@ -88,6 +88,7 @@ async function transformMarkdownWithReact(code, id, options) {
88
88
  tables: true,
89
89
  taskLists: true,
90
90
  strikethrough: true,
91
+ autolinks: options.autolinks,
91
92
  highlight: false,
92
93
  highlightTheme: "github-dark",
93
94
  highlightLangs: [],
@@ -485,6 +486,7 @@ function resolveReactOptions(options) {
485
486
  base: options.base ?? "/",
486
487
  extensions: normalizeMarkdownExtensions(options.extensions),
487
488
  gfm: options.gfm ?? true,
489
+ autolinks: options.autolinks ?? options.gfm ?? true,
488
490
  frontmatter: options.frontmatter ?? true,
489
491
  toc: options.toc ?? true,
490
492
  tocMaxDepth: options.tocMaxDepth ?? 3,
package/dist/index.d.cts CHANGED
@@ -175,6 +175,7 @@ interface ResolvedReactOptions {
175
175
  base: string;
176
176
  extensions: string[];
177
177
  gfm: boolean;
178
+ autolinks: boolean;
178
179
  frontmatter: boolean;
179
180
  toc: boolean;
180
181
  tocMaxDepth: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/index.ts"],"mappings":";;;;;;;AASA;;;;UAAiB,sBAAA;EASA;;;;;EAHf,OAAA;AAAA;AAAA,UAGe,8BAAA;EACf,OAAA;EACA,OAAA;AAAA;;;;KAMU,aAAA,GAAgB,MAAA;AAmB5B;;;;;;;AAAA,KAVY,gBAAA,GAAmB,aAAA;;;;;;;;;UAUd,uBAAA,SAAgC,gBAAA;EAwDtC;;;AAMX;;;;EAtDE,UAAA;EAiEA;;;;;;AAwBF;;;;;;;;;;AA6BA;EAnGE,UAAA,GAAa,gBAAA;;;;;;;;EASb,eAAA,aAA4B,sBAAA;EAwGb;;;;;;;;EA9Ff,UAAA;EAgGgC;AAGlC;;;;;;;EAzFE,MAAA,GAAS,mBAAA;AAAA;;;;UAMM,kBAAA;EAyFf;;;;EApFA,KAAA;EAwFA;;;;EAlFA,KAAA;EAqFA;;;AAGF;EAlFE,QAAA;;;;;EAMA,cAAA;EAgFA;;;;EA1EA,cAAA;AAAA;;;;UAMe,qBAAA;EAyER;;;;EApEP,OAAA;EAuEO;;;;EAjEP,KAAA;EC9D4B;;;;EDoE5B,QAAA;ECpEqE;;;;ED0ErE,SAAA;AAAA;;;;UAMe,mBAAA;;;;;EAKf,MAAA,aAAmB,kBAAA;;;;;EAMnB,SAAA,aAAsB,qBAAA;AAAA;AAAA,UAGP,2BAAA;EACf,MAAA,EAAQ,kBAAA;EACR,SAAA,EAAW,qBAAA;AAAA;AAAA,UAGI,oBAAA;EACf,MAAA;EACA,MAAA;EACA,IAAA;EACA,UAAA;EACA,GAAA;EACA,WAAA;EACA,GAAA;EACA,WAAA;EACA,eAAA,EAAiB,8BAAA;EACjB,UAAA,EAAY,aAAA;EACZ,UAAA;EACA,MAAA,EAAQ,2BAAA;EACR,IAAA;AAAA;AAAA,UAGe,oBAAA;EACf,IAAA;EACA,GAAA;EACA,cAAA;EACA,WAAA,EAAa,MAAA;AAAA;AAAA,UAGE,eAAA;EACf,IAAA;EACA,KAAA,EAAO,MAAA;EACP,QAAA;EACA,EAAA;EACA,OAAA;AAAA;;;;AAxMF;;;;;AAQA;;;;;AASA;;;;;AAUA;;;;;;;iBC8CgB,cAAA,CAAe,OAAA,GAAS,uBAAA,GAA+B,YAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/index.ts"],"mappings":";;;;;;;AASA;;;;UAAiB,sBAAA;EASA;;;;;EAHf,OAAA;AAAA;AAAA,UAGe,8BAAA;EACf,OAAA;EACA,OAAA;AAAA;;;;KAMU,aAAA,GAAgB,MAAA;AAmB5B;;;;;;;AAAA,KAVY,gBAAA,GAAmB,aAAA;;;;;;;;;UAUd,uBAAA,SAAgC,gBAAA;EAwDtC;;;AAMX;;;;EAtDE,UAAA;EAiEA;;;;;;AAwBF;;;;;;;;;;AA6BA;EAnGE,UAAA,GAAa,gBAAA;;;;;;;;EASb,eAAA,aAA4B,sBAAA;EAwGb;;;;;;;;EA9Ff,UAAA;EAgGgC;AAGlC;;;;;;;EAzFE,MAAA,GAAS,mBAAA;AAAA;;;;UAMM,kBAAA;EAyFf;;;;EApFA,KAAA;EAwFiB;;;;EAlFjB,KAAA;EAqFQ;;;;EA/ER,QAAA;EAmFmC;;;;EA7EnC,cAAA;EAgFA;;;;EA1EA,cAAA;AAAA;;;;UAMe,qBAAA;EA0Ef;;;;EArEA,OAAA;EAwEO;;;;EAlEP,KAAA;EC9Dc;;;;EDoEd,QAAA;ECpE6B;;;;ED0E7B,SAAA;AAAA;;;;UAMe,mBAAA;;;;;EAKf,MAAA,aAAmB,kBAAA;;;;;EAMnB,SAAA,aAAsB,qBAAA;AAAA;AAAA,UAGP,2BAAA;EACf,MAAA,EAAQ,kBAAA;EACR,SAAA,EAAW,qBAAA;AAAA;AAAA,UAGI,oBAAA;EACf,MAAA;EACA,MAAA;EACA,IAAA;EACA,UAAA;EACA,GAAA;EACA,SAAA;EACA,WAAA;EACA,GAAA;EACA,WAAA;EACA,eAAA,EAAiB,8BAAA;EACjB,UAAA,EAAY,aAAA;EACZ,UAAA;EACA,MAAA,EAAQ,2BAAA;EACR,IAAA;AAAA;AAAA,UAGe,oBAAA;EACf,IAAA;EACA,GAAA;EACA,cAAA;EACA,WAAA,EAAa,MAAA;AAAA;AAAA,UAGE,eAAA;EACf,IAAA;EACA,KAAA,EAAO,MAAA;EACP,QAAA;EACA,EAAA;EACA,OAAA;AAAA;;;;AAzMF;;;;;AAQA;;;;;AASA;;;;;AAUA;;;;;;;iBC8CgB,cAAA,CAAe,OAAA,GAAS,uBAAA,GAA+B,YAAA"}
package/dist/index.d.mts CHANGED
@@ -175,6 +175,7 @@ interface ResolvedReactOptions {
175
175
  base: string;
176
176
  extensions: string[];
177
177
  gfm: boolean;
178
+ autolinks: boolean;
178
179
  frontmatter: boolean;
179
180
  toc: boolean;
180
181
  tocMaxDepth: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/index.ts"],"mappings":";;;;;;;AASA;;;;UAAiB,sBAAA;EASA;;;;;EAHf,OAAA;AAAA;AAAA,UAGe,8BAAA;EACf,OAAA;EACA,OAAA;AAAA;;;;KAMU,aAAA,GAAgB,MAAA;AAmB5B;;;;;;;AAAA,KAVY,gBAAA,GAAmB,aAAA;;;;;;;;;UAUd,uBAAA,SAAgC,gBAAA;EAwDtC;;;AAMX;;;;EAtDE,UAAA;EAiEA;;;;;;AAwBF;;;;;;;;;;AA6BA;EAnGE,UAAA,GAAa,gBAAA;;;;;;;;EASb,eAAA,aAA4B,sBAAA;EAwGb;;;;;;;;EA9Ff,UAAA;EAgGgC;AAGlC;;;;;;;EAzFE,MAAA,GAAS,mBAAA;AAAA;;;;UAMM,kBAAA;EAyFf;;;;EApFA,KAAA;EAwFA;;;;EAlFA,KAAA;EAqFA;;;AAGF;EAlFE,QAAA;;;;;EAMA,cAAA;EAgFA;;;;EA1EA,cAAA;AAAA;;;;UAMe,qBAAA;EAyER;;;;EApEP,OAAA;EAuEO;;;;EAjEP,KAAA;EC9D4B;;;;EDoE5B,QAAA;ECpEqE;;;;ED0ErE,SAAA;AAAA;;;;UAMe,mBAAA;;;;;EAKf,MAAA,aAAmB,kBAAA;;;;;EAMnB,SAAA,aAAsB,qBAAA;AAAA;AAAA,UAGP,2BAAA;EACf,MAAA,EAAQ,kBAAA;EACR,SAAA,EAAW,qBAAA;AAAA;AAAA,UAGI,oBAAA;EACf,MAAA;EACA,MAAA;EACA,IAAA;EACA,UAAA;EACA,GAAA;EACA,WAAA;EACA,GAAA;EACA,WAAA;EACA,eAAA,EAAiB,8BAAA;EACjB,UAAA,EAAY,aAAA;EACZ,UAAA;EACA,MAAA,EAAQ,2BAAA;EACR,IAAA;AAAA;AAAA,UAGe,oBAAA;EACf,IAAA;EACA,GAAA;EACA,cAAA;EACA,WAAA,EAAa,MAAA;AAAA;AAAA,UAGE,eAAA;EACf,IAAA;EACA,KAAA,EAAO,MAAA;EACP,QAAA;EACA,EAAA;EACA,OAAA;AAAA;;;;AAxMF;;;;;AAQA;;;;;AASA;;;;;AAUA;;;;;;;iBC8CgB,cAAA,CAAe,OAAA,GAAS,uBAAA,GAA+B,YAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/index.ts"],"mappings":";;;;;;;AASA;;;;UAAiB,sBAAA;EASA;;;;;EAHf,OAAA;AAAA;AAAA,UAGe,8BAAA;EACf,OAAA;EACA,OAAA;AAAA;;;;KAMU,aAAA,GAAgB,MAAA;AAmB5B;;;;;;;AAAA,KAVY,gBAAA,GAAmB,aAAA;;;;;;;;;UAUd,uBAAA,SAAgC,gBAAA;EAwDtC;;;AAMX;;;;EAtDE,UAAA;EAiEA;;;;;;AAwBF;;;;;;;;;;AA6BA;EAnGE,UAAA,GAAa,gBAAA;;;;;;;;EASb,eAAA,aAA4B,sBAAA;EAwGb;;;;;;;;EA9Ff,UAAA;EAgGgC;AAGlC;;;;;;;EAzFE,MAAA,GAAS,mBAAA;AAAA;;;;UAMM,kBAAA;EAyFf;;;;EApFA,KAAA;EAwFiB;;;;EAlFjB,KAAA;EAqFQ;;;;EA/ER,QAAA;EAmFmC;;;;EA7EnC,cAAA;EAgFA;;;;EA1EA,cAAA;AAAA;;;;UAMe,qBAAA;EA0Ef;;;;EArEA,OAAA;EAwEO;;;;EAlEP,KAAA;EC9Dc;;;;EDoEd,QAAA;ECpE6B;;;;ED0E7B,SAAA;AAAA;;;;UAMe,mBAAA;;;;;EAKf,MAAA,aAAmB,kBAAA;;;;;EAMnB,SAAA,aAAsB,qBAAA;AAAA;AAAA,UAGP,2BAAA;EACf,MAAA,EAAQ,kBAAA;EACR,SAAA,EAAW,qBAAA;AAAA;AAAA,UAGI,oBAAA;EACf,MAAA;EACA,MAAA;EACA,IAAA;EACA,UAAA;EACA,GAAA;EACA,SAAA;EACA,WAAA;EACA,GAAA;EACA,WAAA;EACA,eAAA,EAAiB,8BAAA;EACjB,UAAA,EAAY,aAAA;EACZ,UAAA;EACA,MAAA,EAAQ,2BAAA;EACR,IAAA;AAAA;AAAA,UAGe,oBAAA;EACf,IAAA;EACA,GAAA;EACA,cAAA;EACA,WAAA,EAAa,MAAA;AAAA;AAAA,UAGE,eAAA;EACf,IAAA;EACA,KAAA,EAAO,MAAA;EACP,QAAA;EACA,EAAA;EACA,OAAA;AAAA;;;;AAzMF;;;;;AAQA;;;;;AASA;;;;;AAUA;;;;;;;iBC8CgB,cAAA,CAAe,OAAA,GAAS,uBAAA,GAA+B,YAAA"}
package/dist/index.mjs CHANGED
@@ -63,6 +63,7 @@ async function transformMarkdownWithReact(code, id, options) {
63
63
  tables: true,
64
64
  taskLists: true,
65
65
  strikethrough: true,
66
+ autolinks: options.autolinks,
66
67
  highlight: false,
67
68
  highlightTheme: "github-dark",
68
69
  highlightLangs: [],
@@ -460,6 +461,7 @@ function resolveReactOptions(options) {
460
461
  base: options.base ?? "/",
461
462
  extensions: normalizeMarkdownExtensions(options.extensions),
462
463
  gfm: options.gfm ?? true,
464
+ autolinks: options.autolinks ?? options.gfm ?? true,
463
465
  frontmatter: options.frontmatter ?? true,
464
466
  toc: options.toc ?? true,
465
467
  tocMaxDepth: options.tocMaxDepth ?? 3,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["baseTransformMarkdown","oxContent"],"sources":["../src/transform.ts","../src/environment.ts","../src/index.ts"],"sourcesContent":["import * as path from \"path\";\nimport { transformMarkdown as baseTransformMarkdown } from \"@ox-content/vite-plugin\";\nimport type {\n ResolvedReactOptions,\n ReactTransformResult,\n ComponentIsland,\n ComponentsMap,\n} from \"./types\";\n\nconst COMPONENT_REGEX = /<([A-Z][a-zA-Z0-9]*)\\s*([^>]*?)\\s*(?:\\/>|>([\\s\\S]*?)<\\/\\1>)/g;\nconst PROP_REGEX = /([a-zA-Z0-9-]+)(?:=(?:\"([^\"]*)\"|'([^']*)'|{([^}]*)}|\\[([^\\]]*)\\]))?/g;\n\nconst ISLAND_MARKER_PREFIX = \"OXCONTENT-ISLAND-\";\nconst ISLAND_MARKER_SUFFIX = \"-PLACEHOLDER\";\n\ninterface Range {\n start: number;\n end: number;\n}\n\nexport async function transformMarkdownWithReact(\n code: string,\n id: string,\n options: ResolvedReactOptions,\n): Promise<ReactTransformResult> {\n const components: ComponentsMap = options.components;\n const usedComponents: string[] = [];\n const islands: ComponentIsland[] = [];\n let islandIndex = 0;\n\n const { content: markdownContent, frontmatter } = extractFrontmatter(code);\n const fenceRanges = collectFenceRanges(markdownContent);\n let processedContent = \"\";\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n COMPONENT_REGEX.lastIndex = 0;\n while ((match = COMPONENT_REGEX.exec(markdownContent)) !== null) {\n const [fullMatch, componentName, propsString, rawIslandContent] = match;\n const matchStart = match.index;\n const matchEnd = matchStart + fullMatch.length;\n\n if (\n !Object.prototype.hasOwnProperty.call(components, componentName) ||\n isInRanges(matchStart, matchEnd, fenceRanges)\n ) {\n processedContent += markdownContent.slice(lastIndex, matchEnd);\n lastIndex = matchEnd;\n continue;\n }\n\n if (!usedComponents.includes(componentName)) {\n usedComponents.push(componentName);\n }\n\n const props = parseProps(propsString);\n const islandId = `ox-island-${islandIndex++}`;\n const islandContent =\n typeof rawIslandContent === \"string\" ? rawIslandContent.trim() : undefined;\n\n islands.push({\n name: componentName,\n props,\n position: matchStart,\n id: islandId,\n content: islandContent,\n });\n\n processedContent += markdownContent.slice(lastIndex, matchStart) + createIslandMarker(islandId);\n lastIndex = matchEnd;\n }\n processedContent += markdownContent.slice(lastIndex);\n\n const baseOptions = {\n srcDir: options.srcDir,\n outDir: options.outDir,\n base: options.base,\n extensions: options.extensions,\n ssg: {\n enabled: false,\n extension: \".html\",\n clean: false,\n bare: false,\n generateOgImage: false,\n lastUpdated: false,\n },\n gfm: options.gfm,\n frontmatter: false,\n toc: options.toc,\n tocMaxDepth: options.tocMaxDepth,\n codeAnnotations: options.codeAnnotations,\n footnotes: true,\n tables: true,\n taskLists: true,\n strikethrough: true,\n highlight: false,\n highlightTheme: \"github-dark\",\n highlightLangs: [],\n mermaid: false,\n ogImage: false,\n ogImageOptions: {\n vuePlugin: \"vitejs\",\n width: 1200,\n height: 630,\n cache: true,\n concurrency: 1,\n },\n transformers: [],\n docs: false,\n ogViewer: false,\n search: {\n enabled: false,\n limit: 10,\n prefix: true,\n placeholder: \"Search...\",\n hotkey: \"k\",\n },\n embeds: options.embeds,\n i18n: false,\n } as unknown as Parameters<typeof baseTransformMarkdown>[2] & {\n codeAnnotations?: ResolvedReactOptions[\"codeAnnotations\"];\n };\n\n const transformed = await baseTransformMarkdown(processedContent, id, baseOptions);\n\n const htmlWithIslands = injectIslandMarkers(transformed.html, islands);\n const jsxCode = generateReactModule(\n htmlWithIslands,\n usedComponents,\n islands,\n frontmatter,\n options,\n id,\n );\n\n return {\n code: jsxCode,\n map: null,\n usedComponents,\n frontmatter,\n };\n}\n\nfunction createIslandMarker(islandId: string): string {\n return `${ISLAND_MARKER_PREFIX}${islandId}${ISLAND_MARKER_SUFFIX}`;\n}\n\nfunction collectFenceRanges(content: string): Range[] {\n const ranges: Range[] = [];\n let inFence = false;\n let fenceChar = \"\";\n let fenceLength = 0;\n let fenceStart = 0;\n let pos = 0;\n\n while (pos < content.length) {\n const lineEnd = content.indexOf(\"\\n\", pos);\n const next = lineEnd === -1 ? content.length : lineEnd + 1;\n const line = content.slice(pos, lineEnd === -1 ? content.length : lineEnd);\n const fenceMatch = line.match(/^\\s{0,3}([`~]{3,})/);\n\n if (fenceMatch) {\n const marker = fenceMatch[1];\n if (!inFence) {\n inFence = true;\n fenceChar = marker[0];\n fenceLength = marker.length;\n fenceStart = pos;\n } else if (marker[0] === fenceChar && marker.length >= fenceLength) {\n inFence = false;\n ranges.push({ start: fenceStart, end: next });\n fenceChar = \"\";\n fenceLength = 0;\n }\n }\n\n pos = next;\n }\n\n if (inFence) {\n ranges.push({ start: fenceStart, end: content.length });\n }\n\n return ranges;\n}\n\nfunction isInRanges(start: number, end: number, ranges: Range[]): boolean {\n for (const range of ranges) {\n if (start < range.end && end > range.start) {\n return true;\n }\n }\n return false;\n}\n\nfunction injectIslandMarkers(html: string, islands: ComponentIsland[]): string {\n let output = html;\n\n for (const island of islands) {\n const marker = createIslandMarker(island.id);\n const propsAttr =\n Object.keys(island.props).length > 0\n ? ` data-ox-props='${JSON.stringify(island.props).replace(/'/g, \"&#39;\")}'`\n : \"\";\n const contentAttr = island.content\n ? ` data-ox-content='${island.content.replace(/'/g, \"&#39;\")}'`\n : \"\";\n const attrs = `data-ox-island=\"${island.name}\"${propsAttr}${contentAttr}`;\n output = output.replaceAll(`<p>${marker}</p>`, `<div ${attrs}></div>`);\n output = output.replaceAll(marker, `<span ${attrs}></span>`);\n }\n\n return output;\n}\n\nfunction extractFrontmatter(content: string): {\n content: string;\n frontmatter: Record<string, unknown>;\n} {\n const frontmatterRegex = /^---\\n([\\s\\S]*?)\\n---\\n/;\n const match = frontmatterRegex.exec(content);\n\n if (!match) {\n return { content, frontmatter: {} };\n }\n\n const frontmatterStr = match[1];\n const frontmatter: Record<string, unknown> = {};\n\n for (const line of frontmatterStr.split(\"\\n\")) {\n const colonIndex = line.indexOf(\":\");\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n let value: unknown = line.slice(colonIndex + 1).trim();\n try {\n value = JSON.parse(value as string);\n } catch {\n if (\n typeof value === \"string\" &&\n ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\")))\n ) {\n value = value.slice(1, -1);\n }\n }\n frontmatter[key] = value;\n }\n }\n\n return { content: content.slice(match[0].length), frontmatter };\n}\n\nfunction parseProps(propsString: string): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n if (!propsString) return props;\n\n PROP_REGEX.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = PROP_REGEX.exec(propsString)) !== null) {\n const [, name, doubleQuoted, singleQuoted, braceValue, bracketValue] = match;\n if (name) {\n if (doubleQuoted !== undefined) props[name] = doubleQuoted;\n else if (singleQuoted !== undefined) props[name] = singleQuoted;\n else if (braceValue !== undefined) {\n try {\n props[name] = JSON.parse(braceValue);\n } catch {\n props[name] = braceValue;\n }\n } else if (bracketValue !== undefined) {\n try {\n props[name] = JSON.parse(`[${bracketValue}]`);\n } catch {\n props[name] = bracketValue;\n }\n } else props[name] = true;\n }\n }\n return props;\n}\n\nfunction generateReactModule(\n content: string,\n usedComponents: string[],\n islands: ComponentIsland[],\n frontmatter: Record<string, unknown>,\n options: ResolvedReactOptions & { root?: string },\n id: string,\n): string {\n const mdDir = path.dirname(id);\n const root = options.root || process.cwd();\n\n const imports = usedComponents\n .map((name) => {\n const componentPath = options.components[name];\n if (!componentPath) return \"\";\n const absolutePath = path.resolve(root, componentPath.replace(/^\\.\\//, \"\"));\n const relativePath = path.relative(mdDir, absolutePath).replace(/\\\\/g, \"/\");\n const importPath = relativePath.startsWith(\".\") ? relativePath : \"./\" + relativePath;\n return `import ${name} from '${importPath}';`;\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n const componentMap = usedComponents.map((name) => ` ${name},`).join(\"\\n\");\n\n // If no islands, generate simpler code without island runtime\n if (islands.length === 0) {\n return `\nimport React, { createElement } from 'react';\n\nexport const frontmatter = ${JSON.stringify(frontmatter)};\n\nconst rawHtml = ${JSON.stringify(content)};\n\nexport default function MarkdownContent() {\n return createElement('div', {\n className: 'ox-content',\n dangerouslySetInnerHTML: { __html: rawHtml },\n });\n}\n`;\n }\n\n return `\nimport React, { useEffect, useRef, createElement } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { initIslands } from '@ox-content/islands';\n${imports}\n\nexport const frontmatter = ${JSON.stringify(frontmatter)};\n\nconst rawHtml = ${JSON.stringify(content)};\nconst components = {\n${componentMap}\n};\n\nfunction createReactHydrate() {\n const mountedRoots = [];\n\n return (element, props) => {\n const componentName = element.dataset.oxIsland;\n const Component = components[componentName];\n if (!Component) return;\n\n const islandContent = element.dataset.oxContent || element.innerHTML;\n const vnode = islandContent\n ? createElement(\n Component,\n props,\n createElement('div', { dangerouslySetInnerHTML: { __html: islandContent } })\n )\n : createElement(Component, props);\n\n const root = createRoot(element);\n root.render(vnode);\n mountedRoots.push(root);\n\n return () => root.unmount();\n };\n}\n\nexport default function MarkdownContent() {\n const containerRef = useRef(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const controller = initIslands(createReactHydrate(), {\n selector: '.ox-content [data-ox-island]',\n });\n return () => controller.destroy();\n }, []);\n\n return createElement('div', {\n className: 'ox-content',\n ref: containerRef,\n dangerouslySetInnerHTML: { __html: rawHtml },\n });\n}\n`;\n}\n","import type { EnvironmentOptions } from \"vite\";\nimport type { ResolvedReactOptions } from \"./types\";\n\nexport function createReactMarkdownEnvironment(\n mode: \"ssr\" | \"client\",\n options: ResolvedReactOptions,\n): EnvironmentOptions {\n const isSSR = mode === \"ssr\";\n\n return {\n build: {\n outDir: isSSR ? `${options.outDir}/.ox-content/ssr` : `${options.outDir}/.ox-content/client`,\n ssr: isSSR,\n rollupOptions: {\n output: {\n format: \"esm\",\n entryFileNames: isSSR ? \"[name].js\" : \"[name].[hash].js\",\n },\n },\n ...(isSSR && { target: \"node18\", minify: false }),\n },\n resolve: {\n conditions: isSSR ? [\"node\", \"import\"] : [\"browser\", \"import\"],\n },\n optimizeDeps: {\n include: isSSR ? [] : [\"react\", \"react-dom\"],\n exclude: [\"@ox-content/vite-plugin\", \"@ox-content/vite-plugin-react\"],\n },\n };\n}\n","/**\n * Vite Plugin for Ox Content React Integration\n *\n * Uses Vite's Environment API to enable embedding React components in Markdown.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { Plugin, PluginOption, ResolvedConfig } from \"vite\";\nimport { oxContent } from \"@ox-content/vite-plugin\";\nimport { transformMarkdownWithReact } from \"./transform\";\nimport { createReactMarkdownEnvironment } from \"./environment\";\nimport type {\n ReactIntegrationOptions,\n ResolvedReactOptions,\n ComponentsMap,\n ComponentsOption,\n BuiltinEmbedOptions,\n} from \"./types\";\n\nconst DEFAULT_MARKDOWN_EXTENSIONS = [\".md\", \".markdown\", \".mdx\"] as const;\n\nfunction normalizeMarkdownExtensions(extensions?: readonly string[]): string[] {\n const values = extensions?.length ? extensions : DEFAULT_MARKDOWN_EXTENSIONS;\n return Array.from(\n new Map(\n values.map((extension) => {\n const value = extension.startsWith(\".\") ? extension : `.${extension}`;\n return [value.toLowerCase(), value] as const;\n }),\n ).values(),\n );\n}\n\nfunction isMarkdownFilePath(filePath: string, extensions: readonly string[]): boolean {\n const pathname = filePath.split(\"?\")[0].split(\"#\")[0].toLowerCase();\n return extensions.some((extension) => pathname.endsWith(extension.toLowerCase()));\n}\n\nfunction resolveBuiltinEmbedOptions(\n options: BuiltinEmbedOptions | false | undefined,\n): ResolvedReactOptions[\"embeds\"] {\n if (options === false) return { github: false, openGraph: false };\n return {\n github: resolveSingleEmbedOptions(options?.github),\n openGraph: resolveSingleEmbedOptions(options?.openGraph),\n };\n}\n\nfunction resolveSingleEmbedOptions<T extends object>(options: boolean | T | undefined): T | false {\n if (options === false) return false;\n if (options === true || options === undefined) return {} as T;\n return options;\n}\n\nexport type {\n ReactIntegrationOptions,\n ResolvedReactOptions,\n ComponentsOption,\n ComponentsMap,\n BuiltinEmbedOptions,\n GitHubEmbedOptions,\n OpenGraphEmbedOptions,\n ResolvedBuiltinEmbedOptions,\n ReactTransformResult,\n ComponentIsland,\n} from \"./types\";\n\n/**\n * Creates the Ox Content React integration plugin.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { defineConfig } from 'vite';\n * import react from '@vitejs/plugin-react';\n * import { oxContentReact } from 'vite-plugin-ox-content-react';\n *\n * export default defineConfig({\n * plugins: [\n * react(),\n * oxContentReact({\n * srcDir: 'docs',\n * components: {\n * Counter: './src/components/Counter.tsx',\n * },\n * }),\n * ],\n * });\n * ```\n */\nexport function oxContentReact(options: ReactIntegrationOptions = {}): PluginOption[] {\n const resolved = resolveReactOptions(options);\n let componentMap = new Map<string, string>();\n let config: ResolvedConfig;\n\n if (typeof options.components === \"object\" && !Array.isArray(options.components)) {\n componentMap = new Map(Object.entries(options.components));\n }\n\n const reactTransformPlugin: Plugin = {\n name: \"ox-content:react-transform\",\n enforce: \"pre\",\n\n async configResolved(resolvedConfig) {\n config = resolvedConfig;\n\n const componentsOption = options.components;\n if (componentsOption) {\n const resolvedComponents = await resolveComponentsGlob(componentsOption, config.root);\n componentMap = new Map(Object.entries(resolvedComponents));\n }\n },\n\n async transform(code, id) {\n if (!isMarkdownFilePath(id, resolved.extensions)) {\n return null;\n }\n\n const result = await transformMarkdownWithReact(code, id, {\n ...resolved,\n components: Object.fromEntries(componentMap),\n root: config.root,\n });\n\n return {\n code: result.code,\n map: result.map,\n };\n },\n };\n\n const reactEnvironmentPlugin: Plugin = {\n name: \"ox-content:react-environment\",\n\n config() {\n const envOptions = {\n ...resolved,\n components: Object.fromEntries(componentMap),\n };\n return {\n environments: {\n oxcontent_ssr: createReactMarkdownEnvironment(\"ssr\", envOptions),\n oxcontent_client: createReactMarkdownEnvironment(\"client\", envOptions),\n },\n };\n },\n\n resolveId(id) {\n if (id === \"virtual:ox-content-react/runtime\") {\n return \"\\0virtual:ox-content-react/runtime\";\n }\n if (id === \"virtual:ox-content-react/components\") {\n return \"\\0virtual:ox-content-react/components\";\n }\n return null;\n },\n\n load(id) {\n if (id === \"\\0virtual:ox-content-react/runtime\") {\n return generateRuntimeModule();\n }\n if (id === \"\\0virtual:ox-content-react/components\") {\n return generateComponentsModule(componentMap);\n }\n return null;\n },\n\n applyToEnvironment(environment) {\n return [\"oxcontent_ssr\", \"oxcontent_client\", \"client\", \"ssr\"].includes(environment.name);\n },\n };\n\n const reactHmrPlugin: Plugin = {\n name: \"ox-content:react-hmr\",\n apply: \"serve\",\n\n handleHotUpdate({ file, server, modules }) {\n const isComponent = Array.from(componentMap.values()).some((path) =>\n file.endsWith(path.replace(/^\\.\\//, \"\")),\n );\n\n if (isComponent) {\n const mdModules = Array.from(server.moduleGraph.idToModuleMap.values()).filter(\n (mod) => mod.file && isMarkdownFilePath(mod.file, resolved.extensions),\n );\n\n if (mdModules.length > 0) {\n server.ws.send({\n type: \"custom\",\n event: \"ox-content:react-update\",\n data: { file },\n });\n return [...modules, ...mdModules];\n }\n }\n\n return modules;\n },\n };\n\n const basePlugins = oxContent(options).flatMap((plugin) =>\n Array.isArray(plugin) ? plugin : [plugin],\n ) as Plugin[];\n const environmentPlugin = basePlugins.find((plugin) => plugin.name === \"ox-content:environment\");\n const plugins: Plugin[] = [reactTransformPlugin, reactEnvironmentPlugin, reactHmrPlugin];\n\n if (environmentPlugin) {\n plugins.push(environmentPlugin);\n }\n\n return plugins;\n}\n\nfunction resolveReactOptions(\n options: ReactIntegrationOptions,\n): Omit<ResolvedReactOptions, \"components\"> {\n return {\n srcDir: options.srcDir ?? \"docs\",\n outDir: options.outDir ?? \"dist\",\n base: options.base ?? \"/\",\n extensions: normalizeMarkdownExtensions(options.extensions),\n gfm: options.gfm ?? true,\n frontmatter: options.frontmatter ?? true,\n toc: options.toc ?? true,\n tocMaxDepth: options.tocMaxDepth ?? 3,\n codeAnnotations: resolveCodeAnnotationsOptions(options.codeAnnotations),\n jsxRuntime: options.jsxRuntime ?? \"automatic\",\n embeds: resolveBuiltinEmbedOptions(options.embeds),\n };\n}\n\nfunction resolveCodeAnnotationsOptions(\n options: ReactIntegrationOptions[\"codeAnnotations\"],\n): ResolvedReactOptions[\"codeAnnotations\"] {\n if (!options) {\n return {\n enabled: false,\n metaKey: \"annotate\",\n };\n }\n\n if (options === true) {\n return {\n enabled: true,\n metaKey: \"annotate\",\n };\n }\n\n return {\n enabled: true,\n metaKey: options.metaKey ?? \"annotate\",\n };\n}\n\nfunction generateRuntimeModule(): string {\n return `\nimport React, { useState, useEffect } from 'react';\n\nexport function OxContentRenderer({ content, components = {} }) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!content) return null;\n\n const { html, frontmatter, islands } = content;\n\n if (!mounted) {\n return React.createElement('div', {\n className: 'ox-content',\n dangerouslySetInnerHTML: { __html: html },\n });\n }\n\n return React.createElement('div', { className: 'ox-content' },\n islands.map((island) => {\n const Component = components[island.name];\n return Component\n ? React.createElement(Component, { key: island.id, ...island.props })\n : null;\n })\n );\n}\n\nexport function useOxContent() {\n return { OxContentRenderer };\n}\n`;\n}\n\nfunction generateComponentsModule(componentMap: Map<string, string>): string {\n const imports: string[] = [];\n const exports: string[] = [];\n\n componentMap.forEach((path, name) => {\n imports.push(`import ${name} from '${path}';`);\n exports.push(` ${name},`);\n });\n\n return `\n${imports.join(\"\\n\")}\n\nexport const components = {\n${exports.join(\"\\n\")}\n};\n\nexport default components;\n`;\n}\n\nasync function resolveComponentsGlob(\n componentsOption: ComponentsOption,\n root: string,\n): Promise<ComponentsMap> {\n if (typeof componentsOption === \"object\" && !Array.isArray(componentsOption)) {\n return componentsOption;\n }\n\n const patterns = Array.isArray(componentsOption) ? componentsOption : [componentsOption];\n\n const result: ComponentsMap = {};\n\n for (const pattern of patterns) {\n const files = await globFiles(pattern, root);\n\n for (const file of files) {\n const baseName = path.basename(file, path.extname(file));\n const componentName = toPascalCase(baseName);\n const relativePath = \"./\" + path.relative(root, file).replace(/\\\\/g, \"/\");\n\n result[componentName] = relativePath;\n }\n }\n\n return result;\n}\n\nasync function globFiles(pattern: string, root: string): Promise<string[]> {\n const files: string[] = [];\n const isGlob = pattern.includes(\"*\");\n\n if (!isGlob) {\n const fullPath = path.resolve(root, pattern);\n if (fs.existsSync(fullPath)) {\n files.push(fullPath);\n }\n return files;\n }\n\n const parts = pattern.split(\"*\");\n const baseDir = path.resolve(root, parts[0]);\n const ext = parts[1] || \"\";\n\n if (!fs.existsSync(baseDir)) {\n return files;\n }\n\n if (pattern.includes(\"**\")) {\n await walkDir(baseDir, files, ext);\n } else {\n const entries = await fs.promises.readdir(baseDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(ext)) {\n files.push(path.join(baseDir, entry.name));\n }\n }\n }\n\n return files;\n}\n\nasync function walkDir(dir: string, files: string[], ext: string): Promise<void> {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n await walkDir(fullPath, files, ext);\n } else if (entry.isFile() && entry.name.endsWith(ext)) {\n files.push(fullPath);\n }\n }\n}\n\nfunction toPascalCase(str: string): string {\n return str.replace(/[-_](\\w)/g, (_, c) => c.toUpperCase()).replace(/^\\w/, (c) => c.toUpperCase());\n}\n\nexport { oxContent } from \"@ox-content/vite-plugin\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["baseTransformMarkdown","oxContent"],"sources":["../src/transform.ts","../src/environment.ts","../src/index.ts"],"sourcesContent":["import * as path from \"path\";\nimport { transformMarkdown as baseTransformMarkdown } from \"@ox-content/vite-plugin\";\nimport type {\n ResolvedReactOptions,\n ReactTransformResult,\n ComponentIsland,\n ComponentsMap,\n} from \"./types\";\n\nconst COMPONENT_REGEX = /<([A-Z][a-zA-Z0-9]*)\\s*([^>]*?)\\s*(?:\\/>|>([\\s\\S]*?)<\\/\\1>)/g;\nconst PROP_REGEX = /([a-zA-Z0-9-]+)(?:=(?:\"([^\"]*)\"|'([^']*)'|{([^}]*)}|\\[([^\\]]*)\\]))?/g;\n\nconst ISLAND_MARKER_PREFIX = \"OXCONTENT-ISLAND-\";\nconst ISLAND_MARKER_SUFFIX = \"-PLACEHOLDER\";\n\ninterface Range {\n start: number;\n end: number;\n}\n\nexport async function transformMarkdownWithReact(\n code: string,\n id: string,\n options: ResolvedReactOptions,\n): Promise<ReactTransformResult> {\n const components: ComponentsMap = options.components;\n const usedComponents: string[] = [];\n const islands: ComponentIsland[] = [];\n let islandIndex = 0;\n\n const { content: markdownContent, frontmatter } = extractFrontmatter(code);\n const fenceRanges = collectFenceRanges(markdownContent);\n let processedContent = \"\";\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n COMPONENT_REGEX.lastIndex = 0;\n while ((match = COMPONENT_REGEX.exec(markdownContent)) !== null) {\n const [fullMatch, componentName, propsString, rawIslandContent] = match;\n const matchStart = match.index;\n const matchEnd = matchStart + fullMatch.length;\n\n if (\n !Object.prototype.hasOwnProperty.call(components, componentName) ||\n isInRanges(matchStart, matchEnd, fenceRanges)\n ) {\n processedContent += markdownContent.slice(lastIndex, matchEnd);\n lastIndex = matchEnd;\n continue;\n }\n\n if (!usedComponents.includes(componentName)) {\n usedComponents.push(componentName);\n }\n\n const props = parseProps(propsString);\n const islandId = `ox-island-${islandIndex++}`;\n const islandContent =\n typeof rawIslandContent === \"string\" ? rawIslandContent.trim() : undefined;\n\n islands.push({\n name: componentName,\n props,\n position: matchStart,\n id: islandId,\n content: islandContent,\n });\n\n processedContent += markdownContent.slice(lastIndex, matchStart) + createIslandMarker(islandId);\n lastIndex = matchEnd;\n }\n processedContent += markdownContent.slice(lastIndex);\n\n const baseOptions = {\n srcDir: options.srcDir,\n outDir: options.outDir,\n base: options.base,\n extensions: options.extensions,\n ssg: {\n enabled: false,\n extension: \".html\",\n clean: false,\n bare: false,\n generateOgImage: false,\n lastUpdated: false,\n },\n gfm: options.gfm,\n frontmatter: false,\n toc: options.toc,\n tocMaxDepth: options.tocMaxDepth,\n codeAnnotations: options.codeAnnotations,\n footnotes: true,\n tables: true,\n taskLists: true,\n strikethrough: true,\n autolinks: options.autolinks,\n highlight: false,\n highlightTheme: \"github-dark\",\n highlightLangs: [],\n mermaid: false,\n ogImage: false,\n ogImageOptions: {\n vuePlugin: \"vitejs\",\n width: 1200,\n height: 630,\n cache: true,\n concurrency: 1,\n },\n transformers: [],\n docs: false,\n ogViewer: false,\n search: {\n enabled: false,\n limit: 10,\n prefix: true,\n placeholder: \"Search...\",\n hotkey: \"k\",\n },\n embeds: options.embeds,\n i18n: false,\n } as unknown as Parameters<typeof baseTransformMarkdown>[2] & {\n codeAnnotations?: ResolvedReactOptions[\"codeAnnotations\"];\n };\n\n const transformed = await baseTransformMarkdown(processedContent, id, baseOptions);\n\n const htmlWithIslands = injectIslandMarkers(transformed.html, islands);\n const jsxCode = generateReactModule(\n htmlWithIslands,\n usedComponents,\n islands,\n frontmatter,\n options,\n id,\n );\n\n return {\n code: jsxCode,\n map: null,\n usedComponents,\n frontmatter,\n };\n}\n\nfunction createIslandMarker(islandId: string): string {\n return `${ISLAND_MARKER_PREFIX}${islandId}${ISLAND_MARKER_SUFFIX}`;\n}\n\nfunction collectFenceRanges(content: string): Range[] {\n const ranges: Range[] = [];\n let inFence = false;\n let fenceChar = \"\";\n let fenceLength = 0;\n let fenceStart = 0;\n let pos = 0;\n\n while (pos < content.length) {\n const lineEnd = content.indexOf(\"\\n\", pos);\n const next = lineEnd === -1 ? content.length : lineEnd + 1;\n const line = content.slice(pos, lineEnd === -1 ? content.length : lineEnd);\n const fenceMatch = line.match(/^\\s{0,3}([`~]{3,})/);\n\n if (fenceMatch) {\n const marker = fenceMatch[1];\n if (!inFence) {\n inFence = true;\n fenceChar = marker[0];\n fenceLength = marker.length;\n fenceStart = pos;\n } else if (marker[0] === fenceChar && marker.length >= fenceLength) {\n inFence = false;\n ranges.push({ start: fenceStart, end: next });\n fenceChar = \"\";\n fenceLength = 0;\n }\n }\n\n pos = next;\n }\n\n if (inFence) {\n ranges.push({ start: fenceStart, end: content.length });\n }\n\n return ranges;\n}\n\nfunction isInRanges(start: number, end: number, ranges: Range[]): boolean {\n for (const range of ranges) {\n if (start < range.end && end > range.start) {\n return true;\n }\n }\n return false;\n}\n\nfunction injectIslandMarkers(html: string, islands: ComponentIsland[]): string {\n let output = html;\n\n for (const island of islands) {\n const marker = createIslandMarker(island.id);\n const propsAttr =\n Object.keys(island.props).length > 0\n ? ` data-ox-props='${JSON.stringify(island.props).replace(/'/g, \"&#39;\")}'`\n : \"\";\n const contentAttr = island.content\n ? ` data-ox-content='${island.content.replace(/'/g, \"&#39;\")}'`\n : \"\";\n const attrs = `data-ox-island=\"${island.name}\"${propsAttr}${contentAttr}`;\n output = output.replaceAll(`<p>${marker}</p>`, `<div ${attrs}></div>`);\n output = output.replaceAll(marker, `<span ${attrs}></span>`);\n }\n\n return output;\n}\n\nfunction extractFrontmatter(content: string): {\n content: string;\n frontmatter: Record<string, unknown>;\n} {\n const frontmatterRegex = /^---\\n([\\s\\S]*?)\\n---\\n/;\n const match = frontmatterRegex.exec(content);\n\n if (!match) {\n return { content, frontmatter: {} };\n }\n\n const frontmatterStr = match[1];\n const frontmatter: Record<string, unknown> = {};\n\n for (const line of frontmatterStr.split(\"\\n\")) {\n const colonIndex = line.indexOf(\":\");\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n let value: unknown = line.slice(colonIndex + 1).trim();\n try {\n value = JSON.parse(value as string);\n } catch {\n if (\n typeof value === \"string\" &&\n ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\")))\n ) {\n value = value.slice(1, -1);\n }\n }\n frontmatter[key] = value;\n }\n }\n\n return { content: content.slice(match[0].length), frontmatter };\n}\n\nfunction parseProps(propsString: string): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n if (!propsString) return props;\n\n PROP_REGEX.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = PROP_REGEX.exec(propsString)) !== null) {\n const [, name, doubleQuoted, singleQuoted, braceValue, bracketValue] = match;\n if (name) {\n if (doubleQuoted !== undefined) props[name] = doubleQuoted;\n else if (singleQuoted !== undefined) props[name] = singleQuoted;\n else if (braceValue !== undefined) {\n try {\n props[name] = JSON.parse(braceValue);\n } catch {\n props[name] = braceValue;\n }\n } else if (bracketValue !== undefined) {\n try {\n props[name] = JSON.parse(`[${bracketValue}]`);\n } catch {\n props[name] = bracketValue;\n }\n } else props[name] = true;\n }\n }\n return props;\n}\n\nfunction generateReactModule(\n content: string,\n usedComponents: string[],\n islands: ComponentIsland[],\n frontmatter: Record<string, unknown>,\n options: ResolvedReactOptions & { root?: string },\n id: string,\n): string {\n const mdDir = path.dirname(id);\n const root = options.root || process.cwd();\n\n const imports = usedComponents\n .map((name) => {\n const componentPath = options.components[name];\n if (!componentPath) return \"\";\n const absolutePath = path.resolve(root, componentPath.replace(/^\\.\\//, \"\"));\n const relativePath = path.relative(mdDir, absolutePath).replace(/\\\\/g, \"/\");\n const importPath = relativePath.startsWith(\".\") ? relativePath : \"./\" + relativePath;\n return `import ${name} from '${importPath}';`;\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n const componentMap = usedComponents.map((name) => ` ${name},`).join(\"\\n\");\n\n // If no islands, generate simpler code without island runtime\n if (islands.length === 0) {\n return `\nimport React, { createElement } from 'react';\n\nexport const frontmatter = ${JSON.stringify(frontmatter)};\n\nconst rawHtml = ${JSON.stringify(content)};\n\nexport default function MarkdownContent() {\n return createElement('div', {\n className: 'ox-content',\n dangerouslySetInnerHTML: { __html: rawHtml },\n });\n}\n`;\n }\n\n return `\nimport React, { useEffect, useRef, createElement } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { initIslands } from '@ox-content/islands';\n${imports}\n\nexport const frontmatter = ${JSON.stringify(frontmatter)};\n\nconst rawHtml = ${JSON.stringify(content)};\nconst components = {\n${componentMap}\n};\n\nfunction createReactHydrate() {\n const mountedRoots = [];\n\n return (element, props) => {\n const componentName = element.dataset.oxIsland;\n const Component = components[componentName];\n if (!Component) return;\n\n const islandContent = element.dataset.oxContent || element.innerHTML;\n const vnode = islandContent\n ? createElement(\n Component,\n props,\n createElement('div', { dangerouslySetInnerHTML: { __html: islandContent } })\n )\n : createElement(Component, props);\n\n const root = createRoot(element);\n root.render(vnode);\n mountedRoots.push(root);\n\n return () => root.unmount();\n };\n}\n\nexport default function MarkdownContent() {\n const containerRef = useRef(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const controller = initIslands(createReactHydrate(), {\n selector: '.ox-content [data-ox-island]',\n });\n return () => controller.destroy();\n }, []);\n\n return createElement('div', {\n className: 'ox-content',\n ref: containerRef,\n dangerouslySetInnerHTML: { __html: rawHtml },\n });\n}\n`;\n}\n","import type { EnvironmentOptions } from \"vite\";\nimport type { ResolvedReactOptions } from \"./types\";\n\nexport function createReactMarkdownEnvironment(\n mode: \"ssr\" | \"client\",\n options: ResolvedReactOptions,\n): EnvironmentOptions {\n const isSSR = mode === \"ssr\";\n\n return {\n build: {\n outDir: isSSR ? `${options.outDir}/.ox-content/ssr` : `${options.outDir}/.ox-content/client`,\n ssr: isSSR,\n rollupOptions: {\n output: {\n format: \"esm\",\n entryFileNames: isSSR ? \"[name].js\" : \"[name].[hash].js\",\n },\n },\n ...(isSSR && { target: \"node18\", minify: false }),\n },\n resolve: {\n conditions: isSSR ? [\"node\", \"import\"] : [\"browser\", \"import\"],\n },\n optimizeDeps: {\n include: isSSR ? [] : [\"react\", \"react-dom\"],\n exclude: [\"@ox-content/vite-plugin\", \"@ox-content/vite-plugin-react\"],\n },\n };\n}\n","/**\n * Vite Plugin for Ox Content React Integration\n *\n * Uses Vite's Environment API to enable embedding React components in Markdown.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { Plugin, PluginOption, ResolvedConfig } from \"vite\";\nimport { oxContent } from \"@ox-content/vite-plugin\";\nimport { transformMarkdownWithReact } from \"./transform\";\nimport { createReactMarkdownEnvironment } from \"./environment\";\nimport type {\n ReactIntegrationOptions,\n ResolvedReactOptions,\n ComponentsMap,\n ComponentsOption,\n BuiltinEmbedOptions,\n} from \"./types\";\n\nconst DEFAULT_MARKDOWN_EXTENSIONS = [\".md\", \".markdown\", \".mdx\"] as const;\n\nfunction normalizeMarkdownExtensions(extensions?: readonly string[]): string[] {\n const values = extensions?.length ? extensions : DEFAULT_MARKDOWN_EXTENSIONS;\n return Array.from(\n new Map(\n values.map((extension) => {\n const value = extension.startsWith(\".\") ? extension : `.${extension}`;\n return [value.toLowerCase(), value] as const;\n }),\n ).values(),\n );\n}\n\nfunction isMarkdownFilePath(filePath: string, extensions: readonly string[]): boolean {\n const pathname = filePath.split(\"?\")[0].split(\"#\")[0].toLowerCase();\n return extensions.some((extension) => pathname.endsWith(extension.toLowerCase()));\n}\n\nfunction resolveBuiltinEmbedOptions(\n options: BuiltinEmbedOptions | false | undefined,\n): ResolvedReactOptions[\"embeds\"] {\n if (options === false) return { github: false, openGraph: false };\n return {\n github: resolveSingleEmbedOptions(options?.github),\n openGraph: resolveSingleEmbedOptions(options?.openGraph),\n };\n}\n\nfunction resolveSingleEmbedOptions<T extends object>(options: boolean | T | undefined): T | false {\n if (options === false) return false;\n if (options === true || options === undefined) return {} as T;\n return options;\n}\n\nexport type {\n ReactIntegrationOptions,\n ResolvedReactOptions,\n ComponentsOption,\n ComponentsMap,\n BuiltinEmbedOptions,\n GitHubEmbedOptions,\n OpenGraphEmbedOptions,\n ResolvedBuiltinEmbedOptions,\n ReactTransformResult,\n ComponentIsland,\n} from \"./types\";\n\n/**\n * Creates the Ox Content React integration plugin.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { defineConfig } from 'vite';\n * import react from '@vitejs/plugin-react';\n * import { oxContentReact } from 'vite-plugin-ox-content-react';\n *\n * export default defineConfig({\n * plugins: [\n * react(),\n * oxContentReact({\n * srcDir: 'docs',\n * components: {\n * Counter: './src/components/Counter.tsx',\n * },\n * }),\n * ],\n * });\n * ```\n */\nexport function oxContentReact(options: ReactIntegrationOptions = {}): PluginOption[] {\n const resolved = resolveReactOptions(options);\n let componentMap = new Map<string, string>();\n let config: ResolvedConfig;\n\n if (typeof options.components === \"object\" && !Array.isArray(options.components)) {\n componentMap = new Map(Object.entries(options.components));\n }\n\n const reactTransformPlugin: Plugin = {\n name: \"ox-content:react-transform\",\n enforce: \"pre\",\n\n async configResolved(resolvedConfig) {\n config = resolvedConfig;\n\n const componentsOption = options.components;\n if (componentsOption) {\n const resolvedComponents = await resolveComponentsGlob(componentsOption, config.root);\n componentMap = new Map(Object.entries(resolvedComponents));\n }\n },\n\n async transform(code, id) {\n if (!isMarkdownFilePath(id, resolved.extensions)) {\n return null;\n }\n\n const result = await transformMarkdownWithReact(code, id, {\n ...resolved,\n components: Object.fromEntries(componentMap),\n root: config.root,\n });\n\n return {\n code: result.code,\n map: result.map,\n };\n },\n };\n\n const reactEnvironmentPlugin: Plugin = {\n name: \"ox-content:react-environment\",\n\n config() {\n const envOptions = {\n ...resolved,\n components: Object.fromEntries(componentMap),\n };\n return {\n environments: {\n oxcontent_ssr: createReactMarkdownEnvironment(\"ssr\", envOptions),\n oxcontent_client: createReactMarkdownEnvironment(\"client\", envOptions),\n },\n };\n },\n\n resolveId(id) {\n if (id === \"virtual:ox-content-react/runtime\") {\n return \"\\0virtual:ox-content-react/runtime\";\n }\n if (id === \"virtual:ox-content-react/components\") {\n return \"\\0virtual:ox-content-react/components\";\n }\n return null;\n },\n\n load(id) {\n if (id === \"\\0virtual:ox-content-react/runtime\") {\n return generateRuntimeModule();\n }\n if (id === \"\\0virtual:ox-content-react/components\") {\n return generateComponentsModule(componentMap);\n }\n return null;\n },\n\n applyToEnvironment(environment) {\n return [\"oxcontent_ssr\", \"oxcontent_client\", \"client\", \"ssr\"].includes(environment.name);\n },\n };\n\n const reactHmrPlugin: Plugin = {\n name: \"ox-content:react-hmr\",\n apply: \"serve\",\n\n handleHotUpdate({ file, server, modules }) {\n const isComponent = Array.from(componentMap.values()).some((path) =>\n file.endsWith(path.replace(/^\\.\\//, \"\")),\n );\n\n if (isComponent) {\n const mdModules = Array.from(server.moduleGraph.idToModuleMap.values()).filter(\n (mod) => mod.file && isMarkdownFilePath(mod.file, resolved.extensions),\n );\n\n if (mdModules.length > 0) {\n server.ws.send({\n type: \"custom\",\n event: \"ox-content:react-update\",\n data: { file },\n });\n return [...modules, ...mdModules];\n }\n }\n\n return modules;\n },\n };\n\n const basePlugins = oxContent(options).flatMap((plugin) =>\n Array.isArray(plugin) ? plugin : [plugin],\n ) as Plugin[];\n const environmentPlugin = basePlugins.find((plugin) => plugin.name === \"ox-content:environment\");\n const plugins: Plugin[] = [reactTransformPlugin, reactEnvironmentPlugin, reactHmrPlugin];\n\n if (environmentPlugin) {\n plugins.push(environmentPlugin);\n }\n\n return plugins;\n}\n\nfunction resolveReactOptions(\n options: ReactIntegrationOptions,\n): Omit<ResolvedReactOptions, \"components\"> {\n return {\n srcDir: options.srcDir ?? \"docs\",\n outDir: options.outDir ?? \"dist\",\n base: options.base ?? \"/\",\n extensions: normalizeMarkdownExtensions(options.extensions),\n gfm: options.gfm ?? true,\n autolinks: options.autolinks ?? options.gfm ?? true,\n frontmatter: options.frontmatter ?? true,\n toc: options.toc ?? true,\n tocMaxDepth: options.tocMaxDepth ?? 3,\n codeAnnotations: resolveCodeAnnotationsOptions(options.codeAnnotations),\n jsxRuntime: options.jsxRuntime ?? \"automatic\",\n embeds: resolveBuiltinEmbedOptions(options.embeds),\n };\n}\n\nfunction resolveCodeAnnotationsOptions(\n options: ReactIntegrationOptions[\"codeAnnotations\"],\n): ResolvedReactOptions[\"codeAnnotations\"] {\n if (!options) {\n return {\n enabled: false,\n metaKey: \"annotate\",\n };\n }\n\n if (options === true) {\n return {\n enabled: true,\n metaKey: \"annotate\",\n };\n }\n\n return {\n enabled: true,\n metaKey: options.metaKey ?? \"annotate\",\n };\n}\n\nfunction generateRuntimeModule(): string {\n return `\nimport React, { useState, useEffect } from 'react';\n\nexport function OxContentRenderer({ content, components = {} }) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!content) return null;\n\n const { html, frontmatter, islands } = content;\n\n if (!mounted) {\n return React.createElement('div', {\n className: 'ox-content',\n dangerouslySetInnerHTML: { __html: html },\n });\n }\n\n return React.createElement('div', { className: 'ox-content' },\n islands.map((island) => {\n const Component = components[island.name];\n return Component\n ? React.createElement(Component, { key: island.id, ...island.props })\n : null;\n })\n );\n}\n\nexport function useOxContent() {\n return { OxContentRenderer };\n}\n`;\n}\n\nfunction generateComponentsModule(componentMap: Map<string, string>): string {\n const imports: string[] = [];\n const exports: string[] = [];\n\n componentMap.forEach((path, name) => {\n imports.push(`import ${name} from '${path}';`);\n exports.push(` ${name},`);\n });\n\n return `\n${imports.join(\"\\n\")}\n\nexport const components = {\n${exports.join(\"\\n\")}\n};\n\nexport default components;\n`;\n}\n\nasync function resolveComponentsGlob(\n componentsOption: ComponentsOption,\n root: string,\n): Promise<ComponentsMap> {\n if (typeof componentsOption === \"object\" && !Array.isArray(componentsOption)) {\n return componentsOption;\n }\n\n const patterns = Array.isArray(componentsOption) ? componentsOption : [componentsOption];\n\n const result: ComponentsMap = {};\n\n for (const pattern of patterns) {\n const files = await globFiles(pattern, root);\n\n for (const file of files) {\n const baseName = path.basename(file, path.extname(file));\n const componentName = toPascalCase(baseName);\n const relativePath = \"./\" + path.relative(root, file).replace(/\\\\/g, \"/\");\n\n result[componentName] = relativePath;\n }\n }\n\n return result;\n}\n\nasync function globFiles(pattern: string, root: string): Promise<string[]> {\n const files: string[] = [];\n const isGlob = pattern.includes(\"*\");\n\n if (!isGlob) {\n const fullPath = path.resolve(root, pattern);\n if (fs.existsSync(fullPath)) {\n files.push(fullPath);\n }\n return files;\n }\n\n const parts = pattern.split(\"*\");\n const baseDir = path.resolve(root, parts[0]);\n const ext = parts[1] || \"\";\n\n if (!fs.existsSync(baseDir)) {\n return files;\n }\n\n if (pattern.includes(\"**\")) {\n await walkDir(baseDir, files, ext);\n } else {\n const entries = await fs.promises.readdir(baseDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(ext)) {\n files.push(path.join(baseDir, entry.name));\n }\n }\n }\n\n return files;\n}\n\nasync function walkDir(dir: string, files: string[], ext: string): Promise<void> {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n await walkDir(fullPath, files, ext);\n } else if (entry.isFile() && entry.name.endsWith(ext)) {\n files.push(fullPath);\n }\n }\n}\n\nfunction toPascalCase(str: string): string {\n return str.replace(/[-_](\\w)/g, (_, c) => c.toUpperCase()).replace(/^\\w/, (c) => c.toUpperCase());\n}\n\nexport { oxContent } from \"@ox-content/vite-plugin\";\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ox-content/vite-plugin-react",
3
- "version": "2.76.0",
3
+ "version": "2.79.0",
4
4
  "description": "React integration for Ox Content - Embed React components in Markdown",
5
5
  "keywords": [
6
6
  "markdown",
@@ -35,8 +35,8 @@
35
35
  "provenance": true
36
36
  },
37
37
  "dependencies": {
38
- "@ox-content/islands": "2.76.0",
39
- "@ox-content/vite-plugin": "2.76.0"
38
+ "@ox-content/islands": "2.79.0",
39
+ "@ox-content/vite-plugin": "2.79.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/node": "^25.8.0",