tadcode-wpsjs 0.1.1 → 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.
@@ -8,4 +8,19 @@
8
8
  "bun.debugTerminal.stopOnEntry": false,
9
9
  // Glob pattern to find test files. Defaults to the value shown below.
10
10
  "bun.test.filePattern": "**/*{.test.,.spec.,_test_,_spec_}{js,ts,tsx,jsx,mts,cts}",
11
+ "search.exclude": {
12
+ "**/node_modules": true,
13
+ "**/bower_components": true,
14
+ "**/*.code-search": true
15
+ },
16
+ "files.exclude": {
17
+ "**/node_modules": true,
18
+ "**/.git": true,
19
+ "**/.svn": true,
20
+ "**/.hg": true,
21
+ "**/CVS": true,
22
+ "**/.DS_Store": true,
23
+ "**/Thumbs.db": true,
24
+ "bun.lock": true,
25
+ }
11
26
  }
package/README.md CHANGED
@@ -1,16 +1,26 @@
1
1
  # tadcode-wpsjs
2
2
 
3
- wps官方文档[**AirScript文档**](https://airsheet.wps.cn/docs/apitoken/intro.html)
3
+ 基于wps官方文档
4
+ 1. [**AirScript文档**](https://airsheet.wps.cn/docs/apitoken/intro.html)
5
+ 2. [**WPS多维表格:“开发”功能使用说明文档**](https://365.kdocs.cn/l/ctzsgDlAGF0l)
6
+
7
+ ## 联系我
8
+
9
+ **如你有业务需要wps代码服务,可以点此[联系我](https://f.kdocs.cn/g/SIdEy3GE/),三个工作日内必定回复。**
10
+
11
+ **如您公司存在敏感信息业务,需要长期人才,亦可来讯商谈。**
12
+
13
+ ![扫一扫联系我](data:image/png;base64,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)
4
14
 
5
15
  ## 应用
6
16
 
7
- 用于学习wpsjsapi,远程调用wpsjsapi
17
+ 用于学习wpsjsapi,远程调用wpsjs-api
8
18
 
9
- 使用wpsjs-1.0api。支持异步任务。支持`KSDrive`的类型。
19
+ 使用wpsjs-api。支持异步任务。
10
20
 
11
21
  在远程部署代码好代码,通过传输的调用信息进行调用api。原理是使用代理收集调用信息,之后让远程代码进行调用并且返回结果。
12
22
 
13
- 远程代码在`remoteCode`目录的`index.js`文件里面。将其复制粘贴到对应`webhook`的脚本中才能支持`wpsjsGlobal`的调用。
23
+ 远程代码在`tadcode-wpsjs/remoteCode`目录的`index.js`文件中。将其复制粘贴到对应`webhook`的脚本中才能支持`wpsjsGlobal`的调用。
14
24
 
15
25
  ## 安装
16
26
 
@@ -19,20 +29,43 @@ wps官方文档[**AirScript文档**](https://airsheet.wps.cn/docs/apitoken/intro
19
29
  ## 获取脚本令牌和webhook链接
20
30
 
21
31
  ### 获取脚本令牌
32
+
22
33
  ![脚本令牌](https://qn.cache.wpscdn.cn/asdocs/assets/apitoken.Dv10SGDp.png "脚本令牌")
23
34
 
24
35
  ### webhook链接
36
+
37
+ **!!!webhook链接的脚本内容必须部署为`tadcode-wpsjs/remoteCode/index.js`中的脚本内容。**
38
+
25
39
  ![webhook链接](https://qn.cache.wpscdn.cn/asdocs/assets/webhook.DnCJD55j.png "webhook链接")
26
40
 
27
41
  ## 案例
28
42
 
43
+ ### 获取当前多维表的所有表格信息
44
+
29
45
  ```ts
30
- import { RemoteCallWpsjsGlobal } from 'tadcode-wpsjs'
31
- const remoteCall = new RemoteCallWpsjsGlobal()
32
- remoteCall.scriptToken = 'xxxx' /* 脚本令牌 */
33
- remoteCall.webhookURL = 'xxxx' /* webhook url地址 */
34
- const { wpsjsGlobal } = remoteCall
35
- wpsjsGlobal.KSDrive.listFiles()/* 返回云文档下面的文件列表 */
36
- const response = await remoteCall.execute()
37
- console.log(await response.text())
46
+ import { initRemoteCallWpsjsGlobal } from 'tadcode-wpsjs'
47
+ /* 脚本令牌 具体获取方式参考上面 */
48
+ const scriptToken = 'xxxx'
49
+ /* webhook url地址 具体获取方式参考上面 */
50
+ const webhookURL = 'xxxx'
51
+ const wpsjsGlobal = initRemoteCallWpsjsGlobal({ scriptToken, webhookURL, })
52
+ const data = await wpsjsGlobal.Application.Sheet.GetSheets().execution()
53
+ console.log(data)
38
54
  ```
55
+
56
+ ### 执行脚本并且返回(不用部署remoteCode代码)
57
+
58
+ ```ts
59
+ import { execution } from 'tadcode-wpsjs'
60
+ /* 脚本令牌 具体获取方式参考上面 */
61
+ const scriptToken = 'xxxx'
62
+ /* webhook url地址 具体获取方式参考上面 */
63
+ const webhookURL = 'xxxx'
64
+ const result=await execution({ scriptToken, webhookURL })
65
+ const data =await result.json()
66
+ console.log(data)
67
+ ```
68
+
69
+ ## 支持
70
+
71
+ 如果对你有用请给个`star`
package/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import K from"node:path";class N{sync=!0;scriptToken="";webhookURL="";asyncQueryURL="https://www.kdocs.cn/api/v3/script/task";info=[];wpsjsGlobal=new Proxy(()=>{},{get:(B,z)=>{let{info:q,wpsjsGlobal:v}=this;return q.push({method:"get",arguments:[z]}),v},apply:(B,z,q)=>{let{info:v,wpsjsGlobal:F}=this;return v.push({method:"apply",arguments:q}),F}});execute(){let{scriptToken:B,webhookURL:z,info:q,sync:v}=this,F=JSON.stringify({Context:{argv:{info:q}}}),E=K.parse(z);E.base=v?"sync_task":"task";let H=K.format(E);return fetch(H,{method:"post",headers:{"Content-Type":"application/json","AirScript-Token":B},body:F})}queryTask(B){let{asyncQueryURL:z}=this,q=new URL(z);return q.searchParams.append("task_id",B),fetch(q.toString())}}async function S(B){let z=await B.json(),{status:q,data:v,error:F,error_details:E}=z;console.log("result:"),console.log(v.result);let H=v.logs.filter((J)=>J.filename!=="<system>");if(H.length!==0){console.log("log:");for(let J of H)console[J.level](...J.args)}console.log("status:",q);let M=v.logs.at(-1).unix_time-v.logs[1].unix_time;if(console.log("runtime:",M),F)console.error(E.name),console.error(E.msg),console.error(E.stack);return z}export{S as printInfo,N as RemoteCallWpsjsGlobal};
2
+ import{writeFile as $}from"fs/promises";import Y from"path";var O=(B)=>{let{scriptToken:E,webhookURL:M,isAsync:H=!1,printLog:N=!1,writeLogFile:J=!1}=B,z=[];return new Proxy(()=>{},{get:(K,S,V)=>{return z.push({method:"get",arguments:[S]}),V},apply:(K,S,V)=>{if(z.at(-1)?.arguments[0]==="execution")return z.pop(),q({scriptToken:E,webhookURL:M,isAsync:H,argv:{info:z}}).then(async(Z)=>{let X=await Z.json();if(z=[],N)G(X);if(J)W(X);return X.data.result});return z.push({method:"apply",arguments:V}),S}})},q=({scriptToken:B,webhookURL:E,isAsync:M,argv:H})=>{let N=JSON.stringify({Context:{argv:H}}),J=Y.parse(E);J.base=M?"task":"sync_task";let z=Y.format(J);return fetch(z,{method:"post",headers:{"Content-Type":"application/json","AirScript-Token":B},body:N})},U=(B)=>{let E=new URL("https://www.kdocs.cn/api/v3/script/task");return E.searchParams.append("task_id",B),fetch(E)},G=(B)=>{let E=B,{status:M,data:H,error:N,error_details:J}=E;console.log("status:",M);let z=H.logs.at(-1).unix_time-H.logs[1].unix_time;if(console.log("runtime:",z),N)console.error(J.name),console.error(J.msg),console.error(J.stack);let Q=H.logs.filter((K)=>K.filename!=="<system>");if(Q.length!==0){console.log("log:");for(let K of Q)console[K.level](...K.args)}return console.log("result:"),console.log(H.result),E},W=(B)=>{$("./wpsjs.log.json",JSON.stringify(B,void 0,4))};export{W as writeLogFileToCurrent,U as queryTask,O as initRemoteCallWpsjsGlobal,q as execution};
package/index.ts CHANGED
@@ -1,67 +1,65 @@
1
- import type { InfoItem, RemoteCallWpsjsGlobalReturn, WpsjsGlobal } from './types'
1
+ import type { InfoItem, RemoteCallWpsjsGlobalReturn, WithExecutionWpsjsGlobal } from './types'
2
+ import { writeFile } from 'fs/promises'
2
3
  import path from 'path'
3
- export class RemoteCallWpsjsGlobal {
4
- sync = true
5
- scriptToken = ''
6
- webhookURL = ''
7
- asyncQueryURL = 'https://www.kdocs.cn/api/v3/script/task'
8
- info: InfoItem[] = []
9
- wpsjsGlobal = new Proxy(() => { }, {
10
- get: (_target, p) => {
11
- const { info, wpsjsGlobal } = this
12
- info.push({
13
- method: 'get',
14
- arguments: [p]
15
- })
16
- return wpsjsGlobal
4
+ interface Config {
5
+ scriptToken: string
6
+ webhookURL: string
7
+ isAsync?: boolean
8
+ printLog?: boolean
9
+ writeLogFile?: boolean
10
+ }
11
+ const initRemoteCallWpsjsGlobal = (config: Config) => {
12
+ const { scriptToken, webhookURL, isAsync = false, printLog = false, writeLogFile = false, } = config
13
+ let info: InfoItem[] = []
14
+ const handle: ProxyHandler<() => void> = {
15
+ get: (_target, p: string, receiver) => {
16
+ info.push({ method: 'get', arguments: [p] })
17
+ return receiver
17
18
  },
18
- apply: (_target, _thisArg, argArray) => {
19
- const { info, wpsjsGlobal } = this
20
- info.push({
21
- method: 'apply',
22
- arguments: argArray
23
- })
24
- return wpsjsGlobal
19
+ apply: (_target, thisArg, argArray) => {
20
+ const lastInfo = info.at(-1)
21
+ if (lastInfo?.arguments[0] === 'execution') {
22
+ info.pop() /* 删除 execution的调用信息 */
23
+ return execution({ scriptToken, webhookURL, isAsync, argv: { info } })
24
+ .then(async (response) => {
25
+ const responseObj = await response.json()
26
+ info = [] /* 执行结束,清空调用 */
27
+ if (printLog) printInfo(responseObj)
28
+ if (writeLogFile) writeLogFileToCurrent(responseObj)
29
+ return responseObj['data']['result']
30
+ })
31
+ }
32
+ info.push({ method: 'apply', arguments: argArray })
33
+ return thisArg
25
34
  },
26
- }) as WpsjsGlobal
27
- execute() {
28
- const { scriptToken, webhookURL, info, sync } = this
29
- const data = JSON.stringify({
30
- 'Context': { 'argv': { info }, }
31
- })
32
- /* 根据是否同步返回不同的url */
33
- const parsedPath = path.parse(webhookURL)
34
- parsedPath.base = sync ? 'sync_task' : 'task'
35
- const url = path.format(parsedPath)
36
- return fetch(url, {
37
- method: 'post',
38
- headers: {
39
- 'Content-Type': 'application/json',
40
- 'AirScript-Token': scriptToken
41
- },
42
- body: data
43
- })
44
- }
45
- queryTask(id: string) {
46
- const { asyncQueryURL } = this
47
- const url = new URL(asyncQueryURL)
48
- /* 这样子可以不用 encodeURIComponent */
49
- url.searchParams.append('task_id', id)
50
- return fetch(url.toString())
51
35
  }
36
+ return new Proxy(() => { }, handle) as unknown as WithExecutionWpsjsGlobal
37
+ }
38
+ type ExecutionConfig = Pick<Config, 'scriptToken' | 'webhookURL' | 'isAsync'> & { argv?: Record<string | number, any> }
39
+ const execution = ({ scriptToken, webhookURL, isAsync, argv }: ExecutionConfig) => {
40
+ /* 获取请求信息 */
41
+ const data = JSON.stringify({ Context: { argv, } })
42
+ /* 根据是否同步返回不同的url */
43
+ const parsedPath = path.parse(webhookURL)
44
+ parsedPath.base = isAsync ? 'task' : 'sync_task'
45
+ const url = path.format(parsedPath)
46
+ return fetch(url, {
47
+ method: 'post',
48
+ headers: {
49
+ 'Content-Type': 'application/json',
50
+ 'AirScript-Token': scriptToken
51
+ },
52
+ body: data
53
+ })
54
+ }
55
+ const queryTask = (id: string) => {
56
+ const url = new URL('https://www.kdocs.cn/api/v3/script/task')
57
+ url.searchParams.append('task_id', id)
58
+ return fetch(url)
52
59
  }
53
- export async function printInfo(response: Response) {
54
- const responseData = await response.json() as RemoteCallWpsjsGlobalReturn
60
+ const printInfo = (remoteCallResponse: RemoteCallWpsjsGlobalReturn) => {
61
+ const responseData = remoteCallResponse as RemoteCallWpsjsGlobalReturn
55
62
  const { status, data, error, error_details } = responseData
56
- console.log('result:')
57
- console.log(data.result)
58
- const userInfo = data.logs.filter(x => x.filename !== '<system>')
59
- if (userInfo.length !== 0) {
60
- console.log('log:')
61
- for (const item of userInfo) {
62
- console[item.level](...item.args)
63
- }
64
- }
65
63
  console.log('status:', status)
66
64
  const time = data.logs.at(-1)!.unix_time - data.logs[1].unix_time
67
65
  console.log('runtime:', time)
@@ -70,5 +68,20 @@ export async function printInfo(response: Response) {
70
68
  console.error(error_details.msg)
71
69
  console.error(error_details.stack)
72
70
  }
71
+ const userInfo = data.logs.filter(x => x.filename !== '<system>')
72
+ if (userInfo.length !== 0) {
73
+ console.log('log:')
74
+ for (const item of userInfo) {
75
+ console[item.level](...item.args)
76
+ }
77
+ }
78
+ console.log('result:')
79
+ console.log(data.result)
73
80
  return responseData
74
81
  }
82
+ const writeLogFileToCurrent = (data: object) => {
83
+ writeFile('./wpsjs.log.json', JSON.stringify((data), undefined, 4))
84
+ }
85
+
86
+ export { execution, initRemoteCallWpsjsGlobal, queryTask, writeLogFileToCurrent }
87
+ export type * from './types'
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "tadcode-wpsjs",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "main": "index.js",
5
5
  "type": "module",
6
6
  "scripts": {
7
- "hot": "NODE_ENV=development bun --hot index.ts",
7
+ "hot": "NODE_ENV=development bun --hot ignore/index.ts",
8
8
  "dev": "NODE_ENV=development bun --watch index.ts",
9
9
  "build": "NODE_ENV=production bun build index.ts --target bun --minify --outfile index.js"
10
10
  },
@@ -13,7 +13,6 @@ for (const item of info) {
13
13
  } break
14
14
  default:
15
15
  throw Error('reflect method undefined')
16
- break
17
16
  }
18
17
  }
19
18
  return current
@@ -1,3 +1,4 @@
1
+ import { MakePropertyOptional, PickModify } from './type-tools'
1
2
  export default interface DB_Application {
2
3
  Sheet: DBSheet
3
4
  Record: DBRecord
@@ -6,7 +7,7 @@ export default interface DB_Application {
6
7
  }
7
8
  /* 表 */
8
9
  interface DBSheet {
9
- GetSheets(): SheetInfo
10
+ GetSheets(): SheetInfo[]
10
11
  CreateSheet(options: Pick<SheetOptions, 'SheetId'>)
11
12
  DeleteSheet(options: Pick<SheetOptions, 'SheetId'>)
12
13
  UpdateSheet(options: Omit<SheetOptions, 'SheetId'> & Partial<SheetOptions>)
@@ -24,75 +25,179 @@ interface SheetOptions {
24
25
  Fields: { name: string, type: FieldType }[]
25
26
  }
26
27
  interface SheetInfo {
27
- "description": string,
28
- "fields": {
29
- "arraySupport": boolean,
30
- "autoFillSourceField": string,
31
- "customConfig": string,
32
- "defaultValueType": "Normal",
33
- "description": string,
34
- "id": string,
35
- "name": string,
36
- "numberFormat": string,
37
- "syncField": boolean,
38
- "type": FieldType,
39
- "uniqueValue": boolean
40
- "loadLegalHoliday": number,
41
- "items": {
42
- "color": number,
43
- "id": string,
44
- "value": string
28
+ 'description': string,
29
+ 'fields': {
30
+ 'arraySupport': boolean,
31
+ 'autoFillSourceField': string,
32
+ 'customConfig': string,
33
+ 'defaultValueType': 'Normal',
34
+ 'description': string,
35
+ 'id': string,
36
+ 'name': string,
37
+ 'numberFormat': string,
38
+ 'syncField': boolean,
39
+ 'type': FieldType,
40
+ 'uniqueValue': boolean
41
+ 'loadLegalHoliday': number,
42
+ 'items': {
43
+ 'color': number,
44
+ 'id': string,
45
+ 'value': string
45
46
  }[],
46
- "allowAddItemWhenInputting": true,
47
- "autoAddItem": boolean,
47
+ 'allowAddItemWhenInputting': true,
48
+ 'autoAddItem': boolean,
48
49
  }[],
49
- "icon": string,
50
- "id": number,
51
- "name": number,
52
- "primaryFieldId": number,
53
- "recordsCount": number,
54
- "sheetType": "xlEtDataBaseSheet",
55
- "subType": "Normal",
56
- "syncFieldSourceId": string,
57
- "syncFieldSourceNameId": string,
58
- "syncType": "None",
59
- "views": {
60
- "id": string,
61
- "name": string,
62
- "notice": string,
63
- "recordsCount": number,
64
- "type": ViewType
50
+ 'icon': string,
51
+ 'id': number,
52
+ 'name': number,
53
+ 'primaryFieldId': number,
54
+ 'recordsCount': number,
55
+ 'sheetType': 'xlEtDataBaseSheet',
56
+ 'subType': 'Normal',
57
+ 'syncFieldSourceId': string,
58
+ 'syncFieldSourceNameId': string,
59
+ 'syncType': 'None',
60
+ 'views': {
61
+ 'id': string,
62
+ 'name': string,
63
+ 'notice': string,
64
+ 'recordsCount': number,
65
+ 'type': ViewType
65
66
  }[]
66
67
  }
67
68
 
68
69
  type FieldType = 'MultiLineText' | 'Date' | 'Time' | 'Number' | 'Currency' | 'Percentage' | 'ID' | 'Phone' | 'Email' | 'Url' | 'Checkbox' | 'SingleSelect' | 'MultipleSelect' | 'Rating' | 'Complete' | 'Contact' | 'Attachment' | 'Link' | 'Note' | 'AutoNumber' | 'CreatedBy' | 'CreatedTime' | 'Formula' | 'Lookup'
69
70
  type ViewType = 'Grid' | 'Kanban' | 'Gallery' | 'Form' | 'Gantt'
70
71
 
71
- /* 行记录 */
72
- interface DBRecord {
73
- GetRecords(options: Pick<RcordOptions, 'SheetId'>)
74
- GetRecord(options: Pick<RcordOptions, 'SheetId' | 'RecordId'>)
75
- DeleteRecords(options: Pick<RcordOptions, 'SheetId' | 'RecordIds'>)
76
- UpdateRecords(options: Pick<RcordOptions, 'SheetId' | 'Records'>)
72
+ interface Entry {
73
+ id: string,
74
+ fields: Record<string, boolean | number | string | string[]>
77
75
  }
78
- interface RcordOptions {
76
+ interface Options {
79
77
  SheetId: number
80
78
  RecordId: string
81
79
  RecordIds: string[]
82
- Records: {
83
- id: string,
84
- fields: Record<string, string | number | string[]>
85
- }[]
86
- }
80
+ Records: Entry[]
81
+ /**
82
+ * 填写后将从被指定的视图获取该用户所见到的记录;若不填写,则从工作表获取记录
83
+ */
84
+ ViewId: string
85
+ /**
86
+ * 存在分页时,指定本次查询的起始记录(含)。若不填写或填写为空字符串,则从第一条记录开始获取
87
+ *
88
+ * 当前最大值:1000
89
+ */
90
+ PageSize: number
91
+ /**分页查询时,将返回一个offset值,指向下一页的第一条记录,供后续查询。查询到最后一页或第maxRecords条记录时,返回数据将不再包含offset值 */
92
+ Offset: number
93
+ /**指定要获取的“前maxRecords条记录”,若不填写,则默认返回全部记录 */
94
+ MaxRecords: number
95
+ /**具体字段类型说明详见 [附件2](https://kdocs.cn/l/ctzsgDlAGF0l?linkname=QSt7dOHYA0) */
96
+ Fields: any[]
97
+ /**详细说明见 [附件4](https://www.kdocs.cn/l/ctzsgDlAGF0l?linkname=wsTfzS9o34) */
98
+ Filter: {
99
+ /**选填。表示各筛选条件之间的逻辑关系。只能是'AND'或'OR'。缺省值为'AND' */
100
+ mode?: 'AND' | 'OR',
101
+ /**filter结构体内必填。包含筛选条件的数组。每个字段上只能有一个筛选条件 */
102
+ criteria: {
103
+ /**必填。根据 preferId 与否,需要填入字段名或字段id */
104
+ field: string
105
+ /**"Equals": 等于
106
+
107
+ "NotEqu": 不等于
108
+
109
+ "Greater": 大于
110
+
111
+ "GreaterEqu": 大等于
112
+
113
+ "Less": 小于
114
+
115
+ "LessEqu": 小等于
116
+
117
+ "GreaterEquAndLessEqu": 介于(取等)
87
118
 
119
+ "LessOrGreater": 介于(不取等)
120
+
121
+ "BeginWith": 开头是
122
+
123
+ "EndWith": 结尾是
124
+
125
+ "Contains": 包含
126
+
127
+ "NotContains": 不包含
128
+
129
+ "Intersected": 指定值
130
+
131
+ "Empty": 为空
132
+
133
+ "NotEmpty": 不为空
134
+ */
135
+ op: 'Equals' | 'NotEqu' | 'Greater' | 'GreaterEqu' | 'Less' | 'LessEqu' | 'GreaterEquAndLessEqu' | 'LessOrGreater' | 'BeginWith' | 'EndWith' | 'Contains' | 'NotContains' | 'Intersected' | 'Empty' | 'NotEmpty'
136
+ /**
137
+ * 必填。表示筛选规则中的值。数组形式。值为字符串时表示文本匹配。
138
+ * 这里的 values,必须是一个数组,传 ["多维表"],相当于传 [{ type: 'Text', value: '多维表' }],即不传默认帮你补充 Text 类型。
139
+ * 复选框的值,values: ['0'] 代表否,value: ['1'] 代表是。
140
+ *
141
+ * values[]数组内的元素为字符串时,表示文本匹配。各筛选规则独立地限制了values数组内最多允许填写的元素数,当values内元素数超过阈值时,该筛选规则将失效。
142
+ *
143
+ * a. “为空、不为空”不允许填写元素;
144
+ *
145
+ * b. “介于”允许最多填写2个元素;
146
+ *
147
+ * c. “指定值”允许填写65535个元素;
148
+ *
149
+ * d. 其他规则允许最多填写1个元素
150
+ */
151
+ values: string[] | {
152
+ type: 'Text'
153
+ value: string
154
+ }[] |
155
+ {
156
+ type: 'DynamicSimple'
157
+ /**
158
+ * 当"op"为"greater"或"less"时,"dynamicType"只能是昨天、今天或明天。
159
+ *
160
+ * "today": 今天
161
+ *
162
+ * "yesterday": 昨天
163
+ *
164
+ * "tomorrow": 明天
165
+ *
166
+ * "last7Days": 最近7天
167
+ *
168
+ * "last30Days": 最近30天
169
+ *
170
+ * "thisWeek": 本周
171
+ *
172
+ * "lastWeek": 上周
173
+ *
174
+ * "nextWeek":下周
175
+ *
176
+ * "thisMonth": 本月
177
+ *
178
+ * "lastMonth": 上月
179
+ *
180
+ * "nextMonth": 次月
181
+ */
182
+ dynamicType: "today" | "yesterday" | "tomorrow" | "last7Days" | "last30Days" | "thisWeek" | "lastWeek" | "nextWeek" | "thisMonth" | "lastMonth" | "nextMonth"
183
+ }[]
184
+ }[]
185
+ }
186
+ }
187
+ /* 行记录 */
188
+ interface DBRecord {
189
+ GetRecord(options: Pick<Options, 'SheetId' | 'RecordId'>)
190
+ GetRecords(options: Pick<Options, 'SheetId'> & Partial<Pick<Options, 'ViewId' | 'PageSize' | 'Offset' | 'MaxRecords' | 'Fields' | 'Filter'>>): { records: Entry[] }
191
+ CreateRecords(options: Pick<Options, 'SheetId'> & PickModify<Options, 'Records', MakePropertyOptional<Entry, 'id'>[]>): Entry[]
192
+ UpdateRecords(options: Pick<Options, 'SheetId' | 'Records'>)
193
+ DeleteRecords(options: Pick<Options, 'SheetId' | 'RecordIds'>)
194
+ }
88
195
  /* 字段 */
89
196
  interface DBField {
90
197
  GetFields(options: Pick<FieldOptions, 'SheetId'>)
91
198
  CreateFields(options: Pick<FieldOptions, 'SheetId' | 'Fields'>)
92
199
  DeleteFields(options: Pick<FieldOptions, 'SheetId' | 'FieldIds'>)
93
- UpdateFields(options: Pick<FieldOptions, 'SheetId' | 'Fields'> & {
94
-
95
- })
200
+ UpdateFields(options: Pick<FieldOptions, 'SheetId' | 'Fields'> & {})
96
201
  }
97
202
  interface FieldOptions {
98
203
  SheetId: number
@@ -1,5 +1,5 @@
1
- import DB_Application from './DB_Application'
2
- import KSheet_Application from './KSheet_Application'
1
+ import type DB_Application from './DB_Application'
2
+ import type KSheet_Application from './KSheet_Application'
3
3
  export default interface KSDrive {
4
4
  FileType: {
5
5
  /**智能文档 */
@@ -1,4 +1,4 @@
1
- export interface KSheet_Application {
1
+ export default interface KSheet_Application {
2
2
  Sheets: {
3
3
  Item(index: number | string): Sheet
4
4
  }
package/types/index.d.ts CHANGED
@@ -1,12 +1,16 @@
1
- import KSDrive from './KSDrive'
1
+ import type { WithExecution } from './type-tools'
2
+ import type DB_Application from './DB_Application'
3
+ import type KSheet_Application from './KSheet_Application'
4
+ import type KSDrive from './KSDrive'
2
5
  interface WpsjsGlobal {
3
- (): WpsjsGlobal
4
6
  Date: typeof Date
5
7
  KSDrive: KSDrive
8
+ Application: KSheet_Application & DB_Application
6
9
  }
10
+ type WithExecutionWpsjsGlobal = WithExecution<WpsjsGlobal>
7
11
  interface InfoItem {
8
12
  method: keyof typeof Reflect
9
- arguments: (string | symbol)[]
13
+ arguments: string[]
10
14
  }
11
15
  interface RemoteCallWpsjsGlobalReturn {
12
16
  "data": {
@@ -76,6 +80,7 @@ interface RemoteCallWpsjsGlobalReturn {
76
80
  }
77
81
  export {
78
82
  WpsjsGlobal,
83
+ WithExecutionWpsjsGlobal,
79
84
  InfoItem,
80
85
  RemoteCallWpsjsGlobalReturn,
81
86
  }
@@ -0,0 +1,13 @@
1
+ /* 根据给的对象,添加execution方法 */
2
+ type WithExecution<T> = T extends (...args: infer A) => infer R
3
+ ? ((...args: A) => WithExecution<R>) & { execution: () => Promise<R> }
4
+ : T extends object
5
+ ? { [K in keyof T]: WithExecution<T[K]> } & { execution: () => Promise<T> }
6
+ : T & { execution: () => Promise<T> }
7
+ /**部分可选 */
8
+ type MakePropertyOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>
9
+ /* 选取修改类型 */
10
+ type PickModify<T, K extends keyof T, M> = {
11
+ [P in K]: M
12
+ }
13
+ export type { WithExecution, MakePropertyOptional, PickModify }
package/test/one.test.ts DELETED
@@ -1,14 +0,0 @@
1
- import type { RemoteCallWpsjsGlobalReturn } from '../types'
2
- import { test, expect } from 'bun:test'
3
- import { RemoteCallWpsjsGlobal } from '../index'
4
-
5
- test('ok', async () => {
6
- const remoteCall = new RemoteCallWpsjsGlobal()
7
- remoteCall.webhookURL = 'xxxx' /* webhook url地址 */
8
- remoteCall.webhookURL = 'xxxx' /* webhook url地址 */
9
- const { wpsjsGlobal } = remoteCall
10
- wpsjsGlobal.KSDrive.listFiles()
11
- const response = await remoteCall.execute()
12
- console.log(await response.text())
13
- // const responseData = await printInfo(response)
14
- })