@frontmcp/uipack 0.6.1 → 0.6.3

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.
Files changed (315) hide show
  1. package/CLAUDE.md +88 -105
  2. package/README.md +1 -0
  3. package/adapters/index.d.ts +1 -1
  4. package/adapters/index.d.ts.map +1 -1
  5. package/adapters/index.js +35 -2
  6. package/adapters/platform-meta.d.ts +29 -0
  7. package/adapters/platform-meta.d.ts.map +1 -1
  8. package/base-template/default-base-template.d.ts +0 -1
  9. package/base-template/default-base-template.d.ts.map +1 -1
  10. package/base-template/index.js +32 -37
  11. package/build/builders/base-builder.d.ts +124 -0
  12. package/build/builders/base-builder.d.ts.map +1 -0
  13. package/build/builders/esbuild-config.d.ts +94 -0
  14. package/build/builders/esbuild-config.d.ts.map +1 -0
  15. package/build/builders/hybrid-builder.d.ts +93 -0
  16. package/build/builders/hybrid-builder.d.ts.map +1 -0
  17. package/build/builders/index.d.ts +17 -0
  18. package/build/builders/index.d.ts.map +1 -0
  19. package/build/builders/inline-builder.d.ts +83 -0
  20. package/build/builders/inline-builder.d.ts.map +1 -0
  21. package/build/builders/static-builder.d.ts +78 -0
  22. package/build/builders/static-builder.d.ts.map +1 -0
  23. package/build/builders/types.d.ts +341 -0
  24. package/build/builders/types.d.ts.map +1 -0
  25. package/build/cdn-resources.d.ts +3 -2
  26. package/build/cdn-resources.d.ts.map +1 -1
  27. package/build/hybrid-data.d.ts +127 -0
  28. package/build/hybrid-data.d.ts.map +1 -0
  29. package/build/index.d.ts +4 -0
  30. package/build/index.d.ts.map +1 -1
  31. package/build/index.js +1901 -173
  32. package/build/ui-components-browser.d.ts +64 -0
  33. package/build/ui-components-browser.d.ts.map +1 -0
  34. package/build/widget-manifest.d.ts.map +1 -1
  35. package/bundler/file-cache/component-builder.d.ts.map +1 -1
  36. package/bundler/file-cache/storage/redis.d.ts.map +1 -1
  37. package/bundler/index.js +11 -6
  38. package/dependency/cdn-registry.d.ts +1 -1
  39. package/dependency/cdn-registry.d.ts.map +1 -1
  40. package/dependency/import-map.d.ts.map +1 -1
  41. package/dependency/index.js +93 -121
  42. package/dependency/resolver.d.ts.map +1 -1
  43. package/esm/adapters/{index.js → index.mjs} +34 -2
  44. package/esm/base-template/{index.js → index.mjs} +32 -37
  45. package/esm/build/{index.js → index.mjs} +1872 -173
  46. package/esm/bundler/{index.js → index.mjs} +12 -7
  47. package/esm/dependency/{index.js → index.mjs} +93 -121
  48. package/esm/handlebars/{index.js → index.mjs} +0 -1
  49. package/esm/{index.js → index.mjs} +2532 -827
  50. package/esm/package.json +15 -16
  51. package/esm/registry/{index.js → index.mjs} +200 -265
  52. package/esm/renderers/{index.js → index.mjs} +110 -201
  53. package/esm/runtime/{index.js → index.mjs} +44 -35
  54. package/esm/styles/{index.js → index.mjs} +6 -6
  55. package/esm/theme/{index.js → index.mjs} +90 -42
  56. package/esm/tool-template/{index.js → index.mjs} +35 -28
  57. package/esm/typings/{index.js → index.mjs} +157 -1
  58. package/esm/utils/{index.js → index.mjs} +24 -0
  59. package/esm/validation/{index.js → index.mjs} +0 -1
  60. package/handlebars/expression-extractor.d.ts.map +1 -1
  61. package/handlebars/index.d.ts.map +1 -1
  62. package/handlebars/index.js +0 -1
  63. package/index.d.ts +2 -1
  64. package/index.d.ts.map +1 -1
  65. package/index.js +2560 -831
  66. package/package.json +7 -6
  67. package/preview/claude-preview.d.ts +67 -0
  68. package/preview/claude-preview.d.ts.map +1 -0
  69. package/preview/generic-preview.d.ts +67 -0
  70. package/preview/generic-preview.d.ts.map +1 -0
  71. package/preview/index.d.ts +36 -0
  72. package/preview/index.d.ts.map +1 -0
  73. package/preview/openai-preview.d.ts +70 -0
  74. package/preview/openai-preview.d.ts.map +1 -0
  75. package/preview/types.d.ts +185 -0
  76. package/preview/types.d.ts.map +1 -0
  77. package/registry/index.js +200 -265
  78. package/registry/render-template.d.ts.map +1 -1
  79. package/renderers/index.d.ts +2 -2
  80. package/renderers/index.d.ts.map +1 -1
  81. package/renderers/index.js +114 -205
  82. package/renderers/mdx-client.renderer.d.ts +124 -0
  83. package/renderers/mdx-client.renderer.d.ts.map +1 -0
  84. package/renderers/registry.d.ts +2 -2
  85. package/renderers/registry.d.ts.map +1 -1
  86. package/renderers/types.d.ts +3 -2
  87. package/renderers/types.d.ts.map +1 -1
  88. package/renderers/utils/transpiler.d.ts +8 -27
  89. package/renderers/utils/transpiler.d.ts.map +1 -1
  90. package/runtime/index.js +44 -35
  91. package/runtime/mcp-bridge.d.ts.map +1 -1
  92. package/runtime/renderer-runtime.d.ts.map +1 -1
  93. package/runtime/wrapper.d.ts.map +1 -1
  94. package/styles/index.js +6 -6
  95. package/styles/variants.d.ts +1 -1
  96. package/styles/variants.d.ts.map +1 -1
  97. package/theme/cdn.d.ts.map +1 -1
  98. package/theme/css-to-theme.d.ts +91 -0
  99. package/theme/css-to-theme.d.ts.map +1 -0
  100. package/theme/index.d.ts +2 -1
  101. package/theme/index.d.ts.map +1 -1
  102. package/theme/index.js +92 -43
  103. package/theme/platforms.d.ts +1 -6
  104. package/theme/platforms.d.ts.map +1 -1
  105. package/theme/theme.d.ts.map +1 -1
  106. package/tool-template/builder.d.ts.map +1 -1
  107. package/tool-template/index.js +35 -28
  108. package/typings/index.d.ts +4 -4
  109. package/typings/index.d.ts.map +1 -1
  110. package/typings/index.js +162 -1
  111. package/typings/schemas.d.ts +30 -0
  112. package/typings/schemas.d.ts.map +1 -1
  113. package/typings/type-fetcher.d.ts +74 -1
  114. package/typings/type-fetcher.d.ts.map +1 -1
  115. package/typings/types.d.ts +72 -1
  116. package/typings/types.d.ts.map +1 -1
  117. package/utils/escape-html.d.ts +44 -0
  118. package/utils/escape-html.d.ts.map +1 -1
  119. package/utils/index.d.ts +1 -1
  120. package/utils/index.d.ts.map +1 -1
  121. package/utils/index.js +26 -0
  122. package/validation/index.js +0 -1
  123. package/validation/template-validator.d.ts.map +1 -1
  124. package/esm/adapters/index.d.ts +0 -13
  125. package/esm/adapters/index.d.ts.map +0 -1
  126. package/esm/adapters/platform-meta.d.ts +0 -166
  127. package/esm/adapters/platform-meta.d.ts.map +0 -1
  128. package/esm/adapters/response-builder.d.ts +0 -108
  129. package/esm/adapters/response-builder.d.ts.map +0 -1
  130. package/esm/adapters/serving-mode.d.ts +0 -107
  131. package/esm/adapters/serving-mode.d.ts.map +0 -1
  132. package/esm/base-template/bridge.d.ts +0 -90
  133. package/esm/base-template/bridge.d.ts.map +0 -1
  134. package/esm/base-template/default-base-template.d.ts +0 -92
  135. package/esm/base-template/default-base-template.d.ts.map +0 -1
  136. package/esm/base-template/index.d.ts +0 -15
  137. package/esm/base-template/index.d.ts.map +0 -1
  138. package/esm/base-template/polyfills.d.ts +0 -31
  139. package/esm/base-template/polyfills.d.ts.map +0 -1
  140. package/esm/base-template/theme-styles.d.ts +0 -74
  141. package/esm/base-template/theme-styles.d.ts.map +0 -1
  142. package/esm/bridge-runtime/iife-generator.d.ts +0 -62
  143. package/esm/bridge-runtime/iife-generator.d.ts.map +0 -1
  144. package/esm/bridge-runtime/index.d.ts +0 -10
  145. package/esm/bridge-runtime/index.d.ts.map +0 -1
  146. package/esm/build/cdn-resources.d.ts +0 -243
  147. package/esm/build/cdn-resources.d.ts.map +0 -1
  148. package/esm/build/index.d.ts +0 -295
  149. package/esm/build/index.d.ts.map +0 -1
  150. package/esm/build/widget-manifest.d.ts +0 -362
  151. package/esm/build/widget-manifest.d.ts.map +0 -1
  152. package/esm/bundler/cache.d.ts +0 -173
  153. package/esm/bundler/cache.d.ts.map +0 -1
  154. package/esm/bundler/file-cache/component-builder.d.ts +0 -167
  155. package/esm/bundler/file-cache/component-builder.d.ts.map +0 -1
  156. package/esm/bundler/file-cache/hash-calculator.d.ts +0 -155
  157. package/esm/bundler/file-cache/hash-calculator.d.ts.map +0 -1
  158. package/esm/bundler/file-cache/index.d.ts +0 -12
  159. package/esm/bundler/file-cache/index.d.ts.map +0 -1
  160. package/esm/bundler/file-cache/storage/filesystem.d.ts +0 -149
  161. package/esm/bundler/file-cache/storage/filesystem.d.ts.map +0 -1
  162. package/esm/bundler/file-cache/storage/index.d.ts +0 -11
  163. package/esm/bundler/file-cache/storage/index.d.ts.map +0 -1
  164. package/esm/bundler/file-cache/storage/interface.d.ts +0 -152
  165. package/esm/bundler/file-cache/storage/interface.d.ts.map +0 -1
  166. package/esm/bundler/file-cache/storage/redis.d.ts +0 -139
  167. package/esm/bundler/file-cache/storage/redis.d.ts.map +0 -1
  168. package/esm/bundler/index.d.ts +0 -35
  169. package/esm/bundler/index.d.ts.map +0 -1
  170. package/esm/bundler/sandbox/enclave-adapter.d.ts +0 -121
  171. package/esm/bundler/sandbox/enclave-adapter.d.ts.map +0 -1
  172. package/esm/bundler/sandbox/executor.d.ts +0 -14
  173. package/esm/bundler/sandbox/executor.d.ts.map +0 -1
  174. package/esm/bundler/sandbox/policy.d.ts +0 -62
  175. package/esm/bundler/sandbox/policy.d.ts.map +0 -1
  176. package/esm/bundler/types.d.ts +0 -702
  177. package/esm/bundler/types.d.ts.map +0 -1
  178. package/esm/dependency/cdn-registry.d.ts +0 -98
  179. package/esm/dependency/cdn-registry.d.ts.map +0 -1
  180. package/esm/dependency/import-map.d.ts +0 -186
  181. package/esm/dependency/import-map.d.ts.map +0 -1
  182. package/esm/dependency/import-parser.d.ts +0 -82
  183. package/esm/dependency/import-parser.d.ts.map +0 -1
  184. package/esm/dependency/index.d.ts +0 -17
  185. package/esm/dependency/index.d.ts.map +0 -1
  186. package/esm/dependency/resolver.d.ts +0 -164
  187. package/esm/dependency/resolver.d.ts.map +0 -1
  188. package/esm/dependency/schemas.d.ts +0 -486
  189. package/esm/dependency/schemas.d.ts.map +0 -1
  190. package/esm/dependency/template-loader.d.ts +0 -204
  191. package/esm/dependency/template-loader.d.ts.map +0 -1
  192. package/esm/dependency/template-processor.d.ts +0 -118
  193. package/esm/dependency/template-processor.d.ts.map +0 -1
  194. package/esm/dependency/types.d.ts +0 -739
  195. package/esm/dependency/types.d.ts.map +0 -1
  196. package/esm/handlebars/expression-extractor.d.ts +0 -147
  197. package/esm/handlebars/expression-extractor.d.ts.map +0 -1
  198. package/esm/handlebars/helpers.d.ts +0 -339
  199. package/esm/handlebars/helpers.d.ts.map +0 -1
  200. package/esm/handlebars/index.d.ts +0 -195
  201. package/esm/handlebars/index.d.ts.map +0 -1
  202. package/esm/index.d.ts +0 -50
  203. package/esm/index.d.ts.map +0 -1
  204. package/esm/registry/index.d.ts +0 -46
  205. package/esm/registry/index.d.ts.map +0 -1
  206. package/esm/registry/render-template.d.ts +0 -91
  207. package/esm/registry/render-template.d.ts.map +0 -1
  208. package/esm/registry/tool-ui.registry.d.ts +0 -294
  209. package/esm/registry/tool-ui.registry.d.ts.map +0 -1
  210. package/esm/registry/uri-utils.d.ts +0 -56
  211. package/esm/registry/uri-utils.d.ts.map +0 -1
  212. package/esm/renderers/cache.d.ts +0 -145
  213. package/esm/renderers/cache.d.ts.map +0 -1
  214. package/esm/renderers/html.renderer.d.ts +0 -123
  215. package/esm/renderers/html.renderer.d.ts.map +0 -1
  216. package/esm/renderers/index.d.ts +0 -36
  217. package/esm/renderers/index.d.ts.map +0 -1
  218. package/esm/renderers/mdx.renderer.d.ts +0 -120
  219. package/esm/renderers/mdx.renderer.d.ts.map +0 -1
  220. package/esm/renderers/registry.d.ts +0 -133
  221. package/esm/renderers/registry.d.ts.map +0 -1
  222. package/esm/renderers/types.d.ts +0 -342
  223. package/esm/renderers/types.d.ts.map +0 -1
  224. package/esm/renderers/utils/detect.d.ts +0 -107
  225. package/esm/renderers/utils/detect.d.ts.map +0 -1
  226. package/esm/renderers/utils/hash.d.ts +0 -40
  227. package/esm/renderers/utils/hash.d.ts.map +0 -1
  228. package/esm/renderers/utils/index.d.ts +0 -9
  229. package/esm/renderers/utils/index.d.ts.map +0 -1
  230. package/esm/renderers/utils/transpiler.d.ts +0 -89
  231. package/esm/renderers/utils/transpiler.d.ts.map +0 -1
  232. package/esm/runtime/adapters/html.adapter.d.ts +0 -59
  233. package/esm/runtime/adapters/html.adapter.d.ts.map +0 -1
  234. package/esm/runtime/adapters/index.d.ts +0 -26
  235. package/esm/runtime/adapters/index.d.ts.map +0 -1
  236. package/esm/runtime/adapters/mdx.adapter.d.ts +0 -73
  237. package/esm/runtime/adapters/mdx.adapter.d.ts.map +0 -1
  238. package/esm/runtime/adapters/types.d.ts +0 -95
  239. package/esm/runtime/adapters/types.d.ts.map +0 -1
  240. package/esm/runtime/csp.d.ts +0 -48
  241. package/esm/runtime/csp.d.ts.map +0 -1
  242. package/esm/runtime/index.d.ts +0 -17
  243. package/esm/runtime/index.d.ts.map +0 -1
  244. package/esm/runtime/mcp-bridge.d.ts +0 -101
  245. package/esm/runtime/mcp-bridge.d.ts.map +0 -1
  246. package/esm/runtime/renderer-runtime.d.ts +0 -133
  247. package/esm/runtime/renderer-runtime.d.ts.map +0 -1
  248. package/esm/runtime/sanitizer.d.ts +0 -172
  249. package/esm/runtime/sanitizer.d.ts.map +0 -1
  250. package/esm/runtime/types.d.ts +0 -415
  251. package/esm/runtime/types.d.ts.map +0 -1
  252. package/esm/runtime/wrapper.d.ts +0 -421
  253. package/esm/runtime/wrapper.d.ts.map +0 -1
  254. package/esm/styles/index.d.ts +0 -8
  255. package/esm/styles/index.d.ts.map +0 -1
  256. package/esm/styles/variants.d.ts +0 -51
  257. package/esm/styles/variants.d.ts.map +0 -1
  258. package/esm/theme/cdn.d.ts +0 -195
  259. package/esm/theme/cdn.d.ts.map +0 -1
  260. package/esm/theme/index.d.ts +0 -18
  261. package/esm/theme/index.d.ts.map +0 -1
  262. package/esm/theme/platforms.d.ts +0 -107
  263. package/esm/theme/platforms.d.ts.map +0 -1
  264. package/esm/theme/presets/github-openai.d.ts +0 -50
  265. package/esm/theme/presets/github-openai.d.ts.map +0 -1
  266. package/esm/theme/presets/index.d.ts +0 -11
  267. package/esm/theme/presets/index.d.ts.map +0 -1
  268. package/esm/theme/theme.d.ts +0 -396
  269. package/esm/theme/theme.d.ts.map +0 -1
  270. package/esm/tool-template/builder.d.ts +0 -213
  271. package/esm/tool-template/builder.d.ts.map +0 -1
  272. package/esm/tool-template/index.d.ts +0 -16
  273. package/esm/tool-template/index.d.ts.map +0 -1
  274. package/esm/types/index.d.ts +0 -14
  275. package/esm/types/index.d.ts.map +0 -1
  276. package/esm/types/ui-config.d.ts +0 -641
  277. package/esm/types/ui-config.d.ts.map +0 -1
  278. package/esm/types/ui-runtime.d.ts +0 -1008
  279. package/esm/types/ui-runtime.d.ts.map +0 -1
  280. package/esm/typings/cache/cache-adapter.d.ts +0 -125
  281. package/esm/typings/cache/cache-adapter.d.ts.map +0 -1
  282. package/esm/typings/cache/index.d.ts +0 -10
  283. package/esm/typings/cache/index.d.ts.map +0 -1
  284. package/esm/typings/cache/memory-cache.d.ts +0 -92
  285. package/esm/typings/cache/memory-cache.d.ts.map +0 -1
  286. package/esm/typings/dts-parser.d.ts +0 -90
  287. package/esm/typings/dts-parser.d.ts.map +0 -1
  288. package/esm/typings/index.d.ts +0 -48
  289. package/esm/typings/index.d.ts.map +0 -1
  290. package/esm/typings/schemas.d.ts +0 -232
  291. package/esm/typings/schemas.d.ts.map +0 -1
  292. package/esm/typings/type-fetcher.d.ts +0 -89
  293. package/esm/typings/type-fetcher.d.ts.map +0 -1
  294. package/esm/typings/types.d.ts +0 -320
  295. package/esm/typings/types.d.ts.map +0 -1
  296. package/esm/utils/escape-html.d.ts +0 -58
  297. package/esm/utils/escape-html.d.ts.map +0 -1
  298. package/esm/utils/index.d.ts +0 -10
  299. package/esm/utils/index.d.ts.map +0 -1
  300. package/esm/utils/safe-stringify.d.ts +0 -30
  301. package/esm/utils/safe-stringify.d.ts.map +0 -1
  302. package/esm/validation/error-box.d.ts +0 -56
  303. package/esm/validation/error-box.d.ts.map +0 -1
  304. package/esm/validation/index.d.ts +0 -13
  305. package/esm/validation/index.d.ts.map +0 -1
  306. package/esm/validation/schema-paths.d.ts +0 -118
  307. package/esm/validation/schema-paths.d.ts.map +0 -1
  308. package/esm/validation/template-validator.d.ts +0 -143
  309. package/esm/validation/template-validator.d.ts.map +0 -1
  310. package/esm/validation/wrapper.d.ts +0 -97
  311. package/esm/validation/wrapper.d.ts.map +0 -1
  312. package/renderers/mdx.renderer.d.ts +0 -120
  313. package/renderers/mdx.renderer.d.ts.map +0 -1
  314. /package/esm/bridge-runtime/{index.js → index.mjs} +0 -0
  315. /package/esm/types/{index.js → index.mjs} +0 -0
@@ -1429,7 +1429,7 @@ async function calculateComponentHash(options) {
1429
1429
  const {
1430
1430
  entryPath,
1431
1431
  baseDir = dirname2(entryPath),
1432
- externals = [],
1432
+ externals: _externals = [],
1433
1433
  dependencies = {},
1434
1434
  bundleOptions = {},
1435
1435
  maxDepth = 10
@@ -1546,7 +1546,7 @@ function buildIdFromHash(hash) {
1546
1546
  // libs/uipack/src/bundler/file-cache/component-builder.ts
1547
1547
  import { readFile as readFile3 } from "fs/promises";
1548
1548
  import { existsSync as existsSync3 } from "fs";
1549
- import { resolve as resolve2, extname } from "path";
1549
+ import { resolve as resolve2, extname, basename } from "path";
1550
1550
  import { randomUUID } from "crypto";
1551
1551
 
1552
1552
  // libs/uipack/src/dependency/cdn-registry.ts
@@ -2054,7 +2054,7 @@ function getPackagePeerDependencies(packageName, registry = DEFAULT_CDN_REGISTRY
2054
2054
  }
2055
2055
  return [];
2056
2056
  }
2057
- function resolveAllDependencies(packageNames, platform = "unknown", registry = DEFAULT_CDN_REGISTRY) {
2057
+ function resolveAllDependencies(packageNames, _platform = "unknown", registry = DEFAULT_CDN_REGISTRY) {
2058
2058
  const resolved = /* @__PURE__ */ new Set();
2059
2059
  const queue = [...packageNames];
2060
2060
  while (queue.length > 0) {
@@ -2617,7 +2617,7 @@ var ComponentBuilder = class {
2617
2617
  } = options;
2618
2618
  const absoluteEntryPath = resolve2(entryPath);
2619
2619
  if (!existsSync3(absoluteEntryPath)) {
2620
- throw new Error(`Entry file not found: ${absoluteEntryPath}`);
2620
+ throw new Error(`Entry file not found: ${basename(absoluteEntryPath)}`);
2621
2621
  }
2622
2622
  const hashResult = await calculateComponentHash({
2623
2623
  entryPath: absoluteEntryPath,
@@ -2791,7 +2791,10 @@ var ComponentBuilder = class {
2791
2791
  bundlerVersion: this.esbuild.version
2792
2792
  };
2793
2793
  } catch (error) {
2794
- throw new Error(`Bundle failed for ${entryPath}: ${error}`);
2794
+ const fileName = basename(entryPath);
2795
+ const rawMessage = error instanceof Error ? error.message : String(error);
2796
+ const sanitizedMessage = rawMessage.replace(/(?:\/[\w./-]+|[A-Z]:\\[\w.\\-]+)/g, (match) => basename(match));
2797
+ throw new Error(`Bundle failed for ${fileName}: ${sanitizedMessage}`);
2795
2798
  }
2796
2799
  }
2797
2800
  /**
@@ -2804,8 +2807,10 @@ var ComponentBuilder = class {
2804
2807
  return void 0;
2805
2808
  }
2806
2809
  try {
2807
- const React = await import("react");
2808
- const ReactDOMServer = await import("react-dom/server");
2810
+ const reactPkg = "react";
2811
+ const reactDomServerPkg = "react-dom/server";
2812
+ const React = await import(reactPkg);
2813
+ const ReactDOMServer = await import(reactDomServerPkg);
2809
2814
  const exports = {};
2810
2815
  const module = { exports };
2811
2816
  if (executeCode2) {
@@ -787,7 +787,7 @@ function getPackagePeerDependencies(packageName, registry = DEFAULT_CDN_REGISTRY
787
787
  }
788
788
  return [];
789
789
  }
790
- function resolveAllDependencies(packageNames, platform = "unknown", registry = DEFAULT_CDN_REGISTRY) {
790
+ function resolveAllDependencies(packageNames, _platform = "unknown", registry = DEFAULT_CDN_REGISTRY) {
791
791
  const resolved = /* @__PURE__ */ new Set();
792
792
  const queue = [...packageNames];
793
793
  while (queue.length > 0) {
@@ -1085,6 +1085,12 @@ function escapeHtml(str) {
1085
1085
  function escapeHtmlAttr(str) {
1086
1086
  return str.replace(/&/g, "&").replace(/"/g, """);
1087
1087
  }
1088
+ function escapeJsString(str) {
1089
+ return str.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
1090
+ }
1091
+ function escapeScriptClose(jsonString) {
1092
+ return jsonString.replace(/<\//g, "<\\/");
1093
+ }
1088
1094
 
1089
1095
  // libs/uipack/src/dependency/import-map.ts
1090
1096
  function createImportMap(dependencies) {
@@ -1883,7 +1889,6 @@ var PATH_REGEX = /\b(output|input|structuredContent)(\.[a-zA-Z_$][a-zA-Z0-9_$]*|
1883
1889
  var KEYWORDS = /* @__PURE__ */ new Set(["this", "else", "@index", "@key", "@first", "@last", "@root"]);
1884
1890
  function extractExpressions(template) {
1885
1891
  const expressions = [];
1886
- const lines = template.split("\n");
1887
1892
  const positionMap = buildPositionMap(template);
1888
1893
  let match;
1889
1894
  EXPRESSION_REGEX.lastIndex = 0;
@@ -2371,35 +2376,24 @@ var ComponentCache = class {
2371
2376
  };
2372
2377
  var componentCache = new ComponentCache();
2373
2378
 
2374
- // libs/uipack/src/renderers/mdx.renderer.ts
2375
- var REACT_CDN = {
2376
- react: "https://unpkg.com/react@18/umd/react.production.min.js",
2377
- reactDom: "https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"
2379
+ // libs/uipack/src/renderers/mdx-client.renderer.ts
2380
+ function buildReactCdnUrls(version = "19") {
2381
+ return {
2382
+ react: `https://esm.sh/react@${version}`,
2383
+ reactDom: `https://esm.sh/react-dom@${version}/client`,
2384
+ jsxRuntime: `https://esm.sh/react@${version}/jsx-runtime`
2385
+ };
2386
+ }
2387
+ var DEFAULT_CDN = {
2388
+ mdx: "https://esm.sh/@mdx-js/mdx@3",
2389
+ ...buildReactCdnUrls("19")
2378
2390
  };
2379
- var INLINE_MDX_PLACEHOLDER = `
2380
- // MDX runtime not available inline yet.
2381
- // For blocked-network platforms, use pre-rendered HTML templates.
2382
- console.warn('[FrontMCP] MDX hydration not available on this platform.');
2383
- `;
2384
- var MdxRenderer = class {
2385
- type = "mdx";
2386
- priority = 10;
2387
- // Between HTML (0) and React (20)
2388
- /**
2389
- * Lazy-loaded modules.
2390
- */
2391
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2392
- React = null;
2393
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2394
- ReactDOMServer = null;
2395
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2396
- jsxRuntime = null;
2397
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2398
- mdxEvaluate = null;
2391
+ var MdxClientRenderer = class {
2392
+ type = "mdx-client";
2393
+ priority = 8;
2394
+ // Lower than server-side MDX (10)
2399
2395
  /**
2400
2396
  * Check if this renderer can handle the given template.
2401
- *
2402
- * Accepts strings containing MDX syntax (Markdown + JSX).
2403
2397
  */
2404
2398
  canHandle(template) {
2405
2399
  if (typeof template !== "string") {
@@ -2408,11 +2402,9 @@ var MdxRenderer = class {
2408
2402
  return containsMdxSyntax(template);
2409
2403
  }
2410
2404
  /**
2411
- * Transpile MDX to executable JavaScript.
2412
- *
2413
- * Uses @mdx-js/mdx to compile MDX source to a module.
2414
- * Note: For MDX, we use evaluate() which combines compile + run,
2415
- * so this method just returns the source hash for caching purposes.
2405
+ * Prepare MDX template for rendering.
2406
+ * Caches the template hash for deduplication. Actual MDX compilation
2407
+ * happens client-side via CDN-loaded @mdx-js/mdx in the browser.
2416
2408
  */
2417
2409
  async transpile(template, _options) {
2418
2410
  const hash = hashString(template);
@@ -2422,7 +2414,6 @@ var MdxRenderer = class {
2422
2414
  }
2423
2415
  const transpileResult = {
2424
2416
  code: template,
2425
- // Store original MDX for evaluate()
2426
2417
  hash,
2427
2418
  cached: false
2428
2419
  };
@@ -2430,37 +2421,20 @@ var MdxRenderer = class {
2430
2421
  return transpileResult;
2431
2422
  }
2432
2423
  /**
2433
- * Render MDX template to HTML string.
2424
+ * Render MDX template to HTML with CDN scripts.
2434
2425
  *
2435
- * Uses @mdx-js/mdx's evaluate() for clean compilation + execution,
2436
- * then renders the resulting React component to HTML via SSR.
2426
+ * The returned HTML includes:
2427
+ * - A container div for the rendered content
2428
+ * - Script tags that load React and MDX from CDN
2429
+ * - Inline script that compiles and renders the MDX
2437
2430
  */
2438
2431
  async render(template, context, options) {
2439
- await this.loadReact();
2440
- await this.loadMdx();
2441
- if (!this.mdxEvaluate) {
2442
- throw new Error("MDX compilation requires @mdx-js/mdx. Install it: npm install @mdx-js/mdx");
2443
- }
2444
- const templateHash = hashString(template);
2445
- const cacheKey = `mdx-component:${templateHash}`;
2446
- let Content = componentCache.get(cacheKey);
2447
- if (!Content) {
2448
- const result = await this.mdxEvaluate(template, {
2449
- ...this.jsxRuntime,
2450
- Fragment: this.React.Fragment,
2451
- development: false
2452
- });
2453
- Content = result.default;
2454
- componentCache.set(cacheKey, Content);
2455
- }
2456
- const mdxComponents = {
2457
- // User-provided components from tool config
2458
- ...options?.mdxComponents,
2459
- // Wrapper that provides context to the content
2460
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2461
- wrapper: ({ children }) => {
2462
- return this.React.createElement("div", { className: "mdx-content" }, children);
2463
- }
2432
+ const containerId = options?.containerId || "mdx-content";
2433
+ const showLoading = options?.showLoading !== false;
2434
+ const loadingMessage = options?.loadingMessage || "Loading...";
2435
+ const cdn = {
2436
+ ...DEFAULT_CDN,
2437
+ ...options?.cdn
2464
2438
  };
2465
2439
  const props = {
2466
2440
  input: context.input,
@@ -2468,82 +2442,80 @@ var MdxRenderer = class {
2468
2442
  structuredContent: context.structuredContent,
2469
2443
  helpers: context.helpers
2470
2444
  };
2445
+ const reservedProps = /* @__PURE__ */ new Set(["input", "output", "structuredContent", "helpers", "components"]);
2446
+ const outputProps = typeof context.output === "object" && context.output !== null ? Object.fromEntries(Object.entries(context.output).filter(([key]) => !reservedProps.has(key))) : {};
2471
2447
  const spreadProps = {
2472
- ...props,
2473
- ...typeof context.output === "object" && context.output !== null ? context.output : {}
2448
+ ...outputProps,
2449
+ ...props
2474
2450
  };
2475
- const element = this.React.createElement(Content, {
2476
- components: mdxComponents,
2477
- ...spreadProps
2451
+ const escapedMdx = escapeScriptClose(JSON.stringify(template));
2452
+ const escapedProps = escapeScriptClose(JSON.stringify(spreadProps));
2453
+ const safeContainerId = escapeJsString(containerId);
2454
+ const loadingHtml = showLoading ? `<div class="mdx-loading">${escapeHtml(loadingMessage)}</div>` : "";
2455
+ return `
2456
+ <div id="${escapeHtml(containerId)}">${loadingHtml}</div>
2457
+ <script type="module">
2458
+ (async function() {
2459
+ try {
2460
+ // Load dependencies from CDN
2461
+ const [
2462
+ { evaluate },
2463
+ runtime,
2464
+ React,
2465
+ { createRoot }
2466
+ ] = await Promise.all([
2467
+ import('${cdn.mdx}'),
2468
+ import('${cdn.jsxRuntime}'),
2469
+ import('${cdn.react}'),
2470
+ import('${cdn.reactDom}')
2471
+ ]);
2472
+
2473
+ // MDX content and props
2474
+ const mdxSource = ${escapedMdx};
2475
+ const props = ${escapedProps};
2476
+
2477
+ // Compile and evaluate MDX
2478
+ const { default: Content } = await evaluate(mdxSource, {
2479
+ ...runtime,
2480
+ Fragment: React.Fragment,
2481
+ development: false
2478
2482
  });
2479
- const html = this.ReactDOMServer.renderToString(element);
2480
- if (options?.hydrate) {
2481
- const escapedProps = JSON.stringify(props).replace(/&/g, "&amp;").replace(/'/g, "&#39;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
2482
- return `<div data-mdx-hydrate="true" data-props='${escapedProps}'>${html}</div>`;
2483
+
2484
+ // Render to DOM
2485
+ const container = document.getElementById('${safeContainerId}');
2486
+ if (container) {
2487
+ const root = createRoot(container);
2488
+ root.render(React.createElement(Content, props));
2489
+ }
2490
+ } catch (error) {
2491
+ console.error('[FrontMCP] MDX client rendering failed:', error);
2492
+ const container = document.getElementById('${safeContainerId}');
2493
+ if (container) {
2494
+ container.innerHTML = '<div class="mdx-error">Failed to render MDX content</div>';
2483
2495
  }
2484
- return html;
2496
+ }
2497
+ })();
2498
+ </script>
2499
+ `;
2485
2500
  }
2486
2501
  /**
2487
- * Get runtime scripts for client-side functionality.
2502
+ * Get runtime scripts - not needed for client renderer since scripts are inline.
2488
2503
  */
2489
2504
  getRuntimeScripts(platform) {
2490
2505
  if (platform.networkMode === "blocked") {
2491
2506
  return {
2492
2507
  headScripts: "",
2493
- inlineScripts: INLINE_MDX_PLACEHOLDER,
2508
+ inlineScripts: `console.warn('[FrontMCP] Client-side MDX rendering requires network access. Use @frontmcp/ui for SSR.');`,
2494
2509
  isInline: true
2495
2510
  };
2496
2511
  }
2497
2512
  return {
2498
- headScripts: `
2499
- <script crossorigin src="${REACT_CDN.react}"></script>
2500
- <script crossorigin src="${REACT_CDN.reactDom}"></script>
2501
- `,
2513
+ headScripts: "",
2502
2514
  isInline: false
2503
2515
  };
2504
2516
  }
2505
- /**
2506
- * Load React and ReactDOMServer modules.
2507
- */
2508
- async loadReact() {
2509
- if (this.React && this.ReactDOMServer && this.jsxRuntime) {
2510
- return;
2511
- }
2512
- try {
2513
- const [react, reactDomServer, jsxRuntime] = await Promise.all([
2514
- import("react"),
2515
- import("react-dom/server"),
2516
- import("react/jsx-runtime")
2517
- ]);
2518
- this.React = react;
2519
- this.ReactDOMServer = reactDomServer;
2520
- this.jsxRuntime = jsxRuntime;
2521
- } catch {
2522
- throw new Error("React is required for MdxRenderer. Install react and react-dom: npm install react react-dom");
2523
- }
2524
- }
2525
- /**
2526
- * Load @mdx-js/mdx evaluate function.
2527
- *
2528
- * evaluate() is the cleanest way to run MDX - it combines
2529
- * compile and run in a single step, handling all the runtime
2530
- * injection automatically.
2531
- */
2532
- async loadMdx() {
2533
- if (this.mdxEvaluate) {
2534
- return;
2535
- }
2536
- try {
2537
- const mdx = await import("@mdx-js/mdx");
2538
- this.mdxEvaluate = mdx.evaluate;
2539
- } catch {
2540
- console.warn(
2541
- "[@frontmcp/ui] @mdx-js/mdx not available. MDX rendering disabled. Install @mdx-js/mdx to enable: npm install @mdx-js/mdx"
2542
- );
2543
- }
2544
- }
2545
2517
  };
2546
- var mdxRenderer = new MdxRenderer();
2518
+ var mdxClientRenderer = new MdxClientRenderer();
2547
2519
 
2548
2520
  // libs/uipack/src/validation/schema-paths.ts
2549
2521
  import { z as z2 } from "zod";
@@ -2939,7 +2911,7 @@ async function processTemplate(resolved, options) {
2939
2911
  structuredContent: context.structuredContent,
2940
2912
  helpers: defaultHelpers
2941
2913
  };
2942
- const html = await mdxRenderer.render(processedContent, templateContext);
2914
+ const html = await mdxClientRenderer.render(processedContent, templateContext);
2943
2915
  return {
2944
2916
  html,
2945
2917
  format: "mdx"
@@ -3007,7 +2979,7 @@ async function processMdxTemplate(content, context, helpers) {
3007
2979
  structuredContent: context.structuredContent,
3008
2980
  helpers: defaultHelpers
3009
2981
  };
3010
- return mdxRenderer.render(processed, templateContext);
2982
+ return mdxClientRenderer.render(processed, templateContext);
3011
2983
  }
3012
2984
  export {
3013
2985
  CDN_PROVIDER_PRIORITY,
@@ -229,7 +229,6 @@ var PATH_REGEX = /\b(output|input|structuredContent)(\.[a-zA-Z_$][a-zA-Z0-9_$]*|
229
229
  var KEYWORDS = /* @__PURE__ */ new Set(["this", "else", "@index", "@key", "@first", "@last", "@root"]);
230
230
  function extractExpressions(template) {
231
231
  const expressions = [];
232
- const lines = template.split("\n");
233
232
  const positionMap = buildPositionMap(template);
234
233
  let match;
235
234
  EXPRESSION_REGEX.lastIndex = 0;