greenbump 0.2.0
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/LICENSE +21 -0
- package/README.md +125 -0
- package/README.zh-CN.md +213 -0
- package/action-dist/index.cjs +19695 -0
- package/action.yml +76 -0
- package/dist/action/github.js +70 -0
- package/dist/action/github.js.map +1 -0
- package/dist/action/main.js +99 -0
- package/dist/action/main.js.map +1 -0
- package/dist/agent/factory.js +72 -0
- package/dist/agent/factory.js.map +1 -0
- package/dist/agent/fixer.js +307 -0
- package/dist/agent/fixer.js.map +1 -0
- package/dist/agent/fixer.test.js +224 -0
- package/dist/agent/fixer.test.js.map +1 -0
- package/dist/agent/provider-anthropic.js +59 -0
- package/dist/agent/provider-anthropic.js.map +1 -0
- package/dist/agent/provider-openai.js +65 -0
- package/dist/agent/provider-openai.js.map +1 -0
- package/dist/agent/provider.js +4 -0
- package/dist/agent/provider.js.map +1 -0
- package/dist/cli.js +138 -0
- package/dist/cli.js.map +1 -0
- package/dist/engine/batch.js +246 -0
- package/dist/engine/batch.js.map +1 -0
- package/dist/engine/batch.test.js +59 -0
- package/dist/engine/batch.test.js.map +1 -0
- package/dist/engine/changelog.js +66 -0
- package/dist/engine/changelog.js.map +1 -0
- package/dist/engine/checks.js +41 -0
- package/dist/engine/checks.js.map +1 -0
- package/dist/engine/checks.test.js +92 -0
- package/dist/engine/checks.test.js.map +1 -0
- package/dist/engine/detect.js +5 -0
- package/dist/engine/detect.js.map +1 -0
- package/dist/engine/ecosystems/bundler.js +59 -0
- package/dist/engine/ecosystems/bundler.js.map +1 -0
- package/dist/engine/ecosystems/cargo.js +83 -0
- package/dist/engine/ecosystems/cargo.js.map +1 -0
- package/dist/engine/ecosystems/cocoapods.js +47 -0
- package/dist/engine/ecosystems/cocoapods.js.map +1 -0
- package/dist/engine/ecosystems/composer.js +32 -0
- package/dist/engine/ecosystems/composer.js.map +1 -0
- package/dist/engine/ecosystems/conan.js +106 -0
- package/dist/engine/ecosystems/conan.js.map +1 -0
- package/dist/engine/ecosystems/elm.js +77 -0
- package/dist/engine/ecosystems/elm.js.map +1 -0
- package/dist/engine/ecosystems/go.js +72 -0
- package/dist/engine/ecosystems/go.js.map +1 -0
- package/dist/engine/ecosystems/gradle.js +90 -0
- package/dist/engine/ecosystems/gradle.js.map +1 -0
- package/dist/engine/ecosystems/index.js +67 -0
- package/dist/engine/ecosystems/index.js.map +1 -0
- package/dist/engine/ecosystems/maven.js +77 -0
- package/dist/engine/ecosystems/maven.js.map +1 -0
- package/dist/engine/ecosystems/mix.js +64 -0
- package/dist/engine/ecosystems/mix.js.map +1 -0
- package/dist/engine/ecosystems/npm.js +47 -0
- package/dist/engine/ecosystems/npm.js.map +1 -0
- package/dist/engine/ecosystems/nuget.js +50 -0
- package/dist/engine/ecosystems/nuget.js.map +1 -0
- package/dist/engine/ecosystems/parsers.test.js +255 -0
- package/dist/engine/ecosystems/parsers.test.js.map +1 -0
- package/dist/engine/ecosystems/pip.js +61 -0
- package/dist/engine/ecosystems/pip.js.map +1 -0
- package/dist/engine/ecosystems/pipenv.js +37 -0
- package/dist/engine/ecosystems/pipenv.js.map +1 -0
- package/dist/engine/ecosystems/pnpm.js +48 -0
- package/dist/engine/ecosystems/pnpm.js.map +1 -0
- package/dist/engine/ecosystems/poetry.js +42 -0
- package/dist/engine/ecosystems/poetry.js.map +1 -0
- package/dist/engine/ecosystems/pub.js +32 -0
- package/dist/engine/ecosystems/pub.js.map +1 -0
- package/dist/engine/ecosystems/python-shared.js +29 -0
- package/dist/engine/ecosystems/python-shared.js.map +1 -0
- package/dist/engine/ecosystems/swiftpm.js +102 -0
- package/dist/engine/ecosystems/swiftpm.js.map +1 -0
- package/dist/engine/ecosystems/types.js +19 -0
- package/dist/engine/ecosystems/types.js.map +1 -0
- package/dist/engine/ecosystems/uv.js +36 -0
- package/dist/engine/ecosystems/uv.js.map +1 -0
- package/dist/engine/ecosystems/yarn.js +62 -0
- package/dist/engine/ecosystems/yarn.js.map +1 -0
- package/dist/engine/exec.js +47 -0
- package/dist/engine/exec.js.map +1 -0
- package/dist/engine/git.js +42 -0
- package/dist/engine/git.js.map +1 -0
- package/dist/engine/git.test.js +111 -0
- package/dist/engine/git.test.js.map +1 -0
- package/dist/engine/pm.js +14 -0
- package/dist/engine/pm.js.map +1 -0
- package/dist/engine/run.js +167 -0
- package/dist/engine/run.js.map +1 -0
- package/dist/engine/run.test.js +47 -0
- package/dist/engine/run.test.js.map +1 -0
- package/dist/engine/upgrade.js +10 -0
- package/dist/engine/upgrade.js.map +1 -0
- package/dist/engine/workspace.js +155 -0
- package/dist/engine/workspace.js.map +1 -0
- package/dist/engine/workspace.test.js +95 -0
- package/dist/engine/workspace.test.js.map +1 -0
- package/dist/exitcode.js +51 -0
- package/dist/exitcode.js.map +1 -0
- package/dist/exitcode.test.js +62 -0
- package/dist/exitcode.test.js.map +1 -0
- package/dist/format.js +101 -0
- package/dist/format.js.map +1 -0
- package/dist/pr.js +63 -0
- package/dist/pr.js.map +1 -0
- package/dist/report.js +13 -0
- package/dist/report.js.map +1 -0
- package/dist/report.test.js +56 -0
- package/dist/report.test.js.map +1 -0
- package/dist/test-utils.js +36 -0
- package/dist/test-utils.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { exec } from "../exec.js";
|
|
3
|
+
import { pathExists, safeJson } from "./types.js";
|
|
4
|
+
import { guessPythonTestCommand } from "./python-shared.js";
|
|
5
|
+
export function parsePipenvOutdated(data) {
|
|
6
|
+
if (!data)
|
|
7
|
+
return [];
|
|
8
|
+
return data.map((d) => ({ name: d.name, current: d.version, wanted: "", latest: d.latest_version }));
|
|
9
|
+
}
|
|
10
|
+
export const pipenvAdapter = {
|
|
11
|
+
id: "pipenv",
|
|
12
|
+
displayName: "Pipenv",
|
|
13
|
+
manifestFiles: ["Pipfile"],
|
|
14
|
+
lockFiles: ["Pipfile.lock"],
|
|
15
|
+
verified: true,
|
|
16
|
+
async detect(cwd) {
|
|
17
|
+
return pathExists(join(cwd, "Pipfile"));
|
|
18
|
+
},
|
|
19
|
+
async outdated(cwd) {
|
|
20
|
+
// `pipenv update --outdated` prints human text; the documented
|
|
21
|
+
// machine-readable path is asking pip inside pipenv's venv.
|
|
22
|
+
const r = await exec("pipenv", ["run", "pip", "list", "--outdated", "--format", "json"], {
|
|
23
|
+
cwd,
|
|
24
|
+
timeout: 120_000,
|
|
25
|
+
});
|
|
26
|
+
const data = safeJson(r.stdout);
|
|
27
|
+
return parsePipenvOutdated(data);
|
|
28
|
+
},
|
|
29
|
+
async install(cwd, name, version) {
|
|
30
|
+
return exec("pipenv", ["install", `${name}==${version}`], { cwd, timeout: 300_000 });
|
|
31
|
+
},
|
|
32
|
+
async defaultCheckCommands(cwd) {
|
|
33
|
+
const test = await guessPythonTestCommand(cwd);
|
|
34
|
+
return test ? { test: { cmd: "pipenv", args: ["run", test.cmd, ...test.args] } } : {};
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=pipenv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipenv.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/pipenv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAwC,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,UAAU,mBAAmB,CACjC,IAA6E;IAE7E,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;AACvG,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAqB;IAC7C,EAAE,EAAE,QAAQ;IACZ,WAAW,EAAE,QAAQ;IACrB,aAAa,EAAE,CAAC,SAAS,CAAC;IAC1B,SAAS,EAAE,CAAC,cAAc,CAAC;IAC3B,QAAQ,EAAE,IAAI;IAEd,KAAK,CAAC,MAAM,CAAC,GAAG;QACd,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAG;QAChB,+DAA+D;QAC/D,4DAA4D;QAC5D,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE;YACvF,GAAG;YACH,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAmE,CAAC,CAAC,MAAM,CAAC,CAAC;QAClG,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO;QAC9B,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,GAAG;QAC5B,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { exec } from "../exec.js";
|
|
3
|
+
import { pathExists, safeJson } from "./types.js";
|
|
4
|
+
async function readScripts(cwd) {
|
|
5
|
+
try {
|
|
6
|
+
const { readFile } = await import("node:fs/promises");
|
|
7
|
+
const raw = await readFile(join(cwd, "package.json"), "utf8");
|
|
8
|
+
const pkg = JSON.parse(raw);
|
|
9
|
+
return { build: pkg.scripts?.build, test: pkg.scripts?.test };
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function parsePnpmOutdated(data) {
|
|
16
|
+
if (!data)
|
|
17
|
+
return [];
|
|
18
|
+
return Object.entries(data)
|
|
19
|
+
.map(([name, v]) => ({ name, current: v.current ?? "", wanted: "", latest: v.latest ?? "" }))
|
|
20
|
+
.filter((o) => o.latest && o.current !== o.latest);
|
|
21
|
+
}
|
|
22
|
+
export const pnpmAdapter = {
|
|
23
|
+
id: "pnpm",
|
|
24
|
+
displayName: "pnpm",
|
|
25
|
+
manifestFiles: ["package.json"],
|
|
26
|
+
lockFiles: ["pnpm-lock.yaml"],
|
|
27
|
+
verified: true,
|
|
28
|
+
async detect(cwd) {
|
|
29
|
+
return pathExists(join(cwd, "pnpm-lock.yaml"));
|
|
30
|
+
},
|
|
31
|
+
async outdated(cwd) {
|
|
32
|
+
// pnpm exits non-zero when outdated packages exist; stdout still has the JSON.
|
|
33
|
+
const r = await exec("pnpm", ["outdated", "--format", "json"], { cwd, timeout: 120_000 });
|
|
34
|
+
const data = safeJson(r.stdout);
|
|
35
|
+
return parsePnpmOutdated(data);
|
|
36
|
+
},
|
|
37
|
+
async install(cwd, name, version) {
|
|
38
|
+
return exec("pnpm", ["add", `${name}@${version}`, "--save-exact"], { cwd, timeout: 300_000 });
|
|
39
|
+
},
|
|
40
|
+
async defaultCheckCommands(cwd) {
|
|
41
|
+
const scripts = await readScripts(cwd);
|
|
42
|
+
return {
|
|
43
|
+
build: scripts.build ? { cmd: "pnpm", args: ["run", "build"] } : undefined,
|
|
44
|
+
test: scripts.test ? { cmd: "pnpm", args: ["test"] } : undefined,
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=pnpm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pnpm.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/pnpm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { exec } from "../exec.js";
|
|
3
|
+
import { pathExists } from "./types.js";
|
|
4
|
+
import { guessPythonTestCommand } from "./python-shared.js";
|
|
5
|
+
const OUTDATED_LINE = /^(\S+)\s+(\S+)\s+(\S+)/;
|
|
6
|
+
export function parsePoetryOutdated(stdout) {
|
|
7
|
+
const out = [];
|
|
8
|
+
for (const line of stdout.split("\n")) {
|
|
9
|
+
const m = OUTDATED_LINE.exec(line.trim());
|
|
10
|
+
if (!m)
|
|
11
|
+
continue;
|
|
12
|
+
const [, name, current, latest] = m;
|
|
13
|
+
if (current !== latest)
|
|
14
|
+
out.push({ name, current, wanted: "", latest });
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
export const poetryAdapter = {
|
|
19
|
+
id: "poetry",
|
|
20
|
+
displayName: "Poetry",
|
|
21
|
+
manifestFiles: ["pyproject.toml"],
|
|
22
|
+
lockFiles: ["poetry.lock"],
|
|
23
|
+
verified: true,
|
|
24
|
+
async detect(cwd) {
|
|
25
|
+
return pathExists(join(cwd, "poetry.lock"));
|
|
26
|
+
},
|
|
27
|
+
async outdated(cwd) {
|
|
28
|
+
// `poetry show -o` prints "name current latest description" as plain
|
|
29
|
+
// text (no --json flag exists for this subcommand).
|
|
30
|
+
const r = await exec("poetry", ["show", "-o", "--no-ansi"], { cwd, timeout: 120_000 });
|
|
31
|
+
return parsePoetryOutdated(r.stdout);
|
|
32
|
+
},
|
|
33
|
+
async install(cwd, name, version) {
|
|
34
|
+
return exec("poetry", ["add", `${name}==${version}`], { cwd, timeout: 300_000 });
|
|
35
|
+
},
|
|
36
|
+
async defaultCheckCommands(cwd) {
|
|
37
|
+
const test = await guessPythonTestCommand(cwd);
|
|
38
|
+
// poetry-managed projects run their tests through the poetry venv.
|
|
39
|
+
return test ? { test: { cmd: "poetry", args: ["run", test.cmd, ...test.args] } } : {};
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=poetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poetry.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/poetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,UAAU,EAAwC,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAE/C,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,OAAO,KAAK,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAqB;IAC7C,EAAE,EAAE,QAAQ;IACZ,WAAW,EAAE,QAAQ;IACrB,aAAa,EAAE,CAAC,gBAAgB,CAAC;IACjC,SAAS,EAAE,CAAC,aAAa,CAAC;IAC1B,QAAQ,EAAE,IAAI;IAEd,KAAK,CAAC,MAAM,CAAC,GAAG;QACd,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAG;QAChB,wEAAwE;QACxE,oDAAoD;QACpD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACvF,OAAO,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO;QAC9B,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,GAAG;QAC5B,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAC/C,mEAAmE;QACnE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { exec } from "../exec.js";
|
|
3
|
+
import { pathExists, safeJson } from "./types.js";
|
|
4
|
+
export function parsePubOutdated(stdout) {
|
|
5
|
+
const data = safeJson(stdout);
|
|
6
|
+
if (!data?.packages)
|
|
7
|
+
return [];
|
|
8
|
+
return data.packages
|
|
9
|
+
.filter((p) => p.current?.version && p.latest?.version && p.current.version !== p.latest.version)
|
|
10
|
+
.map((p) => ({ name: p.package, current: p.current.version, wanted: "", latest: p.latest.version }));
|
|
11
|
+
}
|
|
12
|
+
export const pubAdapter = {
|
|
13
|
+
id: "pub",
|
|
14
|
+
displayName: "Pub (Dart/Flutter)",
|
|
15
|
+
manifestFiles: ["pubspec.yaml"],
|
|
16
|
+
lockFiles: ["pubspec.lock"],
|
|
17
|
+
verified: true,
|
|
18
|
+
async detect(cwd) {
|
|
19
|
+
return pathExists(join(cwd, "pubspec.yaml"));
|
|
20
|
+
},
|
|
21
|
+
async outdated(cwd) {
|
|
22
|
+
const r = await exec("dart", ["pub", "outdated", "--json"], { cwd, timeout: 120_000 });
|
|
23
|
+
return parsePubOutdated(r.stdout);
|
|
24
|
+
},
|
|
25
|
+
async install(cwd, name, version) {
|
|
26
|
+
return exec("dart", ["pub", "add", `${name}:${version}`], { cwd, timeout: 300_000 });
|
|
27
|
+
},
|
|
28
|
+
async defaultCheckCommands() {
|
|
29
|
+
return { test: { cmd: "dart", args: ["test"] } };
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=pub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pub.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/pub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAwC,MAAM,YAAY,CAAC;AAQxF,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,IAAI,GAAG,QAAQ,CAAkC,MAAM,CAAC,CAAC;IAC/D,IAAI,CAAC,IAAI,EAAE,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,IAAI,CAAC,QAAQ;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;SAChG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAqB;IAC1C,EAAE,EAAE,KAAK;IACT,WAAW,EAAE,oBAAoB;IACjC,aAAa,EAAE,CAAC,cAAc,CAAC;IAC/B,SAAS,EAAE,CAAC,cAAc,CAAC;IAC3B,QAAQ,EAAE,IAAI;IAEd,KAAK,CAAC,MAAM,CAAC,GAAG;QACd,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAG;QAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACvF,OAAO,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO;QAC9B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;IACnD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { pathExists } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Python has no universal test runner the way `npm test` is universal, so we
|
|
6
|
+
* guess: pytest config or a tests/ dir → pytest; tox.ini → tox; otherwise
|
|
7
|
+
* fall back to stdlib unittest discovery. `--test-cmd` overrides this.
|
|
8
|
+
*/
|
|
9
|
+
export async function guessPythonTestCommand(cwd) {
|
|
10
|
+
if (await pathExists(join(cwd, "pytest.ini")))
|
|
11
|
+
return { cmd: "pytest", args: [] };
|
|
12
|
+
if (await pathExists(join(cwd, "tests")))
|
|
13
|
+
return { cmd: "pytest", args: [] };
|
|
14
|
+
if (await hasPytestConfig(cwd))
|
|
15
|
+
return { cmd: "pytest", args: [] };
|
|
16
|
+
if (await pathExists(join(cwd, "tox.ini")))
|
|
17
|
+
return { cmd: "tox", args: [] };
|
|
18
|
+
return { cmd: "python3", args: ["-m", "unittest", "discover"] };
|
|
19
|
+
}
|
|
20
|
+
async function hasPytestConfig(cwd) {
|
|
21
|
+
try {
|
|
22
|
+
const raw = await readFile(join(cwd, "pyproject.toml"), "utf8");
|
|
23
|
+
return raw.includes("[tool.pytest");
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=python-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-shared.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/python-shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAqB,MAAM,YAAY,CAAC;AAE3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAAW;IACtD,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAClF,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC7E,IAAI,MAAM,eAAe,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACnE,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC5E,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { exec } from "../exec.js";
|
|
4
|
+
import { pathExists } from "./types.js";
|
|
5
|
+
// Matches: .package(url: "https://github.com/org/repo", from: "1.2.3")
|
|
6
|
+
const PKG_LINE = /\.package\(\s*url:\s*"([^"]+)"\s*,\s*from:\s*"([^"]+)"\s*\)/g;
|
|
7
|
+
function repoNameFromUrl(url) {
|
|
8
|
+
return url.replace(/\.git$/, "").split("/").pop() ?? url;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* SwiftPM has no built-in "outdated" concept and Package.swift is Swift
|
|
12
|
+
* source code, not a data format — we regex out `.package(url:, from:)`
|
|
13
|
+
* declarations rather than truly parsing it. This is the highest-risk
|
|
14
|
+
* adapter in the set: works for the common declaration style, not
|
|
15
|
+
* exhaustive.
|
|
16
|
+
*/
|
|
17
|
+
export function parsePackageResolved(raw) {
|
|
18
|
+
const resolved = {};
|
|
19
|
+
const data = JSON.parse(raw);
|
|
20
|
+
for (const pin of data.pins ?? []) {
|
|
21
|
+
if (pin.identity && pin.state?.version)
|
|
22
|
+
resolved[pin.identity] = pin.state.version;
|
|
23
|
+
}
|
|
24
|
+
return resolved;
|
|
25
|
+
}
|
|
26
|
+
export function parsePackageSwiftDeps(manifest, resolved) {
|
|
27
|
+
const out = [];
|
|
28
|
+
for (const m of manifest.matchAll(PKG_LINE)) {
|
|
29
|
+
const name = repoNameFromUrl(m[1]).toLowerCase();
|
|
30
|
+
const current = resolved[name];
|
|
31
|
+
if (!current)
|
|
32
|
+
continue;
|
|
33
|
+
out.push({ name, current, url: m[1] });
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
export const swiftpmAdapter = {
|
|
38
|
+
id: "swiftpm",
|
|
39
|
+
displayName: "Swift Package Manager",
|
|
40
|
+
manifestFiles: ["Package.swift"],
|
|
41
|
+
lockFiles: ["Package.resolved"],
|
|
42
|
+
verified: true,
|
|
43
|
+
async detect(cwd) {
|
|
44
|
+
return pathExists(join(cwd, "Package.swift"));
|
|
45
|
+
},
|
|
46
|
+
async outdated(cwd) {
|
|
47
|
+
let resolved = {};
|
|
48
|
+
try {
|
|
49
|
+
const raw = await readFile(join(cwd, "Package.resolved"), "utf8");
|
|
50
|
+
resolved = parsePackageResolved(raw);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
const manifest = await readFile(join(cwd, "Package.swift"), "utf8");
|
|
56
|
+
const deps = parsePackageSwiftDeps(manifest, resolved);
|
|
57
|
+
const out = [];
|
|
58
|
+
for (const dep of deps) {
|
|
59
|
+
const latest = await latestGitHubTag(dep.url);
|
|
60
|
+
if (latest && latest !== dep.current)
|
|
61
|
+
out.push({ name: dep.name, current: dep.current, wanted: "", latest });
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
},
|
|
65
|
+
async install(cwd, name, version) {
|
|
66
|
+
const path = join(cwd, "Package.swift");
|
|
67
|
+
const raw = await readFile(path, "utf8");
|
|
68
|
+
const re = new RegExp(`(\\.package\\(\\s*url:\\s*"[^"]*${escapeRegExp(name)}[^"]*"\\s*,\\s*from:\\s*")[^"]+(")`, "i");
|
|
69
|
+
if (!re.test(raw)) {
|
|
70
|
+
return { code: 1, stdout: "", stderr: `could not find package ${name} in Package.swift`, combined: `could not find package ${name} in Package.swift` };
|
|
71
|
+
}
|
|
72
|
+
await writeFile(path, raw.replace(re, `$1${version}$2`), "utf8");
|
|
73
|
+
return exec("swift", ["package", "resolve"], { cwd, timeout: 300_000 });
|
|
74
|
+
},
|
|
75
|
+
async defaultCheckCommands() {
|
|
76
|
+
return {
|
|
77
|
+
build: { cmd: "swift", args: ["build"] },
|
|
78
|
+
test: { cmd: "swift", args: ["test"] },
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
async function latestGitHubTag(repoUrl) {
|
|
83
|
+
const m = /github\.com\/([^/]+)\/([^/.]+)/.exec(repoUrl);
|
|
84
|
+
if (!m)
|
|
85
|
+
return null;
|
|
86
|
+
try {
|
|
87
|
+
const res = await fetch(`https://api.github.com/repos/${m[1]}/${m[2]}/tags`, {
|
|
88
|
+
headers: { "User-Agent": "greenbump" },
|
|
89
|
+
});
|
|
90
|
+
if (!res.ok)
|
|
91
|
+
return null;
|
|
92
|
+
const tags = (await res.json());
|
|
93
|
+
return tags[0]?.name.replace(/^v/, "") ?? null;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function escapeRegExp(s) {
|
|
100
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=swiftpm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swiftpm.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/swiftpm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function safeJson(text) {
|
|
2
|
+
try {
|
|
3
|
+
return JSON.parse(text);
|
|
4
|
+
}
|
|
5
|
+
catch {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export async function pathExists(p) {
|
|
10
|
+
try {
|
|
11
|
+
const { access } = await import("node:fs/promises");
|
|
12
|
+
await access(p);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/types.ts"],"names":[],"mappings":"AAmDA,MAAM,UAAU,QAAQ,CAAI,IAAY;IACtC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAS;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { exec } from "../exec.js";
|
|
3
|
+
import { pathExists, safeJson } from "./types.js";
|
|
4
|
+
import { guessPythonTestCommand } from "./python-shared.js";
|
|
5
|
+
export function parseUvOutdated(data) {
|
|
6
|
+
if (!data)
|
|
7
|
+
return [];
|
|
8
|
+
return data.map((d) => ({ name: d.name, current: d.version, wanted: "", latest: d.latest_version }));
|
|
9
|
+
}
|
|
10
|
+
export const uvAdapter = {
|
|
11
|
+
id: "uv",
|
|
12
|
+
displayName: "uv",
|
|
13
|
+
manifestFiles: ["pyproject.toml"],
|
|
14
|
+
lockFiles: ["uv.lock"],
|
|
15
|
+
verified: true,
|
|
16
|
+
async detect(cwd) {
|
|
17
|
+
return pathExists(join(cwd, "uv.lock"));
|
|
18
|
+
},
|
|
19
|
+
async outdated(cwd) {
|
|
20
|
+
const r = await exec("uv", ["tree", "--outdated", "--depth", "1"], { cwd, timeout: 120_000 });
|
|
21
|
+
// `uv tree --outdated` has no stable JSON output; fall back to `uv pip list --outdated --format json`
|
|
22
|
+
// against the project's venv, which is the documented machine-readable path.
|
|
23
|
+
const r2 = await exec("uv", ["pip", "list", "--outdated", "--format", "json"], { cwd, timeout: 120_000 });
|
|
24
|
+
const data = safeJson(r2.stdout);
|
|
25
|
+
void r;
|
|
26
|
+
return parseUvOutdated(data);
|
|
27
|
+
},
|
|
28
|
+
async install(cwd, name, version) {
|
|
29
|
+
return exec("uv", ["add", `${name}==${version}`], { cwd, timeout: 300_000 });
|
|
30
|
+
},
|
|
31
|
+
async defaultCheckCommands(cwd) {
|
|
32
|
+
const test = await guessPythonTestCommand(cwd);
|
|
33
|
+
return test ? { test: { cmd: "uv", args: ["run", test.cmd, ...test.args] } } : {};
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=uv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uv.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/uv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAwC,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,UAAU,eAAe,CAC7B,IAA6E;IAE7E,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;AACvG,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAqB;IACzC,EAAE,EAAE,IAAI;IACR,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,CAAC,gBAAgB,CAAC;IACjC,SAAS,EAAE,CAAC,SAAS,CAAC;IACtB,QAAQ,EAAE,IAAI;IAEd,KAAK,CAAC,MAAM,CAAC,GAAG;QACd,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAG;QAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9F,sGAAsG;QACtG,6EAA6E;QAC7E,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1G,MAAM,IAAI,GAAG,QAAQ,CAAmE,EAAE,CAAC,MAAM,CAAC,CAAC;QACnG,KAAK,CAAC,CAAC;QACP,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO;QAC9B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,GAAG;QAC5B,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { exec } from "../exec.js";
|
|
3
|
+
import { pathExists, safeJson } from "./types.js";
|
|
4
|
+
async function readScripts(cwd) {
|
|
5
|
+
try {
|
|
6
|
+
const { readFile } = await import("node:fs/promises");
|
|
7
|
+
const raw = await readFile(join(cwd, "package.json"), "utf8");
|
|
8
|
+
const pkg = JSON.parse(raw);
|
|
9
|
+
return { build: pkg.scripts?.build, test: pkg.scripts?.test };
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Yarn classic prints newline-delimited JSON; the row we want has type
|
|
17
|
+
* "table" with data.head = ["Package", "Current", "Wanted", "Latest", …].
|
|
18
|
+
* Exported standalone so it can be unit-tested against a fixture without
|
|
19
|
+
* shelling out to yarn.
|
|
20
|
+
*/
|
|
21
|
+
export function parseYarnOutdated(stdout) {
|
|
22
|
+
for (const line of stdout.split("\n")) {
|
|
23
|
+
const obj = safeJson(line);
|
|
24
|
+
if (obj?.type !== "table" || !obj.data)
|
|
25
|
+
continue;
|
|
26
|
+
const head = obj.data.head.map((h) => h.toLowerCase());
|
|
27
|
+
const iName = head.indexOf("package");
|
|
28
|
+
const iCurrent = head.indexOf("current");
|
|
29
|
+
const iLatest = head.indexOf("latest");
|
|
30
|
+
if (iName < 0 || iCurrent < 0 || iLatest < 0)
|
|
31
|
+
continue;
|
|
32
|
+
return obj.data.body
|
|
33
|
+
.map((row) => ({ name: row[iName], current: row[iCurrent], wanted: "", latest: row[iLatest] }))
|
|
34
|
+
.filter((o) => o.name && o.latest && o.current !== o.latest);
|
|
35
|
+
}
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
export const yarnAdapter = {
|
|
39
|
+
id: "yarn",
|
|
40
|
+
displayName: "Yarn",
|
|
41
|
+
manifestFiles: ["package.json"],
|
|
42
|
+
lockFiles: ["yarn.lock"],
|
|
43
|
+
verified: true,
|
|
44
|
+
async detect(cwd) {
|
|
45
|
+
return pathExists(join(cwd, "yarn.lock"));
|
|
46
|
+
},
|
|
47
|
+
async outdated(cwd) {
|
|
48
|
+
const r = await exec("yarn", ["outdated", "--json"], { cwd, timeout: 120_000 });
|
|
49
|
+
return parseYarnOutdated(r.stdout);
|
|
50
|
+
},
|
|
51
|
+
async install(cwd, name, version) {
|
|
52
|
+
return exec("yarn", ["add", `${name}@${version}`, "--exact"], { cwd, timeout: 300_000 });
|
|
53
|
+
},
|
|
54
|
+
async defaultCheckCommands(cwd) {
|
|
55
|
+
const scripts = await readScripts(cwd);
|
|
56
|
+
return {
|
|
57
|
+
build: scripts.build ? { cmd: "yarn", args: ["run", "build"] } : undefined,
|
|
58
|
+
test: scripts.test ? { cmd: "yarn", args: ["test"] } : undefined,
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=yarn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yarn.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/yarn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Run a command and capture its output. Never rejects on a non-zero exit —
|
|
4
|
+
* callers inspect `code` themselves, because tools like `npm outdated` use
|
|
5
|
+
* non-zero exits to signal "found something", not failure.
|
|
6
|
+
*/
|
|
7
|
+
export function exec(cmd, args, opts) {
|
|
8
|
+
return new Promise((resolve) => {
|
|
9
|
+
const child = spawn(cmd, args, {
|
|
10
|
+
cwd: opts.cwd,
|
|
11
|
+
env: opts.env ?? process.env,
|
|
12
|
+
shell: false,
|
|
13
|
+
});
|
|
14
|
+
let stdout = "";
|
|
15
|
+
let stderr = "";
|
|
16
|
+
let combined = "";
|
|
17
|
+
child.stdout.on("data", (d) => {
|
|
18
|
+
const s = d.toString();
|
|
19
|
+
stdout += s;
|
|
20
|
+
combined += s;
|
|
21
|
+
});
|
|
22
|
+
child.stderr.on("data", (d) => {
|
|
23
|
+
const s = d.toString();
|
|
24
|
+
stderr += s;
|
|
25
|
+
combined += s;
|
|
26
|
+
});
|
|
27
|
+
let timer;
|
|
28
|
+
if (opts.timeout) {
|
|
29
|
+
timer = setTimeout(() => {
|
|
30
|
+
child.kill("SIGKILL");
|
|
31
|
+
combined += `\n[greenbump] command timed out after ${opts.timeout}ms\n`;
|
|
32
|
+
}, opts.timeout);
|
|
33
|
+
}
|
|
34
|
+
child.on("close", (code) => {
|
|
35
|
+
if (timer)
|
|
36
|
+
clearTimeout(timer);
|
|
37
|
+
resolve({ code: code ?? 1, stdout, stderr, combined });
|
|
38
|
+
});
|
|
39
|
+
child.on("error", (err) => {
|
|
40
|
+
if (timer)
|
|
41
|
+
clearTimeout(timer);
|
|
42
|
+
combined += `\n[greenbump] failed to spawn ${cmd}: ${err.message}\n`;
|
|
43
|
+
resolve({ code: 1, stdout, stderr: String(err), combined });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/engine/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAiB3C;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAClB,GAAW,EACX,IAAc,EACd,IAAiB;IAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;YAC5B,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YACpC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,CAAC;YACZ,QAAQ,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YACpC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,CAAC;YACZ,QAAQ,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,IAAI,KAAiC,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,QAAQ,IAAI,yCAAyC,IAAI,CAAC,OAAO,MAAM,CAAC;YAC1E,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,QAAQ,IAAI,iCAAiC,GAAG,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC;YACrE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { exec } from "./exec.js";
|
|
2
|
+
export async function isGitRepo(cwd) {
|
|
3
|
+
const r = await exec("git", ["rev-parse", "--is-inside-work-tree"], { cwd });
|
|
4
|
+
return r.code === 0 && r.stdout.trim() === "true";
|
|
5
|
+
}
|
|
6
|
+
export async function isTreeClean(cwd) {
|
|
7
|
+
const r = await exec("git", ["status", "--porcelain"], { cwd });
|
|
8
|
+
return r.code === 0 && r.stdout.trim() === "";
|
|
9
|
+
}
|
|
10
|
+
export async function currentBranch(cwd) {
|
|
11
|
+
const r = await exec("git", ["rev-parse", "--abbrev-ref", "HEAD"], { cwd });
|
|
12
|
+
return r.stdout.trim();
|
|
13
|
+
}
|
|
14
|
+
export async function createBranch(cwd, name) {
|
|
15
|
+
await exec("git", ["checkout", "-b", name], { cwd });
|
|
16
|
+
}
|
|
17
|
+
export async function checkout(cwd, ref) {
|
|
18
|
+
await exec("git", ["checkout", ref], { cwd });
|
|
19
|
+
}
|
|
20
|
+
export async function commitAll(cwd, message) {
|
|
21
|
+
await exec("git", ["add", "-A"], { cwd });
|
|
22
|
+
await exec("git", ["commit", "-m", message, "--no-verify"], { cwd });
|
|
23
|
+
}
|
|
24
|
+
/** `git diff --stat` against a ref, for the PR summary. */
|
|
25
|
+
export async function diffStat(cwd, ref) {
|
|
26
|
+
const r = await exec("git", ["diff", "--stat", ref], { cwd });
|
|
27
|
+
return r.stdout.trim();
|
|
28
|
+
}
|
|
29
|
+
/** Full unified diff against a ref, for the PR body. */
|
|
30
|
+
export async function fullDiff(cwd, ref) {
|
|
31
|
+
const r = await exec("git", ["diff", ref], { cwd });
|
|
32
|
+
return r.stdout;
|
|
33
|
+
}
|
|
34
|
+
/** List files changed since a ref. */
|
|
35
|
+
export async function changedFiles(cwd, ref) {
|
|
36
|
+
const r = await exec("git", ["diff", "--name-only", ref], { cwd });
|
|
37
|
+
return r.stdout
|
|
38
|
+
.split("\n")
|
|
39
|
+
.map((s) => s.trim())
|
|
40
|
+
.filter(Boolean);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/engine/git.ts"],"names":[],"mappings":"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"}
|