@crayonscodetech/cms-sdk 1.0.8 → 1.0.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/dist/index.cjs CHANGED
@@ -1,29 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region \0rolldown/runtime.js
3
- var __create = Object.create;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getProtoOf = Object.getPrototypeOf;
8
- var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
- key = keys[i];
12
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
13
- get: ((k) => from[k]).bind(null, key),
14
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
- });
16
- }
17
- return to;
18
- };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
20
- value: mod,
21
- enumerable: true
22
- }) : target, mod));
23
- //#endregion
24
- let react = require("react");
25
- react = __toESM(react, 1);
26
- let lucide_react = require("lucide-react");
27
2
  //#region src/constants/pageTypes.ts
28
3
  const pageTypes = [
29
4
  "home",
@@ -106,6 +81,21 @@ const MEDIA = {
106
81
  MAX_IMAGE_SIZE: 5242880
107
82
  };
108
83
  //#endregion
84
+ //#region src/types/contact.ts
85
+ /** Attachment caps enforced by the API; mirrored here to fail fast client-side. */
86
+ const MAX_CONTACT_ATTACHMENTS = 3;
87
+ const MAX_CONTACT_ATTACHMENTS_TOTAL_BYTES = 4194304;
88
+ const CONTACT_ATTACHMENT_MIME_ALLOWLIST = [
89
+ "application/pdf",
90
+ "image/png",
91
+ "image/jpeg",
92
+ "image/webp",
93
+ "image/gif",
94
+ "text/plain",
95
+ "application/msword",
96
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
97
+ ];
98
+ //#endregion
109
99
  //#region src/core/client.ts
110
100
  var CmsError = class extends Error {
111
101
  message;
@@ -122,9 +112,9 @@ var CmsError = class extends Error {
122
112
  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
123
113
  function createCmsClient(config) {
124
114
  const { baseUrl, defaultOptions = {} } = config;
125
- async function cmsFetch(endpoint, options = {}, retries = 2) {
115
+ async function cmsFetch(endpoint, options = {}) {
126
116
  const url = `${baseUrl}${endpoint}`;
127
- const { revalidate = CACHE.NO_CACHE, tags, ...rest } = {
117
+ const { revalidate = CACHE.NO_CACHE, tags, retries = 1, ...rest } = {
128
118
  ...defaultOptions,
129
119
  ...options
130
120
  };
@@ -135,12 +125,9 @@ function createCmsClient(config) {
135
125
  ...tags && { tags }
136
126
  }
137
127
  };
138
- let lastError = null;
139
128
  for (let attempt = 0; attempt <= retries; attempt++) try {
140
129
  const response = await fetch(url, fetchConfig);
141
130
  if (!response.ok) {
142
- const errorMsg = `API request failed: ${response.status} ${url}`;
143
- console.error(errorMsg);
144
131
  if (attempt < retries && [
145
132
  502,
146
133
  503,
@@ -149,32 +136,29 @@ function createCmsClient(config) {
149
136
  await sleep(Math.pow(2, attempt) * 1e3);
150
137
  continue;
151
138
  }
152
- return null;
139
+ let errorMsg = `API request failed: ${response.status} ${url}`;
140
+ try {
141
+ const body = await response.json();
142
+ if (body?.message) errorMsg = body.message;
143
+ } catch {}
144
+ throw new CmsError(errorMsg, response.status, url);
153
145
  }
154
146
  if (response.status === 204) return null;
155
147
  const result = await response.json();
156
148
  return result.data ?? result;
157
149
  } catch (error) {
158
- lastError = error instanceof Error ? error : new Error(String(error));
159
- console.error(`API request error (attempt ${attempt + 1}/${retries + 1}): ${url}`, lastError);
150
+ if (error instanceof CmsError) throw error;
160
151
  if (attempt < retries) {
161
152
  await sleep(Math.pow(2, attempt) * 1e3);
162
153
  continue;
163
154
  }
155
+ throw new CmsError(`Request failed: ${error instanceof Error ? error.message : String(error)}`, void 0, url);
164
156
  }
165
- return null;
166
- }
167
- async function cmsFetchPaginated(endpoint, options = {}, retries = 2) {
168
- const emptyResponse = {
169
- data: [],
170
- pagination: {
171
- page: 1,
172
- limit: PAGINATION.DEFAULT_LIMIT,
173
- total: 0
174
- }
175
- };
157
+ throw new CmsError(`Request failed after ${retries + 1} attempts`, void 0, url);
158
+ }
159
+ async function cmsFetchPaginated(endpoint, options = {}) {
176
160
  const url = `${baseUrl}${endpoint}`;
177
- const { revalidate = CACHE.NO_CACHE, tags, ...rest } = {
161
+ const { revalidate = CACHE.NO_CACHE, tags, retries = 1, ...rest } = {
178
162
  ...defaultOptions,
179
163
  ...options
180
164
  };
@@ -188,7 +172,6 @@ function createCmsClient(config) {
188
172
  for (let attempt = 0; attempt <= retries; attempt++) try {
189
173
  const response = await fetch(url, fetchConfig);
190
174
  if (!response.ok) {
191
- console.error(`API request failed: ${response.status} ${url}`);
192
175
  if (attempt < retries && [
193
176
  502,
194
177
  503,
@@ -197,17 +180,23 @@ function createCmsClient(config) {
197
180
  await sleep(Math.pow(2, attempt) * 1e3);
198
181
  continue;
199
182
  }
200
- return emptyResponse;
183
+ let errorMsg = `API request failed: ${response.status} ${url}`;
184
+ try {
185
+ const body = await response.json();
186
+ if (body?.message) errorMsg = body.message;
187
+ } catch {}
188
+ throw new CmsError(errorMsg, response.status, url);
201
189
  }
202
190
  return await response.json();
203
191
  } catch (error) {
204
- console.error(`API request error (attempt ${attempt + 1}/${retries + 1}): ${url}`, error);
192
+ if (error instanceof CmsError) throw error;
205
193
  if (attempt < retries) {
206
194
  await sleep(Math.pow(2, attempt) * 1e3);
207
195
  continue;
208
196
  }
197
+ throw new CmsError(`Request failed: ${error instanceof Error ? error.message : String(error)}`, void 0, url);
209
198
  }
210
- return emptyResponse;
199
+ throw new CmsError(`Request failed after ${retries + 1} attempts`, void 0, url);
211
200
  }
212
201
  function buildQueryString(params) {
213
202
  const query = new URLSearchParams();
@@ -249,17 +238,12 @@ function createCmsClient(config) {
249
238
  });
250
239
  }
251
240
  async function fetchPageByUrl(siteId, urlPath, options) {
252
- try {
253
- const targetUrl = urlPath === "/" || urlPath === "" ? "/" : `/${urlPath.replace(/^\/|\/$/g, "")}`;
254
- return await cmsFetch(`/api/public/cms/${siteId}/page/by-url/?url=${encodeURIComponent(targetUrl)}`, {
255
- revalidate: CACHE.SHORT,
256
- tags: ["pages", `page-${targetUrl || "root"}`],
257
- ...options
258
- });
259
- } catch (error) {
260
- console.error(`Error in fetchPageByUrl for ${urlPath}:`, error);
261
- return null;
262
- }
241
+ const targetUrl = urlPath === "/" || urlPath === "" ? "/" : `/${urlPath.replace(/^\/|\/$/g, "")}`;
242
+ return cmsFetch(`/api/public/cms/${siteId}/page/by-url/?url=${encodeURIComponent(targetUrl)}`, {
243
+ revalidate: CACHE.SHORT,
244
+ tags: ["pages", `page-${targetUrl || "root"}`],
245
+ ...options
246
+ });
263
247
  }
264
248
  function fetchAboutUs(siteId, options) {
265
249
  return cmsFetch(`/api/public/cms/${siteId}/about-us/`, {
@@ -385,14 +369,73 @@ function createCmsClient(config) {
385
369
  ...options
386
370
  });
387
371
  }
388
- async function submitContactForm(siteId, payload, options) {
389
- return cmsFetch(`/api/public/cms/${siteId}/contact/`, {
390
- method: "POST",
391
- headers: { "Content-Type": "application/json" },
392
- body: JSON.stringify(payload),
393
- revalidate: CACHE.NO_CACHE,
394
- ...options
395
- });
372
+ /**
373
+ * Public Turnstile settings for the site's contact form.
374
+ *
375
+ * Call this before rendering the form: when `turnstile.enabled` is true the
376
+ * widget must be rendered with `turnstile.site_key` and its token passed to
377
+ * `submitContactForm`, or every submission is rejected.
378
+ */
379
+ function fetchContactConfig(siteId, options) {
380
+ return cmsFetch(`/api/public/cms/${siteId}/contact-config/`, {
381
+ revalidate: CACHE.SHORT,
382
+ tags: ["contact-config"],
383
+ ...options
384
+ });
385
+ }
386
+ /**
387
+ * Submit the contact form.
388
+ *
389
+ * Unlike the read methods, this THROWS `CmsError` on a rejection rather than
390
+ * returning null — a form needs to tell "captcha failed, reset the widget"
391
+ * (403) apart from "rate limited" (429) and a network blip, and a single
392
+ * `null` cannot carry that. `error.status` holds the HTTP status.
393
+ *
394
+ * Pass `attachments` to send files; the request then goes out as multipart
395
+ * instead of JSON. Caps are enforced server-side and pre-checked here.
396
+ */
397
+ async function submitContactForm(siteId, payload, attachments, options) {
398
+ const url = `${baseUrl}/api/public/cms/${siteId}/contact/`;
399
+ if (attachments?.length) {
400
+ if (attachments.length > 3) throw new CmsError(`At most 3 attachments are allowed`, 400, url);
401
+ if (attachments.reduce((sum, f) => sum + f.size, 0) > 4194304) throw new CmsError("Attachments exceed the 4 MiB total size limit", 400, url);
402
+ for (const f of attachments) if (!CONTACT_ATTACHMENT_MIME_ALLOWLIST.includes(f.type)) throw new CmsError(`Attachment type not allowed: ${f.type || "unknown"}`, 400, url);
403
+ }
404
+ let body;
405
+ const headers = {};
406
+ if (attachments?.length) {
407
+ const form = new FormData();
408
+ for (const [key, value] of Object.entries(payload)) if (value !== void 0 && value !== null) form.append(key, String(value));
409
+ for (const file of attachments) form.append("attachments", file, file.name);
410
+ body = form;
411
+ } else {
412
+ headers["Content-Type"] = "application/json";
413
+ body = JSON.stringify(payload);
414
+ }
415
+ let response;
416
+ try {
417
+ response = await fetch(url, {
418
+ ...options,
419
+ method: "POST",
420
+ headers: {
421
+ ...headers,
422
+ ...options?.headers
423
+ },
424
+ body
425
+ });
426
+ } catch (error) {
427
+ throw new CmsError(error instanceof Error ? error.message : "Network request failed", void 0, url);
428
+ }
429
+ if (!response.ok) {
430
+ let message = `Request failed with status ${response.status}`;
431
+ try {
432
+ const parsed = await response.json();
433
+ if (parsed?.message) message = parsed.message;
434
+ } catch {}
435
+ throw new CmsError(message, response.status, url);
436
+ }
437
+ const result = await response.json();
438
+ return result.data ?? result;
396
439
  }
397
440
  function fetchFaqs(siteId, params, options) {
398
441
  return cmsFetchPaginated(`/api/public/cms/${siteId}/faqs/?${buildQueryString({
@@ -433,8 +476,9 @@ function createCmsClient(config) {
433
476
  referrer
434
477
  }),
435
478
  revalidate: CACHE.NO_CACHE,
436
- tags: ["redirects", "redirect-404-logs"]
437
- }, 0);
479
+ tags: ["redirects", "redirect-404-logs"],
480
+ retries: 0
481
+ });
438
482
  }
439
483
  function fetchStoreSettings(siteId, options) {
440
484
  return cmsFetch(`/api/public/store/${siteId}/settings/`, {
@@ -514,6 +558,7 @@ function createCmsClient(config) {
514
558
  headers: { "Content-Type": "application/json" },
515
559
  body: JSON.stringify(payload),
516
560
  revalidate: CACHE.NO_CACHE,
561
+ retries: 0,
517
562
  ...options
518
563
  });
519
564
  }
@@ -549,6 +594,70 @@ function createCmsClient(config) {
549
594
  ...options
550
595
  });
551
596
  }
597
+ const SITEMAP_ROUTES = {
598
+ blogs: {
599
+ segment: "blogs",
600
+ store: false
601
+ },
602
+ pages: {
603
+ segment: "pages",
604
+ store: false
605
+ },
606
+ services: {
607
+ segment: "services",
608
+ store: false
609
+ },
610
+ events: {
611
+ segment: "events",
612
+ store: false
613
+ },
614
+ albums: {
615
+ segment: "albums",
616
+ store: false
617
+ },
618
+ "team-members": {
619
+ segment: "team-members",
620
+ store: false
621
+ },
622
+ "team-categories": {
623
+ segment: "team-categories",
624
+ store: false
625
+ },
626
+ "brand-groups": {
627
+ segment: "brand-groups",
628
+ store: false
629
+ },
630
+ products: {
631
+ segment: "products",
632
+ store: true
633
+ },
634
+ collections: {
635
+ segment: "collections",
636
+ store: true
637
+ },
638
+ "product-categories": {
639
+ segment: "categories",
640
+ store: true
641
+ },
642
+ "product-brands": {
643
+ segment: "brands",
644
+ store: true
645
+ }
646
+ };
647
+ /**
648
+ * Fetch any sitemap resource. Returns slug/url, title/name, image (where
649
+ * the content type has one) and `updatedAt` for `lastModified`.
650
+ */
651
+ function fetchSitemap(siteId, resource, params = {}, options) {
652
+ const { segment, store } = SITEMAP_ROUTES[resource];
653
+ const namespace = store ? "store" : "cms";
654
+ const query = buildQueryString(params);
655
+ return cmsFetchPaginated(`/api/public/${namespace}/${siteId}/sitemap/${segment}/${query ? `?${query}` : ""}`, {
656
+ revalidate: CACHE.STATIC,
657
+ tags: ["sitemap", `sitemap-${resource}`],
658
+ ...options
659
+ });
660
+ }
552
661
  return {
553
662
  LIST_DEFAULT_LIMIT,
554
663
  fetchHeader,
@@ -578,6 +687,7 @@ function createCmsClient(config) {
578
687
  resolveRedirect,
579
688
  reportRedirect404,
580
689
  submitContactForm,
690
+ fetchContactConfig,
581
691
  fetchStoreSettings,
582
692
  fetchProductCategories,
583
693
  fetchProductBrands,
@@ -588,6 +698,7 @@ function createCmsClient(config) {
588
698
  fetchCollectionDetail,
589
699
  fetchCollectionDetailById,
590
700
  placeOrder,
701
+ fetchSitemap,
591
702
  fetchSitemapBlogs,
592
703
  fetchSitemapPages,
593
704
  fetchSitemapProducts,
@@ -598,134 +709,125 @@ function createCmsClient(config) {
598
709
  };
599
710
  }
600
711
  //#endregion
601
- //#region src/components/Icon.tsx
602
- /**
603
- * A exhaustive map of Lucide icons commonly used in the CMS.
604
- */
605
- const ICON_MAP = {
606
- Home: lucide_react.Home,
607
- User: lucide_react.User,
608
- Settings: lucide_react.Settings,
609
- Mail: lucide_react.Mail,
610
- Bell: lucide_react.Bell,
611
- Calendar: lucide_react.Calendar,
612
- Star: lucide_react.Star,
613
- Heart: lucide_react.Heart,
614
- Bookmark: lucide_react.Bookmark,
615
- Search: lucide_react.Search,
616
- Filter: lucide_react.Filter,
617
- Download: lucide_react.Download,
618
- Upload: lucide_react.Upload,
619
- Trash: lucide_react.Trash,
620
- Edit: lucide_react.Edit,
621
- Plus: lucide_react.Plus,
622
- Minus: lucide_react.Minus,
623
- Check: lucide_react.Check,
624
- X: lucide_react.X,
625
- ChevronRight: lucide_react.ChevronRight,
626
- ChevronLeft: lucide_react.ChevronLeft,
627
- ChevronUp: lucide_react.ChevronUp,
628
- ChevronDown: lucide_react.ChevronDown,
629
- ChevronsUpDown: lucide_react.ChevronsUpDown,
630
- ArrowRight: lucide_react.ArrowRight,
631
- ArrowLeft: lucide_react.ArrowLeft,
632
- ArrowUp: lucide_react.ArrowUp,
633
- ArrowDown: lucide_react.ArrowDown,
634
- File: lucide_react.File,
635
- Folder: lucide_react.Folder,
636
- Image: lucide_react.Image,
637
- Video: lucide_react.Video,
638
- Music: lucide_react.Music,
639
- Lock: lucide_react.Lock,
640
- Unlock: lucide_react.Unlock,
641
- Eye: lucide_react.Eye,
642
- EyeOff: lucide_react.EyeOff,
643
- Sun: lucide_react.Sun,
644
- Moon: lucide_react.Moon,
645
- Cloud: lucide_react.Cloud,
646
- Zap: lucide_react.Zap,
647
- Activity: lucide_react.Activity,
648
- TrendingUp: lucide_react.TrendingUp,
649
- TrendingDown: lucide_react.TrendingDown,
650
- BarChart: lucide_react.BarChart,
651
- PieChart: lucide_react.PieChart,
652
- Database: lucide_react.Database,
653
- Server: lucide_react.Server,
654
- Wifi: lucide_react.Wifi,
655
- Battery: lucide_react.Battery,
656
- Camera: lucide_react.Camera,
657
- Mic: lucide_react.Mic,
658
- Phone: lucide_react.Phone,
659
- MessageSquare: lucide_react.MessageSquare,
660
- Send: lucide_react.Send,
661
- Share: lucide_react.Share,
662
- Link: lucide_react.Link,
663
- ExternalLink: lucide_react.ExternalLink,
664
- Globe: lucide_react.Globe,
665
- MapPin: lucide_react.MapPin,
666
- Users: lucide_react.Users,
667
- ShoppingCart: lucide_react.ShoppingCart,
668
- CreditCard: lucide_react.CreditCard,
669
- Package: lucide_react.Package,
670
- Briefcase: lucide_react.Briefcase,
671
- Target: lucide_react.Target,
672
- Flag: lucide_react.Flag,
673
- Clipboard: lucide_react.Clipboard,
674
- List: lucide_react.List,
675
- Grid: lucide_react.Grid,
676
- Layout: lucide_react.Layout,
677
- Layers: lucide_react.Layers,
678
- Copy: lucide_react.Copy,
679
- Save: lucide_react.Save,
680
- RefreshCw: lucide_react.RefreshCw,
681
- Maximize: lucide_react.Maximize,
682
- Code: lucide_react.Code,
683
- AlertCircle: lucide_react.AlertCircle,
684
- Info: lucide_react.Info,
685
- HelpCircle: lucide_react.HelpCircle,
686
- CheckCircle: lucide_react.CheckCircle,
687
- XCircle: lucide_react.XCircle,
688
- Menu: lucide_react.Menu,
689
- MoreVertical: lucide_react.MoreVertical,
690
- MoreHorizontal: lucide_react.MoreHorizontal,
691
- PlayCircle: lucide_react.PlayCircle,
692
- PauseCircle: lucide_react.PauseCircle,
693
- LogIn: lucide_react.LogIn,
694
- LogOut: lucide_react.LogOut,
695
- UserPlus: lucide_react.UserPlus,
696
- UserMinus: lucide_react.UserMinus,
697
- Tag: lucide_react.Tag,
698
- Award: lucide_react.Award,
699
- Gift: lucide_react.Gift,
700
- Truck: lucide_react.Truck,
701
- Clock: lucide_react.Clock,
702
- Handshake: lucide_react.Handshake,
703
- Stethoscope: lucide_react.Stethoscope,
704
- Microscope: lucide_react.Microscope,
705
- GraduationCap: lucide_react.GraduationCap,
706
- BookOpen: lucide_react.BookOpen,
707
- Building2: lucide_react.Building2,
708
- Trees: lucide_react.Trees,
709
- HeartHandshake: lucide_react.HeartHandshake,
710
- Brain: lucide_react.Brain,
711
- Lightbulb: lucide_react.Lightbulb
712
- };
713
- /**
714
- * Dynamic Icon component that renders Lucide icons by name.
715
- * Useful for CMS-driven icons where names are stored as strings.
716
- */
717
- function Icon({ name, fallback = "HelpCircle", ...props }) {
718
- const IconComponent = ICON_MAP[name] ?? ICON_MAP[fallback] ?? lucide_react.HelpCircle;
719
- return react.default.createElement(IconComponent, props);
720
- }
712
+ //#region src/types/icon.ts
713
+ const ICON_NAMES = [
714
+ "Home",
715
+ "User",
716
+ "Settings",
717
+ "Mail",
718
+ "Bell",
719
+ "Calendar",
720
+ "Star",
721
+ "Heart",
722
+ "Bookmark",
723
+ "Search",
724
+ "Filter",
725
+ "Download",
726
+ "Upload",
727
+ "Trash",
728
+ "Edit",
729
+ "Plus",
730
+ "Minus",
731
+ "Check",
732
+ "X",
733
+ "ChevronRight",
734
+ "ChevronLeft",
735
+ "ChevronUp",
736
+ "ChevronDown",
737
+ "ChevronsUpDown",
738
+ "ArrowRight",
739
+ "ArrowLeft",
740
+ "ArrowUp",
741
+ "ArrowDown",
742
+ "File",
743
+ "Folder",
744
+ "Image",
745
+ "Video",
746
+ "Music",
747
+ "Lock",
748
+ "Unlock",
749
+ "Eye",
750
+ "EyeOff",
751
+ "Sun",
752
+ "Moon",
753
+ "Cloud",
754
+ "Zap",
755
+ "Activity",
756
+ "TrendingUp",
757
+ "TrendingDown",
758
+ "BarChart",
759
+ "PieChart",
760
+ "Database",
761
+ "Server",
762
+ "Wifi",
763
+ "Battery",
764
+ "Camera",
765
+ "Mic",
766
+ "Phone",
767
+ "MessageSquare",
768
+ "Send",
769
+ "Share",
770
+ "Link",
771
+ "ExternalLink",
772
+ "Globe",
773
+ "MapPin",
774
+ "Users",
775
+ "ShoppingCart",
776
+ "CreditCard",
777
+ "Package",
778
+ "Briefcase",
779
+ "Target",
780
+ "Flag",
781
+ "Clipboard",
782
+ "List",
783
+ "Grid",
784
+ "Layout",
785
+ "Layers",
786
+ "Copy",
787
+ "Save",
788
+ "RefreshCw",
789
+ "Maximize",
790
+ "Code",
791
+ "AlertCircle",
792
+ "Info",
793
+ "HelpCircle",
794
+ "CheckCircle",
795
+ "XCircle",
796
+ "Menu",
797
+ "MoreVertical",
798
+ "MoreHorizontal",
799
+ "PlayCircle",
800
+ "PauseCircle",
801
+ "LogIn",
802
+ "LogOut",
803
+ "UserPlus",
804
+ "UserMinus",
805
+ "Tag",
806
+ "Award",
807
+ "Gift",
808
+ "Truck",
809
+ "Clock",
810
+ "Handshake",
811
+ "Stethoscope",
812
+ "Microscope",
813
+ "GraduationCap",
814
+ "BookOpen",
815
+ "Building2",
816
+ "Trees",
817
+ "HeartHandshake",
818
+ "Brain",
819
+ "Lightbulb"
820
+ ];
721
821
  //#endregion
722
822
  exports.ANIMATION = ANIMATION;
723
823
  exports.CACHE = CACHE;
824
+ exports.CONTACT_ATTACHMENT_MIME_ALLOWLIST = CONTACT_ATTACHMENT_MIME_ALLOWLIST;
724
825
  exports.CONTACT_SUBJECTS = CONTACT_SUBJECTS;
725
826
  exports.CmsError = CmsError;
726
827
  exports.HTTP_STATUS = HTTP_STATUS;
727
- exports.ICON_MAP = ICON_MAP;
728
- exports.Icon = Icon;
828
+ exports.ICON_NAMES = ICON_NAMES;
829
+ exports.MAX_CONTACT_ATTACHMENTS = MAX_CONTACT_ATTACHMENTS;
830
+ exports.MAX_CONTACT_ATTACHMENTS_TOTAL_BYTES = MAX_CONTACT_ATTACHMENTS_TOTAL_BYTES;
729
831
  exports.MEDIA = MEDIA;
730
832
  exports.PAGINATION = PAGINATION;
731
833
  exports.SEARCH = SEARCH;