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,7 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
2
  import {
3
- __filename,
4
- __require,
5
3
  init_esm_shims
6
4
  } from "./chunk-QQ4A6DLD.mjs";
7
5
 
@@ -11,10 +9,19 @@ import fs from "fs-extra";
11
9
  import puppeteer from "puppeteer-extra";
12
10
  import StealthPlugin from "puppeteer-extra-plugin-stealth";
13
11
  import path from "upath";
14
- import { pathToFileURL } from "url";
15
12
  var COOKIE_DIR = path.join(process.cwd(), "tmp", "cookies");
16
13
  var DEFAULT_COOKIE_PATH = path.join(COOKIE_DIR, "cookies.json");
14
+ var NAVIGATION_TIMEOUT_MS = 9e4;
15
+ var NETWORK_IDLE_TIMEOUT_MS = 15e3;
16
+ var MAX_INLINE_QUESTION_FILE_BYTES = 2 * 1024;
17
17
  fs.ensureDirSync(COOKIE_DIR);
18
+ async function gotoWithFallback(page, url) {
19
+ await page.goto(url, { waitUntil: "domcontentloaded", timeout: NAVIGATION_TIMEOUT_MS });
20
+ try {
21
+ await page.waitForNetworkIdle({ idleTime: 1e3, timeout: NETWORK_IDLE_TIMEOUT_MS });
22
+ } catch {
23
+ }
24
+ }
18
25
  async function saveCookies(page, path2 = DEFAULT_COOKIE_PATH) {
19
26
  const cookies = await page.cookies();
20
27
  fs.writeFileSync(path2, JSON.stringify(cookies, null, 2));
@@ -33,7 +40,7 @@ async function navigatePage(page, url) {
33
40
  if (cookies) {
34
41
  await page.setCookie(...cookies);
35
42
  }
36
- await page.goto(url, { waitUntil: "networkidle0" });
43
+ await gotoWithFallback(page, url);
37
44
  await page.evaluate(() => {
38
45
  window.__domStillUpdating = true;
39
46
  if (window.__domObserver) {
@@ -73,46 +80,157 @@ function loadCookies(cookieFilePath = DEFAULT_COOKIE_PATH) {
73
80
  return JSON.parse(fs.readFileSync(cookieFilePath));
74
81
  }
75
82
  async function writeQuestion(page, question) {
76
- const questions = question.split("\n");
77
83
  const promptTextarea = await page.waitForSelector("#prompt-textarea", { timeout: 3e4 });
78
84
  if (!promptTextarea) {
79
85
  console.log(
80
86
  "Cannot find the prompt input on the webpage. Please check whether you have access to chat.openai.com without logging in via your browser."
81
87
  );
82
- }
83
- await page.evaluate(() => {
84
- document.querySelector("#prompt-textarea").innerHTML = `<p></p>`;
85
- });
86
- if (questions.length === 1) {
87
- await page.type("#prompt-textarea", questions[0], { delay: 100 });
88
88
  return;
89
89
  }
90
- for (const q of questions) {
91
- await page.type("#prompt-textarea", q, { delay: 100 });
92
- if (q !== questions[questions.length - 1]) {
93
- await page.keyboard.down("Shift");
94
- await page.keyboard.press("Enter");
95
- await page.keyboard.up("Shift");
90
+ await page.evaluate((text) => {
91
+ const promptEl = document.querySelector("#prompt-textarea");
92
+ if (!promptEl) {
93
+ return;
94
+ }
95
+ promptEl.focus();
96
+ promptEl.innerHTML = "";
97
+ const lines = String(text).split("\n");
98
+ for (const line of lines) {
99
+ const p = document.createElement("p");
100
+ p.textContent = line;
101
+ promptEl.appendChild(p);
96
102
  }
103
+ promptEl.dispatchEvent(new InputEvent("beforeinput", { bubbles: true, inputType: "insertFromPaste", data: text }));
104
+ promptEl.dispatchEvent(new InputEvent("input", { bubbles: true, inputType: "insertFromPaste", data: text }));
105
+ promptEl.dispatchEvent(new Event("change", { bubbles: true }));
106
+ }, question);
107
+ const hasPromptText = await page.evaluate(() => {
108
+ const promptEl = document.querySelector("#prompt-textarea");
109
+ return Boolean(promptEl && promptEl.textContent && promptEl.textContent.trim().length > 0);
110
+ });
111
+ if (!hasPromptText) {
112
+ console.log("Prompt state not updated by DOM injection. Falling back to keyboard insertText.");
113
+ await promptTextarea.click({ clickCount: 1 });
114
+ await page.keyboard.down("Control");
115
+ await page.keyboard.press("KeyA");
116
+ await page.keyboard.up("Control");
117
+ await page.keyboard.insertText(question);
97
118
  }
98
119
  }
99
120
  async function clickSubmitButton(page) {
121
+ console.log("Attempting to click the submit button...");
100
122
  try {
101
- const fruitjuiceSendButton = await page.evaluate(() => {
102
- return document.querySelector('[data-testid="fruitjuice-send-button"]') !== null;
123
+ const userMessageCountBefore = await page.$$eval(
124
+ '[data-message-author-role="user"]',
125
+ (elements) => elements.length
126
+ );
127
+ const waitForSubmit = async (timeout = 5e3) => {
128
+ try {
129
+ await page.waitForFunction(
130
+ (previousCount) => {
131
+ const currentCount = document.querySelectorAll('[data-message-author-role="user"]').length;
132
+ return currentCount > previousCount;
133
+ },
134
+ { timeout },
135
+ userMessageCountBefore
136
+ );
137
+ return true;
138
+ } catch {
139
+ return false;
140
+ }
141
+ };
142
+ await page.waitForFunction(
143
+ () => {
144
+ const candidates = [
145
+ document.querySelector('[data-testid="fruitjuice-send-button"]'),
146
+ document.querySelector("#composer-submit-button"),
147
+ document.querySelector('[data-testid="send-button"]')
148
+ ].filter(Boolean);
149
+ return candidates.some((button) => {
150
+ const isDisabled = button.disabled || button.getAttribute("aria-disabled") === "true";
151
+ const isVisible = button.offsetParent !== null;
152
+ return !isDisabled && isVisible;
153
+ });
154
+ },
155
+ { timeout: 5e3 }
156
+ ).catch(() => {
157
+ });
158
+ const buttonDetails = await page.evaluate(() => {
159
+ const selectors = [
160
+ '[data-testid="fruitjuice-send-button"]',
161
+ "#composer-submit-button",
162
+ '[data-testid="send-button"]'
163
+ ];
164
+ const details = selectors.map((selector) => {
165
+ const el = document.querySelector(selector);
166
+ const exists = Boolean(el);
167
+ const disabled = exists ? Boolean(el.disabled || el.getAttribute("aria-disabled") === "true") : null;
168
+ const visible = exists ? el.offsetParent !== null : null;
169
+ return { selector, exists, disabled, visible };
170
+ });
171
+ return details;
103
172
  });
104
- const sendButton = await page.evaluate(() => {
105
- return document.querySelector('[data-testid="send-button"]') !== null;
173
+ console.log(`Submit button details: ${JSON.stringify(buttonDetails)}`);
174
+ const clickable = buttonDetails.find((item) => item.exists && item.visible && item.disabled === false);
175
+ const selectedSelector = clickable ? clickable.selector : null;
176
+ if (selectedSelector) {
177
+ await page.click(selectedSelector);
178
+ console.log(`Clicked submit button selector: ${selectedSelector}`);
179
+ if (await waitForSubmit(5e3)) {
180
+ console.log("Submission detected after selector click.");
181
+ return true;
182
+ }
183
+ const forcedClickWorked = await page.evaluate((selector) => {
184
+ const el = document.querySelector(selector);
185
+ if (!el) {
186
+ return false;
187
+ }
188
+ el.click();
189
+ return true;
190
+ }, selectedSelector);
191
+ if (forcedClickWorked) {
192
+ console.log(`Forced DOM click on selector: ${selectedSelector}`);
193
+ if (await waitForSubmit(5e3)) {
194
+ console.log("Submission detected after forced DOM click.");
195
+ return true;
196
+ }
197
+ }
198
+ }
199
+ console.log("Submit button path did not submit. Trying Enter key fallback on prompt.");
200
+ await page.focus("#prompt-textarea");
201
+ await page.keyboard.press("Enter");
202
+ if (await waitForSubmit(5e3)) {
203
+ console.log("Submission detected after Enter key fallback.");
204
+ return true;
205
+ }
206
+ const didRequestSubmit = await page.evaluate(() => {
207
+ const prompt = document.querySelector("#prompt-textarea");
208
+ if (!prompt) {
209
+ return false;
210
+ }
211
+ const form = prompt.closest("form");
212
+ if (!form) {
213
+ return false;
214
+ }
215
+ if (typeof form.requestSubmit === "function") {
216
+ form.requestSubmit();
217
+ } else {
218
+ form.submit();
219
+ }
220
+ return true;
106
221
  });
107
- if (fruitjuiceSendButton) {
108
- await page.click('[data-testid="fruitjuice-send-button"]');
109
- } else if (sendButton) {
110
- await page.click('[data-testid="send-button"]');
111
- } else {
112
- console.log("Neither send button is present");
222
+ if (didRequestSubmit) {
223
+ console.log("Triggered form submit fallback.");
224
+ if (await waitForSubmit(5e3)) {
225
+ console.log("Submission detected after form submit fallback.");
226
+ return true;
227
+ }
113
228
  }
229
+ console.log("Failed to submit prompt after all strategies.");
230
+ return false;
114
231
  } catch (e) {
115
232
  console.log(`Failed to click the send button: ${e}`);
233
+ return false;
116
234
  }
117
235
  }
118
236
  var lastMessageId = null;
@@ -185,11 +303,15 @@ async function isLoggedIn(page) {
185
303
  return result === true;
186
304
  }
187
305
  async function createBrowser(browserOptions = {}) {
306
+ const windowsChromeExecutable = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
307
+ const hasWindowsChrome = process.platform === "win32" && fs.existsSync(windowsChromeExecutable);
188
308
  const defaultOptions = {
189
309
  headless: false,
310
+ defaultViewport: null,
190
311
  userDataDir: path.join(process.cwd(), "tmp/puppeteer-profile"),
191
312
  // Windows-specific options to handle browser launch issues
192
313
  args: [
314
+ "--start-maximized",
193
315
  "--no-sandbox",
194
316
  "--disable-setuid-sandbox",
195
317
  "--disable-dev-shm-usage",
@@ -202,10 +324,9 @@ async function createBrowser(browserOptions = {}) {
202
324
  "--disable-renderer-backgrounding"
203
325
  ],
204
326
  ignoreDefaultArgs: ["--disable-extensions"],
205
- ...process.platform === "win32" && {
206
- // Additional Windows-specific options
207
- executablePath: void 0
208
- // Let Puppeteer find Chrome automatically
327
+ ...hasWindowsChrome && {
328
+ // Prefer local Chrome installation when present on Windows.
329
+ executablePath: windowsChromeExecutable
209
330
  }
210
331
  };
211
332
  try {
@@ -215,8 +336,12 @@ async function createBrowser(browserOptions = {}) {
215
336
  try {
216
337
  return await puppeteer.use(StealthPlugin()).launch({
217
338
  headless: browserOptions.headless || false,
218
- args: ["--no-sandbox", "--disable-setuid-sandbox"],
339
+ defaultViewport: null,
340
+ args: ["--start-maximized", "--no-sandbox", "--disable-setuid-sandbox"],
219
341
  ignoreDefaultArgs: false,
342
+ ...hasWindowsChrome && {
343
+ executablePath: windowsChromeExecutable
344
+ },
220
345
  ...browserOptions
221
346
  });
222
347
  } catch (fallbackError) {
@@ -241,7 +366,11 @@ async function loginToChatGpt() {
241
366
  if (loginButtonExists) {
242
367
  console.log("Login button found, clicking to log in...");
243
368
  await page.click('[data-testid="login-button"]');
244
- await page.waitForNavigation({ waitUntil: "networkidle0" });
369
+ await page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: NAVIGATION_TIMEOUT_MS });
370
+ try {
371
+ await page.waitForNetworkIdle({ idleTime: 1e3, timeout: NETWORK_IDLE_TIMEOUT_MS });
372
+ } catch {
373
+ }
245
374
  console.log("Login process completed.");
246
375
  } else {
247
376
  console.log("No login required - user appears to be already logged in.");
@@ -251,6 +380,7 @@ async function runChatGpt(chatgptOptions = {}) {
251
380
  const headless = chatgptOptions.headless !== void 0 ? chatgptOptions.headless : true;
252
381
  const questionFile = chatgptOptions.questionFile;
253
382
  let question = chatgptOptions.question;
383
+ let shouldUploadQuestionFile = Boolean(questionFile);
254
384
  const responseFile = chatgptOptions.responseFile || path.join(process.cwd(), "tmp", "response.txt");
255
385
  const noInputProvided = !question && !questionFile;
256
386
  const questionIsEmpty = question && question.trim().length === 0;
@@ -258,6 +388,22 @@ async function runChatGpt(chatgptOptions = {}) {
258
388
  if (noInputProvided || questionIsEmpty || questionFileIsEmpty) {
259
389
  throw new Error("You must provide a question or a question file.");
260
390
  }
391
+ if (!question && questionFile) {
392
+ if (!fs.existsSync(questionFile)) {
393
+ throw new Error(`Question file does not exist: ${questionFile}`);
394
+ }
395
+ const questionFileStats = fs.statSync(questionFile);
396
+ if (questionFileStats.size <= MAX_INLINE_QUESTION_FILE_BYTES) {
397
+ question = fs.readFileSync(questionFile, "utf8").trim();
398
+ if (!question) {
399
+ throw new Error("Question file is empty.");
400
+ }
401
+ shouldUploadQuestionFile = false;
402
+ console.log(
403
+ `Question file is ${questionFileStats.size} bytes (<= ${MAX_INLINE_QUESTION_FILE_BYTES}). Sending as text prompt.`
404
+ );
405
+ }
406
+ }
261
407
  let browser;
262
408
  try {
263
409
  browser = await createBrowser({ headless });
@@ -270,7 +416,16 @@ async function runChatGpt(chatgptOptions = {}) {
270
416
  console.error("4. Close any running Chrome instances and try again");
271
417
  throw error;
272
418
  }
273
- const page = (await browser.pages()).length > 0 ? (await browser.pages())[0] : await browser.newPage();
419
+ const allPages = await browser.pages();
420
+ const page = allPages.length > 0 ? allPages[0] : await browser.newPage();
421
+ await page.bringToFront();
422
+ if (allPages.length > 1) {
423
+ for (const p of allPages) {
424
+ if (p !== page) {
425
+ await p.close();
426
+ }
427
+ }
428
+ }
274
429
  try {
275
430
  const url = "https://chat.openai.com";
276
431
  const navigate = await navigatePage(page, url);
@@ -289,12 +444,15 @@ async function runChatGpt(chatgptOptions = {}) {
289
444
  }
290
445
  if (question) {
291
446
  await writeQuestion(page, question);
292
- await clickSubmitButton(page);
447
+ const didSubmit = await clickSubmitButton(page);
448
+ if (!didSubmit) {
449
+ throw new Error("Prompt was not submitted. The composer button may be disabled or blocked.");
450
+ }
293
451
  await navigate.waitForDomIdle(1e3, 3e4);
294
452
  await waitForInitialResponse(page);
295
453
  await handleStreamingResponse(page, responseFile);
296
454
  await saveCookies(page, getCookiePathForUrl(url));
297
- } else if (questionFile) {
455
+ } else if (shouldUploadQuestionFile && questionFile) {
298
456
  await navigate.waitForDomIdle(2e3, 1e4);
299
457
  const isUserLoggedIn = await isLoggedIn(page);
300
458
  console.log(`Login status: ${isUserLoggedIn ? "Logged in" : "Not logged in"}`);
@@ -333,7 +491,10 @@ async function runChatGpt(chatgptOptions = {}) {
333
491
  await fileInput.uploadFile(questionFile);
334
492
  await navigate.waitForDomIdle(2e3, 15e3);
335
493
  console.log("File uploaded successfully");
336
- await clickSubmitButton(page);
494
+ const didSubmit = await clickSubmitButton(page);
495
+ if (!didSubmit) {
496
+ throw new Error("Prompt was not submitted after file upload.");
497
+ }
337
498
  await navigate.waitForDomIdle(1e3, 3e4);
338
499
  await waitForInitialResponse(page);
339
500
  await handleStreamingResponse(page, responseFile);
@@ -353,32 +514,6 @@ async function runChatGpt(chatgptOptions = {}) {
353
514
  }
354
515
  }
355
516
  }
356
- var isMain = false;
357
- try {
358
- const mainArg = process.argv[1] && path.resolve(process.argv[1]);
359
- const currentScript = __filename && path.resolve(__filename);
360
- if (typeof __require !== "undefined" && typeof module !== "undefined" && (__require.main === module || mainArg && currentScript && mainArg === currentScript)) {
361
- isMain = true;
362
- }
363
- console.log("[chatgpt.js][CJS check]", typeof __require, typeof module, __require.main === module);
364
- console.log("[chatgpt.js][CJS check]", mainArg, currentScript);
365
- } catch (_e) {
366
- }
367
- try {
368
- const mainArg = process.argv[1] && path.resolve(process.argv[1]);
369
- if (mainArg && import.meta.url === pathToFileURL(mainArg).href) {
370
- isMain = true;
371
- }
372
- } catch (_e) {
373
- }
374
- if (isMain) {
375
- (async () => {
376
- try {
377
- } catch (error) {
378
- console.error("Error running ChatGPT:", error);
379
- }
380
- })();
381
- }
382
517
 
383
518
  export {
384
519
  runChatGpt
@@ -0,0 +1,105 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import {
3
+ __commonJS,
4
+ __require,
5
+ init_esm_shims
6
+ } from "./chunk-QQ4A6DLD.mjs";
7
+
8
+ // src/utils/findEnvFiles.cjs
9
+ var require_findEnvFiles = __commonJS({
10
+ "src/utils/findEnvFiles.cjs"(exports, module) {
11
+ init_esm_shims();
12
+ var fs = __require("fs");
13
+ var path = __require("path");
14
+ var glob = __require("glob");
15
+ var DEFAULT_IGNORES = [
16
+ "**/node_modules/**",
17
+ "**/.git/**",
18
+ "**/.yarn/**",
19
+ "**/.pnpm/**",
20
+ "**/dist/**",
21
+ "**/build/**",
22
+ "**/coverage/**",
23
+ "**/vendor/**",
24
+ "**/tmp/**",
25
+ "**/.cache/**",
26
+ "**/assets/**",
27
+ "**/logs/**",
28
+ "**/output/**",
29
+ "**/public/**",
30
+ "**/static/**",
31
+ "**/temp/**",
32
+ "**/backup/**",
33
+ "**/backups/**",
34
+ "**/examples/**",
35
+ "**/docs/**",
36
+ "**/tests/**",
37
+ "**/__tests__/**",
38
+ "**/spec/**",
39
+ "**/__specs__/**",
40
+ "**/scripts/**",
41
+ "**/bin/**",
42
+ "**/hooks/**",
43
+ "**/config/**",
44
+ "**/configs/**",
45
+ "**/settings/**",
46
+ "**/.vscode/**",
47
+ "**/.idea/**"
48
+ ];
49
+ function findEnvFiles(startDir = process.cwd(), filter) {
50
+ const found = /* @__PURE__ */ new Set();
51
+ function addFile(file) {
52
+ const normalized = path.normalize(file);
53
+ if (typeof filter === "function" && !filter(normalized)) {
54
+ return;
55
+ }
56
+ found.add(normalized);
57
+ }
58
+ let current = path.resolve(startDir);
59
+ while (true) {
60
+ const envPath = path.join(current, ".env");
61
+ if (fs.existsSync(envPath)) {
62
+ addFile(envPath);
63
+ }
64
+ const parent = path.dirname(current);
65
+ if (parent === current) {
66
+ break;
67
+ }
68
+ current = parent;
69
+ }
70
+ const files = glob.globSync("**/.env*", {
71
+ cwd: startDir,
72
+ absolute: true,
73
+ nodir: true,
74
+ ignore: DEFAULT_IGNORES
75
+ });
76
+ for (const file of files) {
77
+ addFile(file);
78
+ }
79
+ return [...found];
80
+ }
81
+ function findEnvWithToken(startDir = process.cwd(), tokenName = "GITHUB_TOKEN") {
82
+ const envFiles = findEnvFiles(startDir);
83
+ return envFiles.find((file) => {
84
+ try {
85
+ const content = fs.readFileSync(file, "utf-8");
86
+ const regex = new RegExp(`^\\s*${tokenName}\\s*=`, "m");
87
+ return regex.test(content);
88
+ } catch (err) {
89
+ console.warn(`Failed to read ${file}: ${err instanceof Error ? err.message : String(err)}`);
90
+ return false;
91
+ }
92
+ });
93
+ }
94
+ module.exports = {
95
+ DEFAULT_IGNORES,
96
+ findEnvFiles,
97
+ findEnvWithToken,
98
+ default: findEnvFiles
99
+ };
100
+ }
101
+ });
102
+
103
+ export {
104
+ require_findEnvFiles
105
+ };
@@ -0,0 +1,79 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import {
3
+ require_package
4
+ } from "./chunk-ZOWVMII3.mjs";
5
+ import {
6
+ __commonJS,
7
+ __dirname,
8
+ __require,
9
+ init_esm_shims
10
+ } from "./chunk-QQ4A6DLD.mjs";
11
+
12
+ // src/binary-collections/findScript.cjs
13
+ var require_findScript = __commonJS({
14
+ "src/binary-collections/findScript.cjs"(exports, module) {
15
+ init_esm_shims();
16
+ var { glob } = __require("glob");
17
+ var path = __require("upath");
18
+ var fs = __require("fs-extra");
19
+ var pkgJson = require_package();
20
+ function findScript(scriptName, searchDir = null) {
21
+ if (!searchDir) searchDir = path.join(__dirname, "..");
22
+ let result;
23
+ const ignorePatterns = [
24
+ `**/*config*.{cjs,js,mjs}`,
25
+ `**/utils.{cjs,js,mjs}`,
26
+ `**/index.{cjs,js,mjs}`,
27
+ `**/chunk-*.{cjs,js,mjs}`,
28
+ `**/*.d.{ts,cts,mts}`
29
+ // ignore TypeScript declaration files
30
+ ];
31
+ try {
32
+ const pattern = `${scriptName}.{cjs,js,mjs}`;
33
+ const files = glob.sync(pattern, {
34
+ cwd: searchDir,
35
+ ignore: ignorePatterns,
36
+ absolute: true
37
+ });
38
+ if (files.length > 0) {
39
+ result = files[0];
40
+ } else {
41
+ if (pkgJson.bin[scriptName]) {
42
+ const find = [
43
+ path.join(searchDir, pkgJson.bin[scriptName]),
44
+ path.join(process.cwd(), "node_modules/binary-collections", pkgJson.bin[scriptName]),
45
+ path.join(__dirname, pkgJson.bin[scriptName]),
46
+ path.join(path.join(__dirname, ".."), pkgJson.bin[scriptName]),
47
+ path.join(path.join(__dirname, "../.."), pkgJson.bin[scriptName])
48
+ ];
49
+ const filtered = find.filter((file) => fs.existsSync(file));
50
+ if (filtered.length > 0) {
51
+ result = filtered[0];
52
+ } else {
53
+ console.warn(`\u26A0\uFE0F Script "${scriptName}" not found in ${searchDir}.`);
54
+ console.warn(`\u{1F50D} Searched for: ${pattern} in ${searchDir}`);
55
+ }
56
+ }
57
+ }
58
+ } catch (error) {
59
+ console.error(`\u{1F50D} Error searching for script: ${error.message}`);
60
+ }
61
+ if (result && !result.includes("-cli")) {
62
+ const ext = path.extname(result);
63
+ const filename = path.basename(result, ext);
64
+ const cliFile = path.join(path.dirname(result), `${filename}-cli${ext}`);
65
+ if (fs.existsSync(cliFile)) {
66
+ result = cliFile;
67
+ console.log(`\u{1F50D} Found CLI version: ${cliFile}`);
68
+ }
69
+ }
70
+ return result;
71
+ }
72
+ module.exports = findScript;
73
+ module.exports.default = findScript;
74
+ }
75
+ });
76
+
77
+ export {
78
+ require_findScript
79
+ };
@@ -0,0 +1,28 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import {
3
+ init_esm_shims
4
+ } from "./chunk-QQ4A6DLD.mjs";
5
+
6
+ // src/file/move.mjs
7
+ init_esm_shims();
8
+ import fs from "fs-extra";
9
+ import path from "upath";
10
+ async function move(src, dest) {
11
+ if (!await fs.pathExists(src)) {
12
+ throw new Error(`Source file does not exist: ${src}`);
13
+ }
14
+ const srcStat = await fs.stat(src);
15
+ let finalDest = dest;
16
+ if (srcStat.isFile()) {
17
+ const destStat = await fs.pathExists(dest) ? await fs.stat(dest) : null;
18
+ if (destStat && destStat.isDirectory()) {
19
+ finalDest = path.join(dest, path.basename(src));
20
+ }
21
+ }
22
+ await fs.ensureDir(path.dirname(finalDest));
23
+ await fs.move(src, finalDest, { overwrite: true });
24
+ }
25
+
26
+ export {
27
+ move
28
+ };