@taruvi/sdk 1.5.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/README.md +60 -1289
  2. package/dist/client.d.ts +27 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/{src/client.ts → dist/client.js} +30 -48
  5. package/dist/client.js.map +1 -0
  6. package/dist/index.d.ts +28 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +20 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/analytics/AnalyticsClient.d.ts +9 -0
  11. package/dist/lib/analytics/AnalyticsClient.d.ts.map +1 -0
  12. package/dist/lib/analytics/AnalyticsClient.js +17 -0
  13. package/dist/lib/analytics/AnalyticsClient.js.map +1 -0
  14. package/dist/lib/analytics/types.d.ts +6 -0
  15. package/dist/lib/analytics/types.d.ts.map +1 -0
  16. package/dist/lib/analytics/types.js +2 -0
  17. package/dist/lib/analytics/types.js.map +1 -0
  18. package/dist/lib/app/AppClient.d.ts +15 -0
  19. package/dist/lib/app/AppClient.d.ts.map +1 -0
  20. package/dist/lib/app/AppClient.js +41 -0
  21. package/dist/lib/app/AppClient.js.map +1 -0
  22. package/dist/lib/app/types.d.ts +41 -0
  23. package/dist/lib/app/types.d.ts.map +1 -0
  24. package/dist/lib/app/types.js +2 -0
  25. package/dist/lib/app/types.js.map +1 -0
  26. package/dist/lib/auth/AuthClient.d.ts +47 -0
  27. package/dist/lib/auth/AuthClient.d.ts.map +1 -0
  28. package/{src/lib/auth/AuthClient.ts → dist/lib/auth/AuthClient.js} +58 -79
  29. package/dist/lib/auth/AuthClient.js.map +1 -0
  30. package/dist/lib/database/DatabaseClient.d.ts +76 -0
  31. package/dist/lib/database/DatabaseClient.d.ts.map +1 -0
  32. package/dist/lib/database/DatabaseClient.js +250 -0
  33. package/dist/lib/database/DatabaseClient.js.map +1 -0
  34. package/dist/lib/database/types.d.ts +66 -0
  35. package/dist/lib/database/types.d.ts.map +1 -0
  36. package/dist/lib/database/types.js +20 -0
  37. package/dist/lib/database/types.js.map +1 -0
  38. package/dist/lib/functions/FunctionsClient.d.ts +9 -0
  39. package/dist/lib/functions/FunctionsClient.d.ts.map +1 -0
  40. package/dist/lib/functions/FunctionsClient.js +20 -0
  41. package/dist/lib/functions/FunctionsClient.js.map +1 -0
  42. package/dist/lib/functions/types.d.ts +25 -0
  43. package/dist/lib/functions/types.d.ts.map +1 -0
  44. package/dist/lib/functions/types.js +2 -0
  45. package/dist/lib/functions/types.js.map +1 -0
  46. package/dist/lib/policy/PolicyClient.d.ts +25 -0
  47. package/dist/lib/policy/PolicyClient.d.ts.map +1 -0
  48. package/{src/lib/policy/PolicyClient.ts → dist/lib/policy/PolicyClient.js} +26 -40
  49. package/dist/lib/policy/PolicyClient.js.map +1 -0
  50. package/dist/lib/policy/types.d.ts +32 -0
  51. package/dist/lib/policy/types.d.ts.map +1 -0
  52. package/dist/lib/policy/types.js +2 -0
  53. package/dist/lib/policy/types.js.map +1 -0
  54. package/dist/lib/secrets/SecretsClient.d.ts +29 -0
  55. package/dist/lib/secrets/SecretsClient.d.ts.map +1 -0
  56. package/dist/lib/secrets/SecretsClient.js +66 -0
  57. package/dist/lib/secrets/SecretsClient.js.map +1 -0
  58. package/dist/lib/secrets/types.d.ts +43 -0
  59. package/dist/lib/secrets/types.d.ts.map +1 -0
  60. package/dist/lib/secrets/types.js +2 -0
  61. package/dist/lib/secrets/types.js.map +1 -0
  62. package/dist/lib/settings/SettingsClient.d.ts +9 -0
  63. package/dist/lib/settings/SettingsClient.d.ts.map +1 -0
  64. package/dist/lib/settings/SettingsClient.js +17 -0
  65. package/dist/lib/settings/SettingsClient.js.map +1 -0
  66. package/dist/lib/settings/types.d.ts +6 -0
  67. package/dist/lib/settings/types.d.ts.map +1 -0
  68. package/dist/lib/settings/types.js +2 -0
  69. package/dist/lib/settings/types.js.map +1 -0
  70. package/dist/lib/storage/StorageClient.d.ts +38 -0
  71. package/dist/lib/storage/StorageClient.d.ts.map +1 -0
  72. package/dist/lib/storage/StorageClient.js +102 -0
  73. package/dist/lib/storage/StorageClient.js.map +1 -0
  74. package/dist/lib/storage/types.d.ts +73 -0
  75. package/dist/lib/storage/types.d.ts.map +1 -0
  76. package/dist/lib/storage/types.js +2 -0
  77. package/dist/lib/storage/types.js.map +1 -0
  78. package/dist/lib/users/UserClient.d.ts +17 -0
  79. package/dist/lib/users/UserClient.d.ts.map +1 -0
  80. package/dist/lib/users/UserClient.js +40 -0
  81. package/dist/lib/users/UserClient.js.map +1 -0
  82. package/dist/lib/users/types.d.ts +108 -0
  83. package/dist/lib/users/types.d.ts.map +1 -0
  84. package/dist/lib/users/types.js +2 -0
  85. package/dist/lib/users/types.js.map +1 -0
  86. package/dist/lib-internal/errors/ErrorClient.d.ts +42 -0
  87. package/dist/lib-internal/errors/ErrorClient.d.ts.map +1 -0
  88. package/dist/lib-internal/errors/ErrorClient.js +102 -0
  89. package/dist/lib-internal/errors/ErrorClient.js.map +1 -0
  90. package/dist/lib-internal/errors/index.d.ts +4 -0
  91. package/dist/lib-internal/errors/index.d.ts.map +1 -0
  92. package/dist/lib-internal/errors/index.js +3 -0
  93. package/dist/lib-internal/errors/index.js.map +1 -0
  94. package/dist/lib-internal/errors/types.d.ts +29 -0
  95. package/dist/lib-internal/errors/types.d.ts.map +1 -0
  96. package/dist/lib-internal/errors/types.js +18 -0
  97. package/dist/lib-internal/errors/types.js.map +1 -0
  98. package/dist/lib-internal/http/HttpClient.d.ts +24 -0
  99. package/dist/lib-internal/http/HttpClient.d.ts.map +1 -0
  100. package/dist/lib-internal/http/HttpClient.js +103 -0
  101. package/dist/lib-internal/http/HttpClient.js.map +1 -0
  102. package/dist/lib-internal/http/types.d.ts +12 -0
  103. package/dist/lib-internal/http/types.d.ts.map +1 -0
  104. package/{src/lib-internal/http/types.ts → dist/lib-internal/http/types.js} +2 -3
  105. package/dist/lib-internal/http/types.js.map +1 -0
  106. package/dist/lib-internal/routes/AnalyticsRoutes.d.ts +4 -0
  107. package/dist/lib-internal/routes/AnalyticsRoutes.d.ts.map +1 -0
  108. package/dist/lib-internal/routes/AnalyticsRoutes.js +4 -0
  109. package/dist/lib-internal/routes/AnalyticsRoutes.js.map +1 -0
  110. package/dist/lib-internal/routes/AppRoutes.d.ts +10 -0
  111. package/dist/lib-internal/routes/AppRoutes.d.ts.map +1 -0
  112. package/dist/lib-internal/routes/AppRoutes.js +6 -0
  113. package/dist/lib-internal/routes/AppRoutes.js.map +1 -0
  114. package/dist/lib-internal/routes/AuthRoutes.d.ts +4 -0
  115. package/dist/lib-internal/routes/AuthRoutes.d.ts.map +1 -0
  116. package/{src/lib-internal/routes/AuthRoutes.ts → dist/lib-internal/routes/AuthRoutes.js} +2 -1
  117. package/dist/lib-internal/routes/AuthRoutes.js.map +1 -0
  118. package/dist/lib-internal/routes/DatabaseRoutes.d.ts +11 -0
  119. package/dist/lib-internal/routes/DatabaseRoutes.d.ts.map +1 -0
  120. package/dist/lib-internal/routes/DatabaseRoutes.js +7 -0
  121. package/dist/lib-internal/routes/DatabaseRoutes.js.map +1 -0
  122. package/dist/lib-internal/routes/FunctionRoutes.d.ts +4 -0
  123. package/dist/lib-internal/routes/FunctionRoutes.d.ts.map +1 -0
  124. package/dist/lib-internal/routes/FunctionRoutes.js +4 -0
  125. package/dist/lib-internal/routes/FunctionRoutes.js.map +1 -0
  126. package/dist/lib-internal/routes/PolicyRoutes.d.ts +5 -0
  127. package/dist/lib-internal/routes/PolicyRoutes.d.ts.map +1 -0
  128. package/dist/lib-internal/routes/PolicyRoutes.js +5 -0
  129. package/dist/lib-internal/routes/PolicyRoutes.js.map +1 -0
  130. package/dist/lib-internal/routes/SecretsRoutes.d.ts +6 -0
  131. package/dist/lib-internal/routes/SecretsRoutes.d.ts.map +1 -0
  132. package/dist/lib-internal/routes/SecretsRoutes.js +6 -0
  133. package/dist/lib-internal/routes/SecretsRoutes.js.map +1 -0
  134. package/dist/lib-internal/routes/SettingsRoutes.d.ts +5 -0
  135. package/dist/lib-internal/routes/SettingsRoutes.d.ts.map +1 -0
  136. package/{src/lib-internal/routes/SettingsRoutes.ts → dist/lib-internal/routes/SettingsRoutes.js} +2 -1
  137. package/dist/lib-internal/routes/SettingsRoutes.js.map +1 -0
  138. package/dist/lib-internal/routes/StorageRoutes.d.ts +11 -0
  139. package/dist/lib-internal/routes/StorageRoutes.d.ts.map +1 -0
  140. package/dist/lib-internal/routes/StorageRoutes.js +8 -0
  141. package/dist/lib-internal/routes/StorageRoutes.js.map +1 -0
  142. package/dist/lib-internal/routes/UserRoutes.d.ts +13 -0
  143. package/dist/lib-internal/routes/UserRoutes.d.ts.map +1 -0
  144. package/dist/lib-internal/routes/UserRoutes.js +13 -0
  145. package/dist/lib-internal/routes/UserRoutes.js.map +1 -0
  146. package/dist/lib-internal/routes/index.d.ts +2 -0
  147. package/dist/lib-internal/routes/index.d.ts.map +1 -0
  148. package/dist/lib-internal/routes/index.js +2 -0
  149. package/dist/lib-internal/routes/index.js.map +1 -0
  150. package/dist/lib-internal/token/TokenClient.d.ts +38 -0
  151. package/dist/lib-internal/token/TokenClient.d.ts.map +1 -0
  152. package/{src/lib-internal/token/TokenClient.ts → dist/lib-internal/token/TokenClient.js} +44 -59
  153. package/dist/lib-internal/token/TokenClient.js.map +1 -0
  154. package/dist/lib-internal/token/types.d.ts +2 -0
  155. package/dist/lib-internal/token/types.d.ts.map +1 -0
  156. package/dist/lib-internal/token/types.js +2 -0
  157. package/dist/lib-internal/token/types.js.map +1 -0
  158. package/dist/types.d.ts +74 -0
  159. package/dist/types.d.ts.map +1 -0
  160. package/dist/types.js +2 -0
  161. package/dist/types.js.map +1 -0
  162. package/dist/utils/enums.d.ts +31 -0
  163. package/dist/utils/enums.d.ts.map +1 -0
  164. package/dist/utils/enums.js +26 -0
  165. package/dist/utils/enums.js.map +1 -0
  166. package/dist/utils/utils.d.ts +6 -0
  167. package/dist/utils/utils.d.ts.map +1 -0
  168. package/dist/utils/utils.js +38 -0
  169. package/dist/utils/utils.js.map +1 -0
  170. package/package.json +11 -2
  171. package/.github/worflows/publish.yml +0 -57
  172. package/.github/workflows/publish.yml +0 -58
  173. package/.kiro/settings/lsp.json +0 -198
  174. package/MODULE_NAMING_CHANGES.md +0 -81
  175. package/PARAMETER_NAMING_CHANGES.md +0 -106
  176. package/USAGE_EXAMPLE.md +0 -86
  177. package/src/index.ts +0 -50
  178. package/src/lib/analytics/AnalyticsClient.ts +0 -24
  179. package/src/lib/analytics/types.ts +0 -8
  180. package/src/lib/app/AppClient.ts +0 -54
  181. package/src/lib/app/types.ts +0 -50
  182. package/src/lib/auth/types.ts +0 -123
  183. package/src/lib/database/DatabaseClient.ts +0 -244
  184. package/src/lib/database/types.ts +0 -90
  185. package/src/lib/functions/FunctionsClient.ts +0 -27
  186. package/src/lib/functions/types.ts +0 -27
  187. package/src/lib/policy/types.ts +0 -39
  188. package/src/lib/secrets/SecretsClient.ts +0 -75
  189. package/src/lib/secrets/types.ts +0 -59
  190. package/src/lib/settings/SettingsClient.ts +0 -22
  191. package/src/lib/settings/types.ts +0 -9
  192. package/src/lib/storage/StorageClient.ts +0 -131
  193. package/src/lib/storage/types.ts +0 -86
  194. package/src/lib/users/UserClient.ts +0 -63
  195. package/src/lib/users/types.ts +0 -123
  196. package/src/lib-internal/errors/ErrorClient.ts +0 -114
  197. package/src/lib-internal/errors/index.ts +0 -3
  198. package/src/lib-internal/errors/types.ts +0 -29
  199. package/src/lib-internal/http/HttpClient.ts +0 -117
  200. package/src/lib-internal/routes/AnalyticsRoutes.ts +0 -3
  201. package/src/lib-internal/routes/AppRoutes.ts +0 -9
  202. package/src/lib-internal/routes/DatabaseRoutes.ts +0 -10
  203. package/src/lib-internal/routes/FunctionRoutes.ts +0 -3
  204. package/src/lib-internal/routes/PolicyRoutes.ts +0 -4
  205. package/src/lib-internal/routes/SecretsRoutes.ts +0 -5
  206. package/src/lib-internal/routes/StorageRoutes.ts +0 -15
  207. package/src/lib-internal/routes/UserRoutes.ts +0 -12
  208. package/src/lib-internal/routes/index.ts +0 -0
  209. package/src/lib-internal/token/types.ts +0 -0
  210. package/src/types.ts +0 -98
  211. package/src/utils/enums.ts +0 -24
  212. package/src/utils/utils.ts +0 -37
  213. package/tests/fixtures/mockClient.ts +0 -19
  214. package/tests/mocks/db.json +0 -1
  215. package/tests/unit/analytics/AnalyticsClient.test.ts +0 -84
  216. package/tests/unit/app/AppClient.test.ts +0 -114
  217. package/tests/unit/auth/AuthClient.test.ts +0 -91
  218. package/tests/unit/client/Client.test.ts +0 -87
  219. package/tests/unit/database/DatabaseClient.test.ts +0 -565
  220. package/tests/unit/edge-cases/robustness.test.ts +0 -258
  221. package/tests/unit/errors/errors.test.ts +0 -236
  222. package/tests/unit/functions/FunctionsClient.test.ts +0 -99
  223. package/tests/unit/policy/PolicyClient.test.ts +0 -180
  224. package/tests/unit/secrets/SecretsClient.test.ts +0 -146
  225. package/tests/unit/settings/SettingsClient.test.ts +0 -50
  226. package/tests/unit/storage/StorageClient.test.ts +0 -252
  227. package/tests/unit/users/UserClient.test.ts +0 -150
  228. package/tsconfig.json +0 -44
  229. package/vitest.config.ts +0 -7
@@ -1,131 +0,0 @@
1
- import type { Client } from "../../client.js";
2
- import type {
3
- BucketUrlParams,
4
- StorageResponse,
5
- StorageListResponse,
6
- StorageUploadBatchResponse,
7
- StorageDeleteBatchResponse
8
- } from "./types.js";
9
- import { StorageRoutes, type StorageRouteKey } from "../../lib-internal/routes/StorageRoutes.js";
10
- import type { TaruviConfig, StorageFilters } from "../../types.js";
11
- import { HttpMethod } from "../../lib-internal/http/types.js";
12
- import { buildQueryString } from "../../utils/utils.js";
13
-
14
- export class Storage {
15
-
16
- private client: Client
17
- private config: TaruviConfig
18
- private urlParams: BucketUrlParams
19
- private operation: HttpMethod | undefined
20
- private body: object | undefined
21
- private filters: StorageFilters | undefined
22
- private queryParams: Record<string, string> | undefined
23
-
24
-
25
- constructor(client: Client, urlParams: BucketUrlParams = {} as BucketUrlParams, operation?: HttpMethod | undefined, body?: object, filters?: StorageFilters, queryParams?: Record<string, string>) {
26
- this.client = client
27
- this.urlParams = urlParams
28
- this.operation = operation
29
- this.config = this.client.getConfig()
30
- this.body = body
31
- this.filters = filters
32
- this.queryParams = queryParams
33
- }
34
-
35
-
36
- from(bucket: string): Storage {
37
- return new Storage(this.client, { ...this.urlParams, bucket }, undefined, undefined)
38
- }
39
-
40
- filter(filters: StorageFilters) {
41
- return new Storage(this.client, { ...this.urlParams }, undefined, undefined, filters)
42
- }
43
-
44
- delete(paths: string[]): Storage {
45
- return new Storage(this.client, {
46
- ...this.urlParams, delete: "delete"
47
- }, HttpMethod.POST, { paths })
48
- }
49
-
50
- update(path: string, body: object): Storage {
51
- return new Storage(this.client, { ...this.urlParams, path }, HttpMethod.PUT, body)
52
- }
53
-
54
- download(path: string): Storage {
55
- return new Storage(this.client, { ...this.urlParams, path }, HttpMethod.GET)
56
- }
57
-
58
- metadata(path: string): Storage {
59
- return new Storage(this.client, { ...this.urlParams, path }, HttpMethod.GET, undefined, undefined, { metadata: 'true' })
60
- }
61
-
62
- upload(filesData: { files: File[], metadatas: object[], paths: string[] }): Storage {
63
- const formData = new FormData()
64
- filesData.files.forEach(f => formData.append('files', f))
65
- formData.append('paths', JSON.stringify(filesData.paths))
66
- formData.append('metadata', JSON.stringify(filesData.metadatas))
67
- return new Storage(this.client, {
68
- ...this.urlParams, upload: "upload"
69
- }, HttpMethod.POST, formData)
70
- }
71
-
72
- private buildRoute(): string {
73
- if (!this.urlParams.bucket) {
74
- throw new Error('Bucket is required. Call .from(bucketName) first.')
75
- }
76
-
77
- return (
78
- StorageRoutes.baseUrl(this.config.appSlug, this.urlParams.bucket) +
79
- (Object.keys(this.urlParams) as StorageRouteKey[]).reduce((acc, key) => {
80
- const value = this.urlParams[key as keyof BucketUrlParams]
81
-
82
- if (!value) return acc
83
-
84
- if (key === 'path' && typeof value === 'string') {
85
- acc += StorageRoutes.path(value)
86
- }
87
-
88
- if ((key === 'upload' || key === 'delete') && typeof StorageRoutes[key] === 'function') {
89
- acc += (StorageRoutes[key] as () => string)()
90
- }
91
-
92
- return acc
93
- }, '') +
94
- '/' +
95
- buildQueryString({ ...this.filters as Record<string, unknown>, ...this.queryParams })
96
- )
97
- }
98
-
99
-
100
-
101
- /**
102
- * Execute the storage operation.
103
- * Returns different types based on the operation:
104
- * - List files: StorageListResponse[]
105
- * - Download: Blob
106
- * - Upload: StorageUploadBatchResponse
107
- * - Delete: StorageDeleteBatchResponse
108
- * - Update: StorageResponse
109
- */
110
- async execute<T = StorageListResponse[] | StorageResponse | StorageUploadBatchResponse | StorageDeleteBatchResponse | Blob>(): Promise<T> {
111
- const url = this.buildRoute()
112
- const operation = this.operation || HttpMethod.GET
113
-
114
- switch (operation) {
115
- case HttpMethod.POST:
116
- return await this.client.httpClient.post<T>(url, this.body)
117
-
118
- case HttpMethod.PUT:
119
- return await this.client.httpClient.put<T>(url, this.body)
120
-
121
- case HttpMethod.DELETE:
122
- return await this.client.httpClient.delete<T>(url)
123
-
124
- case HttpMethod.GET:
125
- default: {
126
- const isDownload = this.urlParams.path && !this.queryParams?.metadata
127
- return await this.client.httpClient.get<T>(url, isDownload ? { responseType: 'blob' } : undefined)
128
- }
129
- }
130
- }
131
- }
@@ -1,86 +0,0 @@
1
- import type { TaruviResponse } from "../../types.js"
2
-
3
- // Internal types - all optional since they're built incrementally via builder pattern
4
- export interface BucketUrlParams {
5
- appSlug?: string
6
- bucket?: string
7
- path?: string
8
- upload?: string
9
- delete?: string
10
- }
11
-
12
- export interface BucketFileUpload {
13
- files: []
14
- path: string
15
- metadata?: Record<string, unknown>
16
- }
17
-
18
- // Request types
19
- export interface StorageRequest {
20
- files: File[]
21
- paths: string[]
22
- metadatas: object[]
23
- }
24
-
25
- export interface StorageUpdateRequest {
26
- metadata?: Record<string, unknown>
27
- visibility?: 'public' | 'private'
28
- }
29
-
30
- // Storage object - matches StorageObjectSerializer from API
31
- export interface StorageObject {
32
- id: number
33
- uuid: string
34
- bucket?: number
35
- bucket_slug?: string
36
- bucket_name?: string
37
- filename: string
38
- file_path: string
39
- file_url: string
40
- size: number
41
- mimetype: string
42
- metadata?: Record<string, unknown>
43
- visibility?: string
44
- created_at: string
45
- updated_at: string
46
- created_by?: string
47
- modified_by?: string
48
- }
49
-
50
- // Response types - uses standard wrapper
51
- export type StorageResponse = TaruviResponse<StorageObject>
52
- export type StorageListResponse = TaruviResponse<StorageObject[]>
53
-
54
- // Batch upload response
55
- export interface StorageUploadBatchResponse {
56
- status: "success" | "error"
57
- message: string
58
- data: {
59
- uploaded_count: number
60
- failed_count: number
61
- total: number
62
- successful: Array<{
63
- index: number
64
- path: string
65
- object: StorageObject
66
- }>
67
- failed: Array<{
68
- index: number
69
- path: string
70
- error: string
71
- }>
72
- }
73
- }
74
-
75
- // Batch delete response
76
- export interface StorageDeleteBatchResponse {
77
- status: "success" | "error"
78
- message: string
79
- data: {
80
- deleted_count: number
81
- failed: Array<{
82
- path: string
83
- error: string
84
- }>
85
- }
86
- }
@@ -1,63 +0,0 @@
1
- import type { Client } from "../../client.js";
2
- import type { UserCreateRequest, UserResponse, UserListResponse, UserListFilters, UserUpdateRequest, UserAppsResponse, AssignRolesRequest, RevokeRolesRequest, RolesResponse, UserPreferencesResponse, UserPreferencesUpdate } from "./types.js";
3
- import { UserRoutes } from "../../lib-internal/routes/UserRoutes.js";
4
- import { buildQueryString } from "../../utils/utils.js";
5
-
6
-
7
- export class User {
8
- private client: Client
9
-
10
- constructor(client: Client) {
11
- this.client = client
12
- }
13
-
14
- async updateUser(username: string, body: UserUpdateRequest): Promise<UserResponse> {
15
- return await this.client.httpClient.put(UserRoutes.updateUser(username), body)
16
- }
17
-
18
- async getUser(username: string): Promise<UserResponse> {
19
- return await this.client.httpClient.get<UserResponse>(UserRoutes.getUser(username))
20
- }
21
-
22
- async list(filters?: UserListFilters): Promise<UserListResponse> {
23
- const queryString = buildQueryString(filters as unknown as Record<string, unknown>)
24
- return await this.client.httpClient.get<UserListResponse>(UserRoutes.listUser(queryString))
25
- }
26
-
27
- async getUserApps(username: string): Promise<UserAppsResponse> {
28
- return await this.client.httpClient.get<UserAppsResponse>(UserRoutes.getUserApps(username))
29
- }
30
-
31
- async createUser(userData: UserCreateRequest): Promise<UserResponse> {
32
- return await this.client.httpClient.post<UserResponse, UserCreateRequest>(
33
- UserRoutes.baseUrl,
34
- userData
35
- )
36
- }
37
-
38
- async deleteUser(username: string): Promise<void> {
39
- return await this.client.httpClient.delete(UserRoutes.deleteUser(username))
40
- }
41
-
42
- async assignRoles(request: AssignRolesRequest): Promise<RolesResponse> {
43
- return await this.client.httpClient.post<RolesResponse, AssignRolesRequest>(
44
- UserRoutes.assignRoles(),
45
- request
46
- )
47
- }
48
-
49
- async revokeRoles(request: RevokeRolesRequest): Promise<RolesResponse> {
50
- return await this.client.httpClient.delete<RolesResponse>(
51
- UserRoutes.revokeRoles(),
52
- request
53
- )
54
- }
55
-
56
- async getPreferences(): Promise<UserPreferencesResponse> {
57
- return await this.client.httpClient.get<UserPreferencesResponse>(UserRoutes.preferences())
58
- }
59
-
60
- async updatePreferences(body: UserPreferencesUpdate): Promise<UserPreferencesResponse> {
61
- return await this.client.httpClient.put<UserPreferencesResponse>(UserRoutes.preferences(), body)
62
- }
63
- }
@@ -1,123 +0,0 @@
1
- import type { TaruviResponse } from "../../types.js"
2
-
3
- export interface UserCreateRequest {
4
- username: string
5
- email: string
6
- password: string
7
- confirm_password: string
8
- first_name: string
9
- last_name: string
10
- is_active?: boolean
11
- is_staff?: boolean
12
- is_cloud_user?: boolean
13
- attributes?: Record<string, unknown>
14
- role_slugs?: string[]
15
- }
16
-
17
- export interface UserData {
18
- id: string
19
- username: string
20
- email: string
21
- first_name: string
22
- last_name: string
23
- full_name?: string
24
- is_active: boolean
25
- is_staff: boolean
26
- is_superuser?: boolean
27
- is_deleted: boolean
28
- date_joined: string
29
- last_login?: string
30
- groups?: UserGroup[]
31
- user_permissions?: UserPermission[]
32
- attributes?: Record<string, unknown>
33
- missing_attributes?: string[]
34
- roles?: UserRole[]
35
- icon_url?: string
36
- }
37
-
38
- export interface UserGroup {
39
- id: number
40
- name: string
41
- }
42
-
43
- export interface UserPermission {
44
- id: number
45
- name: string
46
- codename: string
47
- content_type: string
48
- }
49
-
50
- export interface UserRole {
51
- name: string
52
- slug: string
53
- type: string
54
- app_slug: string
55
- source: "direct" | "site_role" | "inherited"
56
- }
57
-
58
- export interface UserUpdateRequest {
59
- username?: string
60
- email?: string
61
- first_name?: string
62
- last_name?: string
63
- is_active?: boolean
64
- is_staff?: boolean
65
- }
66
-
67
- export interface UserListFilters {
68
- search?: string
69
- is_active?: boolean
70
- is_staff?: boolean
71
- is_superuser?: boolean
72
- is_deleted?: boolean
73
- roles?: string
74
- ordering?: string
75
- page?: number
76
- page_size?: number
77
- }
78
-
79
- export interface UserApp {
80
- name: string
81
- slug: string
82
- icon: string
83
- url: string
84
- display_name: string
85
- }
86
-
87
- // Response types - uses standard wrapper
88
- export type UserResponse = TaruviResponse<UserData>
89
- export type UserListResponse = TaruviResponse<UserData[]>
90
- export type UserAppsResponse = TaruviResponse<UserApp[]>
91
-
92
- export interface UserPreferences {
93
- date_format: string
94
- time_format: string
95
- timezone: string
96
- theme: string
97
- widget_config: Record<string, unknown>
98
- }
99
-
100
- export interface UserPreferencesUpdate {
101
- date_format?: string
102
- time_format?: string
103
- timezone?: string
104
- theme?: string
105
- widget_config?: Record<string, unknown>
106
- }
107
-
108
- export type UserPreferencesResponse = TaruviResponse<UserPreferences>
109
-
110
- export interface AssignRolesRequest {
111
- roles: string[]
112
- usernames: string[]
113
- expires_at?: string
114
- }
115
-
116
- export interface RevokeRolesRequest {
117
- roles: string[]
118
- usernames: string[]
119
- }
120
-
121
- export type RolesResponse = TaruviResponse<{
122
- count: number
123
- }>
@@ -1,114 +0,0 @@
1
- import { ErrorCode, type ErrorResponseBody } from './types.js'
2
-
3
- /**
4
- * Base SDK error. All typed errors extend this.
5
- */
6
- export class TaruviError extends Error {
7
- public readonly code: string
8
- public readonly statusCode: number
9
- public readonly detail: string | undefined
10
- public readonly errors: Record<string, unknown> | undefined
11
- public readonly data: unknown
12
-
13
- constructor(message: string, statusCode: number, code: string = ErrorCode.INTERNAL_ERROR, detail?: string, errors?: Record<string, unknown>, data?: unknown) {
14
- super(message)
15
- this.name = 'TaruviError'
16
- this.statusCode = statusCode
17
- this.code = code
18
- this.detail = detail
19
- this.errors = errors
20
- this.data = data
21
- }
22
- }
23
-
24
- export class ValidationError extends TaruviError {
25
- constructor(message = 'Validation failed', detail?: string, errors?: Record<string, unknown>) {
26
- super(message, 400, ErrorCode.VALIDATION_ERROR, detail, errors)
27
- this.name = 'ValidationError'
28
- }
29
- }
30
-
31
- export class AuthError extends TaruviError {
32
- constructor(message = 'Authentication required') {
33
- super(message, 401, ErrorCode.UNAUTHORIZED)
34
- this.name = 'AuthError'
35
- }
36
- }
37
-
38
- export class ForbiddenError extends TaruviError {
39
- constructor(message = 'Permission denied') {
40
- super(message, 403, ErrorCode.FORBIDDEN)
41
- this.name = 'ForbiddenError'
42
- }
43
- }
44
-
45
- export class NotFoundError extends TaruviError {
46
- constructor(message = 'Resource not found') {
47
- super(message, 404, ErrorCode.NOT_FOUND)
48
- this.name = 'NotFoundError'
49
- }
50
- }
51
-
52
- export class ConflictError extends TaruviError {
53
- constructor(message = 'Resource conflict', detail?: string) {
54
- super(message, 409, ErrorCode.CONFLICT, detail)
55
- this.name = 'ConflictError'
56
- }
57
- }
58
-
59
- export class TimeoutError extends TaruviError {
60
- constructor(message = 'Request timeout') {
61
- super(message, 504, ErrorCode.GATEWAY_TIMEOUT)
62
- this.name = 'TimeoutError'
63
- }
64
- }
65
-
66
- export class RateLimitError extends TaruviError {
67
- public readonly retryAfter: number | undefined
68
-
69
- constructor(message = 'Rate limit exceeded', retryAfter?: number) {
70
- super(message, 429, ErrorCode.RATE_LIMITED)
71
- this.name = 'RateLimitError'
72
- this.retryAfter = retryAfter
73
- }
74
- }
75
-
76
- export class NetworkError extends TaruviError {
77
- constructor(message = 'Network error') {
78
- super(message, 0, ErrorCode.NETWORK_ERROR)
79
- this.name = 'NetworkError'
80
- }
81
- }
82
-
83
- /**
84
- * Maps HTTP status + response body to the appropriate typed error.
85
- */
86
- export function createErrorFromResponse(statusCode: number, body?: ErrorResponseBody): TaruviError {
87
- const message = body?.message || 'Request failed'
88
- const code = body?.code || ErrorCode.INTERNAL_ERROR
89
- const detail = body?.detail
90
- const errors = body?.errors
91
- const data = body?.data
92
-
93
- switch (statusCode) {
94
- case 400:
95
- if (code === ErrorCode.VALIDATION_ERROR) {
96
- return new ValidationError(message, detail, errors)
97
- }
98
- return new TaruviError(message, 400, code, detail, errors, data)
99
- case 401:
100
- return new AuthError(message)
101
- case 403:
102
- return new ForbiddenError(message)
103
- case 404:
104
- return new NotFoundError(message)
105
- case 409:
106
- return new ConflictError(message, detail)
107
- case 429:
108
- return new RateLimitError(message)
109
- case 504:
110
- return new TimeoutError(message)
111
- default:
112
- return new TaruviError(message, statusCode, code, detail, errors, data)
113
- }
114
- }
@@ -1,3 +0,0 @@
1
- export { TaruviError, ValidationError, AuthError, ForbiddenError, NotFoundError, ConflictError, TimeoutError, NetworkError, RateLimitError, createErrorFromResponse } from './ErrorClient.js'
2
- export { ErrorCode } from './types.js'
3
- export type { ErrorResponseBody } from './types.js'
@@ -1,29 +0,0 @@
1
- /**
2
- * Error codes matching the backend's ErrorCode enum.
3
- * Maps 1:1 with base.responses.error_codes.ErrorCode in Python.
4
- */
5
- export enum ErrorCode {
6
- BAD_REQUEST = 'BAD_REQUEST',
7
- VALIDATION_ERROR = 'VALIDATION_ERROR',
8
- UNAUTHORIZED = 'UNAUTHORIZED',
9
- FORBIDDEN = 'FORBIDDEN',
10
- NOT_FOUND = 'NOT_FOUND',
11
- CONFLICT = 'CONFLICT',
12
- INTERNAL_ERROR = 'INTERNAL_ERROR',
13
- RATE_LIMITED = 'RATE_LIMITED',
14
- GATEWAY_TIMEOUT = 'GATEWAY_TIMEOUT',
15
- NETWORK_ERROR = 'NETWORK_ERROR'
16
- }
17
-
18
- /**
19
- * Backend error response shape.
20
- * Matches AppException.to_dict() output.
21
- */
22
- export interface ErrorResponseBody {
23
- status: 'error'
24
- code: string
25
- message: string
26
- detail?: string
27
- errors?: Record<string, unknown>
28
- data?: unknown
29
- }
@@ -1,117 +0,0 @@
1
- import type { TaruviConfig } from "../../types.js";
2
- import type { TokenClient } from "../token/TokenClient.js";
3
- import axios, { AxiosError, type AxiosInstance, type InternalAxiosRequestConfig } from "axios";
4
- import { createErrorFromResponse, NetworkError, TaruviError } from "../errors/index.js";
5
- import type { ErrorResponseBody } from "../errors/index.js";
6
-
7
- /**
8
- * HttpClient handles all HTTP requests to the Taruvi API.
9
- * Sends session token via X-Session-Token header.
10
- * Clears tokens on 401 auth failures.
11
- *
12
- * @internal
13
- */
14
- export class HttpClient {
15
- private config: TaruviConfig
16
- private tokenClient: TokenClient
17
- private axiosInstance: AxiosInstance
18
-
19
- constructor(config: TaruviConfig, tokenClient: TokenClient) {
20
- this.config = config
21
- this.tokenClient = tokenClient
22
- this.axiosInstance = axios.create({ baseURL: config.apiUrl, withCredentials: true })
23
- this.setupInterceptors()
24
- }
25
-
26
- private setupInterceptors(): void {
27
- // Request interceptor: attach session token
28
- this.axiosInstance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
29
- const isFormData = config.data instanceof FormData
30
- if (!isFormData) {
31
- config.headers['Content-Type'] = 'application/json'
32
- }
33
- const sessionToken = this.tokenClient.getSessionToken()
34
- if (sessionToken) {
35
- config.headers['X-Session-Token'] = sessionToken
36
- }
37
- return config
38
- })
39
-
40
- // Response interceptor: clear tokens on authentication failure
41
- // Only 401 (Unauthorized) means the session is invalid
42
- // 403 (Forbidden) means authenticated but lacking permission — don't clear tokens
43
- this.axiosInstance.interceptors.response.use(
44
- (response) => response,
45
- (error: AxiosError) => {
46
- const status = error.response?.status
47
- if (status === 401) {
48
- this.tokenClient.clearTokens()
49
- }
50
- return Promise.reject(error)
51
- }
52
- )
53
- }
54
-
55
- private handleError(error: unknown): never {
56
- if (error instanceof TaruviError) {
57
- throw error
58
- }
59
-
60
- if (error instanceof AxiosError) {
61
- if (error.response) {
62
- const body = error.response.data as ErrorResponseBody | undefined
63
- throw createErrorFromResponse(error.response.status, body)
64
- }
65
- throw new NetworkError(error.message)
66
- }
67
-
68
- throw error
69
- }
70
-
71
- async get<T>(endpoint: string, options?: { responseType?: 'json' | 'blob' }): Promise<T> {
72
- try {
73
- const { data } = await this.axiosInstance.get<T>(`/${endpoint}`, {
74
- ...(options?.responseType && { responseType: options.responseType }),
75
- })
76
- return data as T
77
- } catch (error) {
78
- this.handleError(error)
79
- }
80
- }
81
-
82
- async post<T, D = unknown>(endpoint: string, body: D): Promise<T> {
83
- try {
84
- const { data } = await this.axiosInstance.post<T>(`/${endpoint}`, body)
85
- return data
86
- } catch (error) {
87
- this.handleError(error)
88
- }
89
- }
90
-
91
- async put<T, D = unknown>(endpoint: string, body: D): Promise<T> {
92
- try {
93
- const { data } = await this.axiosInstance.put<T>(`/${endpoint}`, body)
94
- return data
95
- } catch (error) {
96
- this.handleError(error)
97
- }
98
- }
99
-
100
- async delete<T, D = unknown>(endpoint: string, body?: D): Promise<T> {
101
- try {
102
- const { data } = await this.axiosInstance.delete<T>(`/${endpoint}`, { data: body })
103
- return data
104
- } catch (error) {
105
- this.handleError(error)
106
- }
107
- }
108
-
109
- async patch<T, D = unknown>(endpoint: string, body: D): Promise<T> {
110
- try {
111
- const { data } = await this.axiosInstance.patch<T>(`/${endpoint}`, body)
112
- return data
113
- } catch (error) {
114
- this.handleError(error)
115
- }
116
- }
117
- }
@@ -1,3 +0,0 @@
1
- export const AnalyticsRoutes = {
2
- baseUrl: (appSlug: string, querySlug: string) => `api/apps/${appSlug}/analytics/queries/${querySlug}/execute/`
3
- }
@@ -1,9 +0,0 @@
1
- export const AppRoutes = {
2
- baseUrl: (appSlug: string) => `api/apps/${appSlug}`,
3
- roles: (): string => `/roles`,
4
- settings: (): string => "/settings/"
5
- }
6
-
7
- type AllRouteKeys = keyof typeof AppRoutes
8
- export type AppRouteKey = Exclude<AllRouteKeys, 'baseUrl'>
9
- export type AppUrlParams = Partial<Record<AppRouteKey, string>>
@@ -1,10 +0,0 @@
1
- export const DatabaseRoutes = {
2
- baseUrl: (appSlug: string) => `api/apps/${appSlug}`,
3
- dataTables: (tableName: string): string => `/datatables/${tableName}/data`,
4
- recordId: (recordId: string): string => `/${recordId}`,
5
- upsert: (): string => `/upsert`
6
- }
7
-
8
- type AllRouteKeys = keyof typeof DatabaseRoutes
9
- export type DatabaseRouteKey = Exclude<AllRouteKeys, 'baseUrl'>
10
- export type DatabaseUrlParams = Partial<Record<DatabaseRouteKey, string>>