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.
@@ -1,6 +1,11 @@
1
1
  import { Accessor, Setter } from "./signal";
2
+ declare global {
3
+ interface SymbolConstructor {
4
+ readonly observable: symbol;
5
+ }
6
+ }
2
7
  export declare type ObservableObserver<T> = ((v: T) => void) | {
3
- next: (v: T) => void;
8
+ next?: (v: T) => void;
4
9
  error?: (v: any) => void;
5
10
  complete?: (v: boolean) => void;
6
11
  };
@@ -15,10 +20,10 @@ export declare type ObservableObserver<T> = ((v: T) => void) | {
15
20
  * description https://www.solidjs.com/docs/latest/api#observable
16
21
  */
17
22
  export declare function observable<T>(input: Accessor<T>): {
18
- [x: number]: () => any;
19
23
  subscribe(observer: ObservableObserver<T>): {
20
24
  unsubscribe(): void;
21
25
  };
26
+ [Symbol.observable](): any;
22
27
  };
23
28
  export declare function from<T>(producer: ((setter: Setter<T>) => () => void) | {
24
29
  subscribe: (fn: (v: T) => void) => (() => void) | {
@@ -5,10 +5,10 @@ export declare const equalFn: <T>(a: T, b: T) => boolean;
5
5
  export declare const $PROXY: unique symbol;
6
6
  export declare const $TRACK: unique symbol;
7
7
  export declare const $DEVCOMP: unique symbol;
8
- export declare const NOTPENDING: {};
9
8
  export declare var Owner: Owner | null;
10
9
  export declare let Transition: TransitionState | null;
11
10
  declare let ExternalSourceFactory: ExternalSourceFactory | null;
11
+ declare let Pending: SignalState<any>[] | null;
12
12
  declare global {
13
13
  var _$afterUpdate: () => void;
14
14
  var _$afterCreateRoot: (root: Owner) => void;
@@ -17,7 +17,6 @@ export interface SignalState<T> {
17
17
  value?: T;
18
18
  observers: Computation<any>[] | null;
19
19
  observerSlots: number[] | null;
20
- pending: T | {};
21
20
  tValue?: T;
22
21
  comparator?: (prev: T, next: T) => boolean;
23
22
  name?: string;
@@ -198,11 +197,42 @@ export interface MemoOptions<T> extends EffectOptions {
198
197
  */
199
198
  export declare function createMemo<Next extends Prev, Prev = Next>(fn: EffectFunction<undefined | NoInfer<Prev>, Next>): Accessor<Next>;
200
199
  export declare function createMemo<Next extends Prev, Init = Next, Prev = Next>(fn: EffectFunction<Init | Prev, Next>, value: Init, options?: MemoOptions<Next>): Accessor<Next>;
201
- export interface Resource<T> extends Accessor<T> {
202
- loading: boolean;
203
- error: any;
200
+ interface Unresolved {
201
+ state: "unresolved";
202
+ loading: false;
203
+ error: undefined;
204
+ latest: undefined;
205
+ (): undefined;
206
+ }
207
+ interface Pending {
208
+ state: "pending";
209
+ loading: true;
210
+ error: undefined;
211
+ latest: undefined;
212
+ (): undefined;
213
+ }
214
+ interface Ready<T> {
215
+ state: "ready";
216
+ loading: false;
217
+ error: undefined;
204
218
  latest: T;
219
+ (): T;
220
+ }
221
+ interface Refreshing<T> {
222
+ state: "refreshing";
223
+ loading: true;
224
+ error: undefined;
225
+ latest: T;
226
+ (): T;
227
+ }
228
+ interface Error {
229
+ state: "error";
230
+ loading: false;
231
+ error: any;
232
+ latest: undefined;
233
+ (): undefined;
205
234
  }
235
+ export declare type Resource<T> = undefined extends T ? Unresolved | Pending | Ready<T> | Refreshing<T> | Error : Ready<T> | Refreshing<T> | Error;
206
236
  export declare type ResourceActions<T> = {
207
237
  mutate: Setter<T>;
208
238
  refetch: (info?: unknown) => T | Promise<T> | undefined | null;
@@ -217,17 +247,16 @@ export declare type ResourceOptions<T> = undefined extends T ? {
217
247
  initialValue?: T;
218
248
  name?: string;
219
249
  deferStream?: boolean;
250
+ store?: <T>(init: T) => [Accessor<T>, Setter<T>];
220
251
  onHydrated?: <S, T>(k: S, info: ResourceFetcherInfo<T>) => void;
221
252
  } : {
222
253
  initialValue: T;
223
254
  name?: string;
224
255
  deferStream?: boolean;
256
+ store?: <T>(init: T) => [Accessor<T>, Setter<T>];
225
257
  onHydrated?: <S, T>(k: S, info: ResourceFetcherInfo<T>) => void;
226
258
  };
227
- export declare type ResourceReturn<T, O extends ResourceOptions<T | undefined> | undefined, K = T> = [
228
- Resource<O extends undefined | null ? T | undefined : NonNullable<O>["initialValue"] extends undefined ? T | undefined : T>,
229
- ResourceActions<K>
230
- ];
259
+ export declare type ResourceReturn<T, K = T> = [Resource<T>, ResourceActions<K>];
231
260
  /**
232
261
  * Creates a resource that wraps a repeated promise in a reactive pattern:
233
262
  * ```typescript
@@ -253,10 +282,10 @@ export declare type ResourceReturn<T, O extends ResourceOptions<T | undefined> |
253
282
  *
254
283
  * @description https://www.solidjs.com/docs/latest/api#createresource
255
284
  */
256
- export declare function createResource<T, S = true>(fetcher: ResourceFetcher<S, T>, options?: ResourceOptions<undefined>): ResourceReturn<T | undefined, typeof options>;
257
- export declare function createResource<T, S = true>(fetcher: ResourceFetcher<S, T>, options: ResourceOptions<T>): ResourceReturn<T, typeof options>;
258
- export declare function createResource<T, S>(source: ResourceSource<S>, fetcher: ResourceFetcher<S, T>, options?: ResourceOptions<undefined>): ResourceReturn<T | undefined, typeof options>;
259
- export declare function createResource<T, S>(source: ResourceSource<S>, fetcher: ResourceFetcher<S, T>, options: ResourceOptions<T>): ResourceReturn<T, typeof options>;
285
+ export declare function createResource<T, S = true>(fetcher: ResourceFetcher<S, T>, options?: ResourceOptions<undefined>): ResourceReturn<T | undefined>;
286
+ export declare function createResource<T, S = true>(fetcher: ResourceFetcher<S, T>, options: ResourceOptions<T>): ResourceReturn<T>;
287
+ export declare function createResource<T, S>(source: ResourceSource<S>, fetcher: ResourceFetcher<S, T>, options?: ResourceOptions<undefined>): ResourceReturn<T | undefined>;
288
+ export declare function createResource<T, S>(source: ResourceSource<S>, fetcher: ResourceFetcher<S, T>, options: ResourceOptions<T>): ResourceReturn<T>;
260
289
  export interface DeferredOptions<T> {
261
290
  equals?: false | ((prev: T, next: T) => boolean);
262
291
  name?: string;
@@ -51,6 +51,7 @@ export declare type FlowProps<P = {}, C = JSX.Element> = P & {
51
51
  export declare type FlowComponent<P = {}, C = JSX.Element> = Component<FlowProps<P, C>>;
52
52
  /** @deprecated: use `ParentProps` instead */
53
53
  export declare type PropsWithChildren<P = {}> = ParentProps<P>;
54
+ export declare type ValidComponent = keyof JSX.IntrinsicElements | Component<any> | (string & {});
54
55
  /**
55
56
  * Takes the props of the passed component and returns its type
56
57
  *
@@ -58,7 +59,7 @@ export declare type PropsWithChildren<P = {}> = ParentProps<P>;
58
59
  * ComponentProps<typeof Portal> // { mount?: Node; useShadow?: boolean; children: JSX.Element }
59
60
  * ComponentProps<'div'> // JSX.HTMLAttributes<HTMLDivElement>
60
61
  */
61
- export declare type ComponentProps<T extends keyof JSX.IntrinsicElements | Component<any>> = T extends Component<infer P> ? P : T extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[T] : {};
62
+ export declare type ComponentProps<T extends ValidComponent> = T extends Component<infer P> ? P : T extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[T] : Record<string, unknown>;
62
63
  /**
63
64
  * Type of `props.ref`, for use in `Component` or `props` typing.
64
65
  *
@@ -66,16 +67,30 @@ export declare type ComponentProps<T extends keyof JSX.IntrinsicElements | Compo
66
67
  */
67
68
  export declare type Ref<T> = T | ((val: T) => void);
68
69
  export declare function createComponent<T>(Comp: Component<T>, props: T): JSX.Element;
70
+ declare type DistributeOverride<T, F> = T extends undefined ? F : T;
69
71
  declare type Override<T, U> = T extends any ? U extends any ? {
70
- [K in keyof T]: K extends keyof U ? undefined extends U[K] ? Exclude<U[K], undefined> | T[K] : U[K] : T[K];
72
+ [K in keyof T]: K extends keyof U ? DistributeOverride<U[K], T[K]> : T[K];
71
73
  } & {
72
- [K in keyof U]: K extends keyof T ? undefined extends U[K] ? Exclude<U[K], undefined> | T[K] : U[K] : U[K];
74
+ [K in keyof U]: K extends keyof T ? DistributeOverride<U[K], T[K]> : U[K];
73
75
  } : T & U : T & U;
74
- export declare type MergeProps<T extends unknown[], Curr = {}> = T extends [
76
+ declare type OverrideSpread<T, U> = T extends any ? {
77
+ [K in keyof ({
78
+ [K in keyof T]: any;
79
+ } & {
80
+ [K in keyof U]?: any;
81
+ } & {
82
+ [K in U extends any ? keyof U : keyof U]?: any;
83
+ })]: K extends keyof T ? Exclude<U extends any ? U[K & keyof U] : never, undefined> | T[K] : U extends any ? U[K & keyof U] : never;
84
+ } : T & U;
85
+ declare type Simplify<T> = T extends any ? {
86
+ [K in keyof T]: T[K];
87
+ } : T;
88
+ declare type _MergeProps<T extends unknown[], Curr = {}> = T extends [
75
89
  infer Next | (() => infer Next),
76
90
  ...infer Rest
77
- ] ? MergeProps<Rest, Override<Curr, Next>> : Curr;
78
- export declare function mergeProps<T extends [unknown, ...unknown[]]>(...sources: T): MergeProps<T>;
91
+ ] ? _MergeProps<Rest, Override<Curr, Next>> : T extends [...infer Rest, infer Next | (() => infer Next)] ? Override<_MergeProps<Rest, Curr>, Next> : T extends [] ? Curr : T extends (infer I | (() => infer I))[] ? OverrideSpread<Curr, I> : Curr;
92
+ export declare type MergeProps<T extends unknown[]> = Simplify<_MergeProps<T>>;
93
+ export declare function mergeProps<T extends unknown[]>(...sources: T): MergeProps<T>;
79
94
  export declare type SplitProps<T, K extends (readonly (keyof T)[])[]> = [
80
95
  ...{
81
96
  [P in keyof K]: P extends `${number}` ? Pick<T, Extract<K[P], readonly (keyof T)[]>[number]> : never;
@@ -4,6 +4,7 @@ export declare const $DEVCOMP: unique symbol;
4
4
  export declare const DEV: {};
5
5
  export declare type Accessor<T> = () => T;
6
6
  export declare type Setter<T> = undefined extends T ? <U extends T>(value?: (U extends Function ? never : U) | ((prev?: T) => U)) => U : <U extends T>(value: (U extends Function ? never : U) | ((prev: T) => U)) => U;
7
+ export declare function castError(err: any): string | Error;
7
8
  export declare let Owner: Owner | null;
8
9
  interface Owner {
9
10
  owner: Owner | null;
@@ -14,7 +14,8 @@ export declare type FlowProps<P = {}, C = JSX.Element> = P & {
14
14
  };
15
15
  export declare type FlowComponent<P = {}, C = JSX.Element> = Component<FlowProps<P, C>>;
16
16
  export declare type Ref<T> = T | ((val: T) => void);
17
- export declare type ComponentProps<T extends keyof JSX.IntrinsicElements | Component> = T extends Component<infer P> ? P : T extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[T] : {};
17
+ export declare type ValidComponent = keyof JSX.IntrinsicElements | Component<any> | (string & {});
18
+ export declare type ComponentProps<T extends ValidComponent> = T extends Component<infer P> ? P : T extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[T] : Record<string, unknown>;
18
19
  declare type SharedConfig = {
19
20
  context?: HydrationContext;
20
21
  };
@@ -123,7 +124,6 @@ declare type HydrationContext = {
123
124
  suspense: Record<string, SuspenseContextType>;
124
125
  registerFragment: (v: string) => (v?: string, err?: any) => boolean;
125
126
  async?: boolean;
126
- streaming?: boolean;
127
127
  noHydrate: boolean;
128
128
  };
129
129
  export declare function SuspenseList(props: {
@@ -6,9 +6,9 @@ export interface RendererOptions<NodeType> {
6
6
  setProperty<T>(node: NodeType, name: string, value: T, prev?: T): void;
7
7
  insertNode(parent: NodeType, node: NodeType, anchor?: NodeType): void;
8
8
  removeNode(parent: NodeType, node: NodeType): void;
9
- getParentNode(node: NodeType): NodeType;
10
- getFirstChild(node: NodeType): NodeType;
11
- getNextSibling(node: NodeType): NodeType;
9
+ getParentNode(node: NodeType): NodeType | undefined;
10
+ getFirstChild(node: NodeType): NodeType | undefined;
11
+ getNextSibling(node: NodeType): NodeType | undefined;
12
12
  }
13
13
 
14
14
  export interface Renderer<NodeType> {
package/web/dist/dev.cjs CHANGED
@@ -446,13 +446,12 @@ function normalizeIncomingArray(normalized, array, current, unwrap) {
446
446
  let dynamic = false;
447
447
  for (let i = 0, len = array.length; i < len; i++) {
448
448
  let item = array[i],
449
- prev = current && current[i],
450
- t;
449
+ prev = current && current[i];
451
450
  if (item instanceof Node) {
452
451
  normalized.push(item);
453
452
  } else if (item == null || item === true || item === false) ; else if (Array.isArray(item)) {
454
453
  dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic;
455
- } else if ((t = typeof item) === "function") {
454
+ } else if ((typeof item) === "function") {
456
455
  if (unwrap) {
457
456
  while (typeof item === "function") item = item();
458
457
  dynamic = normalizeIncomingArray(normalized, Array.isArray(item) ? item : [item], prev) || dynamic;
@@ -461,7 +460,7 @@ function normalizeIncomingArray(normalized, array, current, unwrap) {
461
460
  dynamic = true;
462
461
  }
463
462
  } else {
464
- const value = t === "string" ? item : item.string();
463
+ const value = String(item);
465
464
  if (prev && prev.nodeType === 3 && prev.data === value) {
466
465
  normalized.push(prev);
467
466
  } else normalized.push(document.createTextNode(value));
@@ -520,12 +519,12 @@ function renderToStream(fn, options) {
520
519
  throwInBrowser(renderToStream);
521
520
  }
522
521
  function ssr(template, ...nodes) {}
523
- function resolveSSRNode(node) {}
522
+ function ssrElement(name, props, children, needsId) {}
524
523
  function ssrClassList(value) {}
525
524
  function ssrStyle(value) {}
526
- function ssrSpread(accessor) {}
527
525
  function ssrAttribute(key, value) {}
528
526
  function ssrHydrationKey() {}
527
+ function resolveSSRNode(node) {}
529
528
  function escape(html) {}
530
529
  function generateHydrationScript() {}
531
530
 
@@ -686,8 +685,8 @@ exports.spread = spread;
686
685
  exports.ssr = ssr;
687
686
  exports.ssrAttribute = ssrAttribute;
688
687
  exports.ssrClassList = ssrClassList;
688
+ exports.ssrElement = ssrElement;
689
689
  exports.ssrHydrationKey = ssrHydrationKey;
690
- exports.ssrSpread = ssrSpread;
691
690
  exports.ssrStyle = ssrStyle;
692
691
  exports.style = style;
693
692
  exports.template = template;
package/web/dist/dev.js CHANGED
@@ -443,13 +443,12 @@ function normalizeIncomingArray(normalized, array, current, unwrap) {
443
443
  let dynamic = false;
444
444
  for (let i = 0, len = array.length; i < len; i++) {
445
445
  let item = array[i],
446
- prev = current && current[i],
447
- t;
446
+ prev = current && current[i];
448
447
  if (item instanceof Node) {
449
448
  normalized.push(item);
450
449
  } else if (item == null || item === true || item === false) ; else if (Array.isArray(item)) {
451
450
  dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic;
452
- } else if ((t = typeof item) === "function") {
451
+ } else if ((typeof item) === "function") {
453
452
  if (unwrap) {
454
453
  while (typeof item === "function") item = item();
455
454
  dynamic = normalizeIncomingArray(normalized, Array.isArray(item) ? item : [item], prev) || dynamic;
@@ -458,7 +457,7 @@ function normalizeIncomingArray(normalized, array, current, unwrap) {
458
457
  dynamic = true;
459
458
  }
460
459
  } else {
461
- const value = t === "string" ? item : item.string();
460
+ const value = String(item);
462
461
  if (prev && prev.nodeType === 3 && prev.data === value) {
463
462
  normalized.push(prev);
464
463
  } else normalized.push(document.createTextNode(value));
@@ -517,12 +516,12 @@ function renderToStream(fn, options) {
517
516
  throwInBrowser(renderToStream);
518
517
  }
519
518
  function ssr(template, ...nodes) {}
520
- function resolveSSRNode(node) {}
519
+ function ssrElement(name, props, children, needsId) {}
521
520
  function ssrClassList(value) {}
522
521
  function ssrStyle(value) {}
523
- function ssrSpread(accessor) {}
524
522
  function ssrAttribute(key, value) {}
525
523
  function ssrHydrationKey() {}
524
+ function resolveSSRNode(node) {}
526
525
  function escape(html) {}
527
526
  function generateHydrationScript() {}
528
527
 
@@ -592,4 +591,4 @@ function Dynamic(props) {
592
591
  });
593
592
  }
594
593
 
595
- 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 };
594
+ 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 };
@@ -7,6 +7,7 @@ var solidJs = require('solid-js');
7
7
  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"];
8
8
  const BooleanAttributes = /*#__PURE__*/new Set(booleans);
9
9
  /*#__PURE__*/new Set(["className", "value", "readOnly", "formNoValidate", "isMap", "noModule", "playsInline", ...booleans]);
10
+ const ChildProperties = /*#__PURE__*/new Set(["innerHTML", "textContent", "innerText", "children"]);
10
11
  const Aliases = {
11
12
  className: "class",
12
13
  htmlFor: "for"
@@ -232,8 +233,7 @@ function stringifyString(str) {
232
233
  return result;
233
234
  }
234
235
 
235
- 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)}`;
236
- const FRAGMENT_REPLACE = /<!\[([\d-]+)\]>/;
236
+ 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||"$$$")}`;
237
237
  function renderToString(code, options = {}) {
238
238
  let scripts = "";
239
239
  solidJs.sharedConfig.context = {
@@ -252,69 +252,20 @@ function renderToString(code, options = {}) {
252
252
  return html;
253
253
  }
254
254
  function renderToStringAsync(code, options = {}) {
255
- let scripts = "";
256
255
  const {
257
- nonce,
258
- renderId,
259
256
  timeoutMs = 30000
260
257
  } = options;
261
- const dedupe = new WeakMap();
262
- const context = solidJs.sharedConfig.context = {
263
- id: renderId || "",
264
- count: 0,
265
- resources: {},
266
- suspense: {},
267
- assets: [],
268
- async: true,
269
- nonce,
270
- writeResource(id, p, error) {
271
- if (error) return scripts += `_$HY.set("${id}", ${serializeError(p)});`;
272
- if (!p || typeof p !== "object" || !("then" in p)) return scripts += serializeSet(dedupe, id, p) + ";";
273
- p.then(d => scripts += serializeSet(dedupe, id, d) + ";").catch(() => scripts += `_$HY.set("${id}", {});`);
274
- }
275
- };
276
258
  let timeoutHandle;
277
259
  const timeout = new Promise((_, reject) => {
278
260
  timeoutHandle = setTimeout(() => reject("renderToString timed out"), timeoutMs);
279
261
  });
280
- function asyncWrap(fn) {
281
- return new Promise(resolve => {
282
- const registry = new Set();
283
- const cache = Object.create(null);
284
- solidJs.sharedConfig.context.registerFragment = register;
285
- const rendered = fn();
286
- if (!registry.size) resolve(rendered);
287
- function register(key) {
288
- registry.add(key);
289
- return (value = "", error) => {
290
- if (!registry.has(key)) return;
291
- cache[key] = value;
292
- registry.delete(key);
293
- if (error) scripts += `_$HY.set("${key}", Promise.resolve(${serializeError(error)}));`;else scripts += `_$HY.set("${key}", null);`;
294
- if (!registry.size) Promise.resolve().then(() => {
295
- let source = resolveSSRNode(rendered);
296
- let final = "";
297
- let match;
298
- while (match = source.match(FRAGMENT_REPLACE)) {
299
- final += source.substring(0, match.index);
300
- source = cache[match[1]] + source.substring(match.index + match[0].length);
301
- }
302
- resolve(final + source);
303
- });
304
- return true;
305
- };
306
- }
307
- });
308
- }
309
- return Promise.race([asyncWrap(() => escape(code())), timeout]).then(res => {
262
+ return Promise.race([renderToStream(code, options), timeout]).then(html => {
310
263
  clearTimeout(timeoutHandle);
311
- let html = injectAssets(context.assets, resolveSSRNode(res));
312
- if (scripts.length) html = injectScripts(html, scripts, nonce);
313
264
  return html;
314
265
  });
315
266
  }
316
267
  function renderToStream(code, options = {}) {
317
- const {
268
+ let {
318
269
  nonce,
319
270
  onCompleteShell,
320
271
  onCompleteAll,
@@ -339,13 +290,13 @@ function renderToStream(code, options = {}) {
339
290
  };
340
291
  const pushTask = task => {
341
292
  tasks.push(task);
342
- if (!scheduled) {
293
+ if (!scheduled && firstFlushed) {
343
294
  Promise.resolve().then(writeTasks);
344
295
  scheduled = true;
345
296
  }
346
297
  };
347
298
  const writeTasks = () => {
348
- if (tasks.length && !completed) {
299
+ if (tasks.length && !completed && firstFlushed) {
349
300
  buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${tasks.join(";")}</script>`);
350
301
  tasks.length = 0;
351
302
  }
@@ -365,7 +316,6 @@ function renderToStream(code, options = {}) {
365
316
  id: renderId || "",
366
317
  count: 0,
367
318
  async: true,
368
- streaming: true,
369
319
  resources: {},
370
320
  suspense: {},
371
321
  assets: [],
@@ -393,15 +343,15 @@ function renderToStream(code, options = {}) {
393
343
  if ((value !== undefined || error) && !completed) {
394
344
  if (!firstFlushed) {
395
345
  Promise.resolve().then(() => html = replacePlaceholder(html, key, value !== undefined ? value : ""));
396
- pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}");`) : ""}_$HY.set("${key}",${error ? serializeError(error) : "null"})`);
346
+ pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}");`) : ""}_$HY.set("${key}",${error ? serializeError(error) : '"$$$"'})`);
397
347
  } else {
398
348
  buffer.write(`<div hidden id="${key}">${value !== undefined ? value : " "}</div>`);
399
- pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") : ""}$df("${key}"${error ? "," + serializeError(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`);
349
+ pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") + ";" : ""}$df("${key}"${error ? "," + serializeError(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`);
400
350
  scriptFlushed = true;
401
351
  }
402
352
  }
403
353
  }
404
- if (firstFlushed) checkEnd();
354
+ Promise.resolve().then(checkEnd);
405
355
  return true;
406
356
  };
407
357
  }
@@ -420,6 +370,22 @@ function renderToStream(code, options = {}) {
420
370
  });
421
371
  }
422
372
  return {
373
+ then(fn) {
374
+ function complete() {
375
+ doShell();
376
+ let mapped = "";
377
+ for (let i = 0, len = tmp.length; i < len; i++) mapped += tmp[i];
378
+ fn(mapped);
379
+ }
380
+ if (onCompleteAll) {
381
+ ogComplete = onCompleteAll;
382
+ onCompleteAll = options => {
383
+ ogComplete(options);
384
+ complete();
385
+ };
386
+ } else onCompleteAll = complete;
387
+ checkEnd();
388
+ },
423
389
  pipe(w) {
424
390
  Promise.allSettled(blockingResources).then(() => {
425
391
  doShell();
@@ -516,16 +482,15 @@ function ssrStyle(value) {
516
482
  }
517
483
  return result;
518
484
  }
519
- function ssrSpread(props, isSVG, skipChildren) {
520
- let result = "";
521
- if (props == null) return results;
485
+ function ssrElement(tag, props, children, needsId) {
486
+ let result = `<${tag}${needsId ? ssrHydrationKey() : ""} `;
522
487
  if (typeof props === "function") props = props();
523
488
  const keys = Object.keys(props);
524
489
  let classResolved;
525
490
  for (let i = 0; i < keys.length; i++) {
526
491
  const prop = keys[i];
527
- if (prop === "children") {
528
- !skipChildren && console.warn(`SSR currently does not support spread children.`);
492
+ if (ChildProperties.has(prop) && children === undefined) {
493
+ children = prop === "innerHTML" ? props[prop] : escape(props[prop]);
529
494
  continue;
530
495
  }
531
496
  const value = props[prop];
@@ -545,7 +510,9 @@ function ssrSpread(props, isSVG, skipChildren) {
545
510
  }
546
511
  if (i !== keys.length - 1) result += " ";
547
512
  }
548
- return result;
513
+ return {
514
+ t: result + `>${resolveSSRNode(children)}</${tag}>`
515
+ };
549
516
  }
550
517
  function ssrAttribute(key, value, isBoolean) {
551
518
  return isBoolean ? value ? " " + key : "" : value != null ? ` ${key}="${value}"` : "";
@@ -617,7 +584,7 @@ function generateHydrationScript({
617
584
  eventNames = ["click", "input"],
618
585
  nonce
619
586
  } = {}) {
620
- 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-->`;
587
+ 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-->`;
621
588
  }
622
589
  function injectAssets(assets, html) {
623
590
  for (let i = 0; i < assets.length; i++) {
@@ -721,8 +688,7 @@ function Dynamic(props) {
721
688
  t = typeof comp;
722
689
  if (comp) {
723
690
  if (t === "function") return comp(others);else if (t === "string") {
724
- const [local, sOthers] = solidJs.splitProps(others, ["children"]);
725
- return ssr([`<${comp}`, ' ', ">", `</${comp}>`], ssrHydrationKey(), ssrSpread(sOthers), escape(local.children || ""));
691
+ return ssrElement(comp, others, undefined, true);
726
692
  }
727
693
  }
728
694
  }
@@ -789,6 +755,6 @@ exports.spread = spread;
789
755
  exports.ssr = ssr;
790
756
  exports.ssrAttribute = ssrAttribute;
791
757
  exports.ssrClassList = ssrClassList;
758
+ exports.ssrElement = ssrElement;
792
759
  exports.ssrHydrationKey = ssrHydrationKey;
793
- exports.ssrSpread = ssrSpread;
794
760
  exports.ssrStyle = ssrStyle;