meeglesdk 0.1.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.
Files changed (190) hide show
  1. package/README.md +191 -0
  2. package/dist/client.d.ts +186 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +197 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/core/base-service.d.ts +156 -0
  7. package/dist/core/base-service.d.ts.map +1 -0
  8. package/dist/core/base-service.js +240 -0
  9. package/dist/core/base-service.js.map +1 -0
  10. package/dist/core/errors.d.ts +181 -0
  11. package/dist/core/errors.d.ts.map +1 -0
  12. package/dist/core/errors.js +250 -0
  13. package/dist/core/errors.js.map +1 -0
  14. package/dist/core/rate-limiter.d.ts +72 -0
  15. package/dist/core/rate-limiter.d.ts.map +1 -0
  16. package/dist/core/rate-limiter.js +269 -0
  17. package/dist/core/rate-limiter.js.map +1 -0
  18. package/dist/core/request.d.ts +270 -0
  19. package/dist/core/request.d.ts.map +1 -0
  20. package/dist/core/request.js +842 -0
  21. package/dist/core/request.js.map +1 -0
  22. package/dist/core/token-manager.d.ts +134 -0
  23. package/dist/core/token-manager.d.ts.map +1 -0
  24. package/dist/core/token-manager.js +412 -0
  25. package/dist/core/token-manager.js.map +1 -0
  26. package/dist/helpers/auth.d.ts +7 -0
  27. package/dist/helpers/auth.d.ts.map +1 -0
  28. package/dist/helpers/auth.js +19 -0
  29. package/dist/helpers/auth.js.map +1 -0
  30. package/dist/index.d.ts +72 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +61 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/service/auth/index.d.ts +96 -0
  35. package/dist/service/auth/index.d.ts.map +1 -0
  36. package/dist/service/auth/index.js +163 -0
  37. package/dist/service/auth/index.js.map +1 -0
  38. package/dist/service/config/basic.d.ts +37 -0
  39. package/dist/service/config/basic.d.ts.map +1 -0
  40. package/dist/service/config/basic.js +54 -0
  41. package/dist/service/config/basic.js.map +1 -0
  42. package/dist/service/config/config.d.ts +27 -0
  43. package/dist/service/config/config.d.ts.map +1 -0
  44. package/dist/service/config/config.js +34 -0
  45. package/dist/service/config/config.js.map +1 -0
  46. package/dist/service/config/field.d.ts +50 -0
  47. package/dist/service/config/field.d.ts.map +1 -0
  48. package/dist/service/config/field.js +74 -0
  49. package/dist/service/config/field.js.map +1 -0
  50. package/dist/service/config/relation.d.ts +53 -0
  51. package/dist/service/config/relation.d.ts.map +1 -0
  52. package/dist/service/config/relation.js +66 -0
  53. package/dist/service/config/relation.js.map +1 -0
  54. package/dist/service/config/resource.d.ts +59 -0
  55. package/dist/service/config/resource.d.ts.map +1 -0
  56. package/dist/service/config/resource.js +75 -0
  57. package/dist/service/config/resource.js.map +1 -0
  58. package/dist/service/config/role.d.ts +55 -0
  59. package/dist/service/config/role.d.ts.map +1 -0
  60. package/dist/service/config/role.js +90 -0
  61. package/dist/service/config/role.js.map +1 -0
  62. package/dist/service/config/template.d.ts +65 -0
  63. package/dist/service/config/template.d.ts.map +1 -0
  64. package/dist/service/config/template.js +95 -0
  65. package/dist/service/config/template.js.map +1 -0
  66. package/dist/service/measure/index.d.ts +26 -0
  67. package/dist/service/measure/index.d.ts.map +1 -0
  68. package/dist/service/measure/index.js +36 -0
  69. package/dist/service/measure/index.js.map +1 -0
  70. package/dist/service/measure/query.d.ts +56 -0
  71. package/dist/service/measure/query.d.ts.map +1 -0
  72. package/dist/service/measure/query.js +86 -0
  73. package/dist/service/measure/query.js.map +1 -0
  74. package/dist/service/space/relation.d.ts +63 -0
  75. package/dist/service/space/relation.d.ts.map +1 -0
  76. package/dist/service/space/relation.js +102 -0
  77. package/dist/service/space/relation.js.map +1 -0
  78. package/dist/service/space/space.d.ts +81 -0
  79. package/dist/service/space/space.d.ts.map +1 -0
  80. package/dist/service/space/space.js +110 -0
  81. package/dist/service/space/space.js.map +1 -0
  82. package/dist/service/tenant/tenant.d.ts +52 -0
  83. package/dist/service/tenant/tenant.d.ts.map +1 -0
  84. package/dist/service/tenant/tenant.js +75 -0
  85. package/dist/service/tenant/tenant.js.map +1 -0
  86. package/dist/service/user/group.d.ts +47 -0
  87. package/dist/service/user/group.d.ts.map +1 -0
  88. package/dist/service/user/group.js +70 -0
  89. package/dist/service/user/group.js.map +1 -0
  90. package/dist/service/user/query.d.ts +25 -0
  91. package/dist/service/user/query.d.ts.map +1 -0
  92. package/dist/service/user/query.js +26 -0
  93. package/dist/service/user/query.js.map +1 -0
  94. package/dist/service/user/search.d.ts +25 -0
  95. package/dist/service/user/search.d.ts.map +1 -0
  96. package/dist/service/user/search.js +26 -0
  97. package/dist/service/user/search.js.map +1 -0
  98. package/dist/service/user/user.d.ts +37 -0
  99. package/dist/service/user/user.d.ts.map +1 -0
  100. package/dist/service/user/user.js +46 -0
  101. package/dist/service/user/user.js.map +1 -0
  102. package/dist/service/view/query.d.ts +52 -0
  103. package/dist/service/view/query.d.ts.map +1 -0
  104. package/dist/service/view/query.js +76 -0
  105. package/dist/service/view/query.js.map +1 -0
  106. package/dist/service/view/view.d.ts +76 -0
  107. package/dist/service/view/view.d.ts.map +1 -0
  108. package/dist/service/view/view.js +108 -0
  109. package/dist/service/view/view.js.map +1 -0
  110. package/dist/service/workitem/attachment.d.ts +143 -0
  111. package/dist/service/workitem/attachment.d.ts.map +1 -0
  112. package/dist/service/workitem/attachment.js +231 -0
  113. package/dist/service/workitem/attachment.js.map +1 -0
  114. package/dist/service/workitem/batch.d.ts +135 -0
  115. package/dist/service/workitem/batch.d.ts.map +1 -0
  116. package/dist/service/workitem/batch.js +146 -0
  117. package/dist/service/workitem/batch.js.map +1 -0
  118. package/dist/service/workitem/chat.d.ts +42 -0
  119. package/dist/service/workitem/chat.d.ts.map +1 -0
  120. package/dist/service/workitem/chat.js +50 -0
  121. package/dist/service/workitem/chat.js.map +1 -0
  122. package/dist/service/workitem/comment.d.ts +139 -0
  123. package/dist/service/workitem/comment.d.ts.map +1 -0
  124. package/dist/service/workitem/comment.js +180 -0
  125. package/dist/service/workitem/comment.js.map +1 -0
  126. package/dist/service/workitem/review.d.ts +44 -0
  127. package/dist/service/workitem/review.d.ts.map +1 -0
  128. package/dist/service/workitem/review.js +49 -0
  129. package/dist/service/workitem/review.js.map +1 -0
  130. package/dist/service/workitem/search.d.ts +213 -0
  131. package/dist/service/workitem/search.d.ts.map +1 -0
  132. package/dist/service/workitem/search.js +242 -0
  133. package/dist/service/workitem/search.js.map +1 -0
  134. package/dist/service/workitem/subtask.d.ts +193 -0
  135. package/dist/service/workitem/subtask.d.ts.map +1 -0
  136. package/dist/service/workitem/subtask.js +247 -0
  137. package/dist/service/workitem/subtask.js.map +1 -0
  138. package/dist/service/workitem/workItem.d.ts +225 -0
  139. package/dist/service/workitem/workItem.d.ts.map +1 -0
  140. package/dist/service/workitem/workItem.js +310 -0
  141. package/dist/service/workitem/workItem.js.map +1 -0
  142. package/dist/service/workitem/workflow.d.ts +214 -0
  143. package/dist/service/workitem/workflow.d.ts.map +1 -0
  144. package/dist/service/workitem/workflow.js +281 -0
  145. package/dist/service/workitem/workflow.js.map +1 -0
  146. package/dist/service/workitem/workhour.d.ts +63 -0
  147. package/dist/service/workitem/workhour.d.ts.map +1 -0
  148. package/dist/service/workitem/workhour.js +93 -0
  149. package/dist/service/workitem/workhour.js.map +1 -0
  150. package/dist/types/auth.d.ts +115 -0
  151. package/dist/types/auth.d.ts.map +1 -0
  152. package/dist/types/auth.js +6 -0
  153. package/dist/types/auth.js.map +1 -0
  154. package/dist/types/common.d.ts +354 -0
  155. package/dist/types/common.d.ts.map +1 -0
  156. package/dist/types/common.js +14 -0
  157. package/dist/types/common.js.map +1 -0
  158. package/dist/types/config.d.ts +305 -0
  159. package/dist/types/config.d.ts.map +1 -0
  160. package/dist/types/config.js +6 -0
  161. package/dist/types/config.js.map +1 -0
  162. package/dist/types/index.d.ts +13 -0
  163. package/dist/types/index.d.ts.map +1 -0
  164. package/dist/types/index.js +13 -0
  165. package/dist/types/index.js.map +1 -0
  166. package/dist/types/measure.d.ts +55 -0
  167. package/dist/types/measure.d.ts.map +1 -0
  168. package/dist/types/measure.js +6 -0
  169. package/dist/types/measure.js.map +1 -0
  170. package/dist/types/space.d.ts +164 -0
  171. package/dist/types/space.d.ts.map +1 -0
  172. package/dist/types/space.js +6 -0
  173. package/dist/types/space.js.map +1 -0
  174. package/dist/types/tenant.d.ts +106 -0
  175. package/dist/types/tenant.d.ts.map +1 -0
  176. package/dist/types/tenant.js +6 -0
  177. package/dist/types/tenant.js.map +1 -0
  178. package/dist/types/user.d.ts +110 -0
  179. package/dist/types/user.d.ts.map +1 -0
  180. package/dist/types/user.js +6 -0
  181. package/dist/types/user.js.map +1 -0
  182. package/dist/types/view.d.ts +162 -0
  183. package/dist/types/view.d.ts.map +1 -0
  184. package/dist/types/view.js +6 -0
  185. package/dist/types/view.js.map +1 -0
  186. package/dist/types/workitem.d.ts +1523 -0
  187. package/dist/types/workitem.d.ts.map +1 -0
  188. package/dist/types/workitem.js +6 -0
  189. package/dist/types/workitem.js.map +1 -0
  190. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,191 @@
1
+ # meeglesdk
2
+
3
+ TypeScript SDK for Feishu Project (Meego) Open API.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install meeglesdk
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```ts
14
+ import { MeegoClient, withUserKey } from 'meeglesdk';
15
+
16
+ const client = new MeegoClient({
17
+ pluginId: 'YOUR_PLUGIN_ID',
18
+ pluginSecret: 'YOUR_PLUGIN_SECRET',
19
+ baseURL: 'https://project.feishu.cn',
20
+ });
21
+
22
+ const items = await client.workItem.query(
23
+ 'project_key',
24
+ 'story',
25
+ { work_item_ids: [123456] },
26
+ withUserKey('user_key')
27
+ );
28
+ ```
29
+
30
+ ## Client Options
31
+
32
+ ```ts
33
+ const client = new MeegoClient({
34
+ pluginId: 'YOUR_PLUGIN_ID',
35
+ pluginSecret: 'YOUR_PLUGIN_SECRET',
36
+ baseURL: 'https://project.feishu.cn', // optional
37
+ timeout: 30000, // optional, ms
38
+ retry: {
39
+ maxRetries: 2,
40
+ retryDelay: 1000, // base delay, exponential backoff
41
+ maxRetryDelay: 30000, // optional cap for backoff delay
42
+ retryableErrorCodes: [10429, 50006] // optional override
43
+ },
44
+ rateLimit: 'meego-openapi', // preset: doc-based limits (15 QPS + endpoint overrides)
45
+ // or customize:
46
+ // rateLimit: {
47
+ // enabled: true, // optional, default true when provided
48
+ // qps: 15, // per token QPS
49
+ // burst: 15, // optional burst size
50
+ // scope: 'token+method+path', // 'token' | 'token+path' | 'token+method+path'
51
+ // entryTtlMs: 600000, // optional, idle bucket cleanup (default 10 min)
52
+ // rules: [ // optional overrides
53
+ // { method: 'POST', path: '/open_api/work_item/actual_time/update', qps: 10 },
54
+ // ],
55
+ // },
56
+ tokenType: 0, // 0: plugin_access_token, 1: virtual_plugin_token
57
+ onTokenRefresh: (token, type, userKey) => {
58
+ // persist token if needed
59
+ },
60
+ logger: console, // optional
61
+ });
62
+ ```
63
+
64
+ ## Auth Flows
65
+
66
+ ### Plugin Token (Server)
67
+
68
+ ```ts
69
+ const token = await client.auth.getPluginToken();
70
+ ```
71
+
72
+ ### User Token (Auth Code Exchange)
73
+
74
+ ```ts
75
+ const { token, expire_time, refresh_token } = await client.auth.getUserToken(code);
76
+ ```
77
+
78
+ ### Manually Set User Token
79
+
80
+ ```ts
81
+ client.setUserToken({
82
+ userKey,
83
+ token,
84
+ expireTime: expireTimeSeconds,
85
+ refreshToken,
86
+ refreshTokenExpireTime,
87
+ saasTenantKey: tenantKey,
88
+ });
89
+ ```
90
+
91
+ ## Request-Level Auth (Recommended for Multi-User)
92
+
93
+ Do not store user tokens on a shared client. Instead, pass auth per request:
94
+
95
+ ```ts
96
+ await client.workItem.query(
97
+ 'project_key',
98
+ 'story',
99
+ { work_item_ids: [123456] },
100
+ { auth: { type: 'user', token: userToken } }
101
+ );
102
+
103
+ // Helper shortcuts (return request options)
104
+ await client.workItem.query(
105
+ 'project_key',
106
+ 'story',
107
+ { work_item_ids: [123456] },
108
+ withUserKey('user_key')
109
+ );
110
+ ```
111
+
112
+ Rules:
113
+ - `type: 'user'`: use the provided user token; `userKey` is not needed.
114
+ - `type: 'plugin'`: use plugin token; `userKey` is required for user-scoped APIs.
115
+ - `type: 'auto'` (default): if `userKey` is provided and a cached token exists for that user, it is used; otherwise plugin token is used.
116
+
117
+ ## Token Management Notes
118
+
119
+ - `TokenManager` caches `plugin_access_token` and refreshes it automatically.
120
+ - `user_access_token` is cached per `userKey` when you call `auth.getUserToken` or `client.setUserToken`.
121
+ - `user_access_token` will be auto-refreshed per user when possible (requires `refresh_token`).
122
+ - Use request-level `auth` for multi-user apps; avoid sharing a client-scoped user token across users.
123
+
124
+ ## Timeout & Retry
125
+
126
+ - Default timeout: 30s.
127
+ - Retries use exponential backoff with a base delay and are enabled by default.
128
+ - Network errors, timeouts, and retryable API error codes are retried (default: `10429`, `50006`).
129
+ - Per-request overrides are supported via `options.retry`, `options.skipRetry`, and `options.timeout`.
130
+
131
+ ## WBS View (Query + Body)
132
+
133
+ ```ts
134
+ const wbs = await client.workItem.workflow.getWbsView(
135
+ 'project_key',
136
+ 'story',
137
+ 123456,
138
+ {
139
+ query: { need_union_deliverable: true, need_schedule_table_agg: true },
140
+ body: {
141
+ expand: {
142
+ need_union_deliverable: true,
143
+ need_wbs_relation_chain_entity: true,
144
+ need_wbs_relation_chain_path: true,
145
+ },
146
+ },
147
+ },
148
+ { auth: { type: 'plugin', userKey: 'user_key' } }
149
+ );
150
+ ```
151
+
152
+ ## Services Overview
153
+
154
+ Top-level services:
155
+ - `auth`
156
+ - `workItem`
157
+ - `space`
158
+ - `user`
159
+ - `config`
160
+ - `view`
161
+ - `measure`
162
+ - `tenant`
163
+
164
+ `workItem` sub-services:
165
+ - `search`, `batch`, `comment`, `subtask`, `attachment`, `chat`, `workflow`
166
+
167
+ ## Tests
168
+
169
+ Integration tests use real credentials in `tests/config.ts`.
170
+
171
+ ```bash
172
+ bun test
173
+ ```
174
+
175
+ Network access is required.
176
+
177
+ ## Unit Tests (Edge Cases)
178
+
179
+ Unit tests mock network calls and focus on request parsing, retries, and token caching.
180
+
181
+ ```bash
182
+ bun test tests/unit
183
+ ```
184
+
185
+ ## Performance Benchmarks (Local)
186
+
187
+ Quick micro-benchmarks for request parsing and big-int handling (no network).
188
+
189
+ ```bash
190
+ bun run tests/perf/benchmark.ts
191
+ ```
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Meego SDK 客户端
3
+ * 飞书项目 Open API TypeScript SDK
4
+ */
5
+ import type { Logger } from './types/common.js';
6
+ import type { UserTokenInput } from './types/auth.js';
7
+ import type { RetryConfig } from './core/request.js';
8
+ import type { RateLimitConfig } from './core/rate-limiter.js';
9
+ import { TokenManager } from './core/token-manager.js';
10
+ import { RequestHandler } from './core/request.js';
11
+ import { AuthService } from './service/auth/index.js';
12
+ import { WorkItemService } from './service/workitem/workItem.js';
13
+ import { SpaceService } from './service/space/space.js';
14
+ import { UserService } from './service/user/user.js';
15
+ import { ConfigService } from './service/config/config.js';
16
+ import { ViewService } from './service/view/view.js';
17
+ import { MeasureService } from './service/measure/index.js';
18
+ import { TenantService } from './service/tenant/tenant.js';
19
+ /**
20
+ * MeegoClient 配置选项
21
+ */
22
+ export interface MeegoClientOptions {
23
+ /** 插件 ID (Plugin ID) */
24
+ pluginId: string;
25
+ /** 插件密钥 (Plugin Secret) */
26
+ pluginSecret: string;
27
+ /**
28
+ * API 基础 URL
29
+ * @default 'https://project.feishu.cn'
30
+ */
31
+ baseURL?: string;
32
+ /**
33
+ * 请求超时(毫秒)
34
+ * @default 30000
35
+ */
36
+ timeout?: number;
37
+ /**
38
+ * 重试配置
39
+ */
40
+ retry?: Partial<RetryConfig>;
41
+ /**
42
+ * 本地限流配置(可选)
43
+ */
44
+ rateLimit?: RateLimitConfig;
45
+ /**
46
+ * 自定义 Logger
47
+ * @default console logger
48
+ */
49
+ logger?: Logger;
50
+ /**
51
+ * 是否使用虚拟 token(开发调试用)
52
+ * - 0: plugin_access_token (默认)
53
+ * - 1: virtual_plugin_token
54
+ * @default 0
55
+ */
56
+ tokenType?: 0 | 1;
57
+ /**
58
+ * Token 刷新回调
59
+ * 当 token 被刷新时调用,可用于持久化 token(user token 会带上 userKey)
60
+ */
61
+ onTokenRefresh?: (token: string, type: 'plugin' | 'user', userKey?: string) => void;
62
+ }
63
+ /**
64
+ * Meego SDK 客户端
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * // 初始化客户端
69
+ * const client = new MeegoClient({
70
+ * pluginId: 'MII_xxx',
71
+ * pluginSecret: 'xxx',
72
+ * });
73
+ *
74
+ * // 使用认证服务
75
+ * const pluginToken = await client.auth.getPluginToken();
76
+ *
77
+ * // 通过授权码获取用户 token
78
+ * const userInfo = await client.auth.getUserToken(code);
79
+ *
80
+ * // 使用工作项服务
81
+ * const workItems = await client.workItem.query('project', 'story', { work_item_ids: [123] });
82
+ *
83
+ * // 使用工作项子服务
84
+ * const searchResult = await client.workItem.search.filter('project', { work_item_type_keys: ['story'] });
85
+ * const comments = await client.workItem.comment.list('project', 'story', 123);
86
+ * ```
87
+ */
88
+ export declare class MeegoClient {
89
+ /** 认证服务 */
90
+ readonly auth: AuthService;
91
+ /**
92
+ * 工作项服务
93
+ *
94
+ * 包含子服务:
95
+ * - search: 搜索与筛选
96
+ * - batch: 批量操作
97
+ * - comment: 评论管理
98
+ * - subtask: 子任务管理
99
+ * - attachment: 附件管理
100
+ * - chat: 群聊管理
101
+ */
102
+ readonly workItem: WorkItemService;
103
+ /**
104
+ * 空间服务
105
+ *
106
+ * 包含子服务:
107
+ * - relation: 空间关联
108
+ */
109
+ readonly space: SpaceService;
110
+ /**
111
+ * 用户服务
112
+ *
113
+ * 包含子服务:
114
+ * - group: 用户组管理
115
+ */
116
+ readonly user: UserService;
117
+ /**
118
+ * 配置服务
119
+ *
120
+ * 包含子服务:
121
+ * - basic: 基础配置
122
+ * - field: 字段配置
123
+ * - relation: 关系配置
124
+ * - resource: 资源库配置
125
+ * - role: 角色配置
126
+ * - template: 模板配置
127
+ */
128
+ readonly config: ConfigService;
129
+ /**
130
+ * 视图服务
131
+ *
132
+ * 包含子服务:
133
+ * - query: 视图查询
134
+ */
135
+ readonly view: ViewService;
136
+ /**
137
+ * 度量服务
138
+ *
139
+ * 包含子服务:
140
+ * - query: 度量查询
141
+ */
142
+ readonly measure: MeasureService;
143
+ /**
144
+ * 租户服务(ISV 场景)
145
+ *
146
+ * - getInfo: 获取商业租户信息
147
+ * - getEntitlement: 查询租户权益
148
+ * - listInstalledSpaces: 获取安装空间列表
149
+ */
150
+ readonly tenant: TenantService;
151
+ /** Token 管理器 (内部使用) */
152
+ private readonly tokenManager;
153
+ /** 请求处理器 (内部使用) */
154
+ private readonly requestHandler;
155
+ /** Logger */
156
+ private readonly logger;
157
+ /** 配置 */
158
+ private readonly options;
159
+ constructor(options: MeegoClientOptions);
160
+ /**
161
+ * 手动设置用户访问凭证
162
+ * 用于从外部设置已有的 token(如从前端传入)
163
+ *
164
+ * @param input 用户 token 信息
165
+ */
166
+ setUserToken(input: UserTokenInput): void;
167
+ /**
168
+ * 获取请求处理器
169
+ * 供其他服务使用
170
+ */
171
+ getRequestHandler(): RequestHandler;
172
+ /**
173
+ * 获取 Token 管理器
174
+ * 供其他服务使用
175
+ */
176
+ getTokenManager(): TokenManager;
177
+ /**
178
+ * 获取 Logger
179
+ */
180
+ getLogger(): Logger;
181
+ /**
182
+ * 获取配置的基础 URL
183
+ */
184
+ getBaseURL(): string;
185
+ }
186
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Meego SDK 客户端
3
+ * 飞书项目 Open API TypeScript SDK
4
+ */
5
+ import { defaultLogger } from './types/common.js';
6
+ import { TokenManager } from './core/token-manager.js';
7
+ import { RequestHandler } from './core/request.js';
8
+ import { AuthService } from './service/auth/index.js';
9
+ import { WorkItemService } from './service/workitem/workItem.js';
10
+ import { SpaceService } from './service/space/space.js';
11
+ import { UserService } from './service/user/user.js';
12
+ import { ConfigService } from './service/config/config.js';
13
+ import { ViewService } from './service/view/view.js';
14
+ import { MeasureService } from './service/measure/index.js';
15
+ import { TenantService } from './service/tenant/tenant.js';
16
+ /** 默认 API 基础 URL */
17
+ const DEFAULT_BASE_URL = 'https://project.feishu.cn';
18
+ /** 默认超时 30 秒 */
19
+ const DEFAULT_TIMEOUT = 30000;
20
+ /**
21
+ * Meego SDK 客户端
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * // 初始化客户端
26
+ * const client = new MeegoClient({
27
+ * pluginId: 'MII_xxx',
28
+ * pluginSecret: 'xxx',
29
+ * });
30
+ *
31
+ * // 使用认证服务
32
+ * const pluginToken = await client.auth.getPluginToken();
33
+ *
34
+ * // 通过授权码获取用户 token
35
+ * const userInfo = await client.auth.getUserToken(code);
36
+ *
37
+ * // 使用工作项服务
38
+ * const workItems = await client.workItem.query('project', 'story', { work_item_ids: [123] });
39
+ *
40
+ * // 使用工作项子服务
41
+ * const searchResult = await client.workItem.search.filter('project', { work_item_type_keys: ['story'] });
42
+ * const comments = await client.workItem.comment.list('project', 'story', 123);
43
+ * ```
44
+ */
45
+ export class MeegoClient {
46
+ /** 认证服务 */
47
+ auth;
48
+ /**
49
+ * 工作项服务
50
+ *
51
+ * 包含子服务:
52
+ * - search: 搜索与筛选
53
+ * - batch: 批量操作
54
+ * - comment: 评论管理
55
+ * - subtask: 子任务管理
56
+ * - attachment: 附件管理
57
+ * - chat: 群聊管理
58
+ */
59
+ workItem;
60
+ /**
61
+ * 空间服务
62
+ *
63
+ * 包含子服务:
64
+ * - relation: 空间关联
65
+ */
66
+ space;
67
+ /**
68
+ * 用户服务
69
+ *
70
+ * 包含子服务:
71
+ * - group: 用户组管理
72
+ */
73
+ user;
74
+ /**
75
+ * 配置服务
76
+ *
77
+ * 包含子服务:
78
+ * - basic: 基础配置
79
+ * - field: 字段配置
80
+ * - relation: 关系配置
81
+ * - resource: 资源库配置
82
+ * - role: 角色配置
83
+ * - template: 模板配置
84
+ */
85
+ config;
86
+ /**
87
+ * 视图服务
88
+ *
89
+ * 包含子服务:
90
+ * - query: 视图查询
91
+ */
92
+ view;
93
+ /**
94
+ * 度量服务
95
+ *
96
+ * 包含子服务:
97
+ * - query: 度量查询
98
+ */
99
+ measure;
100
+ /**
101
+ * 租户服务(ISV 场景)
102
+ *
103
+ * - getInfo: 获取商业租户信息
104
+ * - getEntitlement: 查询租户权益
105
+ * - listInstalledSpaces: 获取安装空间列表
106
+ */
107
+ tenant;
108
+ /** Token 管理器 (内部使用) */
109
+ tokenManager;
110
+ /** 请求处理器 (内部使用) */
111
+ requestHandler;
112
+ /** Logger */
113
+ logger;
114
+ /** 配置 */
115
+ options;
116
+ constructor(options) {
117
+ // 合并默认配置
118
+ this.options = {
119
+ ...options,
120
+ baseURL: options.baseURL ?? DEFAULT_BASE_URL,
121
+ timeout: options.timeout ?? DEFAULT_TIMEOUT,
122
+ };
123
+ this.logger = options.logger ?? defaultLogger;
124
+ // 初始化 Token 管理器
125
+ this.tokenManager = new TokenManager({
126
+ pluginId: this.options.pluginId,
127
+ pluginSecret: this.options.pluginSecret,
128
+ baseURL: this.options.baseURL,
129
+ logger: this.logger,
130
+ tokenType: this.options.tokenType,
131
+ onTokenRefresh: this.options.onTokenRefresh,
132
+ });
133
+ // 初始化请求处理器
134
+ this.requestHandler = new RequestHandler({
135
+ baseURL: this.options.baseURL,
136
+ tokenManager: this.tokenManager,
137
+ logger: this.logger,
138
+ timeout: this.options.timeout,
139
+ retry: this.options.retry,
140
+ rateLimit: this.options.rateLimit,
141
+ });
142
+ // 初始化服务
143
+ this.auth = new AuthService({
144
+ baseURL: this.options.baseURL,
145
+ tokenManager: this.tokenManager,
146
+ logger: this.logger,
147
+ timeout: this.options.timeout,
148
+ });
149
+ this.workItem = new WorkItemService(this.requestHandler);
150
+ this.space = new SpaceService(this.requestHandler);
151
+ this.user = new UserService(this.requestHandler);
152
+ this.config = new ConfigService(this.requestHandler);
153
+ this.view = new ViewService(this.requestHandler);
154
+ this.measure = new MeasureService(this.requestHandler);
155
+ this.tenant = new TenantService(this.requestHandler);
156
+ this.logger.info('MeegoClient initialized', {
157
+ baseURL: this.options.baseURL,
158
+ pluginId: this.options.pluginId,
159
+ });
160
+ }
161
+ /**
162
+ * 手动设置用户访问凭证
163
+ * 用于从外部设置已有的 token(如从前端传入)
164
+ *
165
+ * @param input 用户 token 信息
166
+ */
167
+ setUserToken(input) {
168
+ this.auth.setUserToken(input);
169
+ }
170
+ /**
171
+ * 获取请求处理器
172
+ * 供其他服务使用
173
+ */
174
+ getRequestHandler() {
175
+ return this.requestHandler;
176
+ }
177
+ /**
178
+ * 获取 Token 管理器
179
+ * 供其他服务使用
180
+ */
181
+ getTokenManager() {
182
+ return this.tokenManager;
183
+ }
184
+ /**
185
+ * 获取 Logger
186
+ */
187
+ getLogger() {
188
+ return this.logger;
189
+ }
190
+ /**
191
+ * 获取配置的基础 URL
192
+ */
193
+ getBaseURL() {
194
+ return this.options.baseURL;
195
+ }
196
+ }
197
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}