@webdevarif/dashui 1.2.6 → 1.2.8

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/setup.js ADDED
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/setup/index.ts
31
+ var setup_exports = {};
32
+ __export(setup_exports, {
33
+ AuthProvider: () => AuthProvider,
34
+ RootProvider: () => RootProvider,
35
+ SWRProvider: () => SWRProvider,
36
+ authConfig: () => authConfig,
37
+ createAuth: () => createAuth,
38
+ useAuth: () => useAuth
39
+ });
40
+ module.exports = __toCommonJS(setup_exports);
41
+
42
+ // src/setup/providers/auth-provider.tsx
43
+ var import_react = require("next-auth/react");
44
+ var import_jsx_runtime = require("react/jsx-runtime");
45
+ function AuthProvider({ children, session }) {
46
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.SessionProvider, { session, children });
47
+ }
48
+
49
+ // src/setup/providers/swr-provider.tsx
50
+ var import_swr = require("swr");
51
+ var import_jsx_runtime2 = require("react/jsx-runtime");
52
+ var fetchFetcher = (url) => fetch(url).then((r) => r.json());
53
+ var DEFAULT_SWR_CONFIG = {
54
+ revalidateOnFocus: false,
55
+ revalidateOnReconnect: true,
56
+ dedupingInterval: 6e4,
57
+ focusThrottleInterval: 3e5
58
+ };
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 });
65
+ }
66
+
67
+ // src/setup/providers/root-provider.tsx
68
+ var import_jsx_runtime3 = require("react/jsx-runtime");
69
+ function RootProvider({
70
+ children,
71
+ session
72
+ }) {
73
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(AuthProvider, { session, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SWRProvider, { children }) });
74
+ }
75
+
76
+ // src/setup/hooks/use-auth.ts
77
+ var import_react2 = require("next-auth/react");
78
+ function useAuth() {
79
+ return (0, import_react2.useSession)();
80
+ }
81
+
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
+ });
109
+ }
110
+
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
+ };
152
+ // Annotate the CommonJS export names for ESM import in node:
153
+ 0 && (module.exports = {
154
+ AuthProvider,
155
+ RootProvider,
156
+ SWRProvider,
157
+ authConfig,
158
+ createAuth,
159
+ useAuth
160
+ });
161
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
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 ADDED
@@ -0,0 +1,119 @@
1
+ // src/setup/providers/auth-provider.tsx
2
+ import { SessionProvider } from "next-auth/react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ function AuthProvider({ children, session }) {
5
+ return /* @__PURE__ */ jsx(SessionProvider, { session, children });
6
+ }
7
+
8
+ // src/setup/providers/swr-provider.tsx
9
+ import { SWRConfig } from "swr";
10
+ import { jsx as jsx2 } from "react/jsx-runtime";
11
+ var fetchFetcher = (url) => fetch(url).then((r) => r.json());
12
+ var DEFAULT_SWR_CONFIG = {
13
+ revalidateOnFocus: false,
14
+ revalidateOnReconnect: true,
15
+ dedupingInterval: 6e4,
16
+ focusThrottleInterval: 3e5
17
+ };
18
+ function SWRProvider({ children, fetcher, config }) {
19
+ return /* @__PURE__ */ jsx2(SWRConfig, { value: {
20
+ fetcher: fetcher ?? fetchFetcher,
21
+ ...DEFAULT_SWR_CONFIG,
22
+ ...config
23
+ }, children });
24
+ }
25
+
26
+ // src/setup/providers/root-provider.tsx
27
+ import { jsx as jsx3 } from "react/jsx-runtime";
28
+ function RootProvider({
29
+ children,
30
+ session
31
+ }) {
32
+ return /* @__PURE__ */ jsx3(AuthProvider, { session, children: /* @__PURE__ */ jsx3(SWRProvider, { children }) });
33
+ }
34
+
35
+ // src/setup/hooks/use-auth.ts
36
+ import { useSession } from "next-auth/react";
37
+ function useAuth() {
38
+ return useSession();
39
+ }
40
+
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
+ });
68
+ }
69
+
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
+ };
111
+ export {
112
+ AuthProvider,
113
+ RootProvider,
114
+ SWRProvider,
115
+ authConfig,
116
+ createAuth,
117
+ useAuth
118
+ };
119
+ //# sourceMappingURL=setup.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,13 @@
1
+ @keyframes dashui-shimmer {
2
+ 0% { transform: translateX(-100%); }
3
+ 100% { transform: translateX(200%); }
4
+ }
5
+
6
+ @keyframes dashui-spin {
7
+ to { transform: rotate(360deg); }
8
+ }
9
+
10
+ @keyframes dashui-pulse {
11
+ 0%, 100% { opacity: 1; }
12
+ 50% { opacity: 0.5; }
13
+ }