@frontmcp/uipack 0.6.3 → 0.7.2

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 (56) hide show
  1. package/CLAUDE.md +0 -14
  2. package/adapters/index.js +50 -47
  3. package/adapters/platform-meta.d.ts.map +1 -1
  4. package/adapters/response-builder.d.ts +16 -3
  5. package/adapters/response-builder.d.ts.map +1 -1
  6. package/bridge-runtime/iife-generator.d.ts.map +1 -1
  7. package/bridge-runtime/index.js +4 -0
  8. package/build/index.d.ts +1 -1
  9. package/build/index.d.ts.map +1 -1
  10. package/build/index.js +61 -69
  11. package/bundler/index.js +35 -34
  12. package/dependency/import-map.d.ts.map +1 -1
  13. package/dependency/index.js +22 -29
  14. package/esm/adapters/index.mjs +52 -42
  15. package/esm/bridge-runtime/index.mjs +4 -0
  16. package/esm/build/index.mjs +30 -32
  17. package/esm/bundler/index.mjs +19 -11
  18. package/esm/dependency/index.mjs +18 -18
  19. package/esm/handlebars/index.mjs +9 -8
  20. package/esm/index.mjs +107 -126
  21. package/esm/package.json +3 -2
  22. package/esm/registry/index.mjs +53 -49
  23. package/esm/renderers/index.mjs +15 -21
  24. package/esm/runtime/index.mjs +16 -15
  25. package/esm/theme/index.mjs +8 -0
  26. package/esm/tool-template/index.mjs +23 -15
  27. package/esm/typings/index.mjs +4 -0
  28. package/esm/utils/index.mjs +9 -56
  29. package/esm/validation/index.mjs +9 -8
  30. package/handlebars/index.js +4 -10
  31. package/index.js +186 -211
  32. package/package.json +3 -2
  33. package/preview/generic-preview.d.ts +4 -5
  34. package/preview/generic-preview.d.ts.map +1 -1
  35. package/preview/types.d.ts +15 -1
  36. package/preview/types.d.ts.map +1 -1
  37. package/registry/index.js +61 -63
  38. package/registry/render-template.d.ts.map +1 -1
  39. package/renderers/index.js +16 -28
  40. package/renderers/utils/detect.d.ts.map +1 -1
  41. package/runtime/index.js +20 -25
  42. package/runtime/sanitizer.d.ts.map +1 -1
  43. package/theme/css-to-theme.d.ts +0 -27
  44. package/theme/css-to-theme.d.ts.map +1 -1
  45. package/theme/index.js +8 -0
  46. package/tool-template/index.js +30 -28
  47. package/typings/dts-parser.d.ts.map +1 -1
  48. package/typings/index.js +4 -0
  49. package/utils/index.d.ts +2 -3
  50. package/utils/index.d.ts.map +1 -1
  51. package/utils/index.js +7 -63
  52. package/validation/index.js +6 -12
  53. package/utils/escape-html.d.ts +0 -102
  54. package/utils/escape-html.d.ts.map +0 -1
  55. package/utils/safe-stringify.d.ts +0 -30
  56. package/utils/safe-stringify.d.ts.map +0 -1
@@ -8,31 +8,18 @@ var __export = (target, all) => {
8
8
  __defProp(target, name, { get: all[name], enumerable: true });
9
9
  };
10
10
 
11
- // libs/uipack/src/utils/escape-html.ts
12
- function escapeHtml(str) {
13
- if (str === null || str === void 0) {
14
- return "";
15
- }
16
- const s = String(str);
17
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
18
- }
19
- function escapeJsString(str) {
20
- 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");
21
- }
22
- function escapeScriptClose(jsonString) {
23
- return jsonString.replace(/<\//g, "<\\/");
24
- }
25
- var init_escape_html = __esm({
26
- "libs/uipack/src/utils/escape-html.ts"() {
27
- "use strict";
28
- }
29
- });
30
-
31
11
  // libs/uipack/src/utils/index.ts
12
+ import {
13
+ safeStringify,
14
+ escapeHtml,
15
+ escapeHtmlAttr,
16
+ escapeJsString,
17
+ escapeScriptClose,
18
+ safeJsonForScript
19
+ } from "@frontmcp/utils";
32
20
  var init_utils = __esm({
33
21
  "libs/uipack/src/utils/index.ts"() {
34
22
  "use strict";
35
- init_escape_html();
36
23
  }
37
24
  });
38
25
 
@@ -881,6 +868,7 @@ var CLAUDE_PLATFORM = {
881
868
  };
882
869
 
883
870
  // libs/uipack/src/renderers/utils/detect.ts
871
+ var MAX_TEMPLATE_LENGTH = 5e4;
884
872
  function isReactComponent(value) {
885
873
  if (typeof value !== "function") {
886
874
  return false;
@@ -909,6 +897,9 @@ function isTemplateBuilderFunction(fn) {
909
897
  return true;
910
898
  }
911
899
  function containsJsx(source) {
900
+ if (source.length > MAX_TEMPLATE_LENGTH) {
901
+ return false;
902
+ }
912
903
  if (/<[A-Z][a-zA-Z0-9]*(\s|>|\/)/.test(source)) {
913
904
  return true;
914
905
  }
@@ -933,6 +924,9 @@ function containsJsx(source) {
933
924
  return false;
934
925
  }
935
926
  function containsMdxSyntax(source) {
927
+ if (source.length > MAX_TEMPLATE_LENGTH) {
928
+ return false;
929
+ }
936
930
  if (/<[A-Z][a-zA-Z0-9]*/.test(source)) {
937
931
  return true;
938
932
  }
@@ -8,25 +8,18 @@ var __export = (target, all) => {
8
8
  __defProp(target, name, { get: all[name], enumerable: true });
9
9
  };
10
10
 
11
- // libs/uipack/src/utils/escape-html.ts
12
- function escapeHtml(str) {
13
- if (str === null || str === void 0) {
14
- return "";
15
- }
16
- const s = String(str);
17
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
18
- }
19
- var init_escape_html = __esm({
20
- "libs/uipack/src/utils/escape-html.ts"() {
21
- "use strict";
22
- }
23
- });
24
-
25
11
  // libs/uipack/src/utils/index.ts
12
+ import {
13
+ safeStringify,
14
+ escapeHtml,
15
+ escapeHtmlAttr,
16
+ escapeJsString,
17
+ escapeScriptClose,
18
+ safeJsonForScript
19
+ } from "@frontmcp/utils";
26
20
  var init_utils = __esm({
27
21
  "libs/uipack/src/utils/index.ts"() {
28
22
  "use strict";
29
- init_escape_html();
30
23
  }
31
24
  });
32
25
 
@@ -1756,7 +1749,11 @@ FrontMcpBridge.prototype._setupDataToolCallHandler = function() {
1756
1749
  };
1757
1750
  `.trim();
1758
1751
  }
1752
+ var MAX_MINIFY_CODE_LENGTH = 5e5;
1759
1753
  function minifyJS(code) {
1754
+ if (code.length > MAX_MINIFY_CODE_LENGTH) {
1755
+ return code;
1756
+ }
1760
1757
  return code.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/.*$/gm, "").replace(/\s+/g, " ").replace(/\s*([{};,:()[\]])\s*/g, "$1").replace(/;\}/g, "}").trim();
1761
1758
  }
1762
1759
  function generatePlatformBundle(platform, options = {}) {
@@ -2910,7 +2907,11 @@ function detectPIIType(value) {
2910
2907
  if (isIPv4(value)) return "IP";
2911
2908
  return null;
2912
2909
  }
2910
+ var MAX_PII_TEXT_LENGTH = 1e5;
2913
2911
  function redactPIIFromText(text) {
2912
+ if (text.length > MAX_PII_TEXT_LENGTH) {
2913
+ return text;
2914
+ }
2914
2915
  let result = text;
2915
2916
  result = result.replace(PII_PATTERNS.creditCardInText, REDACTION_TOKENS.CARD);
2916
2917
  result = result.replace(PII_PATTERNS.ssnInText, REDACTION_TOKENS.ID);
@@ -679,7 +679,15 @@ function buildStyleBlock(theme) {
679
679
 
680
680
  // libs/uipack/src/theme/css-to-theme.ts
681
681
  var COLOR_VAR_REGEX = /--(color-[\w-]+):\s*([^;]+);/g;
682
+ var MAX_CSS_INPUT_LENGTH = 1e5;
682
683
  function cssToTailwindTheme(userCss) {
684
+ if (userCss.length > MAX_CSS_INPUT_LENGTH) {
685
+ return {
686
+ themeBlock: "",
687
+ remainingCss: userCss,
688
+ colorVars: /* @__PURE__ */ new Map()
689
+ };
690
+ }
683
691
  const colorVars = /* @__PURE__ */ new Map();
684
692
  const regex = new RegExp(COLOR_VAR_REGEX.source, "g");
685
693
  let match;
@@ -8,25 +8,18 @@ var __export = (target, all) => {
8
8
  __defProp(target, name, { get: all[name], enumerable: true });
9
9
  };
10
10
 
11
- // libs/uipack/src/utils/escape-html.ts
12
- function escapeHtml(str) {
13
- if (str === null || str === void 0) {
14
- return "";
15
- }
16
- const s = String(str);
17
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
18
- }
19
- var init_escape_html = __esm({
20
- "libs/uipack/src/utils/escape-html.ts"() {
21
- "use strict";
22
- }
23
- });
24
-
25
11
  // libs/uipack/src/utils/index.ts
12
+ import {
13
+ safeStringify,
14
+ escapeHtml,
15
+ escapeHtmlAttr,
16
+ escapeJsString,
17
+ escapeScriptClose,
18
+ safeJsonForScript
19
+ } from "@frontmcp/utils";
26
20
  var init_utils = __esm({
27
21
  "libs/uipack/src/utils/index.ts"() {
28
22
  "use strict";
29
- init_escape_html();
30
23
  }
31
24
  });
32
25
 
@@ -1456,7 +1449,11 @@ FrontMcpBridge.prototype._setupDataToolCallHandler = function() {
1456
1449
  };
1457
1450
  `.trim();
1458
1451
  }
1452
+ var MAX_MINIFY_CODE_LENGTH = 5e5;
1459
1453
  function minifyJS(code) {
1454
+ if (code.length > MAX_MINIFY_CODE_LENGTH) {
1455
+ return code;
1456
+ }
1460
1457
  return code.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/.*$/gm, "").replace(/\s+/g, " ").replace(/\s*([{};,:()[\]])\s*/g, "$1").replace(/;\}/g, "}").trim();
1461
1458
  }
1462
1459
  function generatePlatformBundle(platform, options = {}) {
@@ -2581,7 +2578,11 @@ function detectPIIType(value) {
2581
2578
  if (isIPv4(value)) return "IP";
2582
2579
  return null;
2583
2580
  }
2581
+ var MAX_PII_TEXT_LENGTH = 1e5;
2584
2582
  function redactPIIFromText(text) {
2583
+ if (text.length > MAX_PII_TEXT_LENGTH) {
2584
+ return text;
2585
+ }
2585
2586
  let result = text;
2586
2587
  result = result.replace(PII_PATTERNS.creditCardInText, REDACTION_TOKENS.CARD);
2587
2588
  result = result.replace(PII_PATTERNS.ssnInText, REDACTION_TOKENS.ID);
@@ -2873,6 +2874,7 @@ function buildDataInjectionScript(options) {
2873
2874
  init_utils();
2874
2875
 
2875
2876
  // libs/uipack/src/renderers/utils/detect.ts
2877
+ var MAX_TEMPLATE_LENGTH = 5e4;
2876
2878
  function isReactComponent(value) {
2877
2879
  if (typeof value !== "function") {
2878
2880
  return false;
@@ -2901,6 +2903,9 @@ function isTemplateBuilderFunction(fn) {
2901
2903
  return true;
2902
2904
  }
2903
2905
  function containsJsx(source) {
2906
+ if (source.length > MAX_TEMPLATE_LENGTH) {
2907
+ return false;
2908
+ }
2904
2909
  if (/<[A-Z][a-zA-Z0-9]*(\s|>|\/)/.test(source)) {
2905
2910
  return true;
2906
2911
  }
@@ -2925,6 +2930,9 @@ function containsJsx(source) {
2925
2930
  return false;
2926
2931
  }
2927
2932
  function containsMdxSyntax(source) {
2933
+ if (source.length > MAX_TEMPLATE_LENGTH) {
2934
+ return false;
2935
+ }
2928
2936
  if (/<[A-Z][a-zA-Z0-9]*/.test(source)) {
2929
2937
  return true;
2930
2938
  }
@@ -358,7 +358,11 @@ function getSubpathFromSpecifier(specifier) {
358
358
  }
359
359
  return void 0;
360
360
  }
361
+ var MAX_IMPORT_STATEMENT_LENGTH = 2e3;
361
362
  function parseImportStatement(statement) {
363
+ if (statement.length > MAX_IMPORT_STATEMENT_LENGTH) {
364
+ return null;
365
+ }
362
366
  const namedMatch = /import\s+(?:\{[^}]*\}|\*\s+as\s+\w+|\w+)\s+from\s+['"]([^'"]+)['"]/.exec(statement);
363
367
  if (namedMatch) {
364
368
  return namedMatch[1];
@@ -1,59 +1,12 @@
1
- // libs/uipack/src/utils/safe-stringify.ts
2
- function safeStringify(value, space) {
3
- const seen = /* @__PURE__ */ new WeakSet();
4
- try {
5
- return JSON.stringify(
6
- value,
7
- (_key, val) => {
8
- if (typeof val === "object" && val !== null) {
9
- if (seen.has(val)) return "[Circular]";
10
- seen.add(val);
11
- }
12
- return val;
13
- },
14
- space
15
- );
16
- } catch {
17
- return JSON.stringify({ error: "Output could not be serialized" });
18
- }
19
- }
20
-
21
- // libs/uipack/src/utils/escape-html.ts
22
- function escapeHtml(str) {
23
- if (str === null || str === void 0) {
24
- return "";
25
- }
26
- const s = String(str);
27
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
28
- }
29
- function escapeHtmlAttr(str) {
30
- return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;");
31
- }
32
- function escapeJsString(str) {
33
- 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");
34
- }
35
- function escapeScriptClose(jsonString) {
36
- return jsonString.replace(/<\//g, "<\\/");
37
- }
38
- function safeJsonForScript(value) {
39
- if (value === void 0) {
40
- return "null";
41
- }
42
- try {
43
- const jsonString = JSON.stringify(value, (_key, val) => {
44
- if (typeof val === "bigint") {
45
- return val.toString();
46
- }
47
- return val;
48
- });
49
- if (jsonString === void 0) {
50
- return "null";
51
- }
52
- return escapeScriptClose(jsonString);
53
- } catch {
54
- return '{"error":"Value could not be serialized"}';
55
- }
56
- }
1
+ // libs/uipack/src/utils/index.ts
2
+ import {
3
+ safeStringify,
4
+ escapeHtml,
5
+ escapeHtmlAttr,
6
+ escapeJsString,
7
+ escapeScriptClose,
8
+ safeJsonForScript
9
+ } from "@frontmcp/utils";
57
10
  export {
58
11
  escapeHtml,
59
12
  escapeHtmlAttr,
@@ -1,11 +1,12 @@
1
- // libs/uipack/src/utils/escape-html.ts
2
- function escapeHtml(str) {
3
- if (str === null || str === void 0) {
4
- return "";
5
- }
6
- const s = String(str);
7
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
8
- }
1
+ // libs/uipack/src/utils/index.ts
2
+ import {
3
+ safeStringify,
4
+ escapeHtml,
5
+ escapeHtmlAttr,
6
+ escapeJsString,
7
+ escapeScriptClose,
8
+ safeJsonForScript
9
+ } from "@frontmcp/utils";
9
10
 
10
11
  // libs/uipack/src/validation/error-box.ts
11
12
  var errorIcon = `<svg class="w-5 h-5 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
@@ -39,7 +39,7 @@ __export(handlebars_exports, {
39
39
  createHandlebarsRenderer: () => createHandlebarsRenderer,
40
40
  defaultValue: () => defaultValue,
41
41
  eq: () => eq,
42
- escapeHtml: () => escapeHtml,
42
+ escapeHtml: () => import_utils.escapeHtml,
43
43
  extractAll: () => extractAll,
44
44
  extractExpressions: () => extractExpressions,
45
45
  extractInputPaths: () => extractInputPaths,
@@ -76,14 +76,8 @@ __export(handlebars_exports, {
76
76
  });
77
77
  module.exports = __toCommonJS(handlebars_exports);
78
78
 
79
- // libs/uipack/src/utils/escape-html.ts
80
- function escapeHtml(str) {
81
- if (str === null || str === void 0) {
82
- return "";
83
- }
84
- const s = String(str);
85
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
86
- }
79
+ // libs/uipack/src/utils/index.ts
80
+ var import_utils = require("@frontmcp/utils");
87
81
 
88
82
  // libs/uipack/src/handlebars/helpers.ts
89
83
  function formatDate(date, format) {
@@ -266,7 +260,7 @@ function classNames(...classes) {
266
260
  }
267
261
  var builtinHelpers = {
268
262
  // Escaping
269
- escapeHtml,
263
+ escapeHtml: import_utils.escapeHtml,
270
264
  // Formatting
271
265
  formatDate,
272
266
  formatCurrency,