@cryozerolabs/n8n-nodes-dingtalk 0.3.4 → 0.5.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 +49 -34
- package/dist/credentials/DingtalkApi.credentials.d.ts +2 -3
- package/dist/credentials/DingtalkApi.credentials.js +28 -29
- package/dist/credentials/DingtalkApi.credentials.js.map +1 -1
- package/dist/credentials/DingtalkRobotApi.credentials.d.ts +9 -0
- package/dist/credentials/DingtalkRobotApi.credentials.js +59 -0
- package/dist/credentials/DingtalkRobotApi.credentials.js.map +1 -0
- package/dist/docs/images/robot-guide.png +0 -0
- package/dist/docs/images/stream-push-guide.png +0 -0
- package/dist/nodes/DingtalkNode/DingtalkNode.node.js +31 -3
- package/dist/nodes/DingtalkNode/DingtalkNode.node.js.map +1 -1
- package/dist/nodes/DingtalkNode/DingtalkNode.node.json +2 -2
- package/dist/nodes/DingtalkNode/DingtalkNodeTrigger.node.d.ts +5 -0
- package/dist/nodes/DingtalkNode/DingtalkNodeTrigger.node.js +65 -0
- package/dist/nodes/DingtalkNode/DingtalkNodeTrigger.node.js.map +1 -0
- package/dist/nodes/DingtalkNode/DingtalkNodeTrigger.node.json +21 -0
- package/dist/nodes/DingtalkNode/resources/doc/index.js +2 -1
- package/dist/nodes/DingtalkNode/resources/doc/index.js.map +1 -1
- package/dist/nodes/DingtalkNode/resources/doc/uploadAttachment.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/doc/uploadAttachment.js +85 -0
- package/dist/nodes/DingtalkNode/resources/doc/uploadAttachment.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/notable/methods/resourceMapping.js +1 -1
- package/dist/nodes/DingtalkNode/resources/notable/methods/resourceMapping.js.map +1 -1
- package/dist/nodes/DingtalkNode/resources/notable/parseUrl.js +1 -0
- package/dist/nodes/DingtalkNode/resources/notable/parseUrl.js.map +1 -1
- package/dist/nodes/DingtalkNode/resources/notable/recordList.js.map +1 -1
- package/dist/nodes/DingtalkNode/resources/robot/dingRecall.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/robot/dingRecall.js +65 -0
- package/dist/nodes/DingtalkNode/resources/robot/dingRecall.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/robot/dingSend.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/robot/dingSend.js +115 -0
- package/dist/nodes/DingtalkNode/resources/robot/dingSend.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/robot/index.d.ts +2 -0
- package/dist/nodes/DingtalkNode/resources/robot/index.js +15 -0
- package/dist/nodes/DingtalkNode/resources/robot/index.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/robot/send.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/robot/send.js +441 -0
- package/dist/nodes/DingtalkNode/resources/robot/send.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/user/getByMobile.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/user/getByMobile.js +39 -0
- package/dist/nodes/DingtalkNode/resources/user/getByMobile.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/user/index.js +3 -1
- package/dist/nodes/DingtalkNode/resources/user/index.js.map +1 -1
- package/dist/nodes/DingtalkNode/resources/user/search.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/user/search.js +71 -0
- package/dist/nodes/DingtalkNode/resources/user/search.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/workflow/index.d.ts +2 -0
- package/dist/nodes/DingtalkNode/resources/workflow/index.js +29 -0
- package/dist/nodes/DingtalkNode/resources/workflow/index.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/workflow/methods/index.d.ts +7 -0
- package/dist/nodes/DingtalkNode/resources/workflow/methods/index.js +10 -0
- package/dist/nodes/DingtalkNode/resources/workflow/methods/index.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/workflow/methods/resourceMapping.d.ts +11 -0
- package/dist/nodes/DingtalkNode/resources/workflow/methods/resourceMapping.js +97 -0
- package/dist/nodes/DingtalkNode/resources/workflow/methods/resourceMapping.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstances.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstances.js +39 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstances.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesComments.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesComments.js +167 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesComments.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesDownload.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesDownload.js +60 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesDownload.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesIds.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesIds.js +118 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesIds.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesSpacesInfos.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesSpacesInfos.js +49 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesSpacesInfos.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesUpdate.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesUpdate.js +209 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesInstancesUpdate.js.map +1 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesTemplatesUserVisibilities.d.ts +3 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesTemplatesUserVisibilities.js +57 -0
- package/dist/nodes/DingtalkNode/resources/workflow/processesTemplatesUserVisibilities.js.map +1 -0
- package/dist/nodes/DingtalkNode/triggers/streamPushTrigger.d.ts +3 -0
- package/dist/nodes/DingtalkNode/triggers/streamPushTrigger.js +307 -0
- package/dist/nodes/DingtalkNode/triggers/streamPushTrigger.js.map +1 -0
- package/dist/nodes/shared/properties/commaSeparatedString.js +0 -1
- package/dist/nodes/shared/properties/commaSeparatedString.js.map +1 -1
- package/dist/nodes/shared/properties/operator.js.map +1 -1
- package/dist/nodes/shared/request.d.ts +5 -1
- package/dist/nodes/shared/request.js +15 -15
- package/dist/nodes/shared/request.js.map +1 -1
- package/dist/package.json +12 -5
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -5
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
这是一个钉钉(DingTalk)的 n8n 社区节点,让你可以在 n8n 工作流中集成钉钉开放平台的各种 API。
|
|
7
7
|
|
|
8
|
-
钉钉是阿里巴巴集团打造的企业级智能移动办公平台,为全球企业组织提供一站式的数字化办公解决方案。本节点基于钉钉开放平台 API 开发,支持 AI 表格、用户管理、身份验证等核心功能。
|
|
8
|
+
钉钉是阿里巴巴集团打造的企业级智能移动办公平台,为全球企业组织提供一站式的数字化办公解决方案。本节点基于钉钉开放平台 API 开发,支持 Stream模式监听事件订阅、AI 表格、用户管理、身份验证等核心功能。
|
|
9
9
|
|
|
10
10
|
> ⚡ 使用教程、最佳实践等详尽说明请访问项目 Wiki:<https://github.com/cryozerolabs/n8n-nodes-dingtalk/wiki>
|
|
11
11
|
|
|
@@ -52,6 +52,26 @@
|
|
|
52
52
|
|
|
53
53
|
### 👥 用户管理 (User)
|
|
54
54
|
- **获取用户详情** - 根据 userId 获取用户信息(unionId)
|
|
55
|
+
- **根据手机号查询用户** - 根据手机号获取用户的userId
|
|
56
|
+
- **搜索用户userId** - 获取指定用户的详细信息
|
|
57
|
+
|
|
58
|
+
### 💼 OA审批(workflow)
|
|
59
|
+
- 获取单个审批实例详情
|
|
60
|
+
- 添加审批评论
|
|
61
|
+
- 下载审批附件
|
|
62
|
+
- 获取审批实例ID列表
|
|
63
|
+
- 获取审批钉盘空间信息
|
|
64
|
+
- 获取指定用户可见的审批表单列表
|
|
65
|
+
- [钉钉专业版💎]更新流程表单审批实例
|
|
66
|
+
|
|
67
|
+
### 🤖 机器人(robot)
|
|
68
|
+
- [钉钉专业版💎]发送DING消息
|
|
69
|
+
- [钉钉专业版💎]撤回已经发送的DING消息
|
|
70
|
+
- 自定义机器人发送群消息
|
|
71
|
+
|
|
72
|
+
### ⚡️ 事件订阅
|
|
73
|
+

|
|
74
|
+
- **Stream模式推送** - 触发器,监听事件订阅回调,Stream 模式不需要公网服务器、IP、域名等资源。
|
|
55
75
|
|
|
56
76
|
|
|
57
77
|
## 🚀 安装指南
|
|
@@ -117,37 +137,16 @@
|
|
|
117
137
|
|
|
118
138
|
本节点目前已实现钉钉开放平台的核心功能。对于尚未开发的 API 接口,你可以通过以下方式扩展使用:
|
|
119
139
|
|
|
120
|
-
####
|
|
121
|
-
|
|
122
|
-
使用本节点的 **身份验证** → **获取访问令牌** 操作来获取 `access_token`:
|
|
123
|
-
|
|
124
|
-
```json
|
|
125
|
-
{
|
|
126
|
-
"resource": "auth",
|
|
127
|
-
"operation": "auth.tokenGet"
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
#### 2. 使用 HTTP Request 节点
|
|
132
|
-
|
|
133
|
-
将获取的 `access_token` 用于 n8n 的 **HTTP Request** 节点来调用任何钉钉 API:
|
|
140
|
+
#### 使用 HTTP Request 节点
|
|
141
|
+
使用 n8n 的 **HTTP Request** 节点来调用任何钉钉 API:
|
|
134
142
|
|
|
135
143
|
**基本配置示例:**
|
|
136
|
-
- **方法**: POST/GET(根据 API 要求)
|
|
144
|
+
- **方法**: POST/GET/PUT(根据 API 要求)
|
|
137
145
|
- **URL**: `https://api.dingtalk.com/v1.0/[API路径]`
|
|
138
|
-
- **
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
"Content-Type": "application/json"
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
- **Body**: 根据具体 API 要求配置
|
|
146
|
-
|
|
147
|
-
**实际应用示例:**
|
|
148
|
-
1. 先运行 "获取访问令牌" 节点
|
|
149
|
-
2. 在 HTTP Request 节点中引用上一步的 token
|
|
150
|
-
3. 调用你需要的钉钉 API
|
|
146
|
+
- **Authentication**: `Predefined Credential Type`
|
|
147
|
+
- **Credential Type**: `Dingtalk API`、`Dingtalk Robot API`
|
|
148
|
+
- **Send Query Parameters**: 根据具体 API 要求配置
|
|
149
|
+
- **Send Body**: 根据具体 API 要求配置
|
|
151
150
|
|
|
152
151
|
这种方式让你可以使用钉钉开放平台的任何 API,而不受本节点当前功能的限制。所有的身份验证和令牌管理都由本节点自动处理。
|
|
153
152
|
|
|
@@ -203,6 +202,20 @@
|
|
|
203
202
|
- [功能请求](https://github.com/cryozerolabs/n8n-nodes-dingtalk/discussions)
|
|
204
203
|
|
|
205
204
|
## 📋 版本历史
|
|
205
|
+
## v0.5.0
|
|
206
|
+
- 新增:部分常用的审批操作
|
|
207
|
+
- 新增:钉钉机器人发送、撤回DING消息(钉钉专业版)
|
|
208
|
+
- 新增:钉钉Stream推送+工作流+AI案例
|
|
209
|
+
- 新增:AI表格(文档)文件上传,详情见案例
|
|
210
|
+
- 修复:AI表格附件字段类型错误,应该是Array
|
|
211
|
+
- 修复:将常用的eslint统一管理
|
|
212
|
+
- 修复:Http Request中Predefined Credential Type不能选择Dingtalk API、Dingtalk Robot API的问题
|
|
213
|
+
|
|
214
|
+
## v0.4.0
|
|
215
|
+
- 新增:根据手机号查询用户、搜索用户userId,简化用户获取unionId的步骤
|
|
216
|
+
- 新增:⚡️Stream模式事件订阅触发器
|
|
217
|
+
- 修改:凭证获取access_token使用企业内部api(钉钉新版本获取的统一access_token的api存在不兼容)
|
|
218
|
+
|
|
206
219
|
### v0.3.4
|
|
207
220
|
- 增强http请求,钉钉应用申请权限后,需要使用新的access_token才会生效,对于`应用尚未开通所需的权限:[XXX.XXX.XXX]`错误,尝试刷新access_token(即使用户没有去修改权限)
|
|
208
221
|
|
|
@@ -210,7 +223,7 @@
|
|
|
210
223
|
- 修复了AccessToken过期后无法自动刷新的问题
|
|
211
224
|
|
|
212
225
|
### v0.3.0
|
|
213
|
-
|
|
226
|
+
#### ⚠️ 升级提示
|
|
214
227
|
|
|
215
228
|
v0.3.0 重构了 AI 表格记录操作的参数模型,请在升级后逐一检查旧工作流中的相关节点:
|
|
216
229
|
|
|
@@ -269,21 +282,23 @@ cd n8n-nodes-dingtalk
|
|
|
269
282
|
npm install
|
|
270
283
|
|
|
271
284
|
# 3. 安装 n8n-node 开发工具(如果尚未安装)
|
|
272
|
-
npm install
|
|
285
|
+
npm install --global @n8n/node-cli
|
|
273
286
|
|
|
274
287
|
# 4. 构建项目
|
|
275
|
-
|
|
288
|
+
npm run build
|
|
276
289
|
|
|
277
290
|
# 5. 设置开发环境变量(可选,用于调试)
|
|
278
|
-
export NODE_ENV=development
|
|
279
291
|
export N8N_LOG_LEVEL=debug
|
|
280
292
|
|
|
281
293
|
# 6. 启动 n8n 开发服务器(自动加载当前节点)
|
|
282
|
-
|
|
294
|
+
npm run dev
|
|
283
295
|
|
|
284
296
|
# 7. 代码格式化和检查
|
|
285
297
|
npm run format
|
|
286
298
|
npm run lint
|
|
299
|
+
|
|
300
|
+
# 8. 发布
|
|
301
|
+
npm run release
|
|
287
302
|
```
|
|
288
303
|
|
|
289
304
|
**开发提示:**
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { ICredentialDataDecryptedObject, ICredentialTestRequest, ICredentialType, IHttpRequestHelper, INodeProperties } from 'n8n-workflow';
|
|
2
|
-
import { IHttpRequestOptions } from 'n8n-workflow/dist/Interfaces';
|
|
1
|
+
import type { IAuthenticate, ICredentialDataDecryptedObject, ICredentialTestRequest, ICredentialType, IHttpRequestHelper, INodeProperties } from 'n8n-workflow';
|
|
3
2
|
export declare class DingtalkApi implements ICredentialType {
|
|
4
3
|
name: string;
|
|
5
4
|
displayName: string;
|
|
@@ -9,6 +8,6 @@ export declare class DingtalkApi implements ICredentialType {
|
|
|
9
8
|
preAuthentication(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject): Promise<{
|
|
10
9
|
accessToken: any;
|
|
11
10
|
}>;
|
|
12
|
-
authenticate
|
|
11
|
+
authenticate: IAuthenticate;
|
|
13
12
|
test: ICredentialTestRequest;
|
|
14
13
|
}
|
|
@@ -52,15 +52,33 @@ class DingtalkApi {
|
|
|
52
52
|
hint: '如果你已经获取了操作人Union ID,可以在这里填写,否则需要通过[用户管理 查询用户详情]获取后,再填写',
|
|
53
53
|
},
|
|
54
54
|
];
|
|
55
|
+
this.authenticate = async (credentials, requestOptions) => {
|
|
56
|
+
var _a, _b, _c, _d;
|
|
57
|
+
const baseURL = (_a = requestOptions.baseURL) !== null && _a !== void 0 ? _a : '';
|
|
58
|
+
const url = (_b = requestOptions.url) !== null && _b !== void 0 ? _b : '';
|
|
59
|
+
const full = url.startsWith('http') ? url : `${baseURL}${url}`;
|
|
60
|
+
if (full.includes('oapi.dingtalk.com')) {
|
|
61
|
+
requestOptions.qs = {
|
|
62
|
+
...((_c = requestOptions.qs) !== null && _c !== void 0 ? _c : {}),
|
|
63
|
+
access_token: credentials.accessToken,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
requestOptions.headers = {
|
|
68
|
+
...((_d = requestOptions.headers) !== null && _d !== void 0 ? _d : {}),
|
|
69
|
+
'x-acs-dingtalk-access-token': credentials.accessToken,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return requestOptions;
|
|
73
|
+
};
|
|
55
74
|
this.test = {
|
|
56
75
|
request: {
|
|
57
76
|
baseURL: 'https://api.dingtalk.com/v1.0',
|
|
58
|
-
url: '=/oauth2/
|
|
77
|
+
url: '=/oauth2/accessToken',
|
|
59
78
|
method: 'POST',
|
|
60
79
|
body: {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
grant_type: 'client_credentials',
|
|
80
|
+
appKey: '={{$credentials.clientId}}',
|
|
81
|
+
appSecret: '={{$credentials.clientSecret}}',
|
|
64
82
|
},
|
|
65
83
|
},
|
|
66
84
|
};
|
|
@@ -68,36 +86,17 @@ class DingtalkApi {
|
|
|
68
86
|
async preAuthentication(credentials) {
|
|
69
87
|
const res = await this.helpers.httpRequest({
|
|
70
88
|
method: 'POST',
|
|
71
|
-
url: `https://api.dingtalk.com/v1.0/oauth2
|
|
89
|
+
url: `https://api.dingtalk.com/v1.0/oauth2/accessToken`,
|
|
72
90
|
body: {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
grant_type: 'client_credentials',
|
|
91
|
+
appKey: credentials.clientId,
|
|
92
|
+
appSecret: credentials.clientSecret,
|
|
76
93
|
},
|
|
77
94
|
});
|
|
78
|
-
|
|
95
|
+
const accessToken = res.accessToken || res.access_token;
|
|
96
|
+
if (res.code || !accessToken) {
|
|
79
97
|
throw new Error(`授权失败: ${res.message}`);
|
|
80
98
|
}
|
|
81
|
-
return { accessToken
|
|
82
|
-
}
|
|
83
|
-
async authenticate(credentials, requestOptions) {
|
|
84
|
-
var _a, _b, _c, _d;
|
|
85
|
-
const baseURL = (_a = requestOptions.baseURL) !== null && _a !== void 0 ? _a : '';
|
|
86
|
-
const url = (_b = requestOptions.url) !== null && _b !== void 0 ? _b : '';
|
|
87
|
-
const full = url.startsWith('http') ? url : `${baseURL}${url}`;
|
|
88
|
-
if (full.includes('oapi.dingtalk.com')) {
|
|
89
|
-
requestOptions.qs = {
|
|
90
|
-
...((_c = requestOptions.qs) !== null && _c !== void 0 ? _c : {}),
|
|
91
|
-
access_token: credentials.accessToken,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
requestOptions.headers = {
|
|
96
|
-
...((_d = requestOptions.headers) !== null && _d !== void 0 ? _d : {}),
|
|
97
|
-
'x-acs-dingtalk-access-token': credentials.accessToken,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
return requestOptions;
|
|
99
|
+
return { accessToken };
|
|
101
100
|
}
|
|
102
101
|
}
|
|
103
102
|
exports.DingtalkApi = DingtalkApi;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DingtalkApi.credentials.js","sourceRoot":"","sources":["../../credentials/DingtalkApi.credentials.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"DingtalkApi.credentials.js","sourceRoot":"","sources":["../../credentials/DingtalkApi.credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IAuthenticate, ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
2
|
+
export declare class DingtalkRobotApi implements ICredentialType {
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
icon: "file:icon.png";
|
|
6
|
+
documentationUrl: string;
|
|
7
|
+
properties: INodeProperties[];
|
|
8
|
+
authenticate: IAuthenticate;
|
|
9
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DingtalkRobotApi = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
class DingtalkRobotApi {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.name = 'dingtalkRobotApi';
|
|
8
|
+
this.displayName = 'DingTalk Robot API';
|
|
9
|
+
this.icon = 'file:icon.png';
|
|
10
|
+
this.documentationUrl = 'https://open.dingtalk.com/document/development/custom-robots-send-group-messages';
|
|
11
|
+
this.properties = [
|
|
12
|
+
{
|
|
13
|
+
displayName: 'AccessToken',
|
|
14
|
+
name: 'accessToken',
|
|
15
|
+
type: 'string',
|
|
16
|
+
required: true,
|
|
17
|
+
default: '',
|
|
18
|
+
placeholder: 'https://oapi.dingtalk.com/robot/send?access_token=<TOKEN>',
|
|
19
|
+
typeOptions: {
|
|
20
|
+
password: true,
|
|
21
|
+
},
|
|
22
|
+
description: '自定义机器人安装后webhook地址中的access_token值。详情参考<a href="https://open.dingtalk.com/document/development/custom-robots-send-group-messages" target="_blank">获取自定义机器人 Webhook 地址</a>。',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
displayName: '签名密钥(可选)',
|
|
26
|
+
name: 'secret',
|
|
27
|
+
type: 'string',
|
|
28
|
+
default: '',
|
|
29
|
+
placeholder: 'SECxxx',
|
|
30
|
+
typeOptions: {
|
|
31
|
+
password: true,
|
|
32
|
+
},
|
|
33
|
+
description: '如果启用了加签校验,请填写密钥,n8n 会自动生成 sign 与 timestamp 参数。<a href="https://open.dingtalk.com/document/robots/customize-robot-security-settings" target="_blank">查看官方API文档</a>',
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
this.authenticate = async (credentials, requestOptions) => {
|
|
37
|
+
var _a;
|
|
38
|
+
const qs = {
|
|
39
|
+
access_token: credentials.accessToken,
|
|
40
|
+
};
|
|
41
|
+
if (credentials.secret) {
|
|
42
|
+
const timestamp = Date.now();
|
|
43
|
+
const base64Sign = (0, node_crypto_1.createHmac)('sha256', credentials.secret)
|
|
44
|
+
.update(`${timestamp}\n${credentials.secret}`)
|
|
45
|
+
.digest('base64');
|
|
46
|
+
const sign = encodeURIComponent(base64Sign);
|
|
47
|
+
qs.timestamp = timestamp;
|
|
48
|
+
qs.sign = sign;
|
|
49
|
+
}
|
|
50
|
+
requestOptions.qs = {
|
|
51
|
+
...((_a = requestOptions.qs) !== null && _a !== void 0 ? _a : {}),
|
|
52
|
+
...qs,
|
|
53
|
+
};
|
|
54
|
+
return requestOptions;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.DingtalkRobotApi = DingtalkRobotApi;
|
|
59
|
+
//# sourceMappingURL=DingtalkRobotApi.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DingtalkRobotApi.credentials.js","sourceRoot":"","sources":["../../credentials/DingtalkRobotApi.credentials.ts"],"names":[],"mappings":";;;AAQA,6CAAyC;AAEzC,MAAa,gBAAgB;IAA7B;QACE,SAAI,GAAG,kBAAkB,CAAC;QAE1B,gBAAW,GAAG,oBAAoB,CAAC;QAEnC,SAAI,GAAG,eAAwB,CAAC;QAEhC,qBAAgB,GACd,kFAAkF,CAAC;QAErF,eAAU,GAAsB;YAC9B;gBACE,WAAW,EAAE,aAAa;gBAC1B,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,2DAA2D;gBACxE,WAAW,EAAE;oBACX,QAAQ,EAAE,IAAI;iBACf;gBACD,WAAW,EACT,2KAA2K;aAC9K;YACD;gBACE,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,QAAQ;gBACrB,WAAW,EAAE;oBACX,QAAQ,EAAE,IAAI;iBACf;gBACD,WAAW,EACT,mKAAmK;aACtK;SACF,CAAC;QAEF,iBAAY,GAAkB,KAAK,EACjC,WAA2C,EAC3C,cAAmC,EACnC,EAAE;;YACF,MAAM,EAAE,GAAgB;gBACtB,YAAY,EAAE,WAAW,CAAC,WAAW;aACtC,CAAC;YAEF,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBAEvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE7B,MAAM,UAAU,GAAG,IAAA,wBAAU,EAAC,QAAQ,EAAE,WAAW,CAAC,MAAgB,CAAC;qBAClE,MAAM,CAAC,GAAG,SAAS,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;qBAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAEpB,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;gBAE5C,EAAE,CAAC,SAAS,GAAG,SAAS,CAAC;gBACzB,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,CAAC;YAED,cAAc,CAAC,EAAE,GAAG;gBAClB,GAAG,CAAC,MAAA,cAAc,CAAC,EAAE,mCAAI,EAAE,CAAC;gBAC5B,GAAG,EAAE;aACN,CAAC;YAEF,OAAO,cAAc,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC;CAAA;AAnED,4CAmEC"}
|
|
Binary file
|
|
Binary file
|
|
@@ -7,10 +7,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.DingtalkNode = void 0;
|
|
8
8
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
9
9
|
const auth_1 = __importDefault(require("./resources/auth"));
|
|
10
|
+
const doc_1 = __importDefault(require("./resources/doc"));
|
|
10
11
|
const notable_1 = __importDefault(require("./resources/notable"));
|
|
12
|
+
const robot_1 = __importDefault(require("./resources/robot"));
|
|
11
13
|
const user_1 = __importDefault(require("./resources/user"));
|
|
12
|
-
const
|
|
13
|
-
const bundles = [
|
|
14
|
+
const workflow_1 = __importDefault(require("./resources/workflow"));
|
|
15
|
+
const bundles = [
|
|
16
|
+
auth_1.default,
|
|
17
|
+
doc_1.default,
|
|
18
|
+
notable_1.default,
|
|
19
|
+
robot_1.default,
|
|
20
|
+
user_1.default,
|
|
21
|
+
workflow_1.default,
|
|
22
|
+
];
|
|
14
23
|
const seen = {};
|
|
15
24
|
for (const b of bundles)
|
|
16
25
|
seen[b.value] = ((_a = seen[b.value]) !== null && _a !== void 0 ? _a : 0) + 1;
|
|
@@ -67,7 +76,26 @@ class DingtalkNode {
|
|
|
67
76
|
usableAsTool: true,
|
|
68
77
|
inputs: ["main"],
|
|
69
78
|
outputs: ["main"],
|
|
70
|
-
credentials: [
|
|
79
|
+
credentials: [
|
|
80
|
+
{
|
|
81
|
+
name: 'dingtalkApi',
|
|
82
|
+
required: true,
|
|
83
|
+
displayOptions: {
|
|
84
|
+
hide: {
|
|
85
|
+
operation: ['robot.send', 'notable.parseUrl'],
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'dingtalkRobotApi',
|
|
91
|
+
required: true,
|
|
92
|
+
displayOptions: {
|
|
93
|
+
show: {
|
|
94
|
+
operation: ['robot.send'],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
],
|
|
71
99
|
properties: [resourceProperty, ...resourceOperationProps, ...aggregatedParams],
|
|
72
100
|
};
|
|
73
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DingtalkNode.node.js","sourceRoot":"","sources":["../../../nodes/DingtalkNode/DingtalkNode.node.ts"],"names":[],"mappings":";;;;;;;AAAA,+CASsB;AAGtB,4DAA0C;AAC1C,kEAAgD;AAChD,4DAA0C;AAC1C,
|
|
1
|
+
{"version":3,"file":"DingtalkNode.node.js","sourceRoot":"","sources":["../../../nodes/DingtalkNode/DingtalkNode.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type INodeType, type INodeTypeDescription, type ITriggerFunctions, type ITriggerResponse } from 'n8n-workflow';
|
|
2
|
+
export declare class DingtalkNodeTrigger implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
trigger(this: ITriggerFunctions): Promise<ITriggerResponse | undefined>;
|
|
5
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DingtalkNodeTrigger = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
const streamPushTrigger_1 = require("./triggers/streamPushTrigger");
|
|
6
|
+
const triggerDefinitions = [
|
|
7
|
+
{
|
|
8
|
+
value: 'stream.push',
|
|
9
|
+
name: 'Stream模式事件订阅',
|
|
10
|
+
description: '当钉钉通过 Stream 模式推送事件时触发。',
|
|
11
|
+
properties: streamPushTrigger_1.streamPushTriggerOptions,
|
|
12
|
+
run: streamPushTrigger_1.runStreamPushTrigger,
|
|
13
|
+
},
|
|
14
|
+
];
|
|
15
|
+
const triggerMap = new Map(triggerDefinitions.map((def) => [def.value, def]));
|
|
16
|
+
class DingtalkNodeTrigger {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.description = {
|
|
19
|
+
displayName: 'Dingtalk Node Trigger',
|
|
20
|
+
name: 'dingtalkNodeTrigger',
|
|
21
|
+
icon: 'file:icon.png',
|
|
22
|
+
group: ['trigger'],
|
|
23
|
+
version: 1,
|
|
24
|
+
description: 'Dingtalk Node Trigger',
|
|
25
|
+
subtitle: '={{($parameter["event"])}}',
|
|
26
|
+
defaults: {
|
|
27
|
+
name: 'Dingtalk Node Trigger',
|
|
28
|
+
},
|
|
29
|
+
inputs: [],
|
|
30
|
+
outputs: ["main"],
|
|
31
|
+
credentials: [
|
|
32
|
+
{
|
|
33
|
+
name: 'dingtalkApi',
|
|
34
|
+
required: true,
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
properties: [
|
|
38
|
+
{
|
|
39
|
+
displayName: 'Event',
|
|
40
|
+
name: 'event',
|
|
41
|
+
type: 'options',
|
|
42
|
+
default: 'stream.push',
|
|
43
|
+
options: triggerDefinitions.map((def) => ({
|
|
44
|
+
name: def.name,
|
|
45
|
+
value: def.value,
|
|
46
|
+
description: def.description,
|
|
47
|
+
})),
|
|
48
|
+
},
|
|
49
|
+
...triggerDefinitions.flatMap((def) => def.properties),
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async trigger() {
|
|
54
|
+
const event = this.getNodeParameter('event', 0);
|
|
55
|
+
const definition = triggerMap.get(event);
|
|
56
|
+
if (!definition) {
|
|
57
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unsupported trigger event "${event}"`, {
|
|
58
|
+
description: '请选择一个可用的触发类型。',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return definition.run.call(this);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.DingtalkNodeTrigger = DingtalkNodeTrigger;
|
|
65
|
+
//# sourceMappingURL=DingtalkNodeTrigger.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DingtalkNodeTrigger.node.js","sourceRoot":"","sources":["../../../nodes/DingtalkNode/DingtalkNodeTrigger.node.ts"],"names":[],"mappings":";;;AAAA,+CAQsB;AACtB,oEAA8F;AAU9F,MAAM,kBAAkB,GAAwB;IAC9C;QACE,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,yBAAyB;QACtC,UAAU,EAAE,4CAAwB;QACpC,GAAG,EAAE,wCAAoB;KAC1B;CACF,CAAC;AAEF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAE9E,MAAa,mBAAmB;IAAhC;QACE,gBAAW,GAAyB;YAClC,WAAW,EAAE,uBAAuB;YACpC,IAAI,EAAE,qBAAqB;YAC3B,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,CAAC,SAAS,CAAC;YAClB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,uBAAuB;YACpC,QAAQ,EAAE,4BAA4B;YACtC,QAAQ,EAAE;gBACR,IAAI,EAAE,uBAAuB;aAC9B;YACD,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,QAAyB;YAClC,WAAW,EAAE;gBACX;oBACE,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,IAAI;iBACf;aACF;YACD,UAAU,EAAE;gBACV;oBACE,WAAW,EAAE,OAAO;oBACpB,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,SAAS;oBAEf,OAAO,EAAE,aAAa;oBACtB,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBACxC,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,WAAW,EAAE,GAAG,CAAC,WAAW;qBAC7B,CAAC,CAAC;iBACJ;gBACD,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;aACvD;SACF,CAAC;IAaJ,CAAC;IAXC,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAW,CAAC;QAC1D,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,iCAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,8BAA8B,KAAK,GAAG,EAAE;gBACnF,WAAW,EAAE,eAAe;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF;AAhDD,kDAgDC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"node": "@cryozerolabs/n8n-nodes-dingtalk",
|
|
3
|
+
"nodeVersion": "0.5.0",
|
|
4
|
+
"codexVersion": "0.5.0",
|
|
5
|
+
"categories": ["Productivity", "Communication"],
|
|
6
|
+
"resources": {
|
|
7
|
+
"credentialDocumentation": [
|
|
8
|
+
{
|
|
9
|
+
"url": "https://github.com/cryozerolabs/n8n-nodes-dingtalk?tab=readme-ov-file#-%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E9%85%8D%E7%BD%AE"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"primaryDocumentation": [
|
|
13
|
+
{
|
|
14
|
+
"url": "https://github.com/cryozerolabs/n8n-nodes-dingtalk?tab=readme-ov-file"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"url": "https://open.dingtalk.com/document/development/develop-stream-mode-push-server"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -5,9 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const resource_1 = require("../../../shared/resource");
|
|
7
7
|
const resourceGetUploadinfo_1 = __importDefault(require("./resourceGetUploadinfo"));
|
|
8
|
+
const uploadAttachment_1 = __importDefault(require("./uploadAttachment"));
|
|
8
9
|
exports.default = (0, resource_1.makeResourceBundle)({
|
|
9
10
|
value: 'doc',
|
|
10
11
|
name: '文档',
|
|
11
|
-
operations: [resourceGetUploadinfo_1.default],
|
|
12
|
+
operations: [resourceGetUploadinfo_1.default, uploadAttachment_1.default],
|
|
12
13
|
});
|
|
13
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../nodes/DingtalkNode/resources/doc/index.ts"],"names":[],"mappings":";;;;;AAAA,uDAA8D;AAC9D,oFAA4D;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../nodes/DingtalkNode/resources/doc/index.ts"],"names":[],"mappings":";;;;;AAAA,uDAA8D;AAC9D,oFAA4D;AAC5D,0EAAkD;AAElD,kBAAe,IAAA,6BAAkB,EAAC;IAChC,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,UAAU,EAAE,CAAC,+BAAqB,EAAE,0BAAgB,CAAC;CACtD,CAAC,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
4
|
+
const request_1 = require("../../../shared/request");
|
|
5
|
+
const operator_1 = require("../../../shared/properties/operator");
|
|
6
|
+
const OP = 'doc.resource.upload';
|
|
7
|
+
const showOnly = { show: { operation: [OP] } };
|
|
8
|
+
const properties = [
|
|
9
|
+
...(0, operator_1.operatorProps)(showOnly),
|
|
10
|
+
{
|
|
11
|
+
displayName: '文档ID',
|
|
12
|
+
name: 'docId',
|
|
13
|
+
type: 'string',
|
|
14
|
+
default: '',
|
|
15
|
+
required: true,
|
|
16
|
+
hint: 'dentryUuid/documentId/workbookId/baseId',
|
|
17
|
+
displayOptions: showOnly,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
displayName: '二进制文件字段',
|
|
21
|
+
name: 'inputDataFieldName',
|
|
22
|
+
type: 'string',
|
|
23
|
+
default: 'data',
|
|
24
|
+
required: true,
|
|
25
|
+
description: '要处理的二进制文件数据所对应的传入字段名称,例如 data',
|
|
26
|
+
displayOptions: showOnly,
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
const op = {
|
|
30
|
+
value: OP,
|
|
31
|
+
name: '获取资源上传信息并上传',
|
|
32
|
+
description: '获取文档指定资源的上传地址,并上传附件到该资源',
|
|
33
|
+
properties,
|
|
34
|
+
async run(itemIndex) {
|
|
35
|
+
var _a;
|
|
36
|
+
const operatorId = await (0, operator_1.getOperatorId)(this, itemIndex);
|
|
37
|
+
const docId = this.getNodeParameter('docId', itemIndex);
|
|
38
|
+
const inputDataFieldName = this.getNodeParameter('inputDataFieldName', itemIndex);
|
|
39
|
+
const binaryData = this.helpers.assertBinaryData(itemIndex, inputDataFieldName);
|
|
40
|
+
const uploadBuffer = await this.helpers.getBinaryDataBuffer(itemIndex, inputDataFieldName);
|
|
41
|
+
if (!binaryData) {
|
|
42
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), '未找到需要上传的文件数据', { itemIndex });
|
|
43
|
+
}
|
|
44
|
+
const fileInfo = {
|
|
45
|
+
filename: (_a = binaryData.fileName) !== null && _a !== void 0 ? _a : 'file',
|
|
46
|
+
size: uploadBuffer.length || 0,
|
|
47
|
+
type: binaryData.mimeType,
|
|
48
|
+
};
|
|
49
|
+
const uploadInfoResp = (await request_1.request.call(this, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
url: `/doc/docs/resources/${docId}/uploadInfos/query?operatorId=${operatorId}`,
|
|
52
|
+
body: {
|
|
53
|
+
size: fileInfo.size,
|
|
54
|
+
mediaType: fileInfo.type,
|
|
55
|
+
resourceName: fileInfo.filename,
|
|
56
|
+
},
|
|
57
|
+
}));
|
|
58
|
+
this.logger.debug('uploadInfoResp', uploadInfoResp);
|
|
59
|
+
const result = uploadInfoResp === null || uploadInfoResp === void 0 ? void 0 : uploadInfoResp.result;
|
|
60
|
+
const { resourceId, resourceUrl, uploadUrl } = result;
|
|
61
|
+
if (!uploadUrl) {
|
|
62
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), '未获取到上传地址', { itemIndex });
|
|
63
|
+
}
|
|
64
|
+
await request_1.request.call(this, {
|
|
65
|
+
method: 'PUT',
|
|
66
|
+
url: uploadUrl,
|
|
67
|
+
headers: {
|
|
68
|
+
'Content-Type': fileInfo.type,
|
|
69
|
+
},
|
|
70
|
+
body: uploadBuffer,
|
|
71
|
+
json: false,
|
|
72
|
+
encoding: null,
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
json: {
|
|
76
|
+
...fileInfo,
|
|
77
|
+
resourceId,
|
|
78
|
+
url: resourceUrl,
|
|
79
|
+
},
|
|
80
|
+
pairedItem: { item: itemIndex },
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
exports.default = op;
|
|
85
|
+
//# sourceMappingURL=uploadAttachment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploadAttachment.js","sourceRoot":"","sources":["../../../../../nodes/DingtalkNode/resources/doc/uploadAttachment.ts"],"names":[],"mappings":";;AAAA,+CAMsB;AAEtB,qDAAkD;AAClD,kEAAmF;AAEnF,MAAM,EAAE,GAAG,qBAAqB,CAAC;AACjC,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AAE/C,MAAM,UAAU,GAAsB;IACpC,GAAG,IAAA,wBAAa,EAAC,QAAQ,CAAC;IAC1B;QACE,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,yCAAyC;QAC/C,cAAc,EAAE,QAAQ;KACzB;IACD;QACE,WAAW,EAAE,SAAS;QACtB,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,+BAA+B;QAC5C,cAAc,EAAE,QAAQ;KACzB;CACF,CAAC;AAEF,MAAM,EAAE,GAAiB;IACvB,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,yBAAyB;IACtC,UAAU;IAEV,KAAK,CAAC,GAAG,CAA0B,SAAiB;;QAClD,MAAM,UAAU,GAAG,MAAM,IAAA,wBAAa,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAW,CAAC;QAGlE,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,SAAS,CAAW,CAAC;QAC5F,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAChF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAE3F,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,iCAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,QAAQ,GAAG;YACf,QAAQ,EAAE,MAAA,UAAU,CAAC,QAAQ,mCAAI,MAAM;YACvC,IAAI,EAAE,YAAY,CAAC,MAAM,IAAI,CAAC;YAC9B,IAAI,EAAE,UAAU,CAAC,QAAQ;SAC1B,CAAC;QAGF,MAAM,cAAc,GAAG,CAAC,MAAM,iBAAO,CAAC,IAAI,CAAC,IAAI,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,uBAAuB,KAAK,iCAAiC,UAAU,EAAE;YAC9E,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,SAAS,EAAE,QAAQ,CAAC,IAAI;gBACxB,YAAY,EAAE,QAAQ,CAAC,QAAQ;aAChC;SACF,CAAC,CAAgB,CAAC;QAEnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAI9B,CAAC;QACF,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;QAEtD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,iCAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,iBAAO,CAAC,IAAI,CAAC,IAAI,EAAE;YACvB,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,SAAS;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,QAAQ,CAAC,IAAI;aAC9B;YACD,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE;gBACJ,GAAG,QAAQ;gBACX,UAAU;gBACV,GAAG,EAAE,WAAW;aACjB;YACD,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAChC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,kBAAe,EAAE,CAAC"}
|