@stackoverflow/stacks 1.9.0 → 1.9.1

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.
Files changed (132) hide show
  1. package/README.md +161 -153
  2. package/dist/components/table/table.d.ts +26 -4
  3. package/dist/css/stacks.css +21 -6
  4. package/dist/css/stacks.min.css +1 -1
  5. package/dist/js/stacks.js +93 -64
  6. package/dist/js/stacks.min.js +1 -1
  7. package/lib/atomic/border.less +397 -397
  8. package/lib/atomic/color.less +210 -210
  9. package/lib/atomic/flex.less +426 -426
  10. package/lib/atomic/gap.less +44 -44
  11. package/lib/atomic/grid.less +139 -139
  12. package/lib/atomic/misc.less +343 -343
  13. package/lib/atomic/spacing.less +342 -342
  14. package/lib/atomic/typography.less +267 -267
  15. package/lib/atomic/width-height.less +194 -194
  16. package/lib/base/body.less +44 -44
  17. package/lib/base/configuration-static.less +61 -61
  18. package/lib/base/fieldset.less +5 -5
  19. package/lib/base/icon.less +11 -11
  20. package/lib/base/internal.less +220 -220
  21. package/lib/base/reset-meyer.less +64 -64
  22. package/lib/base/reset-normalize.less +449 -449
  23. package/lib/base/reset.less +20 -20
  24. package/lib/components/activity-indicator/activity-indicator.a11y.test.ts +21 -21
  25. package/lib/components/activity-indicator/activity-indicator.less +40 -40
  26. package/lib/components/activity-indicator/activity-indicator.visual.test.ts +23 -23
  27. package/lib/components/anchor/anchor.less +61 -61
  28. package/lib/components/avatar/avatar.a11y.test.ts +36 -36
  29. package/lib/components/avatar/avatar.less +108 -108
  30. package/lib/components/avatar/avatar.visual.test.ts +54 -54
  31. package/lib/components/award-bling/award-bling.a11y.test.ts +17 -0
  32. package/lib/components/award-bling/award-bling.less +31 -31
  33. package/lib/components/award-bling/award-bling.visual.test.ts +26 -0
  34. package/lib/components/badge/badge.less +251 -251
  35. package/lib/components/banner/banner.a11y.test.ts +37 -0
  36. package/lib/components/banner/banner.less +51 -51
  37. package/lib/components/banner/banner.test.ts +73 -77
  38. package/lib/components/banner/banner.ts +149 -149
  39. package/lib/components/banner/banner.visual.test.ts +37 -36
  40. package/lib/components/block-link/block-link.a11y.test.ts +68 -0
  41. package/lib/components/block-link/block-link.less +80 -80
  42. package/lib/components/block-link/block-link.visual.test.ts +61 -0
  43. package/lib/components/breadcrumbs/breadcrumbs.a11y.test.ts +37 -0
  44. package/lib/components/breadcrumbs/breadcrumbs.less +41 -41
  45. package/lib/components/breadcrumbs/breadcrumbs.visual.test.ts +37 -0
  46. package/lib/components/button/button.a11y.test.ts +32 -32
  47. package/lib/components/button/button.less +502 -502
  48. package/lib/components/button/button.visual.test.ts +52 -52
  49. package/lib/components/button-group/button-group.less +83 -83
  50. package/lib/components/card/card.a11y.test.ts +13 -0
  51. package/lib/components/card/card.less +29 -29
  52. package/lib/components/card/card.visual.test.ts +54 -0
  53. package/lib/components/check-control/check-control.less +17 -17
  54. package/lib/components/check-group/check-group.less +19 -19
  55. package/lib/components/checkbox_radio/checkbox_radio.less +158 -158
  56. package/lib/components/code-block/code-block.less +116 -116
  57. package/lib/components/description/description.less +9 -9
  58. package/lib/components/empty-state/empty-state.less +16 -16
  59. package/lib/components/expandable/expandable.less +118 -118
  60. package/lib/components/expandable/expandable.test.ts +51 -53
  61. package/lib/components/expandable/expandable.ts +238 -238
  62. package/lib/components/input-fill/input-fill.less +35 -35
  63. package/lib/components/input-icon/input-icon.less +45 -45
  64. package/lib/components/input-message/input-message.less +48 -48
  65. package/lib/components/input_textarea/input_textarea.less +166 -166
  66. package/lib/components/label/label.less +111 -111
  67. package/lib/components/link/link.less +119 -119
  68. package/lib/components/link-preview/link-preview.less +139 -139
  69. package/lib/components/menu/menu.less +41 -41
  70. package/lib/components/modal/modal.less +113 -113
  71. package/lib/components/modal/modal.ts +379 -379
  72. package/lib/components/navigation/navigation.less +134 -134
  73. package/lib/components/navigation/navigation.ts +128 -128
  74. package/lib/components/notice/notice.less +203 -203
  75. package/lib/components/page-title/page-title.less +51 -51
  76. package/lib/components/pagination/pagination.less +52 -52
  77. package/lib/components/popover/popover.less +148 -148
  78. package/lib/components/popover/popover.ts +651 -651
  79. package/lib/components/popover/tooltip.test.ts +62 -66
  80. package/lib/components/popover/tooltip.ts +343 -343
  81. package/lib/components/popover/tooltip.visual.test.ts +31 -31
  82. package/lib/components/post-summary/post-summary.less +415 -415
  83. package/lib/components/progress-bar/progress-bar.less +291 -291
  84. package/lib/components/prose/prose.less +452 -452
  85. package/lib/components/select/select.less +148 -148
  86. package/lib/components/sidebar-widget/sidebar-widget.less +257 -258
  87. package/lib/components/spinner/spinner.less +103 -103
  88. package/lib/components/table/table.less +307 -292
  89. package/lib/components/table/table.test.ts +366 -0
  90. package/lib/components/table/table.ts +296 -263
  91. package/lib/components/table-container/table-container.less +4 -4
  92. package/lib/components/tag/tag.less +213 -213
  93. package/lib/components/toast/toast.less +35 -35
  94. package/lib/components/toast/toast.test.ts +63 -67
  95. package/lib/components/toast/toast.ts +357 -357
  96. package/lib/components/toast/toast.visual.test.ts +27 -27
  97. package/lib/components/toggle-switch/toggle-switch.less +110 -110
  98. package/lib/components/topbar/topbar.less +436 -435
  99. package/lib/components/uploader/uploader.less +195 -195
  100. package/lib/components/uploader/uploader.ts +205 -205
  101. package/lib/components/user-card/user-card.less +129 -129
  102. package/lib/controllers.ts +33 -33
  103. package/lib/exports/constants-colors.less +1112 -1111
  104. package/lib/exports/constants-helpers.less +108 -108
  105. package/lib/exports/constants-type.less +153 -153
  106. package/lib/exports/exports.less +15 -15
  107. package/lib/exports/mixins.less +299 -299
  108. package/lib/index.ts +32 -32
  109. package/lib/input-utils.less +44 -44
  110. package/lib/stacks-dynamic.less +24 -24
  111. package/lib/stacks-static.less +93 -93
  112. package/lib/stacks.less +13 -13
  113. package/lib/stacks.ts +113 -113
  114. package/lib/test/open-wc-testing-patch.d.ts +26 -0
  115. package/lib/test/test-utils.ts +466 -444
  116. package/lib/tsconfig.build.json +4 -0
  117. package/lib/tsconfig.json +16 -13
  118. package/package.json +106 -105
  119. package/dist/components/activity-indicator/activity-indicator.a11y.test.d.ts +0 -1
  120. package/dist/components/activity-indicator/activity-indicator.visual.test.d.ts +0 -1
  121. package/dist/components/avatar/avatar.a11y.test.d.ts +0 -1
  122. package/dist/components/avatar/avatar.visual.test.d.ts +0 -1
  123. package/dist/components/banner/banner.test.d.ts +0 -1
  124. package/dist/components/banner/banner.visual.test.d.ts +0 -1
  125. package/dist/components/button/button.a11y.test.d.ts +0 -1
  126. package/dist/components/button/button.visual.test.d.ts +0 -1
  127. package/dist/components/expandable/expandable.test.d.ts +0 -1
  128. package/dist/components/popover/tooltip.test.d.ts +0 -1
  129. package/dist/components/popover/tooltip.visual.test.d.ts +0 -1
  130. package/dist/components/toast/toast.test.d.ts +0 -1
  131. package/dist/components/toast/toast.visual.test.d.ts +0 -1
  132. package/dist/test/test-utils.d.ts +0 -136
package/dist/js/stacks.js CHANGED
@@ -2515,6 +2515,7 @@ class StacksApplication extends Application {
2515
2515
  }
2516
2516
  }
2517
2517
  StacksApplication._initializing = true;
2518
+
2518
2519
  const application = StacksApplication.start();
2519
2520
  class StacksController extends Controller {
2520
2521
  getElementData(element, key) {
@@ -2652,6 +2653,7 @@ class BannerController extends StacksController {
2652
2653
  }
2653
2654
  }
2654
2655
  BannerController.targets = ["banner"];
2656
+
2655
2657
  /**
2656
2658
  * Helper to manually show an s-banner element via external JS
2657
2659
  * @param element the element the `data-controller="s-banner"` attribute is on
@@ -3127,6 +3129,7 @@ class ModalController extends StacksController {
3127
3129
  }
3128
3130
  }
3129
3131
  ModalController.targets = ["modal", "initialFocus"];
3132
+
3130
3133
  /**
3131
3134
  * Helper to manually show an s-modal element via external JS
3132
3135
  * @param element the element the `data-controller="s-modal"` attribute is on
@@ -3307,7 +3310,7 @@ var round = Math.round;
3307
3310
  function getUAString() {
3308
3311
  var uaData = navigator.userAgentData;
3309
3312
 
3310
- if (uaData != null && uaData.brands) {
3313
+ if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {
3311
3314
  return uaData.brands.map(function (item) {
3312
3315
  return item.brand + "/" + item.version;
3313
3316
  }).join(' ');
@@ -4162,10 +4165,9 @@ var unsetSides = {
4162
4165
  // Zooming can change the DPR, but it seems to report a value that will
4163
4166
  // cleanly divide the values into the appropriate subpixels.
4164
4167
 
4165
- function roundOffsetsByDPR(_ref) {
4168
+ function roundOffsetsByDPR(_ref, win) {
4166
4169
  var x = _ref.x,
4167
4170
  y = _ref.y;
4168
- var win = window;
4169
4171
  var dpr = win.devicePixelRatio || 1;
4170
4172
  return {
4171
4173
  x: round(x * dpr) / dpr || 0,
@@ -4248,7 +4250,7 @@ function mapToStyles(_ref2) {
4248
4250
  var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
4249
4251
  x: x,
4250
4252
  y: y
4251
- }) : {
4253
+ }, getWindow(popper)) : {
4252
4254
  x: x,
4253
4255
  y: y
4254
4256
  };
@@ -5591,6 +5593,7 @@ class PopoverController extends BasePopoverController {
5591
5593
  }
5592
5594
  }
5593
5595
  PopoverController.targets = [];
5596
+
5594
5597
  /**
5595
5598
  * Helper to manually show an s-popover element via external JS
5596
5599
  * @param element the element the `data-controller="s-popover"` attribute is on
@@ -5742,37 +5745,52 @@ function toggleController(el, controllerName, include) {
5742
5745
 
5743
5746
  ;// CONCATENATED MODULE: ./lib/components/table/table.ts
5744
5747
 
5748
+ /**
5749
+ * The string values of these enumerations should correspond with `aria-sort` valid values.
5750
+ *
5751
+ * @see https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-sort#values
5752
+ */
5753
+ var SortOrder;
5754
+ (function (SortOrder) {
5755
+ SortOrder["Ascending"] = "ascending";
5756
+ SortOrder["Descending"] = "descending";
5757
+ SortOrder["None"] = "none";
5758
+ })(SortOrder || (SortOrder = {}));
5745
5759
  class TableController extends StacksController {
5746
- setCurrentSort(headElem, direction) {
5747
- if (["asc", "desc", "none"].indexOf(direction) < 0) {
5748
- throw "direction must be one of asc, desc, or none";
5749
- }
5750
- // eslint-disable-next-line @typescript-eslint/no-this-alias
5751
- const controller = this;
5752
- this.columnTargets.forEach(function (target) {
5753
- const isCurrrent = target === headElem;
5754
- target.classList.toggle("is-sorted", isCurrrent && direction !== "none");
5755
- target
5756
- .querySelectorAll(".js-sorting-indicator")
5757
- .forEach(function (icon) {
5758
- const visible = isCurrrent ? direction : "none";
5759
- icon.classList.toggle("d-none", !icon.classList.contains("js-sorting-indicator-" + visible));
5760
+ constructor() {
5761
+ super(...arguments);
5762
+ this.updateSortedColumnStyles = (targetColumnHeader, direction) => {
5763
+ // Loop through all sortable columns and remove their sorting direction
5764
+ // (if any), and only leave/set a sorting on `targetColumnHeader`.
5765
+ this.columnTargets.forEach((header) => {
5766
+ const isCurrent = header === targetColumnHeader;
5767
+ const classSuffix = isCurrent
5768
+ ? direction === SortOrder.Ascending
5769
+ ? "asc"
5770
+ : "desc"
5771
+ : SortOrder.None;
5772
+ header.classList.toggle("is-sorted", isCurrent && direction !== SortOrder.None);
5773
+ header.querySelectorAll(".js-sorting-indicator").forEach((icon) => {
5774
+ icon.classList.toggle("d-none", !icon.classList.contains("js-sorting-indicator-" + classSuffix));
5775
+ });
5776
+ if (isCurrent) {
5777
+ header.setAttribute("aria-sort", direction);
5778
+ }
5779
+ else {
5780
+ header.removeAttribute("aria-sort");
5781
+ }
5760
5782
  });
5761
- if (!isCurrrent || direction === "none") {
5762
- controller.removeElementData(target, "sort-direction");
5763
- }
5764
- else {
5765
- controller.setElementData(target, "sort-direction", direction);
5766
- }
5767
- });
5783
+ };
5768
5784
  }
5769
5785
  sort(evt) {
5770
5786
  // eslint-disable-next-line @typescript-eslint/no-this-alias
5771
5787
  const controller = this;
5772
- const colHead = evt.currentTarget;
5773
- if (!(colHead instanceof HTMLTableCellElement)) {
5774
- throw "invalid event target";
5775
- }
5788
+ const sortTriggerEl = evt.currentTarget;
5789
+ // TODO: support *only* button as trigger in next major release
5790
+ const triggerIsButton = sortTriggerEl instanceof HTMLButtonElement;
5791
+ // the below conditional is here for backward compatibility with the old API
5792
+ // where we did not advise buttons as sortable column head triggers
5793
+ const colHead = (triggerIsButton ? sortTriggerEl.parentElement : sortTriggerEl);
5776
5794
  const table = this.element;
5777
5795
  const tbody = table.tBodies[0];
5778
5796
  // the column slot number of the clicked header
@@ -5786,7 +5804,7 @@ class TableController extends StacksController {
5786
5804
  const slotIndex = buildIndex(tbody);
5787
5805
  // the default behavior when clicking a header is to sort by this column in ascending
5788
5806
  // direction, *unless* it is already sorted that way
5789
- const direction = this.getElementData(colHead, "sort-direction") === "asc" ? -1 : 1;
5807
+ const direction = colHead.getAttribute("aria-sort") === SortOrder.Ascending ? -1 : 1;
5790
5808
  const rows = Array.from(table.tBodies[0].rows);
5791
5809
  // if this is still false after traversing the data, that means all values are integers (or empty)
5792
5810
  // and thus we'll sort numerically.
@@ -5814,9 +5832,7 @@ class TableController extends StacksController {
5814
5832
  // unless the to-be-sorted-by value is explicitly provided on the element via this attribute,
5815
5833
  // the value we're using is the cell's text, trimmed of any whitespace
5816
5834
  const explicit = controller.getElementData(cell, "sort-val");
5817
- const d = typeof explicit === "string"
5818
- ? explicit
5819
- : (_b = (_a = cell.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : "";
5835
+ const d = (_b = explicit !== null && explicit !== void 0 ? explicit : (_a = cell.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : "";
5820
5836
  if (d !== "" && `${parseInt(d, 10)}` !== d) {
5821
5837
  anyNonInt = true;
5822
5838
  }
@@ -5850,9 +5866,9 @@ class TableController extends StacksController {
5850
5866
  }
5851
5867
  });
5852
5868
  // this is the actual reordering of the table rows
5853
- data.forEach(function (tup) {
5869
+ data.forEach(([_, rowIndex]) => {
5854
5870
  var _a;
5855
- const row = rows[tup[1]];
5871
+ const row = rows[rowIndex];
5856
5872
  (_a = row.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(row);
5857
5873
  if (firstBottomRow) {
5858
5874
  tbody.insertBefore(row, firstBottomRow);
@@ -5863,43 +5879,57 @@ class TableController extends StacksController {
5863
5879
  });
5864
5880
  // update the UI and set the `data-sort-direction` attribute if appropriate, so that the next click
5865
5881
  // will cause sorting in descending direction
5866
- this.setCurrentSort(colHead, direction === 1 ? "asc" : "desc");
5882
+ this.updateSortedColumnStyles(colHead, direction === 1 ? SortOrder.Ascending : SortOrder.Descending);
5867
5883
  }
5868
5884
  }
5869
5885
  TableController.targets = ["column"];
5886
+
5887
+ /**
5888
+ * @internal This function is exported for testing purposes but is not a part of our public API
5889
+ *
5890
+ * @param section
5891
+ */
5870
5892
  function buildIndex(section) {
5871
5893
  const result = buildIndexOrGetCellSlot(section);
5872
- if (!(result instanceof Array)) {
5894
+ if (!Array.isArray(result)) {
5873
5895
  throw "shouldn't happen";
5874
5896
  }
5875
5897
  return result;
5876
5898
  }
5899
+ /**
5900
+ * @internal This function is exported for testing purposes but is not a part of our public API
5901
+ *
5902
+ * @param cell
5903
+ */
5877
5904
  function getCellSlot(cell) {
5878
- if (!(cell.parentElement &&
5879
- cell.parentElement.parentElement instanceof HTMLTableSectionElement)) {
5905
+ var _a;
5906
+ const tableElement = (_a = cell.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement;
5907
+ if (!(tableElement instanceof HTMLTableSectionElement)) {
5880
5908
  throw "invalid table";
5881
5909
  }
5882
- const result = buildIndexOrGetCellSlot(cell.parentElement.parentElement, cell);
5910
+ const result = buildIndexOrGetCellSlot(tableElement, cell);
5883
5911
  if (typeof result !== "number") {
5884
5912
  throw "shouldn't happen";
5885
5913
  }
5886
5914
  return result;
5887
5915
  }
5888
- // Just because a <td> is the 4th *child* of its <tr> doesn't mean it belongs to the 4th *column*
5889
- // of the table. Previous cells may have a colspan; cells in previous rows may have a rowspan.
5890
- // Because we need to know which header cells and data cells belong together, we have to 1) find out
5891
- // which column number (or "slot" as we call it here) the header cell has, and 2) for each row find
5892
- // out which <td> cell corresponds to this slot (because those are the rows we're sorting by).
5893
- //
5894
- // That's what the following function does. If the second argument is not given, it returns an index
5895
- // of the table, which is an array of arrays. Each of the sub-arrays corresponds to a table row. The
5896
- // indices of the sub-array correspond to column slots; the values are the actual table cell elements.
5897
- // For example index[4][3] is the <td> or <th> in row 4, column 3 of the table section (<tbody> or <thead>).
5898
- // Note that this element is not necessarily even in the 4th (zero-based) <tr> -- if it has a rowSpan > 1,
5899
- // it may also be in a previous <tr>.
5900
- //
5901
- // If the second argument is given, it's a <td> or <th> that we're trying to find, and the algorithm
5902
- // stops as soon as it has found it and the function returns its slot number.
5916
+ /**
5917
+ * Just because a <td> is the 4th *child* of its <tr> doesn't mean it belongs to the 4th *column*
5918
+ * of the table. Previous cells may have a colspan; cells in previous rows may have a rowspan.
5919
+ * Because we need to know which header cells and data cells belong together, we have to 1) find out
5920
+ * which column number (or "slot" as we call it here) the header cell has, and 2) for each row find
5921
+ * out which <td> cell corresponds to this slot (because those are the rows we're sorting by).
5922
+ *
5923
+ * That's what the following function does. If the second argument is not given, it returns an index
5924
+ * of the table, which is an array of arrays. Each of the sub-arrays corresponds to a table row. The
5925
+ * indices of the sub-array correspond to column slots; the values are the actual table cell elements.
5926
+ * For example index[4][3] is the <td> or <th> in row 4, column 3 of the table section (<tbody> or <thead>).
5927
+ * Note that this element is not necessarily even in the 4th (zero-based) <tr> -- if it has a rowSpan > 1,
5928
+ * it may also be in a previous <tr>.
5929
+ *
5930
+ * If the second argument is given, it's a <td> or <th> that we're trying to find, and the algorithm
5931
+ * stops as soon as it has found it and the function returns its slot number.
5932
+ */
5903
5933
  function buildIndexOrGetCellSlot(section, findCell) {
5904
5934
  const index = [];
5905
5935
  let curRow = section.children[0];
@@ -5909,21 +5939,18 @@ function buildIndexOrGetCellSlot(section, findCell) {
5909
5939
  const growing = [];
5910
5940
  const growingRowsLeft = [];
5911
5941
  // continue while we have actual <tr>'s left *or* we still have rowspan'ed elements that aren't done
5912
- while (curRow ||
5913
- growingRowsLeft.some(function (e) {
5914
- return e !== 0;
5915
- })) {
5942
+ while (curRow || growingRowsLeft.some((e) => e !== 0)) {
5916
5943
  const curIndexRow = [];
5917
5944
  index.push(curIndexRow);
5918
5945
  let curSlot = 0;
5919
5946
  if (curRow) {
5920
- for (let curCellInd = 0; curCellInd < curRow.children.length; curCellInd++) {
5947
+ for (let curCellIdx = 0; curCellIdx < curRow.children.length; curCellIdx++) {
5921
5948
  while (growingRowsLeft[curSlot]) {
5922
5949
  growingRowsLeft[curSlot]--;
5923
5950
  curIndexRow[curSlot] = growing[curSlot];
5924
5951
  curSlot++;
5925
5952
  }
5926
- const cell = curRow.children[curCellInd];
5953
+ const cell = curRow.children[curCellIdx];
5927
5954
  if (!(cell instanceof HTMLTableCellElement)) {
5928
5955
  throw "invalid table";
5929
5956
  }
@@ -5952,9 +5979,8 @@ function buildIndexOrGetCellSlot(section, findCell) {
5952
5979
  curRow = curRow.nextElementSibling;
5953
5980
  }
5954
5981
  }
5955
- return findCell
5956
- ? -1
5957
- : index; /* if findCell was given but we end up here, that means it isn't in this section */
5982
+ // if findCell was given, but we end up here, that means it isn't in this section
5983
+ return findCell ? -1 : index;
5958
5984
  }
5959
5985
 
5960
5986
  ;// CONCATENATED MODULE: ./lib/components/toast/toast.ts
@@ -6188,6 +6214,7 @@ class ToastController extends StacksController {
6188
6214
  }
6189
6215
  }
6190
6216
  ToastController.targets = ["toast", "initialFocus"];
6217
+
6191
6218
  /**
6192
6219
  * Helper to manually show an s-toast element via external JS
6193
6220
  * @param element the element the `data-controller="s-toast"` attribute is on
@@ -6426,6 +6453,7 @@ class TooltipController extends BasePopoverController {
6426
6453
  }
6427
6454
  }
6428
6455
  TooltipController.targets = [];
6456
+
6429
6457
  /**
6430
6458
  * Adds or updates a Stacks tooltip on a given element, initializing the controller if necessary
6431
6459
  * @param element The element to add a tooltip to.
@@ -6631,6 +6659,7 @@ UploaderController.targets = ["input", "previews", "uploader"];
6631
6659
  UploaderController.FILE_DISPLAY_LIMIT = 10;
6632
6660
  UploaderController.MAX_FILE_SIZE = 1024 * 1024 * 10; // 10 MB
6633
6661
 
6662
+
6634
6663
  ;// CONCATENATED MODULE: ./lib/controllers.ts
6635
6664
  // export all controllers *with helpers* so they can be bulk re-exported by the package entry point
6636
6665