@pelatform/starter 0.2.0 → 0.2.2

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/server.d.ts CHANGED
@@ -1,8 +1,40 @@
1
+ import { SessionData } from '@pelatform/starter.utils';
2
+ import { Config } from '@pelatform/starter.config';
3
+
4
+ type GuardHandler = (args: {
5
+ req: Request;
6
+ params: Record<string, string>;
7
+ searchParams: Record<string, string>;
8
+ session: SessionData;
9
+ isAdmin?: boolean;
10
+ workspaceId?: string;
11
+ }) => Promise<Response>;
12
+ type GuardResult = true | Response | {
13
+ ok: true;
14
+ meta?: {
15
+ isAdmin?: boolean;
16
+ workspaceId?: string;
17
+ };
18
+ };
19
+ type GuardFn = (session: SessionData, req: Request, ctx: {
20
+ params: Promise<Record<string, string>>;
21
+ }) => Promise<GuardResult> | GuardResult;
22
+ declare const createGuard: (auth: any) => (fn: GuardFn) => (handler: GuardHandler) => (req: Request, ctx: {
23
+ params: Promise<Record<string, string>>;
24
+ }) => Promise<Response>;
25
+
1
26
  declare const getSession: (auth: any) => Promise<any>;
2
27
  declare const getActiveWorkspace: (auth: any, slug: string) => Promise<any>;
3
28
  declare const getListWorkspaces: (auth: any) => Promise<any>;
4
29
  declare const setActiveWorkspace: (auth: any, slug: string) => Promise<void>;
5
30
 
31
+ /**
32
+ * Get locale from Next.js cookies.
33
+ * This function can only be used in server components, server actions, or API routes.
34
+ * @returns The locale from cookie or default locale.
35
+ */
36
+ declare const getLocaleFromRequest: (config: Config) => Promise<string>;
37
+
6
38
  /**
7
39
  * Sets the last visited workspace cookie on the server.
8
40
  *
@@ -19,4 +51,4 @@ declare const setServerLastVisitedWorkspace: (workspace: string, maxAge?: number
19
51
  */
20
52
  declare const getServerLastVisitedWorkspace: () => Promise<string | undefined>;
21
53
 
22
- export { getActiveWorkspace, getListWorkspaces, getServerLastVisitedWorkspace, getSession, setActiveWorkspace, setServerLastVisitedWorkspace };
54
+ export { createGuard, getActiveWorkspace, getListWorkspaces, getLocaleFromRequest, getServerLastVisitedWorkspace, getSession, setActiveWorkspace, setServerLastVisitedWorkspace };
package/dist/server.js CHANGED
@@ -49,8 +49,57 @@ var setActiveWorkspace = cache(async (auth, slug) => {
49
49
  }
50
50
  });
51
51
 
52
- // src/server/workspace.ts
52
+ // src/lib/guards.ts
53
+ var getSearchParams = (url) => {
54
+ const params = {};
55
+ new URL(url).searchParams.forEach((val, key) => {
56
+ params[key] = val;
57
+ });
58
+ return params;
59
+ };
60
+ var createGuard = (
61
+ // biome-ignore lint/suspicious/noExplicitAny: <>
62
+ (auth) => (fn) => (handler) => async (req, ctx) => {
63
+ const session = await getSession(auth);
64
+ if (!session || !session.user) {
65
+ return Response.json(
66
+ { error: "Unauthorized", message: "Login required." },
67
+ { status: 401 }
68
+ );
69
+ }
70
+ const result = await fn(session, req, ctx);
71
+ if (result instanceof Response) return result;
72
+ if (result !== true && !(typeof result === "object" && result.ok === true)) {
73
+ return Response.json({ error: "Forbidden" }, { status: 403 });
74
+ }
75
+ const meta = typeof result === "object" && result.meta || {};
76
+ const params = await ctx.params || {};
77
+ const searchParams = getSearchParams(req.url);
78
+ return handler({
79
+ req,
80
+ params,
81
+ searchParams,
82
+ session,
83
+ isAdmin: meta.isAdmin,
84
+ workspaceId: meta.workspaceId
85
+ });
86
+ }
87
+ );
88
+
89
+ // src/server/locale.ts
53
90
  import { cookies } from "next/headers";
91
+ var getLocaleFromRequest = async (config) => {
92
+ try {
93
+ const cookieStore = await cookies();
94
+ const locale = cookieStore.get(config.i18n.localeCookieName)?.value;
95
+ return locale ?? config.i18n.defaultLocale;
96
+ } catch (_error) {
97
+ return config.i18n.defaultLocale;
98
+ }
99
+ };
100
+
101
+ // src/server/workspace.ts
102
+ import { cookies as cookies2 } from "next/headers";
54
103
  import { lastVisitedWorkspace } from "@pelatform/starter.utils";
55
104
  var setServerLastVisitedWorkspace = async (workspace, maxAge = 30 * 86400) => {
56
105
  if (!workspace || typeof workspace !== "string" || workspace.trim().length === 0) {
@@ -59,7 +108,7 @@ var setServerLastVisitedWorkspace = async (workspace, maxAge = 30 * 86400) => {
59
108
  if (workspace.length > 255) {
60
109
  throw new Error("Invalid workspace: exceeds maximum length");
61
110
  }
62
- const cookieStore = await cookies();
111
+ const cookieStore = await cookies2();
63
112
  cookieStore.set({
64
113
  name: lastVisitedWorkspace,
65
114
  value: workspace,
@@ -71,12 +120,14 @@ var setServerLastVisitedWorkspace = async (workspace, maxAge = 30 * 86400) => {
71
120
  });
72
121
  };
73
122
  var getServerLastVisitedWorkspace = async () => {
74
- const cookieStore = await cookies();
123
+ const cookieStore = await cookies2();
75
124
  return cookieStore.get(lastVisitedWorkspace)?.value;
76
125
  };
77
126
  export {
127
+ createGuard,
78
128
  getActiveWorkspace,
79
129
  getListWorkspaces,
130
+ getLocaleFromRequest,
80
131
  getServerLastVisitedWorkspace,
81
132
  getSession,
82
133
  setActiveWorkspace,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pelatform/starter",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "A collection of SaaS starter kit components and utilities for Pelatform applications.",
5
5
  "author": "Pelatform",
6
6
  "license": "MIT",
@@ -40,21 +40,20 @@
40
40
  "utilities"
41
41
  ],
42
42
  "devDependencies": {
43
- "@better-fetch/fetch": "^1.1.19",
43
+ "@better-fetch/fetch": "^1.1.21",
44
44
  "@hookform/resolvers": "^5.2.2",
45
- "@pelatform/starter.account": "0.2.0",
46
- "@pelatform/starter.apikey": "0.2.0",
47
- "@pelatform/starter.auth": "0.2.0",
48
- "@pelatform/starter.config": "0.2.0",
49
- "@pelatform/starter.hook": "0.2.0",
50
- "@pelatform/starter.i18n": "0.2.0",
51
- "@pelatform/starter.shared": "0.2.0",
52
- "@pelatform/starter.utils": "0.2.0",
53
- "@pelatform/starter.workspace": "0.2.0",
45
+ "@pelatform/starter.account": "0.2.2",
46
+ "@pelatform/starter.apikey": "0.2.2",
47
+ "@pelatform/starter.auth": "0.2.2",
48
+ "@pelatform/starter.config": "0.2.1",
49
+ "@pelatform/starter.hook": "0.2.1",
50
+ "@pelatform/starter.shared": "0.2.2",
51
+ "@pelatform/starter.utils": "0.2.1",
52
+ "@pelatform/starter.workspace": "0.2.2",
54
53
  "@pelatform/tsconfig": "^0.1.3",
55
54
  "@types/react": "^19.2.7",
56
55
  "better-auth": "^1.4.6",
57
- "lucide-react": "^0.556.0",
56
+ "lucide-react": "^0.559.0",
58
57
  "next": "^16.0.8",
59
58
  "next-intl": "^4.5.8",
60
59
  "pelatform-ui": "^1.1.3",
@@ -66,15 +65,14 @@
66
65
  "peerDependencies": {
67
66
  "@better-fetch/fetch": ">=1.1.0",
68
67
  "@hookform/resolvers": ">=5.2.0",
69
- "@pelatform/starter.account": ">=0.1.0",
70
- "@pelatform/starter.apikey": ">=0.1.0",
71
- "@pelatform/starter.auth": ">=0.1.0",
72
- "@pelatform/starter.config": ">=0.1.0",
73
- "@pelatform/starter.hook": ">=0.1.0",
74
- "@pelatform/starter.i18n": ">=0.1.0",
75
- "@pelatform/starter.shared": ">=0.1.0",
76
- "@pelatform/starter.utils": ">=0.1.0",
77
- "@pelatform/starter.workspace": ">=0.1.0",
68
+ "@pelatform/starter.account": ">=0.2.0",
69
+ "@pelatform/starter.apikey": ">=0.2.0",
70
+ "@pelatform/starter.auth": ">=0.2.0",
71
+ "@pelatform/starter.config": ">=0.2.0",
72
+ "@pelatform/starter.hook": ">=0.2.0",
73
+ "@pelatform/starter.shared": ">=0.2.0",
74
+ "@pelatform/starter.utils": ">=0.2.0",
75
+ "@pelatform/starter.workspace": ">=0.2.0",
78
76
  "@tanstack/query-core": ">=5.90.0",
79
77
  "@tanstack/react-query": ">=5.90.0",
80
78
  "better-auth": ">=1.4.5",