@solidjs/web 2.0.0-rc.4 → 2.0.0-rc.5

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 (57) hide show
  1. package/dist/dev.cjs +52 -7
  2. package/dist/dev.js +51 -8
  3. package/dist/server.cjs +162 -35
  4. package/dist/server.js +161 -36
  5. package/dist/web.cjs +32 -7
  6. package/dist/web.js +31 -8
  7. package/frames/dist/client.cjs +41 -8
  8. package/frames/dist/client.dev.cjs +41 -8
  9. package/frames/dist/client.dev.js +41 -8
  10. package/frames/dist/client.js +41 -8
  11. package/frames/dist/server.cjs +432 -44
  12. package/frames/dist/server.js +432 -44
  13. package/package.json +2 -2
  14. package/serialization/dist/decode.cjs +4 -2
  15. package/serialization/dist/decode.js +4 -2
  16. package/serialization/dist/serialization.cjs +12 -8
  17. package/serialization/dist/serialization.js +12 -8
  18. package/serialization/types/index.d.ts +7 -0
  19. package/serialization/types/serializer-decode.d.ts +14 -1
  20. package/serialization/types/serializer.d.ts +7 -0
  21. package/serialization/types-cjs/index.d.cts +7 -0
  22. package/serialization/types-cjs/serializer-decode.d.cts +14 -1
  23. package/serialization/types-cjs/serializer.d.cts +7 -0
  24. package/server-functions/dist/client.cjs +150 -33
  25. package/server-functions/dist/client.js +147 -34
  26. package/server-functions/dist/server.cjs +731 -118
  27. package/server-functions/dist/server.dev.cjs +751 -118
  28. package/server-functions/dist/server.dev.js +747 -119
  29. package/server-functions/dist/server.js +727 -119
  30. package/types/cookies.d.ts +6 -14
  31. package/types/frames/frame-client.d.ts +4 -0
  32. package/types/frames/serializer-decode.d.ts +14 -1
  33. package/types/frames/serializer.d.ts +7 -0
  34. package/types/jsx.d.ts +11 -16
  35. package/types/response.d.ts +11 -0
  36. package/types/serializer-decode.d.ts +14 -1
  37. package/types/serializer.d.ts +7 -0
  38. package/types/server-functions/client.d.ts +22 -2
  39. package/types/server-functions/flash.d.ts +9 -0
  40. package/types/server-functions/server.d.ts +58 -9
  41. package/types/server-functions/shared.d.ts +77 -14
  42. package/types/server-mock.d.ts +17 -2
  43. package/types/server.d.ts +16 -2
  44. package/types-cjs/cookies.d.cts +6 -14
  45. package/types-cjs/frames/frame-client.d.cts +4 -0
  46. package/types-cjs/frames/serializer-decode.d.cts +14 -1
  47. package/types-cjs/frames/serializer.d.cts +7 -0
  48. package/types-cjs/jsx.d.cts +11 -16
  49. package/types-cjs/response.d.cts +11 -0
  50. package/types-cjs/serializer-decode.d.cts +14 -1
  51. package/types-cjs/serializer.d.cts +7 -0
  52. package/types-cjs/server-functions/client.d.cts +22 -2
  53. package/types-cjs/server-functions/flash.d.cts +9 -0
  54. package/types-cjs/server-functions/server.d.cts +58 -9
  55. package/types-cjs/server-functions/shared.d.cts +77 -14
  56. package/types-cjs/server-mock.d.cts +17 -2
  57. package/types-cjs/server.d.cts +16 -2
@@ -177,7 +177,18 @@ function createFrameHost(options = {}) {
177
177
  store.version = version;
178
178
  clearStreamRecords(store.records);
179
179
  }
180
- Object.assign(store.records, records);
180
+ const assets = records["seg::assets"];
181
+ const previous = assets && store.records["seg::assets"];
182
+ if (!previous || previous === assets) {
183
+ Object.assign(store.records, records);
184
+ } else {
185
+ for (const name in assets) {
186
+ const values = assets[name];
187
+ if (Array.isArray(values)) {
188
+ previous[name] ? previous[name].push(...values) : previous[name] = values;
189
+ }
190
+ }
191
+ }
181
192
  return true;
182
193
  };
183
194
  return {
@@ -269,7 +280,7 @@ class FrameImpl {
269
280
  #slotRegions = new Map();
270
281
  #slotResolvedRefs = new Map();
271
282
  #slotNodes = new Map();
272
- #processedAssets = new Set();
283
+ #processedAssets = new WeakSet();
273
284
  #recordRefresh = null;
274
285
  #disposed = false;
275
286
  #styleFlush = () => {
@@ -370,6 +381,7 @@ class FrameImpl {
370
381
  this.#revealed.clear();
371
382
  this.#fallbackShown.clear();
372
383
  this.#appliedHoles.clear();
384
+ this.#processedAssets = new WeakSet();
373
385
  this.#errorNotified = false;
374
386
  clearStreamRecords(this.#store, root);
375
387
  }
@@ -429,12 +441,17 @@ class FrameImpl {
429
441
  }
430
442
  }
431
443
  for (const key in this.#store) {
432
- if (this.#processedAssets.has(key) || !key.endsWith(":assets")) continue;
433
- this.#processedAssets.add(key);
434
444
  const record = this.#store[key];
435
- if (record && record.modules) {
445
+ if (!key.endsWith(":assets") || !record || this.#processedAssets.has(record)) {
446
+ continue;
447
+ }
448
+ this.#processedAssets.add(record);
449
+ if (record.modules) {
436
450
  for (const href of record.modules) ensureModulePreload(href);
437
451
  }
452
+ if (record.preloads) {
453
+ for (const entry of record.preloads) ensurePreload(entry);
454
+ }
438
455
  }
439
456
  this.#syncSlots();
440
457
  }
@@ -902,12 +919,28 @@ function parseFragment(html) {
902
919
  template.innerHTML = html;
903
920
  return template.content;
904
921
  }
905
- function findHeadElement(selector, attr, value) {
906
- for (const node of document.head.querySelectorAll(selector)) {
907
- if (node.getAttribute(attr) === value) return node;
922
+ const PRELOAD_QUALIFIERS = ["as", "crossorigin", "type", "media", "imagesrcset", "imagesizes"];
923
+ function findHeadElement(selector, attr, value, qualifiers) {
924
+ candidate: for (const node of document.head.querySelectorAll(selector)) {
925
+ if (node.getAttribute(attr) !== value) continue;
926
+ if (!qualifiers) return node;
927
+ for (let i = 0; i < PRELOAD_QUALIFIERS.length; i++) {
928
+ const name = PRELOAD_QUALIFIERS[i];
929
+ if (node.getAttribute(name) !== (qualifiers[name] ?? null)) continue candidate;
930
+ }
931
+ return node;
908
932
  }
909
933
  return null;
910
934
  }
935
+ function ensurePreload(entry) {
936
+ const attrs = entry.attrs;
937
+ if (findHeadElement('link[rel="preload"]', "href", entry.href, attrs)) return;
938
+ const link = document.createElement("link");
939
+ link.rel = "preload";
940
+ for (const name in attrs) link.setAttribute(name, attrs[name]);
941
+ link.setAttribute("href", entry.href);
942
+ document.head.appendChild(link);
943
+ }
911
944
  function ensureStylesheet(entry, onSettle) {
912
945
  const href = typeof entry === "string" ? entry : entry.href;
913
946
  let link = findHeadElement('link[rel="stylesheet"]', "href", href);
@@ -180,7 +180,18 @@ function createFrameHost(options = {}) {
180
180
  store.version = version;
181
181
  clearStreamRecords(store.records);
182
182
  }
183
- Object.assign(store.records, records);
183
+ const assets = records["seg::assets"];
184
+ const previous = assets && store.records["seg::assets"];
185
+ if (!previous || previous === assets) {
186
+ Object.assign(store.records, records);
187
+ } else {
188
+ for (const name in assets) {
189
+ const values = assets[name];
190
+ if (Array.isArray(values)) {
191
+ previous[name] ? previous[name].push(...values) : previous[name] = values;
192
+ }
193
+ }
194
+ }
184
195
  return true;
185
196
  };
186
197
  return {
@@ -272,7 +283,7 @@ class FrameImpl {
272
283
  #slotRegions = new Map();
273
284
  #slotResolvedRefs = new Map();
274
285
  #slotNodes = new Map();
275
- #processedAssets = new Set();
286
+ #processedAssets = new WeakSet();
276
287
  #recordRefresh = null;
277
288
  #disposed = false;
278
289
  #styleFlush = () => {
@@ -373,6 +384,7 @@ class FrameImpl {
373
384
  this.#revealed.clear();
374
385
  this.#fallbackShown.clear();
375
386
  this.#appliedHoles.clear();
387
+ this.#processedAssets = new WeakSet();
376
388
  this.#errorNotified = false;
377
389
  clearStreamRecords(this.#store, root);
378
390
  }
@@ -433,12 +445,17 @@ class FrameImpl {
433
445
  }
434
446
  }
435
447
  for (const key in this.#store) {
436
- if (this.#processedAssets.has(key) || !key.endsWith(":assets")) continue;
437
- this.#processedAssets.add(key);
438
448
  const record = this.#store[key];
439
- if (record && record.modules) {
449
+ if (!key.endsWith(":assets") || !record || this.#processedAssets.has(record)) {
450
+ continue;
451
+ }
452
+ this.#processedAssets.add(record);
453
+ if (record.modules) {
440
454
  for (const href of record.modules) ensureModulePreload(href);
441
455
  }
456
+ if (record.preloads) {
457
+ for (const entry of record.preloads) ensurePreload(entry);
458
+ }
442
459
  }
443
460
  this.#syncSlots();
444
461
  }
@@ -912,12 +929,28 @@ function parseFragment(html) {
912
929
  template.innerHTML = html;
913
930
  return template.content;
914
931
  }
915
- function findHeadElement(selector, attr, value) {
916
- for (const node of document.head.querySelectorAll(selector)) {
917
- if (node.getAttribute(attr) === value) return node;
932
+ const PRELOAD_QUALIFIERS = ["as", "crossorigin", "type", "media", "imagesrcset", "imagesizes"];
933
+ function findHeadElement(selector, attr, value, qualifiers) {
934
+ candidate: for (const node of document.head.querySelectorAll(selector)) {
935
+ if (node.getAttribute(attr) !== value) continue;
936
+ if (!qualifiers) return node;
937
+ for (let i = 0; i < PRELOAD_QUALIFIERS.length; i++) {
938
+ const name = PRELOAD_QUALIFIERS[i];
939
+ if (node.getAttribute(name) !== (qualifiers[name] ?? null)) continue candidate;
940
+ }
941
+ return node;
918
942
  }
919
943
  return null;
920
944
  }
945
+ function ensurePreload(entry) {
946
+ const attrs = entry.attrs;
947
+ if (findHeadElement('link[rel="preload"]', "href", entry.href, attrs)) return;
948
+ const link = document.createElement("link");
949
+ link.rel = "preload";
950
+ for (const name in attrs) link.setAttribute(name, attrs[name]);
951
+ link.setAttribute("href", entry.href);
952
+ document.head.appendChild(link);
953
+ }
921
954
  function ensureStylesheet(entry, onSettle) {
922
955
  const href = typeof entry === "string" ? entry : entry.href;
923
956
  let link = findHeadElement('link[rel="stylesheet"]', "href", href);
@@ -178,7 +178,18 @@ function createFrameHost(options = {}) {
178
178
  store.version = version;
179
179
  clearStreamRecords(store.records);
180
180
  }
181
- Object.assign(store.records, records);
181
+ const assets = records["seg::assets"];
182
+ const previous = assets && store.records["seg::assets"];
183
+ if (!previous || previous === assets) {
184
+ Object.assign(store.records, records);
185
+ } else {
186
+ for (const name in assets) {
187
+ const values = assets[name];
188
+ if (Array.isArray(values)) {
189
+ previous[name] ? previous[name].push(...values) : previous[name] = values;
190
+ }
191
+ }
192
+ }
182
193
  return true;
183
194
  };
184
195
  return {
@@ -270,7 +281,7 @@ class FrameImpl {
270
281
  #slotRegions = new Map();
271
282
  #slotResolvedRefs = new Map();
272
283
  #slotNodes = new Map();
273
- #processedAssets = new Set();
284
+ #processedAssets = new WeakSet();
274
285
  #recordRefresh = null;
275
286
  #disposed = false;
276
287
  #styleFlush = () => {
@@ -371,6 +382,7 @@ class FrameImpl {
371
382
  this.#revealed.clear();
372
383
  this.#fallbackShown.clear();
373
384
  this.#appliedHoles.clear();
385
+ this.#processedAssets = new WeakSet();
374
386
  this.#errorNotified = false;
375
387
  clearStreamRecords(this.#store, root);
376
388
  }
@@ -431,12 +443,17 @@ class FrameImpl {
431
443
  }
432
444
  }
433
445
  for (const key in this.#store) {
434
- if (this.#processedAssets.has(key) || !key.endsWith(":assets")) continue;
435
- this.#processedAssets.add(key);
436
446
  const record = this.#store[key];
437
- if (record && record.modules) {
447
+ if (!key.endsWith(":assets") || !record || this.#processedAssets.has(record)) {
448
+ continue;
449
+ }
450
+ this.#processedAssets.add(record);
451
+ if (record.modules) {
438
452
  for (const href of record.modules) ensureModulePreload(href);
439
453
  }
454
+ if (record.preloads) {
455
+ for (const entry of record.preloads) ensurePreload(entry);
456
+ }
440
457
  }
441
458
  this.#syncSlots();
442
459
  }
@@ -910,12 +927,28 @@ function parseFragment(html) {
910
927
  template.innerHTML = html;
911
928
  return template.content;
912
929
  }
913
- function findHeadElement(selector, attr, value) {
914
- for (const node of document.head.querySelectorAll(selector)) {
915
- if (node.getAttribute(attr) === value) return node;
930
+ const PRELOAD_QUALIFIERS = ["as", "crossorigin", "type", "media", "imagesrcset", "imagesizes"];
931
+ function findHeadElement(selector, attr, value, qualifiers) {
932
+ candidate: for (const node of document.head.querySelectorAll(selector)) {
933
+ if (node.getAttribute(attr) !== value) continue;
934
+ if (!qualifiers) return node;
935
+ for (let i = 0; i < PRELOAD_QUALIFIERS.length; i++) {
936
+ const name = PRELOAD_QUALIFIERS[i];
937
+ if (node.getAttribute(name) !== (qualifiers[name] ?? null)) continue candidate;
938
+ }
939
+ return node;
916
940
  }
917
941
  return null;
918
942
  }
943
+ function ensurePreload(entry) {
944
+ const attrs = entry.attrs;
945
+ if (findHeadElement('link[rel="preload"]', "href", entry.href, attrs)) return;
946
+ const link = document.createElement("link");
947
+ link.rel = "preload";
948
+ for (const name in attrs) link.setAttribute(name, attrs[name]);
949
+ link.setAttribute("href", entry.href);
950
+ document.head.appendChild(link);
951
+ }
919
952
  function ensureStylesheet(entry, onSettle) {
920
953
  const href = typeof entry === "string" ? entry : entry.href;
921
954
  let link = findHeadElement('link[rel="stylesheet"]', "href", href);
@@ -175,7 +175,18 @@ function createFrameHost(options = {}) {
175
175
  store.version = version;
176
176
  clearStreamRecords(store.records);
177
177
  }
178
- Object.assign(store.records, records);
178
+ const assets = records["seg::assets"];
179
+ const previous = assets && store.records["seg::assets"];
180
+ if (!previous || previous === assets) {
181
+ Object.assign(store.records, records);
182
+ } else {
183
+ for (const name in assets) {
184
+ const values = assets[name];
185
+ if (Array.isArray(values)) {
186
+ previous[name] ? previous[name].push(...values) : previous[name] = values;
187
+ }
188
+ }
189
+ }
179
190
  return true;
180
191
  };
181
192
  return {
@@ -267,7 +278,7 @@ class FrameImpl {
267
278
  #slotRegions = new Map();
268
279
  #slotResolvedRefs = new Map();
269
280
  #slotNodes = new Map();
270
- #processedAssets = new Set();
281
+ #processedAssets = new WeakSet();
271
282
  #recordRefresh = null;
272
283
  #disposed = false;
273
284
  #styleFlush = () => {
@@ -368,6 +379,7 @@ class FrameImpl {
368
379
  this.#revealed.clear();
369
380
  this.#fallbackShown.clear();
370
381
  this.#appliedHoles.clear();
382
+ this.#processedAssets = new WeakSet();
371
383
  this.#errorNotified = false;
372
384
  clearStreamRecords(this.#store, root);
373
385
  }
@@ -427,12 +439,17 @@ class FrameImpl {
427
439
  }
428
440
  }
429
441
  for (const key in this.#store) {
430
- if (this.#processedAssets.has(key) || !key.endsWith(":assets")) continue;
431
- this.#processedAssets.add(key);
432
442
  const record = this.#store[key];
433
- if (record && record.modules) {
443
+ if (!key.endsWith(":assets") || !record || this.#processedAssets.has(record)) {
444
+ continue;
445
+ }
446
+ this.#processedAssets.add(record);
447
+ if (record.modules) {
434
448
  for (const href of record.modules) ensureModulePreload(href);
435
449
  }
450
+ if (record.preloads) {
451
+ for (const entry of record.preloads) ensurePreload(entry);
452
+ }
436
453
  }
437
454
  this.#syncSlots();
438
455
  }
@@ -900,12 +917,28 @@ function parseFragment(html) {
900
917
  template.innerHTML = html;
901
918
  return template.content;
902
919
  }
903
- function findHeadElement(selector, attr, value) {
904
- for (const node of document.head.querySelectorAll(selector)) {
905
- if (node.getAttribute(attr) === value) return node;
920
+ const PRELOAD_QUALIFIERS = ["as", "crossorigin", "type", "media", "imagesrcset", "imagesizes"];
921
+ function findHeadElement(selector, attr, value, qualifiers) {
922
+ candidate: for (const node of document.head.querySelectorAll(selector)) {
923
+ if (node.getAttribute(attr) !== value) continue;
924
+ if (!qualifiers) return node;
925
+ for (let i = 0; i < PRELOAD_QUALIFIERS.length; i++) {
926
+ const name = PRELOAD_QUALIFIERS[i];
927
+ if (node.getAttribute(name) !== (qualifiers[name] ?? null)) continue candidate;
928
+ }
929
+ return node;
906
930
  }
907
931
  return null;
908
932
  }
933
+ function ensurePreload(entry) {
934
+ const attrs = entry.attrs;
935
+ if (findHeadElement('link[rel="preload"]', "href", entry.href, attrs)) return;
936
+ const link = document.createElement("link");
937
+ link.rel = "preload";
938
+ for (const name in attrs) link.setAttribute(name, attrs[name]);
939
+ link.setAttribute("href", entry.href);
940
+ document.head.appendChild(link);
941
+ }
909
942
  function ensureStylesheet(entry, onSettle) {
910
943
  const href = typeof entry === "string" ? entry : entry.href;
911
944
  let link = findHeadElement('link[rel="stylesheet"]', "href", href);