@solidjs/web 2.0.0-beta.10 → 2.0.0-beta.12

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.
package/dist/dev.cjs CHANGED
@@ -51,13 +51,18 @@ const DOMElements = /*#__PURE__*/new Set(["html", "base", "head", "link", "meta"
51
51
  "isindex", "listing", "multicol", "nextid", "noindex", "search"]);
52
52
 
53
53
  const transparentOptions = {
54
- transparent: true
54
+ transparent: true,
55
+ sync: true
56
+ };
57
+ const syncOptions = {
58
+ sync: true
55
59
  };
56
60
  const effect = (fn, effectFn, options) => solidJs.createRenderEffect(fn, effectFn, options ? {
57
61
  transparent: true,
62
+ sync: true,
58
63
  ...options
59
64
  } : transparentOptions);
60
- const memo = fn => solidJs.createMemo(() => fn());
65
+ const memo = fn => solidJs.createMemo(() => fn(), syncOptions);
61
66
 
62
67
  function reconcileArrays(parentNode, a, b) {
63
68
  let bLength = b.length,
@@ -86,10 +91,12 @@ function reconcileArrays(parentNode, a, b) {
86
91
  aStart++;
87
92
  }
88
93
  } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
89
- const node = a[--aEnd].nextSibling;
90
- parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling);
91
- parentNode.insertBefore(b[--bEnd], node);
92
- a[aEnd] = b[bEnd];
94
+ const anchor = a[aStart];
95
+ do {
96
+ parentNode.insertBefore(a[--aEnd], anchor);
97
+ bStart++;
98
+ if (aStart >= aEnd - 1 || bStart >= bEnd) break;
99
+ } while (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]);
93
100
  } else {
94
101
  if (!map) {
95
102
  map = new Map();
@@ -202,13 +209,13 @@ function className(node, value, prev) {
202
209
  for (i = 0, len = prevKeys.length; i < len; i++) {
203
210
  const key = prevKeys[i];
204
211
  if (!key || key === "undefined" || value[key]) continue;
205
- toggleClassKey(node, key, false);
212
+ node.classList.remove(key);
206
213
  }
207
214
  for (i = 0, len = classKeys.length; i < len; i++) {
208
215
  const key = classKeys[i],
209
216
  classValue = !!value[key];
210
217
  if (!key || key === "undefined" || prev[key] === classValue || !classValue) continue;
211
- toggleClassKey(node, key, true);
218
+ node.classList.add(key);
212
219
  }
213
220
  }
214
221
  function addEventListener(node, name, handler, delegate) {
@@ -300,13 +307,16 @@ function insert(parent, accessor, marker, initial, options) {
300
307
  initial = [placeholder];
301
308
  }
302
309
  let current = initial;
303
- effect(() => {
310
+ effect(prev => {
304
311
  const value = normalize(accessor(), current, multi, true);
305
312
  if (typeof value !== "function") return value;
306
313
  effect(() => normalize(value, current, multi), inner => {
307
314
  insertExpression(parent, inner, current, marker);
308
315
  current = inner;
309
- }, options);
316
+ }, prev !== undefined && !(options && options.schedule) ? {
317
+ ...options,
318
+ schedule: true
319
+ } : options);
310
320
  return INNER_OWNED;
311
321
  }, value => {
312
322
  if (value === INNER_OWNED) return;
@@ -527,14 +537,21 @@ function isHydrating(node) {
527
537
  function getChildRoot(node) {
528
538
  return node && node.localName === "template" ? node.content : node;
529
539
  }
530
- function toggleClassKey(node, key, value) {
531
- const classNames = key.trim().split(/\s+/);
532
- for (let i = 0, nameLen = classNames.length; i < nameLen; i++) node.classList.toggle(classNames[i], value);
533
- }
534
540
  function classListToObject(classList) {
535
541
  if (Array.isArray(classList)) {
536
542
  const result = {};
537
543
  flattenClassList(classList, result);
544
+ classList = result;
545
+ }
546
+ if (classList && typeof classList === "object") {
547
+ const result = {},
548
+ keys = Object.keys(classList);
549
+ for (let i = 0, len = keys.length; i < len; i++) {
550
+ const key = keys[i];
551
+ if (!classList[key]) continue;
552
+ const classNames = key.trim().split(/\s+/);
553
+ for (let j = 0, nameLen = classNames.length; j < nameLen; j++) classNames[j] && (result[classNames[j]] = true);
554
+ }
538
555
  return result;
539
556
  }
540
557
  return classList;
package/dist/dev.js CHANGED
@@ -50,13 +50,18 @@ const DOMElements = /*#__PURE__*/new Set(["html", "base", "head", "link", "meta"
50
50
  "isindex", "listing", "multicol", "nextid", "noindex", "search"]);
51
51
 
52
52
  const transparentOptions = {
53
- transparent: true
53
+ transparent: true,
54
+ sync: true
55
+ };
56
+ const syncOptions = {
57
+ sync: true
54
58
  };
55
59
  const effect = (fn, effectFn, options) => createRenderEffect(fn, effectFn, options ? {
56
60
  transparent: true,
61
+ sync: true,
57
62
  ...options
58
63
  } : transparentOptions);
59
- const memo = fn => createMemo(() => fn());
64
+ const memo = fn => createMemo(() => fn(), syncOptions);
60
65
 
61
66
  function reconcileArrays(parentNode, a, b) {
62
67
  let bLength = b.length,
@@ -85,10 +90,12 @@ function reconcileArrays(parentNode, a, b) {
85
90
  aStart++;
86
91
  }
87
92
  } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
88
- const node = a[--aEnd].nextSibling;
89
- parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling);
90
- parentNode.insertBefore(b[--bEnd], node);
91
- a[aEnd] = b[bEnd];
93
+ const anchor = a[aStart];
94
+ do {
95
+ parentNode.insertBefore(a[--aEnd], anchor);
96
+ bStart++;
97
+ if (aStart >= aEnd - 1 || bStart >= bEnd) break;
98
+ } while (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]);
92
99
  } else {
93
100
  if (!map) {
94
101
  map = new Map();
@@ -201,13 +208,13 @@ function className(node, value, prev) {
201
208
  for (i = 0, len = prevKeys.length; i < len; i++) {
202
209
  const key = prevKeys[i];
203
210
  if (!key || key === "undefined" || value[key]) continue;
204
- toggleClassKey(node, key, false);
211
+ node.classList.remove(key);
205
212
  }
206
213
  for (i = 0, len = classKeys.length; i < len; i++) {
207
214
  const key = classKeys[i],
208
215
  classValue = !!value[key];
209
216
  if (!key || key === "undefined" || prev[key] === classValue || !classValue) continue;
210
- toggleClassKey(node, key, true);
217
+ node.classList.add(key);
211
218
  }
212
219
  }
213
220
  function addEventListener(node, name, handler, delegate) {
@@ -299,13 +306,16 @@ function insert(parent, accessor, marker, initial, options) {
299
306
  initial = [placeholder];
300
307
  }
301
308
  let current = initial;
302
- effect(() => {
309
+ effect(prev => {
303
310
  const value = normalize(accessor(), current, multi, true);
304
311
  if (typeof value !== "function") return value;
305
312
  effect(() => normalize(value, current, multi), inner => {
306
313
  insertExpression(parent, inner, current, marker);
307
314
  current = inner;
308
- }, options);
315
+ }, prev !== undefined && !(options && options.schedule) ? {
316
+ ...options,
317
+ schedule: true
318
+ } : options);
309
319
  return INNER_OWNED;
310
320
  }, value => {
311
321
  if (value === INNER_OWNED) return;
@@ -526,14 +536,21 @@ function isHydrating(node) {
526
536
  function getChildRoot(node) {
527
537
  return node && node.localName === "template" ? node.content : node;
528
538
  }
529
- function toggleClassKey(node, key, value) {
530
- const classNames = key.trim().split(/\s+/);
531
- for (let i = 0, nameLen = classNames.length; i < nameLen; i++) node.classList.toggle(classNames[i], value);
532
- }
533
539
  function classListToObject(classList) {
534
540
  if (Array.isArray(classList)) {
535
541
  const result = {};
536
542
  flattenClassList(classList, result);
543
+ classList = result;
544
+ }
545
+ if (classList && typeof classList === "object") {
546
+ const result = {},
547
+ keys = Object.keys(classList);
548
+ for (let i = 0, len = keys.length; i < len; i++) {
549
+ const key = keys[i];
550
+ if (!classList[key]) continue;
551
+ const classNames = key.trim().split(/\s+/);
552
+ for (let j = 0, nameLen = classNames.length; j < nameLen; j++) classNames[j] && (result[classNames[j]] = true);
553
+ }
537
554
  return result;
538
555
  }
539
556
  return classList;
package/dist/server.cjs CHANGED
@@ -25,13 +25,18 @@ const DOMElements = /*#__PURE__*/new Set(["html", "base", "head", "link", "meta"
25
25
  "isindex", "listing", "multicol", "nextid", "noindex", "search"]);
26
26
 
27
27
  const transparentOptions = {
28
- transparent: true
28
+ transparent: true,
29
+ sync: true
30
+ };
31
+ const syncOptions = {
32
+ sync: true
29
33
  };
30
34
  const effect = (fn, effectFn, options) => solidJs.createRenderEffect(fn, effectFn, options ? {
31
35
  transparent: true,
36
+ sync: true,
32
37
  ...options
33
38
  } : transparentOptions);
34
- const memo = fn => solidJs.createMemo(() => fn());
39
+ const memo = fn => solidJs.createMemo(() => fn(), syncOptions);
35
40
 
36
41
  const ES2017FLAG = seroval.Feature.AggregateError |
37
42
  seroval.Feature.BigIntTypedArray;
@@ -592,11 +597,176 @@ function HydrationScript(props) {
592
597
  ...props
593
598
  }));
594
599
  }
595
- function ssr(t, ...nodes) {
596
- if (nodes.length) return resolveSSR(t, nodes);
600
+ function ssrGroup(fn, n) {
601
+ fn.$g = n;
602
+ return fn;
603
+ }
604
+ function buildAsyncWrap(err, node) {
605
+ const p = solidJs.ssrHandleError(err);
606
+ if (!p) return null;
607
+ const owner = solidJs.getOwner();
597
608
  return {
609
+ fn: owner ? () => solidJs.runWithOwner(owner, node) : node,
610
+ p
611
+ };
612
+ }
613
+ function ssrFirstGroupHit(hole) {
614
+ try {
615
+ return hole();
616
+ } catch (err) {
617
+ return buildAsyncWrap(err, hole);
618
+ }
619
+ }
620
+ function tryResolveFunctionHole(hole) {
621
+ let value;
622
+ try {
623
+ value = hole();
624
+ } catch (err) {
625
+ return buildAsyncWrap(err, hole) || "";
626
+ }
627
+ const t = typeof value;
628
+ if (t === "string") return value;
629
+ if (t === "number") return "" + value;
630
+ if (value == null || t === "boolean") return "";
631
+ return tryResolveString(value);
632
+ }
633
+ function mergeTemplateInto(result, node) {
634
+ result.t[result.t.length - 1] += node.t[0];
635
+ if (node.t.length > 1) {
636
+ result.t.push(...node.t.slice(1));
637
+ result.h.push(...node.h);
638
+ result.p.push(...node.p);
639
+ }
640
+ }
641
+ function appendResolvedNode(result, node) {
642
+ if (node.fn !== undefined) {
643
+ result.h.push(node.fn);
644
+ result.p.push(node.p);
645
+ result.t.push("");
646
+ } else if (node.merge !== undefined) mergeTemplateInto(result, node.merge);else resolveSSRNode(node.bail, result);
647
+ }
648
+ let _lastGroupFn = null;
649
+ let _lastGroupArr = null;
650
+ let _lastGroupErr = null;
651
+ function ssrGroupSlot(fn, idx) {
652
+ return () => {
653
+ if (idx > 0 && _lastGroupFn === fn) {
654
+ if (_lastGroupArr !== null) return _lastGroupArr[idx];
655
+ throw _lastGroupErr;
656
+ }
657
+ _lastGroupFn = fn;
658
+ _lastGroupArr = null;
659
+ _lastGroupErr = null;
660
+ try {
661
+ _lastGroupArr = fn();
662
+ return _lastGroupArr[idx];
663
+ } catch (err) {
664
+ _lastGroupErr = err;
665
+ throw err;
666
+ }
667
+ };
668
+ }
669
+ function ssr(t) {
670
+ const len = arguments.length;
671
+ if (len === 1) return {
598
672
  t
599
673
  };
674
+ let s = t[0];
675
+ let result = null;
676
+ let lastGroup = null;
677
+ let lastGroupVal = null;
678
+ let lastGroupIdx = 0;
679
+ for (let i = 1; i < len; i++) {
680
+ const hole = arguments[i];
681
+ const ht = typeof hole;
682
+ if (ht === "string") {
683
+ if (result === null) s += hole;else result.t[result.t.length - 1] += hole;
684
+ } else if (ht === "number") {
685
+ if (result === null) s += hole;else result.t[result.t.length - 1] += hole;
686
+ } else if (hole == null || ht === "boolean") ; else if (ht === "function" && hole.$g) {
687
+ let value;
688
+ let hasValue = false;
689
+ if (lastGroup !== hole) {
690
+ const r = ssrFirstGroupHit(hole);
691
+ if (r !== null) {
692
+ lastGroup = hole;
693
+ lastGroupVal = r;
694
+ lastGroupIdx = 0;
695
+ if (!Array.isArray(r) && result === null) {
696
+ result = {
697
+ t: [s],
698
+ h: [],
699
+ p: []
700
+ };
701
+ s = "";
702
+ }
703
+ }
704
+ }
705
+ if (lastGroup === hole) {
706
+ if (Array.isArray(lastGroupVal)) {
707
+ value = lastGroupVal[lastGroupIdx++];
708
+ hasValue = true;
709
+ } else {
710
+ result.h.push(ssrGroupSlot(lastGroupVal.fn, lastGroupIdx++));
711
+ result.p.push(lastGroupVal.p);
712
+ result.t.push("");
713
+ }
714
+ }
715
+ if (hasValue) {
716
+ const vt = typeof value;
717
+ if (vt === "string" || vt === "number") {
718
+ if (result === null) s += value;else result.t[result.t.length - 1] += value;
719
+ } else if (value == null || vt === "boolean") ; else if (result !== null) {
720
+ resolveSSRNode(value, result);
721
+ } else {
722
+ const rs = tryResolveString(value);
723
+ if (typeof rs === "string") {
724
+ s += rs;
725
+ } else {
726
+ result = {
727
+ t: [s],
728
+ h: [],
729
+ p: []
730
+ };
731
+ s = "";
732
+ if (rs.merge !== undefined) mergeTemplateInto(result, rs.merge);else resolveSSRNode(rs.bail, result);
733
+ }
734
+ }
735
+ }
736
+ } else if (result !== null) {
737
+ resolveSSRNode(hole, result);
738
+ } else if (ht === "function") {
739
+ const r = tryResolveFunctionHole(hole);
740
+ if (typeof r === "string") s += r;else {
741
+ result = {
742
+ t: [s],
743
+ h: [],
744
+ p: []
745
+ };
746
+ s = "";
747
+ appendResolvedNode(result, r);
748
+ }
749
+ } else {
750
+ const r = tryResolveString(hole);
751
+ if (typeof r === "string") {
752
+ s += r;
753
+ } else {
754
+ result = {
755
+ t: [s],
756
+ h: [],
757
+ p: []
758
+ };
759
+ s = "";
760
+ appendResolvedNode(result, r);
761
+ }
762
+ }
763
+ const next = t[i];
764
+ if (result === null) s += next;else result.t[result.t.length - 1] += next;
765
+ }
766
+ if (result === null) return {
767
+ t: s
768
+ };
769
+ return result;
600
770
  }
601
771
  function ssrClassName(value) {
602
772
  if (!value) return "";
@@ -677,6 +847,8 @@ function escape(s, attr) {
677
847
  const t = typeof s;
678
848
  if (t !== "string") {
679
849
  if (!attr && Array.isArray(s)) {
850
+ const joined = tryJoinPlainSSRArray(s);
851
+ if (joined !== undefined) return joined;
680
852
  s = s.slice();
681
853
  for (let i = 0; i < s.length; i++) s[i] = escape(s[i]);
682
854
  return s;
@@ -684,11 +856,21 @@ function escape(s, attr) {
684
856
  if (attr && t === "boolean") return s;
685
857
  return s;
686
858
  }
859
+ const delimCode = attr ? 34 : 60;
860
+ const len = s.length;
861
+ for (let i = 0; i < len; i++) {
862
+ const c = s.charCodeAt(i);
863
+ if (c === 38 || c === delimCode) return escapeSlow(s, attr, i);
864
+ }
865
+ return s;
866
+ }
867
+ function escapeSlow(s, attr, start) {
687
868
  const delim = attr ? '"' : "<";
869
+ const delimCode = attr ? 34 : 60;
688
870
  const escDelim = attr ? "&quot;" : "&lt;";
689
- let iDelim = s.indexOf(delim);
690
- let iAmp = s.indexOf("&");
691
- if (iDelim < 0 && iAmp < 0) return s;
871
+ const c0 = s.charCodeAt(start);
872
+ let iDelim = c0 === delimCode ? start : s.indexOf(delim, start);
873
+ let iAmp = c0 === 38 ? start : s.indexOf("&", start);
692
874
  let left = 0,
693
875
  out = "";
694
876
  while (iDelim >= 0 && iAmp >= 0) {
@@ -719,6 +901,18 @@ function escape(s, attr) {
719
901
  }
720
902
  return left < s.length ? out + s.substring(left) : out;
721
903
  }
904
+ function tryJoinPlainSSRArray(nodes) {
905
+ if (nodes.length === 0) return undefined;
906
+ let out = "";
907
+ for (let i = 0, len = nodes.length; i < len; i++) {
908
+ const node = nodes[i];
909
+ if (node == null || typeof node !== "object" || node.h || typeof node.t !== "string") {
910
+ return undefined;
911
+ }
912
+ out += node.t;
913
+ }
914
+ return out;
915
+ }
722
916
  function mergeProps(...sources) {
723
917
  const target = {};
724
918
  for (let i = 0; i < sources.length; i++) {
@@ -860,19 +1054,45 @@ function flattenClassList(list, result) {
860
1054
  if (Array.isArray(item)) flattenClassList(item, result);else if (typeof item === "object" && item != null) Object.assign(result, item);else if (item || item === 0) result[item] = true;
861
1055
  }
862
1056
  }
863
- function resolveSSR(template, holes, result = {
864
- t: [""],
865
- h: [],
866
- p: []
867
- }) {
868
- for (let i = 0; i < holes.length; i++) {
869
- const hole = holes[i];
870
- result.t[result.t.length - 1] += template[i];
871
- if (hole == null || hole === true || hole === false) continue;
872
- resolveSSRNode(hole, result);
1057
+ function tryResolveString(node) {
1058
+ const t = typeof node;
1059
+ if (t === "string") return node;
1060
+ if (t === "number") return "" + node;
1061
+ if (node == null || t === "boolean") return "";
1062
+ if (t === "object") {
1063
+ if (Array.isArray(node)) {
1064
+ const joined = tryJoinPlainSSRArray(node);
1065
+ if (joined !== undefined) return joined;
1066
+ let s = "";
1067
+ let prevNonObj = false;
1068
+ for (let i = 0, len = node.length; i < len; i++) {
1069
+ const item = node[i];
1070
+ const itemNonObj = item !== null && typeof item !== "object";
1071
+ if (prevNonObj && itemNonObj) s += "<!--!$-->";
1072
+ prevNonObj = itemNonObj;
1073
+ const r = tryResolveString(item);
1074
+ if (typeof r !== "string") return {
1075
+ bail: node
1076
+ };
1077
+ s += r;
1078
+ }
1079
+ return s;
1080
+ }
1081
+ if (node.h && node.h.length > 0) return {
1082
+ merge: node
1083
+ };
1084
+ return Array.isArray(node.t) ? node.t[0] : node.t;
873
1085
  }
874
- result.t[result.t.length - 1] += template[template.length - 1];
875
- return result;
1086
+ if (t === "function") {
1087
+ let v;
1088
+ try {
1089
+ v = node();
1090
+ } catch (err) {
1091
+ return buildAsyncWrap(err, node) || "";
1092
+ }
1093
+ return tryResolveString(v);
1094
+ }
1095
+ return "";
876
1096
  }
877
1097
  function resolveSSRNode(node, result = {
878
1098
  t: [""],
@@ -883,10 +1103,13 @@ function resolveSSRNode(node, result = {
883
1103
  if (t === "string" || t === "number") {
884
1104
  result.t[result.t.length - 1] += node;
885
1105
  } else if (node == null || t === "boolean") ; else if (Array.isArray(node)) {
886
- let prev = {};
1106
+ let prevNonObj = false;
887
1107
  for (let i = 0, len = node.length; i < len; i++) {
888
- if (!top && typeof prev !== "object" && typeof node[i] !== "object") result.t[result.t.length - 1] += `<!--!$-->`;
889
- resolveSSRNode(prev = node[i], result);
1108
+ const item = node[i];
1109
+ const itemNonObj = item !== null && typeof item !== "object";
1110
+ if (!top && prevNonObj && itemNonObj) result.t[result.t.length - 1] += `<!--!$-->`;
1111
+ prevNonObj = itemNonObj;
1112
+ resolveSSRNode(item, result);
890
1113
  }
891
1114
  } else if (t === "object") {
892
1115
  if (node.h) {
@@ -901,10 +1124,10 @@ function resolveSSRNode(node, result = {
901
1124
  try {
902
1125
  resolveSSRNode(node(), result);
903
1126
  } catch (err) {
904
- const p = solidJs.ssrHandleError(err);
905
- if (p) {
906
- result.h.push(node);
907
- result.p.push(p);
1127
+ const wrap = buildAsyncWrap(err, node);
1128
+ if (wrap) {
1129
+ result.h.push(wrap.fn);
1130
+ result.p.push(wrap.p);
908
1131
  result.t.push("");
909
1132
  }
910
1133
  }
@@ -1001,10 +1224,6 @@ Object.defineProperty(exports, "getOwner", {
1001
1224
  enumerable: true,
1002
1225
  get: function () { return solidJs.getOwner; }
1003
1226
  });
1004
- Object.defineProperty(exports, "ssrRunInScope", {
1005
- enumerable: true,
1006
- get: function () { return solidJs.ssrRunInScope; }
1007
- });
1008
1227
  Object.defineProperty(exports, "untrack", {
1009
1228
  enumerable: true,
1010
1229
  get: function () { return solidJs.untrack; }
@@ -1056,6 +1275,7 @@ exports.ssr = ssr;
1056
1275
  exports.ssrAttribute = ssrAttribute;
1057
1276
  exports.ssrClassName = ssrClassName;
1058
1277
  exports.ssrElement = ssrElement;
1278
+ exports.ssrGroup = ssrGroup;
1059
1279
  exports.ssrHydrationKey = ssrHydrationKey;
1060
1280
  exports.ssrStyle = ssrStyle;
1061
1281
  exports.ssrStyleProperty = ssrStyleProperty;
package/dist/server.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createRenderEffect, createMemo, sharedConfig, createRoot, ssrHandleError, createComponent, omit, getOwner, getNextChildId, createOwner, runWithOwner } from 'solid-js';
2
- export { Errored, For, Hydration, Loading, Match, NoHydration, Repeat, Reveal, Show, Switch, createComponent, getOwner, ssrRunInScope, untrack } from 'solid-js';
1
+ import { createRenderEffect, createMemo, sharedConfig, createRoot, ssrHandleError, getOwner, runWithOwner, createComponent, omit, getNextChildId, createOwner } from 'solid-js';
2
+ export { Errored, For, Hydration, Loading, Match, NoHydration, Repeat, Reveal, Show, Switch, createComponent, getOwner, untrack } from 'solid-js';
3
3
  import { Serializer, Feature, getCrossReferenceHeader } from 'seroval';
4
4
  import { AbortSignalPlugin, CustomEventPlugin, DOMExceptionPlugin, EventPlugin, FormDataPlugin, HeadersPlugin, ReadableStreamPlugin, RequestPlugin, ResponsePlugin, URLSearchParamsPlugin, URLPlugin } from 'seroval-plugins/web';
5
5
 
@@ -24,13 +24,18 @@ const DOMElements = /*#__PURE__*/new Set(["html", "base", "head", "link", "meta"
24
24
  "isindex", "listing", "multicol", "nextid", "noindex", "search"]);
25
25
 
26
26
  const transparentOptions = {
27
- transparent: true
27
+ transparent: true,
28
+ sync: true
29
+ };
30
+ const syncOptions = {
31
+ sync: true
28
32
  };
29
33
  const effect = (fn, effectFn, options) => createRenderEffect(fn, effectFn, options ? {
30
34
  transparent: true,
35
+ sync: true,
31
36
  ...options
32
37
  } : transparentOptions);
33
- const memo = fn => createMemo(() => fn());
38
+ const memo = fn => createMemo(() => fn(), syncOptions);
34
39
 
35
40
  const ES2017FLAG = Feature.AggregateError |
36
41
  Feature.BigIntTypedArray;
@@ -591,11 +596,176 @@ function HydrationScript(props) {
591
596
  ...props
592
597
  }));
593
598
  }
594
- function ssr(t, ...nodes) {
595
- if (nodes.length) return resolveSSR(t, nodes);
599
+ function ssrGroup(fn, n) {
600
+ fn.$g = n;
601
+ return fn;
602
+ }
603
+ function buildAsyncWrap(err, node) {
604
+ const p = ssrHandleError(err);
605
+ if (!p) return null;
606
+ const owner = getOwner();
596
607
  return {
608
+ fn: owner ? () => runWithOwner(owner, node) : node,
609
+ p
610
+ };
611
+ }
612
+ function ssrFirstGroupHit(hole) {
613
+ try {
614
+ return hole();
615
+ } catch (err) {
616
+ return buildAsyncWrap(err, hole);
617
+ }
618
+ }
619
+ function tryResolveFunctionHole(hole) {
620
+ let value;
621
+ try {
622
+ value = hole();
623
+ } catch (err) {
624
+ return buildAsyncWrap(err, hole) || "";
625
+ }
626
+ const t = typeof value;
627
+ if (t === "string") return value;
628
+ if (t === "number") return "" + value;
629
+ if (value == null || t === "boolean") return "";
630
+ return tryResolveString(value);
631
+ }
632
+ function mergeTemplateInto(result, node) {
633
+ result.t[result.t.length - 1] += node.t[0];
634
+ if (node.t.length > 1) {
635
+ result.t.push(...node.t.slice(1));
636
+ result.h.push(...node.h);
637
+ result.p.push(...node.p);
638
+ }
639
+ }
640
+ function appendResolvedNode(result, node) {
641
+ if (node.fn !== undefined) {
642
+ result.h.push(node.fn);
643
+ result.p.push(node.p);
644
+ result.t.push("");
645
+ } else if (node.merge !== undefined) mergeTemplateInto(result, node.merge);else resolveSSRNode(node.bail, result);
646
+ }
647
+ let _lastGroupFn = null;
648
+ let _lastGroupArr = null;
649
+ let _lastGroupErr = null;
650
+ function ssrGroupSlot(fn, idx) {
651
+ return () => {
652
+ if (idx > 0 && _lastGroupFn === fn) {
653
+ if (_lastGroupArr !== null) return _lastGroupArr[idx];
654
+ throw _lastGroupErr;
655
+ }
656
+ _lastGroupFn = fn;
657
+ _lastGroupArr = null;
658
+ _lastGroupErr = null;
659
+ try {
660
+ _lastGroupArr = fn();
661
+ return _lastGroupArr[idx];
662
+ } catch (err) {
663
+ _lastGroupErr = err;
664
+ throw err;
665
+ }
666
+ };
667
+ }
668
+ function ssr(t) {
669
+ const len = arguments.length;
670
+ if (len === 1) return {
597
671
  t
598
672
  };
673
+ let s = t[0];
674
+ let result = null;
675
+ let lastGroup = null;
676
+ let lastGroupVal = null;
677
+ let lastGroupIdx = 0;
678
+ for (let i = 1; i < len; i++) {
679
+ const hole = arguments[i];
680
+ const ht = typeof hole;
681
+ if (ht === "string") {
682
+ if (result === null) s += hole;else result.t[result.t.length - 1] += hole;
683
+ } else if (ht === "number") {
684
+ if (result === null) s += hole;else result.t[result.t.length - 1] += hole;
685
+ } else if (hole == null || ht === "boolean") ; else if (ht === "function" && hole.$g) {
686
+ let value;
687
+ let hasValue = false;
688
+ if (lastGroup !== hole) {
689
+ const r = ssrFirstGroupHit(hole);
690
+ if (r !== null) {
691
+ lastGroup = hole;
692
+ lastGroupVal = r;
693
+ lastGroupIdx = 0;
694
+ if (!Array.isArray(r) && result === null) {
695
+ result = {
696
+ t: [s],
697
+ h: [],
698
+ p: []
699
+ };
700
+ s = "";
701
+ }
702
+ }
703
+ }
704
+ if (lastGroup === hole) {
705
+ if (Array.isArray(lastGroupVal)) {
706
+ value = lastGroupVal[lastGroupIdx++];
707
+ hasValue = true;
708
+ } else {
709
+ result.h.push(ssrGroupSlot(lastGroupVal.fn, lastGroupIdx++));
710
+ result.p.push(lastGroupVal.p);
711
+ result.t.push("");
712
+ }
713
+ }
714
+ if (hasValue) {
715
+ const vt = typeof value;
716
+ if (vt === "string" || vt === "number") {
717
+ if (result === null) s += value;else result.t[result.t.length - 1] += value;
718
+ } else if (value == null || vt === "boolean") ; else if (result !== null) {
719
+ resolveSSRNode(value, result);
720
+ } else {
721
+ const rs = tryResolveString(value);
722
+ if (typeof rs === "string") {
723
+ s += rs;
724
+ } else {
725
+ result = {
726
+ t: [s],
727
+ h: [],
728
+ p: []
729
+ };
730
+ s = "";
731
+ if (rs.merge !== undefined) mergeTemplateInto(result, rs.merge);else resolveSSRNode(rs.bail, result);
732
+ }
733
+ }
734
+ }
735
+ } else if (result !== null) {
736
+ resolveSSRNode(hole, result);
737
+ } else if (ht === "function") {
738
+ const r = tryResolveFunctionHole(hole);
739
+ if (typeof r === "string") s += r;else {
740
+ result = {
741
+ t: [s],
742
+ h: [],
743
+ p: []
744
+ };
745
+ s = "";
746
+ appendResolvedNode(result, r);
747
+ }
748
+ } else {
749
+ const r = tryResolveString(hole);
750
+ if (typeof r === "string") {
751
+ s += r;
752
+ } else {
753
+ result = {
754
+ t: [s],
755
+ h: [],
756
+ p: []
757
+ };
758
+ s = "";
759
+ appendResolvedNode(result, r);
760
+ }
761
+ }
762
+ const next = t[i];
763
+ if (result === null) s += next;else result.t[result.t.length - 1] += next;
764
+ }
765
+ if (result === null) return {
766
+ t: s
767
+ };
768
+ return result;
599
769
  }
600
770
  function ssrClassName(value) {
601
771
  if (!value) return "";
@@ -676,6 +846,8 @@ function escape(s, attr) {
676
846
  const t = typeof s;
677
847
  if (t !== "string") {
678
848
  if (!attr && Array.isArray(s)) {
849
+ const joined = tryJoinPlainSSRArray(s);
850
+ if (joined !== undefined) return joined;
679
851
  s = s.slice();
680
852
  for (let i = 0; i < s.length; i++) s[i] = escape(s[i]);
681
853
  return s;
@@ -683,11 +855,21 @@ function escape(s, attr) {
683
855
  if (attr && t === "boolean") return s;
684
856
  return s;
685
857
  }
858
+ const delimCode = attr ? 34 : 60;
859
+ const len = s.length;
860
+ for (let i = 0; i < len; i++) {
861
+ const c = s.charCodeAt(i);
862
+ if (c === 38 || c === delimCode) return escapeSlow(s, attr, i);
863
+ }
864
+ return s;
865
+ }
866
+ function escapeSlow(s, attr, start) {
686
867
  const delim = attr ? '"' : "<";
868
+ const delimCode = attr ? 34 : 60;
687
869
  const escDelim = attr ? "&quot;" : "&lt;";
688
- let iDelim = s.indexOf(delim);
689
- let iAmp = s.indexOf("&");
690
- if (iDelim < 0 && iAmp < 0) return s;
870
+ const c0 = s.charCodeAt(start);
871
+ let iDelim = c0 === delimCode ? start : s.indexOf(delim, start);
872
+ let iAmp = c0 === 38 ? start : s.indexOf("&", start);
691
873
  let left = 0,
692
874
  out = "";
693
875
  while (iDelim >= 0 && iAmp >= 0) {
@@ -718,6 +900,18 @@ function escape(s, attr) {
718
900
  }
719
901
  return left < s.length ? out + s.substring(left) : out;
720
902
  }
903
+ function tryJoinPlainSSRArray(nodes) {
904
+ if (nodes.length === 0) return undefined;
905
+ let out = "";
906
+ for (let i = 0, len = nodes.length; i < len; i++) {
907
+ const node = nodes[i];
908
+ if (node == null || typeof node !== "object" || node.h || typeof node.t !== "string") {
909
+ return undefined;
910
+ }
911
+ out += node.t;
912
+ }
913
+ return out;
914
+ }
721
915
  function mergeProps(...sources) {
722
916
  const target = {};
723
917
  for (let i = 0; i < sources.length; i++) {
@@ -859,19 +1053,45 @@ function flattenClassList(list, result) {
859
1053
  if (Array.isArray(item)) flattenClassList(item, result);else if (typeof item === "object" && item != null) Object.assign(result, item);else if (item || item === 0) result[item] = true;
860
1054
  }
861
1055
  }
862
- function resolveSSR(template, holes, result = {
863
- t: [""],
864
- h: [],
865
- p: []
866
- }) {
867
- for (let i = 0; i < holes.length; i++) {
868
- const hole = holes[i];
869
- result.t[result.t.length - 1] += template[i];
870
- if (hole == null || hole === true || hole === false) continue;
871
- resolveSSRNode(hole, result);
1056
+ function tryResolveString(node) {
1057
+ const t = typeof node;
1058
+ if (t === "string") return node;
1059
+ if (t === "number") return "" + node;
1060
+ if (node == null || t === "boolean") return "";
1061
+ if (t === "object") {
1062
+ if (Array.isArray(node)) {
1063
+ const joined = tryJoinPlainSSRArray(node);
1064
+ if (joined !== undefined) return joined;
1065
+ let s = "";
1066
+ let prevNonObj = false;
1067
+ for (let i = 0, len = node.length; i < len; i++) {
1068
+ const item = node[i];
1069
+ const itemNonObj = item !== null && typeof item !== "object";
1070
+ if (prevNonObj && itemNonObj) s += "<!--!$-->";
1071
+ prevNonObj = itemNonObj;
1072
+ const r = tryResolveString(item);
1073
+ if (typeof r !== "string") return {
1074
+ bail: node
1075
+ };
1076
+ s += r;
1077
+ }
1078
+ return s;
1079
+ }
1080
+ if (node.h && node.h.length > 0) return {
1081
+ merge: node
1082
+ };
1083
+ return Array.isArray(node.t) ? node.t[0] : node.t;
872
1084
  }
873
- result.t[result.t.length - 1] += template[template.length - 1];
874
- return result;
1085
+ if (t === "function") {
1086
+ let v;
1087
+ try {
1088
+ v = node();
1089
+ } catch (err) {
1090
+ return buildAsyncWrap(err, node) || "";
1091
+ }
1092
+ return tryResolveString(v);
1093
+ }
1094
+ return "";
875
1095
  }
876
1096
  function resolveSSRNode(node, result = {
877
1097
  t: [""],
@@ -882,10 +1102,13 @@ function resolveSSRNode(node, result = {
882
1102
  if (t === "string" || t === "number") {
883
1103
  result.t[result.t.length - 1] += node;
884
1104
  } else if (node == null || t === "boolean") ; else if (Array.isArray(node)) {
885
- let prev = {};
1105
+ let prevNonObj = false;
886
1106
  for (let i = 0, len = node.length; i < len; i++) {
887
- if (!top && typeof prev !== "object" && typeof node[i] !== "object") result.t[result.t.length - 1] += `<!--!$-->`;
888
- resolveSSRNode(prev = node[i], result);
1107
+ const item = node[i];
1108
+ const itemNonObj = item !== null && typeof item !== "object";
1109
+ if (!top && prevNonObj && itemNonObj) result.t[result.t.length - 1] += `<!--!$-->`;
1110
+ prevNonObj = itemNonObj;
1111
+ resolveSSRNode(item, result);
889
1112
  }
890
1113
  } else if (t === "object") {
891
1114
  if (node.h) {
@@ -900,10 +1123,10 @@ function resolveSSRNode(node, result = {
900
1123
  try {
901
1124
  resolveSSRNode(node(), result);
902
1125
  } catch (err) {
903
- const p = ssrHandleError(err);
904
- if (p) {
905
- result.h.push(node);
906
- result.p.push(p);
1126
+ const wrap = buildAsyncWrap(err, node);
1127
+ if (wrap) {
1128
+ result.h.push(wrap.fn);
1129
+ result.p.push(wrap.p);
907
1130
  result.t.push("");
908
1131
  }
909
1132
  }
@@ -952,4 +1175,4 @@ function Portal(props) {
952
1175
  throw new Error("Portal is not supported on the server");
953
1176
  }
954
1177
 
955
- export { ChildProperties, DOMElements, DelegatedEvents, Dynamic, HydrationScript, MathMLElements, Namespaces, Portal, RawTextElements, RequestContext, SVGElements, VoidElements, notSup as addEventListener, applyRef, notSup as assign, notSup as className, notSup as delegateEvents, dynamic, notSup as dynamicProperty, effect, escape, generateHydrationScript, getAssets, getHydrationKey, notSup as getNextElement, notSup as getNextMarker, notSup as getNextMatch, getRequestEvent, notSup as hydrate, notSup as insert, isDev, isServer, memo, mergeProps, notSup as render, renderToStream, renderToString, renderToStringAsync, notSup as runHydrationEvents, notSup as setAttribute, notSup as setAttributeNS, notSup as setProperty, notSup as spread, ssr, ssrAttribute, ssrClassName, ssrElement, ssrHydrationKey, ssrStyle, ssrStyleProperty, notSup as style, notSup as template, useAssets };
1178
+ export { ChildProperties, DOMElements, DelegatedEvents, Dynamic, HydrationScript, MathMLElements, Namespaces, Portal, RawTextElements, RequestContext, SVGElements, VoidElements, notSup as addEventListener, applyRef, notSup as assign, notSup as className, notSup as delegateEvents, dynamic, notSup as dynamicProperty, effect, escape, generateHydrationScript, getAssets, getHydrationKey, notSup as getNextElement, notSup as getNextMarker, notSup as getNextMatch, getRequestEvent, notSup as hydrate, notSup as insert, isDev, isServer, memo, mergeProps, notSup as render, renderToStream, renderToString, renderToStringAsync, notSup as runHydrationEvents, notSup as setAttribute, notSup as setAttributeNS, notSup as setProperty, notSup as spread, ssr, ssrAttribute, ssrClassName, ssrElement, ssrGroup, ssrHydrationKey, ssrStyle, ssrStyleProperty, notSup as style, notSup as template, useAssets };
package/dist/web.cjs CHANGED
@@ -51,13 +51,18 @@ const DOMElements = /*#__PURE__*/new Set(["html", "base", "head", "link", "meta"
51
51
  "isindex", "listing", "multicol", "nextid", "noindex", "search"]);
52
52
 
53
53
  const transparentOptions = {
54
- transparent: true
54
+ transparent: true,
55
+ sync: true
56
+ };
57
+ const syncOptions = {
58
+ sync: true
55
59
  };
56
60
  const effect = (fn, effectFn, options) => solidJs.createRenderEffect(fn, effectFn, options ? {
57
61
  transparent: true,
62
+ sync: true,
58
63
  ...options
59
64
  } : transparentOptions);
60
- const memo = fn => solidJs.createMemo(() => fn());
65
+ const memo = fn => solidJs.createMemo(() => fn(), syncOptions);
61
66
 
62
67
  function reconcileArrays(parentNode, a, b) {
63
68
  let bLength = b.length,
@@ -86,10 +91,12 @@ function reconcileArrays(parentNode, a, b) {
86
91
  aStart++;
87
92
  }
88
93
  } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
89
- const node = a[--aEnd].nextSibling;
90
- parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling);
91
- parentNode.insertBefore(b[--bEnd], node);
92
- a[aEnd] = b[bEnd];
94
+ const anchor = a[aStart];
95
+ do {
96
+ parentNode.insertBefore(a[--aEnd], anchor);
97
+ bStart++;
98
+ if (aStart >= aEnd - 1 || bStart >= bEnd) break;
99
+ } while (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]);
93
100
  } else {
94
101
  if (!map) {
95
102
  map = new Map();
@@ -197,13 +204,13 @@ function className(node, value, prev) {
197
204
  for (i = 0, len = prevKeys.length; i < len; i++) {
198
205
  const key = prevKeys[i];
199
206
  if (!key || key === "undefined" || value[key]) continue;
200
- toggleClassKey(node, key, false);
207
+ node.classList.remove(key);
201
208
  }
202
209
  for (i = 0, len = classKeys.length; i < len; i++) {
203
210
  const key = classKeys[i],
204
211
  classValue = !!value[key];
205
212
  if (!key || key === "undefined" || prev[key] === classValue || !classValue) continue;
206
- toggleClassKey(node, key, true);
213
+ node.classList.add(key);
207
214
  }
208
215
  }
209
216
  function addEventListener(node, name, handler, delegate) {
@@ -295,13 +302,16 @@ function insert(parent, accessor, marker, initial, options) {
295
302
  initial = [placeholder];
296
303
  }
297
304
  let current = initial;
298
- effect(() => {
305
+ effect(prev => {
299
306
  const value = normalize(accessor(), current, multi, true);
300
307
  if (typeof value !== "function") return value;
301
308
  effect(() => normalize(value, current, multi), inner => {
302
309
  insertExpression(parent, inner, current, marker);
303
310
  current = inner;
304
- }, options);
311
+ }, prev !== undefined && !(options && options.schedule) ? {
312
+ ...options,
313
+ schedule: true
314
+ } : options);
305
315
  return INNER_OWNED;
306
316
  }, value => {
307
317
  if (value === INNER_OWNED) return;
@@ -470,14 +480,21 @@ function isHydrating(node) {
470
480
  function getChildRoot(node) {
471
481
  return node && node.localName === "template" ? node.content : node;
472
482
  }
473
- function toggleClassKey(node, key, value) {
474
- const classNames = key.trim().split(/\s+/);
475
- for (let i = 0, nameLen = classNames.length; i < nameLen; i++) node.classList.toggle(classNames[i], value);
476
- }
477
483
  function classListToObject(classList) {
478
484
  if (Array.isArray(classList)) {
479
485
  const result = {};
480
486
  flattenClassList(classList, result);
487
+ classList = result;
488
+ }
489
+ if (classList && typeof classList === "object") {
490
+ const result = {},
491
+ keys = Object.keys(classList);
492
+ for (let i = 0, len = keys.length; i < len; i++) {
493
+ const key = keys[i];
494
+ if (!classList[key]) continue;
495
+ const classNames = key.trim().split(/\s+/);
496
+ for (let j = 0, nameLen = classNames.length; j < nameLen; j++) classNames[j] && (result[classNames[j]] = true);
497
+ }
481
498
  return result;
482
499
  }
483
500
  return classList;
package/dist/web.js CHANGED
@@ -50,13 +50,18 @@ const DOMElements = /*#__PURE__*/new Set(["html", "base", "head", "link", "meta"
50
50
  "isindex", "listing", "multicol", "nextid", "noindex", "search"]);
51
51
 
52
52
  const transparentOptions = {
53
- transparent: true
53
+ transparent: true,
54
+ sync: true
55
+ };
56
+ const syncOptions = {
57
+ sync: true
54
58
  };
55
59
  const effect = (fn, effectFn, options) => createRenderEffect(fn, effectFn, options ? {
56
60
  transparent: true,
61
+ sync: true,
57
62
  ...options
58
63
  } : transparentOptions);
59
- const memo = fn => createMemo(() => fn());
64
+ const memo = fn => createMemo(() => fn(), syncOptions);
60
65
 
61
66
  function reconcileArrays(parentNode, a, b) {
62
67
  let bLength = b.length,
@@ -85,10 +90,12 @@ function reconcileArrays(parentNode, a, b) {
85
90
  aStart++;
86
91
  }
87
92
  } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
88
- const node = a[--aEnd].nextSibling;
89
- parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling);
90
- parentNode.insertBefore(b[--bEnd], node);
91
- a[aEnd] = b[bEnd];
93
+ const anchor = a[aStart];
94
+ do {
95
+ parentNode.insertBefore(a[--aEnd], anchor);
96
+ bStart++;
97
+ if (aStart >= aEnd - 1 || bStart >= bEnd) break;
98
+ } while (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]);
92
99
  } else {
93
100
  if (!map) {
94
101
  map = new Map();
@@ -196,13 +203,13 @@ function className(node, value, prev) {
196
203
  for (i = 0, len = prevKeys.length; i < len; i++) {
197
204
  const key = prevKeys[i];
198
205
  if (!key || key === "undefined" || value[key]) continue;
199
- toggleClassKey(node, key, false);
206
+ node.classList.remove(key);
200
207
  }
201
208
  for (i = 0, len = classKeys.length; i < len; i++) {
202
209
  const key = classKeys[i],
203
210
  classValue = !!value[key];
204
211
  if (!key || key === "undefined" || prev[key] === classValue || !classValue) continue;
205
- toggleClassKey(node, key, true);
212
+ node.classList.add(key);
206
213
  }
207
214
  }
208
215
  function addEventListener(node, name, handler, delegate) {
@@ -294,13 +301,16 @@ function insert(parent, accessor, marker, initial, options) {
294
301
  initial = [placeholder];
295
302
  }
296
303
  let current = initial;
297
- effect(() => {
304
+ effect(prev => {
298
305
  const value = normalize(accessor(), current, multi, true);
299
306
  if (typeof value !== "function") return value;
300
307
  effect(() => normalize(value, current, multi), inner => {
301
308
  insertExpression(parent, inner, current, marker);
302
309
  current = inner;
303
- }, options);
310
+ }, prev !== undefined && !(options && options.schedule) ? {
311
+ ...options,
312
+ schedule: true
313
+ } : options);
304
314
  return INNER_OWNED;
305
315
  }, value => {
306
316
  if (value === INNER_OWNED) return;
@@ -469,14 +479,21 @@ function isHydrating(node) {
469
479
  function getChildRoot(node) {
470
480
  return node && node.localName === "template" ? node.content : node;
471
481
  }
472
- function toggleClassKey(node, key, value) {
473
- const classNames = key.trim().split(/\s+/);
474
- for (let i = 0, nameLen = classNames.length; i < nameLen; i++) node.classList.toggle(classNames[i], value);
475
- }
476
482
  function classListToObject(classList) {
477
483
  if (Array.isArray(classList)) {
478
484
  const result = {};
479
485
  flattenClassList(classList, result);
486
+ classList = result;
487
+ }
488
+ if (classList && typeof classList === "object") {
489
+ const result = {},
490
+ keys = Object.keys(classList);
491
+ for (let i = 0, len = keys.length; i < len; i++) {
492
+ const key = keys[i];
493
+ if (!classList[key]) continue;
494
+ const classNames = key.trim().split(/\s+/);
495
+ for (let j = 0, nameLen = classNames.length; j < nameLen; j++) classNames[j] && (result[classNames[j]] = true);
496
+ }
480
497
  return result;
481
498
  }
482
499
  return classList;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@solidjs/web",
3
3
  "description": "Solid's web runtime: client rendering, hydration, SSR, and DOM-specific control flow (Portal, Dynamic).",
4
- "version": "2.0.0-beta.10",
4
+ "version": "2.0.0-beta.12",
5
5
  "author": "Ryan Carniato",
6
6
  "license": "MIT",
7
7
  "homepage": "https://solidjs.com",
@@ -137,10 +137,10 @@
137
137
  "seroval-plugins": "^1.1.0"
138
138
  },
139
139
  "peerDependencies": {
140
- "solid-js": "^2.0.0-beta.10"
140
+ "solid-js": "^2.0.0-beta.12"
141
141
  },
142
142
  "devDependencies": {
143
- "solid-js": "2.0.0-beta.10"
143
+ "solid-js": "2.0.0-beta.12"
144
144
  },
145
145
  "scripts": {
146
146
  "build": "npm-run-all -nl build:clean types:copy-jsx build:js",
@@ -157,6 +157,8 @@
157
157
  "test": "vitest run && vitest run --config vite.config.server.mjs && vitest run --config vite.config.hydrate.mjs",
158
158
  "test:server": "vitest run --config vite.config.server.mjs",
159
159
  "coverage": "vitest run --coverage",
160
+ "bench": "vitest bench --run",
161
+ "bench:server": "vitest bench --run --config vite.config.server-bench.mjs",
160
162
  "test-types": "npm-run-all -nl types test-types:tsc",
161
163
  "test-types:tsc": "tsc --project tsconfig.test.json"
162
164
  }
package/types/core.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { getOwner, runWithOwner, createComponent, createRoot as root, sharedConfig, untrack, merge as mergeProps, flatten, ssrHandleError, ssrRunInScope } from "solid-js";
1
+ export { getOwner, runWithOwner, createComponent, createRoot as root, sharedConfig, untrack, merge as mergeProps, flatten, ssrHandleError } from "solid-js";
2
2
  export declare const effect: (fn: any, effectFn: any, options: any) => void;
3
- export declare const memo: (fn: any) => import("solid-js").Accessor<any>;
3
+ export declare const memo: (fn: any) => import("solid-js").SourceAccessor<any>;
package/types/server.d.ts CHANGED
@@ -73,6 +73,7 @@ export function ssrClassName(value: string | { [k: string]: boolean } | Array<an
73
73
  export function ssrStyle(value: string | { [k: string]: string }): string;
74
74
  export function ssrStyleProperty(name: string, value: any): string;
75
75
  export function ssrAttribute(key: string, value: any): string;
76
+ export function ssrGroup<T extends () => any[]>(fn: T, n: number): T;
76
77
  export function ssrHydrationKey(): string;
77
78
  export function resolveSSRNode(node: any, result?: any, top?: boolean): any;
78
79
  export function escape(s: any, attr?: boolean): any;
@@ -88,7 +89,6 @@ export function memo<T>(fn: () => T, equal: boolean): () => T;
88
89
  export function createComponent<T>(Comp: (props: T) => JSX.Element, props: T): JSX.Element;
89
90
  export function mergeProps(...sources: unknown[]): unknown;
90
91
  export function getOwner(): unknown;
91
- export function ssrRunInScope(fn: () => void, owner: unknown): void;
92
92
  export function generateHydrationScript(options?: {
93
93
  nonce?: string;
94
94
  eventNames?: string[];
@@ -1,3 +1,3 @@
1
- export { getOwner, runWithOwner, createComponent, createRoot as root, sharedConfig, untrack, merge as mergeProps, flatten, ssrHandleError, ssrRunInScope } from "solid-js";
1
+ export { getOwner, runWithOwner, createComponent, createRoot as root, sharedConfig, untrack, merge as mergeProps, flatten, ssrHandleError } from "solid-js";
2
2
  export declare const effect: (fn: any, effectFn: any, options: any) => void;
3
- export declare const memo: (fn: any) => import("solid-js").Accessor<any>;
3
+ export declare const memo: (fn: any) => import("solid-js").SourceAccessor<any>;
@@ -73,6 +73,7 @@ export function ssrClassName(value: string | { [k: string]: boolean } | Array<an
73
73
  export function ssrStyle(value: string | { [k: string]: string }): string;
74
74
  export function ssrStyleProperty(name: string, value: any): string;
75
75
  export function ssrAttribute(key: string, value: any): string;
76
+ export function ssrGroup<T extends () => any[]>(fn: T, n: number): T;
76
77
  export function ssrHydrationKey(): string;
77
78
  export function resolveSSRNode(node: any, result?: any, top?: boolean): any;
78
79
  export function escape(s: any, attr?: boolean): any;
@@ -88,7 +89,6 @@ export function memo<T>(fn: () => T, equal: boolean): () => T;
88
89
  export function createComponent<T>(Comp: (props: T) => JSX.Element, props: T): JSX.Element;
89
90
  export function mergeProps(...sources: unknown[]): unknown;
90
91
  export function getOwner(): unknown;
91
- export function ssrRunInScope(fn: () => void, owner: unknown): void;
92
92
  export function generateHydrationScript(options?: {
93
93
  nonce?: string;
94
94
  eventNames?: string[];