solid-js 1.3.17 → 1.4.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.
- package/dist/dev.cjs +31 -27
- package/dist/dev.js +31 -27
- package/dist/server.cjs +8 -5
- package/dist/server.js +9 -5
- package/dist/solid.cjs +31 -27
- package/dist/solid.js +31 -27
- package/package.json +2 -2
- package/store/dist/dev.cjs +38 -28
- package/store/dist/dev.js +39 -30
- package/store/dist/store.cjs +38 -28
- package/store/dist/store.js +39 -30
- package/store/types/mutable.d.ts +1 -0
- package/store/types/store.d.ts +1 -0
- package/types/index.d.ts +1 -1
- package/types/jsx.d.ts +19 -5
- package/types/reactive/signal.d.ts +14 -13
- package/types/render/component.d.ts +62 -14
- package/types/server/index.d.ts +1 -1
- package/types/server/reactive.d.ts +1 -1
- package/types/server/rendering.d.ts +27 -13
- package/web/dist/dev.cjs +5 -1
- package/web/dist/dev.js +5 -2
- package/web/dist/server.cjs +83 -48
- package/web/dist/server.js +83 -48
- package/web/dist/web.cjs +5 -1
- package/web/dist/web.js +5 -2
- package/web/types/client.d.ts +1 -0
package/web/dist/server.cjs
CHANGED
|
@@ -269,8 +269,8 @@ function renderToStringAsync(code, options = {}) {
|
|
|
269
269
|
nonce,
|
|
270
270
|
writeResource(id, p, error) {
|
|
271
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}", {});`);
|
|
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
274
|
}
|
|
275
275
|
};
|
|
276
276
|
const timeout = new Promise((_, reject) => setTimeout(() => reject("renderToString timed out"), timeoutMs));
|
|
@@ -318,6 +318,7 @@ function renderToStream(code, options = {}) {
|
|
|
318
318
|
} = options;
|
|
319
319
|
const tmp = [];
|
|
320
320
|
const tasks = [];
|
|
321
|
+
const blockingResources = [];
|
|
321
322
|
const registry = new Map();
|
|
322
323
|
const dedupe = new WeakMap();
|
|
323
324
|
const checkEnd = () => {
|
|
@@ -332,6 +333,13 @@ function renderToStream(code, options = {}) {
|
|
|
332
333
|
completed = true;
|
|
333
334
|
}
|
|
334
335
|
};
|
|
336
|
+
const pushTask = task => {
|
|
337
|
+
tasks.push(task);
|
|
338
|
+
if (!scheduled) {
|
|
339
|
+
Promise.resolve().then(writeTasks);
|
|
340
|
+
scheduled = true;
|
|
341
|
+
}
|
|
342
|
+
};
|
|
335
343
|
const writeTasks = () => {
|
|
336
344
|
if (tasks.length && !completed) {
|
|
337
345
|
buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${tasks.join(";")}</script>`);
|
|
@@ -340,6 +348,7 @@ function renderToStream(code, options = {}) {
|
|
|
340
348
|
scheduled = false;
|
|
341
349
|
};
|
|
342
350
|
let writable;
|
|
351
|
+
let firstFlushed = false;
|
|
343
352
|
let completed = false;
|
|
344
353
|
let scriptFlushed = false;
|
|
345
354
|
let scheduled = true;
|
|
@@ -357,45 +366,45 @@ function renderToStream(code, options = {}) {
|
|
|
357
366
|
suspense: {},
|
|
358
367
|
assets: [],
|
|
359
368
|
nonce,
|
|
360
|
-
writeResource(id, p, error) {
|
|
361
|
-
if (
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
}
|
|
365
|
-
if (error) return tasks.push(`_$HY.set("${id}", ${serializeError(p)})`);
|
|
366
|
-
if (!p || typeof p !== "object" || !("then" in p)) return tasks.push(serializeSet(dedupe, id, p));
|
|
367
|
-
tasks.push(`_$HY.init("${id}")`);
|
|
369
|
+
writeResource(id, p, error, wait) {
|
|
370
|
+
if (error) return pushTask(`_$HY.set("${id}", ${serializeError(p)})`);
|
|
371
|
+
if (!p || typeof p !== "object" || !("then" in p)) return pushTask(serializeSet(dedupe, id, p));
|
|
372
|
+
if (wait && !firstFlushed) blockingResources.push(p);else pushTask(`_$HY.init("${id}")`);
|
|
368
373
|
p.then(d => {
|
|
369
|
-
!completed &&
|
|
374
|
+
!completed && pushTask(serializeSet(dedupe, id, d));
|
|
370
375
|
}).catch(() => {
|
|
371
|
-
!completed &&
|
|
376
|
+
!completed && pushTask(`_$HY.set("${id}", {})`);
|
|
372
377
|
});
|
|
373
378
|
},
|
|
374
379
|
registerFragment(key) {
|
|
375
|
-
registry.
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
scheduled = true;
|
|
380
|
+
if (!registry.has(key)) {
|
|
381
|
+
registry.set(key, []);
|
|
382
|
+
pushTask(`_$HY.init("${key}")`);
|
|
379
383
|
}
|
|
380
|
-
tasks.push(`_$HY.init("${key}")`);
|
|
381
384
|
return (value, error) => {
|
|
382
385
|
if (registry.has(key)) {
|
|
383
386
|
const keys = registry.get(key);
|
|
384
387
|
registry.delete(key);
|
|
385
388
|
if (waitForFragments(registry, key)) return;
|
|
386
389
|
if ((value !== undefined || error) && !completed) {
|
|
387
|
-
|
|
388
|
-
|
|
390
|
+
if (!firstFlushed) {
|
|
391
|
+
Promise.resolve().then(() => html = replacePlaceholder(html, key, value !== undefined ? value : ""));
|
|
392
|
+
pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}");`) : ""}_$HY.set("${key}",${error ? serializeError(error) : "null"})`);
|
|
393
|
+
} else {
|
|
394
|
+
buffer.write(`<div hidden id="${key}">${value !== undefined ? value : " "}</div>`);
|
|
395
|
+
pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") : ""}$df("${key}"${error ? "," + serializeError(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`);
|
|
396
|
+
scriptFlushed = true;
|
|
397
|
+
}
|
|
389
398
|
}
|
|
390
399
|
}
|
|
391
|
-
checkEnd();
|
|
400
|
+
if (firstFlushed) checkEnd();
|
|
392
401
|
return true;
|
|
393
402
|
};
|
|
394
403
|
}
|
|
395
404
|
};
|
|
396
405
|
let html = resolveSSRNode(escape(code()));
|
|
397
|
-
|
|
398
|
-
|
|
406
|
+
function doShell() {
|
|
407
|
+
html = injectAssets(solidJs.sharedConfig.context.assets, html);
|
|
399
408
|
if (tasks.length) html = injectScripts(html, tasks.join(";"), nonce);
|
|
400
409
|
buffer.write(html);
|
|
401
410
|
tasks.length = 0;
|
|
@@ -405,29 +414,37 @@ function renderToStream(code, options = {}) {
|
|
|
405
414
|
!completed && buffer.write(v);
|
|
406
415
|
}
|
|
407
416
|
});
|
|
408
|
-
}
|
|
417
|
+
}
|
|
409
418
|
return {
|
|
410
419
|
pipe(w) {
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
420
|
+
Promise.allSettled(blockingResources).then(() => {
|
|
421
|
+
doShell();
|
|
422
|
+
buffer = writable = w;
|
|
423
|
+
tmp.forEach(chunk => buffer.write(chunk));
|
|
424
|
+
firstFlushed = true;
|
|
425
|
+
if (completed) writable.end();else setTimeout(checkEnd);
|
|
426
|
+
});
|
|
414
427
|
},
|
|
415
428
|
pipeTo(w) {
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
429
|
+
Promise.allSettled(blockingResources).then(() => {
|
|
430
|
+
doShell();
|
|
431
|
+
const encoder = new TextEncoder();
|
|
432
|
+
const writer = w.getWriter();
|
|
433
|
+
writable = {
|
|
434
|
+
end() {
|
|
435
|
+
writer.releaseLock();
|
|
436
|
+
w.close();
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
buffer = {
|
|
440
|
+
write(payload) {
|
|
441
|
+
writer.write(encoder.encode(payload));
|
|
442
|
+
}
|
|
443
|
+
};
|
|
444
|
+
tmp.forEach(chunk => buffer.write(chunk));
|
|
445
|
+
firstFlushed = true;
|
|
446
|
+
if (completed) writable.end();else setTimeout(checkEnd);
|
|
447
|
+
});
|
|
431
448
|
}
|
|
432
449
|
};
|
|
433
450
|
}
|
|
@@ -496,9 +513,10 @@ function ssrStyle(value) {
|
|
|
496
513
|
return result;
|
|
497
514
|
}
|
|
498
515
|
function ssrSpread(props, isSVG, skipChildren) {
|
|
516
|
+
let result = "";
|
|
517
|
+
if (props == null) return results;
|
|
499
518
|
if (typeof props === "function") props = props();
|
|
500
519
|
const keys = Object.keys(props);
|
|
501
|
-
let result = "";
|
|
502
520
|
let classResolved;
|
|
503
521
|
for (let i = 0; i < keys.length; i++) {
|
|
504
522
|
const prop = keys[i];
|
|
@@ -516,7 +534,7 @@ function ssrSpread(props, isSVG, skipChildren) {
|
|
|
516
534
|
classResolved = true;
|
|
517
535
|
} else if (BooleanAttributes.has(prop)) {
|
|
518
536
|
if (value) result += prop;else continue;
|
|
519
|
-
} else if (prop === "ref" || prop.slice(0, 2) === "on") {
|
|
537
|
+
} else if (value == undefined || prop === "ref" || prop.slice(0, 2) === "on") {
|
|
520
538
|
continue;
|
|
521
539
|
} else {
|
|
522
540
|
result += `${Aliases[prop] || prop}="${escape(value, true)}"`;
|
|
@@ -525,8 +543,8 @@ function ssrSpread(props, isSVG, skipChildren) {
|
|
|
525
543
|
}
|
|
526
544
|
return result;
|
|
527
545
|
}
|
|
528
|
-
function
|
|
529
|
-
return value ? " " + key : "";
|
|
546
|
+
function ssrAttribute(key, value, isBoolean) {
|
|
547
|
+
return isBoolean ? value ? " " + key : "" : value != null ? ` ${key}="${value}"` : "";
|
|
530
548
|
}
|
|
531
549
|
function ssrHydrationKey() {
|
|
532
550
|
const hk = getHydrationKey();
|
|
@@ -637,9 +655,26 @@ function waitForFragments(registry, key) {
|
|
|
637
655
|
}
|
|
638
656
|
function serializeSet(registry, key, value) {
|
|
639
657
|
const exist = registry.get(value);
|
|
640
|
-
if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0])
|
|
658
|
+
if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0])`;
|
|
641
659
|
value !== null && typeof value === "object" && registry.set(value, key);
|
|
642
|
-
return `_$HY.set("${key}", ${devalue(value)})
|
|
660
|
+
return `_$HY.set("${key}", ${devalue(value)})`;
|
|
661
|
+
}
|
|
662
|
+
function replacePlaceholder(html, key, value) {
|
|
663
|
+
const nextRegex = /(<[/]?span[^>]*>)/g;
|
|
664
|
+
const marker = `<span id="pl-${key}">`;
|
|
665
|
+
const first = html.indexOf(marker);
|
|
666
|
+
if (first === -1) return html;
|
|
667
|
+
nextRegex.lastIndex = first + marker.length;
|
|
668
|
+
let match;
|
|
669
|
+
let open = 0,
|
|
670
|
+
close = 0;
|
|
671
|
+
while (match = nextRegex.exec(html)) {
|
|
672
|
+
if (match[0][1] === "/") {
|
|
673
|
+
close++;
|
|
674
|
+
if (close > open) break;
|
|
675
|
+
} else open++;
|
|
676
|
+
}
|
|
677
|
+
return html.slice(0, first) + value + html.slice(nextRegex.lastIndex);
|
|
643
678
|
}
|
|
644
679
|
function pipeToNodeWritable(code, writable, options = {}) {
|
|
645
680
|
if (options.onReady) {
|
|
@@ -748,7 +783,7 @@ exports.renderToStringAsync = renderToStringAsync;
|
|
|
748
783
|
exports.resolveSSRNode = resolveSSRNode;
|
|
749
784
|
exports.spread = spread;
|
|
750
785
|
exports.ssr = ssr;
|
|
751
|
-
exports.
|
|
786
|
+
exports.ssrAttribute = ssrAttribute;
|
|
752
787
|
exports.ssrClassList = ssrClassList;
|
|
753
788
|
exports.ssrHydrationKey = ssrHydrationKey;
|
|
754
789
|
exports.ssrSpread = ssrSpread;
|
package/web/dist/server.js
CHANGED
|
@@ -266,8 +266,8 @@ function renderToStringAsync(code, options = {}) {
|
|
|
266
266
|
nonce,
|
|
267
267
|
writeResource(id, p, error) {
|
|
268
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}", {});`);
|
|
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
271
|
}
|
|
272
272
|
};
|
|
273
273
|
const timeout = new Promise((_, reject) => setTimeout(() => reject("renderToString timed out"), timeoutMs));
|
|
@@ -315,6 +315,7 @@ function renderToStream(code, options = {}) {
|
|
|
315
315
|
} = options;
|
|
316
316
|
const tmp = [];
|
|
317
317
|
const tasks = [];
|
|
318
|
+
const blockingResources = [];
|
|
318
319
|
const registry = new Map();
|
|
319
320
|
const dedupe = new WeakMap();
|
|
320
321
|
const checkEnd = () => {
|
|
@@ -329,6 +330,13 @@ function renderToStream(code, options = {}) {
|
|
|
329
330
|
completed = true;
|
|
330
331
|
}
|
|
331
332
|
};
|
|
333
|
+
const pushTask = task => {
|
|
334
|
+
tasks.push(task);
|
|
335
|
+
if (!scheduled) {
|
|
336
|
+
Promise.resolve().then(writeTasks);
|
|
337
|
+
scheduled = true;
|
|
338
|
+
}
|
|
339
|
+
};
|
|
332
340
|
const writeTasks = () => {
|
|
333
341
|
if (tasks.length && !completed) {
|
|
334
342
|
buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${tasks.join(";")}</script>`);
|
|
@@ -337,6 +345,7 @@ function renderToStream(code, options = {}) {
|
|
|
337
345
|
scheduled = false;
|
|
338
346
|
};
|
|
339
347
|
let writable;
|
|
348
|
+
let firstFlushed = false;
|
|
340
349
|
let completed = false;
|
|
341
350
|
let scriptFlushed = false;
|
|
342
351
|
let scheduled = true;
|
|
@@ -354,45 +363,45 @@ function renderToStream(code, options = {}) {
|
|
|
354
363
|
suspense: {},
|
|
355
364
|
assets: [],
|
|
356
365
|
nonce,
|
|
357
|
-
writeResource(id, p, error) {
|
|
358
|
-
if (
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
}
|
|
362
|
-
if (error) return tasks.push(`_$HY.set("${id}", ${serializeError(p)})`);
|
|
363
|
-
if (!p || typeof p !== "object" || !("then" in p)) return tasks.push(serializeSet(dedupe, id, p));
|
|
364
|
-
tasks.push(`_$HY.init("${id}")`);
|
|
366
|
+
writeResource(id, p, error, wait) {
|
|
367
|
+
if (error) return pushTask(`_$HY.set("${id}", ${serializeError(p)})`);
|
|
368
|
+
if (!p || typeof p !== "object" || !("then" in p)) return pushTask(serializeSet(dedupe, id, p));
|
|
369
|
+
if (wait && !firstFlushed) blockingResources.push(p);else pushTask(`_$HY.init("${id}")`);
|
|
365
370
|
p.then(d => {
|
|
366
|
-
!completed &&
|
|
371
|
+
!completed && pushTask(serializeSet(dedupe, id, d));
|
|
367
372
|
}).catch(() => {
|
|
368
|
-
!completed &&
|
|
373
|
+
!completed && pushTask(`_$HY.set("${id}", {})`);
|
|
369
374
|
});
|
|
370
375
|
},
|
|
371
376
|
registerFragment(key) {
|
|
372
|
-
registry.
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
scheduled = true;
|
|
377
|
+
if (!registry.has(key)) {
|
|
378
|
+
registry.set(key, []);
|
|
379
|
+
pushTask(`_$HY.init("${key}")`);
|
|
376
380
|
}
|
|
377
|
-
tasks.push(`_$HY.init("${key}")`);
|
|
378
381
|
return (value, error) => {
|
|
379
382
|
if (registry.has(key)) {
|
|
380
383
|
const keys = registry.get(key);
|
|
381
384
|
registry.delete(key);
|
|
382
385
|
if (waitForFragments(registry, key)) return;
|
|
383
386
|
if ((value !== undefined || error) && !completed) {
|
|
384
|
-
|
|
385
|
-
|
|
387
|
+
if (!firstFlushed) {
|
|
388
|
+
Promise.resolve().then(() => html = replacePlaceholder(html, key, value !== undefined ? value : ""));
|
|
389
|
+
pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}");`) : ""}_$HY.set("${key}",${error ? serializeError(error) : "null"})`);
|
|
390
|
+
} else {
|
|
391
|
+
buffer.write(`<div hidden id="${key}">${value !== undefined ? value : " "}</div>`);
|
|
392
|
+
pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") : ""}$df("${key}"${error ? "," + serializeError(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`);
|
|
393
|
+
scriptFlushed = true;
|
|
394
|
+
}
|
|
386
395
|
}
|
|
387
396
|
}
|
|
388
|
-
checkEnd();
|
|
397
|
+
if (firstFlushed) checkEnd();
|
|
389
398
|
return true;
|
|
390
399
|
};
|
|
391
400
|
}
|
|
392
401
|
};
|
|
393
402
|
let html = resolveSSRNode(escape(code()));
|
|
394
|
-
|
|
395
|
-
|
|
403
|
+
function doShell() {
|
|
404
|
+
html = injectAssets(sharedConfig.context.assets, html);
|
|
396
405
|
if (tasks.length) html = injectScripts(html, tasks.join(";"), nonce);
|
|
397
406
|
buffer.write(html);
|
|
398
407
|
tasks.length = 0;
|
|
@@ -402,29 +411,37 @@ function renderToStream(code, options = {}) {
|
|
|
402
411
|
!completed && buffer.write(v);
|
|
403
412
|
}
|
|
404
413
|
});
|
|
405
|
-
}
|
|
414
|
+
}
|
|
406
415
|
return {
|
|
407
416
|
pipe(w) {
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
417
|
+
Promise.allSettled(blockingResources).then(() => {
|
|
418
|
+
doShell();
|
|
419
|
+
buffer = writable = w;
|
|
420
|
+
tmp.forEach(chunk => buffer.write(chunk));
|
|
421
|
+
firstFlushed = true;
|
|
422
|
+
if (completed) writable.end();else setTimeout(checkEnd);
|
|
423
|
+
});
|
|
411
424
|
},
|
|
412
425
|
pipeTo(w) {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
426
|
+
Promise.allSettled(blockingResources).then(() => {
|
|
427
|
+
doShell();
|
|
428
|
+
const encoder = new TextEncoder();
|
|
429
|
+
const writer = w.getWriter();
|
|
430
|
+
writable = {
|
|
431
|
+
end() {
|
|
432
|
+
writer.releaseLock();
|
|
433
|
+
w.close();
|
|
434
|
+
}
|
|
435
|
+
};
|
|
436
|
+
buffer = {
|
|
437
|
+
write(payload) {
|
|
438
|
+
writer.write(encoder.encode(payload));
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
tmp.forEach(chunk => buffer.write(chunk));
|
|
442
|
+
firstFlushed = true;
|
|
443
|
+
if (completed) writable.end();else setTimeout(checkEnd);
|
|
444
|
+
});
|
|
428
445
|
}
|
|
429
446
|
};
|
|
430
447
|
}
|
|
@@ -493,9 +510,10 @@ function ssrStyle(value) {
|
|
|
493
510
|
return result;
|
|
494
511
|
}
|
|
495
512
|
function ssrSpread(props, isSVG, skipChildren) {
|
|
513
|
+
let result = "";
|
|
514
|
+
if (props == null) return results;
|
|
496
515
|
if (typeof props === "function") props = props();
|
|
497
516
|
const keys = Object.keys(props);
|
|
498
|
-
let result = "";
|
|
499
517
|
let classResolved;
|
|
500
518
|
for (let i = 0; i < keys.length; i++) {
|
|
501
519
|
const prop = keys[i];
|
|
@@ -513,7 +531,7 @@ function ssrSpread(props, isSVG, skipChildren) {
|
|
|
513
531
|
classResolved = true;
|
|
514
532
|
} else if (BooleanAttributes.has(prop)) {
|
|
515
533
|
if (value) result += prop;else continue;
|
|
516
|
-
} else if (prop === "ref" || prop.slice(0, 2) === "on") {
|
|
534
|
+
} else if (value == undefined || prop === "ref" || prop.slice(0, 2) === "on") {
|
|
517
535
|
continue;
|
|
518
536
|
} else {
|
|
519
537
|
result += `${Aliases[prop] || prop}="${escape(value, true)}"`;
|
|
@@ -522,8 +540,8 @@ function ssrSpread(props, isSVG, skipChildren) {
|
|
|
522
540
|
}
|
|
523
541
|
return result;
|
|
524
542
|
}
|
|
525
|
-
function
|
|
526
|
-
return value ? " " + key : "";
|
|
543
|
+
function ssrAttribute(key, value, isBoolean) {
|
|
544
|
+
return isBoolean ? value ? " " + key : "" : value != null ? ` ${key}="${value}"` : "";
|
|
527
545
|
}
|
|
528
546
|
function ssrHydrationKey() {
|
|
529
547
|
const hk = getHydrationKey();
|
|
@@ -634,9 +652,26 @@ function waitForFragments(registry, key) {
|
|
|
634
652
|
}
|
|
635
653
|
function serializeSet(registry, key, value) {
|
|
636
654
|
const exist = registry.get(value);
|
|
637
|
-
if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0])
|
|
655
|
+
if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0])`;
|
|
638
656
|
value !== null && typeof value === "object" && registry.set(value, key);
|
|
639
|
-
return `_$HY.set("${key}", ${devalue(value)})
|
|
657
|
+
return `_$HY.set("${key}", ${devalue(value)})`;
|
|
658
|
+
}
|
|
659
|
+
function replacePlaceholder(html, key, value) {
|
|
660
|
+
const nextRegex = /(<[/]?span[^>]*>)/g;
|
|
661
|
+
const marker = `<span id="pl-${key}">`;
|
|
662
|
+
const first = html.indexOf(marker);
|
|
663
|
+
if (first === -1) return html;
|
|
664
|
+
nextRegex.lastIndex = first + marker.length;
|
|
665
|
+
let match;
|
|
666
|
+
let open = 0,
|
|
667
|
+
close = 0;
|
|
668
|
+
while (match = nextRegex.exec(html)) {
|
|
669
|
+
if (match[0][1] === "/") {
|
|
670
|
+
close++;
|
|
671
|
+
if (close > open) break;
|
|
672
|
+
} else open++;
|
|
673
|
+
}
|
|
674
|
+
return html.slice(0, first) + value + html.slice(nextRegex.lastIndex);
|
|
640
675
|
}
|
|
641
676
|
function pipeToNodeWritable(code, writable, options = {}) {
|
|
642
677
|
if (options.onReady) {
|
|
@@ -688,4 +723,4 @@ function Portal(props) {
|
|
|
688
723
|
return "";
|
|
689
724
|
}
|
|
690
725
|
|
|
691
|
-
export { Assets, Dynamic, HydrationScript, NoHydration, Portal, escape, generateHydrationScript, getHydrationKey, isServer, pipeToNodeWritable, pipeToWritable, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, spread, ssr,
|
|
726
|
+
export { Assets, Dynamic, HydrationScript, NoHydration, Portal, escape, generateHydrationScript, getHydrationKey, isServer, pipeToNodeWritable, pipeToWritable, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, spread, ssr, ssrAttribute, ssrClassList, ssrHydrationKey, ssrSpread, ssrStyle };
|
package/web/dist/web.cjs
CHANGED
|
@@ -135,6 +135,9 @@ function setAttribute(node, name, value) {
|
|
|
135
135
|
function setAttributeNS(node, namespace, name, value) {
|
|
136
136
|
if (value == null) node.removeAttributeNS(namespace, name);else node.setAttributeNS(namespace, name, value);
|
|
137
137
|
}
|
|
138
|
+
function className(node, value) {
|
|
139
|
+
if (value == null) node.removeAttribute("class");else node.className = value;
|
|
140
|
+
}
|
|
138
141
|
function addEventListener(node, name, handler, delegate) {
|
|
139
142
|
if (delegate) {
|
|
140
143
|
if (Array.isArray(handler)) {
|
|
@@ -315,7 +318,7 @@ function assignProp(node, prop, value, prev, isSVG, skipRef) {
|
|
|
315
318
|
addEventListener(node, name, value, delegate);
|
|
316
319
|
delegate && delegateEvents([name]);
|
|
317
320
|
} else if ((isChildProp = ChildProperties.has(prop)) || !isSVG && (PropAliases[prop] || (isProp = Properties.has(prop))) || (isCE = node.nodeName.includes("-"))) {
|
|
318
|
-
if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value;else node[PropAliases[prop] || prop] = value;
|
|
321
|
+
if (prop === "class" || prop === "className") className(node, value);else if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value;else node[PropAliases[prop] || prop] = value;
|
|
319
322
|
} else {
|
|
320
323
|
const ns = isSVG && prop.indexOf(":") > -1 && SVGNamespace[prop.split(":")[0]];
|
|
321
324
|
if (ns) setAttributeNS(node, ns, prop, value);else setAttribute(node, Aliases[prop] || prop, value);
|
|
@@ -635,6 +638,7 @@ exports.SVGNamespace = SVGNamespace;
|
|
|
635
638
|
exports.addEventListener = addEventListener;
|
|
636
639
|
exports.assign = assign;
|
|
637
640
|
exports.classList = classList;
|
|
641
|
+
exports.className = className;
|
|
638
642
|
exports.clearDelegatedEvents = clearDelegatedEvents;
|
|
639
643
|
exports.delegateEvents = delegateEvents;
|
|
640
644
|
exports.dynamicProperty = dynamicProperty;
|
package/web/dist/web.js
CHANGED
|
@@ -132,6 +132,9 @@ function setAttribute(node, name, value) {
|
|
|
132
132
|
function setAttributeNS(node, namespace, name, value) {
|
|
133
133
|
if (value == null) node.removeAttributeNS(namespace, name);else node.setAttributeNS(namespace, name, value);
|
|
134
134
|
}
|
|
135
|
+
function className(node, value) {
|
|
136
|
+
if (value == null) node.removeAttribute("class");else node.className = value;
|
|
137
|
+
}
|
|
135
138
|
function addEventListener(node, name, handler, delegate) {
|
|
136
139
|
if (delegate) {
|
|
137
140
|
if (Array.isArray(handler)) {
|
|
@@ -312,7 +315,7 @@ function assignProp(node, prop, value, prev, isSVG, skipRef) {
|
|
|
312
315
|
addEventListener(node, name, value, delegate);
|
|
313
316
|
delegate && delegateEvents([name]);
|
|
314
317
|
} else if ((isChildProp = ChildProperties.has(prop)) || !isSVG && (PropAliases[prop] || (isProp = Properties.has(prop))) || (isCE = node.nodeName.includes("-"))) {
|
|
315
|
-
if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value;else node[PropAliases[prop] || prop] = value;
|
|
318
|
+
if (prop === "class" || prop === "className") className(node, value);else if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value;else node[PropAliases[prop] || prop] = value;
|
|
316
319
|
} else {
|
|
317
320
|
const ns = isSVG && prop.indexOf(":") > -1 && SVGNamespace[prop.split(":")[0]];
|
|
318
321
|
if (ns) setAttributeNS(node, ns, prop, value);else setAttribute(node, Aliases[prop] || prop, value);
|
|
@@ -568,4 +571,4 @@ function Dynamic(props) {
|
|
|
568
571
|
});
|
|
569
572
|
}
|
|
570
573
|
|
|
571
|
-
export { Aliases, Assets, ChildProperties, DOMElements, DelegatedEvents, Dynamic, Assets as HydrationScript, NoHydration, Portal, PropAliases, Properties, SVGElements, SVGNamespace, addEventListener, assign, classList, clearDelegatedEvents, delegateEvents, dynamicProperty, escape, generateHydrationScript, getHydrationKey, getNextElement, getNextMarker, getNextMatch, hydrate, innerHTML, insert, isServer, memo, render, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, runHydrationEvents, setAttribute, setAttributeNS, spread, ssr, ssrBoolean, ssrClassList, ssrHydrationKey, ssrSpread, ssrStyle, style, template };
|
|
574
|
+
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, ssrBoolean, ssrClassList, ssrHydrationKey, ssrSpread, ssrStyle, style, template };
|
package/web/types/client.d.ts
CHANGED
|
@@ -31,6 +31,7 @@ export function spread<T>(
|
|
|
31
31
|
export function assign(node: Element, props: any, isSVG?: Boolean, skipChildren?: Boolean): void;
|
|
32
32
|
export function setAttribute(node: Element, name: string, value: string): void;
|
|
33
33
|
export function setAttributeNS(node: Element, namespace: string, name: string, value: string): void;
|
|
34
|
+
export function className(node: Element, value: string): void;
|
|
34
35
|
export function innerHTML(node: Element, content: string): void;
|
|
35
36
|
export function addEventListener(
|
|
36
37
|
node: Element,
|