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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/README.zh-CN.md +213 -0
  4. package/action-dist/index.cjs +19695 -0
  5. package/action.yml +76 -0
  6. package/dist/action/github.js +70 -0
  7. package/dist/action/github.js.map +1 -0
  8. package/dist/action/main.js +99 -0
  9. package/dist/action/main.js.map +1 -0
  10. package/dist/agent/factory.js +72 -0
  11. package/dist/agent/factory.js.map +1 -0
  12. package/dist/agent/fixer.js +307 -0
  13. package/dist/agent/fixer.js.map +1 -0
  14. package/dist/agent/fixer.test.js +224 -0
  15. package/dist/agent/fixer.test.js.map +1 -0
  16. package/dist/agent/provider-anthropic.js +59 -0
  17. package/dist/agent/provider-anthropic.js.map +1 -0
  18. package/dist/agent/provider-openai.js +65 -0
  19. package/dist/agent/provider-openai.js.map +1 -0
  20. package/dist/agent/provider.js +4 -0
  21. package/dist/agent/provider.js.map +1 -0
  22. package/dist/cli.js +138 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/engine/batch.js +246 -0
  25. package/dist/engine/batch.js.map +1 -0
  26. package/dist/engine/batch.test.js +59 -0
  27. package/dist/engine/batch.test.js.map +1 -0
  28. package/dist/engine/changelog.js +66 -0
  29. package/dist/engine/changelog.js.map +1 -0
  30. package/dist/engine/checks.js +41 -0
  31. package/dist/engine/checks.js.map +1 -0
  32. package/dist/engine/checks.test.js +92 -0
  33. package/dist/engine/checks.test.js.map +1 -0
  34. package/dist/engine/detect.js +5 -0
  35. package/dist/engine/detect.js.map +1 -0
  36. package/dist/engine/ecosystems/bundler.js +59 -0
  37. package/dist/engine/ecosystems/bundler.js.map +1 -0
  38. package/dist/engine/ecosystems/cargo.js +83 -0
  39. package/dist/engine/ecosystems/cargo.js.map +1 -0
  40. package/dist/engine/ecosystems/cocoapods.js +47 -0
  41. package/dist/engine/ecosystems/cocoapods.js.map +1 -0
  42. package/dist/engine/ecosystems/composer.js +32 -0
  43. package/dist/engine/ecosystems/composer.js.map +1 -0
  44. package/dist/engine/ecosystems/conan.js +106 -0
  45. package/dist/engine/ecosystems/conan.js.map +1 -0
  46. package/dist/engine/ecosystems/elm.js +77 -0
  47. package/dist/engine/ecosystems/elm.js.map +1 -0
  48. package/dist/engine/ecosystems/go.js +72 -0
  49. package/dist/engine/ecosystems/go.js.map +1 -0
  50. package/dist/engine/ecosystems/gradle.js +90 -0
  51. package/dist/engine/ecosystems/gradle.js.map +1 -0
  52. package/dist/engine/ecosystems/index.js +67 -0
  53. package/dist/engine/ecosystems/index.js.map +1 -0
  54. package/dist/engine/ecosystems/maven.js +77 -0
  55. package/dist/engine/ecosystems/maven.js.map +1 -0
  56. package/dist/engine/ecosystems/mix.js +64 -0
  57. package/dist/engine/ecosystems/mix.js.map +1 -0
  58. package/dist/engine/ecosystems/npm.js +47 -0
  59. package/dist/engine/ecosystems/npm.js.map +1 -0
  60. package/dist/engine/ecosystems/nuget.js +50 -0
  61. package/dist/engine/ecosystems/nuget.js.map +1 -0
  62. package/dist/engine/ecosystems/parsers.test.js +255 -0
  63. package/dist/engine/ecosystems/parsers.test.js.map +1 -0
  64. package/dist/engine/ecosystems/pip.js +61 -0
  65. package/dist/engine/ecosystems/pip.js.map +1 -0
  66. package/dist/engine/ecosystems/pipenv.js +37 -0
  67. package/dist/engine/ecosystems/pipenv.js.map +1 -0
  68. package/dist/engine/ecosystems/pnpm.js +48 -0
  69. package/dist/engine/ecosystems/pnpm.js.map +1 -0
  70. package/dist/engine/ecosystems/poetry.js +42 -0
  71. package/dist/engine/ecosystems/poetry.js.map +1 -0
  72. package/dist/engine/ecosystems/pub.js +32 -0
  73. package/dist/engine/ecosystems/pub.js.map +1 -0
  74. package/dist/engine/ecosystems/python-shared.js +29 -0
  75. package/dist/engine/ecosystems/python-shared.js.map +1 -0
  76. package/dist/engine/ecosystems/swiftpm.js +102 -0
  77. package/dist/engine/ecosystems/swiftpm.js.map +1 -0
  78. package/dist/engine/ecosystems/types.js +19 -0
  79. package/dist/engine/ecosystems/types.js.map +1 -0
  80. package/dist/engine/ecosystems/uv.js +36 -0
  81. package/dist/engine/ecosystems/uv.js.map +1 -0
  82. package/dist/engine/ecosystems/yarn.js +62 -0
  83. package/dist/engine/ecosystems/yarn.js.map +1 -0
  84. package/dist/engine/exec.js +47 -0
  85. package/dist/engine/exec.js.map +1 -0
  86. package/dist/engine/git.js +42 -0
  87. package/dist/engine/git.js.map +1 -0
  88. package/dist/engine/git.test.js +111 -0
  89. package/dist/engine/git.test.js.map +1 -0
  90. package/dist/engine/pm.js +14 -0
  91. package/dist/engine/pm.js.map +1 -0
  92. package/dist/engine/run.js +167 -0
  93. package/dist/engine/run.js.map +1 -0
  94. package/dist/engine/run.test.js +47 -0
  95. package/dist/engine/run.test.js.map +1 -0
  96. package/dist/engine/upgrade.js +10 -0
  97. package/dist/engine/upgrade.js.map +1 -0
  98. package/dist/engine/workspace.js +155 -0
  99. package/dist/engine/workspace.js.map +1 -0
  100. package/dist/engine/workspace.test.js +95 -0
  101. package/dist/engine/workspace.test.js.map +1 -0
  102. package/dist/exitcode.js +51 -0
  103. package/dist/exitcode.js.map +1 -0
  104. package/dist/exitcode.test.js +62 -0
  105. package/dist/exitcode.test.js.map +1 -0
  106. package/dist/format.js +101 -0
  107. package/dist/format.js.map +1 -0
  108. package/dist/pr.js +63 -0
  109. package/dist/pr.js.map +1 -0
  110. package/dist/report.js +13 -0
  111. package/dist/report.js.map +1 -0
  112. package/dist/report.test.js +56 -0
  113. package/dist/report.test.js.map +1 -0
  114. package/dist/test-utils.js +36 -0
  115. package/dist/test-utils.js.map +1 -0
  116. package/package.json +56 -0
@@ -0,0 +1,83 @@
1
+ import { join } from "node:path";
2
+ import { readFile } from "node:fs/promises";
3
+ import { exec } from "../exec.js";
4
+ import { pathExists } from "./types.js";
5
+ const DEP_LINE = /^([A-Za-z0-9_-]+)\s*=\s*"([^"]+)"/;
6
+ export function parseCargoToml(raw) {
7
+ const deps = new Map();
8
+ let inDeps = false;
9
+ for (const line of raw.split("\n")) {
10
+ const trimmed = line.trim();
11
+ if (/^\[dependencies\]/.test(trimmed)) {
12
+ inDeps = true;
13
+ continue;
14
+ }
15
+ if (/^\[/.test(trimmed)) {
16
+ inDeps = false;
17
+ continue;
18
+ }
19
+ if (!inDeps)
20
+ continue;
21
+ const m = DEP_LINE.exec(trimmed);
22
+ if (m)
23
+ deps.set(m[1], m[2].replace(/^[\^~=]/, ""));
24
+ }
25
+ return deps;
26
+ }
27
+ async function directDeps(cwd) {
28
+ try {
29
+ const raw = await readFile(join(cwd, "Cargo.toml"), "utf8");
30
+ return parseCargoToml(raw);
31
+ }
32
+ catch {
33
+ return new Map();
34
+ }
35
+ }
36
+ async function latestOnCratesIo(name) {
37
+ try {
38
+ const res = await fetch(`https://crates.io/api/v1/crates/${encodeURIComponent(name)}`, {
39
+ headers: { "User-Agent": "greenbump (https://github.com/shidesheng0218/greenbump)" },
40
+ });
41
+ if (!res.ok)
42
+ return null;
43
+ const data = (await res.json());
44
+ return data.crate?.max_stable_version ?? null;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ export const cargoAdapter = {
51
+ id: "cargo",
52
+ displayName: "Cargo",
53
+ manifestFiles: ["Cargo.toml"],
54
+ lockFiles: ["Cargo.lock"],
55
+ verified: true,
56
+ async detect(cwd) {
57
+ return pathExists(join(cwd, "Cargo.toml"));
58
+ },
59
+ async outdated(cwd) {
60
+ // No reliable built-in "outdated" command ships with stock cargo (that's
61
+ // the separate `cargo-outdated` plugin, not assumed installed) — query
62
+ // crates.io directly for each direct dependency instead.
63
+ const deps = await directDeps(cwd);
64
+ const out = [];
65
+ for (const [name, current] of deps) {
66
+ const latest = await latestOnCratesIo(name);
67
+ if (latest && latest !== current)
68
+ out.push({ name, current, wanted: "", latest });
69
+ }
70
+ return out;
71
+ },
72
+ async install(cwd, name, version) {
73
+ // `cargo add pkg@=version` pins exactly (Cargo 1.62+, built in — no plugin needed).
74
+ return exec("cargo", ["add", `${name}@=${version}`], { cwd, timeout: 300_000 });
75
+ },
76
+ async defaultCheckCommands() {
77
+ return {
78
+ build: { cmd: "cargo", args: ["build"] },
79
+ test: { cmd: "cargo", args: ["test"] },
80
+ };
81
+ },
82
+ };
83
+ //# sourceMappingURL=cargo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cargo.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/cargo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
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
+ // `pod outdated` prints lines like:
6
+ // "- AFNetworking 4.0.0 -> 4.0.0 (latest version 4.0.1)"
7
+ // The value after "->" is only what the Podfile's constraint allows to
8
+ // resolve to (often == current for an exact pin), NOT the true latest —
9
+ // that's only in the "(latest version X)" suffix.
10
+ const ROW = /^\s*-\s*([A-Za-z0-9_+-]+)\s+([^\s]+)\s*->\s*[^\s]+\s*\(latest version ([^)]+)\)/;
11
+ export function parseCocoapodsOutdated(stdout) {
12
+ const out = [];
13
+ for (const line of stdout.split("\n")) {
14
+ const m = ROW.exec(line);
15
+ if (m && m[2] !== m[3])
16
+ out.push({ name: m[1], current: m[2], wanted: "", latest: m[3] });
17
+ }
18
+ return out;
19
+ }
20
+ export const cocoapodsAdapter = {
21
+ id: "cocoapods",
22
+ displayName: "CocoaPods",
23
+ manifestFiles: ["Podfile"],
24
+ lockFiles: ["Podfile.lock"],
25
+ verified: true,
26
+ async detect(cwd) {
27
+ return pathExists(join(cwd, "Podfile"));
28
+ },
29
+ async outdated(cwd) {
30
+ const r = await exec("pod", ["outdated"], { cwd, timeout: 120_000 });
31
+ return parseCocoapodsOutdated(r.stdout);
32
+ },
33
+ async install(cwd, name, version) {
34
+ const path = join(cwd, "Podfile");
35
+ const raw = await readFile(path, "utf8");
36
+ const re = new RegExp(`(pod\\s+["']${name}["'])(.*)$`, "m");
37
+ if (!re.test(raw)) {
38
+ return { code: 1, stdout: "", stderr: `could not find pod "${name}" in Podfile`, combined: `could not find pod "${name}" in Podfile` };
39
+ }
40
+ await writeFile(path, raw.replace(re, `$1, "= ${version}"`), "utf8");
41
+ return exec("pod", ["install"], { cwd, timeout: 300_000 });
42
+ },
43
+ async defaultCheckCommands() {
44
+ return { build: { cmd: "xcodebuild", args: ["build", "-workspace", ".", "-scheme", "App"] } };
45
+ },
46
+ };
47
+ //# sourceMappingURL=cocoapods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cocoapods.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/cocoapods.ts"],"names":[],"mappings":"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"}
@@ -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 parseComposerOutdated(stdout) {
5
+ const data = safeJson(stdout);
6
+ if (!data?.installed)
7
+ return [];
8
+ return data.installed
9
+ .filter((d) => d.version !== d.latest)
10
+ .map((d) => ({ name: d.name, current: d.version, wanted: "", latest: d.latest }));
11
+ }
12
+ export const composerAdapter = {
13
+ id: "composer",
14
+ displayName: "Composer",
15
+ manifestFiles: ["composer.json"],
16
+ lockFiles: ["composer.lock"],
17
+ verified: true,
18
+ async detect(cwd) {
19
+ return pathExists(join(cwd, "composer.json"));
20
+ },
21
+ async outdated(cwd) {
22
+ const r = await exec("composer", ["outdated", "--direct", "--format", "json"], { cwd, timeout: 120_000 });
23
+ return parseComposerOutdated(r.stdout);
24
+ },
25
+ async install(cwd, name, version) {
26
+ return exec("composer", ["require", `${name}:${version}`, "--no-interaction"], { cwd, timeout: 300_000 });
27
+ },
28
+ async defaultCheckCommands() {
29
+ return { test: { cmd: "composer", args: ["exec", "phpunit"] } };
30
+ },
31
+ };
32
+ //# sourceMappingURL=composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/composer.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,qBAAqB,CAAC,MAAc;IAClD,MAAM,IAAI,GAAG,QAAQ,CAAwC,MAAM,CAAC,CAAC;IACrE,IAAI,CAAC,IAAI,EAAE,SAAS;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,IAAI,CAAC,SAAS;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC;SACrC,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,MAAM,EAAE,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,EAAE,EAAE,UAAU;IACd,WAAW,EAAE,UAAU;IACvB,aAAa,EAAE,CAAC,eAAe,CAAC;IAChC,SAAS,EAAE,CAAC,eAAe,CAAC;IAC5B,QAAQ,EAAE,IAAI;IAEd,KAAK,CAAC,MAAM,CAAC,GAAG;QACd,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAG;QAChB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1G,OAAO,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO;QAC9B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,OAAO,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5G,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC;IAClE,CAAC;CACF,CAAC"}
@@ -0,0 +1,106 @@
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
+ const REQUIRE_LINE = /^([A-Za-z0-9_-]+)\/([^@\s]+)/;
6
+ export function parseConanfileTxt(raw) {
7
+ const deps = [];
8
+ let inRequires = false;
9
+ for (const line of raw.split("\n")) {
10
+ const trimmed = line.trim();
11
+ if (/^\[requires\]/.test(trimmed)) {
12
+ inRequires = true;
13
+ continue;
14
+ }
15
+ if (/^\[/.test(trimmed)) {
16
+ inRequires = false;
17
+ continue;
18
+ }
19
+ if (!inRequires)
20
+ continue;
21
+ const m = REQUIRE_LINE.exec(trimmed);
22
+ if (m)
23
+ deps.push({ name: m[1], version: m[2] });
24
+ }
25
+ return deps;
26
+ }
27
+ async function directDeps(cwd, file) {
28
+ if (!file.endsWith(".txt"))
29
+ return [];
30
+ try {
31
+ const raw = await readFile(join(cwd, file), "utf8");
32
+ return parseConanfileTxt(raw);
33
+ }
34
+ catch {
35
+ return [];
36
+ }
37
+ }
38
+ // ConanCenter's actual remote is the Conan v1 search API at center2.conan.io,
39
+ // not a UI-search JSON endpoint — it returns package refs like
40
+ // `{"results": ["zlib/1.2.13@_/_", "zlib/1.3.1@_/_"]}`, not structured objects.
41
+ function compareSemver(a, b) {
42
+ const pa = a.split(".").map((n) => Number.parseInt(n, 10) || 0);
43
+ const pb = b.split(".").map((n) => Number.parseInt(n, 10) || 0);
44
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
45
+ if ((pa[i] ?? 0) !== (pb[i] ?? 0))
46
+ return (pa[i] ?? 0) - (pb[i] ?? 0);
47
+ }
48
+ return 0;
49
+ }
50
+ async function latestOnConanCenter(name) {
51
+ try {
52
+ const res = await fetch(`https://center2.conan.io/v1/conans/search?q=${encodeURIComponent(name)}`);
53
+ if (!res.ok)
54
+ return null;
55
+ const data = (await res.json());
56
+ const versions = (data.results ?? [])
57
+ .map((ref) => ref.split("@")[0])
58
+ .filter((nv) => nv.startsWith(`${name}/`))
59
+ .map((nv) => nv.slice(name.length + 1));
60
+ if (versions.length === 0)
61
+ return null;
62
+ return versions.sort(compareSemver).at(-1) ?? null;
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
68
+ export const conanAdapter = {
69
+ id: "conan",
70
+ displayName: "Conan (C/C++)",
71
+ manifestFiles: ["conanfile.txt", "conanfile.py"],
72
+ lockFiles: ["conan.lock"],
73
+ verified: true,
74
+ async detect(cwd) {
75
+ return (await pathExists(join(cwd, "conanfile.txt"))) || (await pathExists(join(cwd, "conanfile.py")));
76
+ },
77
+ async outdated(cwd) {
78
+ const file = (await pathExists(join(cwd, "conanfile.txt"))) ? "conanfile.txt" : "conanfile.py";
79
+ const deps = await directDeps(cwd, file);
80
+ const out = [];
81
+ for (const d of deps) {
82
+ const latest = await latestOnConanCenter(d.name);
83
+ if (latest && latest !== d.version)
84
+ out.push({ name: d.name, current: d.version, wanted: "", latest });
85
+ }
86
+ return out;
87
+ },
88
+ async install(cwd, name, version) {
89
+ const file = (await pathExists(join(cwd, "conanfile.txt"))) ? "conanfile.txt" : "conanfile.py";
90
+ if (file !== "conanfile.txt") {
91
+ return { code: 1, stdout: "", stderr: "conanfile.py requires manual editing (not a plain-text format)", combined: "conanfile.py requires manual editing (not a plain-text format)" };
92
+ }
93
+ const path = join(cwd, file);
94
+ const raw = await readFile(path, "utf8");
95
+ const re = new RegExp(`^${name}\\/[^@\\s]+`, "m");
96
+ if (!re.test(raw)) {
97
+ return { code: 1, stdout: "", stderr: `could not find ${name} in conanfile.txt`, combined: `could not find ${name} in conanfile.txt` };
98
+ }
99
+ await writeFile(path, raw.replace(re, `${name}/${version}`), "utf8");
100
+ return exec("conan", ["install", "."], { cwd, timeout: 300_000 });
101
+ },
102
+ async defaultCheckCommands() {
103
+ return { build: { cmd: "conan", args: ["build", "."] } };
104
+ },
105
+ };
106
+ //# sourceMappingURL=conan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conan.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/conan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { join } from "node:path";
2
+ import { readFile } from "node:fs/promises";
3
+ import { exec } from "../exec.js";
4
+ import { pathExists } from "./types.js";
5
+ async function latestOnElmPackages(name) {
6
+ try {
7
+ const res = await fetch(`https://package.elm-lang.org/packages/${name}/releases.json`);
8
+ if (!res.ok)
9
+ return null;
10
+ const data = (await res.json());
11
+ const versions = Object.keys(data);
12
+ if (versions.length === 0)
13
+ return null;
14
+ return versions.sort(compareSemver).at(-1) ?? null;
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ function compareSemver(a, b) {
21
+ const pa = a.split(".").map(Number);
22
+ const pb = b.split(".").map(Number);
23
+ for (let i = 0; i < 3; i++) {
24
+ if ((pa[i] ?? 0) !== (pb[i] ?? 0))
25
+ return (pa[i] ?? 0) - (pb[i] ?? 0);
26
+ }
27
+ return 0;
28
+ }
29
+ export function parseElmDirectDeps(json) {
30
+ return json.dependencies?.direct ?? {};
31
+ }
32
+ export const elmAdapter = {
33
+ id: "elm",
34
+ displayName: "Elm",
35
+ manifestFiles: ["elm.json"],
36
+ lockFiles: [],
37
+ verified: true,
38
+ async detect(cwd) {
39
+ return pathExists(join(cwd, "elm.json"));
40
+ },
41
+ async outdated(cwd) {
42
+ try {
43
+ const raw = await readFile(join(cwd, "elm.json"), "utf8");
44
+ const json = JSON.parse(raw);
45
+ const deps = parseElmDirectDeps(json);
46
+ const out = [];
47
+ for (const [name, current] of Object.entries(deps)) {
48
+ const latest = await latestOnElmPackages(name);
49
+ if (latest && latest !== current)
50
+ out.push({ name, current, wanted: "", latest });
51
+ }
52
+ return out;
53
+ }
54
+ catch {
55
+ return [];
56
+ }
57
+ },
58
+ async install(cwd, name, version) {
59
+ // `elm install` always adds the latest version and has no version-pin
60
+ // flag; land the exact version by editing elm.json directly.
61
+ const path = join(cwd, "elm.json");
62
+ const raw = await readFile(path, "utf8");
63
+ const json = JSON.parse(raw);
64
+ if (!json.dependencies?.direct?.[name]) {
65
+ return { code: 1, stdout: "", stderr: `${name} is not a direct dependency in elm.json`, combined: `${name} is not a direct dependency in elm.json` };
66
+ }
67
+ json.dependencies.direct[name] = version;
68
+ const { writeFile } = await import("node:fs/promises");
69
+ await writeFile(path, JSON.stringify(json, null, 4), "utf8");
70
+ return { code: 0, stdout: `pinned ${name} to ${version} in elm.json`, stderr: "", combined: "" };
71
+ },
72
+ async defaultCheckCommands() {
73
+ return { build: { cmd: "elm", args: ["make", "src/Main.elm", "--output=/dev/null"] } };
74
+ },
75
+ };
76
+ void exec;
77
+ //# sourceMappingURL=elm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elm.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/elm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,UAAU,EAAwC,MAAM,YAAY,CAAC;AAM9E,KAAK,UAAU,mBAAmB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,yCAAyC,IAAI,gBAAgB,CAAC,CAAC;QACvF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2B,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,OAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IACzC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,OAAO,IAAI,CAAC,YAAY,EAAE,MAAM,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAqB;IAC1C,EAAE,EAAE,KAAK;IACT,WAAW,EAAE,KAAK;IAClB,aAAa,EAAE,CAAC,UAAU,CAAC;IAC3B,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,IAAI;IAEd,KAAK,CAAC,MAAM,CAAC,GAAG;QACd,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAG;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;YACxC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAI,MAAM,IAAI,MAAM,KAAK,OAAO;oBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO;QAC9B,sEAAsE;QACtE,6DAA6D;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsC,CAAC;QAClE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,yCAAyC,EAAE,QAAQ,EAAE,GAAG,IAAI,yCAAyC,EAAE,CAAC;QACvJ,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;QACzC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,IAAI,OAAO,OAAO,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,oBAAoB,CAAC,EAAE,EAAE,CAAC;IACzF,CAAC;CACF,CAAC;AAEF,KAAK,IAAI,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { join } from "node:path";
2
+ import { exec } from "../exec.js";
3
+ import { pathExists } from "./types.js";
4
+ export const goAdapter = {
5
+ id: "go",
6
+ displayName: "Go modules",
7
+ manifestFiles: ["go.mod"],
8
+ lockFiles: ["go.sum"],
9
+ verified: true,
10
+ async detect(cwd) {
11
+ return pathExists(join(cwd, "go.mod"));
12
+ },
13
+ async outdated(cwd) {
14
+ const r = await exec("go", ["list", "-u", "-m", "-json", "all"], { cwd, timeout: 180_000 });
15
+ return parseGoListOutdated(r.stdout);
16
+ },
17
+ async install(cwd, name, version) {
18
+ return exec("go", ["get", `${name}@v${version.replace(/^v/, "")}`], { cwd, timeout: 300_000 });
19
+ },
20
+ async defaultCheckCommands() {
21
+ return {
22
+ build: { cmd: "go", args: ["build", "./..."] },
23
+ test: { cmd: "go", args: ["test", "./..."] },
24
+ };
25
+ },
26
+ };
27
+ /**
28
+ * `go list -json all` streams one JSON object per module, not a single
29
+ * array. Exported standalone so it can be unit-tested against a fixture
30
+ * without shelling out to go.
31
+ */
32
+ export function parseGoListOutdated(stdout) {
33
+ const out = [];
34
+ for (const chunk of splitJsonObjects(stdout)) {
35
+ const mod = safeJsonParse(chunk);
36
+ if (!mod || mod.Main || mod.Indirect || !mod.Update?.Version || !mod.Version)
37
+ continue;
38
+ if (mod.Update.Version === mod.Version)
39
+ continue;
40
+ out.push({ name: mod.Path, current: mod.Version, wanted: "", latest: mod.Update.Version });
41
+ }
42
+ return out;
43
+ }
44
+ function splitJsonObjects(text) {
45
+ const chunks = [];
46
+ let depth = 0;
47
+ let start = -1;
48
+ for (let i = 0; i < text.length; i++) {
49
+ if (text[i] === "{") {
50
+ if (depth === 0)
51
+ start = i;
52
+ depth++;
53
+ }
54
+ else if (text[i] === "}") {
55
+ depth--;
56
+ if (depth === 0 && start >= 0) {
57
+ chunks.push(text.slice(start, i + 1));
58
+ start = -1;
59
+ }
60
+ }
61
+ }
62
+ return chunks;
63
+ }
64
+ function safeJsonParse(text) {
65
+ try {
66
+ return JSON.parse(text);
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ //# sourceMappingURL=go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/go.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { join } from "node:path";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { pathExists } from "./types.js";
4
+ // Matches lines like: implementation("group:artifact:1.2.3") or implementation 'group:artifact:1.2.3'
5
+ const DEP_LINE = /(implementation|api|testImplementation|compileOnly|runtimeOnly)[\s(]+['"]([^:'"]+):([^:'"]+):([^'")]+)['")]/g;
6
+ export function parseGradleBuildFile(raw) {
7
+ const deps = [];
8
+ for (const m of raw.matchAll(DEP_LINE)) {
9
+ deps.push({ group: m[2], artifact: m[3], version: m[4] });
10
+ }
11
+ return deps;
12
+ }
13
+ async function findBuildFile(cwd) {
14
+ for (const name of ["build.gradle.kts", "build.gradle"]) {
15
+ if (await pathExists(join(cwd, name)))
16
+ return name;
17
+ }
18
+ return null;
19
+ }
20
+ async function directDeps(cwd, file) {
21
+ try {
22
+ const raw = await readFile(join(cwd, file), "utf8");
23
+ return parseGradleBuildFile(raw);
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ }
29
+ async function latestOnMavenCentral(group, artifact) {
30
+ try {
31
+ const url = `https://search.maven.org/solrsearch/select?q=g:${encodeURIComponent(group)}+AND+a:${encodeURIComponent(artifact)}&core=gav&rows=1&sort=v+desc&wt=json`;
32
+ const res = await fetch(url);
33
+ if (!res.ok)
34
+ return null;
35
+ const data = (await res.json());
36
+ return data.response?.docs?.[0]?.v ?? null;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ /** Gradle dependency versions are inline in build.gradle(.kts), same constraint as Maven. */
43
+ export const gradleAdapter = {
44
+ id: "gradle",
45
+ displayName: "Gradle",
46
+ manifestFiles: ["build.gradle", "build.gradle.kts"],
47
+ lockFiles: ["gradle.lockfile"],
48
+ verified: true,
49
+ async detect(cwd) {
50
+ return (await findBuildFile(cwd)) !== null;
51
+ },
52
+ async outdated(cwd) {
53
+ const file = await findBuildFile(cwd);
54
+ if (!file)
55
+ return [];
56
+ const deps = await directDeps(cwd, file);
57
+ const out = [];
58
+ for (const d of deps) {
59
+ const latest = await latestOnMavenCentral(d.group, d.artifact);
60
+ if (latest && latest !== d.version) {
61
+ out.push({ name: `${d.group}:${d.artifact}`, current: d.version, wanted: "", latest });
62
+ }
63
+ }
64
+ return out;
65
+ },
66
+ async install(cwd, name, version) {
67
+ const file = await findBuildFile(cwd);
68
+ if (!file)
69
+ return { code: 1, stdout: "", stderr: "no build.gradle(.kts) found", combined: "no build.gradle(.kts) found" };
70
+ const [, artifact] = name.split(":");
71
+ const path = join(cwd, file);
72
+ const raw = await readFile(path, "utf8");
73
+ const re = new RegExp(`(['"][^:'"]+:${escapeRegExp(artifact)}:)[^'")]+(['")])`);
74
+ if (!re.test(raw)) {
75
+ return { code: 1, stdout: "", stderr: `could not find ${name} in ${file}`, combined: `could not find ${name} in ${file}` };
76
+ }
77
+ await writeFile(path, raw.replace(re, `$1${version}$2`), "utf8");
78
+ return { code: 0, stdout: `pinned ${name} to ${version} in ${file}`, stderr: "", combined: "" };
79
+ },
80
+ async defaultCheckCommands() {
81
+ return {
82
+ build: { cmd: "gradle", args: ["build", "-x", "test"] },
83
+ test: { cmd: "gradle", args: ["test"] },
84
+ };
85
+ },
86
+ };
87
+ function escapeRegExp(s) {
88
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
89
+ }
90
+ //# sourceMappingURL=gradle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/gradle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { npmAdapter } from "./npm.js";
2
+ import { yarnAdapter } from "./yarn.js";
3
+ import { pnpmAdapter } from "./pnpm.js";
4
+ import { pipAdapter } from "./pip.js";
5
+ import { poetryAdapter } from "./poetry.js";
6
+ import { uvAdapter } from "./uv.js";
7
+ import { pipenvAdapter } from "./pipenv.js";
8
+ import { cargoAdapter } from "./cargo.js";
9
+ import { goAdapter } from "./go.js";
10
+ import { bundlerAdapter } from "./bundler.js";
11
+ import { composerAdapter } from "./composer.js";
12
+ import { mavenAdapter } from "./maven.js";
13
+ import { gradleAdapter } from "./gradle.js";
14
+ import { nugetAdapter } from "./nuget.js";
15
+ import { mixAdapter } from "./mix.js";
16
+ import { pubAdapter } from "./pub.js";
17
+ import { swiftpmAdapter } from "./swiftpm.js";
18
+ import { cocoapodsAdapter } from "./cocoapods.js";
19
+ import { conanAdapter } from "./conan.js";
20
+ import { elmAdapter } from "./elm.js";
21
+ /**
22
+ * Detection order matters: within one language, lockfile-specific tools
23
+ * (pnpm/yarn/poetry/uv/pipenv/…) must be checked before their more generic
24
+ * sibling (npm/pip) so a project using e.g. poetry.lock doesn't fall through
25
+ * to a bare pip read.
26
+ */
27
+ export const ADAPTERS = [
28
+ pnpmAdapter,
29
+ yarnAdapter,
30
+ npmAdapter,
31
+ uvAdapter,
32
+ poetryAdapter,
33
+ pipenvAdapter,
34
+ pipAdapter,
35
+ cargoAdapter,
36
+ goAdapter,
37
+ bundlerAdapter,
38
+ composerAdapter,
39
+ gradleAdapter,
40
+ mavenAdapter,
41
+ nugetAdapter,
42
+ mixAdapter,
43
+ pubAdapter,
44
+ swiftpmAdapter,
45
+ cocoapodsAdapter,
46
+ conanAdapter,
47
+ elmAdapter,
48
+ ];
49
+ export function getAdapter(id) {
50
+ const found = ADAPTERS.find((a) => a.id === id);
51
+ if (!found) {
52
+ throw new Error(`Unknown ecosystem "${id}". Available: ${ADAPTERS.map((a) => a.id).join(", ")}`);
53
+ }
54
+ return found;
55
+ }
56
+ /** Detect which ecosystem(s) this project uses; returns the first match in priority order. */
57
+ export async function detectEcosystem(cwd) {
58
+ for (const adapter of ADAPTERS) {
59
+ if (await adapter.detect(cwd))
60
+ return adapter;
61
+ }
62
+ return undefined;
63
+ }
64
+ export function listEcosystems() {
65
+ return ADAPTERS.map((a) => `${a.id.padEnd(12)} ${a.displayName}${a.verified ? "" : " (docs-only, unverified)"}`).join("\n");
66
+ }
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/ecosystems/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAuB;IAC1C,WAAW;IACX,WAAW;IACX,UAAU;IACV,SAAS;IACT,aAAa;IACb,aAAa;IACb,UAAU;IACV,YAAY;IACZ,SAAS;IACT,cAAc;IACd,eAAe;IACf,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,UAAU;IACV,cAAc;IACd,gBAAgB;IAChB,YAAY;IACZ,UAAU;CACX,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,iBAAiB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;IAChD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC,IAAI,CACpH,IAAI,CACL,CAAC;AACJ,CAAC"}