@kirill.konshin/utils 0.0.10 → 0.0.12

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 (201) hide show
  1. package/.turbo/turbo-build.log +5 -5
  2. package/.turbo/turbo-test.log +5 -5
  3. package/CHANGELOG.md +12 -0
  4. package/dist/bootstrap/adaptiveContainer.d.ts +3 -0
  5. package/dist/bootstrap/adaptiveContainer.d.ts.map +1 -0
  6. package/dist/bootstrap/adaptiveContainer.js +11 -0
  7. package/dist/bootstrap/adaptiveContainer.js.map +1 -0
  8. package/dist/bootstrap/controls.d.ts +35 -0
  9. package/dist/bootstrap/controls.d.ts.map +1 -0
  10. package/dist/bootstrap/controls.js +77 -0
  11. package/dist/bootstrap/controls.js.map +1 -0
  12. package/dist/bootstrap/error.d.ts +7 -0
  13. package/dist/bootstrap/error.d.ts.map +1 -0
  14. package/dist/bootstrap/error.js +31 -0
  15. package/dist/bootstrap/error.js.map +1 -0
  16. package/dist/bootstrap/field.d.ts +9 -0
  17. package/dist/bootstrap/field.d.ts.map +1 -0
  18. package/dist/bootstrap/field.js +29 -0
  19. package/dist/bootstrap/field.js.map +1 -0
  20. package/dist/bootstrap/footer.d.ts +10 -0
  21. package/dist/bootstrap/footer.d.ts.map +1 -0
  22. package/dist/bootstrap/footer.js +40 -0
  23. package/dist/bootstrap/footer.js.map +1 -0
  24. package/dist/bootstrap/globalLoading.d.ts +4 -0
  25. package/dist/bootstrap/globalLoading.d.ts.map +1 -0
  26. package/dist/bootstrap/globalLoading.js +10 -0
  27. package/dist/bootstrap/globalLoading.js.map +1 -0
  28. package/dist/bootstrap/index.d.ts +13 -0
  29. package/dist/bootstrap/index.d.ts.map +1 -0
  30. package/dist/bootstrap/index.js +34 -0
  31. package/dist/bootstrap/index.js.map +1 -0
  32. package/dist/bootstrap/loading.d.ts +8 -0
  33. package/dist/bootstrap/loading.d.ts.map +1 -0
  34. package/dist/bootstrap/loading.js +18 -0
  35. package/dist/bootstrap/loading.js.map +1 -0
  36. package/dist/bootstrap/responsiveHelper.d.ts +7 -0
  37. package/dist/bootstrap/responsiveHelper.d.ts.map +1 -0
  38. package/dist/bootstrap/responsiveHelper.js +45 -0
  39. package/dist/bootstrap/responsiveHelper.js.map +1 -0
  40. package/dist/bootstrap/screen.d.ts +20 -0
  41. package/dist/bootstrap/screen.d.ts.map +1 -0
  42. package/dist/bootstrap/screen.js +79 -0
  43. package/dist/bootstrap/screen.js.map +1 -0
  44. package/dist/bootstrap/toaster.d.ts +9 -0
  45. package/dist/bootstrap/toaster.d.ts.map +1 -0
  46. package/dist/bootstrap/toaster.js +36 -0
  47. package/dist/bootstrap/toaster.js.map +1 -0
  48. package/dist/bootstrap/useModal.d.ts +22 -0
  49. package/dist/bootstrap/useModal.d.ts.map +1 -0
  50. package/dist/bootstrap/useModal.js +50 -0
  51. package/dist/bootstrap/useModal.js.map +1 -0
  52. package/dist/bootstrap/useWrappedForm.d.ts +14 -0
  53. package/dist/bootstrap/useWrappedForm.d.ts.map +1 -0
  54. package/dist/bootstrap/useWrappedForm.js +32 -0
  55. package/dist/bootstrap/useWrappedForm.js.map +1 -0
  56. package/dist/core/cache.d.ts +121 -0
  57. package/dist/core/cache.d.ts.map +1 -0
  58. package/dist/core/cache.js +104 -0
  59. package/dist/core/cache.js.map +1 -0
  60. package/dist/core/errors.d.ts +2 -0
  61. package/dist/core/errors.d.ts.map +1 -0
  62. package/dist/core/errors.js +15 -0
  63. package/dist/core/errors.js.map +1 -0
  64. package/dist/core/index.d.ts +6 -0
  65. package/dist/core/index.d.ts.map +1 -0
  66. package/dist/core/index.js +22 -0
  67. package/dist/core/index.js.map +1 -0
  68. package/dist/core/measure.d.ts +35 -0
  69. package/dist/core/measure.d.ts.map +1 -0
  70. package/dist/core/measure.js +56 -0
  71. package/dist/core/measure.js.map +1 -0
  72. package/dist/core/mutex.d.ts +6 -0
  73. package/dist/core/mutex.d.ts.map +1 -0
  74. package/dist/core/mutex.js +26 -0
  75. package/dist/core/mutex.js.map +1 -0
  76. package/dist/core/worker.d.ts +84 -0
  77. package/dist/core/worker.d.ts.map +1 -0
  78. package/dist/core/worker.js +237 -0
  79. package/dist/core/worker.js.map +1 -0
  80. package/dist/electron/createWindow.d.ts +23 -0
  81. package/dist/electron/createWindow.d.ts.map +1 -0
  82. package/dist/electron/createWindow.js +160 -0
  83. package/dist/electron/createWindow.js.map +1 -0
  84. package/dist/electron/index.d.ts +3 -0
  85. package/dist/electron/index.d.ts.map +1 -0
  86. package/dist/electron/index.js +9 -0
  87. package/dist/electron/index.js.map +1 -0
  88. package/dist/electron/updater.d.ts +2 -0
  89. package/dist/electron/updater.d.ts.map +1 -0
  90. package/dist/electron/updater.js +47 -0
  91. package/dist/electron/updater.js.map +1 -0
  92. package/dist/electron-builder/builder.d.ts +8 -0
  93. package/dist/electron-builder/builder.d.ts.map +1 -0
  94. package/dist/electron-builder/builder.js +130 -0
  95. package/dist/electron-builder/builder.js.map +1 -0
  96. package/dist/electron-builder/images.d.ts +7 -0
  97. package/dist/electron-builder/images.d.ts.map +1 -0
  98. package/dist/electron-builder/images.js +25 -0
  99. package/dist/electron-builder/images.js.map +1 -0
  100. package/dist/electron-builder/index.d.ts +3 -0
  101. package/dist/electron-builder/index.d.ts.map +1 -0
  102. package/dist/electron-builder/index.js +7 -0
  103. package/dist/electron-builder/index.js.map +1 -0
  104. package/dist/mui/formControlFieldset.d.ts +5 -0
  105. package/dist/mui/formControlFieldset.d.ts.map +1 -0
  106. package/dist/mui/formControlFieldset.js +28 -0
  107. package/dist/mui/formControlFieldset.js.map +1 -0
  108. package/dist/mui/formLabelLegend.d.ts +4 -0
  109. package/dist/mui/formLabelLegend.d.ts.map +1 -0
  110. package/dist/mui/formLabelLegend.js +12 -0
  111. package/dist/mui/formLabelLegend.js.map +1 -0
  112. package/dist/mui/genericControl.d.ts +7 -0
  113. package/dist/mui/genericControl.d.ts.map +1 -0
  114. package/dist/mui/genericControl.js +21 -0
  115. package/dist/mui/genericControl.js.map +1 -0
  116. package/dist/mui/index.d.ts +5 -0
  117. package/dist/mui/index.d.ts.map +1 -0
  118. package/dist/mui/index.js +11 -0
  119. package/dist/mui/index.js.map +1 -0
  120. package/dist/mui/readOnly.d.ts +6 -0
  121. package/dist/mui/readOnly.d.ts.map +1 -0
  122. package/dist/mui/readOnly.js +7 -0
  123. package/dist/mui/readOnly.js.map +1 -0
  124. package/dist/next/appLink.d.ts +8 -0
  125. package/dist/next/appLink.d.ts.map +1 -0
  126. package/dist/next/appLink.js +33 -0
  127. package/dist/next/appLink.js.map +1 -0
  128. package/dist/next/index.d.ts +6 -0
  129. package/dist/next/index.d.ts.map +1 -0
  130. package/dist/next/index.js +15 -0
  131. package/dist/next/index.js.map +1 -0
  132. package/dist/next/measure.d.ts +15 -0
  133. package/dist/next/measure.d.ts.map +1 -0
  134. package/dist/next/measure.js +9 -0
  135. package/dist/next/measure.js.map +1 -0
  136. package/dist/next/noSSR.d.ts +5 -0
  137. package/dist/next/noSSR.d.ts.map +1 -0
  138. package/dist/next/noSSR.js +14 -0
  139. package/dist/next/noSSR.js.map +1 -0
  140. package/dist/next/redirect.d.ts +6 -0
  141. package/dist/next/redirect.d.ts.map +1 -0
  142. package/dist/next/useIsInner.d.ts +3 -0
  143. package/dist/next/useIsInner.d.ts.map +1 -0
  144. package/dist/next/useIsInner.js +14 -0
  145. package/dist/next/useIsInner.js.map +1 -0
  146. package/dist/react/apiCall.d.ts +6 -0
  147. package/dist/react/apiCall.d.ts.map +1 -0
  148. package/dist/react/apiCall.js +24 -0
  149. package/dist/react/apiCall.js.map +1 -0
  150. package/dist/react/form/client.d.ts +7 -0
  151. package/dist/react/form/client.d.ts.map +1 -0
  152. package/dist/react/form/client.js +45 -0
  153. package/dist/react/form/client.js.map +1 -0
  154. package/dist/react/form/form.d.ts +44 -0
  155. package/dist/react/form/form.d.ts.map +1 -0
  156. package/dist/react/form/form.js +75 -0
  157. package/dist/react/form/form.js.map +1 -0
  158. package/dist/react/form/index.d.ts +3 -0
  159. package/dist/react/form/index.d.ts.map +1 -0
  160. package/dist/react/index.d.ts +5 -0
  161. package/dist/react/index.d.ts.map +1 -0
  162. package/dist/react/index.js +19 -0
  163. package/dist/react/index.js.map +1 -0
  164. package/dist/react/useFetch.d.ts +2 -0
  165. package/dist/react/useFetch.d.ts.map +1 -0
  166. package/dist/react/useFetch.js +19 -0
  167. package/dist/react/useFetch.js.map +1 -0
  168. package/dist/react/useFetcher.d.ts +10 -0
  169. package/dist/react/useFetcher.d.ts.map +1 -0
  170. package/dist/react/useFetcher.js +43 -0
  171. package/dist/react/useFetcher.js.map +1 -0
  172. package/dist/react-native/index.d.ts +4 -0
  173. package/dist/react-native/index.d.ts.map +1 -0
  174. package/dist/react-native/index.js +9 -0
  175. package/dist/react-native/index.js.map +1 -0
  176. package/dist/react-native/share.d.ts +9 -0
  177. package/dist/react-native/share.d.ts.map +1 -0
  178. package/dist/react-native/share.js +23 -0
  179. package/dist/react-native/share.js.map +1 -0
  180. package/dist/react-native/update.d.ts +4 -0
  181. package/dist/react-native/update.d.ts.map +1 -0
  182. package/dist/react-native/update.js +40 -0
  183. package/dist/react-native/update.js.map +1 -0
  184. package/dist/react-native/useAppState.d.ts +2 -0
  185. package/dist/react-native/useAppState.d.ts.map +1 -0
  186. package/dist/react-native/useAppState.js +18 -0
  187. package/dist/react-native/useAppState.js.map +1 -0
  188. package/dist/tailwind/fullpage.d.ts +7 -0
  189. package/dist/tailwind/fullpage.d.ts.map +1 -0
  190. package/dist/tailwind/fullpage.js +14 -0
  191. package/dist/tailwind/fullpage.js.map +1 -0
  192. package/dist/tailwind/index.d.ts +3 -0
  193. package/dist/tailwind/index.d.ts.map +1 -0
  194. package/dist/tailwind/index.js +7 -0
  195. package/dist/tailwind/index.js.map +1 -0
  196. package/dist/tailwind/responsiveHelper.d.ts +2 -0
  197. package/dist/tailwind/responsiveHelper.d.ts.map +1 -0
  198. package/dist/tailwind/responsiveHelper.js +15 -0
  199. package/dist/tailwind/responsiveHelper.js.map +1 -0
  200. package/package.json +1 -1
  201. package/src/next/appLink.tsx +3 -2
@@ -0,0 +1,6 @@
1
+ import { default as React } from 'react';
2
+ import { InputProps } from '@mui/material/Input';
3
+ export declare const ReadOnly: React.FC<InputProps & {
4
+ children: any;
5
+ }>;
6
+ //# sourceMappingURL=readOnly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readOnly.d.ts","sourceRoot":"","sources":["../../src/mui/readOnly.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAoB,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEnE,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,GAAG;IAAE,QAAQ,EAAE,GAAG,CAAA;CAAE,CAE7D,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import Input from "@mui/material/Input";
3
+ const ReadOnly = ({ children, inputProps, ...props }) => /* @__PURE__ */ jsx(Input, { ...props, inputComponent: "div", inputProps: { ...inputProps, children } });
4
+ export {
5
+ ReadOnly
6
+ };
7
+ //# sourceMappingURL=readOnly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readOnly.js","sources":["../../src/mui/readOnly.tsx"],"sourcesContent":["import React from 'react';\nimport { default as Input, InputProps } from '@mui/material/Input';\n\nexport const ReadOnly: React.FC<InputProps & { children: any }> = ({ children, inputProps, ...props }) => (\n <Input {...props} inputComponent={'div' as any} inputProps={{ ...inputProps, children }}></Input>\n);\n"],"names":[],"mappings":";;AAGO,MAAM,WAAqD,CAAC,EAAE,UAAU,YAAY,GAAG,YAC1F,oBAAC,SAAO,GAAG,OAAO,gBAAgB,OAAc,YAAY,EAAE,GAAG,YAAY,WAAY,CAAA;"}
@@ -0,0 +1,8 @@
1
+ import { ComponentProps, FC } from 'react';
2
+ import { default as Link, LinkProps } from 'next/link';
3
+ export declare const AppLink: FC<{
4
+ children: any;
5
+ exact?: boolean;
6
+ activeClassName?: any;
7
+ } & LinkProps & ComponentProps<typeof Link>>;
8
+ //# sourceMappingURL=appLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appLink.d.ts","sourceRoot":"","sources":["../../src/next/appLink.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAI5C,eAAO,MAAM,OAAO,EAAE,EAAE,CACpB;IACI,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,GAAG,CAAC;CACzB,GAAG,SAAS,GACT,cAAc,CAAC,OAAO,IAAI,CAAC,CAyBlC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { usePathname } from "next/navigation";
3
+ import Link from "next/link";
4
+ import clsx from "clsx";
5
+ const AppLink = function AppLink2({
6
+ href,
7
+ children,
8
+ className = "",
9
+ activeClassName = "",
10
+ prefetch = false,
11
+ // set explicit default
12
+ exact = false,
13
+ ...props
14
+ }) {
15
+ const pathname = usePathname();
16
+ const hrefPath = typeof href === "string" ? href : href.pathname || "/";
17
+ return /* @__PURE__ */ jsx(
18
+ Link,
19
+ {
20
+ ...props,
21
+ href,
22
+ className: clsx(className, {
23
+ [activeClassName]: !exact && pathname.startsWith(hrefPath) || exact && pathname === hrefPath
24
+ }),
25
+ prefetch,
26
+ children
27
+ }
28
+ );
29
+ };
30
+ export {
31
+ AppLink
32
+ };
33
+ //# sourceMappingURL=appLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appLink.js","sources":["../../src/next/appLink.tsx"],"sourcesContent":["'use client';\n\nimport React, { ComponentProps, FC } from 'react';\nimport { usePathname } from 'next/navigation';\nimport Link, { LinkProps } from 'next/link';\nimport clsx from 'clsx';\n\n//TODO Test this\nexport const AppLink: FC<\n {\n children: any;\n exact?: boolean;\n activeClassName?: any;\n } & LinkProps &\n ComponentProps<typeof Link>\n> = function AppLink({\n href,\n children,\n className = '',\n activeClassName = '',\n prefetch = false, // set explicit default\n exact = false,\n ...props\n}) {\n const pathname = usePathname();\n const hrefPath = typeof href === 'string' ? href : href.pathname || '/';\n\n return (\n <Link\n {...props}\n href={href}\n className={clsx(className, {\n [activeClassName]: (!exact && pathname.startsWith(hrefPath)) || (exact && pathname === hrefPath),\n })}\n prefetch={prefetch}\n >\n {children}\n </Link>\n );\n};\n"],"names":["AppLink"],"mappings":";;;;AAQa,MAAA,UAOT,SAASA,SAAQ;AAAA,EACjB;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,WAAW;AAAA;AAAA,EACX,QAAQ;AAAA,EACR,GAAG;AACP,GAAG;AACC,QAAM,WAAW,YAAY;AAC7B,QAAM,WAAW,OAAO,SAAS,WAAW,OAAO,KAAK,YAAY;AAGhE,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ;AAAA,MACA,WAAW,KAAK,WAAW;AAAA,QACvB,CAAC,eAAe,GAAI,CAAC,SAAS,SAAS,WAAW,QAAQ,KAAO,SAAS,aAAa;AAAA,MAAA,CAC1F;AAAA,MACD;AAAA,MAEC;AAAA,IAAA;AAAA,EACL;AAER;"}
@@ -0,0 +1,6 @@
1
+ export * from './appLink';
2
+ export * from './measure';
3
+ export * from './noSSR';
4
+ export * from './redirect';
5
+ export * from './useIsInner';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { AppLink } from "./appLink.js";
2
+ import { isProd, measurer } from "./measure.js";
3
+ import { NoSSR } from "./noSSR.js";
4
+ import "next/navigation";
5
+ import "react";
6
+ import { useIsIndex, useIsInner } from "./useIsInner.js";
7
+ export {
8
+ AppLink,
9
+ NoSSR,
10
+ isProd,
11
+ measurer,
12
+ useIsIndex,
13
+ useIsInner
14
+ };
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,15 @@
1
+ export declare const isProd: boolean;
2
+ export declare const measurer: {
3
+ measure: (what: string, step: string, supplemental?: string, ...args: any[]) => {
4
+ done: (result?: string, ...args2: any[]) => void;
5
+ fail: (result?: string, ...args2: any[]) => void;
6
+ log: (...args2: any[]) => void;
7
+ };
8
+ important: (str: any) => any;
9
+ subject: (str: any) => any;
10
+ arg: (str: any) => any;
11
+ sup: (str: any) => any;
12
+ ok: (str: any) => any;
13
+ err: (str: any) => any;
14
+ };
15
+ //# sourceMappingURL=measure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../../src/next/measure.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM,SACwF,CAAC;AAE5G,eAAO,MAAM,QAAQ;;;;;;;;;;;;CAAqC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { createMeasurer } from "../core/measure.js";
2
+ import { PHASE_PRODUCTION_BUILD, PHASE_PRODUCTION_SERVER } from "next/constants";
3
+ const isProd = process.env.NEXT_PHASE === PHASE_PRODUCTION_BUILD || process.env.NEXT_PHASE === PHASE_PRODUCTION_SERVER;
4
+ const measurer = createMeasurer({ colors: isProd });
5
+ export {
6
+ isProd,
7
+ measurer
8
+ };
9
+ //# sourceMappingURL=measure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.js","sources":["../../src/next/measure.ts"],"sourcesContent":["import { createMeasurer } from '../core/measure';\nimport { PHASE_PRODUCTION_BUILD, PHASE_PRODUCTION_SERVER } from 'next/constants';\n\nexport const isProd =\n process.env.NEXT_PHASE === PHASE_PRODUCTION_BUILD || process.env.NEXT_PHASE === PHASE_PRODUCTION_SERVER;\n\nexport const measurer = createMeasurer({ colors: isProd });\n"],"names":[],"mappings":";;AAGO,MAAM,SACT,QAAQ,IAAI,eAAe,0BAA0B,QAAQ,IAAI,eAAe;AAE7E,MAAM,WAAW,eAAe,EAAE,QAAQ,OAAQ,CAAA;"}
@@ -0,0 +1,5 @@
1
+ export declare function NoSSR({ children, onSSR }: {
2
+ children: any;
3
+ onSSR?: import("react/jsx-runtime").JSX.Element | undefined;
4
+ }): any;
5
+ //# sourceMappingURL=noSSR.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noSSR.d.ts","sourceRoot":"","sources":["../../src/next/noSSR.tsx"],"names":[],"mappings":"AAQA,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAwB,EAAE;;;CAAA,OAQ3D"}
@@ -0,0 +1,14 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useState, useLayoutEffect } from "react";
3
+ const DefaultOnSSR = () => /* @__PURE__ */ jsx("span", {});
4
+ function NoSSR({ children, onSSR = /* @__PURE__ */ jsx(DefaultOnSSR, {}) }) {
5
+ const [canRender, setCanRender] = useState(false);
6
+ useLayoutEffect(() => {
7
+ setCanRender(true);
8
+ }, []);
9
+ return canRender ? children : onSSR;
10
+ }
11
+ export {
12
+ NoSSR
13
+ };
14
+ //# sourceMappingURL=noSSR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noSSR.js","sources":["../../src/next/noSSR.tsx"],"sourcesContent":["'use client';\n\nimport React, { useLayoutEffect, useState } from 'react';\n\nconst DefaultOnSSR = () => <span />;\n\n// @see https://github.com/kadirahq/react-no-ssr/blob/master/src/index.js\n// @see https://nextjs.org/docs/messages/react-hydration-error#solution-1-using-useeffect-to-run-on-the-client-only\nexport function NoSSR({ children, onSSR = <DefaultOnSSR /> }) {\n const [canRender, setCanRender] = useState(false);\n\n useLayoutEffect(() => {\n setCanRender(true);\n }, []);\n\n return canRender ? children : onSSR;\n}\n"],"names":[],"mappings":";;AAIA,MAAM,eAAe,MAAM,oBAAC,QAAK,EAAA;AAI1B,SAAS,MAAM,EAAE,UAAU,QAAS,oBAAA,cAAA,CAAa,CAAA,KAAM;AAC1D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,kBAAgB,MAAM;AAClB,iBAAa,IAAI;AAAA,EACrB,GAAG,EAAE;AAEL,SAAO,YAAY,WAAW;AAClC;"}
@@ -0,0 +1,6 @@
1
+ import { LinkProps } from 'next/link';
2
+ export default function Redirect({ to, replace }: {
3
+ to: LinkProps['href'];
4
+ replace?: LinkProps['replace'];
5
+ }): null;
6
+ //# sourceMappingURL=redirect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirect.d.ts","sourceRoot":"","sources":["../../src/next/redirect.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;IAAE,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;CAAE,QAM1G"}
@@ -0,0 +1,3 @@
1
+ export declare const useIsInner: () => boolean;
2
+ export declare const useIsIndex: () => boolean;
3
+ //# sourceMappingURL=useIsInner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIsInner.d.ts","sourceRoot":"","sources":["../../src/next/useIsInner.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,QAAO,OAG7B,CAAC;AAEF,eAAO,MAAM,UAAU,QAAO,OAG7B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { useSelectedLayoutSegments } from "next/navigation";
2
+ const useIsInner = () => {
3
+ const pathname = useSelectedLayoutSegments();
4
+ return pathname.length > 0;
5
+ };
6
+ const useIsIndex = () => {
7
+ const pathname = useSelectedLayoutSegments();
8
+ return pathname.length === 0;
9
+ };
10
+ export {
11
+ useIsIndex,
12
+ useIsInner
13
+ };
14
+ //# sourceMappingURL=useIsInner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIsInner.js","sources":["../../src/next/useIsInner.ts"],"sourcesContent":["'use client';\n\nimport { useSelectedLayoutSegments } from 'next/navigation';\n\nexport const useIsInner = (): boolean => {\n const pathname = useSelectedLayoutSegments();\n return pathname.length > 0;\n};\n\nexport const useIsIndex = (): boolean => {\n const pathname = useSelectedLayoutSegments();\n return pathname.length === 0;\n};\n"],"names":[],"mappings":";AAIO,MAAM,aAAa,MAAe;AACrC,QAAM,WAAW,0BAA0B;AAC3C,SAAO,SAAS,SAAS;AAC7B;AAEO,MAAM,aAAa,MAAe;AACrC,QAAM,WAAW,0BAA0B;AAC3C,SAAO,SAAS,WAAW;AAC/B;"}
@@ -0,0 +1,6 @@
1
+ export declare const jsonContentType = "application/json";
2
+ export type DataResponse<R> = Response & {
3
+ data?: R;
4
+ };
5
+ export declare function apiCall<R>(url: string, init?: RequestInit): Promise<DataResponse<R>>;
6
+ //# sourceMappingURL=apiCall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiCall.d.ts","sourceRoot":"","sources":["../../src/react/apiCall.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAElD,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,QAAQ,GAAG;IAAE,IAAI,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC;AAEtD,wBAAsB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAoB1F"}
@@ -0,0 +1,24 @@
1
+ const jsonContentType = "application/json";
2
+ async function apiCall(url, init) {
3
+ var _a;
4
+ const useBodyAsIs = !(init == null ? void 0 : init.body) || (init == null ? void 0 : init.body) instanceof FormData || typeof (init == null ? void 0 : init.body) === "string";
5
+ const res = await fetch(url, {
6
+ method: "POST",
7
+ ...init,
8
+ body: useBodyAsIs ? init == null ? void 0 : init.body : JSON.stringify(init.body),
9
+ headers: {
10
+ ...init == null ? void 0 : init.headers,
11
+ ...useBodyAsIs ? {} : { "Content-Type": jsonContentType }
12
+ }
13
+ });
14
+ if ((_a = res.headers.get("Content-Type")) == null ? void 0 : _a.includes(jsonContentType)) {
15
+ res.data = await res.json();
16
+ }
17
+ if (!res.ok) throw new Error(res.statusText, { cause: res });
18
+ return res;
19
+ }
20
+ export {
21
+ apiCall,
22
+ jsonContentType
23
+ };
24
+ //# sourceMappingURL=apiCall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiCall.js","sources":["../../src/react/apiCall.ts"],"sourcesContent":["export const jsonContentType = 'application/json';\n\nexport type DataResponse<R> = Response & { data?: R };\n\nexport async function apiCall<R>(url: string, init?: RequestInit): Promise<DataResponse<R>> {\n const useBodyAsIs = !init?.body || init?.body instanceof FormData || typeof init?.body === 'string';\n\n const res: DataResponse<R> = await fetch(url, {\n method: 'POST',\n ...init,\n body: useBodyAsIs ? init?.body : JSON.stringify(init.body),\n headers: {\n ...init?.headers,\n ...(useBodyAsIs ? {} : { 'Content-Type': jsonContentType }),\n },\n });\n\n if (res.headers.get('Content-Type')?.includes(jsonContentType)) {\n res.data = await res.json();\n }\n\n if (!res.ok) throw new Error(res.statusText, { cause: res });\n\n return res;\n}\n"],"names":[],"mappings":"AAAO,MAAM,kBAAkB;AAIT,eAAA,QAAW,KAAa,MAA8C;AAJrF;AAKG,QAAA,cAAc,EAAC,6BAAM,UAAQ,6BAAM,iBAAgB,YAAY,QAAO,6BAAM,UAAS;AAErF,QAAA,MAAuB,MAAM,MAAM,KAAK;AAAA,IAC1C,QAAQ;AAAA,IACR,GAAG;AAAA,IACH,MAAM,cAAc,6BAAM,OAAO,KAAK,UAAU,KAAK,IAAI;AAAA,IACzD,SAAS;AAAA,MACL,GAAG,6BAAM;AAAA,MACT,GAAI,cAAc,CAAA,IAAK,EAAE,gBAAgB,gBAAgB;AAAA,IAAA;AAAA,EAC7D,CACH;AAED,OAAI,SAAI,QAAQ,IAAI,cAAc,MAA9B,mBAAiC,SAAS,kBAAkB;AACxD,QAAA,OAAO,MAAM,IAAI,KAAK;AAAA,EAAA;AAG1B,MAAA,CAAC,IAAI,GAAU,OAAA,IAAI,MAAM,IAAI,YAAY,EAAE,OAAO,KAAK;AAEpD,SAAA;AACX;"}
@@ -0,0 +1,7 @@
1
+ import { MaybeTypeOf, Validation } from './form';
2
+ import { z } from 'zod';
3
+ export declare function createClient<S extends z.ZodObject<any>>(schema: S): {
4
+ useValidation: (actionFn: (data: FormData) => Promise<Validation<S>>, initialData?: MaybeTypeOf<S>) => [state: Validation<S>, dispatch: (payload: FormData) => void, isPending: boolean];
5
+ useValidationTransition: (actionFn: (data: FormData) => Promise<Validation<S>>, initialData?: MaybeTypeOf<S>) => [Validation<S>, (formData: FormData) => Promise<Validation<S>>, boolean];
6
+ };
7
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/react/form/client.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAU,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;8BAqBhD,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,gBACvC,WAAW,CAAC,CAAC,CAAC;wCAWjB,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,gBACvC,WAAW,CAAC,CAAC,CAAC,KAC5B,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;EAkB9E"}
@@ -0,0 +1,45 @@
1
+ import { useActionState, useTransition, useState, useCallback } from "react";
2
+ import { create } from "./form.js";
3
+ const FORM_DEBUG = process.env.NEXT_PUBLIC_FORM_DEBUG === "true";
4
+ function createClient(schema) {
5
+ const { validate } = create(schema);
6
+ function useValidationCallback(actionFn) {
7
+ return useCallback(
8
+ async (formData) => {
9
+ const clientRes = validate(formData);
10
+ console.log("Client validation", FORM_DEBUG ? "ignored" : "active", clientRes);
11
+ if (!clientRes.success && !FORM_DEBUG) return clientRes;
12
+ const serverRes = await actionFn(formData);
13
+ console.log("Server validation", serverRes);
14
+ return serverRes;
15
+ },
16
+ [actionFn]
17
+ );
18
+ }
19
+ function useValidation(actionFn, initialData = {}) {
20
+ const cb = useValidationCallback(actionFn);
21
+ return useActionState(async (_, data) => cb(data), {
22
+ success: false,
23
+ data: initialData
24
+ });
25
+ }
26
+ function useValidationTransition(actionFn, initialData = {}) {
27
+ const [isPending, startTransition] = useTransition();
28
+ const [state, setState] = useState({ success: false, data: initialData });
29
+ const cb = useValidationCallback(actionFn);
30
+ const wrappedCb = useCallback(
31
+ (formData) => {
32
+ const promise = cb(formData);
33
+ startTransition(() => promise.then(setState));
34
+ return promise;
35
+ },
36
+ [cb, startTransition]
37
+ );
38
+ return [state, wrappedCb, isPending];
39
+ }
40
+ return { useValidation, useValidationTransition };
41
+ }
42
+ export {
43
+ createClient
44
+ };
45
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sources":["../../../src/react/form/client.tsx"],"sourcesContent":["'use client';\n\nimport { useActionState, useCallback, useState, useTransition } from 'react';\nimport { create, MaybeTypeOf, Validation } from './form';\nimport { z } from 'zod';\n\nconst FORM_DEBUG = process.env.NEXT_PUBLIC_FORM_DEBUG === 'true';\n\nexport function createClient<S extends z.ZodObject<any>>(schema: S) {\n const { validate } = create(schema);\n\n function useValidationCallback(\n actionFn: (data: FormData) => Promise<Validation<S>>,\n ): (formData: FormData) => Promise<Validation<S>> {\n return useCallback(\n async (formData: FormData) => {\n const clientRes = validate(formData);\n console.log('Client validation', FORM_DEBUG ? 'ignored' : 'active', clientRes);\n if (!clientRes.success && !FORM_DEBUG) return clientRes;\n\n const serverRes = await actionFn(formData);\n console.log('Server validation', serverRes);\n return serverRes;\n },\n [actionFn],\n );\n }\n\n function useValidation(\n actionFn: (data: FormData) => Promise<Validation<S>>,\n initialData: MaybeTypeOf<S> = {} as MaybeTypeOf<S>,\n ) {\n const cb = useValidationCallback(actionFn);\n\n return useActionState<Validation<S>, FormData>(async (_, data) => cb(data), {\n success: false,\n data: initialData,\n });\n }\n\n function useValidationTransition(\n actionFn: (data: FormData) => Promise<Validation<S>>,\n initialData: MaybeTypeOf<S> = {} as MaybeTypeOf<S>,\n ): [Validation<S>, (formData: FormData) => Promise<Validation<S>>, boolean] {\n const [isPending, startTransition] = useTransition();\n const [state, setState] = useState<Validation<S>>({ success: false, data: initialData });\n const cb = useValidationCallback(actionFn);\n\n const wrappedCb = useCallback(\n (formData: FormData) => {\n const promise = cb(formData);\n startTransition(() => promise.then(setState));\n return promise;\n },\n [cb, startTransition],\n );\n\n return [state, wrappedCb, isPending];\n }\n\n return { useValidation, useValidationTransition };\n}\n"],"names":[],"mappings":";;AAMA,MAAM,aAAa,QAAQ,IAAI,2BAA2B;AAEnD,SAAS,aAAyC,QAAW;AAChE,QAAM,EAAE,SAAA,IAAa,OAAO,MAAM;AAElC,WAAS,sBACL,UAC8C;AACvC,WAAA;AAAA,MACH,OAAO,aAAuB;AACpB,cAAA,YAAY,SAAS,QAAQ;AACnC,gBAAQ,IAAI,qBAAqB,aAAa,YAAY,UAAU,SAAS;AAC7E,YAAI,CAAC,UAAU,WAAW,CAAC,WAAmB,QAAA;AAExC,cAAA,YAAY,MAAM,SAAS,QAAQ;AACjC,gBAAA,IAAI,qBAAqB,SAAS;AACnC,eAAA;AAAA,MACX;AAAA,MACA,CAAC,QAAQ;AAAA,IACb;AAAA,EAAA;AAGJ,WAAS,cACL,UACA,cAA8B,IAChC;AACQ,UAAA,KAAK,sBAAsB,QAAQ;AAEzC,WAAO,eAAwC,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG;AAAA,MACxE,SAAS;AAAA,MACT,MAAM;AAAA,IAAA,CACT;AAAA,EAAA;AAGL,WAAS,wBACL,UACA,cAA8B,IAC0C;AACxE,UAAM,CAAC,WAAW,eAAe,IAAI,cAAc;AAC7C,UAAA,CAAC,OAAO,QAAQ,IAAI,SAAwB,EAAE,SAAS,OAAO,MAAM,aAAa;AACjF,UAAA,KAAK,sBAAsB,QAAQ;AAEzC,UAAM,YAAY;AAAA,MACd,CAAC,aAAuB;AACd,cAAA,UAAU,GAAG,QAAQ;AAC3B,wBAAgB,MAAM,QAAQ,KAAK,QAAQ,CAAC;AACrC,eAAA;AAAA,MACX;AAAA,MACA,CAAC,IAAI,eAAe;AAAA,IACxB;AAEO,WAAA,CAAC,OAAO,WAAW,SAAS;AAAA,EAAA;AAGhC,SAAA,EAAE,eAAe,wBAAwB;AACpD;"}
@@ -0,0 +1,44 @@
1
+ import { typeToFlattenedError, z, SafeParseReturnType, TypeOf } from 'zod';
2
+ export declare const stringRequired: () => z.ZodString;
3
+ export declare const maxLength: (schema: z.ZodString) => number;
4
+ export declare const minLength: (schema: z.ZodString) => number;
5
+ export declare const isRequired: (schema: z.ZodString) => boolean;
6
+ export type ZodObject = z.ZodObject<any> | z.ZodEffects<z.ZodObject<any>>;
7
+ export type MaybeTypeOf<S extends ZodObject> = Partial<TypeOf<S>>;
8
+ export type SafeTypeOf<S extends ZodObject> = SafeParseReturnType<TypeOf<S>, TypeOf<S>>['data'];
9
+ export type Errors<S extends ZodObject> = typeToFlattenedError<TypeOf<S>>['fieldErrors'];
10
+ export type Validation<S extends ZodObject> = {
11
+ success: true;
12
+ data: SafeTypeOf<S>;
13
+ errors?: never;
14
+ } | {
15
+ success: false;
16
+ data?: MaybeTypeOf<S>;
17
+ errors?: Errors<S>;
18
+ };
19
+ export declare function create<S extends ZodObject>(schema: S): {
20
+ register: (name: keyof TypeOf<S>, data?: MaybeTypeOf<S>, errors?: Errors<S>, mui?: boolean) => {
21
+ label?: any;
22
+ helperText?: string | undefined;
23
+ error?: boolean | undefined;
24
+ name: keyof z.TypeOf<S>;
25
+ id: keyof z.TypeOf<S>;
26
+ required: boolean;
27
+ maxLength: number;
28
+ type: string;
29
+ defaultValue: Partial<z.TypeOf<S>>[keyof z.TypeOf<S>] | undefined;
30
+ };
31
+ validate: (formData: FormData) => Validation<S>;
32
+ Field: ({ children, name, errors, hint, }: {
33
+ children?: any;
34
+ name: string;
35
+ errors?: Validation<S>["errors"];
36
+ hint?: string;
37
+ }) => import("react/jsx-runtime").JSX.Element;
38
+ validationError: (data: MaybeTypeOf<S>, errors: Errors<S>) => Validation<S>;
39
+ };
40
+ export declare function Hint({ children, error }: {
41
+ children: any;
42
+ error?: boolean;
43
+ }): import("react/jsx-runtime").JSX.Element;
44
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../../src/react/form/form.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,CAAC,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAI3E,eAAO,MAAM,cAAc,mBAAgE,CAAC;AAC5F,eAAO,MAAM,SAAS,WAAY,CAAC,CAAC,SAAS,KAAG,MAA+B,CAAC;AAChF,eAAO,MAAM,SAAS,WAAY,CAAC,CAAC,SAAS,KAAG,MAA+B,CAAC;AAChF,eAAO,MAAM,UAAU,WAAY,CAAC,CAAC,SAAS,KAAG,OAAgC,CAAC;AAElF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1E,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,SAAS,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAChG,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,SAAS,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;AACzF,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,SAAS,IACpC;IACI,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC;CAClB,GACD;IACI,OAAO,EAAE,KAAK,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CACtB,CAAC;AAER,wBAAgB,MAAM,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC;qBAQzB,MAAM,MAAM,CAAC,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,CAAC,QAAO,OAAO;;;;;;;;;;;yBA2BpE,QAAQ,KAAG,UAAU,CAAC,CAAC,CAAC;+CAqBjD;QACC,QAAQ,CAAC,EAAE,GAAG,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB;4BAlC8B,WAAW,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,KAAG,UAAU,CAAC,CAAC,CAAC;EAoDnF;AAED,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IAAE,QAAQ,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,2CAE3E"}
@@ -0,0 +1,75 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { z } from "zod";
3
+ const nonEmpty = "This field cannot be empty";
4
+ const stringRequired = () => z.string({ required_error: nonEmpty }).min(1, nonEmpty);
5
+ const maxLength = (schema) => schema.maxLength || 0;
6
+ const minLength = (schema) => schema.minLength || 0;
7
+ const isRequired = (schema) => minLength(schema) > 0;
8
+ function create(schema) {
9
+ const getShape = () => schema.shape || schema.sourceType().shape;
10
+ if (!getShape()) {
11
+ throw new Error("Invalid schema: only z.object() or z.object().refine() are supported");
12
+ }
13
+ function register(name, data, errors, mui = false) {
14
+ var _a, _b;
15
+ const field = getShape()[name];
16
+ return {
17
+ name,
18
+ id: name,
19
+ required: isRequired(field),
20
+ maxLength: maxLength(field),
21
+ type: field.isEmail ? "email" : name.includes("password") ? "password" : "text",
22
+ defaultValue: data == null ? void 0 : data[name],
23
+ ...mui ? {
24
+ label: field.description,
25
+ helperText: (_a = errors == null ? void 0 : errors[name]) == null ? void 0 : _a.join(", "),
26
+ error: !!((_b = errors == null ? void 0 : errors[name]) == null ? void 0 : _b.length)
27
+ } : {}
28
+ };
29
+ }
30
+ function validationError(data, errors) {
31
+ return {
32
+ success: false,
33
+ data,
34
+ // data is undefined if there are errors
35
+ errors
36
+ // Next.js will butcher error object, so we provide something more primitive
37
+ };
38
+ }
39
+ function validate(formData) {
40
+ const rawData = Object.fromEntries(formData);
41
+ const { error, data } = schema.safeParse(rawData);
42
+ if (error) {
43
+ return validationError(rawData, error.flatten().fieldErrors);
44
+ }
45
+ return { success: true, data };
46
+ }
47
+ function Field({
48
+ children,
49
+ name,
50
+ errors,
51
+ hint
52
+ }) {
53
+ var _a;
54
+ const { description } = getShape()[name];
55
+ return /* @__PURE__ */ jsxs("div", { className: "form-row", children: [
56
+ description && /* @__PURE__ */ jsx("label", { htmlFor: name, children: description }),
57
+ children,
58
+ hint && /* @__PURE__ */ jsx(Hint, { children: hint }),
59
+ (_a = errors == null ? void 0 : errors[name]) == null ? void 0 : _a.map((e) => /* @__PURE__ */ jsx(Hint, { error: true, children: e }, e))
60
+ ] });
61
+ }
62
+ return { register, validate, Field, validationError };
63
+ }
64
+ function Hint({ children, error }) {
65
+ return /* @__PURE__ */ jsx("div", { className: `hint ${error ? "hint-error" : ""}`, children });
66
+ }
67
+ export {
68
+ Hint,
69
+ create,
70
+ isRequired,
71
+ maxLength,
72
+ minLength,
73
+ stringRequired
74
+ };
75
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sources":["../../../src/react/form/form.tsx"],"sourcesContent":["import { typeToFlattenedError, z, SafeParseReturnType, TypeOf } from 'zod';\n\nconst nonEmpty = 'This field cannot be empty';\n\nexport const stringRequired = () => z.string({ required_error: nonEmpty }).min(1, nonEmpty);\nexport const maxLength = (schema: z.ZodString): number => schema.maxLength || 0;\nexport const minLength = (schema: z.ZodString): number => schema.minLength || 0;\nexport const isRequired = (schema: z.ZodString): boolean => minLength(schema) > 0;\n\nexport type ZodObject = z.ZodObject<any> | z.ZodEffects<z.ZodObject<any>>; // z.ZodType<any, any, any>\nexport type MaybeTypeOf<S extends ZodObject> = Partial<TypeOf<S>>;\nexport type SafeTypeOf<S extends ZodObject> = SafeParseReturnType<TypeOf<S>, TypeOf<S>>['data'];\nexport type Errors<S extends ZodObject> = typeToFlattenedError<TypeOf<S>>['fieldErrors'];\nexport type Validation<S extends ZodObject> =\n | {\n success: true; // this is true only if form was validated successfully\n data: SafeTypeOf<S>;\n errors?: never;\n }\n | {\n success: false;\n data?: MaybeTypeOf<S>;\n errors?: Errors<S>;\n };\n\nexport function create<S extends ZodObject>(schema: S) {\n const getShape = () =>\n (schema as z.ZodObject<any>).shape || (schema as z.ZodEffects<z.ZodObject<any>>).sourceType().shape;\n\n if (!getShape()) {\n throw new Error('Invalid schema: only z.object() or z.object().refine() are supported');\n }\n\n function register(name: keyof TypeOf<S>, data?: MaybeTypeOf<S>, errors?: Errors<S>, mui: boolean = false) {\n const field = getShape()[name];\n return {\n name,\n id: name,\n required: isRequired(field),\n maxLength: maxLength(field),\n type: field.isEmail ? 'email' : (name as string).includes('password') ? 'password' : 'text',\n defaultValue: data?.[name],\n ...(mui\n ? {\n label: field.description,\n helperText: errors?.[name]?.join(', '),\n error: !!errors?.[name]?.length,\n }\n : {}),\n };\n }\n\n function validationError(data: MaybeTypeOf<S>, errors: Errors<S>): Validation<S> {\n return {\n success: false,\n data, // data is undefined if there are errors\n errors, // Next.js will butcher error object, so we provide something more primitive\n };\n }\n\n function validate(formData: FormData): Validation<S> {\n const rawData = Object.fromEntries(formData) as TypeOf<S>;\n const { error, data } = schema.safeParse(rawData);\n\n // console.log('Validate result', { error, data, rawData });\n\n if (error) {\n // data is undefined if there are errors\n // Next.js will butcher error object, so we provide something more primitive\n return validationError(rawData, error.flatten().fieldErrors as any);\n }\n\n return { success: true, data };\n }\n\n //FIXME Context?\n function Field({\n children,\n name,\n errors,\n hint,\n }: {\n children?: any;\n name: string;\n errors?: Validation<S>['errors'];\n hint?: string;\n }) {\n const { description } = getShape()[name];\n\n return (\n <div className=\"form-row\">\n {description && <label htmlFor={name}>{description}</label>}\n {children}\n {hint && <Hint>{hint}</Hint>}\n {errors?.[name]?.map((e: string) => (\n <Hint error key={e}>\n {e}\n </Hint>\n ))}\n </div>\n );\n }\n\n return { register, validate, Field, validationError };\n}\n\nexport function Hint({ children, error }: { children: any; error?: boolean }) {\n return <div className={`hint ${error ? 'hint-error' : ''}`}>{children}</div>;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,WAAW;AAEJ,MAAA,iBAAiB,MAAM,EAAE,OAAO,EAAE,gBAAgB,UAAU,EAAE,IAAI,GAAG,QAAQ;AACnF,MAAM,YAAY,CAAC,WAAgC,OAAO,aAAa;AACvE,MAAM,YAAY,CAAC,WAAgC,OAAO,aAAa;AACvE,MAAM,aAAa,CAAC,WAAiC,UAAU,MAAM,IAAI;AAkBzE,SAAS,OAA4B,QAAW;AACnD,QAAM,WAAW,MACZ,OAA4B,SAAU,OAA0C,aAAa;AAE9F,MAAA,CAAC,YAAY;AACP,UAAA,IAAI,MAAM,sEAAsE;AAAA,EAAA;AAG1F,WAAS,SAAS,MAAuB,MAAuB,QAAoB,MAAe,OAAO;;AAChG,UAAA,QAAQ,SAAS,EAAE,IAAI;AACtB,WAAA;AAAA,MACH;AAAA,MACA,IAAI;AAAA,MACJ,UAAU,WAAW,KAAK;AAAA,MAC1B,WAAW,UAAU,KAAK;AAAA,MAC1B,MAAM,MAAM,UAAU,UAAW,KAAgB,SAAS,UAAU,IAAI,aAAa;AAAA,MACrF,cAAc,6BAAO;AAAA,MACrB,GAAI,MACE;AAAA,QACI,OAAO,MAAM;AAAA,QACb,aAAY,sCAAS,UAAT,mBAAgB,KAAK;AAAA,QACjC,OAAO,CAAC,GAAC,sCAAS,UAAT,mBAAgB;AAAA,MAAA,IAE7B,CAAA;AAAA,IACV;AAAA,EAAA;AAGK,WAAA,gBAAgB,MAAsB,QAAkC;AACtE,WAAA;AAAA,MACH,SAAS;AAAA,MACT;AAAA;AAAA,MACA;AAAA;AAAA,IACJ;AAAA,EAAA;AAGJ,WAAS,SAAS,UAAmC;AAC3C,UAAA,UAAU,OAAO,YAAY,QAAQ;AAC3C,UAAM,EAAE,OAAO,KAAA,IAAS,OAAO,UAAU,OAAO;AAIhD,QAAI,OAAO;AAGP,aAAO,gBAAgB,SAAS,MAAM,QAAA,EAAU,WAAkB;AAAA,IAAA;AAG/D,WAAA,EAAE,SAAS,MAAM,KAAK;AAAA,EAAA;AAIjC,WAAS,MAAM;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAMD;;AACC,UAAM,EAAE,YAAA,IAAgB,SAAA,EAAW,IAAI;AAGnC,WAAA,qBAAC,OAAI,EAAA,WAAU,YACV,UAAA;AAAA,MAAA,eAAgB,oBAAA,SAAA,EAAM,SAAS,MAAO,UAAY,aAAA;AAAA,MAClD;AAAA,MACA,QAAS,oBAAA,MAAA,EAAM,UAAK,KAAA,CAAA;AAAA,OACpB,sCAAS,UAAT,mBAAgB,IAAI,CAAC,MACjB,oBAAA,MAAA,EAAK,OAAK,MACN,UADY,EAAA,GAAA,CAEjB;AAAA,IACH,GACL;AAAA,EAAA;AAIR,SAAO,EAAE,UAAU,UAAU,OAAO,gBAAgB;AACxD;AAEO,SAAS,KAAK,EAAE,UAAU,SAA6C;AACnE,SAAA,oBAAC,SAAI,WAAW,QAAQ,QAAQ,eAAe,EAAE,IAAK,SAAS,CAAA;AAC1E;"}
@@ -0,0 +1,3 @@
1
+ export * from './client';
2
+ export * from './form';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/form/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './form';
2
+ export * from './apiCall';
3
+ export * from './useFetch';
4
+ export * from './useFetcher';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { createClient } from "./form/client.js";
2
+ import { Hint, create, isRequired, maxLength, minLength, stringRequired } from "./form/form.js";
3
+ import { apiCall, jsonContentType } from "./apiCall.js";
4
+ import { useFetch } from "./useFetch.js";
5
+ import { useFetcher } from "./useFetcher.js";
6
+ export {
7
+ Hint,
8
+ apiCall,
9
+ create,
10
+ createClient,
11
+ isRequired,
12
+ jsonContentType,
13
+ maxLength,
14
+ minLength,
15
+ stringRequired,
16
+ useFetch,
17
+ useFetcher
18
+ };
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,2 @@
1
+ export declare function useFetch<R>(fn: (...args: any[]) => Promise<R>, defaultValue?: R | null): [R | null, typeof fn, boolean, Error | undefined];
2
+ //# sourceMappingURL=useFetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFetch.d.ts","sourceRoot":"","sources":["../../src/react/useFetch.ts"],"names":[],"mappings":"AAOA,wBAAgB,QAAQ,CAAC,CAAC,EACtB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EAClC,YAAY,GAAE,CAAC,GAAG,IAAW,GAC9B,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,GAAG,SAAS,CAAC,CAkBnD"}
@@ -0,0 +1,19 @@
1
+ import { useTransition, useState, useCallback } from "react";
2
+ function useFetch(fn, defaultValue = null) {
3
+ const [isPending, startTransition] = useTransition();
4
+ const [data, setData] = useState(defaultValue);
5
+ const [error, setError] = useState();
6
+ const actionFn = useCallback(
7
+ (...args) => {
8
+ const promise = fn(...args);
9
+ startTransition(() => promise.then(setData).catch(setError));
10
+ return promise;
11
+ },
12
+ [fn]
13
+ );
14
+ return [data, actionFn, isPending, error];
15
+ }
16
+ export {
17
+ useFetch
18
+ };
19
+ //# sourceMappingURL=useFetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFetch.js","sources":["../../src/react/useFetch.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useState, useTransition } from 'react';\n\n//TODO useFetch https://use-http.com\n//TODO SWR?\n//TODO Tanstack Query?\nexport function useFetch<R>(\n fn: (...args: any[]) => Promise<R>,\n defaultValue: R | null = null,\n): [R | null, typeof fn, boolean, Error | undefined] {\n // An async function was passed to useActionState, but it was dispatched outside of an action context.\n // This is likely not what you intended. Either pass the dispatch function to an `action` prop, or dispatch manually inside `startTransition`\n const [isPending, startTransition] = useTransition();\n const [data, setData] = useState<R | null>(defaultValue);\n const [error, setError] = useState<Error>();\n\n const actionFn = useCallback(\n (...args: Parameters<typeof fn>) => {\n const promise = fn(...args);\n // https://react.dev/reference/react/useTransition#react-doesnt-treat-my-state-update-after-await-as-a-transition\n startTransition(() => promise.then(setData).catch(setError)); //FIXME sub-chain...\n return promise;\n },\n [fn],\n );\n\n return [data, actionFn, isPending, error];\n}\n"],"names":[],"mappings":";AAOgB,SAAA,SACZ,IACA,eAAyB,MACwB;AAGjD,QAAM,CAAC,WAAW,eAAe,IAAI,cAAc;AACnD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAmB,YAAY;AACvD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAgB;AAE1C,QAAM,WAAW;AAAA,IACb,IAAI,SAAgC;AAC1B,YAAA,UAAU,GAAG,GAAG,IAAI;AAE1B,sBAAgB,MAAM,QAAQ,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AACpD,aAAA;AAAA,IACX;AAAA,IACA,CAAC,EAAE;AAAA,EACP;AAEA,SAAO,CAAC,MAAM,UAAU,WAAW,KAAK;AAC5C;"}
@@ -0,0 +1,10 @@
1
+ export declare function useFetcher<T = any>(cb: any, { fetchOnMount, onError }?: {
2
+ fetchOnMount?: boolean;
3
+ onError?: (e: Error) => void;
4
+ }): {
5
+ loading: boolean;
6
+ error: Error | null;
7
+ data: T | null;
8
+ trigger: (...args: any[]) => Promise<any>;
9
+ };
10
+ //# sourceMappingURL=useFetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFetcher.d.ts","sourceRoot":"","sources":["../../src/react/useFetcher.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAC9B,EAAE,KAAA,EAEF,EAAE,YAAoB,EAAE,OAAO,EAAE,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;CAAO;;;;;EA2CnG"}
@@ -0,0 +1,43 @@
1
+ import { useState, useRef, useCallback, useEffect } from "react";
2
+ function useFetcher(cb, { fetchOnMount = false, onError } = {}) {
3
+ const [loading, setLoading] = useState(fetchOnMount);
4
+ const [error, setError] = useState(null);
5
+ const [data, setData] = useState(null);
6
+ const isMounted = useRef(false);
7
+ const trigger = useCallback(
8
+ async (...args) => {
9
+ try {
10
+ setLoading(true);
11
+ setError(null);
12
+ const res = await cb(args);
13
+ if (!isMounted.current) return;
14
+ setData(res);
15
+ return res;
16
+ } catch (e) {
17
+ console.error("Fetch failed", e);
18
+ if (!isMounted.current) return;
19
+ setError(e);
20
+ onError == null ? void 0 : onError(e);
21
+ } finally {
22
+ if (isMounted.current) setLoading(false);
23
+ }
24
+ },
25
+ [cb, onError]
26
+ );
27
+ useEffect(() => {
28
+ if (fetchOnMount) {
29
+ trigger().catch((e) => console.error("Fetch on mount failed", e));
30
+ }
31
+ }, [fetchOnMount, cb, trigger]);
32
+ useEffect(() => {
33
+ isMounted.current = true;
34
+ return () => {
35
+ isMounted.current = false;
36
+ };
37
+ });
38
+ return { loading, error, data, trigger };
39
+ }
40
+ export {
41
+ useFetcher
42
+ };
43
+ //# sourceMappingURL=useFetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFetcher.js","sources":["../../src/react/useFetcher.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useFetcher<T = any>(\n cb,\n\n { fetchOnMount = false, onError }: { fetchOnMount?: boolean; onError?: (e: Error) => void } = {},\n) {\n const [loading, setLoading] = useState(fetchOnMount);\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<T | null>(null);\n\n const isMounted = useRef(false);\n\n const trigger = useCallback(\n async (...args) => {\n try {\n setLoading(true);\n setError(null);\n const res = await cb(args);\n if (!isMounted.current) return;\n setData(res);\n return res;\n } catch (e) {\n console.error('Fetch failed', e);\n if (!isMounted.current) return;\n setError(e);\n (onError as any)?.(e);\n } finally {\n if (isMounted.current) setLoading(false);\n }\n },\n [cb, onError],\n );\n\n useEffect(() => {\n if (fetchOnMount) {\n trigger().catch((e) => console.error('Fetch on mount failed', e)); // catch actually will never happen\n }\n }, [fetchOnMount, cb, trigger]);\n\n useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n });\n\n return { loading, error, data, trigger };\n}\n"],"names":[],"mappings":";AAEgB,SAAA,WACZ,IAEA,EAAE,eAAe,OAAO,QAAQ,IAA8D,IAChG;AACE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,YAAY;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AACrD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAmB,IAAI;AAEzC,QAAA,YAAY,OAAO,KAAK;AAE9B,QAAM,UAAU;AAAA,IACZ,UAAU,SAAS;AACX,UAAA;AACA,mBAAW,IAAI;AACf,iBAAS,IAAI;AACP,cAAA,MAAM,MAAM,GAAG,IAAI;AACrB,YAAA,CAAC,UAAU,QAAS;AACxB,gBAAQ,GAAG;AACJ,eAAA;AAAA,eACF,GAAG;AACA,gBAAA,MAAM,gBAAgB,CAAC;AAC3B,YAAA,CAAC,UAAU,QAAS;AACxB,iBAAS,CAAC;AACT,2CAAkB;AAAA,MAAC,UACtB;AACM,YAAA,UAAU,QAAS,YAAW,KAAK;AAAA,MAAA;AAAA,IAE/C;AAAA,IACA,CAAC,IAAI,OAAO;AAAA,EAChB;AAEA,YAAU,MAAM;AACZ,QAAI,cAAc;AACN,cAAA,EAAE,MAAM,CAAC,MAAM,QAAQ,MAAM,yBAAyB,CAAC,CAAC;AAAA,IAAA;AAAA,EAErE,GAAA,CAAC,cAAc,IAAI,OAAO,CAAC;AAE9B,YAAU,MAAM;AACZ,cAAU,UAAU;AACpB,WAAO,MAAM;AACT,gBAAU,UAAU;AAAA,IACxB;AAAA,EAAA,CACH;AAED,SAAO,EAAE,SAAS,OAAO,MAAM,QAAQ;AAC3C;"}
@@ -0,0 +1,4 @@
1
+ export * from './share';
2
+ export * from './update';
3
+ export * from './useAppState';
4
+ //# sourceMappingURL=index.d.ts.map