binary-collections 2.0.10 → 2.0.12

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 (290) hide show
  1. package/.opencode/package.json +5 -0
  2. package/.puppeterrc.cjs +25 -0
  3. package/binaries/binary-executor.cjs +138 -3
  4. package/binaries/clean-nodemodule.cjs +138 -3
  5. package/binaries/clean-nodemodules.cjs +138 -3
  6. package/binaries/dev.cjs +138 -3
  7. package/binaries/empty.cjs +138 -3
  8. package/binaries/git-reduce-size.cjs +138 -3
  9. package/binaries/javakill.cjs +138 -3
  10. package/binaries/kill-night-crows.bat +7 -0
  11. package/binaries/kill-night-crows.ps1 +172 -0
  12. package/binaries/kill-process.cjs +138 -3
  13. package/binaries/nodekill.cjs +138 -3
  14. package/binaries/prod.cjs +138 -3
  15. package/binaries/py +111 -0
  16. package/binaries/py.cjs +178 -0
  17. package/binaries/py.cmd +49 -0
  18. package/binaries/rmfind.cjs +138 -3
  19. package/binaries/rmx +15 -1
  20. package/binaries/rmx.cjs +138 -3
  21. package/binaries/rmx.cmd +12 -0
  22. package/binaries/submodule-token.cjs +138 -3
  23. package/binaries/test-cjs +18 -0
  24. package/binaries/test-cjs.cjs +178 -0
  25. package/binaries/test-cjs.cmd +26 -0
  26. package/binaries/test-esm +16 -0
  27. package/binaries/test-esm.cjs +178 -0
  28. package/binaries/test-esm.cmd +23 -0
  29. package/binaries/yarn-clean +32 -0
  30. package/binaries/yarn-clean.cjs +178 -0
  31. package/binaries/yarn-clean.cmd +30 -0
  32. package/binaries/yarn-clean.py +166 -0
  33. package/binaries/yc +110 -0
  34. package/binaries/yc.cjs +178 -0
  35. package/lib/binary-collections/config.cjs +126 -0
  36. package/lib/binary-collections/config.mjs +7 -0
  37. package/lib/binary-collections/executeScript.cjs +19 -0
  38. package/lib/binary-collections/executeScript.d.cts +12 -0
  39. package/lib/binary-collections/executeScript.mjs +6 -0
  40. package/lib/binary-collections/findScript.cjs +284 -0
  41. package/lib/binary-collections/findScript.d.cts +12 -0
  42. package/lib/binary-collections/findScript.mjs +7 -0
  43. package/lib/binary-collections/listScript.cjs +266 -0
  44. package/lib/binary-collections/listScript.d.cts +19 -0
  45. package/lib/binary-collections/listScript.mjs +7 -0
  46. package/lib/binary-collections.cjs +342 -194
  47. package/lib/binary-collections.mjs +22 -268
  48. package/lib/changelog.cjs +61 -13
  49. package/lib/changelog.mjs +1 -1
  50. package/lib/{chunk-E6FDDAOO.mjs → chunk-2LSRSEXF.mjs} +2 -2
  51. package/lib/chunk-34IQDTLZ.mjs +27 -0
  52. package/lib/chunk-3HFFECCI.mjs +27 -0
  53. package/lib/{chunk-V3N3JEUF.mjs → chunk-5RTXZVCW.mjs} +60 -13
  54. package/lib/chunk-66KDU4TX.mjs +268 -0
  55. package/lib/chunk-6PU7BAHB.mjs +61 -0
  56. package/lib/{chunk-6HHJRKFB.mjs → chunk-BZWVHODJ.mjs} +4 -1
  57. package/lib/chunk-C6D2TTYU.mjs +32 -0
  58. package/lib/chunk-FB2WKVJD.mjs +158 -0
  59. package/lib/{chunk-66PAU5PS.mjs → chunk-G5UUEWUO.mjs} +9 -5
  60. package/lib/{chunk-HO6GHCOB.mjs → chunk-GAGABICI.mjs} +198 -63
  61. package/lib/chunk-H44UWUFY.mjs +105 -0
  62. package/lib/chunk-NCZPTKDV.mjs +79 -0
  63. package/lib/chunk-NGFK3EYW.mjs +28 -0
  64. package/lib/chunk-NVEG3LEZ.mjs +143 -0
  65. package/lib/chunk-OGXVGBRI.mjs +29 -0
  66. package/lib/chunk-OXV52GD5.mjs +62 -0
  67. package/lib/{chunk-PDSXF5HY.mjs → chunk-PDN26I7O.mjs} +1 -0
  68. package/lib/chunk-PXBMHE7O.mjs +35 -0
  69. package/lib/chunk-R5FJOR63.mjs +47 -0
  70. package/lib/chunk-SPTECFE5.mjs +180 -0
  71. package/lib/chunk-UXCFNAR6.mjs +55 -0
  72. package/lib/chunk-V2IBPCEV.mjs +39 -0
  73. package/lib/chunk-XPJGCDOD.mjs +14 -0
  74. package/lib/{chunk-AI4CVPJ7.mjs → chunk-ZDMWBSYF.mjs} +4 -4
  75. package/lib/chunk-ZOWVMII3.mjs +228 -0
  76. package/lib/clean-github-actions-caches-cli.cjs +465 -0
  77. package/lib/clean-github-actions-caches-cli.d.cts +1 -0
  78. package/lib/clean-github-actions-caches-cli.mjs +56 -0
  79. package/lib/clean-github-actions-caches.cjs +152 -160
  80. package/lib/clean-github-actions-caches.d.cts +15 -1
  81. package/lib/clean-github-actions-caches.mjs +4 -130
  82. package/lib/cross-env/command.cjs +63 -0
  83. package/lib/cross-env/command.d.ts +8 -0
  84. package/lib/cross-env/command.js +45 -0
  85. package/lib/cross-env/command.mjs +9 -0
  86. package/lib/cross-env/index.cjs +178 -0
  87. package/lib/cross-env/index.d.ts +8 -0
  88. package/lib/cross-env/index.js +102 -0
  89. package/lib/cross-env/index.mjs +101 -0
  90. package/lib/cross-env/variable.cjs +60 -0
  91. package/lib/cross-env/variable.d.ts +7 -0
  92. package/lib/cross-env/variable.js +59 -0
  93. package/lib/cross-env/variable.mjs +9 -0
  94. package/lib/del-gradle.cjs +61 -13
  95. package/lib/del-gradle.js +9 -8
  96. package/lib/del-gradle.mjs +1 -1
  97. package/lib/del-node-modules.cjs +143 -148
  98. package/lib/del-node-modules.js +210 -14
  99. package/lib/del-node-modules.mjs +148 -17
  100. package/lib/del-ps.cjs +61 -13
  101. package/lib/del-ps.js +9 -8
  102. package/lib/del-ps.mjs +1 -1
  103. package/lib/del-yarn-caches.cjs +61 -13
  104. package/lib/del-yarn-caches.js +2 -2
  105. package/lib/del-yarn-caches.mjs +1 -1
  106. package/lib/file/copy-cli.cjs +92 -0
  107. package/lib/file/copy-cli.d.mts +1 -0
  108. package/lib/file/copy-cli.mjs +55 -0
  109. package/lib/file/copy.cjs +56 -0
  110. package/lib/file/copy.d.mts +1 -0
  111. package/lib/file/copy.mjs +8 -0
  112. package/lib/file/move-cli.cjs +91 -0
  113. package/lib/file/move-cli.d.mts +1 -0
  114. package/lib/file/move-cli.mjs +55 -0
  115. package/lib/file/move.cjs +55 -0
  116. package/lib/file/move.d.mts +1 -0
  117. package/lib/file/move.mjs +8 -0
  118. package/lib/find-node-modules-cli.js +2 -1
  119. package/lib/free-chatgpt.cjs +259 -47
  120. package/lib/free-chatgpt.js +10 -10
  121. package/lib/free-chatgpt.mjs +2 -2
  122. package/lib/git/gitattributes.cjs +1 -0
  123. package/lib/git/gitattributes.d.cts +7 -2
  124. package/lib/git/gitattributes.mjs +1 -1
  125. package/lib/git/line-endings.cjs +2 -1
  126. package/lib/git/line-endings.mjs +2 -2
  127. package/lib/git/undo-commit-cli.cjs +110 -0
  128. package/lib/git/undo-commit-cli.d.ts +1 -0
  129. package/lib/git/undo-commit-cli.js +4 -0
  130. package/lib/git/undo-commit-cli.mjs +14 -0
  131. package/lib/git/undo-commit.cjs +81 -0
  132. package/lib/git/undo-commit.d.cts +1 -0
  133. package/lib/git/undo-commit.mjs +7 -0
  134. package/lib/git/undo-staged-cli.cjs +110 -0
  135. package/lib/git/undo-staged-cli.d.ts +1 -0
  136. package/lib/git/undo-staged-cli.js +4 -0
  137. package/lib/git/undo-staged-cli.mjs +14 -0
  138. package/lib/git/undo-staged.cjs +81 -0
  139. package/lib/git/undo-staged.d.cts +1 -0
  140. package/lib/git/undo-staged.mjs +7 -0
  141. package/lib/git/user-config.cjs +61 -14
  142. package/lib/git/user-config.mjs +2 -2
  143. package/lib/git-diff-cli.cjs +427 -75
  144. package/lib/git-diff-cli.d.ts +1 -0
  145. package/lib/git-diff-cli.js +1 -0
  146. package/lib/git-diff-cli.mjs +6 -4
  147. package/lib/git-diff.cjs +426 -75
  148. package/lib/git-diff.d.ts +2 -1
  149. package/lib/git-diff.js +91 -34
  150. package/lib/git-diff.mjs +5 -4
  151. package/lib/git-fix.cjs +64 -16
  152. package/lib/git-fix.mjs +10 -10
  153. package/lib/git-purge.cjs +61 -13
  154. package/lib/git-purge.mjs +1 -1
  155. package/lib/index.d.ts +1 -1
  156. package/lib/kill-night-crows.cjs +87 -0
  157. package/lib/kill-night-crows.d.mts +1 -0
  158. package/lib/kill-night-crows.mjs +65 -0
  159. package/lib/node-cache-cleaner/npm.cjs +65 -0
  160. package/lib/node-cache-cleaner/npm.d.ts +2 -0
  161. package/lib/node-cache-cleaner/npm.js +41 -0
  162. package/lib/node-cache-cleaner/npm.mjs +10 -0
  163. package/lib/node-cache-cleaner/npx.cjs +89 -0
  164. package/lib/node-cache-cleaner/npx.d.ts +4 -0
  165. package/lib/node-cache-cleaner/npx.js +82 -0
  166. package/lib/{ps/index.d.mjs → node-cache-cleaner/npx.mjs} +6 -5
  167. package/lib/node-cache-cleaner/yarn.cjs +73 -0
  168. package/lib/node-cache-cleaner/yarn.d.ts +2 -0
  169. package/lib/node-cache-cleaner/yarn.js +62 -0
  170. package/lib/node-cache-cleaner/yarn.mjs +10 -0
  171. package/lib/node-cache-cleaner-cli.cjs +182 -0
  172. package/lib/node-cache-cleaner-cli.d.ts +2 -0
  173. package/lib/node-cache-cleaner-cli.js +60 -0
  174. package/lib/node-cache-cleaner-cli.mjs +56 -0
  175. package/lib/node-executor.cjs +91 -0
  176. package/lib/node-executor.d.cts +2 -0
  177. package/lib/node-executor.mjs +103 -0
  178. package/lib/npm-run-series.cjs +79 -39
  179. package/lib/npm-run-series.mjs +20 -6
  180. package/lib/package-resolutions-updater-cli.cjs +645 -0
  181. package/lib/package-resolutions-updater-cli.d.mts +1 -0
  182. package/lib/package-resolutions-updater-cli.mjs +102 -0
  183. package/lib/package-resolutions-updater.cjs +259 -133
  184. package/lib/package-resolutions-updater.d.mts +51 -1
  185. package/lib/package-resolutions-updater.mjs +18 -294
  186. package/lib/php-cs-fixer-staged.cjs +105 -0
  187. package/lib/php-cs-fixer-staged.d.cts +2 -0
  188. package/lib/php-cs-fixer-staged.mjs +117 -0
  189. package/lib/print-directory-tree.cjs +62 -14
  190. package/lib/print-directory-tree.mjs +2 -2
  191. package/lib/ps/connected-domain.d.ts +1 -1
  192. package/lib/ps/connected-domain.js +10 -10
  193. package/lib/ps/index.cjs +1 -1
  194. package/lib/ps/index.mjs +177 -171
  195. package/lib/ps/isWin.js +1 -1
  196. package/lib/ps/table-parser.js +6 -6
  197. package/lib/remove-module.cjs +61 -13
  198. package/lib/remove-module.mjs +1 -1
  199. package/lib/rm-node-module-cli.cjs +222 -0
  200. package/lib/rm-node-module-cli.d.cts +1 -0
  201. package/lib/rm-node-module-cli.mjs +89 -0
  202. package/lib/rm-node-modules.cjs +127 -0
  203. package/lib/rm-node-modules.d.cts +35 -0
  204. package/lib/{binary-collections-config.mjs → rm-node-modules.mjs} +3 -3
  205. package/lib/rmpath.cjs +63 -15
  206. package/lib/rmpath.mjs +2 -2
  207. package/lib/submodule-install.cjs +107 -47
  208. package/lib/submodule-install.mjs +48 -35
  209. package/lib/submodule-remove-cli.cjs +6 -3
  210. package/lib/submodule-remove-cli.js +3 -3
  211. package/lib/submodule-remove-cli.mjs +2 -3
  212. package/lib/submodule-remove.cjs +4 -1
  213. package/lib/submodule-remove.mjs +1 -1
  214. package/lib/utils/chatgpt.cjs +198 -34
  215. package/lib/utils/chatgpt.js +260 -93
  216. package/lib/utils/chatgpt.mjs +1 -1
  217. package/lib/utils/findEnvFiles.cjs +89 -0
  218. package/lib/utils/findEnvFiles.d.cts +19 -0
  219. package/lib/utils/findEnvFiles.mjs +6 -0
  220. package/lib/utils/findWorkspaceRoot.cjs +70 -0
  221. package/lib/utils/findWorkspaceRoot.d.ts +9 -0
  222. package/lib/utils/findWorkspaceRoot.js +57 -0
  223. package/lib/utils/findWorkspaceRoot.mjs +40 -0
  224. package/lib/utils/index.cjs +60 -13
  225. package/lib/utils/index.mjs +1 -1
  226. package/lib/utils/isGithubTokenValid.cjs +64 -0
  227. package/lib/utils/isGithubTokenValid.d.ts +7 -0
  228. package/lib/utils/isGithubTokenValid.js +48 -0
  229. package/lib/utils/isGithubTokenValid.mjs +36 -0
  230. package/lib/{ps/index.d.cjs → utils/isWindows.cjs} +17 -3
  231. package/lib/utils/isWindows.d.ts +5 -0
  232. package/lib/utils/isWindows.js +10 -0
  233. package/lib/utils/isWindows.mjs +8 -0
  234. package/lib/utils/runBash.cjs +53 -0
  235. package/lib/utils/runBash.d.cts +12 -0
  236. package/lib/utils/runBash.mjs +66 -0
  237. package/lib/yarn-per-branch-lock-installer.cjs +97 -0
  238. package/lib/yarn-per-branch-lock-installer.d.cts +2 -0
  239. package/lib/yarn-per-branch-lock-installer.mjs +109 -0
  240. package/lib/yarn-reinstall.cjs +61 -13
  241. package/lib/yarn-reinstall.mjs +1 -1
  242. package/package.json +133 -110
  243. package/readme.html +784 -0
  244. package/readme.md +116 -229
  245. package/releases/readme.md +1 -1
  246. package/requirements.txt +1 -0
  247. package/test/README.md +2 -2
  248. package/test-project/package.json +8 -2
  249. package/test-project/workspaces/workspace-a/package.json +135 -0
  250. package/test-project/workspaces/workspace-a/readme.md +20 -0
  251. package/test-project/workspaces/workspace-a/release/readme.md +42 -0
  252. package/test-project/workspaces/workspace-a/test/demo/package.json +25 -0
  253. package/test-project/workspaces/workspace-a/test/readme.md +12 -0
  254. package/test-project/workspaces/workspace-b/package.json +139 -0
  255. package/test-project/workspaces/workspace-b/readme.md +94 -0
  256. package/test-project/workspaces/workspace-b/requirements.txt +1 -0
  257. package/test-project/workspaces/workspace-b/test/sample-project/package.json +7 -0
  258. package/test-project/workspaces/workspace-b/themes/hexo-theme-flowbite/package.json +96 -0
  259. package/test-project/workspaces/workspace-b/themes/hexo-theme-flowbite/readme.md +156 -0
  260. package/tmp/rm-node-modules-test-project/package.json +17 -0
  261. package/tmp/rm-node-modules-test-project/packages/workspace-a/package.json +16 -0
  262. package/tmp/rm-node-modules-test-project/packages/workspace-b/package.json +16 -0
  263. package/tmp/test-repo/README.md +2 -35
  264. package/tmp/test-repo/package.json +13 -3
  265. package/docs-src/clean-github-actions-caches.md +0 -26
  266. package/docs-src/free-chatgpt.md +0 -26
  267. package/lib/binary-collections-config.cjs +0 -15
  268. package/lib/chunk-4EWQC6GZ.mjs +0 -382
  269. package/lib/chunk-4ZI7BQKQ.mjs +0 -381
  270. package/lib/chunk-5J2BEPY5.mjs +0 -83
  271. package/lib/chunk-AGZYRDC2.mjs +0 -323
  272. package/lib/chunk-BDCHCWHD.mjs +0 -136
  273. package/lib/chunk-BEZKJ25G.mjs +0 -140
  274. package/lib/chunk-DI5MDPSN.mjs +0 -386
  275. package/lib/chunk-GJTGHXRA.mjs +0 -356
  276. package/lib/chunk-HMRMTYZM.mjs +0 -40
  277. package/lib/chunk-HN52G2YL.mjs +0 -305
  278. package/lib/chunk-LEM5OMRP.mjs +0 -384
  279. package/lib/chunk-O6SWBEOQ.mjs +0 -81
  280. package/lib/chunk-RCP7DHVY.mjs +0 -190
  281. package/lib/chunk-SBNDSKG5.mjs +0 -136
  282. package/lib/chunk-U6SO4QEV.mjs +0 -320
  283. package/lib/chunk-XD6BJK6Q.mjs +0 -351
  284. package/lib/chunk-YXSFGA2D.mjs +0 -383
  285. package/lib/git/gitattributes.d.ts +0 -33
  286. package/lib/git/gitattributes.js +0 -223
  287. package/lib/ps/index.d.ts +0 -2
  288. package/lib/ps/index.js +0 -253
  289. package/tmp/typedoc/readme.md +0 -320
  290. /package/lib/{binary-collections-config.d.cts → binary-collections/config.d.cts} +0 -0
@@ -1,383 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import {
3
- __require,
4
- init_esm_shims
5
- } from "./chunk-QQ4A6DLD.mjs";
6
-
7
- // src/utils/chatgpt.js
8
- init_esm_shims();
9
- import fs from "fs-extra";
10
- import puppeteer from "puppeteer-extra";
11
- import StealthPlugin from "puppeteer-extra-plugin-stealth";
12
- import path from "upath";
13
- import { pathToFileURL } from "url";
14
- var COOKIE_DIR = path.join(process.cwd(), "tmp", "cookies");
15
- var DEFAULT_COOKIE_PATH = path.join(COOKIE_DIR, "cookies.json");
16
- fs.ensureDirSync(COOKIE_DIR);
17
- async function saveCookies(page, path2 = DEFAULT_COOKIE_PATH) {
18
- const cookies = await page.cookies();
19
- fs.writeFileSync(path2, JSON.stringify(cookies, null, 2));
20
- }
21
- function getCookiePathForUrl(url) {
22
- try {
23
- const { hostname } = new URL(url);
24
- return path.join(COOKIE_DIR, `cookies_${hostname}.json`);
25
- } catch {
26
- return DEFAULT_COOKIE_PATH;
27
- }
28
- }
29
- async function navigatePage(page, url) {
30
- const cookiePath = getCookiePathForUrl(url);
31
- const cookies = loadCookies(cookiePath);
32
- if (cookies) {
33
- await page.setCookie(...cookies);
34
- }
35
- await page.goto(url, { waitUntil: "networkidle0" });
36
- await page.evaluate(() => {
37
- window.__domStillUpdating = true;
38
- if (window.__domObserver) {
39
- window.__domObserver.disconnect();
40
- }
41
- window.__domObserver = new MutationObserver(() => {
42
- window.__lastDomMutation = Date.now();
43
- });
44
- window.__lastDomMutation = Date.now();
45
- window.__domObserver.observe(document.body, {
46
- childList: true,
47
- subtree: true,
48
- attributes: true,
49
- characterData: true
50
- });
51
- setTimeout(() => {
52
- window.__domStillUpdating = false;
53
- window.__domObserver.disconnect();
54
- }, 3e4);
55
- });
56
- const waitForDomIdle = async (idleMs = 1e3, timeout = 1e4) => {
57
- const start = Date.now();
58
- while (Date.now() - start < timeout) {
59
- const lastMutation = await page.evaluate(() => window.__lastDomMutation);
60
- const idle = Date.now() - lastMutation;
61
- if (idle >= idleMs) {
62
- return true;
63
- }
64
- await new Promise((r) => setTimeout(r, 200));
65
- }
66
- throw new Error("DOM did not stabilize within timeout");
67
- };
68
- return { waitForDomIdle };
69
- }
70
- function loadCookies(cookieFilePath = DEFAULT_COOKIE_PATH) {
71
- if (!fs.existsSync(cookieFilePath)) return null;
72
- return JSON.parse(fs.readFileSync(cookieFilePath));
73
- }
74
- async function writeQuestion(page, question) {
75
- const questions = question.split("\n");
76
- const promptTextarea = await page.waitForSelector("#prompt-textarea", { timeout: 3e4 });
77
- if (!promptTextarea) {
78
- console.log(
79
- "Cannot find the prompt input on the webpage. Please check whether you have access to chat.openai.com without logging in via your browser."
80
- );
81
- }
82
- await page.evaluate(() => {
83
- document.querySelector("#prompt-textarea").innerHTML = `<p></p>`;
84
- });
85
- if (questions.length === 1) {
86
- await page.type("#prompt-textarea", questions[0], { delay: 100 });
87
- return;
88
- }
89
- for (const q of questions) {
90
- await page.type("#prompt-textarea", q, { delay: 100 });
91
- if (q !== questions[questions.length - 1]) {
92
- await page.keyboard.down("Shift");
93
- await page.keyboard.press("Enter");
94
- await page.keyboard.up("Shift");
95
- }
96
- }
97
- }
98
- async function clickSubmitButton(page) {
99
- try {
100
- const fruitjuiceSendButton = await page.evaluate(() => {
101
- return document.querySelector('[data-testid="fruitjuice-send-button"]') !== null;
102
- });
103
- const sendButton = await page.evaluate(() => {
104
- return document.querySelector('[data-testid="send-button"]') !== null;
105
- });
106
- if (fruitjuiceSendButton) {
107
- await page.click('[data-testid="fruitjuice-send-button"]');
108
- } else if (sendButton) {
109
- await page.click('[data-testid="send-button"]');
110
- } else {
111
- console.log("Neither send button is present");
112
- }
113
- } catch (e) {
114
- console.log(`Failed to click the send button: ${e}`);
115
- }
116
- }
117
- var lastMessageId = null;
118
- var messageCount = 0;
119
- var is_streaming = false;
120
- function sleep(ms) {
121
- return new Promise((resolve) => setTimeout(resolve, ms));
122
- }
123
- async function waitForInitialResponse(page, timeout = 3e4) {
124
- const startTime = Date.now();
125
- while (Date.now() - startTime < timeout) {
126
- const assistantMessages = await page.$$('[data-message-author-role="assistant"]');
127
- const currentMessageCount = assistantMessages.length;
128
- if (currentMessageCount > messageCount) {
129
- const lastMessage = assistantMessages[assistantMessages.length - 1];
130
- const isThinking = await lastMessage.$(".result-thinking");
131
- if (!isThinking) {
132
- lastMessageId = await page.evaluate((element) => element.getAttribute("data-message-id"), lastMessage);
133
- messageCount = currentMessageCount;
134
- return;
135
- }
136
- }
137
- await sleep(100);
138
- }
139
- console.log("Timed out waiting for the initial response.");
140
- }
141
- async function handleStreamingResponse(page, outputFile = path.join(process.cwd(), "tmp/response.txt")) {
142
- let previousText = "";
143
- let completeResponse = "";
144
- let newContentDetected = false;
145
- while (!newContentDetected) {
146
- const assistantMessages = await page.$$('[data-message-author-role="assistant"]');
147
- if (assistantMessages.length > 0) {
148
- const lastMessage = assistantMessages[assistantMessages.length - 1];
149
- const currentMessageId = await page.evaluate((element) => element.getAttribute("data-message-id"), lastMessage);
150
- if (currentMessageId === lastMessageId) {
151
- const currentText = await page.evaluate((element) => element.textContent, lastMessage);
152
- console.log(`Current text: ${currentText}`);
153
- if (currentText !== previousText) {
154
- if (is_streaming) {
155
- process.stdout.write(currentText.slice(previousText.length));
156
- } else {
157
- completeResponse += currentText.slice(previousText.length);
158
- }
159
- }
160
- previousText = currentText;
161
- const isStreaming = await lastMessage.$(".result-streaming");
162
- if (!isStreaming) {
163
- newContentDetected = true;
164
- }
165
- } else {
166
- lastMessageId = currentMessageId;
167
- }
168
- }
169
- await sleep(100);
170
- }
171
- if (!is_streaming) {
172
- console.log(completeResponse.trim());
173
- console.log("\n\n");
174
- fs.ensureDirSync(path.dirname(outputFile));
175
- fs.writeFileSync(outputFile, completeResponse.trim());
176
- console.log(`Response saved to ${outputFile}`);
177
- }
178
- }
179
- async function isLoggedIn(page) {
180
- const result = await page.evaluate(() => {
181
- const loginButton = document.querySelector('[data-testid="login-button"]');
182
- return !(loginButton && loginButton.offsetParent !== null);
183
- });
184
- return result === true;
185
- }
186
- async function createBrowser(browserOptions = {}) {
187
- const defaultOptions = {
188
- headless: false,
189
- userDataDir: path.join(process.cwd(), "tmp/puppeteer-profile"),
190
- // Windows-specific options to handle browser launch issues
191
- args: [
192
- "--no-sandbox",
193
- "--disable-setuid-sandbox",
194
- "--disable-dev-shm-usage",
195
- "--disable-accelerated-2d-canvas",
196
- "--no-first-run",
197
- "--no-zygote",
198
- "--disable-gpu",
199
- "--disable-background-timer-throttling",
200
- "--disable-backgrounding-occluded-windows",
201
- "--disable-renderer-backgrounding"
202
- ],
203
- ignoreDefaultArgs: ["--disable-extensions"],
204
- ...process.platform === "win32" && {
205
- // Additional Windows-specific options
206
- executablePath: void 0
207
- // Let Puppeteer find Chrome automatically
208
- }
209
- };
210
- try {
211
- return await puppeteer.use(StealthPlugin()).launch({ ...defaultOptions, ...browserOptions });
212
- } catch (_error) {
213
- console.error("Failed to launch browser with default options. Trying fallback options...");
214
- try {
215
- return await puppeteer.use(StealthPlugin()).launch({
216
- headless: browserOptions.headless || false,
217
- args: ["--no-sandbox", "--disable-setuid-sandbox"],
218
- ignoreDefaultArgs: false,
219
- ...browserOptions
220
- });
221
- } catch (fallbackError) {
222
- console.error("Browser launch failed completely. Common solutions:");
223
- console.error("1. Install Google Chrome if not installed");
224
- console.error("2. Update Node.js to the latest version");
225
- console.error("3. Try running: npm install puppeteer --force");
226
- console.error("4. Check if antivirus is blocking browser launch");
227
- throw new Error(`Browser launch failed: ${fallbackError.message}`);
228
- }
229
- }
230
- }
231
- async function loginToChatGpt() {
232
- const browser = await createBrowser({ headless: false });
233
- const page = (await browser.pages()).length > 0 ? (await browser.pages())[0] : await browser.newPage();
234
- const url = "https://chat.openai.com";
235
- const navigate = await navigatePage(page, url);
236
- await navigate.waitForDomIdle(2e3, 1e4);
237
- const loginButtonExists = await page.evaluate(() => {
238
- return document.querySelector('[data-testid="login-button"]') !== null;
239
- });
240
- if (loginButtonExists) {
241
- console.log("Login button found, clicking to log in...");
242
- await page.click('[data-testid="login-button"]');
243
- await page.waitForNavigation({ waitUntil: "networkidle0" });
244
- console.log("Login process completed.");
245
- } else {
246
- console.log("No login required - user appears to be already logged in.");
247
- }
248
- }
249
- async function runChatGpt(chatgptOptions = {}) {
250
- const headless = chatgptOptions.headless !== void 0 ? chatgptOptions.headless : true;
251
- const questionFile = chatgptOptions.questionFile;
252
- let question = chatgptOptions.question;
253
- const responseFile = chatgptOptions.responseFile || path.join(process.cwd(), "tmp", "response.txt");
254
- const noInputProvided = !question && !questionFile;
255
- const questionIsEmpty = question && question.trim().length === 0;
256
- const questionFileIsEmpty = questionFile && questionFile.trim().length === 0;
257
- if (noInputProvided || questionIsEmpty || questionFileIsEmpty) {
258
- throw new Error("You must provide a question or a question file.");
259
- }
260
- let browser;
261
- try {
262
- browser = await createBrowser({ headless });
263
- } catch (error) {
264
- console.error("Error running ChatGPT:", error);
265
- console.error("\nTroubleshooting steps:");
266
- console.error("1. Make sure Google Chrome is installed");
267
- console.error("2. Try running: yarn add puppeteer --force");
268
- console.error("3. Check if your antivirus is blocking the browser");
269
- console.error("4. Close any running Chrome instances and try again");
270
- throw error;
271
- }
272
- const page = (await browser.pages()).length > 0 ? (await browser.pages())[0] : await browser.newPage();
273
- try {
274
- const url = "https://chat.openai.com";
275
- const navigate = await navigatePage(page, url);
276
- await navigate.waitForDomIdle(2e3, 15e3);
277
- try {
278
- const tempChatButton = await page.$('button[aria-label="Turn on temporary chat"]');
279
- if (tempChatButton) {
280
- await page.evaluate((el) => el.click(), tempChatButton);
281
- console.log("Successfully clicked temporary chat button");
282
- await navigate.waitForDomIdle(1e3, 1e4);
283
- } else {
284
- console.log("Temporary chat button not found, proceeding without it.");
285
- }
286
- } catch (error) {
287
- console.log(`Failed to click temporary chat button: ${error.message}`);
288
- }
289
- if (question) {
290
- await writeQuestion(page, question);
291
- await clickSubmitButton(page);
292
- await navigate.waitForDomIdle(1e3, 3e4);
293
- await waitForInitialResponse(page);
294
- await handleStreamingResponse(page, responseFile);
295
- await saveCookies(page, getCookiePathForUrl(url));
296
- } else if (questionFile) {
297
- await navigate.waitForDomIdle(2e3, 1e4);
298
- const isUserLoggedIn = await isLoggedIn(page);
299
- console.log(`Login status: ${isUserLoggedIn ? "Logged in" : "Not logged in"}`);
300
- if (!isUserLoggedIn) {
301
- console.log(
302
- "Not logged in. Please log in to ChatGPT in the browser window, then close it and run the command again."
303
- );
304
- return loginToChatGpt();
305
- }
306
- const plusButtonExists = await page.evaluate(() => {
307
- const button = document.querySelector('[data-testid="composer-plus-btn"]');
308
- return button !== null;
309
- });
310
- if (plusButtonExists) {
311
- await page.click('[data-testid="composer-plus-btn"]');
312
- await sleep(500);
313
- const menuItems = await page.$$('[role="menuitem"]');
314
- let clicked = false;
315
- for (const item of menuItems) {
316
- const text = await page.evaluate((el) => el.innerText, item);
317
- if (text && text.includes("Add photos") && text.includes("files")) {
318
- await item.hover();
319
- clicked = true;
320
- break;
321
- }
322
- }
323
- if (!clicked) {
324
- console.log('Could not find the "Add photos & files" menu item.');
325
- return;
326
- }
327
- try {
328
- await sleep(1e3);
329
- const fileInput = await page.waitForSelector('input[type="file"]', { timeout: 1e4 });
330
- if (fileInput) {
331
- console.log(`Uploading file: ${questionFile}`);
332
- await fileInput.uploadFile(questionFile);
333
- await navigate.waitForDomIdle(2e3, 15e3);
334
- console.log("File uploaded successfully");
335
- await clickSubmitButton(page);
336
- await navigate.waitForDomIdle(1e3, 3e4);
337
- await waitForInitialResponse(page);
338
- await handleStreamingResponse(page, responseFile);
339
- } else {
340
- console.log("Could not find file input element");
341
- }
342
- } catch (error) {
343
- console.log(`Error uploading file: ${error.message}`);
344
- }
345
- } else {
346
- console.log('Could not find the [data-testid="composer-plus-btn"] button.');
347
- }
348
- }
349
- } finally {
350
- if (browser) {
351
- await browser.close();
352
- }
353
- }
354
- }
355
- var isMain = false;
356
- try {
357
- if (typeof __require !== "undefined" && typeof module !== "undefined" && __require.main === module) {
358
- isMain = true;
359
- }
360
- const mainArg = process.argv[1] && path.resolve(process.argv[1]);
361
- console.log(typeof __require, typeof module, __require.main === module, mainArg);
362
- } catch (_e) {
363
- }
364
- try {
365
- const mainArg = process.argv[1] && path.resolve(process.argv[1]);
366
- if (mainArg && import.meta.url === pathToFileURL(mainArg).href) {
367
- isMain = true;
368
- }
369
- } catch (_e) {
370
- }
371
- if (isMain) {
372
- (async () => {
373
- try {
374
- await runChatGpt({ headless: false, questionFile: path.join(process.cwd(), "tmp/gpt-question.txt") });
375
- } catch (error) {
376
- console.error("Error running ChatGPT:", error);
377
- }
378
- })();
379
- }
380
-
381
- export {
382
- runChatGpt
383
- };
@@ -1,33 +0,0 @@
1
- /**
2
- * Parse existing .gitattributes file into structured rules
3
- * @param {string} gitattributesPath - Path to .gitattributes file
4
- * @returns {Array} Array of parsed rules
5
- */
6
- export function parseGitAttributes(gitattributesPath: string): any[];
7
- /**
8
- * Check if two patterns conflict (same or overlapping file patterns)
9
- * @param {string} pattern1 - First pattern
10
- * @param {string} pattern2 - Second pattern
11
- * @returns {boolean} True if patterns conflict
12
- */
13
- export function patternsConflict(pattern1: string, pattern2: string): boolean;
14
- /**
15
- * Merge existing rules with desired rules, detecting conflicts
16
- * @param {Array} existingRules - Parsed existing rules
17
- * @param {Array} desiredRules - Desired rules to add
18
- * @returns {Object} Result with mergedRules, conflicts, and changes
19
- */
20
- export function mergeGitAttributeRules(existingRules: any[], desiredRules: any[]): any;
21
- /**
22
- * Format merged rules back into .gitattributes content
23
- * @param {Array} rules - Merged rules array
24
- * @returns {string} Formatted .gitattributes content
25
- */
26
- export function formatGitAttributes(rules: any[]): string;
27
- /**
28
- * Update .gitattributes file with new rules, handling conflicts intelligently
29
- * @param {string} gitattributesPath - Path to .gitattributes file
30
- * @param {Array} desiredRules - Array of desired rules to add/merge
31
- * @returns {Object} Result with success status, conflicts, and changes
32
- */
33
- export function updateGitAttributes(gitattributesPath: string, desiredRules: any[]): any;
@@ -1,223 +0,0 @@
1
- const fs = require("fs");
2
- /**
3
- * Parse existing .gitattributes file into structured rules
4
- * @param {string} gitattributesPath - Path to .gitattributes file
5
- * @returns {Array} Array of parsed rules
6
- */
7
- function parseGitAttributes(gitattributesPath) {
8
- const rules = [];
9
- if (!fs.existsSync(gitattributesPath)) {
10
- return rules;
11
- }
12
- const content = fs.readFileSync(gitattributesPath, "utf8");
13
- const lines = content.split("\n");
14
- lines.forEach((line, index) => {
15
- const trimmedLine = line.trim();
16
- // Skip empty lines and comments
17
- if (!trimmedLine || trimmedLine.startsWith("#")) {
18
- rules.push({
19
- type: trimmedLine.startsWith("#") ? "comment" : "empty",
20
- content: line,
21
- lineNumber: index + 1
22
- });
23
- return;
24
- }
25
- // Parse rule line
26
- const parts = trimmedLine.split(/\s+/);
27
- if (parts.length >= 2) {
28
- const pattern = parts[0];
29
- const attributes = parts.slice(1).join(" ");
30
- rules.push({
31
- type: "rule",
32
- pattern,
33
- attributes,
34
- content: line,
35
- lineNumber: index + 1
36
- });
37
- }
38
- else {
39
- // Invalid line, keep as-is
40
- rules.push({
41
- type: "invalid",
42
- content: line,
43
- lineNumber: index + 1
44
- });
45
- }
46
- });
47
- return rules;
48
- }
49
- /**
50
- * Check if two patterns conflict (same or overlapping file patterns)
51
- * @param {string} pattern1 - First pattern
52
- * @param {string} pattern2 - Second pattern
53
- * @returns {boolean} True if patterns conflict
54
- */
55
- function patternsConflict(pattern1, pattern2) {
56
- // Exact match
57
- if (pattern1 === pattern2) {
58
- return true;
59
- }
60
- // Universal pattern conflicts with everything
61
- if (pattern1 === "*" || pattern2 === "*") {
62
- return pattern1 !== pattern2;
63
- }
64
- // Simple glob overlap detection
65
- const normalize = (p) => p.replace(/\{[^}]+\}/g, "*").replace(/\*+/g, "*");
66
- const norm1 = normalize(pattern1);
67
- const norm2 = normalize(pattern2);
68
- return norm1 === norm2;
69
- }
70
- /**
71
- * Merge existing rules with desired rules, detecting conflicts
72
- * @param {Array} existingRules - Parsed existing rules
73
- * @param {Array} desiredRules - Desired rules to add
74
- * @returns {Object} Result with mergedRules, conflicts, and changes
75
- */
76
- function mergeGitAttributeRules(existingRules, desiredRules) {
77
- let mergedRules;
78
- if (existingRules.length === 0) {
79
- // If no existing rules, just add all desired rules in order
80
- mergedRules = desiredRules.map((desired, idx) => ({
81
- type: "rule",
82
- pattern: desired.pattern,
83
- attributes: desired.attributes,
84
- content: `${desired.pattern} ${desired.attributes}`,
85
- lineNumber: idx + 1,
86
- added: true
87
- }));
88
- return {
89
- mergedRules,
90
- conflicts: [],
91
- changes: desiredRules.map((rule) => ({ action: "added", pattern: rule.pattern, attributes: rule.attributes }))
92
- };
93
- }
94
- else {
95
- mergedRules = [...existingRules];
96
- }
97
- const conflicts = [];
98
- const changes = [];
99
- desiredRules.forEach((desired) => {
100
- // Look for an exact pattern match in existing rules
101
- const existingIdx = mergedRules.findIndex((r) => r.type === "rule" && r.pattern === desired.pattern);
102
- if (existingIdx !== -1) {
103
- const existing = mergedRules[existingIdx];
104
- if (existing.attributes === desired.attributes) {
105
- // Already present, do nothing
106
- conflicts.push({
107
- pattern: desired.pattern,
108
- existing: existing.attributes,
109
- proposed: desired.attributes,
110
- action: "kept existing (identical)"
111
- });
112
- }
113
- else if (desired.priority > (existing.priority || 0)) {
114
- // Replace with higher priority rule
115
- mergedRules[existingIdx] = {
116
- type: "rule",
117
- pattern: desired.pattern,
118
- attributes: desired.attributes,
119
- content: `${desired.pattern} ${desired.attributes}`,
120
- lineNumber: existing.lineNumber,
121
- replaced: true
122
- };
123
- conflicts.push({
124
- pattern: desired.pattern,
125
- existing: existing.attributes,
126
- proposed: desired.attributes,
127
- action: "replaced (higher priority)"
128
- });
129
- changes.push({
130
- action: "replaced",
131
- pattern: desired.pattern,
132
- attributes: desired.attributes,
133
- oldAttributes: existing.attributes
134
- });
135
- }
136
- else {
137
- // Keep existing rule
138
- conflicts.push({
139
- pattern: desired.pattern,
140
- existing: existing.attributes,
141
- proposed: desired.attributes,
142
- action: "kept existing (lower priority)"
143
- });
144
- }
145
- }
146
- else {
147
- // No exact pattern match, add new rule
148
- mergedRules.push({
149
- type: "rule",
150
- pattern: desired.pattern,
151
- attributes: desired.attributes,
152
- content: `${desired.pattern} ${desired.attributes}`,
153
- lineNumber: mergedRules.length + 1,
154
- added: true
155
- });
156
- changes.push({
157
- action: "added",
158
- pattern: desired.pattern,
159
- attributes: desired.attributes
160
- });
161
- }
162
- });
163
- return { mergedRules, conflicts, changes };
164
- }
165
- /**
166
- * Format merged rules back into .gitattributes content
167
- * @param {Array} rules - Merged rules array
168
- * @returns {string} Formatted .gitattributes content
169
- */
170
- function formatGitAttributes(rules) {
171
- return (rules
172
- .map((rule) => {
173
- if (rule.type === "rule") {
174
- return `${rule.pattern} ${rule.attributes}`;
175
- }
176
- return rule.content;
177
- })
178
- .join("\n") + "\n");
179
- }
180
- /**
181
- * Update .gitattributes file with new rules, handling conflicts intelligently
182
- * @param {string} gitattributesPath - Path to .gitattributes file
183
- * @param {Array} desiredRules - Array of desired rules to add/merge
184
- * @returns {Object} Result with success status, conflicts, and changes
185
- */
186
- function updateGitAttributes(gitattributesPath, desiredRules) {
187
- try {
188
- // Parse existing .gitattributes
189
- const existingRules = parseGitAttributes(gitattributesPath);
190
- // Merge rules and detect conflicts
191
- const { mergedRules, conflicts, changes } = mergeGitAttributeRules(existingRules, desiredRules);
192
- // Write updated .gitattributes if changes were made
193
- let success = false;
194
- if (changes.length > 0) {
195
- const newContent = formatGitAttributes(mergedRules);
196
- fs.writeFileSync(gitattributesPath, newContent);
197
- success = true;
198
- }
199
- return {
200
- success,
201
- conflicts,
202
- changes,
203
- message: success
204
- ? `Updated .gitattributes with ${changes.length} changes`
205
- : "No changes needed - all rules already present"
206
- };
207
- }
208
- catch (error) {
209
- return {
210
- success: false,
211
- error: error.message,
212
- conflicts: [],
213
- changes: []
214
- };
215
- }
216
- }
217
- module.exports = {
218
- parseGitAttributes,
219
- patternsConflict,
220
- mergeGitAttributeRules,
221
- formatGitAttributes,
222
- updateGitAttributes
223
- };
package/lib/ps/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- declare const _exports: Function;
2
- export = _exports;