@skrillex1224/chrome-article-publish-extension 1.0.2 → 1.0.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/dist/adapters/index.d.ts +7 -6
- package/dist/adapters/index.js +1 -1
- package/dist/{chunk-GPHPFYRZ.js → chunk-CBRXLVZK.js} +27 -2
- package/dist/chunk-CBRXLVZK.js.map +1 -0
- package/dist/{chunk-LUN2JBGI.js → chunk-TKRBESSS.js} +294 -228
- package/dist/chunk-TKRBESSS.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/{interface-DRp7JR58.d.ts → interface-DHk2PdyN.d.ts} +4 -0
- package/dist/runtime/index.d.ts +6 -3
- package/dist/runtime/index.js +1 -1
- package/dist/{types-DllMbt54.d.ts → types-GigbrW8J.d.ts} +1 -1
- package/package.json +4 -2
- package/dist/chunk-GPHPFYRZ.js.map +0 -1
- package/dist/chunk-LUN2JBGI.js.map +0 -1
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { P as PlatformAdapter, a as PublishOptions, A as AdapterRegistryEntry, b as PreprocessConfig } from '../types-
|
|
2
|
-
export { C as Category, D as DEFAULT_PREPROCESS_CONFIG, c as Draft, I as ImageProgressCallback, O as OutputFormat } from '../types-
|
|
3
|
-
import { P as PlatformMeta, R as RuntimeInterface, A as AuthResult, a as Article, S as SyncResult, c as PublishStatusRef, d as PublishStatusResult, H as HeaderRule } from '../interface-
|
|
1
|
+
import { P as PlatformAdapter, a as PublishOptions, A as AdapterRegistryEntry, b as PreprocessConfig } from '../types-GigbrW8J.js';
|
|
2
|
+
export { C as Category, D as DEFAULT_PREPROCESS_CONFIG, c as Draft, I as ImageProgressCallback, O as OutputFormat } from '../types-GigbrW8J.js';
|
|
3
|
+
import { P as PlatformMeta, R as RuntimeInterface, A as AuthResult, a as Article, S as SyncResult, c as PublishStatusRef, d as PublishStatusResult, H as HeaderRule } from '../interface-DHk2PdyN.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* 适配器基类
|
|
@@ -461,7 +461,7 @@ declare class CSDNAdapter extends CodeAdapter {
|
|
|
461
461
|
private preserveTaskListMarkers;
|
|
462
462
|
private postSaveArticle;
|
|
463
463
|
private postSaveArticleFromPage;
|
|
464
|
-
private
|
|
464
|
+
private getCsdnTab;
|
|
465
465
|
publish(article: Article, options?: PublishOptions): Promise<SyncResult>;
|
|
466
466
|
getStatus(statusRef: PublishStatusRef): Promise<PublishStatusResult>;
|
|
467
467
|
private findManagedArticle;
|
|
@@ -614,7 +614,8 @@ declare class DouyinAdapter extends CodeAdapter {
|
|
|
614
614
|
private getCreatorJsonFromPage;
|
|
615
615
|
private postCreatorForm;
|
|
616
616
|
private postCreatorFormFromPage;
|
|
617
|
-
private
|
|
617
|
+
private getCreatorTab;
|
|
618
|
+
private closeCreatorTab;
|
|
618
619
|
private extractUserData;
|
|
619
620
|
private isSuccessResponse;
|
|
620
621
|
private buildTextPayload;
|
|
@@ -666,7 +667,7 @@ declare class BaijiahaoAdapter extends CodeAdapter {
|
|
|
666
667
|
private mapArticleStatus;
|
|
667
668
|
private isPublishedItem;
|
|
668
669
|
private resolvePublishedPublicUrl;
|
|
669
|
-
private
|
|
670
|
+
private getPublishedPageTab;
|
|
670
671
|
private readPublishedPageSnapshot;
|
|
671
672
|
private urlMatchesArticleId;
|
|
672
673
|
private sleep;
|
package/dist/adapters/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/runtime/chrome-extension.ts
|
|
2
2
|
var DEFAULT_FETCH_TIMEOUT = 30 * 1e3;
|
|
3
|
+
var RUNTIME_TAB_GROUP_TITLE = "Article Publish Runtime";
|
|
3
4
|
var ExtensionRuntime = class {
|
|
4
5
|
constructor(config) {
|
|
5
6
|
this.config = config;
|
|
@@ -9,6 +10,7 @@ var ExtensionRuntime = class {
|
|
|
9
10
|
// 使用时间戳+随机数避免规则 ID 冲突(扩展重载或并发场景)
|
|
10
11
|
ruleIdBase = Date.now() % 1e5;
|
|
11
12
|
ruleIdCounter = 0;
|
|
13
|
+
runtimeTabGroupId = null;
|
|
12
14
|
/**
|
|
13
15
|
* HTTP 请求 - 自动携带 cookies,带超时保护
|
|
14
16
|
*/
|
|
@@ -182,10 +184,14 @@ var ExtensionRuntime = class {
|
|
|
182
184
|
const tabs = await chrome.tabs.query({ url: urlPattern });
|
|
183
185
|
return tabs.filter((t) => t.id !== void 0).map((t) => ({ id: t.id, url: t.url }));
|
|
184
186
|
},
|
|
185
|
-
async
|
|
187
|
+
create: async (url, active = false) => {
|
|
186
188
|
const tab = await chrome.tabs.create({ url, active });
|
|
189
|
+
await this.addToRuntimeTabGroup(tab.id);
|
|
187
190
|
return { id: tab.id };
|
|
188
191
|
},
|
|
192
|
+
close: async (tabId) => {
|
|
193
|
+
await chrome.tabs.remove(tabId);
|
|
194
|
+
},
|
|
189
195
|
async waitForLoad(tabId, timeout = 3e4) {
|
|
190
196
|
return new Promise((resolve, reject) => {
|
|
191
197
|
const timeoutId = setTimeout(() => {
|
|
@@ -213,6 +219,25 @@ var ExtensionRuntime = class {
|
|
|
213
219
|
return result;
|
|
214
220
|
}
|
|
215
221
|
};
|
|
222
|
+
async addToRuntimeTabGroup(tabId) {
|
|
223
|
+
if (!chrome.tabs.group || !chrome.tabGroups?.update) return;
|
|
224
|
+
try {
|
|
225
|
+
const groupId = await chrome.tabs.group({
|
|
226
|
+
tabIds: [tabId],
|
|
227
|
+
...this.runtimeTabGroupId === null ? {} : { groupId: this.runtimeTabGroupId }
|
|
228
|
+
});
|
|
229
|
+
if (this.runtimeTabGroupId === null) {
|
|
230
|
+
this.runtimeTabGroupId = groupId;
|
|
231
|
+
await chrome.tabGroups.update(groupId, {
|
|
232
|
+
title: RUNTIME_TAB_GROUP_TITLE,
|
|
233
|
+
color: "grey",
|
|
234
|
+
collapsed: true
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
} catch (error) {
|
|
238
|
+
console.warn("Failed to group Article Publish runtime tab:", error);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
216
241
|
/**
|
|
217
242
|
* DOM 操作 - 通过 Offscreen Document 实现
|
|
218
243
|
*/
|
|
@@ -243,4 +268,4 @@ export {
|
|
|
243
268
|
ExtensionRuntime,
|
|
244
269
|
createExtensionRuntime
|
|
245
270
|
};
|
|
246
|
-
//# sourceMappingURL=chunk-
|
|
271
|
+
//# sourceMappingURL=chunk-CBRXLVZK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/chrome-extension.ts"],"sourcesContent":["import type { RuntimeInterface, RuntimeConfig } from './interface'\nimport type { Cookie, HeaderRule } from '../types'\n\n/**\n * Chrome 扩展运行时实现\n */\n// 默认请求超时:30 秒\nconst DEFAULT_FETCH_TIMEOUT = 30 * 1000\nconst RUNTIME_TAB_GROUP_TITLE = 'Article Publish Runtime'\n\nexport class ExtensionRuntime implements RuntimeInterface {\n readonly type = 'extension' as const\n // 使用时间戳+随机数避免规则 ID 冲突(扩展重载或并发场景)\n private ruleIdBase = Date.now() % 100000\n private ruleIdCounter = 0\n private runtimeTabGroupId: number | null = null\n\n constructor(private config?: RuntimeConfig) {}\n\n /**\n * HTTP 请求 - 自动携带 cookies,带超时保护\n */\n async fetch(url: string, options?: RequestInit): Promise<Response> {\n const timeout = this.config?.timeout ?? DEFAULT_FETCH_TIMEOUT\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n credentials: 'include',\n signal: controller.signal,\n })\n return response\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n throw new Error(`请求超时(${timeout / 1000}秒): ${url}`)\n }\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`${message}: ${url}`)\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Cookie 管理\n */\n cookies = {\n async get(domain: string): Promise<Cookie[]> {\n const cookies = await chrome.cookies.getAll({ domain })\n return cookies.map(c => ({\n name: c.name,\n value: c.value,\n domain: c.domain,\n path: c.path,\n secure: c.secure,\n httpOnly: c.httpOnly,\n expirationDate: c.expirationDate,\n }))\n },\n\n async set(cookie: Cookie): Promise<void> {\n await chrome.cookies.set({\n url: `https://${cookie.domain}${cookie.path || '/'}`,\n name: cookie.name,\n value: cookie.value,\n domain: cookie.domain,\n path: cookie.path,\n secure: cookie.secure,\n httpOnly: cookie.httpOnly,\n expirationDate: cookie.expirationDate,\n })\n },\n\n async remove(name: string, domain: string): Promise<void> {\n await chrome.cookies.remove({\n url: `https://${domain}`,\n name,\n })\n },\n }\n\n /**\n * 获取单个 Cookie 值(便捷方法)\n */\n async getCookie(domain: string, name: string): Promise<string | null> {\n const cookies = await chrome.cookies.getAll({ domain, name })\n return cookies.length > 0 ? cookies[0].value : null\n }\n\n /**\n * 持久化存储\n */\n storage = {\n async get<T>(key: string): Promise<T | null> {\n const result = await chrome.storage.local.get(key)\n return (result[key] as T) ?? null\n },\n\n async set<T>(key: string, value: T): Promise<void> {\n await chrome.storage.local.set({ [key]: value })\n },\n\n async remove(key: string): Promise<void> {\n await chrome.storage.local.remove(key)\n },\n }\n\n /**\n * 会话存储\n */\n session = {\n async get<T>(key: string): Promise<T | null> {\n const result = await chrome.storage.session.get(key)\n return (result[key] as T) ?? null\n },\n\n async set<T>(key: string, value: T): Promise<void> {\n await chrome.storage.session.set({ [key]: value })\n },\n }\n\n /**\n * Header 规则管理 (declarativeNetRequest)\n * 规则只对扩展自身发起的请求生效,不影响其他网页\n */\n headerRules = {\n add: async (rule: HeaderRule): Promise<string> => {\n // 组合 base + counter 生成唯一 ID,避免冲突\n const ruleId = this.ruleIdBase + this.ruleIdCounter++\n const id = `rule_${ruleId}`\n\n await chrome.declarativeNetRequest.updateDynamicRules({\n removeRuleIds: [ruleId],\n })\n\n await chrome.declarativeNetRequest.updateDynamicRules({\n addRules: [\n {\n id: ruleId,\n priority: 1,\n action: {\n type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,\n requestHeaders: Object.entries(rule.headers).map(\n ([header, value]) => ({\n header,\n operation: chrome.declarativeNetRequest.HeaderOperation.SET,\n value,\n })\n ),\n },\n condition: {\n urlFilter: rule.urlFilter,\n // 只对扩展自身发起的请求生效,不影响其他网页\n initiatorDomains: [chrome.runtime.id],\n resourceTypes: (rule.resourceTypes || [\n 'xmlhttprequest',\n ]) as chrome.declarativeNetRequest.ResourceType[],\n },\n },\n ],\n })\n\n return id\n },\n\n remove: async (ruleId: string): Promise<void> => {\n const id = parseInt(ruleId.replace('rule_', ''), 10)\n await chrome.declarativeNetRequest.updateDynamicRules({\n removeRuleIds: [id],\n })\n },\n\n clear: async (): Promise<void> => {\n const rules = await chrome.declarativeNetRequest.getDynamicRules()\n await chrome.declarativeNetRequest.updateDynamicRules({\n removeRuleIds: rules.map(r => r.id),\n })\n },\n }\n\n /**\n * 文件下载\n * Service Worker 中不支持 URL.createObjectURL,使用 data URL 替代\n */\n downloads = {\n async download(blob: Blob, filename: string, saveAs = true): Promise<number> {\n // 将 Blob 转换为 data URL\n const buffer = await blob.arrayBuffer()\n const base64 = btoa(\n new Uint8Array(buffer).reduce((data, byte) => data + String.fromCharCode(byte), '')\n )\n const mimeType = blob.type || 'application/octet-stream'\n const dataUrl = `data:${mimeType};base64,${base64}`\n\n const downloadId = await chrome.downloads.download({\n url: dataUrl,\n filename,\n saveAs,\n })\n return downloadId\n },\n }\n\n /**\n * Tab 管理\n */\n tabs = {\n async query(urlPattern: string): Promise<Array<{ id: number; url?: string }>> {\n const tabs = await chrome.tabs.query({ url: urlPattern })\n return tabs.filter(t => t.id !== undefined).map(t => ({ id: t.id!, url: t.url }))\n },\n\n create: async (url: string, active = false): Promise<{ id: number }> => {\n const tab = await chrome.tabs.create({ url, active })\n await this.addToRuntimeTabGroup(tab.id!)\n return { id: tab.id! }\n },\n\n close: async (tabId: number): Promise<void> => {\n await chrome.tabs.remove(tabId)\n },\n\n async waitForLoad(tabId: number, timeout = 30000): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n chrome.tabs.onUpdated.removeListener(listener)\n reject(new Error('Tab load timeout'))\n }, timeout)\n\n const listener = (updatedTabId: number, info: chrome.tabs.TabChangeInfo) => {\n if (updatedTabId === tabId && info.status === 'complete') {\n clearTimeout(timeoutId)\n chrome.tabs.onUpdated.removeListener(listener)\n // 额外等待让页面 JS 初始化\n setTimeout(resolve, 1000)\n }\n }\n chrome.tabs.onUpdated.addListener(listener)\n })\n },\n\n async executeScript<T, A extends unknown[]>(\n tabId: number,\n func: (...args: A) => T | Promise<T>,\n args: A\n ): Promise<T> {\n const results = await chrome.scripting.executeScript({\n target: { tabId },\n world: 'MAIN',\n func: func as (...args: unknown[]) => unknown,\n args: args as unknown[],\n })\n\n const result = results[0]?.result as T\n return result\n },\n }\n\n private async addToRuntimeTabGroup(tabId: number): Promise<void> {\n if (!chrome.tabs.group || !chrome.tabGroups?.update) return\n\n try {\n const groupId = await chrome.tabs.group({\n tabIds: [tabId],\n ...(this.runtimeTabGroupId === null ? {} : { groupId: this.runtimeTabGroupId }),\n })\n if (this.runtimeTabGroupId === null) {\n this.runtimeTabGroupId = groupId\n await chrome.tabGroups.update(groupId, {\n title: RUNTIME_TAB_GROUP_TITLE,\n color: 'grey',\n collapsed: true,\n })\n }\n } catch (error) {\n console.warn('Failed to group Article Publish runtime tab:', error)\n }\n }\n\n /**\n * DOM 操作 - 通过 Offscreen Document 实现\n */\n dom = {\n parseHTML: async (html: string): Promise<Document> => {\n const parser = new DOMParser()\n return parser.parseFromString(html, 'text/html')\n },\n\n querySelector: (doc: Document, selector: string): Element | null => {\n return doc.querySelector(selector)\n },\n\n querySelectorAll: (doc: Document, selector: string): Element[] => {\n return Array.from(doc.querySelectorAll(selector))\n },\n\n getTextContent: (element: Element): string => {\n return element.textContent || ''\n },\n\n getInnerHTML: (element: Element): string => {\n return element.innerHTML\n },\n }\n}\n\n/**\n * 创建扩展运行时实例\n */\nexport function createExtensionRuntime(config?: RuntimeConfig): ExtensionRuntime {\n return new ExtensionRuntime(config)\n}\n"],"mappings":"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","names":[]}
|