binary-collections 2.0.9 → 2.0.11
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/.puppeterrc.cjs +25 -0
- package/binaries/binary-executor.cjs +178 -0
- package/{bin → binaries}/clean-nodemodule +0 -0
- package/binaries/clean-nodemodule.cjs +178 -0
- package/binaries/clean-nodemodule.cmd +4 -0
- package/{bin → binaries}/clean-nodemodules +0 -0
- package/binaries/clean-nodemodules.cjs +178 -0
- package/binaries/clean-nodemodules.cmd +5 -0
- package/{bin → binaries}/dev +0 -0
- package/binaries/dev.cjs +178 -0
- package/{bin → binaries}/empty +0 -0
- package/binaries/empty.cjs +178 -0
- package/{bin → binaries}/git-reduce-size +0 -0
- package/binaries/git-reduce-size.cjs +178 -0
- package/binaries/javakill.cjs +178 -0
- package/{bin → binaries}/javakill.cmd +0 -0
- package/binaries/kill-night-crows.bat +7 -0
- package/binaries/kill-night-crows.ps1 +172 -0
- package/{bin → binaries}/kill-process +0 -0
- package/binaries/kill-process.cjs +178 -0
- package/binaries/nodekill.cjs +178 -0
- package/{bin → binaries}/nodekill.ps1 +0 -0
- package/{bin → binaries}/prod +0 -0
- package/binaries/prod.cjs +178 -0
- package/binaries/py +111 -0
- package/binaries/py.cjs +178 -0
- package/binaries/py.cmd +49 -0
- package/{bin → binaries}/rmfind +0 -0
- package/binaries/rmfind.cjs +178 -0
- package/{bin → binaries}/rmx +0 -0
- package/binaries/rmx.cjs +178 -0
- package/{bin → binaries}/submodule-token +0 -0
- package/binaries/submodule-token.cjs +178 -0
- package/binaries/test-cjs +10 -0
- package/binaries/test-cjs.cjs +178 -0
- package/binaries/test-cjs.cmd +11 -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 +148 -0
- package/docs-src/clean-github-actions-caches.md +26 -0
- package/docs-src/free-chatgpt.md +26 -0
- package/lib/binary-collections-config.cjs +3 -2
- package/lib/binary-collections-config.mjs +2 -2
- package/lib/binary-collections.cjs +513 -105
- package/lib/binary-collections.mjs +178 -117
- package/lib/changelog.cjs +64 -16
- package/lib/changelog.mjs +177 -171
- package/lib/{chunk-VVEZVNIV.mjs → chunk-2CBJCW7E.mjs} +3 -3
- package/lib/chunk-34IQDTLZ.mjs +27 -0
- package/lib/chunk-3HFFECCI.mjs +27 -0
- package/lib/chunk-4UHL4WVN.mjs +136 -0
- package/lib/{chunk-4BYBVEYC.mjs → chunk-66PAU5PS.mjs} +5 -4
- package/lib/chunk-6HHJRKFB.mjs +59 -0
- package/lib/chunk-6S4NXESK.mjs +26 -0
- package/lib/chunk-7XTEJHOE.mjs +193 -0
- package/lib/{chunk-ZYAQRPUL.mjs → chunk-7YD7IPFF.mjs} +2 -2
- package/lib/{chunk-SH3L6HHV.mjs → chunk-A2JQXI5Z.mjs} +2 -2
- package/lib/{chunk-EGSSKVDH.mjs → chunk-A3VUZEJK.mjs} +1 -1
- package/lib/chunk-AJDD5DZM.mjs +109 -0
- package/lib/chunk-BZWVHODJ.mjs +62 -0
- package/lib/chunk-FCDQGYBF.mjs +136 -0
- package/lib/chunk-FKI7IEB5.mjs +172 -0
- package/lib/chunk-GEYA2USY.mjs +207 -0
- package/lib/chunk-GJTGHXRA.mjs +356 -0
- package/lib/{chunk-YV7DO3YV.mjs → chunk-HLGOWBEO.mjs} +1 -1
- package/lib/chunk-ID2WBTE2.mjs +80 -0
- package/lib/chunk-JXFOHKDM.mjs +239 -0
- package/lib/{chunk-YX5U7XDR.mjs → chunk-M3YIYRHT.mjs} +6 -5
- package/lib/chunk-N436BNBK.mjs +514 -0
- package/lib/chunk-NCXAP7AA.mjs +31 -0
- package/lib/chunk-PDN26I7O.mjs +188 -0
- package/lib/{chunk-JGR2NW6D.mjs → chunk-PDSXF5HY.mjs} +3 -3
- package/lib/{chunk-AASHBCRW.mjs → chunk-QQ4A6DLD.mjs} +8 -0
- package/lib/{chunk-ONIBBBQ3.mjs → chunk-RWLXRTYP.mjs} +4 -3
- package/lib/chunk-TOIVAQF7.mjs +136 -0
- package/lib/chunk-V5SKYJUB.mjs +136 -0
- package/lib/chunk-WSRETQCA.mjs +59 -0
- package/lib/chunk-XA3SNBPA.mjs +184 -0
- package/lib/chunk-XVBFFVCJ.mjs +209 -0
- package/lib/chunk-YYLIQQKF.mjs +31 -0
- package/lib/{chunk-APBWENF6.mjs → chunk-Z6JLYU2J.mjs} +63 -16
- package/lib/chunk-ZDMWBSYF.mjs +81 -0
- package/lib/clean-github-actions-caches.cjs +291 -148
- package/lib/clean-github-actions-caches.mjs +4 -3
- package/lib/del-gradle.cjs +63 -15
- package/lib/del-gradle.js +2 -1
- package/lib/del-gradle.mjs +2 -2
- package/lib/del-node-modules.cjs +143 -148
- package/lib/del-node-modules.js +210 -14
- package/lib/del-node-modules.mjs +149 -18
- package/lib/del-ps.cjs +90 -21
- package/lib/del-ps.js +3 -2
- package/lib/del-ps.mjs +7 -5
- package/lib/del-yarn-caches.cjs +87 -18
- package/lib/del-yarn-caches.js +38 -3
- package/lib/del-yarn-caches.mjs +6 -6
- package/lib/find-node-modules-cli.cjs +5 -4
- package/lib/find-node-modules-cli.js +2 -1
- package/lib/find-node-modules-cli.mjs +2 -2
- package/lib/find-node-modules.cjs +4 -3
- package/lib/{find-node-modules.d.ts → find-node-modules.d.cts} +1 -1
- package/lib/find-node-modules.mjs +2 -2
- package/lib/free-chatgpt.cjs +754 -0
- package/lib/free-chatgpt.js +51 -0
- package/lib/free-chatgpt.mjs +50 -0
- package/lib/git/gitattributes.cjs +2 -1
- package/lib/git/{gitattributes.d.ts → gitattributes.d.cts} +7 -2
- package/lib/git/gitattributes.mjs +2 -2
- package/lib/git/line-endings.cjs +298 -64
- package/lib/git/line-endings.mjs +4 -4
- package/lib/git/normalize.cjs +26 -36
- package/lib/git/normalize.mjs +2 -2
- package/lib/git/permissions.cjs +77 -11
- package/lib/git/permissions.mjs +3 -3
- package/lib/git/pull-strategy.cjs +76 -9
- package/lib/git/pull-strategy.mjs +3 -3
- 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 +313 -83
- package/lib/git/user-config.mjs +4 -4
- package/lib/git/utils.cjs +40 -60
- package/lib/git/utils.mjs +2 -2
- package/lib/git-diff-cli.cjs +857 -0
- package/lib/git-diff-cli.js +16 -0
- package/lib/git-diff-cli.mjs +17 -0
- package/lib/git-diff.cjs +862 -58
- package/lib/git-diff.d.ts +38 -83
- package/lib/git-diff.js +152 -0
- package/lib/git-diff.mjs +23 -85
- package/lib/git-fix.cjs +733 -97
- package/lib/git-fix.mjs +10 -9
- package/lib/git-purge.cjs +64 -16
- package/lib/git-purge.d.cts +1 -0
- package/lib/git-purge.mjs +43 -37
- package/lib/index.cjs +7 -6
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -5
- package/lib/index.mjs +4 -4
- 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/npm-run-series.cjs +63 -16
- package/lib/npm-run-series.mjs +42 -36
- package/lib/package-resolutions-updater-cli.cjs +560 -0
- package/lib/package-resolutions-updater-cli.d.mts +1 -0
- package/lib/package-resolutions-updater-cli.mjs +124 -0
- package/lib/package-resolutions-updater.cjs +178 -158
- package/lib/package-resolutions-updater.d.mts +32 -1
- package/lib/package-resolutions-updater.mjs +17 -338
- 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 +320 -207
- package/lib/print-directory-tree.mjs +3 -3
- package/lib/ps/connected-domain.cjs +25 -2
- package/lib/ps/connected-domain.d.ts +10 -2
- package/lib/ps/connected-domain.js +5 -2
- package/lib/ps/connected-domain.mjs +8 -4
- package/lib/ps/index.cjs +345 -322
- package/lib/ps/index.d.mjs +1 -1
- package/lib/ps/index.js +2 -1
- package/lib/ps/index.mjs +179 -182
- package/lib/ps/isWin.cjs +24 -1
- package/lib/ps/isWin.d.ts +1 -1
- package/lib/ps/isWin.js +3 -1
- package/lib/ps/isWin.mjs +8 -4
- package/lib/ps/table-parser.cjs +167 -159
- package/lib/ps/table-parser.d.ts +5 -0
- package/lib/ps/table-parser.js +10 -4
- package/lib/ps/table-parser.mjs +9 -5
- package/lib/remove-module.cjs +310 -0
- package/lib/remove-module.d.mts +1 -0
- package/lib/remove-module.mjs +111 -0
- package/lib/rmpath.cjs +322 -0
- package/lib/rmpath.d.mts +3 -0
- package/lib/rmpath.mjs +108 -0
- package/lib/submodule-install.cjs +311 -86
- package/lib/submodule-install.mjs +53 -5
- package/lib/submodule-remove-cli.cjs +107 -0
- package/lib/submodule-remove-cli.d.ts +1 -0
- package/lib/submodule-remove-cli.js +31 -0
- package/lib/submodule-remove-cli.mjs +28 -0
- package/lib/submodule-remove.cjs +46 -0
- package/lib/submodule-remove.d.cts +2 -0
- package/lib/submodule-remove.mjs +6 -0
- package/lib/utils/chatgpt.cjs +541 -0
- package/lib/utils/chatgpt.d.ts +31 -0
- package/lib/utils/chatgpt.js +708 -0
- package/lib/utils/chatgpt.mjs +8 -0
- package/lib/utils/findEnvFiles.cjs +107 -0
- package/lib/utils/findEnvFiles.d.ts +8 -0
- package/lib/utils/findEnvFiles.js +121 -0
- package/lib/utils/findEnvFiles.mjs +8 -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.cjs → utils/index.cjs} +61 -14
- package/lib/{utils.mjs → utils/index.mjs} +2 -2
- 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/yarn-reinstall.cjs +220 -38
- package/lib/yarn-reinstall.mjs +2 -2
- package/package.json +138 -104
- package/readme.md +48 -75
- package/releases/readme.md +36 -0
- package/requirements.txt +1 -0
- package/test/README.md +101 -0
- package/test/package.json +2 -1
- package/test-project/readme.md +26 -0
- package/tmp/test-repo/README.md +35 -0
- package/tmp/test-repo/package.json +1 -1
- package/tmp/typedoc/readme.md +320 -0
- package/bin/bash-dummy +0 -56
- package/bin/bash-dummy.cmd +0 -25
- package/bin/dir-tree.cmd +0 -7
- package/bin/git-diff +0 -4
- package/bin/git-diff.cmd +0 -7
- package/bin/git-fix +0 -36
- package/bin/git-fix.cmd +0 -7
- package/bin/rmpath +0 -70
- package/bin/submodule-install.txt +0 -118
- package/bin/submodule-remove +0 -46
- package/bin/submodule.txt +0 -172
- package/lib/binary-collections-config.d.mts +0 -18
- package/lib/binary-collections-config.js +0 -39
- package/lib/binary-collections.d.mts +0 -137
- package/lib/binary-collections.d.ts +0 -137
- package/lib/changelog.d.mts +0 -2
- package/lib/changelog.js +0 -226
- package/lib/chunk-DPKAJKFO.mjs +0 -171
- package/lib/chunk-G3THLIDT.mjs +0 -200
- package/lib/chunk-W3ENOM53.mjs +0 -18
- package/lib/clean-github-actions-caches.d.mts +0 -169
- package/lib/clean-github-actions-caches.d.ts +0 -169
- package/lib/del-gradle.d.mts +0 -2
- package/lib/del-node-modules.d.mts +0 -2
- package/lib/del-ps.d.mts +0 -2
- package/lib/del-yarn-caches.d.mts +0 -2
- package/lib/find-node-modules-cli.d.mts +0 -1
- package/lib/find-node-modules.d.mts +0 -13
- package/lib/find-node-modules.js +0 -53
- package/lib/git/gitattributes.d.mts +0 -35
- package/lib/git/gitattributes.js +0 -223
- package/lib/git/line-endings.d.mts +0 -83
- package/lib/git/line-endings.d.ts +0 -83
- package/lib/git/normalize.d.mts +0 -43
- package/lib/git/normalize.d.ts +0 -43
- package/lib/git/permissions.d.mts +0 -17
- package/lib/git/permissions.d.ts +0 -17
- package/lib/git/pull-strategy.d.mts +0 -15
- package/lib/git/pull-strategy.d.ts +0 -15
- package/lib/git/user-config.d.mts +0 -105
- package/lib/git/user-config.d.ts +0 -105
- package/lib/git/utils.d.mts +0 -69
- package/lib/git/utils.d.ts +0 -69
- package/lib/git-diff.d.mts +0 -84
- package/lib/git-fix.d.mts +0 -141
- package/lib/git-fix.d.ts +0 -141
- package/lib/git-purge.d.mts +0 -2
- package/lib/git-purge.js +0 -59
- package/lib/index.d.mts +0 -1
- package/lib/npm-run-series.d.mts +0 -1
- package/lib/npm-run-series.js +0 -86
- package/lib/package-resolutions-updater.d.ts +0 -352
- package/lib/print-directory-tree.d.mts +0 -234
- package/lib/print-directory-tree.d.ts +0 -234
- package/lib/ps/connected-domain.d.mts +0 -3
- package/lib/ps/index.d.d.mts +0 -26
- package/lib/ps/index.d.d.ts +0 -26
- package/lib/ps/index.d.mts +0 -26
- package/lib/ps/isWin.d.mts +0 -3
- package/lib/ps/table-parser.d.mts +0 -3
- package/lib/submodule-install.d.mts +0 -121
- package/lib/submodule-install.d.ts +0 -121
- package/lib/utils.d.mts +0 -40
- package/lib/utils.js +0 -181
- package/lib/yarn-reinstall.d.mts +0 -49
- package/lib/yarn-reinstall.d.ts +0 -49
- package/src/package-resolutions-updater.mjs +0 -350
- package/src/print-directory-tree.cjs +0 -234
- package/src/ps/index.js +0 -286
- package/src/yarn-reinstall.cjs +0 -49
- /package/{bin → binaries}/nodekill +0 -0
- /package/{bin → binaries}/nodekill.cmd +0 -0
- /package/lib/{binary-collections-config.d.ts → binary-collections-config.d.cts} +0 -0
- /package/lib/{changelog.d.ts → changelog.d.cts} +0 -0
- /package/lib/{git-purge.d.ts → free-chatgpt.d.ts} +0 -0
- /package/lib/{git-diff.d.cts → git-diff-cli.d.ts} +0 -0
- /package/lib/{npm-run-series.d.ts → npm-run-series.d.cts} +0 -0
- /package/lib/{utils.d.ts → utils/index.d.cts} +0 -0
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
const axios = require("axios");
|
|
2
|
-
const { parseGitRemotes } = require("./utils");
|
|
3
|
-
const path = require("upath");
|
|
4
|
-
const fs = require("fs");
|
|
5
|
-
const projectDir = process.cwd();
|
|
6
|
-
const envPath = path.join(projectDir, ".env");
|
|
7
|
-
|
|
8
|
-
// Load the .env file using dotenv
|
|
9
|
-
if (fs.existsSync(envPath)) {
|
|
10
|
-
require("dotenv").config({ path: envPath });
|
|
11
|
-
} else {
|
|
12
|
-
console.warn(`.env file not found at ${envPath}`);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// delete caches leaving single last cache based on creation date
|
|
16
|
-
|
|
17
|
-
const ACCESS_TOKEN = process.env.GITHUB_TOKEN || process.env.ACCESS_TOKEN;
|
|
18
|
-
|
|
19
|
-
if (!ACCESS_TOKEN) {
|
|
20
|
-
throw new Error(
|
|
21
|
-
"Access token is not provided. Please set ACCESS_TOKEN or GITHUB_TOKEN in your environment variables."
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Deletes a GitHub Actions cache.
|
|
27
|
-
* @param {string} GH_REPO - The GitHub repository in the format "owner/repo".
|
|
28
|
-
* @param {string} cacheId - The ID of the cache to delete.
|
|
29
|
-
* @returns {Promise} - A promise that resolves on success and rejects on error.
|
|
30
|
-
*/
|
|
31
|
-
function deleteGitHubActionsCache(GH_REPO, cacheId) {
|
|
32
|
-
return new Promise((resolve, reject) => {
|
|
33
|
-
const url = `https://api.github.com/repos/${GH_REPO}/actions/caches/${cacheId}`;
|
|
34
|
-
const token = ACCESS_TOKEN;
|
|
35
|
-
|
|
36
|
-
if (!token) {
|
|
37
|
-
return reject(new Error("Access token is not provided"));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
axios
|
|
41
|
-
.delete(url, {
|
|
42
|
-
headers: {
|
|
43
|
-
Authorization: `token ${token}`,
|
|
44
|
-
Accept: "application/vnd.github.v3+json"
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
.then((response) => {
|
|
48
|
-
console.log(`Cache (${cacheId}) deleted successfully`, response.data);
|
|
49
|
-
resolve(response.data); // Resolve with the response data
|
|
50
|
-
})
|
|
51
|
-
.catch((error) => {
|
|
52
|
-
console.error("Error deleting cache:", error.response?.data || error.message || "Unknown error");
|
|
53
|
-
reject(error); // Reject with the error
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* list github actions caches
|
|
60
|
-
* @param {string} GH_REPO
|
|
61
|
-
* @returns {Promise<Record<string, Record<string, any>[]>>}
|
|
62
|
-
*/
|
|
63
|
-
function get_caches(GH_REPO) {
|
|
64
|
-
const url = `https://api.github.com/repos/${GH_REPO}/actions/caches`;
|
|
65
|
-
|
|
66
|
-
return new Promise((resolve, reject) => {
|
|
67
|
-
axios
|
|
68
|
-
.get(url, {
|
|
69
|
-
headers: {
|
|
70
|
-
Accept: "application/vnd.github.v3+json",
|
|
71
|
-
Authorization: `token ${ACCESS_TOKEN}`
|
|
72
|
-
}
|
|
73
|
-
})
|
|
74
|
-
.then((response) => {
|
|
75
|
-
/**
|
|
76
|
-
* @type {Record<string, any>[]}
|
|
77
|
-
*/
|
|
78
|
-
const data = response.data.actions_caches;
|
|
79
|
-
// resolve(response.data);
|
|
80
|
-
/**
|
|
81
|
-
* extract the prefix from the key
|
|
82
|
-
* @param {string} key
|
|
83
|
-
* @returns
|
|
84
|
-
*/
|
|
85
|
-
const getPrefix = (key) => {
|
|
86
|
-
const split = key.split(/[-_]/);
|
|
87
|
-
if (split.length == 3) {
|
|
88
|
-
return `${split[0]}-${split[1]}`;
|
|
89
|
-
} else if (split.length > 3) {
|
|
90
|
-
return `${split[0]}-${split[1]}-${split[2]}`;
|
|
91
|
-
}
|
|
92
|
-
return split[0];
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
// Group by prefix
|
|
96
|
-
const grouped = data.reduce(
|
|
97
|
-
/**
|
|
98
|
-
* @param {Record<string, Record<string, any>[]>} acc
|
|
99
|
-
* @param {Record<string, any>} item
|
|
100
|
-
* @returns {Record<string, Record<string, any>[]>}
|
|
101
|
-
*/
|
|
102
|
-
(acc, item) => {
|
|
103
|
-
const prefix = getPrefix(item.key);
|
|
104
|
-
|
|
105
|
-
if (!acc[prefix]) {
|
|
106
|
-
acc[prefix] = [];
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
acc[prefix].push(item);
|
|
110
|
-
|
|
111
|
-
return acc;
|
|
112
|
-
},
|
|
113
|
-
{}
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
// Convert the grouped object into an array of arrays
|
|
117
|
-
// const result = Object.values(grouped);
|
|
118
|
-
resolve(grouped);
|
|
119
|
-
})
|
|
120
|
-
.catch((error) => {
|
|
121
|
-
console.error("Error fetching data:", error);
|
|
122
|
-
reject(error); // Reject the promise with the error
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Deletes old GitHub Actions caches for the current repository (origin remote),
|
|
129
|
-
* keeping only the most recent cache for each prefix (based on creation date).
|
|
130
|
-
* Retrieves caches, groups by prefix, sorts by creation date, and deletes all but the latest.
|
|
131
|
-
*/
|
|
132
|
-
(async () => {
|
|
133
|
-
try {
|
|
134
|
-
const remotes = await parseGitRemotes();
|
|
135
|
-
const GH_REPO = remotes.origin;
|
|
136
|
-
const caches = await get_caches(GH_REPO);
|
|
137
|
-
|
|
138
|
-
for (const key in caches) {
|
|
139
|
-
if (Object.hasOwnProperty.call(caches, key)) {
|
|
140
|
-
const items = caches[key]
|
|
141
|
-
.sort((a, b) => new Date(b.created_at) - new Date(a.created_at))
|
|
142
|
-
.map((item) => ({
|
|
143
|
-
...item,
|
|
144
|
-
human_readable_date: new Date(item.created_at).toLocaleString()
|
|
145
|
-
}));
|
|
146
|
-
|
|
147
|
-
if (items.length > 1) {
|
|
148
|
-
const ids = items.map((o) => o.id);
|
|
149
|
-
ids.shift(); // keep the most recent cache
|
|
150
|
-
if (ids.length > 0) {
|
|
151
|
-
for (const id of ids) {
|
|
152
|
-
try {
|
|
153
|
-
await deleteGitHubActionsCache(GH_REPO, id);
|
|
154
|
-
} catch (err) {
|
|
155
|
-
console.error(`Error deleting cache ${id}:`, err);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
} else {
|
|
159
|
-
console.log(`cache prefix ${key} no cache left`);
|
|
160
|
-
}
|
|
161
|
-
} else {
|
|
162
|
-
console.log(`cache prefix ${key} only have 1 cache`);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
} catch (e) {
|
|
167
|
-
console.error(`Error: ${e}`);
|
|
168
|
-
}
|
|
169
|
-
})();
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
const axios = require("axios");
|
|
2
|
-
const { parseGitRemotes } = require("./utils");
|
|
3
|
-
const path = require("upath");
|
|
4
|
-
const fs = require("fs");
|
|
5
|
-
const projectDir = process.cwd();
|
|
6
|
-
const envPath = path.join(projectDir, ".env");
|
|
7
|
-
|
|
8
|
-
// Load the .env file using dotenv
|
|
9
|
-
if (fs.existsSync(envPath)) {
|
|
10
|
-
require("dotenv").config({ path: envPath });
|
|
11
|
-
} else {
|
|
12
|
-
console.warn(`.env file not found at ${envPath}`);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// delete caches leaving single last cache based on creation date
|
|
16
|
-
|
|
17
|
-
const ACCESS_TOKEN = process.env.GITHUB_TOKEN || process.env.ACCESS_TOKEN;
|
|
18
|
-
|
|
19
|
-
if (!ACCESS_TOKEN) {
|
|
20
|
-
throw new Error(
|
|
21
|
-
"Access token is not provided. Please set ACCESS_TOKEN or GITHUB_TOKEN in your environment variables."
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Deletes a GitHub Actions cache.
|
|
27
|
-
* @param {string} GH_REPO - The GitHub repository in the format "owner/repo".
|
|
28
|
-
* @param {string} cacheId - The ID of the cache to delete.
|
|
29
|
-
* @returns {Promise} - A promise that resolves on success and rejects on error.
|
|
30
|
-
*/
|
|
31
|
-
function deleteGitHubActionsCache(GH_REPO, cacheId) {
|
|
32
|
-
return new Promise((resolve, reject) => {
|
|
33
|
-
const url = `https://api.github.com/repos/${GH_REPO}/actions/caches/${cacheId}`;
|
|
34
|
-
const token = ACCESS_TOKEN;
|
|
35
|
-
|
|
36
|
-
if (!token) {
|
|
37
|
-
return reject(new Error("Access token is not provided"));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
axios
|
|
41
|
-
.delete(url, {
|
|
42
|
-
headers: {
|
|
43
|
-
Authorization: `token ${token}`,
|
|
44
|
-
Accept: "application/vnd.github.v3+json"
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
.then((response) => {
|
|
48
|
-
console.log(`Cache (${cacheId}) deleted successfully`, response.data);
|
|
49
|
-
resolve(response.data); // Resolve with the response data
|
|
50
|
-
})
|
|
51
|
-
.catch((error) => {
|
|
52
|
-
console.error("Error deleting cache:", error.response?.data || error.message || "Unknown error");
|
|
53
|
-
reject(error); // Reject with the error
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* list github actions caches
|
|
60
|
-
* @param {string} GH_REPO
|
|
61
|
-
* @returns {Promise<Record<string, Record<string, any>[]>>}
|
|
62
|
-
*/
|
|
63
|
-
function get_caches(GH_REPO) {
|
|
64
|
-
const url = `https://api.github.com/repos/${GH_REPO}/actions/caches`;
|
|
65
|
-
|
|
66
|
-
return new Promise((resolve, reject) => {
|
|
67
|
-
axios
|
|
68
|
-
.get(url, {
|
|
69
|
-
headers: {
|
|
70
|
-
Accept: "application/vnd.github.v3+json",
|
|
71
|
-
Authorization: `token ${ACCESS_TOKEN}`
|
|
72
|
-
}
|
|
73
|
-
})
|
|
74
|
-
.then((response) => {
|
|
75
|
-
/**
|
|
76
|
-
* @type {Record<string, any>[]}
|
|
77
|
-
*/
|
|
78
|
-
const data = response.data.actions_caches;
|
|
79
|
-
// resolve(response.data);
|
|
80
|
-
/**
|
|
81
|
-
* extract the prefix from the key
|
|
82
|
-
* @param {string} key
|
|
83
|
-
* @returns
|
|
84
|
-
*/
|
|
85
|
-
const getPrefix = (key) => {
|
|
86
|
-
const split = key.split(/[-_]/);
|
|
87
|
-
if (split.length == 3) {
|
|
88
|
-
return `${split[0]}-${split[1]}`;
|
|
89
|
-
} else if (split.length > 3) {
|
|
90
|
-
return `${split[0]}-${split[1]}-${split[2]}`;
|
|
91
|
-
}
|
|
92
|
-
return split[0];
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
// Group by prefix
|
|
96
|
-
const grouped = data.reduce(
|
|
97
|
-
/**
|
|
98
|
-
* @param {Record<string, Record<string, any>[]>} acc
|
|
99
|
-
* @param {Record<string, any>} item
|
|
100
|
-
* @returns {Record<string, Record<string, any>[]>}
|
|
101
|
-
*/
|
|
102
|
-
(acc, item) => {
|
|
103
|
-
const prefix = getPrefix(item.key);
|
|
104
|
-
|
|
105
|
-
if (!acc[prefix]) {
|
|
106
|
-
acc[prefix] = [];
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
acc[prefix].push(item);
|
|
110
|
-
|
|
111
|
-
return acc;
|
|
112
|
-
},
|
|
113
|
-
{}
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
// Convert the grouped object into an array of arrays
|
|
117
|
-
// const result = Object.values(grouped);
|
|
118
|
-
resolve(grouped);
|
|
119
|
-
})
|
|
120
|
-
.catch((error) => {
|
|
121
|
-
console.error("Error fetching data:", error);
|
|
122
|
-
reject(error); // Reject the promise with the error
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Deletes old GitHub Actions caches for the current repository (origin remote),
|
|
129
|
-
* keeping only the most recent cache for each prefix (based on creation date).
|
|
130
|
-
* Retrieves caches, groups by prefix, sorts by creation date, and deletes all but the latest.
|
|
131
|
-
*/
|
|
132
|
-
(async () => {
|
|
133
|
-
try {
|
|
134
|
-
const remotes = await parseGitRemotes();
|
|
135
|
-
const GH_REPO = remotes.origin;
|
|
136
|
-
const caches = await get_caches(GH_REPO);
|
|
137
|
-
|
|
138
|
-
for (const key in caches) {
|
|
139
|
-
if (Object.hasOwnProperty.call(caches, key)) {
|
|
140
|
-
const items = caches[key]
|
|
141
|
-
.sort((a, b) => new Date(b.created_at) - new Date(a.created_at))
|
|
142
|
-
.map((item) => ({
|
|
143
|
-
...item,
|
|
144
|
-
human_readable_date: new Date(item.created_at).toLocaleString()
|
|
145
|
-
}));
|
|
146
|
-
|
|
147
|
-
if (items.length > 1) {
|
|
148
|
-
const ids = items.map((o) => o.id);
|
|
149
|
-
ids.shift(); // keep the most recent cache
|
|
150
|
-
if (ids.length > 0) {
|
|
151
|
-
for (const id of ids) {
|
|
152
|
-
try {
|
|
153
|
-
await deleteGitHubActionsCache(GH_REPO, id);
|
|
154
|
-
} catch (err) {
|
|
155
|
-
console.error(`Error deleting cache ${id}:`, err);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
} else {
|
|
159
|
-
console.log(`cache prefix ${key} no cache left`);
|
|
160
|
-
}
|
|
161
|
-
} else {
|
|
162
|
-
console.log(`cache prefix ${key} only have 1 cache`);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
} catch (e) {
|
|
167
|
-
console.error(`Error: ${e}`);
|
|
168
|
-
}
|
|
169
|
-
})();
|
package/lib/del-gradle.d.mts
DELETED
package/lib/del-ps.d.mts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Asynchronously finds all "node_modules" directories within the given directory.
|
|
3
|
-
*
|
|
4
|
-
* @param {string} [dir=process.cwd()] - The directory to start the search from. Defaults to the current working directory.
|
|
5
|
-
* @param {function} [callback=null] - Optional callback function that gets called with each found "node_modules" path.
|
|
6
|
-
* @returns {Promise<string[]>} - A promise that resolves to an array of full paths to "node_modules" directories.
|
|
7
|
-
*/
|
|
8
|
-
declare function findNodeModules(dir?: string, callback?: Function): Promise<string[]>;
|
|
9
|
-
declare namespace findNodeModules {
|
|
10
|
-
export { findNodeModules as default };
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export { findNodeModules as default };
|
package/lib/find-node-modules.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
const glob = require("glob");
|
|
2
|
-
const path = require("path");
|
|
3
|
-
/**
|
|
4
|
-
* Asynchronously finds all "node_modules" directories within the given directory.
|
|
5
|
-
*
|
|
6
|
-
* @param {string} [dir=process.cwd()] - The directory to start the search from. Defaults to the current working directory.
|
|
7
|
-
* @param {function} [callback=null] - Optional callback function that gets called with each found "node_modules" path.
|
|
8
|
-
* @returns {Promise<string[]>} - A promise that resolves to an array of full paths to "node_modules" directories.
|
|
9
|
-
*/
|
|
10
|
-
function findNodeModules(dir = process.cwd(), callback = null) {
|
|
11
|
-
const finalDir = typeof dir === "string" ? dir : process.cwd();
|
|
12
|
-
return new Promise((resolve, reject) => {
|
|
13
|
-
const results = [];
|
|
14
|
-
const g3 = new glob.Glob("**/node_modules", {
|
|
15
|
-
withFileTypes: false,
|
|
16
|
-
cwd: finalDir,
|
|
17
|
-
ignore: ["**/.git*", "**/vendor/**"]
|
|
18
|
-
});
|
|
19
|
-
const stream = g3.stream();
|
|
20
|
-
stream.on("data", (result) => {
|
|
21
|
-
const fullPath = path.resolve(finalDir, result);
|
|
22
|
-
if (typeof callback === "function") {
|
|
23
|
-
try {
|
|
24
|
-
callback(fullPath); // Safely invoke callback
|
|
25
|
-
}
|
|
26
|
-
catch (err) {
|
|
27
|
-
console.error("findNodeModules callback error:", err);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
results.push(fullPath);
|
|
31
|
-
});
|
|
32
|
-
stream.on("error", (err) => reject(err)); // Handle errors
|
|
33
|
-
stream.on("end", () => {
|
|
34
|
-
if (results.length === 0) {
|
|
35
|
-
console.log("No node_modules directories found.");
|
|
36
|
-
}
|
|
37
|
-
resolve(results); // Resolve the full array when the stream ends
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
// Support both CommonJS and ESM usage
|
|
42
|
-
if (typeof module !== "undefined" && require.main === module) {
|
|
43
|
-
findNodeModules(null, console.log)
|
|
44
|
-
.then((dirs) => {
|
|
45
|
-
console.log(`Found ${dirs.length} node_modules directories.`);
|
|
46
|
-
})
|
|
47
|
-
.catch((err) => {
|
|
48
|
-
console.error("Error finding node_modules directories:", err);
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
// ESM export support
|
|
52
|
-
module.exports = findNodeModules;
|
|
53
|
-
module.exports.default = findNodeModules;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parse existing .gitattributes file into structured rules
|
|
3
|
-
* @param {string} gitattributesPath - Path to .gitattributes file
|
|
4
|
-
* @returns {Array} Array of parsed rules
|
|
5
|
-
*/
|
|
6
|
-
declare function parseGitAttributes(gitattributesPath: string): any[];
|
|
7
|
-
/**
|
|
8
|
-
* Check if two patterns conflict (same or overlapping file patterns)
|
|
9
|
-
* @param {string} pattern1 - First pattern
|
|
10
|
-
* @param {string} pattern2 - Second pattern
|
|
11
|
-
* @returns {boolean} True if patterns conflict
|
|
12
|
-
*/
|
|
13
|
-
declare function patternsConflict(pattern1: string, pattern2: string): boolean;
|
|
14
|
-
/**
|
|
15
|
-
* Merge existing rules with desired rules, detecting conflicts
|
|
16
|
-
* @param {Array} existingRules - Parsed existing rules
|
|
17
|
-
* @param {Array} desiredRules - Desired rules to add
|
|
18
|
-
* @returns {Object} Result with mergedRules, conflicts, and changes
|
|
19
|
-
*/
|
|
20
|
-
declare function mergeGitAttributeRules(existingRules: any[], desiredRules: any[]): any;
|
|
21
|
-
/**
|
|
22
|
-
* Format merged rules back into .gitattributes content
|
|
23
|
-
* @param {Array} rules - Merged rules array
|
|
24
|
-
* @returns {string} Formatted .gitattributes content
|
|
25
|
-
*/
|
|
26
|
-
declare function formatGitAttributes(rules: any[]): string;
|
|
27
|
-
/**
|
|
28
|
-
* Update .gitattributes file with new rules, handling conflicts intelligently
|
|
29
|
-
* @param {string} gitattributesPath - Path to .gitattributes file
|
|
30
|
-
* @param {Array} desiredRules - Array of desired rules to add/merge
|
|
31
|
-
* @returns {Object} Result with success status, conflicts, and changes
|
|
32
|
-
*/
|
|
33
|
-
declare function updateGitAttributes(gitattributesPath: string, desiredRules: any[]): any;
|
|
34
|
-
|
|
35
|
-
export { formatGitAttributes, mergeGitAttributeRules, parseGitAttributes, patternsConflict, updateGitAttributes };
|
package/lib/git/gitattributes.js
DELETED
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
const fs = require("fs");
|
|
2
|
-
/**
|
|
3
|
-
* Parse existing .gitattributes file into structured rules
|
|
4
|
-
* @param {string} gitattributesPath - Path to .gitattributes file
|
|
5
|
-
* @returns {Array} Array of parsed rules
|
|
6
|
-
*/
|
|
7
|
-
function parseGitAttributes(gitattributesPath) {
|
|
8
|
-
const rules = [];
|
|
9
|
-
if (!fs.existsSync(gitattributesPath)) {
|
|
10
|
-
return rules;
|
|
11
|
-
}
|
|
12
|
-
const content = fs.readFileSync(gitattributesPath, "utf8");
|
|
13
|
-
const lines = content.split("\n");
|
|
14
|
-
lines.forEach((line, index) => {
|
|
15
|
-
const trimmedLine = line.trim();
|
|
16
|
-
// Skip empty lines and comments
|
|
17
|
-
if (!trimmedLine || trimmedLine.startsWith("#")) {
|
|
18
|
-
rules.push({
|
|
19
|
-
type: trimmedLine.startsWith("#") ? "comment" : "empty",
|
|
20
|
-
content: line,
|
|
21
|
-
lineNumber: index + 1
|
|
22
|
-
});
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
// Parse rule line
|
|
26
|
-
const parts = trimmedLine.split(/\s+/);
|
|
27
|
-
if (parts.length >= 2) {
|
|
28
|
-
const pattern = parts[0];
|
|
29
|
-
const attributes = parts.slice(1).join(" ");
|
|
30
|
-
rules.push({
|
|
31
|
-
type: "rule",
|
|
32
|
-
pattern,
|
|
33
|
-
attributes,
|
|
34
|
-
content: line,
|
|
35
|
-
lineNumber: index + 1
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
// Invalid line, keep as-is
|
|
40
|
-
rules.push({
|
|
41
|
-
type: "invalid",
|
|
42
|
-
content: line,
|
|
43
|
-
lineNumber: index + 1
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
return rules;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Check if two patterns conflict (same or overlapping file patterns)
|
|
51
|
-
* @param {string} pattern1 - First pattern
|
|
52
|
-
* @param {string} pattern2 - Second pattern
|
|
53
|
-
* @returns {boolean} True if patterns conflict
|
|
54
|
-
*/
|
|
55
|
-
function patternsConflict(pattern1, pattern2) {
|
|
56
|
-
// Exact match
|
|
57
|
-
if (pattern1 === pattern2) {
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
// Universal pattern conflicts with everything
|
|
61
|
-
if (pattern1 === "*" || pattern2 === "*") {
|
|
62
|
-
return pattern1 !== pattern2;
|
|
63
|
-
}
|
|
64
|
-
// Simple glob overlap detection
|
|
65
|
-
const normalize = (p) => p.replace(/\{[^}]+\}/g, "*").replace(/\*+/g, "*");
|
|
66
|
-
const norm1 = normalize(pattern1);
|
|
67
|
-
const norm2 = normalize(pattern2);
|
|
68
|
-
return norm1 === norm2;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Merge existing rules with desired rules, detecting conflicts
|
|
72
|
-
* @param {Array} existingRules - Parsed existing rules
|
|
73
|
-
* @param {Array} desiredRules - Desired rules to add
|
|
74
|
-
* @returns {Object} Result with mergedRules, conflicts, and changes
|
|
75
|
-
*/
|
|
76
|
-
function mergeGitAttributeRules(existingRules, desiredRules) {
|
|
77
|
-
let mergedRules;
|
|
78
|
-
if (existingRules.length === 0) {
|
|
79
|
-
// If no existing rules, just add all desired rules in order
|
|
80
|
-
mergedRules = desiredRules.map((desired, idx) => ({
|
|
81
|
-
type: "rule",
|
|
82
|
-
pattern: desired.pattern,
|
|
83
|
-
attributes: desired.attributes,
|
|
84
|
-
content: `${desired.pattern} ${desired.attributes}`,
|
|
85
|
-
lineNumber: idx + 1,
|
|
86
|
-
added: true
|
|
87
|
-
}));
|
|
88
|
-
return {
|
|
89
|
-
mergedRules,
|
|
90
|
-
conflicts: [],
|
|
91
|
-
changes: desiredRules.map((rule) => ({ action: "added", pattern: rule.pattern, attributes: rule.attributes }))
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
mergedRules = [...existingRules];
|
|
96
|
-
}
|
|
97
|
-
const conflicts = [];
|
|
98
|
-
const changes = [];
|
|
99
|
-
desiredRules.forEach((desired) => {
|
|
100
|
-
// Look for an exact pattern match in existing rules
|
|
101
|
-
const existingIdx = mergedRules.findIndex((r) => r.type === "rule" && r.pattern === desired.pattern);
|
|
102
|
-
if (existingIdx !== -1) {
|
|
103
|
-
const existing = mergedRules[existingIdx];
|
|
104
|
-
if (existing.attributes === desired.attributes) {
|
|
105
|
-
// Already present, do nothing
|
|
106
|
-
conflicts.push({
|
|
107
|
-
pattern: desired.pattern,
|
|
108
|
-
existing: existing.attributes,
|
|
109
|
-
proposed: desired.attributes,
|
|
110
|
-
action: "kept existing (identical)"
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
else if (desired.priority > (existing.priority || 0)) {
|
|
114
|
-
// Replace with higher priority rule
|
|
115
|
-
mergedRules[existingIdx] = {
|
|
116
|
-
type: "rule",
|
|
117
|
-
pattern: desired.pattern,
|
|
118
|
-
attributes: desired.attributes,
|
|
119
|
-
content: `${desired.pattern} ${desired.attributes}`,
|
|
120
|
-
lineNumber: existing.lineNumber,
|
|
121
|
-
replaced: true
|
|
122
|
-
};
|
|
123
|
-
conflicts.push({
|
|
124
|
-
pattern: desired.pattern,
|
|
125
|
-
existing: existing.attributes,
|
|
126
|
-
proposed: desired.attributes,
|
|
127
|
-
action: "replaced (higher priority)"
|
|
128
|
-
});
|
|
129
|
-
changes.push({
|
|
130
|
-
action: "replaced",
|
|
131
|
-
pattern: desired.pattern,
|
|
132
|
-
attributes: desired.attributes,
|
|
133
|
-
oldAttributes: existing.attributes
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
// Keep existing rule
|
|
138
|
-
conflicts.push({
|
|
139
|
-
pattern: desired.pattern,
|
|
140
|
-
existing: existing.attributes,
|
|
141
|
-
proposed: desired.attributes,
|
|
142
|
-
action: "kept existing (lower priority)"
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
// No exact pattern match, add new rule
|
|
148
|
-
mergedRules.push({
|
|
149
|
-
type: "rule",
|
|
150
|
-
pattern: desired.pattern,
|
|
151
|
-
attributes: desired.attributes,
|
|
152
|
-
content: `${desired.pattern} ${desired.attributes}`,
|
|
153
|
-
lineNumber: mergedRules.length + 1,
|
|
154
|
-
added: true
|
|
155
|
-
});
|
|
156
|
-
changes.push({
|
|
157
|
-
action: "added",
|
|
158
|
-
pattern: desired.pattern,
|
|
159
|
-
attributes: desired.attributes
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
return { mergedRules, conflicts, changes };
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Format merged rules back into .gitattributes content
|
|
167
|
-
* @param {Array} rules - Merged rules array
|
|
168
|
-
* @returns {string} Formatted .gitattributes content
|
|
169
|
-
*/
|
|
170
|
-
function formatGitAttributes(rules) {
|
|
171
|
-
return (rules
|
|
172
|
-
.map((rule) => {
|
|
173
|
-
if (rule.type === "rule") {
|
|
174
|
-
return `${rule.pattern} ${rule.attributes}`;
|
|
175
|
-
}
|
|
176
|
-
return rule.content;
|
|
177
|
-
})
|
|
178
|
-
.join("\n") + "\n");
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Update .gitattributes file with new rules, handling conflicts intelligently
|
|
182
|
-
* @param {string} gitattributesPath - Path to .gitattributes file
|
|
183
|
-
* @param {Array} desiredRules - Array of desired rules to add/merge
|
|
184
|
-
* @returns {Object} Result with success status, conflicts, and changes
|
|
185
|
-
*/
|
|
186
|
-
function updateGitAttributes(gitattributesPath, desiredRules) {
|
|
187
|
-
try {
|
|
188
|
-
// Parse existing .gitattributes
|
|
189
|
-
const existingRules = parseGitAttributes(gitattributesPath);
|
|
190
|
-
// Merge rules and detect conflicts
|
|
191
|
-
const { mergedRules, conflicts, changes } = mergeGitAttributeRules(existingRules, desiredRules);
|
|
192
|
-
// Write updated .gitattributes if changes were made
|
|
193
|
-
let success = false;
|
|
194
|
-
if (changes.length > 0) {
|
|
195
|
-
const newContent = formatGitAttributes(mergedRules);
|
|
196
|
-
fs.writeFileSync(gitattributesPath, newContent);
|
|
197
|
-
success = true;
|
|
198
|
-
}
|
|
199
|
-
return {
|
|
200
|
-
success,
|
|
201
|
-
conflicts,
|
|
202
|
-
changes,
|
|
203
|
-
message: success
|
|
204
|
-
? `Updated .gitattributes with ${changes.length} changes`
|
|
205
|
-
: "No changes needed - all rules already present"
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
catch (error) {
|
|
209
|
-
return {
|
|
210
|
-
success: false,
|
|
211
|
-
error: error.message,
|
|
212
|
-
conflicts: [],
|
|
213
|
-
changes: []
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
module.exports = {
|
|
218
|
-
parseGitAttributes,
|
|
219
|
-
patternsConflict,
|
|
220
|
-
mergeGitAttributeRules,
|
|
221
|
-
formatGitAttributes,
|
|
222
|
-
updateGitAttributes
|
|
223
|
-
};
|