@cayuse-test/react 1.0.0

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 (103) hide show
  1. package/README.md +346 -0
  2. package/dist/chunk-2K3CWMLR.js +108 -0
  3. package/dist/chunk-2K3CWMLR.js.map +1 -0
  4. package/dist/chunk-B2Z63U4D.js +10398 -0
  5. package/dist/chunk-B2Z63U4D.js.map +1 -0
  6. package/dist/chunk-EPGO6B3U.js +3 -0
  7. package/dist/chunk-EPGO6B3U.js.map +1 -0
  8. package/dist/chunk-LFWPG3ND.js +97 -0
  9. package/dist/chunk-LFWPG3ND.js.map +1 -0
  10. package/dist/chunk-M2L7SQBQ.js +205 -0
  11. package/dist/chunk-M2L7SQBQ.js.map +1 -0
  12. package/dist/chunk-MJBMK4OG.js +143 -0
  13. package/dist/chunk-MJBMK4OG.js.map +1 -0
  14. package/dist/chunk-RG4GEORO.js +194 -0
  15. package/dist/chunk-RG4GEORO.js.map +1 -0
  16. package/dist/chunk-SZMEZFAR.js +193 -0
  17. package/dist/chunk-SZMEZFAR.js.map +1 -0
  18. package/dist/chunk-TYZPOXN5.js +243 -0
  19. package/dist/chunk-TYZPOXN5.js.map +1 -0
  20. package/dist/chunk-XRUFEGUC.js +225 -0
  21. package/dist/chunk-XRUFEGUC.js.map +1 -0
  22. package/dist/components/index.d.ts +1471 -0
  23. package/dist/components/index.js +144 -0
  24. package/dist/components/index.js.map +1 -0
  25. package/dist/context/tenant/index.d.ts +200 -0
  26. package/dist/context/tenant/index.js +14 -0
  27. package/dist/context/tenant/index.js.map +1 -0
  28. package/dist/globals/constants/index.d.ts +83 -0
  29. package/dist/globals/constants/index.js +31 -0
  30. package/dist/globals/constants/index.js.map +1 -0
  31. package/dist/globals/css/index.d.ts +2 -0
  32. package/dist/globals/css/index.js +2 -0
  33. package/dist/globals/css/index.js.map +1 -0
  34. package/dist/hooks/index.d.ts +125 -0
  35. package/dist/hooks/index.js +30 -0
  36. package/dist/hooks/index.js.map +1 -0
  37. package/dist/index-4NH7IW34.css +47 -0
  38. package/dist/index.d.ts +16 -0
  39. package/dist/index.js +302 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/modal-dialog-IH5SI4CF.css +93 -0
  42. package/dist/services/upload-s3/index.d.ts +35 -0
  43. package/dist/services/upload-s3/index.js +11 -0
  44. package/dist/services/upload-s3/index.js.map +1 -0
  45. package/dist/styles-2WZORUGA.css +106 -0
  46. package/dist/styles-32VHTPIA.css +20 -0
  47. package/dist/styles-3A5DZ5R7.css +70 -0
  48. package/dist/styles-3PFCZALV.css +60 -0
  49. package/dist/styles-3SNYRDO2.css +100 -0
  50. package/dist/styles-4FHUBUVF.css +150 -0
  51. package/dist/styles-4KAVAZFG.css +5 -0
  52. package/dist/styles-4OFM6DY5.css +22 -0
  53. package/dist/styles-5OXZHQGW.css +14 -0
  54. package/dist/styles-6XZTUN3B.css +68 -0
  55. package/dist/styles-73WOPK6M.css +6 -0
  56. package/dist/styles-7AV26IBF.css +35 -0
  57. package/dist/styles-7DWK55L2.css +71 -0
  58. package/dist/styles-7GWPZSR2.css +222 -0
  59. package/dist/styles-7QBPXFSY.css +6 -0
  60. package/dist/styles-7T6DSZIY.css +27 -0
  61. package/dist/styles-AUI7W2SW.css +408 -0
  62. package/dist/styles-AZSHBXJQ.css +85 -0
  63. package/dist/styles-BTXJVGNW.css +99 -0
  64. package/dist/styles-BUPIQG5C.css +74 -0
  65. package/dist/styles-CLK36LUK.css +27 -0
  66. package/dist/styles-CSKYCMD4.css +123 -0
  67. package/dist/styles-CWCX26BQ.css +13 -0
  68. package/dist/styles-GAIKDZU6.css +47 -0
  69. package/dist/styles-GB7S5BAZ.css +36 -0
  70. package/dist/styles-GVPT6A2Z.css +45 -0
  71. package/dist/styles-IUBOTHBR.css +581 -0
  72. package/dist/styles-IZPTZRKW.css +78 -0
  73. package/dist/styles-LS2YWO5W.css +39 -0
  74. package/dist/styles-M5BEFS4G.css +148 -0
  75. package/dist/styles-MHNICXOS.css +18 -0
  76. package/dist/styles-P6IOJDNI.css +47 -0
  77. package/dist/styles-Q7XE2QVU.css +55 -0
  78. package/dist/styles-R7IS5IGF.css +7 -0
  79. package/dist/styles-RDYYTTBU.css +218 -0
  80. package/dist/styles-RTHIZL5W.css +48 -0
  81. package/dist/styles-RUY4EKZW.css +9 -0
  82. package/dist/styles-T5QJAAUY.css +184 -0
  83. package/dist/styles-VBXWGFCK.css +96 -0
  84. package/dist/styles-VE76CGRO.css +6 -0
  85. package/dist/styles-VLCZ7JYV.css +140 -0
  86. package/dist/styles-W5HDD3YQ.css +71 -0
  87. package/dist/styles-X7BJCSFV.css +86 -0
  88. package/dist/styles-XVRR5GIG.css +42 -0
  89. package/dist/styles-YBC6BJBD.css +83 -0
  90. package/dist/styles-YXNJHPDZ.css +74 -0
  91. package/dist/styles-Z276IEVM.css +264 -0
  92. package/dist/utils/index.d.ts +145 -0
  93. package/dist/utils/index.js +98 -0
  94. package/dist/utils/index.js.map +1 -0
  95. package/package.json +113 -0
  96. package/packages/eslint-config/README.md +69 -0
  97. package/packages/eslint-config/base.js +25 -0
  98. package/packages/eslint-config/next.js +49 -0
  99. package/packages/eslint-config/react-internal.js +44 -0
  100. package/packages/typescript-config/README.md +70 -0
  101. package/packages/typescript-config/base.json +21 -0
  102. package/packages/typescript-config/nextjs.json +12 -0
  103. package/packages/typescript-config/react-library.json +7 -0
@@ -0,0 +1,194 @@
1
+ import {
2
+ DATETIME_FORMATS
3
+ } from "./chunk-MJBMK4OG.js";
4
+ import {
5
+ isFunction,
6
+ isNonEmptyArray,
7
+ isNonEmptyString,
8
+ isObject
9
+ } from "./chunk-SZMEZFAR.js";
10
+
11
+ // packages/utils/app-storage/app-storage.ts
12
+ function storeItem(key, item, storage = sessionStorage) {
13
+ const json = isNonEmptyString(item) ? item : JSON.stringify(item);
14
+ if (isNonEmptyString(json)) {
15
+ storage.setItem(key, json);
16
+ }
17
+ }
18
+ function getStoredItem(key, storage = sessionStorage) {
19
+ const json = storage.getItem(key);
20
+ return isNonEmptyString(json) ? JSON.parse(json + "") || void 0 : void 0;
21
+ }
22
+ function flushStorage(storage = sessionStorage) {
23
+ if (isFunction(storage.clear)) {
24
+ storage.clear();
25
+ }
26
+ }
27
+
28
+ // packages/utils/dom/dom.tsx
29
+ var simulateInputBlur = (input) => {
30
+ setTimeout(() => {
31
+ input.dispatchEvent(new Event("blur"));
32
+ });
33
+ };
34
+ var simulateInputChange = (input, value) => {
35
+ const inputValueSetter = Object.getOwnPropertyDescriptor(
36
+ window.HTMLInputElement.prototype,
37
+ "value"
38
+ )?.set;
39
+ if (inputValueSetter) {
40
+ inputValueSetter.call(input, value ?? null);
41
+ }
42
+ input.dispatchEvent(new Event("input", { bubbles: true }));
43
+ simulateInputBlur(input);
44
+ };
45
+ var getElementAncestorComponent = (initialElement, targetComponentName) => {
46
+ if (initialElement.dataset?.component?.toLowerCase() === targetComponentName) {
47
+ return initialElement;
48
+ }
49
+ let parent = initialElement.parentElement;
50
+ while (parent) {
51
+ const componentName = parent.dataset?.component;
52
+ if (componentName === targetComponentName) {
53
+ return parent;
54
+ }
55
+ parent = parent.parentElement;
56
+ }
57
+ return void 0;
58
+ };
59
+
60
+ // packages/utils/forms/forms.tsx
61
+ var extractQuestionsFromSection = (section) => {
62
+ const questions = [];
63
+ for (const row of section.extraSettings.layoutDefinition.rows) {
64
+ for (const question of row.cols) {
65
+ if (question.id) {
66
+ questions.push(question);
67
+ }
68
+ }
69
+ }
70
+ return questions;
71
+ };
72
+ var getFormElementsByIds = (formElements, fieldIds) => {
73
+ const extractedFormElements = [];
74
+ if (isNonEmptyArray(fieldIds)) {
75
+ fieldIds.forEach((fieldId) => {
76
+ const match = formElements.find(({ id }) => id === fieldId);
77
+ if (match) {
78
+ extractedFormElements.push(match);
79
+ }
80
+ });
81
+ }
82
+ return extractedFormElements;
83
+ };
84
+
85
+ // packages/utils/helpers/helpers.tsx
86
+ import { capitalize, has } from "lodash-es";
87
+ var crunchClasses = (classHash) => {
88
+ const matchingKeys = [];
89
+ const keys = isObject(classHash) ? Object.keys(classHash) : [];
90
+ keys.forEach((key) => {
91
+ const isValidClassName = isNonEmptyString(key) && Object.prototype.hasOwnProperty.call(classHash, key);
92
+ if (isValidClassName && classHash[key]) {
93
+ matchingKeys.push(key);
94
+ }
95
+ });
96
+ return matchingKeys.join(" ");
97
+ };
98
+ var generateId = /* @__PURE__ */ (() => {
99
+ let index = 0;
100
+ return (prefix) => {
101
+ index += 1;
102
+ return isNonEmptyString(prefix) ? `${prefix}-${index}` : `id-${index}`;
103
+ };
104
+ })();
105
+ var injectScript = (src, { target, ...rest }) => {
106
+ let script;
107
+ if (isNonEmptyString(src)) {
108
+ const injectionTarget = target || document.body;
109
+ script = document.createElement("script");
110
+ script.src = src;
111
+ Object.keys(rest).forEach((key) => {
112
+ if (script) {
113
+ script[key] = rest[key];
114
+ }
115
+ });
116
+ injectionTarget.appendChild(script);
117
+ }
118
+ return script;
119
+ };
120
+ var removeDOMNode = (node) => {
121
+ return node.parentNode.removeChild(node);
122
+ };
123
+ var debounce = (callback, wait) => {
124
+ let timeout;
125
+ return (...args) => {
126
+ const context = void 0;
127
+ clearTimeout(timeout);
128
+ timeout = setTimeout(() => callback.apply(context, args), wait);
129
+ };
130
+ };
131
+ var encodeSearchTerms = (searchTerms, { shouldEncodeUri } = {
132
+ shouldEncodeUri: true
133
+ }) => {
134
+ const termsArray = Array.isArray(searchTerms) ? searchTerms : [searchTerms];
135
+ const termHasKeyAndVal = (term) => has(term, "key") && (has(term, "val") || has(term, "operator"));
136
+ return termsArray.filter(termHasKeyAndVal).map(({ key, val, operator }) => {
137
+ const keyValuePair = `${key}${operator ?? ":"}${val ?? ""}`;
138
+ return shouldEncodeUri !== false ? encodeURIComponent(keyValuePair) : keyValuePair;
139
+ });
140
+ };
141
+ var sortCollectionByKey = (collection, key) => {
142
+ return collection.sort((a, b) => {
143
+ const valueA = isNonEmptyString(a[key]) ? a[key].toLowerCase() : "";
144
+ const valueB = isNonEmptyString(b[key]) ? b[key].toLowerCase() : "";
145
+ return valueA > valueB ? 1 : -1;
146
+ });
147
+ };
148
+ var alphaSortCollectionByKey = (collection, key) => {
149
+ return collection.sort((a, b) => {
150
+ const valueA = isNonEmptyString(a[key]) ? a[key].toLowerCase() : "";
151
+ const valueB = isNonEmptyString(b[key]) ? b[key].toLowerCase() : "";
152
+ return valueA.localeCompare(valueB);
153
+ });
154
+ };
155
+ var getDatetimeFormat = () => {
156
+ const lang = navigator.language;
157
+ return DATETIME_FORMATS.get(lang?.toLowerCase()) ?? DATETIME_FORMATS.get("en-us");
158
+ };
159
+ var trim = (string, target = "s") => {
160
+ if (isNonEmptyString(string)) {
161
+ const pattern = `(^${target}+)|(${target}+$)`;
162
+ const regex = new RegExp(pattern, "g");
163
+ return string.replace(regex, "");
164
+ }
165
+ return string;
166
+ };
167
+ var capitalizeAndJoin = (items, splitter = "_", separator = ", ") => {
168
+ return Array.isArray(items) ? items.map(
169
+ (item) => item.split(splitter).map((word) => capitalize(word)).join(" ")
170
+ ).join(separator) : "";
171
+ };
172
+
173
+ export {
174
+ crunchClasses,
175
+ generateId,
176
+ injectScript,
177
+ removeDOMNode,
178
+ debounce,
179
+ encodeSearchTerms,
180
+ sortCollectionByKey,
181
+ alphaSortCollectionByKey,
182
+ getDatetimeFormat,
183
+ trim,
184
+ capitalizeAndJoin,
185
+ storeItem,
186
+ getStoredItem,
187
+ flushStorage,
188
+ simulateInputBlur,
189
+ simulateInputChange,
190
+ getElementAncestorComponent,
191
+ extractQuestionsFromSection,
192
+ getFormElementsByIds
193
+ };
194
+ //# sourceMappingURL=chunk-RG4GEORO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/utils/app-storage/app-storage.ts","../packages/utils/dom/dom.tsx","../packages/utils/forms/forms.tsx","../packages/utils/helpers/helpers.tsx"],"sourcesContent":["import { isNonEmptyString, isFunction } from '@/utils/type-checks';\n\nexport function storeItem(\n\tkey: string,\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\titem: any,\n\tstorage: Storage = sessionStorage,\n) {\n\tconst json = isNonEmptyString(item) ? item : JSON.stringify(item);\n\n\tif (isNonEmptyString(json)) {\n\t\tstorage.setItem(key, json);\n\t}\n}\n\nexport function getStoredItem(key: string, storage: Storage = sessionStorage) {\n\tconst json = storage.getItem(key);\n\n\treturn isNonEmptyString(json) ? JSON.parse(json + '') || undefined : undefined;\n}\n\nexport function flushStorage(storage: Storage = sessionStorage) {\n\tif (isFunction(storage.clear)) {\n\t\tstorage.clear();\n\t}\n}\n","export const simulateInputBlur = (input: HTMLInputElement) => {\n\tsetTimeout(() => {\n\t\tinput.dispatchEvent(new Event('blur'));\n\t});\n};\n\nexport const simulateInputChange = (\n\tinput: HTMLInputElement,\n\tvalue: string | null,\n) => {\n\tconst inputValueSetter = Object.getOwnPropertyDescriptor(\n\t\twindow.HTMLInputElement.prototype,\n\t\t'value',\n\t)?.set;\n\tif (inputValueSetter) {\n\t\tinputValueSetter.call(input, value ?? null);\n\t}\n\tinput.dispatchEvent(new Event('input', { bubbles: true }));\n\n\tsimulateInputBlur(input);\n};\n\nexport const getElementAncestorComponent = (\n\tinitialElement: HTMLElement,\n\ttargetComponentName: string,\n): HTMLElement | undefined => {\n\tif (initialElement.dataset?.component?.toLowerCase() === targetComponentName) {\n\t\treturn initialElement;\n\t}\n\n\tlet parent = initialElement.parentElement;\n\n\twhile (parent) {\n\t\tconst componentName = parent.dataset?.component;\n\n\t\tif (componentName === targetComponentName) {\n\t\t\treturn parent;\n\t\t}\n\n\t\tparent = parent.parentElement;\n\t}\n\n\treturn undefined;\n};\n","import { isNonEmptyArray } from '@/utils/type-checks';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const extractQuestionsFromSection = (section: any) => {\n\tconst questions = [];\n\tfor (const row of section.extraSettings.layoutDefinition.rows) {\n\t\tfor (const question of row.cols) {\n\t\t\tif (question.id) {\n\t\t\t\tquestions.push(question);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn questions;\n};\n\nexport const getFormElementsByIds = (\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tformElements: any[],\n\tfieldIds: string[],\n) => {\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tconst extractedFormElements: any[] = [];\n\n\tif (isNonEmptyArray(fieldIds)) {\n\t\tfieldIds.forEach((fieldId: string) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\tconst match = formElements.find(({ id }: any) => id === fieldId);\n\n\t\t\tif (match) {\n\t\t\t\textractedFormElements.push(match);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn extractedFormElements;\n};\n","import { isObject, isNonEmptyString } from '@/utils/type-checks';\nimport { DATETIME_FORMATS } from '@/globals/constants';\nimport { capitalize, has } from 'lodash-es';\n\n/**\n * expects plain object hash of { stringClassName: boolShouldInclude } key-value pairs\n * @deprecated use `classNames` package instead\n */\nexport const crunchClasses = (classHash: Record<string, boolean>): string => {\n\tconst matchingKeys: string[] = [];\n\tconst keys = isObject(classHash) ? Object.keys(classHash) : [];\n\n\tkeys.forEach((key) => {\n\t\tconst isValidClassName =\n\t\t\tisNonEmptyString(key) && Object.prototype.hasOwnProperty.call(classHash, key);\n\n\t\tif (isValidClassName && classHash[key]) {\n\t\t\tmatchingKeys.push(key);\n\t\t}\n\t});\n\n\treturn matchingKeys.join(' ');\n};\n\n/**\n * Use `uuid` or `React.useId` instead\n */\nexport const generateId = (() => {\n\tlet index = 0;\n\n\treturn (prefix: string): string => {\n\t\tindex += 1;\n\n\t\treturn isNonEmptyString(prefix) ? `${prefix}-${index}` : `id-${index}`;\n\t};\n})();\n\nexport const injectScript = (\n\tsrc: string,\n\t{ target, ...rest }: { target?: HTMLElement } & Partial<HTMLScriptElement>,\n): HTMLScriptElement | undefined => {\n\tlet script: HTMLScriptElement | undefined;\n\n\tif (isNonEmptyString(src)) {\n\t\tconst injectionTarget = target || document.body;\n\n\t\tscript = document.createElement('script');\n\t\tscript.src = src;\n\n\t\tObject.keys(rest).forEach((key) => {\n\t\t\tif (script) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\t(script as any)[key] = rest[key as keyof HTMLScriptElement];\n\t\t\t}\n\t\t});\n\n\t\tinjectionTarget.appendChild(script);\n\t}\n\n\treturn script;\n};\n\nexport const removeDOMNode = <T extends Node>(node: T): T => {\n\treturn node.parentNode!.removeChild(node);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const debounce = <T extends (...args: any[]) => any>(\n\tcallback: T,\n\twait: number,\n): ((...args: Parameters<T>) => void) => {\n\tlet timeout: NodeJS.Timeout;\n\n\treturn (...args: Parameters<T>) => {\n\t\t// eslint-disable-next-line @typescript-eslint/no-this-alias\n\t\tconst context = this;\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(() => callback.apply(context, args), wait);\n\t};\n};\n\ninterface SearchTerm {\n\tkey: string;\n\tval?: string;\n\toperator?: string;\n}\n\nexport const encodeSearchTerms = (\n\tsearchTerms: SearchTerm | SearchTerm[],\n\t{ shouldEncodeUri }: { shouldEncodeUri?: boolean } = {\n\t\tshouldEncodeUri: true,\n\t},\n): string[] => {\n\tconst termsArray = Array.isArray(searchTerms) ? searchTerms : [searchTerms];\n\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tconst termHasKeyAndVal = (term: any): term is SearchTerm =>\n\t\thas(term, 'key') && (has(term, 'val') || has(term, 'operator'));\n\n\treturn termsArray.filter(termHasKeyAndVal).map(({ key, val, operator }) => {\n\t\tconst keyValuePair = `${key}${operator ?? ':'}${val ?? ''}`;\n\n\t\treturn shouldEncodeUri !== false\n\t\t\t? encodeURIComponent(keyValuePair)\n\t\t\t: keyValuePair;\n\t});\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const sortCollectionByKey = <T extends Record<string, any>>(\n\tcollection: T[],\n\tkey: string,\n): T[] => {\n\treturn collection.sort((a, b) => {\n\t\tconst valueA = isNonEmptyString(a[key]) ? a[key].toLowerCase() : '';\n\t\tconst valueB = isNonEmptyString(b[key]) ? b[key].toLowerCase() : '';\n\n\t\treturn valueA > valueB ? 1 : -1;\n\t});\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const alphaSortCollectionByKey = <T extends Record<string, any>>(\n\tcollection: T[],\n\tkey: string,\n): T[] => {\n\treturn collection.sort((a, b) => {\n\t\tconst valueA = isNonEmptyString(a[key]) ? a[key].toLowerCase() : '';\n\t\tconst valueB = isNonEmptyString(b[key]) ? b[key].toLowerCase() : '';\n\n\t\treturn valueA.localeCompare(valueB);\n\t});\n};\n\n/**\n * Get the datetime format for the current or fallback locale.\n *\n * @returns {{\n * date: string,\n * time: string,\n * datePlaceholder: string,\n * }} The datetime format for the locale.\n */\nexport const getDatetimeFormat = (): {\n\tdate: string;\n\ttime: string;\n\tdatePlaceholder: string;\n} => {\n\tconst lang = navigator.language;\n\n\treturn (DATETIME_FORMATS.get(lang?.toLowerCase()) ??\n\t\tDATETIME_FORMATS.get('en-us'))!;\n};\n\n/**\n * Note, the escaped characters are needed for the regex to work right\n */\nexport const trim = (string: string, target = 's') => {\n\tif (isNonEmptyString(string)) {\n\t\t// eslint-disable-next-line no-useless-escape\n\t\tconst pattern = `(^${target}+)|(${target}+\\$)`;\n\t\tconst regex = new RegExp(pattern, 'g');\n\n\t\treturn string.replace(regex, '');\n\t}\n\n\treturn string;\n};\n\nexport const capitalizeAndJoin = (\n\titems: string[],\n\tsplitter = '_',\n\tseparator = ', ',\n) => {\n\treturn Array.isArray(items)\n\t\t? items\n\t\t\t\t.map((item) =>\n\t\t\t\t\titem\n\t\t\t\t\t\t.split(splitter)\n\t\t\t\t\t\t.map((word) => capitalize(word))\n\t\t\t\t\t\t.join(' '),\n\t\t\t\t)\n\t\t\t\t.join(separator)\n\t\t: '';\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,193 @@
1
+ // packages/utils/type-checks/index.ts
2
+ var isNonEmptyString = (value) => typeof value === "string" && value.length > 0;
3
+ var isString = (value) => typeof value === "string";
4
+ var isNumber = (value) => typeof value === "number";
5
+ var isBool = (value) => typeof value === "boolean";
6
+ var { isArray } = Array;
7
+ var isNonEmptyArray = (value) => Array.isArray(value) && value.length > 0;
8
+ var isNonEmptyMap = (value) => value instanceof Map && value.size > 0;
9
+ var isFunction = (value) => typeof value === "function";
10
+ var isObject = (object) => object && typeof object === "object";
11
+ var isNonEmptyObject = (object) => object && isObject(object) && Object.keys(object).length > 0;
12
+ var isObjectWithKey = (object, key) => isObject(object) && key in object;
13
+ var isMap = (value) => isObject(value) && value instanceof Map;
14
+ var isUrl = (string) => {
15
+ try {
16
+ return Boolean(new URL(string));
17
+ } catch {
18
+ return false;
19
+ }
20
+ };
21
+
22
+ // packages/utils/http/constants.ts
23
+ var ERROR_NOT_AUTHORIZED = "The action is not authorized. Please contact an administrator to check your permissions.";
24
+ var ERROR_INTERNAL_SERVER_ERROR = "Internal server error";
25
+ var ERROR_STATUS_CODE_400 = 400;
26
+ var ERROR_STATUS_CODE_401 = 401;
27
+ var ERROR_STATUS_CODE_403 = 403;
28
+ var ERROR_STATUS_CODE_500 = 500;
29
+ var ERROR_FORBIDDEN_FILE_EXTENSION = "FORBIDDEN_FILE_EXTENSION";
30
+ var NODE_ENV = process.env.NODE_ENV;
31
+ var APP_ENV = process.env.REACT_APP_ENVIRONMENT;
32
+ var IS_DEV = NODE_ENV === "development" || NODE_ENV === "test" || APP_ENV === "develop";
33
+ var IS_LIVE = !IS_DEV && APP_ENV === "live";
34
+ var IS_PROD_SG = !IS_DEV && APP_ENV === "prod-sg";
35
+ var PROD_ENV = IS_PROD_SG || IS_LIVE;
36
+
37
+ // packages/utils/http/index.ts
38
+ var notify = (
39
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
+ global.__CAYUSE__?.notify ?? (() => {
41
+ console.error(
42
+ "function is not defined. check is banner-notification package install"
43
+ );
44
+ })
45
+ );
46
+ var registerGetTokenSilently = (getTokenSilentlyFunction) => {
47
+ global.__CAYUSE__ = global.__CAYUSE__ ?? {};
48
+ if (isFunction(getTokenSilentlyFunction)) {
49
+ global.__CAYUSE__.appGetTokenSilently = getTokenSilentlyFunction;
50
+ }
51
+ };
52
+ var CayuseError = class extends Error {
53
+ name;
54
+ message;
55
+ cause;
56
+ response;
57
+ meta;
58
+ constructor(message, httpResponseObject = null) {
59
+ super(message);
60
+ this.name = "CayuseError";
61
+ this.message = message;
62
+ this.cause = httpResponseObject;
63
+ this.response = httpResponseObject;
64
+ this.meta = {
65
+ spRequestId: httpResponseObject?.headers?.get("x-sp-request-id") ?? "",
66
+ flowableDesignRequestId: httpResponseObject?.headers?.get("x-flowable-design-request-id") ?? "",
67
+ flowableEngageRequestId: httpResponseObject?.headers?.get("x-flowable-engage-request-id") ?? ""
68
+ };
69
+ }
70
+ };
71
+ function isCayuseError(error) {
72
+ return error instanceof CayuseError || error && error.name === "CayuseError" && error.message;
73
+ }
74
+ var checkErrorBody = async (error) => {
75
+ const contentType = error.headers.get("Content-Type");
76
+ if (contentType && contentType.includes("json")) {
77
+ const errorBody = await error.json().catch(() => ({})) ?? {};
78
+ if (errorBody.error === ERROR_FORBIDDEN_FILE_EXTENSION) {
79
+ notify(errorBody.message ?? "", { type: "error" });
80
+ }
81
+ if (errorBody.message) {
82
+ notify(errorBody.message, { type: "error" });
83
+ }
84
+ } else if (contentType && contentType.includes("text/plain")) {
85
+ const text = await error.text();
86
+ notify(text, { type: "error" });
87
+ } else {
88
+ notify(ERROR_NOT_AUTHORIZED, { type: "error" });
89
+ }
90
+ };
91
+ var checkResponseStatus = async (response, notifyUponError) => {
92
+ if (response.status === ERROR_STATUS_CODE_401 && notifyUponError) {
93
+ notify("", { type: "login" });
94
+ } else if ((response.status === ERROR_STATUS_CODE_403 || response.status === ERROR_STATUS_CODE_400) && notifyUponError) {
95
+ await checkErrorBody(response);
96
+ } else if (response.status === ERROR_STATUS_CODE_500) {
97
+ const err = new CayuseError(ERROR_INTERNAL_SERVER_ERROR, response);
98
+ if (notifyUponError) {
99
+ notify(ERROR_INTERNAL_SERVER_ERROR, { type: "error" });
100
+ }
101
+ throw err;
102
+ }
103
+ if (!response.ok) {
104
+ throw new CayuseError(response.statusText, response);
105
+ }
106
+ return response;
107
+ };
108
+ var fetchWithRetry = (url, options, args = {}) => {
109
+ const { numRetries, attemptNumber, notifyUponError } = {
110
+ numRetries: 2,
111
+ attemptNumber: 1,
112
+ notifyUponError: !PROD_ENV,
113
+ ...args
114
+ };
115
+ const retryTimeoutInSeconds = Math.pow(2, attemptNumber - 1);
116
+ return fetch(url, options).then((res) => checkResponseStatus(res, notifyUponError)).then((response) => {
117
+ const contentType = response.headers.get("Content-Type");
118
+ if (contentType && contentType.includes("json")) {
119
+ return response.json().catch(() => ({}));
120
+ }
121
+ return response.text();
122
+ }).catch((error) => {
123
+ if (error.message === ERROR_INTERNAL_SERVER_ERROR) {
124
+ if (numRetries === 0) {
125
+ if (notifyUponError) {
126
+ notify(error.message, { type: "error" });
127
+ }
128
+ throw error;
129
+ }
130
+ return new Promise((resolve) => {
131
+ setTimeout(
132
+ () => resolve(
133
+ fetchWithRetry(url, options, {
134
+ numRetries: numRetries - 1,
135
+ attemptNumber: attemptNumber + 1,
136
+ notifyUponError
137
+ })
138
+ ),
139
+ retryTimeoutInSeconds * 1e3
140
+ );
141
+ });
142
+ }
143
+ throw error;
144
+ });
145
+ };
146
+ var executeRequest = (url, options = {}, args = {}) => {
147
+ const doFetch = (token) => {
148
+ const allOptions = {
149
+ ...options,
150
+ headers: {
151
+ ...options.headers || {},
152
+ Authorization: `Bearer ${token}`,
153
+ "X-IDP-New-Login": "true"
154
+ }
155
+ };
156
+ if (options.method !== "GET" && !args.numRetries) {
157
+ args.numRetries = 0;
158
+ }
159
+ return fetchWithRetry(url, allOptions, args);
160
+ };
161
+ let getTokenPromise = Promise.resolve("");
162
+ if (isFunction(global.__CAYUSE__?.appGetTokenSilently)) {
163
+ const returnValue = global.__CAYUSE__.appGetTokenSilently();
164
+ getTokenPromise = returnValue instanceof Promise ? returnValue : Promise.resolve(returnValue);
165
+ }
166
+ return getTokenPromise.then((token) => doFetch(token));
167
+ };
168
+ var request = async (url, options = {}, args = {}) => {
169
+ return executeRequest(url, options, args);
170
+ };
171
+
172
+ export {
173
+ isNonEmptyString,
174
+ isString,
175
+ isNumber,
176
+ isBool,
177
+ isArray,
178
+ isNonEmptyArray,
179
+ isNonEmptyMap,
180
+ isFunction,
181
+ isObject,
182
+ isNonEmptyObject,
183
+ isObjectWithKey,
184
+ isMap,
185
+ isUrl,
186
+ registerGetTokenSilently,
187
+ CayuseError,
188
+ isCayuseError,
189
+ checkErrorBody,
190
+ executeRequest,
191
+ request
192
+ };
193
+ //# sourceMappingURL=chunk-SZMEZFAR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/utils/type-checks/index.ts","../packages/utils/http/constants.ts","../packages/utils/http/index.ts"],"sourcesContent":["export const isNonEmptyString = (value: unknown): value is string =>\n\ttypeof value === 'string' && value.length > 0;\n\nexport const isString = (value: unknown): value is string =>\n\ttypeof value === 'string';\n\nexport const isNumber = (value: unknown): value is number =>\n\ttypeof value === 'number';\n\nexport const isBool = (value: unknown): value is boolean =>\n\ttypeof value === 'boolean';\n\nexport const { isArray } = Array;\n\nexport const isNonEmptyArray = (value: unknown) =>\n\tArray.isArray(value) && value.length > 0;\n\nexport const isNonEmptyMap = (value: unknown) =>\n\tvalue instanceof Map && value.size > 0;\n\nexport const isFunction = (value: unknown) => typeof value === 'function';\n\nexport const isObject = (object: object) => object && typeof object === 'object';\n\nexport const isNonEmptyObject = (object?: object) =>\n\tobject && isObject(object) && Object.keys(object).length > 0;\n\nexport const isObjectWithKey = <T extends object>(object: T, key: string) =>\n\tisObject(object) && key in object;\n\nexport const isMap = (value: object) => isObject(value) && value instanceof Map;\n\nexport const isUrl = (string: string) => {\n\ttry {\n\t\treturn Boolean(new URL(string));\n\t} catch {\n\t\treturn false;\n\t}\n};\n","export const ERROR_NOT_AUTHORIZED =\n\t'The action is not authorized. Please contact an administrator to check your permissions.';\nexport const ERROR_INTERNAL_SERVER_ERROR = 'Internal server error';\nexport const ERROR_STATUS_CODE_400 = 400;\nexport const ERROR_STATUS_CODE_401 = 401;\nexport const ERROR_STATUS_CODE_403 = 403;\nexport const ERROR_STATUS_CODE_500 = 500;\nexport const ERROR_FORBIDDEN_FILE_EXTENSION = 'FORBIDDEN_FILE_EXTENSION';\n\nconst NODE_ENV = process.env.NODE_ENV;\nconst APP_ENV = process.env.REACT_APP_ENVIRONMENT;\n\nconst IS_DEV =\n\tNODE_ENV === 'development' || NODE_ENV === 'test' || APP_ENV === 'develop';\nconst IS_LIVE = !IS_DEV && APP_ENV === 'live';\nconst IS_PROD_SG = !IS_DEV && APP_ENV === 'prod-sg';\n\nexport const PROD_ENV = IS_PROD_SG || IS_LIVE;\n","import { isFunction } from '@/utils/type-checks';\nimport {\n\tERROR_FORBIDDEN_FILE_EXTENSION,\n\tERROR_INTERNAL_SERVER_ERROR,\n\tERROR_NOT_AUTHORIZED,\n\tERROR_STATUS_CODE_400,\n\tERROR_STATUS_CODE_401,\n\tERROR_STATUS_CODE_403,\n\tERROR_STATUS_CODE_500,\n\tPROD_ENV,\n} from './constants.js';\n\ninterface CayuseGlobal {\n\tappGetTokenSilently?: () => string | Promise<string>;\n}\n\ndeclare global {\n\tvar global: typeof globalThis & {\n\t\t__CAYUSE__: CayuseGlobal | undefined;\n\t};\n}\n\nconst notify =\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t(global as any).__CAYUSE__?.notify ??\n\t(() => {\n\t\tconsole.error(\n\t\t\t'function is not defined. check is banner-notification package install',\n\t\t);\n\t});\n\n/**\n * Apps must \"register\" a global function to get tokens in the background using registerGetTokenSilently\n */\nexport const registerGetTokenSilently = (\n\tgetTokenSilentlyFunction: () => string | Promise<string>,\n): void => {\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t(global as any).__CAYUSE__ = (global as any).__CAYUSE__ ?? {};\n\n\tif (isFunction(getTokenSilentlyFunction)) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t(global as any).__CAYUSE__.appGetTokenSilently = getTokenSilentlyFunction;\n\t}\n};\n\nexport class CayuseError extends Error {\n\tname: string;\n\tmessage: string;\n\tcause: Response | null;\n\tresponse: Response | null;\n\tmeta: {\n\t\tspRequestId: string;\n\t\tflowableDesignRequestId: string;\n\t\tflowableEngageRequestId: string;\n\t};\n\n\tconstructor(message: string, httpResponseObject: Response | null = null) {\n\t\tsuper(message);\n\n\t\tthis.name = 'CayuseError';\n\t\tthis.message = message;\n\t\tthis.cause = httpResponseObject;\n\t\tthis.response = httpResponseObject;\n\t\tthis.meta = {\n\t\t\tspRequestId: httpResponseObject?.headers?.get('x-sp-request-id') ?? '',\n\t\t\tflowableDesignRequestId:\n\t\t\t\thttpResponseObject?.headers?.get('x-flowable-design-request-id') ?? '',\n\t\t\tflowableEngageRequestId:\n\t\t\t\thttpResponseObject?.headers?.get('x-flowable-engage-request-id') ?? '',\n\t\t};\n\t}\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isCayuseError(error: any): error is CayuseError {\n\treturn (\n\t\terror instanceof CayuseError ||\n\t\t(error && error.name === 'CayuseError' && error.message)\n\t);\n}\n\nexport const checkErrorBody = async (error: Response): Promise<void> => {\n\tconst contentType = error.headers.get('Content-Type');\n\n\tif (contentType && contentType.includes('json')) {\n\t\tconst errorBody: { error?: string; message?: string } =\n\t\t\t(await error.json().catch(() => ({}))) ?? {};\n\n\t\tif (errorBody.error === ERROR_FORBIDDEN_FILE_EXTENSION) {\n\t\t\tnotify(errorBody.message ?? '', { type: 'error' });\n\t\t}\n\n\t\tif (errorBody.message) {\n\t\t\tnotify(errorBody.message, { type: 'error' });\n\t\t}\n\t} else if (contentType && contentType.includes('text/plain')) {\n\t\tconst text = await error.text();\n\t\tnotify(text, { type: 'error' });\n\t} else {\n\t\tnotify(ERROR_NOT_AUTHORIZED, { type: 'error' });\n\t}\n};\n\nconst checkResponseStatus = async (\n\tresponse: Response,\n\tnotifyUponError: boolean,\n): Promise<Response> => {\n\tif (response.status === ERROR_STATUS_CODE_401 && notifyUponError) {\n\t\tnotify('', { type: 'login' });\n\t} else if (\n\t\t(response.status === ERROR_STATUS_CODE_403 ||\n\t\t\tresponse.status === ERROR_STATUS_CODE_400) &&\n\t\tnotifyUponError\n\t) {\n\t\tawait checkErrorBody(response);\n\t} else if (response.status === ERROR_STATUS_CODE_500) {\n\t\tconst err = new CayuseError(ERROR_INTERNAL_SERVER_ERROR, response);\n\n\t\tif (notifyUponError) {\n\t\t\tnotify(ERROR_INTERNAL_SERVER_ERROR, { type: 'error' });\n\t\t}\n\t\tthrow err;\n\t}\n\n\tif (!response.ok) {\n\t\tthrow new CayuseError(response.statusText, response);\n\t}\n\n\treturn response;\n};\n\ninterface FetchArgs {\n\tnumRetries?: number;\n\tattemptNumber?: number;\n\tnotifyUponError?: boolean;\n}\n\nconst fetchWithRetry = (\n\turl: string,\n\toptions: RequestInit,\n\targs: FetchArgs = {},\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Promise<any> => {\n\tconst { numRetries, attemptNumber, notifyUponError } = {\n\t\tnumRetries: 2,\n\t\tattemptNumber: 1,\n\t\tnotifyUponError: !PROD_ENV,\n\t\t...args,\n\t};\n\n\tconst retryTimeoutInSeconds = Math.pow(2, attemptNumber - 1);\n\n\treturn fetch(url, options)\n\t\t.then((res) => checkResponseStatus(res, notifyUponError))\n\t\t.then((response) => {\n\t\t\tconst contentType = response.headers.get('Content-Type');\n\n\t\t\tif (contentType && contentType.includes('json')) {\n\t\t\t\treturn response.json().catch(() => ({}));\n\t\t\t}\n\t\t\treturn response.text();\n\t\t})\n\t\t.catch((error: CayuseError) => {\n\t\t\tif (error.message === ERROR_INTERNAL_SERVER_ERROR) {\n\t\t\t\tif (numRetries === 0) {\n\t\t\t\t\tif (notifyUponError) {\n\t\t\t\t\t\tnotify(error.message, { type: 'error' });\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\tsetTimeout(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\tfetchWithRetry(url, options, {\n\t\t\t\t\t\t\t\t\tnumRetries: numRetries - 1,\n\t\t\t\t\t\t\t\t\tattemptNumber: attemptNumber + 1,\n\t\t\t\t\t\t\t\t\tnotifyUponError,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\tretryTimeoutInSeconds * 1000,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow error;\n\t\t});\n};\n\nexport const executeRequest = (\n\turl: string,\n\toptions: RequestInit = {},\n\targs: FetchArgs = {},\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Promise<any> => {\n\tconst doFetch = (token: string) => {\n\t\tconst allOptions: RequestInit = {\n\t\t\t...options,\n\t\t\theaders: {\n\t\t\t\t...(options.headers || {}),\n\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t'X-IDP-New-Login': 'true',\n\t\t\t},\n\t\t};\n\n\t\tif (options.method !== 'GET' && !args.numRetries) {\n\t\t\targs.numRetries = 0;\n\t\t}\n\n\t\treturn fetchWithRetry(url, allOptions, args);\n\t};\n\n\tlet getTokenPromise: Promise<string> = Promise.resolve('');\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tif (isFunction((global as any).__CAYUSE__?.appGetTokenSilently)) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tconst returnValue = (global as any).__CAYUSE__.appGetTokenSilently();\n\n\t\tgetTokenPromise =\n\t\t\treturnValue instanceof Promise ? returnValue : Promise.resolve(returnValue);\n\t}\n\n\treturn getTokenPromise.then((token) => doFetch(token));\n};\n\nexport const request = async (url: string, options = {}, args = {}) => {\n\treturn executeRequest(url, options, args);\n};\n"],"mappings":";AAAO,IAAM,mBAAmB,CAAC,UAChC,OAAO,UAAU,YAAY,MAAM,SAAS;AAEtC,IAAM,WAAW,CAAC,UACxB,OAAO,UAAU;AAEX,IAAM,WAAW,CAAC,UACxB,OAAO,UAAU;AAEX,IAAM,SAAS,CAAC,UACtB,OAAO,UAAU;AAEX,IAAM,EAAE,QAAQ,IAAI;AAEpB,IAAM,kBAAkB,CAAC,UAC/B,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS;AAEjC,IAAM,gBAAgB,CAAC,UAC7B,iBAAiB,OAAO,MAAM,OAAO;AAE/B,IAAM,aAAa,CAAC,UAAmB,OAAO,UAAU;AAExD,IAAM,WAAW,CAAC,WAAmB,UAAU,OAAO,WAAW;AAEjE,IAAM,mBAAmB,CAAC,WAChC,UAAU,SAAS,MAAM,KAAK,OAAO,KAAK,MAAM,EAAE,SAAS;AAErD,IAAM,kBAAkB,CAAmB,QAAW,QAC5D,SAAS,MAAM,KAAK,OAAO;AAErB,IAAM,QAAQ,CAAC,UAAkB,SAAS,KAAK,KAAK,iBAAiB;AAErE,IAAM,QAAQ,CAAC,WAAmB;AACxC,MAAI;AACH,WAAO,QAAQ,IAAI,IAAI,MAAM,CAAC;AAAA,EAC/B,QAAQ;AACP,WAAO;AAAA,EACR;AACD;;;ACtCO,IAAM,uBACZ;AACM,IAAM,8BAA8B;AACpC,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAC9B,IAAM,iCAAiC;AAE9C,IAAM,WAAW,QAAQ,IAAI;AAC7B,IAAM,UAAU,QAAQ,IAAI;AAE5B,IAAM,SACL,aAAa,iBAAiB,aAAa,UAAU,YAAY;AAClE,IAAM,UAAU,CAAC,UAAU,YAAY;AACvC,IAAM,aAAa,CAAC,UAAU,YAAY;AAEnC,IAAM,WAAW,cAAc;;;ACKtC,IAAM;AAAA;AAAA,EAEJ,OAAe,YAAY,WAC3B,MAAM;AACN,YAAQ;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAAA;AAKM,IAAM,2BAA2B,CACvC,6BACU;AAEV,EAAC,OAAe,aAAc,OAAe,cAAc,CAAC;AAE5D,MAAI,WAAW,wBAAwB,GAAG;AAEzC,IAAC,OAAe,WAAW,sBAAsB;AAAA,EAClD;AACD;AAEO,IAAM,cAAN,cAA0B,MAAM;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAMA,YAAY,SAAiB,qBAAsC,MAAM;AACxE,UAAM,OAAO;AAEb,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,WAAW;AAChB,SAAK,OAAO;AAAA,MACX,aAAa,oBAAoB,SAAS,IAAI,iBAAiB,KAAK;AAAA,MACpE,yBACC,oBAAoB,SAAS,IAAI,8BAA8B,KAAK;AAAA,MACrE,yBACC,oBAAoB,SAAS,IAAI,8BAA8B,KAAK;AAAA,IACtE;AAAA,EACD;AACD;AAGO,SAAS,cAAc,OAAkC;AAC/D,SACC,iBAAiB,eAChB,SAAS,MAAM,SAAS,iBAAiB,MAAM;AAElD;AAEO,IAAM,iBAAiB,OAAO,UAAmC;AACvE,QAAM,cAAc,MAAM,QAAQ,IAAI,cAAc;AAEpD,MAAI,eAAe,YAAY,SAAS,MAAM,GAAG;AAChD,UAAM,YACJ,MAAM,MAAM,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE,KAAM,CAAC;AAE5C,QAAI,UAAU,UAAU,gCAAgC;AACvD,aAAO,UAAU,WAAW,IAAI,EAAE,MAAM,QAAQ,CAAC;AAAA,IAClD;AAEA,QAAI,UAAU,SAAS;AACtB,aAAO,UAAU,SAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC5C;AAAA,EACD,WAAW,eAAe,YAAY,SAAS,YAAY,GAAG;AAC7D,UAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,WAAO,MAAM,EAAE,MAAM,QAAQ,CAAC;AAAA,EAC/B,OAAO;AACN,WAAO,sBAAsB,EAAE,MAAM,QAAQ,CAAC;AAAA,EAC/C;AACD;AAEA,IAAM,sBAAsB,OAC3B,UACA,oBACuB;AACvB,MAAI,SAAS,WAAW,yBAAyB,iBAAiB;AACjE,WAAO,IAAI,EAAE,MAAM,QAAQ,CAAC;AAAA,EAC7B,YACE,SAAS,WAAW,yBACpB,SAAS,WAAW,0BACrB,iBACC;AACD,UAAM,eAAe,QAAQ;AAAA,EAC9B,WAAW,SAAS,WAAW,uBAAuB;AACrD,UAAM,MAAM,IAAI,YAAY,6BAA6B,QAAQ;AAEjE,QAAI,iBAAiB;AACpB,aAAO,6BAA6B,EAAE,MAAM,QAAQ,CAAC;AAAA,IACtD;AACA,UAAM;AAAA,EACP;AAEA,MAAI,CAAC,SAAS,IAAI;AACjB,UAAM,IAAI,YAAY,SAAS,YAAY,QAAQ;AAAA,EACpD;AAEA,SAAO;AACR;AAQA,IAAM,iBAAiB,CACtB,KACA,SACA,OAAkB,CAAC,MAED;AAClB,QAAM,EAAE,YAAY,eAAe,gBAAgB,IAAI;AAAA,IACtD,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,iBAAiB,CAAC;AAAA,IAClB,GAAG;AAAA,EACJ;AAEA,QAAM,wBAAwB,KAAK,IAAI,GAAG,gBAAgB,CAAC;AAE3D,SAAO,MAAM,KAAK,OAAO,EACvB,KAAK,CAAC,QAAQ,oBAAoB,KAAK,eAAe,CAAC,EACvD,KAAK,CAAC,aAAa;AACnB,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AAEvD,QAAI,eAAe,YAAY,SAAS,MAAM,GAAG;AAChD,aAAO,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,IACxC;AACA,WAAO,SAAS,KAAK;AAAA,EACtB,CAAC,EACA,MAAM,CAAC,UAAuB;AAC9B,QAAI,MAAM,YAAY,6BAA6B;AAClD,UAAI,eAAe,GAAG;AACrB,YAAI,iBAAiB;AACpB,iBAAO,MAAM,SAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,QACxC;AACA,cAAM;AAAA,MACP;AAEA,aAAO,IAAI,QAAQ,CAAC,YAAY;AAC/B;AAAA,UACC,MACC;AAAA,YACC,eAAe,KAAK,SAAS;AAAA,cAC5B,YAAY,aAAa;AAAA,cACzB,eAAe,gBAAgB;AAAA,cAC/B;AAAA,YACD,CAAC;AAAA,UACF;AAAA,UACD,wBAAwB;AAAA,QACzB;AAAA,MACD,CAAC;AAAA,IACF;AACA,UAAM;AAAA,EACP,CAAC;AACH;AAEO,IAAM,iBAAiB,CAC7B,KACA,UAAuB,CAAC,GACxB,OAAkB,CAAC,MAED;AAClB,QAAM,UAAU,CAAC,UAAkB;AAClC,UAAM,aAA0B;AAAA,MAC/B,GAAG;AAAA,MACH,SAAS;AAAA,QACR,GAAI,QAAQ,WAAW,CAAC;AAAA,QACxB,eAAe,UAAU,KAAK;AAAA,QAC9B,mBAAmB;AAAA,MACpB;AAAA,IACD;AAEA,QAAI,QAAQ,WAAW,SAAS,CAAC,KAAK,YAAY;AACjD,WAAK,aAAa;AAAA,IACnB;AAEA,WAAO,eAAe,KAAK,YAAY,IAAI;AAAA,EAC5C;AAEA,MAAI,kBAAmC,QAAQ,QAAQ,EAAE;AAEzD,MAAI,WAAY,OAAe,YAAY,mBAAmB,GAAG;AAEhE,UAAM,cAAe,OAAe,WAAW,oBAAoB;AAEnE,sBACC,uBAAuB,UAAU,cAAc,QAAQ,QAAQ,WAAW;AAAA,EAC5E;AAEA,SAAO,gBAAgB,KAAK,CAAC,UAAU,QAAQ,KAAK,CAAC;AACtD;AAEO,IAAM,UAAU,OAAO,KAAa,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM;AACtE,SAAO,eAAe,KAAK,SAAS,IAAI;AACzC;","names":[]}
@@ -0,0 +1,243 @@
1
+ import {
2
+ executeRequest
3
+ } from "./chunk-SZMEZFAR.js";
4
+
5
+ // packages/hooks/use-file-uploader/uppy/constants.ts
6
+ var uppyEvents = [
7
+ "file-added",
8
+ "files-added",
9
+ "file-removed",
10
+ "upload",
11
+ "progress",
12
+ "preprocess-complete",
13
+ "upload-progress",
14
+ "upload-success",
15
+ "complete",
16
+ "error",
17
+ "upload-error",
18
+ "upload-retry",
19
+ "retry-all",
20
+ "info-visible",
21
+ "info-hidden",
22
+ "cancel-all",
23
+ "restriction-failed",
24
+ "reset-progress"
25
+ ];
26
+ var uppyInitialState = {
27
+ plugins: {},
28
+ error: "",
29
+ files: {},
30
+ currentUploads: {},
31
+ allowNewUpload: true,
32
+ capabilities: {
33
+ uploadProgress: true,
34
+ individualCancellation: true,
35
+ resumableUploads: false
36
+ },
37
+ totalProgress: 0,
38
+ meta: {},
39
+ info: [],
40
+ recoveredState: null
41
+ };
42
+ var MAX_FILE_SIZE_75_MB = 75 * Math.pow(1024, 2);
43
+ var defaultDictionary = {
44
+ exeFileTypeRestriction: "Attachments with filetype .exe cannot be accepted. Please try a different file type."
45
+ };
46
+
47
+ // packages/hooks/use-file-uploader/uppy/api.ts
48
+ var api = {
49
+ getUploadURL: (body, options) => {
50
+ const requestOptions = {
51
+ method: "POST",
52
+ body: JSON.stringify(body),
53
+ headers: { "Content-Type": "application/json" },
54
+ signal: options?.signal
55
+ };
56
+ return executeRequest("/api/v2/attachments/upload", requestOptions);
57
+ },
58
+ completeUpload: (id) => {
59
+ const requestOptions = {
60
+ method: "POST"
61
+ };
62
+ return executeRequest(
63
+ `/api/v2/attachments/upload/${id}/complete`,
64
+ requestOptions
65
+ );
66
+ },
67
+ getDownloadUrl: (id) => {
68
+ return executeRequest(`/api/v2/attachments/download?uploadMetadataId=${id}`);
69
+ },
70
+ getPersonDetailsById: (id) => {
71
+ return executeRequest(`/api/v2/person/user/${id}`);
72
+ }
73
+ };
74
+
75
+ // packages/hooks/use-file-uploader/uppy/service.ts
76
+ import { v4 as uuidv4 } from "uuid";
77
+ import Uppy from "@uppy/core";
78
+ import AwsS3 from "@uppy/aws-s3";
79
+ import { merge } from "lodash-es";
80
+ var UppyService = class {
81
+ instances = /* @__PURE__ */ new Map();
82
+ retryCount = 0;
83
+ defaultOptions = {
84
+ autoProceed: true,
85
+ restrictions: {
86
+ maxFileSize: MAX_FILE_SIZE_75_MB,
87
+ maxNumberOfFiles: 9,
88
+ allowedFileTypes: null
89
+ }
90
+ };
91
+ getInstance(id) {
92
+ return this.instances.get(id) || null;
93
+ }
94
+ register(options) {
95
+ const id = uuidv4();
96
+ const getUploadParameters = (instanceId) => async (file, _options) => {
97
+ const response = await api.getUploadURL(
98
+ {
99
+ fileName: file.name,
100
+ fileSize: file.size
101
+ },
102
+ _options
103
+ );
104
+ const instance2 = this.getInstance(instanceId);
105
+ if (instance2) {
106
+ instance2.setFileMeta(file.id, response);
107
+ }
108
+ return {
109
+ method: "PUT",
110
+ url: response.preSignedUrl,
111
+ fields: {},
112
+ headers: {
113
+ "Content-Type": file.type
114
+ }
115
+ };
116
+ };
117
+ const instance = new Uppy(this.#getOptions(id, options)).use(AwsS3, {
118
+ // @ts-expect-error type mismatch
119
+ getUploadParameters: getUploadParameters(id)
120
+ });
121
+ Object.defineProperty(instance, "id", { value: id, enumerable: true });
122
+ this.instances.set(id, instance);
123
+ this.#subscribeOnEvents(id);
124
+ return instance;
125
+ }
126
+ destroy(id) {
127
+ const instance = this.getInstance(id);
128
+ instance?.close(() => this.instances.delete(id));
129
+ }
130
+ onAnyEvent(id, eventCallback) {
131
+ const inst = this.getInstance(id);
132
+ if (inst) {
133
+ uppyEvents.forEach((event) => {
134
+ inst.on(
135
+ // @ts-expect-error type mismatch
136
+ event,
137
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
138
+ (...args) => {
139
+ eventCallback(event, ...args);
140
+ }
141
+ );
142
+ });
143
+ }
144
+ }
145
+ #subscribeOnEvents(instanceId) {
146
+ const instance = this.getInstance(instanceId);
147
+ if (instance) {
148
+ instance.on("upload-success", async (file) => {
149
+ await this.#completeUploading(instanceId, file);
150
+ });
151
+ }
152
+ }
153
+ #getOptions(id, options) {
154
+ return {
155
+ ...merge(this.defaultOptions, options),
156
+ id,
157
+ debug: true
158
+ };
159
+ }
160
+ async #completeUploading(instanceId, file) {
161
+ const instance = this.getInstance(instanceId);
162
+ if (!instance) return;
163
+ try {
164
+ const completedResponse = await api.completeUpload(
165
+ file.meta.uploadMetadataId
166
+ );
167
+ instance.setFileMeta(file.id, completedResponse);
168
+ instance.emit("complete", completedResponse);
169
+ this.#getDownloadUrl(instanceId, file.id);
170
+ this.#loadAdditionalFileMetadata(instanceId, file.id);
171
+ } catch (error) {
172
+ instance.emit("upload-error", file, error);
173
+ }
174
+ }
175
+ async #getDownloadUrl(instanceId, fileId) {
176
+ const instance = this.getInstance(instanceId);
177
+ if (!instance) return;
178
+ try {
179
+ const file = instance.getFile(fileId);
180
+ if (!file) return;
181
+ const downloadUrl = await api.getDownloadUrl(
182
+ file.meta.uploadMetadataId
183
+ );
184
+ if (typeof downloadUrl === "string") {
185
+ instance.setFileMeta(fileId, { downloadUrl });
186
+ } else {
187
+ instance.emit("error", downloadUrl);
188
+ }
189
+ instance.emit("complete", { downloadUrl });
190
+ } catch (error) {
191
+ instance.emit("error", error);
192
+ }
193
+ }
194
+ async #loadAdditionalFileMetadata(instanceId, fileId) {
195
+ const instance = this.getInstance(instanceId);
196
+ if (!instance) return;
197
+ try {
198
+ const file = instance.getFile(fileId);
199
+ if (!file) return;
200
+ const response = await api.getPersonDetailsById(file.meta.uploadedBy);
201
+ if ("firstName" in response) {
202
+ instance.setFileMeta(fileId, {
203
+ uploadedByInfo: {
204
+ firstName: response.firstName,
205
+ lastName: response.lastName
206
+ }
207
+ });
208
+ } else {
209
+ instance.emit("error", response);
210
+ }
211
+ instance.emit("complete", {});
212
+ } catch (error) {
213
+ instance.emit("error", error);
214
+ }
215
+ }
216
+ };
217
+
218
+ // packages/hooks/use-click-outside/use-click-outside.tsx
219
+ import { useEffect } from "react";
220
+ var useClickOutside = (elementRef, callback) => {
221
+ useEffect(() => {
222
+ const handleClickOutside = (event) => {
223
+ if (elementRef && elementRef.current && !elementRef.current.contains(event.target)) {
224
+ callback();
225
+ }
226
+ };
227
+ document.addEventListener("click", handleClickOutside, true);
228
+ return () => {
229
+ document.removeEventListener("click", handleClickOutside, true);
230
+ };
231
+ }, [elementRef, callback]);
232
+ };
233
+
234
+ export {
235
+ uppyEvents,
236
+ uppyInitialState,
237
+ MAX_FILE_SIZE_75_MB,
238
+ defaultDictionary,
239
+ api,
240
+ UppyService,
241
+ useClickOutside
242
+ };
243
+ //# sourceMappingURL=chunk-TYZPOXN5.js.map