solid-js 1.4.7 → 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,70 +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 Map();
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
- if (!registry.has(key)) registry.set(key, []);
286
- return (value = "", error) => {
287
- if (!registry.has(key)) return;
288
- cache[key] = value;
289
- registry.delete(key);
290
- if (waitForFragments(registry, key)) return;
291
- if (error) scripts += `_$HY.set("${key}", Promise.resolve(${serializeError(error)}));`;else scripts += `_$HY.set("${key}", null);`;
292
- if (!registry.size) Promise.resolve().then(() => {
293
- let source = resolveSSRNode(rendered);
294
- let final = "";
295
- let match;
296
- while (match = source.match(FRAGMENT_REPLACE)) {
297
- final += source.substring(0, match.index);
298
- source = cache[match[1]] + source.substring(match.index + match[0].length);
299
- }
300
- resolve(final + source);
301
- });
302
- return true;
303
- };
304
- }
305
- });
306
- }
307
- return Promise.race([asyncWrap(() => escape(code())), timeout]).then(res => {
259
+ return Promise.race([renderToStream(code, options), timeout]).then(html => {
308
260
  clearTimeout(timeoutHandle);
309
- let html = injectAssets(context.assets, resolveSSRNode(res));
310
- if (scripts.length) html = injectScripts(html, scripts, nonce);
311
261
  return html;
312
262
  });
313
263
  }
314
264
  function renderToStream(code, options = {}) {
315
- const {
265
+ let {
316
266
  nonce,
317
267
  onCompleteShell,
318
268
  onCompleteAll,
@@ -337,13 +287,13 @@ function renderToStream(code, options = {}) {
337
287
  };
338
288
  const pushTask = task => {
339
289
  tasks.push(task);
340
- if (!scheduled) {
290
+ if (!scheduled && firstFlushed) {
341
291
  Promise.resolve().then(writeTasks);
342
292
  scheduled = true;
343
293
  }
344
294
  };
345
295
  const writeTasks = () => {
346
- if (tasks.length && !completed) {
296
+ if (tasks.length && !completed && firstFlushed) {
347
297
  buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${tasks.join(";")}</script>`);
348
298
  tasks.length = 0;
349
299
  }
@@ -363,7 +313,6 @@ function renderToStream(code, options = {}) {
363
313
  id: renderId || "",
364
314
  count: 0,
365
315
  async: true,
366
- streaming: true,
367
316
  resources: {},
368
317
  suspense: {},
369
318
  assets: [],
@@ -391,7 +340,7 @@ function renderToStream(code, options = {}) {
391
340
  if ((value !== undefined || error) && !completed) {
392
341
  if (!firstFlushed) {
393
342
  Promise.resolve().then(() => html = replacePlaceholder(html, key, value !== undefined ? value : ""));
394
- 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) : '"$$$"'})`);
395
344
  } else {
396
345
  buffer.write(`<div hidden id="${key}">${value !== undefined ? value : " "}</div>`);
397
346
  pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") + ";" : ""}$df("${key}"${error ? "," + serializeError(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`);
@@ -399,7 +348,7 @@ function renderToStream(code, options = {}) {
399
348
  }
400
349
  }
401
350
  }
402
- if (firstFlushed) checkEnd();
351
+ Promise.resolve().then(checkEnd);
403
352
  return true;
404
353
  };
405
354
  }
@@ -418,6 +367,22 @@ function renderToStream(code, options = {}) {
418
367
  });
419
368
  }
420
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
+ },
421
386
  pipe(w) {
422
387
  Promise.allSettled(blockingResources).then(() => {
423
388
  doShell();
@@ -514,16 +479,15 @@ function ssrStyle(value) {
514
479
  }
515
480
  return result;
516
481
  }
517
- function ssrSpread(props, isSVG, skipChildren) {
518
- let result = "";
519
- if (props == null) return results;
482
+ function ssrElement(tag, props, children, needsId) {
483
+ let result = `<${tag}${needsId ? ssrHydrationKey() : ""} `;
520
484
  if (typeof props === "function") props = props();
521
485
  const keys = Object.keys(props);
522
486
  let classResolved;
523
487
  for (let i = 0; i < keys.length; i++) {
524
488
  const prop = keys[i];
525
- if (prop === "children") {
526
- !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]);
527
491
  continue;
528
492
  }
529
493
  const value = props[prop];
@@ -543,7 +507,9 @@ function ssrSpread(props, isSVG, skipChildren) {
543
507
  }
544
508
  if (i !== keys.length - 1) result += " ";
545
509
  }
546
- return result;
510
+ return {
511
+ t: result + `>${resolveSSRNode(children)}</${tag}>`
512
+ };
547
513
  }
548
514
  function ssrAttribute(key, value, isBoolean) {
549
515
  return isBoolean ? value ? " " + key : "" : value != null ? ` ${key}="${value}"` : "";
@@ -615,7 +581,7 @@ function generateHydrationScript({
615
581
  eventNames = ["click", "input"],
616
582
  nonce
617
583
  } = {}) {
618
- 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-->`;
619
585
  }
620
586
  function injectAssets(assets, html) {
621
587
  for (let i = 0; i < assets.length; i++) {
@@ -719,8 +685,7 @@ function Dynamic(props) {
719
685
  t = typeof comp;
720
686
  if (comp) {
721
687
  if (t === "function") return comp(others);else if (t === "string") {
722
- const [local, sOthers] = splitProps(others, ["children"]);
723
- return ssr([`<${comp}`, ' ', ">", `</${comp}>`], ssrHydrationKey(), ssrSpread(sOthers), escape(local.children || ""));
688
+ return ssrElement(comp, others, undefined, true);
724
689
  }
725
690
  }
726
691
  }
@@ -728,4 +693,4 @@ function Portal(props) {
728
693
  return "";
729
694
  }
730
695
 
731
- 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
@@ -518,12 +518,12 @@ function renderToStream(fn, options) {
518
518
  throwInBrowser(renderToStream);
519
519
  }
520
520
  function ssr(template, ...nodes) {}
521
- function resolveSSRNode(node) {}
521
+ function ssrElement(name, props, children, needsId) {}
522
522
  function ssrClassList(value) {}
523
523
  function ssrStyle(value) {}
524
- function ssrSpread(accessor) {}
525
524
  function ssrAttribute(key, value) {}
526
525
  function ssrHydrationKey() {}
526
+ function resolveSSRNode(node) {}
527
527
  function escape(html) {}
528
528
  function generateHydrationScript() {}
529
529
 
@@ -681,8 +681,8 @@ exports.spread = spread;
681
681
  exports.ssr = ssr;
682
682
  exports.ssrAttribute = ssrAttribute;
683
683
  exports.ssrClassList = ssrClassList;
684
+ exports.ssrElement = ssrElement;
684
685
  exports.ssrHydrationKey = ssrHydrationKey;
685
- exports.ssrSpread = ssrSpread;
686
686
  exports.ssrStyle = ssrStyle;
687
687
  exports.style = style;
688
688
  exports.template = template;
package/web/dist/web.js CHANGED
@@ -515,12 +515,12 @@ function renderToStream(fn, options) {
515
515
  throwInBrowser(renderToStream);
516
516
  }
517
517
  function ssr(template, ...nodes) {}
518
- function resolveSSRNode(node) {}
518
+ function ssrElement(name, props, children, needsId) {}
519
519
  function ssrClassList(value) {}
520
520
  function ssrStyle(value) {}
521
- function ssrSpread(accessor) {}
522
521
  function ssrAttribute(key, value) {}
523
522
  function ssrHydrationKey() {}
523
+ function resolveSSRNode(node) {}
524
524
  function escape(html) {}
525
525
  function generateHydrationScript() {}
526
526
 
@@ -587,4 +587,4 @@ function Dynamic(props) {
587
587
  });
588
588
  }
589
589
 
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, 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 = {