@wise/dynamic-flow-client 5.18.2 → 5.20.0-experimental-2dcb025

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 (26) hide show
  1. package/build/main.js +372 -84
  2. package/build/main.mjs +372 -84
  3. package/build/tsconfig.types.tsbuildinfo +1 -1
  4. package/build/types/domain/components/collectionComponent/CollectionComponent.d.ts +7 -0
  5. package/build/types/domain/components/collectionComponent/CollectionComponent.d.ts.map +1 -0
  6. package/build/types/domain/components/collectionComponent/applyCollectionResponse.d.ts +3 -0
  7. package/build/types/domain/components/collectionComponent/applyCollectionResponse.d.ts.map +1 -0
  8. package/build/types/domain/components/collectionComponent/types.d.ts +73 -0
  9. package/build/types/domain/components/collectionComponent/types.d.ts.map +1 -0
  10. package/build/types/domain/features/collection/getPerformCollectionQueryFunction.d.ts +12 -0
  11. package/build/types/domain/features/collection/getPerformCollectionQueryFunction.d.ts.map +1 -0
  12. package/build/types/domain/features/validation/getPatternRegExp.d.ts +3 -0
  13. package/build/types/domain/features/validation/getPatternRegExp.d.ts.map +1 -0
  14. package/build/types/domain/mappers/layout/collectionLayoutToComponent.d.ts +7 -0
  15. package/build/types/domain/mappers/layout/collectionLayoutToComponent.d.ts.map +1 -0
  16. package/build/types/domain/mappers/mapLayoutToComponent.d.ts.map +1 -1
  17. package/build/types/domain/types.d.ts +2 -1
  18. package/build/types/domain/types.d.ts.map +1 -1
  19. package/build/types/renderers/mappers/collectionComponentToProps.d.ts +5 -0
  20. package/build/types/renderers/mappers/collectionComponentToProps.d.ts.map +1 -0
  21. package/build/types/renderers/mappers/componentToRendererProps.d.ts.map +1 -1
  22. package/build/types/test-utils/getMergedTestRenderers.d.ts +1 -1
  23. package/build/types/test-utils/getMergedTestRenderers.d.ts.map +1 -1
  24. package/package.json +4 -4
  25. package/build/types/domain/features/validation/validateStringPattern.d.ts +0 -3
  26. package/build/types/domain/features/validation/validateStringPattern.d.ts.map +0 -1
package/build/main.js CHANGED
@@ -883,6 +883,7 @@ var getChildren = (node) => {
883
883
  return node.tabs.flatMap((c) => c.childrenProps);
884
884
  case "alert":
885
885
  case "button":
886
+ case "collection":
886
887
  case "input-checkbox":
887
888
  case "input-date":
888
889
  case "decision":
@@ -1500,6 +1501,339 @@ var boxLayoutToComponent = (uid, { border = false, components, control, margin,
1500
1501
  )
1501
1502
  });
1502
1503
 
1504
+ // src/domain/mappers/utils/utils.ts
1505
+ var mapInlineAlert = (alert) => {
1506
+ return alert ? {
1507
+ content: alert.content,
1508
+ context: alert.context ? mapLegacyContext(alert.context) : "neutral"
1509
+ } : void 0;
1510
+ };
1511
+ var mapAdditionalInfo = (info, mapperProps) => {
1512
+ const { onBehavior, trackEvent, registerSubmissionBehavior } = mapperProps;
1513
+ if (info) {
1514
+ const behavior = getDomainLayerBehavior(info, [], registerSubmissionBehavior);
1515
+ const isLink = behavior.type === "link";
1516
+ return {
1517
+ text: info.text,
1518
+ href: isLink ? behavior.url : void 0,
1519
+ hrefWithTracking: getHrefWithTracking({
1520
+ behavior,
1521
+ onBehavior,
1522
+ trackEvent
1523
+ }),
1524
+ accessibilityDescription: info.accessibilityDescription,
1525
+ onClick: behavior.type === "none" ? void 0 : () => {
1526
+ void onBehavior(behavior);
1527
+ }
1528
+ };
1529
+ }
1530
+ return void 0;
1531
+ };
1532
+ var mapSchemaAlert = (alert) => {
1533
+ return alert ? {
1534
+ content: alert.markdown,
1535
+ context: alert.context ? mapLegacyContext(alert.context) : "neutral"
1536
+ } : void 0;
1537
+ };
1538
+
1539
+ // src/domain/components/utils/debounce.ts
1540
+ var debounce = (callback, waitMs) => {
1541
+ let timeoutId = null;
1542
+ let lastArgs = null;
1543
+ const clearTimer = () => {
1544
+ if (timeoutId !== null) {
1545
+ clearTimeout(timeoutId);
1546
+ timeoutId = null;
1547
+ }
1548
+ lastArgs = null;
1549
+ };
1550
+ const debouncedFn = (...args) => {
1551
+ lastArgs = args;
1552
+ if (timeoutId !== null) {
1553
+ clearTimeout(timeoutId);
1554
+ }
1555
+ timeoutId = setTimeout(() => {
1556
+ callback(...lastArgs);
1557
+ timeoutId = null;
1558
+ lastArgs = null;
1559
+ }, waitMs);
1560
+ };
1561
+ debouncedFn.cancel = () => {
1562
+ if (timeoutId !== null) {
1563
+ clearTimer();
1564
+ }
1565
+ };
1566
+ debouncedFn.flush = () => {
1567
+ if (timeoutId !== null) {
1568
+ callback(...lastArgs);
1569
+ clearTimer();
1570
+ }
1571
+ };
1572
+ return debouncedFn;
1573
+ };
1574
+
1575
+ // src/domain/components/collectionComponent/applyCollectionResponse.ts
1576
+ var applyCollectionResponse = (currentState, response, isPaginated) => {
1577
+ var _a, _b, _c, _d;
1578
+ const sections = isPaginated ? mergeSections(currentState.sections, response.sections) : response.sections;
1579
+ return {
1580
+ sections,
1581
+ nextCursor: response.nextCursor,
1582
+ filters: (_a = response.filters) != null ? _a : currentState.filters,
1583
+ search: (_b = response.search) != null ? _b : currentState.search,
1584
+ beforeSections: (_c = response.beforeSections) != null ? _c : currentState.beforeSections,
1585
+ afterSections: (_d = response.afterSections) != null ? _d : currentState.afterSections
1586
+ };
1587
+ };
1588
+ var mergeSections = (existing, incoming) => {
1589
+ const knownIds = new Set(existing.map((section) => section.id));
1590
+ const newSections = incoming.filter((section) => !knownIds.has(section.id));
1591
+ const merged = existing.map((section) => {
1592
+ const match = incoming.find((s) => s.id === section.id);
1593
+ if (!match) return section;
1594
+ return __spreadProps(__spreadValues({}, section), { items: [...section.items, ...match.items] });
1595
+ });
1596
+ return [...merged, ...newSections];
1597
+ };
1598
+
1599
+ // src/domain/components/collectionComponent/CollectionComponent.ts
1600
+ var DEBOUNCE_TIME = 800;
1601
+ var createCollectionComponent = (props, onComponentUpdate, searchFunction) => {
1602
+ const { uid, analyticsId, control, margin, tags, url, method, state } = props;
1603
+ const update = getInputUpdateFunction(onComponentUpdate);
1604
+ let abortController = new AbortController();
1605
+ const query = (component2, cursor) => {
1606
+ var _a, _b;
1607
+ abortController.abort();
1608
+ abortController = new AbortController();
1609
+ const { signal } = abortController;
1610
+ searchFunction({
1611
+ searchParam: (_a = component2.state.search) == null ? void 0 : _a.param,
1612
+ query: (_b = component2.state.search) == null ? void 0 : _b.query,
1613
+ cursor,
1614
+ signal,
1615
+ filters: component2.state.filters
1616
+ }).then((response) => {
1617
+ if (!response) {
1618
+ return;
1619
+ }
1620
+ update(component2, (draft) => {
1621
+ const newState = applyCollectionResponse(draft.state, response, !!cursor);
1622
+ draft.state = __spreadProps(__spreadValues({}, newState), {
1623
+ filters: mapFilters(newState.filters),
1624
+ search: mapSearch(newState.search)
1625
+ });
1626
+ draft.status = {
1627
+ type: "idle",
1628
+ loadMore: newState.nextCursor ? () => query(component2, newState.nextCursor) : void 0
1629
+ };
1630
+ });
1631
+ }).catch(() => {
1632
+ if (!signal.aborted) {
1633
+ update(component2, (draft) => {
1634
+ draft.status = {
1635
+ type: "error",
1636
+ reason: cursor ? "pagination" : "search",
1637
+ retry: () => query(component2, cursor)
1638
+ };
1639
+ });
1640
+ }
1641
+ });
1642
+ };
1643
+ const debouncedQuery = debounce(
1644
+ (component2) => query(component2),
1645
+ DEBOUNCE_TIME
1646
+ );
1647
+ const selectFilter = (filterIndex, optionIndex) => {
1648
+ var _a;
1649
+ const filter = (_a = component.state.filters) == null ? void 0 : _a[filterIndex];
1650
+ if (!filter) {
1651
+ return;
1652
+ }
1653
+ const currentValue = filter.options[optionIndex].selected;
1654
+ update(component, (draft) => {
1655
+ if (!draft.state.filters) {
1656
+ return;
1657
+ }
1658
+ if (filter.multiSelect) {
1659
+ draft.state.filters[filterIndex].options[optionIndex].selected = !currentValue;
1660
+ } else {
1661
+ draft.state.filters[filterIndex].options = draft.state.filters[filterIndex].options.map(
1662
+ (option, index) => __spreadProps(__spreadValues({}, option), {
1663
+ selected: index === optionIndex ? !currentValue : false
1664
+ })
1665
+ );
1666
+ }
1667
+ draft.status = { type: "loading", reason: "search" };
1668
+ });
1669
+ query(component);
1670
+ };
1671
+ const mapFilters = (filters) => filters == null ? void 0 : filters.map((filter, i) => {
1672
+ var _a;
1673
+ return __spreadProps(__spreadValues({}, filter), {
1674
+ options: (_a = filter.options) == null ? void 0 : _a.map((option, j) => {
1675
+ var _a2;
1676
+ return __spreadProps(__spreadValues({}, option), {
1677
+ selected: (_a2 = option.selected) != null ? _a2 : false,
1678
+ onSelect: () => selectFilter(i, j)
1679
+ });
1680
+ })
1681
+ });
1682
+ });
1683
+ const mapSearch = (search) => search ? __spreadProps(__spreadValues({}, search), {
1684
+ onChange(value) {
1685
+ update(component, (draft) => {
1686
+ if (draft.state.search) {
1687
+ draft.state.search.query = value;
1688
+ draft.status = { type: "loading", reason: "search" };
1689
+ }
1690
+ });
1691
+ debouncedQuery(component);
1692
+ }
1693
+ }) : void 0;
1694
+ const component = {
1695
+ type: "collection",
1696
+ kind: "layout",
1697
+ uid,
1698
+ analyticsId,
1699
+ control,
1700
+ margin,
1701
+ method,
1702
+ url,
1703
+ tags,
1704
+ status: {
1705
+ type: "idle",
1706
+ loadMore: state.nextCursor ? () => query(component, state.nextCursor) : void 0
1707
+ },
1708
+ state: __spreadProps(__spreadValues({}, state), {
1709
+ filters: mapFilters(state.filters),
1710
+ search: mapSearch(props.search)
1711
+ })
1712
+ };
1713
+ return component;
1714
+ };
1715
+
1716
+ // src/domain/features/collection/getPerformCollectionQueryFunction.ts
1717
+ var getPerformCollectionQueryFunction = (httpClient, url, method, mapState) => {
1718
+ return async ({ searchParam, query, cursor, signal, filters = [] }) => {
1719
+ const headers = { "Content-Type": "application/json" };
1720
+ const filterValues = filters.map(
1721
+ (f) => {
1722
+ var _a;
1723
+ return [f.param, (_a = f.options.find((option) => option.selected)) == null ? void 0 : _a.value];
1724
+ }
1725
+ );
1726
+ const response = await (method === "GET" ? httpClient(
1727
+ addQueryParameters(url, [
1728
+ [searchParam, query != null ? query : void 0],
1729
+ ["cursor", cursor],
1730
+ ...filterValues
1731
+ ]),
1732
+ {
1733
+ method,
1734
+ headers,
1735
+ signal
1736
+ }
1737
+ ) : httpClient(url, {
1738
+ method,
1739
+ headers,
1740
+ signal,
1741
+ body: JSON.stringify(__spreadValues(__spreadProps(__spreadValues({}, searchParam && query ? { [searchParam]: query } : {}), {
1742
+ cursor
1743
+ }), filterValues.reduce((acc, [k, v]) => __spreadProps(__spreadValues({}, acc), { [k]: v }), {})))
1744
+ }));
1745
+ const results = await parseResponse(response);
1746
+ return mapState(results);
1747
+ };
1748
+ };
1749
+ var parseResponse = async (response) => {
1750
+ if (response.ok) {
1751
+ const body = await response.json().catch(() => null);
1752
+ return body;
1753
+ }
1754
+ throw Error("error response");
1755
+ };
1756
+ var addQueryParameters = (url, params) => {
1757
+ return params.reduce(
1758
+ (u, [key, param]) => key && param ? addQueryParameter(u, key, param) : u,
1759
+ url
1760
+ );
1761
+ };
1762
+ var addQueryParameter = (url, key, value) => {
1763
+ const [urlBase, urlQuery] = url.split("?");
1764
+ const urlQueryParams = new URLSearchParams(urlQuery);
1765
+ urlQueryParams.set(key, value);
1766
+ return `${urlBase}?${urlQueryParams.toString()}`;
1767
+ };
1768
+
1769
+ // src/domain/mappers/layout/collectionLayoutToComponent.ts
1770
+ var collectionLayoutToComponent = (uid, { analyticsId, control, initialState, margin, method, search, tags, url }, mapperProps) => {
1771
+ const { httpClient, onComponentUpdate } = mapperProps;
1772
+ const mapLayout = (layout, index) => mapLayoutToComponent(`${uid}-collection-response-${index}`, layout, mapperProps, []);
1773
+ const mapState = (state) => mapCollectionSpecToDomainState(state, mapperProps, mapLayout);
1774
+ const searchFunction = getPerformCollectionQueryFunction(httpClient, url, method, mapState);
1775
+ const component = createCollectionComponent(
1776
+ {
1777
+ uid,
1778
+ analyticsId,
1779
+ control,
1780
+ margin: margin != null ? margin : "md",
1781
+ tags,
1782
+ url,
1783
+ method,
1784
+ state: mapState(initialState),
1785
+ search: search ? {
1786
+ param: search == null ? void 0 : search.param,
1787
+ query: "",
1788
+ hint: search == null ? void 0 : search.hint
1789
+ } : void 0
1790
+ },
1791
+ onComponentUpdate,
1792
+ searchFunction
1793
+ );
1794
+ return component;
1795
+ };
1796
+ var mapCollectionSpecToDomainState = (specState, mapperProps, mapLayout) => {
1797
+ var _a, _b, _c;
1798
+ return {
1799
+ sections: specState.sections.map((section) => {
1800
+ return {
1801
+ id: section.id,
1802
+ title: section.title,
1803
+ callToAction: getDomainLayerCallToAction(section.callToAction, mapperProps),
1804
+ items: section.items.map((item) => {
1805
+ const behavior = getDomainLayerBehavior(
1806
+ { behavior: item.primaryBehavior },
1807
+ [],
1808
+ mapperProps.registerSubmissionBehavior
1809
+ );
1810
+ return __spreadProps(__spreadValues({}, item), {
1811
+ onClick: item.primaryBehavior ? () => {
1812
+ void mapperProps.onBehavior(behavior);
1813
+ } : void 0,
1814
+ callToAction: getDomainLayerCallToAction(item.callToAction, mapperProps),
1815
+ inlineAlert: mapInlineAlert(item.inlineAlert)
1816
+ });
1817
+ })
1818
+ };
1819
+ }),
1820
+ filters: (_a = specState.filters) == null ? void 0 : _a.map((filter) => __spreadProps(__spreadValues({}, filter), {
1821
+ options: filter.options.map((option) => {
1822
+ var _a2;
1823
+ return __spreadProps(__spreadValues({}, option), {
1824
+ selected: (_a2 = option.selected) != null ? _a2 : false,
1825
+ onSelect: () => {
1826
+ }
1827
+ // todo: what goes here?
1828
+ });
1829
+ })
1830
+ })),
1831
+ beforeSections: (_b = specState.beforeSections) == null ? void 0 : _b.map(mapLayout),
1832
+ afterSections: (_c = specState.afterSections) == null ? void 0 : _c.map(mapLayout),
1833
+ nextCursor: specState.nextCursor
1834
+ };
1835
+ };
1836
+
1503
1837
  // src/domain/components/ButtonComponent.ts
1504
1838
  var createButtonComponent = (props) => __spreadValues({
1505
1839
  type: "button",
@@ -1668,41 +2002,6 @@ var createDecisionComponent = (props) => __spreadValues({
1668
2002
  // src/domain/mappers/utils/tags-utils.ts
1669
2003
  var mapTags = ({ tag, tags }) => tags != null ? tags : tag != null ? [tag] : void 0;
1670
2004
 
1671
- // src/domain/mappers/utils/utils.ts
1672
- var mapInlineAlert = (alert) => {
1673
- return alert ? {
1674
- content: alert.content,
1675
- context: alert.context ? mapLegacyContext(alert.context) : "neutral"
1676
- } : void 0;
1677
- };
1678
- var mapAdditionalInfo = (info, mapperProps) => {
1679
- const { onBehavior, trackEvent, registerSubmissionBehavior } = mapperProps;
1680
- if (info) {
1681
- const behavior = getDomainLayerBehavior(info, [], registerSubmissionBehavior);
1682
- const isLink = behavior.type === "link";
1683
- return {
1684
- text: info.text,
1685
- href: isLink ? behavior.url : void 0,
1686
- hrefWithTracking: getHrefWithTracking({
1687
- behavior,
1688
- onBehavior,
1689
- trackEvent
1690
- }),
1691
- accessibilityDescription: info.accessibilityDescription,
1692
- onClick: behavior.type === "none" ? void 0 : () => {
1693
- void onBehavior(behavior);
1694
- }
1695
- };
1696
- }
1697
- return void 0;
1698
- };
1699
- var mapSchemaAlert = (alert) => {
1700
- return alert ? {
1701
- content: alert.markdown,
1702
- context: alert.context ? mapLegacyContext(alert.context) : "neutral"
1703
- } : void 0;
1704
- };
1705
-
1706
2005
  // src/domain/mappers/layout/decisionLayoutToComponent.ts
1707
2006
  var decisionLayoutToComponent = (uid, {
1708
2007
  analyticsId,
@@ -2178,44 +2477,8 @@ var mapReviewField = (field, mapperProps) => {
2178
2477
  });
2179
2478
  };
2180
2479
 
2181
- // src/domain/components/utils/debounce.ts
2182
- var debounce = (callback, waitMs) => {
2183
- let timeoutId = null;
2184
- let lastArgs = null;
2185
- const clearTimer = () => {
2186
- if (timeoutId !== null) {
2187
- clearTimeout(timeoutId);
2188
- timeoutId = null;
2189
- }
2190
- lastArgs = null;
2191
- };
2192
- const debouncedFn = (...args) => {
2193
- lastArgs = args;
2194
- if (timeoutId !== null) {
2195
- clearTimeout(timeoutId);
2196
- }
2197
- timeoutId = setTimeout(() => {
2198
- callback(...lastArgs);
2199
- timeoutId = null;
2200
- lastArgs = null;
2201
- }, waitMs);
2202
- };
2203
- debouncedFn.cancel = () => {
2204
- if (timeoutId !== null) {
2205
- clearTimer();
2206
- }
2207
- };
2208
- debouncedFn.flush = () => {
2209
- if (timeoutId !== null) {
2210
- callback(...lastArgs);
2211
- clearTimer();
2212
- }
2213
- };
2214
- return debouncedFn;
2215
- };
2216
-
2217
2480
  // src/domain/components/searchComponent/SearchComponent.ts
2218
- var DEBOUNCE_TIME = 400;
2481
+ var DEBOUNCE_TIME2 = 400;
2219
2482
  var createSearchComponent = (props, performSearch, onBehavior, onComponentUpdate) => {
2220
2483
  const { uid, analyticsId, control, emptyMessage, initialState, hint, margin, tags, title } = props;
2221
2484
  const update = getInputUpdateFunction(onComponentUpdate);
@@ -2245,7 +2508,7 @@ var createSearchComponent = (props, performSearch, onBehavior, onComponentUpdate
2245
2508
  }
2246
2509
  });
2247
2510
  };
2248
- const debouncedSearch = debounce(search, DEBOUNCE_TIME);
2511
+ const debouncedSearch = debounce(search, DEBOUNCE_TIME2);
2249
2512
  const component = {
2250
2513
  type: "search",
2251
2514
  kind: "layout",
@@ -2307,7 +2570,7 @@ var getPerformSearchFunction = (httpClient, mapLayoutToDomainComponent, defaultC
2307
2570
  if (requestHash !== latestSuccessfulRequestHash) {
2308
2571
  const { method, param, url } = config;
2309
2572
  const headers = { "Content-Type": "application/json" };
2310
- const response = await (method === "GET" ? httpClient(addQueryParameter(url, param, query), {
2573
+ const response = await (method === "GET" ? httpClient(addQueryParameter2(url, param, query), {
2311
2574
  method,
2312
2575
  headers,
2313
2576
  signal
@@ -2317,7 +2580,7 @@ var getPerformSearchFunction = (httpClient, mapLayoutToDomainComponent, defaultC
2317
2580
  signal,
2318
2581
  body: JSON.stringify({ [param]: query })
2319
2582
  }));
2320
- const results = await parseResponse(response);
2583
+ const results = await parseResponse2(response);
2321
2584
  latestSuccessfulRequestHash = requestHash;
2322
2585
  if (results.type === "layout") {
2323
2586
  const mappedLayoutResult = {
@@ -2333,7 +2596,7 @@ var getPerformSearchFunction = (httpClient, mapLayoutToDomainComponent, defaultC
2333
2596
  return latestSuccessfulResults;
2334
2597
  };
2335
2598
  };
2336
- var parseResponse = async (response) => {
2599
+ var parseResponse2 = async (response) => {
2337
2600
  if (response.ok) {
2338
2601
  const body = await response.json().catch(() => null);
2339
2602
  if (isValidResponseBody(body)) {
@@ -2350,7 +2613,7 @@ var parseResponse = async (response) => {
2350
2613
  }
2351
2614
  throw Error("error response");
2352
2615
  };
2353
- var addQueryParameter = (url, key, value) => {
2616
+ var addQueryParameter2 = (url, key, value) => {
2354
2617
  const [urlBase, urlQuery] = url.split("?");
2355
2618
  const urlQueryParams = new URLSearchParams(urlQuery);
2356
2619
  urlQueryParams.set(key, value);
@@ -2556,6 +2819,8 @@ var mapLayoutToComponent = (uid, layout, mapperProps, schemaComponents) => {
2556
2819
  return boxLayoutToComponent(uid, layout, mapperProps, schemaComponents);
2557
2820
  case "button":
2558
2821
  return buttonLayoutToComponent(uid, layout, mapperProps);
2822
+ case "collection":
2823
+ return collectionLayoutToComponent(uid, layout, mapperProps);
2559
2824
  case "columns":
2560
2825
  return columnsLayoutToComponent(uid, layout, mapperProps, schemaComponents);
2561
2826
  case "decision":
@@ -3503,13 +3768,13 @@ var getBehaviorFromSchemaRefreshStepOnChange = (schema) => {
3503
3768
  return void 0;
3504
3769
  };
3505
3770
 
3506
- // src/domain/features/validation/validateStringPattern.ts
3507
- var validateStringPattern = (pattern, logEvent) => {
3771
+ // src/domain/features/validation/getPatternRegExp.ts
3772
+ var getPatternRegExp = (pattern, logEvent) => {
3508
3773
  if (!pattern) {
3509
3774
  return;
3510
3775
  }
3511
3776
  try {
3512
- new RegExp(pattern, "u");
3777
+ return new RegExp(pattern, "u");
3513
3778
  } catch (error) {
3514
3779
  const message = `Invalid schema pattern. Failed to instantiate RegExp with Unicode support.`;
3515
3780
  if (logEvent) {
@@ -3518,11 +3783,12 @@ var validateStringPattern = (pattern, logEvent) => {
3518
3783
  error: error == null ? void 0 : error.toString()
3519
3784
  });
3520
3785
  } else {
3521
- console.warn(`DynamicFlow - warning - ${message}`, {
3786
+ console.warn(`Dynamic Flow - ${message}`, {
3522
3787
  pattern,
3523
3788
  error: error == null ? void 0 : error.toString()
3524
3789
  });
3525
3790
  }
3791
+ return new RegExp(pattern);
3526
3792
  }
3527
3793
  };
3528
3794
 
@@ -3618,10 +3884,10 @@ var getBelowMinimumDateCheck = ({ minimum }, messageFunctions) => (value) => {
3618
3884
  return null;
3619
3885
  };
3620
3886
  var getNotAdheringToPatternCheck = ({ pattern }, messageFunctions, options) => {
3621
- validateStringPattern(pattern, options == null ? void 0 : options.logEvent);
3887
+ const regExp = getPatternRegExp(pattern, options == null ? void 0 : options.logEvent);
3622
3888
  return (value) => {
3623
- if (isString(pattern) && isString(value) && value) {
3624
- return new RegExp(pattern).test(value) ? null : messageFunctions.pattern();
3889
+ if (regExp && isString(value) && value) {
3890
+ return (regExp == null ? void 0 : regExp.test(value)) ? null : messageFunctions.pattern();
3625
3891
  }
3626
3892
  return null;
3627
3893
  };
@@ -7928,6 +8194,26 @@ var mapBoxControl = ({
7928
8194
  return control;
7929
8195
  };
7930
8196
 
8197
+ // src/renderers/mappers/collectionComponentToProps.ts
8198
+ var collectionComponentToProps = (component, rendererMapperProps) => {
8199
+ var _a, _b, _c;
8200
+ return __spreadProps(__spreadValues(__spreadValues({}, pick(component, "uid", "analyticsId", "type", "control", "margin", "tags", "url", "method")), rendererMapperProps), {
8201
+ status: component.status,
8202
+ state: __spreadProps(__spreadValues({}, component.state), {
8203
+ filters: (_a = component.state.filters) != null ? _a : [],
8204
+ sections: component.state.sections.map((section) => __spreadProps(__spreadValues({}, section), {
8205
+ callToAction: mapCallToActionOptional(section.callToAction),
8206
+ items: section.items.map((item) => __spreadProps(__spreadValues({}, item), {
8207
+ callToAction: mapCallToActionOptional(item.callToAction),
8208
+ additionalInfo: mapAdditionalInfo2(item.additionalInfo)
8209
+ }))
8210
+ })),
8211
+ beforeSections: (_b = component.state.beforeSections) == null ? void 0 : _b.map((child) => componentToRendererProps(child, rendererMapperProps)).map(rendererMapperProps.render),
8212
+ afterSections: (_c = component.state.afterSections) == null ? void 0 : _c.map((child) => componentToRendererProps(child, rendererMapperProps)).map(rendererMapperProps.render)
8213
+ })
8214
+ });
8215
+ };
8216
+
7931
8217
  // src/renderers/mappers/buttonComponentToProps.ts
7932
8218
  var buttonComponentToProps = (component, rendererMapperProps) => {
7933
8219
  return __spreadValues(__spreadProps(__spreadValues({
@@ -8557,6 +8843,8 @@ var getComponentProps = (component, rendererMapperProps) => {
8557
8843
  return boxComponentToProps(component, rendererMapperProps);
8558
8844
  case "button":
8559
8845
  return buttonComponentToProps(component, rendererMapperProps);
8846
+ case "collection":
8847
+ return collectionComponentToProps(component, rendererMapperProps);
8560
8848
  case "columns":
8561
8849
  return columnsComponentToProps(component, rendererMapperProps);
8562
8850
  case "container":