@getforma/core 1.0.9 → 1.1.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.
Files changed (64) hide show
  1. package/README.md +1 -1
  2. package/dist/chunk-263HW3KN.cjs +35 -0
  3. package/dist/chunk-263HW3KN.cjs.map +1 -0
  4. package/dist/chunk-2QQBKQIF.js +30 -0
  5. package/dist/chunk-2QQBKQIF.js.map +1 -0
  6. package/dist/{chunk-6FW5E54W.cjs → chunk-2Y5US35K.cjs} +127 -103
  7. package/dist/chunk-2Y5US35K.cjs.map +1 -0
  8. package/dist/{chunk-3G7ET4O5.js → chunk-INNOI6TG.js} +121 -94
  9. package/dist/chunk-INNOI6TG.js.map +1 -0
  10. package/dist/{chunk-T33QUD2Y.cjs → chunk-JRQNDXX7.cjs} +43 -43
  11. package/dist/{chunk-T33QUD2Y.cjs.map → chunk-JRQNDXX7.cjs.map} +1 -1
  12. package/dist/{chunk-AFRFF7XL.js → chunk-MIOMT2CB.js} +4 -4
  13. package/dist/{chunk-AFRFF7XL.js.map → chunk-MIOMT2CB.js.map} +1 -1
  14. package/dist/chunk-W7OUWVRA.cjs +106 -0
  15. package/dist/chunk-W7OUWVRA.cjs.map +1 -0
  16. package/dist/chunk-XLVBYXOU.js +100 -0
  17. package/dist/chunk-XLVBYXOU.js.map +1 -0
  18. package/dist/forma-runtime-csp.js +92 -6
  19. package/dist/forma-runtime.js +138 -12
  20. package/dist/formajs-runtime-hardened.global.js +92 -6
  21. package/dist/formajs-runtime-hardened.global.js.map +1 -1
  22. package/dist/formajs-runtime.global.js +138 -12
  23. package/dist/formajs-runtime.global.js.map +1 -1
  24. package/dist/formajs.global.js +192 -95
  25. package/dist/formajs.global.js.map +1 -1
  26. package/dist/http.cjs +11 -11
  27. package/dist/http.js +2 -2
  28. package/dist/index.cjs +66 -66
  29. package/dist/index.d.cts +11 -25
  30. package/dist/index.d.ts +11 -25
  31. package/dist/index.js +6 -6
  32. package/dist/{resource-DeEzxUz6.d.cts → resource-D6HfVgiA.d.cts} +7 -2
  33. package/dist/{resource-BHsgURy0.d.ts → resource-ljs2X5NM.d.ts} +7 -2
  34. package/dist/runtime-hardened.cjs +93 -5
  35. package/dist/runtime-hardened.cjs.map +1 -1
  36. package/dist/runtime-hardened.js +93 -5
  37. package/dist/runtime-hardened.js.map +1 -1
  38. package/dist/runtime.cjs +47 -31
  39. package/dist/runtime.cjs.map +1 -1
  40. package/dist/runtime.js +21 -5
  41. package/dist/runtime.js.map +1 -1
  42. package/dist/server.cjs +7 -7
  43. package/dist/server.d.cts +2 -2
  44. package/dist/server.d.ts +2 -2
  45. package/dist/server.js +2 -2
  46. package/dist/{signal-C9v4akyJ.d.cts → signal-CRBJYQ6B.d.cts} +0 -8
  47. package/dist/{signal-C9v4akyJ.d.ts → signal-CRBJYQ6B.d.ts} +0 -8
  48. package/dist/ssr/index.cjs +23 -42
  49. package/dist/ssr/index.cjs.map +1 -1
  50. package/dist/ssr/index.js +23 -42
  51. package/dist/ssr/index.js.map +1 -1
  52. package/dist/tc39-compat.cjs +3 -6
  53. package/dist/tc39-compat.cjs.map +1 -1
  54. package/dist/tc39-compat.d.cts +1 -1
  55. package/dist/tc39-compat.d.ts +1 -1
  56. package/dist/tc39-compat.js +1 -4
  57. package/dist/tc39-compat.js.map +1 -1
  58. package/package.json +2 -2
  59. package/dist/chunk-3G7ET4O5.js.map +0 -1
  60. package/dist/chunk-6FW5E54W.cjs.map +0 -1
  61. package/dist/chunk-HLM5BZZQ.js +0 -35
  62. package/dist/chunk-HLM5BZZQ.js.map +0 -1
  63. package/dist/chunk-QLPCVK7C.cjs +0 -38
  64. package/dist/chunk-QLPCVK7C.cjs.map +0 -1
@@ -3,10 +3,33 @@
3
3
  var alienSignals = require('alien-signals');
4
4
 
5
5
  // src/reactive/signal.ts
6
+
7
+ // src/reactive/dev.ts
8
+ function isDev() {
9
+ if (typeof process !== "undefined") {
10
+ return process.env?.NODE_ENV !== "production";
11
+ }
12
+ return typeof __FORMA_DEV__ !== "undefined" ? !!__FORMA_DEV__ : false;
13
+ }
14
+ isDev();
15
+ var _errorHandlers = /* @__PURE__ */ new Set();
16
+ function reportError(error, source) {
17
+ for (const handler of _errorHandlers) {
18
+ try {
19
+ handler(error, source ? { source } : {});
20
+ } catch {
21
+ }
22
+ }
23
+ if (isDev()) {
24
+ console.error(`[forma] ${source} error:`, error);
25
+ }
26
+ }
6
27
  function applySignalSet(s, v, equals) {
7
28
  if (typeof v !== "function") {
8
- s(v);
9
- return;
29
+ {
30
+ s(v);
31
+ return;
32
+ }
10
33
  }
11
34
  const prevSub = alienSignals.setActiveSub(void 0);
12
35
  const prev = s();
@@ -24,8 +47,35 @@ function internalEffect(fn) {
24
47
  const dispose = alienSignals.effect(fn);
25
48
  return dispose;
26
49
  }
50
+ var ERR = /* @__PURE__ */ Symbol("formaComputedError");
51
+ function isErrBox(v) {
52
+ return typeof v === "object" && v !== null && ERR in v;
53
+ }
27
54
  function createComputed(fn) {
28
- return alienSignals.computed(fn);
55
+ let errored = false;
56
+ let error;
57
+ let lastGood;
58
+ const raw = alienSignals.computed(() => {
59
+ try {
60
+ const v = fn(lastGood);
61
+ errored = false;
62
+ error = void 0;
63
+ lastGood = v;
64
+ return v;
65
+ } catch (e) {
66
+ errored = true;
67
+ error = e;
68
+ reportError(e, "computed");
69
+ return { [ERR]: e };
70
+ }
71
+ });
72
+ const reader = () => {
73
+ const v = raw();
74
+ if (errored || isErrBox(v)) throw error;
75
+ return v;
76
+ };
77
+ Object.defineProperty(reader, "name", { value: raw.name, configurable: true });
78
+ return reader;
29
79
  }
30
80
  function batch(fn) {
31
81
  alienSignals.startBatch();
@@ -607,7 +657,35 @@ function createReconciler(config) {
607
657
  };
608
658
  }
609
659
 
660
+ // src/security/url-safety.ts
661
+ var URL_IGNORED_CHARS_RE = /[\u0000-\u0020\u007F-\u009F]/g;
662
+ var DANGEROUS_SCHEME_RE = /^(?:javascript|vbscript|data:text\/html)/i;
663
+ var URL_ATTRS = /* @__PURE__ */ new Set([
664
+ "href",
665
+ "src",
666
+ "action",
667
+ "formaction",
668
+ "xlink:href",
669
+ "poster",
670
+ "background"
671
+ ]);
672
+ function isUrlAttr(name) {
673
+ return URL_ATTRS.has(name.toLowerCase());
674
+ }
675
+ function isDangerousUrl(value2) {
676
+ const normalized = value2.replace(URL_IGNORED_CHARS_RE, "");
677
+ return DANGEROUS_SCHEME_RE.test(normalized);
678
+ }
679
+ function isEventHandlerAttr(name) {
680
+ return /^on/i.test(name);
681
+ }
682
+
610
683
  // src/runtime.ts
684
+ function isUnsafeAttrBinding(name, value2) {
685
+ if (isEventHandlerAttr(name)) return true;
686
+ if (isUrlAttr(name) && isDangerousUrl(value2)) return true;
687
+ return false;
688
+ }
611
689
  var _refetchRegistry = /* @__PURE__ */ new Map();
612
690
  function $refetch(id) {
613
691
  const fn = _refetchRegistry.get(id);
@@ -1572,7 +1650,12 @@ function cloneAttributeTemplates(el, item) {
1572
1650
  if (attr.value.includes("{item")) {
1573
1651
  const compiled = compileTemplate(attr.value);
1574
1652
  entries.push({ attr: attr.name, compiled });
1575
- node.setAttribute(attr.name, evaluateCompiledTemplate(compiled, item));
1653
+ const value2 = evaluateCompiledTemplate(compiled, item);
1654
+ if (isUnsafeAttrBinding(attr.name, value2)) {
1655
+ node.removeAttribute(attr.name);
1656
+ } else {
1657
+ node.setAttribute(attr.name, value2);
1658
+ }
1576
1659
  }
1577
1660
  }
1578
1661
  if (entries.length > 0) {
@@ -2344,7 +2427,12 @@ function bindElement(el, scope, disposers) {
2344
2427
  if (val == null || val === false) {
2345
2428
  el.removeAttribute(attrName);
2346
2429
  } else {
2347
- el.setAttribute(attrName, String(val));
2430
+ const str = String(val);
2431
+ if (isUnsafeAttrBinding(attrName, str)) {
2432
+ el.removeAttribute(attrName);
2433
+ } else {
2434
+ el.setAttribute(attrName, str);
2435
+ }
2348
2436
  }
2349
2437
  });
2350
2438
  disposers.push(dispose);