solid-js 1.4.5 → 1.5.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,6 +4,7 @@ export { ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch,
4
4
  const booleans = ["allowfullscreen", "async", "autofocus", "autoplay", "checked", "controls", "default", "disabled", "formnovalidate", "hidden", "indeterminate", "ismap", "loop", "multiple", "muted", "nomodule", "novalidate", "open", "playsinline", "readonly", "required", "reversed", "seamless", "selected"];
5
5
  const BooleanAttributes = /*#__PURE__*/new Set(booleans);
6
6
  /*#__PURE__*/new Set(["className", "value", "readOnly", "formNoValidate", "isMap", "noModule", "playsInline", ...booleans]);
7
+ const ChildProperties = /*#__PURE__*/new Set(["innerHTML", "textContent", "innerText", "children"]);
7
8
  const Aliases = {
8
9
  className: "class",
9
10
  htmlFor: "for"
@@ -229,8 +230,7 @@ function stringifyString(str) {
229
230
  return result;
230
231
  }
231
232
 
232
- const REPLACE_SCRIPT = `function $df(e,t,d,l){d=document.getElementById(e),(l=document.getElementById("pl-"+e))&&l.replaceWith(...d.childNodes),d.remove(),_$HY.set(e,t||null)}`;
233
- const FRAGMENT_REPLACE = /<!\[([\d-]+)\]>/;
233
+ const REPLACE_SCRIPT = `function $df(e,t,d,l){d=document.getElementById(e),(l=document.getElementById("pl-"+e))&&l.replaceWith(...d.childNodes),d.remove(),_$HY.set(e,t||"$$$")}`;
234
234
  function renderToString(code, options = {}) {
235
235
  let scripts = "";
236
236
  sharedConfig.context = {
@@ -249,69 +249,20 @@ function renderToString(code, options = {}) {
249
249
  return html;
250
250
  }
251
251
  function renderToStringAsync(code, options = {}) {
252
- let scripts = "";
253
252
  const {
254
- nonce,
255
- renderId,
256
253
  timeoutMs = 30000
257
254
  } = options;
258
- const dedupe = new WeakMap();
259
- const context = sharedConfig.context = {
260
- id: renderId || "",
261
- count: 0,
262
- resources: {},
263
- suspense: {},
264
- assets: [],
265
- async: true,
266
- nonce,
267
- writeResource(id, p, error) {
268
- if (error) return scripts += `_$HY.set("${id}", ${serializeError(p)});`;
269
- if (!p || typeof p !== "object" || !("then" in p)) return scripts += serializeSet(dedupe, id, p) + ";";
270
- p.then(d => scripts += serializeSet(dedupe, id, d) + ";").catch(() => scripts += `_$HY.set("${id}", {});`);
271
- }
272
- };
273
255
  let timeoutHandle;
274
256
  const timeout = new Promise((_, reject) => {
275
257
  timeoutHandle = setTimeout(() => reject("renderToString timed out"), timeoutMs);
276
258
  });
277
- function asyncWrap(fn) {
278
- return new Promise(resolve => {
279
- const registry = new Set();
280
- const cache = Object.create(null);
281
- sharedConfig.context.registerFragment = register;
282
- const rendered = fn();
283
- if (!registry.size) resolve(rendered);
284
- function register(key) {
285
- registry.add(key);
286
- return (value = "", error) => {
287
- if (!registry.has(key)) return;
288
- cache[key] = value;
289
- registry.delete(key);
290
- if (error) scripts += `_$HY.set("${key}", Promise.resolve(${serializeError(error)}));`;else scripts += `_$HY.set("${key}", null);`;
291
- if (!registry.size) Promise.resolve().then(() => {
292
- let source = resolveSSRNode(rendered);
293
- let final = "";
294
- let match;
295
- while (match = source.match(FRAGMENT_REPLACE)) {
296
- final += source.substring(0, match.index);
297
- source = cache[match[1]] + source.substring(match.index + match[0].length);
298
- }
299
- resolve(final + source);
300
- });
301
- return true;
302
- };
303
- }
304
- });
305
- }
306
- return Promise.race([asyncWrap(() => escape(code())), timeout]).then(res => {
259
+ return Promise.race([renderToStream(code, options), timeout]).then(html => {
307
260
  clearTimeout(timeoutHandle);
308
- let html = injectAssets(context.assets, resolveSSRNode(res));
309
- if (scripts.length) html = injectScripts(html, scripts, nonce);
310
261
  return html;
311
262
  });
312
263
  }
313
264
  function renderToStream(code, options = {}) {
314
- const {
265
+ let {
315
266
  nonce,
316
267
  onCompleteShell,
317
268
  onCompleteAll,
@@ -336,13 +287,13 @@ function renderToStream(code, options = {}) {
336
287
  };
337
288
  const pushTask = task => {
338
289
  tasks.push(task);
339
- if (!scheduled) {
290
+ if (!scheduled && firstFlushed) {
340
291
  Promise.resolve().then(writeTasks);
341
292
  scheduled = true;
342
293
  }
343
294
  };
344
295
  const writeTasks = () => {
345
- if (tasks.length && !completed) {
296
+ if (tasks.length && !completed && firstFlushed) {
346
297
  buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${tasks.join(";")}</script>`);
347
298
  tasks.length = 0;
348
299
  }
@@ -362,7 +313,6 @@ function renderToStream(code, options = {}) {
362
313
  id: renderId || "",
363
314
  count: 0,
364
315
  async: true,
365
- streaming: true,
366
316
  resources: {},
367
317
  suspense: {},
368
318
  assets: [],
@@ -390,15 +340,15 @@ function renderToStream(code, options = {}) {
390
340
  if ((value !== undefined || error) && !completed) {
391
341
  if (!firstFlushed) {
392
342
  Promise.resolve().then(() => html = replacePlaceholder(html, key, value !== undefined ? value : ""));
393
- pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}");`) : ""}_$HY.set("${key}",${error ? serializeError(error) : "null"})`);
343
+ pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}");`) : ""}_$HY.set("${key}",${error ? serializeError(error) : '"$$$"'})`);
394
344
  } else {
395
345
  buffer.write(`<div hidden id="${key}">${value !== undefined ? value : " "}</div>`);
396
- pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") : ""}$df("${key}"${error ? "," + serializeError(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`);
346
+ pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") + ";" : ""}$df("${key}"${error ? "," + serializeError(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`);
397
347
  scriptFlushed = true;
398
348
  }
399
349
  }
400
350
  }
401
- if (firstFlushed) checkEnd();
351
+ Promise.resolve().then(checkEnd);
402
352
  return true;
403
353
  };
404
354
  }
@@ -417,6 +367,22 @@ function renderToStream(code, options = {}) {
417
367
  });
418
368
  }
419
369
  return {
370
+ then(fn) {
371
+ function complete() {
372
+ doShell();
373
+ let mapped = "";
374
+ for (let i = 0, len = tmp.length; i < len; i++) mapped += tmp[i];
375
+ fn(mapped);
376
+ }
377
+ if (onCompleteAll) {
378
+ ogComplete = onCompleteAll;
379
+ onCompleteAll = options => {
380
+ ogComplete(options);
381
+ complete();
382
+ };
383
+ } else onCompleteAll = complete;
384
+ checkEnd();
385
+ },
420
386
  pipe(w) {
421
387
  Promise.allSettled(blockingResources).then(() => {
422
388
  doShell();
@@ -513,16 +479,15 @@ function ssrStyle(value) {
513
479
  }
514
480
  return result;
515
481
  }
516
- function ssrSpread(props, isSVG, skipChildren) {
517
- let result = "";
518
- if (props == null) return results;
482
+ function ssrElement(tag, props, children, needsId) {
483
+ let result = `<${tag}${needsId ? ssrHydrationKey() : ""} `;
519
484
  if (typeof props === "function") props = props();
520
485
  const keys = Object.keys(props);
521
486
  let classResolved;
522
487
  for (let i = 0; i < keys.length; i++) {
523
488
  const prop = keys[i];
524
- if (prop === "children") {
525
- !skipChildren && console.warn(`SSR currently does not support spread children.`);
489
+ if (ChildProperties.has(prop) && children === undefined) {
490
+ children = prop === "innerHTML" ? props[prop] : escape(props[prop]);
526
491
  continue;
527
492
  }
528
493
  const value = props[prop];
@@ -542,7 +507,9 @@ function ssrSpread(props, isSVG, skipChildren) {
542
507
  }
543
508
  if (i !== keys.length - 1) result += " ";
544
509
  }
545
- return result;
510
+ return {
511
+ t: result + `>${resolveSSRNode(children)}</${tag}>`
512
+ };
546
513
  }
547
514
  function ssrAttribute(key, value, isBoolean) {
548
515
  return isBoolean ? value ? " " + key : "" : value != null ? ` ${key}="${value}"` : "";
@@ -614,7 +581,7 @@ function generateHydrationScript({
614
581
  eventNames = ["click", "input"],
615
582
  nonce
616
583
  } = {}) {
617
- return `<script${nonce ? ` nonce="${nonce}"` : ""}>var e,t;e=window._$HY||(_$HY={events:[],completed:new WeakSet,r:{}}),t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host instanceof Node?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])})))),e.init=(t,o)=>{e.r[t]=[new Promise(((e,t)=>o=e)),o]},e.set=(t,o,s)=>{(s=e.r[t])&&s[1](o),e.r[t]=[o]},e.unset=t=>{delete e.r[t]},e.load=(t,o)=>{if(o=e.r[t])return o[0]};</script><!--xs-->`;
584
+ return `<script${nonce ? ` nonce="${nonce}"` : ""}>var e,t;e=window._$HY||(_$HY={events:[],completed:new WeakSet,r:{}}),t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host instanceof Node?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])})))),e.init=(t,o)=>{e.r[t]=[new Promise(((e,t)=>o=e)),o]},e.set=(t,o,s)=>{(s=e.r[t])&&s[1](o),e.r[t]=[o]},e.unset=t=>{delete e.r[t]},e.load=t=>e.r[t];</script><!--xs-->`;
618
585
  }
619
586
  function injectAssets(assets, html) {
620
587
  for (let i = 0; i < assets.length; i++) {
@@ -718,8 +685,7 @@ function Dynamic(props) {
718
685
  t = typeof comp;
719
686
  if (comp) {
720
687
  if (t === "function") return comp(others);else if (t === "string") {
721
- const [local, sOthers] = splitProps(others, ["children"]);
722
- return ssr([`<${comp}`, ' ', ">", `</${comp}>`], ssrHydrationKey(), ssrSpread(sOthers), escape(local.children || ""));
688
+ return ssrElement(comp, others, undefined, true);
723
689
  }
724
690
  }
725
691
  }
@@ -727,4 +693,4 @@ function Portal(props) {
727
693
  return "";
728
694
  }
729
695
 
730
- export { Assets, Dynamic, HydrationScript, NoHydration, Portal, escape, generateHydrationScript, getHydrationKey, isServer, pipeToNodeWritable, pipeToWritable, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, spread, ssr, ssrAttribute, ssrClassList, ssrHydrationKey, ssrSpread, ssrStyle };
696
+ export { Assets, Dynamic, HydrationScript, NoHydration, Portal, escape, generateHydrationScript, getHydrationKey, isServer, pipeToNodeWritable, pipeToWritable, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, spread, ssr, ssrAttribute, ssrClassList, ssrElement, ssrHydrationKey, ssrStyle };
package/web/dist/web.cjs CHANGED
@@ -445,13 +445,12 @@ function normalizeIncomingArray(normalized, array, current, unwrap) {
445
445
  let dynamic = false;
446
446
  for (let i = 0, len = array.length; i < len; i++) {
447
447
  let item = array[i],
448
- prev = current && current[i],
449
- t;
448
+ prev = current && current[i];
450
449
  if (item instanceof Node) {
451
450
  normalized.push(item);
452
451
  } else if (item == null || item === true || item === false) ; else if (Array.isArray(item)) {
453
452
  dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic;
454
- } else if ((t = typeof item) === "function") {
453
+ } else if ((typeof item) === "function") {
455
454
  if (unwrap) {
456
455
  while (typeof item === "function") item = item();
457
456
  dynamic = normalizeIncomingArray(normalized, Array.isArray(item) ? item : [item], prev) || dynamic;
@@ -460,7 +459,7 @@ function normalizeIncomingArray(normalized, array, current, unwrap) {
460
459
  dynamic = true;
461
460
  }
462
461
  } else {
463
- const value = t === "string" ? item : item.string();
462
+ const value = String(item);
464
463
  if (prev && prev.nodeType === 3 && prev.data === value) {
465
464
  normalized.push(prev);
466
465
  } else normalized.push(document.createTextNode(value));
@@ -519,12 +518,12 @@ function renderToStream(fn, options) {
519
518
  throwInBrowser(renderToStream);
520
519
  }
521
520
  function ssr(template, ...nodes) {}
522
- function resolveSSRNode(node) {}
521
+ function ssrElement(name, props, children, needsId) {}
523
522
  function ssrClassList(value) {}
524
523
  function ssrStyle(value) {}
525
- function ssrSpread(accessor) {}
526
524
  function ssrAttribute(key, value) {}
527
525
  function ssrHydrationKey() {}
526
+ function resolveSSRNode(node) {}
528
527
  function escape(html) {}
529
528
  function generateHydrationScript() {}
530
529
 
@@ -682,8 +681,8 @@ exports.spread = spread;
682
681
  exports.ssr = ssr;
683
682
  exports.ssrAttribute = ssrAttribute;
684
683
  exports.ssrClassList = ssrClassList;
684
+ exports.ssrElement = ssrElement;
685
685
  exports.ssrHydrationKey = ssrHydrationKey;
686
- exports.ssrSpread = ssrSpread;
687
686
  exports.ssrStyle = ssrStyle;
688
687
  exports.style = style;
689
688
  exports.template = template;
package/web/dist/web.js CHANGED
@@ -442,13 +442,12 @@ function normalizeIncomingArray(normalized, array, current, unwrap) {
442
442
  let dynamic = false;
443
443
  for (let i = 0, len = array.length; i < len; i++) {
444
444
  let item = array[i],
445
- prev = current && current[i],
446
- t;
445
+ prev = current && current[i];
447
446
  if (item instanceof Node) {
448
447
  normalized.push(item);
449
448
  } else if (item == null || item === true || item === false) ; else if (Array.isArray(item)) {
450
449
  dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic;
451
- } else if ((t = typeof item) === "function") {
450
+ } else if ((typeof item) === "function") {
452
451
  if (unwrap) {
453
452
  while (typeof item === "function") item = item();
454
453
  dynamic = normalizeIncomingArray(normalized, Array.isArray(item) ? item : [item], prev) || dynamic;
@@ -457,7 +456,7 @@ function normalizeIncomingArray(normalized, array, current, unwrap) {
457
456
  dynamic = true;
458
457
  }
459
458
  } else {
460
- const value = t === "string" ? item : item.string();
459
+ const value = String(item);
461
460
  if (prev && prev.nodeType === 3 && prev.data === value) {
462
461
  normalized.push(prev);
463
462
  } else normalized.push(document.createTextNode(value));
@@ -516,12 +515,12 @@ function renderToStream(fn, options) {
516
515
  throwInBrowser(renderToStream);
517
516
  }
518
517
  function ssr(template, ...nodes) {}
519
- function resolveSSRNode(node) {}
518
+ function ssrElement(name, props, children, needsId) {}
520
519
  function ssrClassList(value) {}
521
520
  function ssrStyle(value) {}
522
- function ssrSpread(accessor) {}
523
521
  function ssrAttribute(key, value) {}
524
522
  function ssrHydrationKey() {}
523
+ function resolveSSRNode(node) {}
525
524
  function escape(html) {}
526
525
  function generateHydrationScript() {}
527
526
 
@@ -588,4 +587,4 @@ function Dynamic(props) {
588
587
  });
589
588
  }
590
589
 
591
- export { Aliases, Assets, ChildProperties, DOMElements, DelegatedEvents, Dynamic, Assets as HydrationScript, NoHydration, Portal, PropAliases, Properties, SVGElements, SVGNamespace, addEventListener, assign, classList, className, clearDelegatedEvents, delegateEvents, dynamicProperty, escape, generateHydrationScript, getHydrationKey, getNextElement, getNextMarker, getNextMatch, hydrate, innerHTML, insert, isServer, memo, render, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, runHydrationEvents, setAttribute, setAttributeNS, spread, ssr, ssrAttribute, ssrClassList, ssrHydrationKey, ssrSpread, ssrStyle, style, template };
590
+ export { Aliases, Assets, ChildProperties, DOMElements, DelegatedEvents, Dynamic, Assets as HydrationScript, NoHydration, Portal, PropAliases, Properties, SVGElements, SVGNamespace, addEventListener, assign, classList, className, clearDelegatedEvents, delegateEvents, dynamicProperty, escape, generateHydrationScript, getHydrationKey, getNextElement, getNextMarker, getNextMatch, hydrate, innerHTML, insert, isServer, memo, render, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, runHydrationEvents, setAttribute, setAttributeNS, spread, ssr, ssrAttribute, ssrClassList, ssrElement, ssrHydrationKey, ssrStyle, style, template };
@@ -1,5 +1,5 @@
1
1
  import { hydrate as hydrateCore } from "./client";
2
- import { Component, JSX, Accessor } from "../..";
2
+ import { JSX, Accessor, ComponentProps, ValidComponent } from "../..";
3
3
  export * from "./client";
4
4
  export { For, Show, Suspense, SuspenseList, Switch, Match, Index, ErrorBoundary, mergeProps } from "../..";
5
5
  export * from "./server-mock";
@@ -21,9 +21,8 @@ export declare function Portal<T extends boolean = false, S extends boolean = fa
21
21
  } : {}) & (S extends true ? SVGGElement : HTMLDivElement)) => void);
22
22
  children: JSX.Element;
23
23
  }): Text;
24
- declare type DynamicProps<T> = T & {
25
- children?: any;
26
- component?: Component<T> | string | keyof JSX.IntrinsicElements;
24
+ declare type DynamicProps<T extends ValidComponent> = ComponentProps<T> & {
25
+ component: T | undefined;
27
26
  };
28
27
  /**
29
28
  * renders an arbitrary custom or native component and passes the other props
@@ -32,4 +31,4 @@ declare type DynamicProps<T> = T & {
32
31
  * ```
33
32
  * @description https://www.solidjs.com/docs/latest/api#%3Cdynamic%3E
34
33
  */
35
- export declare function Dynamic<T>(props: DynamicProps<T>): Accessor<JSX.Element>;
34
+ export declare function Dynamic<T extends ValidComponent>(props: DynamicProps<T>): Accessor<JSX.Element>;
@@ -25,16 +25,18 @@ export declare function renderToStream<T>(fn: () => T, options?: {
25
25
  export declare function ssr(template: string[] | string, ...nodes: any[]): {
26
26
  t: string;
27
27
  };
28
- export declare function resolveSSRNode(node: any): string;
28
+ export declare function ssrElement(name: string, props: any, children: any, needsId: boolean): {
29
+ t: string;
30
+ };
29
31
  export declare function ssrClassList(value: {
30
32
  [k: string]: boolean;
31
33
  }): string;
32
34
  export declare function ssrStyle(value: {
33
35
  [k: string]: string;
34
36
  }): string;
35
- export declare function ssrSpread(accessor: any): () => string;
36
37
  export declare function ssrAttribute(key: string, value: boolean): string;
37
38
  export declare function ssrHydrationKey(): string;
39
+ export declare function resolveSSRNode(node: any): string;
38
40
  export declare function escape(html: string): string;
39
41
  export declare function generateHydrationScript(): string;
40
42
  export declare type LegacyResults = {