@codefresh-io/gitops-release 0.1.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 (98) hide show
  1. package/README.md +397 -0
  2. package/dist/commands/cherry-pick.d.ts +14 -0
  3. package/dist/commands/cherry-pick.d.ts.map +1 -0
  4. package/dist/commands/cherry-pick.js +337 -0
  5. package/dist/commands/cherry-pick.js.map +1 -0
  6. package/dist/commands/cherry-pick.test.d.ts +2 -0
  7. package/dist/commands/cherry-pick.test.d.ts.map +1 -0
  8. package/dist/commands/cherry-pick.test.js +377 -0
  9. package/dist/commands/cherry-pick.test.js.map +1 -0
  10. package/dist/commands/completion.d.ts +11 -0
  11. package/dist/commands/completion.d.ts.map +1 -0
  12. package/dist/commands/completion.js +195 -0
  13. package/dist/commands/completion.js.map +1 -0
  14. package/dist/commands/completion.test.d.ts +2 -0
  15. package/dist/commands/completion.test.d.ts.map +1 -0
  16. package/dist/commands/completion.test.js +142 -0
  17. package/dist/commands/completion.test.js.map +1 -0
  18. package/dist/commands/create.d.ts +15 -0
  19. package/dist/commands/create.d.ts.map +1 -0
  20. package/dist/commands/create.js +107 -0
  21. package/dist/commands/create.js.map +1 -0
  22. package/dist/commands/create.test.d.ts +2 -0
  23. package/dist/commands/create.test.d.ts.map +1 -0
  24. package/dist/commands/create.test.js +274 -0
  25. package/dist/commands/create.test.js.map +1 -0
  26. package/dist/commands/list.d.ts +14 -0
  27. package/dist/commands/list.d.ts.map +1 -0
  28. package/dist/commands/list.js +69 -0
  29. package/dist/commands/list.js.map +1 -0
  30. package/dist/commands/notes.d.ts +15 -0
  31. package/dist/commands/notes.d.ts.map +1 -0
  32. package/dist/commands/notes.js +374 -0
  33. package/dist/commands/notes.js.map +1 -0
  34. package/dist/commands/publish.d.ts +14 -0
  35. package/dist/commands/publish.d.ts.map +1 -0
  36. package/dist/commands/publish.js +220 -0
  37. package/dist/commands/publish.js.map +1 -0
  38. package/dist/commands/publish.test.d.ts +2 -0
  39. package/dist/commands/publish.test.d.ts.map +1 -0
  40. package/dist/commands/publish.test.js +371 -0
  41. package/dist/commands/publish.test.js.map +1 -0
  42. package/dist/commands/status.d.ts +8 -0
  43. package/dist/commands/status.d.ts.map +1 -0
  44. package/dist/commands/status.js +258 -0
  45. package/dist/commands/status.js.map +1 -0
  46. package/dist/context.d.ts +35 -0
  47. package/dist/context.d.ts.map +1 -0
  48. package/dist/context.js +48 -0
  49. package/dist/context.js.map +1 -0
  50. package/dist/index.d.ts +4 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +152 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/output/formatter.d.ts +161 -0
  55. package/dist/output/formatter.d.ts.map +1 -0
  56. package/dist/output/formatter.js +398 -0
  57. package/dist/output/formatter.js.map +1 -0
  58. package/dist/output/formatter.test.d.ts +2 -0
  59. package/dist/output/formatter.test.d.ts.map +1 -0
  60. package/dist/output/formatter.test.js +223 -0
  61. package/dist/output/formatter.test.js.map +1 -0
  62. package/dist/services/ai.d.ts +69 -0
  63. package/dist/services/ai.d.ts.map +1 -0
  64. package/dist/services/ai.js +235 -0
  65. package/dist/services/ai.js.map +1 -0
  66. package/dist/services/ai.test.d.ts +2 -0
  67. package/dist/services/ai.test.d.ts.map +1 -0
  68. package/dist/services/ai.test.js +101 -0
  69. package/dist/services/ai.test.js.map +1 -0
  70. package/dist/services/github.d.ts +200 -0
  71. package/dist/services/github.d.ts.map +1 -0
  72. package/dist/services/github.js +465 -0
  73. package/dist/services/github.js.map +1 -0
  74. package/dist/services/github.test.d.ts +2 -0
  75. package/dist/services/github.test.d.ts.map +1 -0
  76. package/dist/services/github.test.js +64 -0
  77. package/dist/services/github.test.js.map +1 -0
  78. package/dist/services/version.d.ts +106 -0
  79. package/dist/services/version.d.ts.map +1 -0
  80. package/dist/services/version.js +158 -0
  81. package/dist/services/version.js.map +1 -0
  82. package/dist/services/version.test.d.ts +2 -0
  83. package/dist/services/version.test.d.ts.map +1 -0
  84. package/dist/services/version.test.js +136 -0
  85. package/dist/services/version.test.js.map +1 -0
  86. package/dist/utils/errors.d.ts +66 -0
  87. package/dist/utils/errors.d.ts.map +1 -0
  88. package/dist/utils/errors.js +154 -0
  89. package/dist/utils/errors.js.map +1 -0
  90. package/dist/utils/errors.test.d.ts +2 -0
  91. package/dist/utils/errors.test.d.ts.map +1 -0
  92. package/dist/utils/errors.test.js +147 -0
  93. package/dist/utils/errors.test.js.map +1 -0
  94. package/dist/utils/prompts.d.ts +54 -0
  95. package/dist/utils/prompts.d.ts.map +1 -0
  96. package/dist/utils/prompts.js +108 -0
  97. package/dist/utils/prompts.js.map +1 -0
  98. package/package.json +70 -0
@@ -0,0 +1,142 @@
1
+ // ABOUTME: Unit tests for the completion command.
2
+ // ABOUTME: Tests bash and zsh script generation and error handling.
3
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
4
+ import { completionCommand } from "./completion.js";
5
+ import { ValidationError } from "../utils/errors.js";
6
+ /**
7
+ * Creates a mock Formatter.
8
+ */
9
+ function createMockFormatter() {
10
+ return {
11
+ spinner: vi.fn().mockReturnValue({
12
+ start: vi.fn(),
13
+ stop: vi.fn(),
14
+ }),
15
+ isJsonMode: vi.fn().mockReturnValue(false),
16
+ json: vi.fn(),
17
+ header: vi.fn(),
18
+ newline: vi.fn(),
19
+ keyValue: vi.fn(),
20
+ info: vi.fn(),
21
+ text: vi.fn(),
22
+ section: vi.fn(),
23
+ success: vi.fn(),
24
+ warning: vi.fn(),
25
+ error: vi.fn(),
26
+ };
27
+ }
28
+ describe("completionCommand", () => {
29
+ let consoleLogSpy;
30
+ let capturedOutput;
31
+ beforeEach(() => {
32
+ capturedOutput = "";
33
+ consoleLogSpy = vi.spyOn(console, "log").mockImplementation((msg) => {
34
+ capturedOutput = msg;
35
+ });
36
+ });
37
+ afterEach(() => {
38
+ consoleLogSpy.mockRestore();
39
+ });
40
+ describe("bash completion", () => {
41
+ it("generates valid bash completion script", async () => {
42
+ const formatter = createMockFormatter();
43
+ await completionCommand(formatter, "bash");
44
+ expect(capturedOutput).toContain("_gitops_release_completions");
45
+ expect(capturedOutput).toContain("complete -F _gitops_release_completions gitops-release");
46
+ });
47
+ it("includes all commands in bash completion", async () => {
48
+ const formatter = createMockFormatter();
49
+ await completionCommand(formatter, "bash");
50
+ expect(capturedOutput).toContain("create");
51
+ expect(capturedOutput).toContain("status");
52
+ expect(capturedOutput).toContain("publish");
53
+ expect(capturedOutput).toContain("list");
54
+ expect(capturedOutput).toContain("notes");
55
+ expect(capturedOutput).toContain("cherry-pick");
56
+ expect(capturedOutput).toContain("completion");
57
+ });
58
+ it("includes command-specific options in bash completion", async () => {
59
+ const formatter = createMockFormatter();
60
+ await completionCommand(formatter, "bash");
61
+ // create options
62
+ expect(capturedOutput).toContain("--from");
63
+ expect(capturedOutput).toContain("--dry-run");
64
+ expect(capturedOutput).toContain("--force");
65
+ // list options
66
+ expect(capturedOutput).toContain("--limit");
67
+ expect(capturedOutput).toContain("--include-drafts");
68
+ // notes options
69
+ expect(capturedOutput).toContain("--edit");
70
+ expect(capturedOutput).toContain("--apply");
71
+ });
72
+ it("includes installation instructions in bash completion", async () => {
73
+ const formatter = createMockFormatter();
74
+ await completionCommand(formatter, "bash");
75
+ expect(capturedOutput).toContain("source <(gitops-release completion bash)");
76
+ });
77
+ it("handles uppercase BASH", async () => {
78
+ const formatter = createMockFormatter();
79
+ await completionCommand(formatter, "BASH");
80
+ expect(capturedOutput).toContain("_gitops_release_completions");
81
+ });
82
+ });
83
+ describe("zsh completion", () => {
84
+ it("generates valid zsh completion script", async () => {
85
+ const formatter = createMockFormatter();
86
+ await completionCommand(formatter, "zsh");
87
+ expect(capturedOutput).toContain("#compdef gitops-release");
88
+ expect(capturedOutput).toContain("_gitops_release");
89
+ });
90
+ it("includes all commands with descriptions in zsh completion", async () => {
91
+ const formatter = createMockFormatter();
92
+ await completionCommand(formatter, "zsh");
93
+ expect(capturedOutput).toContain("create:Create a new stable release branch");
94
+ expect(capturedOutput).toContain("status:Show status of releases");
95
+ expect(capturedOutput).toContain("publish:Publish a release");
96
+ expect(capturedOutput).toContain("list:List releases");
97
+ expect(capturedOutput).toContain("notes:Generate AI-powered release notes");
98
+ expect(capturedOutput).toContain("cherry-pick:Cherry-pick commits");
99
+ expect(capturedOutput).toContain("completion:Generate shell completion script");
100
+ });
101
+ it("includes command-specific options in zsh completion", async () => {
102
+ const formatter = createMockFormatter();
103
+ await completionCommand(formatter, "zsh");
104
+ // create options with descriptions
105
+ expect(capturedOutput).toContain("--from");
106
+ expect(capturedOutput).toContain("Commit SHA to branch from");
107
+ // list options
108
+ expect(capturedOutput).toContain("--limit");
109
+ expect(capturedOutput).toContain("--include-drafts");
110
+ // notes options
111
+ expect(capturedOutput).toContain("--edit");
112
+ expect(capturedOutput).toContain("--apply");
113
+ });
114
+ it("includes installation instructions in zsh completion", async () => {
115
+ const formatter = createMockFormatter();
116
+ await completionCommand(formatter, "zsh");
117
+ expect(capturedOutput).toContain("gitops-release completion zsh > ~/.zsh/completions/_gitops-release");
118
+ expect(capturedOutput).toContain("autoload -Uz compinit");
119
+ });
120
+ it("handles uppercase ZSH", async () => {
121
+ const formatter = createMockFormatter();
122
+ await completionCommand(formatter, "ZSH");
123
+ expect(capturedOutput).toContain("#compdef gitops-release");
124
+ });
125
+ });
126
+ describe("error handling", () => {
127
+ it("throws ValidationError for unsupported shell", async () => {
128
+ const formatter = createMockFormatter();
129
+ await expect(completionCommand(formatter, "fish")).rejects.toThrow(ValidationError);
130
+ await expect(completionCommand(formatter, "fish")).rejects.toThrow("Unsupported shell");
131
+ });
132
+ it("provides usage hint in error message", async () => {
133
+ const formatter = createMockFormatter();
134
+ await expect(completionCommand(formatter, "powershell")).rejects.toThrow("Supported shells: bash, zsh");
135
+ });
136
+ it("throws ValidationError for empty shell", async () => {
137
+ const formatter = createMockFormatter();
138
+ await expect(completionCommand(formatter, "")).rejects.toThrow(ValidationError);
139
+ });
140
+ });
141
+ });
142
+ //# sourceMappingURL=completion.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.test.js","sourceRoot":"","sources":["../../src/commands/completion.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { CommandContext } from "../context.js";
2
+ /**
3
+ * Options for the create command.
4
+ */
5
+ export interface CreateOptions {
6
+ from?: string;
7
+ dryRun: boolean;
8
+ force?: boolean;
9
+ }
10
+ /**
11
+ * Executes the create command.
12
+ * Creates a new stable branch from main HEAD or a specific commit.
13
+ */
14
+ export declare function createCommand(ctx: CommandContext, versionInput: string, options: CreateOptions): Promise<void>;
15
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAK/C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAaD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAkHf"}
@@ -0,0 +1,107 @@
1
+ // ABOUTME: Create command that creates a new stable release branch.
2
+ // ABOUTME: Triggers the prepare-release pipeline by creating stable/<major.minor> branch.
3
+ import { GitHubError, ValidationError } from "../utils/errors.js";
4
+ import { parseMajorMinor, formatStableBranch, formatVersion } from "../services/version.js";
5
+ import { confirm } from "../utils/prompts.js";
6
+ /**
7
+ * Executes the create command.
8
+ * Creates a new stable branch from main HEAD or a specific commit.
9
+ */
10
+ export async function createCommand(ctx, versionInput, options) {
11
+ const { github, formatter } = ctx;
12
+ // Parse and validate version format (must be major.minor only)
13
+ const version = parseMajorMinor(versionInput);
14
+ const stableBranchName = formatStableBranch(version);
15
+ const versionStr = formatVersion(version);
16
+ // Get the source commit SHA
17
+ let sourceSha;
18
+ let sourceRef;
19
+ const spinner = formatter.spinner("Checking prerequisites...");
20
+ spinner.start();
21
+ if (options.from) {
22
+ // Use specified commit
23
+ sourceRef = options.from;
24
+ try {
25
+ sourceSha = await github.getRefSha(options.from);
26
+ }
27
+ catch {
28
+ spinner.stop();
29
+ throw new ValidationError(`Commit '${options.from}' not found. Please provide a valid commit SHA.`);
30
+ }
31
+ }
32
+ else {
33
+ // Use HEAD of main
34
+ sourceRef = "main";
35
+ const mainBranch = await github.getBranch("main");
36
+ if (!mainBranch) {
37
+ spinner.stop();
38
+ throw new GitHubError("Main branch not found in repository");
39
+ }
40
+ sourceSha = mainBranch.sha;
41
+ }
42
+ // Check if branch already exists
43
+ const existingBranch = await github.getBranch(stableBranchName);
44
+ if (existingBranch) {
45
+ spinner.stop();
46
+ throw new GitHubError(`Branch '${stableBranchName}' already exists.\n` +
47
+ `Use 'gitops-release status ${versionStr}' to check its status.`);
48
+ }
49
+ spinner.stop();
50
+ // Dry run mode - just show what would happen
51
+ if (options.dryRun) {
52
+ if (formatter.isJsonMode()) {
53
+ const jsonOutput = {
54
+ version: versionStr,
55
+ branch: stableBranchName,
56
+ sha: sourceSha,
57
+ created: false,
58
+ dryRun: true,
59
+ };
60
+ formatter.json(jsonOutput);
61
+ return;
62
+ }
63
+ formatter.header("Dry Run - No changes will be made");
64
+ formatter.newline();
65
+ formatter.keyValue("Version", versionStr);
66
+ formatter.keyValue("Branch to create", stableBranchName);
67
+ formatter.keyValue("Source", `${sourceRef} (${sourceSha.substring(0, 7)})`);
68
+ formatter.newline();
69
+ formatter.info("Run without --dry-run to create the branch");
70
+ return;
71
+ }
72
+ // Show what we're about to do and confirm
73
+ if (!formatter.isJsonMode()) {
74
+ formatter.text(`Creating ${stableBranchName} branch from ${sourceSha.substring(0, 7)}...`);
75
+ formatter.newline();
76
+ }
77
+ // Confirm before creating (unless --force or non-interactive)
78
+ await confirm(`Create branch '${stableBranchName}'?`, { force: options.force });
79
+ // Create the branch
80
+ const createSpinner = formatter.spinner(`Creating ${stableBranchName}...`);
81
+ createSpinner.start();
82
+ const newBranch = await github.createBranch(stableBranchName, sourceSha);
83
+ createSpinner.stop();
84
+ // Handle JSON output
85
+ if (formatter.isJsonMode()) {
86
+ const jsonOutput = {
87
+ version: versionStr,
88
+ branch: stableBranchName,
89
+ sha: newBranch.sha,
90
+ created: true,
91
+ dryRun: false,
92
+ };
93
+ formatter.json(jsonOutput);
94
+ return;
95
+ }
96
+ // Human-readable success output
97
+ formatter.success(`Created branch ${stableBranchName}`);
98
+ formatter.newline();
99
+ formatter.section("Next steps");
100
+ formatter.text(" The prepare-release pipeline will automatically:");
101
+ formatter.text(` • Create prep/v${versionStr}.0 branch with version bump`);
102
+ formatter.text(` • Open a prepare-release PR to ${stableBranchName}`);
103
+ formatter.text(" • Create a draft GitHub release");
104
+ formatter.newline();
105
+ formatter.text(` Run 'gitops-release status ${versionStr}' to check progress.`);
106
+ }
107
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=create.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.test.d.ts","sourceRoot":"","sources":["../../src/commands/create.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,274 @@
1
+ // ABOUTME: Unit tests for the create command.
2
+ // ABOUTME: Tests version validation, branch creation, and error handling.
3
+ import { describe, it, expect, vi, beforeEach } from "vitest";
4
+ import { createCommand } from "./create.js";
5
+ import { ValidationError, GitHubError } from "../utils/errors.js";
6
+ // Mock the prompts module
7
+ vi.mock("../utils/prompts.js", () => ({
8
+ confirm: vi.fn().mockResolvedValue(true),
9
+ }));
10
+ /**
11
+ * Creates a mock GitHubService with default implementations.
12
+ */
13
+ function createMockGitHub() {
14
+ const getBranch = vi.fn();
15
+ const getRefSha = vi.fn();
16
+ const createBranch = vi.fn();
17
+ const getRepo = vi.fn().mockReturnValue({ owner: "test-owner", repo: "test-repo" });
18
+ const github = {
19
+ getBranch,
20
+ getRefSha,
21
+ createBranch,
22
+ getRepo,
23
+ };
24
+ return { github, mocks: { getBranch, getRefSha, createBranch, getRepo } };
25
+ }
26
+ /**
27
+ * Creates a mock Formatter that captures output.
28
+ */
29
+ function createMockFormatter() {
30
+ const output = { json: null, texts: [], successes: [] };
31
+ const formatter = {
32
+ spinner: vi.fn().mockReturnValue({
33
+ start: vi.fn(),
34
+ stop: vi.fn(),
35
+ }),
36
+ isJsonMode: vi.fn().mockReturnValue(false),
37
+ json: vi.fn((data) => {
38
+ output.json = data;
39
+ }),
40
+ header: vi.fn(),
41
+ newline: vi.fn(),
42
+ keyValue: vi.fn(),
43
+ info: vi.fn(),
44
+ text: vi.fn((msg) => {
45
+ output.texts.push(msg);
46
+ }),
47
+ section: vi.fn(),
48
+ success: vi.fn((msg) => {
49
+ output.successes.push(msg);
50
+ }),
51
+ };
52
+ return { formatter, output };
53
+ }
54
+ /**
55
+ * Creates a CommandContext with mocked services.
56
+ */
57
+ function createMockContext() {
58
+ const { github, mocks } = createMockGitHub();
59
+ const { formatter, output } = createMockFormatter();
60
+ const ctx = {
61
+ github,
62
+ formatter,
63
+ options: {
64
+ repo: "test-owner/test-repo",
65
+ json: false,
66
+ quiet: false,
67
+ verbose: false,
68
+ },
69
+ };
70
+ return { ctx, mocks, output };
71
+ }
72
+ describe("createCommand", () => {
73
+ beforeEach(() => {
74
+ vi.clearAllMocks();
75
+ });
76
+ describe("version validation", () => {
77
+ it("rejects full semver format (X.Y.Z)", async () => {
78
+ const { ctx } = createMockContext();
79
+ const options = { dryRun: false };
80
+ await expect(createCommand(ctx, "0.27.0", options)).rejects.toThrow(ValidationError);
81
+ await expect(createCommand(ctx, "0.27.0", options)).rejects.toThrow("Expected: major.minor");
82
+ });
83
+ it("rejects invalid version formats", async () => {
84
+ const { ctx } = createMockContext();
85
+ const options = { dryRun: false };
86
+ await expect(createCommand(ctx, "27", options)).rejects.toThrow(ValidationError);
87
+ await expect(createCommand(ctx, "v0.27", options)).rejects.toThrow(ValidationError);
88
+ await expect(createCommand(ctx, "0.27.0.1", options)).rejects.toThrow(ValidationError);
89
+ });
90
+ it("accepts valid major.minor format", async () => {
91
+ const { ctx, mocks } = createMockContext();
92
+ const options = { dryRun: true };
93
+ mocks.getBranch.mockResolvedValueOnce({
94
+ name: "main",
95
+ sha: "abc1234567890",
96
+ protected: false,
97
+ });
98
+ mocks.getBranch.mockResolvedValueOnce(null); // stable branch doesn't exist
99
+ await expect(createCommand(ctx, "0.27", options)).resolves.not.toThrow();
100
+ });
101
+ });
102
+ describe("branch existence check", () => {
103
+ it("throws error when branch already exists", async () => {
104
+ const { ctx, mocks } = createMockContext();
105
+ const options = { dryRun: false };
106
+ // main branch exists
107
+ mocks.getBranch.mockResolvedValueOnce({
108
+ name: "main",
109
+ sha: "abc1234567890",
110
+ protected: false,
111
+ });
112
+ // stable branch already exists
113
+ mocks.getBranch.mockResolvedValueOnce({
114
+ name: "stable/0.27",
115
+ sha: "def5678901234",
116
+ protected: false,
117
+ });
118
+ await expect(createCommand(ctx, "0.27", options)).rejects.toThrow(/already exists/);
119
+ });
120
+ it("proceeds when branch does not exist", async () => {
121
+ const { ctx, mocks } = createMockContext();
122
+ const options = { dryRun: true };
123
+ mocks.getBranch.mockResolvedValueOnce({
124
+ name: "main",
125
+ sha: "abc1234567890",
126
+ protected: false,
127
+ });
128
+ mocks.getBranch.mockResolvedValueOnce(null); // stable branch doesn't exist
129
+ await expect(createCommand(ctx, "0.27", options)).resolves.not.toThrow();
130
+ });
131
+ });
132
+ describe("source commit resolution", () => {
133
+ it("uses main HEAD when --from is not specified", async () => {
134
+ const { ctx, mocks } = createMockContext();
135
+ const options = { dryRun: true };
136
+ mocks.getBranch.mockResolvedValueOnce({
137
+ name: "main",
138
+ sha: "mainheadsha123",
139
+ protected: false,
140
+ });
141
+ mocks.getBranch.mockResolvedValueOnce(null);
142
+ await createCommand(ctx, "0.27", options);
143
+ // Should have called getBranch for main
144
+ expect(mocks.getBranch).toHaveBeenCalledWith("main");
145
+ });
146
+ it("uses specified commit when --from is provided", async () => {
147
+ const { ctx, mocks } = createMockContext();
148
+ const options = { from: "customsha123", dryRun: true };
149
+ mocks.getRefSha.mockResolvedValue("customsha123");
150
+ mocks.getBranch.mockResolvedValue(null); // stable branch doesn't exist
151
+ await createCommand(ctx, "0.27", options);
152
+ expect(mocks.getRefSha).toHaveBeenCalledWith("customsha123");
153
+ });
154
+ it("throws error when --from commit does not exist", async () => {
155
+ const { ctx, mocks } = createMockContext();
156
+ const options = { from: "nonexistent", dryRun: false };
157
+ mocks.getRefSha.mockRejectedValue(new Error("Not found"));
158
+ await expect(createCommand(ctx, "0.27", options)).rejects.toThrow(ValidationError);
159
+ await expect(createCommand(ctx, "0.27", options)).rejects.toThrow("not found");
160
+ });
161
+ it("throws error when main branch does not exist", async () => {
162
+ const { ctx, mocks } = createMockContext();
163
+ const options = { dryRun: false };
164
+ mocks.getBranch.mockResolvedValue(null); // main doesn't exist
165
+ await expect(createCommand(ctx, "0.27", options)).rejects.toThrow(GitHubError);
166
+ await expect(createCommand(ctx, "0.27", options)).rejects.toThrow("Main branch not found");
167
+ });
168
+ });
169
+ describe("dry run mode", () => {
170
+ it("does not create branch in dry run mode", async () => {
171
+ const { ctx, mocks } = createMockContext();
172
+ const options = { dryRun: true };
173
+ mocks.getBranch.mockResolvedValueOnce({
174
+ name: "main",
175
+ sha: "abc1234567890",
176
+ protected: false,
177
+ });
178
+ mocks.getBranch.mockResolvedValueOnce(null);
179
+ await createCommand(ctx, "0.27", options);
180
+ expect(mocks.createBranch).not.toHaveBeenCalled();
181
+ });
182
+ it("outputs dry run header in human mode", async () => {
183
+ const { ctx, mocks } = createMockContext();
184
+ const options = { dryRun: true };
185
+ mocks.getBranch.mockResolvedValueOnce({
186
+ name: "main",
187
+ sha: "abc1234567890",
188
+ protected: false,
189
+ });
190
+ mocks.getBranch.mockResolvedValueOnce(null);
191
+ await createCommand(ctx, "0.27", options);
192
+ expect(ctx.formatter.header).toHaveBeenCalledWith(expect.stringContaining("Dry Run"));
193
+ });
194
+ it("outputs JSON with dryRun=true in JSON mode", async () => {
195
+ const { ctx, mocks, output } = createMockContext();
196
+ const options = { dryRun: true };
197
+ ctx.formatter.isJsonMode.mockReturnValue(true);
198
+ mocks.getBranch.mockResolvedValueOnce({
199
+ name: "main",
200
+ sha: "abc1234567890",
201
+ protected: false,
202
+ });
203
+ mocks.getBranch.mockResolvedValueOnce(null);
204
+ await createCommand(ctx, "0.27", options);
205
+ expect(output.json).toMatchObject({
206
+ version: "0.27",
207
+ branch: "stable/0.27",
208
+ created: false,
209
+ dryRun: true,
210
+ });
211
+ });
212
+ });
213
+ describe("branch creation", () => {
214
+ it("creates branch with correct name and SHA", async () => {
215
+ const { ctx, mocks } = createMockContext();
216
+ const options = { dryRun: false, force: true };
217
+ mocks.getBranch.mockResolvedValueOnce({
218
+ name: "main",
219
+ sha: "abc1234567890",
220
+ protected: false,
221
+ });
222
+ mocks.getBranch.mockResolvedValueOnce(null);
223
+ mocks.createBranch.mockResolvedValue({
224
+ name: "stable/0.27",
225
+ sha: "abc1234567890",
226
+ protected: false,
227
+ });
228
+ await createCommand(ctx, "0.27", options);
229
+ expect(mocks.createBranch).toHaveBeenCalledWith("stable/0.27", "abc1234567890");
230
+ });
231
+ it("outputs success message after creation", async () => {
232
+ const { ctx, mocks, output } = createMockContext();
233
+ const options = { dryRun: false, force: true };
234
+ mocks.getBranch.mockResolvedValueOnce({
235
+ name: "main",
236
+ sha: "abc1234567890",
237
+ protected: false,
238
+ });
239
+ mocks.getBranch.mockResolvedValueOnce(null);
240
+ mocks.createBranch.mockResolvedValue({
241
+ name: "stable/0.27",
242
+ sha: "abc1234567890",
243
+ protected: false,
244
+ });
245
+ await createCommand(ctx, "0.27", options);
246
+ expect(output.successes.some((s) => s.includes("stable/0.27"))).toBe(true);
247
+ });
248
+ it("outputs JSON with created=true after creation in JSON mode", async () => {
249
+ const { ctx, mocks, output } = createMockContext();
250
+ const options = { dryRun: false, force: true };
251
+ ctx.formatter.isJsonMode.mockReturnValue(true);
252
+ mocks.getBranch.mockResolvedValueOnce({
253
+ name: "main",
254
+ sha: "abc1234567890",
255
+ protected: false,
256
+ });
257
+ mocks.getBranch.mockResolvedValueOnce(null);
258
+ mocks.createBranch.mockResolvedValue({
259
+ name: "stable/0.27",
260
+ sha: "abc1234567890",
261
+ protected: false,
262
+ });
263
+ await createCommand(ctx, "0.27", options);
264
+ expect(output.json).toMatchObject({
265
+ version: "0.27",
266
+ branch: "stable/0.27",
267
+ sha: "abc1234567890",
268
+ created: true,
269
+ dryRun: false,
270
+ });
271
+ });
272
+ });
273
+ });
274
+ //# sourceMappingURL=create.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.test.js","sourceRoot":"","sources":["../../src/commands/create.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { CommandContext } from "../context.js";
2
+ /**
3
+ * Options for the list command.
4
+ */
5
+ export interface ListOptions {
6
+ limit: number;
7
+ includeDrafts: boolean;
8
+ }
9
+ /**
10
+ * Executes the list command.
11
+ * Fetches and displays releases from the GitHub repository.
12
+ */
13
+ export declare function listCommand(ctx: CommandContext, options: ListOptions): Promise<void>;
14
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACxB;AA4BD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD1F"}