@cargo-ai/utils 1.0.4

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 (251) hide show
  1. package/build/array.js +52 -0
  2. package/build/collection.js +155 -0
  3. package/build/components.js +56 -0
  4. package/build/cron.js +19 -0
  5. package/build/delay.js +52 -0
  6. package/build/hooks/index.js +35 -0
  7. package/build/hooks/useClickOutside.js +46 -0
  8. package/build/hooks/useCountAnimation.js +34 -0
  9. package/build/hooks/useDeviceType.js +54 -0
  10. package/build/hooks/useEventListener.js +27 -0
  11. package/build/hooks/useHeight.js +26 -0
  12. package/build/hooks/usePictureInPicture.js +126 -0
  13. package/build/hooks/useResizeObserver.js +35 -0
  14. package/build/hooks/useScrollPosition.js +22 -0
  15. package/build/hooks/useStepper.js +138 -0
  16. package/build/hooks/useStorageState.js +110 -0
  17. package/build/hooks/useVideoPlayer/VideoManager.js +78 -0
  18. package/build/hooks/useVideoPlayer/index.js +5 -0
  19. package/build/hooks/useVideoPlayer/useVideoPlayer.js +100 -0
  20. package/build/hooks/useWillUnmountEffect.js +13 -0
  21. package/build/index.js +28 -0
  22. package/build/json.js +81 -0
  23. package/build/random.js +7 -0
  24. package/build/src/array.d.ts +16 -0
  25. package/build/src/array.d.ts.map +1 -0
  26. package/build/src/array.js +81 -0
  27. package/build/src/base64.d.ts +3 -0
  28. package/build/src/base64.d.ts.map +1 -0
  29. package/build/src/base64.js +6 -0
  30. package/build/src/bytes.d.ts +7 -0
  31. package/build/src/bytes.d.ts.map +1 -0
  32. package/build/src/bytes.js +71 -0
  33. package/build/src/collection/deepMergeObjects.d.ts +2 -0
  34. package/build/src/collection/deepMergeObjects.d.ts.map +1 -0
  35. package/build/src/collection/deepMergeObjects.js +30 -0
  36. package/build/src/collection/index.d.ts +2 -0
  37. package/build/src/collection/index.d.ts.map +1 -0
  38. package/build/src/collection/index.js +1 -0
  39. package/build/src/collection.d.ts +22 -0
  40. package/build/src/collection.d.ts.map +1 -0
  41. package/build/src/collection.js +210 -0
  42. package/build/src/colors.d.ts +2 -0
  43. package/build/src/colors.d.ts.map +1 -0
  44. package/build/src/colors.js +14 -0
  45. package/build/src/components.d.ts +4 -0
  46. package/build/src/components.js +45 -0
  47. package/build/src/credits.d.ts +7 -0
  48. package/build/src/credits.d.ts.map +1 -0
  49. package/build/src/credits.js +88 -0
  50. package/build/src/cron.d.ts +3 -0
  51. package/build/src/cron.d.ts.map +1 -0
  52. package/build/src/cron.js +16 -0
  53. package/build/src/date/getContextTimezone.d.ts +2 -0
  54. package/build/src/date/getContextTimezone.d.ts.map +1 -0
  55. package/build/src/date/getContextTimezone.js +3 -0
  56. package/build/src/date/getDate.d.ts +8 -0
  57. package/build/src/date/getDate.d.ts.map +1 -0
  58. package/build/src/date/getDate.js +25 -0
  59. package/build/src/date/getDateString.d.ts +8 -0
  60. package/build/src/date/getDateString.d.ts.map +1 -0
  61. package/build/src/date/getDateString.js +13 -0
  62. package/build/src/date/getDatesDifferenceString.d.ts +2 -0
  63. package/build/src/date/getDatesDifferenceString.d.ts.map +1 -0
  64. package/build/src/date/getDatesDifferenceString.js +17 -0
  65. package/build/src/date/getTimeFromNowString.d.ts +2 -0
  66. package/build/src/date/getTimeFromNowString.d.ts.map +1 -0
  67. package/build/src/date/getTimeFromNowString.js +8 -0
  68. package/build/src/date/getTimezoneHoursOffset.d.ts +2 -0
  69. package/build/src/date/getTimezoneHoursOffset.d.ts.map +1 -0
  70. package/build/src/date/getTimezoneHoursOffset.js +7 -0
  71. package/build/src/date/getTimezoneOffsetString.d.ts +2 -0
  72. package/build/src/date/getTimezoneOffsetString.d.ts.map +1 -0
  73. package/build/src/date/getTimezoneOffsetString.js +8 -0
  74. package/build/src/date/index.d.ts +8 -0
  75. package/build/src/date/index.d.ts.map +1 -0
  76. package/build/src/date/index.js +7 -0
  77. package/build/src/date.d.ts +13 -0
  78. package/build/src/date.d.ts.map +1 -0
  79. package/build/src/date.js +14 -0
  80. package/build/src/delay.d.ts +7 -0
  81. package/build/src/delay.d.ts.map +1 -0
  82. package/build/src/delay.js +19 -0
  83. package/build/src/expression/getExpressionNodesReferences.d.ts +17 -0
  84. package/build/src/expression/getExpressionNodesReferences.d.ts.map +1 -0
  85. package/build/src/expression/getExpressionNodesReferences.js +71 -0
  86. package/build/src/expression/getObjectAccessKeysBeforeCursor.d.ts +17 -0
  87. package/build/src/expression/getObjectAccessKeysBeforeCursor.d.ts.map +1 -0
  88. package/build/src/expression/getObjectAccessKeysBeforeCursor.js +97 -0
  89. package/build/src/expression/index.d.ts +3 -0
  90. package/build/src/expression/index.d.ts.map +1 -0
  91. package/build/src/expression/index.js +2 -0
  92. package/build/src/expression/jsonSchema.d.ts +4 -0
  93. package/build/src/expression/jsonSchema.d.ts.map +1 -0
  94. package/build/src/expression/jsonSchema.js +85 -0
  95. package/build/src/expression/matchIsExpression.d.ts +2 -0
  96. package/build/src/expression/matchIsExpression.d.ts.map +1 -0
  97. package/build/src/expression/matchIsExpression.js +10 -0
  98. package/build/src/expression/matchIsExpressionObject.d.ts +2 -0
  99. package/build/src/expression/matchIsExpressionObject.d.ts.map +1 -0
  100. package/build/src/expression/matchIsExpressionObject.js +10 -0
  101. package/build/src/expression/matchIsExpressionString.d.ts +2 -0
  102. package/build/src/expression/matchIsExpressionString.d.ts.map +1 -0
  103. package/build/src/expression/matchIsExpressionString.js +4 -0
  104. package/build/src/gclid.d.ts +4 -0
  105. package/build/src/gclid.d.ts.map +1 -0
  106. package/build/src/gclid.js +30 -0
  107. package/build/src/hooks/index.d.ts +12 -0
  108. package/build/src/hooks/index.js +12 -0
  109. package/build/src/hooks/useClickOutside.d.ts +4 -0
  110. package/build/src/hooks/useClickOutside.js +42 -0
  111. package/build/src/hooks/useCountAnimation.d.ts +1 -0
  112. package/build/src/hooks/useCountAnimation.js +30 -0
  113. package/build/src/hooks/useDeviceType.d.ts +2 -0
  114. package/build/src/hooks/useDeviceType.js +50 -0
  115. package/build/src/hooks/useEventListener.d.ts +6 -0
  116. package/build/src/hooks/useEventListener.js +23 -0
  117. package/build/src/hooks/useHeight.d.ts +2 -0
  118. package/build/src/hooks/useHeight.js +20 -0
  119. package/build/src/hooks/usePictureInPicture.d.ts +9 -0
  120. package/build/src/hooks/usePictureInPicture.js +60 -0
  121. package/build/src/hooks/useResizeObserver.d.ts +4 -0
  122. package/build/src/hooks/useResizeObserver.js +31 -0
  123. package/build/src/hooks/useScrollPosition.d.ts +5 -0
  124. package/build/src/hooks/useScrollPosition.js +18 -0
  125. package/build/src/hooks/useStepper.d.ts +26 -0
  126. package/build/src/hooks/useStepper.js +136 -0
  127. package/build/src/hooks/useStorageState.d.ts +12 -0
  128. package/build/src/hooks/useStorageState.js +53 -0
  129. package/build/src/hooks/useVideoPlayer/VideoManager.d.ts +18 -0
  130. package/build/src/hooks/useVideoPlayer/VideoManager.js +72 -0
  131. package/build/src/hooks/useVideoPlayer/index.d.ts +1 -0
  132. package/build/src/hooks/useVideoPlayer/index.js +1 -0
  133. package/build/src/hooks/useVideoPlayer/useVideoPlayer.d.ts +15 -0
  134. package/build/src/hooks/useVideoPlayer/useVideoPlayer.js +96 -0
  135. package/build/src/hooks/useWillUnmountEffect.d.ts +1 -0
  136. package/build/src/hooks/useWillUnmountEffect.js +8 -0
  137. package/build/src/index.d.ts +27 -0
  138. package/build/src/index.d.ts.map +1 -0
  139. package/build/src/index.js +26 -0
  140. package/build/src/integration.d.ts +14 -0
  141. package/build/src/integration.d.ts.map +1 -0
  142. package/build/src/integration.js +72 -0
  143. package/build/src/json/castToJsonType.d.ts +5 -0
  144. package/build/src/json/castToJsonType.d.ts.map +1 -0
  145. package/build/src/json/castToJsonType.js +58 -0
  146. package/build/src/json/cleanJson.d.ts +3 -0
  147. package/build/src/json/cleanJson.d.ts.map +1 -0
  148. package/build/src/json/cleanJson.js +18 -0
  149. package/build/src/json/constants.d.ts +3 -0
  150. package/build/src/json/constants.d.ts.map +1 -0
  151. package/build/src/json/constants.js +9 -0
  152. package/build/src/json/getJsonType.d.ts +3 -0
  153. package/build/src/json/getJsonType.d.ts.map +1 -0
  154. package/build/src/json/getJsonType.js +24 -0
  155. package/build/src/json/index.d.ts +8 -0
  156. package/build/src/json/index.d.ts.map +1 -0
  157. package/build/src/json/index.js +7 -0
  158. package/build/src/json/isJson.d.ts +2 -0
  159. package/build/src/json/isJson.d.ts.map +1 -0
  160. package/build/src/json/isJson.js +9 -0
  161. package/build/src/json/isJsonSchemaEmpty.d.ts +3 -0
  162. package/build/src/json/isJsonSchemaEmpty.d.ts.map +1 -0
  163. package/build/src/json/isJsonSchemaEmpty.js +7 -0
  164. package/build/src/json/stringifyJson.d.ts +2 -0
  165. package/build/src/json/stringifyJson.d.ts.map +1 -0
  166. package/build/src/json/stringifyJson.js +6 -0
  167. package/build/src/json/types.d.ts +2 -0
  168. package/build/src/json/types.d.ts.map +1 -0
  169. package/build/src/json/types.js +1 -0
  170. package/build/src/json.d.ts +13 -0
  171. package/build/src/json.d.ts.map +1 -0
  172. package/build/src/json.js +107 -0
  173. package/build/src/jsonSchema/index.d.ts +10 -0
  174. package/build/src/jsonSchema/index.d.ts.map +1 -0
  175. package/build/src/jsonSchema/index.js +198 -0
  176. package/build/src/jsonSchema.d.ts +5 -0
  177. package/build/src/jsonSchema.d.ts.map +1 -0
  178. package/build/src/jsonSchema.js +73 -0
  179. package/build/src/number/formatCredits.d.ts +2 -0
  180. package/build/src/number/formatCredits.d.ts.map +1 -0
  181. package/build/src/number/formatCredits.js +7 -0
  182. package/build/src/number/formatPrice.d.ts +2 -0
  183. package/build/src/number/formatPrice.d.ts.map +1 -0
  184. package/build/src/number/formatPrice.js +8 -0
  185. package/build/src/number/getNumberWithMaxDecimals.d.ts +2 -0
  186. package/build/src/number/getNumberWithMaxDecimals.d.ts.map +1 -0
  187. package/build/src/number/getNumberWithMaxDecimals.js +3 -0
  188. package/build/src/number/index.d.ts +4 -0
  189. package/build/src/number/index.d.ts.map +1 -0
  190. package/build/src/number/index.js +3 -0
  191. package/build/src/poll.d.ts +5 -0
  192. package/build/src/poll.d.ts.map +1 -0
  193. package/build/src/poll.js +30 -0
  194. package/build/src/random.d.ts +2 -0
  195. package/build/src/random.d.ts.map +1 -0
  196. package/build/src/random.js +3 -0
  197. package/build/src/schema.d.ts +24 -0
  198. package/build/src/schema.d.ts.map +1 -0
  199. package/build/src/schema.js +315 -0
  200. package/build/src/searchInTree.d.ts +46 -0
  201. package/build/src/searchInTree.d.ts.map +1 -0
  202. package/build/src/searchInTree.js +67 -0
  203. package/build/src/storage.d.ts +13 -0
  204. package/build/src/storage.d.ts.map +1 -0
  205. package/build/src/storage.js +169 -0
  206. package/build/src/string/capitalizeFirstLetter.d.ts +2 -0
  207. package/build/src/string/capitalizeFirstLetter.d.ts.map +1 -0
  208. package/build/src/string/capitalizeFirstLetter.js +3 -0
  209. package/build/src/string/findAllIndexOf.d.ts +2 -0
  210. package/build/src/string/findAllIndexOf.d.ts.map +1 -0
  211. package/build/src/string/findAllIndexOf.js +13 -0
  212. package/build/src/string/getHash.d.ts +2 -0
  213. package/build/src/string/getHash.d.ts.map +1 -0
  214. package/build/src/string/getHash.js +9 -0
  215. package/build/src/string/index.d.ts +5 -0
  216. package/build/src/string/index.d.ts.map +1 -0
  217. package/build/src/string/index.js +4 -0
  218. package/build/src/string/sentenceCase.d.ts +2 -0
  219. package/build/src/string/sentenceCase.d.ts.map +1 -0
  220. package/build/src/string/sentenceCase.js +38 -0
  221. package/build/src/string.d.ts +2 -0
  222. package/build/src/string.d.ts.map +1 -0
  223. package/build/src/string.js +3 -0
  224. package/build/src/type.d.ts +10 -0
  225. package/build/src/type.js +1 -0
  226. package/build/src/types.d.ts +22 -0
  227. package/build/src/types.d.ts.map +1 -0
  228. package/build/src/types.js +1 -0
  229. package/build/src/user.d.ts +3 -0
  230. package/build/src/user.d.ts.map +1 -0
  231. package/build/src/user.js +7 -0
  232. package/build/src/validation/index.d.ts +2 -0
  233. package/build/src/validation/index.d.ts.map +1 -0
  234. package/build/src/validation/index.js +1 -0
  235. package/build/src/validation/matchIsObjectLike.d.ts +2 -0
  236. package/build/src/validation/matchIsObjectLike.d.ts.map +1 -0
  237. package/build/src/validation/matchIsObjectLike.js +4 -0
  238. package/build/src/vm.d.ts +1 -0
  239. package/build/src/vm.js +32 -0
  240. package/build/src/zod/index.d.ts +14 -0
  241. package/build/src/zod/index.d.ts.map +1 -0
  242. package/build/src/zod/index.js +210 -0
  243. package/build/src/zod.d.ts +8 -0
  244. package/build/src/zod.d.ts.map +1 -0
  245. package/build/src/zod.js +89 -0
  246. package/build/storage.js +285 -0
  247. package/build/string.js +17 -0
  248. package/build/tsconfig.tsbuildinfo +1 -0
  249. package/build/type.js +2 -0
  250. package/build/user.js +12 -0
  251. package/package.json +50 -0
@@ -0,0 +1,30 @@
1
+ import { clearIntervalAsync, setIntervalAsync } from "set-interval-async";
2
+ export const pollOnInterval = async (fn, { intervalMs, maxPolls, }) => {
3
+ let intervalId;
4
+ const result = await new Promise((resolve) => {
5
+ let pollsCount = 1;
6
+ // See https://www.npmjs.com/package/set-interval-async#when-should-i-use-setintervalasync
7
+ intervalId = setIntervalAsync(async () => {
8
+ try {
9
+ const success = await fn();
10
+ if (success) {
11
+ resolve(true);
12
+ }
13
+ else {
14
+ if (pollsCount < maxPolls) {
15
+ pollsCount++;
16
+ return;
17
+ }
18
+ resolve(false);
19
+ }
20
+ }
21
+ catch {
22
+ resolve(false);
23
+ }
24
+ }, intervalMs);
25
+ });
26
+ if (intervalId !== undefined) {
27
+ await clearIntervalAsync(intervalId);
28
+ }
29
+ return result;
30
+ };
@@ -0,0 +1,2 @@
1
+ export declare const random: (min: number, max: number) => number;
2
+ //# sourceMappingURL=random.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../src/random.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,QAAS,MAAM,OAAO,MAAM,KAAG,MAEjD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export const random = (min, max) => {
2
+ return Math.floor(Math.random() * (max - min + 1) + min);
3
+ };
@@ -0,0 +1,24 @@
1
+ import { z } from "zod/v4";
2
+ import type { JsonSchema } from "./jsonSchema/index.js";
3
+ export type SchemaMeta = {
4
+ title?: string;
5
+ description?: string;
6
+ };
7
+ export type Schema = z.ZodType | JsonSchema;
8
+ export type CheckIsValidSchemaResult = {
9
+ outcome: "valid";
10
+ } | {
11
+ outcome: "notValid";
12
+ errorMessage: string;
13
+ };
14
+ export declare const checkIsValidSchema: (schema: Schema, data: unknown) => CheckIsValidSchemaResult;
15
+ export declare const getSchemaFromPath: (schema: Schema, path: string[]) => Schema | undefined;
16
+ export declare const derivePartialSchema: (schema: Schema, paths: string[][]) => Schema;
17
+ export declare const getSchemaMeta: (schema: Schema) => SchemaMeta;
18
+ export declare const setSchemaMeta: (schema: Schema, meta: SchemaMeta) => Schema;
19
+ export declare const setSchemaMetaFromPath: (schema: Schema, path: string[], meta: SchemaMeta) => Schema;
20
+ export declare const getJsonSchemaFromSchema: (schema: Schema) => JsonSchema;
21
+ export declare const getSchemaType: (schema: Schema) => string | string[];
22
+ export declare const cleanDataFromSchema: (schema: Schema, data: unknown) => unknown;
23
+ export declare const convertSchemaToJsonSchemaInObject: <T>(obj: T) => T;
24
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAG3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAcxD,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,GAAG,UAAU,CAAC;AAE5C,MAAM,MAAM,wBAAwB,GAChC;IACE,OAAO,EAAE,OAAO,CAAC;CAClB,GACD;IACE,OAAO,EAAE,UAAU,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEN,eAAO,MAAM,kBAAkB,WACrB,MAAM,QACR,OAAO,KACZ,wBA8BF,CAAC;AAEF,eAAO,MAAM,iBAAiB,WACpB,MAAM,QACR,MAAM,EAAE,KACb,MAAM,GAAG,SAMX,CAAC;AAEF,eAAO,MAAM,mBAAmB,WACtB,MAAM,SACP,MAAM,EAAE,EAAE,KAChB,MAMF,CAAC;AAEF,eAAO,MAAM,aAAa,WAAY,MAAM,KAAG,UAc9C,CAAC;AAEF,eAAO,MAAM,aAAa,WAAY,MAAM,QAAQ,UAAU,KAAG,MAShE,CAAC;AAEF,eAAO,MAAM,qBAAqB,WACxB,MAAM,QACR,MAAM,EAAE,QACR,UAAU,KACf,MAMF,CAAC;AAEF,eAAO,MAAM,uBAAuB,WAAY,MAAM,KAAG,UA2QxD,CAAC;AAEF,eAAO,MAAM,aAAa,WAAY,MAAM,KAAG,MAAM,GAAG,MAAM,EAgC7D,CAAC;AAEF,eAAO,MAAM,mBAAmB,WAAY,MAAM,QAAQ,OAAO,KAAG,OAQnE,CAAC;AAEF,eAAO,MAAM,iCAAiC,kBAmB7C,CAAC"}
@@ -0,0 +1,315 @@
1
+ import { validate as jsonSchemaValidate } from "jsonschema";
2
+ import { z } from "zod/v4";
3
+ import { fromEntries, getEntries } from "./collection.js";
4
+ import { cleanDataFromJsonSchema, derivePartialJsonSchema, getJsonSchemaFromPath, setJsonSchemaMetaFromPath, } from "./jsonSchema/index.js";
5
+ import { derivePartialZod, getZodFromPath, getZodType, setZodMetaFromPath, } from "./zod/index.js";
6
+ export const checkIsValidSchema = (schema, data) => {
7
+ if (schema instanceof z.ZodType) {
8
+ const parsed = schema.safeParse(data);
9
+ if (parsed.success === true) {
10
+ return {
11
+ outcome: "valid",
12
+ };
13
+ }
14
+ return {
15
+ outcome: "notValid",
16
+ errorMessage: parsed.error.issues
17
+ .map((issue) => issue.message)
18
+ .join(", "),
19
+ };
20
+ }
21
+ const result = jsonSchemaValidate(data, schema);
22
+ if (result.valid === true) {
23
+ return {
24
+ outcome: "valid",
25
+ };
26
+ }
27
+ return {
28
+ outcome: "notValid",
29
+ errorMessage: result.errors.map((error) => error.message).join(", "),
30
+ };
31
+ };
32
+ export const getSchemaFromPath = (schema, path) => {
33
+ if (schema instanceof z.ZodType) {
34
+ return getZodFromPath(schema, path);
35
+ }
36
+ return getJsonSchemaFromPath(schema, path);
37
+ };
38
+ export const derivePartialSchema = (schema, paths) => {
39
+ if (schema instanceof z.ZodType) {
40
+ return derivePartialZod(schema, paths);
41
+ }
42
+ return derivePartialJsonSchema(schema, paths);
43
+ };
44
+ export const getSchemaMeta = (schema) => {
45
+ if (schema instanceof z.ZodType) {
46
+ const meta = schema.meta();
47
+ return {
48
+ title: meta !== undefined ? meta.title : undefined,
49
+ description: meta !== undefined ? meta.description : undefined,
50
+ };
51
+ }
52
+ return {
53
+ title: schema.title,
54
+ description: schema.description,
55
+ };
56
+ };
57
+ export const setSchemaMeta = (schema, meta) => {
58
+ if (schema instanceof z.ZodType) {
59
+ return schema.meta(meta);
60
+ }
61
+ schema.title = meta.title;
62
+ schema.description = meta.description;
63
+ return schema;
64
+ };
65
+ export const setSchemaMetaFromPath = (schema, path, meta) => {
66
+ if (schema instanceof z.ZodType) {
67
+ return setZodMetaFromPath(schema, path, meta);
68
+ }
69
+ return setJsonSchemaMetaFromPath(schema, path, meta);
70
+ };
71
+ export const getJsonSchemaFromSchema = (schema) => {
72
+ if (schema instanceof z.ZodType) {
73
+ return z.toJSONSchema(schema, {
74
+ unrepresentable: "any",
75
+ override: (context) => {
76
+ const definition = context.zodSchema._zod.def;
77
+ switch (definition.type) {
78
+ // Support z.any() as array of all types
79
+ case "any": {
80
+ context.jsonSchema.type = [
81
+ "string",
82
+ "number",
83
+ "integer",
84
+ "boolean",
85
+ "object",
86
+ "array",
87
+ "null",
88
+ ];
89
+ break;
90
+ }
91
+ // Support 'date' type as string with date-time format
92
+ case "date": {
93
+ context.jsonSchema.type = "string";
94
+ context.jsonSchema.format = "date-time";
95
+ break;
96
+ }
97
+ // Remove additionalProperties from all schemas in allOf for intersections
98
+ case "intersection": {
99
+ if (context.jsonSchema.allOf !== undefined) {
100
+ for (const schema of context.jsonSchema.allOf) {
101
+ if (schema.additionalProperties !== undefined) {
102
+ delete schema.additionalProperties;
103
+ }
104
+ }
105
+ }
106
+ break;
107
+ }
108
+ // Transform discriminated unions into oneOf + allOf with if/else
109
+ case "union": {
110
+ const { discriminator } = context.zodSchema._zod.def;
111
+ if (discriminator === undefined) {
112
+ if (context.jsonSchema.anyOf !== undefined &&
113
+ context.jsonSchema.anyOf.length > 0) {
114
+ const { anyOf } = context.jsonSchema;
115
+ const types = anyOf
116
+ .map((option) => {
117
+ if (option.type !== undefined &&
118
+ ["string", "number", "integer", "boolean"].includes(option.type)) {
119
+ return option.type;
120
+ }
121
+ return undefined;
122
+ })
123
+ .filter((type) => type !== undefined);
124
+ if (types.length !== anyOf.length) {
125
+ break;
126
+ }
127
+ context.jsonSchema.type =
128
+ types;
129
+ delete context.jsonSchema.anyOf;
130
+ break;
131
+ }
132
+ break;
133
+ }
134
+ const options = context.jsonSchema.anyOf.map((option) => {
135
+ if (option.properties === undefined) {
136
+ throw new Error(`Missing properties in union option.`);
137
+ }
138
+ const discriminatorProperty = option.properties[discriminator];
139
+ if (discriminatorProperty === undefined ||
140
+ typeof discriminatorProperty === "boolean") {
141
+ throw new Error(`Missing discriminator property "${discriminator}" in union option.`);
142
+ }
143
+ const otherProperties = fromEntries(getEntries(option.properties).filter(([key, value]) => {
144
+ return key !== discriminator && typeof value !== "boolean";
145
+ }));
146
+ const requiredOtherProperties = option.required !== undefined
147
+ ? option.required.filter((key) => {
148
+ return key !== discriminator;
149
+ })
150
+ : [];
151
+ return {
152
+ discriminatorProperty,
153
+ otherProperties,
154
+ requiredOtherProperties,
155
+ };
156
+ });
157
+ const defaultOption = options[0];
158
+ if (defaultOption === undefined) {
159
+ throw new Error(`Cannot process union with no options.`);
160
+ }
161
+ const discriminatorMeta = context.jsonSchema["discriminatorMeta"];
162
+ context.jsonSchema.type = "object";
163
+ context.jsonSchema.properties = {
164
+ [discriminator]: {
165
+ type: "string",
166
+ title: discriminatorMeta !== undefined
167
+ ? discriminatorMeta.title
168
+ : undefined,
169
+ description: discriminatorMeta !== undefined
170
+ ? discriminatorMeta.description
171
+ : undefined,
172
+ oneOf: options.map((option) => {
173
+ return {
174
+ const: option.discriminatorProperty.const,
175
+ title: option.discriminatorProperty.title,
176
+ description: option.discriminatorProperty.description,
177
+ };
178
+ }),
179
+ default: defaultOption.discriminatorProperty.const,
180
+ },
181
+ };
182
+ context.jsonSchema.required = [discriminator];
183
+ context.jsonSchema.allOf = options
184
+ .map((option) => {
185
+ if (Object.keys(option.otherProperties).length === 0) {
186
+ return undefined;
187
+ }
188
+ return {
189
+ if: {
190
+ properties: {
191
+ [discriminator]: {
192
+ const: option.discriminatorProperty.const,
193
+ },
194
+ },
195
+ },
196
+ then: {
197
+ type: "object",
198
+ properties: option.otherProperties,
199
+ required: option.requiredOtherProperties,
200
+ },
201
+ };
202
+ })
203
+ .filter((schema) => {
204
+ return schema !== undefined;
205
+ });
206
+ delete context.jsonSchema.anyOf;
207
+ delete context.jsonSchema["discriminatorMeta"];
208
+ break;
209
+ }
210
+ case "enum": {
211
+ const { entries: enumEntries } = context.zodSchema._zod.def;
212
+ const enumMeta = context.jsonSchema["enumMeta"];
213
+ if (enumEntries === undefined || enumMeta === undefined) {
214
+ break;
215
+ }
216
+ const enumValues = Object.keys(enumEntries);
217
+ context.jsonSchema.oneOf = enumValues.map((enumValue) => {
218
+ return {
219
+ const: enumValue,
220
+ title: enumMeta[enumValue],
221
+ };
222
+ });
223
+ delete context.jsonSchema.enum;
224
+ delete context.jsonSchema["enumMeta"];
225
+ break;
226
+ }
227
+ case "nullable": {
228
+ if (context.jsonSchema.anyOf !== undefined &&
229
+ context.jsonSchema.anyOf.length > 0) {
230
+ const { anyOf } = context.jsonSchema;
231
+ if (anyOf.length !== 2) {
232
+ break;
233
+ }
234
+ const [typeSchema] = anyOf;
235
+ if (typeSchema === undefined || typeSchema.type === undefined) {
236
+ break;
237
+ }
238
+ const types = Array.isArray(typeSchema.type) === true
239
+ ? typeSchema.type
240
+ : [typeSchema.type];
241
+ context.jsonSchema.type = [
242
+ ...types,
243
+ "null",
244
+ ];
245
+ delete context.jsonSchema.anyOf;
246
+ break;
247
+ }
248
+ break;
249
+ }
250
+ case "object": {
251
+ if (context.jsonSchema.additionalProperties === false) {
252
+ delete context.jsonSchema.additionalProperties;
253
+ }
254
+ break;
255
+ }
256
+ default: {
257
+ break;
258
+ }
259
+ }
260
+ },
261
+ });
262
+ }
263
+ return schema;
264
+ };
265
+ export const getSchemaType = (schema) => {
266
+ if (schema instanceof z.ZodType) {
267
+ const type = getZodType(schema);
268
+ if (type === "any") {
269
+ return [
270
+ "string",
271
+ "number",
272
+ "integer",
273
+ "boolean",
274
+ "object",
275
+ "array",
276
+ "null",
277
+ ];
278
+ }
279
+ return type;
280
+ }
281
+ if (schema.type === undefined) {
282
+ return [
283
+ "string",
284
+ "number",
285
+ "integer",
286
+ "boolean",
287
+ "object",
288
+ "array",
289
+ "null",
290
+ ];
291
+ }
292
+ return schema.type;
293
+ };
294
+ export const cleanDataFromSchema = (schema, data) => {
295
+ if (schema instanceof z.ZodType) {
296
+ const parsed = schema.safeParse(data);
297
+ return parsed.success === true ? parsed.data : undefined;
298
+ }
299
+ return cleanDataFromJsonSchema(schema, data);
300
+ };
301
+ export const convertSchemaToJsonSchemaInObject = (obj) => {
302
+ if (obj instanceof z.ZodType) {
303
+ return getJsonSchemaFromSchema(obj);
304
+ }
305
+ if (Array.isArray(obj) === true) {
306
+ return obj.map((item) => convertSchemaToJsonSchemaInObject(item));
307
+ }
308
+ if (obj !== null && typeof obj === "object") {
309
+ return fromEntries(getEntries(obj).map(([key, value]) => [
310
+ key,
311
+ convertSchemaToJsonSchemaInObject(value),
312
+ ]));
313
+ }
314
+ return obj;
315
+ };
@@ -0,0 +1,46 @@
1
+ type SearchInTreeAlgorithm = "DFS" | "BFS";
2
+ /**
3
+ * Options for the searchInTree function.
4
+ * @template T - Type of the tree node.
5
+ */
6
+ export type SearchInTreeOptions<T> = {
7
+ /** The key or keys to search within each node. */
8
+ searchKeyOrKeys: keyof T | (keyof T)[];
9
+ /** The key representing the children of a node (default is 'children'). */
10
+ childrenKey?: keyof T | "children";
11
+ /** The traversal algorithm, either "DFS" (default) or "BFS". */
12
+ algorithm?: SearchInTreeAlgorithm;
13
+ /** Whether the search should be case-sensitive (default: false). */
14
+ caseSensitive?: boolean;
15
+ };
16
+ /**
17
+ * The searchInTree function return an object with a generator and an additional unwrap method to return results as an array.
18
+ * @template T - Type of the tree node.
19
+ */
20
+ type SearchInTreeReturn<T> = {
21
+ /** Allows iteration over the results like a generator. */
22
+ [Symbol.iterator]: () => Generator<T>;
23
+ /** Converts the results to an array. */
24
+ unwrap: () => T[];
25
+ };
26
+ /**
27
+ * Generator function to search for nodes in a tree structure.
28
+ * Supports both Depth-First Search (DFS) and Breadth-First Search (BFS).
29
+ *
30
+ * @template T - Type of the tree node.
31
+ * @param {T[]} data - The tree data to traverse.
32
+ * @param {string} searchTerm - The term to search for.
33
+ * @param {SearchInTreeOptions<T>} options - Additional options for the search.
34
+ * @returns {SearchInTreeReturn<T>} - An iterable object to traverse the search results.
35
+ *
36
+ * @example
37
+ * const results = searchInTree(dataset, "example", {
38
+ * searchKeyOrKeys: "name",
39
+ * childrenKey: "children",
40
+ * algorithm: "DFS",
41
+ * caseSensitive: false,
42
+ * }).unwrap();
43
+ */
44
+ export declare function searchInTree<T extends Record<string, unknown>>(data: T[], searchTerm: string, { searchKeyOrKeys, childrenKey, algorithm, caseSensitive, }: SearchInTreeOptions<T>): SearchInTreeReturn<T>;
45
+ export {};
46
+ //# sourceMappingURL=searchInTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchInTree.d.ts","sourceRoot":"","sources":["../../src/searchInTree.ts"],"names":[],"mappings":"AAAA,KAAK,qBAAqB,GAAG,KAAK,GAAG,KAAK,CAAC;AAE3C;;;GAGG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IACvC,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC;IACnC,gEAAgE;IAChE,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,oEAAoE;IACpE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,KAAK,kBAAkB,CAAC,CAAC,IAAI;IAC3B,0DAA0D;IAC1D,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC;IACtC,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AAEH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5D,IAAI,EAAE,CAAC,EAAE,EACT,UAAU,EAAE,MAAM,EAClB,EACE,eAAe,EACf,WAAwB,EACxB,SAAiB,EACjB,aAAqB,GACtB,EAAE,mBAAmB,CAAC,CAAC,CAAC,GACxB,kBAAkB,CAAC,CAAC,CAAC,CAmDvB"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Generator function to search for nodes in a tree structure.
3
+ * Supports both Depth-First Search (DFS) and Breadth-First Search (BFS).
4
+ *
5
+ * @template T - Type of the tree node.
6
+ * @param {T[]} data - The tree data to traverse.
7
+ * @param {string} searchTerm - The term to search for.
8
+ * @param {SearchInTreeOptions<T>} options - Additional options for the search.
9
+ * @returns {SearchInTreeReturn<T>} - An iterable object to traverse the search results.
10
+ *
11
+ * @example
12
+ * const results = searchInTree(dataset, "example", {
13
+ * searchKeyOrKeys: "name",
14
+ * childrenKey: "children",
15
+ * algorithm: "DFS",
16
+ * caseSensitive: false,
17
+ * }).unwrap();
18
+ */
19
+ export function searchInTree(data, searchTerm, { searchKeyOrKeys, childrenKey = "children", algorithm = "DFS", caseSensitive = false, }) {
20
+ const keys = Array.isArray(searchKeyOrKeys)
21
+ ? searchKeyOrKeys
22
+ : [searchKeyOrKeys];
23
+ const queue = [...data];
24
+ function* generator() {
25
+ while (queue.length > 0) {
26
+ const node = algorithm === "DFS" ? queue.pop() : queue.shift();
27
+ if (node === undefined) {
28
+ continue;
29
+ }
30
+ const matches = isNodeMatchingSearchTerm(node, searchTerm, keys, caseSensitive);
31
+ const children = Array.isArray(node[childrenKey])
32
+ ? [...node[childrenKey]]
33
+ : [];
34
+ const filteredChildren = [];
35
+ for (const child of children) {
36
+ if (isNodeMatchingSearchTerm(child, searchTerm, keys, caseSensitive) ===
37
+ true) {
38
+ filteredChildren.push(child);
39
+ }
40
+ else {
41
+ queue.push(child);
42
+ }
43
+ }
44
+ if (matches === true || filteredChildren.length > 0) {
45
+ yield {
46
+ ...node,
47
+ [childrenKey]: filteredChildren.length > 0 ? filteredChildren : node[childrenKey],
48
+ };
49
+ }
50
+ }
51
+ }
52
+ return {
53
+ [Symbol.iterator]: () => generator(),
54
+ unwrap: () => Array.from(generator()),
55
+ };
56
+ }
57
+ function isNodeMatchingSearchTerm(node, searchTerm, keys, caseSensitive) {
58
+ return keys.some((key) => {
59
+ const value = node[key];
60
+ if (typeof value !== "string") {
61
+ return false;
62
+ }
63
+ return caseSensitive
64
+ ? value.includes(searchTerm)
65
+ : value.toLowerCase().includes(searchTerm.toLowerCase());
66
+ });
67
+ }
@@ -0,0 +1,13 @@
1
+ export declare const matchIsLocalStorageSupported: () => boolean;
2
+ export declare const matchIsIndexedDBSupported: () => Promise<boolean>;
3
+ export type Storage = "localStorage" | "indexedDB";
4
+ export declare const getItemFromStorage: <T>(key: string, options?: {
5
+ storage?: Storage;
6
+ }) => Promise<T | undefined>;
7
+ export declare const setItemInStorage: <T>(key: string, value: T, options?: {
8
+ storage?: Storage;
9
+ }) => Promise<T>;
10
+ export declare const removeItemFromStorage: (key: string, options?: {
11
+ storage?: Storage;
12
+ }) => Promise<void>;
13
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,4BAA4B,QAAO,OAmB/C,CAAC;AAGF,eAAO,MAAM,yBAAyB,QAAa,QAAQ,OAAO,CA2GjE,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,cAAc,GAAG,WAAW,CAAC;AAEnD,eAAO,MAAM,kBAAkB,WACxB,MAAM,YACF;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,2BAuC/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,WACtB,MAAM,sBAEF;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,eAiC/B,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAC3B,MAAM,YACF;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,KAC7B,QAAQ,IAAI,CA2Bd,CAAC"}