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.
- package/README.md +191 -0
- package/dist/client.d.ts +186 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +197 -0
- package/dist/client.js.map +1 -0
- package/dist/core/base-service.d.ts +156 -0
- package/dist/core/base-service.d.ts.map +1 -0
- package/dist/core/base-service.js +240 -0
- package/dist/core/base-service.js.map +1 -0
- package/dist/core/errors.d.ts +181 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +250 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +72 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +269 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/dist/core/request.d.ts +270 -0
- package/dist/core/request.d.ts.map +1 -0
- package/dist/core/request.js +842 -0
- package/dist/core/request.js.map +1 -0
- package/dist/core/token-manager.d.ts +134 -0
- package/dist/core/token-manager.d.ts.map +1 -0
- package/dist/core/token-manager.js +412 -0
- package/dist/core/token-manager.js.map +1 -0
- package/dist/helpers/auth.d.ts +7 -0
- package/dist/helpers/auth.d.ts.map +1 -0
- package/dist/helpers/auth.js +19 -0
- package/dist/helpers/auth.js.map +1 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/service/auth/index.d.ts +96 -0
- package/dist/service/auth/index.d.ts.map +1 -0
- package/dist/service/auth/index.js +163 -0
- package/dist/service/auth/index.js.map +1 -0
- package/dist/service/config/basic.d.ts +37 -0
- package/dist/service/config/basic.d.ts.map +1 -0
- package/dist/service/config/basic.js +54 -0
- package/dist/service/config/basic.js.map +1 -0
- package/dist/service/config/config.d.ts +27 -0
- package/dist/service/config/config.d.ts.map +1 -0
- package/dist/service/config/config.js +34 -0
- package/dist/service/config/config.js.map +1 -0
- package/dist/service/config/field.d.ts +50 -0
- package/dist/service/config/field.d.ts.map +1 -0
- package/dist/service/config/field.js +74 -0
- package/dist/service/config/field.js.map +1 -0
- package/dist/service/config/relation.d.ts +53 -0
- package/dist/service/config/relation.d.ts.map +1 -0
- package/dist/service/config/relation.js +66 -0
- package/dist/service/config/relation.js.map +1 -0
- package/dist/service/config/resource.d.ts +59 -0
- package/dist/service/config/resource.d.ts.map +1 -0
- package/dist/service/config/resource.js +75 -0
- package/dist/service/config/resource.js.map +1 -0
- package/dist/service/config/role.d.ts +55 -0
- package/dist/service/config/role.d.ts.map +1 -0
- package/dist/service/config/role.js +90 -0
- package/dist/service/config/role.js.map +1 -0
- package/dist/service/config/template.d.ts +65 -0
- package/dist/service/config/template.d.ts.map +1 -0
- package/dist/service/config/template.js +95 -0
- package/dist/service/config/template.js.map +1 -0
- package/dist/service/measure/index.d.ts +26 -0
- package/dist/service/measure/index.d.ts.map +1 -0
- package/dist/service/measure/index.js +36 -0
- package/dist/service/measure/index.js.map +1 -0
- package/dist/service/measure/query.d.ts +56 -0
- package/dist/service/measure/query.d.ts.map +1 -0
- package/dist/service/measure/query.js +86 -0
- package/dist/service/measure/query.js.map +1 -0
- package/dist/service/space/relation.d.ts +63 -0
- package/dist/service/space/relation.d.ts.map +1 -0
- package/dist/service/space/relation.js +102 -0
- package/dist/service/space/relation.js.map +1 -0
- package/dist/service/space/space.d.ts +81 -0
- package/dist/service/space/space.d.ts.map +1 -0
- package/dist/service/space/space.js +110 -0
- package/dist/service/space/space.js.map +1 -0
- package/dist/service/tenant/tenant.d.ts +52 -0
- package/dist/service/tenant/tenant.d.ts.map +1 -0
- package/dist/service/tenant/tenant.js +75 -0
- package/dist/service/tenant/tenant.js.map +1 -0
- package/dist/service/user/group.d.ts +47 -0
- package/dist/service/user/group.d.ts.map +1 -0
- package/dist/service/user/group.js +70 -0
- package/dist/service/user/group.js.map +1 -0
- package/dist/service/user/query.d.ts +25 -0
- package/dist/service/user/query.d.ts.map +1 -0
- package/dist/service/user/query.js +26 -0
- package/dist/service/user/query.js.map +1 -0
- package/dist/service/user/search.d.ts +25 -0
- package/dist/service/user/search.d.ts.map +1 -0
- package/dist/service/user/search.js +26 -0
- package/dist/service/user/search.js.map +1 -0
- package/dist/service/user/user.d.ts +37 -0
- package/dist/service/user/user.d.ts.map +1 -0
- package/dist/service/user/user.js +46 -0
- package/dist/service/user/user.js.map +1 -0
- package/dist/service/view/query.d.ts +52 -0
- package/dist/service/view/query.d.ts.map +1 -0
- package/dist/service/view/query.js +76 -0
- package/dist/service/view/query.js.map +1 -0
- package/dist/service/view/view.d.ts +76 -0
- package/dist/service/view/view.d.ts.map +1 -0
- package/dist/service/view/view.js +108 -0
- package/dist/service/view/view.js.map +1 -0
- package/dist/service/workitem/attachment.d.ts +143 -0
- package/dist/service/workitem/attachment.d.ts.map +1 -0
- package/dist/service/workitem/attachment.js +231 -0
- package/dist/service/workitem/attachment.js.map +1 -0
- package/dist/service/workitem/batch.d.ts +135 -0
- package/dist/service/workitem/batch.d.ts.map +1 -0
- package/dist/service/workitem/batch.js +146 -0
- package/dist/service/workitem/batch.js.map +1 -0
- package/dist/service/workitem/chat.d.ts +42 -0
- package/dist/service/workitem/chat.d.ts.map +1 -0
- package/dist/service/workitem/chat.js +50 -0
- package/dist/service/workitem/chat.js.map +1 -0
- package/dist/service/workitem/comment.d.ts +139 -0
- package/dist/service/workitem/comment.d.ts.map +1 -0
- package/dist/service/workitem/comment.js +180 -0
- package/dist/service/workitem/comment.js.map +1 -0
- package/dist/service/workitem/review.d.ts +44 -0
- package/dist/service/workitem/review.d.ts.map +1 -0
- package/dist/service/workitem/review.js +49 -0
- package/dist/service/workitem/review.js.map +1 -0
- package/dist/service/workitem/search.d.ts +213 -0
- package/dist/service/workitem/search.d.ts.map +1 -0
- package/dist/service/workitem/search.js +242 -0
- package/dist/service/workitem/search.js.map +1 -0
- package/dist/service/workitem/subtask.d.ts +193 -0
- package/dist/service/workitem/subtask.d.ts.map +1 -0
- package/dist/service/workitem/subtask.js +247 -0
- package/dist/service/workitem/subtask.js.map +1 -0
- package/dist/service/workitem/workItem.d.ts +225 -0
- package/dist/service/workitem/workItem.d.ts.map +1 -0
- package/dist/service/workitem/workItem.js +310 -0
- package/dist/service/workitem/workItem.js.map +1 -0
- package/dist/service/workitem/workflow.d.ts +214 -0
- package/dist/service/workitem/workflow.d.ts.map +1 -0
- package/dist/service/workitem/workflow.js +281 -0
- package/dist/service/workitem/workflow.js.map +1 -0
- package/dist/service/workitem/workhour.d.ts +63 -0
- package/dist/service/workitem/workhour.d.ts.map +1 -0
- package/dist/service/workitem/workhour.js +93 -0
- package/dist/service/workitem/workhour.js.map +1 -0
- package/dist/types/auth.d.ts +115 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +6 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/common.d.ts +354 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +14 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/config.d.ts +305 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/measure.d.ts +55 -0
- package/dist/types/measure.d.ts.map +1 -0
- package/dist/types/measure.js +6 -0
- package/dist/types/measure.js.map +1 -0
- package/dist/types/space.d.ts +164 -0
- package/dist/types/space.d.ts.map +1 -0
- package/dist/types/space.js +6 -0
- package/dist/types/space.js.map +1 -0
- package/dist/types/tenant.d.ts +106 -0
- package/dist/types/tenant.d.ts.map +1 -0
- package/dist/types/tenant.js +6 -0
- package/dist/types/tenant.js.map +1 -0
- package/dist/types/user.d.ts +110 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +6 -0
- package/dist/types/user.js.map +1 -0
- package/dist/types/view.d.ts +162 -0
- package/dist/types/view.d.ts.map +1 -0
- package/dist/types/view.js +6 -0
- package/dist/types/view.js.map +1 -0
- package/dist/types/workitem.d.ts +1523 -0
- package/dist/types/workitem.d.ts.map +1 -0
- package/dist/types/workitem.js +6 -0
- package/dist/types/workitem.js.map +1 -0
- 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
|
+
```
|
package/dist/client.d.ts
ADDED
|
@@ -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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"}
|