@ox-content/vite-plugin-react 2.9.0 → 2.11.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
@@ -70,6 +70,7 @@ async function transformMarkdownWithReact(code, id, options) {
70
70
  srcDir: options.srcDir,
71
71
  outDir: options.outDir,
72
72
  base: options.base,
73
+ extensions: options.extensions,
73
74
  ssg: {
74
75
  enabled: false,
75
76
  extension: ".html",
@@ -109,6 +110,7 @@ async function transformMarkdownWithReact(code, id, options) {
109
110
  placeholder: "Search...",
110
111
  hotkey: "k"
111
112
  },
113
+ embeds: options.embeds,
112
114
  i18n: false
113
115
  };
114
116
  return {
@@ -335,6 +337,37 @@ function createReactMarkdownEnvironment(mode, options) {
335
337
  *
336
338
  * Uses Vite's Environment API to enable embedding React components in Markdown.
337
339
  */
340
+ const DEFAULT_MARKDOWN_EXTENSIONS = [
341
+ ".md",
342
+ ".markdown",
343
+ ".mdx"
344
+ ];
345
+ function normalizeMarkdownExtensions(extensions) {
346
+ const values = extensions?.length ? extensions : DEFAULT_MARKDOWN_EXTENSIONS;
347
+ return Array.from(new Map(values.map((extension) => {
348
+ const value = extension.startsWith(".") ? extension : `.${extension}`;
349
+ return [value.toLowerCase(), value];
350
+ })).values());
351
+ }
352
+ function isMarkdownFilePath(filePath, extensions) {
353
+ const pathname = filePath.split("?")[0].split("#")[0].toLowerCase();
354
+ return extensions.some((extension) => pathname.endsWith(extension.toLowerCase()));
355
+ }
356
+ function resolveBuiltinEmbedOptions(options) {
357
+ if (options === false) return {
358
+ github: false,
359
+ openGraph: false
360
+ };
361
+ return {
362
+ github: resolveSingleEmbedOptions(options?.github),
363
+ openGraph: resolveSingleEmbedOptions(options?.openGraph)
364
+ };
365
+ }
366
+ function resolveSingleEmbedOptions(options) {
367
+ if (options === false) return false;
368
+ if (options === true || options === void 0) return {};
369
+ return options;
370
+ }
338
371
  /**
339
372
  * Creates the Ox Content React integration plugin.
340
373
  *
@@ -375,7 +408,7 @@ function oxContentReact(options = {}) {
375
408
  }
376
409
  },
377
410
  async transform(code, id) {
378
- if (!id.endsWith(".md")) return null;
411
+ if (!isMarkdownFilePath(id, resolved.extensions)) return null;
379
412
  const result = await transformMarkdownWithReact(code, id, {
380
413
  ...resolved,
381
414
  components: Object.fromEntries(componentMap),
@@ -423,7 +456,7 @@ function oxContentReact(options = {}) {
423
456
  apply: "serve",
424
457
  handleHotUpdate({ file, server, modules }) {
425
458
  if (Array.from(componentMap.values()).some((path$1) => file.endsWith(path$1.replace(/^\.\//, "")))) {
426
- const mdModules = Array.from(server.moduleGraph.idToModuleMap.values()).filter((mod) => mod.file?.endsWith(".md"));
459
+ const mdModules = Array.from(server.moduleGraph.idToModuleMap.values()).filter((mod) => mod.file && isMarkdownFilePath(mod.file, resolved.extensions));
427
460
  if (mdModules.length > 0) {
428
461
  server.ws.send({
429
462
  type: "custom",
@@ -450,12 +483,14 @@ function resolveReactOptions(options) {
450
483
  srcDir: options.srcDir ?? "docs",
451
484
  outDir: options.outDir ?? "dist",
452
485
  base: options.base ?? "/",
486
+ extensions: normalizeMarkdownExtensions(options.extensions),
453
487
  gfm: options.gfm ?? true,
454
488
  frontmatter: options.frontmatter ?? true,
455
489
  toc: options.toc ?? true,
456
490
  tocMaxDepth: options.tocMaxDepth ?? 3,
457
491
  codeAnnotations: resolveCodeAnnotationsOptions(options.codeAnnotations),
458
- jsxRuntime: options.jsxRuntime ?? "automatic"
492
+ jsxRuntime: options.jsxRuntime ?? "automatic",
493
+ embeds: resolveBuiltinEmbedOptions(options.embeds)
459
494
  };
460
495
  }
461
496
  function resolveCodeAnnotationsOptions(options) {
package/dist/index.d.cts CHANGED
@@ -16,6 +16,11 @@ type ComponentsMap = Record<string, string>;
16
16
  */
17
17
  type ComponentsOption = ComponentsMap | string | string[];
18
18
  interface ReactIntegrationOptions extends OxContentOptions {
19
+ /**
20
+ * Markdown-like file extensions to process.
21
+ * @default ['.md', '.markdown', '.mdx']
22
+ */
23
+ extensions?: string[];
19
24
  /**
20
25
  * Components to register for use in Markdown.
21
26
  * Can be a map of names to paths, a glob pattern, or an array of globs.
@@ -33,11 +38,34 @@ interface ReactIntegrationOptions extends OxContentOptions {
33
38
  components?: ComponentsOption;
34
39
  codeAnnotations?: boolean | CodeAnnotationsOptions;
35
40
  jsxRuntime?: "automatic" | "classic";
41
+ embeds?: BuiltinEmbedOptions | false;
42
+ }
43
+ interface GitHubEmbedOptions {
44
+ token?: string;
45
+ cache?: boolean;
46
+ cacheTTL?: number;
47
+ maxSourceBytes?: number;
48
+ maxSourceLines?: number;
49
+ }
50
+ interface OpenGraphEmbedOptions {
51
+ timeout?: number;
52
+ cache?: boolean;
53
+ cacheTTL?: number;
54
+ userAgent?: string;
55
+ }
56
+ interface BuiltinEmbedOptions {
57
+ github?: boolean | GitHubEmbedOptions;
58
+ openGraph?: boolean | OpenGraphEmbedOptions;
59
+ }
60
+ interface ResolvedBuiltinEmbedOptions {
61
+ github: GitHubEmbedOptions | false;
62
+ openGraph: OpenGraphEmbedOptions | false;
36
63
  }
37
64
  interface ResolvedReactOptions {
38
65
  srcDir: string;
39
66
  outDir: string;
40
67
  base: string;
68
+ extensions: string[];
41
69
  gfm: boolean;
42
70
  frontmatter: boolean;
43
71
  toc: boolean;
@@ -45,6 +73,7 @@ interface ResolvedReactOptions {
45
73
  codeAnnotations: ResolvedCodeAnnotationsOptions;
46
74
  components: ComponentsMap;
47
75
  jsxRuntime: "automatic" | "classic";
76
+ embeds: ResolvedBuiltinEmbedOptions;
48
77
  root?: string;
49
78
  }
50
79
  interface ReactTransformResult {
@@ -87,5 +116,5 @@ interface ComponentIsland {
87
116
  */
88
117
  declare function oxContentReact(options?: ReactIntegrationOptions): PluginOption[];
89
118
  //#endregion
90
- export { type ComponentIsland, type ComponentsMap, type ComponentsOption, type ReactIntegrationOptions, type ReactTransformResult, type ResolvedReactOptions, oxContent, oxContentReact };
119
+ export { type BuiltinEmbedOptions, type ComponentIsland, type ComponentsMap, type ComponentsOption, type GitHubEmbedOptions, type OpenGraphEmbedOptions, type ReactIntegrationOptions, type ReactTransformResult, type ResolvedBuiltinEmbedOptions, type ResolvedReactOptions, oxContent, oxContentReact };
91
120
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/index.ts"],"mappings":";;;;UAEiB,sBAAA;EACf,OAAA;AAAA;AAAA,UAGe,8BAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,aAAA,GAAgB,MAAA;AAL5B;;;;AAAA,KAWY,gBAAA,GAAmB,aAAA;AAAA,UAEd,uBAAA,SAAgC,gBAAA;EARxB;;;;AAMzB;;;;;AAEA;;;;;EAeE,UAAA,GAAa,gBAAA;EACb,eAAA,aAA4B,sBAAA;EAC5B,UAAA;AAAA;AAAA,UAGe,oBAAA;EACf,MAAA;EACA,MAAA;EACA,IAAA;EACA,GAAA;EACA,WAAA;EACA,GAAA;EACA,WAAA;EACA,eAAA,EAAiB,8BAAA;EACjB,UAAA,EAAY,aAAA;EACZ,UAAA;EACA,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;;;;AA3DF;;;;;AAKA;;;;;AAMA;;;;;AAEA;;;;;;;iBCgCgB,cAAA,CAAe,OAAA,GAAS,uBAAA,GAA+B,YAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/index.ts"],"mappings":";;;;UAEiB,sBAAA;EACf,OAAA;AAAA;AAAA,UAGe,8BAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,aAAA,GAAgB,MAAA;AAL5B;;;;AAAA,KAWY,gBAAA,GAAmB,aAAA;AAAA,UAEd,uBAAA,SAAgC,gBAAA;EARxB;;;;EAavB,UAAA;EAP0B;;;;AAE5B;;;;;;;;;;EAqBE,UAAA,GAAa,gBAAA;EACb,eAAA,aAA4B,sBAAA;EAC5B,UAAA;EACA,MAAA,GAAS,mBAAA;AAAA;AAAA,UAGM,kBAAA;EACf,KAAA;EACA,KAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;AAAA;AAAA,UAGe,qBAAA;EACf,OAAA;EACA,KAAA;EACA,QAAA;EACA,SAAA;AAAA;AAAA,UAGe,mBAAA;EACf,MAAA,aAAmB,kBAAA;EACnB,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;;;;AA7FF;;;;;AAKA;;;;;AAMA;;;;;AAEA;;;;;;;iBCwEgB,cAAA,CAAe,OAAA,GAAS,uBAAA,GAA+B,YAAA"}
package/dist/index.d.mts CHANGED
@@ -16,6 +16,11 @@ type ComponentsMap = Record<string, string>;
16
16
  */
17
17
  type ComponentsOption = ComponentsMap | string | string[];
18
18
  interface ReactIntegrationOptions extends OxContentOptions {
19
+ /**
20
+ * Markdown-like file extensions to process.
21
+ * @default ['.md', '.markdown', '.mdx']
22
+ */
23
+ extensions?: string[];
19
24
  /**
20
25
  * Components to register for use in Markdown.
21
26
  * Can be a map of names to paths, a glob pattern, or an array of globs.
@@ -33,11 +38,34 @@ interface ReactIntegrationOptions extends OxContentOptions {
33
38
  components?: ComponentsOption;
34
39
  codeAnnotations?: boolean | CodeAnnotationsOptions;
35
40
  jsxRuntime?: "automatic" | "classic";
41
+ embeds?: BuiltinEmbedOptions | false;
42
+ }
43
+ interface GitHubEmbedOptions {
44
+ token?: string;
45
+ cache?: boolean;
46
+ cacheTTL?: number;
47
+ maxSourceBytes?: number;
48
+ maxSourceLines?: number;
49
+ }
50
+ interface OpenGraphEmbedOptions {
51
+ timeout?: number;
52
+ cache?: boolean;
53
+ cacheTTL?: number;
54
+ userAgent?: string;
55
+ }
56
+ interface BuiltinEmbedOptions {
57
+ github?: boolean | GitHubEmbedOptions;
58
+ openGraph?: boolean | OpenGraphEmbedOptions;
59
+ }
60
+ interface ResolvedBuiltinEmbedOptions {
61
+ github: GitHubEmbedOptions | false;
62
+ openGraph: OpenGraphEmbedOptions | false;
36
63
  }
37
64
  interface ResolvedReactOptions {
38
65
  srcDir: string;
39
66
  outDir: string;
40
67
  base: string;
68
+ extensions: string[];
41
69
  gfm: boolean;
42
70
  frontmatter: boolean;
43
71
  toc: boolean;
@@ -45,6 +73,7 @@ interface ResolvedReactOptions {
45
73
  codeAnnotations: ResolvedCodeAnnotationsOptions;
46
74
  components: ComponentsMap;
47
75
  jsxRuntime: "automatic" | "classic";
76
+ embeds: ResolvedBuiltinEmbedOptions;
48
77
  root?: string;
49
78
  }
50
79
  interface ReactTransformResult {
@@ -87,5 +116,5 @@ interface ComponentIsland {
87
116
  */
88
117
  declare function oxContentReact(options?: ReactIntegrationOptions): PluginOption[];
89
118
  //#endregion
90
- export { type ComponentIsland, type ComponentsMap, type ComponentsOption, type ReactIntegrationOptions, type ReactTransformResult, type ResolvedReactOptions, oxContent, oxContentReact };
119
+ export { type BuiltinEmbedOptions, type ComponentIsland, type ComponentsMap, type ComponentsOption, type GitHubEmbedOptions, type OpenGraphEmbedOptions, type ReactIntegrationOptions, type ReactTransformResult, type ResolvedBuiltinEmbedOptions, type ResolvedReactOptions, oxContent, oxContentReact };
91
120
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/index.ts"],"mappings":";;;;UAEiB,sBAAA;EACf,OAAA;AAAA;AAAA,UAGe,8BAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,aAAA,GAAgB,MAAA;AAL5B;;;;AAAA,KAWY,gBAAA,GAAmB,aAAA;AAAA,UAEd,uBAAA,SAAgC,gBAAA;EARxB;;;;AAMzB;;;;;AAEA;;;;;EAeE,UAAA,GAAa,gBAAA;EACb,eAAA,aAA4B,sBAAA;EAC5B,UAAA;AAAA;AAAA,UAGe,oBAAA;EACf,MAAA;EACA,MAAA;EACA,IAAA;EACA,GAAA;EACA,WAAA;EACA,GAAA;EACA,WAAA;EACA,eAAA,EAAiB,8BAAA;EACjB,UAAA,EAAY,aAAA;EACZ,UAAA;EACA,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;;;;AA3DF;;;;;AAKA;;;;;AAMA;;;;;AAEA;;;;;;;iBCgCgB,cAAA,CAAe,OAAA,GAAS,uBAAA,GAA+B,YAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/index.ts"],"mappings":";;;;UAEiB,sBAAA;EACf,OAAA;AAAA;AAAA,UAGe,8BAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,aAAA,GAAgB,MAAA;AAL5B;;;;AAAA,KAWY,gBAAA,GAAmB,aAAA;AAAA,UAEd,uBAAA,SAAgC,gBAAA;EARxB;;;;EAavB,UAAA;EAP0B;;;;AAE5B;;;;;;;;;;EAqBE,UAAA,GAAa,gBAAA;EACb,eAAA,aAA4B,sBAAA;EAC5B,UAAA;EACA,MAAA,GAAS,mBAAA;AAAA;AAAA,UAGM,kBAAA;EACf,KAAA;EACA,KAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;AAAA;AAAA,UAGe,qBAAA;EACf,OAAA;EACA,KAAA;EACA,QAAA;EACA,SAAA;AAAA;AAAA,UAGe,mBAAA;EACf,MAAA,aAAmB,kBAAA;EACnB,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;;;;AA7FF;;;;;AAKA;;;;;AAMA;;;;;AAEA;;;;;;;iBCwEgB,cAAA,CAAe,OAAA,GAAS,uBAAA,GAA+B,YAAA"}
package/dist/index.mjs CHANGED
@@ -45,6 +45,7 @@ async function transformMarkdownWithReact(code, id, options) {
45
45
  srcDir: options.srcDir,
46
46
  outDir: options.outDir,
47
47
  base: options.base,
48
+ extensions: options.extensions,
48
49
  ssg: {
49
50
  enabled: false,
50
51
  extension: ".html",
@@ -84,6 +85,7 @@ async function transformMarkdownWithReact(code, id, options) {
84
85
  placeholder: "Search...",
85
86
  hotkey: "k"
86
87
  },
88
+ embeds: options.embeds,
87
89
  i18n: false
88
90
  };
89
91
  return {
@@ -310,6 +312,37 @@ function createReactMarkdownEnvironment(mode, options) {
310
312
  *
311
313
  * Uses Vite's Environment API to enable embedding React components in Markdown.
312
314
  */
315
+ const DEFAULT_MARKDOWN_EXTENSIONS = [
316
+ ".md",
317
+ ".markdown",
318
+ ".mdx"
319
+ ];
320
+ function normalizeMarkdownExtensions(extensions) {
321
+ const values = extensions?.length ? extensions : DEFAULT_MARKDOWN_EXTENSIONS;
322
+ return Array.from(new Map(values.map((extension) => {
323
+ const value = extension.startsWith(".") ? extension : `.${extension}`;
324
+ return [value.toLowerCase(), value];
325
+ })).values());
326
+ }
327
+ function isMarkdownFilePath(filePath, extensions) {
328
+ const pathname = filePath.split("?")[0].split("#")[0].toLowerCase();
329
+ return extensions.some((extension) => pathname.endsWith(extension.toLowerCase()));
330
+ }
331
+ function resolveBuiltinEmbedOptions(options) {
332
+ if (options === false) return {
333
+ github: false,
334
+ openGraph: false
335
+ };
336
+ return {
337
+ github: resolveSingleEmbedOptions(options?.github),
338
+ openGraph: resolveSingleEmbedOptions(options?.openGraph)
339
+ };
340
+ }
341
+ function resolveSingleEmbedOptions(options) {
342
+ if (options === false) return false;
343
+ if (options === true || options === void 0) return {};
344
+ return options;
345
+ }
313
346
  /**
314
347
  * Creates the Ox Content React integration plugin.
315
348
  *
@@ -350,7 +383,7 @@ function oxContentReact(options = {}) {
350
383
  }
351
384
  },
352
385
  async transform(code, id) {
353
- if (!id.endsWith(".md")) return null;
386
+ if (!isMarkdownFilePath(id, resolved.extensions)) return null;
354
387
  const result = await transformMarkdownWithReact(code, id, {
355
388
  ...resolved,
356
389
  components: Object.fromEntries(componentMap),
@@ -398,7 +431,7 @@ function oxContentReact(options = {}) {
398
431
  apply: "serve",
399
432
  handleHotUpdate({ file, server, modules }) {
400
433
  if (Array.from(componentMap.values()).some((path) => file.endsWith(path.replace(/^\.\//, "")))) {
401
- const mdModules = Array.from(server.moduleGraph.idToModuleMap.values()).filter((mod) => mod.file?.endsWith(".md"));
434
+ const mdModules = Array.from(server.moduleGraph.idToModuleMap.values()).filter((mod) => mod.file && isMarkdownFilePath(mod.file, resolved.extensions));
402
435
  if (mdModules.length > 0) {
403
436
  server.ws.send({
404
437
  type: "custom",
@@ -425,12 +458,14 @@ function resolveReactOptions(options) {
425
458
  srcDir: options.srcDir ?? "docs",
426
459
  outDir: options.outDir ?? "dist",
427
460
  base: options.base ?? "/",
461
+ extensions: normalizeMarkdownExtensions(options.extensions),
428
462
  gfm: options.gfm ?? true,
429
463
  frontmatter: options.frontmatter ?? true,
430
464
  toc: options.toc ?? true,
431
465
  tocMaxDepth: options.tocMaxDepth ?? 3,
432
466
  codeAnnotations: resolveCodeAnnotationsOptions(options.codeAnnotations),
433
- jsxRuntime: options.jsxRuntime ?? "automatic"
467
+ jsxRuntime: options.jsxRuntime ?? "automatic",
468
+ embeds: resolveBuiltinEmbedOptions(options.embeds)
434
469
  };
435
470
  }
436
471
  function resolveCodeAnnotationsOptions(options) {
@@ -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 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 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} from \"./types\";\n\nexport type {\n ReactIntegrationOptions,\n ResolvedReactOptions,\n ComponentsOption,\n ComponentsMap,\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 (!id.endsWith(\".md\")) {\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((mod) =>\n mod.file?.endsWith(\".md\"),\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 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 };\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 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ox-content/vite-plugin-react",
3
- "version": "2.9.0",
3
+ "version": "2.11.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.9.0",
39
- "@ox-content/vite-plugin": "2.9.0"
38
+ "@ox-content/islands": "2.11.0",
39
+ "@ox-content/vite-plugin": "2.11.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/node": "^22.0.0",