@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/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
- prisma: () => prisma,
38
- useAuth: () => useAuth,
39
- useFetch: () => useFetch,
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 import_jsx_runtime3 = require("react/jsx-runtime");
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, import_jsx_runtime3.jsx)(import_swr.SWRConfig, { value: { fetcher: (url) => fetch(url).then((r) => r.json()), ...DEFAULT_SWR_CONFIG }, children });
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 import_jsx_runtime4 = require("react/jsx-runtime");
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, import_jsx_runtime4.jsx)(AuthProvider, { session, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(I18nProvider, { locale, messages, timeZone, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SWRProvider, { children }) }) });
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/hooks/use-i18n.ts
95
- var import_next_intl2 = require("next-intl");
96
- function useI18n() {
97
- return (0, import_next_intl2.useIntl)();
98
- }
99
-
100
- // src/setup/hooks/use-fetch.ts
101
- var import_swr2 = __toESM(require("swr"));
102
- function useFetch(url, options) {
103
- const { data, error, isLoading } = (0, import_swr2.default)(url, options);
104
- return {
105
- data,
106
- isLoading,
107
- error,
108
- isError: !!error
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/lib/prisma.ts
113
- var import_client = require("@prisma/client");
114
- var globalForPrisma = global;
115
- var prisma = globalForPrisma.prisma || new import_client.PrismaClient({
116
- log: process.env.NODE_ENV === "development" ? ["query"] : []
117
- });
118
- if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
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
- prisma,
126
- useAuth,
127
- useFetch,
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/i18n-provider.tsx","../src/setup/providers/swr-provider.tsx","../src/setup/providers/root-provider.tsx","../src/setup/hooks/use-auth.ts","../src/setup/hooks/use-i18n.ts","../src/setup/hooks/use-fetch.ts","../src/setup/lib/prisma.ts"],"sourcesContent":["// Setup Providers\nexport * from './providers'\n\n// Setup Hooks\nexport * from './hooks'\n\n// Setup Utilities\nexport * from './lib'\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 { IntlProvider } from 'next-intl'\n\ninterface I18nProviderProps {\n children: ReactNode\n locale: string\n messages: Record<string, any>\n timeZone?: string\n}\n\n/**\n * I18nProvider - Wraps your app with next-intl IntlProvider\n * \n * Usage:\n * ```tsx\n * import { I18nProvider } from '@webdevarif/dashui-setup/providers'\n * \n * <I18nProvider locale={locale} messages={messages} timeZone=\"Asia/Dhaka\">\n * <App />\n * </I18nProvider>\n * ```\n */\nexport function I18nProvider({ \n children, \n locale, \n messages, \n timeZone = 'UTC' \n}: I18nProviderProps) {\n return (\n <IntlProvider locale={locale} messages={messages} timeZone={timeZone}>\n {children}\n </IntlProvider>\n )\n}\n","'use client'\n\nimport { ReactNode } from 'react'\nimport { SWRConfig } from 'swr'\n\ninterface SWRProviderProps {\n children: ReactNode\n}\n\nconst DEFAULT_SWR_CONFIG = {\n revalidateOnFocus: false,\n revalidateOnReconnect: true,\n dedupingInterval: 60000,\n focusThrottleInterval: 300000,\n}\n\n/**\n * SWRProvider - Wraps your app with optimized SWR config\n * \n * Default config:\n * - revalidateOnFocus: false (no refresh on window focus)\n * - revalidateOnReconnect: true (refresh when network reconnects)\n * - dedupingInterval: 60s (deduplicate requests within 60s)\n * - focusThrottleInterval: 5min (throttle focus revalidation)\n * \n * Usage:\n * ```tsx\n * import { SWRProvider } from '@webdevarif/dashui-setup/providers'\n * \n * <SWRProvider>\n * <App />\n * </SWRProvider>\n * ```\n */\nexport function SWRProvider({ children }: SWRProviderProps) {\n return (\n <SWRConfig value={{ fetcher: (url) => fetch(url).then(r => r.json()), ...DEFAULT_SWR_CONFIG }}>\n {children}\n </SWRConfig>\n )\n}\n","'use client'\n\nimport { ReactNode } from 'react'\nimport { AuthProvider } from './auth-provider'\nimport { I18nProvider } from './i18n-provider'\nimport { SWRProvider } from './swr-provider'\n\ninterface RootProviderProps {\n children: ReactNode\n session?: any\n locale: string\n messages: Record<string, any>\n timeZone?: string\n}\n\n/**\n * RootProvider - Single provider that combines Auth + I18n + SWR\n * \n * Usage in layout.tsx:\n * ```tsx\n * import { RootProvider } from '@webdevarif/dashui-setup'\n * \n * export default 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 import(`../../messages/${locale}.json`)\n * \n * return (\n * <html lang={locale}>\n * <body>\n * <RootProvider \n * session={session}\n * locale={locale}\n * messages={messages.default}\n * >\n * {children}\n * </RootProvider>\n * </body>\n * </html>\n * )\n * }\n * ```\n */\nexport function RootProvider({\n children,\n session,\n locale,\n messages,\n timeZone,\n}: RootProviderProps) {\n return (\n <AuthProvider session={session}>\n <I18nProvider locale={locale} messages={messages} timeZone={timeZone}>\n <SWRProvider>\n {children}\n </SWRProvider>\n </I18nProvider>\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","import { useIntl } from 'next-intl'\n\n/**\n * useI18n - Hook to access translations\n * \n * Returns the next-intl useIntl hook result\n * \n * Usage:\n * ```tsx\n * import { useI18n } from '@webdevarif/dashui-setup/hooks'\n * \n * function Header() {\n * const t = useI18n()\n * \n * return <h1>{t('home.title')}</h1>\n * }\n * ```\n */\nexport function useI18n() {\n return useIntl()\n}\n","import useSWR from 'swr'\n\n/**\n * useFetch - Simplified hook for data fetching with SWR\n * \n * Returns SWR hook result with built-in error handling\n * \n * Usage:\n * ```tsx\n * import { useFetch } from '@webdevarif/dashui-setup/hooks'\n * \n * function UserList() {\n * const { data, isLoading, error } = useFetch('/api/users')\n * \n * if (isLoading) return <div>Loading...</div>\n * if (error) return <div>Error: {error.message}</div>\n * \n * return (\n * <ul>\n * {data?.map(user => <li key={user.id}>{user.name}</li>)}\n * </ul>\n * )\n * }\n * ```\n */\nexport function useFetch<T = any>(\n url: string | null | undefined,\n options?: any\n) {\n const { data, error, isLoading } = useSWR<T>(url, options)\n\n return {\n data,\n isLoading,\n error,\n isError: !!error,\n }\n}\n","import { PrismaClient } from '@prisma/client'\n\n/**\n * Prisma Singleton - Reuse PrismaClient across requests\n * \n * In development: Hot reload can create multiple PrismaClient instances\n * This singleton pattern prevents connection pool exhaustion\n * \n * Usage in lib/prisma.ts:\n * ```tsx\n * export { prisma } from '@webdevarif/dashui-setup/lib'\n * ```\n * \n * Then use in API routes:\n * ```tsx\n * import { prisma } from '@/lib/prisma'\n * \n * export async function GET() {\n * const users = await prisma.user.findMany()\n * return Response.json(users)\n * }\n * ```\n */\n\nconst globalForPrisma = global as unknown as { prisma: PrismaClient }\n\nexport const prisma =\n globalForPrisma.prisma ||\n new PrismaClient({\n log: process.env.NODE_ENV === 'development' ? ['query'] : [],\n })\n\nif (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,mBAAgC;AAqB5B;AAFG,SAAS,aAAa,EAAE,UAAU,QAAQ,GAAsB;AACrE,SACE,4CAAC,gCAAgB,SACd,UACH;AAEJ;;;ACzBA,uBAA6B;AA4BzB,IAAAA,sBAAA;AAPG,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAAsB;AACpB,SACE,6CAAC,iCAAa,QAAgB,UAAoB,UAC/C,UACH;AAEJ;;;AChCA,iBAA0B;AAiCtB,IAAAC,sBAAA;AA3BJ,IAAM,qBAAqB;AAAA,EACzB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,uBAAuB;AACzB;AAoBO,SAAS,YAAY,EAAE,SAAS,GAAqB;AAC1D,SACE,6CAAC,wBAAU,OAAO,EAAE,SAAS,CAAC,QAAQ,MAAM,GAAG,EAAE,KAAK,OAAK,EAAE,KAAK,CAAC,GAAG,GAAG,mBAAmB,GACzF,UACH;AAEJ;;;ACkBQ,IAAAC,sBAAA;AAVD,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,SACE,6CAAC,gBAAa,SACZ,uDAAC,gBAAa,QAAgB,UAAoB,UAChD,uDAAC,eACE,UACH,GACF,GACF;AAEJ;;;AChEA,IAAAC,gBAA2B;AAqBpB,SAAS,UAAU;AACxB,aAAO,0BAAW;AACpB;;;ACvBA,IAAAC,oBAAwB;AAkBjB,SAAS,UAAU;AACxB,aAAO,2BAAQ;AACjB;;;ACpBA,IAAAC,cAAmB;AAyBZ,SAAS,SACd,KACA,SACA;AACA,QAAM,EAAE,MAAM,OAAO,UAAU,QAAI,YAAAC,SAAU,KAAK,OAAO;AAEzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,CAAC,CAAC;AAAA,EACb;AACF;;;ACrCA,oBAA6B;AAwB7B,IAAM,kBAAkB;AAEjB,IAAM,SACX,gBAAgB,UAChB,IAAI,2BAAa;AAAA,EACf,KAAK,QAAQ,IAAI,aAAa,gBAAgB,CAAC,OAAO,IAAI,CAAC;AAC7D,CAAC;AAEH,IAAI,QAAQ,IAAI,aAAa,aAAc,iBAAgB,SAAS;","names":["import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_next_intl","import_swr","useSWR"]}
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 jsx3 } from "react/jsx-runtime";
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__ */ jsx3(SWRConfig, { value: { fetcher: (url) => fetch(url).then((r) => r.json()), ...DEFAULT_SWR_CONFIG }, children });
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 jsx4 } from "react/jsx-runtime";
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__ */ jsx4(AuthProvider, { session, children: /* @__PURE__ */ jsx4(I18nProvider, { locale, messages, timeZone, children: /* @__PURE__ */ jsx4(SWRProvider, { children }) }) });
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/hooks/use-i18n.ts
52
- import { useIntl } from "next-intl";
53
- function useI18n() {
54
- return useIntl();
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/hooks/use-fetch.ts
58
- import useSWR from "swr";
59
- function useFetch(url, options) {
60
- const { data, error, isLoading } = useSWR(url, options);
61
- return {
62
- data,
63
- isLoading,
64
- error,
65
- isError: !!error
66
- };
67
- }
68
-
69
- // src/setup/lib/prisma.ts
70
- import { PrismaClient } from "@prisma/client";
71
- var globalForPrisma = global;
72
- var prisma = globalForPrisma.prisma || new PrismaClient({
73
- log: process.env.NODE_ENV === "development" ? ["query"] : []
74
- });
75
- if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
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
- prisma,
82
- useAuth,
83
- useFetch,
84
- useI18n
115
+ authConfig,
116
+ createAuth,
117
+ useAuth
85
118
  };
86
119
  //# sourceMappingURL=setup.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/setup/providers/auth-provider.tsx","../src/setup/providers/i18n-provider.tsx","../src/setup/providers/swr-provider.tsx","../src/setup/providers/root-provider.tsx","../src/setup/hooks/use-auth.ts","../src/setup/hooks/use-i18n.ts","../src/setup/hooks/use-fetch.ts","../src/setup/lib/prisma.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 { IntlProvider } from 'next-intl'\n\ninterface I18nProviderProps {\n children: ReactNode\n locale: string\n messages: Record<string, any>\n timeZone?: string\n}\n\n/**\n * I18nProvider - Wraps your app with next-intl IntlProvider\n * \n * Usage:\n * ```tsx\n * import { I18nProvider } from '@webdevarif/dashui-setup/providers'\n * \n * <I18nProvider locale={locale} messages={messages} timeZone=\"Asia/Dhaka\">\n * <App />\n * </I18nProvider>\n * ```\n */\nexport function I18nProvider({ \n children, \n locale, \n messages, \n timeZone = 'UTC' \n}: I18nProviderProps) {\n return (\n <IntlProvider locale={locale} messages={messages} timeZone={timeZone}>\n {children}\n </IntlProvider>\n )\n}\n","'use client'\n\nimport { ReactNode } from 'react'\nimport { SWRConfig } from 'swr'\n\ninterface SWRProviderProps {\n children: ReactNode\n}\n\nconst DEFAULT_SWR_CONFIG = {\n revalidateOnFocus: false,\n revalidateOnReconnect: true,\n dedupingInterval: 60000,\n focusThrottleInterval: 300000,\n}\n\n/**\n * SWRProvider - Wraps your app with optimized SWR config\n * \n * Default config:\n * - revalidateOnFocus: false (no refresh on window focus)\n * - revalidateOnReconnect: true (refresh when network reconnects)\n * - dedupingInterval: 60s (deduplicate requests within 60s)\n * - focusThrottleInterval: 5min (throttle focus revalidation)\n * \n * Usage:\n * ```tsx\n * import { SWRProvider } from '@webdevarif/dashui-setup/providers'\n * \n * <SWRProvider>\n * <App />\n * </SWRProvider>\n * ```\n */\nexport function SWRProvider({ children }: SWRProviderProps) {\n return (\n <SWRConfig value={{ fetcher: (url) => fetch(url).then(r => r.json()), ...DEFAULT_SWR_CONFIG }}>\n {children}\n </SWRConfig>\n )\n}\n","'use client'\n\nimport { ReactNode } from 'react'\nimport { AuthProvider } from './auth-provider'\nimport { I18nProvider } from './i18n-provider'\nimport { SWRProvider } from './swr-provider'\n\ninterface RootProviderProps {\n children: ReactNode\n session?: any\n locale: string\n messages: Record<string, any>\n timeZone?: string\n}\n\n/**\n * RootProvider - Single provider that combines Auth + I18n + SWR\n * \n * Usage in layout.tsx:\n * ```tsx\n * import { RootProvider } from '@webdevarif/dashui-setup'\n * \n * export default 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 import(`../../messages/${locale}.json`)\n * \n * return (\n * <html lang={locale}>\n * <body>\n * <RootProvider \n * session={session}\n * locale={locale}\n * messages={messages.default}\n * >\n * {children}\n * </RootProvider>\n * </body>\n * </html>\n * )\n * }\n * ```\n */\nexport function RootProvider({\n children,\n session,\n locale,\n messages,\n timeZone,\n}: RootProviderProps) {\n return (\n <AuthProvider session={session}>\n <I18nProvider locale={locale} messages={messages} timeZone={timeZone}>\n <SWRProvider>\n {children}\n </SWRProvider>\n </I18nProvider>\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","import { useIntl } from 'next-intl'\n\n/**\n * useI18n - Hook to access translations\n * \n * Returns the next-intl useIntl hook result\n * \n * Usage:\n * ```tsx\n * import { useI18n } from '@webdevarif/dashui-setup/hooks'\n * \n * function Header() {\n * const t = useI18n()\n * \n * return <h1>{t('home.title')}</h1>\n * }\n * ```\n */\nexport function useI18n() {\n return useIntl()\n}\n","import useSWR from 'swr'\n\n/**\n * useFetch - Simplified hook for data fetching with SWR\n * \n * Returns SWR hook result with built-in error handling\n * \n * Usage:\n * ```tsx\n * import { useFetch } from '@webdevarif/dashui-setup/hooks'\n * \n * function UserList() {\n * const { data, isLoading, error } = useFetch('/api/users')\n * \n * if (isLoading) return <div>Loading...</div>\n * if (error) return <div>Error: {error.message}</div>\n * \n * return (\n * <ul>\n * {data?.map(user => <li key={user.id}>{user.name}</li>)}\n * </ul>\n * )\n * }\n * ```\n */\nexport function useFetch<T = any>(\n url: string | null | undefined,\n options?: any\n) {\n const { data, error, isLoading } = useSWR<T>(url, options)\n\n return {\n data,\n isLoading,\n error,\n isError: !!error,\n }\n}\n","import { PrismaClient } from '@prisma/client'\n\n/**\n * Prisma Singleton - Reuse PrismaClient across requests\n * \n * In development: Hot reload can create multiple PrismaClient instances\n * This singleton pattern prevents connection pool exhaustion\n * \n * Usage in lib/prisma.ts:\n * ```tsx\n * export { prisma } from '@webdevarif/dashui-setup/lib'\n * ```\n * \n * Then use in API routes:\n * ```tsx\n * import { prisma } from '@/lib/prisma'\n * \n * export async function GET() {\n * const users = await prisma.user.findMany()\n * return Response.json(users)\n * }\n * ```\n */\n\nconst globalForPrisma = global as unknown as { prisma: PrismaClient }\n\nexport const prisma =\n globalForPrisma.prisma ||\n new PrismaClient({\n log: process.env.NODE_ENV === 'development' ? ['query'] : [],\n })\n\nif (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma\n"],"mappings":";AAGA,SAAS,uBAAuB;AAqB5B;AAFG,SAAS,aAAa,EAAE,UAAU,QAAQ,GAAsB;AACrE,SACE,oBAAC,mBAAgB,SACd,UACH;AAEJ;;;ACzBA,SAAS,oBAAoB;AA4BzB,gBAAAA,YAAA;AAPG,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAAsB;AACpB,SACE,gBAAAA,KAAC,gBAAa,QAAgB,UAAoB,UAC/C,UACH;AAEJ;;;AChCA,SAAS,iBAAiB;AAiCtB,gBAAAC,YAAA;AA3BJ,IAAM,qBAAqB;AAAA,EACzB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,uBAAuB;AACzB;AAoBO,SAAS,YAAY,EAAE,SAAS,GAAqB;AAC1D,SACE,gBAAAA,KAAC,aAAU,OAAO,EAAE,SAAS,CAAC,QAAQ,MAAM,GAAG,EAAE,KAAK,OAAK,EAAE,KAAK,CAAC,GAAG,GAAG,mBAAmB,GACzF,UACH;AAEJ;;;ACkBQ,gBAAAC,YAAA;AAVD,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,SACE,gBAAAA,KAAC,gBAAa,SACZ,0BAAAA,KAAC,gBAAa,QAAgB,UAAoB,UAChD,0BAAAA,KAAC,eACE,UACH,GACF,GACF;AAEJ;;;AChEA,SAAS,kBAAkB;AAqBpB,SAAS,UAAU;AACxB,SAAO,WAAW;AACpB;;;ACvBA,SAAS,eAAe;AAkBjB,SAAS,UAAU;AACxB,SAAO,QAAQ;AACjB;;;ACpBA,OAAO,YAAY;AAyBZ,SAAS,SACd,KACA,SACA;AACA,QAAM,EAAE,MAAM,OAAO,UAAU,IAAI,OAAU,KAAK,OAAO;AAEzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,CAAC,CAAC;AAAA,EACb;AACF;;;ACrCA,SAAS,oBAAoB;AAwB7B,IAAM,kBAAkB;AAEjB,IAAM,SACX,gBAAgB,UAChB,IAAI,aAAa;AAAA,EACf,KAAK,QAAQ,IAAI,aAAa,gBAAgB,CAAC,OAAO,IAAI,CAAC;AAC7D,CAAC;AAEH,IAAI,QAAQ,IAAI,aAAa,aAAc,iBAAgB,SAAS;","names":["jsx","jsx","jsx"]}
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"]}
@@ -359,59 +359,11 @@
359
359
  --wd-scheme-input-border: #D1D5DB;
360
360
  }
361
361
 
362
- /* Scheme 2 Dark */
363
- .color-scheme-2 {
364
- --wd-scheme-bg: #0A0A0A;
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
- --wd-scheme-btn-secondary-bg: transparent;
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.7",
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
+