@getforma/core 0.6.1 → 0.8.1

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 (52) hide show
  1. package/README.md +93 -8
  2. package/dist/chunk-3U57L2TY.cjs +38 -0
  3. package/dist/chunk-3U57L2TY.cjs.map +1 -0
  4. package/dist/{chunk-TKGUHASG.js → chunk-N522P3G6.js} +20 -12
  5. package/dist/chunk-N522P3G6.js.map +1 -0
  6. package/dist/chunk-OZCHIVAZ.js +35 -0
  7. package/dist/chunk-OZCHIVAZ.js.map +1 -0
  8. package/dist/{chunk-YSKF3VRA.cjs → chunk-YMIMKO4W.cjs} +51 -20
  9. package/dist/chunk-YMIMKO4W.cjs.map +1 -0
  10. package/dist/forma-runtime-csp.js +1 -1
  11. package/dist/forma-runtime.js +1 -1
  12. package/dist/formajs-runtime-hardened.global.js +1 -1
  13. package/dist/formajs-runtime-hardened.global.js.map +1 -1
  14. package/dist/formajs-runtime.global.js +1 -1
  15. package/dist/formajs-runtime.global.js.map +1 -1
  16. package/dist/formajs.global.js +1 -1
  17. package/dist/formajs.global.js.map +1 -1
  18. package/dist/index.cjs +112 -115
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +30 -21
  21. package/dist/index.d.ts +30 -21
  22. package/dist/index.js +25 -50
  23. package/dist/index.js.map +1 -1
  24. package/dist/runtime-hardened.cjs +106 -27
  25. package/dist/runtime-hardened.cjs.map +1 -1
  26. package/dist/runtime-hardened.js +107 -28
  27. package/dist/runtime-hardened.js.map +1 -1
  28. package/dist/runtime.cjs +128 -50
  29. package/dist/runtime.cjs.map +1 -1
  30. package/dist/runtime.js +102 -24
  31. package/dist/runtime.js.map +1 -1
  32. package/dist/signal-B4_wQJHs.d.cts +53 -0
  33. package/dist/signal-B4_wQJHs.d.ts +53 -0
  34. package/dist/ssr/index.cjs +19 -2
  35. package/dist/ssr/index.cjs.map +1 -1
  36. package/dist/ssr/index.js +19 -2
  37. package/dist/ssr/index.js.map +1 -1
  38. package/dist/tc39-compat.cjs +4 -12
  39. package/dist/tc39-compat.cjs.map +1 -1
  40. package/dist/tc39-compat.d.cts +1 -1
  41. package/dist/tc39-compat.d.ts +1 -1
  42. package/dist/tc39-compat.js +3 -11
  43. package/dist/tc39-compat.js.map +1 -1
  44. package/package.json +2 -2
  45. package/dist/chunk-DPSAVBCP.js +0 -26
  46. package/dist/chunk-DPSAVBCP.js.map +0 -1
  47. package/dist/chunk-KH3F5NRU.cjs +0 -29
  48. package/dist/chunk-KH3F5NRU.cjs.map +0 -1
  49. package/dist/chunk-TKGUHASG.js.map +0 -1
  50. package/dist/chunk-YSKF3VRA.cjs.map +0 -1
  51. package/dist/signal-CfLDwMyg.d.cts +0 -29
  52. package/dist/signal-CfLDwMyg.d.ts +0 -29
package/dist/runtime.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkYSKF3VRA_cjs = require('./chunk-YSKF3VRA.cjs');
4
- var chunkKH3F5NRU_cjs = require('./chunk-KH3F5NRU.cjs');
3
+ var chunkYMIMKO4W_cjs = require('./chunk-YMIMKO4W.cjs');
4
+ var chunk3U57L2TY_cjs = require('./chunk-3U57L2TY.cjs');
5
5
 
6
6
  // src/dom/reconcile.ts
7
7
  function getBindTargets(el) {
@@ -967,7 +967,7 @@ function parseIfHandler(expr, scope) {
967
967
  }
968
968
  if (rest.length > 0) return null;
969
969
  return (e) => {
970
- chunkYSKF3VRA_cjs.batch(() => {
970
+ chunkYMIMKO4W_cjs.batch(() => {
971
971
  if (condExpr()) thenHandler(e);
972
972
  else elseHandler?.(e);
973
973
  });
@@ -1540,14 +1540,6 @@ function parseExpressionUncached(expr, scope) {
1540
1540
  return () => left() ?? right();
1541
1541
  }
1542
1542
  }
1543
- const andMatch = expr.match(RE_AND);
1544
- if (andMatch) {
1545
- const left = parseExpression(andMatch[1].trim(), scope);
1546
- const right = parseExpression(andMatch[2].trim(), scope);
1547
- if (left && right) {
1548
- return () => left() && right();
1549
- }
1550
- }
1551
1543
  const orMatch = expr.match(RE_OR);
1552
1544
  if (orMatch) {
1553
1545
  const left = parseExpression(orMatch[1].trim(), scope);
@@ -1556,6 +1548,14 @@ function parseExpressionUncached(expr, scope) {
1556
1548
  return () => left() || right();
1557
1549
  }
1558
1550
  }
1551
+ const andMatch = expr.match(RE_AND);
1552
+ if (andMatch) {
1553
+ const left = parseExpression(andMatch[1].trim(), scope);
1554
+ const right = parseExpression(andMatch[2].trim(), scope);
1555
+ if (left && right) {
1556
+ return () => left() && right();
1557
+ }
1558
+ }
1559
1559
  const compMatch = expr.match(RE_COMPARISON);
1560
1560
  if (compMatch) {
1561
1561
  const left = parseExpression(compMatch[1].trim(), scope);
@@ -1585,6 +1585,19 @@ function parseExpressionUncached(expr, scope) {
1585
1585
  };
1586
1586
  }
1587
1587
  }
1588
+ const addMatch = expr.match(RE_ADD);
1589
+ if (addMatch) {
1590
+ const left = parseExpression(addMatch[1].trim(), scope);
1591
+ const right = parseExpression(addMatch[3].trim(), scope);
1592
+ if (left && right) {
1593
+ const op = addMatch[2];
1594
+ return () => {
1595
+ const l = left(), r = right();
1596
+ if (op === "+") return l + r;
1597
+ return l - r;
1598
+ };
1599
+ }
1600
+ }
1588
1601
  const mulMatch = expr.match(RE_MUL);
1589
1602
  if (mulMatch) {
1590
1603
  const left = parseExpression(mulMatch[1].trim(), scope);
@@ -1604,19 +1617,6 @@ function parseExpressionUncached(expr, scope) {
1604
1617
  };
1605
1618
  }
1606
1619
  }
1607
- const addMatch = expr.match(RE_ADD);
1608
- if (addMatch) {
1609
- const left = parseExpression(addMatch[1].trim(), scope);
1610
- const right = parseExpression(addMatch[3].trim(), scope);
1611
- if (left && right) {
1612
- const op = addMatch[2];
1613
- return () => {
1614
- const l = left(), r = right();
1615
- if (op === "+") return l + r;
1616
- return l - r;
1617
- };
1618
- }
1619
- }
1620
1620
  const tmplMatch = expr.match(RE_TEMPLATE_LIT);
1621
1621
  if (tmplMatch) {
1622
1622
  const raw = tmplMatch[1];
@@ -1716,7 +1716,7 @@ function parseHandler(expr, scope) {
1716
1716
  const handlers = stmts.map((s) => parseHandler(s, scope));
1717
1717
  if (handlers.every((h) => h !== null)) {
1718
1718
  return (e) => {
1719
- chunkYSKF3VRA_cjs.batch(() => {
1719
+ chunkYMIMKO4W_cjs.batch(() => {
1720
1720
  for (const h of handlers) h(e);
1721
1721
  });
1722
1722
  };
@@ -1729,7 +1729,7 @@ function parseHandler(expr, scope) {
1729
1729
  const name = incrMatch[1];
1730
1730
  const op = incrMatch[2];
1731
1731
  return () => {
1732
- chunkYSKF3VRA_cjs.batch(() => {
1732
+ chunkYMIMKO4W_cjs.batch(() => {
1733
1733
  const val = scope.getters[name]?.() ?? 0;
1734
1734
  scope.setters[name]?.(op === "++" ? val + 1 : val - 1);
1735
1735
  });
@@ -1740,7 +1740,7 @@ function parseHandler(expr, scope) {
1740
1740
  const op = preIncrMatch[1];
1741
1741
  const name = preIncrMatch[2];
1742
1742
  return () => {
1743
- chunkYSKF3VRA_cjs.batch(() => {
1743
+ chunkYMIMKO4W_cjs.batch(() => {
1744
1744
  const val = scope.getters[name]?.() ?? 0;
1745
1745
  scope.setters[name]?.(op === "++" ? val + 1 : val - 1);
1746
1746
  });
@@ -1750,7 +1750,7 @@ function parseHandler(expr, scope) {
1750
1750
  if (toggleMatch && toggleMatch[1] === toggleMatch[2]) {
1751
1751
  const name = toggleMatch[1];
1752
1752
  return () => {
1753
- chunkYSKF3VRA_cjs.batch(() => {
1753
+ chunkYMIMKO4W_cjs.batch(() => {
1754
1754
  scope.setters[name]?.(!scope.getters[name]?.());
1755
1755
  });
1756
1756
  };
@@ -1762,7 +1762,7 @@ function parseHandler(expr, scope) {
1762
1762
  if (valExpr) {
1763
1763
  if (_debug) dbg(`parseHandler: assignment "${name} = ..." \u2014 setter exists:`, !!scope.setters[name], ", getter exists:", !!scope.getters[name]);
1764
1764
  return () => {
1765
- chunkYSKF3VRA_cjs.batch(() => {
1765
+ chunkYMIMKO4W_cjs.batch(() => {
1766
1766
  const val = valExpr();
1767
1767
  if (_debug) dbg(`SETTER: ${name} = ${val} (was: ${scope.getters[name]?.()})`);
1768
1768
  scope.setters[name]?.(val);
@@ -1777,7 +1777,7 @@ function parseHandler(expr, scope) {
1777
1777
  const valExpr = parseExpression(compoundMatch[3].trim(), scope);
1778
1778
  if (valExpr) {
1779
1779
  return () => {
1780
- chunkYSKF3VRA_cjs.batch(() => {
1780
+ chunkYMIMKO4W_cjs.batch(() => {
1781
1781
  const current = scope.getters[name]?.() ?? 0;
1782
1782
  const val = valExpr();
1783
1783
  switch (op) {
@@ -1858,7 +1858,7 @@ function buildHandler(expr, scope) {
1858
1858
  }
1859
1859
  });
1860
1860
  const unsafeHandler = (e) => {
1861
- chunkYSKF3VRA_cjs.batch(() => fn(proxy, e, e));
1861
+ chunkYMIMKO4W_cjs.batch(() => fn(proxy, e, e));
1862
1862
  };
1863
1863
  const result = {
1864
1864
  handler: unsafeHandler,
@@ -1906,16 +1906,94 @@ function initScope(stateEl) {
1906
1906
  const getters = {};
1907
1907
  const setters = {};
1908
1908
  for (const [key, initial] of Object.entries(state)) {
1909
- const [get, set] = chunkKH3F5NRU_cjs.createSignal(initial);
1909
+ const [get, set] = chunk3U57L2TY_cjs.createSignal(initial);
1910
1910
  getters[key] = get;
1911
1911
  setters[key] = set;
1912
1912
  }
1913
1913
  getters["$refetch"] = () => $refetch;
1914
1914
  return { getters, setters };
1915
1915
  }
1916
+ var SAFE_EL_PROPS = /* @__PURE__ */ new Set([
1917
+ // Identity & attributes
1918
+ "id",
1919
+ "className",
1920
+ "tagName",
1921
+ "nodeName",
1922
+ "getAttribute",
1923
+ "setAttribute",
1924
+ "removeAttribute",
1925
+ "hasAttribute",
1926
+ "toggleAttribute",
1927
+ "dataset",
1928
+ "classList",
1929
+ // Content
1930
+ "textContent",
1931
+ "innerText",
1932
+ // Form elements
1933
+ "value",
1934
+ "checked",
1935
+ "disabled",
1936
+ "selected",
1937
+ "type",
1938
+ "name",
1939
+ "placeholder",
1940
+ "readOnly",
1941
+ "required",
1942
+ "min",
1943
+ "max",
1944
+ "step",
1945
+ "pattern",
1946
+ // Dimensions & position
1947
+ "getBoundingClientRect",
1948
+ "offsetWidth",
1949
+ "offsetHeight",
1950
+ "offsetTop",
1951
+ "offsetLeft",
1952
+ "clientWidth",
1953
+ "clientHeight",
1954
+ "scrollWidth",
1955
+ "scrollHeight",
1956
+ "scrollTop",
1957
+ "scrollLeft",
1958
+ // Style
1959
+ "style",
1960
+ "hidden",
1961
+ // Focus & interaction
1962
+ "focus",
1963
+ "blur",
1964
+ "click",
1965
+ "scrollIntoView",
1966
+ "scrollTo",
1967
+ // Traversal (safe — returns elements, not window/document)
1968
+ "closest",
1969
+ "matches",
1970
+ "querySelector",
1971
+ "querySelectorAll",
1972
+ "children",
1973
+ "childElementCount",
1974
+ "firstElementChild",
1975
+ "lastElementChild",
1976
+ "nextElementSibling",
1977
+ "previousElementSibling"
1978
+ ]);
1979
+ function createSafeElProxy(el) {
1980
+ return new Proxy(el, {
1981
+ get(target, prop) {
1982
+ if (typeof prop === "symbol") return Reflect.get(target, prop);
1983
+ if (!SAFE_EL_PROPS.has(prop)) return void 0;
1984
+ const val = Reflect.get(target, prop);
1985
+ return typeof val === "function" ? val.bind(target) : val;
1986
+ },
1987
+ set(target, prop, value) {
1988
+ if (typeof prop === "symbol") return false;
1989
+ if (!SAFE_EL_PROPS.has(prop)) return false;
1990
+ return Reflect.set(target, prop, value);
1991
+ }
1992
+ });
1993
+ }
1916
1994
  function bindElement(el, scope, disposers) {
1917
1995
  const elMagics = {
1918
- $el: el,
1996
+ $el: createSafeElProxy(el),
1919
1997
  $dispatch: (name, detail) => {
1920
1998
  el.dispatchEvent(new CustomEvent(name, {
1921
1999
  bubbles: true,
@@ -1940,7 +2018,7 @@ function bindElement(el, scope, disposers) {
1940
2018
  const prevGetter = scope.getters[name];
1941
2019
  delete scope.getters[name];
1942
2020
  const evaluate = buildEvaluator(`{${expr}}`, scope);
1943
- const getter = chunkKH3F5NRU_cjs.createComputed(evaluate);
2021
+ const getter = chunk3U57L2TY_cjs.createComputed(evaluate);
1944
2022
  scope.getters[name] = getter;
1945
2023
  if (!prevGetter) {
1946
2024
  delete scope.setters[name];
@@ -1951,7 +2029,7 @@ function bindElement(el, scope, disposers) {
1951
2029
  const textExpr = !known || known.has("data-text") ? el.getAttribute("data-text") : null;
1952
2030
  if (textExpr) {
1953
2031
  const evaluate = buildEvaluator(textExpr, scope);
1954
- const dispose = chunkYSKF3VRA_cjs.internalEffect(() => {
2032
+ const dispose = chunkYMIMKO4W_cjs.internalEffect(() => {
1955
2033
  setElementTextFast(el, toTextValue(evaluate()));
1956
2034
  });
1957
2035
  disposers.push(dispose);
@@ -1966,7 +2044,7 @@ function bindElement(el, scope, disposers) {
1966
2044
  dbg(`bindElement: data-show="${showExpr}" on <${tag}${cls}>`);
1967
2045
  }
1968
2046
  let initialized = false;
1969
- const dispose = chunkYSKF3VRA_cjs.internalEffect(() => {
2047
+ const dispose = chunkYMIMKO4W_cjs.internalEffect(() => {
1970
2048
  const visible = !!evaluate();
1971
2049
  if (_debug) dbg(`data-show effect: "${showExpr}" \u2192 ${visible}`);
1972
2050
  applyShowVisibility(el, visible, transition, !initialized);
@@ -1985,7 +2063,7 @@ function bindElement(el, scope, disposers) {
1985
2063
  const parent = el.parentNode;
1986
2064
  let inserted = true;
1987
2065
  let initialized = false;
1988
- const dispose = chunkYSKF3VRA_cjs.internalEffect(() => {
2066
+ const dispose = chunkYMIMKO4W_cjs.internalEffect(() => {
1989
2067
  const show = !!evaluate();
1990
2068
  if (show && !inserted) {
1991
2069
  clearTransitionState(el);
@@ -2024,7 +2102,7 @@ function bindElement(el, scope, disposers) {
2024
2102
  const setter = scope.setters[prop];
2025
2103
  if (getter && setter) {
2026
2104
  const input = el;
2027
- const dispose = chunkYSKF3VRA_cjs.internalEffect(() => {
2105
+ const dispose = chunkYMIMKO4W_cjs.internalEffect(() => {
2028
2106
  const val = getter();
2029
2107
  if (input.type === "checkbox") {
2030
2108
  input.checked = !!val;
@@ -2088,14 +2166,14 @@ function bindElement(el, scope, disposers) {
2088
2166
  } else if (name.startsWith("data-class:")) {
2089
2167
  const cls = name.slice(11);
2090
2168
  const evaluate = buildEvaluator(attr.value, scope);
2091
- const dispose = chunkYSKF3VRA_cjs.internalEffect(() => {
2169
+ const dispose = chunkYMIMKO4W_cjs.internalEffect(() => {
2092
2170
  el.classList.toggle(cls, !!evaluate());
2093
2171
  });
2094
2172
  disposers.push(dispose);
2095
2173
  } else if (name.startsWith("data-bind:")) {
2096
2174
  const attrName = name.slice(10);
2097
2175
  const evaluate = buildEvaluator(attr.value, scope);
2098
- const dispose = chunkYSKF3VRA_cjs.internalEffect(() => {
2176
+ const dispose = chunkYMIMKO4W_cjs.internalEffect(() => {
2099
2177
  const val = evaluate();
2100
2178
  if (val == null || val === false) {
2101
2179
  el.removeAttribute(attrName);
@@ -2118,7 +2196,7 @@ function bindElement(el, scope, disposers) {
2118
2196
  if (saved !== null) setter(JSON.parse(saved));
2119
2197
  } catch {
2120
2198
  }
2121
- const dispose = chunkYSKF3VRA_cjs.internalEffect(() => {
2199
+ const dispose = chunkYMIMKO4W_cjs.internalEffect(() => {
2122
2200
  try {
2123
2201
  localStorage.setItem(key, JSON.stringify(getter()));
2124
2202
  } catch {
@@ -2205,7 +2283,7 @@ function bindElement(el, scope, disposers) {
2205
2283
  });
2206
2284
  }
2207
2285
  } : void 0;
2208
- const dispose = chunkYSKF3VRA_cjs.internalEffect(() => {
2286
+ const dispose = chunkYMIMKO4W_cjs.internalEffect(() => {
2209
2287
  const rawItems = evaluate();
2210
2288
  if (!Array.isArray(rawItems)) {
2211
2289
  for (const n of oldNodes) {
@@ -2226,7 +2304,7 @@ function bindElement(el, scope, disposers) {
2226
2304
  }
2227
2305
  const prevNodes = new Set(oldNodes);
2228
2306
  if (keyProp) {
2229
- const result = chunkYSKF3VRA_cjs.reconcileList(
2307
+ const result = chunkYMIMKO4W_cjs.reconcileList(
2230
2308
  el,
2231
2309
  oldItems,
2232
2310
  rawItems,
@@ -2256,7 +2334,7 @@ function bindElement(el, scope, disposers) {
2256
2334
  } else {
2257
2335
  const wrapped = rawItems.map((item, i) => ({ __idx: i, __item: item }));
2258
2336
  const oldWrapped = oldItems;
2259
- const result = chunkYSKF3VRA_cjs.reconcileList(
2337
+ const result = chunkYMIMKO4W_cjs.reconcileList(
2260
2338
  el,
2261
2339
  oldWrapped,
2262
2340
  wrapped,
@@ -2305,16 +2383,16 @@ function bindElement(el, scope, disposers) {
2305
2383
  else if (k === "error") errorTarget = v;
2306
2384
  else if (k === "poll") interval = parseInt(v ?? "0", 10);
2307
2385
  }
2308
- const [getTarget, setTarget] = chunkKH3F5NRU_cjs.createSignal(null);
2386
+ const [getTarget, setTarget] = chunk3U57L2TY_cjs.createSignal(null);
2309
2387
  scope.getters[target] = getTarget;
2310
2388
  scope.setters[target] = setTarget;
2311
2389
  if (loadingTarget) {
2312
- const [gl, sl] = chunkKH3F5NRU_cjs.createSignal(false);
2390
+ const [gl, sl] = chunk3U57L2TY_cjs.createSignal(false);
2313
2391
  scope.getters[loadingTarget] = gl;
2314
2392
  scope.setters[loadingTarget] = sl;
2315
2393
  }
2316
2394
  if (errorTarget) {
2317
- const [ge, se] = chunkKH3F5NRU_cjs.createSignal(null);
2395
+ const [ge, se] = chunk3U57L2TY_cjs.createSignal(null);
2318
2396
  scope.getters[errorTarget] = ge;
2319
2397
  scope.setters[errorTarget] = se;
2320
2398
  }
@@ -2626,7 +2704,7 @@ function getScopes() {
2626
2704
  function setScopeValue(element, key, value) {
2627
2705
  const scope = element.__formaScope;
2628
2706
  if (!scope?.setters[key]) return;
2629
- chunkYSKF3VRA_cjs.batch(() => {
2707
+ chunkYMIMKO4W_cjs.batch(() => {
2630
2708
  scope.setters[key](value);
2631
2709
  });
2632
2710
  }
@@ -2635,7 +2713,7 @@ function resetScope(element) {
2635
2713
  const initialJSON = element.__formaInitialState;
2636
2714
  if (!scope || !initialJSON) return;
2637
2715
  const initial = parseState(initialJSON);
2638
- chunkYSKF3VRA_cjs.batch(() => {
2716
+ chunkYMIMKO4W_cjs.batch(() => {
2639
2717
  for (const [key, val] of Object.entries(initial)) {
2640
2718
  scope.setters[key]?.(val);
2641
2719
  }
@@ -2665,7 +2743,7 @@ function getReconciler() {
2665
2743
  }
2666
2744
  }
2667
2745
  },
2668
- batch: chunkYSKF3VRA_cjs.batch
2746
+ batch: chunkYMIMKO4W_cjs.batch
2669
2747
  });
2670
2748
  }
2671
2749
  return _reconciler;