@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
package/dist/runtime.cjs CHANGED
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkT33QUD2Y_cjs = require('./chunk-T33QUD2Y.cjs');
4
- var chunk6FW5E54W_cjs = require('./chunk-6FW5E54W.cjs');
5
- var chunkQLPCVK7C_cjs = require('./chunk-QLPCVK7C.cjs');
3
+ var chunkJRQNDXX7_cjs = require('./chunk-JRQNDXX7.cjs');
4
+ var chunk263HW3KN_cjs = require('./chunk-263HW3KN.cjs');
5
+ var chunk2Y5US35K_cjs = require('./chunk-2Y5US35K.cjs');
6
+ var chunkW7OUWVRA_cjs = require('./chunk-W7OUWVRA.cjs');
6
7
 
7
8
  // src/dom/reconcile.ts
8
9
  function getBindTargets(el) {
@@ -335,6 +336,11 @@ function createReconciler(config) {
335
336
  }
336
337
 
337
338
  // src/runtime.ts
339
+ function isUnsafeAttrBinding(name, value) {
340
+ if (chunk263HW3KN_cjs.isEventHandlerAttr(name)) return true;
341
+ if (chunk263HW3KN_cjs.isUrlAttr(name) && chunk263HW3KN_cjs.isDangerousUrl(value)) return true;
342
+ return false;
343
+ }
338
344
  var _refetchRegistry = /* @__PURE__ */ new Map();
339
345
  function $refetch(id) {
340
346
  const fn = _refetchRegistry.get(id);
@@ -968,7 +974,7 @@ function parseIfHandler(expr, scope) {
968
974
  }
969
975
  if (rest.length > 0) return null;
970
976
  return (e) => {
971
- chunk6FW5E54W_cjs.batch(() => {
977
+ chunk2Y5US35K_cjs.batch(() => {
972
978
  if (condExpr()) thenHandler(e);
973
979
  else elseHandler?.(e);
974
980
  });
@@ -1337,7 +1343,12 @@ function cloneAttributeTemplates(el, item) {
1337
1343
  if (attr.value.includes("{item")) {
1338
1344
  const compiled = compileTemplate(attr.value);
1339
1345
  entries.push({ attr: attr.name, compiled });
1340
- node.setAttribute(attr.name, evaluateCompiledTemplate(compiled, item));
1346
+ const value = evaluateCompiledTemplate(compiled, item);
1347
+ if (isUnsafeAttrBinding(attr.name, value)) {
1348
+ node.removeAttribute(attr.name);
1349
+ } else {
1350
+ node.setAttribute(attr.name, value);
1351
+ }
1341
1352
  }
1342
1353
  }
1343
1354
  if (entries.length > 0) {
@@ -1717,7 +1728,7 @@ function parseHandler(expr, scope) {
1717
1728
  const handlers = stmts.map((s) => parseHandler(s, scope));
1718
1729
  if (handlers.every((h) => h !== null)) {
1719
1730
  return (e) => {
1720
- chunk6FW5E54W_cjs.batch(() => {
1731
+ chunk2Y5US35K_cjs.batch(() => {
1721
1732
  for (const h of handlers) h(e);
1722
1733
  });
1723
1734
  };
@@ -1730,7 +1741,7 @@ function parseHandler(expr, scope) {
1730
1741
  const name = incrMatch[1];
1731
1742
  const op = incrMatch[2];
1732
1743
  return () => {
1733
- chunk6FW5E54W_cjs.batch(() => {
1744
+ chunk2Y5US35K_cjs.batch(() => {
1734
1745
  const val = scope.getters[name]?.() ?? 0;
1735
1746
  scope.setters[name]?.(op === "++" ? val + 1 : val - 1);
1736
1747
  });
@@ -1741,7 +1752,7 @@ function parseHandler(expr, scope) {
1741
1752
  const op = preIncrMatch[1];
1742
1753
  const name = preIncrMatch[2];
1743
1754
  return () => {
1744
- chunk6FW5E54W_cjs.batch(() => {
1755
+ chunk2Y5US35K_cjs.batch(() => {
1745
1756
  const val = scope.getters[name]?.() ?? 0;
1746
1757
  scope.setters[name]?.(op === "++" ? val + 1 : val - 1);
1747
1758
  });
@@ -1751,7 +1762,7 @@ function parseHandler(expr, scope) {
1751
1762
  if (toggleMatch && toggleMatch[1] === toggleMatch[2]) {
1752
1763
  const name = toggleMatch[1];
1753
1764
  return () => {
1754
- chunk6FW5E54W_cjs.batch(() => {
1765
+ chunk2Y5US35K_cjs.batch(() => {
1755
1766
  scope.setters[name]?.(!scope.getters[name]?.());
1756
1767
  });
1757
1768
  };
@@ -1763,7 +1774,7 @@ function parseHandler(expr, scope) {
1763
1774
  if (valExpr) {
1764
1775
  if (_debug) dbg(`parseHandler: assignment "${name} = ..." \u2014 setter exists:`, !!scope.setters[name], ", getter exists:", !!scope.getters[name]);
1765
1776
  return () => {
1766
- chunk6FW5E54W_cjs.batch(() => {
1777
+ chunk2Y5US35K_cjs.batch(() => {
1767
1778
  const val = valExpr();
1768
1779
  if (_debug) dbg(`SETTER: ${name} = ${val} (was: ${scope.getters[name]?.()})`);
1769
1780
  scope.setters[name]?.(val);
@@ -1778,7 +1789,7 @@ function parseHandler(expr, scope) {
1778
1789
  const valExpr = parseExpression(compoundMatch[3].trim(), scope);
1779
1790
  if (valExpr) {
1780
1791
  return () => {
1781
- chunk6FW5E54W_cjs.batch(() => {
1792
+ chunk2Y5US35K_cjs.batch(() => {
1782
1793
  const current = scope.getters[name]?.() ?? 0;
1783
1794
  const val = valExpr();
1784
1795
  switch (op) {
@@ -1859,7 +1870,7 @@ function buildHandler(expr, scope) {
1859
1870
  }
1860
1871
  });
1861
1872
  const unsafeHandler = (e) => {
1862
- chunk6FW5E54W_cjs.batch(() => fn(proxy, e, e));
1873
+ chunk2Y5US35K_cjs.batch(() => fn(proxy, e, e));
1863
1874
  };
1864
1875
  const result = {
1865
1876
  handler: unsafeHandler,
@@ -1907,7 +1918,7 @@ function initScope(stateEl) {
1907
1918
  const getters = {};
1908
1919
  const setters = {};
1909
1920
  for (const [key, initial] of Object.entries(state)) {
1910
- const [get, set] = chunkQLPCVK7C_cjs.createSignal(initial);
1921
+ const [get, set] = chunkW7OUWVRA_cjs.createSignal(initial);
1911
1922
  getters[key] = get;
1912
1923
  setters[key] = set;
1913
1924
  }
@@ -2019,7 +2030,7 @@ function bindElement(el, scope, disposers) {
2019
2030
  const prevGetter = scope.getters[name];
2020
2031
  delete scope.getters[name];
2021
2032
  const evaluate = buildEvaluator(`{${expr}}`, scope);
2022
- const getter = chunkQLPCVK7C_cjs.createComputed(evaluate);
2033
+ const getter = chunkW7OUWVRA_cjs.createComputed(evaluate);
2023
2034
  scope.getters[name] = getter;
2024
2035
  if (!prevGetter) {
2025
2036
  delete scope.setters[name];
@@ -2030,7 +2041,7 @@ function bindElement(el, scope, disposers) {
2030
2041
  const textExpr = !known || known.has("data-text") ? el.getAttribute("data-text") : null;
2031
2042
  if (textExpr) {
2032
2043
  const evaluate = buildEvaluator(textExpr, scope);
2033
- const dispose = chunk6FW5E54W_cjs.internalEffect(() => {
2044
+ const dispose = chunk2Y5US35K_cjs.internalEffect(() => {
2034
2045
  setElementTextFast(el, toTextValue(evaluate()));
2035
2046
  });
2036
2047
  disposers.push(dispose);
@@ -2045,7 +2056,7 @@ function bindElement(el, scope, disposers) {
2045
2056
  dbg(`bindElement: data-show="${showExpr}" on <${tag}${cls}>`);
2046
2057
  }
2047
2058
  let initialized = false;
2048
- const dispose = chunk6FW5E54W_cjs.internalEffect(() => {
2059
+ const dispose = chunk2Y5US35K_cjs.internalEffect(() => {
2049
2060
  const visible = !!evaluate();
2050
2061
  if (_debug) dbg(`data-show effect: "${showExpr}" \u2192 ${visible}`);
2051
2062
  applyShowVisibility(el, visible, transition, !initialized);
@@ -2064,7 +2075,7 @@ function bindElement(el, scope, disposers) {
2064
2075
  const parent = el.parentNode;
2065
2076
  let inserted = true;
2066
2077
  let initialized = false;
2067
- const dispose = chunk6FW5E54W_cjs.internalEffect(() => {
2078
+ const dispose = chunk2Y5US35K_cjs.internalEffect(() => {
2068
2079
  const show = !!evaluate();
2069
2080
  if (show && !inserted) {
2070
2081
  clearTransitionState(el);
@@ -2103,7 +2114,7 @@ function bindElement(el, scope, disposers) {
2103
2114
  const setter = scope.setters[prop];
2104
2115
  if (getter && setter) {
2105
2116
  const input = el;
2106
- const dispose = chunk6FW5E54W_cjs.internalEffect(() => {
2117
+ const dispose = chunk2Y5US35K_cjs.internalEffect(() => {
2107
2118
  const val = getter();
2108
2119
  if (input.type === "checkbox") {
2109
2120
  input.checked = !!val;
@@ -2167,19 +2178,24 @@ function bindElement(el, scope, disposers) {
2167
2178
  } else if (name.startsWith("data-class:")) {
2168
2179
  const cls = name.slice(11);
2169
2180
  const evaluate = buildEvaluator(attr.value, scope);
2170
- const dispose = chunk6FW5E54W_cjs.internalEffect(() => {
2181
+ const dispose = chunk2Y5US35K_cjs.internalEffect(() => {
2171
2182
  el.classList.toggle(cls, !!evaluate());
2172
2183
  });
2173
2184
  disposers.push(dispose);
2174
2185
  } else if (name.startsWith("data-bind:")) {
2175
2186
  const attrName = name.slice(10);
2176
2187
  const evaluate = buildEvaluator(attr.value, scope);
2177
- const dispose = chunk6FW5E54W_cjs.internalEffect(() => {
2188
+ const dispose = chunk2Y5US35K_cjs.internalEffect(() => {
2178
2189
  const val = evaluate();
2179
2190
  if (val == null || val === false) {
2180
2191
  el.removeAttribute(attrName);
2181
2192
  } else {
2182
- el.setAttribute(attrName, String(val));
2193
+ const str = String(val);
2194
+ if (isUnsafeAttrBinding(attrName, str)) {
2195
+ el.removeAttribute(attrName);
2196
+ } else {
2197
+ el.setAttribute(attrName, str);
2198
+ }
2183
2199
  }
2184
2200
  });
2185
2201
  disposers.push(dispose);
@@ -2197,7 +2213,7 @@ function bindElement(el, scope, disposers) {
2197
2213
  if (saved !== null) setter(JSON.parse(saved));
2198
2214
  } catch {
2199
2215
  }
2200
- const dispose = chunk6FW5E54W_cjs.internalEffect(() => {
2216
+ const dispose = chunk2Y5US35K_cjs.internalEffect(() => {
2201
2217
  try {
2202
2218
  localStorage.setItem(key, JSON.stringify(getter()));
2203
2219
  } catch {
@@ -2284,7 +2300,7 @@ function bindElement(el, scope, disposers) {
2284
2300
  });
2285
2301
  }
2286
2302
  } : void 0;
2287
- const dispose = chunk6FW5E54W_cjs.internalEffect(() => {
2303
+ const dispose = chunk2Y5US35K_cjs.internalEffect(() => {
2288
2304
  const rawItems = evaluate();
2289
2305
  if (!Array.isArray(rawItems)) {
2290
2306
  for (const n of oldNodes) {
@@ -2305,7 +2321,7 @@ function bindElement(el, scope, disposers) {
2305
2321
  }
2306
2322
  const prevNodes = new Set(oldNodes);
2307
2323
  if (keyProp) {
2308
- const result = chunkT33QUD2Y_cjs.reconcileList(
2324
+ const result = chunkJRQNDXX7_cjs.reconcileList(
2309
2325
  el,
2310
2326
  oldItems,
2311
2327
  rawItems,
@@ -2335,7 +2351,7 @@ function bindElement(el, scope, disposers) {
2335
2351
  } else {
2336
2352
  const wrapped = rawItems.map((item, i) => ({ __idx: i, __item: item }));
2337
2353
  const oldWrapped = oldItems;
2338
- const result = chunkT33QUD2Y_cjs.reconcileList(
2354
+ const result = chunkJRQNDXX7_cjs.reconcileList(
2339
2355
  el,
2340
2356
  oldWrapped,
2341
2357
  wrapped,
@@ -2384,16 +2400,16 @@ function bindElement(el, scope, disposers) {
2384
2400
  else if (k === "error") errorTarget = v;
2385
2401
  else if (k === "poll") interval = parseInt(v ?? "0", 10);
2386
2402
  }
2387
- const [getTarget, setTarget] = chunkQLPCVK7C_cjs.createSignal(null);
2403
+ const [getTarget, setTarget] = chunkW7OUWVRA_cjs.createSignal(null);
2388
2404
  scope.getters[target] = getTarget;
2389
2405
  scope.setters[target] = setTarget;
2390
2406
  if (loadingTarget) {
2391
- const [gl, sl] = chunkQLPCVK7C_cjs.createSignal(false);
2407
+ const [gl, sl] = chunkW7OUWVRA_cjs.createSignal(false);
2392
2408
  scope.getters[loadingTarget] = gl;
2393
2409
  scope.setters[loadingTarget] = sl;
2394
2410
  }
2395
2411
  if (errorTarget) {
2396
- const [ge, se] = chunkQLPCVK7C_cjs.createSignal(null);
2412
+ const [ge, se] = chunkW7OUWVRA_cjs.createSignal(null);
2397
2413
  scope.getters[errorTarget] = ge;
2398
2414
  scope.setters[errorTarget] = se;
2399
2415
  }
@@ -2722,7 +2738,7 @@ function getScopes() {
2722
2738
  function setScopeValue(element, key, value) {
2723
2739
  const scope = element.__formaScope;
2724
2740
  if (!scope?.setters[key]) return;
2725
- chunk6FW5E54W_cjs.batch(() => {
2741
+ chunk2Y5US35K_cjs.batch(() => {
2726
2742
  scope.setters[key](value);
2727
2743
  });
2728
2744
  }
@@ -2731,7 +2747,7 @@ function resetScope(element) {
2731
2747
  const initialJSON = element.__formaInitialState;
2732
2748
  if (!scope || !initialJSON) return;
2733
2749
  const initial = parseState(initialJSON);
2734
- chunk6FW5E54W_cjs.batch(() => {
2750
+ chunk2Y5US35K_cjs.batch(() => {
2735
2751
  for (const [key, val] of Object.entries(initial)) {
2736
2752
  scope.setters[key]?.(val);
2737
2753
  }
@@ -2761,7 +2777,7 @@ function getReconciler() {
2761
2777
  }
2762
2778
  }
2763
2779
  },
2764
- batch: chunk6FW5E54W_cjs.batch
2780
+ batch: chunk2Y5US35K_cjs.batch
2765
2781
  });
2766
2782
  }
2767
2783
  return _reconciler;