solid-js 1.5.0-beta.1 → 1.5.0-beta.2

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.
@@ -233,7 +233,7 @@ function stringifyString(str) {
233
233
  return result;
234
234
  }
235
235
 
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||"$$$")}`;
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 = {
@@ -271,8 +271,6 @@ function renderToStream(code, options = {}) {
271
271
  onCompleteAll,
272
272
  renderId
273
273
  } = options;
274
- const tmp = [];
275
- const tasks = [];
276
274
  const blockingResources = [];
277
275
  const registry = new Map();
278
276
  const dedupe = new WeakMap();
@@ -289,7 +287,7 @@ function renderToStream(code, options = {}) {
289
287
  }
290
288
  };
291
289
  const pushTask = task => {
292
- tasks.push(task);
290
+ tasks += task + ";";
293
291
  if (!scheduled && firstFlushed) {
294
292
  Promise.resolve().then(writeTasks);
295
293
  scheduled = true;
@@ -297,22 +295,25 @@ function renderToStream(code, options = {}) {
297
295
  };
298
296
  const writeTasks = () => {
299
297
  if (tasks.length && !completed && firstFlushed) {
300
- buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${tasks.join(";")}</script>`);
301
- tasks.length = 0;
298
+ buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${tasks}</script>`);
299
+ tasks = "";
302
300
  }
303
301
  scheduled = false;
304
302
  };
303
+ let context;
305
304
  let writable;
305
+ let tmp = "";
306
+ let tasks = "";
306
307
  let firstFlushed = false;
307
308
  let completed = false;
308
309
  let scriptFlushed = false;
309
310
  let scheduled = true;
310
311
  let buffer = {
311
312
  write(payload) {
312
- tmp.push(payload);
313
+ tmp += payload;
313
314
  }
314
315
  };
315
- solidJs.sharedConfig.context = {
316
+ solidJs.sharedConfig.context = context = {
316
317
  id: renderId || "",
317
318
  count: 0,
318
319
  async: true,
@@ -320,10 +321,18 @@ function renderToStream(code, options = {}) {
320
321
  suspense: {},
321
322
  assets: [],
322
323
  nonce,
324
+ replace(id, payloadFn) {
325
+ if (firstFlushed) return;
326
+ const placeholder = `<!${id}>`;
327
+ const first = html.indexOf(placeholder);
328
+ if (first === -1) return;
329
+ const last = html.indexOf(`<!/${id}>`, first + placeholder.length);
330
+ html = html.replace(html.slice(first, last + placeholder.length + 1), resolveSSRNode(payloadFn()));
331
+ },
323
332
  writeResource(id, p, error, wait) {
324
- if (error) return pushTask(`_$HY.set("${id}", ${serializeError(p)})`);
333
+ if (error) return pushTask(serializeSet(dedupe, id, p, serializeError));
325
334
  if (!p || typeof p !== "object" || !("then" in p)) return pushTask(serializeSet(dedupe, id, p));
326
- if (wait && !firstFlushed) blockingResources.push(p);else pushTask(`_$HY.init("${id}")`);
335
+ if (!firstFlushed) wait && blockingResources.push(p);else pushTask(`_$HY.init("${id}")`);
327
336
  p.then(d => {
328
337
  !completed && pushTask(serializeSet(dedupe, id, d));
329
338
  }).catch(() => {
@@ -333,7 +342,7 @@ function renderToStream(code, options = {}) {
333
342
  registerFragment(key) {
334
343
  if (!registry.has(key)) {
335
344
  registry.set(key, []);
336
- pushTask(`_$HY.init("${key}")`);
345
+ firstFlushed && pushTask(`_$HY.init("${key}")`);
337
346
  }
338
347
  return (value, error) => {
339
348
  if (registry.has(key)) {
@@ -343,7 +352,7 @@ function renderToStream(code, options = {}) {
343
352
  if ((value !== undefined || error) && !completed) {
344
353
  if (!firstFlushed) {
345
354
  Promise.resolve().then(() => html = replacePlaceholder(html, key, value !== undefined ? value : ""));
346
- pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}");`) : ""}_$HY.set("${key}",${error ? serializeError(error) : '"$$$"'})`);
355
+ error && pushTask(serializeSet(dedupe, key, error, serializeError));
347
356
  } else {
348
357
  buffer.write(`<div hidden id="${key}">${value !== undefined ? value : " "}</div>`);
349
358
  pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") + ";" : ""}$df("${key}"${error ? "," + serializeError(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`);
@@ -352,16 +361,20 @@ function renderToStream(code, options = {}) {
352
361
  }
353
362
  }
354
363
  Promise.resolve().then(checkEnd);
355
- return true;
364
+ return firstFlushed;
356
365
  };
357
366
  }
358
367
  };
359
368
  let html = resolveSSRNode(escape(code()));
360
369
  function doShell() {
361
- html = injectAssets(solidJs.sharedConfig.context.assets, html);
362
- if (tasks.length) html = injectScripts(html, tasks.join(";"), nonce);
370
+ html = injectAssets(context.assets, html);
371
+ for (const key in context.resources) {
372
+ if (!("data" in context.resources[key] || context.resources[key].ref[0].error)) pushTask(`_$HY.init("${key}")`);
373
+ }
374
+ for (const key of registry.keys()) pushTask(`_$HY.init("${key}")`);
375
+ if (tasks.length) html = injectScripts(html, tasks, nonce);
363
376
  buffer.write(html);
364
- tasks.length = 0;
377
+ tasks = "";
365
378
  scheduled = false;
366
379
  onCompleteShell && onCompleteShell({
367
380
  write(v) {
@@ -373,9 +386,7 @@ function renderToStream(code, options = {}) {
373
386
  then(fn) {
374
387
  function complete() {
375
388
  doShell();
376
- let mapped = "";
377
- for (let i = 0, len = tmp.length; i < len; i++) mapped += tmp[i];
378
- fn(mapped);
389
+ fn(tmp);
379
390
  }
380
391
  if (onCompleteAll) {
381
392
  ogComplete = onCompleteAll;
@@ -390,7 +401,7 @@ function renderToStream(code, options = {}) {
390
401
  Promise.allSettled(blockingResources).then(() => {
391
402
  doShell();
392
403
  buffer = writable = w;
393
- tmp.forEach(chunk => buffer.write(chunk));
404
+ buffer.write(tmp);
394
405
  firstFlushed = true;
395
406
  if (completed) writable.end();else setTimeout(checkEnd);
396
407
  });
@@ -411,7 +422,7 @@ function renderToStream(code, options = {}) {
411
422
  writer.write(encoder.encode(payload));
412
423
  }
413
424
  };
414
- tmp.forEach(chunk => buffer.write(chunk));
425
+ buffer.write(tmp);
415
426
  firstFlushed = true;
416
427
  if (completed) writable.end();else setTimeout(checkEnd);
417
428
  });
@@ -446,12 +457,12 @@ function NoHydration(props) {
446
457
  function ssr(t, ...nodes) {
447
458
  if (nodes.length) {
448
459
  let result = "";
449
- for (let i = 0; i < t.length; i++) {
460
+ for (let i = 0; i < nodes.length; i++) {
450
461
  result += t[i];
451
462
  const node = nodes[i];
452
463
  if (node !== undefined) result += resolveSSRNode(node);
453
464
  }
454
- t = result;
465
+ t = result + t[nodes.length];
455
466
  }
456
467
  return {
457
468
  t
@@ -572,7 +583,7 @@ function resolveSSRNode(node) {
572
583
  for (let i = 0, len = node.length; i < len; i++) mapped += resolveSSRNode(node[i]);
573
584
  return mapped;
574
585
  }
575
- if (t === "object") return resolveSSRNode(node.t);
586
+ if (t === "object") return node.t;
576
587
  if (t === "function") return resolveSSRNode(node());
577
588
  return String(node);
578
589
  }
@@ -624,11 +635,11 @@ function waitForFragments(registry, key) {
624
635
  }
625
636
  return false;
626
637
  }
627
- function serializeSet(registry, key, value) {
638
+ function serializeSet(registry, key, value, serializer = devalue) {
628
639
  const exist = registry.get(value);
629
640
  if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0])`;
630
641
  value !== null && typeof value === "object" && registry.set(value, key);
631
- return `_$HY.set("${key}", ${devalue(value)})`;
642
+ return `_$HY.set("${key}", ${serializer(value)})`;
632
643
  }
633
644
  function replacePlaceholder(html, key, value) {
634
645
  const nextRegex = /(<[/]?span[^>]*>)/g;
@@ -230,7 +230,7 @@ function stringifyString(str) {
230
230
  return result;
231
231
  }
232
232
 
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||"$$$")}`;
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 = {
@@ -268,8 +268,6 @@ function renderToStream(code, options = {}) {
268
268
  onCompleteAll,
269
269
  renderId
270
270
  } = options;
271
- const tmp = [];
272
- const tasks = [];
273
271
  const blockingResources = [];
274
272
  const registry = new Map();
275
273
  const dedupe = new WeakMap();
@@ -286,7 +284,7 @@ function renderToStream(code, options = {}) {
286
284
  }
287
285
  };
288
286
  const pushTask = task => {
289
- tasks.push(task);
287
+ tasks += task + ";";
290
288
  if (!scheduled && firstFlushed) {
291
289
  Promise.resolve().then(writeTasks);
292
290
  scheduled = true;
@@ -294,22 +292,25 @@ function renderToStream(code, options = {}) {
294
292
  };
295
293
  const writeTasks = () => {
296
294
  if (tasks.length && !completed && firstFlushed) {
297
- buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${tasks.join(";")}</script>`);
298
- tasks.length = 0;
295
+ buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${tasks}</script>`);
296
+ tasks = "";
299
297
  }
300
298
  scheduled = false;
301
299
  };
300
+ let context;
302
301
  let writable;
302
+ let tmp = "";
303
+ let tasks = "";
303
304
  let firstFlushed = false;
304
305
  let completed = false;
305
306
  let scriptFlushed = false;
306
307
  let scheduled = true;
307
308
  let buffer = {
308
309
  write(payload) {
309
- tmp.push(payload);
310
+ tmp += payload;
310
311
  }
311
312
  };
312
- sharedConfig.context = {
313
+ sharedConfig.context = context = {
313
314
  id: renderId || "",
314
315
  count: 0,
315
316
  async: true,
@@ -317,10 +318,18 @@ function renderToStream(code, options = {}) {
317
318
  suspense: {},
318
319
  assets: [],
319
320
  nonce,
321
+ replace(id, payloadFn) {
322
+ if (firstFlushed) return;
323
+ const placeholder = `<!${id}>`;
324
+ const first = html.indexOf(placeholder);
325
+ if (first === -1) return;
326
+ const last = html.indexOf(`<!/${id}>`, first + placeholder.length);
327
+ html = html.replace(html.slice(first, last + placeholder.length + 1), resolveSSRNode(payloadFn()));
328
+ },
320
329
  writeResource(id, p, error, wait) {
321
- if (error) return pushTask(`_$HY.set("${id}", ${serializeError(p)})`);
330
+ if (error) return pushTask(serializeSet(dedupe, id, p, serializeError));
322
331
  if (!p || typeof p !== "object" || !("then" in p)) return pushTask(serializeSet(dedupe, id, p));
323
- if (wait && !firstFlushed) blockingResources.push(p);else pushTask(`_$HY.init("${id}")`);
332
+ if (!firstFlushed) wait && blockingResources.push(p);else pushTask(`_$HY.init("${id}")`);
324
333
  p.then(d => {
325
334
  !completed && pushTask(serializeSet(dedupe, id, d));
326
335
  }).catch(() => {
@@ -330,7 +339,7 @@ function renderToStream(code, options = {}) {
330
339
  registerFragment(key) {
331
340
  if (!registry.has(key)) {
332
341
  registry.set(key, []);
333
- pushTask(`_$HY.init("${key}")`);
342
+ firstFlushed && pushTask(`_$HY.init("${key}")`);
334
343
  }
335
344
  return (value, error) => {
336
345
  if (registry.has(key)) {
@@ -340,7 +349,7 @@ function renderToStream(code, options = {}) {
340
349
  if ((value !== undefined || error) && !completed) {
341
350
  if (!firstFlushed) {
342
351
  Promise.resolve().then(() => html = replacePlaceholder(html, key, value !== undefined ? value : ""));
343
- pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}");`) : ""}_$HY.set("${key}",${error ? serializeError(error) : '"$$$"'})`);
352
+ error && pushTask(serializeSet(dedupe, key, error, serializeError));
344
353
  } else {
345
354
  buffer.write(`<div hidden id="${key}">${value !== undefined ? value : " "}</div>`);
346
355
  pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") + ";" : ""}$df("${key}"${error ? "," + serializeError(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`);
@@ -349,16 +358,20 @@ function renderToStream(code, options = {}) {
349
358
  }
350
359
  }
351
360
  Promise.resolve().then(checkEnd);
352
- return true;
361
+ return firstFlushed;
353
362
  };
354
363
  }
355
364
  };
356
365
  let html = resolveSSRNode(escape(code()));
357
366
  function doShell() {
358
- html = injectAssets(sharedConfig.context.assets, html);
359
- if (tasks.length) html = injectScripts(html, tasks.join(";"), nonce);
367
+ html = injectAssets(context.assets, html);
368
+ for (const key in context.resources) {
369
+ if (!("data" in context.resources[key] || context.resources[key].ref[0].error)) pushTask(`_$HY.init("${key}")`);
370
+ }
371
+ for (const key of registry.keys()) pushTask(`_$HY.init("${key}")`);
372
+ if (tasks.length) html = injectScripts(html, tasks, nonce);
360
373
  buffer.write(html);
361
- tasks.length = 0;
374
+ tasks = "";
362
375
  scheduled = false;
363
376
  onCompleteShell && onCompleteShell({
364
377
  write(v) {
@@ -370,9 +383,7 @@ function renderToStream(code, options = {}) {
370
383
  then(fn) {
371
384
  function complete() {
372
385
  doShell();
373
- let mapped = "";
374
- for (let i = 0, len = tmp.length; i < len; i++) mapped += tmp[i];
375
- fn(mapped);
386
+ fn(tmp);
376
387
  }
377
388
  if (onCompleteAll) {
378
389
  ogComplete = onCompleteAll;
@@ -387,7 +398,7 @@ function renderToStream(code, options = {}) {
387
398
  Promise.allSettled(blockingResources).then(() => {
388
399
  doShell();
389
400
  buffer = writable = w;
390
- tmp.forEach(chunk => buffer.write(chunk));
401
+ buffer.write(tmp);
391
402
  firstFlushed = true;
392
403
  if (completed) writable.end();else setTimeout(checkEnd);
393
404
  });
@@ -408,7 +419,7 @@ function renderToStream(code, options = {}) {
408
419
  writer.write(encoder.encode(payload));
409
420
  }
410
421
  };
411
- tmp.forEach(chunk => buffer.write(chunk));
422
+ buffer.write(tmp);
412
423
  firstFlushed = true;
413
424
  if (completed) writable.end();else setTimeout(checkEnd);
414
425
  });
@@ -443,12 +454,12 @@ function NoHydration(props) {
443
454
  function ssr(t, ...nodes) {
444
455
  if (nodes.length) {
445
456
  let result = "";
446
- for (let i = 0; i < t.length; i++) {
457
+ for (let i = 0; i < nodes.length; i++) {
447
458
  result += t[i];
448
459
  const node = nodes[i];
449
460
  if (node !== undefined) result += resolveSSRNode(node);
450
461
  }
451
- t = result;
462
+ t = result + t[nodes.length];
452
463
  }
453
464
  return {
454
465
  t
@@ -569,7 +580,7 @@ function resolveSSRNode(node) {
569
580
  for (let i = 0, len = node.length; i < len; i++) mapped += resolveSSRNode(node[i]);
570
581
  return mapped;
571
582
  }
572
- if (t === "object") return resolveSSRNode(node.t);
583
+ if (t === "object") return node.t;
573
584
  if (t === "function") return resolveSSRNode(node());
574
585
  return String(node);
575
586
  }
@@ -621,11 +632,11 @@ function waitForFragments(registry, key) {
621
632
  }
622
633
  return false;
623
634
  }
624
- function serializeSet(registry, key, value) {
635
+ function serializeSet(registry, key, value, serializer = devalue) {
625
636
  const exist = registry.get(value);
626
637
  if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0])`;
627
638
  value !== null && typeof value === "object" && registry.set(value, key);
628
- return `_$HY.set("${key}", ${devalue(value)})`;
639
+ return `_$HY.set("${key}", ${serializer(value)})`;
629
640
  }
630
641
  function replacePlaceholder(html, key, value) {
631
642
  const nextRegex = /(<[/]?span[^>]*>)/g;
@@ -1,4 +1,4 @@
1
- import { JSX } from "./jsx";
1
+ import { JSX } from "./jsx.js";
2
2
  export const Aliases: Record<string, string>;
3
3
  export const PropAliases: Record<string, string>;
4
4
  export const Properties: Set<string>;
@@ -1,3 +1,3 @@
1
- import { createRoot, createRenderEffect, createComponent, getOwner, sharedConfig } from "solid-js";
1
+ import { createRoot, createRenderEffect, createComponent, getOwner, sharedConfig, untrack } from "solid-js";
2
2
  declare function memo<T>(fn: () => T, equals: boolean): import("solid-js").Accessor<T>;
3
- export { getOwner, createComponent, createRoot as root, createRenderEffect as effect, memo, sharedConfig };
3
+ export { getOwner, createComponent, createRoot as root, createRenderEffect as effect, memo, sharedConfig, untrack };
@@ -1,8 +1,8 @@
1
- import { hydrate as hydrateCore } from "./client";
1
+ import { hydrate as hydrateCore } from "./client.js";
2
2
  import { JSX, Accessor, ComponentProps, ValidComponent } from "solid-js";
3
- export * from "./client";
3
+ export * from "./client.js";
4
4
  export { For, Show, Suspense, SuspenseList, Switch, Match, Index, ErrorBoundary, mergeProps } from "solid-js";
5
- export * from "./server-mock";
5
+ export * from "./server-mock.js";
6
6
  export declare const isServer = false;
7
7
  export declare const hydrate: typeof hydrateCore;
8
8
  /**
@@ -1 +1 @@
1
- export { JSX } from "../..";
1
+ export type { JSX } from "../../types/jsx.js";