@webdevarif/dashui 1.2.7 → 1.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks.js +70 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hooks.mjs +33 -0
- package/dist/hooks.mjs.map +1 -0
- package/dist/i18n.js +52 -0
- package/dist/i18n.js.map +1 -0
- package/dist/i18n.mjs +25 -0
- package/dist/i18n.mjs.map +1 -0
- package/dist/index.js +34 -77
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +33 -71
- package/dist/index.mjs.map +1 -1
- package/dist/setup.js +85 -54
- package/dist/setup.js.map +1 -1
- package/dist/setup.mjs +82 -49
- package/dist/setup.mjs.map +1 -1
- package/dist/styles/globals.css +4 -52
- package/package.json +14 -3
package/dist/setup.js
CHANGED
|
@@ -31,13 +31,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var setup_exports = {};
|
|
32
32
|
__export(setup_exports, {
|
|
33
33
|
AuthProvider: () => AuthProvider,
|
|
34
|
-
I18nProvider: () => I18nProvider,
|
|
35
34
|
RootProvider: () => RootProvider,
|
|
36
35
|
SWRProvider: () => SWRProvider,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
useI18n: () => useI18n
|
|
36
|
+
authConfig: () => authConfig,
|
|
37
|
+
createAuth: () => createAuth,
|
|
38
|
+
useAuth: () => useAuth
|
|
41
39
|
});
|
|
42
40
|
module.exports = __toCommonJS(setup_exports);
|
|
43
41
|
|
|
@@ -48,41 +46,31 @@ function AuthProvider({ children, session }) {
|
|
|
48
46
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.SessionProvider, { session, children });
|
|
49
47
|
}
|
|
50
48
|
|
|
51
|
-
// src/setup/providers/i18n-provider.tsx
|
|
52
|
-
var import_next_intl = require("next-intl");
|
|
53
|
-
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
54
|
-
function I18nProvider({
|
|
55
|
-
children,
|
|
56
|
-
locale,
|
|
57
|
-
messages,
|
|
58
|
-
timeZone = "UTC"
|
|
59
|
-
}) {
|
|
60
|
-
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_next_intl.IntlProvider, { locale, messages, timeZone, children });
|
|
61
|
-
}
|
|
62
|
-
|
|
63
49
|
// src/setup/providers/swr-provider.tsx
|
|
64
50
|
var import_swr = require("swr");
|
|
65
|
-
var
|
|
51
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
52
|
+
var fetchFetcher = (url) => fetch(url).then((r) => r.json());
|
|
66
53
|
var DEFAULT_SWR_CONFIG = {
|
|
67
54
|
revalidateOnFocus: false,
|
|
68
55
|
revalidateOnReconnect: true,
|
|
69
56
|
dedupingInterval: 6e4,
|
|
70
57
|
focusThrottleInterval: 3e5
|
|
71
58
|
};
|
|
72
|
-
function SWRProvider({ children }) {
|
|
73
|
-
return /* @__PURE__ */ (0,
|
|
59
|
+
function SWRProvider({ children, fetcher, config }) {
|
|
60
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_swr.SWRConfig, { value: {
|
|
61
|
+
fetcher: fetcher ?? fetchFetcher,
|
|
62
|
+
...DEFAULT_SWR_CONFIG,
|
|
63
|
+
...config
|
|
64
|
+
}, children });
|
|
74
65
|
}
|
|
75
66
|
|
|
76
67
|
// src/setup/providers/root-provider.tsx
|
|
77
|
-
var
|
|
68
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
78
69
|
function RootProvider({
|
|
79
70
|
children,
|
|
80
|
-
session
|
|
81
|
-
locale,
|
|
82
|
-
messages,
|
|
83
|
-
timeZone
|
|
71
|
+
session
|
|
84
72
|
}) {
|
|
85
|
-
return /* @__PURE__ */ (0,
|
|
73
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(AuthProvider, { session, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SWRProvider, { children }) });
|
|
86
74
|
}
|
|
87
75
|
|
|
88
76
|
// src/setup/hooks/use-auth.ts
|
|
@@ -91,40 +79,83 @@ function useAuth() {
|
|
|
91
79
|
return (0, import_react2.useSession)();
|
|
92
80
|
}
|
|
93
81
|
|
|
94
|
-
// src/setup/
|
|
95
|
-
var
|
|
96
|
-
function
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
82
|
+
// src/setup/auth/auth.ts
|
|
83
|
+
var import_next_auth = __toESM(require("next-auth"));
|
|
84
|
+
function createAuth(options) {
|
|
85
|
+
const ROOT_DOMAIN2 = options.ROOT_DOMAIN ?? "localhost:3010";
|
|
86
|
+
const IS_DEV2 = process.env.NODE_ENV !== "production";
|
|
87
|
+
const cookieDomain2 = IS_DEV2 ? void 0 : "." + ROOT_DOMAIN2.split(":")[0];
|
|
88
|
+
return (0, import_next_auth.default)({
|
|
89
|
+
...options,
|
|
90
|
+
session: {
|
|
91
|
+
strategy: "jwt",
|
|
92
|
+
maxAge: 30 * 24 * 60 * 60,
|
|
93
|
+
// 30 days
|
|
94
|
+
...options.session
|
|
95
|
+
},
|
|
96
|
+
cookies: {
|
|
97
|
+
sessionToken: {
|
|
98
|
+
name: "authjs.session-token",
|
|
99
|
+
options: {
|
|
100
|
+
httpOnly: true,
|
|
101
|
+
sameSite: "lax",
|
|
102
|
+
path: "/",
|
|
103
|
+
...cookieDomain2 ? { domain: cookieDomain2 } : {},
|
|
104
|
+
secure: !IS_DEV2
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
110
109
|
}
|
|
111
110
|
|
|
112
|
-
// src/setup/
|
|
113
|
-
var
|
|
114
|
-
var
|
|
115
|
-
var
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
111
|
+
// src/setup/auth/auth.config.ts
|
|
112
|
+
var ROOT_DOMAIN = process.env.ROOT_DOMAIN ?? "localhost:3010";
|
|
113
|
+
var IS_DEV = process.env.NODE_ENV !== "production";
|
|
114
|
+
var cookieDomain = IS_DEV ? void 0 : "." + ROOT_DOMAIN.split(":")[0];
|
|
115
|
+
var authConfig = {
|
|
116
|
+
providers: [],
|
|
117
|
+
pages: { signIn: "/login" },
|
|
118
|
+
session: { maxAge: 30 * 24 * 60 * 60 },
|
|
119
|
+
cookies: {
|
|
120
|
+
sessionToken: {
|
|
121
|
+
name: "authjs.session-token",
|
|
122
|
+
options: {
|
|
123
|
+
httpOnly: true,
|
|
124
|
+
sameSite: "lax",
|
|
125
|
+
path: "/",
|
|
126
|
+
...cookieDomain ? { domain: cookieDomain } : {},
|
|
127
|
+
secure: !IS_DEV
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
callbacks: {
|
|
132
|
+
authorized() {
|
|
133
|
+
return true;
|
|
134
|
+
},
|
|
135
|
+
async jwt({ token, user }) {
|
|
136
|
+
if (user) {
|
|
137
|
+
token.id = user.id;
|
|
138
|
+
token.role = user.role;
|
|
139
|
+
}
|
|
140
|
+
return token;
|
|
141
|
+
},
|
|
142
|
+
async session({ session, token }) {
|
|
143
|
+
if (session.user) {
|
|
144
|
+
;
|
|
145
|
+
session.user.id = token.id;
|
|
146
|
+
session.user.role = token.role;
|
|
147
|
+
}
|
|
148
|
+
return session;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
};
|
|
119
152
|
// Annotate the CommonJS export names for ESM import in node:
|
|
120
153
|
0 && (module.exports = {
|
|
121
154
|
AuthProvider,
|
|
122
|
-
I18nProvider,
|
|
123
155
|
RootProvider,
|
|
124
156
|
SWRProvider,
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
useI18n
|
|
157
|
+
authConfig,
|
|
158
|
+
createAuth,
|
|
159
|
+
useAuth
|
|
129
160
|
});
|
|
130
161
|
//# sourceMappingURL=setup.js.map
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/setup/index.ts","../src/setup/providers/auth-provider.tsx","../src/setup/providers/
|
|
1
|
+
{"version":3,"sources":["../src/setup/index.ts","../src/setup/providers/auth-provider.tsx","../src/setup/providers/swr-provider.tsx","../src/setup/providers/root-provider.tsx","../src/setup/hooks/use-auth.ts","../src/setup/auth/auth.ts","../src/setup/auth/auth.config.ts"],"sourcesContent":["// Setup Providers\nexport * from './providers'\n\n// Setup Hooks (useAuth only - useFetch is in @webdevarif/dashui/hooks)\nexport * from './hooks'\n\n// Setup Auth\nexport * from './auth'\n\n// Note: Setup lib (prisma) is not exported - import only when needed\n// import { prisma } from '@webdevarif/dashui/setup/lib/prisma'\n","'use client'\n\nimport { ReactNode } from 'react'\nimport { SessionProvider } from 'next-auth/react'\n\ninterface AuthProviderProps {\n children: ReactNode\n session?: any\n}\n\n/**\n * AuthProvider - Wraps your app with NextAuth SessionProvider\n * \n * Usage:\n * ```tsx\n * import { AuthProvider } from '@webdevarif/dashui-setup/providers'\n * \n * <AuthProvider session={session}>\n * <App />\n * </AuthProvider>\n * ```\n */\nexport function AuthProvider({ children, session }: AuthProviderProps) {\n return (\n <SessionProvider session={session}>\n {children}\n </SessionProvider>\n )\n}\n","'use client'\n\nimport { ReactNode } from 'react'\nimport { SWRConfig } from 'swr'\n\nconst fetchFetcher = (url: string) => fetch(url).then(r => r.json())\n\nconst DEFAULT_SWR_CONFIG = {\n revalidateOnFocus: false,\n revalidateOnReconnect: true,\n dedupingInterval: 60000,\n focusThrottleInterval: 300000,\n}\n\ninterface SWRProviderProps {\n children: ReactNode\n /** Custom fetcher (e.g. axios). Default: fetch */\n fetcher?: (url: string) => Promise<any>\n /** Override any SWR config */\n config?: Record<string, any>\n}\n\n/**\n * SWRProvider - Global SWR config with optional axios support\n * \n * Default (fetch):\n * ```tsx\n * <SWRProvider>{children}</SWRProvider>\n * ```\n * \n * With axios:\n * ```tsx\n * import axios from 'axios'\n * const axiosFetcher = (url: string) => axios.get(url).then(res => res.data)\n * <SWRProvider fetcher={axiosFetcher}>{children}</SWRProvider>\n * ```\n * \n * Custom config:\n * ```tsx\n * <SWRProvider config={{ dedupingInterval: 30000 }}>{children}</SWRProvider>\n * ```\n */\nexport function SWRProvider({ children, fetcher, config }: SWRProviderProps) {\n return (\n <SWRConfig value={{\n fetcher: fetcher ?? fetchFetcher,\n ...DEFAULT_SWR_CONFIG,\n ...config,\n }}>\n {children}\n </SWRConfig>\n )\n}\n","'use client'\n\nimport { ReactNode } from 'react'\nimport { AuthProvider } from './auth-provider'\nimport { SWRProvider } from './swr-provider'\n\ninterface RootProviderProps {\n children: ReactNode\n session?: any\n}\n\n/**\n * RootProvider - Single provider that combines Auth + SWR\n * \n * I18n setup is handled by next-intl directly in your project\n * \n * Usage in layout.tsx:\n * ```tsx\n * import { RootProvider } from '@webdevarif/dashui/setup'\n * import { getMessages } from 'next-intl/server'\n * \n * export default async function RootLayout({ \n * children, \n * params: { locale } \n * }: {\n * children: React.ReactNode\n * params: { locale: string }\n * }) {\n * const session = await auth()\n * const messages = await getMessages()\n * \n * return (\n * <html lang={locale}>\n * <body>\n * <RootProvider session={session}>\n * {children}\n * </RootProvider>\n * </body>\n * </html>\n * )\n * }\n * ```\n */\nexport function RootProvider({\n children,\n session,\n}: RootProviderProps) {\n return (\n <AuthProvider session={session}>\n <SWRProvider>\n {children}\n </SWRProvider>\n </AuthProvider>\n )\n}\n","import { useSession } from 'next-auth/react'\n\n/**\n * useAuth - Hook to access current session and auth methods\n * \n * Returns the NextAuth useSession hook result\n * \n * Usage:\n * ```tsx\n * import { useAuth } from '@webdevarif/dashui-setup/hooks'\n * \n * function Profile() {\n * const { data: session, status } = useAuth()\n * \n * if (status === 'loading') return <div>Loading...</div>\n * if (status === 'unauthenticated') return <div>Not logged in</div>\n * \n * return <div>Welcome {session?.user?.name}</div>\n * }\n * ```\n */\nexport function useAuth() {\n return useSession()\n}\n","/**\n * @webdevarif/dashui Auth Factory\n * \n * Generic NextAuth setup - projects extend with their own config\n * \n * Usage:\n * ```tsx\n * // dashboard/auth.ts\n * import { createAuth } from '@webdevarif/dashui/setup'\n * import config from './auth.config'\n * \n * export const { handlers, auth, signIn, signOut } = createAuth(config)\n * ```\n */\n\nimport NextAuth from 'next-auth'\nimport type { NextAuthConfig } from 'next-auth'\n\nexport interface CreateAuthOptions extends NextAuthConfig {\n adapter?: any\n prisma?: any\n ROOT_DOMAIN?: string\n}\n\nexport function createAuth(options: CreateAuthOptions) {\n const ROOT_DOMAIN = options.ROOT_DOMAIN ?? 'localhost:3010'\n const IS_DEV = process.env.NODE_ENV !== 'production'\n \n const cookieDomain = IS_DEV \n ? undefined \n : '.' + ROOT_DOMAIN.split(':')[0]\n\n return NextAuth({\n ...options,\n session: {\n strategy: 'jwt',\n maxAge: 30 * 24 * 60 * 60, // 30 days\n ...options.session,\n },\n cookies: {\n sessionToken: {\n name: 'authjs.session-token',\n options: {\n httpOnly: true,\n sameSite: 'lax' as const,\n path: '/',\n ...(cookieDomain ? { domain: cookieDomain } : {}),\n secure: !IS_DEV,\n },\n },\n },\n })\n}\n\nexport default createAuth\n","/**\n * @webdevarif/dashui Auth Config Template\n * \n * Edge-compatible auth config (no Prisma, no database)\n * Used by proxy.ts/middleware.ts for protected routes\n * \n * Projects copy/customize this file\n */\n\nimport type { NextAuthConfig } from 'next-auth'\n\nconst ROOT_DOMAIN = process.env.ROOT_DOMAIN ?? 'localhost:3010'\nconst IS_DEV = process.env.NODE_ENV !== 'production'\n\nconst cookieDomain = IS_DEV ? undefined : '.' + ROOT_DOMAIN.split(':')[0]\n\nexport const authConfig = {\n providers: [],\n pages: { signIn: '/login' },\n session: { maxAge: 30 * 24 * 60 * 60 },\n cookies: {\n sessionToken: {\n name: 'authjs.session-token',\n options: {\n httpOnly: true,\n sameSite: 'lax' as const,\n path: '/',\n ...(cookieDomain ? { domain: cookieDomain } : {}),\n secure: !IS_DEV,\n },\n },\n },\n callbacks: {\n authorized() { return true },\n async jwt({ token, user }) {\n if (user) {\n token.id = (user as any).id\n token.role = (user as any).role\n }\n return token\n },\n async session({ session, token }) {\n if (session.user) {\n ;(session.user as any).id = token.id\n ;(session.user as any).role = token.role\n }\n return session\n },\n },\n} satisfies NextAuthConfig\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","import_react","ROOT_DOMAIN","IS_DEV","cookieDomain","NextAuth"]}
|
package/dist/setup.mjs
CHANGED
|
@@ -5,41 +5,31 @@ function AuthProvider({ children, session }) {
|
|
|
5
5
|
return /* @__PURE__ */ jsx(SessionProvider, { session, children });
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
// src/setup/providers/i18n-provider.tsx
|
|
9
|
-
import { IntlProvider } from "next-intl";
|
|
10
|
-
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
11
|
-
function I18nProvider({
|
|
12
|
-
children,
|
|
13
|
-
locale,
|
|
14
|
-
messages,
|
|
15
|
-
timeZone = "UTC"
|
|
16
|
-
}) {
|
|
17
|
-
return /* @__PURE__ */ jsx2(IntlProvider, { locale, messages, timeZone, children });
|
|
18
|
-
}
|
|
19
|
-
|
|
20
8
|
// src/setup/providers/swr-provider.tsx
|
|
21
9
|
import { SWRConfig } from "swr";
|
|
22
|
-
import { jsx as
|
|
10
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
11
|
+
var fetchFetcher = (url) => fetch(url).then((r) => r.json());
|
|
23
12
|
var DEFAULT_SWR_CONFIG = {
|
|
24
13
|
revalidateOnFocus: false,
|
|
25
14
|
revalidateOnReconnect: true,
|
|
26
15
|
dedupingInterval: 6e4,
|
|
27
16
|
focusThrottleInterval: 3e5
|
|
28
17
|
};
|
|
29
|
-
function SWRProvider({ children }) {
|
|
30
|
-
return /* @__PURE__ */
|
|
18
|
+
function SWRProvider({ children, fetcher, config }) {
|
|
19
|
+
return /* @__PURE__ */ jsx2(SWRConfig, { value: {
|
|
20
|
+
fetcher: fetcher ?? fetchFetcher,
|
|
21
|
+
...DEFAULT_SWR_CONFIG,
|
|
22
|
+
...config
|
|
23
|
+
}, children });
|
|
31
24
|
}
|
|
32
25
|
|
|
33
26
|
// src/setup/providers/root-provider.tsx
|
|
34
|
-
import { jsx as
|
|
27
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
35
28
|
function RootProvider({
|
|
36
29
|
children,
|
|
37
|
-
session
|
|
38
|
-
locale,
|
|
39
|
-
messages,
|
|
40
|
-
timeZone
|
|
30
|
+
session
|
|
41
31
|
}) {
|
|
42
|
-
return /* @__PURE__ */
|
|
32
|
+
return /* @__PURE__ */ jsx3(AuthProvider, { session, children: /* @__PURE__ */ jsx3(SWRProvider, { children }) });
|
|
43
33
|
}
|
|
44
34
|
|
|
45
35
|
// src/setup/hooks/use-auth.ts
|
|
@@ -48,39 +38,82 @@ function useAuth() {
|
|
|
48
38
|
return useSession();
|
|
49
39
|
}
|
|
50
40
|
|
|
51
|
-
// src/setup/
|
|
52
|
-
import
|
|
53
|
-
function
|
|
54
|
-
|
|
41
|
+
// src/setup/auth/auth.ts
|
|
42
|
+
import NextAuth from "next-auth";
|
|
43
|
+
function createAuth(options) {
|
|
44
|
+
const ROOT_DOMAIN2 = options.ROOT_DOMAIN ?? "localhost:3010";
|
|
45
|
+
const IS_DEV2 = process.env.NODE_ENV !== "production";
|
|
46
|
+
const cookieDomain2 = IS_DEV2 ? void 0 : "." + ROOT_DOMAIN2.split(":")[0];
|
|
47
|
+
return NextAuth({
|
|
48
|
+
...options,
|
|
49
|
+
session: {
|
|
50
|
+
strategy: "jwt",
|
|
51
|
+
maxAge: 30 * 24 * 60 * 60,
|
|
52
|
+
// 30 days
|
|
53
|
+
...options.session
|
|
54
|
+
},
|
|
55
|
+
cookies: {
|
|
56
|
+
sessionToken: {
|
|
57
|
+
name: "authjs.session-token",
|
|
58
|
+
options: {
|
|
59
|
+
httpOnly: true,
|
|
60
|
+
sameSite: "lax",
|
|
61
|
+
path: "/",
|
|
62
|
+
...cookieDomain2 ? { domain: cookieDomain2 } : {},
|
|
63
|
+
secure: !IS_DEV2
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
55
68
|
}
|
|
56
69
|
|
|
57
|
-
// src/setup/
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
|
|
70
|
+
// src/setup/auth/auth.config.ts
|
|
71
|
+
var ROOT_DOMAIN = process.env.ROOT_DOMAIN ?? "localhost:3010";
|
|
72
|
+
var IS_DEV = process.env.NODE_ENV !== "production";
|
|
73
|
+
var cookieDomain = IS_DEV ? void 0 : "." + ROOT_DOMAIN.split(":")[0];
|
|
74
|
+
var authConfig = {
|
|
75
|
+
providers: [],
|
|
76
|
+
pages: { signIn: "/login" },
|
|
77
|
+
session: { maxAge: 30 * 24 * 60 * 60 },
|
|
78
|
+
cookies: {
|
|
79
|
+
sessionToken: {
|
|
80
|
+
name: "authjs.session-token",
|
|
81
|
+
options: {
|
|
82
|
+
httpOnly: true,
|
|
83
|
+
sameSite: "lax",
|
|
84
|
+
path: "/",
|
|
85
|
+
...cookieDomain ? { domain: cookieDomain } : {},
|
|
86
|
+
secure: !IS_DEV
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
callbacks: {
|
|
91
|
+
authorized() {
|
|
92
|
+
return true;
|
|
93
|
+
},
|
|
94
|
+
async jwt({ token, user }) {
|
|
95
|
+
if (user) {
|
|
96
|
+
token.id = user.id;
|
|
97
|
+
token.role = user.role;
|
|
98
|
+
}
|
|
99
|
+
return token;
|
|
100
|
+
},
|
|
101
|
+
async session({ session, token }) {
|
|
102
|
+
if (session.user) {
|
|
103
|
+
;
|
|
104
|
+
session.user.id = token.id;
|
|
105
|
+
session.user.role = token.role;
|
|
106
|
+
}
|
|
107
|
+
return session;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
76
111
|
export {
|
|
77
112
|
AuthProvider,
|
|
78
|
-
I18nProvider,
|
|
79
113
|
RootProvider,
|
|
80
114
|
SWRProvider,
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
useI18n
|
|
115
|
+
authConfig,
|
|
116
|
+
createAuth,
|
|
117
|
+
useAuth
|
|
85
118
|
};
|
|
86
119
|
//# sourceMappingURL=setup.mjs.map
|
package/dist/setup.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/setup/providers/auth-provider.tsx","../src/setup/providers/
|
|
1
|
+
{"version":3,"sources":["../src/setup/providers/auth-provider.tsx","../src/setup/providers/swr-provider.tsx","../src/setup/providers/root-provider.tsx","../src/setup/hooks/use-auth.ts","../src/setup/auth/auth.ts","../src/setup/auth/auth.config.ts"],"sourcesContent":["'use client'\n\nimport { ReactNode } from 'react'\nimport { SessionProvider } from 'next-auth/react'\n\ninterface AuthProviderProps {\n children: ReactNode\n session?: any\n}\n\n/**\n * AuthProvider - Wraps your app with NextAuth SessionProvider\n * \n * Usage:\n * ```tsx\n * import { AuthProvider } from '@webdevarif/dashui-setup/providers'\n * \n * <AuthProvider session={session}>\n * <App />\n * </AuthProvider>\n * ```\n */\nexport function AuthProvider({ children, session }: AuthProviderProps) {\n return (\n <SessionProvider session={session}>\n {children}\n </SessionProvider>\n )\n}\n","'use client'\n\nimport { ReactNode } from 'react'\nimport { SWRConfig } from 'swr'\n\nconst fetchFetcher = (url: string) => fetch(url).then(r => r.json())\n\nconst DEFAULT_SWR_CONFIG = {\n revalidateOnFocus: false,\n revalidateOnReconnect: true,\n dedupingInterval: 60000,\n focusThrottleInterval: 300000,\n}\n\ninterface SWRProviderProps {\n children: ReactNode\n /** Custom fetcher (e.g. axios). Default: fetch */\n fetcher?: (url: string) => Promise<any>\n /** Override any SWR config */\n config?: Record<string, any>\n}\n\n/**\n * SWRProvider - Global SWR config with optional axios support\n * \n * Default (fetch):\n * ```tsx\n * <SWRProvider>{children}</SWRProvider>\n * ```\n * \n * With axios:\n * ```tsx\n * import axios from 'axios'\n * const axiosFetcher = (url: string) => axios.get(url).then(res => res.data)\n * <SWRProvider fetcher={axiosFetcher}>{children}</SWRProvider>\n * ```\n * \n * Custom config:\n * ```tsx\n * <SWRProvider config={{ dedupingInterval: 30000 }}>{children}</SWRProvider>\n * ```\n */\nexport function SWRProvider({ children, fetcher, config }: SWRProviderProps) {\n return (\n <SWRConfig value={{\n fetcher: fetcher ?? fetchFetcher,\n ...DEFAULT_SWR_CONFIG,\n ...config,\n }}>\n {children}\n </SWRConfig>\n )\n}\n","'use client'\n\nimport { ReactNode } from 'react'\nimport { AuthProvider } from './auth-provider'\nimport { SWRProvider } from './swr-provider'\n\ninterface RootProviderProps {\n children: ReactNode\n session?: any\n}\n\n/**\n * RootProvider - Single provider that combines Auth + SWR\n * \n * I18n setup is handled by next-intl directly in your project\n * \n * Usage in layout.tsx:\n * ```tsx\n * import { RootProvider } from '@webdevarif/dashui/setup'\n * import { getMessages } from 'next-intl/server'\n * \n * export default async function RootLayout({ \n * children, \n * params: { locale } \n * }: {\n * children: React.ReactNode\n * params: { locale: string }\n * }) {\n * const session = await auth()\n * const messages = await getMessages()\n * \n * return (\n * <html lang={locale}>\n * <body>\n * <RootProvider session={session}>\n * {children}\n * </RootProvider>\n * </body>\n * </html>\n * )\n * }\n * ```\n */\nexport function RootProvider({\n children,\n session,\n}: RootProviderProps) {\n return (\n <AuthProvider session={session}>\n <SWRProvider>\n {children}\n </SWRProvider>\n </AuthProvider>\n )\n}\n","import { useSession } from 'next-auth/react'\n\n/**\n * useAuth - Hook to access current session and auth methods\n * \n * Returns the NextAuth useSession hook result\n * \n * Usage:\n * ```tsx\n * import { useAuth } from '@webdevarif/dashui-setup/hooks'\n * \n * function Profile() {\n * const { data: session, status } = useAuth()\n * \n * if (status === 'loading') return <div>Loading...</div>\n * if (status === 'unauthenticated') return <div>Not logged in</div>\n * \n * return <div>Welcome {session?.user?.name}</div>\n * }\n * ```\n */\nexport function useAuth() {\n return useSession()\n}\n","/**\n * @webdevarif/dashui Auth Factory\n * \n * Generic NextAuth setup - projects extend with their own config\n * \n * Usage:\n * ```tsx\n * // dashboard/auth.ts\n * import { createAuth } from '@webdevarif/dashui/setup'\n * import config from './auth.config'\n * \n * export const { handlers, auth, signIn, signOut } = createAuth(config)\n * ```\n */\n\nimport NextAuth from 'next-auth'\nimport type { NextAuthConfig } from 'next-auth'\n\nexport interface CreateAuthOptions extends NextAuthConfig {\n adapter?: any\n prisma?: any\n ROOT_DOMAIN?: string\n}\n\nexport function createAuth(options: CreateAuthOptions) {\n const ROOT_DOMAIN = options.ROOT_DOMAIN ?? 'localhost:3010'\n const IS_DEV = process.env.NODE_ENV !== 'production'\n \n const cookieDomain = IS_DEV \n ? undefined \n : '.' + ROOT_DOMAIN.split(':')[0]\n\n return NextAuth({\n ...options,\n session: {\n strategy: 'jwt',\n maxAge: 30 * 24 * 60 * 60, // 30 days\n ...options.session,\n },\n cookies: {\n sessionToken: {\n name: 'authjs.session-token',\n options: {\n httpOnly: true,\n sameSite: 'lax' as const,\n path: '/',\n ...(cookieDomain ? { domain: cookieDomain } : {}),\n secure: !IS_DEV,\n },\n },\n },\n })\n}\n\nexport default createAuth\n","/**\n * @webdevarif/dashui Auth Config Template\n * \n * Edge-compatible auth config (no Prisma, no database)\n * Used by proxy.ts/middleware.ts for protected routes\n * \n * Projects copy/customize this file\n */\n\nimport type { NextAuthConfig } from 'next-auth'\n\nconst ROOT_DOMAIN = process.env.ROOT_DOMAIN ?? 'localhost:3010'\nconst IS_DEV = process.env.NODE_ENV !== 'production'\n\nconst cookieDomain = IS_DEV ? undefined : '.' + ROOT_DOMAIN.split(':')[0]\n\nexport const authConfig = {\n providers: [],\n pages: { signIn: '/login' },\n session: { maxAge: 30 * 24 * 60 * 60 },\n cookies: {\n sessionToken: {\n name: 'authjs.session-token',\n options: {\n httpOnly: true,\n sameSite: 'lax' as const,\n path: '/',\n ...(cookieDomain ? { domain: cookieDomain } : {}),\n secure: !IS_DEV,\n },\n },\n },\n callbacks: {\n authorized() { return true },\n async jwt({ token, user }) {\n if (user) {\n token.id = (user as any).id\n token.role = (user as any).role\n }\n return token\n },\n async session({ session, token }) {\n if (session.user) {\n ;(session.user as any).id = token.id\n ;(session.user as any).role = token.role\n }\n return session\n },\n },\n} satisfies NextAuthConfig\n"],"mappings":";AAGA,SAAS,uBAAuB;AAqB5B;AAFG,SAAS,aAAa,EAAE,UAAU,QAAQ,GAAsB;AACrE,SACE,oBAAC,mBAAgB,SACd,UACH;AAEJ;;;ACzBA,SAAS,iBAAiB;AAyCtB,gBAAAA,YAAA;AAvCJ,IAAM,eAAe,CAAC,QAAgB,MAAM,GAAG,EAAE,KAAK,OAAK,EAAE,KAAK,CAAC;AAEnE,IAAM,qBAAqB;AAAA,EACzB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,uBAAuB;AACzB;AA8BO,SAAS,YAAY,EAAE,UAAU,SAAS,OAAO,GAAqB;AAC3E,SACE,gBAAAA,KAAC,aAAU,OAAO;AAAA,IAChB,SAAS,WAAW;AAAA,IACpB,GAAG;AAAA,IACH,GAAG;AAAA,EACL,GACG,UACH;AAEJ;;;ACHM,gBAAAC,YAAA;AANC,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AACF,GAAsB;AACpB,SACE,gBAAAA,KAAC,gBAAa,SACZ,0BAAAA,KAAC,eACE,UACH,GACF;AAEJ;;;ACtDA,SAAS,kBAAkB;AAqBpB,SAAS,UAAU;AACxB,SAAO,WAAW;AACpB;;;ACRA,OAAO,cAAc;AASd,SAAS,WAAW,SAA4B;AACrD,QAAMC,eAAc,QAAQ,eAAe;AAC3C,QAAMC,UAAS,QAAQ,IAAI,aAAa;AAExC,QAAMC,gBAAeD,UACjB,SACA,MAAMD,aAAY,MAAM,GAAG,EAAE,CAAC;AAElC,SAAO,SAAS;AAAA,IACd,GAAG;AAAA,IACH,SAAS;AAAA,MACP,UAAU;AAAA,MACV,QAAQ,KAAK,KAAK,KAAK;AAAA;AAAA,MACvB,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,SAAS;AAAA,MACP,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,UACN,GAAIE,gBAAe,EAAE,QAAQA,cAAa,IAAI,CAAC;AAAA,UAC/C,QAAQ,CAACD;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACzCA,IAAM,cAAc,QAAQ,IAAI,eAAe;AAC/C,IAAM,SAAS,QAAQ,IAAI,aAAa;AAExC,IAAM,eAAe,SAAS,SAAY,MAAM,YAAY,MAAM,GAAG,EAAE,CAAC;AAEjE,IAAM,aAAa;AAAA,EACxB,WAAW,CAAC;AAAA,EACZ,OAAO,EAAE,QAAQ,SAAS;AAAA,EAC1B,SAAS,EAAE,QAAQ,KAAK,KAAK,KAAK,GAAG;AAAA,EACrC,SAAS;AAAA,IACP,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,GAAI,eAAe,EAAE,QAAQ,aAAa,IAAI,CAAC;AAAA,QAC/C,QAAQ,CAAC;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,aAAa;AAAE,aAAO;AAAA,IAAK;AAAA,IAC3B,MAAM,IAAI,EAAE,OAAO,KAAK,GAAG;AACzB,UAAI,MAAM;AACR,cAAM,KAAM,KAAa;AACzB,cAAM,OAAQ,KAAa;AAAA,MAC7B;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,QAAQ,EAAE,SAAS,MAAM,GAAG;AAChC,UAAI,QAAQ,MAAM;AAChB;AAAC,QAAC,QAAQ,KAAa,KAAK,MAAM;AACjC,QAAC,QAAQ,KAAa,OAAO,MAAM;AAAA,MACtC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":["jsx","jsx","ROOT_DOMAIN","IS_DEV","cookieDomain"]}
|
package/dist/styles/globals.css
CHANGED
|
@@ -359,59 +359,11 @@
|
|
|
359
359
|
--wd-scheme-input-border: #D1D5DB;
|
|
360
360
|
}
|
|
361
361
|
|
|
362
|
-
/*
|
|
363
|
-
.
|
|
364
|
-
|
|
365
|
-
--wd-scheme-bg-rgb: 10 10 10;
|
|
366
|
-
--wd-scheme-surface: #141414;
|
|
367
|
-
--wd-scheme-text: #F9FAFB;
|
|
368
|
-
--wd-scheme-text-rgb: 249 250 251;
|
|
369
|
-
--wd-scheme-muted: #9CA3AF;
|
|
370
|
-
--wd-scheme-heading: #FFFFFF;
|
|
371
|
-
--wd-scheme-border: #262626;
|
|
372
|
-
--wd-scheme-shadow: rgba(0,0,0,0.5);
|
|
362
|
+
/* Color schemes 2-4 are generated dynamically by consumer apps
|
|
363
|
+
Based on ColorSchema model data. Not defined here.
|
|
364
|
+
See: /docs/dynamic-color-schemes.md */
|
|
373
365
|
|
|
374
|
-
|
|
375
|
-
--wd-scheme-btn-secondary-bg-hover: rgba(255,255,255,0.08);
|
|
376
|
-
--wd-scheme-btn-secondary-text: #F9FAFB;
|
|
377
|
-
--wd-scheme-btn-secondary-border: rgba(255,255,255,0.3);
|
|
378
|
-
|
|
379
|
-
--wd-scheme-input-bg: #1A1A1A;
|
|
380
|
-
--wd-scheme-input-text: #F9FAFB;
|
|
381
|
-
--wd-scheme-input-border: #333333;
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
/* Scheme 3 — Brand/Accent Fill */
|
|
385
|
-
.color-scheme-3 {
|
|
386
|
-
--wd-scheme-bg: var(--wd-scheme-brand);
|
|
387
|
-
--wd-scheme-surface: var(--wd-scheme-brand-hover);
|
|
388
|
-
--wd-scheme-text: rgba(255,255,255,0.95);
|
|
389
|
-
--wd-scheme-muted: rgba(255,255,255,0.70);
|
|
390
|
-
--wd-scheme-heading: #FFFFFF;
|
|
391
|
-
--wd-scheme-border: rgba(255,255,255,0.20);
|
|
392
|
-
|
|
393
|
-
--wd-scheme-btn-primary-bg: #FFFFFF;
|
|
394
|
-
--wd-scheme-btn-primary-bg-hover: #F0F0F0;
|
|
395
|
-
--wd-scheme-btn-primary-text: var(--wd-scheme-brand);
|
|
396
|
-
--wd-scheme-btn-primary-border: #FFFFFF;
|
|
397
|
-
|
|
398
|
-
--wd-scheme-btn-secondary-bg: transparent;
|
|
399
|
-
--wd-scheme-btn-secondary-bg-hover: rgba(255,255,255,0.15);
|
|
400
|
-
--wd-scheme-btn-secondary-text: #FFFFFF;
|
|
401
|
-
--wd-scheme-btn-secondary-border: rgba(255,255,255,0.5);
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
/* Scheme 4 — Soft/Tinted */
|
|
405
|
-
.color-scheme-4 {
|
|
406
|
-
--wd-scheme-bg: #F5F3FF;
|
|
407
|
-
--wd-scheme-surface: #EDE9FE;
|
|
408
|
-
--wd-scheme-text: #1E1B4B;
|
|
409
|
-
--wd-scheme-muted: #6D28D9;
|
|
410
|
-
--wd-scheme-heading: #0F0D2E;
|
|
411
|
-
--wd-scheme-border: #DDD6FE;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
/* Scheme 5–16: Reserved for user-defined schemes */
|
|
366
|
+
/* Schemes 1–16: Defined dynamically via API */
|
|
415
367
|
/* Generated dynamically via API: GET /api/theme/{storeId}/styles.css */
|
|
416
368
|
|
|
417
369
|
/* ─── react-colorful overrides for dark theme ───────────────── */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
{
|
|
2
2
|
"name": "@webdevarif/dashui",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.9",
|
|
4
4
|
"description": "Universal dashboard UI component library — forms, inputs, media, tables, layouts. Modular categories: primitives, forms, dashboard, media, data, editors, ecommerce, cms.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dashboard",
|
|
@@ -28,9 +28,20 @@
|
|
|
28
28
|
},
|
|
29
29
|
"./styles": "./dist/styles/globals.css",
|
|
30
30
|
"./setup": {
|
|
31
|
+
"types": "./dist/setup.d.ts",
|
|
31
32
|
"import": "./dist/setup.mjs",
|
|
32
33
|
"require": "./dist/setup.js"
|
|
33
34
|
},
|
|
35
|
+
"./hooks": {
|
|
36
|
+
"types": "./dist/hooks.d.ts",
|
|
37
|
+
"import": "./dist/hooks.mjs",
|
|
38
|
+
"require": "./dist/hooks.js"
|
|
39
|
+
},
|
|
40
|
+
"./i18n": {
|
|
41
|
+
"types": "./dist/i18n.d.ts",
|
|
42
|
+
"import": "./dist/i18n.mjs",
|
|
43
|
+
"require": "./dist/i18n.js"
|
|
44
|
+
},
|
|
34
45
|
"./tokens/primitives": "./dist/tokens/primitives.css",
|
|
35
46
|
"./tokens/light": "./dist/tokens/semantic-light.css",
|
|
36
47
|
"./tokens/dark": "./dist/tokens/semantic-dark.css",
|
|
@@ -91,4 +102,4 @@
|
|
|
91
102
|
"access": "public"
|
|
92
103
|
}
|
|
93
104
|
}
|
|
94
|
-
|
|
105
|
+
|