pixivflow 2.4.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -0
- package/README_EN.md +40 -0
- package/dist/config/types.d.ts +51 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +41 -0
- package/dist/config/validation.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/delivery/DeliveryDispatcher.d.ts +11 -0
- package/dist/delivery/DeliveryDispatcher.d.ts.map +1 -0
- package/dist/delivery/DeliveryDispatcher.js +31 -0
- package/dist/delivery/DeliveryDispatcher.js.map +1 -0
- package/dist/delivery/DeliveryOutbox.d.ts +23 -0
- package/dist/delivery/DeliveryOutbox.d.ts.map +1 -0
- package/dist/delivery/DeliveryOutbox.js +172 -0
- package/dist/delivery/DeliveryOutbox.js.map +1 -0
- package/dist/delivery/HttpMultipartDelivery.d.ts +18 -0
- package/dist/delivery/HttpMultipartDelivery.d.ts.map +1 -0
- package/dist/delivery/HttpMultipartDelivery.js +217 -0
- package/dist/delivery/HttpMultipartDelivery.js.map +1 -0
- package/dist/delivery/types.d.ts +31 -0
- package/dist/delivery/types.d.ts.map +1 -0
- package/dist/delivery/types.js +3 -0
- package/dist/delivery/types.js.map +1 -0
- package/dist/download/DownloadManager.d.ts +2 -0
- package/dist/download/DownloadManager.d.ts.map +1 -1
- package/dist/download/DownloadManager.js +30 -2
- package/dist/download/DownloadManager.js.map +1 -1
- package/dist/download/IllustrationDownloader.d.ts +2 -1
- package/dist/download/IllustrationDownloader.d.ts.map +1 -1
- package/dist/download/IllustrationDownloader.js +29 -4
- package/dist/download/IllustrationDownloader.js.map +1 -1
- package/dist/download/NovelDownloader.d.ts +2 -1
- package/dist/download/NovelDownloader.d.ts.map +1 -1
- package/dist/download/NovelDownloader.js +9 -1
- package/dist/download/NovelDownloader.js.map +1 -1
- package/dist/download/handlers/IllustrationTargetHandler.d.ts +4 -1
- package/dist/download/handlers/IllustrationTargetHandler.d.ts.map +1 -1
- package/dist/download/handlers/IllustrationTargetHandler.js +12 -4
- package/dist/download/handlers/IllustrationTargetHandler.js.map +1 -1
- package/dist/download/handlers/NovelTargetHandler.d.ts +4 -1
- package/dist/download/handlers/NovelTargetHandler.d.ts.map +1 -1
- package/dist/download/handlers/NovelTargetHandler.js +13 -5
- package/dist/download/handlers/NovelTargetHandler.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/utils/config-validator-unified.d.ts.map +1 -1
- package/dist/utils/config-validator-unified.js +56 -0
- package/dist/utils/config-validator-unified.js.map +1 -1
- package/dist/utils/errors.d.ts +8 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +16 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/webui/package.json +1 -1
- package/dist/webui/server/server-utils.d.ts +1 -1
- package/dist/webui/server/server-utils.d.ts.map +1 -1
- package/dist/webui/server/server-utils.js +2 -2
- package/dist/webui/server/server-utils.js.map +1 -1
- package/dist/webui/server/server.d.ts +1 -0
- package/dist/webui/server/server.d.ts.map +1 -1
- package/dist/webui/server/server.js +31 -3
- package/dist/webui/server/server.js.map +1 -1
- package/dist/webui/server/types.d.ts +8 -0
- package/dist/webui/server/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -69,6 +69,51 @@ pixivflow scheduler # 按 cron 配置长期挂机自动收集
|
|
|
69
69
|
已下载的作品由 SQLite 数据库记录并自动跳过;文件存在但缺少记录时会自动补齐,
|
|
70
70
|
两者互不冲突。
|
|
71
71
|
|
|
72
|
+
### 本地留存与缓存交付
|
|
73
|
+
|
|
74
|
+
每个 target 可选择 `storageMode: "persistent"`(默认,本地永久留存)或
|
|
75
|
+
`storageMode: "cache"`(下载后交给命名 delivery target,成功才删除本地文件)。
|
|
76
|
+
交付层不绑定具体服务;下面只是把一个 HTTP multipart 投稿接口翻译成配置:
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"delivery": {
|
|
81
|
+
"targets": {
|
|
82
|
+
"tg-example": {
|
|
83
|
+
"type": "httpMultipart",
|
|
84
|
+
"url": "https://telesubmit-multi-bot.fly.dev/api/bot1/v1/submissions",
|
|
85
|
+
"headers": { "Authorization": "Bearer ${TG_SUBMIT_TOKEN}" },
|
|
86
|
+
"fileField": "files",
|
|
87
|
+
"fields": { "title": "{{title}}" },
|
|
88
|
+
"success": { "statuses": [201], "jsonPath": "ok", "equals": true },
|
|
89
|
+
"arrayFormat": "comma",
|
|
90
|
+
"maxAttempts": 3,
|
|
91
|
+
"retryDelayMs": 2000
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"deleteAfterDelivery": true
|
|
95
|
+
},
|
|
96
|
+
"targets": [
|
|
97
|
+
{ "type": "illustration", "tag": "收藏", "storageMode": "persistent" },
|
|
98
|
+
{
|
|
99
|
+
"type": "illustration",
|
|
100
|
+
"tag": "更新",
|
|
101
|
+
"storageMode": "cache",
|
|
102
|
+
"delivery": {
|
|
103
|
+
"target": "tg-example",
|
|
104
|
+
"fields": { "tags": ["公告", "更新"], "anonymous": false }
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
headers 和 URL 支持任意 `${ENV_NAME}` 环境变量插值。交付失败时文件和
|
|
112
|
+
outbox 清单保留在 SQLite 数据库同级的 `delivery-outbox/`;下一次运行会先
|
|
113
|
+
自动重试,成功后再清理。
|
|
114
|
+
对上面的 TG 示例,可把 `/gen_token` 得到的 `tp_...` 放入
|
|
115
|
+
`TG_SUBMIT_TOKEN` 环境变量;这只是示例服务自己的认证流程。
|
|
116
|
+
|
|
72
117
|
交互式配置向导:`pixivflow setup`。
|
|
73
118
|
|
|
74
119
|
## 常用命令
|
package/README_EN.md
CHANGED
|
@@ -73,6 +73,46 @@ Downloaded items are tracked in a SQLite database and skipped automatically;
|
|
|
73
73
|
files that exist without a database record are reconciled, so the two never
|
|
74
74
|
conflict.
|
|
75
75
|
|
|
76
|
+
### Persistent and cache delivery modes
|
|
77
|
+
|
|
78
|
+
Each target can use `storageMode: "persistent"` (the default, keep files) or
|
|
79
|
+
`storageMode: "cache"` (send files to a named delivery target and delete them
|
|
80
|
+
only after success). The delivery layer is service-independent; this example
|
|
81
|
+
merely translates an HTTP multipart submission API into configuration:
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"delivery": {
|
|
86
|
+
"targets": {
|
|
87
|
+
"sharing-api": {
|
|
88
|
+
"type": "httpMultipart",
|
|
89
|
+
"url": "https://example.test/submissions",
|
|
90
|
+
"headers": { "Authorization": "Bearer ${SHARING_TOKEN}" },
|
|
91
|
+
"fileField": "files",
|
|
92
|
+
"fields": { "title": "{{title}}" },
|
|
93
|
+
"success": { "statuses": [201], "jsonPath": "ok", "equals": true }
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"targets": [
|
|
98
|
+
{ "type": "illustration", "tag": "archive", "storageMode": "persistent" },
|
|
99
|
+
{
|
|
100
|
+
"type": "illustration",
|
|
101
|
+
"tag": "updates",
|
|
102
|
+
"storageMode": "cache",
|
|
103
|
+
"delivery": {
|
|
104
|
+
"target": "sharing-api",
|
|
105
|
+
"fields": { "tags": ["announcement", "update"], "anonymous": false }
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Headers and URLs accept arbitrary `${ENV_NAME}` interpolation. Failed delivery
|
|
113
|
+
keeps both files and the durable outbox manifest beside the SQLite database;
|
|
114
|
+
the next run retries them before processing new targets.
|
|
115
|
+
|
|
76
116
|
Interactive configuration wizard: `pixivflow setup`.
|
|
77
117
|
|
|
78
118
|
## Common commands
|
package/dist/config/types.d.ts
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
* Configuration type definitions
|
|
3
3
|
*/
|
|
4
4
|
export type TargetType = 'illustration' | 'novel';
|
|
5
|
+
export type DeliveryFieldValue = string | number | boolean | string[];
|
|
6
|
+
export interface TargetDeliveryConfig {
|
|
7
|
+
/** 顶层 delivery.targets 中定义的交付目标名称 */
|
|
8
|
+
target: string;
|
|
9
|
+
/** 覆盖该交付目标的表单字段,支持 {{title}} 等模板变量 */
|
|
10
|
+
fields?: Record<string, DeliveryFieldValue>;
|
|
11
|
+
}
|
|
5
12
|
export interface TargetConfig {
|
|
6
13
|
type: TargetType;
|
|
7
14
|
tag?: string;
|
|
@@ -115,6 +122,13 @@ export interface TargetConfig {
|
|
|
115
122
|
* Default: true
|
|
116
123
|
*/
|
|
117
124
|
detectLanguage?: boolean;
|
|
125
|
+
/**
|
|
126
|
+
* 存储模式:'persistent'(默认,本地留存)或 'cache'(下载成功后上传到
|
|
127
|
+
* target.delivery 指定的交付通道,成功即删除本地文件)。
|
|
128
|
+
*/
|
|
129
|
+
storageMode?: 'persistent' | 'cache';
|
|
130
|
+
/** cache 模式下该 target 使用的交付目标与字段覆盖 */
|
|
131
|
+
delivery?: TargetDeliveryConfig;
|
|
118
132
|
}
|
|
119
133
|
export interface PixivCredentialConfig {
|
|
120
134
|
clientId: string;
|
|
@@ -222,6 +236,39 @@ export interface SchedulerConfig {
|
|
|
222
236
|
*/
|
|
223
237
|
failureRetryDelay?: number;
|
|
224
238
|
}
|
|
239
|
+
export interface HttpMultipartSuccessConfig {
|
|
240
|
+
/** 可接受的 HTTP 状态码;缺省接受全部 2xx */
|
|
241
|
+
statuses?: number[];
|
|
242
|
+
/** 可选 JSON 路径,例如 "ok" 或 "data.accepted" */
|
|
243
|
+
jsonPath?: string;
|
|
244
|
+
/** jsonPath 对应的期望值 */
|
|
245
|
+
equals?: string | number | boolean | null;
|
|
246
|
+
}
|
|
247
|
+
export interface HttpMultipartDeliveryConfig {
|
|
248
|
+
type: 'httpMultipart';
|
|
249
|
+
url: string;
|
|
250
|
+
method?: 'POST' | 'PUT';
|
|
251
|
+
/** 支持 ${ENV_NAME} 环境变量插值 */
|
|
252
|
+
headers?: Record<string, string>;
|
|
253
|
+
/** multipart 文件字段名,默认 files */
|
|
254
|
+
fileField?: string;
|
|
255
|
+
/** 普通表单字段,支持 {{title}}/{{pixivId}}/{{type}}/{{tag}} */
|
|
256
|
+
fields?: Record<string, DeliveryFieldValue>;
|
|
257
|
+
/** 数组字段编码方式,默认 comma */
|
|
258
|
+
arrayFormat?: 'comma' | 'repeat' | 'json';
|
|
259
|
+
success?: HttpMultipartSuccessConfig;
|
|
260
|
+
/** 单次交付的最大尝试次数(含首次),默认 3 */
|
|
261
|
+
maxAttempts?: number;
|
|
262
|
+
/** 重试基础间隔(毫秒),默认 2000 */
|
|
263
|
+
retryDelayMs?: number;
|
|
264
|
+
}
|
|
265
|
+
export type DeliveryTargetConfig = HttpMultipartDeliveryConfig;
|
|
266
|
+
export interface DeliveryConfig {
|
|
267
|
+
/** 可供各 target 引用的命名交付目标 */
|
|
268
|
+
targets: Record<string, DeliveryTargetConfig>;
|
|
269
|
+
/** 交付成功后删除缓存文件;默认 true,失败一律保留 */
|
|
270
|
+
deleteAfterDelivery?: boolean;
|
|
271
|
+
}
|
|
225
272
|
export interface StandaloneConfig {
|
|
226
273
|
/**
|
|
227
274
|
* Pixiv API credentials
|
|
@@ -243,6 +290,10 @@ export interface StandaloneConfig {
|
|
|
243
290
|
* Download targets (tags to download)
|
|
244
291
|
*/
|
|
245
292
|
targets: TargetConfig[];
|
|
293
|
+
/**
|
|
294
|
+
* 缓存模式的通用交付配置(storageMode='cache' 时使用)
|
|
295
|
+
*/
|
|
296
|
+
delivery?: DeliveryConfig;
|
|
246
297
|
/**
|
|
247
298
|
* Log level: 'debug' | 'info' | 'warn' | 'error'
|
|
248
299
|
* Default: 'info'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,OAAO,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,YAAY,CAAC,EAAE,wBAAwB,GAAG,sBAAsB,GAAG,mBAAmB,CAAC;IACvF;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC3B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,cAAc,CAAC;IACjD,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,eAAe,GAAG,aAAa,GAAG,SAAS,GAAG,cAAc,GAAG,gBAAgB,CAAC;IAChK;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;IAC3C;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG3C;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,MAAM,EAAE,MAAM,EAAE;aAChB,QAAQ,EAAE,MAAM,EAAE;gBAFlC,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,GAAE,MAAM,EAAO;CAK1C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG3C;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,MAAM,EAAE,MAAM,EAAE;aAChB,QAAQ,EAAE,MAAM,EAAE;gBAFlC,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,GAAE,MAAM,EAAO;CAK1C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAyM/G;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAkB/G"}
|
|
@@ -107,8 +107,49 @@ function validateConfig(config, location, databasePath) {
|
|
|
107
107
|
if (target.rankingDate && !/^\d{4}-\d{2}-\d{2}$/.test(target.rankingDate) && target.rankingDate !== 'YESTERDAY') {
|
|
108
108
|
errors.push(`targets[${index}].rankingDate: Invalid format, must be YYYY-MM-DD or "YESTERDAY"`);
|
|
109
109
|
}
|
|
110
|
+
if (target.storageMode && !['persistent', 'cache'].includes(target.storageMode)) {
|
|
111
|
+
errors.push(`targets[${index}].storageMode: Must be "persistent" or "cache"`);
|
|
112
|
+
}
|
|
113
|
+
if (target.storageMode === 'cache') {
|
|
114
|
+
const deliveryTarget = target.delivery?.target?.trim();
|
|
115
|
+
if (!deliveryTarget) {
|
|
116
|
+
errors.push(`targets[${index}].delivery.target: Required when storageMode is "cache"`);
|
|
117
|
+
}
|
|
118
|
+
else if (!config.delivery?.targets?.[deliveryTarget]) {
|
|
119
|
+
errors.push(`targets[${index}].delivery.target: Unknown delivery target "${deliveryTarget}"`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
110
122
|
});
|
|
111
123
|
}
|
|
124
|
+
for (const [name, delivery] of Object.entries(config.delivery?.targets ?? {})) {
|
|
125
|
+
const prefix = `delivery.targets.${name}`;
|
|
126
|
+
if (delivery.type !== 'httpMultipart') {
|
|
127
|
+
errors.push(`${prefix}.type: Unsupported delivery type "${delivery.type}"`);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (!delivery.url?.trim()) {
|
|
131
|
+
errors.push(`${prefix}.url: Required field is missing or empty`);
|
|
132
|
+
}
|
|
133
|
+
else if (!/\$\{[A-Za-z_][A-Za-z0-9_]*\}/.test(delivery.url)) {
|
|
134
|
+
try {
|
|
135
|
+
const url = new URL(delivery.url);
|
|
136
|
+
if (!['http:', 'https:'].includes(url.protocol))
|
|
137
|
+
throw new Error('unsupported protocol');
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
errors.push(`${prefix}.url: Must be a valid HTTP or HTTPS URL`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (delivery.method && !['POST', 'PUT'].includes(delivery.method)) {
|
|
144
|
+
errors.push(`${prefix}.method: Must be "POST" or "PUT"`);
|
|
145
|
+
}
|
|
146
|
+
if (delivery.maxAttempts !== undefined && (!Number.isInteger(delivery.maxAttempts) || delivery.maxAttempts < 1)) {
|
|
147
|
+
errors.push(`${prefix}.maxAttempts: Must be an integer greater than 0`);
|
|
148
|
+
}
|
|
149
|
+
if (delivery.retryDelayMs !== undefined && delivery.retryDelayMs < 0) {
|
|
150
|
+
errors.push(`${prefix}.retryDelayMs: Must be greater than or equal to 0`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
112
153
|
// Validate network config
|
|
113
154
|
if (config.network) {
|
|
114
155
|
if (config.network.timeoutMs !== undefined && (config.network.timeoutMs < 1000 || config.network.timeoutMs > 300000)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AA6BH,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AA6BH,wCAyMC;AAKD,gDAkBC;AA3PD,0DAA6B;AAC7B,sCAAmC;AACnC,4CAA8C;AAC9C,0DAAmF;AAEnF,qCAAsC;AAEtC;;GAEG;AACH,MAAa,qBAAsB,SAAQ,KAAK;IAG5B;IACA;IAHlB,YACE,OAAe,EACC,MAAgB,EAChB,WAAqB,EAAE;QAEvC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,WAAM,GAAN,MAAM,CAAU;QAChB,aAAQ,GAAR,QAAQ,CAAe;QAGvC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AATD,sDASC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,MAAiC,EAAE,QAAgB,EAAE,YAAqB;IACvG,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,6BAA6B;IAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC1E,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;QAED,uEAAuE;QACvE,wFAAwF;QACxF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;QAC9C,MAAM,mBAAmB,GAAG,CAAC,IAAA,kCAAkB,EAAC,WAAW,CAAC,CAAC;QAE7D,IAAI,CAAC,mBAAmB,IAAI,YAAY,EAAE,CAAC;YACzC,sDAAsD;YACtD,MAAM,YAAY,GAAG,IAAA,qCAAqB,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YACtE,IAAI,YAAY,EAAE,CAAC;gBACjB,wEAAwE;gBACxE,eAAM,CAAC,KAAK,CAAC,4FAA4F,CAAC,CAAC;YAC7G,CAAC;iBAAM,CAAC;gBACN,uCAAuC;gBACvC,MAAM,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;YACjG,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAChC,sDAAsD;YACtD,MAAM,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;QACjG,CAAC;QACD,4DAA4D;QAE5D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACpE,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,yDAAyD;QACzD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACvC,iHAAiH;YACjH,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBACxJ,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,8IAA8I,CAAC,CAAC;YAC9K,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpE,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,2CAA2C,CAAC,CAAC;YAC3E,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC/B,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,wCAAwC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;gBACvF,CAAC;qBAAM,IAAI,MAAM,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;oBAC/B,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,8CAA8C,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC/F,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,wBAAwB,EAAE,sBAAsB,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClI,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,gHAAgH,CAAC,CAAC;YAChJ,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtE,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,qDAAqD,CAAC,CAAC;YACrF,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;gBAChH,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,kEAAkE,CAAC,CAAC;YAClG,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChF,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,gDAAgD,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;gBACnC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACvD,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,yDAAyD,CAAC,CAAC;gBACzF,CAAC;qBAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;oBACvD,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,+CAA+C,cAAc,GAAG,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9E,MAAM,MAAM,GAAG,oBAAoB,IAAI,EAAE,CAAC;QAC1C,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,qCAAsC,QAA8B,CAAC,IAAI,GAAG,CAAC,CAAC;YACnG,SAAS;QACX,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,0CAA0C,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAClC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC3F,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,yCAAyC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,kCAAkC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;YAChH,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,iDAAiD,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,IAAI,QAAQ,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,mDAAmD,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;YACrH,QAAQ,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;QACnG,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC;YACxG,QAAQ,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC1E,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC;gBACrG,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YAC3E,CAAC;YACD,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpH,MAAM,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,mBAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,4CAA4C,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,CAAC,aAAa,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YACvF,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACnF,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;YAC9E,QAAQ,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,CAAC,sBAAsB,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,sBAAsB,GAAG,CAAC,EAAE,CAAC;YACzG,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC;YACvH,QAAQ,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YACnF,QAAQ,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS;YACzF,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACzG,QAAQ,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC;YACpH,QAAQ,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,4DAA4D,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC/F,CAAC;IAED,kBAAkB;IAClB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,eAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,2CAA2C;IAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,kCAAkC;QAClC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;QAEnE,IAAI,YAAY,GAAG,sCAAsC,QAAQ,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAEhH,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,IAAI,sEAAsE,CAAC;YACvF,YAAY,IAAI,4CAA4C,CAAC;YAC7D,YAAY,IAAI,qDAAqD,CAAC;YACtE,YAAY,IAAI,iEAAiE,CAAC;QACpF,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9E,MAAM,IAAI,oBAAW,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,UAAkB;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;YAC3C,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC;QACJ,CAAC;QACD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChE,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* This module re-exports all configuration types and functions from sub-modules
|
|
5
5
|
* to maintain backward compatibility with existing code.
|
|
6
6
|
*/
|
|
7
|
-
export type { TargetType, TargetConfig, PixivCredentialConfig, NetworkConfig, OrganizationMode, StorageConfig, SchedulerConfig, StandaloneConfig, } from './config/types';
|
|
7
|
+
export type { TargetType, TargetConfig, DeliveryFieldValue, TargetDeliveryConfig, PixivCredentialConfig, NetworkConfig, OrganizationMode, StorageConfig, SchedulerConfig, HttpMultipartSuccessConfig, HttpMultipartDeliveryConfig, DeliveryTargetConfig, DeliveryConfig, StandaloneConfig, } from './config/types';
|
|
8
8
|
export { loadConfig, getConfigPath } from './config/loader';
|
|
9
9
|
export { generateDefaultConfig, DEFAULT_CONFIG } from './config/defaults';
|
|
10
10
|
export { validateConfigFile, ConfigValidationError } from './config/validation';
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,UAAU,EACV,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,0BAA0B,EAC1B,2BAA2B,EAC3B,oBAAoB,EACpB,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAoBH,iCAAiC;AACjC,0CAA4D;AAAnD,oGAAA,UAAU,OAAA;AAAE,uGAAA,aAAa,OAAA;AAClC,8CAA0E;AAAjE,iHAAA,qBAAqB,OAAA;AAAE,0GAAA,cAAc,OAAA;AAC9C,kDAAgF;AAAvE,gHAAA,kBAAkB,OAAA;AAAE,mHAAA,qBAAqB,OAAA;AAClD,oDAA+G;AAAtG,wHAAA,yBAAyB,OAAA;AAAE,wHAAA,yBAAyB,OAAA;AAAE,gHAAA,iBAAiB,OAAA;AAChF,sDAAkE;AAAzD,yHAAA,yBAAyB,OAAA;AAClC,4DAAyD;AAAhD,gHAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DeliveryConfig } from '../config';
|
|
2
|
+
import { DeliveryRequest, DeliveryResult } from './types';
|
|
3
|
+
/** Resolves named delivery targets without coupling the outbox to a provider. */
|
|
4
|
+
export declare class DeliveryDispatcher {
|
|
5
|
+
private readonly config;
|
|
6
|
+
private readonly proxyUrl?;
|
|
7
|
+
constructor(config: DeliveryConfig | undefined, proxyUrl?: string | undefined);
|
|
8
|
+
hasTarget(name: string): boolean;
|
|
9
|
+
deliver(name: string, request: DeliveryRequest): Promise<DeliveryResult>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=DeliveryDispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeliveryDispatcher.d.ts","sourceRoot":"","sources":["../../src/delivery/DeliveryDispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE1D,iFAAiF;AACjF,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBADT,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,QAAQ,CAAC,EAAE,MAAM,YAAA;IAGpC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAY/E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeliveryDispatcher = void 0;
|
|
4
|
+
const errors_1 = require("../utils/errors");
|
|
5
|
+
const HttpMultipartDelivery_1 = require("./HttpMultipartDelivery");
|
|
6
|
+
/** Resolves named delivery targets without coupling the outbox to a provider. */
|
|
7
|
+
class DeliveryDispatcher {
|
|
8
|
+
config;
|
|
9
|
+
proxyUrl;
|
|
10
|
+
constructor(config, proxyUrl) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.proxyUrl = proxyUrl;
|
|
13
|
+
}
|
|
14
|
+
hasTarget(name) {
|
|
15
|
+
return Boolean(this.config?.targets?.[name]);
|
|
16
|
+
}
|
|
17
|
+
async deliver(name, request) {
|
|
18
|
+
const target = this.config?.targets?.[name];
|
|
19
|
+
if (!target) {
|
|
20
|
+
throw new errors_1.ConfigError(`Delivery target is not configured: ${name}`);
|
|
21
|
+
}
|
|
22
|
+
switch (target.type) {
|
|
23
|
+
case 'httpMultipart':
|
|
24
|
+
return new HttpMultipartDelivery_1.HttpMultipartDelivery(target, this.proxyUrl).deliver(request);
|
|
25
|
+
default:
|
|
26
|
+
throw new errors_1.ConfigError(`Unsupported delivery target type: ${target.type}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.DeliveryDispatcher = DeliveryDispatcher;
|
|
31
|
+
//# sourceMappingURL=DeliveryDispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeliveryDispatcher.js","sourceRoot":"","sources":["../../src/delivery/DeliveryDispatcher.ts"],"names":[],"mappings":";;;AACA,4CAA8C;AAC9C,mEAAgE;AAGhE,iFAAiF;AACjF,MAAa,kBAAkB;IAEV;IACA;IAFnB,YACmB,MAAkC,EAClC,QAAiB;QADjB,WAAM,GAAN,MAAM,CAA4B;QAClC,aAAQ,GAAR,QAAQ,CAAS;IACjC,CAAC;IAEJ,SAAS,CAAC,IAAY;QACpB,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,OAAwB;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,oBAAW,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,eAAe;gBAClB,OAAO,IAAI,6CAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3E;gBACE,MAAM,IAAI,oBAAW,CAAC,qCAAsC,MAA4B,CAAC,IAAI,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;CACF;AAtBD,gDAsBC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { TargetConfig } from '../config';
|
|
2
|
+
import { DeliveryDispatcher } from './DeliveryDispatcher';
|
|
3
|
+
import { DownloadedArtifact } from './types';
|
|
4
|
+
export interface PendingRetryResult {
|
|
5
|
+
succeeded: number;
|
|
6
|
+
failed: number;
|
|
7
|
+
}
|
|
8
|
+
/** Durable, provider-independent delivery outbox for cache-mode downloads. */
|
|
9
|
+
export declare class DeliveryOutbox {
|
|
10
|
+
private readonly directory;
|
|
11
|
+
private readonly dispatcher;
|
|
12
|
+
private readonly deleteAfterDelivery;
|
|
13
|
+
constructor(directory: string, dispatcher: DeliveryDispatcher, deleteAfterDelivery?: boolean);
|
|
14
|
+
deliver(artifact: DownloadedArtifact, target: TargetConfig): Promise<void>;
|
|
15
|
+
retryPending(): Promise<PendingRetryResult>;
|
|
16
|
+
private processManifest;
|
|
17
|
+
private assertFilesExist;
|
|
18
|
+
private deleteFiles;
|
|
19
|
+
private readManifest;
|
|
20
|
+
private writeNewManifest;
|
|
21
|
+
private writeManifest;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=DeliveryOutbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeliveryOutbox.d.ts","sourceRoot":"","sources":["../../src/delivery/DeliveryOutbox.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAmC,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAgB9E,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,8EAA8E;AAC9E,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;gBAFnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,kBAAkB,EAC9B,mBAAmB,UAAO;IAGvC,OAAO,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAwD1E,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC;YA4BnC,eAAe;YAqCf,gBAAgB;YAUhB,WAAW;YAQX,YAAY;YAcZ,gBAAgB;YAMhB,aAAa;CAG5B"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeliveryOutbox = void 0;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const logger_1 = require("../logger");
|
|
8
|
+
const errors_1 = require("../utils/errors");
|
|
9
|
+
/** Durable, provider-independent delivery outbox for cache-mode downloads. */
|
|
10
|
+
class DeliveryOutbox {
|
|
11
|
+
directory;
|
|
12
|
+
dispatcher;
|
|
13
|
+
deleteAfterDelivery;
|
|
14
|
+
constructor(directory, dispatcher, deleteAfterDelivery = true) {
|
|
15
|
+
this.directory = directory;
|
|
16
|
+
this.dispatcher = dispatcher;
|
|
17
|
+
this.deleteAfterDelivery = deleteAfterDelivery;
|
|
18
|
+
}
|
|
19
|
+
async deliver(artifact, target) {
|
|
20
|
+
if (target.storageMode !== 'cache')
|
|
21
|
+
return;
|
|
22
|
+
const deliveryTarget = target.delivery?.target?.trim();
|
|
23
|
+
if (!deliveryTarget) {
|
|
24
|
+
throw new errors_1.ConfigError('cache storageMode requires target.delivery.target');
|
|
25
|
+
}
|
|
26
|
+
if (!this.dispatcher.hasTarget(deliveryTarget)) {
|
|
27
|
+
throw new errors_1.ConfigError(`Delivery target is not configured: ${deliveryTarget}`);
|
|
28
|
+
}
|
|
29
|
+
if (artifact.files.length === 0) {
|
|
30
|
+
throw new Error(`No files were produced for ${artifact.type} ${artifact.pixivId}`);
|
|
31
|
+
}
|
|
32
|
+
await node_fs_1.promises.mkdir(this.directory, { recursive: true });
|
|
33
|
+
const now = new Date().toISOString();
|
|
34
|
+
const entry = {
|
|
35
|
+
version: 1,
|
|
36
|
+
id: (0, node_crypto_1.randomUUID)(),
|
|
37
|
+
createdAt: now,
|
|
38
|
+
updatedAt: now,
|
|
39
|
+
attempts: 0,
|
|
40
|
+
status: 'pending',
|
|
41
|
+
deliveryTarget,
|
|
42
|
+
artifact: {
|
|
43
|
+
...artifact,
|
|
44
|
+
files: [...new Set(artifact.files.map((file) => (0, node_path_1.resolve)(file)))],
|
|
45
|
+
cleanupFiles: [...new Set((artifact.cleanupFiles ?? []).map((file) => (0, node_path_1.resolve)(file)))],
|
|
46
|
+
},
|
|
47
|
+
request: {
|
|
48
|
+
fields: target.delivery?.fields,
|
|
49
|
+
context: {
|
|
50
|
+
title: artifact.title,
|
|
51
|
+
pixivId: artifact.pixivId,
|
|
52
|
+
type: artifact.type,
|
|
53
|
+
tag: target.filterTag ?? target.tag,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
const manifestPath = (0, node_path_1.join)(this.directory, `${artifact.type}-${artifact.pixivId}-${entry.id}.json`);
|
|
58
|
+
await this.writeNewManifest(manifestPath, entry);
|
|
59
|
+
try {
|
|
60
|
+
await this.processManifest(manifestPath, entry);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
64
|
+
throw new errors_1.PendingDeliveryError(`Delivery failed; files retained for retry in ${manifestPath}: ${message}`, error instanceof Error ? error : undefined);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async retryPending() {
|
|
68
|
+
let names;
|
|
69
|
+
try {
|
|
70
|
+
names = (await node_fs_1.promises.readdir(this.directory)).filter((name) => name.endsWith('.json')).sort();
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (error.code === 'ENOENT')
|
|
74
|
+
return { succeeded: 0, failed: 0 };
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
let succeeded = 0;
|
|
78
|
+
let failed = 0;
|
|
79
|
+
for (const name of names) {
|
|
80
|
+
const manifestPath = (0, node_path_1.join)(this.directory, name);
|
|
81
|
+
try {
|
|
82
|
+
const entry = await this.readManifest(manifestPath);
|
|
83
|
+
await this.processManifest(manifestPath, entry);
|
|
84
|
+
succeeded++;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
failed++;
|
|
88
|
+
logger_1.logger.warn('Pending delivery remains queued', {
|
|
89
|
+
manifestPath,
|
|
90
|
+
error: error instanceof Error ? error.message : String(error),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { succeeded, failed };
|
|
95
|
+
}
|
|
96
|
+
async processManifest(manifestPath, entry) {
|
|
97
|
+
if (entry.status === 'pending') {
|
|
98
|
+
await this.assertFilesExist(entry.artifact.files);
|
|
99
|
+
try {
|
|
100
|
+
const result = await this.dispatcher.deliver(entry.deliveryTarget, {
|
|
101
|
+
...entry.request,
|
|
102
|
+
files: entry.artifact.files,
|
|
103
|
+
});
|
|
104
|
+
entry.result = { status: result.status };
|
|
105
|
+
entry.status = 'delivered';
|
|
106
|
+
entry.attempts++;
|
|
107
|
+
entry.updatedAt = new Date().toISOString();
|
|
108
|
+
delete entry.lastError;
|
|
109
|
+
await this.writeManifest(manifestPath, entry);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
entry.attempts++;
|
|
113
|
+
entry.updatedAt = new Date().toISOString();
|
|
114
|
+
entry.lastError = error instanceof Error ? error.message : String(error);
|
|
115
|
+
await this.writeManifest(manifestPath, entry);
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (this.deleteAfterDelivery) {
|
|
120
|
+
await this.deleteFiles([...entry.artifact.files, ...(entry.artifact.cleanupFiles ?? [])]);
|
|
121
|
+
}
|
|
122
|
+
await node_fs_1.promises.unlink(manifestPath).catch((error) => {
|
|
123
|
+
if (error.code !== 'ENOENT')
|
|
124
|
+
throw error;
|
|
125
|
+
});
|
|
126
|
+
logger_1.logger.info('Delivery outbox item completed', {
|
|
127
|
+
deliveryTarget: entry.deliveryTarget,
|
|
128
|
+
pixivId: entry.artifact.pixivId,
|
|
129
|
+
type: entry.artifact.type,
|
|
130
|
+
status: entry.result?.status,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async assertFilesExist(files) {
|
|
134
|
+
for (const file of files) {
|
|
135
|
+
try {
|
|
136
|
+
await node_fs_1.promises.access(file);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
throw new Error(`Pending delivery file is missing: ${file}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async deleteFiles(files) {
|
|
144
|
+
for (const file of new Set(files)) {
|
|
145
|
+
await node_fs_1.promises.unlink(file).catch((error) => {
|
|
146
|
+
if (error.code !== 'ENOENT')
|
|
147
|
+
throw error;
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async readManifest(manifestPath) {
|
|
152
|
+
const parsed = JSON.parse(await node_fs_1.promises.readFile(manifestPath, 'utf8'));
|
|
153
|
+
if (parsed.version !== 1 ||
|
|
154
|
+
!parsed.deliveryTarget ||
|
|
155
|
+
!parsed.artifact ||
|
|
156
|
+
!Array.isArray(parsed.artifact.files) ||
|
|
157
|
+
!parsed.request?.context) {
|
|
158
|
+
throw new Error(`Invalid delivery outbox manifest: ${manifestPath}`);
|
|
159
|
+
}
|
|
160
|
+
return parsed;
|
|
161
|
+
}
|
|
162
|
+
async writeNewManifest(manifestPath, entry) {
|
|
163
|
+
const temporaryPath = `${manifestPath}.${process.pid}.${(0, node_crypto_1.randomUUID)()}.tmp`;
|
|
164
|
+
await node_fs_1.promises.writeFile(temporaryPath, JSON.stringify(entry, null, 2), 'utf8');
|
|
165
|
+
await node_fs_1.promises.rename(temporaryPath, manifestPath);
|
|
166
|
+
}
|
|
167
|
+
async writeManifest(manifestPath, entry) {
|
|
168
|
+
await node_fs_1.promises.writeFile(manifestPath, JSON.stringify(entry, null, 2), 'utf8');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.DeliveryOutbox = DeliveryOutbox;
|
|
172
|
+
//# sourceMappingURL=DeliveryOutbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeliveryOutbox.js","sourceRoot":"","sources":["../../src/delivery/DeliveryOutbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { HttpMultipartDeliveryConfig } from '../config';
|
|
2
|
+
import { DeliveryProvider, DeliveryRequest, DeliveryResult } from './types';
|
|
3
|
+
/** Generic streaming HTTP multipart delivery provider. */
|
|
4
|
+
export declare class HttpMultipartDelivery implements DeliveryProvider {
|
|
5
|
+
private readonly config;
|
|
6
|
+
private readonly dispatcher?;
|
|
7
|
+
constructor(config: HttpMultipartDeliveryConfig, proxyUrl?: string);
|
|
8
|
+
deliver(request: DeliveryRequest): Promise<DeliveryResult>;
|
|
9
|
+
private attempt;
|
|
10
|
+
private assertSuccess;
|
|
11
|
+
private resolveHeaders;
|
|
12
|
+
private resolveFields;
|
|
13
|
+
private interpolateEnvironment;
|
|
14
|
+
private createMultipartBody;
|
|
15
|
+
private escapeDispositionValue;
|
|
16
|
+
private preview;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=HttpMultipartDelivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpMultipartDelivery.d.ts","sourceRoot":"","sources":["../../src/delivery/HttpMultipartDelivery.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,2BAA2B,EAAE,MAAM,WAAW,CAAC;AAE5E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE5E,0DAA0D;AAC1D,qBAAa,qBAAsB,YAAW,gBAAgB;IAI1D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAU;gBAGnB,MAAM,EAAE,2BAA2B,EACpD,QAAQ,CAAC,EAAE,MAAM;IASb,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;YA8BlD,OAAO;IAyCrB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,sBAAsB;YAUhB,mBAAmB;IAkDjC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,OAAO;CAIhB"}
|