@b9g/crank 0.7.7 → 0.7.8

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/crank.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /// <reference types="crank.d.ts" />
2
2
  import { removeEventTargetDelegates, addEventTargetDelegates, clearEventListeners, CustomEventTarget } from './event-target.js';
3
- import { isPromiseLike, unwrap, wrap, arrayify, safeRace, isIteratorLike } from './_utils.js';
3
+ import { markStart, isPromiseLike, measureMark, unwrap, wrap, arrayify, safeRace, isIteratorLike } from './_utils.js';
4
4
 
5
5
  const NOOP = () => { };
6
6
  function getTagName(tag) {
@@ -425,11 +425,16 @@ function getRootRetainer(renderer, bridge, { children, root, hydrate, }) {
425
425
  return ret;
426
426
  }
427
427
  function renderRoot(adapter, root, ret, children) {
428
+ const commitLabel = "commit (" + getTagName(ret.el.tag) + ")";
429
+ markStart("diff");
428
430
  const diff = diffChildren(adapter, root, ret, ret.ctx, ret.scope, ret, children);
429
431
  const schedulePromises = [];
430
432
  if (isPromiseLike(diff)) {
431
433
  return diff.then(() => {
434
+ measureMark("diff");
435
+ markStart(commitLabel);
432
436
  commit(adapter, ret, ret, ret.ctx, ret.scope, root, 0, schedulePromises, undefined);
437
+ measureMark(commitLabel);
433
438
  if (schedulePromises.length > 0) {
434
439
  return Promise.all(schedulePromises).then(() => {
435
440
  if (typeof root !== "object" || root === null) {
@@ -444,7 +449,10 @@ function renderRoot(adapter, root, ret, children) {
444
449
  return adapter.read(unwrap(getChildValues(ret)));
445
450
  });
446
451
  }
452
+ measureMark("diff");
453
+ markStart(commitLabel);
447
454
  commit(adapter, ret, ret, ret.ctx, ret.scope, root, 0, schedulePromises, undefined);
455
+ measureMark(commitLabel);
448
456
  if (schedulePromises.length > 0) {
449
457
  return Promise.all(schedulePromises).then(() => {
450
458
  if (typeof root !== "object" || root === null) {
@@ -1546,6 +1554,7 @@ class Context extends CustomEventTarget {
1546
1554
  if (getFlag(ctx.ret, IsScheduling)) {
1547
1555
  setFlag(ctx.ret, IsSchedulingRefresh);
1548
1556
  }
1557
+ const commitLabel = "commit (" + getTagName(ctx.ret.el.tag) + ")";
1549
1558
  let diff;
1550
1559
  const schedulePromises = [];
1551
1560
  try {
@@ -1553,7 +1562,12 @@ class Context extends CustomEventTarget {
1553
1562
  diff = enqueueComponent(ctx);
1554
1563
  if (isPromiseLike(diff)) {
1555
1564
  return diff
1556
- .then(() => ctx.adapter.read(commitComponent(ctx, schedulePromises)))
1565
+ .then(() => {
1566
+ markStart(commitLabel);
1567
+ const value = commitComponent(ctx, schedulePromises);
1568
+ measureMark(commitLabel);
1569
+ return ctx.adapter.read(value);
1570
+ })
1557
1571
  .then((result) => {
1558
1572
  if (schedulePromises.length) {
1559
1573
  return Promise.all(schedulePromises).then(() => {
@@ -1583,7 +1597,9 @@ class Context extends CustomEventTarget {
1583
1597
  })
1584
1598
  .finally(() => setFlag(ctx.ret, IsRefreshing, false));
1585
1599
  }
1600
+ markStart(commitLabel);
1586
1601
  const result = ctx.adapter.read(commitComponent(ctx, schedulePromises));
1602
+ measureMark(commitLabel);
1587
1603
  if (schedulePromises.length) {
1588
1604
  return Promise.all(schedulePromises).then(() => {
1589
1605
  return ctx.adapter.read(getValue(ctx.ret));
@@ -1813,11 +1829,13 @@ function runComponent(ctx) {
1813
1829
  }
1814
1830
  const ret = ctx.ret;
1815
1831
  const initial = !ctx.iterator;
1832
+ const tagName = getTagName(ret.el.tag);
1816
1833
  if (initial) {
1817
1834
  setFlag(ctx.ret, IsExecuting);
1818
1835
  clearEventListeners(ctx.ctx);
1819
1836
  let returned;
1820
1837
  try {
1838
+ markStart(tagName);
1821
1839
  returned = ret.el.tag.call(ctx.ctx, ret.el.props, ctx.ctx);
1822
1840
  }
1823
1841
  catch (err) {
@@ -1832,6 +1850,7 @@ function runComponent(ctx) {
1832
1850
  }
1833
1851
  else if (!isPromiseLike(returned)) {
1834
1852
  // sync function component
1853
+ measureMark(tagName);
1835
1854
  return [
1836
1855
  undefined,
1837
1856
  diffComponentChildren(ctx, returned, false),
@@ -1840,6 +1859,7 @@ function runComponent(ctx) {
1840
1859
  else {
1841
1860
  // async function component
1842
1861
  const returned1 = returned instanceof Promise ? returned : Promise.resolve(returned);
1862
+ returned1.then(() => measureMark(tagName), () => measureMark(tagName));
1843
1863
  return [
1844
1864
  returned1.catch(NOOP),
1845
1865
  returned1.then((returned) => diffComponentChildren(ctx, returned, false), (err) => {
@@ -1853,6 +1873,7 @@ function runComponent(ctx) {
1853
1873
  if (initial) {
1854
1874
  try {
1855
1875
  setFlag(ctx.ret, IsExecuting);
1876
+ markStart(tagName);
1856
1877
  iteration = ctx.iterator.next();
1857
1878
  }
1858
1879
  catch (err) {
@@ -1875,7 +1896,9 @@ function runComponent(ctx) {
1875
1896
  try {
1876
1897
  setFlag(ctx.ret, IsExecuting);
1877
1898
  const oldResult = ctx.adapter.read(getValue(ctx.ret));
1899
+ markStart(tagName);
1878
1900
  iteration = ctx.iterator.next(oldResult);
1901
+ measureMark(tagName);
1879
1902
  }
1880
1903
  catch (err) {
1881
1904
  setFlag(ctx.ret, IsErrored);
@@ -1885,6 +1908,9 @@ function runComponent(ctx) {
1885
1908
  setFlag(ctx.ret, IsExecuting, false);
1886
1909
  }
1887
1910
  }
1911
+ else {
1912
+ measureMark(tagName);
1913
+ }
1888
1914
  if (isPromiseLike(iteration)) {
1889
1915
  throw new Error("Mixed generator component");
1890
1916
  }
@@ -1907,6 +1933,7 @@ function runComponent(ctx) {
1907
1933
  else {
1908
1934
  if (getFlag(ctx.ret, IsInForAwaitOfLoop)) {
1909
1935
  // initializes the async generator loop
1936
+ measureMark(tagName);
1910
1937
  pullComponent(ctx, iteration);
1911
1938
  const block = resumePropsAsyncIterator(ctx);
1912
1939
  return [block, ctx.pull && ctx.pull.diff];
@@ -1919,6 +1946,7 @@ function runComponent(ctx) {
1919
1946
  try {
1920
1947
  setFlag(ctx.ret, IsExecuting);
1921
1948
  const oldResult = ctx.adapter.read(getValue(ctx.ret));
1949
+ markStart(tagName);
1922
1950
  iteration = ctx.iterator.next(oldResult);
1923
1951
  }
1924
1952
  catch (err) {
@@ -1932,6 +1960,7 @@ function runComponent(ctx) {
1932
1960
  if (!isPromiseLike(iteration)) {
1933
1961
  throw new Error("Mixed generator component");
1934
1962
  }
1963
+ iteration.then(() => measureMark(tagName), () => measureMark(tagName));
1935
1964
  const diff = iteration.then((iteration) => {
1936
1965
  if (getFlag(ctx.ret, IsInForAwaitOfLoop)) {
1937
1966
  // We have entered a for await...of loop, so we start pulling
@@ -2326,7 +2355,7 @@ async function unmountComponent(ctx, isNested) {
2326
2355
  }
2327
2356
  }
2328
2357
  let didLinger = false;
2329
- if (!isNested && cleanupPromises && getChildValues(ctx.ret).length > 0) {
2358
+ if (!isNested && cleanupPromises) {
2330
2359
  didLinger = true;
2331
2360
  const index = ctx.index;
2332
2361
  const lingerers = ctx.host.lingerers || (ctx.host.lingerers = []);