@b9g/crank 0.7.7 → 0.7.9

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.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { CustomEventTarget } from "./event-target.js";
2
+ import { setProfiling } from "./_utils.js";
2
3
  /**
3
4
  * A type which represents all valid values for an element tag.
4
5
  */
@@ -726,6 +727,7 @@ declare global {
726
727
  * Some JSX tools expect things like createElement/Fragment to be defined on
727
728
  * the default export. Prefer using the named exports directly.
728
729
  */
730
+ export { setProfiling };
729
731
  declare const _default: {
730
732
  createElement: typeof createElement;
731
733
  Fragment: string;
package/crank.js CHANGED
@@ -1,6 +1,7 @@
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 { isPromiseLike, unwrap, wrap, arrayify, safeRace, markStart, measureMark, isIteratorLike } from './_utils.js';
4
+ export { setProfiling } from './_utils.js';
4
5
 
5
6
  const NOOP = () => { };
6
7
  function getTagName(tag) {
@@ -425,11 +426,16 @@ function getRootRetainer(renderer, bridge, { children, root, hydrate, }) {
425
426
  return ret;
426
427
  }
427
428
  function renderRoot(adapter, root, ret, children) {
429
+ const commitLabel = "commit (" + getTagName(ret.el.tag) + ")";
430
+ markStart("diff");
428
431
  const diff = diffChildren(adapter, root, ret, ret.ctx, ret.scope, ret, children);
429
432
  const schedulePromises = [];
430
433
  if (isPromiseLike(diff)) {
431
434
  return diff.then(() => {
435
+ measureMark("diff");
436
+ markStart(commitLabel);
432
437
  commit(adapter, ret, ret, ret.ctx, ret.scope, root, 0, schedulePromises, undefined);
438
+ measureMark(commitLabel);
433
439
  if (schedulePromises.length > 0) {
434
440
  return Promise.all(schedulePromises).then(() => {
435
441
  if (typeof root !== "object" || root === null) {
@@ -444,7 +450,10 @@ function renderRoot(adapter, root, ret, children) {
444
450
  return adapter.read(unwrap(getChildValues(ret)));
445
451
  });
446
452
  }
453
+ measureMark("diff");
454
+ markStart(commitLabel);
447
455
  commit(adapter, ret, ret, ret.ctx, ret.scope, root, 0, schedulePromises, undefined);
456
+ measureMark(commitLabel);
448
457
  if (schedulePromises.length > 0) {
449
458
  return Promise.all(schedulePromises).then(() => {
450
459
  if (typeof root !== "object" || root === null) {
@@ -1546,6 +1555,7 @@ class Context extends CustomEventTarget {
1546
1555
  if (getFlag(ctx.ret, IsScheduling)) {
1547
1556
  setFlag(ctx.ret, IsSchedulingRefresh);
1548
1557
  }
1558
+ const commitLabel = "commit (" + getTagName(ctx.ret.el.tag) + ")";
1549
1559
  let diff;
1550
1560
  const schedulePromises = [];
1551
1561
  try {
@@ -1553,7 +1563,12 @@ class Context extends CustomEventTarget {
1553
1563
  diff = enqueueComponent(ctx);
1554
1564
  if (isPromiseLike(diff)) {
1555
1565
  return diff
1556
- .then(() => ctx.adapter.read(commitComponent(ctx, schedulePromises)))
1566
+ .then(() => {
1567
+ markStart(commitLabel);
1568
+ const value = commitComponent(ctx, schedulePromises);
1569
+ measureMark(commitLabel);
1570
+ return ctx.adapter.read(value);
1571
+ })
1557
1572
  .then((result) => {
1558
1573
  if (schedulePromises.length) {
1559
1574
  return Promise.all(schedulePromises).then(() => {
@@ -1583,7 +1598,9 @@ class Context extends CustomEventTarget {
1583
1598
  })
1584
1599
  .finally(() => setFlag(ctx.ret, IsRefreshing, false));
1585
1600
  }
1601
+ markStart(commitLabel);
1586
1602
  const result = ctx.adapter.read(commitComponent(ctx, schedulePromises));
1603
+ measureMark(commitLabel);
1587
1604
  if (schedulePromises.length) {
1588
1605
  return Promise.all(schedulePromises).then(() => {
1589
1606
  return ctx.adapter.read(getValue(ctx.ret));
@@ -1813,11 +1830,13 @@ function runComponent(ctx) {
1813
1830
  }
1814
1831
  const ret = ctx.ret;
1815
1832
  const initial = !ctx.iterator;
1833
+ const tagName = getTagName(ret.el.tag);
1816
1834
  if (initial) {
1817
1835
  setFlag(ctx.ret, IsExecuting);
1818
1836
  clearEventListeners(ctx.ctx);
1819
1837
  let returned;
1820
1838
  try {
1839
+ markStart(tagName);
1821
1840
  returned = ret.el.tag.call(ctx.ctx, ret.el.props, ctx.ctx);
1822
1841
  }
1823
1842
  catch (err) {
@@ -1832,6 +1851,7 @@ function runComponent(ctx) {
1832
1851
  }
1833
1852
  else if (!isPromiseLike(returned)) {
1834
1853
  // sync function component
1854
+ measureMark(tagName);
1835
1855
  return [
1836
1856
  undefined,
1837
1857
  diffComponentChildren(ctx, returned, false),
@@ -1840,6 +1860,7 @@ function runComponent(ctx) {
1840
1860
  else {
1841
1861
  // async function component
1842
1862
  const returned1 = returned instanceof Promise ? returned : Promise.resolve(returned);
1863
+ returned1.then(() => measureMark(tagName), () => measureMark(tagName));
1843
1864
  return [
1844
1865
  returned1.catch(NOOP),
1845
1866
  returned1.then((returned) => diffComponentChildren(ctx, returned, false), (err) => {
@@ -1853,6 +1874,7 @@ function runComponent(ctx) {
1853
1874
  if (initial) {
1854
1875
  try {
1855
1876
  setFlag(ctx.ret, IsExecuting);
1877
+ markStart(tagName);
1856
1878
  iteration = ctx.iterator.next();
1857
1879
  }
1858
1880
  catch (err) {
@@ -1875,7 +1897,9 @@ function runComponent(ctx) {
1875
1897
  try {
1876
1898
  setFlag(ctx.ret, IsExecuting);
1877
1899
  const oldResult = ctx.adapter.read(getValue(ctx.ret));
1900
+ markStart(tagName);
1878
1901
  iteration = ctx.iterator.next(oldResult);
1902
+ measureMark(tagName);
1879
1903
  }
1880
1904
  catch (err) {
1881
1905
  setFlag(ctx.ret, IsErrored);
@@ -1885,6 +1909,9 @@ function runComponent(ctx) {
1885
1909
  setFlag(ctx.ret, IsExecuting, false);
1886
1910
  }
1887
1911
  }
1912
+ else {
1913
+ measureMark(tagName);
1914
+ }
1888
1915
  if (isPromiseLike(iteration)) {
1889
1916
  throw new Error("Mixed generator component");
1890
1917
  }
@@ -1907,6 +1934,7 @@ function runComponent(ctx) {
1907
1934
  else {
1908
1935
  if (getFlag(ctx.ret, IsInForAwaitOfLoop)) {
1909
1936
  // initializes the async generator loop
1937
+ measureMark(tagName);
1910
1938
  pullComponent(ctx, iteration);
1911
1939
  const block = resumePropsAsyncIterator(ctx);
1912
1940
  return [block, ctx.pull && ctx.pull.diff];
@@ -1919,6 +1947,7 @@ function runComponent(ctx) {
1919
1947
  try {
1920
1948
  setFlag(ctx.ret, IsExecuting);
1921
1949
  const oldResult = ctx.adapter.read(getValue(ctx.ret));
1950
+ markStart(tagName);
1922
1951
  iteration = ctx.iterator.next(oldResult);
1923
1952
  }
1924
1953
  catch (err) {
@@ -1932,6 +1961,7 @@ function runComponent(ctx) {
1932
1961
  if (!isPromiseLike(iteration)) {
1933
1962
  throw new Error("Mixed generator component");
1934
1963
  }
1964
+ iteration.then(() => measureMark(tagName), () => measureMark(tagName));
1935
1965
  const diff = iteration.then((iteration) => {
1936
1966
  if (getFlag(ctx.ret, IsInForAwaitOfLoop)) {
1937
1967
  // We have entered a for await...of loop, so we start pulling
@@ -2326,7 +2356,7 @@ async function unmountComponent(ctx, isNested) {
2326
2356
  }
2327
2357
  }
2328
2358
  let didLinger = false;
2329
- if (!isNested && cleanupPromises && getChildValues(ctx.ret).length > 0) {
2359
+ if (!isNested && cleanupPromises) {
2330
2360
  didLinger = true;
2331
2361
  const index = ctx.index;
2332
2362
  const lingerers = ctx.host.lingerers || (ctx.host.lingerers = []);
@@ -2503,12 +2533,6 @@ function propagateError(ctx, err, schedulePromises) {
2503
2533
  }
2504
2534
  commitComponent(parent, schedulePromises);
2505
2535
  }
2506
- /**
2507
- * A re-export of some Crank exports as the default export.
2508
- *
2509
- * Some JSX tools expect things like createElement/Fragment to be defined on
2510
- * the default export. Prefer using the named exports directly.
2511
- */
2512
2536
  var crank = { createElement, Fragment };
2513
2537
 
2514
2538
  export { Context, Copy, Element, Fragment, Portal, Raw, Renderer, Text, cloneElement, createElement, crank as default, isElement };