apaas-fed-client 0.1.2 → 0.1.3
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 +135 -34
- package/dist/index.cjs +76 -82
- package/dist/index.mjs +76 -81
- package/package.json +1 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,42 +1,143 @@
|
|
|
1
|
-
#
|
|
1
|
+
# apaas-fed-client(Rollup,ESM/CJS)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
一个面向 APaaS/FED 开发场景的工具库,内置 Excel 解析、多维表格(Bitable)数据解析、字段映射、管道式编排,以及飞书开放平台 SDK 的简化封装。构建产物同时支持 `ESM` 与 `CommonJS (CJS)`。
|
|
4
4
|
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
## 安装
|
|
6
|
+
```bash
|
|
7
|
+
npm install apaas-fed-client
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## 构建与产物
|
|
11
|
+
- 构建:`npm run build`
|
|
12
|
+
- 产物:
|
|
9
13
|
- `dist/index.mjs`(ESM)
|
|
10
14
|
- `dist/index.cjs`(CJS)
|
|
15
|
+
- SourceMap:`dist/index.mjs.map`、`dist/index.cjs.map`
|
|
16
|
+
- 包入口(package.json):
|
|
17
|
+
- `main`: `dist/index.cjs`
|
|
18
|
+
- `module`: `dist/index.mjs`
|
|
19
|
+
- `exports`: `{ import: "./dist/index.mjs", require: "./dist/index.cjs" }`
|
|
11
20
|
|
|
12
|
-
##
|
|
21
|
+
## 快速使用
|
|
13
22
|
- ESM(浏览器或 Node,`type: "module"`)
|
|
14
|
-
|
|
15
|
-
|
|
23
|
+
```js
|
|
24
|
+
import { ExcelParser, BitableParser, FieldMapper, Pipe, createBitableSDK } from 'apaas-fed-client'
|
|
25
|
+
```
|
|
16
26
|
- CommonJS(Node)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
27
|
+
```js
|
|
28
|
+
const { ExcelParser, BitableParser, FieldMapper, Pipe, createBitableSDK } = require('apaas-fed-client')
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 导出清单
|
|
32
|
+
- 函数
|
|
33
|
+
- `parseExcel(mappings, options)`:返回 `(filePath) => parsed` 的解析器函数
|
|
34
|
+
- `createParser(options)`:创建 `ExcelParser` 实例
|
|
35
|
+
- `parseBitableParser(mappings, options)`:返回 `(data) => parsed` 的解析器函数
|
|
36
|
+
- `createBitableParser(options)`:创建 `BitableParser` 实例
|
|
37
|
+
- `createBitableSDK(config, { filter })`:创建读取 Bitable 的 SDK 工厂
|
|
38
|
+
- 类
|
|
39
|
+
- `ExcelParser`:解析本地 Excel 文件为结构化对象
|
|
40
|
+
- `BitableParser`:解析多维表格记录为结构化对象
|
|
41
|
+
- `FieldMapper`:字段映射与类型/格式转换
|
|
42
|
+
- `Pipe`:可配置重试/并行映射的管道式编排
|
|
43
|
+
- `BaseSDK`:飞书开放平台基础封装
|
|
44
|
+
- `Bitable`:基于 `BaseSDK` 的多维表格读取
|
|
45
|
+
|
|
46
|
+
## 使用示例
|
|
47
|
+
### Excel 解析
|
|
48
|
+
```js
|
|
49
|
+
import { ExcelParser } from 'apaas-fed-client'
|
|
50
|
+
const parser = new ExcelParser({})
|
|
51
|
+
const data = parser.parse('/path/to.xlsx', [{
|
|
52
|
+
sheetName: 'Sheet1',
|
|
53
|
+
objectName: 'people',
|
|
54
|
+
fields: {
|
|
55
|
+
Name: { name:'name', type:'string' },
|
|
56
|
+
Age: { name:'age', type:'number' }
|
|
57
|
+
}
|
|
58
|
+
}])
|
|
59
|
+
// data.people => [{ name:'Alice', age:30 }, { name:'Bob', age:25 }]
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 多维表格(Bitable)数据解析
|
|
63
|
+
```js
|
|
64
|
+
import { BitableParser } from 'apaas-fed-client'
|
|
65
|
+
const parser = new BitableParser({})
|
|
66
|
+
const out = await parser.parse([
|
|
67
|
+
{ 姓名:'Alice', 年龄:30 },
|
|
68
|
+
{ 姓名:'Bob', 年龄:25 }
|
|
69
|
+
], [{
|
|
70
|
+
objectName: 'rows',
|
|
71
|
+
fields: {
|
|
72
|
+
姓名: { name:'name', type:'string', primaryKey:true },
|
|
73
|
+
年龄: { name:'age', type:'number' }
|
|
74
|
+
}
|
|
75
|
+
}])
|
|
76
|
+
// out.rows => { 'Alice': { name:'Alice', age:30 }, 'Bob': { name:'Bob', age:25 } }
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 字段映射(FieldMapper)规则
|
|
80
|
+
- `type`: `string` | `number` | `date` | `option` | `user`
|
|
81
|
+
- `preprocess`: `trim` | `upper` | `lower`
|
|
82
|
+
- `format`: 日期格式(支持 `YYYY`, `DD`, `HH` 等)
|
|
83
|
+
- `primaryKey`: 作为主键聚合对象
|
|
84
|
+
- `optionMapping`: 选项值映射(单选/多选)
|
|
85
|
+
- `userMapping`: 用户值映射到 `{ _id }`
|
|
86
|
+
|
|
87
|
+
示例:
|
|
88
|
+
```js
|
|
89
|
+
import { FieldMapper } from 'apaas-fed-client'
|
|
90
|
+
const fm = new FieldMapper({})
|
|
91
|
+
fm.applyFieldRules(' ab ', { type:'string', preprocess:['upper'] }) // ' AB '
|
|
92
|
+
fm.applyFieldRules('1,234', { type:'number' }) // 1234
|
|
93
|
+
fm.applyFieldRules('2024-01-02', { type:'date', format:'YYYY/MM/DD' })// '2024/01/02'
|
|
94
|
+
fm.applyFieldRules('完成', { type:'option', name:'状态' }, { optionMapping:{ 状态:{ 完成:'done' } } }) // 'done'
|
|
95
|
+
fm.applyFieldRules('alice', { type:'user' }, { userMapping:{ alice:'id_1' } }) // { _id:'id_1' }
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 管道(Pipe)
|
|
99
|
+
```js
|
|
100
|
+
import { Pipe } from 'apaas-fed-client'
|
|
101
|
+
const p = new Pipe().pipe(v => v + 1).pipe(v => v * 2)
|
|
102
|
+
await p.run(2) // 6
|
|
103
|
+
await new Pipe().map(v => v * 3).run([1,2,3]) // [3,6,9]
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 飞书 SDK:读取多维表格
|
|
107
|
+
`BaseSDK.createClient` 需要飞书应用的 `appId/appSecret` 或运行环境可获取的租户 token。也可使用简化工厂:
|
|
108
|
+
```js
|
|
109
|
+
import { createBitableSDK } from 'apaas-fed-client'
|
|
110
|
+
const read = await createBitableSDK(
|
|
111
|
+
{ appId:'xxx', appSecret:'yyy', auto:true, context:{}, logger:console, config:{} },
|
|
112
|
+
{ filter:{ status:'done' } }
|
|
113
|
+
)
|
|
114
|
+
const rows = await read({ tableaddress: 'https://foo/bitable/APP_TOKEN?table=TABLE_ID' })
|
|
115
|
+
```
|
|
116
|
+
支持知识库地址(`wiki`),内部会转换为文档 `obj_token`:
|
|
117
|
+
```js
|
|
118
|
+
await read({ tableaddress: 'https://foo/wiki/SPACE_TOKEN?table=TABLE_ID' })
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 测试
|
|
122
|
+
- 需要先构建:`npm run build`
|
|
123
|
+
- 运行工具/导出测试:`node tests/run.mjs`
|
|
124
|
+
- 运行 Bitable 源测试(不依赖真实环境):`node tests/bitable-source.mjs`
|
|
125
|
+
|
|
126
|
+
## 发布到 npm
|
|
127
|
+
- 版本号:`npm version patch -m "release: %s"`
|
|
128
|
+
- 发布(公开):`npm publish --access public`
|
|
129
|
+
- 若账号启用 2FA:
|
|
130
|
+
- 使用一次性密码:`npm publish --otp=<OTP>`
|
|
131
|
+
- 或使用 Granular Access Token 并勾选 “Bypass 2FA for publishing”
|
|
132
|
+
- 项目根创建 `.npmrc`:`//registry.npmjs.org/:_authToken=<YOUR_TOKEN>`
|
|
133
|
+
- 确认仓库与登录:
|
|
134
|
+
- `npm config get registry`(应为 `https://registry.npmjs.org/`)
|
|
135
|
+
- `npm whoami`
|
|
136
|
+
|
|
137
|
+
## 兼容性与注意事项
|
|
138
|
+
- Node:建议 `>= 16`,支持 ESM/CJS 双导出
|
|
139
|
+
- 浏览器直接 `<script>` 引入未提供 UMD,如需可提需求
|
|
140
|
+
- `BaseSDK` 涉及网络调用与运行环境(如 `application.*`),在本地/测试中请使用伪造客户端或 `createBitableSDK` 的自定义配置
|
|
42
141
|
|
|
142
|
+
## 许可证
|
|
143
|
+
MIT
|
package/dist/index.cjs
CHANGED
|
@@ -6,9 +6,7 @@ var os = require('os');
|
|
|
6
6
|
var path = require('path');
|
|
7
7
|
var dayjs = require('dayjs');
|
|
8
8
|
var lark = require('@larksuiteoapi/node-sdk');
|
|
9
|
-
var module$1 = require('module');
|
|
10
9
|
|
|
11
|
-
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
12
10
|
function _interopNamespaceDefault(e) {
|
|
13
11
|
var n = Object.create(null);
|
|
14
12
|
if (e) {
|
|
@@ -476,7 +474,77 @@ class Pipe {
|
|
|
476
474
|
}
|
|
477
475
|
}
|
|
478
476
|
|
|
479
|
-
|
|
477
|
+
class BiTable extends BaseSDK {
|
|
478
|
+
/**
|
|
479
|
+
* 异步加载并读取多维表格数据
|
|
480
|
+
* @param {Object} param - 包含表格地址的参数对象
|
|
481
|
+
* @param {string} param.tableaddress - 多维表格的地址
|
|
482
|
+
* @returns {Promise<Array>} - 返回一个 Promise,解析为包含表格记录的数组
|
|
483
|
+
* @throws {Error} - 当缺少表格 ID、文档 token 不存在或获取数据过程中出错时抛出错误
|
|
484
|
+
* 多维表格参考:查询https://open.larkoffice.com/document/docs/bitable-v1/app-table-record/search
|
|
485
|
+
*
|
|
486
|
+
*/
|
|
487
|
+
async loadAndRead({ tableaddress, filter = {} }) {
|
|
488
|
+
try {
|
|
489
|
+
// 解析表格地址,获取表格的 app_token 和 table_id
|
|
490
|
+
const isWiki = tableaddress.indexOf("wiki") > -1;
|
|
491
|
+
const [urlParts, search] = tableaddress.split("?");
|
|
492
|
+
let [appToken] = urlParts.split("/").reverse();
|
|
493
|
+
const querys = new URLSearchParams(search);
|
|
494
|
+
const tableId = querys.get("table");
|
|
495
|
+
|
|
496
|
+
if (!tableId) {
|
|
497
|
+
throw Error("缺少表格id", tableId);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
if (isWiki) {
|
|
501
|
+
// 知识库的话需要获取知识库信息内的文档token作为apptoken
|
|
502
|
+
const wikiResponse = await this.larkClient.wiki.v2.space.getNode({
|
|
503
|
+
params: {
|
|
504
|
+
obj_type: "wiki",
|
|
505
|
+
token: appToken,
|
|
506
|
+
},
|
|
507
|
+
});
|
|
508
|
+
appToken = wikiResponse?.node?.obj_token;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
if (!appToken) {
|
|
512
|
+
throw Error("文档token不存在", appToken);
|
|
513
|
+
}
|
|
514
|
+
const tableData = [];
|
|
515
|
+
let nextPageToken = "";
|
|
516
|
+
while (true) {
|
|
517
|
+
const params = nextPageToken
|
|
518
|
+
? { page_token: nextPageToken, filter }
|
|
519
|
+
: { filter };
|
|
520
|
+
|
|
521
|
+
console.log("params??", params);
|
|
522
|
+
const { page_token, items, has_more } =
|
|
523
|
+
await this.larkClient.bitable.v1.appTableRecord.search({
|
|
524
|
+
path: {
|
|
525
|
+
app_token: appToken,
|
|
526
|
+
table_id: tableId,
|
|
527
|
+
},
|
|
528
|
+
params: params,
|
|
529
|
+
});
|
|
530
|
+
nextPageToken = page_token;
|
|
531
|
+
if (items) {
|
|
532
|
+
tableData.push(...items);
|
|
533
|
+
}
|
|
534
|
+
if (!has_more) {
|
|
535
|
+
break;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
return tableData;
|
|
539
|
+
} catch (error) {
|
|
540
|
+
// 出现错误时的处理
|
|
541
|
+
throw new Error(
|
|
542
|
+
"从多维表格中获取数据过程中出现错误:" + error?.message || error,
|
|
543
|
+
); // 抛出错误信息
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
480
548
|
let client;
|
|
481
549
|
let hasSetHttpInstance = false;
|
|
482
550
|
|
|
@@ -489,9 +557,7 @@ class BaseSDK {
|
|
|
489
557
|
|
|
490
558
|
get Bitable() {
|
|
491
559
|
try {
|
|
492
|
-
|
|
493
|
-
const Bitable = mod?.default || mod;
|
|
494
|
-
return new Bitable(this.larkClient, this.context, this.logger);
|
|
560
|
+
return new BiTable(this.larkClient, this.context, this.logger);
|
|
495
561
|
} catch (error) {
|
|
496
562
|
this.logger.info("没有找到bitable sdk:", error);
|
|
497
563
|
}
|
|
@@ -499,7 +565,7 @@ class BaseSDK {
|
|
|
499
565
|
|
|
500
566
|
get ChatManage() {
|
|
501
567
|
try {
|
|
502
|
-
const ChatManage = require
|
|
568
|
+
const ChatManage = require("./chatManage");
|
|
503
569
|
return new ChatManage(client, this.context, this.logger);
|
|
504
570
|
} catch (error) {
|
|
505
571
|
this.logger.info("chatManage sdk错误:", error);
|
|
@@ -507,7 +573,7 @@ class BaseSDK {
|
|
|
507
573
|
}
|
|
508
574
|
get ChatMenu() {
|
|
509
575
|
try {
|
|
510
|
-
const ChatMenu = require
|
|
576
|
+
const ChatMenu = require("./chatMenu");
|
|
511
577
|
return new ChatMenu(client, this.context, this.logger);
|
|
512
578
|
} catch (error) {
|
|
513
579
|
this.logger.info("没有找到chatMenu sdk错误:", error);
|
|
@@ -515,7 +581,7 @@ class BaseSDK {
|
|
|
515
581
|
}
|
|
516
582
|
get ChatPin() {
|
|
517
583
|
try {
|
|
518
|
-
const ChatPin = require
|
|
584
|
+
const ChatPin = require("./chatPin");
|
|
519
585
|
return new ChatPin(client, this.context, this.logger);
|
|
520
586
|
} catch (error) {
|
|
521
587
|
this.logger.info("没有找到chatPin sdk错误:", error);
|
|
@@ -523,7 +589,7 @@ class BaseSDK {
|
|
|
523
589
|
}
|
|
524
590
|
get ChatMessage() {
|
|
525
591
|
try {
|
|
526
|
-
const ChatMessage = require
|
|
592
|
+
const ChatMessage = require("./chatMessage");
|
|
527
593
|
return new ChatMessage(client, this.context, this.logger);
|
|
528
594
|
} catch (error) {
|
|
529
595
|
this.logger.info("没有找到ChatMessage sdk错误:", error);
|
|
@@ -735,77 +801,6 @@ class BaseSDK {
|
|
|
735
801
|
}
|
|
736
802
|
}
|
|
737
803
|
|
|
738
|
-
class BiTable extends BaseSDK {
|
|
739
|
-
/**
|
|
740
|
-
* 异步加载并读取多维表格数据
|
|
741
|
-
* @param {Object} param - 包含表格地址的参数对象
|
|
742
|
-
* @param {string} param.tableaddress - 多维表格的地址
|
|
743
|
-
* @returns {Promise<Array>} - 返回一个 Promise,解析为包含表格记录的数组
|
|
744
|
-
* @throws {Error} - 当缺少表格 ID、文档 token 不存在或获取数据过程中出错时抛出错误
|
|
745
|
-
* 多维表格参考:查询https://open.larkoffice.com/document/docs/bitable-v1/app-table-record/search
|
|
746
|
-
*
|
|
747
|
-
*/
|
|
748
|
-
async loadAndRead({ tableaddress, filter = {} }) {
|
|
749
|
-
try {
|
|
750
|
-
// 解析表格地址,获取表格的 app_token 和 table_id
|
|
751
|
-
const isWiki = tableaddress.indexOf("wiki") > -1;
|
|
752
|
-
const [urlParts, search] = tableaddress.split("?");
|
|
753
|
-
let [appToken] = urlParts.split("/").reverse();
|
|
754
|
-
const querys = new URLSearchParams(search);
|
|
755
|
-
const tableId = querys.get("table");
|
|
756
|
-
|
|
757
|
-
if (!tableId) {
|
|
758
|
-
throw Error("缺少表格id", tableId);
|
|
759
|
-
}
|
|
760
|
-
|
|
761
|
-
if (isWiki) {
|
|
762
|
-
// 知识库的话需要获取知识库信息内的文档token作为apptoken
|
|
763
|
-
const wikiResponse = await this.larkClient.wiki.v2.space.getNode({
|
|
764
|
-
params: {
|
|
765
|
-
obj_type: "wiki",
|
|
766
|
-
token: appToken,
|
|
767
|
-
},
|
|
768
|
-
});
|
|
769
|
-
appToken = wikiResponse?.node?.obj_token;
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
if (!appToken) {
|
|
773
|
-
throw Error("文档token不存在", appToken);
|
|
774
|
-
}
|
|
775
|
-
const tableData = [];
|
|
776
|
-
let nextPageToken = "";
|
|
777
|
-
while (true) {
|
|
778
|
-
const params = nextPageToken
|
|
779
|
-
? { page_token: nextPageToken, filter }
|
|
780
|
-
: { filter };
|
|
781
|
-
|
|
782
|
-
console.log("params??", params);
|
|
783
|
-
const { page_token, items, has_more } =
|
|
784
|
-
await this.larkClient.bitable.v1.appTableRecord.search({
|
|
785
|
-
path: {
|
|
786
|
-
app_token: appToken,
|
|
787
|
-
table_id: tableId,
|
|
788
|
-
},
|
|
789
|
-
params: params,
|
|
790
|
-
});
|
|
791
|
-
nextPageToken = page_token;
|
|
792
|
-
if (items) {
|
|
793
|
-
tableData.push(...items);
|
|
794
|
-
}
|
|
795
|
-
if (!has_more) {
|
|
796
|
-
break;
|
|
797
|
-
}
|
|
798
|
-
}
|
|
799
|
-
return tableData;
|
|
800
|
-
} catch (error) {
|
|
801
|
-
// 出现错误时的处理
|
|
802
|
-
throw new Error(
|
|
803
|
-
"从多维表格中获取数据过程中出现错误:" + error?.message || error,
|
|
804
|
-
); // 抛出错误信息
|
|
805
|
-
}
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
|
|
809
804
|
async function createBitableSDK(
|
|
810
805
|
{ appId, appSecret, auto, context, logger, config },
|
|
811
806
|
{ filter = {} } = {},
|
|
@@ -834,4 +829,3 @@ exports.createBitableSDK = createBitableSDK;
|
|
|
834
829
|
exports.createParser = createParser;
|
|
835
830
|
exports.parseBitableParser = parseBitableParser;
|
|
836
831
|
exports.parseExcel = parseExcel;
|
|
837
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/index.mjs
CHANGED
|
@@ -4,7 +4,6 @@ import os from 'os';
|
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import dayjs from 'dayjs';
|
|
6
6
|
import * as lark from '@larksuiteoapi/node-sdk';
|
|
7
|
-
import { createRequire } from 'module';
|
|
8
7
|
|
|
9
8
|
class FieldMapper {
|
|
10
9
|
constructor(options = {}) {
|
|
@@ -454,7 +453,77 @@ class Pipe {
|
|
|
454
453
|
}
|
|
455
454
|
}
|
|
456
455
|
|
|
457
|
-
|
|
456
|
+
class BiTable extends BaseSDK {
|
|
457
|
+
/**
|
|
458
|
+
* 异步加载并读取多维表格数据
|
|
459
|
+
* @param {Object} param - 包含表格地址的参数对象
|
|
460
|
+
* @param {string} param.tableaddress - 多维表格的地址
|
|
461
|
+
* @returns {Promise<Array>} - 返回一个 Promise,解析为包含表格记录的数组
|
|
462
|
+
* @throws {Error} - 当缺少表格 ID、文档 token 不存在或获取数据过程中出错时抛出错误
|
|
463
|
+
* 多维表格参考:查询https://open.larkoffice.com/document/docs/bitable-v1/app-table-record/search
|
|
464
|
+
*
|
|
465
|
+
*/
|
|
466
|
+
async loadAndRead({ tableaddress, filter = {} }) {
|
|
467
|
+
try {
|
|
468
|
+
// 解析表格地址,获取表格的 app_token 和 table_id
|
|
469
|
+
const isWiki = tableaddress.indexOf("wiki") > -1;
|
|
470
|
+
const [urlParts, search] = tableaddress.split("?");
|
|
471
|
+
let [appToken] = urlParts.split("/").reverse();
|
|
472
|
+
const querys = new URLSearchParams(search);
|
|
473
|
+
const tableId = querys.get("table");
|
|
474
|
+
|
|
475
|
+
if (!tableId) {
|
|
476
|
+
throw Error("缺少表格id", tableId);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
if (isWiki) {
|
|
480
|
+
// 知识库的话需要获取知识库信息内的文档token作为apptoken
|
|
481
|
+
const wikiResponse = await this.larkClient.wiki.v2.space.getNode({
|
|
482
|
+
params: {
|
|
483
|
+
obj_type: "wiki",
|
|
484
|
+
token: appToken,
|
|
485
|
+
},
|
|
486
|
+
});
|
|
487
|
+
appToken = wikiResponse?.node?.obj_token;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
if (!appToken) {
|
|
491
|
+
throw Error("文档token不存在", appToken);
|
|
492
|
+
}
|
|
493
|
+
const tableData = [];
|
|
494
|
+
let nextPageToken = "";
|
|
495
|
+
while (true) {
|
|
496
|
+
const params = nextPageToken
|
|
497
|
+
? { page_token: nextPageToken, filter }
|
|
498
|
+
: { filter };
|
|
499
|
+
|
|
500
|
+
console.log("params??", params);
|
|
501
|
+
const { page_token, items, has_more } =
|
|
502
|
+
await this.larkClient.bitable.v1.appTableRecord.search({
|
|
503
|
+
path: {
|
|
504
|
+
app_token: appToken,
|
|
505
|
+
table_id: tableId,
|
|
506
|
+
},
|
|
507
|
+
params: params,
|
|
508
|
+
});
|
|
509
|
+
nextPageToken = page_token;
|
|
510
|
+
if (items) {
|
|
511
|
+
tableData.push(...items);
|
|
512
|
+
}
|
|
513
|
+
if (!has_more) {
|
|
514
|
+
break;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
return tableData;
|
|
518
|
+
} catch (error) {
|
|
519
|
+
// 出现错误时的处理
|
|
520
|
+
throw new Error(
|
|
521
|
+
"从多维表格中获取数据过程中出现错误:" + error?.message || error,
|
|
522
|
+
); // 抛出错误信息
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
458
527
|
let client;
|
|
459
528
|
let hasSetHttpInstance = false;
|
|
460
529
|
|
|
@@ -467,9 +536,7 @@ class BaseSDK {
|
|
|
467
536
|
|
|
468
537
|
get Bitable() {
|
|
469
538
|
try {
|
|
470
|
-
|
|
471
|
-
const Bitable = mod?.default || mod;
|
|
472
|
-
return new Bitable(this.larkClient, this.context, this.logger);
|
|
539
|
+
return new BiTable(this.larkClient, this.context, this.logger);
|
|
473
540
|
} catch (error) {
|
|
474
541
|
this.logger.info("没有找到bitable sdk:", error);
|
|
475
542
|
}
|
|
@@ -477,7 +544,7 @@ class BaseSDK {
|
|
|
477
544
|
|
|
478
545
|
get ChatManage() {
|
|
479
546
|
try {
|
|
480
|
-
const ChatManage = require
|
|
547
|
+
const ChatManage = require("./chatManage");
|
|
481
548
|
return new ChatManage(client, this.context, this.logger);
|
|
482
549
|
} catch (error) {
|
|
483
550
|
this.logger.info("chatManage sdk错误:", error);
|
|
@@ -485,7 +552,7 @@ class BaseSDK {
|
|
|
485
552
|
}
|
|
486
553
|
get ChatMenu() {
|
|
487
554
|
try {
|
|
488
|
-
const ChatMenu = require
|
|
555
|
+
const ChatMenu = require("./chatMenu");
|
|
489
556
|
return new ChatMenu(client, this.context, this.logger);
|
|
490
557
|
} catch (error) {
|
|
491
558
|
this.logger.info("没有找到chatMenu sdk错误:", error);
|
|
@@ -493,7 +560,7 @@ class BaseSDK {
|
|
|
493
560
|
}
|
|
494
561
|
get ChatPin() {
|
|
495
562
|
try {
|
|
496
|
-
const ChatPin = require
|
|
563
|
+
const ChatPin = require("./chatPin");
|
|
497
564
|
return new ChatPin(client, this.context, this.logger);
|
|
498
565
|
} catch (error) {
|
|
499
566
|
this.logger.info("没有找到chatPin sdk错误:", error);
|
|
@@ -501,7 +568,7 @@ class BaseSDK {
|
|
|
501
568
|
}
|
|
502
569
|
get ChatMessage() {
|
|
503
570
|
try {
|
|
504
|
-
const ChatMessage = require
|
|
571
|
+
const ChatMessage = require("./chatMessage");
|
|
505
572
|
return new ChatMessage(client, this.context, this.logger);
|
|
506
573
|
} catch (error) {
|
|
507
574
|
this.logger.info("没有找到ChatMessage sdk错误:", error);
|
|
@@ -713,77 +780,6 @@ class BaseSDK {
|
|
|
713
780
|
}
|
|
714
781
|
}
|
|
715
782
|
|
|
716
|
-
class BiTable extends BaseSDK {
|
|
717
|
-
/**
|
|
718
|
-
* 异步加载并读取多维表格数据
|
|
719
|
-
* @param {Object} param - 包含表格地址的参数对象
|
|
720
|
-
* @param {string} param.tableaddress - 多维表格的地址
|
|
721
|
-
* @returns {Promise<Array>} - 返回一个 Promise,解析为包含表格记录的数组
|
|
722
|
-
* @throws {Error} - 当缺少表格 ID、文档 token 不存在或获取数据过程中出错时抛出错误
|
|
723
|
-
* 多维表格参考:查询https://open.larkoffice.com/document/docs/bitable-v1/app-table-record/search
|
|
724
|
-
*
|
|
725
|
-
*/
|
|
726
|
-
async loadAndRead({ tableaddress, filter = {} }) {
|
|
727
|
-
try {
|
|
728
|
-
// 解析表格地址,获取表格的 app_token 和 table_id
|
|
729
|
-
const isWiki = tableaddress.indexOf("wiki") > -1;
|
|
730
|
-
const [urlParts, search] = tableaddress.split("?");
|
|
731
|
-
let [appToken] = urlParts.split("/").reverse();
|
|
732
|
-
const querys = new URLSearchParams(search);
|
|
733
|
-
const tableId = querys.get("table");
|
|
734
|
-
|
|
735
|
-
if (!tableId) {
|
|
736
|
-
throw Error("缺少表格id", tableId);
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
if (isWiki) {
|
|
740
|
-
// 知识库的话需要获取知识库信息内的文档token作为apptoken
|
|
741
|
-
const wikiResponse = await this.larkClient.wiki.v2.space.getNode({
|
|
742
|
-
params: {
|
|
743
|
-
obj_type: "wiki",
|
|
744
|
-
token: appToken,
|
|
745
|
-
},
|
|
746
|
-
});
|
|
747
|
-
appToken = wikiResponse?.node?.obj_token;
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
if (!appToken) {
|
|
751
|
-
throw Error("文档token不存在", appToken);
|
|
752
|
-
}
|
|
753
|
-
const tableData = [];
|
|
754
|
-
let nextPageToken = "";
|
|
755
|
-
while (true) {
|
|
756
|
-
const params = nextPageToken
|
|
757
|
-
? { page_token: nextPageToken, filter }
|
|
758
|
-
: { filter };
|
|
759
|
-
|
|
760
|
-
console.log("params??", params);
|
|
761
|
-
const { page_token, items, has_more } =
|
|
762
|
-
await this.larkClient.bitable.v1.appTableRecord.search({
|
|
763
|
-
path: {
|
|
764
|
-
app_token: appToken,
|
|
765
|
-
table_id: tableId,
|
|
766
|
-
},
|
|
767
|
-
params: params,
|
|
768
|
-
});
|
|
769
|
-
nextPageToken = page_token;
|
|
770
|
-
if (items) {
|
|
771
|
-
tableData.push(...items);
|
|
772
|
-
}
|
|
773
|
-
if (!has_more) {
|
|
774
|
-
break;
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
return tableData;
|
|
778
|
-
} catch (error) {
|
|
779
|
-
// 出现错误时的处理
|
|
780
|
-
throw new Error(
|
|
781
|
-
"从多维表格中获取数据过程中出现错误:" + error?.message || error,
|
|
782
|
-
); // 抛出错误信息
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
|
|
787
783
|
async function createBitableSDK(
|
|
788
784
|
{ appId, appSecret, auto, context, logger, config },
|
|
789
785
|
{ filter = {} } = {},
|
|
@@ -802,4 +798,3 @@ async function createBitableSDK(
|
|
|
802
798
|
}
|
|
803
799
|
|
|
804
800
|
export { BaseSDK, BiTable as Bitable, BitableParser, ExcelParser, FieldMapper, Pipe, createBitableParser, createBitableSDK, createParser, parseBitableParser, parseExcel };
|
|
805
|
-
//# sourceMappingURL=index.mjs.map
|
package/package.json
CHANGED
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/common/fieldMapper.js","../src/common/excelParse.js","../src/common/bitableParse.js","../src/pipe/index.js","../src/sdk/lark/baseSDK.js","../src/sdk/lark/bitable.js","../src/sdk/index.js"],"sourcesContent":["import dayjs from \"dayjs\";\n\nclass FieldMapper {\n constructor(options = {}) {\n this.options = options;\n }\n\n normalizeFormat(fmt) {\n return String(fmt)\n .replace(/yyyy/g, \"YYYY\")\n .replace(/dd/g, \"DD\")\n .replace(/hh/g, \"HH\");\n }\n\n normalizeFieldConfig(excelKey, desc) {\n if (typeof desc === \"string\")\n return {\n excelKey,\n type: \"string\",\n name: desc,\n required: false,\n default: undefined,\n primaryKey: false,\n format: undefined,\n preprocess: [\"trim\"],\n };\n const cfg = {\n excelKey,\n optionName: desc?.optionName,\n type: desc.type || \"string\",\n name: desc.name || excelKey,\n required: !!desc.required,\n default: desc.default,\n primaryKey: !!desc.primaryKey,\n format: desc.format,\n preprocess: Array.isArray(desc.preprocess)\n ? desc.preprocess\n : desc.preprocess\n ? [desc.preprocess]\n : [\"trim\"],\n maxLength:\n typeof desc.maxLength === \"number\" ? desc.maxLength : undefined,\n minLength:\n typeof desc.minLength === \"number\" ? desc.minLength : undefined,\n enum: Array.isArray(desc.enum) ? desc.enum : undefined,\n pattern: desc.pattern ? new RegExp(desc.pattern) : undefined,\n };\n return cfg;\n }\n\n applyFieldRules(raw, cfg, { optionMapping, userMapping } = {}) {\n let val = raw;\n if (Array.isArray(raw)) {\n if (raw[0]?.text) {\n // 多维表格文本取值\n val = raw[0]?.text;\n }\n if (raw[0]?.name) {\n // 多维表格文员文本取值\n val = raw[0]?.name;\n }\n }\n\n if (val === undefined || val === null || val === \"\") {\n if (cfg.default === undefined) return undefined;\n val = cfg.default;\n }\n if (cfg.type.toLocaleLowerCase() === \"string\") {\n let s = String(val);\n const pp = cfg.preprocess || [];\n if (pp.includes(\"trim\")) s = s.trim();\n if (pp.includes(\"upper\")) s = s.toUpperCase();\n if (pp.includes(\"lower\")) s = s.toLowerCase();\n if (typeof cfg.maxLength === \"number\") s = s.slice(0, cfg.maxLength);\n if (typeof cfg.minLength === \"number\" && s.length < cfg.minLength)\n s = s.padEnd(cfg.minLength, \" \");\n if (cfg.enum && !cfg.enum.includes(s))\n s = cfg.default !== undefined ? String(cfg.default) : \"\";\n if (cfg.pattern && !cfg.pattern.test(s))\n s = cfg.default !== undefined ? String(cfg.default) : \"\";\n return s;\n }\n if (cfg.type.toLocaleLowerCase() === \"number\") {\n const num =\n typeof val === \"number\" ? val : Number(String(val).replace(/,/g, \"\"));\n return Number.isFinite(num)\n ? num\n : cfg.default !== undefined\n ? Number(cfg.default)\n : undefined;\n }\n\n if (cfg.type.toLocaleLowerCase() === \"date\") {\n let d;\n if (typeof val === \"number\") d = val;\n else if (val instanceof Date) d = val;\n else d = dayjs(val).isValid() ? dayjs(val).toDate() : null;\n if (!d) return cfg.default !== undefined ? String(cfg.default) : \"\";\n if (cfg.format) return dayjs(d).format(this.normalizeFormat(cfg.format));\n return dayjs(d).toISOString();\n }\n\n if (cfg.type.toLocaleLowerCase() === \"option\" && optionMapping) {\n const optionName = cfg?.optionName || cfg.name;\n // 多选\n if (Array.isArray(val)) {\n return val.map((v) => optionMapping[optionName][v]);\n }\n // 单选\n if (\n optionMapping[optionName] &&\n optionMapping[optionName][val] !== undefined\n ) {\n return optionMapping[optionName][val];\n }\n }\n\n if (cfg.type.toLocaleLowerCase() === \"user\") {\n if (userMapping) {\n const _id = userMapping[val];\n if (_id) {\n return { _id };\n }\n }\n return undefined;\n }\n\n return val;\n }\n\n normalizeFormat(fmt) {\n return String(fmt)\n .replace(/yyyy/g, \"YYYY\")\n .replace(/dd/g, \"DD\")\n .replace(/hh/g, \"HH\");\n }\n}\n\nexport default FieldMapper;\n","import XLSX from \"xlsx\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport FieldMapper from \"./fieldMapper.js\";\n\nconst filePatSets = new Set();\n\nclass ExcelParser extends FieldMapper {\n constructor(options = {}) {\n super(options);\n this.logger = options.logger || console;\n }\n\n setLogger(logger) {\n this.logger = logger;\n }\n\n static async loadFile({ id, name }) {\n const tmpDir = os.tmpdir();\n const filePath = path.join(tmpDir, name);\n\n await application.resources.file.download({ id }, filePath);\n filePatSets.add(filePath);\n return filePath;\n }\n\n static async destory() {\n console.log(filePatSets);\n\n filePatSets.forEach((filePath) => {\n if (filePath) {\n try {\n fs.unlinkSync(filePath);\n } catch (error) {\n this?.logger?.info(error);\n }\n }\n });\n filePatSets.clear();\n }\n\n parse(filePath, mappings = []) {\n const wb = XLSX.readFile(filePath);\n const out = {};\n for (const conf of mappings) {\n const ws = wb.Sheets[conf.sheetName];\n if (!ws) {\n this.logger.warn(\"sheet not found\", conf.sheetName);\n continue;\n }\n out[conf.objectName || conf.sheetName] = this.parseSheet(ws, conf);\n }\n return out;\n }\n\n parseSheet(ws, sheetConf) {\n const rows = XLSX.utils.sheet_to_json(ws, { defval: \"\" });\n const fields = Object.entries(sheetConf.fields).map(([excelKey, desc]) =>\n this.normalizeFieldConfig(excelKey, desc),\n );\n const pkFields = fields.filter((f) => f.primaryKey);\n const out = pkFields.length ? {} : [];\n const seen = new Set();\n for (const row of rows) {\n const obj = {};\n const pkVals = [];\n let skip = false;\n for (const f of fields) {\n const raw = row[f.excelKey];\n const casted = this.applyFieldRules(raw, f);\n obj[f.name] = casted;\n if (f.primaryKey) pkVals.push(String(casted || \"\"));\n }\n if (pkFields.length) {\n const key = pkVals.filter((s) => s !== \"\").join(\"::\");\n if (key === \"\" || seen.has(key)) {\n if (key !== \"\") this.logger.warn(\"duplicate primaryKey\", key);\n skip = true;\n } else {\n seen.add(key);\n }\n }\n if (skip) continue;\n if (pkFields.length) out[pkVals.filter((s) => s !== \"\").join(\"::\")] = obj;\n else out.push(obj);\n }\n return out;\n }\n}\n\nfunction createParser(options = {}) {\n const parser = new ExcelParser(options);\n return parser;\n}\n\nfunction parseExcel(mappings, options = {}) {\n const parser = createParser(options);\n return (filePath) => parser.parse(filePath, mappings);\n}\n\nexport { ExcelParser, parseExcel, createParser };\n","import FieldMapper from \"./fieldMapper.js\";\n\nclass BitableParser extends FieldMapper {\n constructor(options = {}) {\n super(options);\n this.logger = options.logger || console;\n }\n\n setLogger(logger) {\n this.logger = logger;\n }\n\n async parse(data, mappings = []) {\n const out = {};\n for (const conf of mappings) {\n if (!data) {\n this.logger.warn(\"sheet not found\", conf.objectName);\n continue;\n }\n out[conf.objectName] = this.parseSheet(data, conf);\n }\n return out;\n }\n\n parseSheet(data, sheetConf) {\n if (!data) {\n this.logger(\"data?\", data);\n\n return undefined;\n }\n const fields = Object.entries(sheetConf.fields).map(([excelKey, desc]) =>\n this.normalizeFieldConfig(excelKey, desc),\n );\n const pkFields = fields.filter((f) => f.primaryKey);\n const out = pkFields.length ? {} : [];\n const seen = new Set();\n for (const row of data) {\n if (!row) {\n continue;\n }\n const obj = {};\n const pkVals = [];\n let skip = false;\n if (!fields) {\n this.logger.info(\"fields\", fields);\n return;\n }\n for (const f of fields) {\n const raw = row[f.excelKey];\n const casted = this.applyFieldRules(raw, f, sheetConf);\n obj[f.name] = casted;\n if (f.primaryKey) pkVals.push(String(casted || \"\"));\n }\n if (pkFields.length) {\n const key = pkVals.filter((s) => s !== \"\").join(\"::\");\n if (key === \"\" || seen.has(key)) {\n if (key !== \"\") this.logger.warn(\"duplicate primaryKey\", key);\n skip = true;\n } else {\n seen.add(key);\n }\n }\n if (skip) continue;\n if (pkFields.length) out[pkVals.filter((s) => s !== \"\").join(\"::\")] = obj;\n else out.push(obj);\n }\n return out;\n }\n}\n\nfunction createBitableParser(options = {}) {\n const parser = new BitableParser(options);\n return parser;\n}\n\nfunction parseBitableParser(mappings, options = {}) {\n const parser = createBitableParser(options);\n return function (data) {\n return parser.parse(data, mappings);\n };\n}\n\nexport { BitableParser, parseBitableParser, createBitableParser };\n","class Pipe {\n constructor(steps = [], context = {}) {\n this.steps = steps.map((s) =>\n typeof s === \"function\" ? { fn: s, options: {} } : s,\n );\n this.context = context;\n this._errorHandler = null;\n this._logger = console;\n this._defaultRetry = { retries: 0, retryDelayMs: 0 };\n }\n\n static create() {\n return new Pipe();\n }\n\n with(ctx = {}) {\n this.context = { ...this.context, ...ctx };\n return this;\n }\n\n setLogger(logger) {\n this._logger = logger || {info:console.log};\n return this;\n }\n\n setDefaultRetry(options = {}) {\n const r = options.retries ?? 0;\n const d = options.retryDelayMs ?? 0;\n this._defaultRetry = { retries: r, retryDelayMs: d };\n return this;\n }\n\n pipe(fn, options = {}) {\n if (typeof fn !== \"function\") throw new Error(\"step must be function\");\n this.steps.push({ fn, options });\n return this;\n }\n\n compose(...fns) {\n for (const fn of fns) this.pipe(fn);\n return this;\n }\n\n tap(fn) {\n return this.pipe(async (val, ctx) => {\n await Promise.resolve(fn(val, ctx));\n return val;\n });\n }\n\n catch(handler) {\n this._errorHandler = handler;\n return this;\n }\n\n clone() {\n const cloned = new Pipe(\n this.steps.map((s) => ({ fn: s.fn, options: { ...s.options } })),\n { ...this.context },\n );\n cloned._errorHandler = this._errorHandler;\n cloned._logger = this._logger;\n cloned._defaultRetry = { ...this._defaultRetry };\n return cloned;\n }\n\n map(fn, options = {}) {\n return this.pipe(async (val, ctx) => {\n if (Array.isArray(val)) {\n const out = await Promise.all(\n val.map((x) => Promise.resolve(fn(x, ctx))),\n );\n return out;\n }\n return await Promise.resolve(fn(val, ctx));\n }, options);\n }\n\n pipeWithRetry(fn, options = {}) {\n const { retries = 0, retryDelayMs = 0, onRetry } = options;\n return this.pipe(fn, { retries, retryDelayMs, onRetry });\n }\n\n async run(input) {\n let val = input;\n try {\n for (const step of this.steps) {\n const fn = typeof step === \"function\" ? step : step.fn;\n const opt = typeof step === \"function\" ? {} : step.options || {};\n const retries = opt.retries ?? this._defaultRetry.retries;\n const retryDelayMs =\n opt.retryDelayMs ?? this._defaultRetry.retryDelayMs;\n let attempt = 0;\n while (true) {\n try {\n val = await Promise.resolve(fn(val, this.context));\n break;\n } catch (e) {\n attempt += 1;\n if (attempt <= retries) {\n if (typeof opt.onRetry === \"function\") {\n await Promise.resolve(\n opt.onRetry(\n { error: e, attempt, retries, retryDelayMs },\n this.context,\n ),\n );\n }\n if (this._logger && this._logger.warn)\n this._logger.warn(\n \"[pipe] step error, retry\",\n `${attempt}/${retries}`,\n e.message,\n );\n if (retryDelayMs > 0)\n await new Promise((r) => setTimeout(r, retryDelayMs));\n continue;\n }\n if (this._logger && this._logger.error)\n this._logger.error(\n \"[pipe] step failed after attempts\",\n attempt,\n e,\n );\n throw e;\n }\n }\n }\n return val;\n } catch (e) {\n if (typeof this._errorHandler === \"function\")\n return this._errorHandler(e, val, this.context);\n throw e;\n }\n }\n}\n\nexport default Pipe;\n","import * as lark from \"@larksuiteoapi/node-sdk\";\nimport { createRequire } from \"module\";\nconst require = createRequire(import.meta.url);\nlet client;\nlet hasSetHttpInstance = false;\n\nclass BaseSDK {\n constructor(client, context, logger) {\n this.larkClient = client;\n this.context = context;\n this.logger = logger;\n }\n\n get Bitable() {\n try {\n const mod = require(\"./bitable.js\");\n const Bitable = mod?.default || mod;\n return new Bitable(this.larkClient, this.context, this.logger);\n } catch (error) {\n this.logger.info(\"没有找到bitable sdk:\", error);\n }\n }\n\n get ChatManage() {\n try {\n const ChatManage = require(\"./chatManage\");\n return new ChatManage(client, this.context, this.logger);\n } catch (error) {\n this.logger.info(\"chatManage sdk错误:\", error);\n }\n }\n get ChatMenu() {\n try {\n const ChatMenu = require(\"./chatMenu\");\n return new ChatMenu(client, this.context, this.logger);\n } catch (error) {\n this.logger.info(\"没有找到chatMenu sdk错误:\", error);\n }\n }\n get ChatPin() {\n try {\n const ChatPin = require(\"./chatPin\");\n return new ChatPin(client, this.context, this.logger);\n } catch (error) {\n this.logger.info(\"没有找到chatPin sdk错误:\", error);\n }\n }\n get ChatMessage() {\n try {\n const ChatMessage = require(\"./chatMessage\");\n return new ChatMessage(client, this.context, this.logger);\n } catch (error) {\n this.logger.info(\"没有找到ChatMessage sdk错误:\", error);\n }\n }\n\n /**\n * 静态方法,用于初始化并配置多个 SDK 实例或者客户自定义实例需要调用基于sdk功能\n * @param {Object} ctors - 构造函数对象,键为实例名称,值为构造函数\n * @param {Object} options - 配置选项对象\n * @param {Object} options.context - 上下文对象\n * @param {Object} options.logger - 日志记录器对象\n * @returns {Promise<BaseSDK>} - 返回一个 Promise,解析为配置好的 BaseSDK 实例\n */\n static async use(ctors, options) {\n const { context, logger, ...restOptios } = options;\n const baseSdk = await BaseSDK.createClient({\n context,\n logger,\n ...restOptios,\n });\n for (const key in ctors) {\n const ctor = ctors[key];\n if (typeof ctor === \"function\") {\n const instance = new ctor(baseSdk.larkClient, context, logger);\n baseSdk[key] = instance;\n } else {\n logger.info(\"没有找到sdk:\", key);\n }\n }\n return baseSdk;\n }\n\n /**\n * 静态方法,用于设置默认 HTTP 实例的拦截器\n * @param {Object} [settings={}] - 拦截器配置对象\n * @param {Function} [settings.onResponse] - 响应拦截器回调函数\n * @param {Function} [settings.onError] - 错误拦截器回调函数\n * @param {Object} logger - 日志记录器对象\n */\n static setHttpInstance(settings = {}, logger) {\n if (hasSetHttpInstance) {\n return;\n }\n hasSetHttpInstance = true;\n const { onResponse, onError } = settings;\n lark.defaultHttpInstance.interceptors.response.use(\n async (resp) => {\n logger.info(\"resp\", resp);\n // 如果是用户token或者图片上传接口\n if (resp?.tenant_access_token || resp?.data?.image_key) {\n return resp;\n }\n if (onResponse) {\n return onResponse(resp);\n }\n const data = resp?.data;\n return data;\n },\n async (error) => {\n const detail = [\n \"接口:\",\n error?.request?.path,\n \",error code:\",\n error.response?.data?.code,\n \",失败原因:\",\n error?.response?.data?.msg,\n \"建议排查:\",\n error?.response?.data.error?.troubleshooter ||\n error?.response?.data.error?.message,\n ];\n if (error?.response?.data.error?.helps?.length) {\n detail.push(\n ...[\",参考链接:\", error.response.data.error.helps[0].url],\n );\n }\n if (onError) {\n return Promise.reject(onError(error));\n }\n logger.info(\"调用开放平台接口失败,\", ...detail);\n return Promise.reject(detail.join(\"\"));\n },\n );\n\n lark.defaultHttpInstance.interceptors.request.use((config) => {\n return config;\n });\n }\n\n /**\n * 静态方法,用于创建一个新的客户端实例\n * @param {Object} options - 配置选项对象\n * @param {string} options.appId - 飞书应用的应用 ID\n * @param {string} options.appSecret - 飞书应用的应用 Secret\n * @param {boolean} [options.auto=true] - 是否自动获取租户访问令牌,默认为 true\n * @param {Object} options.context - 上下文对象\n * @param {Object} options.logger - 日志记录器对象\n * @param {Object} options.config - 配置对象,用于设置 HTTP 实例的拦截器\n * @returns {BaseSDK} - 返回一个新的 BaseSDK 实例\n */\n\n static async createClient({\n appId,\n appSecret,\n auto = true,\n context,\n logger,\n config,\n }) {\n BaseSDK.setHttpInstance(config, logger);\n\n if (auto) {\n const { appId: currentAppId, tenantAccessToken } =\n await application.integration.getDefaultTenantAccessToken();\n const scenesAppId = appId || currentAppId;\n client = new lark.Client({\n appId: scenesAppId,\n appSecret: appSecret || \"fake\",\n });\n client.tokenManager.cache.set(\n lark.CTenantAccessToken,\n tenantAccessToken,\n null,\n { namespace: scenesAppId },\n );\n } else {\n const curAppId =\n appId || (await application.globalVar.getVar(\"lark_app_id\"));\n const curAppSecret =\n appSecret || (await application.globalVar.getVar(\"lark_app_secret\"));\n client = new lark.Client({ appId: curAppId, appSecret: curAppSecret });\n }\n return new this(client, context, logger);\n }\n\n throwError(name, err) {\n this.logger.error(`调用 ${name} 失败:`, err);\n throw Error(err);\n }\n\n /**\n * 异步根据邮箱批量获取用户 ID\n * @param {Array<string>} emails - 包含用户邮箱的数组\n * @returns {Promise<Object>} - 返回一个 Promise,解析为飞书接口批量获取用户 ID 的响应结果\n */\n async getUserIdByEmail(emails, type = \"user_id\") {\n return this.larkClient.contact.user.batchGetId({\n params: {\n user_id_type: type,\n },\n data: {\n emails,\n },\n });\n }\n\n /**\n * 异步根据手机批量获取用户 ID\n * @param {Array<string>} emails - 包含用户邮箱的数组\n * @returns {Promise<Object>} - 返回一个 Promise,解析为飞书接口批量获取用户 ID 的响应结果\n */\n async getUserIdByMobile(mobiles, type = \"user_id\") {\n return this.larkClient.contact.user.batchGetId({\n params: {\n user_id_type: type,\n },\n data: {\n mobiles,\n },\n });\n }\n\n async getUserLarkInfo(allPerson, needMap = false) {\n const _user = await application.data\n .object(\"_user\")\n .select(\"_email\", \"open_id\", \"_name\", \"_phoneNumber\")\n .where({ _id: application.operator.in(allPerson) })\n .find();\n const hasNoOpenIdUsers = _user.filter((f) => !f.open_id);\n const phoneNumber = hasNoOpenIdUsers\n .map((m) => m._phoneNumber.number)\n .filter(Boolean);\n if (phoneNumber.length === 0) {\n if (needMap) {\n return _user.reduce((cur, next) => {\n cur[next._id] = next;\n return cur;\n }, {});\n }\n return _user;\n }\n const userInfo = await this.getUserIdByMobile(phoneNumber, \"open_id\");\n const newOpenUsersId = _user.map((u) => {\n const { _phoneNumber, _id } = u;\n const open_id =\n u.open_id ||\n userInfo?.user_list.find((i) => i.mobile == _phoneNumber.number)\n ?.user_id;\n return { _id, open_id };\n });\n await application.data.object(\"_user\").batchUpdate(newOpenUsersId);\n if (needMap) {\n return newOpenUsersId.reduce((cur, next) => {\n cur[next._id] = next;\n return cur;\n }, {});\n }\n return newOpenUsersId;\n }\n}\n\nexport default BaseSDK;\n","import BaseSDK from \"./baseSDK.js\";\n\nclass BiTable extends BaseSDK {\n /**\n * 异步加载并读取多维表格数据\n * @param {Object} param - 包含表格地址的参数对象\n * @param {string} param.tableaddress - 多维表格的地址\n * @returns {Promise<Array>} - 返回一个 Promise,解析为包含表格记录的数组\n * @throws {Error} - 当缺少表格 ID、文档 token 不存在或获取数据过程中出错时抛出错误\n * 多维表格参考:查询https://open.larkoffice.com/document/docs/bitable-v1/app-table-record/search\n *\n */\n async loadAndRead({ tableaddress, filter = {} }) {\n try {\n // 解析表格地址,获取表格的 app_token 和 table_id\n const isWiki = tableaddress.indexOf(\"wiki\") > -1;\n const [urlParts, search] = tableaddress.split(\"?\");\n let [appToken] = urlParts.split(\"/\").reverse();\n const querys = new URLSearchParams(search);\n const tableId = querys.get(\"table\");\n\n if (!tableId) {\n throw Error(\"缺少表格id\", tableId);\n }\n\n if (isWiki) {\n // 知识库的话需要获取知识库信息内的文档token作为apptoken\n const wikiResponse = await this.larkClient.wiki.v2.space.getNode({\n params: {\n obj_type: \"wiki\",\n token: appToken,\n },\n });\n appToken = wikiResponse?.node?.obj_token;\n }\n\n if (!appToken) {\n throw Error(\"文档token不存在\", appToken);\n }\n const tableData = [];\n let nextPageToken = \"\";\n while (true) {\n const params = nextPageToken\n ? { page_token: nextPageToken, filter }\n : { filter };\n\n console.log(\"params??\", params);\n const { page_token, items, has_more } =\n await this.larkClient.bitable.v1.appTableRecord.search({\n path: {\n app_token: appToken,\n table_id: tableId,\n },\n params: params,\n });\n nextPageToken = page_token;\n if (items) {\n tableData.push(...items);\n }\n if (!has_more) {\n break;\n }\n }\n return tableData;\n } catch (error) {\n // 出现错误时的处理\n throw new Error(\n \"从多维表格中获取数据过程中出现错误:\" + error?.message || error,\n ); // 抛出错误信息\n }\n }\n}\n\nexport default BiTable;\n","import BaseSDK from \"./lark/baseSDK.js\";\n\nasync function createBitableSDK(\n { appId, appSecret, auto, context, logger, config },\n { filter = {} } = {},\n) {\n const baseSDK = await BaseSDK.createClient({\n appId,\n appSecret,\n auto,\n context,\n logger,\n config,\n });\n return async function ({ tableaddress }) {\n return await baseSDK.Bitable.loadAndRead({ tableaddress, filter });\n };\n}\n\nexport { createBitableSDK };\n"],"names":["require","createRequire","lark"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAM,WAAW,CAAC;AAClB,EAAE,WAAW,CAAC,OAAO,GAAG,EAAE,EAAE;AAC5B,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO;AAC1B,EAAE;;AAEF,EAAE,eAAe,CAAC,GAAG,EAAE;AACvB,IAAI,OAAO,MAAM,CAAC,GAAG;AACrB,OAAO,OAAO,CAAC,OAAO,EAAE,MAAM;AAC9B,OAAO,OAAO,CAAC,KAAK,EAAE,IAAI;AAC1B,OAAO,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AAC3B,EAAE;;AAEF,EAAE,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE;AACvC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;AAChC,MAAM,OAAO;AACb,QAAQ,QAAQ;AAChB,QAAQ,IAAI,EAAE,QAAQ;AACtB,QAAQ,IAAI,EAAE,IAAI;AAClB,QAAQ,QAAQ,EAAE,KAAK;AACvB,QAAQ,OAAO,EAAE,SAAS;AAC1B,QAAQ,UAAU,EAAE,KAAK;AACzB,QAAQ,MAAM,EAAE,SAAS;AACzB,QAAQ,UAAU,EAAE,CAAC,MAAM,CAAC;AAC5B,OAAO;AACP,IAAI,MAAM,GAAG,GAAG;AAChB,MAAM,QAAQ;AACd,MAAM,UAAU,EAAE,IAAI,EAAE,UAAU;AAClC,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,QAAQ;AACjC,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,QAAQ;AACjC,MAAM,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ;AAC/B,MAAM,OAAO,EAAE,IAAI,CAAC,OAAO;AAC3B,MAAM,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU;AACnC,MAAM,MAAM,EAAE,IAAI,CAAC,MAAM;AACzB,MAAM,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU;AAC/C,UAAU,IAAI,CAAC;AACf,UAAU,IAAI,CAAC;AACf,YAAY,CAAC,IAAI,CAAC,UAAU;AAC5B,YAAY,CAAC,MAAM,CAAC;AACpB,MAAM,SAAS;AACf,QAAQ,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,SAAS;AACvE,MAAM,SAAS;AACf,QAAQ,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,SAAS;AACvE,MAAM,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,SAAS;AAC5D,MAAM,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS;AAClE,KAAK;AACL,IAAI,OAAO,GAAG;AACd,EAAE;;AAEF,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE;AACjE,IAAI,IAAI,GAAG,GAAG,GAAG;AACjB,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;AACxB;AACA,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI;AAC1B,MAAM;AACN,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;AACxB;AACA,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI;AAC1B,MAAM;AACN,IAAI;;AAEJ,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,EAAE;AACzD,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,OAAO,SAAS;AACrD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO;AACvB,IAAI;AACJ,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,QAAQ,EAAE;AACnD,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;AACzB,MAAM,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;AACrC,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AAC3C,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;AACnD,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;AACnD,MAAM,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC;AAC1E,MAAM,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS;AACvE,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC;AACxC,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3C,QAAQ,CAAC,GAAG,GAAG,CAAC,OAAO,KAAK,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;AAChE,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,QAAQ,CAAC,GAAG,GAAG,CAAC,OAAO,KAAK,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;AAChE,MAAM,OAAO,CAAC;AACd,IAAI;AACJ,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,QAAQ,EAAE;AACnD,MAAM,MAAM,GAAG;AACf,QAAQ,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC7E,MAAM,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG;AAChC,UAAU;AACV,UAAU,GAAG,CAAC,OAAO,KAAK;AAC1B,YAAY,MAAM,CAAC,GAAG,CAAC,OAAO;AAC9B,YAAY,SAAS;AACrB,IAAI;;AAEJ,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,MAAM,EAAE;AACjD,MAAM,IAAI,CAAC;AACX,MAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC,GAAG,GAAG;AAC1C,WAAW,IAAI,GAAG,YAAY,IAAI,EAAE,CAAC,GAAG,GAAG;AAC3C,WAAW,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI;AAChE,MAAM,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,OAAO,KAAK,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;AACzE,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC9E,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;AACnC,IAAI;;AAEJ,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,QAAQ,IAAI,aAAa,EAAE;AACpE,MAAM,MAAM,UAAU,GAAG,GAAG,EAAE,UAAU,IAAI,GAAG,CAAC,IAAI;AACpD;AACA,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC9B,QAAQ,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,MAAM;AACN;AACA,MAAM;AACN,QAAQ,aAAa,CAAC,UAAU,CAAC;AACjC,QAAQ,aAAa,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK;AAC3C,QAAQ;AACR,QAAQ,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC;AAC7C,MAAM;AACN,IAAI;;AAEJ,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,MAAM,EAAE;AACjD,MAAM,IAAI,WAAW,EAAE;AACvB,QAAQ,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC;AACpC,QAAQ,IAAI,GAAG,EAAE;AACjB,UAAU,OAAO,EAAE,GAAG,EAAE;AACxB,QAAQ;AACR,MAAM;AACN,MAAM,OAAO,SAAS;AACtB,IAAI;;AAEJ,IAAI,OAAO,GAAG;AACd,EAAE;;AAEF,EAAE,eAAe,CAAC,GAAG,EAAE;AACvB,IAAI,OAAO,MAAM,CAAC,GAAG;AACrB,OAAO,OAAO,CAAC,OAAO,EAAE,MAAM;AAC9B,OAAO,OAAO,CAAC,KAAK,EAAE,IAAI;AAC1B,OAAO,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AAC3B,EAAE;AACF;;ACjIA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAE;;AAE7B,MAAM,WAAW,SAAS,WAAW,CAAC;AACtC,EAAE,WAAW,CAAC,OAAO,GAAG,EAAE,EAAE;AAC5B,IAAI,KAAK,CAAC,OAAO,CAAC;AAClB,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO;AAC3C,EAAE;;AAEF,EAAE,SAAS,CAAC,MAAM,EAAE;AACpB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;AACxB,EAAE;;AAEF,EAAE,aAAa,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;AACtC,IAAI,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE;AAC9B,IAAI,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;;AAE5C,IAAI,MAAM,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC;AAC/D,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC7B,IAAI,OAAO,QAAQ;AACnB,EAAE;;AAEF,EAAE,aAAa,OAAO,GAAG;AACzB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;;AAE5B,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK;AACtC,MAAM,IAAI,QAAQ,EAAE;AACpB,QAAQ,IAAI;AACZ,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;AACjC,QAAQ,CAAC,CAAC,OAAO,KAAK,EAAE;AACxB,UAAU,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;AACnC,QAAQ;AACR,MAAM;AACN,IAAI,CAAC,CAAC;AACN,IAAI,WAAW,CAAC,KAAK,EAAE;AACvB,EAAE;;AAEF,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,EAAE,EAAE;AACjC,IAAI,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACtC,IAAI,MAAM,GAAG,GAAG,EAAE;AAClB,IAAI,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AACjC,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AAC1C,MAAM,IAAI,CAAC,EAAE,EAAE;AACf,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC;AAC3D,QAAQ;AACR,MAAM;AACN,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC;AACxE,IAAI;AACJ,IAAI,OAAO,GAAG;AACd,EAAE;;AAEF,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE;AAC5B,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC7D,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC;AACzE,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC;AAC/C,KAAK;AACL,IAAI,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;AACvD,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,MAAM,IAAI,GAAG,IAAI,GAAG,EAAE;AAC1B,IAAI,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AAC5B,MAAM,MAAM,GAAG,GAAG,EAAE;AACpB,MAAM,MAAM,MAAM,GAAG,EAAE;AACvB,MAAM,IAAI,IAAI,GAAG,KAAK;AACtB,MAAM,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;AAC9B,QAAQ,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnC,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC;AACnD,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM;AAC5B,QAAQ,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC3D,MAAM;AACN,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE;AAC3B,QAAQ,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7D,QAAQ,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACzC,UAAU,IAAI,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,CAAC;AACvE,UAAU,IAAI,GAAG,IAAI;AACrB,QAAQ,CAAC,MAAM;AACf,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACvB,QAAQ;AACR,MAAM;AACN,MAAM,IAAI,IAAI,EAAE;AAChB,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG;AAC/E,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB,IAAI;AACJ,IAAI,OAAO,GAAG;AACd,EAAE;AACF;;AAEA,SAAS,YAAY,CAAC,OAAO,GAAG,EAAE,EAAE;AACpC,EAAE,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC;AACzC,EAAE,OAAO,MAAM;AACf;;AAEA,SAAS,UAAU,CAAC,QAAQ,EAAE,OAAO,GAAG,EAAE,EAAE;AAC5C,EAAE,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC;AACtC,EAAE,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACvD;;AClGA,MAAM,aAAa,SAAS,WAAW,CAAC;AACxC,EAAE,WAAW,CAAC,OAAO,GAAG,EAAE,EAAE;AAC5B,IAAI,KAAK,CAAC,OAAO,CAAC;AAClB,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO;AAC3C,EAAE;;AAEF,EAAE,SAAS,CAAC,MAAM,EAAE;AACpB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;AACxB,EAAE;;AAEF,EAAE,MAAM,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,EAAE,EAAE;AACnC,IAAI,MAAM,GAAG,GAAG,EAAE;AAClB,IAAI,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AACjC,MAAM,IAAI,CAAC,IAAI,EAAE;AACjB,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC;AAC5D,QAAQ;AACR,MAAM;AACN,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;AACxD,IAAI;AACJ,IAAI,OAAO,GAAG;AACd,EAAE;;AAEF,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE;AAC9B,IAAI,IAAI,CAAC,IAAI,EAAE;AACf,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;;AAEhC,MAAM,OAAO,SAAS;AACtB,IAAI;AACJ,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC;AACzE,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC;AAC/C,KAAK;AACL,IAAI,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;AACvD,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,MAAM,IAAI,GAAG,IAAI,GAAG,EAAE;AAC1B,IAAI,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AAC5B,MAAM,IAAI,CAAC,GAAG,EAAE;AAChB,QAAQ;AACR,MAAM;AACN,MAAM,MAAM,GAAG,GAAG,EAAE;AACpB,MAAM,MAAM,MAAM,GAAG,EAAE;AACvB,MAAM,IAAI,IAAI,GAAG,KAAK;AACtB,MAAM,IAAI,CAAC,MAAM,EAAE;AACnB,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;AAC1C,QAAQ;AACR,MAAM;AACN,MAAM,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;AAC9B,QAAQ,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnC,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC;AAC9D,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM;AAC5B,QAAQ,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC3D,MAAM;AACN,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE;AAC3B,QAAQ,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7D,QAAQ,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACzC,UAAU,IAAI,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,CAAC;AACvE,UAAU,IAAI,GAAG,IAAI;AACrB,QAAQ,CAAC,MAAM;AACf,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACvB,QAAQ;AACR,MAAM;AACN,MAAM,IAAI,IAAI,EAAE;AAChB,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG;AAC/E,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB,IAAI;AACJ,IAAI,OAAO,GAAG;AACd,EAAE;AACF;;AAEA,SAAS,mBAAmB,CAAC,OAAO,GAAG,EAAE,EAAE;AAC3C,EAAE,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC;AAC3C,EAAE,OAAO,MAAM;AACf;;AAEA,SAAS,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,EAAE,EAAE;AACpD,EAAE,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC;AAC7C,EAAE,OAAO,UAAU,IAAI,EAAE;AACzB,IAAI,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;AACvC,EAAE,CAAC;AACH;;AChFA,MAAM,IAAI,CAAC;AACX,EAAE,WAAW,CAAC,KAAK,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE;AACxC,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7B,MAAM,OAAO,CAAC,KAAK,UAAU,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC;AAC1D,KAAK;AACL,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO;AAC1B,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI;AAC7B,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO;AAC1B,IAAI,IAAI,CAAC,aAAa,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;AACxD,EAAE;;AAEF,EAAE,OAAO,MAAM,GAAG;AAClB,IAAI,OAAO,IAAI,IAAI,EAAE;AACrB,EAAE;;AAEF,EAAE,IAAI,CAAC,GAAG,GAAG,EAAE,EAAE;AACjB,IAAI,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,EAAE;AAC9C,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,SAAS,CAAC,MAAM,EAAE;AACpB,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/C,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,eAAe,CAAC,OAAO,GAAG,EAAE,EAAE;AAChC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC;AAClC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC;AACvC,IAAI,IAAI,CAAC,aAAa,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;AACxD,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE;AACzB,IAAI,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC;AAC1E,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AACpC,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,OAAO,CAAC,GAAG,GAAG,EAAE;AAClB,IAAI,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACvC,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,GAAG,CAAC,EAAE,EAAE;AACV,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,KAAK;AACzC,MAAM,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACzC,MAAM,OAAO,GAAG;AAChB,IAAI,CAAC,CAAC;AACN,EAAE;;AAEF,EAAE,KAAK,CAAC,OAAO,EAAE;AACjB,IAAI,IAAI,CAAC,aAAa,GAAG,OAAO;AAChC,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,KAAK,GAAG;AACV,IAAI,MAAM,MAAM,GAAG,IAAI,IAAI;AAC3B,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACtE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AACzB,KAAK;AACL,IAAI,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa;AAC7C,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;AACjC,IAAI,MAAM,CAAC,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE;AACpD,IAAI,OAAO,MAAM;AACjB,EAAE;;AAEF,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE;AACxB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,KAAK;AACzC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC9B,QAAQ,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG;AACrC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACrD,SAAS;AACT,QAAQ,OAAO,GAAG;AAClB,MAAM;AACN,MAAM,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAChD,IAAI,CAAC,EAAE,OAAO,CAAC;AACf,EAAE;;AAEF,EAAE,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE;AAClC,IAAI,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO;AAC9D,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AAC5D,EAAE;;AAEF,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE;AACnB,IAAI,IAAI,GAAG,GAAG,KAAK;AACnB,IAAI,IAAI;AACR,MAAM,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AACrC,QAAQ,MAAM,EAAE,GAAG,OAAO,IAAI,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE;AAC9D,QAAQ,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE;AACxE,QAAQ,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO;AACjE,QAAQ,MAAM,YAAY;AAC1B,UAAU,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC,YAAY;AAC7D,QAAQ,IAAI,OAAO,GAAG,CAAC;AACvB,QAAQ,OAAO,IAAI,EAAE;AACrB,UAAU,IAAI;AACd,YAAY,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9D,YAAY;AACZ,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE;AACtB,YAAY,OAAO,IAAI,CAAC;AACxB,YAAY,IAAI,OAAO,IAAI,OAAO,EAAE;AACpC,cAAc,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,UAAU,EAAE;AACrD,gBAAgB,MAAM,OAAO,CAAC,OAAO;AACrC,kBAAkB,GAAG,CAAC,OAAO;AAC7B,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;AAChE,oBAAoB,IAAI,CAAC,OAAO;AAChC,mBAAmB;AACnB,iBAAiB;AACjB,cAAc;AACd,cAAc,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI;AACnD,gBAAgB,IAAI,CAAC,OAAO,CAAC,IAAI;AACjC,kBAAkB,0BAA0B;AAC5C,kBAAkB,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACzC,kBAAkB,CAAC,CAAC,OAAO;AAC3B,iBAAiB;AACjB,cAAc,IAAI,YAAY,GAAG,CAAC;AAClC,gBAAgB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AACrE,cAAc;AACd,YAAY;AACZ,YAAY,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK;AAClD,cAAc,IAAI,CAAC,OAAO,CAAC,KAAK;AAChC,gBAAgB,mCAAmC;AACnD,gBAAgB,OAAO;AACvB,gBAAgB,CAAC;AACjB,eAAe;AACf,YAAY,MAAM,CAAC;AACnB,UAAU;AACV,QAAQ;AACR,MAAM;AACN,MAAM,OAAO,GAAG;AAChB,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE;AAChB,MAAM,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,UAAU;AAClD,QAAQ,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC;AACvD,MAAM,MAAM,CAAC;AACb,IAAI;AACJ,EAAE;AACF;;ACrIA,MAAMA,SAAO,GAAGC,sBAAa,CAAC,2PAAe,CAAC;AAC9C,IAAI,MAAM;AACV,IAAI,kBAAkB,GAAG,KAAK;;AAE9B,MAAM,OAAO,CAAC;AACd,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;AACvC,IAAI,IAAI,CAAC,UAAU,GAAG,MAAM;AAC5B,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO;AAC1B,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;AACxB,EAAE;;AAEF,EAAE,IAAI,OAAO,GAAG;AAChB,IAAI,IAAI;AACR,MAAM,MAAM,GAAG,GAAGD,SAAO,CAAC,cAAc,CAAC;AACzC,MAAM,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,IAAI,GAAG;AACzC,MAAM,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;AACpE,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACpB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC;AACjD,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,UAAU,GAAG;AACnB,IAAI,IAAI;AACR,MAAM,MAAM,UAAU,GAAGA,SAAO,CAAC,cAAc,CAAC;AAChD,MAAM,OAAO,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;AAC9D,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACpB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC;AAClD,IAAI;AACJ,EAAE;AACF,EAAE,IAAI,QAAQ,GAAG;AACjB,IAAI,IAAI;AACR,MAAM,MAAM,QAAQ,GAAGA,SAAO,CAAC,YAAY,CAAC;AAC5C,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;AAC5D,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACpB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC;AACpD,IAAI;AACJ,EAAE;AACF,EAAE,IAAI,OAAO,GAAG;AAChB,IAAI,IAAI;AACR,MAAM,MAAM,OAAO,GAAGA,SAAO,CAAC,WAAW,CAAC;AAC1C,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;AAC3D,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACpB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC;AACnD,IAAI;AACJ,EAAE;AACF,EAAE,IAAI,WAAW,GAAG;AACpB,IAAI,IAAI;AACR,MAAM,MAAM,WAAW,GAAGA,SAAO,CAAC,eAAe,CAAC;AAClD,MAAM,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;AAC/D,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACpB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,CAAC;AACvD,IAAI;AACJ,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE;AACnC,IAAI,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO;AACtD,IAAI,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;AAC/C,MAAM,OAAO;AACb,MAAM,MAAM;AACZ,MAAM,GAAG,UAAU;AACnB,KAAK,CAAC;AACN,IAAI,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;AAC7B,MAAM,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC;AAC7B,MAAM,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;AACtC,QAAQ,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC;AACtE,QAAQ,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ;AAC/B,MAAM,CAAC,MAAM;AACb,QAAQ,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;AACpC,MAAM;AACN,IAAI;AACJ,IAAI,OAAO,OAAO;AAClB,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,eAAe,CAAC,QAAQ,GAAG,EAAE,EAAE,MAAM,EAAE;AAChD,IAAI,IAAI,kBAAkB,EAAE;AAC5B,MAAM;AACN,IAAI;AACJ,IAAI,kBAAkB,GAAG,IAAI;AAC7B,IAAI,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,QAAQ;AAC5C,IAAIE,eAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG;AACtD,MAAM,OAAO,IAAI,KAAK;AACtB,QAAQ,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACjC;AACA,QAAQ,IAAI,IAAI,EAAE,mBAAmB,IAAI,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;AAChE,UAAU,OAAO,IAAI;AACrB,QAAQ;AACR,QAAQ,IAAI,UAAU,EAAE;AACxB,UAAU,OAAO,UAAU,CAAC,IAAI,CAAC;AACjC,QAAQ;AACR,QAAQ,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI;AAC/B,QAAQ,OAAO,IAAI;AACnB,MAAM,CAAC;AACP,MAAM,OAAO,KAAK,KAAK;AACvB,QAAQ,MAAM,MAAM,GAAG;AACvB,UAAU,KAAK;AACf,UAAU,KAAK,EAAE,OAAO,EAAE,IAAI;AAC9B,UAAU,cAAc;AACxB,UAAU,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI;AACpC,UAAU,QAAQ;AAClB,UAAU,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG;AACpC,UAAU,OAAO;AACjB,UAAU,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc;AACrD,YAAY,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AAChD,SAAS;AACT,QAAQ,IAAI,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE;AACxD,UAAU,MAAM,CAAC,IAAI;AACrB,YAAY,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACjE,WAAW;AACX,QAAQ;AACR,QAAQ,IAAI,OAAO,EAAE;AACrB,UAAU,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC/C,QAAQ;AACR,QAAQ,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,MAAM,CAAC;AAC7C,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9C,MAAM,CAAC;AACP,KAAK;;AAEL,IAAIA,eAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK;AAClE,MAAM,OAAO,MAAM;AACnB,IAAI,CAAC,CAAC;AACN,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE,aAAa,YAAY,CAAC;AAC5B,IAAI,KAAK;AACT,IAAI,SAAS;AACb,IAAI,IAAI,GAAG,IAAI;AACf,IAAI,OAAO;AACX,IAAI,MAAM;AACV,IAAI,MAAM;AACV,GAAG,EAAE;AACL,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC;;AAE3C,IAAI,IAAI,IAAI,EAAE;AACd,MAAM,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE;AACtD,QAAQ,MAAM,WAAW,CAAC,WAAW,CAAC,2BAA2B,EAAE;AACnE,MAAM,MAAM,WAAW,GAAG,KAAK,IAAI,YAAY;AAC/C,MAAM,MAAM,GAAG,IAAIA,eAAI,CAAC,MAAM,CAAC;AAC/B,QAAQ,KAAK,EAAE,WAAW;AAC1B,QAAQ,SAAS,EAAE,SAAS,IAAI,MAAM;AACtC,OAAO,CAAC;AACR,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG;AACnC,QAAQA,eAAI,CAAC,kBAAkB;AAC/B,QAAQ,iBAAiB;AACzB,QAAQ,IAAI;AACZ,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE;AAClC,OAAO;AACP,IAAI,CAAC,MAAM;AACX,MAAM,MAAM,QAAQ;AACpB,QAAQ,KAAK,KAAK,MAAM,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACpE,MAAM,MAAM,YAAY;AACxB,QAAQ,SAAS,KAAK,MAAM,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAC5E,MAAM,MAAM,GAAG,IAAIA,eAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAC5E,IAAI;AACJ,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;AAC5C,EAAE;;AAEF,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;AACxB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC;AAC5C,IAAI,MAAM,KAAK,CAAC,GAAG,CAAC;AACpB,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,gBAAgB,CAAC,MAAM,EAAE,IAAI,GAAG,SAAS,EAAE;AACnD,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AACnD,MAAM,MAAM,EAAE;AACd,QAAQ,YAAY,EAAE,IAAI;AAC1B,OAAO;AACP,MAAM,IAAI,EAAE;AACZ,QAAQ,MAAM;AACd,OAAO;AACP,KAAK,CAAC;AACN,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,iBAAiB,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,EAAE;AACrD,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AACnD,MAAM,MAAM,EAAE;AACd,QAAQ,YAAY,EAAE,IAAI;AAC1B,OAAO;AACP,MAAM,IAAI,EAAE;AACZ,QAAQ,OAAO;AACf,OAAO;AACP,KAAK,CAAC;AACN,EAAE;;AAEF,EAAE,MAAM,eAAe,CAAC,SAAS,EAAE,OAAO,GAAG,KAAK,EAAE;AACpD,IAAI,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;AACpC,OAAO,MAAM,CAAC,OAAO;AACrB,OAAO,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc;AAC1D,OAAO,KAAK,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE;AACxD,OAAO,IAAI,EAAE;AACb,IAAI,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5D,IAAI,MAAM,WAAW,GAAG;AACxB,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,MAAM;AACvC,OAAO,MAAM,CAAC,OAAO,CAAC;AACtB,IAAI,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,MAAM,IAAI,OAAO,EAAE;AACnB,QAAQ,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK;AAC3C,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;AAC9B,UAAU,OAAO,GAAG;AACpB,QAAQ,CAAC,EAAE,EAAE,CAAC;AACd,MAAM;AACN,MAAM,OAAO,KAAK;AAClB,IAAI;AACJ,IAAI,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,SAAS,CAAC;AACzE,IAAI,MAAM,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK;AAC5C,MAAM,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC;AACrC,MAAM,MAAM,OAAO;AACnB,QAAQ,CAAC,CAAC,OAAO;AACjB,QAAQ,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM;AACvE,YAAY,OAAO;AACnB,MAAM,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;AAC7B,IAAI,CAAC,CAAC;AACN,IAAI,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC;AACtE,IAAI,IAAI,OAAO,EAAE;AACjB,MAAM,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK;AAClD,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;AAC5B,QAAQ,OAAO,GAAG;AAClB,MAAM,CAAC,EAAE,EAAE,CAAC;AACZ,IAAI;AACJ,IAAI,OAAO,cAAc;AACzB,EAAE;AACF;;ACjQA,MAAM,OAAO,SAAS,OAAO,CAAC;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,WAAW,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE;AACnD,IAAI,IAAI;AACR;AACA,MAAM,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACtD,MAAM,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC;AACxD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE;AACpD,MAAM,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC;AAChD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;;AAEzC,MAAM,IAAI,CAAC,OAAO,EAAE;AACpB,QAAQ,MAAM,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC;AACtC,MAAM;;AAEN,MAAM,IAAI,MAAM,EAAE;AAClB;AACA,QAAQ,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;AACzE,UAAU,MAAM,EAAE;AAClB,YAAY,QAAQ,EAAE,MAAM;AAC5B,YAAY,KAAK,EAAE,QAAQ;AAC3B,WAAW;AACX,SAAS,CAAC;AACV,QAAQ,QAAQ,GAAG,YAAY,EAAE,IAAI,EAAE,SAAS;AAChD,MAAM;;AAEN,MAAM,IAAI,CAAC,QAAQ,EAAE;AACrB,QAAQ,MAAM,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC;AAC3C,MAAM;AACN,MAAM,MAAM,SAAS,GAAG,EAAE;AAC1B,MAAM,IAAI,aAAa,GAAG,EAAE;AAC5B,MAAM,OAAO,IAAI,EAAE;AACnB,QAAQ,MAAM,MAAM,GAAG;AACvB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM;AAC/C,YAAY,EAAE,MAAM,EAAE;;AAEtB,QAAQ,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC;AACvC,QAAQ,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC7C,UAAU,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;AACjE,YAAY,IAAI,EAAE;AAClB,cAAc,SAAS,EAAE,QAAQ;AACjC,cAAc,QAAQ,EAAE,OAAO;AAC/B,aAAa;AACb,YAAY,MAAM,EAAE,MAAM;AAC1B,WAAW,CAAC;AACZ,QAAQ,aAAa,GAAG,UAAU;AAClC,QAAQ,IAAI,KAAK,EAAE;AACnB,UAAU,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AAClC,QAAQ;AACR,QAAQ,IAAI,CAAC,QAAQ,EAAE;AACvB,UAAU;AACV,QAAQ;AACR,MAAM;AACN,MAAM,OAAO,SAAS;AACtB,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACpB;AACA,MAAM,MAAM,IAAI,KAAK;AACrB,QAAQ,oBAAoB,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK;AACtD,OAAO,CAAC;AACR,IAAI;AACJ,EAAE;AACF;;ACrEA,eAAe,gBAAgB;AAC/B,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;AACrD,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE;AACtB,EAAE;AACF,EAAE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;AAC7C,IAAI,KAAK;AACT,IAAI,SAAS;AACb,IAAI,IAAI;AACR,IAAI,OAAO;AACX,IAAI,MAAM;AACV,IAAI,MAAM;AACV,GAAG,CAAC;AACJ,EAAE,OAAO,gBAAgB,EAAE,YAAY,EAAE,EAAE;AAC3C,IAAI,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;AACtE,EAAE,CAAC;AACH;;;;;;;;;;;;;;"}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/common/fieldMapper.js","../src/common/excelParse.js","../src/common/bitableParse.js","../src/pipe/index.js","../src/sdk/lark/baseSDK.js","../src/sdk/lark/bitable.js","../src/sdk/index.js"],"sourcesContent":["import dayjs from \"dayjs\";\n\nclass FieldMapper {\n constructor(options = {}) {\n this.options = options;\n }\n\n normalizeFormat(fmt) {\n return String(fmt)\n .replace(/yyyy/g, \"YYYY\")\n .replace(/dd/g, \"DD\")\n .replace(/hh/g, \"HH\");\n }\n\n normalizeFieldConfig(excelKey, desc) {\n if (typeof desc === \"string\")\n return {\n excelKey,\n type: \"string\",\n name: desc,\n required: false,\n default: undefined,\n primaryKey: false,\n format: undefined,\n preprocess: [\"trim\"],\n };\n const cfg = {\n excelKey,\n optionName: desc?.optionName,\n type: desc.type || \"string\",\n name: desc.name || excelKey,\n required: !!desc.required,\n default: desc.default,\n primaryKey: !!desc.primaryKey,\n format: desc.format,\n preprocess: Array.isArray(desc.preprocess)\n ? desc.preprocess\n : desc.preprocess\n ? [desc.preprocess]\n : [\"trim\"],\n maxLength:\n typeof desc.maxLength === \"number\" ? desc.maxLength : undefined,\n minLength:\n typeof desc.minLength === \"number\" ? desc.minLength : undefined,\n enum: Array.isArray(desc.enum) ? desc.enum : undefined,\n pattern: desc.pattern ? new RegExp(desc.pattern) : undefined,\n };\n return cfg;\n }\n\n applyFieldRules(raw, cfg, { optionMapping, userMapping } = {}) {\n let val = raw;\n if (Array.isArray(raw)) {\n if (raw[0]?.text) {\n // 多维表格文本取值\n val = raw[0]?.text;\n }\n if (raw[0]?.name) {\n // 多维表格文员文本取值\n val = raw[0]?.name;\n }\n }\n\n if (val === undefined || val === null || val === \"\") {\n if (cfg.default === undefined) return undefined;\n val = cfg.default;\n }\n if (cfg.type.toLocaleLowerCase() === \"string\") {\n let s = String(val);\n const pp = cfg.preprocess || [];\n if (pp.includes(\"trim\")) s = s.trim();\n if (pp.includes(\"upper\")) s = s.toUpperCase();\n if (pp.includes(\"lower\")) s = s.toLowerCase();\n if (typeof cfg.maxLength === \"number\") s = s.slice(0, cfg.maxLength);\n if (typeof cfg.minLength === \"number\" && s.length < cfg.minLength)\n s = s.padEnd(cfg.minLength, \" \");\n if (cfg.enum && !cfg.enum.includes(s))\n s = cfg.default !== undefined ? String(cfg.default) : \"\";\n if (cfg.pattern && !cfg.pattern.test(s))\n s = cfg.default !== undefined ? String(cfg.default) : \"\";\n return s;\n }\n if (cfg.type.toLocaleLowerCase() === \"number\") {\n const num =\n typeof val === \"number\" ? val : Number(String(val).replace(/,/g, \"\"));\n return Number.isFinite(num)\n ? num\n : cfg.default !== undefined\n ? Number(cfg.default)\n : undefined;\n }\n\n if (cfg.type.toLocaleLowerCase() === \"date\") {\n let d;\n if (typeof val === \"number\") d = val;\n else if (val instanceof Date) d = val;\n else d = dayjs(val).isValid() ? dayjs(val).toDate() : null;\n if (!d) return cfg.default !== undefined ? String(cfg.default) : \"\";\n if (cfg.format) return dayjs(d).format(this.normalizeFormat(cfg.format));\n return dayjs(d).toISOString();\n }\n\n if (cfg.type.toLocaleLowerCase() === \"option\" && optionMapping) {\n const optionName = cfg?.optionName || cfg.name;\n // 多选\n if (Array.isArray(val)) {\n return val.map((v) => optionMapping[optionName][v]);\n }\n // 单选\n if (\n optionMapping[optionName] &&\n optionMapping[optionName][val] !== undefined\n ) {\n return optionMapping[optionName][val];\n }\n }\n\n if (cfg.type.toLocaleLowerCase() === \"user\") {\n if (userMapping) {\n const _id = userMapping[val];\n if (_id) {\n return { _id };\n }\n }\n return undefined;\n }\n\n return val;\n }\n\n normalizeFormat(fmt) {\n return String(fmt)\n .replace(/yyyy/g, \"YYYY\")\n .replace(/dd/g, \"DD\")\n .replace(/hh/g, \"HH\");\n }\n}\n\nexport default FieldMapper;\n","import XLSX from \"xlsx\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport FieldMapper from \"./fieldMapper.js\";\n\nconst filePatSets = new Set();\n\nclass ExcelParser extends FieldMapper {\n constructor(options = {}) {\n super(options);\n this.logger = options.logger || console;\n }\n\n setLogger(logger) {\n this.logger = logger;\n }\n\n static async loadFile({ id, name }) {\n const tmpDir = os.tmpdir();\n const filePath = path.join(tmpDir, name);\n\n await application.resources.file.download({ id }, filePath);\n filePatSets.add(filePath);\n return filePath;\n }\n\n static async destory() {\n console.log(filePatSets);\n\n filePatSets.forEach((filePath) => {\n if (filePath) {\n try {\n fs.unlinkSync(filePath);\n } catch (error) {\n this?.logger?.info(error);\n }\n }\n });\n filePatSets.clear();\n }\n\n parse(filePath, mappings = []) {\n const wb = XLSX.readFile(filePath);\n const out = {};\n for (const conf of mappings) {\n const ws = wb.Sheets[conf.sheetName];\n if (!ws) {\n this.logger.warn(\"sheet not found\", conf.sheetName);\n continue;\n }\n out[conf.objectName || conf.sheetName] = this.parseSheet(ws, conf);\n }\n return out;\n }\n\n parseSheet(ws, sheetConf) {\n const rows = XLSX.utils.sheet_to_json(ws, { defval: \"\" });\n const fields = Object.entries(sheetConf.fields).map(([excelKey, desc]) =>\n this.normalizeFieldConfig(excelKey, desc),\n );\n const pkFields = fields.filter((f) => f.primaryKey);\n const out = pkFields.length ? {} : [];\n const seen = new Set();\n for (const row of rows) {\n const obj = {};\n const pkVals = [];\n let skip = false;\n for (const f of fields) {\n const raw = row[f.excelKey];\n const casted = this.applyFieldRules(raw, f);\n obj[f.name] = casted;\n if (f.primaryKey) pkVals.push(String(casted || \"\"));\n }\n if (pkFields.length) {\n const key = pkVals.filter((s) => s !== \"\").join(\"::\");\n if (key === \"\" || seen.has(key)) {\n if (key !== \"\") this.logger.warn(\"duplicate primaryKey\", key);\n skip = true;\n } else {\n seen.add(key);\n }\n }\n if (skip) continue;\n if (pkFields.length) out[pkVals.filter((s) => s !== \"\").join(\"::\")] = obj;\n else out.push(obj);\n }\n return out;\n }\n}\n\nfunction createParser(options = {}) {\n const parser = new ExcelParser(options);\n return parser;\n}\n\nfunction parseExcel(mappings, options = {}) {\n const parser = createParser(options);\n return (filePath) => parser.parse(filePath, mappings);\n}\n\nexport { ExcelParser, parseExcel, createParser };\n","import FieldMapper from \"./fieldMapper.js\";\n\nclass BitableParser extends FieldMapper {\n constructor(options = {}) {\n super(options);\n this.logger = options.logger || console;\n }\n\n setLogger(logger) {\n this.logger = logger;\n }\n\n async parse(data, mappings = []) {\n const out = {};\n for (const conf of mappings) {\n if (!data) {\n this.logger.warn(\"sheet not found\", conf.objectName);\n continue;\n }\n out[conf.objectName] = this.parseSheet(data, conf);\n }\n return out;\n }\n\n parseSheet(data, sheetConf) {\n if (!data) {\n this.logger(\"data?\", data);\n\n return undefined;\n }\n const fields = Object.entries(sheetConf.fields).map(([excelKey, desc]) =>\n this.normalizeFieldConfig(excelKey, desc),\n );\n const pkFields = fields.filter((f) => f.primaryKey);\n const out = pkFields.length ? {} : [];\n const seen = new Set();\n for (const row of data) {\n if (!row) {\n continue;\n }\n const obj = {};\n const pkVals = [];\n let skip = false;\n if (!fields) {\n this.logger.info(\"fields\", fields);\n return;\n }\n for (const f of fields) {\n const raw = row[f.excelKey];\n const casted = this.applyFieldRules(raw, f, sheetConf);\n obj[f.name] = casted;\n if (f.primaryKey) pkVals.push(String(casted || \"\"));\n }\n if (pkFields.length) {\n const key = pkVals.filter((s) => s !== \"\").join(\"::\");\n if (key === \"\" || seen.has(key)) {\n if (key !== \"\") this.logger.warn(\"duplicate primaryKey\", key);\n skip = true;\n } else {\n seen.add(key);\n }\n }\n if (skip) continue;\n if (pkFields.length) out[pkVals.filter((s) => s !== \"\").join(\"::\")] = obj;\n else out.push(obj);\n }\n return out;\n }\n}\n\nfunction createBitableParser(options = {}) {\n const parser = new BitableParser(options);\n return parser;\n}\n\nfunction parseBitableParser(mappings, options = {}) {\n const parser = createBitableParser(options);\n return function (data) {\n return parser.parse(data, mappings);\n };\n}\n\nexport { BitableParser, parseBitableParser, createBitableParser };\n","class Pipe {\n constructor(steps = [], context = {}) {\n this.steps = steps.map((s) =>\n typeof s === \"function\" ? { fn: s, options: {} } : s,\n );\n this.context = context;\n this._errorHandler = null;\n this._logger = console;\n this._defaultRetry = { retries: 0, retryDelayMs: 0 };\n }\n\n static create() {\n return new Pipe();\n }\n\n with(ctx = {}) {\n this.context = { ...this.context, ...ctx };\n return this;\n }\n\n setLogger(logger) {\n this._logger = logger || {info:console.log};\n return this;\n }\n\n setDefaultRetry(options = {}) {\n const r = options.retries ?? 0;\n const d = options.retryDelayMs ?? 0;\n this._defaultRetry = { retries: r, retryDelayMs: d };\n return this;\n }\n\n pipe(fn, options = {}) {\n if (typeof fn !== \"function\") throw new Error(\"step must be function\");\n this.steps.push({ fn, options });\n return this;\n }\n\n compose(...fns) {\n for (const fn of fns) this.pipe(fn);\n return this;\n }\n\n tap(fn) {\n return this.pipe(async (val, ctx) => {\n await Promise.resolve(fn(val, ctx));\n return val;\n });\n }\n\n catch(handler) {\n this._errorHandler = handler;\n return this;\n }\n\n clone() {\n const cloned = new Pipe(\n this.steps.map((s) => ({ fn: s.fn, options: { ...s.options } })),\n { ...this.context },\n );\n cloned._errorHandler = this._errorHandler;\n cloned._logger = this._logger;\n cloned._defaultRetry = { ...this._defaultRetry };\n return cloned;\n }\n\n map(fn, options = {}) {\n return this.pipe(async (val, ctx) => {\n if (Array.isArray(val)) {\n const out = await Promise.all(\n val.map((x) => Promise.resolve(fn(x, ctx))),\n );\n return out;\n }\n return await Promise.resolve(fn(val, ctx));\n }, options);\n }\n\n pipeWithRetry(fn, options = {}) {\n const { retries = 0, retryDelayMs = 0, onRetry } = options;\n return this.pipe(fn, { retries, retryDelayMs, onRetry });\n }\n\n async run(input) {\n let val = input;\n try {\n for (const step of this.steps) {\n const fn = typeof step === \"function\" ? step : step.fn;\n const opt = typeof step === \"function\" ? {} : step.options || {};\n const retries = opt.retries ?? this._defaultRetry.retries;\n const retryDelayMs =\n opt.retryDelayMs ?? this._defaultRetry.retryDelayMs;\n let attempt = 0;\n while (true) {\n try {\n val = await Promise.resolve(fn(val, this.context));\n break;\n } catch (e) {\n attempt += 1;\n if (attempt <= retries) {\n if (typeof opt.onRetry === \"function\") {\n await Promise.resolve(\n opt.onRetry(\n { error: e, attempt, retries, retryDelayMs },\n this.context,\n ),\n );\n }\n if (this._logger && this._logger.warn)\n this._logger.warn(\n \"[pipe] step error, retry\",\n `${attempt}/${retries}`,\n e.message,\n );\n if (retryDelayMs > 0)\n await new Promise((r) => setTimeout(r, retryDelayMs));\n continue;\n }\n if (this._logger && this._logger.error)\n this._logger.error(\n \"[pipe] step failed after attempts\",\n attempt,\n e,\n );\n throw e;\n }\n }\n }\n return val;\n } catch (e) {\n if (typeof this._errorHandler === \"function\")\n return this._errorHandler(e, val, this.context);\n throw e;\n }\n }\n}\n\nexport default Pipe;\n","import * as lark from \"@larksuiteoapi/node-sdk\";\nimport { createRequire } from \"module\";\nconst require = createRequire(import.meta.url);\nlet client;\nlet hasSetHttpInstance = false;\n\nclass BaseSDK {\n constructor(client, context, logger) {\n this.larkClient = client;\n this.context = context;\n this.logger = logger;\n }\n\n get Bitable() {\n try {\n const mod = require(\"./bitable.js\");\n const Bitable = mod?.default || mod;\n return new Bitable(this.larkClient, this.context, this.logger);\n } catch (error) {\n this.logger.info(\"没有找到bitable sdk:\", error);\n }\n }\n\n get ChatManage() {\n try {\n const ChatManage = require(\"./chatManage\");\n return new ChatManage(client, this.context, this.logger);\n } catch (error) {\n this.logger.info(\"chatManage sdk错误:\", error);\n }\n }\n get ChatMenu() {\n try {\n const ChatMenu = require(\"./chatMenu\");\n return new ChatMenu(client, this.context, this.logger);\n } catch (error) {\n this.logger.info(\"没有找到chatMenu sdk错误:\", error);\n }\n }\n get ChatPin() {\n try {\n const ChatPin = require(\"./chatPin\");\n return new ChatPin(client, this.context, this.logger);\n } catch (error) {\n this.logger.info(\"没有找到chatPin sdk错误:\", error);\n }\n }\n get ChatMessage() {\n try {\n const ChatMessage = require(\"./chatMessage\");\n return new ChatMessage(client, this.context, this.logger);\n } catch (error) {\n this.logger.info(\"没有找到ChatMessage sdk错误:\", error);\n }\n }\n\n /**\n * 静态方法,用于初始化并配置多个 SDK 实例或者客户自定义实例需要调用基于sdk功能\n * @param {Object} ctors - 构造函数对象,键为实例名称,值为构造函数\n * @param {Object} options - 配置选项对象\n * @param {Object} options.context - 上下文对象\n * @param {Object} options.logger - 日志记录器对象\n * @returns {Promise<BaseSDK>} - 返回一个 Promise,解析为配置好的 BaseSDK 实例\n */\n static async use(ctors, options) {\n const { context, logger, ...restOptios } = options;\n const baseSdk = await BaseSDK.createClient({\n context,\n logger,\n ...restOptios,\n });\n for (const key in ctors) {\n const ctor = ctors[key];\n if (typeof ctor === \"function\") {\n const instance = new ctor(baseSdk.larkClient, context, logger);\n baseSdk[key] = instance;\n } else {\n logger.info(\"没有找到sdk:\", key);\n }\n }\n return baseSdk;\n }\n\n /**\n * 静态方法,用于设置默认 HTTP 实例的拦截器\n * @param {Object} [settings={}] - 拦截器配置对象\n * @param {Function} [settings.onResponse] - 响应拦截器回调函数\n * @param {Function} [settings.onError] - 错误拦截器回调函数\n * @param {Object} logger - 日志记录器对象\n */\n static setHttpInstance(settings = {}, logger) {\n if (hasSetHttpInstance) {\n return;\n }\n hasSetHttpInstance = true;\n const { onResponse, onError } = settings;\n lark.defaultHttpInstance.interceptors.response.use(\n async (resp) => {\n logger.info(\"resp\", resp);\n // 如果是用户token或者图片上传接口\n if (resp?.tenant_access_token || resp?.data?.image_key) {\n return resp;\n }\n if (onResponse) {\n return onResponse(resp);\n }\n const data = resp?.data;\n return data;\n },\n async (error) => {\n const detail = [\n \"接口:\",\n error?.request?.path,\n \",error code:\",\n error.response?.data?.code,\n \",失败原因:\",\n error?.response?.data?.msg,\n \"建议排查:\",\n error?.response?.data.error?.troubleshooter ||\n error?.response?.data.error?.message,\n ];\n if (error?.response?.data.error?.helps?.length) {\n detail.push(\n ...[\",参考链接:\", error.response.data.error.helps[0].url],\n );\n }\n if (onError) {\n return Promise.reject(onError(error));\n }\n logger.info(\"调用开放平台接口失败,\", ...detail);\n return Promise.reject(detail.join(\"\"));\n },\n );\n\n lark.defaultHttpInstance.interceptors.request.use((config) => {\n return config;\n });\n }\n\n /**\n * 静态方法,用于创建一个新的客户端实例\n * @param {Object} options - 配置选项对象\n * @param {string} options.appId - 飞书应用的应用 ID\n * @param {string} options.appSecret - 飞书应用的应用 Secret\n * @param {boolean} [options.auto=true] - 是否自动获取租户访问令牌,默认为 true\n * @param {Object} options.context - 上下文对象\n * @param {Object} options.logger - 日志记录器对象\n * @param {Object} options.config - 配置对象,用于设置 HTTP 实例的拦截器\n * @returns {BaseSDK} - 返回一个新的 BaseSDK 实例\n */\n\n static async createClient({\n appId,\n appSecret,\n auto = true,\n context,\n logger,\n config,\n }) {\n BaseSDK.setHttpInstance(config, logger);\n\n if (auto) {\n const { appId: currentAppId, tenantAccessToken } =\n await application.integration.getDefaultTenantAccessToken();\n const scenesAppId = appId || currentAppId;\n client = new lark.Client({\n appId: scenesAppId,\n appSecret: appSecret || \"fake\",\n });\n client.tokenManager.cache.set(\n lark.CTenantAccessToken,\n tenantAccessToken,\n null,\n { namespace: scenesAppId },\n );\n } else {\n const curAppId =\n appId || (await application.globalVar.getVar(\"lark_app_id\"));\n const curAppSecret =\n appSecret || (await application.globalVar.getVar(\"lark_app_secret\"));\n client = new lark.Client({ appId: curAppId, appSecret: curAppSecret });\n }\n return new this(client, context, logger);\n }\n\n throwError(name, err) {\n this.logger.error(`调用 ${name} 失败:`, err);\n throw Error(err);\n }\n\n /**\n * 异步根据邮箱批量获取用户 ID\n * @param {Array<string>} emails - 包含用户邮箱的数组\n * @returns {Promise<Object>} - 返回一个 Promise,解析为飞书接口批量获取用户 ID 的响应结果\n */\n async getUserIdByEmail(emails, type = \"user_id\") {\n return this.larkClient.contact.user.batchGetId({\n params: {\n user_id_type: type,\n },\n data: {\n emails,\n },\n });\n }\n\n /**\n * 异步根据手机批量获取用户 ID\n * @param {Array<string>} emails - 包含用户邮箱的数组\n * @returns {Promise<Object>} - 返回一个 Promise,解析为飞书接口批量获取用户 ID 的响应结果\n */\n async getUserIdByMobile(mobiles, type = \"user_id\") {\n return this.larkClient.contact.user.batchGetId({\n params: {\n user_id_type: type,\n },\n data: {\n mobiles,\n },\n });\n }\n\n async getUserLarkInfo(allPerson, needMap = false) {\n const _user = await application.data\n .object(\"_user\")\n .select(\"_email\", \"open_id\", \"_name\", \"_phoneNumber\")\n .where({ _id: application.operator.in(allPerson) })\n .find();\n const hasNoOpenIdUsers = _user.filter((f) => !f.open_id);\n const phoneNumber = hasNoOpenIdUsers\n .map((m) => m._phoneNumber.number)\n .filter(Boolean);\n if (phoneNumber.length === 0) {\n if (needMap) {\n return _user.reduce((cur, next) => {\n cur[next._id] = next;\n return cur;\n }, {});\n }\n return _user;\n }\n const userInfo = await this.getUserIdByMobile(phoneNumber, \"open_id\");\n const newOpenUsersId = _user.map((u) => {\n const { _phoneNumber, _id } = u;\n const open_id =\n u.open_id ||\n userInfo?.user_list.find((i) => i.mobile == _phoneNumber.number)\n ?.user_id;\n return { _id, open_id };\n });\n await application.data.object(\"_user\").batchUpdate(newOpenUsersId);\n if (needMap) {\n return newOpenUsersId.reduce((cur, next) => {\n cur[next._id] = next;\n return cur;\n }, {});\n }\n return newOpenUsersId;\n }\n}\n\nexport default BaseSDK;\n","import BaseSDK from \"./baseSDK.js\";\n\nclass BiTable extends BaseSDK {\n /**\n * 异步加载并读取多维表格数据\n * @param {Object} param - 包含表格地址的参数对象\n * @param {string} param.tableaddress - 多维表格的地址\n * @returns {Promise<Array>} - 返回一个 Promise,解析为包含表格记录的数组\n * @throws {Error} - 当缺少表格 ID、文档 token 不存在或获取数据过程中出错时抛出错误\n * 多维表格参考:查询https://open.larkoffice.com/document/docs/bitable-v1/app-table-record/search\n *\n */\n async loadAndRead({ tableaddress, filter = {} }) {\n try {\n // 解析表格地址,获取表格的 app_token 和 table_id\n const isWiki = tableaddress.indexOf(\"wiki\") > -1;\n const [urlParts, search] = tableaddress.split(\"?\");\n let [appToken] = urlParts.split(\"/\").reverse();\n const querys = new URLSearchParams(search);\n const tableId = querys.get(\"table\");\n\n if (!tableId) {\n throw Error(\"缺少表格id\", tableId);\n }\n\n if (isWiki) {\n // 知识库的话需要获取知识库信息内的文档token作为apptoken\n const wikiResponse = await this.larkClient.wiki.v2.space.getNode({\n params: {\n obj_type: \"wiki\",\n token: appToken,\n },\n });\n appToken = wikiResponse?.node?.obj_token;\n }\n\n if (!appToken) {\n throw Error(\"文档token不存在\", appToken);\n }\n const tableData = [];\n let nextPageToken = \"\";\n while (true) {\n const params = nextPageToken\n ? { page_token: nextPageToken, filter }\n : { filter };\n\n console.log(\"params??\", params);\n const { page_token, items, has_more } =\n await this.larkClient.bitable.v1.appTableRecord.search({\n path: {\n app_token: appToken,\n table_id: tableId,\n },\n params: params,\n });\n nextPageToken = page_token;\n if (items) {\n tableData.push(...items);\n }\n if (!has_more) {\n break;\n }\n }\n return tableData;\n } catch (error) {\n // 出现错误时的处理\n throw new Error(\n \"从多维表格中获取数据过程中出现错误:\" + error?.message || error,\n ); // 抛出错误信息\n }\n }\n}\n\nexport default BiTable;\n","import BaseSDK from \"./lark/baseSDK.js\";\n\nasync function createBitableSDK(\n { appId, appSecret, auto, context, logger, config },\n { filter = {} } = {},\n) {\n const baseSDK = await BaseSDK.createClient({\n appId,\n appSecret,\n auto,\n context,\n logger,\n config,\n });\n return async function ({ tableaddress }) {\n return await baseSDK.Bitable.loadAndRead({ tableaddress, filter });\n };\n}\n\nexport { createBitableSDK };\n"],"names":["require"],"mappings":"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"}
|