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.
@@ -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 (!scheduled) {
362
- Promise.resolve().then(writeTasks);
363
- scheduled = true;
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 && buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${serializeSet(dedupe, id, d)}</script>`);
374
+ !completed && pushTask(serializeSet(dedupe, id, d));
370
375
  }).catch(() => {
371
- !completed && buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>_$HY.set("${id}", {})</script>`);
376
+ !completed && pushTask(`_$HY.set("${id}", {})`);
372
377
  });
373
378
  },
374
379
  registerFragment(key) {
375
- registry.set(key, []);
376
- if (!scheduled) {
377
- Promise.resolve().then(writeTasks);
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
- buffer.write(`<div hidden id="${key}">${value !== undefined ? value : " "}</div><script${nonce ? ` nonce="${nonce}"` : ""}>${!scriptFlushed ? REPLACE_SCRIPT : ""}${keys.length ? keys.map(k => `_$HY.unset("${k}");`) : ""}$df("${key}"${error ? "," + serializeError(error) : ""})</script>`);
388
- scriptFlushed = true;
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
- html = injectAssets(solidJs.sharedConfig.context.assets, html);
398
- Promise.resolve().then(() => {
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
- buffer = writable = w;
412
- tmp.forEach(chunk => buffer.write(chunk));
413
- if (completed) writable.end();else setTimeout(checkEnd);
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
- const encoder = new TextEncoder();
417
- const writer = w.getWriter();
418
- writable = {
419
- end() {
420
- writer.releaseLock();
421
- w.close();
422
- }
423
- };
424
- buffer = {
425
- write(payload) {
426
- writer.write(encoder.encode(payload));
427
- }
428
- };
429
- tmp.forEach(chunk => buffer.write(chunk));
430
- if (completed) writable.end();else setTimeout(checkEnd);
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 ssrBoolean(key, value) {
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.ssrBoolean = ssrBoolean;
786
+ exports.ssrAttribute = ssrAttribute;
752
787
  exports.ssrClassList = ssrClassList;
753
788
  exports.ssrHydrationKey = ssrHydrationKey;
754
789
  exports.ssrSpread = ssrSpread;
@@ -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 (!scheduled) {
359
- Promise.resolve().then(writeTasks);
360
- scheduled = true;
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 && buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${serializeSet(dedupe, id, d)}</script>`);
371
+ !completed && pushTask(serializeSet(dedupe, id, d));
367
372
  }).catch(() => {
368
- !completed && buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>_$HY.set("${id}", {})</script>`);
373
+ !completed && pushTask(`_$HY.set("${id}", {})`);
369
374
  });
370
375
  },
371
376
  registerFragment(key) {
372
- registry.set(key, []);
373
- if (!scheduled) {
374
- Promise.resolve().then(writeTasks);
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
- buffer.write(`<div hidden id="${key}">${value !== undefined ? value : " "}</div><script${nonce ? ` nonce="${nonce}"` : ""}>${!scriptFlushed ? REPLACE_SCRIPT : ""}${keys.length ? keys.map(k => `_$HY.unset("${k}");`) : ""}$df("${key}"${error ? "," + serializeError(error) : ""})</script>`);
385
- scriptFlushed = true;
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
- html = injectAssets(sharedConfig.context.assets, html);
395
- Promise.resolve().then(() => {
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
- buffer = writable = w;
409
- tmp.forEach(chunk => buffer.write(chunk));
410
- if (completed) writable.end();else setTimeout(checkEnd);
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
- const encoder = new TextEncoder();
414
- const writer = w.getWriter();
415
- writable = {
416
- end() {
417
- writer.releaseLock();
418
- w.close();
419
- }
420
- };
421
- buffer = {
422
- write(payload) {
423
- writer.write(encoder.encode(payload));
424
- }
425
- };
426
- tmp.forEach(chunk => buffer.write(chunk));
427
- if (completed) writable.end();else setTimeout(checkEnd);
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 ssrBoolean(key, value) {
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, ssrBoolean, ssrClassList, ssrHydrationKey, ssrSpread, ssrStyle };
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 };
@@ -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,