wespy-ts 0.2.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.
Files changed (86) hide show
  1. package/README.md +146 -0
  2. package/dist/cli/main.d.ts +7 -0
  3. package/dist/cli/main.d.ts.map +1 -0
  4. package/dist/cli/main.js +312 -0
  5. package/dist/cli/main.js.map +1 -0
  6. package/dist/converter/html-to-markdown.d.ts +9 -0
  7. package/dist/converter/html-to-markdown.d.ts.map +1 -0
  8. package/dist/converter/html-to-markdown.js +171 -0
  9. package/dist/converter/html-to-markdown.js.map +1 -0
  10. package/dist/converter/sanitize-html.d.ts +12 -0
  11. package/dist/converter/sanitize-html.d.ts.map +1 -0
  12. package/dist/converter/sanitize-html.js +22 -0
  13. package/dist/converter/sanitize-html.js.map +1 -0
  14. package/dist/core/errors.d.ts +17 -0
  15. package/dist/core/errors.d.ts.map +1 -0
  16. package/dist/core/errors.js +36 -0
  17. package/dist/core/errors.js.map +1 -0
  18. package/dist/core/result.d.ts +26 -0
  19. package/dist/core/result.d.ts.map +1 -0
  20. package/dist/core/result.js +26 -0
  21. package/dist/core/result.js.map +1 -0
  22. package/dist/core/types.d.ts +156 -0
  23. package/dist/core/types.d.ts.map +1 -0
  24. package/dist/core/types.js +29 -0
  25. package/dist/core/types.js.map +1 -0
  26. package/dist/fetcher/http-client.d.ts +31 -0
  27. package/dist/fetcher/http-client.d.ts.map +1 -0
  28. package/dist/fetcher/http-client.js +124 -0
  29. package/dist/fetcher/http-client.js.map +1 -0
  30. package/dist/index.d.ts +14 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +14 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/platforms/detector.d.ts +15 -0
  35. package/dist/platforms/detector.d.ts.map +1 -0
  36. package/dist/platforms/detector.js +30 -0
  37. package/dist/platforms/detector.js.map +1 -0
  38. package/dist/platforms/generic/generic-article.extractor.d.ts +25 -0
  39. package/dist/platforms/generic/generic-article.extractor.d.ts.map +1 -0
  40. package/dist/platforms/generic/generic-article.extractor.js +171 -0
  41. package/dist/platforms/generic/generic-article.extractor.js.map +1 -0
  42. package/dist/platforms/juejin/juejin-article.extractor.d.ts +20 -0
  43. package/dist/platforms/juejin/juejin-article.extractor.d.ts.map +1 -0
  44. package/dist/platforms/juejin/juejin-article.extractor.js +167 -0
  45. package/dist/platforms/juejin/juejin-article.extractor.js.map +1 -0
  46. package/dist/platforms/juejin/juejin.types.d.ts +13 -0
  47. package/dist/platforms/juejin/juejin.types.d.ts.map +1 -0
  48. package/dist/platforms/juejin/juejin.types.js +5 -0
  49. package/dist/platforms/juejin/juejin.types.js.map +1 -0
  50. package/dist/platforms/wechat/wechat-album.extractor.d.ts +25 -0
  51. package/dist/platforms/wechat/wechat-album.extractor.d.ts.map +1 -0
  52. package/dist/platforms/wechat/wechat-album.extractor.js +190 -0
  53. package/dist/platforms/wechat/wechat-album.extractor.js.map +1 -0
  54. package/dist/platforms/wechat/wechat-article.extractor.d.ts +20 -0
  55. package/dist/platforms/wechat/wechat-article.extractor.d.ts.map +1 -0
  56. package/dist/platforms/wechat/wechat-article.extractor.js +132 -0
  57. package/dist/platforms/wechat/wechat-article.extractor.js.map +1 -0
  58. package/dist/platforms/wechat/wechat.types.d.ts +17 -0
  59. package/dist/platforms/wechat/wechat.types.d.ts.map +1 -0
  60. package/dist/platforms/wechat/wechat.types.js +5 -0
  61. package/dist/platforms/wechat/wechat.types.js.map +1 -0
  62. package/dist/sdk/fetch-album-list.d.ts +10 -0
  63. package/dist/sdk/fetch-album-list.d.ts.map +1 -0
  64. package/dist/sdk/fetch-album-list.js +31 -0
  65. package/dist/sdk/fetch-album-list.js.map +1 -0
  66. package/dist/sdk/fetch-album.d.ts +24 -0
  67. package/dist/sdk/fetch-album.d.ts.map +1 -0
  68. package/dist/sdk/fetch-album.js +67 -0
  69. package/dist/sdk/fetch-album.js.map +1 -0
  70. package/dist/sdk/fetch-article.d.ts +24 -0
  71. package/dist/sdk/fetch-article.d.ts.map +1 -0
  72. package/dist/sdk/fetch-article.js +111 -0
  73. package/dist/sdk/fetch-article.js.map +1 -0
  74. package/dist/utils/fs.d.ts +16 -0
  75. package/dist/utils/fs.d.ts.map +1 -0
  76. package/dist/utils/fs.js +26 -0
  77. package/dist/utils/fs.js.map +1 -0
  78. package/dist/utils/text.d.ts +20 -0
  79. package/dist/utils/text.d.ts.map +1 -0
  80. package/dist/utils/text.js +96 -0
  81. package/dist/utils/text.js.map +1 -0
  82. package/dist/utils/url.d.ts +22 -0
  83. package/dist/utils/url.d.ts.map +1 -0
  84. package/dist/utils/url.js +63 -0
  85. package/dist/utils/url.js.map +1 -0
  86. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-to-markdown.js","sourceRoot":"","sources":["../../src/converter/html-to-markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * HTML 清理工具
3
+ * 用于清理掘金等内容中的冗余样式
4
+ */
5
+ /**
6
+ * 清理 HTML 内容:
7
+ * - 移除 <style> 标签
8
+ * - 移除 data-highlight 属性元素
9
+ * - 移除 inline style 属性
10
+ */
11
+ export declare function sanitizeHtml(html: string): string;
12
+ //# sourceMappingURL=sanitize-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-html.d.ts","sourceRoot":"","sources":["../../src/converter/sanitize-html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAajD"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * HTML 清理工具
3
+ * 用于清理掘金等内容中的冗余样式
4
+ */
5
+ import * as cheerio from 'cheerio';
6
+ /**
7
+ * 清理 HTML 内容:
8
+ * - 移除 <style> 标签
9
+ * - 移除 data-highlight 属性元素
10
+ * - 移除 inline style 属性
11
+ */
12
+ export function sanitizeHtml(html) {
13
+ const $ = cheerio.load(html, { xmlMode: false });
14
+ // 移除所有 style 标签
15
+ $('style').remove();
16
+ // 移除 data-highlight 属性元素
17
+ $('[data-highlight]').remove();
18
+ // 移除所有元素的 style 属性
19
+ $('[style]').removeAttr('style');
20
+ return $.html();
21
+ }
22
+ //# sourceMappingURL=sanitize-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-html.js","sourceRoot":"","sources":["../../src/converter/sanitize-html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAElC;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IAEhD,gBAAgB;IAChB,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAA;IAEnB,yBAAyB;IACzB,CAAC,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,CAAA;IAE9B,mBAAmB;IACnB,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAEhC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AACjB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * WeSpy 错误模型
3
+ */
4
+ import type { WeSpyError } from './types.js';
5
+ export declare class WeSpyException extends Error {
6
+ readonly wespyError: WeSpyError;
7
+ constructor(error: WeSpyError);
8
+ }
9
+ export declare function createError(code: WeSpyError['code'], message: string, retryable?: boolean, details?: Record<string, unknown>): WeSpyError;
10
+ export declare function networkError(message: string, details?: Record<string, unknown>): WeSpyError;
11
+ export declare function httpStatusError(statusCode: number, url: string): WeSpyError;
12
+ export declare function timeoutError(url: string, timeoutMs: number): WeSpyError;
13
+ export declare function parseEmptyError(url: string): WeSpyError;
14
+ export declare function unsupportedUrlError(url: string): WeSpyError;
15
+ export declare function invalidInputError(message: string): WeSpyError;
16
+ export declare function fileSystemError(message: string, details?: Record<string, unknown>): WeSpyError;
17
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;gBAEnB,KAAK,EAAE,UAAU;CAK9B;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EACxB,OAAO,EAAE,MAAM,EACf,SAAS,UAAQ,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,UAAU,CAEZ;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAE3F;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAO3E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAEvE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAEvD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAE3D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAE7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAE9F"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * WeSpy 错误模型
3
+ */
4
+ export class WeSpyException extends Error {
5
+ wespyError;
6
+ constructor(error) {
7
+ super(error.message);
8
+ this.name = 'WeSpyException';
9
+ this.wespyError = error;
10
+ }
11
+ }
12
+ export function createError(code, message, retryable = false, details) {
13
+ return { code, message, retryable, details };
14
+ }
15
+ export function networkError(message, details) {
16
+ return createError('NETWORK_ERROR', message, true, details);
17
+ }
18
+ export function httpStatusError(statusCode, url) {
19
+ return createError('HTTP_STATUS_ERROR', `HTTP ${statusCode} for ${url}`, statusCode >= 500 || statusCode === 429, { statusCode, url });
20
+ }
21
+ export function timeoutError(url, timeoutMs) {
22
+ return createError('TIMEOUT', `Request timed out after ${timeoutMs}ms: ${url}`, true, { url, timeoutMs });
23
+ }
24
+ export function parseEmptyError(url) {
25
+ return createError('PARSE_EMPTY', `Failed to extract article content from: ${url}`, false, { url });
26
+ }
27
+ export function unsupportedUrlError(url) {
28
+ return createError('UNSUPPORTED_URL', `Unsupported URL: ${url}`, false, { url });
29
+ }
30
+ export function invalidInputError(message) {
31
+ return createError('INVALID_INPUT', message, false);
32
+ }
33
+ export function fileSystemError(message, details) {
34
+ return createError('FILE_SYSTEM_ERROR', message, false, details);
35
+ }
36
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,UAAU,CAAY;IAE/B,YAAY,KAAiB;QAC3B,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;IACzB,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CACzB,IAAwB,EACxB,OAAe,EACf,SAAS,GAAG,KAAK,EACjB,OAAiC;IAEjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,OAAiC;IAC7E,OAAO,WAAW,CAAC,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,GAAW;IAC7D,OAAO,WAAW,CAChB,mBAAmB,EACnB,QAAQ,UAAU,QAAQ,GAAG,EAAE,EAC/B,UAAU,IAAI,GAAG,IAAI,UAAU,KAAK,GAAG,EACvC,EAAE,UAAU,EAAE,GAAG,EAAE,CACpB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,SAAiB;IACzD,OAAO,WAAW,CAAC,SAAS,EAAE,2BAA2B,SAAS,OAAO,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA;AAC3G,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,WAAW,CAAC,aAAa,EAAE,2CAA2C,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;AACrG,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,WAAW,CAAC,iBAAiB,EAAE,oBAAoB,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,WAAW,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,OAAiC;IAChF,OAAO,WAAW,CAAC,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;AAClE,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Result 类型 —— 避免 throw,用类型安全的方式传递错误
3
+ */
4
+ import type { WeSpyError } from './types.js';
5
+ export type Result<T> = {
6
+ ok: true;
7
+ value: T;
8
+ } | {
9
+ ok: false;
10
+ error: WeSpyError;
11
+ };
12
+ export declare function ok<T>(value: T): Result<T>;
13
+ export declare function err<T>(error: WeSpyError): Result<T>;
14
+ export declare function isOk<T>(result: Result<T>): result is {
15
+ ok: true;
16
+ value: T;
17
+ };
18
+ export declare function isErr<T>(result: Result<T>): result is {
19
+ ok: false;
20
+ error: WeSpyError;
21
+ };
22
+ /** 将 Result 转为值或抛出异常 */
23
+ export declare function unwrap<T>(result: Result<T>): T;
24
+ /** 将 Result 转为值或返回默认值 */
25
+ export declare function unwrapOr<T>(result: Result<T>, defaultValue: T): T;
26
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/core/result.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,MAAM,CAAC,CAAC,IAChB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACtB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAA;AAEpC,wBAAgB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAEzC;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAEnD;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAE3E;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAEtF;AAED,wBAAwB;AACxB,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAG9C;AAED,yBAAyB;AACzB,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAEjE"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Result 类型 —— 避免 throw,用类型安全的方式传递错误
3
+ */
4
+ export function ok(value) {
5
+ return { ok: true, value };
6
+ }
7
+ export function err(error) {
8
+ return { ok: false, error };
9
+ }
10
+ export function isOk(result) {
11
+ return result.ok;
12
+ }
13
+ export function isErr(result) {
14
+ return !result.ok;
15
+ }
16
+ /** 将 Result 转为值或抛出异常 */
17
+ export function unwrap(result) {
18
+ if (result.ok)
19
+ return result.value;
20
+ throw new Error(result.error.message);
21
+ }
22
+ /** 将 Result 转为值或返回默认值 */
23
+ export function unwrapOr(result, defaultValue) {
24
+ return result.ok ? result.value : defaultValue;
25
+ }
26
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/core/result.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,UAAU,EAAE,CAAI,KAAQ;IAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,KAAiB;IACtC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,IAAI,CAAI,MAAiB;IACvC,OAAO,MAAM,CAAC,EAAE,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,KAAK,CAAI,MAAiB;IACxC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAA;AACnB,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,MAAM,CAAI,MAAiB;IACzC,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC,KAAK,CAAA;IAClC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AACvC,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,QAAQ,CAAI,MAAiB,EAAE,YAAe;IAC5D,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAA;AAChD,CAAC"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * WeSpy 核心类型定义
3
+ */
4
+ import { z } from 'zod';
5
+ export type SupportedPlatform = 'wechat' | 'wechat-album' | 'juejin' | 'generic';
6
+ export type OutputFormat = 'json' | 'markdown' | 'html';
7
+ export declare const FetchArticleInputSchema: z.ZodObject<{
8
+ url: z.ZodString;
9
+ outputDir: z.ZodDefault<z.ZodOptional<z.ZodString>>;
10
+ format: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodEnum<["json", "markdown", "html"]>, "many">>>;
11
+ timeoutMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
12
+ userAgent: z.ZodOptional<z.ZodString>;
13
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
14
+ downloadImages: z.ZodOptional<z.ZodBoolean>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ url: string;
17
+ outputDir: string;
18
+ format: ("json" | "markdown" | "html")[];
19
+ timeoutMs: number;
20
+ userAgent?: string | undefined;
21
+ headers?: Record<string, string> | undefined;
22
+ downloadImages?: boolean | undefined;
23
+ }, {
24
+ url: string;
25
+ outputDir?: string | undefined;
26
+ format?: ("json" | "markdown" | "html")[] | undefined;
27
+ timeoutMs?: number | undefined;
28
+ userAgent?: string | undefined;
29
+ headers?: Record<string, string> | undefined;
30
+ downloadImages?: boolean | undefined;
31
+ }>;
32
+ export type FetchArticleInput = z.input<typeof FetchArticleInputSchema>;
33
+ export declare const FetchAlbumInputSchema: z.ZodObject<{
34
+ url: z.ZodString;
35
+ outputDir: z.ZodDefault<z.ZodOptional<z.ZodString>>;
36
+ format: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodEnum<["json", "markdown", "html"]>, "many">>>;
37
+ maxArticles: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
38
+ timeoutMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
39
+ downloadImages: z.ZodOptional<z.ZodBoolean>;
40
+ }, "strip", z.ZodTypeAny, {
41
+ url: string;
42
+ outputDir: string;
43
+ format: ("json" | "markdown" | "html")[];
44
+ timeoutMs: number;
45
+ maxArticles: number;
46
+ downloadImages?: boolean | undefined;
47
+ }, {
48
+ url: string;
49
+ outputDir?: string | undefined;
50
+ format?: ("json" | "markdown" | "html")[] | undefined;
51
+ timeoutMs?: number | undefined;
52
+ downloadImages?: boolean | undefined;
53
+ maxArticles?: number | undefined;
54
+ }>;
55
+ export type FetchAlbumInput = z.input<typeof FetchAlbumInputSchema>;
56
+ export interface ArticleImage {
57
+ originalUrl: string;
58
+ localPath?: string;
59
+ alt?: string;
60
+ width?: number;
61
+ height?: number;
62
+ }
63
+ export interface ArticleDraft {
64
+ platform: SupportedPlatform;
65
+ url: string;
66
+ title: string;
67
+ author?: string;
68
+ publishTime?: string;
69
+ summary?: string;
70
+ /** 完整页面 HTML(与 Python 版 html_content 一致) */
71
+ rawHtml?: string;
72
+ /** 内容区域 HTML */
73
+ contentHtml?: string;
74
+ contentText?: string;
75
+ markdown?: string;
76
+ images?: ArticleImage[];
77
+ metadata: Record<string, unknown>;
78
+ fetchedAt: string;
79
+ warnings: string[];
80
+ }
81
+ export interface OutputArtifact {
82
+ type: 'json' | 'markdown' | 'html' | 'asset';
83
+ path: string;
84
+ }
85
+ export interface FetchArticleSuccess {
86
+ ok: true;
87
+ article: ArticleDraft;
88
+ artifacts: OutputArtifact[];
89
+ warnings: string[];
90
+ }
91
+ export interface FetchArticleAlbumSuccess {
92
+ ok: true;
93
+ articles: ArticleDraft[];
94
+ artifacts: OutputArtifact[];
95
+ warnings: string[];
96
+ summaryFile?: string;
97
+ failedCount?: number;
98
+ }
99
+ export interface FetchArticleFailure {
100
+ ok: false;
101
+ error: WeSpyError;
102
+ }
103
+ export type FetchArticleResult = FetchArticleSuccess | FetchArticleAlbumSuccess | FetchArticleFailure;
104
+ export interface FetchAlbumSuccess {
105
+ ok: true;
106
+ articles: ArticleDraft[];
107
+ artifacts: OutputArtifact[];
108
+ warnings: string[];
109
+ summaryFile?: string;
110
+ failedCount?: number;
111
+ }
112
+ export interface FetchAlbumFailure {
113
+ ok: false;
114
+ error: WeSpyError;
115
+ }
116
+ export type FetchAlbumResult = FetchAlbumSuccess | FetchAlbumFailure;
117
+ export declare const FetchAlbumListInputSchema: z.ZodObject<{
118
+ url: z.ZodString;
119
+ maxArticles: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
120
+ timeoutMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
121
+ }, "strip", z.ZodTypeAny, {
122
+ url: string;
123
+ timeoutMs: number;
124
+ maxArticles: number;
125
+ }, {
126
+ url: string;
127
+ timeoutMs?: number | undefined;
128
+ maxArticles?: number | undefined;
129
+ }>;
130
+ export type FetchAlbumListInput = z.input<typeof FetchAlbumListInputSchema>;
131
+ export interface FetchAlbumListSuccess {
132
+ ok: true;
133
+ articles: AlbumArticleEntry[];
134
+ warnings: string[];
135
+ }
136
+ export interface FetchAlbumListFailure {
137
+ ok: false;
138
+ error: WeSpyError;
139
+ }
140
+ export type FetchAlbumListResult = FetchAlbumListSuccess | FetchAlbumListFailure;
141
+ export interface AlbumArticleEntry {
142
+ title: string;
143
+ url: string;
144
+ msgid: string;
145
+ createTime: string;
146
+ coverImg: string;
147
+ itemidx: string;
148
+ key: string;
149
+ }
150
+ export interface WeSpyError {
151
+ code: 'INVALID_INPUT' | 'UNSUPPORTED_URL' | 'NETWORK_ERROR' | 'HTTP_STATUS_ERROR' | 'PARSE_EMPTY' | 'TIMEOUT' | 'FILE_SYSTEM_ERROR' | 'UNKNOWN_ERROR';
152
+ message: string;
153
+ retryable: boolean;
154
+ details?: Record<string, unknown>;
155
+ }
156
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,cAAc,GACd,QAAQ,GACR,SAAS,CAAA;AAIb,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAA;AAIvD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;EAQlC,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAEvE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;EAOhC,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAInE,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAA;IAC5C,IAAI,EAAE,MAAM,CAAA;CACb;AAID,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,IAAI,CAAA;IACR,OAAO,EAAE,YAAY,CAAA;IACrB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,IAAI,CAAA;IACR,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,MAAM,kBAAkB,GAC1B,mBAAmB,GACnB,wBAAwB,GACxB,mBAAmB,CAAA;AAEvB,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,IAAI,CAAA;IACR,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,iBAAiB,CAAA;AAIrB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAIpC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,IAAI,CAAA;IACR,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,MAAM,oBAAoB,GAC5B,qBAAqB,GACrB,qBAAqB,CAAA;AAIzB,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ;AAID,MAAM,WAAW,UAAU;IACzB,IAAI,EACA,eAAe,GACf,iBAAiB,GACjB,eAAe,GACf,mBAAmB,GACnB,aAAa,GACb,SAAS,GACT,mBAAmB,GACnB,eAAe,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * WeSpy 核心类型定义
3
+ */
4
+ import { z } from 'zod';
5
+ // ─── Input Schemas (zod) ────────────────────────────────────
6
+ export const FetchArticleInputSchema = z.object({
7
+ url: z.string().url('URL 格式无效'),
8
+ outputDir: z.string().optional().default('articles'),
9
+ format: z.array(z.enum(['json', 'markdown', 'html'])).optional().default(['markdown']),
10
+ timeoutMs: z.number().int().positive().optional().default(30000),
11
+ userAgent: z.string().optional(),
12
+ headers: z.record(z.string()).optional(),
13
+ downloadImages: z.boolean().optional(),
14
+ });
15
+ export const FetchAlbumInputSchema = z.object({
16
+ url: z.string().url('URL 格式无效'),
17
+ outputDir: z.string().optional().default('articles'),
18
+ format: z.array(z.enum(['json', 'markdown', 'html'])).optional().default(['markdown']),
19
+ maxArticles: z.number().int().positive().optional().default(10),
20
+ timeoutMs: z.number().int().positive().optional().default(30000),
21
+ downloadImages: z.boolean().optional(),
22
+ });
23
+ // ─── Album List (仅获取列表,不下载文章) ─────────────────
24
+ export const FetchAlbumListInputSchema = z.object({
25
+ url: z.string().url('URL 格式无效'),
26
+ maxArticles: z.number().int().positive().optional().default(10),
27
+ timeoutMs: z.number().int().positive().optional().default(30000),
28
+ });
29
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAcvB,+DAA+D;AAE/D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IACpD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC;IACtF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAA;AAIF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IACpD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC;IACtF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChE,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAA;AAsFF,iDAAiD;AAEjD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACjE,CAAC,CAAA"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * HTTP 客户端封装
3
+ * 基于 Node 内置 fetch(18+),支持 timeout、headers、user-agent、错误分类、编码检测
4
+ */
5
+ import type { Result } from '../core/result.js';
6
+ export interface HttpResponse {
7
+ statusCode: number;
8
+ headers: Record<string, string>;
9
+ body: string;
10
+ }
11
+ export interface HttpClientOptions {
12
+ timeoutMs?: number;
13
+ userAgent?: string;
14
+ headers?: Record<string, string>;
15
+ }
16
+ export declare class HttpClient {
17
+ private readonly timeoutMs;
18
+ private readonly defaultHeaders;
19
+ constructor(options?: HttpClientOptions);
20
+ /**
21
+ * 发起 GET 请求
22
+ */
23
+ get(url: string, extraHeaders?: Record<string, string>): Promise<Result<HttpResponse>>;
24
+ /**
25
+ * 解码响应体,处理编码检测
26
+ * fetch 自动处理 gzip/brotli 解压,
27
+ * 只在 Content-Type 指定了非 UTF-8 charset 时才手动重新解码。
28
+ */
29
+ private decodeBody;
30
+ }
31
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/fetcher/http-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAG/C,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAaD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;gBAE3C,OAAO,GAAE,iBAAsB;IAS3C;;OAEG;IACG,GAAG,CACP,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IA4ChC;;;;OAIG;YACW,UAAU;CAuBzB"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * HTTP 客户端封装
3
+ * 基于 Node 内置 fetch(18+),支持 timeout、headers、user-agent、错误分类、编码检测
4
+ */
5
+ import { networkError, httpStatusError, timeoutError } from '../core/errors.js';
6
+ import { ok, err } from '../core/result.js';
7
+ const DEFAULT_USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36';
8
+ // 不设置 Accept-Encoding,让 fetch 自行管理压缩/解压
9
+ const DEFAULT_HEADERS = {
10
+ Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
11
+ 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
12
+ Connection: 'keep-alive',
13
+ 'Upgrade-Insecure-Requests': '1',
14
+ };
15
+ export class HttpClient {
16
+ timeoutMs;
17
+ defaultHeaders;
18
+ constructor(options = {}) {
19
+ this.timeoutMs = options.timeoutMs ?? 30000;
20
+ this.defaultHeaders = {
21
+ ...DEFAULT_HEADERS,
22
+ 'User-Agent': options.userAgent ?? DEFAULT_USER_AGENT,
23
+ ...options.headers,
24
+ };
25
+ }
26
+ /**
27
+ * 发起 GET 请求
28
+ */
29
+ async get(url, extraHeaders) {
30
+ const headers = { ...this.defaultHeaders, ...extraHeaders };
31
+ const controller = new AbortController();
32
+ const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
33
+ try {
34
+ const response = await fetch(url, {
35
+ method: 'GET',
36
+ headers,
37
+ signal: controller.signal,
38
+ });
39
+ const statusCode = response.status;
40
+ if (statusCode >= 400) {
41
+ return err(httpStatusError(statusCode, url));
42
+ }
43
+ // 将 fetch headers 转为 Record<string, string>
44
+ const responseHeaders = {};
45
+ response.headers.forEach((value, key) => {
46
+ responseHeaders[key.toLowerCase()] = value;
47
+ });
48
+ // 检测编码并解码
49
+ const body = await this.decodeBody(response, responseHeaders);
50
+ return ok({ statusCode, headers: responseHeaders, body });
51
+ }
52
+ catch (e) {
53
+ if (e instanceof Error) {
54
+ if (e.name === 'AbortError' || e.message.includes('abort')) {
55
+ return err(timeoutError(url, this.timeoutMs));
56
+ }
57
+ if (e.name === 'TypeError' && e.message.includes('fetch')) {
58
+ return err(networkError(e.message, { url, cause: e.message }));
59
+ }
60
+ return err(networkError(e.message, { url, cause: e.message }));
61
+ }
62
+ return err(networkError('Unknown network error', { url }));
63
+ }
64
+ finally {
65
+ clearTimeout(timeoutId);
66
+ }
67
+ }
68
+ /**
69
+ * 解码响应体,处理编码检测
70
+ * fetch 自动处理 gzip/brotli 解压,
71
+ * 只在 Content-Type 指定了非 UTF-8 charset 时才手动重新解码。
72
+ */
73
+ async decodeBody(response, headers) {
74
+ // 1. 从 Content-Type header 提取 charset
75
+ const contentType = headers['content-type'] ?? '';
76
+ const charset = extractCharset(contentType);
77
+ const encoding = normalizeEncoding(charset);
78
+ // 2. 如果是 UTF-8 或没有指定 charset,直接用 .text()
79
+ if (!encoding || encoding === 'utf-8') {
80
+ return await response.text();
81
+ }
82
+ // 3. 非 UTF-8 charset:用 arrayBuffer + TextDecoder 手动解码
83
+ try {
84
+ const buffer = await response.arrayBuffer();
85
+ const decoder = new TextDecoder(encoding);
86
+ return decoder.decode(buffer);
87
+ }
88
+ catch {
89
+ return await response.text();
90
+ }
91
+ }
92
+ }
93
+ /**
94
+ * 从 Content-Type header 提取 charset
95
+ * 例如: "text/html; charset=gb2312" → "gb2312"
96
+ * 处理重复 header: "text/html; charset=UTF-8, text/html; charset=UTF-8"
97
+ */
98
+ function extractCharset(contentType) {
99
+ // 取第一个 content-type 值(逗号分隔时)
100
+ const firstPart = contentType.split(',')[0] ?? contentType;
101
+ const match = firstPart.match(/charset=([^\s;]+)/i);
102
+ return match ? match[1].trim().toLowerCase() : null;
103
+ }
104
+ /**
105
+ * 标准化编码名称,映射常见别名
106
+ */
107
+ function normalizeEncoding(charset) {
108
+ if (!charset)
109
+ return null;
110
+ const map = {
111
+ 'gb2312': 'gbk',
112
+ 'gb18030': 'gbk',
113
+ 'gbk': 'gbk',
114
+ 'big5': 'big5',
115
+ 'euc-kr': 'euc-kr',
116
+ 'shift_jis': 'shift_jis',
117
+ 'iso-8859-1': 'windows-1252',
118
+ 'latin1': 'windows-1252',
119
+ 'utf-8': 'utf-8',
120
+ 'utf8': 'utf-8',
121
+ };
122
+ return map[charset] ?? charset;
123
+ }
124
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/fetcher/http-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE/E,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAc3C,MAAM,kBAAkB,GACtB,qHAAqH,CAAA;AAEvH,wCAAwC;AACxC,MAAM,eAAe,GAA2B;IAC9C,MAAM,EAAE,4EAA4E;IACpF,iBAAiB,EAAE,yBAAyB;IAC5C,UAAU,EAAE,YAAY;IACxB,2BAA2B,EAAE,GAAG;CACjC,CAAA;AAED,MAAM,OAAO,UAAU;IACJ,SAAS,CAAQ;IACjB,cAAc,CAAwB;IAEvD,YAAY,UAA6B,EAAE;QACzC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAA;QAC3C,IAAI,CAAC,cAAc,GAAG;YACpB,GAAG,eAAe;YAClB,YAAY,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB;YACrD,GAAG,OAAO,CAAC,OAAO;SACnB,CAAA;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CACP,GAAW,EACX,YAAqC;QAErC,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,YAAY,EAAE,CAAA;QAC3D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAEtE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,KAAK;gBACb,OAAO;gBACP,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAA;YAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAA;YAElC,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;gBACtB,OAAO,GAAG,CAAC,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAA;YAC9C,CAAC;YAED,4CAA4C;YAC5C,MAAM,eAAe,GAA2B,EAAE,CAAA;YAClD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACtC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAA;YAC5C,CAAC,CAAC,CAAA;YAEF,UAAU;YACV,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;YAE7D,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3D,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3D,OAAO,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;gBAC/C,CAAC;gBACD,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1D,OAAO,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;gBAChE,CAAC;gBACD,OAAO,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;YAChE,CAAC;YACD,OAAO,GAAG,CAAC,YAAY,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC5D,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,UAAU,CACtB,QAA6B,EAC7B,OAA+B;QAE/B,sCAAsC;QACtC,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;QACjD,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CAAA;QAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAE3C,yCAAyC;QACzC,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACtC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC9B,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAA;YAC3C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAA;YACzC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC9B,CAAC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,WAAmB;IACzC,6BAA6B;IAC7B,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAA;IAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACnD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACtD,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAsB;IAC/C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,GAAG,GAA2B;QAClC,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,WAAW;QACxB,YAAY,EAAE,cAAc;QAC5B,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,OAAO;KAChB,CAAA;IACD,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAA;AAChC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * WeSpy SDK 入口
3
+ * 提供 fetchArticle / fetchAlbum API 供外部项目 import 使用
4
+ */
5
+ export { fetchArticle } from './sdk/fetch-article.js';
6
+ export { fetchAlbum } from './sdk/fetch-album.js';
7
+ export { fetchAlbumList } from './sdk/fetch-album-list.js';
8
+ export type { SupportedPlatform, OutputFormat, FetchArticleInput, FetchAlbumInput, FetchAlbumListInput, ArticleDraft, ArticleImage, OutputArtifact, FetchArticleResult, FetchArticleSuccess, FetchArticleAlbumSuccess, FetchArticleFailure, FetchAlbumResult, FetchAlbumSuccess, FetchAlbumFailure, FetchAlbumListResult, FetchAlbumListSuccess, FetchAlbumListFailure, AlbumArticleEntry, WeSpyError, } from './core/types.js';
9
+ export { FetchArticleInputSchema, FetchAlbumInputSchema, FetchAlbumListInputSchema, } from './core/types.js';
10
+ export type { Result } from './core/result.js';
11
+ export { ok, err, isOk, isErr, unwrap, unwrapOr } from './core/result.js';
12
+ export { WeSpyException, createError, networkError, httpStatusError, timeoutError, parseEmptyError, unsupportedUrlError, invalidInputError, fileSystemError, } from './core/errors.js';
13
+ export { detectPlatform, isWechatUrl, isJuejinUrl } from './platforms/detector.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAG1D,YAAY,EACV,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,GACX,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAA;AAGxB,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGzE,OAAO,EACL,cAAc,EACd,WAAW,EACX,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,GAChB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * WeSpy SDK 入口
3
+ * 提供 fetchArticle / fetchAlbum API 供外部项目 import 使用
4
+ */
5
+ export { fetchArticle } from './sdk/fetch-article.js';
6
+ export { fetchAlbum } from './sdk/fetch-album.js';
7
+ export { fetchAlbumList } from './sdk/fetch-album-list.js';
8
+ export { FetchArticleInputSchema, FetchAlbumInputSchema, FetchAlbumListInputSchema, } from './core/types.js';
9
+ export { ok, err, isOk, isErr, unwrap, unwrapOr } from './core/result.js';
10
+ // 错误工厂
11
+ export { WeSpyException, createError, networkError, httpStatusError, timeoutError, parseEmptyError, unsupportedUrlError, invalidInputError, fileSystemError, } from './core/errors.js';
12
+ // 平台检测
13
+ export { detectPlatform, isWechatUrl, isJuejinUrl } from './platforms/detector.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AA0B1D,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAA;AAIxB,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEzE,OAAO;AACP,OAAO,EACL,cAAc,EACd,WAAW,EACX,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,GAChB,MAAM,kBAAkB,CAAA;AAEzB,OAAO;AACP,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * URL 平台检测器
3
+ */
4
+ import { detectPlatform } from '../utils/url.js';
5
+ import type { SupportedPlatform } from '../core/types.js';
6
+ export { detectPlatform };
7
+ export declare function isWechatUrl(url: string): boolean;
8
+ export declare function isWechatAlbumUrl(url: string): boolean;
9
+ export declare function isJuejinUrl(url: string): boolean;
10
+ /**
11
+ * 检测 URL 是否有效(可被 URL 解析器解析)
12
+ */
13
+ export declare function isValidUrl(url: string): boolean;
14
+ export declare function getPlatformLabel(platform: SupportedPlatform): string;
15
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/platforms/detector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,OAAO,EAAE,cAAc,EAAE,CAAA;AAEzB,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGhD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAOpE"}