@skrillex1224/chrome-article-publish-extension 1.0.3 → 1.0.5

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.
@@ -1,6 +1,6 @@
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';
1
+ import { P as PlatformAdapter, a as PublishOptions, A as AdapterRegistryEntry, b as PreprocessConfig } from '../types-CTtvGuEx.js';
2
+ export { C as Category, D as DEFAULT_PREPROCESS_CONFIG, c as Draft, I as ImageProgressCallback, O as OutputFormat } from '../types-CTtvGuEx.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-CLQqUboy.js';
4
4
 
5
5
  /**
6
6
  * 适配器基类
@@ -461,7 +461,6 @@ declare class CSDNAdapter extends CodeAdapter {
461
461
  private preserveTaskListMarkers;
462
462
  private postSaveArticle;
463
463
  private postSaveArticleFromPage;
464
- private getCsdnTab;
465
464
  publish(article: Article, options?: PublishOptions): Promise<SyncResult>;
466
465
  getStatus(statusRef: PublishStatusRef): Promise<PublishStatusResult>;
467
466
  private findManagedArticle;
@@ -614,14 +613,12 @@ declare class DouyinAdapter extends CodeAdapter {
614
613
  private getCreatorJsonFromPage;
615
614
  private postCreatorForm;
616
615
  private postCreatorFormFromPage;
617
- private getCreatorTab;
618
- private closeCreatorTab;
616
+ private withCreatorTab;
619
617
  private extractUserData;
620
618
  private isSuccessResponse;
621
619
  private buildTextPayload;
622
620
  private extractBodyText;
623
621
  private normalizeText;
624
- private limitText;
625
622
  private buildPublishItem;
626
623
  private uploadDouyinVideo;
627
624
  private waitForVideoTransend;
@@ -667,7 +664,6 @@ declare class BaijiahaoAdapter extends CodeAdapter {
667
664
  private mapArticleStatus;
668
665
  private isPublishedItem;
669
666
  private resolvePublishedPublicUrl;
670
- private getPublishedPageTab;
671
667
  private readPublishedPageSnapshot;
672
668
  private urlMatchesArticleId;
673
669
  private sleep;
@@ -805,13 +801,11 @@ declare class ToutiaoAdapter extends CodeAdapter {
805
801
  protected uploadImageByUrl(src: string): Promise<ImageUploadResult>;
806
802
  private getCsrfToken;
807
803
  private publishInPage;
808
- private ensureToutiaoTab;
809
804
  private findManagedArticle;
810
805
  private extractList;
811
806
  private parseManagedRow;
812
807
  private itemMatches;
813
808
  private mapManagedStatus;
814
- private ensureToutiaoManageTab;
815
809
  private getVisitedUserId;
816
810
  private buildManagedListUrl;
817
811
  private resolvePostUrl;
@@ -846,7 +840,6 @@ declare class TencentAdapter extends CodeAdapter {
846
840
  private uploadImageFileByUrl;
847
841
  private prepareArticleContent;
848
842
  private callPublishService;
849
- private ensureTencentTab;
850
843
  private buildArticleListUrl;
851
844
  private hasListData;
852
845
  private extractUserInfo;
@@ -15,7 +15,7 @@ import {
15
15
  createLogger,
16
16
  htmlToMarkdown,
17
17
  parseMarkdownImages
18
- } from "../chunk-TKRBESSS.js";
18
+ } from "../chunk-HHDGQYVN.js";
19
19
 
20
20
  // src/adapters/types.ts
21
21
  var DEFAULT_PREPROCESS_CONFIG = {
@@ -208,6 +208,37 @@ var ExtensionRuntime = class {
208
208
  chrome.tabs.onUpdated.addListener(listener);
209
209
  });
210
210
  },
211
+ withManagedTab: async (options, callback) => {
212
+ const patterns = Array.isArray(options.urlPattern) ? options.urlPattern : [options.urlPattern];
213
+ for (const pattern of patterns) {
214
+ const tabs = await this.tabs.query(pattern);
215
+ const existing = tabs.find(
216
+ (tab2) => typeof tab2.id === "number" && (!options.match || options.match(tab2))
217
+ );
218
+ if (existing) {
219
+ return callback({
220
+ id: existing.id,
221
+ url: existing.url,
222
+ owned: false
223
+ });
224
+ }
225
+ }
226
+ const tab = await this.tabs.create(options.createUrl, options.active ?? false);
227
+ const ownedTab = {
228
+ id: tab.id,
229
+ owned: true
230
+ };
231
+ if (options.waitForLoad !== false) {
232
+ await this.tabs.waitForLoad(tab.id, options.loadTimeout ?? 3e4);
233
+ }
234
+ try {
235
+ return await callback(ownedTab);
236
+ } finally {
237
+ if (options.closeWhenDone !== false) {
238
+ await this.tabs.close(tab.id);
239
+ }
240
+ }
241
+ },
211
242
  async executeScript(tabId, func, args) {
212
243
  const results = await chrome.scripting.executeScript({
213
244
  target: { tabId },
@@ -268,4 +299,4 @@ export {
268
299
  ExtensionRuntime,
269
300
  createExtensionRuntime
270
301
  };
271
- //# sourceMappingURL=chunk-CBRXLVZK.js.map
302
+ //# sourceMappingURL=chunk-DTCVBBPG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/chrome-extension.ts"],"sourcesContent":["import type { ManagedTabHandle, ManagedTabOptions, 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 withManagedTab: async <T>(\n options: ManagedTabOptions,\n callback: (tab: ManagedTabHandle) => Promise<T> | T\n ): Promise<T> => {\n const patterns = Array.isArray(options.urlPattern)\n ? options.urlPattern\n : [options.urlPattern]\n\n for (const pattern of patterns) {\n const tabs = await this.tabs.query(pattern)\n const existing = tabs.find(tab =>\n typeof tab.id === 'number'\n && (!options.match || options.match(tab))\n )\n if (existing) {\n return callback({\n id: existing.id,\n url: existing.url,\n owned: false,\n })\n }\n }\n\n const tab = await this.tabs.create(options.createUrl, options.active ?? false)\n const ownedTab: ManagedTabHandle = {\n id: tab.id,\n owned: true,\n }\n\n if (options.waitForLoad !== false) {\n await this.tabs.waitForLoad(tab.id, options.loadTimeout ?? 30000)\n }\n\n try {\n return await callback(ownedTab)\n } finally {\n if (options.closeWhenDone !== false) {\n await this.tabs.close(tab.id)\n }\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":["tab"]}