binary-collections 2.0.13 → 2.0.15
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/plugins/opencode-request-logger/README.md +44 -0
- package/.venv/Lib/site-packages/pyarrow/tests/data/orc/README.md +22 -0
- package/binaries/binary-executor.cjs +307 -238
- package/binaries/clean-nodemodule.cjs +307 -238
- package/binaries/clean-nodemodules.cjs +307 -238
- package/binaries/composer.cjs +323 -0
- package/binaries/composer.cmd +2 -0
- package/binaries/composer.phar +0 -0
- package/binaries/dev.cjs +307 -238
- package/binaries/empty.cjs +307 -238
- package/binaries/git-reduce-size.cjs +307 -238
- package/binaries/javakill.cjs +307 -238
- package/binaries/kill-process.cjs +307 -238
- package/binaries/nodekill.cjs +307 -238
- package/binaries/prod.cjs +307 -238
- package/binaries/py.cjs +307 -238
- package/binaries/rmfind.cjs +307 -238
- package/binaries/rmx.cjs +307 -238
- package/binaries/submodule-token.cjs +307 -238
- package/binaries/test-cjs.cjs +307 -238
- package/binaries/test-esm.cjs +307 -238
- package/binaries/yarn-clean.cjs +307 -238
- package/binaries/yc.cjs +307 -238
- package/binaries/ycw.cjs +307 -238
- package/docs-src/binary-collections.md +1 -1
- package/docs-src/clean-github-actions-caches.md +1 -1
- package/docs-src/copy-move-file.md +1 -4
- package/docs-src/del-ps.md +1 -1
- package/docs-src/find-node-modules.md +1 -1
- package/docs-src/generate-test-ci.md +56 -0
- package/docs-src/get-latest-workflow-status.md +100 -0
- package/docs-src/git-diff.md +1 -1
- package/docs-src/git-fix.md +1 -1
- package/docs-src/git-purge.md +1 -1
- package/docs-src/install-opencode-plugins.md +86 -0
- package/docs-src/kill-night-crows.md +1 -1
- package/docs-src/node-cache-cleaner.md +2 -2
- package/docs-src/node-package-packer.md +1 -1
- package/docs-src/opencode-cli.md +155 -0
- package/docs-src/package-resolutions-updater.md +1 -1
- package/docs-src/rmpath.md +1 -1
- package/docs-src/run-by-checksum.md +1 -1
- package/docs-src/submodule-remove.md +1 -1
- package/docs-src/upload-backend.md +29 -0
- package/docs-src/vscode-cli.md +84 -0
- package/docs-src/workflow-badge.md +120 -0
- package/lib/binary-collections/config-types.cjs +17 -0
- package/lib/binary-collections/config-types.d.ts +12 -0
- package/lib/binary-collections/config-types.js +2 -0
- package/lib/binary-collections/config-types.mjs +7 -0
- package/lib/binary-collections/config.cjs +28 -8
- package/lib/binary-collections/config.d.cts +26 -8
- package/lib/binary-collections/config.mjs +2 -2
- package/lib/binary-collections/findScript.cjs +49 -25
- package/lib/binary-collections/findScript.mjs +2 -2
- package/lib/binary-collections/listScript.cjs +49 -25
- package/lib/binary-collections/listScript.mjs +2 -2
- package/lib/binary-collections.cjs +49 -25
- package/lib/binary-collections.mjs +6 -6
- package/lib/changelog.cjs +142 -4
- package/lib/changelog.mjs +9 -5
- package/lib/chunk-3T6AMFI3.mjs +52 -0
- package/lib/{chunk-2MN4VPV2.mjs → chunk-3ZF2QMDK.mjs} +4 -4
- package/lib/chunk-56BVU63B.mjs +86 -0
- package/lib/chunk-7N52Z4IJ.mjs +39 -0
- package/lib/chunk-B77D3SR4.mjs +28 -0
- package/lib/chunk-BPED62FN.mjs +115 -0
- package/lib/{chunk-RDN6HF5Z.mjs → chunk-DHFRWM2W.mjs} +1 -1
- package/lib/chunk-DPEE3FBB.mjs +146 -0
- package/lib/{chunk-MGPYPKIE.mjs → chunk-H7AE4IO3.mjs} +5 -1
- package/lib/{chunk-H44UWUFY.mjs → chunk-J4M5EL5P.mjs} +3 -0
- package/lib/chunk-KCJYREA2.mjs +67 -0
- package/lib/chunk-LACQTD5V.mjs +225 -0
- package/lib/{chunk-TBWXE7ST.mjs → chunk-NHD4HLSU.mjs} +24 -31
- package/lib/{chunk-RDGDLSPD.mjs → chunk-OWNVMKAA.mjs} +6 -5
- package/lib/chunk-SKVF4TMD.mjs +59 -0
- package/lib/{chunk-BZWVHODJ.mjs → chunk-TDUUOAQD.mjs} +5 -5
- package/lib/chunk-TP3O2JGW.mjs +88 -0
- package/lib/{chunk-FLYSZFLW.mjs → chunk-UAEKSLAX.mjs} +1 -1
- package/lib/chunk-UDZBVKXH.mjs +94 -0
- package/lib/chunk-UEOWRYAN.mjs +32 -0
- package/lib/chunk-V6PTSDW5.mjs +82 -0
- package/lib/{chunk-NQXUYO67.mjs → chunk-WNUEY6VJ.mjs} +49 -25
- package/lib/chunk-X7UVQ6ZC.mjs +183 -0
- package/lib/chunk-XW5NZAKI.mjs +82 -0
- package/lib/{chunk-LVSPEFU2.mjs → chunk-Z53IUBUN.mjs} +6 -5
- package/lib/{chunk-CD3HF3LK.mjs → chunk-Z7RM46Q4.mjs} +5 -11
- package/lib/chunk-ZB4IQ6VJ.mjs +46 -0
- package/lib/del-gradle.cjs +1 -1
- package/lib/del-gradle.mjs +22 -16
- package/lib/del-node-modules.cjs +1 -1
- package/lib/del-node-modules.mjs +148 -142
- package/lib/find-node-modules-cli.cjs +1 -1
- package/lib/find-node-modules-cli.mjs +10 -4
- package/lib/{git-diff-cli.cjs → git/git-diff-cli.cjs} +32 -12
- package/lib/{git-diff-cli.mjs → git/git-diff-cli.mjs} +7 -7
- package/lib/{git-diff.cjs → git/git-diff.cjs} +30 -10
- package/lib/{git-diff.js → git/git-diff.js} +3 -3
- package/lib/{git-diff.mjs → git/git-diff.mjs} +6 -6
- package/lib/{git-fix.cjs → git/git-fix.cjs} +142 -3
- package/lib/{git-fix.mjs → git/git-fix.mjs} +19 -14
- package/lib/{git-purge.cjs → git/git-purge.cjs} +1 -1
- package/lib/{git-purge.mjs → git/git-purge.mjs} +4 -4
- package/lib/git/user-config.cjs +139 -1
- package/lib/git/user-config.mjs +3 -1
- package/lib/{clean-github-actions-caches-cli.cjs → github-workflows/clean-github-actions-caches-cli.cjs} +46 -10
- package/lib/{clean-github-actions-caches-cli.mjs → github-workflows/clean-github-actions-caches-cli.mjs} +7 -6
- package/lib/{clean-github-actions-caches.cjs → github-workflows/clean-github-actions-caches.cjs} +46 -10
- package/lib/{clean-github-actions-caches.mjs → github-workflows/clean-github-actions-caches.mjs} +5 -4
- package/lib/github-workflows/generate-test-ci-step-cli.cjs +240 -0
- package/lib/github-workflows/generate-test-ci-step-cli.d.mts +2 -0
- package/lib/github-workflows/generate-test-ci-step-cli.mjs +132 -0
- package/lib/github-workflows/get-latest-workflow-status-cli.cjs +549 -0
- package/lib/github-workflows/get-latest-workflow-status-cli.d.mts +2 -0
- package/lib/github-workflows/get-latest-workflow-status-cli.mjs +61 -0
- package/lib/github-workflows/get-latest-workflow-status.cjs +56 -0
- package/lib/github-workflows/get-latest-workflow-status.d.mts +1 -0
- package/lib/github-workflows/get-latest-workflow-status.mjs +8 -0
- package/lib/github-workflows/utils.cjs +279 -0
- package/lib/github-workflows/utils.d.cts +76 -0
- package/lib/github-workflows/utils.mjs +8 -0
- package/lib/github-workflows/workflow-badge-cli.cjs +730 -0
- package/lib/github-workflows/workflow-badge-cli.d.mts +2 -0
- package/lib/github-workflows/workflow-badge-cli.mjs +98 -0
- package/lib/github-workflows/workflow-badge-generator.cjs +200 -0
- package/lib/github-workflows/workflow-badge-generator.d.mts +14 -0
- package/lib/github-workflows/workflow-badge-generator.mjs +8 -0
- package/lib/github-workflows/workflow-test-data.cjs +73 -0
- package/lib/github-workflows/workflow-test-data.d.cts +63 -0
- package/lib/github-workflows/workflow-test-data.mjs +6 -0
- package/lib/node-cache-cleaner-cli.mjs +3 -3
- package/lib/opencode/cli/auth-rotate.cjs +458 -0
- package/lib/opencode/cli/auth-rotate.d.ts +3 -0
- package/lib/opencode/cli/auth-rotate.js +65 -0
- package/lib/opencode/cli/auth-rotate.mjs +14 -0
- package/lib/opencode/cli/auth-rotate.runner.cjs +454 -0
- package/lib/opencode/cli/auth-rotate.runner.d.ts +1 -0
- package/lib/opencode/cli/auth-rotate.runner.js +8 -0
- package/lib/opencode/cli/auth-rotate.runner.mjs +21 -0
- package/lib/opencode/cli/list-projects.cjs +184 -0
- package/lib/opencode/cli/list-projects.d.ts +1 -0
- package/lib/opencode/cli/list-projects.js +32 -0
- package/lib/opencode/cli/list-projects.mjs +11 -0
- package/lib/opencode/cli/list-sessions.cjs +215 -0
- package/lib/opencode/cli/list-sessions.d.ts +1 -0
- package/lib/opencode/cli/list-sessions.js +45 -0
- package/lib/opencode/cli/list-sessions.mjs +11 -0
- package/lib/opencode/database.cjs +349 -0
- package/lib/opencode/database.d.ts +91 -0
- package/lib/opencode/database.js +252 -0
- package/lib/opencode/database.mjs +28 -0
- package/lib/opencode/database.runner.cjs +145 -0
- package/lib/opencode/database.runner.d.ts +1 -0
- package/lib/opencode/database.runner.js +56 -0
- package/lib/opencode/database.runner.mjs +37 -0
- package/lib/opencode/install-opencode-plugins-cli.cjs +82 -0
- package/lib/opencode/install-opencode-plugins-cli.d.ts +1 -0
- package/lib/opencode/install-opencode-plugins-cli.js +78 -0
- package/lib/opencode/install-opencode-plugins-cli.mjs +65 -0
- package/lib/opencode/opencode-zen.runner.cjs +48 -0
- package/lib/opencode/opencode-zen.runner.d.mts +1 -0
- package/lib/opencode/opencode-zen.runner.mjs +31 -0
- package/lib/opencode/sqlite.cjs +114 -0
- package/lib/opencode/sqlite.d.ts +18 -0
- package/lib/opencode/sqlite.js +82 -0
- package/lib/opencode/sqlite.mjs +10 -0
- package/lib/opencode/storage.cjs +124 -0
- package/lib/opencode/storage.d.ts +27 -0
- package/lib/opencode/storage.js +101 -0
- package/lib/opencode/storage.mjs +38 -0
- package/lib/opencode/storage.runner.cjs +50 -0
- package/lib/opencode/storage.runner.d.ts +1 -0
- package/lib/opencode/storage.runner.js +13 -0
- package/lib/opencode/storage.runner.mjs +29 -0
- package/lib/opencode/types.cjs +17 -0
- package/lib/opencode/types.d.ts +31 -0
- package/lib/opencode/types.js +2 -0
- package/lib/opencode/types.mjs +7 -0
- package/lib/opencode/utils/check-api.cjs +373 -0
- package/lib/opencode/utils/check-api.d.ts +16 -0
- package/lib/opencode/utils/check-api.js +132 -0
- package/lib/opencode/utils/check-api.mjs +12 -0
- package/lib/opencode/utils/check-api.runner.cjs +0 -0
- package/lib/opencode/utils/check-api.runner.d.ts +0 -0
- package/lib/opencode/utils/check-api.runner.js +1 -0
- package/lib/opencode/utils/check-api.runner.mjs +7 -0
- package/lib/opencode-cli.cjs +796 -0
- package/lib/opencode-cli.d.ts +2 -0
- package/lib/opencode-cli.js +116 -0
- package/lib/opencode-cli.mjs +116 -0
- package/lib/package-resolutions-updater-cli.cjs +189 -154
- package/lib/package-resolutions-updater-cli.mjs +3 -2
- package/lib/package-resolutions-updater.cjs +189 -154
- package/lib/package-resolutions-updater.d.mts +12 -3
- package/lib/package-resolutions-updater.mjs +3 -2
- package/lib/print-directory-tree.cjs +139 -3
- package/lib/print-directory-tree.mjs +6 -3
- package/lib/print-tarball-tree-cli.cjs +305 -0
- package/lib/print-tarball-tree-cli.d.mts +2 -0
- package/lib/print-tarball-tree-cli.mjs +54 -0
- package/lib/print-tarball-tree.cjs +43 -216
- package/lib/print-tarball-tree.d.mts +4 -1
- package/lib/print-tarball-tree.mjs +12 -66
- package/lib/rmpath-cli.cjs +139 -5
- package/lib/rmpath-cli.mjs +3 -1
- package/lib/rmpath.cjs +155 -11
- package/lib/rmpath.mjs +3 -1
- package/lib/run-by-checksum/hash.cjs +50 -56
- package/lib/run-by-checksum/hash.d.cts +24 -0
- package/lib/run-by-checksum/hash.mjs +3 -7
- package/lib/run-by-checksum/run.cjs +95 -42
- package/lib/run-by-checksum/run.js +3 -3
- package/lib/run-by-checksum/run.mjs +2 -2
- package/lib/run-by-checksum-cli.cjs +96 -58
- package/lib/run-by-checksum-cli.mjs +2 -2
- package/lib/submodule-install.cjs +138 -4
- package/lib/submodule-install.mjs +5 -4
- package/lib/submodule-remove-cli.cjs +139 -5
- package/lib/submodule-remove-cli.mjs +3 -1
- package/lib/submodule-remove.cjs +154 -5
- package/lib/submodule-remove.mjs +3 -1
- package/lib/utils/findEnvFiles.cjs +3 -0
- package/lib/utils/findEnvFiles.d.cts +2 -2
- package/lib/utils/findEnvFiles.mjs +1 -1
- package/lib/utils/isDebug.cjs +13 -0
- package/lib/utils/isDebug.d.cts +9 -0
- package/lib/utils/isDebug.mjs +6 -0
- package/lib/vscode/project.cjs +0 -0
- package/lib/vscode/project.d.ts +0 -0
- package/lib/vscode/project.js +1 -0
- package/lib/vscode/project.mjs +7 -0
- package/lib/vscode/storage.cjs +138 -0
- package/lib/vscode/storage.d.ts +51 -0
- package/lib/vscode/storage.js +169 -0
- package/lib/vscode/storage.mjs +42 -0
- package/lib/vscode/storage.runner.cjs +125 -0
- package/lib/vscode/storage.runner.d.ts +1 -0
- package/lib/vscode/storage.runner.js +47 -0
- package/lib/vscode/storage.runner.mjs +60 -0
- package/lib/vscode-cli.cjs +155 -0
- package/lib/vscode-cli.d.ts +2 -0
- package/lib/vscode-cli.js +80 -0
- package/lib/vscode-cli.mjs +71 -0
- package/package.json +50 -26
- package/readme.md +104 -8
- package/releases/readme.md +1 -1
- package/src/github-workflows/generate-test-ci-step-cli.mjs +126 -0
- package/vendor/clue/ndjson-react/README.md +365 -0
- package/vendor/composer/pcre/README.md +189 -0
- package/vendor/composer/semver/README.md +99 -0
- package/vendor/composer/xdebug-handler/README.md +305 -0
- package/vendor/ergebnis/agent-detector/README.md +107 -0
- package/vendor/evenement/evenement/README.md +64 -0
- package/vendor/fidry/cpu-core-counter/README.md +138 -0
- package/vendor/friendsofphp/php-cs-fixer/README.md +97 -0
- package/vendor/psr/container/README.md +13 -0
- package/vendor/psr/event-dispatcher/README.md +6 -0
- package/vendor/psr/log/README.md +58 -0
- package/vendor/react/cache/README.md +367 -0
- package/vendor/react/child-process/README.md +619 -0
- package/vendor/react/dns/README.md +453 -0
- package/vendor/react/event-loop/README.md +930 -0
- package/vendor/react/promise/README.md +722 -0
- package/vendor/react/socket/README.md +1564 -0
- package/vendor/react/stream/README.md +1249 -0
- package/vendor/sebastian/diff/README.md +151 -0
- package/vendor/symfony/console/README.md +30 -0
- package/vendor/symfony/deprecation-contracts/README.md +26 -0
- package/vendor/symfony/event-dispatcher/README.md +25 -0
- package/vendor/symfony/event-dispatcher-contracts/README.md +9 -0
- package/vendor/symfony/filesystem/README.md +23 -0
- package/vendor/symfony/finder/README.md +24 -0
- package/vendor/symfony/options-resolver/README.md +25 -0
- package/vendor/symfony/polyfill-ctype/README.md +12 -0
- package/vendor/symfony/polyfill-intl-grapheme/README.md +32 -0
- package/vendor/symfony/polyfill-intl-normalizer/README.md +14 -0
- package/vendor/symfony/polyfill-mbstring/README.md +13 -0
- package/vendor/symfony/polyfill-php80/README.md +25 -0
- package/vendor/symfony/polyfill-php81/README.md +18 -0
- package/vendor/symfony/polyfill-php84/README.md +23 -0
- package/vendor/symfony/polyfill-php85/README.md +20 -0
- package/vendor/symfony/process/README.md +23 -0
- package/vendor/symfony/service-contracts/README.md +9 -0
- package/vendor/symfony/stopwatch/README.md +52 -0
- package/vendor/symfony/string/README.md +24 -0
- package/lib/chunk-WSHVPGNM.mjs +0 -44
- package/lib/chunk-X2B3X7D4.mjs +0 -35
- package/lib/del-gradle.js +0 -16
- package/lib/del-node-modules.js +0 -211
- package/lib/find-node-modules-cli.js +0 -4
- package/lib/run-by-checksum/hash.d.ts +0 -14
- package/lib/run-by-checksum/hash.js +0 -85
- package/readme.html +0 -784
- /package/lib/{clean-github-actions-caches-cli.d.cts → del-gradle.d.cts} +0 -0
- /package/lib/{del-gradle.d.ts → del-node-modules.d.cts} +0 -0
- /package/lib/{find-node-modules-cli.d.ts → find-node-modules-cli.d.cts} +0 -0
- /package/lib/{git-diff-cli.d.ts → git/git-diff-cli.d.ts} +0 -0
- /package/lib/{git-diff-cli.js → git/git-diff-cli.js} +0 -0
- /package/lib/{git-diff.d.ts → git/git-diff.d.ts} +0 -0
- /package/lib/{git-fix.d.cts → git/git-fix.d.cts} +0 -0
- /package/lib/{git-purge.d.cts → git/git-purge.d.cts} +0 -0
- /package/lib/{del-node-modules.d.ts → github-workflows/clean-github-actions-caches-cli.d.cts} +0 -0
- /package/lib/{clean-github-actions-caches.d.cts → github-workflows/clean-github-actions-caches.d.cts} +0 -0
|
@@ -0,0 +1,730 @@
|
|
|
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 __esm = (fn, res) => function __init() {
|
|
9
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
10
|
+
};
|
|
11
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
12
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
13
|
+
};
|
|
14
|
+
var __copyProps = (to, from, except, desc) => {
|
|
15
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
16
|
+
for (let key of __getOwnPropNames(from))
|
|
17
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
18
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
23
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
24
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
25
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
26
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
27
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
28
|
+
mod
|
|
29
|
+
));
|
|
30
|
+
|
|
31
|
+
// node_modules/tsup/assets/cjs_shims.js
|
|
32
|
+
var init_cjs_shims = __esm({
|
|
33
|
+
"node_modules/tsup/assets/cjs_shims.js"() {
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// src/utils/index.cjs
|
|
38
|
+
var require_utils = __commonJS({
|
|
39
|
+
"src/utils/index.cjs"(exports2, module2) {
|
|
40
|
+
init_cjs_shims();
|
|
41
|
+
var fs2 = require("fs");
|
|
42
|
+
var path2 = require("upath");
|
|
43
|
+
var minimistLib = require("minimist");
|
|
44
|
+
var argv = minimistLib(process.argv.slice(2));
|
|
45
|
+
var { exec } = require("child_process");
|
|
46
|
+
var { promisify } = require("util");
|
|
47
|
+
var execAsync = promisify(exec);
|
|
48
|
+
async function parseGitRemotes() {
|
|
49
|
+
try {
|
|
50
|
+
const { stdout } = await execAsync("git remote -v");
|
|
51
|
+
const lines = stdout.split("\n");
|
|
52
|
+
const remotes = {};
|
|
53
|
+
lines.forEach((line) => {
|
|
54
|
+
const [name, url] = line.split(" ");
|
|
55
|
+
if (name && url) {
|
|
56
|
+
const [repoUrl] = url.split(" ");
|
|
57
|
+
try {
|
|
58
|
+
const parsedUrl = new URL(repoUrl);
|
|
59
|
+
const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
|
|
60
|
+
if (parsedUrl.hostname === "github.com" && pathParts.length === 2) {
|
|
61
|
+
let repoPath = pathParts.join("/");
|
|
62
|
+
if (repoPath.endsWith(".git")) {
|
|
63
|
+
repoPath = repoPath.slice(0, -4);
|
|
64
|
+
}
|
|
65
|
+
remotes[name] = repoPath;
|
|
66
|
+
}
|
|
67
|
+
} catch (e) {
|
|
68
|
+
console.error("URL Parsing Error:", e.message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
return remotes;
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.error("Error:", error.message);
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
module2.exports.parseGitRemotes = parseGitRemotes;
|
|
79
|
+
function getArgs2(opts) {
|
|
80
|
+
if (opts) {
|
|
81
|
+
return minimistLib(process.argv.slice(2), opts);
|
|
82
|
+
}
|
|
83
|
+
return argv;
|
|
84
|
+
}
|
|
85
|
+
module2.exports.getArgs = getArgs2;
|
|
86
|
+
function del(fullPath) {
|
|
87
|
+
try {
|
|
88
|
+
if (!fs2.existsSync(fullPath)) return;
|
|
89
|
+
const stat = fs2.lstatSync(fullPath);
|
|
90
|
+
if (stat.isSymbolicLink()) {
|
|
91
|
+
try {
|
|
92
|
+
fs2.unlinkSync(fullPath);
|
|
93
|
+
console.log("deleted symlink", fullPath);
|
|
94
|
+
} catch (e) {
|
|
95
|
+
console.log("failed delete symlink", fullPath, e && e.message);
|
|
96
|
+
}
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (stat.isDirectory()) {
|
|
100
|
+
const subdir = fs2.readdirSync(fullPath).map((dirPath) => path2.resolve(fullPath, dirPath));
|
|
101
|
+
for (let i = 0; i < subdir.length; i++) {
|
|
102
|
+
del(subdir[i]);
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
fs2.rmdirSync(fullPath);
|
|
106
|
+
console.log("deleted", fullPath);
|
|
107
|
+
} catch (_e) {
|
|
108
|
+
try {
|
|
109
|
+
fs2.rmSync(fullPath, { recursive: true, force: true, retryDelay: 7e3 });
|
|
110
|
+
console.log("deleted", fullPath);
|
|
111
|
+
} catch (ee) {
|
|
112
|
+
console.log("failed delete", fullPath, ee && ee.message);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
fs2.unlinkSync(fullPath);
|
|
119
|
+
console.log("deleted", fullPath);
|
|
120
|
+
} catch (_e) {
|
|
121
|
+
try {
|
|
122
|
+
fs2.rmSync(fullPath, { recursive: true, force: true, retryDelay: 7e3 });
|
|
123
|
+
console.log("deleted", fullPath);
|
|
124
|
+
} catch (ee) {
|
|
125
|
+
console.log("failed delete", fullPath, ee && ee.message);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
} catch (err) {
|
|
129
|
+
console.log("failed delete", fullPath, err && err.message);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
module2.exports.del = del;
|
|
133
|
+
function delStream(globStream) {
|
|
134
|
+
globStream.stream().on("data", (result) => {
|
|
135
|
+
const fullPath = path2.resolve(process.cwd(), result);
|
|
136
|
+
try {
|
|
137
|
+
if (fs2.existsSync(fullPath)) {
|
|
138
|
+
const stat = fs2.lstatSync(fullPath);
|
|
139
|
+
if (stat.isSymbolicLink()) {
|
|
140
|
+
try {
|
|
141
|
+
fs2.unlinkSync(fullPath);
|
|
142
|
+
console.log("deleted symlink", fullPath);
|
|
143
|
+
} catch (e) {
|
|
144
|
+
console.log("failed delete symlink", fullPath, e && e.message);
|
|
145
|
+
}
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (stat.isDirectory()) {
|
|
149
|
+
const subdir = fs2.readdirSync(fullPath).map((dirPath) => path2.resolve(fullPath, dirPath));
|
|
150
|
+
for (let i = 0; i < subdir.length; i++) {
|
|
151
|
+
del(subdir[i]);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
del(fullPath);
|
|
156
|
+
} catch (err) {
|
|
157
|
+
console.log("failed processing", fullPath, err && err.message);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
module2.exports.delStream = delStream;
|
|
162
|
+
function getFileTreeString(hashArray) {
|
|
163
|
+
const tree = {};
|
|
164
|
+
const hashMap = {};
|
|
165
|
+
for (const entry of hashArray) {
|
|
166
|
+
const [filePath, hash] = entry.split(" ");
|
|
167
|
+
hashMap[filePath] = hash;
|
|
168
|
+
const parts = filePath.split("/");
|
|
169
|
+
let current = tree;
|
|
170
|
+
for (let i = 0; i < parts.length; i++) {
|
|
171
|
+
const part = parts[i];
|
|
172
|
+
if (i === parts.length - 1) {
|
|
173
|
+
current[part] = null;
|
|
174
|
+
} else {
|
|
175
|
+
current[part] = current[part] || {};
|
|
176
|
+
current = current[part];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function printNode(node, prefix = "", parentPath = "") {
|
|
181
|
+
const keys = Object.keys(node).sort();
|
|
182
|
+
let lines = [];
|
|
183
|
+
keys.forEach((key, idx) => {
|
|
184
|
+
const isLast = idx === keys.length - 1;
|
|
185
|
+
const branch = isLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
|
|
186
|
+
const currentPath = parentPath ? parentPath + "/" + key : key;
|
|
187
|
+
if (node[key] === null) {
|
|
188
|
+
lines.push(prefix + branch + key + " [" + (hashMap[currentPath] || "") + "]");
|
|
189
|
+
} else {
|
|
190
|
+
lines.push(prefix + branch + key + "/");
|
|
191
|
+
lines = lines.concat(printNode(node[key], prefix + (isLast ? " " : "\u2502 "), currentPath));
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
return lines;
|
|
195
|
+
}
|
|
196
|
+
return printNode(tree, "", "").join("\n");
|
|
197
|
+
}
|
|
198
|
+
module2.exports.getFileTreeString = getFileTreeString;
|
|
199
|
+
var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
200
|
+
module2.exports.delay = delay;
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// src/utils/findEnvFiles.cjs
|
|
205
|
+
var require_findEnvFiles = __commonJS({
|
|
206
|
+
"src/utils/findEnvFiles.cjs"(exports2, module2) {
|
|
207
|
+
init_cjs_shims();
|
|
208
|
+
var fs2 = require("fs");
|
|
209
|
+
var path2 = require("path");
|
|
210
|
+
var glob = require("glob");
|
|
211
|
+
var DEFAULT_IGNORES = [
|
|
212
|
+
"**/node_modules/**",
|
|
213
|
+
"**/.git/**",
|
|
214
|
+
"**/.yarn/**",
|
|
215
|
+
"**/.pnpm/**",
|
|
216
|
+
"**/dist/**",
|
|
217
|
+
"**/build/**",
|
|
218
|
+
"**/coverage/**",
|
|
219
|
+
"**/vendor/**",
|
|
220
|
+
"**/tmp/**",
|
|
221
|
+
"**/.cache/**",
|
|
222
|
+
"**/assets/**",
|
|
223
|
+
"**/logs/**",
|
|
224
|
+
"**/output/**",
|
|
225
|
+
"**/public/**",
|
|
226
|
+
"**/static/**",
|
|
227
|
+
"**/temp/**",
|
|
228
|
+
"**/backup/**",
|
|
229
|
+
"**/backups/**",
|
|
230
|
+
"**/examples/**",
|
|
231
|
+
"**/docs/**",
|
|
232
|
+
"**/tests/**",
|
|
233
|
+
"**/__tests__/**",
|
|
234
|
+
"**/spec/**",
|
|
235
|
+
"**/__specs__/**",
|
|
236
|
+
"**/scripts/**",
|
|
237
|
+
"**/bin/**",
|
|
238
|
+
"**/hooks/**",
|
|
239
|
+
"**/config/**",
|
|
240
|
+
"**/configs/**",
|
|
241
|
+
"**/settings/**",
|
|
242
|
+
"**/.vscode/**",
|
|
243
|
+
"**/.idea/**"
|
|
244
|
+
];
|
|
245
|
+
function findEnvFiles(startDir = process.cwd(), filter) {
|
|
246
|
+
const found = /* @__PURE__ */ new Set();
|
|
247
|
+
function addFile(file) {
|
|
248
|
+
const normalized = path2.normalize(file);
|
|
249
|
+
if (typeof filter === "function" && !filter(normalized)) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
found.add(normalized);
|
|
253
|
+
}
|
|
254
|
+
let current = path2.resolve(startDir);
|
|
255
|
+
while (true) {
|
|
256
|
+
const envPath = path2.join(current, ".env");
|
|
257
|
+
if (fs2.existsSync(envPath)) {
|
|
258
|
+
addFile(envPath);
|
|
259
|
+
}
|
|
260
|
+
const parent = path2.dirname(current);
|
|
261
|
+
if (parent === current) {
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
current = parent;
|
|
265
|
+
}
|
|
266
|
+
const files = glob.globSync("**/.env*", {
|
|
267
|
+
cwd: startDir,
|
|
268
|
+
absolute: true,
|
|
269
|
+
nodir: true,
|
|
270
|
+
ignore: DEFAULT_IGNORES
|
|
271
|
+
});
|
|
272
|
+
for (const file of files) {
|
|
273
|
+
addFile(file);
|
|
274
|
+
}
|
|
275
|
+
return [...found];
|
|
276
|
+
}
|
|
277
|
+
function findEnvWithToken(startDir = process.cwd(), tokenName = "GITHUB_TOKEN") {
|
|
278
|
+
const envFiles = findEnvFiles(startDir);
|
|
279
|
+
return envFiles.find((file) => {
|
|
280
|
+
try {
|
|
281
|
+
const content = fs2.readFileSync(file, "utf-8");
|
|
282
|
+
if (tokenName instanceof RegExp) {
|
|
283
|
+
return tokenName.test(content);
|
|
284
|
+
}
|
|
285
|
+
const regex = new RegExp(`^\\s*${tokenName}\\s*=`, "m");
|
|
286
|
+
return regex.test(content);
|
|
287
|
+
} catch (err) {
|
|
288
|
+
console.warn(`Failed to read ${file}: ${err instanceof Error ? err.message : String(err)}`);
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
module2.exports = {
|
|
294
|
+
DEFAULT_IGNORES,
|
|
295
|
+
findEnvFiles,
|
|
296
|
+
findEnvWithToken,
|
|
297
|
+
default: findEnvFiles
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
// src/binary-collections/config.cjs
|
|
303
|
+
var require_config = __commonJS({
|
|
304
|
+
"src/binary-collections/config.cjs"(exports2, module2) {
|
|
305
|
+
init_cjs_shims();
|
|
306
|
+
var path2 = require("upath");
|
|
307
|
+
var minimistLib = require("minimist");
|
|
308
|
+
var { findEnvWithToken } = require_findEnvFiles();
|
|
309
|
+
var dotenv = require("dotenv");
|
|
310
|
+
var { cosmiconfig } = require("cosmiconfig");
|
|
311
|
+
var loadDotenv = (tokenKey = /ACCESS_TOKEN|GITHUB_TOKEN/) => dotenv.config({ path: findEnvWithToken(void 0, tokenKey), quiet: true, overwrite: true });
|
|
312
|
+
loadDotenv();
|
|
313
|
+
var cliArgv = minimistLib(process.argv.slice(2), {
|
|
314
|
+
string: ["token"]
|
|
315
|
+
});
|
|
316
|
+
var GITHUB_ACCESS_TOKEN = cliArgv.token || process.env.ACCESS_TOKEN || process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
|
|
317
|
+
function getTempPath(...segments) {
|
|
318
|
+
return path2.join(process.env.TEMP_DIR || path2.join(process.cwd(), "tmp"), ...segments);
|
|
319
|
+
}
|
|
320
|
+
async function getConfig(options = {}) {
|
|
321
|
+
const explorer = cosmiconfig("binary-collections", {
|
|
322
|
+
searchStrategy: "project",
|
|
323
|
+
stopDir: options.stopDir
|
|
324
|
+
});
|
|
325
|
+
try {
|
|
326
|
+
const result = await explorer.search(options.searchFrom);
|
|
327
|
+
return result ? result.config : null;
|
|
328
|
+
} catch {
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
module2.exports = {
|
|
333
|
+
getTempPath,
|
|
334
|
+
GITHUB_ACCESS_TOKEN,
|
|
335
|
+
loadDotenv,
|
|
336
|
+
getConfig
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
// src/github-workflows/utils.cjs
|
|
342
|
+
var require_utils2 = __commonJS({
|
|
343
|
+
"src/github-workflows/utils.cjs"(exports2, module2) {
|
|
344
|
+
init_cjs_shims();
|
|
345
|
+
var axios = require("axios");
|
|
346
|
+
var { spawn } = require("cross-spawn");
|
|
347
|
+
var { GITHUB_ACCESS_TOKEN: TOKEN } = require_config();
|
|
348
|
+
if (!TOKEN) {
|
|
349
|
+
console.error("Missing env var: ACCESS_TOKEN or GITHUB_TOKEN");
|
|
350
|
+
process.exit(1);
|
|
351
|
+
}
|
|
352
|
+
var BASE = "https://api.github.com";
|
|
353
|
+
var HEADERS = {
|
|
354
|
+
Authorization: `Bearer ${TOKEN}`,
|
|
355
|
+
Accept: "application/vnd.github+json",
|
|
356
|
+
"X-GitHub-Api-Version": "2022-11-28"
|
|
357
|
+
};
|
|
358
|
+
async function request(url) {
|
|
359
|
+
try {
|
|
360
|
+
const res = await axios.get(url, { headers: HEADERS });
|
|
361
|
+
return res.data;
|
|
362
|
+
} catch (err) {
|
|
363
|
+
if (err == null ? void 0 : err.response) {
|
|
364
|
+
const statusText = err.response.statusText || "Request failed";
|
|
365
|
+
const responseText = typeof err.response.data === "string" ? err.response.data : JSON.stringify(err.response.data);
|
|
366
|
+
throw new Error(`${err.response.status} ${statusText}
|
|
367
|
+
${responseText}`);
|
|
368
|
+
}
|
|
369
|
+
throw err;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
function runGit(args) {
|
|
373
|
+
return new Promise((resolve, reject) => {
|
|
374
|
+
var _a, _b;
|
|
375
|
+
const child = spawn("git", args, {
|
|
376
|
+
cwd: process.cwd(),
|
|
377
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
378
|
+
});
|
|
379
|
+
let stdout = "";
|
|
380
|
+
let stderr = "";
|
|
381
|
+
(_a = child.stdout) == null ? void 0 : _a.on("data", (chunk) => {
|
|
382
|
+
stdout += chunk.toString();
|
|
383
|
+
});
|
|
384
|
+
(_b = child.stderr) == null ? void 0 : _b.on("data", (chunk) => {
|
|
385
|
+
stderr += chunk.toString();
|
|
386
|
+
});
|
|
387
|
+
child.on("error", reject);
|
|
388
|
+
child.on("close", (code) => {
|
|
389
|
+
if (code === 0) return resolve(stdout.trim());
|
|
390
|
+
reject(new Error(stderr.trim() || `git ${args.join(" ")} exited with code ${code}`));
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
function parseOwnerFromUrl(remoteUrl) {
|
|
395
|
+
const normalized = remoteUrl.trim().replace(/\.git$/i, "");
|
|
396
|
+
const match = normalized.match(/github\.com[:/](?<owner>[^/]+)\/(?<repo>[^/]+)$/i);
|
|
397
|
+
return (match == null ? void 0 : match.groups) || null;
|
|
398
|
+
}
|
|
399
|
+
function getOwnerFromRemoteUrl(remoteUrl) {
|
|
400
|
+
const parsed = parseOwnerFromUrl(remoteUrl);
|
|
401
|
+
return (parsed == null ? void 0 : parsed.owner) || null;
|
|
402
|
+
}
|
|
403
|
+
function getRepoFromRemoteUrl(remoteUrl) {
|
|
404
|
+
const parsed = parseOwnerFromUrl(remoteUrl);
|
|
405
|
+
return (parsed == null ? void 0 : parsed.repo) || null;
|
|
406
|
+
}
|
|
407
|
+
async function getCurrentOwner() {
|
|
408
|
+
const commands = [
|
|
409
|
+
["config", "--local", "--get", "remote.origin.url"],
|
|
410
|
+
["remote", "get-url", "origin"]
|
|
411
|
+
];
|
|
412
|
+
for (const args of commands) {
|
|
413
|
+
try {
|
|
414
|
+
const remoteUrl = await runGit(args);
|
|
415
|
+
const owner = getOwnerFromRemoteUrl(remoteUrl);
|
|
416
|
+
if (owner) return owner;
|
|
417
|
+
} catch {
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
throw new Error("Unable to determine repository owner from git remote.origin.url");
|
|
421
|
+
}
|
|
422
|
+
async function getCurrentRepo() {
|
|
423
|
+
const commands = [
|
|
424
|
+
["config", "--local", "--get", "remote.origin.url"],
|
|
425
|
+
["remote", "get-url", "origin"]
|
|
426
|
+
];
|
|
427
|
+
for (const args of commands) {
|
|
428
|
+
try {
|
|
429
|
+
const remoteUrl = await runGit(args);
|
|
430
|
+
const repo = getRepoFromRemoteUrl(remoteUrl);
|
|
431
|
+
if (repo) return repo;
|
|
432
|
+
} catch {
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
throw new Error("Unable to determine repository name from git remote.origin.url");
|
|
436
|
+
}
|
|
437
|
+
async function getOwnerRepo2() {
|
|
438
|
+
const owner = await getCurrentOwner();
|
|
439
|
+
const repo = await getCurrentRepo();
|
|
440
|
+
return { owner, repo };
|
|
441
|
+
}
|
|
442
|
+
async function getLatestRun2(owner, repo, workflowId) {
|
|
443
|
+
var _a;
|
|
444
|
+
let url;
|
|
445
|
+
if (workflowId) {
|
|
446
|
+
url = `${BASE}/repos/${owner}/${repo}/actions/workflows/${encodeURIComponent(workflowId)}/runs?per_page=1`;
|
|
447
|
+
} else {
|
|
448
|
+
url = `${BASE}/repos/${owner}/${repo}/actions/runs?per_page=1`;
|
|
449
|
+
}
|
|
450
|
+
const data = await request(url);
|
|
451
|
+
return (_a = data.workflow_runs) == null ? void 0 : _a[0];
|
|
452
|
+
}
|
|
453
|
+
async function getJobs2(owner, repo, runId) {
|
|
454
|
+
const data = await request(`${BASE}/repos/${owner}/${repo}/actions/runs/${runId}/jobs`);
|
|
455
|
+
return data.jobs || [];
|
|
456
|
+
}
|
|
457
|
+
module2.exports = {
|
|
458
|
+
BASE,
|
|
459
|
+
HEADERS,
|
|
460
|
+
request,
|
|
461
|
+
runGit,
|
|
462
|
+
parseOwnerFromUrl,
|
|
463
|
+
getOwnerFromRemoteUrl,
|
|
464
|
+
getRepoFromRemoteUrl,
|
|
465
|
+
getCurrentOwner,
|
|
466
|
+
getCurrentRepo,
|
|
467
|
+
getOwnerRepo: getOwnerRepo2,
|
|
468
|
+
getLatestRun: getLatestRun2,
|
|
469
|
+
getJobs: getJobs2
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
// src/github-workflows/workflow-badge-cli.mjs
|
|
475
|
+
init_cjs_shims();
|
|
476
|
+
var import_fs = __toESM(require("fs"), 1);
|
|
477
|
+
var import_upath = __toESM(require("upath"), 1);
|
|
478
|
+
var import_utils = __toESM(require_utils(), 1);
|
|
479
|
+
|
|
480
|
+
// src/github-workflows/workflow-badge-generator.mjs
|
|
481
|
+
init_cjs_shims();
|
|
482
|
+
var COLORS = {
|
|
483
|
+
success: "#2da44e",
|
|
484
|
+
failure: "#cf222e",
|
|
485
|
+
cancelled: "#656d76",
|
|
486
|
+
skipped: "#656d76",
|
|
487
|
+
inProgress: "#d4920b",
|
|
488
|
+
pending: "#656d76",
|
|
489
|
+
unknown: "#656d76",
|
|
490
|
+
text: "#1f2328",
|
|
491
|
+
textSecondary: "#656d76",
|
|
492
|
+
border: "#d0d7de",
|
|
493
|
+
bg: "#ffffff",
|
|
494
|
+
cardBg: "#f6f8fa"
|
|
495
|
+
};
|
|
496
|
+
function getStatusMeta(run) {
|
|
497
|
+
const { status, conclusion } = run;
|
|
498
|
+
if (conclusion === "success") return { label: "Passing", color: COLORS.success };
|
|
499
|
+
if (conclusion === "failure") return { label: "Failing", color: COLORS.failure };
|
|
500
|
+
if (conclusion === "cancelled") return { label: "Cancelled", color: COLORS.cancelled };
|
|
501
|
+
if (conclusion === "skipped") return { label: "Skipped", color: COLORS.skipped };
|
|
502
|
+
if (status === "in_progress") return { label: "In Progress", color: COLORS.inProgress };
|
|
503
|
+
if (status === "queued" || status === "pending") return { label: "Pending", color: COLORS.pending };
|
|
504
|
+
return { label: status || "Unknown", color: COLORS.unknown };
|
|
505
|
+
}
|
|
506
|
+
function esc(str) {
|
|
507
|
+
return String(str).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
508
|
+
}
|
|
509
|
+
function countSteps(jobs) {
|
|
510
|
+
let total = 0, passed = 0, failed = 0, skipped = 0, pending = 0;
|
|
511
|
+
for (const job of jobs) {
|
|
512
|
+
for (const step of job.steps || []) {
|
|
513
|
+
total++;
|
|
514
|
+
if (step.conclusion === "success") passed++;
|
|
515
|
+
else if (step.conclusion === "failure") failed++;
|
|
516
|
+
else if (step.conclusion === "skipped") skipped++;
|
|
517
|
+
else pending++;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
return { total, passed, failed, skipped, pending };
|
|
521
|
+
}
|
|
522
|
+
function jobColor(job) {
|
|
523
|
+
if (job.conclusion === "success") return COLORS.success;
|
|
524
|
+
if (job.conclusion === "failure") return COLORS.failure;
|
|
525
|
+
if (job.status === "in_progress") return COLORS.inProgress;
|
|
526
|
+
return COLORS.pending;
|
|
527
|
+
}
|
|
528
|
+
function generateBadge(run, jobs, options = {}) {
|
|
529
|
+
const width = options.width || 520;
|
|
530
|
+
const maxSteps = options.maxSteps;
|
|
531
|
+
const { label: statusLabel, color: accentColor } = getStatusMeta(run);
|
|
532
|
+
const steps = countSteps(jobs);
|
|
533
|
+
const PAD = 20;
|
|
534
|
+
const W = width;
|
|
535
|
+
const RIGHT = width - PAD;
|
|
536
|
+
const INNER_W = RIGHT - PAD;
|
|
537
|
+
const els = [];
|
|
538
|
+
const el = (str) => els.push(str);
|
|
539
|
+
const LABEL_X = PAD;
|
|
540
|
+
const VALUE_X = 110;
|
|
541
|
+
let yCursor = 0;
|
|
542
|
+
const divider = () => {
|
|
543
|
+
yCursor += 4;
|
|
544
|
+
el(`<line x1="${PAD}" y1="${yCursor}" x2="${RIGHT}" y2="${yCursor}" stroke="${COLORS.border}" stroke-width="1"/>`);
|
|
545
|
+
yCursor += 5;
|
|
546
|
+
};
|
|
547
|
+
const sectionHeading = (text) => {
|
|
548
|
+
yCursor += 8;
|
|
549
|
+
el(
|
|
550
|
+
`<text x="${PAD}" y="${yCursor + 13}" font-size="11" font-weight="700" fill="${COLORS.textSecondary}" letter-spacing="0.5">${esc(text)}</text>`
|
|
551
|
+
);
|
|
552
|
+
yCursor += 22;
|
|
553
|
+
};
|
|
554
|
+
el(`<rect x="0" y="0" width="${W}" height="4" fill="${accentColor}"/>`);
|
|
555
|
+
yCursor = 4;
|
|
556
|
+
yCursor += 14;
|
|
557
|
+
const titleBaseline = yCursor + 15;
|
|
558
|
+
el(
|
|
559
|
+
`<text x="${PAD}" y="${titleBaseline}" font-size="15" font-weight="700" fill="${COLORS.text}">Workflow Status</text>`
|
|
560
|
+
);
|
|
561
|
+
const pillText = statusLabel;
|
|
562
|
+
const pillTextW = pillText.length * 7.8 + 32;
|
|
563
|
+
const pillX = RIGHT - pillTextW;
|
|
564
|
+
const pillY = titleBaseline - 12;
|
|
565
|
+
el(`<rect x="${pillX}" y="${pillY}" width="${pillTextW}" height="22" rx="11" fill="${accentColor}" opacity="0.12"/>`);
|
|
566
|
+
el(`<circle cx="${pillX + 14}" cy="${titleBaseline - 2}" r="4.5" fill="${accentColor}"/>`);
|
|
567
|
+
el(
|
|
568
|
+
`<text x="${pillX + 24}" y="${titleBaseline + 1}" font-size="12" font-weight="600" fill="${accentColor}">${esc(pillText)}</text>`
|
|
569
|
+
);
|
|
570
|
+
yCursor = titleBaseline + 4;
|
|
571
|
+
divider();
|
|
572
|
+
const metaRows = [
|
|
573
|
+
{ label: "Workflow", value: run.name || "" },
|
|
574
|
+
{ label: "Status", value: `${run.status}${run.conclusion ? ` (${run.conclusion})` : ""}` },
|
|
575
|
+
{ label: "Branch", value: run.head_branch || "" },
|
|
576
|
+
{ label: "Run ID", value: `#${run.id || ""}` }
|
|
577
|
+
];
|
|
578
|
+
for (const row of metaRows) {
|
|
579
|
+
const rowBaseline = yCursor + 14;
|
|
580
|
+
el(
|
|
581
|
+
`<text x="${LABEL_X}" y="${rowBaseline}" font-size="12" fill="${COLORS.textSecondary}">${esc(row.label)}</text>`
|
|
582
|
+
);
|
|
583
|
+
el(
|
|
584
|
+
`<text x="${VALUE_X}" y="${rowBaseline}" font-size="13" fill="${COLORS.text}" font-weight="500">${esc(row.value)}</text>`
|
|
585
|
+
);
|
|
586
|
+
yCursor += 22;
|
|
587
|
+
}
|
|
588
|
+
divider();
|
|
589
|
+
sectionHeading("JOBS");
|
|
590
|
+
for (const job of jobs) {
|
|
591
|
+
const jColor = jobColor(job);
|
|
592
|
+
const jStatus = job.conclusion || job.status;
|
|
593
|
+
el(`<rect x="${PAD}" y="${yCursor}" width="${INNER_W}" height="28" rx="6" fill="${COLORS.cardBg}"/>`);
|
|
594
|
+
el(
|
|
595
|
+
`<text x="${PAD + 10}" y="${yCursor + 18}" font-size="13" font-weight="600" fill="${COLORS.text}">${esc(job.name)}</text>`
|
|
596
|
+
);
|
|
597
|
+
const jobStatusX = RIGHT - 14;
|
|
598
|
+
el(`<circle cx="${jobStatusX - 16}" cy="${yCursor + 14}" r="3.5" fill="${jColor}"/>`);
|
|
599
|
+
el(
|
|
600
|
+
`<text x="${jobStatusX}" y="${yCursor + 18}" font-size="11" fill="${COLORS.textSecondary}" text-anchor="end">${esc(jStatus)}</text>`
|
|
601
|
+
);
|
|
602
|
+
yCursor += 34;
|
|
603
|
+
if (job.steps && job.steps.length > 0) {
|
|
604
|
+
const stepsToRender = maxSteps ? job.steps.slice(0, maxSteps) : job.steps;
|
|
605
|
+
const hiddenCount = maxSteps ? job.steps.length - maxSteps : 0;
|
|
606
|
+
for (const step of stepsToRender) {
|
|
607
|
+
const sIcon = step.conclusion === "success" ? "\u2713" : step.conclusion === "failure" ? "\u2717" : step.conclusion === "skipped" ? "\u2013" : "\u25CB";
|
|
608
|
+
const sColor = step.conclusion === "success" ? COLORS.success : step.conclusion === "failure" ? COLORS.failure : step.conclusion === "skipped" ? COLORS.textSecondary : COLORS.inProgress;
|
|
609
|
+
el(`<text x="${PAD + 18}" y="${yCursor + 13}" font-size="12" fill="${sColor}">${sIcon}</text>`);
|
|
610
|
+
let stepName = step.name || "";
|
|
611
|
+
const maxChars = 52;
|
|
612
|
+
if (stepName.length > maxChars) {
|
|
613
|
+
stepName = stepName.slice(0, maxChars - 3) + "...";
|
|
614
|
+
}
|
|
615
|
+
el(`<text x="${PAD + 36}" y="${yCursor + 13}" font-size="12" fill="${COLORS.text}">${esc(stepName)}</text>`);
|
|
616
|
+
const stepStatus = step.conclusion || step.status || "";
|
|
617
|
+
el(
|
|
618
|
+
`<text x="${RIGHT}" y="${yCursor + 13}" font-size="11" fill="${COLORS.textSecondary}" text-anchor="end">${esc(stepStatus)}</text>`
|
|
619
|
+
);
|
|
620
|
+
yCursor += 20;
|
|
621
|
+
}
|
|
622
|
+
if (hiddenCount > 0) {
|
|
623
|
+
el(
|
|
624
|
+
`<text x="${PAD + 18}" y="${yCursor + 13}" font-size="12" fill="${COLORS.textSecondary}" font-style="italic">and ${hiddenCount} more step${hiddenCount !== 1 ? "s" : ""}...</text>`
|
|
625
|
+
);
|
|
626
|
+
yCursor += 20;
|
|
627
|
+
}
|
|
628
|
+
yCursor += 4;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
divider();
|
|
632
|
+
const footerParts = [];
|
|
633
|
+
if (steps.passed > 0) footerParts.push(`${steps.passed} \u2713 passed`);
|
|
634
|
+
if (steps.failed > 0) footerParts.push(`${steps.failed} \u2717 failed`);
|
|
635
|
+
if (steps.pending > 0) footerParts.push(`${steps.pending} \u25CB pending`);
|
|
636
|
+
if (steps.skipped > 0) footerParts.push(`${steps.skipped} \u2013 skipped`);
|
|
637
|
+
const footerText = footerParts.length > 0 ? footerParts.join(" \xB7 ") : "No steps recorded";
|
|
638
|
+
el(`<text x="${PAD}" y="${yCursor + 13}" font-size="12" fill="${COLORS.textSecondary}">${esc(footerText)}</text>`);
|
|
639
|
+
yCursor += 22;
|
|
640
|
+
const totalHeight = yCursor + 6;
|
|
641
|
+
const svg = [
|
|
642
|
+
`<svg xmlns="http://www.w3.org/2000/svg" width="${W}" height="${totalHeight}" viewBox="0 0 ${W} ${totalHeight}" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif">`,
|
|
643
|
+
` <defs>`,
|
|
644
|
+
` <filter id="badge-shadow" x="-2%" y="-2%" width="104%" height="104%">`,
|
|
645
|
+
` <feDropShadow dx="0" dy="1" stdDeviation="3" flood-color="#000" flood-opacity="0.12"/>`,
|
|
646
|
+
` </filter>`,
|
|
647
|
+
` </defs>`,
|
|
648
|
+
` <rect x="0.5" y="0.5" width="${W - 1}" height="${totalHeight - 1}" rx="8" fill="${COLORS.bg}" stroke="${COLORS.border}" stroke-width="1" filter="url(#badge-shadow)"/>`,
|
|
649
|
+
...els,
|
|
650
|
+
`</svg>`
|
|
651
|
+
].join("\n");
|
|
652
|
+
return svg;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
// src/github-workflows/workflow-badge-cli.mjs
|
|
656
|
+
var import_utils2 = __toESM(require_utils2(), 1);
|
|
657
|
+
var HELP = `
|
|
658
|
+
Usage: workflow-badge [options]
|
|
659
|
+
|
|
660
|
+
Generate a detailed SVG badge for the latest GitHub Actions workflow status.
|
|
661
|
+
|
|
662
|
+
Options:
|
|
663
|
+
-o, --output <file> Write SVG to file instead of stdout
|
|
664
|
+
--owner <owner> GitHub repository owner (default: auto-detect from git)
|
|
665
|
+
--repo <repo> GitHub repository name (default: auto-detect from git)
|
|
666
|
+
--workflow <name> Filter by workflow filename (e.g. "test.yml") or workflow ID
|
|
667
|
+
--token <token> GitHub access token (overrides env: ACCESS_TOKEN, GITHUB_TOKEN, GH_TOKEN)
|
|
668
|
+
--width <px> SVG width in pixels (default: 520)
|
|
669
|
+
--max-steps <n> Max steps to show per job (default: all)
|
|
670
|
+
-h, --help Show this help message
|
|
671
|
+
|
|
672
|
+
Examples:
|
|
673
|
+
workflow-badge
|
|
674
|
+
workflow-badge --output badge.svg
|
|
675
|
+
workflow-badge --owner dimaslanjaka --repo bin --width 600
|
|
676
|
+
`;
|
|
677
|
+
async function main() {
|
|
678
|
+
const argv = (0, import_utils.getArgs)({
|
|
679
|
+
string: ["output", "owner", "repo", "workflow", "width", "max-steps"],
|
|
680
|
+
boolean: ["help"],
|
|
681
|
+
alias: { o: "output", h: "help", w: "width" }
|
|
682
|
+
});
|
|
683
|
+
if (argv.help) {
|
|
684
|
+
console.log(HELP);
|
|
685
|
+
process.exit(0);
|
|
686
|
+
}
|
|
687
|
+
const owner = argv.owner || process.env.GH_OWNER;
|
|
688
|
+
const repo = argv.repo || process.env.GH_REPO;
|
|
689
|
+
if (owner && repo) {
|
|
690
|
+
console.error(`[workflow-badge] Using owner=${owner} repo=${repo}`);
|
|
691
|
+
} else {
|
|
692
|
+
const parsed = await (0, import_utils2.getOwnerRepo)();
|
|
693
|
+
if (!owner) argv.owner = parsed.owner;
|
|
694
|
+
if (!repo) argv.repo = parsed.repo;
|
|
695
|
+
console.error(`[workflow-badge] Detected ${parsed.owner}/${parsed.repo} from git remote`);
|
|
696
|
+
}
|
|
697
|
+
const finalOwner = argv.owner || owner;
|
|
698
|
+
const finalRepo = argv.repo || repo;
|
|
699
|
+
const workflowId = argv.workflow;
|
|
700
|
+
const target = workflowId ? `${finalOwner}/${finalRepo} (workflow: ${workflowId})` : `${finalOwner}/${finalRepo}`;
|
|
701
|
+
console.error(`[workflow-badge] Fetching latest workflow for ${target} ...`);
|
|
702
|
+
const run = await (0, import_utils2.getLatestRun)(finalOwner, finalRepo, workflowId);
|
|
703
|
+
if (!run) {
|
|
704
|
+
console.error("[workflow-badge] No workflow runs found.");
|
|
705
|
+
process.exit(1);
|
|
706
|
+
}
|
|
707
|
+
const jobs = await (0, import_utils2.getJobs)(finalOwner, finalRepo, run.id);
|
|
708
|
+
console.error(
|
|
709
|
+
`[workflow-badge] Run #${run.id}: ${run.status}${run.conclusion ? ` (${run.conclusion})` : ""} \u2014 ${jobs.length} job(s)`
|
|
710
|
+
);
|
|
711
|
+
const maxSteps = argv["max-steps"] ? parseInt(argv["max-steps"], 10) : void 0;
|
|
712
|
+
const options = { width: parseInt(argv.width, 10) || 520 };
|
|
713
|
+
if (maxSteps !== void 0) options.maxSteps = maxSteps;
|
|
714
|
+
const svg = generateBadge(run, jobs, options);
|
|
715
|
+
if (argv.output) {
|
|
716
|
+
const outPath = import_upath.default.resolve(argv.output);
|
|
717
|
+
const outDir = import_upath.default.dirname(outPath);
|
|
718
|
+
if (!import_fs.default.existsSync(outDir)) {
|
|
719
|
+
import_fs.default.mkdirSync(outDir, { recursive: true });
|
|
720
|
+
}
|
|
721
|
+
import_fs.default.writeFileSync(outPath, svg, "utf-8");
|
|
722
|
+
console.error(`[workflow-badge] Badge written to ${outPath}`);
|
|
723
|
+
} else {
|
|
724
|
+
process.stdout.write(svg);
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
main().catch((err) => {
|
|
728
|
+
console.error("[workflow-badge] Error:", err.message);
|
|
729
|
+
process.exit(1);
|
|
730
|
+
});
|