@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.
- package/LICENSE +32 -0
- package/README.md +586 -0
- package/dist/accounts/accounts-client.d.ts +188 -0
- package/dist/accounts/accounts-client.d.ts.map +1 -0
- package/dist/accounts/accounts-client.js +264 -0
- package/dist/accounts/accounts-client.js.map +1 -0
- package/dist/accounts/index.d.ts +8 -0
- package/dist/accounts/index.d.ts.map +1 -0
- package/dist/accounts/index.js +8 -0
- package/dist/accounts/index.js.map +1 -0
- package/dist/accounts/mock-accounts.d.ts +90 -0
- package/dist/accounts/mock-accounts.d.ts.map +1 -0
- package/dist/accounts/mock-accounts.js +434 -0
- package/dist/accounts/mock-accounts.js.map +1 -0
- package/dist/accounts/types.d.ts +180 -0
- package/dist/accounts/types.d.ts.map +1 -0
- package/dist/accounts/types.js +59 -0
- package/dist/accounts/types.js.map +1 -0
- package/dist/auth/auth-client.d.ts +224 -0
- package/dist/auth/auth-client.d.ts.map +1 -0
- package/dist/auth/auth-client.js +230 -0
- package/dist/auth/auth-client.js.map +1 -0
- package/dist/auth/base-auth.d.ts +44 -0
- package/dist/auth/base-auth.d.ts.map +1 -0
- package/dist/auth/base-auth.js +55 -0
- package/dist/auth/base-auth.js.map +1 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/methods/admin.d.ts +59 -0
- package/dist/auth/methods/admin.d.ts.map +1 -0
- package/dist/auth/methods/admin.js +55 -0
- package/dist/auth/methods/admin.js.map +1 -0
- package/dist/auth/methods/index.d.ts +9 -0
- package/dist/auth/methods/index.d.ts.map +1 -0
- package/dist/auth/methods/index.js +8 -0
- package/dist/auth/methods/index.js.map +1 -0
- package/dist/auth/methods/magic-link.d.ts +27 -0
- package/dist/auth/methods/magic-link.d.ts.map +1 -0
- package/dist/auth/methods/magic-link.js +37 -0
- package/dist/auth/methods/magic-link.js.map +1 -0
- package/dist/auth/methods/mfa.d.ts +92 -0
- package/dist/auth/methods/mfa.d.ts.map +1 -0
- package/dist/auth/methods/mfa.js +153 -0
- package/dist/auth/methods/mfa.js.map +1 -0
- package/dist/auth/methods/oauth.d.ts +62 -0
- package/dist/auth/methods/oauth.d.ts.map +1 -0
- package/dist/auth/methods/oauth.js +165 -0
- package/dist/auth/methods/oauth.js.map +1 -0
- package/dist/auth/methods/otp.d.ts +43 -0
- package/dist/auth/methods/otp.d.ts.map +1 -0
- package/dist/auth/methods/otp.js +66 -0
- package/dist/auth/methods/otp.js.map +1 -0
- package/dist/auth/methods/password.d.ts +64 -0
- package/dist/auth/methods/password.d.ts.map +1 -0
- package/dist/auth/methods/password.js +116 -0
- package/dist/auth/methods/password.js.map +1 -0
- package/dist/auth/methods/recovery.d.ts +62 -0
- package/dist/auth/methods/recovery.d.ts.map +1 -0
- package/dist/auth/methods/recovery.js +100 -0
- package/dist/auth/methods/recovery.js.map +1 -0
- package/dist/auth/mock-auth.d.ts +135 -0
- package/dist/auth/mock-auth.d.ts.map +1 -0
- package/dist/auth/mock-auth.js +417 -0
- package/dist/auth/mock-auth.js.map +1 -0
- package/dist/auth/server/helpers.d.ts +215 -0
- package/dist/auth/server/helpers.d.ts.map +1 -0
- package/dist/auth/server/helpers.js +241 -0
- package/dist/auth/server/helpers.js.map +1 -0
- package/dist/auth/server/index.d.ts +24 -0
- package/dist/auth/server/index.d.ts.map +1 -0
- package/dist/auth/server/index.js +40 -0
- package/dist/auth/server/index.js.map +1 -0
- package/dist/auth/server/middleware.d.ts +305 -0
- package/dist/auth/server/middleware.d.ts.map +1 -0
- package/dist/auth/server/middleware.js +405 -0
- package/dist/auth/server/middleware.js.map +1 -0
- package/dist/auth/server/verify.d.ts +184 -0
- package/dist/auth/server/verify.d.ts.map +1 -0
- package/dist/auth/server/verify.js +222 -0
- package/dist/auth/server/verify.js.map +1 -0
- package/dist/auth/token-manager.d.ts +94 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +231 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/auth/types.d.ts +412 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +66 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/user/identities.d.ts +62 -0
- package/dist/auth/user/identities.d.ts.map +1 -0
- package/dist/auth/user/identities.js +88 -0
- package/dist/auth/user/identities.js.map +1 -0
- package/dist/auth/user/index.d.ts +4 -0
- package/dist/auth/user/index.d.ts.map +1 -0
- package/dist/auth/user/index.js +4 -0
- package/dist/auth/user/index.js.map +1 -0
- package/dist/auth/user/user.d.ts +64 -0
- package/dist/auth/user/user.d.ts.map +1 -0
- package/dist/auth/user/user.js +105 -0
- package/dist/auth/user/user.js.map +1 -0
- package/dist/auth/user/verification.d.ts +49 -0
- package/dist/auth/user/verification.d.ts.map +1 -0
- package/dist/auth/user/verification.js +71 -0
- package/dist/auth/user/verification.js.map +1 -0
- package/dist/cli/browser.d.ts +11 -0
- package/dist/cli/browser.d.ts.map +1 -0
- package/dist/cli/browser.js +35 -0
- package/dist/cli/browser.js.map +1 -0
- package/dist/cli/callback-server.d.ts +30 -0
- package/dist/cli/callback-server.d.ts.map +1 -0
- package/dist/cli/callback-server.js +100 -0
- package/dist/cli/callback-server.js.map +1 -0
- package/dist/cli/file-token-store.d.ts +79 -0
- package/dist/cli/file-token-store.d.ts.map +1 -0
- package/dist/cli/file-token-store.js +138 -0
- package/dist/cli/file-token-store.js.map +1 -0
- package/dist/cli/index.d.ts +33 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/oauth.d.ts +67 -0
- package/dist/cli/oauth.d.ts.map +1 -0
- package/dist/cli/oauth.js +101 -0
- package/dist/cli/oauth.js.map +1 -0
- package/dist/cli/pkce.d.ts +35 -0
- package/dist/cli/pkce.d.ts.map +1 -0
- package/dist/cli/pkce.js +43 -0
- package/dist/cli/pkce.js.map +1 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +99 -0
- package/dist/client.js.map +1 -0
- package/dist/db/client.d.ts +9 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +19 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/errors.d.ts +19 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +57 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +5 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/mock.d.ts +28 -0
- package/dist/db/mock.d.ts.map +1 -0
- package/dist/db/mock.js +459 -0
- package/dist/db/mock.js.map +1 -0
- package/dist/db/types.d.ts +73 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/errors.d.ts +33 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +76 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/http.d.ts +81 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +163 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/keys.d.ts +87 -0
- package/dist/lib/keys.d.ts.map +1 -0
- package/dist/lib/keys.js +147 -0
- package/dist/lib/keys.js.map +1 -0
- package/dist/lib/paths.d.ts +37 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +49 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/token-store.d.ts +42 -0
- package/dist/lib/token-store.d.ts.map +1 -0
- package/dist/lib/token-store.js +75 -0
- package/dist/lib/token-store.js.map +1 -0
- package/dist/mocks/handlers.d.ts +29 -0
- package/dist/mocks/handlers.d.ts.map +1 -0
- package/dist/mocks/handlers.js +79 -0
- package/dist/mocks/handlers.js.map +1 -0
- package/dist/mocks/index.d.ts +5 -0
- package/dist/mocks/index.d.ts.map +1 -0
- package/dist/mocks/index.js +9 -0
- package/dist/mocks/index.js.map +1 -0
- package/dist/mocks/responses.d.ts +76 -0
- package/dist/mocks/responses.d.ts.map +1 -0
- package/dist/mocks/responses.js +91 -0
- package/dist/mocks/responses.js.map +1 -0
- package/dist/mocks/server.d.ts +7 -0
- package/dist/mocks/server.d.ts.map +1 -0
- package/dist/mocks/server.js +9 -0
- package/dist/mocks/server.js.map +1 -0
- package/dist/mocks/state.d.ts +86 -0
- package/dist/mocks/state.d.ts.map +1 -0
- package/dist/mocks/state.js +77 -0
- package/dist/mocks/state.js.map +1 -0
- package/dist/storage/bucket-ref.d.ts +183 -0
- package/dist/storage/bucket-ref.d.ts.map +1 -0
- package/dist/storage/bucket-ref.js +529 -0
- package/dist/storage/bucket-ref.js.map +1 -0
- package/dist/storage/errors.d.ts +27 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +89 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +13 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +11 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/interface.d.ts +245 -0
- package/dist/storage/interface.d.ts.map +1 -0
- package/dist/storage/interface.js +2 -0
- package/dist/storage/interface.js.map +1 -0
- package/dist/storage/mock-storage.d.ts +67 -0
- package/dist/storage/mock-storage.d.ts.map +1 -0
- package/dist/storage/mock-storage.js +478 -0
- package/dist/storage/mock-storage.js.map +1 -0
- package/dist/storage/policies-client.d.ts +77 -0
- package/dist/storage/policies-client.d.ts.map +1 -0
- package/dist/storage/policies-client.js +115 -0
- package/dist/storage/policies-client.js.map +1 -0
- package/dist/storage/policy-templates.d.ts +6 -0
- package/dist/storage/policy-templates.d.ts.map +1 -0
- package/dist/storage/policy-templates.js +290 -0
- package/dist/storage/policy-templates.js.map +1 -0
- package/dist/storage/policy-types.d.ts +98 -0
- package/dist/storage/policy-types.d.ts.map +1 -0
- package/dist/storage/policy-types.js +20 -0
- package/dist/storage/policy-types.js.map +1 -0
- package/dist/storage/storage-client.d.ts +32 -0
- package/dist/storage/storage-client.d.ts.map +1 -0
- package/dist/storage/storage-client.js +94 -0
- package/dist/storage/storage-client.js.map +1 -0
- package/dist/storage/tus-upload.d.ts +56 -0
- package/dist/storage/tus-upload.d.ts.map +1 -0
- package/dist/storage/tus-upload.js +236 -0
- package/dist/storage/tus-upload.js.map +1 -0
- package/dist/storage/types.d.ts +335 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +39 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/test/auth/helpers.d.ts +33 -0
- package/dist/test/auth/helpers.d.ts.map +1 -0
- package/dist/test/auth/helpers.js +80 -0
- package/dist/test/auth/helpers.js.map +1 -0
- package/dist/test/helpers/jwt.d.ts +61 -0
- package/dist/test/helpers/jwt.d.ts.map +1 -0
- package/dist/test/helpers/jwt.js +132 -0
- package/dist/test/helpers/jwt.js.map +1 -0
- package/dist/test/helpers/mailpit.d.ts +61 -0
- package/dist/test/helpers/mailpit.d.ts.map +1 -0
- package/dist/test/helpers/mailpit.js +107 -0
- package/dist/test/helpers/mailpit.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +17 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- 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"}
|
package/dist/cli/pkce.js
ADDED
|
@@ -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"}
|
package/dist/client.d.ts
ADDED
|
@@ -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
|