@archlast/client 0.0.1

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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/admin/index.cjs +93 -0
  4. package/dist/admin/index.cjs.map +1 -0
  5. package/dist/admin/index.d.cts +51 -0
  6. package/dist/admin/index.d.ts +51 -0
  7. package/dist/admin/index.js +59 -0
  8. package/dist/admin/index.js.map +1 -0
  9. package/dist/auth/index.cjs +174 -0
  10. package/dist/auth/index.cjs.map +1 -0
  11. package/dist/auth/index.d.cts +128 -0
  12. package/dist/auth/index.d.ts +128 -0
  13. package/dist/auth/index.js +141 -0
  14. package/dist/auth/index.js.map +1 -0
  15. package/dist/client.cjs +677 -0
  16. package/dist/client.cjs.map +1 -0
  17. package/dist/client.d.cts +84 -0
  18. package/dist/client.d.ts +84 -0
  19. package/dist/client.js +642 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/function-reference.cjs +50 -0
  22. package/dist/function-reference.cjs.map +1 -0
  23. package/dist/function-reference.d.cts +22 -0
  24. package/dist/function-reference.d.ts +22 -0
  25. package/dist/function-reference.js +24 -0
  26. package/dist/function-reference.js.map +1 -0
  27. package/dist/index.cjs +1163 -0
  28. package/dist/index.cjs.map +1 -0
  29. package/dist/index.d.cts +12 -0
  30. package/dist/index.d.ts +12 -0
  31. package/dist/index.js +1111 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/react.cjs +455 -0
  34. package/dist/react.cjs.map +1 -0
  35. package/dist/react.d.cts +137 -0
  36. package/dist/react.d.ts +137 -0
  37. package/dist/react.js +410 -0
  38. package/dist/react.js.map +1 -0
  39. package/dist/storage/index.cjs +150 -0
  40. package/dist/storage/index.cjs.map +1 -0
  41. package/dist/storage/index.d.cts +59 -0
  42. package/dist/storage/index.d.ts +59 -0
  43. package/dist/storage/index.js +117 -0
  44. package/dist/storage/index.js.map +1 -0
  45. package/dist/trpc.cjs +66 -0
  46. package/dist/trpc.cjs.map +1 -0
  47. package/dist/trpc.d.cts +59 -0
  48. package/dist/trpc.d.ts +59 -0
  49. package/dist/trpc.js +41 -0
  50. package/dist/trpc.js.map +1 -0
  51. package/package.json +90 -0
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Client-side auth API wrapper for Archlast.
3
+ *
4
+ * This now uses Better-Auth endpoints via the proxy:
5
+ * - GET /api/auth/get-session
6
+ * - POST /api/auth/sign-up
7
+ * - POST /api/auth/sign-in
8
+ * - POST /api/auth/sign-out
9
+ *
10
+ * Migration from legacy /_auth/* endpoints:
11
+ * - /_auth/state → /api/auth/get-session
12
+ * - /_auth/sign-up → /api/auth/sign-up (email)
13
+ * - /_auth/sign-in → /api/auth/sign-in (email)
14
+ * - /_auth/sign-out → /api/auth/sign-out
15
+ *
16
+ * Notes:
17
+ * - Uses cookie-based sessions by default (credentials: "include").
18
+ * - For programmatic access, use Better-Auth API keys (arch_* prefix) via x-api-key header.
19
+ * - Better-Auth supports username, OAuth, magic link, and more.
20
+ */
21
+ type AuthUser = {
22
+ id: string;
23
+ email: string;
24
+ emailVerified: boolean;
25
+ name?: string;
26
+ image?: string;
27
+ createdAt?: Date;
28
+ updatedAt?: Date;
29
+ role?: string;
30
+ banned?: boolean;
31
+ };
32
+ type AuthSession = {
33
+ token: string;
34
+ expiresAt: Date;
35
+ userId: string;
36
+ ipAddress?: string;
37
+ userAgent?: string;
38
+ };
39
+ type AuthState = {
40
+ user: AuthUser | null;
41
+ session: AuthSession | null;
42
+ isAuthenticated: boolean;
43
+ };
44
+ type SignUpInput = {
45
+ email: string;
46
+ password: string;
47
+ name?: string;
48
+ username?: string;
49
+ };
50
+ type SignInInput = {
51
+ email?: string;
52
+ username?: string;
53
+ password: string;
54
+ };
55
+ type ArchlastAuthClientOptions = {
56
+ /**
57
+ * Base URL for the Archlast server.
58
+ * Example: "http://localhost:4000"
59
+ *
60
+ * If omitted, it will default to:
61
+ * - window.location.origin in the browser
62
+ * - "" in non-browser contexts
63
+ */
64
+ baseUrl?: string;
65
+ /**
66
+ * App ID for session isolation (e.g. "web", "admin").
67
+ * When set, adds x-archlast-app-id header.
68
+ */
69
+ appId?: string;
70
+ /**
71
+ * Better-Auth API key for authentication.
72
+ * When provided, uses x-api-key header instead of cookies.
73
+ */
74
+ apiKey?: string;
75
+ };
76
+ declare class ArchlastAuthClient {
77
+ private readonly baseUrl;
78
+ private readonly axios;
79
+ private readonly appId?;
80
+ private readonly apiKey?;
81
+ constructor(options?: ArchlastAuthClientOptions);
82
+ /**
83
+ * Get current authentication state
84
+ * Uses Better-Auth's getSession endpoint
85
+ */
86
+ getState(): Promise<AuthState>;
87
+ /**
88
+ * Sign up new user
89
+ * Uses Better-Auth's email signUp endpoint
90
+ */
91
+ signUp(input: SignUpInput): Promise<AuthState>;
92
+ /**
93
+ * Sign in with email/username and password
94
+ * Uses Better-Auth's credential sign-in endpoint
95
+ */
96
+ signIn(input: SignInInput): Promise<AuthState>;
97
+ /**
98
+ * Sign out and revoke session
99
+ * Uses Better-Auth's sign-out endpoint
100
+ */
101
+ signOut(): Promise<{
102
+ success: boolean;
103
+ }>;
104
+ /**
105
+ * Request password reset email
106
+ * Uses Better-Auth's password reset flow
107
+ */
108
+ requestPasswordReset(email: string, callbackURL?: string): Promise<{
109
+ success: boolean;
110
+ }>;
111
+ /**
112
+ * Reset password with token
113
+ * Uses Better-Auth's reset password endpoint
114
+ */
115
+ resetPassword(token: string, password: string): Promise<{
116
+ success: boolean;
117
+ }>;
118
+ /**
119
+ * Verify email with token
120
+ * Uses Better-Auth's email verification endpoint
121
+ */
122
+ verifyEmail(token: string): Promise<{
123
+ success: boolean;
124
+ user?: AuthUser;
125
+ }>;
126
+ }
127
+
128
+ export { ArchlastAuthClient, type ArchlastAuthClientOptions, type AuthSession, type AuthState, type AuthUser, type SignInInput, type SignUpInput, ArchlastAuthClient as default };
@@ -0,0 +1,141 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+
5
+ // src/auth/index.ts
6
+ import axios from "axios";
7
+ function resolveBaseUrl(explicit) {
8
+ if (explicit && explicit.trim()) return explicit.replace(/\/+$/, "");
9
+ if (typeof window !== "undefined" && window.location?.origin) return window.location.origin;
10
+ return "";
11
+ }
12
+ var ArchlastAuthClient = class {
13
+ constructor(options = {}) {
14
+ __publicField(this, "baseUrl");
15
+ __publicField(this, "axios");
16
+ __publicField(this, "appId");
17
+ __publicField(this, "apiKey");
18
+ this.baseUrl = resolveBaseUrl(options.baseUrl);
19
+ this.appId = options.appId;
20
+ this.apiKey = options.apiKey;
21
+ this.axios = axios.create({
22
+ baseURL: this.baseUrl,
23
+ withCredentials: !options.apiKey,
24
+ // Only use cookies if no API key
25
+ headers: {
26
+ "content-type": "application/json",
27
+ ...this.appId ? { "x-archlast-app-id": this.appId } : {},
28
+ ...options.apiKey ? { "x-api-key": options.apiKey } : {}
29
+ }
30
+ });
31
+ }
32
+ /**
33
+ * Get current authentication state
34
+ * Uses Better-Auth's getSession endpoint
35
+ */
36
+ async getState() {
37
+ try {
38
+ const response = await this.axios.get("/api/auth/get-session");
39
+ const { user, session } = response.data;
40
+ return {
41
+ user,
42
+ session,
43
+ isAuthenticated: !!user
44
+ };
45
+ } catch (error) {
46
+ return {
47
+ user: null,
48
+ session: null,
49
+ isAuthenticated: false
50
+ };
51
+ }
52
+ }
53
+ /**
54
+ * Sign up new user
55
+ * Uses Better-Auth's email signUp endpoint
56
+ */
57
+ async signUp(input) {
58
+ const response = await this.axios.post("/api/auth/sign-up/email", {
59
+ email: input.email,
60
+ password: input.password,
61
+ name: input.name,
62
+ username: input.username
63
+ });
64
+ return {
65
+ user: response.data.user,
66
+ session: null,
67
+ // Session is managed via cookies
68
+ isAuthenticated: !!response.data.user
69
+ };
70
+ }
71
+ /**
72
+ * Sign in with email/username and password
73
+ * Uses Better-Auth's credential sign-in endpoint
74
+ */
75
+ async signIn(input) {
76
+ if (!input.email && !input.username) {
77
+ throw new Error("Either email or username is required");
78
+ }
79
+ const response = await this.axios.post("/api/auth/sign-in/email", {
80
+ email: input.email,
81
+ username: input.username,
82
+ password: input.password
83
+ });
84
+ return {
85
+ user: response.data.user,
86
+ session: null,
87
+ // Session is managed via cookies
88
+ isAuthenticated: !!response.data.user
89
+ };
90
+ }
91
+ /**
92
+ * Sign out and revoke session
93
+ * Uses Better-Auth's sign-out endpoint
94
+ */
95
+ async signOut() {
96
+ const response = await this.axios.post(
97
+ "/api/auth/sign-out",
98
+ {},
99
+ { withCredentials: true }
100
+ );
101
+ return response.data;
102
+ }
103
+ /**
104
+ * Request password reset email
105
+ * Uses Better-Auth's password reset flow
106
+ */
107
+ async requestPasswordReset(email, callbackURL) {
108
+ const response = await this.axios.post("/api/auth/forgot-password", {
109
+ email,
110
+ redirectTo: callbackURL
111
+ });
112
+ return response.data;
113
+ }
114
+ /**
115
+ * Reset password with token
116
+ * Uses Better-Auth's reset password endpoint
117
+ */
118
+ async resetPassword(token, password) {
119
+ const response = await this.axios.post("/api/auth/reset-password", {
120
+ token,
121
+ password
122
+ });
123
+ return response.data;
124
+ }
125
+ /**
126
+ * Verify email with token
127
+ * Uses Better-Auth's email verification endpoint
128
+ */
129
+ async verifyEmail(token) {
130
+ const response = await this.axios.post("/api/auth/verify-email", {
131
+ token
132
+ });
133
+ return response.data;
134
+ }
135
+ };
136
+ var auth_default = ArchlastAuthClient;
137
+ export {
138
+ ArchlastAuthClient,
139
+ auth_default as default
140
+ };
141
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/auth/index.ts"],"sourcesContent":["/**\n * Client-side auth API wrapper for Archlast.\n *\n * This now uses Better-Auth endpoints via the proxy:\n * - GET /api/auth/get-session\n * - POST /api/auth/sign-up\n * - POST /api/auth/sign-in\n * - POST /api/auth/sign-out\n *\n * Migration from legacy /_auth/* endpoints:\n * - /_auth/state → /api/auth/get-session\n * - /_auth/sign-up → /api/auth/sign-up (email)\n * - /_auth/sign-in → /api/auth/sign-in (email)\n * - /_auth/sign-out → /api/auth/sign-out\n *\n * Notes:\n * - Uses cookie-based sessions by default (credentials: \"include\").\n * - For programmatic access, use Better-Auth API keys (arch_* prefix) via x-api-key header.\n * - Better-Auth supports username, OAuth, magic link, and more.\n */\n\nimport axios, { type AxiosInstance } from \"axios\";\n\nexport type AuthUser = {\n id: string;\n email: string;\n emailVerified: boolean;\n name?: string;\n image?: string;\n createdAt?: Date;\n updatedAt?: Date;\n role?: string;\n banned?: boolean;\n};\n\nexport type AuthSession = {\n token: string;\n expiresAt: Date;\n userId: string;\n ipAddress?: string;\n userAgent?: string;\n};\n\nexport type AuthState = {\n user: AuthUser | null;\n session: AuthSession | null;\n isAuthenticated: boolean;\n};\n\nexport type SignUpInput = {\n email: string;\n password: string;\n name?: string;\n username?: string;\n};\n\nexport type SignInInput = {\n email?: string;\n username?: string;\n password: string;\n};\n\nexport type ArchlastAuthClientOptions = {\n /**\n * Base URL for the Archlast server.\n * Example: \"http://localhost:4000\"\n *\n * If omitted, it will default to:\n * - window.location.origin in the browser\n * - \"\" in non-browser contexts\n */\n baseUrl?: string;\n\n /**\n * App ID for session isolation (e.g. \"web\", \"admin\").\n * When set, adds x-archlast-app-id header.\n */\n appId?: string;\n\n /**\n * Better-Auth API key for authentication.\n * When provided, uses x-api-key header instead of cookies.\n */\n apiKey?: string;\n};\n\nfunction resolveBaseUrl(explicit?: string): string {\n if (explicit && explicit.trim()) return explicit.replace(/\\/+$/, \"\");\n if (typeof window !== \"undefined\" && window.location?.origin) return window.location.origin;\n return \"\";\n}\n\nexport class ArchlastAuthClient {\n private readonly baseUrl: string;\n private readonly axios: AxiosInstance;\n private readonly appId?: string;\n private readonly apiKey?: string;\n\n constructor(options: ArchlastAuthClientOptions = {}) {\n this.baseUrl = resolveBaseUrl(options.baseUrl);\n this.appId = options.appId;\n this.apiKey = options.apiKey;\n this.axios = axios.create({\n baseURL: this.baseUrl,\n withCredentials: !options.apiKey, // Only use cookies if no API key\n headers: {\n \"content-type\": \"application/json\",\n ...(this.appId ? { \"x-archlast-app-id\": this.appId } : {}),\n ...(options.apiKey ? { \"x-api-key\": options.apiKey } : {}),\n },\n });\n }\n\n /**\n * Get current authentication state\n * Uses Better-Auth's getSession endpoint\n */\n async getState(): Promise<AuthState> {\n try {\n const response = await this.axios.get<{\n user: AuthUser | null;\n session: AuthSession | null;\n }>(\"/api/auth/get-session\");\n\n const { user, session } = response.data;\n\n return {\n user,\n session,\n isAuthenticated: !!user,\n };\n } catch (error) {\n // Return unauthenticated state on error\n return {\n user: null,\n session: null,\n isAuthenticated: false,\n };\n }\n }\n\n /**\n * Sign up new user\n * Uses Better-Auth's email signUp endpoint\n */\n async signUp(input: SignUpInput): Promise<AuthState> {\n const response = await this.axios.post<{ user: AuthUser }>(\"/api/auth/sign-up/email\", {\n email: input.email,\n password: input.password,\n name: input.name,\n username: input.username,\n });\n\n return {\n user: response.data.user,\n session: null, // Session is managed via cookies\n isAuthenticated: !!response.data.user,\n };\n }\n\n /**\n * Sign in with email/username and password\n * Uses Better-Auth's credential sign-in endpoint\n */\n async signIn(input: SignInInput): Promise<AuthState> {\n // Support email or username sign-in\n if (!input.email && !input.username) {\n throw new Error(\"Either email or username is required\");\n }\n\n const response = await this.axios.post<{ user: AuthUser }>(\"/api/auth/sign-in/email\", {\n email: input.email,\n username: input.username,\n password: input.password,\n });\n\n return {\n user: response.data.user,\n session: null, // Session is managed via cookies\n isAuthenticated: !!response.data.user,\n };\n }\n\n /**\n * Sign out and revoke session\n * Uses Better-Auth's sign-out endpoint\n */\n async signOut(): Promise<{ success: boolean }> {\n const response = await this.axios.post<{ success: boolean }>(\n \"/api/auth/sign-out\",\n {},\n { withCredentials: true }\n );\n\n return response.data;\n }\n\n /**\n * Request password reset email\n * Uses Better-Auth's password reset flow\n */\n async requestPasswordReset(email: string, callbackURL?: string): Promise<{ success: boolean }> {\n const response = await this.axios.post<{ success: boolean }>(\"/api/auth/forgot-password\", {\n email,\n redirectTo: callbackURL,\n });\n\n return response.data;\n }\n\n /**\n * Reset password with token\n * Uses Better-Auth's reset password endpoint\n */\n async resetPassword(token: string, password: string): Promise<{ success: boolean }> {\n const response = await this.axios.post<{ success: boolean }>(\"/api/auth/reset-password\", {\n token,\n password,\n });\n\n return response.data;\n }\n\n /**\n * Verify email with token\n * Uses Better-Auth's email verification endpoint\n */\n async verifyEmail(token: string): Promise<{ success: boolean; user?: AuthUser }> {\n const response = await this.axios.post<{ success: boolean; user?: AuthUser }>(\"/api/auth/verify-email\", {\n token,\n });\n\n return response.data;\n }\n}\n\n/**\n * Default export for backward compatibility\n */\nexport default ArchlastAuthClient;\n"],"mappings":"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","names":[]}