@kaiz11/stack-client 0.0.14

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 (263) hide show
  1. package/LICENSE +32 -0
  2. package/README.md +586 -0
  3. package/dist/accounts/accounts-client.d.ts +188 -0
  4. package/dist/accounts/accounts-client.d.ts.map +1 -0
  5. package/dist/accounts/accounts-client.js +264 -0
  6. package/dist/accounts/accounts-client.js.map +1 -0
  7. package/dist/accounts/index.d.ts +8 -0
  8. package/dist/accounts/index.d.ts.map +1 -0
  9. package/dist/accounts/index.js +8 -0
  10. package/dist/accounts/index.js.map +1 -0
  11. package/dist/accounts/mock-accounts.d.ts +90 -0
  12. package/dist/accounts/mock-accounts.d.ts.map +1 -0
  13. package/dist/accounts/mock-accounts.js +434 -0
  14. package/dist/accounts/mock-accounts.js.map +1 -0
  15. package/dist/accounts/types.d.ts +180 -0
  16. package/dist/accounts/types.d.ts.map +1 -0
  17. package/dist/accounts/types.js +59 -0
  18. package/dist/accounts/types.js.map +1 -0
  19. package/dist/auth/auth-client.d.ts +224 -0
  20. package/dist/auth/auth-client.d.ts.map +1 -0
  21. package/dist/auth/auth-client.js +230 -0
  22. package/dist/auth/auth-client.js.map +1 -0
  23. package/dist/auth/base-auth.d.ts +44 -0
  24. package/dist/auth/base-auth.d.ts.map +1 -0
  25. package/dist/auth/base-auth.js +55 -0
  26. package/dist/auth/base-auth.js.map +1 -0
  27. package/dist/auth/index.d.ts +11 -0
  28. package/dist/auth/index.d.ts.map +1 -0
  29. package/dist/auth/index.js +11 -0
  30. package/dist/auth/index.js.map +1 -0
  31. package/dist/auth/methods/admin.d.ts +59 -0
  32. package/dist/auth/methods/admin.d.ts.map +1 -0
  33. package/dist/auth/methods/admin.js +55 -0
  34. package/dist/auth/methods/admin.js.map +1 -0
  35. package/dist/auth/methods/index.d.ts +9 -0
  36. package/dist/auth/methods/index.d.ts.map +1 -0
  37. package/dist/auth/methods/index.js +8 -0
  38. package/dist/auth/methods/index.js.map +1 -0
  39. package/dist/auth/methods/magic-link.d.ts +27 -0
  40. package/dist/auth/methods/magic-link.d.ts.map +1 -0
  41. package/dist/auth/methods/magic-link.js +37 -0
  42. package/dist/auth/methods/magic-link.js.map +1 -0
  43. package/dist/auth/methods/mfa.d.ts +92 -0
  44. package/dist/auth/methods/mfa.d.ts.map +1 -0
  45. package/dist/auth/methods/mfa.js +153 -0
  46. package/dist/auth/methods/mfa.js.map +1 -0
  47. package/dist/auth/methods/oauth.d.ts +62 -0
  48. package/dist/auth/methods/oauth.d.ts.map +1 -0
  49. package/dist/auth/methods/oauth.js +165 -0
  50. package/dist/auth/methods/oauth.js.map +1 -0
  51. package/dist/auth/methods/otp.d.ts +43 -0
  52. package/dist/auth/methods/otp.d.ts.map +1 -0
  53. package/dist/auth/methods/otp.js +66 -0
  54. package/dist/auth/methods/otp.js.map +1 -0
  55. package/dist/auth/methods/password.d.ts +64 -0
  56. package/dist/auth/methods/password.d.ts.map +1 -0
  57. package/dist/auth/methods/password.js +116 -0
  58. package/dist/auth/methods/password.js.map +1 -0
  59. package/dist/auth/methods/recovery.d.ts +62 -0
  60. package/dist/auth/methods/recovery.d.ts.map +1 -0
  61. package/dist/auth/methods/recovery.js +100 -0
  62. package/dist/auth/methods/recovery.js.map +1 -0
  63. package/dist/auth/mock-auth.d.ts +135 -0
  64. package/dist/auth/mock-auth.d.ts.map +1 -0
  65. package/dist/auth/mock-auth.js +417 -0
  66. package/dist/auth/mock-auth.js.map +1 -0
  67. package/dist/auth/server/helpers.d.ts +215 -0
  68. package/dist/auth/server/helpers.d.ts.map +1 -0
  69. package/dist/auth/server/helpers.js +241 -0
  70. package/dist/auth/server/helpers.js.map +1 -0
  71. package/dist/auth/server/index.d.ts +24 -0
  72. package/dist/auth/server/index.d.ts.map +1 -0
  73. package/dist/auth/server/index.js +40 -0
  74. package/dist/auth/server/index.js.map +1 -0
  75. package/dist/auth/server/middleware.d.ts +305 -0
  76. package/dist/auth/server/middleware.d.ts.map +1 -0
  77. package/dist/auth/server/middleware.js +405 -0
  78. package/dist/auth/server/middleware.js.map +1 -0
  79. package/dist/auth/server/verify.d.ts +184 -0
  80. package/dist/auth/server/verify.d.ts.map +1 -0
  81. package/dist/auth/server/verify.js +222 -0
  82. package/dist/auth/server/verify.js.map +1 -0
  83. package/dist/auth/token-manager.d.ts +94 -0
  84. package/dist/auth/token-manager.d.ts.map +1 -0
  85. package/dist/auth/token-manager.js +231 -0
  86. package/dist/auth/token-manager.js.map +1 -0
  87. package/dist/auth/types.d.ts +412 -0
  88. package/dist/auth/types.d.ts.map +1 -0
  89. package/dist/auth/types.js +66 -0
  90. package/dist/auth/types.js.map +1 -0
  91. package/dist/auth/user/identities.d.ts +62 -0
  92. package/dist/auth/user/identities.d.ts.map +1 -0
  93. package/dist/auth/user/identities.js +88 -0
  94. package/dist/auth/user/identities.js.map +1 -0
  95. package/dist/auth/user/index.d.ts +4 -0
  96. package/dist/auth/user/index.d.ts.map +1 -0
  97. package/dist/auth/user/index.js +4 -0
  98. package/dist/auth/user/index.js.map +1 -0
  99. package/dist/auth/user/user.d.ts +64 -0
  100. package/dist/auth/user/user.d.ts.map +1 -0
  101. package/dist/auth/user/user.js +105 -0
  102. package/dist/auth/user/user.js.map +1 -0
  103. package/dist/auth/user/verification.d.ts +49 -0
  104. package/dist/auth/user/verification.d.ts.map +1 -0
  105. package/dist/auth/user/verification.js +71 -0
  106. package/dist/auth/user/verification.js.map +1 -0
  107. package/dist/cli/browser.d.ts +11 -0
  108. package/dist/cli/browser.d.ts.map +1 -0
  109. package/dist/cli/browser.js +35 -0
  110. package/dist/cli/browser.js.map +1 -0
  111. package/dist/cli/callback-server.d.ts +30 -0
  112. package/dist/cli/callback-server.d.ts.map +1 -0
  113. package/dist/cli/callback-server.js +100 -0
  114. package/dist/cli/callback-server.js.map +1 -0
  115. package/dist/cli/file-token-store.d.ts +79 -0
  116. package/dist/cli/file-token-store.d.ts.map +1 -0
  117. package/dist/cli/file-token-store.js +138 -0
  118. package/dist/cli/file-token-store.js.map +1 -0
  119. package/dist/cli/index.d.ts +33 -0
  120. package/dist/cli/index.d.ts.map +1 -0
  121. package/dist/cli/index.js +38 -0
  122. package/dist/cli/index.js.map +1 -0
  123. package/dist/cli/oauth.d.ts +67 -0
  124. package/dist/cli/oauth.d.ts.map +1 -0
  125. package/dist/cli/oauth.js +101 -0
  126. package/dist/cli/oauth.js.map +1 -0
  127. package/dist/cli/pkce.d.ts +35 -0
  128. package/dist/cli/pkce.d.ts.map +1 -0
  129. package/dist/cli/pkce.js +43 -0
  130. package/dist/cli/pkce.js.map +1 -0
  131. package/dist/client.d.ts +22 -0
  132. package/dist/client.d.ts.map +1 -0
  133. package/dist/client.js +99 -0
  134. package/dist/client.js.map +1 -0
  135. package/dist/db/client.d.ts +9 -0
  136. package/dist/db/client.d.ts.map +1 -0
  137. package/dist/db/client.js +19 -0
  138. package/dist/db/client.js.map +1 -0
  139. package/dist/db/errors.d.ts +19 -0
  140. package/dist/db/errors.d.ts.map +1 -0
  141. package/dist/db/errors.js +57 -0
  142. package/dist/db/errors.js.map +1 -0
  143. package/dist/db/index.d.ts +7 -0
  144. package/dist/db/index.d.ts.map +1 -0
  145. package/dist/db/index.js +5 -0
  146. package/dist/db/index.js.map +1 -0
  147. package/dist/db/mock.d.ts +28 -0
  148. package/dist/db/mock.d.ts.map +1 -0
  149. package/dist/db/mock.js +459 -0
  150. package/dist/db/mock.js.map +1 -0
  151. package/dist/db/types.d.ts +73 -0
  152. package/dist/db/types.d.ts.map +1 -0
  153. package/dist/db/types.js +2 -0
  154. package/dist/db/types.js.map +1 -0
  155. package/dist/index.d.ts +21 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +20 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/lib/errors.d.ts +33 -0
  160. package/dist/lib/errors.d.ts.map +1 -0
  161. package/dist/lib/errors.js +76 -0
  162. package/dist/lib/errors.js.map +1 -0
  163. package/dist/lib/http.d.ts +81 -0
  164. package/dist/lib/http.d.ts.map +1 -0
  165. package/dist/lib/http.js +163 -0
  166. package/dist/lib/http.js.map +1 -0
  167. package/dist/lib/keys.d.ts +87 -0
  168. package/dist/lib/keys.d.ts.map +1 -0
  169. package/dist/lib/keys.js +147 -0
  170. package/dist/lib/keys.js.map +1 -0
  171. package/dist/lib/paths.d.ts +37 -0
  172. package/dist/lib/paths.d.ts.map +1 -0
  173. package/dist/lib/paths.js +49 -0
  174. package/dist/lib/paths.js.map +1 -0
  175. package/dist/lib/token-store.d.ts +42 -0
  176. package/dist/lib/token-store.d.ts.map +1 -0
  177. package/dist/lib/token-store.js +75 -0
  178. package/dist/lib/token-store.js.map +1 -0
  179. package/dist/mocks/handlers.d.ts +29 -0
  180. package/dist/mocks/handlers.d.ts.map +1 -0
  181. package/dist/mocks/handlers.js +79 -0
  182. package/dist/mocks/handlers.js.map +1 -0
  183. package/dist/mocks/index.d.ts +5 -0
  184. package/dist/mocks/index.d.ts.map +1 -0
  185. package/dist/mocks/index.js +9 -0
  186. package/dist/mocks/index.js.map +1 -0
  187. package/dist/mocks/responses.d.ts +76 -0
  188. package/dist/mocks/responses.d.ts.map +1 -0
  189. package/dist/mocks/responses.js +91 -0
  190. package/dist/mocks/responses.js.map +1 -0
  191. package/dist/mocks/server.d.ts +7 -0
  192. package/dist/mocks/server.d.ts.map +1 -0
  193. package/dist/mocks/server.js +9 -0
  194. package/dist/mocks/server.js.map +1 -0
  195. package/dist/mocks/state.d.ts +86 -0
  196. package/dist/mocks/state.d.ts.map +1 -0
  197. package/dist/mocks/state.js +77 -0
  198. package/dist/mocks/state.js.map +1 -0
  199. package/dist/storage/bucket-ref.d.ts +183 -0
  200. package/dist/storage/bucket-ref.d.ts.map +1 -0
  201. package/dist/storage/bucket-ref.js +529 -0
  202. package/dist/storage/bucket-ref.js.map +1 -0
  203. package/dist/storage/errors.d.ts +27 -0
  204. package/dist/storage/errors.d.ts.map +1 -0
  205. package/dist/storage/errors.js +89 -0
  206. package/dist/storage/errors.js.map +1 -0
  207. package/dist/storage/index.d.ts +13 -0
  208. package/dist/storage/index.d.ts.map +1 -0
  209. package/dist/storage/index.js +11 -0
  210. package/dist/storage/index.js.map +1 -0
  211. package/dist/storage/interface.d.ts +245 -0
  212. package/dist/storage/interface.d.ts.map +1 -0
  213. package/dist/storage/interface.js +2 -0
  214. package/dist/storage/interface.js.map +1 -0
  215. package/dist/storage/mock-storage.d.ts +67 -0
  216. package/dist/storage/mock-storage.d.ts.map +1 -0
  217. package/dist/storage/mock-storage.js +478 -0
  218. package/dist/storage/mock-storage.js.map +1 -0
  219. package/dist/storage/policies-client.d.ts +77 -0
  220. package/dist/storage/policies-client.d.ts.map +1 -0
  221. package/dist/storage/policies-client.js +115 -0
  222. package/dist/storage/policies-client.js.map +1 -0
  223. package/dist/storage/policy-templates.d.ts +6 -0
  224. package/dist/storage/policy-templates.d.ts.map +1 -0
  225. package/dist/storage/policy-templates.js +290 -0
  226. package/dist/storage/policy-templates.js.map +1 -0
  227. package/dist/storage/policy-types.d.ts +98 -0
  228. package/dist/storage/policy-types.d.ts.map +1 -0
  229. package/dist/storage/policy-types.js +20 -0
  230. package/dist/storage/policy-types.js.map +1 -0
  231. package/dist/storage/storage-client.d.ts +32 -0
  232. package/dist/storage/storage-client.d.ts.map +1 -0
  233. package/dist/storage/storage-client.js +94 -0
  234. package/dist/storage/storage-client.js.map +1 -0
  235. package/dist/storage/tus-upload.d.ts +56 -0
  236. package/dist/storage/tus-upload.d.ts.map +1 -0
  237. package/dist/storage/tus-upload.js +236 -0
  238. package/dist/storage/tus-upload.js.map +1 -0
  239. package/dist/storage/types.d.ts +335 -0
  240. package/dist/storage/types.d.ts.map +1 -0
  241. package/dist/storage/types.js +39 -0
  242. package/dist/storage/types.js.map +1 -0
  243. package/dist/test/auth/helpers.d.ts +33 -0
  244. package/dist/test/auth/helpers.d.ts.map +1 -0
  245. package/dist/test/auth/helpers.js +80 -0
  246. package/dist/test/auth/helpers.js.map +1 -0
  247. package/dist/test/helpers/jwt.d.ts +61 -0
  248. package/dist/test/helpers/jwt.d.ts.map +1 -0
  249. package/dist/test/helpers/jwt.js +132 -0
  250. package/dist/test/helpers/jwt.js.map +1 -0
  251. package/dist/test/helpers/mailpit.d.ts +61 -0
  252. package/dist/test/helpers/mailpit.d.ts.map +1 -0
  253. package/dist/test/helpers/mailpit.js +107 -0
  254. package/dist/test/helpers/mailpit.js.map +1 -0
  255. package/dist/test/setup.d.ts +2 -0
  256. package/dist/test/setup.d.ts.map +1 -0
  257. package/dist/test/setup.js +17 -0
  258. package/dist/test/setup.js.map +1 -0
  259. package/dist/types.d.ts +96 -0
  260. package/dist/types.d.ts.map +1 -0
  261. package/dist/types.js +5 -0
  262. package/dist/types.js.map +1 -0
  263. package/package.json +78 -0
@@ -0,0 +1,138 @@
1
+ /**
2
+ * File-based token storage (for Node.js CLI applications)
3
+ *
4
+ * This module is intentionally separate from the main token-store.ts
5
+ * to avoid bundlers trying to resolve Node.js modules in browser builds.
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ /**
10
+ * File-based token storage for CLI applications.
11
+ *
12
+ * Stores tokens in a JSON file with restricted permissions (0600).
13
+ * Only available from the /cli entry point to avoid breaking browser builds.
14
+ *
15
+ * Supports storing additional metadata alongside tokens via `setTokensWithData`.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * import { FileTokenStore } from "@kaiz11/stack-client/cli";
20
+ *
21
+ * const store = new FileTokenStore("~/.myapp/tokens.json");
22
+ *
23
+ * // Basic usage
24
+ * store.setTokens(accessToken, refreshToken);
25
+ *
26
+ * // With metadata
27
+ * store.setTokensWithData(accessToken, refreshToken, {
28
+ * expiresAt: 1234567890,
29
+ * user: { id: "123", email: "user@example.com" }
30
+ * });
31
+ *
32
+ * // Retrieve full data
33
+ * const data = store.getData();
34
+ * console.log(data?.expiresAt, data?.user);
35
+ * ```
36
+ */
37
+ export class FileTokenStore {
38
+ data = null;
39
+ loaded = false;
40
+ /** File path - protected so subclasses can access it */
41
+ filePath;
42
+ /**
43
+ * @param filePath - Absolute path to the token file
44
+ */
45
+ constructor(filePath) {
46
+ this.filePath = filePath;
47
+ }
48
+ /**
49
+ * Load data from file if not already loaded.
50
+ */
51
+ ensureLoaded() {
52
+ if (this.loaded)
53
+ return;
54
+ this.loaded = true;
55
+ try {
56
+ if (!fs.existsSync(this.filePath))
57
+ return;
58
+ const content = fs.readFileSync(this.filePath, "utf-8");
59
+ const parsed = JSON.parse(content);
60
+ // Validate required fields
61
+ if (typeof parsed.accessToken === "string" &&
62
+ typeof parsed.refreshToken === "string") {
63
+ this.data = parsed;
64
+ }
65
+ }
66
+ catch {
67
+ // File doesn't exist or is invalid - start fresh
68
+ }
69
+ }
70
+ /**
71
+ * Persist data to file.
72
+ */
73
+ persist() {
74
+ if (!this.data)
75
+ return;
76
+ try {
77
+ // Ensure parent directory exists
78
+ const dir = path.dirname(this.filePath);
79
+ if (!fs.existsSync(dir)) {
80
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
81
+ }
82
+ // Write with restricted permissions
83
+ fs.writeFileSync(this.filePath, JSON.stringify(this.data, null, 2), {
84
+ mode: 0o600,
85
+ });
86
+ }
87
+ catch {
88
+ // Silently fail - caller can check if tokens persist
89
+ }
90
+ }
91
+ getAccessToken() {
92
+ this.ensureLoaded();
93
+ return this.data?.accessToken ?? null;
94
+ }
95
+ getRefreshToken() {
96
+ this.ensureLoaded();
97
+ return this.data?.refreshToken ?? null;
98
+ }
99
+ /**
100
+ * Get all stored data including metadata.
101
+ */
102
+ getData() {
103
+ this.ensureLoaded();
104
+ return this.data;
105
+ }
106
+ setTokens(accessToken, refreshToken) {
107
+ this.setTokensWithData(accessToken, refreshToken, {});
108
+ }
109
+ /**
110
+ * Set tokens with additional metadata.
111
+ *
112
+ * @param accessToken - The access token
113
+ * @param refreshToken - The refresh token
114
+ * @param metadata - Additional data to store (expiresAt, user, etc.)
115
+ */
116
+ setTokensWithData(accessToken, refreshToken, metadata) {
117
+ this.data = {
118
+ ...metadata,
119
+ accessToken,
120
+ refreshToken,
121
+ };
122
+ this.loaded = true;
123
+ this.persist();
124
+ }
125
+ clearTokens() {
126
+ this.data = null;
127
+ this.loaded = true;
128
+ try {
129
+ if (fs.existsSync(this.filePath)) {
130
+ fs.unlinkSync(this.filePath);
131
+ }
132
+ }
133
+ catch {
134
+ // Silently fail
135
+ }
136
+ }
137
+ }
138
+ //# sourceMappingURL=file-token-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-token-store.js","sourceRoot":"","sources":["../../src/cli/file-token-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * CLI utilities for terminal-based OAuth authentication.
3
+ *
4
+ * This module provides Node.js-only utilities for CLI tools:
5
+ * - FileTokenStore: Persistent file-based token storage
6
+ * - CLI OAuth flow: Browser-based PKCE authentication
7
+ * - PKCE utilities: Code verifier/challenge generation
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { FileTokenStore, cliOAuthFlow } from "@kaiz11/stack-client/cli";
12
+ *
13
+ * // Setup file-based token storage
14
+ * const tokenStore = new FileTokenStore("~/.myapp/tokens.json");
15
+ *
16
+ * // Run OAuth flow if not authenticated
17
+ * if (!tokenStore.getAccessToken()) {
18
+ * const session = await cliOAuthFlow(
19
+ * { baseUrl: "https://stack.zenku.app", tenantId: "my-app" },
20
+ * { provider: "github" }
21
+ * );
22
+ * tokenStore.setTokens(session.accessToken, session.refreshToken);
23
+ * }
24
+ * ```
25
+ *
26
+ * @module
27
+ */
28
+ export { FileTokenStore, type FileTokenData } from "./file-token-store.js";
29
+ export { openBrowser } from "./browser.js";
30
+ export { startCallbackServer, type CallbackResult, type CallbackServerOptions, } from "./callback-server.js";
31
+ export { generateCodeVerifier, generateCodeChallenge, generatePkceChallenge, type PkceChallenge, } from "./pkce.js";
32
+ export { cliOAuthFlow, refreshSession, type CliOAuthOptions, type CliOAuthConfig, } from "./oauth.js";
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3E,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,EACL,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * CLI utilities for terminal-based OAuth authentication.
3
+ *
4
+ * This module provides Node.js-only utilities for CLI tools:
5
+ * - FileTokenStore: Persistent file-based token storage
6
+ * - CLI OAuth flow: Browser-based PKCE authentication
7
+ * - PKCE utilities: Code verifier/challenge generation
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { FileTokenStore, cliOAuthFlow } from "@kaiz11/stack-client/cli";
12
+ *
13
+ * // Setup file-based token storage
14
+ * const tokenStore = new FileTokenStore("~/.myapp/tokens.json");
15
+ *
16
+ * // Run OAuth flow if not authenticated
17
+ * if (!tokenStore.getAccessToken()) {
18
+ * const session = await cliOAuthFlow(
19
+ * { baseUrl: "https://stack.zenku.app", tenantId: "my-app" },
20
+ * { provider: "github" }
21
+ * );
22
+ * tokenStore.setTokens(session.accessToken, session.refreshToken);
23
+ * }
24
+ * ```
25
+ *
26
+ * @module
27
+ */
28
+ // Token storage (Node.js only - separate from main token-store to avoid breaking browser builds)
29
+ export { FileTokenStore } from "./file-token-store.js";
30
+ // Browser opener
31
+ export { openBrowser } from "./browser.js";
32
+ // Callback server
33
+ export { startCallbackServer, } from "./callback-server.js";
34
+ // PKCE utilities
35
+ export { generateCodeVerifier, generateCodeChallenge, generatePkceChallenge, } from "./pkce.js";
36
+ // OAuth flow
37
+ export { cliOAuthFlow, refreshSession, } from "./oauth.js";
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,iGAAiG;AACjG,OAAO,EAAE,cAAc,EAAsB,MAAM,uBAAuB,CAAC;AAE3E,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,kBAAkB;AAClB,OAAO,EACL,mBAAmB,GAGpB,MAAM,sBAAsB,CAAC;AAE9B,iBAAiB;AACjB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GAEtB,MAAM,WAAW,CAAC;AAEnB,aAAa;AACb,OAAO,EACL,YAAY,EACZ,cAAc,GAGf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * CLI OAuth flow for terminal applications.
3
+ *
4
+ * Implements the OAuth PKCE flow for CLI tools:
5
+ * 1. Generates PKCE challenge
6
+ * 2. Opens browser for user authentication
7
+ * 3. Listens on local callback server for code
8
+ * 4. Exchanges code for tokens
9
+ */
10
+ import type { OAuthProvider, Session } from "../auth/types.js";
11
+ /**
12
+ * Options for CLI OAuth flow
13
+ */
14
+ export interface CliOAuthOptions {
15
+ /** OAuth provider to use */
16
+ provider: OAuthProvider;
17
+ /** Port for local callback server (default: 14550) */
18
+ port?: number;
19
+ /** Timeout in milliseconds (default: 120000 = 2 minutes) */
20
+ timeout?: number;
21
+ /** Optional callback when browser is opened */
22
+ onBrowserOpen?: (url: string) => void;
23
+ /** Optional callback for status updates */
24
+ onStatus?: (status: string) => void;
25
+ }
26
+ /**
27
+ * Configuration for CLI OAuth
28
+ */
29
+ export interface CliOAuthConfig {
30
+ /** Base URL of the Stack platform (e.g., "https://stack.zenku.app") */
31
+ baseUrl: string;
32
+ /** Tenant ID */
33
+ tenantId: string;
34
+ }
35
+ /**
36
+ * Execute a complete CLI OAuth flow.
37
+ *
38
+ * This function:
39
+ * 1. Starts a local callback server
40
+ * 2. Generates PKCE challenge
41
+ * 3. Opens the browser for authentication
42
+ * 4. Waits for OAuth callback
43
+ * 5. Exchanges auth code for session tokens
44
+ *
45
+ * @param config - Stack platform configuration
46
+ * @param options - OAuth flow options
47
+ * @returns Session with tokens and user info
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const session = await cliOAuthFlow(
52
+ * { baseUrl: "https://stack.zenku.app", tenantId: "my-app" },
53
+ * { provider: "github" }
54
+ * );
55
+ * console.log(`Logged in as ${session.user.email}`);
56
+ * ```
57
+ */
58
+ export declare function cliOAuthFlow(config: CliOAuthConfig, options: CliOAuthOptions): Promise<Session>;
59
+ /**
60
+ * Refresh a session using a refresh token.
61
+ *
62
+ * @param config - Stack platform configuration
63
+ * @param refreshToken - The refresh token
64
+ * @returns New session with fresh tokens
65
+ */
66
+ export declare function refreshSession(config: CliOAuthConfig, refreshToken: string): Promise<Session>;
67
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/cli/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,OAAO,EAER,MAAM,kBAAkB,CAAC;AAS1B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,QAAQ,EAAE,aAAa,CAAC;IACxB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAwDlB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC,CAiBlB"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * CLI OAuth flow for terminal applications.
3
+ *
4
+ * Implements the OAuth PKCE flow for CLI tools:
5
+ * 1. Generates PKCE challenge
6
+ * 2. Opens browser for user authentication
7
+ * 3. Listens on local callback server for code
8
+ * 4. Exchanges code for tokens
9
+ */
10
+ import { normalizeSession } from "../auth/types.js";
11
+ import { openBrowser } from "./browser.js";
12
+ import { startCallbackServer, } from "./callback-server.js";
13
+ import { generatePkceChallenge } from "./pkce.js";
14
+ /**
15
+ * Execute a complete CLI OAuth flow.
16
+ *
17
+ * This function:
18
+ * 1. Starts a local callback server
19
+ * 2. Generates PKCE challenge
20
+ * 3. Opens the browser for authentication
21
+ * 4. Waits for OAuth callback
22
+ * 5. Exchanges auth code for session tokens
23
+ *
24
+ * @param config - Stack platform configuration
25
+ * @param options - OAuth flow options
26
+ * @returns Session with tokens and user info
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const session = await cliOAuthFlow(
31
+ * { baseUrl: "https://stack.zenku.app", tenantId: "my-app" },
32
+ * { provider: "github" }
33
+ * );
34
+ * console.log(`Logged in as ${session.user.email}`);
35
+ * ```
36
+ */
37
+ export async function cliOAuthFlow(config, options) {
38
+ const { provider, port = 14550, timeout = 120000, onBrowserOpen, onStatus, } = options;
39
+ const { baseUrl, tenantId } = config;
40
+ // Generate PKCE challenge
41
+ const pkce = generatePkceChallenge();
42
+ // Build callback URL
43
+ const callbackUrl = `http://localhost:${port}/callback`;
44
+ // Build authorization URL
45
+ const authUrl = new URL(`${baseUrl}/auth/${tenantId}/authorize`);
46
+ authUrl.searchParams.set("provider", provider);
47
+ authUrl.searchParams.set("redirect_to", callbackUrl);
48
+ authUrl.searchParams.set("code_challenge", pkce.codeChallenge);
49
+ authUrl.searchParams.set("code_challenge_method", pkce.codeChallengeMethod);
50
+ // Start callback server (before opening browser)
51
+ const serverOptions = { port, timeout };
52
+ const callbackPromise = startCallbackServer(serverOptions);
53
+ // Open browser
54
+ onStatus?.("Opening browser for authentication...");
55
+ const urlString = authUrl.toString();
56
+ onBrowserOpen?.(urlString);
57
+ await openBrowser(urlString);
58
+ // Wait for callback
59
+ onStatus?.("Waiting for authentication...");
60
+ const { code } = await callbackPromise;
61
+ // Exchange code for tokens
62
+ onStatus?.("Exchanging code for session...");
63
+ const tokenUrl = `${baseUrl}/auth/${tenantId}/token?grant_type=pkce`;
64
+ const tokenResponse = await fetch(tokenUrl, {
65
+ method: "POST",
66
+ headers: { "Content-Type": "application/json" },
67
+ body: JSON.stringify({
68
+ auth_code: code,
69
+ code_verifier: pkce.codeVerifier,
70
+ }),
71
+ });
72
+ if (!tokenResponse.ok) {
73
+ const error = await tokenResponse.text();
74
+ throw new Error(`Token exchange failed: ${error}`);
75
+ }
76
+ const tokenData = (await tokenResponse.json());
77
+ return normalizeSession(tokenData);
78
+ }
79
+ /**
80
+ * Refresh a session using a refresh token.
81
+ *
82
+ * @param config - Stack platform configuration
83
+ * @param refreshToken - The refresh token
84
+ * @returns New session with fresh tokens
85
+ */
86
+ export async function refreshSession(config, refreshToken) {
87
+ const { baseUrl, tenantId } = config;
88
+ const tokenUrl = `${baseUrl}/auth/${tenantId}/token?grant_type=refresh_token`;
89
+ const response = await fetch(tokenUrl, {
90
+ method: "POST",
91
+ headers: { "Content-Type": "application/json" },
92
+ body: JSON.stringify({ refresh_token: refreshToken }),
93
+ });
94
+ if (!response.ok) {
95
+ const error = await response.text();
96
+ throw new Error(`Token refresh failed: ${error}`);
97
+ }
98
+ const tokenData = (await response.json());
99
+ return normalizeSession(tokenData);
100
+ }
101
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/cli/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * PKCE (Proof Key for Code Exchange) utilities for OAuth.
3
+ */
4
+ /**
5
+ * PKCE challenge data
6
+ */
7
+ export interface PkceChallenge {
8
+ /** Random code verifier */
9
+ codeVerifier: string;
10
+ /** SHA256 hash of verifier, base64url encoded */
11
+ codeChallenge: string;
12
+ /** Challenge method (always S256) */
13
+ codeChallengeMethod: "S256";
14
+ }
15
+ /**
16
+ * Generate a cryptographically random code verifier.
17
+ *
18
+ * @param length - Length of verifier in bytes (default: 32, produces 43 char string)
19
+ * @returns Base64url-encoded random string
20
+ */
21
+ export declare function generateCodeVerifier(length?: number): string;
22
+ /**
23
+ * Generate a code challenge from a verifier.
24
+ *
25
+ * @param verifier - The code verifier
26
+ * @returns Base64url-encoded SHA256 hash
27
+ */
28
+ export declare function generateCodeChallenge(verifier: string): string;
29
+ /**
30
+ * Generate a complete PKCE challenge.
31
+ *
32
+ * @returns PKCE challenge data with verifier and challenge
33
+ */
34
+ export declare function generatePkceChallenge(): PkceChallenge;
35
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/cli/pkce.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,SAAK,GAAG,MAAM,CAOxD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,aAAa,CASrD"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * PKCE (Proof Key for Code Exchange) utilities for OAuth.
3
+ */
4
+ import { randomBytes, createHash } from "node:crypto";
5
+ /**
6
+ * Generate a cryptographically random code verifier.
7
+ *
8
+ * @param length - Length of verifier in bytes (default: 32, produces 43 char string)
9
+ * @returns Base64url-encoded random string
10
+ */
11
+ export function generateCodeVerifier(length = 32) {
12
+ const buffer = randomBytes(length);
13
+ return buffer
14
+ .toString("base64")
15
+ .replace(/\+/g, "-")
16
+ .replace(/\//g, "_")
17
+ .replace(/=+$/, "");
18
+ }
19
+ /**
20
+ * Generate a code challenge from a verifier.
21
+ *
22
+ * @param verifier - The code verifier
23
+ * @returns Base64url-encoded SHA256 hash
24
+ */
25
+ export function generateCodeChallenge(verifier) {
26
+ const hash = createHash("sha256").update(verifier).digest("base64");
27
+ return hash.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
28
+ }
29
+ /**
30
+ * Generate a complete PKCE challenge.
31
+ *
32
+ * @returns PKCE challenge data with verifier and challenge
33
+ */
34
+ export function generatePkceChallenge() {
35
+ const codeVerifier = generateCodeVerifier();
36
+ const codeChallenge = generateCodeChallenge(codeVerifier);
37
+ return {
38
+ codeVerifier,
39
+ codeChallenge,
40
+ codeChallengeMethod: "S256",
41
+ };
42
+ }
43
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/cli/pkce.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AActD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAM,GAAG,EAAE;IAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,MAAM;SACV,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;IAC5C,MAAM,aAAa,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAE1D,OAAO;QACL,YAAY;QACZ,aAAa;QACb,mBAAmB,EAAE,MAAM;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { PostgrestClient } from "@supabase/postgrest-js";
2
+ import { type IAuthClient } from "./auth/index.js";
3
+ import { type IStorageClient } from "./storage/index.js";
4
+ import { type IAccountsClient } from "./accounts/index.js";
5
+ import { type ClientConfig } from "./types.js";
6
+ export declare class StackClient<Database = Record<string, unknown>> {
7
+ readonly auth: IAuthClient;
8
+ readonly storage: IStorageClient;
9
+ readonly accounts: IAccountsClient;
10
+ readonly db: PostgrestClient<Database>;
11
+ private readonly http;
12
+ private readonly tokenManager;
13
+ private readonly isMock;
14
+ constructor(config: ClientConfig);
15
+ destroy(): void;
16
+ }
17
+ export declare function createClient<Database = Record<string, unknown>>(config: ClientConfig): StackClient<Database>;
18
+ export declare function createTenantClient<Database = Record<string, unknown>>(config: ClientConfig & {
19
+ tenantId: string;
20
+ }): StackClient<Database>;
21
+ export declare function createPlatformClient<Database = Record<string, unknown>>(config: ClientConfig): StackClient<Database>;
22
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAA8B,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG/E,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,YAAY,CAAC;AASpB,qBAAa,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAEvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAErB,MAAM,EAAE,YAAY;IA6EhC,OAAO,IAAI,IAAI;CAMhB;AAED,wBAAgB,YAAY,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7D,MAAM,EAAE,YAAY,GACnB,WAAW,CAAC,QAAQ,CAAC,CAEvB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,MAAM,EAAE,YAAY,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC1C,WAAW,CAAC,QAAQ,CAAC,CAEvB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrE,MAAM,EAAE,YAAY,GACnB,WAAW,CAAC,QAAQ,CAAC,CAEvB"}
package/dist/client.js ADDED
@@ -0,0 +1,99 @@
1
+ import { HttpClient } from "./lib/http.js";
2
+ import { createTokenStore } from "./lib/token-store.js";
3
+ import { AuthClient, MockAuthClient } from "./auth/index.js";
4
+ import { TokenManager } from "./auth/token-manager.js";
5
+ import { mockState } from "./mocks/state.js";
6
+ import { MockStorageClient, StorageClient, } from "./storage/index.js";
7
+ import { AccountsClient, MockAccountsClient, } from "./accounts/index.js";
8
+ import { MockDbClient, createDbClient } from "./db/index.js";
9
+ import { PLATFORM_TENANT_ID, } from "./types.js";
10
+ function resolveConfig(config) {
11
+ return {
12
+ ...config,
13
+ tenantId: config.tenantId ?? PLATFORM_TENANT_ID,
14
+ };
15
+ }
16
+ export class StackClient {
17
+ auth;
18
+ storage;
19
+ accounts;
20
+ db;
21
+ http;
22
+ tokenManager;
23
+ isMock;
24
+ constructor(config) {
25
+ const resolved = resolveConfig(config);
26
+ this.isMock = resolved.mock ?? false;
27
+ const tokenStore = createTokenStore(resolved.tokenStore ?? "memory", resolved.storagePrefix);
28
+ if (resolved.accessToken) {
29
+ tokenStore.setTokens(resolved.accessToken, "");
30
+ }
31
+ if (this.isMock && resolved.mockOptions) {
32
+ if (resolved.mockOptions.latency !== undefined) {
33
+ mockState.latency = resolved.mockOptions.latency;
34
+ }
35
+ }
36
+ if (this.isMock) {
37
+ this.http = null;
38
+ this.tokenManager = new TokenManager({
39
+ tokenStore,
40
+ tenantId: resolved.tenantId,
41
+ });
42
+ this.auth = new MockAuthClient({
43
+ tokenManager: this.tokenManager,
44
+ });
45
+ this.storage = new MockStorageClient({
46
+ baseUrl: resolved.baseUrl,
47
+ });
48
+ this.accounts = new MockAccountsClient();
49
+ this.db = new MockDbClient();
50
+ }
51
+ else {
52
+ this.http = new HttpClient({
53
+ baseUrl: resolved.baseUrl,
54
+ tokenStore,
55
+ timeout: resolved.timeout,
56
+ });
57
+ this.tokenManager = new TokenManager({
58
+ http: this.http,
59
+ tokenStore,
60
+ tenantId: resolved.tenantId,
61
+ });
62
+ this.auth = new AuthClient({
63
+ http: this.http,
64
+ tokenManager: this.tokenManager,
65
+ tenantId: resolved.tenantId,
66
+ });
67
+ this.storage = new StorageClient({
68
+ http: this.http,
69
+ tenantId: resolved.tenantId,
70
+ accountId: resolved.accountId,
71
+ });
72
+ this.accounts = new AccountsClient({
73
+ http: this.http,
74
+ tenantId: resolved.tenantId,
75
+ });
76
+ this.db = createDbClient({
77
+ baseUrl: resolved.baseUrl,
78
+ tenantId: resolved.tenantId,
79
+ tokenStore,
80
+ });
81
+ }
82
+ }
83
+ destroy() {
84
+ this.tokenManager.destroy();
85
+ if (this.isMock) {
86
+ mockState.reset();
87
+ }
88
+ }
89
+ }
90
+ export function createClient(config) {
91
+ return new StackClient(config);
92
+ }
93
+ export function createTenantClient(config) {
94
+ return new StackClient(config);
95
+ }
96
+ export function createPlatformClient(config) {
97
+ return new StackClient({ ...config, tenantId: PLATFORM_TENANT_ID });
98
+ }
99
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { PostgrestClient } from "@supabase/postgrest-js";
2
+ import type { TokenStore } from "../lib/token-store.js";
3
+ export interface DbClientConfig {
4
+ baseUrl: string;
5
+ tenantId: string;
6
+ tokenStore: TokenStore;
7
+ }
8
+ export declare function createDbClient<Database = Record<string, unknown>>(config: DbClientConfig): PostgrestClient<Database>;
9
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,MAAM,EAAE,cAAc,GACrB,eAAe,CAAC,QAAQ,CAAC,CAmB3B"}
@@ -0,0 +1,19 @@
1
+ import { PostgrestClient } from "@supabase/postgrest-js";
2
+ export function createDbClient(config) {
3
+ const { baseUrl, tenantId, tokenStore } = config;
4
+ const postgrestUrl = `${baseUrl.replace(/\/$/, "")}/rest/${tenantId}`;
5
+ return new PostgrestClient(postgrestUrl, {
6
+ fetch: (input, init) => {
7
+ const accessToken = tokenStore.getAccessToken();
8
+ const headers = new Headers(init?.headers);
9
+ if (accessToken) {
10
+ headers.set("Authorization", `Bearer ${accessToken}`);
11
+ }
12
+ return fetch(input, {
13
+ ...init,
14
+ headers,
15
+ });
16
+ },
17
+ });
18
+ }
19
+ //# sourceMappingURL=client.js.map