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.
- package/.opencode/package.json +5 -0
- package/.puppeterrc.cjs +25 -0
- package/binaries/binary-executor.cjs +138 -3
- package/binaries/clean-nodemodule.cjs +138 -3
- package/binaries/clean-nodemodules.cjs +138 -3
- package/binaries/dev.cjs +138 -3
- package/binaries/empty.cjs +138 -3
- package/binaries/git-reduce-size.cjs +138 -3
- package/binaries/javakill.cjs +138 -3
- package/binaries/kill-night-crows.bat +7 -0
- package/binaries/kill-night-crows.ps1 +172 -0
- package/binaries/kill-process.cjs +138 -3
- package/binaries/nodekill.cjs +138 -3
- package/binaries/prod.cjs +138 -3
- package/binaries/py +111 -0
- package/binaries/py.cjs +178 -0
- package/binaries/py.cmd +49 -0
- package/binaries/rmfind.cjs +138 -3
- package/binaries/rmx +15 -1
- package/binaries/rmx.cjs +138 -3
- package/binaries/rmx.cmd +12 -0
- package/binaries/submodule-token.cjs +138 -3
- package/binaries/test-cjs +18 -0
- package/binaries/test-cjs.cjs +178 -0
- package/binaries/test-cjs.cmd +26 -0
- package/binaries/test-esm +16 -0
- package/binaries/test-esm.cjs +178 -0
- package/binaries/test-esm.cmd +23 -0
- package/binaries/yarn-clean +32 -0
- package/binaries/yarn-clean.cjs +178 -0
- package/binaries/yarn-clean.cmd +30 -0
- package/binaries/yarn-clean.py +166 -0
- package/binaries/yc +110 -0
- package/binaries/yc.cjs +178 -0
- package/lib/binary-collections/config.cjs +126 -0
- package/lib/binary-collections/config.mjs +7 -0
- package/lib/binary-collections/executeScript.cjs +19 -0
- package/lib/binary-collections/executeScript.d.cts +12 -0
- package/lib/binary-collections/executeScript.mjs +6 -0
- package/lib/binary-collections/findScript.cjs +284 -0
- package/lib/binary-collections/findScript.d.cts +12 -0
- package/lib/binary-collections/findScript.mjs +7 -0
- package/lib/binary-collections/listScript.cjs +266 -0
- package/lib/binary-collections/listScript.d.cts +19 -0
- package/lib/binary-collections/listScript.mjs +7 -0
- package/lib/binary-collections.cjs +342 -194
- package/lib/binary-collections.mjs +22 -268
- package/lib/changelog.cjs +61 -13
- package/lib/changelog.mjs +1 -1
- package/lib/{chunk-E6FDDAOO.mjs → chunk-2LSRSEXF.mjs} +2 -2
- package/lib/chunk-34IQDTLZ.mjs +27 -0
- package/lib/chunk-3HFFECCI.mjs +27 -0
- package/lib/{chunk-V3N3JEUF.mjs → chunk-5RTXZVCW.mjs} +60 -13
- package/lib/chunk-66KDU4TX.mjs +268 -0
- package/lib/chunk-6PU7BAHB.mjs +61 -0
- package/lib/{chunk-6HHJRKFB.mjs → chunk-BZWVHODJ.mjs} +4 -1
- package/lib/chunk-C6D2TTYU.mjs +32 -0
- package/lib/chunk-FB2WKVJD.mjs +158 -0
- package/lib/{chunk-66PAU5PS.mjs → chunk-G5UUEWUO.mjs} +9 -5
- package/lib/{chunk-HO6GHCOB.mjs → chunk-GAGABICI.mjs} +198 -63
- package/lib/chunk-H44UWUFY.mjs +105 -0
- package/lib/chunk-NCZPTKDV.mjs +79 -0
- package/lib/chunk-NGFK3EYW.mjs +28 -0
- package/lib/chunk-NVEG3LEZ.mjs +143 -0
- package/lib/chunk-OGXVGBRI.mjs +29 -0
- package/lib/chunk-OXV52GD5.mjs +62 -0
- package/lib/{chunk-PDSXF5HY.mjs → chunk-PDN26I7O.mjs} +1 -0
- package/lib/chunk-PXBMHE7O.mjs +35 -0
- package/lib/chunk-R5FJOR63.mjs +47 -0
- package/lib/chunk-SPTECFE5.mjs +180 -0
- package/lib/chunk-UXCFNAR6.mjs +55 -0
- package/lib/chunk-V2IBPCEV.mjs +39 -0
- package/lib/chunk-XPJGCDOD.mjs +14 -0
- package/lib/{chunk-AI4CVPJ7.mjs → chunk-ZDMWBSYF.mjs} +4 -4
- package/lib/chunk-ZOWVMII3.mjs +228 -0
- package/lib/clean-github-actions-caches-cli.cjs +465 -0
- package/lib/clean-github-actions-caches-cli.d.cts +1 -0
- package/lib/clean-github-actions-caches-cli.mjs +56 -0
- package/lib/clean-github-actions-caches.cjs +152 -160
- package/lib/clean-github-actions-caches.d.cts +15 -1
- package/lib/clean-github-actions-caches.mjs +4 -130
- package/lib/cross-env/command.cjs +63 -0
- package/lib/cross-env/command.d.ts +8 -0
- package/lib/cross-env/command.js +45 -0
- package/lib/cross-env/command.mjs +9 -0
- package/lib/cross-env/index.cjs +178 -0
- package/lib/cross-env/index.d.ts +8 -0
- package/lib/cross-env/index.js +102 -0
- package/lib/cross-env/index.mjs +101 -0
- package/lib/cross-env/variable.cjs +60 -0
- package/lib/cross-env/variable.d.ts +7 -0
- package/lib/cross-env/variable.js +59 -0
- package/lib/cross-env/variable.mjs +9 -0
- package/lib/del-gradle.cjs +61 -13
- package/lib/del-gradle.js +9 -8
- package/lib/del-gradle.mjs +1 -1
- package/lib/del-node-modules.cjs +143 -148
- package/lib/del-node-modules.js +210 -14
- package/lib/del-node-modules.mjs +148 -17
- package/lib/del-ps.cjs +61 -13
- package/lib/del-ps.js +9 -8
- package/lib/del-ps.mjs +1 -1
- package/lib/del-yarn-caches.cjs +61 -13
- package/lib/del-yarn-caches.js +2 -2
- package/lib/del-yarn-caches.mjs +1 -1
- package/lib/file/copy-cli.cjs +92 -0
- package/lib/file/copy-cli.d.mts +1 -0
- package/lib/file/copy-cli.mjs +55 -0
- package/lib/file/copy.cjs +56 -0
- package/lib/file/copy.d.mts +1 -0
- package/lib/file/copy.mjs +8 -0
- package/lib/file/move-cli.cjs +91 -0
- package/lib/file/move-cli.d.mts +1 -0
- package/lib/file/move-cli.mjs +55 -0
- package/lib/file/move.cjs +55 -0
- package/lib/file/move.d.mts +1 -0
- package/lib/file/move.mjs +8 -0
- package/lib/find-node-modules-cli.js +2 -1
- package/lib/free-chatgpt.cjs +259 -47
- package/lib/free-chatgpt.js +10 -10
- package/lib/free-chatgpt.mjs +2 -2
- package/lib/git/gitattributes.cjs +1 -0
- package/lib/git/gitattributes.d.cts +7 -2
- package/lib/git/gitattributes.mjs +1 -1
- package/lib/git/line-endings.cjs +2 -1
- package/lib/git/line-endings.mjs +2 -2
- package/lib/git/undo-commit-cli.cjs +110 -0
- package/lib/git/undo-commit-cli.d.ts +1 -0
- package/lib/git/undo-commit-cli.js +4 -0
- package/lib/git/undo-commit-cli.mjs +14 -0
- package/lib/git/undo-commit.cjs +81 -0
- package/lib/git/undo-commit.d.cts +1 -0
- package/lib/git/undo-commit.mjs +7 -0
- package/lib/git/undo-staged-cli.cjs +110 -0
- package/lib/git/undo-staged-cli.d.ts +1 -0
- package/lib/git/undo-staged-cli.js +4 -0
- package/lib/git/undo-staged-cli.mjs +14 -0
- package/lib/git/undo-staged.cjs +81 -0
- package/lib/git/undo-staged.d.cts +1 -0
- package/lib/git/undo-staged.mjs +7 -0
- package/lib/git/user-config.cjs +61 -14
- package/lib/git/user-config.mjs +2 -2
- package/lib/git-diff-cli.cjs +427 -75
- package/lib/git-diff-cli.d.ts +1 -0
- package/lib/git-diff-cli.js +1 -0
- package/lib/git-diff-cli.mjs +6 -4
- package/lib/git-diff.cjs +426 -75
- package/lib/git-diff.d.ts +2 -1
- package/lib/git-diff.js +91 -34
- package/lib/git-diff.mjs +5 -4
- package/lib/git-fix.cjs +64 -16
- package/lib/git-fix.mjs +10 -10
- package/lib/git-purge.cjs +61 -13
- package/lib/git-purge.mjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/kill-night-crows.cjs +87 -0
- package/lib/kill-night-crows.d.mts +1 -0
- package/lib/kill-night-crows.mjs +65 -0
- package/lib/node-cache-cleaner/npm.cjs +65 -0
- package/lib/node-cache-cleaner/npm.d.ts +2 -0
- package/lib/node-cache-cleaner/npm.js +41 -0
- package/lib/node-cache-cleaner/npm.mjs +10 -0
- package/lib/node-cache-cleaner/npx.cjs +89 -0
- package/lib/node-cache-cleaner/npx.d.ts +4 -0
- package/lib/node-cache-cleaner/npx.js +82 -0
- package/lib/{ps/index.d.mjs → node-cache-cleaner/npx.mjs} +6 -5
- package/lib/node-cache-cleaner/yarn.cjs +73 -0
- package/lib/node-cache-cleaner/yarn.d.ts +2 -0
- package/lib/node-cache-cleaner/yarn.js +62 -0
- package/lib/node-cache-cleaner/yarn.mjs +10 -0
- package/lib/node-cache-cleaner-cli.cjs +182 -0
- package/lib/node-cache-cleaner-cli.d.ts +2 -0
- package/lib/node-cache-cleaner-cli.js +60 -0
- package/lib/node-cache-cleaner-cli.mjs +56 -0
- package/lib/node-executor.cjs +91 -0
- package/lib/node-executor.d.cts +2 -0
- package/lib/node-executor.mjs +103 -0
- package/lib/npm-run-series.cjs +79 -39
- package/lib/npm-run-series.mjs +20 -6
- package/lib/package-resolutions-updater-cli.cjs +645 -0
- package/lib/package-resolutions-updater-cli.d.mts +1 -0
- package/lib/package-resolutions-updater-cli.mjs +102 -0
- package/lib/package-resolutions-updater.cjs +259 -133
- package/lib/package-resolutions-updater.d.mts +51 -1
- package/lib/package-resolutions-updater.mjs +18 -294
- package/lib/php-cs-fixer-staged.cjs +105 -0
- package/lib/php-cs-fixer-staged.d.cts +2 -0
- package/lib/php-cs-fixer-staged.mjs +117 -0
- package/lib/print-directory-tree.cjs +62 -14
- package/lib/print-directory-tree.mjs +2 -2
- package/lib/ps/connected-domain.d.ts +1 -1
- package/lib/ps/connected-domain.js +10 -10
- package/lib/ps/index.cjs +1 -1
- package/lib/ps/index.mjs +177 -171
- package/lib/ps/isWin.js +1 -1
- package/lib/ps/table-parser.js +6 -6
- package/lib/remove-module.cjs +61 -13
- package/lib/remove-module.mjs +1 -1
- package/lib/rm-node-module-cli.cjs +222 -0
- package/lib/rm-node-module-cli.d.cts +1 -0
- package/lib/rm-node-module-cli.mjs +89 -0
- package/lib/rm-node-modules.cjs +127 -0
- package/lib/rm-node-modules.d.cts +35 -0
- package/lib/{binary-collections-config.mjs → rm-node-modules.mjs} +3 -3
- package/lib/rmpath.cjs +63 -15
- package/lib/rmpath.mjs +2 -2
- package/lib/submodule-install.cjs +107 -47
- package/lib/submodule-install.mjs +48 -35
- package/lib/submodule-remove-cli.cjs +6 -3
- package/lib/submodule-remove-cli.js +3 -3
- package/lib/submodule-remove-cli.mjs +2 -3
- package/lib/submodule-remove.cjs +4 -1
- package/lib/submodule-remove.mjs +1 -1
- package/lib/utils/chatgpt.cjs +198 -34
- package/lib/utils/chatgpt.js +260 -93
- package/lib/utils/chatgpt.mjs +1 -1
- package/lib/utils/findEnvFiles.cjs +89 -0
- package/lib/utils/findEnvFiles.d.cts +19 -0
- package/lib/utils/findEnvFiles.mjs +6 -0
- package/lib/utils/findWorkspaceRoot.cjs +70 -0
- package/lib/utils/findWorkspaceRoot.d.ts +9 -0
- package/lib/utils/findWorkspaceRoot.js +57 -0
- package/lib/utils/findWorkspaceRoot.mjs +40 -0
- package/lib/utils/index.cjs +60 -13
- package/lib/utils/index.mjs +1 -1
- package/lib/utils/isGithubTokenValid.cjs +64 -0
- package/lib/utils/isGithubTokenValid.d.ts +7 -0
- package/lib/utils/isGithubTokenValid.js +48 -0
- package/lib/utils/isGithubTokenValid.mjs +36 -0
- package/lib/{ps/index.d.cjs → utils/isWindows.cjs} +17 -3
- package/lib/utils/isWindows.d.ts +5 -0
- package/lib/utils/isWindows.js +10 -0
- package/lib/utils/isWindows.mjs +8 -0
- package/lib/utils/runBash.cjs +53 -0
- package/lib/utils/runBash.d.cts +12 -0
- package/lib/utils/runBash.mjs +66 -0
- package/lib/yarn-per-branch-lock-installer.cjs +97 -0
- package/lib/yarn-per-branch-lock-installer.d.cts +2 -0
- package/lib/yarn-per-branch-lock-installer.mjs +109 -0
- package/lib/yarn-reinstall.cjs +61 -13
- package/lib/yarn-reinstall.mjs +1 -1
- package/package.json +133 -110
- package/readme.html +784 -0
- package/readme.md +116 -229
- package/releases/readme.md +1 -1
- package/requirements.txt +1 -0
- package/test/README.md +2 -2
- package/test-project/package.json +8 -2
- package/test-project/workspaces/workspace-a/package.json +135 -0
- package/test-project/workspaces/workspace-a/readme.md +20 -0
- package/test-project/workspaces/workspace-a/release/readme.md +42 -0
- package/test-project/workspaces/workspace-a/test/demo/package.json +25 -0
- package/test-project/workspaces/workspace-a/test/readme.md +12 -0
- package/test-project/workspaces/workspace-b/package.json +139 -0
- package/test-project/workspaces/workspace-b/readme.md +94 -0
- package/test-project/workspaces/workspace-b/requirements.txt +1 -0
- package/test-project/workspaces/workspace-b/test/sample-project/package.json +7 -0
- package/test-project/workspaces/workspace-b/themes/hexo-theme-flowbite/package.json +96 -0
- package/test-project/workspaces/workspace-b/themes/hexo-theme-flowbite/readme.md +156 -0
- package/tmp/rm-node-modules-test-project/package.json +17 -0
- package/tmp/rm-node-modules-test-project/packages/workspace-a/package.json +16 -0
- package/tmp/rm-node-modules-test-project/packages/workspace-b/package.json +16 -0
- package/tmp/test-repo/README.md +2 -35
- package/tmp/test-repo/package.json +13 -3
- package/docs-src/clean-github-actions-caches.md +0 -26
- package/docs-src/free-chatgpt.md +0 -26
- package/lib/binary-collections-config.cjs +0 -15
- package/lib/chunk-4EWQC6GZ.mjs +0 -382
- package/lib/chunk-4ZI7BQKQ.mjs +0 -381
- package/lib/chunk-5J2BEPY5.mjs +0 -83
- package/lib/chunk-AGZYRDC2.mjs +0 -323
- package/lib/chunk-BDCHCWHD.mjs +0 -136
- package/lib/chunk-BEZKJ25G.mjs +0 -140
- package/lib/chunk-DI5MDPSN.mjs +0 -386
- package/lib/chunk-GJTGHXRA.mjs +0 -356
- package/lib/chunk-HMRMTYZM.mjs +0 -40
- package/lib/chunk-HN52G2YL.mjs +0 -305
- package/lib/chunk-LEM5OMRP.mjs +0 -384
- package/lib/chunk-O6SWBEOQ.mjs +0 -81
- package/lib/chunk-RCP7DHVY.mjs +0 -190
- package/lib/chunk-SBNDSKG5.mjs +0 -136
- package/lib/chunk-U6SO4QEV.mjs +0 -320
- package/lib/chunk-XD6BJK6Q.mjs +0 -351
- package/lib/chunk-YXSFGA2D.mjs +0 -383
- package/lib/git/gitattributes.d.ts +0 -33
- package/lib/git/gitattributes.js +0 -223
- package/lib/ps/index.d.ts +0 -2
- package/lib/ps/index.js +0 -253
- package/tmp/typedoc/readme.md +0 -320
- /package/lib/{binary-collections-config.d.cts → binary-collections/config.d.cts} +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
|
|
25
|
+
// src/file/move-cli.mjs
|
|
26
|
+
var import_minimist = __toESM(require("minimist"), 1);
|
|
27
|
+
|
|
28
|
+
// src/file/move.mjs
|
|
29
|
+
var import_fs_extra = __toESM(require("fs-extra"), 1);
|
|
30
|
+
var import_upath = __toESM(require("upath"), 1);
|
|
31
|
+
async function move(src, dest) {
|
|
32
|
+
if (!await import_fs_extra.default.pathExists(src)) {
|
|
33
|
+
throw new Error(`Source file does not exist: ${src}`);
|
|
34
|
+
}
|
|
35
|
+
const srcStat = await import_fs_extra.default.stat(src);
|
|
36
|
+
let finalDest = dest;
|
|
37
|
+
if (srcStat.isFile()) {
|
|
38
|
+
const destStat = await import_fs_extra.default.pathExists(dest) ? await import_fs_extra.default.stat(dest) : null;
|
|
39
|
+
if (destStat && destStat.isDirectory()) {
|
|
40
|
+
finalDest = import_upath.default.join(dest, import_upath.default.basename(src));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
await import_fs_extra.default.ensureDir(import_upath.default.dirname(finalDest));
|
|
44
|
+
await import_fs_extra.default.move(src, finalDest, { overwrite: true });
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// src/file/move-cli.mjs
|
|
48
|
+
function showHelp(exitCode = 0) {
|
|
49
|
+
console.log(
|
|
50
|
+
`
|
|
51
|
+
Usage:
|
|
52
|
+
move <src> <dest>
|
|
53
|
+
|
|
54
|
+
Options:
|
|
55
|
+
-h, --help Show this help message
|
|
56
|
+
|
|
57
|
+
Examples:
|
|
58
|
+
move file.txt backup/file.txt
|
|
59
|
+
move ./src ./dist
|
|
60
|
+
`.trim()
|
|
61
|
+
);
|
|
62
|
+
process.exit(exitCode);
|
|
63
|
+
}
|
|
64
|
+
async function main() {
|
|
65
|
+
const args = (0, import_minimist.default)(process.argv.slice(2), {
|
|
66
|
+
boolean: ["help", "h"],
|
|
67
|
+
alias: {
|
|
68
|
+
h: "help"
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
if (args.help) {
|
|
72
|
+
showHelp(0);
|
|
73
|
+
}
|
|
74
|
+
const [src, dest] = args._;
|
|
75
|
+
if (!src || !dest) {
|
|
76
|
+
console.error("Error: missing required arguments.\n");
|
|
77
|
+
showHelp(1);
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
await move(src, dest);
|
|
81
|
+
console.log(`Moved ${src} to ${dest}`);
|
|
82
|
+
} catch (err) {
|
|
83
|
+
console.error(`Error moving file: ${err instanceof Error ? err.message : String(err)}`);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function handleError(err) {
|
|
88
|
+
console.error(`Unexpected error: ${err instanceof Error ? err.message : String(err)}`);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
main().catch(handleError);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
move
|
|
4
|
+
} from "../chunk-NGFK3EYW.mjs";
|
|
5
|
+
import {
|
|
6
|
+
init_esm_shims
|
|
7
|
+
} from "../chunk-QQ4A6DLD.mjs";
|
|
8
|
+
|
|
9
|
+
// src/file/move-cli.mjs
|
|
10
|
+
init_esm_shims();
|
|
11
|
+
import minimist from "minimist";
|
|
12
|
+
function showHelp(exitCode = 0) {
|
|
13
|
+
console.log(
|
|
14
|
+
`
|
|
15
|
+
Usage:
|
|
16
|
+
move <src> <dest>
|
|
17
|
+
|
|
18
|
+
Options:
|
|
19
|
+
-h, --help Show this help message
|
|
20
|
+
|
|
21
|
+
Examples:
|
|
22
|
+
move file.txt backup/file.txt
|
|
23
|
+
move ./src ./dist
|
|
24
|
+
`.trim()
|
|
25
|
+
);
|
|
26
|
+
process.exit(exitCode);
|
|
27
|
+
}
|
|
28
|
+
async function main() {
|
|
29
|
+
const args = minimist(process.argv.slice(2), {
|
|
30
|
+
boolean: ["help", "h"],
|
|
31
|
+
alias: {
|
|
32
|
+
h: "help"
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
if (args.help) {
|
|
36
|
+
showHelp(0);
|
|
37
|
+
}
|
|
38
|
+
const [src, dest] = args._;
|
|
39
|
+
if (!src || !dest) {
|
|
40
|
+
console.error("Error: missing required arguments.\n");
|
|
41
|
+
showHelp(1);
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
await move(src, dest);
|
|
45
|
+
console.log(`Moved ${src} to ${dest}`);
|
|
46
|
+
} catch (err) {
|
|
47
|
+
console.error(`Error moving file: ${err instanceof Error ? err.message : String(err)}`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function handleError(err) {
|
|
52
|
+
console.error(`Unexpected error: ${err instanceof Error ? err.message : String(err)}`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
main().catch(handleError);
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
|
|
29
|
+
// src/file/move.mjs
|
|
30
|
+
var move_exports = {};
|
|
31
|
+
__export(move_exports, {
|
|
32
|
+
move: () => move
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(move_exports);
|
|
35
|
+
var import_fs_extra = __toESM(require("fs-extra"), 1);
|
|
36
|
+
var import_upath = __toESM(require("upath"), 1);
|
|
37
|
+
async function move(src, dest) {
|
|
38
|
+
if (!await import_fs_extra.default.pathExists(src)) {
|
|
39
|
+
throw new Error(`Source file does not exist: ${src}`);
|
|
40
|
+
}
|
|
41
|
+
const srcStat = await import_fs_extra.default.stat(src);
|
|
42
|
+
let finalDest = dest;
|
|
43
|
+
if (srcStat.isFile()) {
|
|
44
|
+
const destStat = await import_fs_extra.default.pathExists(dest) ? await import_fs_extra.default.stat(dest) : null;
|
|
45
|
+
if (destStat && destStat.isDirectory()) {
|
|
46
|
+
finalDest = import_upath.default.join(dest, import_upath.default.basename(src));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
await import_fs_extra.default.ensureDir(import_upath.default.dirname(finalDest));
|
|
50
|
+
await import_fs_extra.default.move(src, finalDest, { overwrite: true });
|
|
51
|
+
}
|
|
52
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
53
|
+
0 && (module.exports = {
|
|
54
|
+
move
|
|
55
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function move(src: any, dest: any): Promise<void>;
|
package/lib/free-chatgpt.cjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -88,31 +89,78 @@ var require_utils = __commonJS({
|
|
|
88
89
|
}
|
|
89
90
|
module2.exports.getArgs = getArgs2;
|
|
90
91
|
function del(fullPath) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
try {
|
|
93
|
+
if (!fs2.existsSync(fullPath)) return;
|
|
94
|
+
const stat = fs2.lstatSync(fullPath);
|
|
95
|
+
if (stat.isSymbolicLink()) {
|
|
96
|
+
try {
|
|
97
|
+
fs2.unlinkSync(fullPath);
|
|
98
|
+
console.log("deleted symlink", fullPath);
|
|
99
|
+
} catch (e) {
|
|
100
|
+
console.log("failed delete symlink", fullPath, e && e.message);
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (stat.isDirectory()) {
|
|
105
|
+
const subdir = fs2.readdirSync(fullPath).map((dirPath) => path2.resolve(fullPath, dirPath));
|
|
106
|
+
for (let i = 0; i < subdir.length; i++) {
|
|
107
|
+
del(subdir[i]);
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
fs2.rmdirSync(fullPath);
|
|
111
|
+
console.log("deleted", fullPath);
|
|
112
|
+
} catch (_e) {
|
|
113
|
+
try {
|
|
114
|
+
fs2.rmSync(fullPath, { recursive: true, force: true, retryDelay: 7e3 });
|
|
115
|
+
console.log("deleted", fullPath);
|
|
116
|
+
} catch (ee) {
|
|
117
|
+
console.log("failed delete", fullPath, ee && ee.message);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return;
|
|
95
121
|
}
|
|
96
|
-
} else {
|
|
97
122
|
try {
|
|
98
|
-
fs2.
|
|
123
|
+
fs2.unlinkSync(fullPath);
|
|
99
124
|
console.log("deleted", fullPath);
|
|
100
|
-
} catch (
|
|
101
|
-
|
|
125
|
+
} catch (_e) {
|
|
126
|
+
try {
|
|
127
|
+
fs2.rmSync(fullPath, { recursive: true, force: true, retryDelay: 7e3 });
|
|
128
|
+
console.log("deleted", fullPath);
|
|
129
|
+
} catch (ee) {
|
|
130
|
+
console.log("failed delete", fullPath, ee && ee.message);
|
|
131
|
+
}
|
|
102
132
|
}
|
|
133
|
+
} catch (err) {
|
|
134
|
+
console.log("failed delete", fullPath, err && err.message);
|
|
103
135
|
}
|
|
104
136
|
}
|
|
105
137
|
module2.exports.del = del;
|
|
106
138
|
function delStream(globStream) {
|
|
107
139
|
globStream.stream().on("data", (result) => {
|
|
108
140
|
const fullPath = path2.resolve(process.cwd(), result);
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
141
|
+
try {
|
|
142
|
+
if (fs2.existsSync(fullPath)) {
|
|
143
|
+
const stat = fs2.lstatSync(fullPath);
|
|
144
|
+
if (stat.isSymbolicLink()) {
|
|
145
|
+
try {
|
|
146
|
+
fs2.unlinkSync(fullPath);
|
|
147
|
+
console.log("deleted symlink", fullPath);
|
|
148
|
+
} catch (e) {
|
|
149
|
+
console.log("failed delete symlink", fullPath, e && e.message);
|
|
150
|
+
}
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (stat.isDirectory()) {
|
|
154
|
+
const subdir = fs2.readdirSync(fullPath).map((dirPath) => path2.resolve(fullPath, dirPath));
|
|
155
|
+
for (let i = 0; i < subdir.length; i++) {
|
|
156
|
+
del(subdir[i]);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
113
159
|
}
|
|
160
|
+
del(fullPath);
|
|
161
|
+
} catch (err) {
|
|
162
|
+
console.log("failed processing", fullPath, err && err.message);
|
|
114
163
|
}
|
|
115
|
-
del(fullPath);
|
|
116
164
|
});
|
|
117
165
|
}
|
|
118
166
|
module2.exports.delStream = delStream;
|
|
@@ -169,7 +217,17 @@ var import_puppeteer_extra_plugin_stealth = __toESM(require("puppeteer-extra-plu
|
|
|
169
217
|
var import_upath = __toESM(require("upath"), 1);
|
|
170
218
|
var COOKIE_DIR = import_upath.default.join(process.cwd(), "tmp", "cookies");
|
|
171
219
|
var DEFAULT_COOKIE_PATH = import_upath.default.join(COOKIE_DIR, "cookies.json");
|
|
220
|
+
var NAVIGATION_TIMEOUT_MS = 9e4;
|
|
221
|
+
var NETWORK_IDLE_TIMEOUT_MS = 15e3;
|
|
222
|
+
var MAX_INLINE_QUESTION_FILE_BYTES = 2 * 1024;
|
|
172
223
|
import_fs_extra.default.ensureDirSync(COOKIE_DIR);
|
|
224
|
+
async function gotoWithFallback(page, url) {
|
|
225
|
+
await page.goto(url, { waitUntil: "domcontentloaded", timeout: NAVIGATION_TIMEOUT_MS });
|
|
226
|
+
try {
|
|
227
|
+
await page.waitForNetworkIdle({ idleTime: 1e3, timeout: NETWORK_IDLE_TIMEOUT_MS });
|
|
228
|
+
} catch {
|
|
229
|
+
}
|
|
230
|
+
}
|
|
173
231
|
async function saveCookies(page, path2 = DEFAULT_COOKIE_PATH) {
|
|
174
232
|
const cookies = await page.cookies();
|
|
175
233
|
import_fs_extra.default.writeFileSync(path2, JSON.stringify(cookies, null, 2));
|
|
@@ -188,7 +246,7 @@ async function navigatePage(page, url) {
|
|
|
188
246
|
if (cookies) {
|
|
189
247
|
await page.setCookie(...cookies);
|
|
190
248
|
}
|
|
191
|
-
await page
|
|
249
|
+
await gotoWithFallback(page, url);
|
|
192
250
|
await page.evaluate(() => {
|
|
193
251
|
window.__domStillUpdating = true;
|
|
194
252
|
if (window.__domObserver) {
|
|
@@ -228,46 +286,157 @@ function loadCookies(cookieFilePath = DEFAULT_COOKIE_PATH) {
|
|
|
228
286
|
return JSON.parse(import_fs_extra.default.readFileSync(cookieFilePath));
|
|
229
287
|
}
|
|
230
288
|
async function writeQuestion(page, question2) {
|
|
231
|
-
const questions = question2.split("\n");
|
|
232
289
|
const promptTextarea = await page.waitForSelector("#prompt-textarea", { timeout: 3e4 });
|
|
233
290
|
if (!promptTextarea) {
|
|
234
291
|
console.log(
|
|
235
292
|
"Cannot find the prompt input on the webpage. Please check whether you have access to chat.openai.com without logging in via your browser."
|
|
236
293
|
);
|
|
237
|
-
}
|
|
238
|
-
await page.evaluate(() => {
|
|
239
|
-
document.querySelector("#prompt-textarea").innerHTML = `<p></p>`;
|
|
240
|
-
});
|
|
241
|
-
if (questions.length === 1) {
|
|
242
|
-
await page.type("#prompt-textarea", questions[0], { delay: 100 });
|
|
243
294
|
return;
|
|
244
295
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
if (
|
|
248
|
-
|
|
249
|
-
await page.keyboard.press("Enter");
|
|
250
|
-
await page.keyboard.up("Shift");
|
|
296
|
+
await page.evaluate((text) => {
|
|
297
|
+
const promptEl = document.querySelector("#prompt-textarea");
|
|
298
|
+
if (!promptEl) {
|
|
299
|
+
return;
|
|
251
300
|
}
|
|
301
|
+
promptEl.focus();
|
|
302
|
+
promptEl.innerHTML = "";
|
|
303
|
+
const lines = String(text).split("\n");
|
|
304
|
+
for (const line of lines) {
|
|
305
|
+
const p = document.createElement("p");
|
|
306
|
+
p.textContent = line;
|
|
307
|
+
promptEl.appendChild(p);
|
|
308
|
+
}
|
|
309
|
+
promptEl.dispatchEvent(new InputEvent("beforeinput", { bubbles: true, inputType: "insertFromPaste", data: text }));
|
|
310
|
+
promptEl.dispatchEvent(new InputEvent("input", { bubbles: true, inputType: "insertFromPaste", data: text }));
|
|
311
|
+
promptEl.dispatchEvent(new Event("change", { bubbles: true }));
|
|
312
|
+
}, question2);
|
|
313
|
+
const hasPromptText = await page.evaluate(() => {
|
|
314
|
+
const promptEl = document.querySelector("#prompt-textarea");
|
|
315
|
+
return Boolean(promptEl && promptEl.textContent && promptEl.textContent.trim().length > 0);
|
|
316
|
+
});
|
|
317
|
+
if (!hasPromptText) {
|
|
318
|
+
console.log("Prompt state not updated by DOM injection. Falling back to keyboard insertText.");
|
|
319
|
+
await promptTextarea.click({ clickCount: 1 });
|
|
320
|
+
await page.keyboard.down("Control");
|
|
321
|
+
await page.keyboard.press("KeyA");
|
|
322
|
+
await page.keyboard.up("Control");
|
|
323
|
+
await page.keyboard.insertText(question2);
|
|
252
324
|
}
|
|
253
325
|
}
|
|
254
326
|
async function clickSubmitButton(page) {
|
|
327
|
+
console.log("Attempting to click the submit button...");
|
|
255
328
|
try {
|
|
256
|
-
const
|
|
257
|
-
|
|
329
|
+
const userMessageCountBefore = await page.$$eval(
|
|
330
|
+
'[data-message-author-role="user"]',
|
|
331
|
+
(elements) => elements.length
|
|
332
|
+
);
|
|
333
|
+
const waitForSubmit = async (timeout = 5e3) => {
|
|
334
|
+
try {
|
|
335
|
+
await page.waitForFunction(
|
|
336
|
+
(previousCount) => {
|
|
337
|
+
const currentCount = document.querySelectorAll('[data-message-author-role="user"]').length;
|
|
338
|
+
return currentCount > previousCount;
|
|
339
|
+
},
|
|
340
|
+
{ timeout },
|
|
341
|
+
userMessageCountBefore
|
|
342
|
+
);
|
|
343
|
+
return true;
|
|
344
|
+
} catch {
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
await page.waitForFunction(
|
|
349
|
+
() => {
|
|
350
|
+
const candidates = [
|
|
351
|
+
document.querySelector('[data-testid="fruitjuice-send-button"]'),
|
|
352
|
+
document.querySelector("#composer-submit-button"),
|
|
353
|
+
document.querySelector('[data-testid="send-button"]')
|
|
354
|
+
].filter(Boolean);
|
|
355
|
+
return candidates.some((button) => {
|
|
356
|
+
const isDisabled = button.disabled || button.getAttribute("aria-disabled") === "true";
|
|
357
|
+
const isVisible = button.offsetParent !== null;
|
|
358
|
+
return !isDisabled && isVisible;
|
|
359
|
+
});
|
|
360
|
+
},
|
|
361
|
+
{ timeout: 5e3 }
|
|
362
|
+
).catch(() => {
|
|
258
363
|
});
|
|
259
|
-
const
|
|
260
|
-
|
|
364
|
+
const buttonDetails = await page.evaluate(() => {
|
|
365
|
+
const selectors = [
|
|
366
|
+
'[data-testid="fruitjuice-send-button"]',
|
|
367
|
+
"#composer-submit-button",
|
|
368
|
+
'[data-testid="send-button"]'
|
|
369
|
+
];
|
|
370
|
+
const details = selectors.map((selector) => {
|
|
371
|
+
const el = document.querySelector(selector);
|
|
372
|
+
const exists = Boolean(el);
|
|
373
|
+
const disabled = exists ? Boolean(el.disabled || el.getAttribute("aria-disabled") === "true") : null;
|
|
374
|
+
const visible = exists ? el.offsetParent !== null : null;
|
|
375
|
+
return { selector, exists, disabled, visible };
|
|
376
|
+
});
|
|
377
|
+
return details;
|
|
378
|
+
});
|
|
379
|
+
console.log(`Submit button details: ${JSON.stringify(buttonDetails)}`);
|
|
380
|
+
const clickable = buttonDetails.find((item) => item.exists && item.visible && item.disabled === false);
|
|
381
|
+
const selectedSelector = clickable ? clickable.selector : null;
|
|
382
|
+
if (selectedSelector) {
|
|
383
|
+
await page.click(selectedSelector);
|
|
384
|
+
console.log(`Clicked submit button selector: ${selectedSelector}`);
|
|
385
|
+
if (await waitForSubmit(5e3)) {
|
|
386
|
+
console.log("Submission detected after selector click.");
|
|
387
|
+
return true;
|
|
388
|
+
}
|
|
389
|
+
const forcedClickWorked = await page.evaluate((selector) => {
|
|
390
|
+
const el = document.querySelector(selector);
|
|
391
|
+
if (!el) {
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
el.click();
|
|
395
|
+
return true;
|
|
396
|
+
}, selectedSelector);
|
|
397
|
+
if (forcedClickWorked) {
|
|
398
|
+
console.log(`Forced DOM click on selector: ${selectedSelector}`);
|
|
399
|
+
if (await waitForSubmit(5e3)) {
|
|
400
|
+
console.log("Submission detected after forced DOM click.");
|
|
401
|
+
return true;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
console.log("Submit button path did not submit. Trying Enter key fallback on prompt.");
|
|
406
|
+
await page.focus("#prompt-textarea");
|
|
407
|
+
await page.keyboard.press("Enter");
|
|
408
|
+
if (await waitForSubmit(5e3)) {
|
|
409
|
+
console.log("Submission detected after Enter key fallback.");
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
const didRequestSubmit = await page.evaluate(() => {
|
|
413
|
+
const prompt = document.querySelector("#prompt-textarea");
|
|
414
|
+
if (!prompt) {
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
417
|
+
const form = prompt.closest("form");
|
|
418
|
+
if (!form) {
|
|
419
|
+
return false;
|
|
420
|
+
}
|
|
421
|
+
if (typeof form.requestSubmit === "function") {
|
|
422
|
+
form.requestSubmit();
|
|
423
|
+
} else {
|
|
424
|
+
form.submit();
|
|
425
|
+
}
|
|
426
|
+
return true;
|
|
261
427
|
});
|
|
262
|
-
if (
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
428
|
+
if (didRequestSubmit) {
|
|
429
|
+
console.log("Triggered form submit fallback.");
|
|
430
|
+
if (await waitForSubmit(5e3)) {
|
|
431
|
+
console.log("Submission detected after form submit fallback.");
|
|
432
|
+
return true;
|
|
433
|
+
}
|
|
268
434
|
}
|
|
435
|
+
console.log("Failed to submit prompt after all strategies.");
|
|
436
|
+
return false;
|
|
269
437
|
} catch (e) {
|
|
270
438
|
console.log(`Failed to click the send button: ${e}`);
|
|
439
|
+
return false;
|
|
271
440
|
}
|
|
272
441
|
}
|
|
273
442
|
var lastMessageId = null;
|
|
@@ -340,11 +509,15 @@ async function isLoggedIn(page) {
|
|
|
340
509
|
return result === true;
|
|
341
510
|
}
|
|
342
511
|
async function createBrowser(browserOptions = {}) {
|
|
512
|
+
const windowsChromeExecutable = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
|
|
513
|
+
const hasWindowsChrome = process.platform === "win32" && import_fs_extra.default.existsSync(windowsChromeExecutable);
|
|
343
514
|
const defaultOptions = {
|
|
344
515
|
headless: false,
|
|
516
|
+
defaultViewport: null,
|
|
345
517
|
userDataDir: import_upath.default.join(process.cwd(), "tmp/puppeteer-profile"),
|
|
346
518
|
// Windows-specific options to handle browser launch issues
|
|
347
519
|
args: [
|
|
520
|
+
"--start-maximized",
|
|
348
521
|
"--no-sandbox",
|
|
349
522
|
"--disable-setuid-sandbox",
|
|
350
523
|
"--disable-dev-shm-usage",
|
|
@@ -357,10 +530,9 @@ async function createBrowser(browserOptions = {}) {
|
|
|
357
530
|
"--disable-renderer-backgrounding"
|
|
358
531
|
],
|
|
359
532
|
ignoreDefaultArgs: ["--disable-extensions"],
|
|
360
|
-
...
|
|
361
|
-
//
|
|
362
|
-
executablePath:
|
|
363
|
-
// Let Puppeteer find Chrome automatically
|
|
533
|
+
...hasWindowsChrome && {
|
|
534
|
+
// Prefer local Chrome installation when present on Windows.
|
|
535
|
+
executablePath: windowsChromeExecutable
|
|
364
536
|
}
|
|
365
537
|
};
|
|
366
538
|
try {
|
|
@@ -370,8 +542,12 @@ async function createBrowser(browserOptions = {}) {
|
|
|
370
542
|
try {
|
|
371
543
|
return await import_puppeteer_extra.default.use((0, import_puppeteer_extra_plugin_stealth.default)()).launch({
|
|
372
544
|
headless: browserOptions.headless || false,
|
|
373
|
-
|
|
545
|
+
defaultViewport: null,
|
|
546
|
+
args: ["--start-maximized", "--no-sandbox", "--disable-setuid-sandbox"],
|
|
374
547
|
ignoreDefaultArgs: false,
|
|
548
|
+
...hasWindowsChrome && {
|
|
549
|
+
executablePath: windowsChromeExecutable
|
|
550
|
+
},
|
|
375
551
|
...browserOptions
|
|
376
552
|
});
|
|
377
553
|
} catch (fallbackError) {
|
|
@@ -396,7 +572,11 @@ async function loginToChatGpt() {
|
|
|
396
572
|
if (loginButtonExists) {
|
|
397
573
|
console.log("Login button found, clicking to log in...");
|
|
398
574
|
await page.click('[data-testid="login-button"]');
|
|
399
|
-
await page.waitForNavigation({ waitUntil: "
|
|
575
|
+
await page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: NAVIGATION_TIMEOUT_MS });
|
|
576
|
+
try {
|
|
577
|
+
await page.waitForNetworkIdle({ idleTime: 1e3, timeout: NETWORK_IDLE_TIMEOUT_MS });
|
|
578
|
+
} catch {
|
|
579
|
+
}
|
|
400
580
|
console.log("Login process completed.");
|
|
401
581
|
} else {
|
|
402
582
|
console.log("No login required - user appears to be already logged in.");
|
|
@@ -406,6 +586,7 @@ async function runChatGpt(chatgptOptions = {}) {
|
|
|
406
586
|
const headless = chatgptOptions.headless !== void 0 ? chatgptOptions.headless : true;
|
|
407
587
|
const questionFile2 = chatgptOptions.questionFile;
|
|
408
588
|
let question2 = chatgptOptions.question;
|
|
589
|
+
let shouldUploadQuestionFile = Boolean(questionFile2);
|
|
409
590
|
const responseFile = chatgptOptions.responseFile || import_upath.default.join(process.cwd(), "tmp", "response.txt");
|
|
410
591
|
const noInputProvided = !question2 && !questionFile2;
|
|
411
592
|
const questionIsEmpty = question2 && question2.trim().length === 0;
|
|
@@ -413,6 +594,22 @@ async function runChatGpt(chatgptOptions = {}) {
|
|
|
413
594
|
if (noInputProvided || questionIsEmpty || questionFileIsEmpty) {
|
|
414
595
|
throw new Error("You must provide a question or a question file.");
|
|
415
596
|
}
|
|
597
|
+
if (!question2 && questionFile2) {
|
|
598
|
+
if (!import_fs_extra.default.existsSync(questionFile2)) {
|
|
599
|
+
throw new Error(`Question file does not exist: ${questionFile2}`);
|
|
600
|
+
}
|
|
601
|
+
const questionFileStats = import_fs_extra.default.statSync(questionFile2);
|
|
602
|
+
if (questionFileStats.size <= MAX_INLINE_QUESTION_FILE_BYTES) {
|
|
603
|
+
question2 = import_fs_extra.default.readFileSync(questionFile2, "utf8").trim();
|
|
604
|
+
if (!question2) {
|
|
605
|
+
throw new Error("Question file is empty.");
|
|
606
|
+
}
|
|
607
|
+
shouldUploadQuestionFile = false;
|
|
608
|
+
console.log(
|
|
609
|
+
`Question file is ${questionFileStats.size} bytes (<= ${MAX_INLINE_QUESTION_FILE_BYTES}). Sending as text prompt.`
|
|
610
|
+
);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
416
613
|
let browser;
|
|
417
614
|
try {
|
|
418
615
|
browser = await createBrowser({ headless });
|
|
@@ -425,7 +622,16 @@ async function runChatGpt(chatgptOptions = {}) {
|
|
|
425
622
|
console.error("4. Close any running Chrome instances and try again");
|
|
426
623
|
throw error;
|
|
427
624
|
}
|
|
428
|
-
const
|
|
625
|
+
const allPages = await browser.pages();
|
|
626
|
+
const page = allPages.length > 0 ? allPages[0] : await browser.newPage();
|
|
627
|
+
await page.bringToFront();
|
|
628
|
+
if (allPages.length > 1) {
|
|
629
|
+
for (const p of allPages) {
|
|
630
|
+
if (p !== page) {
|
|
631
|
+
await p.close();
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
429
635
|
try {
|
|
430
636
|
const url = "https://chat.openai.com";
|
|
431
637
|
const navigate = await navigatePage(page, url);
|
|
@@ -444,12 +650,15 @@ async function runChatGpt(chatgptOptions = {}) {
|
|
|
444
650
|
}
|
|
445
651
|
if (question2) {
|
|
446
652
|
await writeQuestion(page, question2);
|
|
447
|
-
await clickSubmitButton(page);
|
|
653
|
+
const didSubmit = await clickSubmitButton(page);
|
|
654
|
+
if (!didSubmit) {
|
|
655
|
+
throw new Error("Prompt was not submitted. The composer button may be disabled or blocked.");
|
|
656
|
+
}
|
|
448
657
|
await navigate.waitForDomIdle(1e3, 3e4);
|
|
449
658
|
await waitForInitialResponse(page);
|
|
450
659
|
await handleStreamingResponse(page, responseFile);
|
|
451
660
|
await saveCookies(page, getCookiePathForUrl(url));
|
|
452
|
-
} else if (questionFile2) {
|
|
661
|
+
} else if (shouldUploadQuestionFile && questionFile2) {
|
|
453
662
|
await navigate.waitForDomIdle(2e3, 1e4);
|
|
454
663
|
const isUserLoggedIn = await isLoggedIn(page);
|
|
455
664
|
console.log(`Login status: ${isUserLoggedIn ? "Logged in" : "Not logged in"}`);
|
|
@@ -488,7 +697,10 @@ async function runChatGpt(chatgptOptions = {}) {
|
|
|
488
697
|
await fileInput.uploadFile(questionFile2);
|
|
489
698
|
await navigate.waitForDomIdle(2e3, 15e3);
|
|
490
699
|
console.log("File uploaded successfully");
|
|
491
|
-
await clickSubmitButton(page);
|
|
700
|
+
const didSubmit = await clickSubmitButton(page);
|
|
701
|
+
if (!didSubmit) {
|
|
702
|
+
throw new Error("Prompt was not submitted after file upload.");
|
|
703
|
+
}
|
|
492
704
|
await navigate.waitForDomIdle(1e3, 3e4);
|
|
493
705
|
await waitForInitialResponse(page);
|
|
494
706
|
await handleStreamingResponse(page, responseFile);
|