patreon-dl 1.0.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 (223) hide show
  1. package/README.md +422 -0
  2. package/bin/patreon-dl.js +5 -0
  3. package/dist/cli/CLIOptionValidator.d.ts +9 -0
  4. package/dist/cli/CLIOptionValidator.d.ts.map +1 -0
  5. package/dist/cli/CLIOptionValidator.js +85 -0
  6. package/dist/cli/CLIOptionValidator.js.map +1 -0
  7. package/dist/cli/CLIOptions.d.ts +20 -0
  8. package/dist/cli/CLIOptions.d.ts.map +1 -0
  9. package/dist/cli/CLIOptions.js +75 -0
  10. package/dist/cli/CLIOptions.js.map +1 -0
  11. package/dist/cli/CommandLineParser.d.ts +11 -0
  12. package/dist/cli/CommandLineParser.d.ts.map +1 -0
  13. package/dist/cli/CommandLineParser.js +212 -0
  14. package/dist/cli/CommandLineParser.js.map +1 -0
  15. package/dist/cli/ConfigFileParser.d.ts +9 -0
  16. package/dist/cli/ConfigFileParser.d.ts.map +1 -0
  17. package/dist/cli/ConfigFileParser.js +163 -0
  18. package/dist/cli/ConfigFileParser.js.map +1 -0
  19. package/dist/cli/index.d.ts +7 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +162 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/downloaders/Bootstrap.d.ts +29 -0
  24. package/dist/downloaders/Bootstrap.d.ts.map +1 -0
  25. package/dist/downloaders/Bootstrap.js +51 -0
  26. package/dist/downloaders/Bootstrap.js.map +1 -0
  27. package/dist/downloaders/Downloader.d.ts +59 -0
  28. package/dist/downloaders/Downloader.d.ts.map +1 -0
  29. package/dist/downloaders/Downloader.js +357 -0
  30. package/dist/downloaders/Downloader.js.map +1 -0
  31. package/dist/downloaders/DownloaderEvent.d.ts +47 -0
  32. package/dist/downloaders/DownloaderEvent.d.ts.map +1 -0
  33. package/dist/downloaders/DownloaderEvent.js +6 -0
  34. package/dist/downloaders/DownloaderEvent.js.map +1 -0
  35. package/dist/downloaders/DownloaderOptions.d.ts +39 -0
  36. package/dist/downloaders/DownloaderOptions.d.ts.map +1 -0
  37. package/dist/downloaders/DownloaderOptions.js +69 -0
  38. package/dist/downloaders/DownloaderOptions.js.map +1 -0
  39. package/dist/downloaders/PostDownloader.d.ts +8 -0
  40. package/dist/downloaders/PostDownloader.d.ts.map +1 -0
  41. package/dist/downloaders/PostDownloader.js +428 -0
  42. package/dist/downloaders/PostDownloader.js.map +1 -0
  43. package/dist/downloaders/ProductDownloader.d.ts +8 -0
  44. package/dist/downloaders/ProductDownloader.d.ts.map +1 -0
  45. package/dist/downloaders/ProductDownloader.js +171 -0
  46. package/dist/downloaders/ProductDownloader.js.map +1 -0
  47. package/dist/downloaders/cache/StatusCache.d.ts +43 -0
  48. package/dist/downloaders/cache/StatusCache.d.ts.map +1 -0
  49. package/dist/downloaders/cache/StatusCache.js +206 -0
  50. package/dist/downloaders/cache/StatusCache.js.map +1 -0
  51. package/dist/downloaders/index.d.ts +7 -0
  52. package/dist/downloaders/index.d.ts.map +1 -0
  53. package/dist/downloaders/index.js +6 -0
  54. package/dist/downloaders/index.js.map +1 -0
  55. package/dist/downloaders/task/DownloadTask.d.ts +89 -0
  56. package/dist/downloaders/task/DownloadTask.d.ts.map +1 -0
  57. package/dist/downloaders/task/DownloadTask.js +240 -0
  58. package/dist/downloaders/task/DownloadTask.js.map +1 -0
  59. package/dist/downloaders/task/DownloadTaskBatch.d.ts +45 -0
  60. package/dist/downloaders/task/DownloadTaskBatch.d.ts.map +1 -0
  61. package/dist/downloaders/task/DownloadTaskBatch.js +195 -0
  62. package/dist/downloaders/task/DownloadTaskBatch.js.map +1 -0
  63. package/dist/downloaders/task/DownloadTaskBatchEvent.d.ts +32 -0
  64. package/dist/downloaders/task/DownloadTaskBatchEvent.d.ts.map +1 -0
  65. package/dist/downloaders/task/DownloadTaskBatchEvent.js +2 -0
  66. package/dist/downloaders/task/DownloadTaskBatchEvent.js.map +1 -0
  67. package/dist/downloaders/task/DownloadTaskFactory.d.ts +20 -0
  68. package/dist/downloaders/task/DownloadTaskFactory.d.ts.map +1 -0
  69. package/dist/downloaders/task/DownloadTaskFactory.js +177 -0
  70. package/dist/downloaders/task/DownloadTaskFactory.js.map +1 -0
  71. package/dist/downloaders/task/FFmpegDownloadTask.d.ts +27 -0
  72. package/dist/downloaders/task/FFmpegDownloadTask.d.ts.map +1 -0
  73. package/dist/downloaders/task/FFmpegDownloadTask.js +206 -0
  74. package/dist/downloaders/task/FFmpegDownloadTask.js.map +1 -0
  75. package/dist/downloaders/task/FetcherDownloadTask.d.ts +21 -0
  76. package/dist/downloaders/task/FetcherDownloadTask.d.ts.map +1 -0
  77. package/dist/downloaders/task/FetcherDownloadTask.js +213 -0
  78. package/dist/downloaders/task/FetcherDownloadTask.js.map +1 -0
  79. package/dist/downloaders/task/index.d.ts +4 -0
  80. package/dist/downloaders/task/index.d.ts.map +1 -0
  81. package/dist/downloaders/task/index.js +3 -0
  82. package/dist/downloaders/task/index.js.map +1 -0
  83. package/dist/downloaders/templates/CampaignInfo.d.ts +3 -0
  84. package/dist/downloaders/templates/CampaignInfo.d.ts.map +1 -0
  85. package/dist/downloaders/templates/CampaignInfo.js +58 -0
  86. package/dist/downloaders/templates/CampaignInfo.js.map +1 -0
  87. package/dist/downloaders/templates/PostInfo.d.ts +4 -0
  88. package/dist/downloaders/templates/PostInfo.d.ts.map +1 -0
  89. package/dist/downloaders/templates/PostInfo.js +45 -0
  90. package/dist/downloaders/templates/PostInfo.js.map +1 -0
  91. package/dist/downloaders/templates/ProductInfo.d.ts +3 -0
  92. package/dist/downloaders/templates/ProductInfo.d.ts.map +1 -0
  93. package/dist/downloaders/templates/ProductInfo.js +20 -0
  94. package/dist/downloaders/templates/ProductInfo.js.map +1 -0
  95. package/dist/entities/Attachment.d.ts +7 -0
  96. package/dist/entities/Attachment.d.ts.map +1 -0
  97. package/dist/entities/Attachment.js +2 -0
  98. package/dist/entities/Attachment.js.map +1 -0
  99. package/dist/entities/Campaign.d.ts +19 -0
  100. package/dist/entities/Campaign.d.ts.map +1 -0
  101. package/dist/entities/Campaign.js +2 -0
  102. package/dist/entities/Campaign.js.map +1 -0
  103. package/dist/entities/Downloadable.d.ts +6 -0
  104. package/dist/entities/Downloadable.d.ts.map +1 -0
  105. package/dist/entities/Downloadable.js +5 -0
  106. package/dist/entities/Downloadable.js.map +1 -0
  107. package/dist/entities/MediaItem.d.ts +95 -0
  108. package/dist/entities/MediaItem.d.ts.map +1 -0
  109. package/dist/entities/MediaItem.js +2 -0
  110. package/dist/entities/MediaItem.js.map +1 -0
  111. package/dist/entities/Post.d.ts +87 -0
  112. package/dist/entities/Post.d.ts.map +1 -0
  113. package/dist/entities/Post.js +2 -0
  114. package/dist/entities/Post.js.map +1 -0
  115. package/dist/entities/Product.d.ts +17 -0
  116. package/dist/entities/Product.d.ts.map +1 -0
  117. package/dist/entities/Product.js +2 -0
  118. package/dist/entities/Product.js.map +1 -0
  119. package/dist/entities/Reward.d.ts +14 -0
  120. package/dist/entities/Reward.d.ts.map +1 -0
  121. package/dist/entities/Reward.js +2 -0
  122. package/dist/entities/Reward.js.map +1 -0
  123. package/dist/entities/User.d.ts +15 -0
  124. package/dist/entities/User.d.ts.map +1 -0
  125. package/dist/entities/User.js +2 -0
  126. package/dist/entities/User.js.map +1 -0
  127. package/dist/entities/index.d.ts +9 -0
  128. package/dist/entities/index.d.ts.map +1 -0
  129. package/dist/entities/index.js +6 -0
  130. package/dist/entities/index.js.map +1 -0
  131. package/dist/index.d.ts +8 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +8 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/parsers/PageParser.d.ts +6 -0
  136. package/dist/parsers/PageParser.d.ts.map +1 -0
  137. package/dist/parsers/PageParser.js +23 -0
  138. package/dist/parsers/PageParser.js.map +1 -0
  139. package/dist/parsers/Parser.d.ts +43 -0
  140. package/dist/parsers/Parser.d.ts.map +1 -0
  141. package/dist/parsers/Parser.js +439 -0
  142. package/dist/parsers/Parser.js.map +1 -0
  143. package/dist/parsers/PostParser.d.ts +7 -0
  144. package/dist/parsers/PostParser.d.ts.map +1 -0
  145. package/dist/parsers/PostParser.js +259 -0
  146. package/dist/parsers/PostParser.js.map +1 -0
  147. package/dist/parsers/ProductParser.d.ts +7 -0
  148. package/dist/parsers/ProductParser.d.ts.map +1 -0
  149. package/dist/parsers/ProductParser.js +70 -0
  150. package/dist/parsers/ProductParser.js.map +1 -0
  151. package/dist/utils/AttachmentFilenameResolver.d.ts +9 -0
  152. package/dist/utils/AttachmentFilenameResolver.d.ts.map +1 -0
  153. package/dist/utils/AttachmentFilenameResolver.js +73 -0
  154. package/dist/utils/AttachmentFilenameResolver.js.map +1 -0
  155. package/dist/utils/FSHelper.d.ts +57 -0
  156. package/dist/utils/FSHelper.d.ts.map +1 -0
  157. package/dist/utils/FSHelper.js +214 -0
  158. package/dist/utils/FSHelper.js.map +1 -0
  159. package/dist/utils/Fetcher.d.ts +45 -0
  160. package/dist/utils/Fetcher.d.ts.map +1 -0
  161. package/dist/utils/Fetcher.js +192 -0
  162. package/dist/utils/Fetcher.js.map +1 -0
  163. package/dist/utils/FetcherProgressMonitor.d.ts +18 -0
  164. package/dist/utils/FetcherProgressMonitor.d.ts.map +1 -0
  165. package/dist/utils/FetcherProgressMonitor.js +56 -0
  166. package/dist/utils/FetcherProgressMonitor.js.map +1 -0
  167. package/dist/utils/FilenameFormatHelper.d.ts +44 -0
  168. package/dist/utils/FilenameFormatHelper.d.ts.map +1 -0
  169. package/dist/utils/FilenameFormatHelper.js +98 -0
  170. package/dist/utils/FilenameFormatHelper.js.map +1 -0
  171. package/dist/utils/FllenameResolver.d.ts +20 -0
  172. package/dist/utils/FllenameResolver.d.ts.map +1 -0
  173. package/dist/utils/FllenameResolver.js +55 -0
  174. package/dist/utils/FllenameResolver.js.map +1 -0
  175. package/dist/utils/Formatter.d.ts +21 -0
  176. package/dist/utils/Formatter.d.ts.map +1 -0
  177. package/dist/utils/Formatter.js +112 -0
  178. package/dist/utils/Formatter.js.map +1 -0
  179. package/dist/utils/MediaFilenameResolver.d.ts +9 -0
  180. package/dist/utils/MediaFilenameResolver.d.ts.map +1 -0
  181. package/dist/utils/MediaFilenameResolver.js +90 -0
  182. package/dist/utils/MediaFilenameResolver.js.map +1 -0
  183. package/dist/utils/Misc.d.ts +14 -0
  184. package/dist/utils/Misc.d.ts.map +1 -0
  185. package/dist/utils/Misc.js +4 -0
  186. package/dist/utils/Misc.js.map +1 -0
  187. package/dist/utils/ObjectHelper.d.ts +4 -0
  188. package/dist/utils/ObjectHelper.d.ts.map +1 -0
  189. package/dist/utils/ObjectHelper.js +30 -0
  190. package/dist/utils/ObjectHelper.js.map +1 -0
  191. package/dist/utils/PackageInfo.d.ts +10 -0
  192. package/dist/utils/PackageInfo.d.ts.map +1 -0
  193. package/dist/utils/PackageInfo.js +33 -0
  194. package/dist/utils/PackageInfo.js.map +1 -0
  195. package/dist/utils/URLHelper.d.ts +40 -0
  196. package/dist/utils/URLHelper.d.ts.map +1 -0
  197. package/dist/utils/URLHelper.js +192 -0
  198. package/dist/utils/URLHelper.js.map +1 -0
  199. package/dist/utils/index.d.ts +2 -0
  200. package/dist/utils/index.d.ts.map +1 -0
  201. package/dist/utils/index.js +2 -0
  202. package/dist/utils/index.js.map +1 -0
  203. package/dist/utils/logging/ChainLogger.d.ts +11 -0
  204. package/dist/utils/logging/ChainLogger.d.ts.map +1 -0
  205. package/dist/utils/logging/ChainLogger.js +50 -0
  206. package/dist/utils/logging/ChainLogger.js.map +1 -0
  207. package/dist/utils/logging/ConsoleLogger.d.ts +31 -0
  208. package/dist/utils/logging/ConsoleLogger.d.ts.map +1 -0
  209. package/dist/utils/logging/ConsoleLogger.js +126 -0
  210. package/dist/utils/logging/ConsoleLogger.js.map +1 -0
  211. package/dist/utils/logging/FileLogger.d.ts +26 -0
  212. package/dist/utils/logging/FileLogger.d.ts.map +1 -0
  213. package/dist/utils/logging/FileLogger.js +147 -0
  214. package/dist/utils/logging/FileLogger.js.map +1 -0
  215. package/dist/utils/logging/Logger.d.ts +12 -0
  216. package/dist/utils/logging/Logger.d.ts.map +1 -0
  217. package/dist/utils/logging/Logger.js +15 -0
  218. package/dist/utils/logging/Logger.js.map +1 -0
  219. package/dist/utils/logging/index.d.ts +7 -0
  220. package/dist/utils/logging/index.d.ts.map +1 -0
  221. package/dist/utils/logging/index.js +7 -0
  222. package/dist/utils/logging/index.js.map +1 -0
  223. package/package.json +78 -0
@@ -0,0 +1,33 @@
1
+ import fs from 'fs';
2
+ import ObjectHelper from './ObjectHelper.js';
3
+ let info = null;
4
+ export function getPackageInfo() {
5
+ if (info === null) {
6
+ try {
7
+ const packageURL = new URL('../../package.json', import.meta.url);
8
+ const json = JSON.parse(fs.readFileSync(packageURL).toString());
9
+ info = {
10
+ name: json.name || '',
11
+ version: json.version || '',
12
+ description: json.description || '',
13
+ author: json.author || '',
14
+ repository: ObjectHelper.getProperty(json, 'repository.url') || '',
15
+ banner: json.name && json.version && json.description ?
16
+ `${json.name} v${json.version} ${json.description}` : ''
17
+ };
18
+ }
19
+ catch (error) {
20
+ console.error('Failed to read package.json:', error instanceof Error ? error.message : error);
21
+ info = {
22
+ name: '',
23
+ version: '',
24
+ description: '',
25
+ author: '',
26
+ repository: '',
27
+ banner: ''
28
+ };
29
+ }
30
+ }
31
+ return info;
32
+ }
33
+ //# sourceMappingURL=PackageInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageInfo.js","sourceRoot":"","sources":["../../src/utils/PackageInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAW7C,IAAI,IAAI,GAAuB,IAAI,CAAC;AAEpC,MAAM,UAAU,cAAc;IAC5B,IAAI,IAAI,KAAK,IAAI,EAAE;QACjB,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChE,IAAI,GAAG;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC3B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;gBACnC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;gBACzB,UAAU,EAAE,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE;gBAClE,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;oBACrD,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;aAC3D,CAAC;SACH;QACD,OAAO,KAAK,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9F,IAAI,GAAG;gBACL,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,EAAE;gBACf,MAAM,EAAE,EAAE;gBACV,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE,EAAE;aACX,CAAC;SACH;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import fs from 'fs';\nimport ObjectHelper from './ObjectHelper.js';\n\nexport interface PackageInfo {\n name: string;\n version: string;\n description: string;\n author: string;\n repository: string;\n banner: string;\n}\n\nlet info: PackageInfo | null = null;\n\nexport function getPackageInfo() {\n if (info === null) {\n try {\n const packageURL = new URL('../../package.json', import.meta.url);\n const json = JSON.parse(fs.readFileSync(packageURL).toString());\n info = {\n name: json.name || '',\n version: json.version || '',\n description: json.description || '',\n author: json.author || '',\n repository: ObjectHelper.getProperty(json, 'repository.url') || '',\n banner: json.name && json.version && json.description ?\n `${json.name} v${json.version} ${json.description}` : ''\n };\n }\n catch (error) {\n console.error('Failed to read package.json:', error instanceof Error ? error.message : error);\n info = {\n name: '',\n version: '',\n description: '',\n author: '',\n repository: '',\n banner: ''\n };\n }\n }\n return info;\n}\n"]}
@@ -0,0 +1,40 @@
1
+ export declare enum PostSortOrder {
2
+ PublisedAtDesc = "-published_at",
3
+ PublishedAtAsc = "published_at",
4
+ CollectionOrder = "collection_order"
5
+ }
6
+ export type URLAnalysis = {
7
+ type: 'product';
8
+ productId: string;
9
+ slug: string;
10
+ } | {
11
+ type: 'postsByUser';
12
+ vanity: string;
13
+ filters?: Record<string, any>;
14
+ } | {
15
+ type: 'postsByCollection';
16
+ collectionId: string;
17
+ filters?: Record<string, any>;
18
+ } | {
19
+ type: 'post';
20
+ postId: string;
21
+ slug: string;
22
+ };
23
+ export default class URLHelper {
24
+ static constructProductAPIURL(productId: string): string;
25
+ static constructCampaignPageURL(vanity: string): string;
26
+ static constructCollectionURL(collectionId: string): string;
27
+ static constructUserAPIURL(userId: string): string;
28
+ static constructCampaignAPIURL(campaignId: string): string;
29
+ static constructPostsAPIURL(params: {
30
+ postId?: string;
31
+ campaignId?: string;
32
+ currentUserId?: string;
33
+ filters?: Record<string, any>;
34
+ sort?: PostSortOrder;
35
+ }): string;
36
+ static analyzeURL(url: string): URLAnalysis | null;
37
+ static stripSearchParamsFromURL(url: string): string;
38
+ static getExtensionFromURL(url: string): string;
39
+ }
40
+ //# sourceMappingURL=URLHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"URLHelper.d.ts","sourceRoot":"","sources":["../../src/utils/URLHelper.ts"],"names":[],"mappings":"AA0DA,oBAAY,aAAa;IACvB,cAAc,kBAAkB;IAChC,cAAc,iBAAiB;IAC/B,eAAe,qBAAqB;CACrC;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG;IACF,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B,GAAG;IACF,IAAI,EAAE,mBAAmB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B,GAAG;IACF,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,SAAS;IAE5B,MAAM,CAAC,sBAAsB,CAAC,SAAS,EAAE,MAAM;IAU/C,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM;IAI9C,MAAM,CAAC,sBAAsB,CAAC,YAAY,EAAE,MAAM;IAIlD,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM;IAIzC,MAAM,CAAC,uBAAuB,CAAC,UAAU,EAAE,MAAM;IAIjD,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE;QAClC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,aAAa,CAAC;KACtB;IAkCD,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IA4ElD,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASpD,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM;CAIvC"}
@@ -0,0 +1,192 @@
1
+ import path from 'path';
2
+ import { URL } from 'url';
3
+ const SITE_URL = 'https://www.patreon.com';
4
+ const COLLECTION_URL = `${SITE_URL}/collection`;
5
+ const PRODUCT_API_URL = `${SITE_URL}/api/product`;
6
+ const POSTS_API_URL = `${SITE_URL}/api/posts`;
7
+ const USER_API_URL = `${SITE_URL}/api/user`;
8
+ const CAMPAIGN_API_URL = `${SITE_URL}/api/campaigns`;
9
+ const PRODUCT_URL_REGEX = /https:\/\/www\.patreon\.com\/([^/]+?)\/shop\/(([^/]+)-(\d+))$/g;
10
+ const POSTS_BY_USER_URL_REGEX = /https:\/\/www\.patreon\.com\/([^/]+?)\/posts$/g;
11
+ const COLLECTION_URL_REGEX = /https:\/\/www\.patreon\.com\/collection\/(\d+)$/g;
12
+ const POST_URL_REGEX = /https:\/\/www\.patreon\.com\/posts\/(([^/]+)-(\d+))$/g;
13
+ const PRODUCT_API_URL_SEARCH_PARAMS = {
14
+ PRODUCT_VARIANT: [
15
+ 'name',
16
+ 'id',
17
+ 'price_cents',
18
+ 'description',
19
+ 'is_hidden',
20
+ 'published_at_datetime',
21
+ 'url',
22
+ 'share_url',
23
+ 'access_metadata',
24
+ 'reward_ids',
25
+ 'moderation_status'
26
+ ],
27
+ INCLUDE: [
28
+ 'content_media',
29
+ 'preview_media',
30
+ 'content_media.custom_thumbnail_media',
31
+ 'campaign',
32
+ 'content_media.teaser_media'
33
+ ]
34
+ };
35
+ const POSTS_API_URL_SEARCH_PARAMS = {
36
+ INCLUDE: [
37
+ 'campaign',
38
+ 'access_rules',
39
+ 'attachments',
40
+ 'audio',
41
+ 'audio_preview.null',
42
+ 'images',
43
+ 'media',
44
+ 'native_video_insights',
45
+ 'poll.choices',
46
+ 'poll.current_user_responses.user',
47
+ 'poll.current_user_responses.choice',
48
+ 'poll.current_user_responses.poll',
49
+ 'user',
50
+ 'user_defined_tags',
51
+ 'ti_checks'
52
+ ]
53
+ };
54
+ export var PostSortOrder;
55
+ (function (PostSortOrder) {
56
+ PostSortOrder["PublisedAtDesc"] = "-published_at";
57
+ PostSortOrder["PublishedAtAsc"] = "published_at";
58
+ PostSortOrder["CollectionOrder"] = "collection_order";
59
+ })(PostSortOrder || (PostSortOrder = {}));
60
+ export default class URLHelper {
61
+ static constructProductAPIURL(productId) {
62
+ const url = `${PRODUCT_API_URL}/${productId}`;
63
+ const urlObj = new URL(url);
64
+ urlObj.searchParams.set('fields[product-variant]', PRODUCT_API_URL_SEARCH_PARAMS.PRODUCT_VARIANT.join(','));
65
+ urlObj.searchParams.set('include', PRODUCT_API_URL_SEARCH_PARAMS.INCLUDE.join(','));
66
+ urlObj.searchParams.set('json-api-version', '1.0');
67
+ return urlObj.toString();
68
+ }
69
+ static constructCampaignPageURL(vanity) {
70
+ return `${SITE_URL}/${vanity}`;
71
+ }
72
+ static constructCollectionURL(collectionId) {
73
+ return `${COLLECTION_URL}/${collectionId}`;
74
+ }
75
+ static constructUserAPIURL(userId) {
76
+ return `${USER_API_URL}/${userId}`;
77
+ }
78
+ static constructCampaignAPIURL(campaignId) {
79
+ return `${CAMPAIGN_API_URL}/${campaignId}`;
80
+ }
81
+ static constructPostsAPIURL(params) {
82
+ if (!params.postId && !params.campaignId) {
83
+ throw Error('Posts API URL requires at least \'postId\' or \'campaignId\'');
84
+ }
85
+ const urlObj = params.postId ? new URL(`${POSTS_API_URL}/${params.postId}`) : new URL(POSTS_API_URL);
86
+ const defaultFilters = {
87
+ 'contains_exclusive_posts': true,
88
+ 'is_draft': false
89
+ };
90
+ if (params.campaignId) {
91
+ defaultFilters['campaign_id'] = params.campaignId;
92
+ }
93
+ if (params.currentUserId) {
94
+ defaultFilters['accessible_by_user_id'] = params.currentUserId;
95
+ }
96
+ const allFilters = {
97
+ ...defaultFilters,
98
+ ...params.filters || {}
99
+ };
100
+ const searchParams = {
101
+ 'include': POSTS_API_URL_SEARCH_PARAMS.INCLUDE.join(','),
102
+ 'sort': params.sort || PostSortOrder.PublisedAtDesc,
103
+ 'json-api-version': '1.0'
104
+ };
105
+ for (const [key, value] of Object.entries(allFilters)) {
106
+ searchParams[`filter[${key}]`] = value;
107
+ }
108
+ for (const [key, value] of Object.entries(searchParams)) {
109
+ urlObj.searchParams.set(key, value);
110
+ }
111
+ return urlObj.toString();
112
+ }
113
+ static analyzeURL(url) {
114
+ const base = this.stripSearchParamsFromURL(url);
115
+ const searchParams = new URL(url).searchParams;
116
+ const __getFiltersFromSearchParams = (searchParams) => {
117
+ const filters = {};
118
+ const filterRegex = /filters\[(.+?)\]/g;
119
+ for (const [key, value] of searchParams) {
120
+ const match = filterRegex.exec(key);
121
+ if (match && match[1]) {
122
+ filters[match[1]] = value;
123
+ }
124
+ filterRegex.lastIndex = 0;
125
+ }
126
+ return filters;
127
+ };
128
+ const productURLMatch = PRODUCT_URL_REGEX.exec(base);
129
+ if (productURLMatch?.length === 5) {
130
+ const productId = productURLMatch[4];
131
+ const slug = productURLMatch[2];
132
+ return {
133
+ type: 'product',
134
+ productId,
135
+ slug
136
+ };
137
+ }
138
+ const postsURLMatch = POSTS_BY_USER_URL_REGEX.exec(base);
139
+ if (postsURLMatch && postsURLMatch[1]) {
140
+ const vanity = postsURLMatch[1];
141
+ const filters = __getFiltersFromSearchParams(searchParams);
142
+ const result = {
143
+ type: 'postsByUser',
144
+ vanity
145
+ };
146
+ if (Object.keys(filters).length > 0) {
147
+ result.filters = filters;
148
+ }
149
+ return result;
150
+ }
151
+ const collectionURLMatch = COLLECTION_URL_REGEX.exec(base);
152
+ if (collectionURLMatch && collectionURLMatch[1]) {
153
+ const collectionId = collectionURLMatch[1];
154
+ const filters = __getFiltersFromSearchParams(searchParams);
155
+ if (!filters['collection_id']) {
156
+ filters['collection_id'] = collectionId;
157
+ }
158
+ const result = {
159
+ type: 'postsByCollection',
160
+ collectionId
161
+ };
162
+ if (Object.keys(filters).length > 0) {
163
+ result.filters = filters;
164
+ }
165
+ return result;
166
+ }
167
+ const postURLMatch = POST_URL_REGEX.exec(base);
168
+ if (postURLMatch?.length === 4) {
169
+ const postId = postURLMatch[3];
170
+ const slug = postURLMatch[1];
171
+ return {
172
+ type: 'post',
173
+ postId,
174
+ slug
175
+ };
176
+ }
177
+ return null;
178
+ }
179
+ static stripSearchParamsFromURL(url) {
180
+ const urlObj = new URL(url);
181
+ let stripped = `${urlObj.origin}${urlObj.pathname}`;
182
+ while (stripped.endsWith('/')) {
183
+ stripped = stripped.substring(0, stripped.length - 1);
184
+ }
185
+ return stripped;
186
+ }
187
+ static getExtensionFromURL(url) {
188
+ const urlObj = new URL(url);
189
+ return path.extname(urlObj.pathname.split('/').pop() || '');
190
+ }
191
+ }
192
+ //# sourceMappingURL=URLHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"URLHelper.js","sourceRoot":"","sources":["../../src/utils/URLHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport { URL } from 'url';\n\nconst SITE_URL = 'https://www.patreon.com';\nconst COLLECTION_URL = `${SITE_URL}/collection`;\nconst PRODUCT_API_URL = `${SITE_URL}/api/product`;\nconst POSTS_API_URL = `${SITE_URL}/api/posts`;\nconst USER_API_URL = `${SITE_URL}/api/user`;\nconst CAMPAIGN_API_URL = `${SITE_URL}/api/campaigns`;\n\nconst PRODUCT_URL_REGEX = /https:\\/\\/www\\.patreon\\.com\\/([^/]+?)\\/shop\\/(([^/]+)-(\\d+))$/g;\nconst POSTS_BY_USER_URL_REGEX = /https:\\/\\/www\\.patreon\\.com\\/([^/]+?)\\/posts$/g;\nconst COLLECTION_URL_REGEX = /https:\\/\\/www\\.patreon\\.com\\/collection\\/(\\d+)$/g;\nconst POST_URL_REGEX = /https:\\/\\/www\\.patreon\\.com\\/posts\\/(([^/]+)-(\\d+))$/g;\n\nconst PRODUCT_API_URL_SEARCH_PARAMS = {\n PRODUCT_VARIANT: [\n 'name',\n 'id',\n 'price_cents',\n 'description',\n 'is_hidden',\n 'published_at_datetime',\n 'url',\n 'share_url',\n 'access_metadata',\n 'reward_ids',\n 'moderation_status'\n ],\n INCLUDE: [\n 'content_media',\n 'preview_media',\n 'content_media.custom_thumbnail_media',\n 'campaign',\n 'content_media.teaser_media'\n ]\n};\n\nconst POSTS_API_URL_SEARCH_PARAMS = {\n INCLUDE: [\n 'campaign',\n 'access_rules',\n 'attachments',\n 'audio',\n 'audio_preview.null',\n 'images',\n 'media',\n 'native_video_insights',\n 'poll.choices',\n 'poll.current_user_responses.user',\n 'poll.current_user_responses.choice',\n 'poll.current_user_responses.poll',\n 'user',\n 'user_defined_tags',\n 'ti_checks'\n ]\n};\n\nexport enum PostSortOrder {\n PublisedAtDesc = '-published_at',\n PublishedAtAsc = 'published_at',\n CollectionOrder = 'collection_order'\n}\n\nexport type URLAnalysis = {\n type: 'product';\n productId: string;\n slug: string;\n} | {\n type: 'postsByUser';\n vanity: string;\n filters?: Record<string, any>;\n} | {\n type: 'postsByCollection';\n collectionId: string;\n filters?: Record<string, any>;\n} | {\n type: 'post';\n postId: string;\n slug: string;\n}\n\nexport default class URLHelper {\n\n static constructProductAPIURL(productId: string) {\n const url = `${PRODUCT_API_URL}/${productId}`;\n const urlObj = new URL(url);\n urlObj.searchParams.set('fields[product-variant]', PRODUCT_API_URL_SEARCH_PARAMS.PRODUCT_VARIANT.join(','));\n urlObj.searchParams.set('include', PRODUCT_API_URL_SEARCH_PARAMS.INCLUDE.join(','));\n urlObj.searchParams.set('json-api-version', '1.0');\n\n return urlObj.toString();\n }\n\n static constructCampaignPageURL(vanity: string) {\n return `${SITE_URL}/${vanity}`;\n }\n\n static constructCollectionURL(collectionId: string) {\n return `${COLLECTION_URL}/${collectionId}`;\n }\n\n static constructUserAPIURL(userId: string) {\n return `${USER_API_URL}/${userId}`;\n }\n\n static constructCampaignAPIURL(campaignId: string) {\n return `${CAMPAIGN_API_URL}/${campaignId}`;\n }\n\n static constructPostsAPIURL(params: {\n postId?: string;\n campaignId?: string;\n currentUserId?: string;\n filters?: Record<string, any>;\n sort?: PostSortOrder;\n }) {\n if (!params.postId && !params.campaignId) {\n throw Error('Posts API URL requires at least \\'postId\\' or \\'campaignId\\'');\n }\n const urlObj = params.postId ? new URL(`${POSTS_API_URL}/${params.postId}`) : new URL(POSTS_API_URL);\n const defaultFilters: Record<string, any> = {\n 'contains_exclusive_posts': true,\n 'is_draft': false\n };\n if (params.campaignId) {\n defaultFilters['campaign_id'] = params.campaignId;\n }\n if (params.currentUserId) {\n defaultFilters['accessible_by_user_id'] = params.currentUserId;\n }\n const allFilters = {\n ...defaultFilters,\n ...params.filters || {}\n };\n const searchParams: Record<string, any> = {\n 'include': POSTS_API_URL_SEARCH_PARAMS.INCLUDE.join(','),\n 'sort': params.sort || PostSortOrder.PublisedAtDesc,\n 'json-api-version': '1.0'\n };\n for (const [ key, value ] of Object.entries(allFilters)) {\n searchParams[`filter[${key}]`] = value;\n }\n for (const [ key, value ] of Object.entries(searchParams)) {\n urlObj.searchParams.set(key, value);\n }\n\n return urlObj.toString();\n }\n\n static analyzeURL(url: string): URLAnalysis | null {\n\n const base = this.stripSearchParamsFromURL(url);\n const searchParams = new URL(url).searchParams;\n\n const __getFiltersFromSearchParams = (searchParams: URLSearchParams) => {\n const filters: Record<string, any> = {};\n const filterRegex = /filters\\[(.+?)\\]/g;\n for (const [ key, value ] of searchParams) {\n const match = filterRegex.exec(key);\n if (match && match[1]) {\n filters[match[1]] = value;\n }\n filterRegex.lastIndex = 0;\n }\n return filters;\n };\n\n const productURLMatch = PRODUCT_URL_REGEX.exec(base);\n if (productURLMatch?.length === 5) {\n const productId = productURLMatch[4];\n const slug = productURLMatch[2];\n return {\n type: 'product',\n productId,\n slug\n };\n }\n\n const postsURLMatch = POSTS_BY_USER_URL_REGEX.exec(base);\n if (postsURLMatch && postsURLMatch[1]) {\n const vanity = postsURLMatch[1];\n const filters = __getFiltersFromSearchParams(searchParams);\n const result: URLAnalysis & { type: 'postsByUser' } = {\n type: 'postsByUser',\n vanity\n };\n if (Object.keys(filters).length > 0) {\n result.filters = filters;\n }\n\n return result;\n }\n\n const collectionURLMatch = COLLECTION_URL_REGEX.exec(base);\n if (collectionURLMatch && collectionURLMatch[1]) {\n const collectionId = collectionURLMatch[1];\n const filters = __getFiltersFromSearchParams(searchParams);\n if (!filters['collection_id']) {\n filters['collection_id'] = collectionId;\n }\n const result: URLAnalysis & { type: 'postsByCollection' } = {\n type: 'postsByCollection',\n collectionId\n };\n if (Object.keys(filters).length > 0) {\n result.filters = filters;\n }\n\n return result;\n }\n\n const postURLMatch = POST_URL_REGEX.exec(base);\n if (postURLMatch?.length === 4) {\n const postId = postURLMatch[3];\n const slug = postURLMatch[1];\n return {\n type: 'post',\n postId,\n slug\n };\n }\n\n return null;\n }\n\n static stripSearchParamsFromURL(url: string): string {\n const urlObj = new URL(url);\n let stripped = `${urlObj.origin}${urlObj.pathname}`;\n while (stripped.endsWith('/')) {\n stripped = stripped.substring(0, stripped.length - 1);\n }\n return stripped;\n }\n\n static getExtensionFromURL(url: string) {\n const urlObj = new URL(url);\n return path.extname(urlObj.pathname.split('/').pop() || '');\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export { DeepRequired } from './Misc.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"","sourcesContent":["export { DeepRequired } from './Misc.js';\n"]}
@@ -0,0 +1,11 @@
1
+ import Logger, { LogEntry } from '../../utils/logging/Logger.js';
2
+ export default class ChainLogger extends Logger {
3
+ #private;
4
+ constructor(loggers?: Logger[]);
5
+ add(logger: Logger): void;
6
+ remove(logger: Logger): void;
7
+ clear(): void;
8
+ log(entry: LogEntry): void;
9
+ end(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=ChainLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChainLogger.d.ts","sourceRoot":"","sources":["../../../src/utils/logging/ChainLogger.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,MAAM;;gBAIjC,OAAO,CAAC,EAAE,MAAM,EAAE;IAK9B,GAAG,CAAC,MAAM,EAAE,MAAM;IAIlB,MAAM,CAAC,MAAM,EAAE,MAAM;IAOrB,KAAK;IAIL,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAMpB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAW3B"}
@@ -0,0 +1,50 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _ChainLogger_loggers;
13
+ import Logger from '../../utils/logging/Logger.js';
14
+ export default class ChainLogger extends Logger {
15
+ constructor(loggers) {
16
+ super();
17
+ _ChainLogger_loggers.set(this, void 0);
18
+ __classPrivateFieldSet(this, _ChainLogger_loggers, loggers || [], "f");
19
+ }
20
+ add(logger) {
21
+ __classPrivateFieldGet(this, _ChainLogger_loggers, "f").push(logger);
22
+ }
23
+ remove(logger) {
24
+ const index = __classPrivateFieldGet(this, _ChainLogger_loggers, "f").findIndex((l) => l === logger);
25
+ if (index >= 0) {
26
+ __classPrivateFieldGet(this, _ChainLogger_loggers, "f").splice(index, 1);
27
+ }
28
+ }
29
+ clear() {
30
+ __classPrivateFieldSet(this, _ChainLogger_loggers, [], "f");
31
+ }
32
+ log(entry) {
33
+ for (const logger of __classPrivateFieldGet(this, _ChainLogger_loggers, "f")) {
34
+ logger.log(entry);
35
+ }
36
+ }
37
+ async end() {
38
+ const endPromises = __classPrivateFieldGet(this, _ChainLogger_loggers, "f").map(async (logger) => {
39
+ try {
40
+ await logger.end();
41
+ }
42
+ catch (error) {
43
+ // Do nothing
44
+ }
45
+ });
46
+ await Promise.all(endPromises);
47
+ }
48
+ }
49
+ _ChainLogger_loggers = new WeakMap();
50
+ //# sourceMappingURL=ChainLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChainLogger.js","sourceRoot":"","sources":["../../../src/utils/logging/ChainLogger.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,MAAoB,MAAM,+BAA+B,CAAC;AAEjE,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,MAAM;IAI7C,YAAY,OAAkB;QAC5B,KAAK,EAAE,CAAC;QAHV,uCAAmB;QAIjB,uBAAA,IAAI,wBAAY,OAAO,IAAI,EAAE,MAAA,CAAC;IAChC,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,uBAAA,IAAI,4BAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,MAAM,KAAK,GAAG,uBAAA,IAAI,4BAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;QAC3D,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,uBAAA,IAAI,4BAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAChC;IACH,CAAC;IAED,KAAK;QACH,uBAAA,IAAI,wBAAY,EAAE,MAAA,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,KAAe;QACjB,KAAK,MAAM,MAAM,IAAI,uBAAA,IAAI,4BAAS,EAAE;YAClC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SACnB;IACH,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,WAAW,GAAG,uBAAA,IAAI,4BAAS,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACrD,IAAI;gBACF,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;aACpB;YACD,OAAO,KAAK,EAAE;gBACZ,aAAa;aACd;QACH,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;CACF","sourcesContent":["import Logger, { LogEntry } from '../../utils/logging/Logger.js';\n\nexport default class ChainLogger extends Logger {\n\n #loggers: Logger[];\n\n constructor(loggers?: Logger[]) {\n super();\n this.#loggers = loggers || [];\n }\n\n add(logger: Logger) {\n this.#loggers.push(logger);\n }\n\n remove(logger: Logger) {\n const index = this.#loggers.findIndex((l) => l === logger);\n if (index >= 0) {\n this.#loggers.splice(index, 1);\n }\n }\n\n clear() {\n this.#loggers = [];\n }\n\n log(entry: LogEntry): void {\n for (const logger of this.#loggers) {\n logger.log(entry);\n }\n }\n\n async end(): Promise<void> {\n const endPromises = this.#loggers.map(async (logger) => {\n try {\n await logger.end();\n }\n catch (error) {\n // Do nothing\n }\n });\n await Promise.all(endPromises);\n }\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import clc from 'cli-color';
2
+ import Logger, { LogEntry, LogLevel } from '../../utils/logging/Logger.js';
3
+ import { DeepRequired } from '../../utils/Misc.js';
4
+ export interface ConsoleLoggerOptions {
5
+ enabled?: boolean;
6
+ logLevel?: LogLevel;
7
+ include?: {
8
+ dateTime?: boolean;
9
+ level?: boolean;
10
+ originator?: boolean;
11
+ errorStack?: boolean;
12
+ };
13
+ dateTimeFormat?: string;
14
+ color?: boolean;
15
+ }
16
+ type ConsoleLoggerConfig = DeepRequired<ConsoleLoggerOptions>;
17
+ export default class ConsoleLogger extends Logger {
18
+ protected config: ConsoleLoggerConfig;
19
+ protected static readonly LOG_COLORS: Record<string, clc.Format>;
20
+ constructor(options?: ConsoleLoggerOptions);
21
+ protected setOptions(options?: ConsoleLoggerOptions): void;
22
+ log(entry: LogEntry): void;
23
+ getConfig(): DeepRequired<ConsoleLoggerOptions>;
24
+ setLevel(value: LogLevel): void;
25
+ protected checkLevel(targetLevel: LogLevel): boolean;
26
+ protected toStrings(entry: LogEntry): string[];
27
+ protected colorize(value: string, colorKey: string): string;
28
+ protected toOutput(level: LogLevel, msg: string[]): void;
29
+ }
30
+ export {};
31
+ //# sourceMappingURL=ConsoleLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsoleLogger.d.ts","sourceRoot":"","sources":["../../../src/utils/logging/ConsoleLogger.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,WAAW,CAAC;AAE5B,OAAO,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAShE,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,KAAK,mBAAmB,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC;AAe9D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,MAAM;IAE/C,SAAS,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAEtC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAM9D;gBAEU,OAAO,CAAC,EAAE,oBAAoB;IAK1C,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,oBAAoB;IAenD,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAS1B,SAAS;IAIT,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,QAAQ;IAI1C,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,EAAE;IAwC9C,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAQlD,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE;CAiBlD"}
@@ -0,0 +1,126 @@
1
+ import util from 'util';
2
+ import clc from 'cli-color';
3
+ import dateFormat from 'dateformat';
4
+ import Logger from '../../utils/logging/Logger.js';
5
+ import { pickDefined } from '../../utils/Misc.js';
6
+ const LOG_LEVEL_ORDER = [
7
+ 'error',
8
+ 'warn',
9
+ 'info',
10
+ 'debug'
11
+ ];
12
+ const DEFAULT_LOGGER_CONFIG = {
13
+ enabled: true,
14
+ logLevel: 'info',
15
+ include: {
16
+ dateTime: true,
17
+ level: true,
18
+ originator: true,
19
+ errorStack: false
20
+ },
21
+ dateTimeFormat: 'mmm dd HH:MM:ss',
22
+ color: true
23
+ };
24
+ export default class ConsoleLogger extends Logger {
25
+ constructor(options) {
26
+ super();
27
+ this.setOptions(options);
28
+ }
29
+ setOptions(options) {
30
+ this.config = {
31
+ enabled: pickDefined(options?.enabled, DEFAULT_LOGGER_CONFIG.enabled),
32
+ logLevel: pickDefined(options?.logLevel, DEFAULT_LOGGER_CONFIG.logLevel),
33
+ include: {
34
+ dateTime: pickDefined(options?.include?.dateTime, DEFAULT_LOGGER_CONFIG.include.dateTime),
35
+ level: pickDefined(options?.include?.level, DEFAULT_LOGGER_CONFIG.include.level),
36
+ originator: pickDefined(options?.include?.originator, DEFAULT_LOGGER_CONFIG.include.originator),
37
+ errorStack: pickDefined(options?.include?.errorStack, DEFAULT_LOGGER_CONFIG.include.errorStack)
38
+ },
39
+ dateTimeFormat: pickDefined(options?.dateTimeFormat, DEFAULT_LOGGER_CONFIG.dateTimeFormat),
40
+ color: pickDefined(options?.color, DEFAULT_LOGGER_CONFIG.color)
41
+ };
42
+ }
43
+ log(entry) {
44
+ if (!this.config.enabled) {
45
+ return;
46
+ }
47
+ if (this.checkLevel(entry.level)) {
48
+ this.toOutput(entry.level, this.toStrings(entry));
49
+ }
50
+ }
51
+ getConfig() {
52
+ return this.config;
53
+ }
54
+ setLevel(value) {
55
+ this.config.logLevel = value;
56
+ }
57
+ checkLevel(targetLevel) {
58
+ return LOG_LEVEL_ORDER.indexOf(targetLevel) <= LOG_LEVEL_ORDER.indexOf(this.config.logLevel);
59
+ }
60
+ toStrings(entry) {
61
+ const { level, originator, message } = entry;
62
+ const strings = message.reduce((result, m) => {
63
+ if (m instanceof Error) {
64
+ if (m.name !== 'Error') {
65
+ result.push(`(${m.name}) ${m.message}`);
66
+ }
67
+ else {
68
+ result.push(m.message);
69
+ }
70
+ if (m.stack && this.config.include.errorStack) {
71
+ result.push(m.stack);
72
+ }
73
+ }
74
+ else if (typeof m === 'object') {
75
+ result.push(util.inspect(m, false, null, this.config.color));
76
+ }
77
+ else {
78
+ result.push(m);
79
+ }
80
+ return result;
81
+ }, []);
82
+ if (originator && this.config.include.originator) {
83
+ strings.unshift(this.colorize(`${originator}:`, 'originator'));
84
+ }
85
+ if (this.config.include.level) {
86
+ strings.unshift(this.colorize(`${level}:`, level));
87
+ }
88
+ if (this.config.include.dateTime) {
89
+ const dateTimeStr = `${dateFormat(new Date(), this.config.dateTimeFormat)}:`;
90
+ strings.unshift(dateTimeStr);
91
+ }
92
+ return strings;
93
+ }
94
+ colorize(value, colorKey) {
95
+ const formatColor = ConsoleLogger.LOG_COLORS[colorKey];
96
+ if (this.config.color && formatColor) {
97
+ return formatColor(value);
98
+ }
99
+ return value;
100
+ }
101
+ toOutput(level, msg) {
102
+ switch (level) {
103
+ case 'error':
104
+ console.error(...msg);
105
+ break;
106
+ case 'warn':
107
+ console.warn(...msg);
108
+ break;
109
+ case 'info':
110
+ console.info(...msg);
111
+ break;
112
+ case 'debug':
113
+ console.debug(...msg);
114
+ break;
115
+ default:
116
+ }
117
+ }
118
+ }
119
+ ConsoleLogger.LOG_COLORS = {
120
+ error: clc.red.bold,
121
+ warn: clc.magenta,
122
+ info: clc.green,
123
+ debug: clc.yellow,
124
+ originator: clc.blue
125
+ };
126
+ //# sourceMappingURL=ConsoleLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsoleLogger.js","sourceRoot":"","sources":["../../../src/utils/logging/ConsoleLogger.ts"],"names":[],"mappings":"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","sourcesContent":["import util from 'util';\nimport clc from 'cli-color';\nimport dateFormat from 'dateformat';\nimport Logger, { LogEntry, LogLevel } from '../../utils/logging/Logger.js';\nimport { DeepRequired, pickDefined } from '../../utils/Misc.js';\n\nconst LOG_LEVEL_ORDER = [\n 'error',\n 'warn',\n 'info',\n 'debug'\n];\n\nexport interface ConsoleLoggerOptions {\n enabled?: boolean;\n logLevel?: LogLevel;\n include?: {\n dateTime?: boolean;\n level?: boolean;\n originator?: boolean;\n errorStack?: boolean;\n };\n dateTimeFormat?: string;\n color?: boolean;\n}\n\ntype ConsoleLoggerConfig = DeepRequired<ConsoleLoggerOptions>;\n\nconst DEFAULT_LOGGER_CONFIG: ConsoleLoggerConfig = {\n enabled: true,\n logLevel: 'info',\n include: {\n dateTime: true,\n level: true,\n originator: true,\n errorStack: false\n },\n dateTimeFormat: 'mmm dd HH:MM:ss',\n color: true\n};\n\nexport default class ConsoleLogger extends Logger {\n\n protected config: ConsoleLoggerConfig;\n\n protected static readonly LOG_COLORS: Record<string, clc.Format> = {\n error: clc.red.bold,\n warn: clc.magenta,\n info: clc.green,\n debug: clc.yellow,\n originator: clc.blue\n };\n\n constructor(options?: ConsoleLoggerOptions) {\n super();\n this.setOptions(options);\n }\n\n protected setOptions(options?: ConsoleLoggerOptions) {\n this.config = {\n enabled: pickDefined(options?.enabled, DEFAULT_LOGGER_CONFIG.enabled),\n logLevel: pickDefined(options?.logLevel, DEFAULT_LOGGER_CONFIG.logLevel),\n include: {\n dateTime: pickDefined(options?.include?.dateTime, DEFAULT_LOGGER_CONFIG.include.dateTime),\n level: pickDefined(options?.include?.level, DEFAULT_LOGGER_CONFIG.include.level),\n originator: pickDefined(options?.include?.originator, DEFAULT_LOGGER_CONFIG.include.originator),\n errorStack: pickDefined(options?.include?.errorStack, DEFAULT_LOGGER_CONFIG.include.errorStack)\n },\n dateTimeFormat: pickDefined(options?.dateTimeFormat, DEFAULT_LOGGER_CONFIG.dateTimeFormat),\n color: pickDefined(options?.color, DEFAULT_LOGGER_CONFIG.color)\n };\n }\n\n log(entry: LogEntry): void {\n if (!this.config.enabled) {\n return;\n }\n if (this.checkLevel(entry.level)) {\n this.toOutput(entry.level, this.toStrings(entry));\n }\n }\n\n getConfig() {\n return this.config;\n }\n\n setLevel(value: LogLevel): void {\n this.config.logLevel = value;\n }\n\n protected checkLevel(targetLevel: LogLevel) {\n return LOG_LEVEL_ORDER.indexOf(targetLevel) <= LOG_LEVEL_ORDER.indexOf(this.config.logLevel);\n }\n\n protected toStrings(entry: LogEntry): string[] {\n const { level, originator, message } = entry;\n const strings = message.reduce<string[]>((result, m) => {\n if (m instanceof Error) {\n if (m.name !== 'Error') {\n result.push(`(${m.name}) ${m.message}`);\n }\n else {\n result.push(m.message);\n }\n if (m.stack && this.config.include.errorStack) {\n result.push(m.stack);\n }\n }\n else if (typeof m === 'object') {\n result.push(util.inspect(m, false, null, this.config.color));\n }\n else {\n result.push(m);\n }\n\n return result;\n }, []);\n\n if (originator && this.config.include.originator) {\n strings.unshift(this.colorize(`${originator}:`, 'originator'));\n }\n\n if (this.config.include.level) {\n strings.unshift(this.colorize(`${level}:`, level));\n }\n\n if (this.config.include.dateTime) {\n const dateTimeStr = `${dateFormat(new Date(), this.config.dateTimeFormat)}:`;\n strings.unshift(dateTimeStr);\n }\n\n return strings;\n }\n\n protected colorize(value: string, colorKey: string) {\n const formatColor = ConsoleLogger.LOG_COLORS[colorKey];\n if (this.config.color && formatColor) {\n return formatColor(value);\n }\n return value;\n }\n\n protected toOutput(level: LogLevel, msg: string[]) {\n switch (level) {\n case 'error':\n console.error(...msg);\n break;\n case 'warn':\n console.warn(...msg);\n break;\n case 'info':\n console.info(...msg);\n break;\n case 'debug':\n console.debug(...msg);\n break;\n default:\n }\n }\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import { LogLevel } from '../../utils/logging/Logger.js';
2
+ import { DeepRequired } from '../Misc.js';
3
+ import ConsoleLogger, { ConsoleLoggerOptions } from './ConsoleLogger.js';
4
+ export interface FileLoggerOptions extends ConsoleLoggerOptions {
5
+ logDir?: string;
6
+ logFilename?: string;
7
+ fileExistsAction?: 'append' | 'overwrite';
8
+ }
9
+ export interface FileLoggerConfig extends DeepRequired<FileLoggerOptions> {
10
+ logFilePath: string;
11
+ created: Date;
12
+ }
13
+ export interface FileLoggerInit {
14
+ targetURL: string;
15
+ outDir?: string;
16
+ date?: Date;
17
+ }
18
+ export default class FileLogger extends ConsoleLogger {
19
+ #private;
20
+ protected config: FileLoggerConfig;
21
+ constructor(init: FileLoggerInit, options?: FileLoggerOptions);
22
+ getConfig(): FileLoggerConfig;
23
+ protected toOutput(_level: LogLevel, msg: string[]): void;
24
+ end(): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=FileLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileLogger.d.ts","sourceRoot":"","sources":["../../../src/utils/logging/FileLogger.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAe,MAAM,YAAY,CAAC;AACvD,OAAO,aAAa,EAAE,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAOzE,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAiB,SAAQ,YAAY,CAAC,iBAAiB,CAAC;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,IAAI,CAAC;CACf;AAmBD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,aAAa;;IAEnD,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC;gBAOvB,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAyF7D,SAAS;IAIT,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE;IAMlD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAcrB"}