@taruvi/sdk 1.3.3 → 1.3.4-beta.0
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/.claude/settings.local.json +19 -0
- package/.kiro/settings/lsp.json +198 -0
- package/MODULE_NAMING_CHANGES.md +81 -0
- package/PARAMETER_NAMING_CHANGES.md +106 -0
- package/README.md +4 -4
- package/USAGE_EXAMPLE.md +86 -0
- package/package.json +10 -9
- package/{dist/client.js → src/client.ts} +59 -39
- package/src/index.ts +54 -0
- package/src/lib/analytics/AnalyticsClient.ts +24 -0
- package/src/lib/analytics/types.ts +8 -0
- package/src/lib/app/AppClient.ts +54 -0
- package/src/lib/app/types.ts +50 -0
- package/{dist/lib/auth/AuthClient.js → src/lib/auth/AuthClient.ts} +106 -70
- package/src/lib/auth/types.ts +111 -0
- package/src/lib/database/DatabaseClient.ts +148 -0
- package/src/lib/database/types.ts +46 -0
- package/src/lib/functions/FunctionsClient.ts +27 -0
- package/src/lib/functions/types.ts +25 -0
- package/src/lib/graphs/GraphClient.ts +106 -0
- package/src/lib/graphs/types.ts +33 -0
- package/src/lib/policy/PolicyClient.ts +79 -0
- package/src/lib/policy/types.ts +40 -0
- package/src/lib/secrets/SecretsClient.ts +75 -0
- package/src/lib/secrets/types.ts +59 -0
- package/src/lib/settings/SettingsClient.ts +14 -0
- package/src/lib/settings/types.ts +9 -0
- package/src/lib/storage/StorageClient.ts +123 -0
- package/src/lib/storage/types.ts +86 -0
- package/src/lib/users/UserClient.ts +55 -0
- package/src/lib/users/types.ts +104 -0
- package/src/lib-internal/errors/ErrorClient.ts +102 -0
- package/src/lib-internal/errors/index.ts +3 -0
- package/src/lib-internal/errors/types.ts +28 -0
- package/src/lib-internal/http/HttpClient.ts +129 -0
- package/{dist/lib-internal/http/types.js → src/lib-internal/http/types.ts} +3 -2
- package/src/lib-internal/routes/AnalyticsRoutes.ts +3 -0
- package/src/lib-internal/routes/AppRoutes.ts +9 -0
- package/src/lib-internal/routes/AuthRoutes.ts +0 -0
- package/src/lib-internal/routes/DatabaseRoutes.ts +9 -0
- package/src/lib-internal/routes/FunctionRoutes.ts +3 -0
- package/src/lib-internal/routes/GraphRoutes.ts +14 -0
- package/src/lib-internal/routes/PolicyRoutes.ts +4 -0
- package/src/lib-internal/routes/SecretsRoutes.ts +5 -0
- package/{dist/lib-internal/routes/SettingsRoutes.js → src/lib-internal/routes/SettingsRoutes.ts} +1 -2
- package/src/lib-internal/routes/StorageRoutes.ts +15 -0
- package/src/lib-internal/routes/UserRoutes.ts +11 -0
- package/src/lib-internal/routes/index.ts +0 -0
- package/{dist/lib-internal/token/TokenClient.js → src/lib-internal/token/TokenClient.ts} +144 -99
- package/src/lib-internal/token/types.ts +0 -0
- package/src/types.ts +90 -0
- package/{dist/utils/enums.js → src/utils/enums.ts} +10 -4
- package/src/utils/utils.ts +37 -0
- package/tests/fixtures/mockClient.ts +19 -0
- package/tests/mocks/db.json +1 -0
- package/tests/unit/analytics/AnalyticsClient.test.ts +84 -0
- package/tests/unit/app/AppClient.test.ts +114 -0
- package/tests/unit/auth/AuthClient.test.ts +131 -0
- package/tests/unit/client/Client.test.ts +70 -0
- package/tests/unit/database/DatabaseClient.test.ts +304 -0
- package/tests/unit/edge-cases/robustness.test.ts +259 -0
- package/tests/unit/errors/errors.test.ts +209 -0
- package/tests/unit/functions/FunctionsClient.test.ts +99 -0
- package/tests/unit/graphs/GraphClient.test.ts +329 -0
- package/tests/unit/policy/PolicyClient.test.ts +184 -0
- package/tests/unit/secrets/SecretsClient.test.ts +146 -0
- package/tests/unit/settings/SettingsClient.test.ts +50 -0
- package/tests/unit/storage/StorageClient.test.ts +251 -0
- package/tests/unit/users/UserClient.test.ts +150 -0
- package/tsconfig.json +43 -0
- package/vitest.config.ts +7 -0
- package/dist/client.d.ts +0 -29
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/index.d.ts +0 -25
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -15
- package/dist/index.js.map +0 -1
- package/dist/lib/Analytics/AnalyticsClient.d.ts +0 -9
- package/dist/lib/Analytics/AnalyticsClient.d.ts.map +0 -1
- package/dist/lib/Analytics/AnalyticsClient.js +0 -17
- package/dist/lib/Analytics/AnalyticsClient.js.map +0 -1
- package/dist/lib/Analytics/types.d.ts +0 -7
- package/dist/lib/Analytics/types.d.ts.map +0 -1
- package/dist/lib/Analytics/types.js +0 -2
- package/dist/lib/Analytics/types.js.map +0 -1
- package/dist/lib/App/AppClient.d.ts +0 -15
- package/dist/lib/App/AppClient.d.ts.map +0 -1
- package/dist/lib/App/AppClient.js +0 -41
- package/dist/lib/App/AppClient.js.map +0 -1
- package/dist/lib/App/types.d.ts +0 -36
- package/dist/lib/App/types.d.ts.map +0 -1
- package/dist/lib/App/types.js +0 -2
- package/dist/lib/App/types.js.map +0 -1
- package/dist/lib/Database/DatabaseClient.d.ts +0 -28
- package/dist/lib/Database/DatabaseClient.d.ts.map +0 -1
- package/dist/lib/Database/DatabaseClient.js +0 -116
- package/dist/lib/Database/DatabaseClient.js.map +0 -1
- package/dist/lib/Database/types.d.ts +0 -24
- package/dist/lib/Database/types.d.ts.map +0 -1
- package/dist/lib/Database/types.js +0 -2
- package/dist/lib/Database/types.js.map +0 -1
- package/dist/lib/Function/FunctionsClient.d.ts +0 -9
- package/dist/lib/Function/FunctionsClient.d.ts.map +0 -1
- package/dist/lib/Function/FunctionsClient.js +0 -20
- package/dist/lib/Function/FunctionsClient.js.map +0 -1
- package/dist/lib/Function/types.d.ts +0 -16
- package/dist/lib/Function/types.d.ts.map +0 -1
- package/dist/lib/Function/types.js +0 -2
- package/dist/lib/Function/types.js.map +0 -1
- package/dist/lib/Graphs/GraphClient.d.ts +0 -26
- package/dist/lib/Graphs/GraphClient.d.ts.map +0 -1
- package/dist/lib/Graphs/GraphClient.js +0 -86
- package/dist/lib/Graphs/GraphClient.js.map +0 -1
- package/dist/lib/Graphs/types.d.ts +0 -23
- package/dist/lib/Graphs/types.d.ts.map +0 -1
- package/dist/lib/Graphs/types.js +0 -2
- package/dist/lib/Graphs/types.js.map +0 -1
- package/dist/lib/Policy/PolicyClient.d.ts +0 -9
- package/dist/lib/Policy/PolicyClient.d.ts.map +0 -1
- package/dist/lib/Policy/PolicyClient.js +0 -24
- package/dist/lib/Policy/PolicyClient.js.map +0 -1
- package/dist/lib/Policy/types.d.ts +0 -22
- package/dist/lib/Policy/types.d.ts.map +0 -1
- package/dist/lib/Policy/types.js +0 -2
- package/dist/lib/Policy/types.js.map +0 -1
- package/dist/lib/Secrets/SecretsClient.d.ts +0 -14
- package/dist/lib/Secrets/SecretsClient.d.ts.map +0 -1
- package/dist/lib/Secrets/SecretsClient.js +0 -32
- package/dist/lib/Secrets/SecretsClient.js.map +0 -1
- package/dist/lib/Secrets/types.d.ts +0 -13
- package/dist/lib/Secrets/types.d.ts.map +0 -1
- package/dist/lib/Secrets/types.js +0 -2
- package/dist/lib/Secrets/types.js.map +0 -1
- package/dist/lib/Settings/SettingsClient.d.ts +0 -7
- package/dist/lib/Settings/SettingsClient.d.ts.map +0 -1
- package/dist/lib/Settings/SettingsClient.js +0 -11
- package/dist/lib/Settings/SettingsClient.js.map +0 -1
- package/dist/lib/Settings/types.d.ts +0 -4
- package/dist/lib/Settings/types.d.ts.map +0 -1
- package/dist/lib/Settings/types.js +0 -2
- package/dist/lib/Settings/types.js.map +0 -1
- package/dist/lib/Storage/StorageClient.d.ts +0 -26
- package/dist/lib/Storage/StorageClient.d.ts.map +0 -1
- package/dist/lib/Storage/StorageClient.js +0 -78
- package/dist/lib/Storage/StorageClient.js.map +0 -1
- package/dist/lib/Storage/types.d.ts +0 -35
- package/dist/lib/Storage/types.d.ts.map +0 -1
- package/dist/lib/Storage/types.js +0 -2
- package/dist/lib/Storage/types.js.map +0 -1
- package/dist/lib/auth/AuthClient.d.ts +0 -66
- package/dist/lib/auth/AuthClient.d.ts.map +0 -1
- package/dist/lib/auth/AuthClient.js.map +0 -1
- package/dist/lib/auth/types.d.ts +0 -9
- package/dist/lib/auth/types.d.ts.map +0 -1
- package/dist/lib/auth/types.js +0 -2
- package/dist/lib/auth/types.js.map +0 -1
- package/dist/lib/user/UserClient.d.ts +0 -16
- package/dist/lib/user/UserClient.d.ts.map +0 -1
- package/dist/lib/user/UserClient.js +0 -41
- package/dist/lib/user/UserClient.js.map +0 -1
- package/dist/lib/user/types.d.ts +0 -100
- package/dist/lib/user/types.d.ts.map +0 -1
- package/dist/lib/user/types.js +0 -2
- package/dist/lib/user/types.js.map +0 -1
- package/dist/lib-internal/errors/ErrorClient.d.ts +0 -4
- package/dist/lib-internal/errors/ErrorClient.d.ts.map +0 -1
- package/dist/lib-internal/errors/ErrorClient.js +0 -6
- package/dist/lib-internal/errors/ErrorClient.js.map +0 -1
- package/dist/lib-internal/errors/index.d.ts +0 -8
- package/dist/lib-internal/errors/index.d.ts.map +0 -1
- package/dist/lib-internal/errors/index.js +0 -23
- package/dist/lib-internal/errors/index.js.map +0 -1
- package/dist/lib-internal/errors/types.d.ts +0 -83
- package/dist/lib-internal/errors/types.d.ts.map +0 -1
- package/dist/lib-internal/errors/types.js +0 -65
- package/dist/lib-internal/errors/types.js.map +0 -1
- package/dist/lib-internal/http/HttpClient.d.ts +0 -22
- package/dist/lib-internal/http/HttpClient.d.ts.map +0 -1
- package/dist/lib-internal/http/HttpClient.js +0 -65
- package/dist/lib-internal/http/HttpClient.js.map +0 -1
- package/dist/lib-internal/http/types.d.ts +0 -12
- package/dist/lib-internal/http/types.d.ts.map +0 -1
- package/dist/lib-internal/http/types.js.map +0 -1
- package/dist/lib-internal/routes/AnalyticsRoutes.d.ts +0 -4
- package/dist/lib-internal/routes/AnalyticsRoutes.d.ts.map +0 -1
- package/dist/lib-internal/routes/AnalyticsRoutes.js +0 -4
- package/dist/lib-internal/routes/AnalyticsRoutes.js.map +0 -1
- package/dist/lib-internal/routes/AppRoutes.d.ts +0 -10
- package/dist/lib-internal/routes/AppRoutes.d.ts.map +0 -1
- package/dist/lib-internal/routes/AppRoutes.js +0 -6
- package/dist/lib-internal/routes/AppRoutes.js.map +0 -1
- package/dist/lib-internal/routes/AuthRoutes.d.ts +0 -2
- package/dist/lib-internal/routes/AuthRoutes.d.ts.map +0 -1
- package/dist/lib-internal/routes/AuthRoutes.js +0 -2
- package/dist/lib-internal/routes/AuthRoutes.js.map +0 -1
- package/dist/lib-internal/routes/DatabaseRoutes.d.ts +0 -10
- package/dist/lib-internal/routes/DatabaseRoutes.d.ts.map +0 -1
- package/dist/lib-internal/routes/DatabaseRoutes.js +0 -6
- package/dist/lib-internal/routes/DatabaseRoutes.js.map +0 -1
- package/dist/lib-internal/routes/FunctionRoutes.d.ts +0 -4
- package/dist/lib-internal/routes/FunctionRoutes.d.ts.map +0 -1
- package/dist/lib-internal/routes/FunctionRoutes.js +0 -4
- package/dist/lib-internal/routes/FunctionRoutes.js.map +0 -1
- package/dist/lib-internal/routes/GraphRoutes.d.ts +0 -14
- package/dist/lib-internal/routes/GraphRoutes.d.ts.map +0 -1
- package/dist/lib-internal/routes/GraphRoutes.js +0 -11
- package/dist/lib-internal/routes/GraphRoutes.js.map +0 -1
- package/dist/lib-internal/routes/PolicyRoutes.d.ts +0 -5
- package/dist/lib-internal/routes/PolicyRoutes.d.ts.map +0 -1
- package/dist/lib-internal/routes/PolicyRoutes.js +0 -5
- package/dist/lib-internal/routes/PolicyRoutes.js.map +0 -1
- package/dist/lib-internal/routes/SecretsRoutes.d.ts +0 -6
- package/dist/lib-internal/routes/SecretsRoutes.d.ts.map +0 -1
- package/dist/lib-internal/routes/SecretsRoutes.js +0 -6
- package/dist/lib-internal/routes/SecretsRoutes.js.map +0 -1
- package/dist/lib-internal/routes/SettingsRoutes.d.ts +0 -4
- package/dist/lib-internal/routes/SettingsRoutes.d.ts.map +0 -1
- package/dist/lib-internal/routes/SettingsRoutes.js.map +0 -1
- package/dist/lib-internal/routes/StorageRoutes.d.ts +0 -11
- package/dist/lib-internal/routes/StorageRoutes.d.ts.map +0 -1
- package/dist/lib-internal/routes/StorageRoutes.js +0 -8
- package/dist/lib-internal/routes/StorageRoutes.js.map +0 -1
- package/dist/lib-internal/routes/UserRoutes.d.ts +0 -11
- package/dist/lib-internal/routes/UserRoutes.d.ts.map +0 -1
- package/dist/lib-internal/routes/UserRoutes.js +0 -11
- package/dist/lib-internal/routes/UserRoutes.js.map +0 -1
- package/dist/lib-internal/routes/index.d.ts +0 -2
- package/dist/lib-internal/routes/index.d.ts.map +0 -1
- package/dist/lib-internal/routes/index.js +0 -2
- package/dist/lib-internal/routes/index.js.map +0 -1
- package/dist/lib-internal/token/TokenClient.d.ts +0 -71
- package/dist/lib-internal/token/TokenClient.d.ts.map +0 -1
- package/dist/lib-internal/token/TokenClient.js.map +0 -1
- package/dist/lib-internal/token/types.d.ts +0 -2
- package/dist/lib-internal/token/types.d.ts.map +0 -1
- package/dist/lib-internal/token/types.js +0 -2
- package/dist/lib-internal/token/types.js.map +0 -1
- package/dist/types.d.ts +0 -49
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils/enums.d.ts +0 -20
- package/dist/utils/enums.d.ts.map +0 -1
- package/dist/utils/enums.js.map +0 -1
- package/dist/utils/utils.d.ts +0 -5
- package/dist/utils/utils.d.ts.map +0 -1
- package/dist/utils/utils.js +0 -32
- package/dist/utils/utils.js.map +0 -1
|
@@ -1,27 +1,37 @@
|
|
|
1
1
|
import { HttpClient } from "./lib-internal/http/HttpClient.js";
|
|
2
|
-
import { TokenClient } from "./lib-internal/token/TokenClient.js";
|
|
2
|
+
import { TokenClient, type AuthTokens } from "./lib-internal/token/TokenClient.js";
|
|
3
|
+
import type { TaruviConfig } from "./types.js";
|
|
4
|
+
|
|
3
5
|
export class Client {
|
|
4
|
-
config
|
|
5
|
-
_httpClient
|
|
6
|
-
_tokenClient
|
|
7
|
-
|
|
6
|
+
private readonly config: TaruviConfig
|
|
7
|
+
private readonly _httpClient: HttpClient
|
|
8
|
+
private readonly _tokenClient: TokenClient
|
|
9
|
+
|
|
10
|
+
constructor(config: TaruviConfig) {
|
|
8
11
|
if (!config) {
|
|
9
|
-
throw new Error("Config is required")
|
|
12
|
+
throw new Error("Config is required")
|
|
10
13
|
}
|
|
14
|
+
|
|
11
15
|
if (!config.apiKey) {
|
|
12
|
-
throw new Error("API key is required")
|
|
16
|
+
throw new Error("API key is required")
|
|
13
17
|
}
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
|
|
19
|
+
if (!config.apiUrl) {
|
|
20
|
+
throw new Error("API URL is required")
|
|
16
21
|
}
|
|
17
|
-
|
|
22
|
+
|
|
23
|
+
this.config = config
|
|
24
|
+
|
|
18
25
|
// Internal clients for SDK use only
|
|
19
26
|
// TokenClient must be created first, then passed to HttpClient
|
|
20
|
-
|
|
21
|
-
this.
|
|
27
|
+
|
|
28
|
+
this._tokenClient = new TokenClient(config.token)
|
|
29
|
+
this._httpClient = new HttpClient(this.config, this._tokenClient)
|
|
30
|
+
|
|
22
31
|
// Check URL hash for tokens (OAuth callback)
|
|
23
|
-
this.extractTokensFromUrl()
|
|
32
|
+
this.extractTokensFromUrl()
|
|
24
33
|
}
|
|
34
|
+
|
|
25
35
|
/**
|
|
26
36
|
* Extracts authentication tokens from URL hash and stores them using TokenClient.
|
|
27
37
|
* This handles Web UI Flow callback URLs like:
|
|
@@ -29,59 +39,69 @@ export class Client {
|
|
|
29
39
|
*
|
|
30
40
|
* After successful extraction, the URL hash is cleared to prevent token exposure.
|
|
31
41
|
*/
|
|
32
|
-
extractTokensFromUrl() {
|
|
42
|
+
private extractTokensFromUrl(): void {
|
|
33
43
|
if (typeof window === "undefined" || typeof localStorage === "undefined") {
|
|
34
|
-
return
|
|
44
|
+
return
|
|
35
45
|
}
|
|
36
|
-
|
|
46
|
+
|
|
47
|
+
const hash = window.location.hash
|
|
37
48
|
if (!hash) {
|
|
38
|
-
return
|
|
49
|
+
return
|
|
39
50
|
}
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const
|
|
51
|
+
|
|
52
|
+
const params = new URLSearchParams(hash.substring(1))
|
|
53
|
+
const sessionToken = params.get("session_token")
|
|
54
|
+
const accessToken = params.get("access_token")
|
|
55
|
+
const refreshToken = params.get("refresh_token")
|
|
56
|
+
const expiresIn = params.get("expires_in")
|
|
57
|
+
const tokenType = params.get("token_type")
|
|
58
|
+
|
|
46
59
|
// Only proceed if we have the required tokens
|
|
47
60
|
if (!accessToken || !refreshToken) {
|
|
48
|
-
return
|
|
61
|
+
return
|
|
49
62
|
}
|
|
63
|
+
|
|
50
64
|
// Store tokens using TokenClient
|
|
51
|
-
const tokens = {
|
|
65
|
+
const tokens: AuthTokens = {
|
|
52
66
|
accessToken,
|
|
53
67
|
refreshToken,
|
|
54
68
|
tokenType: tokenType || "Bearer"
|
|
55
|
-
}
|
|
69
|
+
}
|
|
70
|
+
|
|
56
71
|
if (sessionToken) {
|
|
57
|
-
tokens.sessionToken = sessionToken
|
|
72
|
+
tokens.sessionToken = sessionToken
|
|
58
73
|
}
|
|
74
|
+
|
|
59
75
|
if (expiresIn) {
|
|
60
|
-
tokens.expiresIn = parseInt(expiresIn, 10)
|
|
76
|
+
tokens.expiresIn = parseInt(expiresIn, 10)
|
|
61
77
|
}
|
|
62
|
-
|
|
78
|
+
|
|
79
|
+
this._tokenClient.setTokens(tokens)
|
|
80
|
+
|
|
63
81
|
// Clear hash from URL without reloading page
|
|
64
82
|
if (window.history && window.history.replaceState) {
|
|
65
|
-
const urlWithoutHash = window.location.pathname + window.location.search
|
|
66
|
-
window.history.replaceState(null, "", urlWithoutHash)
|
|
83
|
+
const urlWithoutHash = window.location.pathname + window.location.search
|
|
84
|
+
window.history.replaceState(null, "", urlWithoutHash)
|
|
67
85
|
}
|
|
68
86
|
}
|
|
87
|
+
|
|
69
88
|
/**
|
|
70
89
|
* @internal
|
|
71
90
|
* Internal use only - not part of public API
|
|
72
91
|
*/
|
|
73
|
-
get httpClient() {
|
|
74
|
-
return this._httpClient
|
|
92
|
+
get httpClient(): HttpClient {
|
|
93
|
+
return this._httpClient
|
|
75
94
|
}
|
|
95
|
+
|
|
76
96
|
/**
|
|
77
97
|
* @internal
|
|
78
98
|
* Internal use only - not part of public API
|
|
79
99
|
*/
|
|
80
|
-
get tokenClient() {
|
|
81
|
-
return this._tokenClient
|
|
100
|
+
get tokenClient(): TokenClient {
|
|
101
|
+
return this._tokenClient
|
|
82
102
|
}
|
|
83
|
-
|
|
84
|
-
|
|
103
|
+
|
|
104
|
+
getConfig(): Readonly<TaruviConfig> {
|
|
105
|
+
return { ...this.config }
|
|
85
106
|
}
|
|
86
|
-
}
|
|
87
|
-
//# sourceMappingURL=client.js.map
|
|
107
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Export main client
|
|
2
|
+
export { Client } from "./client.js"
|
|
3
|
+
|
|
4
|
+
// Export error classes
|
|
5
|
+
export { TaruviError, ValidationError, AuthError, ForbiddenError, NotFoundError, ConflictError, TimeoutError, NetworkError } from "./lib-internal/errors/index.js"
|
|
6
|
+
export { ErrorCode } from "./lib-internal/errors/index.js"
|
|
7
|
+
export type { ErrorResponseBody } from "./lib-internal/errors/index.js"
|
|
8
|
+
|
|
9
|
+
// Export public client classes
|
|
10
|
+
export { Auth } from "./lib/auth/AuthClient.js"
|
|
11
|
+
export { User } from "./lib/users/UserClient.js"
|
|
12
|
+
export { Storage } from "./lib/storage/StorageClient.js"
|
|
13
|
+
export { Database } from "./lib/database/DatabaseClient.js"
|
|
14
|
+
export { Settings } from "./lib/settings/SettingsClient.js"
|
|
15
|
+
export { Functions } from "./lib/functions/FunctionsClient.js"
|
|
16
|
+
export { Secrets } from "./lib/secrets/SecretsClient.js"
|
|
17
|
+
export { Policy } from "./lib/policy/PolicyClient.js"
|
|
18
|
+
export { App } from "./lib/app/AppClient.js"
|
|
19
|
+
export { Analytics } from "./lib/analytics/AnalyticsClient.js"
|
|
20
|
+
export { Graph } from "./lib/graphs/GraphClient.js"
|
|
21
|
+
|
|
22
|
+
// Export core types
|
|
23
|
+
export type { TaruviConfig, TaruviResponse, PaginationInfo, StorageFilters, DatabaseFilters } from "./types.js"
|
|
24
|
+
export type { AuthTokens } from "./lib-internal/token/TokenClient.js"
|
|
25
|
+
|
|
26
|
+
// User types
|
|
27
|
+
export type { UserCreateRequest, UserData, UserUpdateRequest, UserListFilters, UserApp, UserResponse, UserListResponse, UserAppsResponse, AssignRolesRequest, RevokeRolesRequest, RolesResponse, UserGroup, UserPermission, UserRole } from "./lib/users/types.js"
|
|
28
|
+
|
|
29
|
+
// Policy types
|
|
30
|
+
export type { Principal, Resource, Resources, PolicyCheckResult, PolicyCheckBatchResult, ResourceCheckResponse } from "./lib/policy/types.js"
|
|
31
|
+
|
|
32
|
+
// App types
|
|
33
|
+
export type { RoleData, AppSettingsData, RoleResponse, RolesListResponse, AppSettingsResponse } from "./lib/app/types.js"
|
|
34
|
+
|
|
35
|
+
// Function types
|
|
36
|
+
export type { FunctionRequest, FunctionResponse, FunctionInvocation } from "./lib/functions/types.js"
|
|
37
|
+
|
|
38
|
+
// Database types
|
|
39
|
+
export type { DatabaseRequest, DatabaseResponse, DatabaseSingleResponse, FilterOperator, SortOrder } from "./lib/database/types.js"
|
|
40
|
+
|
|
41
|
+
// Storage types
|
|
42
|
+
export type { StorageRequest, StorageUpdateRequest, StorageObject, StorageResponse, StorageListResponse, StorageUploadBatchResponse, StorageDeleteBatchResponse } from "./lib/storage/types.js"
|
|
43
|
+
|
|
44
|
+
// Settings types
|
|
45
|
+
export type { SiteSettingsData, SettingsResponse } from "./lib/settings/types.js"
|
|
46
|
+
|
|
47
|
+
// Secrets types
|
|
48
|
+
export type { SecretCreateRequest, SecretUpdateRequest, SecretData, SecretResponse, SecretsListResponse, SecretsBatchResponse, SecretsBatchMetadataResponse, GetSecretOptions, GetSecretsOptions } from "./lib/secrets/types.js"
|
|
49
|
+
|
|
50
|
+
// Analytics types
|
|
51
|
+
export type { AnalyticsRequest, AnalyticsResponse } from "./lib/analytics/types.js"
|
|
52
|
+
|
|
53
|
+
// Graph types
|
|
54
|
+
export type { GraphInclude, GraphFormat, GraphQueryParams, EdgeRequest, EdgeResponse, EdgeDeleteRequest } from "./lib/graphs/types.js"
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Client } from "../../client.js";
|
|
2
|
+
import type { TaruviConfig } from "../../types.js";
|
|
3
|
+
import type { AnalyticsRequest, AnalyticsResponse } from "./types.js";
|
|
4
|
+
import { AnalyticsRoutes } from "../../lib-internal/routes/AnalyticsRoutes.js";
|
|
5
|
+
|
|
6
|
+
export class Analytics {
|
|
7
|
+
private client: Client
|
|
8
|
+
private config: TaruviConfig
|
|
9
|
+
|
|
10
|
+
constructor(client: Client) {
|
|
11
|
+
this.client = client
|
|
12
|
+
this.config = this.client.getConfig()
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async execute<T = unknown>(querySlug: string, options: AnalyticsRequest = {}): Promise<AnalyticsResponse<T>> {
|
|
16
|
+
const url = AnalyticsRoutes.baseUrl(this.config.appSlug, querySlug)
|
|
17
|
+
|
|
18
|
+
const body = {
|
|
19
|
+
params: options.params || {}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return await this.client.httpClient.post<AnalyticsResponse<T>>(url, body)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { Client } from "../../client.js";
|
|
2
|
+
import { AppRoutes, type AppRouteKey } from "../../lib-internal/routes/AppRoutes.js";
|
|
3
|
+
import { HttpMethod } from "../../lib-internal/http/types.js";
|
|
4
|
+
import type { TaruviConfig } from "../../types.js";
|
|
5
|
+
import type { UrlParams } from "./types.js";
|
|
6
|
+
|
|
7
|
+
export class App {
|
|
8
|
+
private client: Client
|
|
9
|
+
private urlParams: UrlParams
|
|
10
|
+
private config: TaruviConfig
|
|
11
|
+
private operation: HttpMethod | undefined
|
|
12
|
+
|
|
13
|
+
constructor(client: Client, urlParams: UrlParams = {}, operation?: HttpMethod | undefined) {
|
|
14
|
+
this.client = client
|
|
15
|
+
this.urlParams = urlParams
|
|
16
|
+
this.operation = operation
|
|
17
|
+
this.config = this.client.getConfig()
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
roles() {
|
|
21
|
+
return new App(this.client, { ...this.urlParams, roles: "roles" }, HttpMethod.GET)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
settings() {
|
|
25
|
+
return new App(this.client, {...this.urlParams, settings: "settings"}, HttpMethod.GET)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
private buildRoute(): string {
|
|
29
|
+
return (
|
|
30
|
+
AppRoutes.baseUrl(this.config.appSlug) +
|
|
31
|
+
(Object.keys(this.urlParams) as AppRouteKey[]).reduce((acc, key) => {
|
|
32
|
+
const value = this.urlParams[key]
|
|
33
|
+
const routeBuilder = AppRoutes[key]
|
|
34
|
+
|
|
35
|
+
if (value && routeBuilder) {
|
|
36
|
+
acc += routeBuilder()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return acc
|
|
40
|
+
}, "")
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async execute() {
|
|
45
|
+
const url = this.buildRoute()
|
|
46
|
+
const operation = this.operation || HttpMethod.GET
|
|
47
|
+
|
|
48
|
+
switch (operation) {
|
|
49
|
+
case HttpMethod.GET:
|
|
50
|
+
default:
|
|
51
|
+
return await this.client.httpClient.get(url)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Client } from "../../client.js"
|
|
2
|
+
import { HttpMethod } from "../../lib-internal/http/types.js"
|
|
3
|
+
import type { TaruviResponse } from "../../types.js"
|
|
4
|
+
|
|
5
|
+
export type AppOperation = HttpMethod
|
|
6
|
+
|
|
7
|
+
// Internal types
|
|
8
|
+
export interface UrlParams {
|
|
9
|
+
appSlug?: string
|
|
10
|
+
roles?: string
|
|
11
|
+
settings?: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface AppClientInterface {
|
|
15
|
+
client: Client
|
|
16
|
+
urlParams?: UrlParams
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Role data
|
|
20
|
+
export interface RoleData {
|
|
21
|
+
id: string | number
|
|
22
|
+
name: string
|
|
23
|
+
slug: string
|
|
24
|
+
description?: string
|
|
25
|
+
permissions?: string[]
|
|
26
|
+
created_at?: string
|
|
27
|
+
updated_at?: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// App settings data
|
|
31
|
+
export interface AppSettingsData {
|
|
32
|
+
display_name: string
|
|
33
|
+
icon: string | null
|
|
34
|
+
icon_url: string | null
|
|
35
|
+
primary_color: string
|
|
36
|
+
secondary_color: string
|
|
37
|
+
banner_image: string | null
|
|
38
|
+
banner_image_url: string | null
|
|
39
|
+
category: string
|
|
40
|
+
documentation_url: string | null
|
|
41
|
+
support_email: string | null
|
|
42
|
+
default_frontend_worker_url: string | null
|
|
43
|
+
created_at: string
|
|
44
|
+
updated_at: string
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Response types - uses standard wrapper
|
|
48
|
+
export type RoleResponse = TaruviResponse<RoleData>
|
|
49
|
+
export type RolesListResponse = TaruviResponse<RoleData[]>
|
|
50
|
+
export type AppSettingsResponse = TaruviResponse<AppSettingsData>
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import type { Client } from "../../client.js";
|
|
2
|
+
import type { TaruviResponse } from "../../types.js";
|
|
3
|
+
import type { UserData } from "../users/types.js";
|
|
1
4
|
import { UserRoutes } from "../../lib-internal/routes/UserRoutes.js";
|
|
5
|
+
|
|
2
6
|
/**
|
|
3
7
|
* Auth Client - Handles user authentication using Web UI Flow
|
|
4
8
|
* Implements cross-domain authentication with redirect-based token delivery
|
|
@@ -10,109 +14,132 @@ import { UserRoutes } from "../../lib-internal/routes/UserRoutes.js";
|
|
|
10
14
|
* 4. Client extracts and stores tokens automatically
|
|
11
15
|
*/
|
|
12
16
|
export class Auth {
|
|
13
|
-
client
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
private client: Client
|
|
18
|
+
|
|
19
|
+
constructor(client: Client) {
|
|
20
|
+
this.client = client
|
|
16
21
|
}
|
|
22
|
+
|
|
17
23
|
/**
|
|
18
24
|
* Redirect to login page (Web UI Flow)
|
|
19
25
|
* @param callbackUrl - URL to redirect to after successful login (defaults to current page)
|
|
20
26
|
*/
|
|
21
|
-
login(callbackUrl) {
|
|
27
|
+
login(callbackUrl?: string): void {
|
|
22
28
|
if (typeof window === "undefined") {
|
|
23
|
-
console.error("login() can only be called in browser environment")
|
|
24
|
-
return
|
|
29
|
+
console.error("login() can only be called in browser environment")
|
|
30
|
+
return
|
|
25
31
|
}
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
const
|
|
32
|
+
|
|
33
|
+
const config = this.client.getConfig()
|
|
34
|
+
const callback = callbackUrl || window.location.origin + window.location.pathname
|
|
35
|
+
const deskUrl = config.deskUrl || config.apiUrl
|
|
36
|
+
|
|
29
37
|
// Redirect to /accounts/login/ with redirect_to parameter
|
|
30
|
-
const loginUrl = `${deskUrl}/accounts/login/?redirect_to=${encodeURIComponent(callback)}
|
|
38
|
+
const loginUrl = `${deskUrl}/accounts/login/?redirect_to=${encodeURIComponent(callback)}`
|
|
39
|
+
|
|
31
40
|
// Optional: Store state before redirecting
|
|
32
41
|
if (typeof sessionStorage !== "undefined") {
|
|
33
42
|
sessionStorage.setItem("auth_state", JSON.stringify({
|
|
34
43
|
returnTo: window.location.pathname,
|
|
35
44
|
timestamp: Date.now()
|
|
36
|
-
}))
|
|
45
|
+
}))
|
|
37
46
|
}
|
|
38
|
-
|
|
47
|
+
|
|
48
|
+
window.location.href = loginUrl
|
|
39
49
|
}
|
|
50
|
+
|
|
40
51
|
/**
|
|
41
52
|
* Redirect to signup page (Web UI Flow)
|
|
42
53
|
* @param callbackUrl - URL to redirect to after successful signup (defaults to current page)
|
|
43
54
|
*/
|
|
44
|
-
signup(callbackUrl) {
|
|
55
|
+
signup(callbackUrl?: string): void {
|
|
45
56
|
if (typeof window === "undefined") {
|
|
46
|
-
console.error("signup() can only be called in browser environment")
|
|
47
|
-
return
|
|
57
|
+
console.error("signup() can only be called in browser environment")
|
|
58
|
+
return
|
|
48
59
|
}
|
|
49
|
-
|
|
50
|
-
const
|
|
60
|
+
|
|
61
|
+
const config = this.client.getConfig()
|
|
62
|
+
const callback = callbackUrl || window.location.origin + window.location.pathname
|
|
63
|
+
|
|
51
64
|
// Redirect to /accounts/signup/ with redirect_to parameter
|
|
52
|
-
const signupUrl = `${config.
|
|
65
|
+
const signupUrl = `${config.apiUrl}/accounts/signup/?redirect_to=${encodeURIComponent(callback)}`
|
|
66
|
+
|
|
53
67
|
// Optional: Store state before redirecting
|
|
54
68
|
if (typeof sessionStorage !== "undefined") {
|
|
55
69
|
sessionStorage.setItem("auth_state", JSON.stringify({
|
|
56
70
|
returnTo: window.location.pathname,
|
|
57
71
|
timestamp: Date.now()
|
|
58
|
-
}))
|
|
72
|
+
}))
|
|
59
73
|
}
|
|
60
|
-
|
|
74
|
+
|
|
75
|
+
window.location.href = signupUrl
|
|
61
76
|
}
|
|
77
|
+
|
|
62
78
|
/**
|
|
63
79
|
* Logout user and redirect to logout page
|
|
64
80
|
* Fetches frontendUrl from site settings for redirect
|
|
65
81
|
* @param callbackUrl - URL to redirect to after logout (overrides frontendUrl from settings)
|
|
66
82
|
*/
|
|
67
|
-
async logout(callbackUrl) {
|
|
83
|
+
async logout(callbackUrl?: string): Promise<void> {
|
|
68
84
|
if (typeof window === "undefined") {
|
|
69
|
-
console.error("logout() can only be called in browser environment")
|
|
70
|
-
return
|
|
85
|
+
console.error("logout() can only be called in browser environment")
|
|
86
|
+
return
|
|
71
87
|
}
|
|
88
|
+
|
|
72
89
|
// Clear tokens immediately
|
|
73
|
-
this.client.tokenClient.clearTokens()
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
90
|
+
this.client.tokenClient.clearTokens()
|
|
91
|
+
|
|
92
|
+
const config = this.client.getConfig()
|
|
93
|
+
const deskUrl = config.deskUrl || config.apiUrl
|
|
94
|
+
let callback: string = callbackUrl || ""
|
|
95
|
+
|
|
77
96
|
// If no callback provided, fetch frontendUrl from site settings
|
|
78
97
|
if (!callback) {
|
|
79
98
|
try {
|
|
80
|
-
const settings = await this.client.httpClient.get
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
99
|
+
const settings = await this.client.httpClient.get<{ frontend_url?: string }>(
|
|
100
|
+
`api/sites/${config.appSlug}/metadata`
|
|
101
|
+
)
|
|
102
|
+
callback = settings.frontend_url || window.location.origin
|
|
103
|
+
} catch (error) {
|
|
104
|
+
console.error("Failed to fetch site settings, using origin:", error)
|
|
105
|
+
callback = window.location.origin
|
|
86
106
|
}
|
|
87
107
|
}
|
|
108
|
+
|
|
88
109
|
// Redirect to /accounts/logout/
|
|
89
|
-
const logoutUrl = `${deskUrl}/accounts/logout/?redirect_to=${encodeURIComponent(callback)}
|
|
90
|
-
|
|
110
|
+
const logoutUrl = `${deskUrl}/accounts/logout/?redirect_to=${encodeURIComponent(callback)}`
|
|
111
|
+
|
|
112
|
+
window.location.href = logoutUrl
|
|
91
113
|
}
|
|
114
|
+
|
|
92
115
|
/**
|
|
93
116
|
* Check if user is authenticated
|
|
94
117
|
*/
|
|
95
|
-
isUserAuthenticated() {
|
|
96
|
-
return this.client.tokenClient.isAuthenticated()
|
|
118
|
+
isUserAuthenticated(): boolean {
|
|
119
|
+
return this.client.tokenClient.isAuthenticated()
|
|
97
120
|
}
|
|
121
|
+
|
|
98
122
|
/**
|
|
99
123
|
* Get the current access token
|
|
100
124
|
*/
|
|
101
|
-
getAccessToken() {
|
|
102
|
-
return this.client.tokenClient.getToken()
|
|
125
|
+
getAccessToken(): string | null {
|
|
126
|
+
return this.client.tokenClient.getToken()
|
|
103
127
|
}
|
|
128
|
+
|
|
104
129
|
/**
|
|
105
130
|
* Get the current refresh token
|
|
106
131
|
*/
|
|
107
|
-
getRefreshToken() {
|
|
108
|
-
return this.client.tokenClient.getRefreshToken()
|
|
132
|
+
getRefreshToken(): string | null {
|
|
133
|
+
return this.client.tokenClient.getRefreshToken()
|
|
109
134
|
}
|
|
135
|
+
|
|
110
136
|
/**
|
|
111
137
|
* Check if the access token is expired
|
|
112
138
|
*/
|
|
113
|
-
isTokenExpired() {
|
|
114
|
-
return this.client.tokenClient.isTokenExpired()
|
|
139
|
+
isTokenExpired(): boolean {
|
|
140
|
+
return this.client.tokenClient.isTokenExpired()
|
|
115
141
|
}
|
|
142
|
+
|
|
116
143
|
/**
|
|
117
144
|
* Refresh the access token using the refresh token
|
|
118
145
|
* ⚠️ IMPORTANT: Taruvi uses refresh token rotation
|
|
@@ -120,59 +147,68 @@ export class Auth {
|
|
|
120
147
|
*
|
|
121
148
|
* @returns Promise with new tokens or null if refresh failed
|
|
122
149
|
*/
|
|
123
|
-
async refreshAccessToken() {
|
|
124
|
-
const refreshToken = this.client.tokenClient.getRefreshToken()
|
|
150
|
+
async refreshAccessToken(): Promise<{ access: string; refresh: string; expires_in: number } | null> {
|
|
151
|
+
const refreshToken = this.client.tokenClient.getRefreshToken()
|
|
152
|
+
|
|
125
153
|
if (!refreshToken) {
|
|
126
|
-
console.error("No refresh token available")
|
|
127
|
-
return null
|
|
154
|
+
console.error("No refresh token available")
|
|
155
|
+
return null
|
|
128
156
|
}
|
|
157
|
+
|
|
129
158
|
try {
|
|
130
|
-
const config = this.client.getConfig()
|
|
131
|
-
const response = await fetch(`${config.
|
|
159
|
+
const config = this.client.getConfig()
|
|
160
|
+
const response = await fetch(`${config.apiUrl}/api/cloud/auth/jwt/token/refresh/`, {
|
|
132
161
|
method: "POST",
|
|
133
162
|
headers: { "Content-Type": "application/json" },
|
|
134
163
|
body: JSON.stringify({ refresh: refreshToken })
|
|
135
|
-
})
|
|
164
|
+
})
|
|
165
|
+
|
|
136
166
|
if (!response.ok) {
|
|
137
|
-
throw new Error(`Token refresh failed: ${response.statusText}`)
|
|
167
|
+
throw new Error(`Token refresh failed: ${response.statusText}`)
|
|
138
168
|
}
|
|
139
|
-
|
|
169
|
+
|
|
170
|
+
const data = await response.json()
|
|
171
|
+
|
|
140
172
|
// Update tokens in storage (both access and refresh due to rotation)
|
|
141
|
-
this.client.tokenClient.updateAccessToken(data.access, data.expires_in || 172800)
|
|
173
|
+
this.client.tokenClient.updateAccessToken(data.access, data.expires_in || 172800)
|
|
174
|
+
|
|
142
175
|
if (data.refresh) {
|
|
143
|
-
this.client.tokenClient.updateRefreshToken(data.refresh)
|
|
176
|
+
this.client.tokenClient.updateRefreshToken(data.refresh)
|
|
144
177
|
}
|
|
178
|
+
|
|
145
179
|
return {
|
|
146
180
|
access: data.access,
|
|
147
181
|
refresh: data.refresh || refreshToken,
|
|
148
182
|
expires_in: data.expires_in || 172800
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
|
|
183
|
+
}
|
|
184
|
+
} catch (error) {
|
|
185
|
+
console.error("Failed to refresh access token:", error)
|
|
186
|
+
|
|
153
187
|
// Clear tokens and redirect to login
|
|
154
|
-
this.client.tokenClient.clearTokens()
|
|
188
|
+
this.client.tokenClient.clearTokens()
|
|
189
|
+
|
|
155
190
|
if (typeof window !== "undefined") {
|
|
156
|
-
this.login()
|
|
191
|
+
this.login()
|
|
157
192
|
}
|
|
158
|
-
|
|
193
|
+
|
|
194
|
+
return null
|
|
159
195
|
}
|
|
160
196
|
}
|
|
197
|
+
|
|
161
198
|
/**
|
|
162
199
|
* Get current user from API
|
|
163
200
|
* @returns Promise with user data or null if not authenticated
|
|
164
201
|
*/
|
|
165
|
-
async getCurrentUser() {
|
|
202
|
+
async getCurrentUser(): Promise<TaruviResponse<UserData> | null> {
|
|
166
203
|
if (!this.isUserAuthenticated()) {
|
|
167
|
-
return null
|
|
204
|
+
return null
|
|
168
205
|
}
|
|
206
|
+
|
|
169
207
|
try {
|
|
170
|
-
return await this.client.httpClient.get(UserRoutes.getCurrentUser())
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
return null;
|
|
208
|
+
return await this.client.httpClient.get<TaruviResponse<UserData>>(UserRoutes.getCurrentUser())
|
|
209
|
+
} catch (error) {
|
|
210
|
+
console.error("Failed to fetch current user:", error)
|
|
211
|
+
return null
|
|
175
212
|
}
|
|
176
213
|
}
|
|
177
|
-
}
|
|
178
|
-
//# sourceMappingURL=AuthClient.js.map
|
|
214
|
+
}
|