@kirill.konshin/utils 0.0.10 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +5 -5
- package/.turbo/turbo-test.log +7 -7
- package/CHANGELOG.md +6 -0
- package/dist/bootstrap/adaptiveContainer.d.ts +3 -0
- package/dist/bootstrap/adaptiveContainer.d.ts.map +1 -0
- package/dist/bootstrap/adaptiveContainer.js +11 -0
- package/dist/bootstrap/adaptiveContainer.js.map +1 -0
- package/dist/bootstrap/controls.d.ts +35 -0
- package/dist/bootstrap/controls.d.ts.map +1 -0
- package/dist/bootstrap/controls.js +77 -0
- package/dist/bootstrap/controls.js.map +1 -0
- package/dist/bootstrap/error.d.ts +7 -0
- package/dist/bootstrap/error.d.ts.map +1 -0
- package/dist/bootstrap/error.js +31 -0
- package/dist/bootstrap/error.js.map +1 -0
- package/dist/bootstrap/field.d.ts +9 -0
- package/dist/bootstrap/field.d.ts.map +1 -0
- package/dist/bootstrap/field.js +29 -0
- package/dist/bootstrap/field.js.map +1 -0
- package/dist/bootstrap/footer.d.ts +10 -0
- package/dist/bootstrap/footer.d.ts.map +1 -0
- package/dist/bootstrap/footer.js +40 -0
- package/dist/bootstrap/footer.js.map +1 -0
- package/dist/bootstrap/globalLoading.d.ts +4 -0
- package/dist/bootstrap/globalLoading.d.ts.map +1 -0
- package/dist/bootstrap/globalLoading.js +10 -0
- package/dist/bootstrap/globalLoading.js.map +1 -0
- package/dist/bootstrap/index.d.ts +13 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +34 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/bootstrap/loading.d.ts +8 -0
- package/dist/bootstrap/loading.d.ts.map +1 -0
- package/dist/bootstrap/loading.js +18 -0
- package/dist/bootstrap/loading.js.map +1 -0
- package/dist/bootstrap/responsiveHelper.d.ts +7 -0
- package/dist/bootstrap/responsiveHelper.d.ts.map +1 -0
- package/dist/bootstrap/responsiveHelper.js +45 -0
- package/dist/bootstrap/responsiveHelper.js.map +1 -0
- package/dist/bootstrap/screen.d.ts +20 -0
- package/dist/bootstrap/screen.d.ts.map +1 -0
- package/dist/bootstrap/screen.js +79 -0
- package/dist/bootstrap/screen.js.map +1 -0
- package/dist/bootstrap/toaster.d.ts +9 -0
- package/dist/bootstrap/toaster.d.ts.map +1 -0
- package/dist/bootstrap/toaster.js +36 -0
- package/dist/bootstrap/toaster.js.map +1 -0
- package/dist/bootstrap/useModal.d.ts +22 -0
- package/dist/bootstrap/useModal.d.ts.map +1 -0
- package/dist/bootstrap/useModal.js +50 -0
- package/dist/bootstrap/useModal.js.map +1 -0
- package/dist/bootstrap/useWrappedForm.d.ts +14 -0
- package/dist/bootstrap/useWrappedForm.d.ts.map +1 -0
- package/dist/bootstrap/useWrappedForm.js +32 -0
- package/dist/bootstrap/useWrappedForm.js.map +1 -0
- package/dist/core/cache.d.ts +121 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +104 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/errors.d.ts +2 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +15 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +22 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/measure.d.ts +35 -0
- package/dist/core/measure.d.ts.map +1 -0
- package/dist/core/measure.js +56 -0
- package/dist/core/measure.js.map +1 -0
- package/dist/core/mutex.d.ts +6 -0
- package/dist/core/mutex.d.ts.map +1 -0
- package/dist/core/mutex.js +26 -0
- package/dist/core/mutex.js.map +1 -0
- package/dist/core/worker.d.ts +84 -0
- package/dist/core/worker.d.ts.map +1 -0
- package/dist/core/worker.js +237 -0
- package/dist/core/worker.js.map +1 -0
- package/dist/electron/createWindow.d.ts +23 -0
- package/dist/electron/createWindow.d.ts.map +1 -0
- package/dist/electron/createWindow.js +160 -0
- package/dist/electron/createWindow.js.map +1 -0
- package/dist/electron/index.d.ts +3 -0
- package/dist/electron/index.d.ts.map +1 -0
- package/dist/electron/index.js +9 -0
- package/dist/electron/index.js.map +1 -0
- package/dist/electron/updater.d.ts +2 -0
- package/dist/electron/updater.d.ts.map +1 -0
- package/dist/electron/updater.js +47 -0
- package/dist/electron/updater.js.map +1 -0
- package/dist/electron-builder/builder.d.ts +8 -0
- package/dist/electron-builder/builder.d.ts.map +1 -0
- package/dist/electron-builder/builder.js +130 -0
- package/dist/electron-builder/builder.js.map +1 -0
- package/dist/electron-builder/images.d.ts +7 -0
- package/dist/electron-builder/images.d.ts.map +1 -0
- package/dist/electron-builder/images.js +25 -0
- package/dist/electron-builder/images.js.map +1 -0
- package/dist/electron-builder/index.d.ts +3 -0
- package/dist/electron-builder/index.d.ts.map +1 -0
- package/dist/electron-builder/index.js +7 -0
- package/dist/electron-builder/index.js.map +1 -0
- package/dist/mui/formControlFieldset.d.ts +5 -0
- package/dist/mui/formControlFieldset.d.ts.map +1 -0
- package/dist/mui/formControlFieldset.js +28 -0
- package/dist/mui/formControlFieldset.js.map +1 -0
- package/dist/mui/formLabelLegend.d.ts +4 -0
- package/dist/mui/formLabelLegend.d.ts.map +1 -0
- package/dist/mui/formLabelLegend.js +12 -0
- package/dist/mui/formLabelLegend.js.map +1 -0
- package/dist/mui/genericControl.d.ts +7 -0
- package/dist/mui/genericControl.d.ts.map +1 -0
- package/dist/mui/genericControl.js +21 -0
- package/dist/mui/genericControl.js.map +1 -0
- package/dist/mui/index.d.ts +5 -0
- package/dist/mui/index.d.ts.map +1 -0
- package/dist/mui/index.js +11 -0
- package/dist/mui/index.js.map +1 -0
- package/dist/mui/readOnly.d.ts +6 -0
- package/dist/mui/readOnly.d.ts.map +1 -0
- package/dist/mui/readOnly.js +7 -0
- package/dist/mui/readOnly.js.map +1 -0
- package/dist/next/appLink.d.ts +8 -0
- package/dist/next/appLink.d.ts.map +1 -0
- package/dist/next/appLink.js +33 -0
- package/dist/next/appLink.js.map +1 -0
- package/dist/next/index.d.ts +6 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +15 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/measure.d.ts +15 -0
- package/dist/next/measure.d.ts.map +1 -0
- package/dist/next/measure.js +9 -0
- package/dist/next/measure.js.map +1 -0
- package/dist/next/noSSR.d.ts +5 -0
- package/dist/next/noSSR.d.ts.map +1 -0
- package/dist/next/noSSR.js +14 -0
- package/dist/next/noSSR.js.map +1 -0
- package/dist/next/redirect.d.ts +6 -0
- package/dist/next/redirect.d.ts.map +1 -0
- package/dist/next/useIsInner.d.ts +3 -0
- package/dist/next/useIsInner.d.ts.map +1 -0
- package/dist/next/useIsInner.js +14 -0
- package/dist/next/useIsInner.js.map +1 -0
- package/dist/react/apiCall.d.ts +6 -0
- package/dist/react/apiCall.d.ts.map +1 -0
- package/dist/react/apiCall.js +24 -0
- package/dist/react/apiCall.js.map +1 -0
- package/dist/react/form/client.d.ts +7 -0
- package/dist/react/form/client.d.ts.map +1 -0
- package/dist/react/form/client.js +45 -0
- package/dist/react/form/client.js.map +1 -0
- package/dist/react/form/form.d.ts +44 -0
- package/dist/react/form/form.d.ts.map +1 -0
- package/dist/react/form/form.js +75 -0
- package/dist/react/form/form.js.map +1 -0
- package/dist/react/form/index.d.ts +3 -0
- package/dist/react/form/index.d.ts.map +1 -0
- package/dist/react/index.d.ts +5 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +19 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useFetch.d.ts +2 -0
- package/dist/react/useFetch.d.ts.map +1 -0
- package/dist/react/useFetch.js +19 -0
- package/dist/react/useFetch.js.map +1 -0
- package/dist/react/useFetcher.d.ts +10 -0
- package/dist/react/useFetcher.d.ts.map +1 -0
- package/dist/react/useFetcher.js +43 -0
- package/dist/react/useFetcher.js.map +1 -0
- package/dist/react-native/index.d.ts +4 -0
- package/dist/react-native/index.d.ts.map +1 -0
- package/dist/react-native/index.js +9 -0
- package/dist/react-native/index.js.map +1 -0
- package/dist/react-native/share.d.ts +9 -0
- package/dist/react-native/share.d.ts.map +1 -0
- package/dist/react-native/share.js +23 -0
- package/dist/react-native/share.js.map +1 -0
- package/dist/react-native/update.d.ts +4 -0
- package/dist/react-native/update.d.ts.map +1 -0
- package/dist/react-native/update.js +40 -0
- package/dist/react-native/update.js.map +1 -0
- package/dist/react-native/useAppState.d.ts +2 -0
- package/dist/react-native/useAppState.d.ts.map +1 -0
- package/dist/react-native/useAppState.js +18 -0
- package/dist/react-native/useAppState.js.map +1 -0
- package/dist/tailwind/fullpage.d.ts +7 -0
- package/dist/tailwind/fullpage.d.ts.map +1 -0
- package/dist/tailwind/fullpage.js +14 -0
- package/dist/tailwind/fullpage.js.map +1 -0
- package/dist/tailwind/index.d.ts +3 -0
- package/dist/tailwind/index.d.ts.map +1 -0
- package/dist/tailwind/index.js +7 -0
- package/dist/tailwind/index.js.map +1 -0
- package/dist/tailwind/responsiveHelper.d.ts +2 -0
- package/dist/tailwind/responsiveHelper.d.ts.map +1 -0
- package/dist/tailwind/responsiveHelper.js +15 -0
- package/dist/tailwind/responsiveHelper.js.map +1 -0
- package/package.json +1 -1
|
@@ -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 @@
|
|
|
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,MAAM,WAAW,CAAC;AAI7B,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,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 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 } & 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,UAMT,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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;"}
|