twikoo-func 1.7.24 → 2.0.0-beta.2
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 +41 -4
- package/dist/index.d.mts +104 -0
- package/dist/index.d.ts +104 -0
- package/dist/index.js +215 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +210 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +40 -22
- package/index.js +0 -1178
- package/utils/cap.js +0 -311
- package/utils/constants.js +0 -20
- package/utils/image.js +0 -376
- package/utils/import.js +0 -290
- package/utils/index.js +0 -512
- package/utils/lib.js +0 -79
- package/utils/logger.js +0 -22
- package/utils/notify.js +0 -309
- package/utils/spam.js +0 -241
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { CloudBaseDatabase, RECURSION_HEADER, createHandler, defineCapabilities, getRecursionToken } from "@twikoojs/common";
|
|
2
|
+
//#region src/transform.ts
|
|
3
|
+
/**
|
|
4
|
+
* 取平台注入的上下文环境变量。
|
|
5
|
+
*
|
|
6
|
+
* 与 `@cloudbase/node-sdk` 的 `getCloudbaseContext()` 同源:该函数从
|
|
7
|
+
* `context.environment` / `context.environ` 与 `process.env` 中按
|
|
8
|
+
* `TCB_CONTEXT_KEYS` 列表取值。
|
|
9
|
+
* @param context 云函数调用上下文
|
|
10
|
+
* @returns 上下文环境变量(无则为空对象)
|
|
11
|
+
*/
|
|
12
|
+
function contextEnvOf(context) {
|
|
13
|
+
return context?.environment ?? context?.environ ?? {};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* CloudBase 事件 → 内部统一请求(1.x 语义:事件本身即请求体)。
|
|
17
|
+
*
|
|
18
|
+
* **IP 解析优先级**(1.x `auth.getClientIP()` 直接读平台注入的 `TCB_SOURCE_IP`,
|
|
19
|
+
* 即 CloudBase 云函数的权威来源):
|
|
20
|
+
* 1. `TCB_SOURCE_IP`——上下文环境变量,`process.env` 兜底;
|
|
21
|
+
* 2. `x-real-ip` 请求头(HTTP 访问服务场景);
|
|
22
|
+
* 3. `x-forwarded-for` 首跳;
|
|
23
|
+
* 4. `event.requestContext.http.sourceIp`。
|
|
24
|
+
*
|
|
25
|
+
* ⚠️ 本链必须用 `||` 而非 `??`:链上各中间项都是字符串,**空串不是 nullish**。
|
|
26
|
+
* 曾写成 `a ?? (cond ? v : "") ?? b`——中间项在条件不成立时求值为 `""`,
|
|
27
|
+
* 把后面的来源全部短路掉,使 `sourceIp` 成为永远取不到的死代码。
|
|
28
|
+
*
|
|
29
|
+
* @param event 云函数事件
|
|
30
|
+
* @param context 云函数调用上下文(取 TCB_SOURCE_IP)
|
|
31
|
+
* @returns 内部统一请求
|
|
32
|
+
*/
|
|
33
|
+
function toTkRequest(event, context) {
|
|
34
|
+
const raw = event && typeof event === "object" ? event : {};
|
|
35
|
+
const headers = raw.headers ?? {};
|
|
36
|
+
const lowerHeaders = {};
|
|
37
|
+
for (const [key, value] of Object.entries(headers)) lowerHeaders[key.toLowerCase()] = String(value);
|
|
38
|
+
const tcbSourceIp = contextEnvOf(context).TCB_SOURCE_IP ?? process.env.TCB_SOURCE_IP ?? "";
|
|
39
|
+
const forwarded = lowerHeaders["x-forwarded-for"];
|
|
40
|
+
const forwardedIp = forwarded ? forwarded.split(",")[0].trim() : "";
|
|
41
|
+
const sourceIp = raw.requestContext?.http?.sourceIp;
|
|
42
|
+
return {
|
|
43
|
+
method: "POST",
|
|
44
|
+
path: "/",
|
|
45
|
+
query: {},
|
|
46
|
+
body: raw,
|
|
47
|
+
headers: lowerHeaders,
|
|
48
|
+
ip: tcbSourceIp || lowerHeaders["x-real-ip"] || forwardedIp || sourceIp || "",
|
|
49
|
+
raw: event
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 内部统一响应 → 云函数返回体(网关层承载状态码/CORS)。
|
|
54
|
+
* @param response 内部统一响应
|
|
55
|
+
* @returns 云函数返回体
|
|
56
|
+
*/
|
|
57
|
+
function fromTkResponse(response) {
|
|
58
|
+
return response.body;
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
//#region src/dispatch.ts
|
|
62
|
+
/**
|
|
63
|
+
* CloudBase 的 POST_SUBMIT 派发实现(规范「后置副作用异步语义」)。
|
|
64
|
+
*
|
|
65
|
+
* **1.x 语义对齐**:`src/server/function/twikoo/index.js` 的 `commentSubmit`
|
|
66
|
+
* 保存评论后执行
|
|
67
|
+
*
|
|
68
|
+
* ```js
|
|
69
|
+
* await app.callFunction({ name: context.function_name,
|
|
70
|
+
* data: { event: 'POST_SUBMIT', comment } }, { timeout: 300 })
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* ——用 **300ms 的极短 timeout** 把 `callFunction` 变成「异步」:请求已经发出,
|
|
74
|
+
* 本实例不再等待,被调用的实例在自己的时间预算里跑完垃圾检测与通知。这样
|
|
75
|
+
* 用户请求可以立即返回,也不会因为整条副作用链超出云函数超时上限而让
|
|
76
|
+
* 「评论已入库」变成客户端错误。
|
|
77
|
+
*
|
|
78
|
+
* **为什么放在适配器**:`callFunction` 是 CloudBase 专有 API,common 不应感知;
|
|
79
|
+
* 副作用链本身仍在 common 的 postSubmit 服务里。
|
|
80
|
+
*/
|
|
81
|
+
/** 递归调用的 timeout(毫秒)。1.x 取值,仅用于「不再等待」,不是副作用的上限 */
|
|
82
|
+
const CALL_TIMEOUT_MS = 300;
|
|
83
|
+
/**
|
|
84
|
+
* 创建 CloudBase 的派发实现。
|
|
85
|
+
* @param app CloudBase SDK app 实例(提供 callFunction)
|
|
86
|
+
* @param context 本次调用的云函数上下文(取 function_name)
|
|
87
|
+
* @returns POST_SUBMIT 派发实现
|
|
88
|
+
*/
|
|
89
|
+
function createCloudBaseDispatcher(app, context) {
|
|
90
|
+
return {
|
|
91
|
+
/**
|
|
92
|
+
* 递归自调用本云函数执行 POST_SUBMIT(不等副作用完成)。
|
|
93
|
+
* @param comment 已入库的评论
|
|
94
|
+
* @param ctx 当前请求上下文
|
|
95
|
+
*/
|
|
96
|
+
async dispatch(comment, ctx) {
|
|
97
|
+
const name = process.env.TCB_FUNCTION_NAME ?? context?.function_name;
|
|
98
|
+
if (!name) {
|
|
99
|
+
ctx.logger.warn("POST_SUBMIT 派发跳过:未取到云函数名(context.function_name / TCB_FUNCTION_NAME)");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
await app.callFunction({
|
|
104
|
+
name,
|
|
105
|
+
data: {
|
|
106
|
+
event: "POST_SUBMIT",
|
|
107
|
+
comment,
|
|
108
|
+
/**
|
|
109
|
+
* 转发原请求头(被调用实例据此解析客户端 IP,语义与用户请求一致),
|
|
110
|
+
* 并附上内部派发令牌——POST_SUBMIT 处理器会校验它,拒绝外部调用。
|
|
111
|
+
*/
|
|
112
|
+
headers: {
|
|
113
|
+
...ctx.request.headers,
|
|
114
|
+
[RECURSION_HEADER]: getRecursionToken(ctx.config)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}, { timeout: CALL_TIMEOUT_MS });
|
|
118
|
+
} catch {
|
|
119
|
+
ctx.logger.verbose("POST_SUBMIT 已派出(本实例不再等待)");
|
|
120
|
+
}
|
|
121
|
+
} };
|
|
122
|
+
}
|
|
123
|
+
//#endregion
|
|
124
|
+
//#region src/main.ts
|
|
125
|
+
/**
|
|
126
|
+
* twikoo-func 主逻辑(CloudBase 薄适配器)。
|
|
127
|
+
* 业务逻辑全部在 @twikoojs/common;平台核对:docs.cloudbase.net 云函数章节(查阅 2026-09-17)。
|
|
128
|
+
*
|
|
129
|
+
* 载荷转换见 `./transform.ts`,后置副作用派发见 `./dispatch.ts`,
|
|
130
|
+
* 平台 SDK 结构面见 `./types.ts`。
|
|
131
|
+
*/
|
|
132
|
+
/** CloudBase 平台能力:全能力*/
|
|
133
|
+
const cloudbaseCapabilities = defineCapabilities({
|
|
134
|
+
mail: true,
|
|
135
|
+
domPurify: true,
|
|
136
|
+
ip2region: true,
|
|
137
|
+
akismet: true,
|
|
138
|
+
tencentTms: true,
|
|
139
|
+
imageUpload: true,
|
|
140
|
+
qqAvatar: true,
|
|
141
|
+
ai: true
|
|
142
|
+
});
|
|
143
|
+
/**
|
|
144
|
+
* 创建 CloudBase 请求处理器(database / app 可注入供测试;缺省懒加载 TCB SDK)。
|
|
145
|
+
* @param options 注入项
|
|
146
|
+
* @returns 逐请求处理器(第二参数为云函数上下文,供 IP 解析与递归自调用取函数名)
|
|
147
|
+
*/
|
|
148
|
+
function createTwikooFunc(options = {}) {
|
|
149
|
+
let app = options.app ?? null;
|
|
150
|
+
let database = options.database ?? null;
|
|
151
|
+
let sdkPromise = null;
|
|
152
|
+
/** 注入优先;否则动态加载 @cloudbase/node-sdk(SYMBOL_CURRENT_ENV) */
|
|
153
|
+
const getApp = async () => {
|
|
154
|
+
if (app) return app;
|
|
155
|
+
sdkPromise ??= (async () => {
|
|
156
|
+
const mod = await import(
|
|
157
|
+
/* @vite-ignore */
|
|
158
|
+
"@cloudbase/node-sdk"
|
|
159
|
+
);
|
|
160
|
+
const tcb = mod.default ?? mod;
|
|
161
|
+
return tcb.init({ env: tcb.SYMBOL_CURRENT_ENV });
|
|
162
|
+
})();
|
|
163
|
+
app = await sdkPromise;
|
|
164
|
+
return app;
|
|
165
|
+
};
|
|
166
|
+
/** 数据库实例(注入优先,否则取 app 的 database()) */
|
|
167
|
+
const getDatabase = async () => {
|
|
168
|
+
database ??= (await getApp()).database();
|
|
169
|
+
return database;
|
|
170
|
+
};
|
|
171
|
+
return async (event, context) => {
|
|
172
|
+
const request = toTkRequest(event, context);
|
|
173
|
+
const db = await getDatabase();
|
|
174
|
+
return fromTkResponse(await createHandler({
|
|
175
|
+
request: {
|
|
176
|
+
/** 事件已在上游转换为统一请求 */
|
|
177
|
+
toTkRequest: () => request },
|
|
178
|
+
response: { fromTkResponse },
|
|
179
|
+
database: new CloudBaseDatabase({ database: db }),
|
|
180
|
+
storage: {
|
|
181
|
+
challenges: {},
|
|
182
|
+
tokens: {}
|
|
183
|
+
},
|
|
184
|
+
mailer: {
|
|
185
|
+
/** CloudBase 侧不直发邮件(由 common 内部按需处理) */
|
|
186
|
+
send: async () => {} },
|
|
187
|
+
notifier: {
|
|
188
|
+
/** CloudBase 侧不直发推送(由 common 内部按需处理) */
|
|
189
|
+
notify: async () => {} },
|
|
190
|
+
postSubmit: createCloudBaseDispatcher(await getApp(), context),
|
|
191
|
+
capabilities: cloudbaseCapabilities
|
|
192
|
+
})(request));
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/** 装配缓存(main 懒加载语义) */
|
|
196
|
+
let mainFn = null;
|
|
197
|
+
/**
|
|
198
|
+
* 云函数入口(exports.main 导出名硬约束)。
|
|
199
|
+
* @param event 云函数事件
|
|
200
|
+
* @param context 云函数上下文(IP 解析 + 递归自调用取 function_name)
|
|
201
|
+
* @returns 云函数返回体
|
|
202
|
+
*/
|
|
203
|
+
async function main(event, context) {
|
|
204
|
+
mainFn ??= createTwikooFunc();
|
|
205
|
+
return mainFn(event, context);
|
|
206
|
+
}
|
|
207
|
+
//#endregion
|
|
208
|
+
export { createCloudBaseDispatcher, createTwikooFunc, fromTkResponse, main, toTkRequest };
|
|
209
|
+
|
|
210
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/transform.ts","../src/dispatch.ts","../src/main.ts"],"sourcesContent":["/**\n * CloudBase 载荷转换(事件 ↔ 内部统一请求/响应)。\n *\n * 从 `main.ts` 抽出:入口只负责 SDK 懒加载与端口装配,平台载荷的形状知识\n * (含 IP 解析优先级)集中在本文件。\n */\nimport type { TkRequest, TkResponse } from \"@twikoojs/common\";\nimport type { TcbContextLike } from \"./types\";\n\n/**\n * 取平台注入的上下文环境变量。\n *\n * 与 `@cloudbase/node-sdk` 的 `getCloudbaseContext()` 同源:该函数从\n * `context.environment` / `context.environ` 与 `process.env` 中按\n * `TCB_CONTEXT_KEYS` 列表取值。\n * @param context 云函数调用上下文\n * @returns 上下文环境变量(无则为空对象)\n */\nfunction contextEnvOf(context?: TcbContextLike): Record<string, string> {\n return context?.environment ?? context?.environ ?? {};\n}\n\n/**\n * CloudBase 事件 → 内部统一请求(1.x 语义:事件本身即请求体)。\n *\n * **IP 解析优先级**(1.x `auth.getClientIP()` 直接读平台注入的 `TCB_SOURCE_IP`,\n * 即 CloudBase 云函数的权威来源):\n * 1. `TCB_SOURCE_IP`——上下文环境变量,`process.env` 兜底;\n * 2. `x-real-ip` 请求头(HTTP 访问服务场景);\n * 3. `x-forwarded-for` 首跳;\n * 4. `event.requestContext.http.sourceIp`。\n *\n * ⚠️ 本链必须用 `||` 而非 `??`:链上各中间项都是字符串,**空串不是 nullish**。\n * 曾写成 `a ?? (cond ? v : \"\") ?? b`——中间项在条件不成立时求值为 `\"\"`,\n * 把后面的来源全部短路掉,使 `sourceIp` 成为永远取不到的死代码。\n *\n * @param event 云函数事件\n * @param context 云函数调用上下文(取 TCB_SOURCE_IP)\n * @returns 内部统一请求\n */\nexport function toTkRequest(event: unknown, context?: TcbContextLike): TkRequest {\n const raw = (event && typeof event === \"object\" ? event : {}) as Record<string, unknown>;\n const headers = (raw.headers ?? {}) as Record<string, string>;\n const lowerHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n lowerHeaders[key.toLowerCase()] = String(value);\n }\n const tcbSourceIp = contextEnvOf(context).TCB_SOURCE_IP ?? process.env.TCB_SOURCE_IP ?? \"\";\n const forwarded = lowerHeaders[\"x-forwarded-for\"];\n const forwardedIp = forwarded ? forwarded.split(\",\")[0].trim() : \"\";\n const sourceIp = (raw.requestContext as { http?: { sourceIp?: string } } | undefined)?.http\n ?.sourceIp;\n const ip = tcbSourceIp || lowerHeaders[\"x-real-ip\"] || forwardedIp || sourceIp || \"\";\n // 事件本身即请求体(1.x 语义)\n const body = raw as TkRequest[\"body\"];\n return { method: \"POST\", path: \"/\", query: {}, body, headers: lowerHeaders, ip, raw: event };\n}\n\n/**\n * 内部统一响应 → 云函数返回体(网关层承载状态码/CORS)。\n * @param response 内部统一响应\n * @returns 云函数返回体\n */\nexport function fromTkResponse(response: TkResponse): Record<string, unknown> {\n return response.body;\n}\n","/**\n * CloudBase 的 POST_SUBMIT 派发实现(规范「后置副作用异步语义」)。\n *\n * **1.x 语义对齐**:`src/server/function/twikoo/index.js` 的 `commentSubmit`\n * 保存评论后执行\n *\n * ```js\n * await app.callFunction({ name: context.function_name,\n * data: { event: 'POST_SUBMIT', comment } }, { timeout: 300 })\n * ```\n *\n * ——用 **300ms 的极短 timeout** 把 `callFunction` 变成「异步」:请求已经发出,\n * 本实例不再等待,被调用的实例在自己的时间预算里跑完垃圾检测与通知。这样\n * 用户请求可以立即返回,也不会因为整条副作用链超出云函数超时上限而让\n * 「评论已入库」变成客户端错误。\n *\n * **为什么放在适配器**:`callFunction` 是 CloudBase 专有 API,common 不应感知;\n * 副作用链本身仍在 common 的 postSubmit 服务里。\n */\nimport { RECURSION_HEADER, getRecursionToken, type PostSubmitDispatcher } from \"@twikoojs/common\";\nimport type { TcbAppLike, TcbContextLike } from \"./types\";\n\n/** 递归调用的 timeout(毫秒)。1.x 取值,仅用于「不再等待」,不是副作用的上限 */\nconst CALL_TIMEOUT_MS = 300;\n\n/**\n * 创建 CloudBase 的派发实现。\n * @param app CloudBase SDK app 实例(提供 callFunction)\n * @param context 本次调用的云函数上下文(取 function_name)\n * @returns POST_SUBMIT 派发实现\n */\nexport function createCloudBaseDispatcher(\n app: TcbAppLike,\n context?: TcbContextLike,\n): PostSubmitDispatcher {\n return {\n /**\n * 递归自调用本云函数执行 POST_SUBMIT(不等副作用完成)。\n * @param comment 已入库的评论\n * @param ctx 当前请求上下文\n */\n async dispatch(comment, ctx): Promise<void> {\n const name = process.env.TCB_FUNCTION_NAME ?? context?.function_name;\n if (!name) {\n ctx.logger.warn(\n \"POST_SUBMIT 派发跳过:未取到云函数名(context.function_name / TCB_FUNCTION_NAME)\",\n );\n return;\n }\n try {\n await app.callFunction(\n {\n name,\n data: {\n event: \"POST_SUBMIT\",\n comment,\n /**\n * 转发原请求头(被调用实例据此解析客户端 IP,语义与用户请求一致),\n * 并附上内部派发令牌——POST_SUBMIT 处理器会校验它,拒绝外部调用。\n */\n headers: {\n ...ctx.request.headers,\n [RECURSION_HEADER]: getRecursionToken(ctx.config),\n },\n },\n },\n { timeout: CALL_TIMEOUT_MS },\n );\n } catch {\n // 1.x 语义:300ms 超时是「异步化」手段——超时说明目标实例已在执行,属预期\n ctx.logger.verbose(\"POST_SUBMIT 已派出(本实例不再等待)\");\n }\n },\n };\n}\n","/**\n * twikoo-func 主逻辑(CloudBase 薄适配器)。\n * 业务逻辑全部在 @twikoojs/common;平台核对:docs.cloudbase.net 云函数章节(查阅 2026-09-17)。\n *\n * 载荷转换见 `./transform.ts`,后置副作用派发见 `./dispatch.ts`,\n * 平台 SDK 结构面见 `./types.ts`。\n */\nimport {\n Capabilities,\n CloudBaseDatabase,\n createHandler,\n defineCapabilities,\n type CloudBaseDatabaseLike,\n} from \"@twikoojs/common\";\nimport { fromTkResponse, toTkRequest } from \"./transform\";\nimport { createCloudBaseDispatcher } from \"./dispatch\";\nimport type { TcbAppLike, TcbContextLike, TcbSdkStatic } from \"./types\";\n\nexport { fromTkResponse, toTkRequest } from \"./transform\";\n\n/** CloudBase 平台能力:全能力*/\nconst cloudbaseCapabilities: Capabilities = defineCapabilities({\n mail: true,\n domPurify: true,\n ip2region: true,\n akismet: true,\n tencentTms: true,\n imageUpload: true,\n qqAvatar: true,\n ai: true,\n});\n\n/**\n * 创建 CloudBase 请求处理器(database / app 可注入供测试;缺省懒加载 TCB SDK)。\n * @param options 注入项\n * @returns 逐请求处理器(第二参数为云函数上下文,供 IP 解析与递归自调用取函数名)\n */\nexport function createTwikooFunc(\n options: { database?: CloudBaseDatabaseLike; app?: TcbAppLike } = {},\n): (event: unknown, context?: TcbContextLike) => Promise<Record<string, unknown>> {\n let app: TcbAppLike | null = options.app ?? null;\n let database: CloudBaseDatabaseLike | null = options.database ?? null;\n let sdkPromise: Promise<TcbAppLike> | null = null;\n /** 注入优先;否则动态加载 @cloudbase/node-sdk(SYMBOL_CURRENT_ENV) */\n const getApp = async (): Promise<TcbAppLike> => {\n if (app) return app;\n sdkPromise ??= (async () => {\n const specifier = \"@cloudbase/node-sdk\";\n // v3 起 ESM 命名导出不可用(命名空间仅 default/module.exports/version),\n // 统一回退取 default,兼容 v2 具名与 v3 default 两种形态。\n const mod = (await import(/* @vite-ignore */ specifier)) as unknown as {\n default?: TcbSdkStatic;\n } & TcbSdkStatic;\n const tcb: TcbSdkStatic = mod.default ?? mod;\n return tcb.init({ env: tcb.SYMBOL_CURRENT_ENV });\n })();\n app = await sdkPromise;\n return app;\n };\n /** 数据库实例(注入优先,否则取 app 的 database()) */\n const getDatabase = async (): Promise<CloudBaseDatabaseLike> => {\n database ??= (await getApp()).database();\n return database;\n };\n return async (event: unknown, context?: TcbContextLike) => {\n const request = toTkRequest(event, context);\n const db = await getDatabase();\n const handler = createHandler({\n request: {\n /** 事件已在上游转换为统一请求 */\n toTkRequest: () => request,\n },\n response: { fromTkResponse },\n database: new CloudBaseDatabase({ database: db }),\n storage: { challenges: {} as never, tokens: {} as never },\n mailer: {\n /** CloudBase 侧不直发邮件(由 common 内部按需处理) */\n send: async () => {},\n },\n notifier: {\n /** CloudBase 侧不直发推送(由 common 内部按需处理) */\n notify: async () => {},\n },\n postSubmit: createCloudBaseDispatcher(await getApp(), context),\n capabilities: cloudbaseCapabilities,\n });\n return fromTkResponse(await handler(request));\n };\n}\n\n/** 装配缓存(main 懒加载语义) */\nlet mainFn:\n ((event: unknown, context?: TcbContextLike) => Promise<Record<string, unknown>>) | null = null;\n\n/**\n * 云函数入口(exports.main 导出名硬约束)。\n * @param event 云函数事件\n * @param context 云函数上下文(IP 解析 + 递归自调用取 function_name)\n * @returns 云函数返回体\n */\nexport async function main(\n event: unknown,\n context?: TcbContextLike,\n): Promise<Record<string, unknown>> {\n mainFn ??= createTwikooFunc();\n return mainFn(event, context);\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,33 +1,51 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "twikoo-func",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"author": "imaegoo <hello@imaegoo.com> (https://github.com/imaegoo)",
|
|
3
|
+
"version": "2.0.0-beta.2",
|
|
4
|
+
"description": "Twikoo comment system backend for CloudBase",
|
|
6
5
|
"license": "MIT",
|
|
7
|
-
"main": "index.js",
|
|
8
6
|
"repository": {
|
|
9
7
|
"type": "git",
|
|
10
8
|
"url": "https://github.com/twikoojs/twikoo.git"
|
|
11
9
|
},
|
|
12
|
-
"
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"module": "./dist/index.mjs",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.mjs",
|
|
17
|
+
"require": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
13
23
|
"dependencies": {
|
|
14
|
-
"@xsai/generate-text": "0.2.2",
|
|
15
|
-
"@xsai/shared": "0.2.2",
|
|
16
|
-
"@xsai/shared-chat": "0.2.2",
|
|
17
24
|
"@cap.js/server": "^4.0.5",
|
|
18
|
-
"@cloudbase/node-sdk": "^
|
|
25
|
+
"@cloudbase/node-sdk": "^3.18.3",
|
|
19
26
|
"@imaegoo/node-ip2region": "^2.1.1",
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
27
|
+
"@twikoojs/common": "2.0.0-beta.2",
|
|
28
|
+
"@twikoojs/shared": "2.0.0-beta.2",
|
|
29
|
+
"@xsai/generate-text": "^0.5.0",
|
|
30
|
+
"akismet-api": "^6.0.0",
|
|
31
|
+
"axios": "^1.20.0",
|
|
32
|
+
"bowser": "^2.14.1",
|
|
33
|
+
"dompurify": "^3.4.15",
|
|
34
|
+
"form-data": "^4.0.6",
|
|
35
|
+
"html-to-text": "^10.0.1",
|
|
36
|
+
"jsdom": "^30.1.0",
|
|
37
|
+
"marked": "^18.0.13",
|
|
38
|
+
"nodemailer": "^10.0.10",
|
|
39
|
+
"pushoo": "^2.0.0-beta.2",
|
|
40
|
+
"tencentcloud-sdk-nodejs-tms": "^4.1.311",
|
|
41
|
+
"xml2js": "^0.6.2"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/node": "^26.6.1"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsdown",
|
|
48
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
49
|
+
"test": "vitest run"
|
|
32
50
|
}
|
|
33
|
-
}
|
|
51
|
+
}
|