solid-js 1.7.12 → 1.8.0-beta.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 (47) hide show
  1. package/dist/dev.cjs +14 -11
  2. package/dist/dev.js +544 -306
  3. package/dist/server.cjs +4 -4
  4. package/dist/server.js +172 -78
  5. package/dist/solid.cjs +14 -11
  6. package/dist/solid.js +471 -264
  7. package/h/dist/h.js +34 -8
  8. package/h/jsx-runtime/dist/jsx.js +1 -1
  9. package/h/jsx-runtime/types/index.d.ts +11 -8
  10. package/h/types/hyperscript.d.ts +11 -11
  11. package/html/dist/html.js +216 -94
  12. package/html/types/lit.d.ts +45 -31
  13. package/package.json +2 -2
  14. package/store/dist/dev.js +114 -42
  15. package/store/dist/server.js +19 -8
  16. package/store/dist/store.js +105 -39
  17. package/store/types/index.d.ts +21 -7
  18. package/store/types/modifiers.d.ts +6 -3
  19. package/store/types/mutable.d.ts +5 -2
  20. package/store/types/server.d.ts +12 -4
  21. package/store/types/store.d.ts +218 -61
  22. package/types/index.d.ts +72 -9
  23. package/types/reactive/array.d.ts +12 -4
  24. package/types/reactive/observable.d.ts +25 -17
  25. package/types/reactive/scheduler.d.ts +9 -6
  26. package/types/reactive/signal.d.ts +228 -140
  27. package/types/render/Suspense.d.ts +5 -5
  28. package/types/render/component.d.ts +62 -31
  29. package/types/render/flow.d.ts +43 -31
  30. package/types/render/hydration.d.ts +13 -12
  31. package/types/server/index.d.ts +56 -2
  32. package/types/server/reactive.d.ts +67 -40
  33. package/types/server/rendering.d.ts +166 -95
  34. package/universal/dist/dev.js +28 -12
  35. package/universal/dist/universal.js +28 -12
  36. package/universal/types/index.d.ts +3 -1
  37. package/universal/types/universal.d.ts +0 -1
  38. package/web/dist/dev.cjs +8 -5
  39. package/web/dist/dev.js +616 -82
  40. package/web/dist/server.cjs +93 -59
  41. package/web/dist/server.js +246 -128
  42. package/web/dist/web.cjs +8 -5
  43. package/web/dist/web.js +616 -82
  44. package/web/types/client.d.ts +2 -2
  45. package/web/types/core.d.ts +10 -1
  46. package/web/types/index.d.ts +27 -10
  47. package/web/types/server-mock.d.ts +47 -32
@@ -14,27 +14,52 @@ const Aliases = /*#__PURE__*/Object.assign(Object.create(null), {
14
14
  const ES2017FLAG = seroval.Feature.AggregateError
15
15
  | seroval.Feature.BigInt
16
16
  | seroval.Feature.BigIntTypedArray;
17
- function stringify(data) {
18
- return seroval.serialize(data, {
19
- disabledFeatures: ES2017FLAG
17
+ const GLOBAL_IDENTIFIER = '_$HY.r';
18
+ function createSerializer({
19
+ onData,
20
+ onDone,
21
+ scopeId
22
+ }) {
23
+ return new seroval.Serializer({
24
+ scopeId,
25
+ globalIdentifier: GLOBAL_IDENTIFIER,
26
+ disabledFeatures: ES2017FLAG,
27
+ onData,
28
+ onDone
20
29
  });
21
30
  }
31
+ function getGlobalHeaderScript() {
32
+ return seroval.GLOBAL_CONTEXT_API_SCRIPT;
33
+ }
34
+ function getLocalHeaderScript(id) {
35
+ return seroval.getCrossReferenceHeader(id);
36
+ }
22
37
 
23
38
  const VOID_ELEMENTS = /^(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)$/i;
24
- const REPLACE_SCRIPT = `function $df(e,n,t,o,d){if(t=document.getElementById(e),o=document.getElementById("pl-"+e)){for(;o&&8!==o.nodeType&&o.nodeValue!=="pl-"+e;)d=o.nextSibling,o.remove(),o=d;_$HY.done?o.remove():o.replaceWith(t.content)}t.remove(),_$HY.set(e,n),_$HY.fe(e)}`;
39
+ const REPLACE_SCRIPT = `function $df(e,n,o,t){if(n=document.getElementById(e),o=document.getElementById("pl-"+e)){for(;o&&8!==o.nodeType&&o.nodeValue!=="pl-"+e;)t=o.nextSibling,o.remove(),o=t;_$HY.done?o.remove():o.replaceWith(n.content)}n.remove(),_$HY.fe(e)}`;
25
40
  function renderToString(code, options = {}) {
41
+ const {
42
+ renderId
43
+ } = options;
26
44
  let scripts = "";
45
+ const serializer = createSerializer({
46
+ scopeId: renderId,
47
+ onData(script) {
48
+ if (!scripts) {
49
+ scripts = getLocalHeaderScript(renderId);
50
+ }
51
+ scripts += script;
52
+ }
53
+ });
27
54
  solidJs.sharedConfig.context = {
28
- id: options.renderId || "",
55
+ id: renderId || "",
29
56
  count: 0,
30
57
  suspense: {},
31
58
  lazy: {},
32
59
  assets: [],
33
60
  nonce: options.nonce,
34
- writeResource(id, p, error) {
35
- if (solidJs.sharedConfig.context.noHydrate) return;
36
- if (error) return scripts += `_$HY.set("${id}", ${stringify(p)});`;
37
- scripts += `_$HY.set("${id}", ${stringify(p)});`;
61
+ serialize(id, p) {
62
+ !solidJs.sharedConfig.context.noHydrate && serializer.write(id, p);
38
63
  }
39
64
  };
40
65
  let html = solidJs.createRoot(d => {
@@ -42,6 +67,7 @@ function renderToString(code, options = {}) {
42
67
  return resolveSSRNode(escape(code()));
43
68
  });
44
69
  solidJs.sharedConfig.context.noHydrate = true;
70
+ serializer.close();
45
71
  html = injectAssets(solidJs.sharedConfig.context.assets, html);
46
72
  if (scripts.length) html = injectScripts(html, scripts, options.nonce);
47
73
  return html;
@@ -67,9 +93,16 @@ function renderToStream(code, options = {}) {
67
93
  renderId
68
94
  } = options;
69
95
  let dispose;
70
- const blockingResources = [];
71
- const registry = new Map();
72
- const dedupe = new WeakMap();
96
+ const blockingPromises = [];
97
+ const pushTask = task => {
98
+ if (!tasks && !firstFlushed) {
99
+ tasks = getLocalHeaderScript(renderId);
100
+ }
101
+ tasks += task + ";";
102
+ if (!timer && firstFlushed) {
103
+ timer = setTimeout(writeTasks);
104
+ }
105
+ };
73
106
  const checkEnd = () => {
74
107
  if (!registry.size && !completed) {
75
108
  writeTasks();
@@ -83,19 +116,24 @@ function renderToStream(code, options = {}) {
83
116
  setTimeout(dispose);
84
117
  }
85
118
  };
86
- const pushTask = task => {
87
- tasks += task + ";";
88
- if (!scheduled && firstFlushed) {
89
- Promise.resolve().then(writeTasks);
90
- scheduled = true;
119
+ const serializer = createSerializer({
120
+ scopeId: options.renderId,
121
+ onData: pushTask,
122
+ onDone: checkEnd
123
+ });
124
+ const flushEnd = () => {
125
+ if (!registry.size) {
126
+ serializer.flush();
91
127
  }
92
128
  };
129
+ const registry = new Map();
93
130
  const writeTasks = () => {
94
131
  if (tasks.length && !completed && firstFlushed) {
95
132
  buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${tasks}</script>`);
96
133
  tasks = "";
97
134
  }
98
- scheduled = false;
135
+ timer && clearTimeout(timer);
136
+ timer = null;
99
137
  };
100
138
  let context;
101
139
  let writable;
@@ -104,7 +142,7 @@ function renderToStream(code, options = {}) {
104
142
  let firstFlushed = false;
105
143
  let completed = false;
106
144
  let scriptFlushed = false;
107
- let scheduled = true;
145
+ let timer = null;
108
146
  let buffer = {
109
147
  write(payload) {
110
148
  tmp += payload;
@@ -120,7 +158,7 @@ function renderToStream(code, options = {}) {
120
158
  assets: [],
121
159
  nonce,
122
160
  block(p) {
123
- if (!firstFlushed) blockingResources.push(p);
161
+ if (!firstFlushed) blockingPromises.push(p);
124
162
  },
125
163
  replace(id, payloadFn) {
126
164
  if (firstFlushed) return;
@@ -130,40 +168,51 @@ function renderToStream(code, options = {}) {
130
168
  const last = html.indexOf(`<!--!$/${id}-->`, first + placeholder.length);
131
169
  html = html.replace(html.slice(first, last + placeholder.length + 1), resolveSSRNode(payloadFn()));
132
170
  },
133
- writeResource(id, p, error, wait) {
171
+ serialize(id, p, wait) {
134
172
  const serverOnly = solidJs.sharedConfig.context.noHydrate;
135
- if (error) return !serverOnly && pushTask(serializeSet(dedupe, id, p));
136
- if (!p || typeof p !== "object" || !("then" in p)) return !serverOnly && pushTask(serializeSet(dedupe, id, p));
137
- if (!firstFlushed) wait && blockingResources.push(p);else !serverOnly && pushTask(`_$HY.init("${id}")`);
138
- if (serverOnly) return;
139
- p.then(d => {
140
- !completed && pushTask(serializeSet(dedupe, id, d));
141
- }).catch(() => {
142
- !completed && pushTask(`_$HY.set("${id}", {})`);
143
- });
173
+ if (!firstFlushed && wait && typeof p === "object" && "then" in p) {
174
+ blockingPromises.push(p);
175
+ !serverOnly && p.then(d => {
176
+ serializer.write(id, d);
177
+ }).catch(e => {
178
+ serializer.write(id, e);
179
+ });
180
+ } else if (!serverOnly) serializer.write(id, p);
144
181
  },
145
182
  registerFragment(key) {
146
183
  if (!registry.has(key)) {
147
- registry.set(key, []);
148
- firstFlushed && pushTask(`_$HY.init("${key}")`);
184
+ let resolve, reject;
185
+ const p = new Promise((r, rej) => (resolve = r, reject = rej));
186
+ registry.set(key, {
187
+ resolve,
188
+ reject
189
+ });
190
+ serializer.write(key, p);
149
191
  }
150
192
  return (value, error) => {
151
193
  if (registry.has(key)) {
152
- const keys = registry.get(key);
194
+ const {
195
+ resolve,
196
+ reject
197
+ } = registry.get(key);
153
198
  registry.delete(key);
154
- if (waitForFragments(registry, key)) return;
199
+ if (waitForFragments(registry, key)) {
200
+ resolve(true);
201
+ return;
202
+ }
155
203
  if ((value !== undefined || error) && !completed) {
156
204
  if (!firstFlushed) {
157
205
  Promise.resolve().then(() => html = replacePlaceholder(html, key, value !== undefined ? value : ""));
158
- error && pushTask(serializeSet(dedupe, key, error));
206
+ error ? reject(error) : resolve(true);
159
207
  } else {
160
208
  buffer.write(`<template id="${key}">${value !== undefined ? value : " "}</template>`);
161
- pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") + ";" : ""}$df("${key}"${error ? "," + stringify(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`);
209
+ pushTask(`$df("${key}")${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`);
210
+ resolve(true);
162
211
  scriptFlushed = true;
163
212
  }
164
213
  }
165
214
  }
166
- if (!registry.size) Promise.resolve().then(checkEnd);
215
+ if (!registry.size) Promise.resolve().then(flushEnd);
167
216
  return firstFlushed;
168
217
  };
169
218
  }
@@ -176,14 +225,9 @@ function renderToStream(code, options = {}) {
176
225
  solidJs.sharedConfig.context = context;
177
226
  context.noHydrate = true;
178
227
  html = injectAssets(context.assets, html);
179
- for (const key in context.resources) {
180
- if (!("data" in context.resources[key] || context.resources[key].ref[0].error)) pushTask(`_$HY.init("${key}")`);
181
- }
182
- for (const key of registry.keys()) pushTask(`_$HY.init("${key}")`);
183
228
  if (tasks.length) html = injectScripts(html, tasks, nonce);
184
229
  buffer.write(html);
185
230
  tasks = "";
186
- scheduled = false;
187
231
  onCompleteShell && onCompleteShell({
188
232
  write(v) {
189
233
  !completed && buffer.write(v);
@@ -203,19 +247,19 @@ function renderToStream(code, options = {}) {
203
247
  complete();
204
248
  };
205
249
  } else onCompleteAll = complete;
206
- if (!registry.size) Promise.resolve().then(checkEnd);
250
+ if (!registry.size) Promise.resolve().then(flushEnd);
207
251
  },
208
252
  pipe(w) {
209
- Promise.allSettled(blockingResources).then(() => {
253
+ Promise.allSettled(blockingPromises).then(() => {
210
254
  doShell();
211
255
  buffer = writable = w;
212
256
  buffer.write(tmp);
213
257
  firstFlushed = true;
214
- if (completed) writable.end();else setTimeout(checkEnd);
258
+ if (completed) writable.end();else setTimeout(flushEnd);
215
259
  });
216
260
  },
217
261
  pipeTo(w) {
218
- return Promise.allSettled(blockingResources).then(() => {
262
+ return Promise.allSettled(blockingPromises).then(() => {
219
263
  doShell();
220
264
  const encoder = new TextEncoder();
221
265
  const writer = w.getWriter();
@@ -235,7 +279,7 @@ function renderToStream(code, options = {}) {
235
279
  };
236
280
  buffer.write(tmp);
237
281
  firstFlushed = true;
238
- if (completed) writable.end();else setTimeout(checkEnd);
282
+ if (completed) writable.end();else setTimeout(flushEnd);
239
283
  return p;
240
284
  });
241
285
  }
@@ -416,7 +460,7 @@ function generateHydrationScript({
416
460
  eventNames = ["click", "input"],
417
461
  nonce
418
462
  } = {}) {
419
- return `<script${nonce ? ` nonce="${nonce}"` : ""}>(e=>{let t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host.nodeType?e.host:e.parentNode));["${eventNames.join('", "')}"].forEach((o=>document.addEventListener(o,(o=>{let s=o.composedPath&&o.composedPath()[0]||o.target,a=t(s);a&&!e.completed.has(a)&&e.events.push([a,o])}))))})(window._$HY||(_$HY={events:[],completed:new WeakSet,r:{},fe(){},init(e,t){_$HY.r[e]=[new Promise((e=>t=e)),t]},set(e,t,o){(o=_$HY.r[e])&&o[1](t),_$HY.r[e]=[t]},unset(e){delete _$HY.r[e]},load:e=>_$HY.r[e]}));</script><!--xs-->`;
463
+ return `<script${nonce ? ` nonce="${nonce}"` : ""}>window._$HY||(e=>{let t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host.nodeType?e.host:e.parentNode));["${eventNames.join('", "')}"].forEach((o=>document.addEventListener(o,(o=>{let a=o.composedPath&&o.composedPath()[0]||o.target,s=t(a);s&&!e.completed.has(s)&&e.events.push([s,o])}))))})(_$HY={events:[],completed:new WeakSet,r:{},fe(){}});${getGlobalHeaderScript()}</script><!--xs-->`;
420
464
  }
421
465
  function Hydration(props) {
422
466
  if (!solidJs.sharedConfig.context.noHydrate) return props.children;
@@ -451,19 +495,10 @@ function injectScripts(html, scripts, nonce) {
451
495
  }
452
496
  function waitForFragments(registry, key) {
453
497
  for (const k of [...registry.keys()].reverse()) {
454
- if (key.startsWith(k)) {
455
- registry.get(k).push(key);
456
- return true;
457
- }
498
+ if (key.startsWith(k)) return true;
458
499
  }
459
500
  return false;
460
501
  }
461
- function serializeSet(registry, key, value) {
462
- const exist = registry.get(value);
463
- if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0])`;
464
- value !== null && typeof value === "object" && registry.set(value, key);
465
- return `_$HY.set("${key}", ${stringify(value)})`;
466
- }
467
502
  function replacePlaceholder(html, key, value) {
468
503
  const marker = `<template id="pl-${key}">`;
469
504
  const close = `<!--pl-${key}-->`;
@@ -633,5 +668,4 @@ exports.ssrElement = ssrElement;
633
668
  exports.ssrHydrationKey = ssrHydrationKey;
634
669
  exports.ssrSpread = ssrSpread;
635
670
  exports.ssrStyle = ssrStyle;
636
- exports.stringify = stringify;
637
671
  exports.useAssets = useAssets;