intershell 0.3.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/README.md +301 -0
- package/dist/commands/ci/act.d.ts +13 -0
- package/dist/commands/ci/act.d.ts.map +1 -0
- package/dist/commands/ci/act.js +89 -0
- package/dist/commands/ci/act.js.map +1 -0
- package/dist/commands/ci/attach-affected.d.ts +12 -0
- package/dist/commands/ci/attach-affected.d.ts.map +1 -0
- package/dist/commands/ci/attach-affected.js +83 -0
- package/dist/commands/ci/attach-affected.js.map +1 -0
- package/dist/commands/ci/attach-service-ports.d.ts +10 -0
- package/dist/commands/ci/attach-service-ports.d.ts.map +1 -0
- package/dist/commands/ci/attach-service-ports.js +25 -0
- package/dist/commands/ci/attach-service-ports.js.map +1 -0
- package/dist/commands/commit-check.d.ts +13 -0
- package/dist/commands/commit-check.d.ts.map +1 -0
- package/dist/commands/commit-check.js +110 -0
- package/dist/commands/commit-check.js.map +1 -0
- package/dist/commands/commit.d.ts +16 -0
- package/dist/commands/commit.d.ts.map +1 -0
- package/dist/commands/commit.js +91 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/dev/check.d.ts +13 -0
- package/dist/commands/dev/check.d.ts.map +1 -0
- package/dist/commands/dev/check.js +91 -0
- package/dist/commands/dev/check.js.map +1 -0
- package/dist/commands/dev/cleanup.d.ts +10 -0
- package/dist/commands/dev/cleanup.d.ts.map +1 -0
- package/dist/commands/dev/cleanup.js +28 -0
- package/dist/commands/dev/cleanup.js.map +1 -0
- package/dist/commands/dev/rm.d.ts +12 -0
- package/dist/commands/dev/rm.d.ts.map +1 -0
- package/dist/commands/dev/rm.js +49 -0
- package/dist/commands/dev/rm.js.map +1 -0
- package/dist/commands/dev/setup.d.ts +10 -0
- package/dist/commands/dev/setup.d.ts.map +1 -0
- package/dist/commands/dev/setup.js +40 -0
- package/dist/commands/dev/setup.js.map +1 -0
- package/dist/commands/local/cleanup.d.ts +12 -0
- package/dist/commands/local/cleanup.d.ts.map +1 -0
- package/dist/commands/local/cleanup.js +62 -0
- package/dist/commands/local/cleanup.js.map +1 -0
- package/dist/commands/local/setup.d.ts +11 -0
- package/dist/commands/local/setup.d.ts.map +1 -0
- package/dist/commands/local/setup.js +55 -0
- package/dist/commands/local/setup.js.map +1 -0
- package/dist/commands/local/vscode.d.ts +17 -0
- package/dist/commands/local/vscode.d.ts.map +1 -0
- package/dist/commands/local/vscode.js +94 -0
- package/dist/commands/local/vscode.js.map +1 -0
- package/dist/commands/update-package-json.d.ts +12 -0
- package/dist/commands/update-package-json.d.ts.map +1 -0
- package/dist/commands/update-package-json.js +82 -0
- package/dist/commands/update-package-json.js.map +1 -0
- package/dist/commands/version/apply.d.ts +16 -0
- package/dist/commands/version/apply.d.ts.map +1 -0
- package/dist/commands/version/apply.js +120 -0
- package/dist/commands/version/apply.js.map +1 -0
- package/dist/commands/version/ci.d.ts +12 -0
- package/dist/commands/version/ci.d.ts.map +1 -0
- package/dist/commands/version/ci.js +67 -0
- package/dist/commands/version/ci.js.map +1 -0
- package/dist/commands/version/prepare.d.ts +19 -0
- package/dist/commands/version/prepare.d.ts.map +1 -0
- package/dist/commands/version/prepare.js +153 -0
- package/dist/commands/version/prepare.js.map +1 -0
- package/dist/core/colorify.d.ts +21 -0
- package/dist/core/colorify.d.ts.map +1 -0
- package/dist/core/colorify.js +56 -0
- package/dist/core/colorify.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/types.d.ts +181 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/wrapshell.d.ts +19 -0
- package/dist/core/wrapshell.d.ts.map +1 -0
- package/dist/core/wrapshell.js +323 -0
- package/dist/core/wrapshell.js.map +1 -0
- package/dist/entities/affected/affected.d.ts +4 -0
- package/dist/entities/affected/affected.d.ts.map +1 -0
- package/dist/entities/affected/affected.js +20 -0
- package/dist/entities/affected/affected.js.map +1 -0
- package/dist/entities/affected/affected.test.d.ts +2 -0
- package/dist/entities/affected/affected.test.d.ts.map +1 -0
- package/dist/entities/affected/affected.test.js +305 -0
- package/dist/entities/affected/affected.test.js.map +1 -0
- package/dist/entities/affected/index.d.ts +2 -0
- package/dist/entities/affected/index.d.ts.map +1 -0
- package/dist/entities/affected/index.js +2 -0
- package/dist/entities/affected/index.js.map +1 -0
- package/dist/entities/branch/branch.d.ts +8 -0
- package/dist/entities/branch/branch.d.ts.map +1 -0
- package/dist/entities/branch/branch.js +74 -0
- package/dist/entities/branch/branch.js.map +1 -0
- package/dist/entities/branch/branch.test.d.ts +2 -0
- package/dist/entities/branch/branch.test.d.ts.map +1 -0
- package/dist/entities/branch/branch.test.js +316 -0
- package/dist/entities/branch/branch.test.js.map +1 -0
- package/dist/entities/branch/branch.types.d.ts +6 -0
- package/dist/entities/branch/branch.types.d.ts.map +1 -0
- package/dist/entities/branch/branch.types.js +2 -0
- package/dist/entities/branch/branch.types.js.map +1 -0
- package/dist/entities/branch/index.d.ts +3 -0
- package/dist/entities/branch/index.d.ts.map +1 -0
- package/dist/entities/branch/index.js +3 -0
- package/dist/entities/branch/index.js.map +1 -0
- package/dist/entities/commit/commit.d.ts +15 -0
- package/dist/entities/commit/commit.d.ts.map +1 -0
- package/dist/entities/commit/commit.js +196 -0
- package/dist/entities/commit/commit.js.map +1 -0
- package/dist/entities/commit/commit.test.d.ts +26 -0
- package/dist/entities/commit/commit.test.d.ts.map +1 -0
- package/dist/entities/commit/commit.test.js +550 -0
- package/dist/entities/commit/commit.test.js.map +1 -0
- package/dist/entities/commit/commit.types.d.ts +49 -0
- package/dist/entities/commit/commit.types.d.ts.map +1 -0
- package/dist/entities/commit/commit.types.js +31 -0
- package/dist/entities/commit/commit.types.js.map +1 -0
- package/dist/entities/commit/index.d.ts +3 -0
- package/dist/entities/commit/index.d.ts.map +1 -0
- package/dist/entities/commit/index.js +3 -0
- package/dist/entities/commit/index.js.map +1 -0
- package/dist/entities/commit/pr.d.ts +11 -0
- package/dist/entities/commit/pr.d.ts.map +1 -0
- package/dist/entities/commit/pr.js +201 -0
- package/dist/entities/commit/pr.js.map +1 -0
- package/dist/entities/commit/pr.test.d.ts +2 -0
- package/dist/entities/commit/pr.test.d.ts.map +1 -0
- package/dist/entities/commit/pr.test.js +782 -0
- package/dist/entities/commit/pr.test.js.map +1 -0
- package/dist/entities/compose/compose.d.ts +18 -0
- package/dist/entities/compose/compose.d.ts.map +1 -0
- package/dist/entities/compose/compose.js +197 -0
- package/dist/entities/compose/compose.js.map +1 -0
- package/dist/entities/compose/compose.test.d.ts +2 -0
- package/dist/entities/compose/compose.test.d.ts.map +1 -0
- package/dist/entities/compose/compose.test.js +406 -0
- package/dist/entities/compose/compose.test.js.map +1 -0
- package/dist/entities/compose/compose.types.d.ts +77 -0
- package/dist/entities/compose/compose.types.d.ts.map +1 -0
- package/dist/entities/compose/compose.types.js +2 -0
- package/dist/entities/compose/compose.types.js.map +1 -0
- package/dist/entities/compose/index.d.ts +3 -0
- package/dist/entities/compose/index.d.ts.map +1 -0
- package/dist/entities/compose/index.js +3 -0
- package/dist/entities/compose/index.js.map +1 -0
- package/dist/entities/entities.shell.d.ts +29 -0
- package/dist/entities/entities.shell.d.ts.map +1 -0
- package/dist/entities/entities.shell.js +27 -0
- package/dist/entities/entities.shell.js.map +1 -0
- package/dist/entities/entities.shell.test.d.ts +2 -0
- package/dist/entities/entities.shell.test.d.ts.map +1 -0
- package/dist/entities/entities.shell.test.js +23 -0
- package/dist/entities/entities.shell.test.js.map +1 -0
- package/dist/entities/index.d.ts +12 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +12 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/intershell-config/intershell-config.d.ts +11 -0
- package/dist/entities/intershell-config/intershell-config.d.ts.map +1 -0
- package/dist/entities/intershell-config/intershell-config.default.d.ts +188 -0
- package/dist/entities/intershell-config/intershell-config.default.d.ts.map +1 -0
- package/dist/entities/intershell-config/intershell-config.default.js +225 -0
- package/dist/entities/intershell-config/intershell-config.default.js.map +1 -0
- package/dist/entities/intershell-config/intershell-config.js +132 -0
- package/dist/entities/intershell-config/intershell-config.js.map +1 -0
- package/dist/entities/intershell-config/intershell-config.test.d.ts +2 -0
- package/dist/entities/intershell-config/intershell-config.test.d.ts.map +1 -0
- package/dist/entities/intershell-config/intershell-config.test.js +102 -0
- package/dist/entities/intershell-config/intershell-config.test.js.map +1 -0
- package/dist/entities/intershell-config/intershell-config.types.d.ts +103 -0
- package/dist/entities/intershell-config/intershell-config.types.d.ts.map +1 -0
- package/dist/entities/intershell-config/intershell-config.types.js +2 -0
- package/dist/entities/intershell-config/intershell-config.types.js.map +1 -0
- package/dist/entities/package/index.d.ts +4 -0
- package/dist/entities/package/index.d.ts.map +1 -0
- package/dist/entities/package/index.js +4 -0
- package/dist/entities/package/index.js.map +1 -0
- package/dist/entities/package/package.d.ts +49 -0
- package/dist/entities/package/package.d.ts.map +1 -0
- package/dist/entities/package/package.js +234 -0
- package/dist/entities/package/package.js.map +1 -0
- package/dist/entities/package/package.shell.d.ts +48 -0
- package/dist/entities/package/package.shell.d.ts.map +1 -0
- package/dist/entities/package/package.shell.js +118 -0
- package/dist/entities/package/package.shell.js.map +1 -0
- package/dist/entities/package/package.test.d.ts +23 -0
- package/dist/entities/package/package.test.d.ts.map +1 -0
- package/dist/entities/package/package.test.js +637 -0
- package/dist/entities/package/package.test.js.map +1 -0
- package/dist/entities/package/package.types.d.ts +48 -0
- package/dist/entities/package/package.types.d.ts.map +1 -0
- package/dist/entities/package/package.types.js +2 -0
- package/dist/entities/package/package.types.js.map +1 -0
- package/dist/entities/package-changelog/index.d.ts +4 -0
- package/dist/entities/package-changelog/index.d.ts.map +1 -0
- package/dist/entities/package-changelog/index.js +4 -0
- package/dist/entities/package-changelog/index.js.map +1 -0
- package/dist/entities/package-changelog/package-changelog.d.ts +20 -0
- package/dist/entities/package-changelog/package-changelog.d.ts.map +1 -0
- package/dist/entities/package-changelog/package-changelog.js +59 -0
- package/dist/entities/package-changelog/package-changelog.js.map +1 -0
- package/dist/entities/package-changelog/package-changelog.types.d.ts +25 -0
- package/dist/entities/package-changelog/package-changelog.types.d.ts.map +1 -0
- package/dist/entities/package-changelog/package-changelog.types.js +2 -0
- package/dist/entities/package-changelog/package-changelog.types.js.map +1 -0
- package/dist/entities/package-changelog/template.d.ts +20 -0
- package/dist/entities/package-changelog/template.d.ts.map +1 -0
- package/dist/entities/package-changelog/template.default.d.ts +10 -0
- package/dist/entities/package-changelog/template.default.d.ts.map +1 -0
- package/dist/entities/package-changelog/template.default.js +85 -0
- package/dist/entities/package-changelog/template.default.js.map +1 -0
- package/dist/entities/package-changelog/template.js +90 -0
- package/dist/entities/package-changelog/template.js.map +1 -0
- package/dist/entities/package-commits/dependency-analyzer.d.ts +35 -0
- package/dist/entities/package-commits/dependency-analyzer.d.ts.map +1 -0
- package/dist/entities/package-commits/dependency-analyzer.js +169 -0
- package/dist/entities/package-commits/dependency-analyzer.js.map +1 -0
- package/dist/entities/package-commits/dependency-analyzer.test.d.ts +2 -0
- package/dist/entities/package-commits/dependency-analyzer.test.d.ts.map +1 -0
- package/dist/entities/package-commits/dependency-analyzer.test.js +25 -0
- package/dist/entities/package-commits/dependency-analyzer.test.js.map +1 -0
- package/dist/entities/package-commits/index.d.ts +3 -0
- package/dist/entities/package-commits/index.d.ts.map +1 -0
- package/dist/entities/package-commits/index.js +3 -0
- package/dist/entities/package-commits/index.js.map +1 -0
- package/dist/entities/package-commits/package-commits.d.ts +33 -0
- package/dist/entities/package-commits/package-commits.d.ts.map +1 -0
- package/dist/entities/package-commits/package-commits.js +149 -0
- package/dist/entities/package-commits/package-commits.js.map +1 -0
- package/dist/entities/package-commits/package-commits.test.d.ts +2 -0
- package/dist/entities/package-commits/package-commits.test.d.ts.map +1 -0
- package/dist/entities/package-commits/package-commits.test.js +40 -0
- package/dist/entities/package-commits/package-commits.test.js.map +1 -0
- package/dist/entities/package-tags/index.d.ts +2 -0
- package/dist/entities/package-tags/index.d.ts.map +1 -0
- package/dist/entities/package-tags/index.js +2 -0
- package/dist/entities/package-tags/index.js.map +1 -0
- package/dist/entities/package-tags/package-tags.d.ts +24 -0
- package/dist/entities/package-tags/package-tags.d.ts.map +1 -0
- package/dist/entities/package-tags/package-tags.js +197 -0
- package/dist/entities/package-tags/package-tags.js.map +1 -0
- package/dist/entities/package-tags/package-tags.test.d.ts +2 -0
- package/dist/entities/package-tags/package-tags.test.d.ts.map +1 -0
- package/dist/entities/package-tags/package-tags.test.js +60 -0
- package/dist/entities/package-tags/package-tags.test.js.map +1 -0
- package/dist/entities/package-version/index.d.ts +3 -0
- package/dist/entities/package-version/index.d.ts.map +1 -0
- package/dist/entities/package-version/index.js +3 -0
- package/dist/entities/package-version/index.js.map +1 -0
- package/dist/entities/package-version/package-version.d.ts +16 -0
- package/dist/entities/package-version/package-version.d.ts.map +1 -0
- package/dist/entities/package-version/package-version.js +166 -0
- package/dist/entities/package-version/package-version.js.map +1 -0
- package/dist/entities/package-version/package-version.test.d.ts +2 -0
- package/dist/entities/package-version/package-version.test.d.ts.map +1 -0
- package/dist/entities/package-version/package-version.test.js +113 -0
- package/dist/entities/package-version/package-version.test.js.map +1 -0
- package/dist/entities/package-version/package-version.types.d.ts +31 -0
- package/dist/entities/package-version/package-version.types.d.ts.map +1 -0
- package/dist/entities/package-version/package-version.types.js +2 -0
- package/dist/entities/package-version/package-version.types.js.map +1 -0
- package/dist/entities/tag/index.d.ts +3 -0
- package/dist/entities/tag/index.d.ts.map +1 -0
- package/dist/entities/tag/index.js +3 -0
- package/dist/entities/tag/index.js.map +1 -0
- package/dist/entities/tag/tag.d.ts +24 -0
- package/dist/entities/tag/tag.d.ts.map +1 -0
- package/dist/entities/tag/tag.js +168 -0
- package/dist/entities/tag/tag.js.map +1 -0
- package/dist/entities/tag/tag.test.d.ts +2 -0
- package/dist/entities/tag/tag.test.d.ts.map +1 -0
- package/dist/entities/tag/tag.test.js +638 -0
- package/dist/entities/tag/tag.test.js.map +1 -0
- package/dist/entities/tag/tag.types.d.ts +35 -0
- package/dist/entities/tag/tag.types.d.ts.map +1 -0
- package/dist/entities/tag/tag.types.js +2 -0
- package/dist/entities/tag/tag.types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/package.json +73 -0
- package/src/commands/ci/act.ts +95 -0
- package/src/commands/ci/attach-affected.ts +93 -0
- package/src/commands/ci/attach-service-ports.ts +31 -0
- package/src/commands/commit-check.ts +124 -0
- package/src/commands/commit.ts +103 -0
- package/src/commands/dev/check.ts +117 -0
- package/src/commands/dev/cleanup.ts +34 -0
- package/src/commands/dev/rm.ts +66 -0
- package/src/commands/dev/setup.ts +48 -0
- package/src/commands/local/cleanup.ts +74 -0
- package/src/commands/local/setup.ts +68 -0
- package/src/commands/local/vscode.ts +118 -0
- package/src/commands/update-package-json.ts +104 -0
- package/src/commands/version/apply.ts +156 -0
- package/src/commands/version/ci.ts +85 -0
- package/src/commands/version/prepare.ts +217 -0
- package/src/core/colorify.ts +61 -0
- package/src/core/index.ts +3 -0
- package/src/core/types.ts +262 -0
- package/src/core/wrapshell.ts +388 -0
- package/src/entities/affected/affected.test.ts +427 -0
- package/src/entities/affected/affected.ts +22 -0
- package/src/entities/affected/index.ts +1 -0
- package/src/entities/branch/branch.test.ts +348 -0
- package/src/entities/branch/branch.ts +89 -0
- package/src/entities/branch/branch.types.ts +5 -0
- package/src/entities/branch/index.ts +2 -0
- package/src/entities/commit/commit.test.ts +769 -0
- package/src/entities/commit/commit.ts +245 -0
- package/src/entities/commit/commit.types.ts +81 -0
- package/src/entities/commit/index.ts +2 -0
- package/src/entities/commit/pr.test.ts +860 -0
- package/src/entities/commit/pr.ts +241 -0
- package/src/entities/compose/compose.test.ts +496 -0
- package/src/entities/compose/compose.ts +251 -0
- package/src/entities/compose/compose.types.ts +88 -0
- package/src/entities/compose/index.ts +2 -0
- package/src/entities/entities.shell.test.ts +35 -0
- package/src/entities/entities.shell.ts +81 -0
- package/src/entities/index.ts +11 -0
- package/src/entities/intershell-config/intershell-config.default.ts +229 -0
- package/src/entities/intershell-config/intershell-config.test.ts +117 -0
- package/src/entities/intershell-config/intershell-config.ts +143 -0
- package/src/entities/intershell-config/intershell-config.types.ts +118 -0
- package/src/entities/package/index.ts +3 -0
- package/src/entities/package/package.shell.ts +124 -0
- package/src/entities/package/package.test.ts +830 -0
- package/src/entities/package/package.ts +267 -0
- package/src/entities/package/package.types.ts +49 -0
- package/src/entities/package-changelog/index.ts +3 -0
- package/src/entities/package-changelog/package-changelog.ts +81 -0
- package/src/entities/package-changelog/package-changelog.types.ts +30 -0
- package/src/entities/package-changelog/template.default.ts +109 -0
- package/src/entities/package-changelog/template.ts +118 -0
- package/src/entities/package-commits/dependency-analyzer.test.ts +29 -0
- package/src/entities/package-commits/dependency-analyzer.ts +194 -0
- package/src/entities/package-commits/index.ts +2 -0
- package/src/entities/package-commits/package-commits.test.ts +44 -0
- package/src/entities/package-commits/package-commits.ts +191 -0
- package/src/entities/package-tags/index.ts +1 -0
- package/src/entities/package-tags/package-tags.test.ts +73 -0
- package/src/entities/package-tags/package-tags.ts +234 -0
- package/src/entities/package-version/index.ts +2 -0
- package/src/entities/package-version/package-version.test.ts +141 -0
- package/src/entities/package-version/package-version.ts +234 -0
- package/src/entities/package-version/package-version.types.ts +35 -0
- package/src/entities/tag/index.ts +2 -0
- package/src/entities/tag/tag.test.ts +844 -0
- package/src/entities/tag/tag.ts +208 -0
- package/src/entities/tag/tag.types.ts +37 -0
- package/src/index.ts +7 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test";
|
|
2
|
+
|
|
3
|
+
type CustomBunType = {
|
|
4
|
+
YAML: {
|
|
5
|
+
parse: (input: string) => Record<string, unknown>;
|
|
6
|
+
};
|
|
7
|
+
file: (path: string) => { text: () => string };
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
describe("EntityCompose", () => {
|
|
11
|
+
// Store original Bun methods for restoration
|
|
12
|
+
let originalBunYaml: CustomBunType["YAML"];
|
|
13
|
+
let originalBunFile: CustomBunType["file"];
|
|
14
|
+
|
|
15
|
+
// Default YAML template that we can modify per test case
|
|
16
|
+
const defaultYaml = {
|
|
17
|
+
version: "3.8",
|
|
18
|
+
services: {
|
|
19
|
+
"test-service": {
|
|
20
|
+
image: "app:latest",
|
|
21
|
+
ports: ["3000:3000"],
|
|
22
|
+
environment: ["NODE_ENV=production", "PORT=3000"],
|
|
23
|
+
volumes: ["/app/data:/data"],
|
|
24
|
+
depends_on: ["db"],
|
|
25
|
+
},
|
|
26
|
+
db: {
|
|
27
|
+
image: "postgres:13",
|
|
28
|
+
ports: ["5432:5432"],
|
|
29
|
+
environment: ["POSTGRES_DB=myapp"],
|
|
30
|
+
},
|
|
31
|
+
} as Record<
|
|
32
|
+
string,
|
|
33
|
+
{
|
|
34
|
+
image?: string;
|
|
35
|
+
build?: string;
|
|
36
|
+
ports?: string[];
|
|
37
|
+
environment?: string[];
|
|
38
|
+
volumes?: string[];
|
|
39
|
+
depends_on?: string[];
|
|
40
|
+
}
|
|
41
|
+
>,
|
|
42
|
+
networks: { default: {} } as Record<string, unknown>,
|
|
43
|
+
volumes: { data: {} } as Record<string, unknown>,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// Helper function to create modified YAML for specific test cases
|
|
47
|
+
const createTestYaml = (modifications: Partial<typeof defaultYaml>) => {
|
|
48
|
+
return { ...defaultYaml, ...modifications };
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// Set up mocks before each test
|
|
52
|
+
beforeEach(async () => {
|
|
53
|
+
// Store original Bun methods
|
|
54
|
+
originalBunYaml = (Bun as unknown as CustomBunType).YAML;
|
|
55
|
+
originalBunFile = (Bun as unknown as CustomBunType).file;
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Restore mocks after each test
|
|
59
|
+
afterEach(() => {
|
|
60
|
+
// Restore original Bun methods
|
|
61
|
+
(Bun as unknown as CustomBunType).YAML = originalBunYaml;
|
|
62
|
+
(Bun as unknown as CustomBunType).file = originalBunFile;
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// Store original methods to restore after tests
|
|
66
|
+
let originalEntityPackageGetAllPackages: () => Promise<string[]>;
|
|
67
|
+
let originalEntityAffectedGetAffectedPackages: (
|
|
68
|
+
baseSha?: string,
|
|
69
|
+
to?: string,
|
|
70
|
+
) => Promise<string[]>;
|
|
71
|
+
|
|
72
|
+
// Common mock setup for dependencies - now with proper cleanup
|
|
73
|
+
const setupMocks = async () => {
|
|
74
|
+
// Import modules
|
|
75
|
+
const { EntityPackage } = await import("../package");
|
|
76
|
+
const { EntityAffected } = await import("../affected");
|
|
77
|
+
|
|
78
|
+
// Store original methods if not already stored
|
|
79
|
+
if (!originalEntityPackageGetAllPackages) {
|
|
80
|
+
originalEntityPackageGetAllPackages = EntityPackage.getAllPackages;
|
|
81
|
+
}
|
|
82
|
+
if (!originalEntityAffectedGetAffectedPackages) {
|
|
83
|
+
originalEntityAffectedGetAffectedPackages = EntityAffected.getAffectedPackages;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Mock EntityPackage.getAllPackages to avoid package.json errors
|
|
87
|
+
EntityPackage.getAllPackages = () => Promise.resolve(["root", "test-package"]);
|
|
88
|
+
|
|
89
|
+
// Mock EntityAffected.getAffectedPackages
|
|
90
|
+
EntityAffected.getAffectedPackages = () => Promise.resolve(["test-service", "db"]);
|
|
91
|
+
|
|
92
|
+
return { EntityPackage, EntityAffected };
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Cleanup function to restore original methods
|
|
96
|
+
const cleanupMocks = async () => {
|
|
97
|
+
if (originalEntityPackageGetAllPackages) {
|
|
98
|
+
const { EntityPackage } = await import("../package");
|
|
99
|
+
EntityPackage.getAllPackages = originalEntityPackageGetAllPackages;
|
|
100
|
+
}
|
|
101
|
+
if (originalEntityAffectedGetAffectedPackages) {
|
|
102
|
+
const { EntityAffected } = await import("../affected");
|
|
103
|
+
EntityAffected.getAffectedPackages = originalEntityAffectedGetAffectedPackages;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// Common mock setup for Bun
|
|
108
|
+
const setupBunMocks = (
|
|
109
|
+
mockYamlParse: ReturnType<typeof mock>,
|
|
110
|
+
mockFileText: ReturnType<typeof mock>,
|
|
111
|
+
) => {
|
|
112
|
+
(Bun as unknown as CustomBunType).YAML = { parse: mockYamlParse };
|
|
113
|
+
(Bun as unknown as CustomBunType).file = mock(() => ({ text: mockFileText }));
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
it("should handle core functionality - parsing, validation, and basic operations", async () => {
|
|
117
|
+
await setupMocks();
|
|
118
|
+
|
|
119
|
+
// Create test YAML with an invalid service for validation testing
|
|
120
|
+
const testYaml = createTestYaml({
|
|
121
|
+
version: "3.9",
|
|
122
|
+
services: {
|
|
123
|
+
...defaultYaml.services,
|
|
124
|
+
"invalid-service": {
|
|
125
|
+
// Missing image and build - should fail validation
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
const mockYamlParse = mock(() => testYaml);
|
|
131
|
+
|
|
132
|
+
const mockFileText = mock(() => Promise.resolve("mock yaml content"));
|
|
133
|
+
setupBunMocks(mockYamlParse, mockFileText);
|
|
134
|
+
|
|
135
|
+
const { EntityCompose } = await import("./compose");
|
|
136
|
+
|
|
137
|
+
// Test instance creation and validation
|
|
138
|
+
const entityCompose = new EntityCompose("docker-compose.yml");
|
|
139
|
+
|
|
140
|
+
const validation = await entityCompose.validate();
|
|
141
|
+
expect(validation.isValid).toBe(false);
|
|
142
|
+
expect(validation.errors).toHaveLength(1);
|
|
143
|
+
expect(validation.errors[0].code).toBe("NO_IMAGE_OR_BUILD");
|
|
144
|
+
expect(validation.errors[0].service).toBe("invalid-service");
|
|
145
|
+
|
|
146
|
+
// Test getCompose and caching behavior
|
|
147
|
+
const compose1 = await entityCompose.getCompose();
|
|
148
|
+
const compose2 = await entityCompose.getCompose();
|
|
149
|
+
expect(compose1).toBe(compose2); // Should return cached version
|
|
150
|
+
expect(compose1.version).toBe("3.9");
|
|
151
|
+
expect(Object.keys(compose1.services)).toHaveLength(3);
|
|
152
|
+
|
|
153
|
+
// Test getServices with comprehensive data
|
|
154
|
+
const services = await entityCompose.getServices();
|
|
155
|
+
expect(services).toHaveLength(3);
|
|
156
|
+
|
|
157
|
+
const testService = services.find((s) => s.name === "test-service");
|
|
158
|
+
expect(testService?.image).toBe("app:latest");
|
|
159
|
+
expect(testService?.ports).toHaveLength(1);
|
|
160
|
+
expect(testService?.ports[0].host).toBe(3000);
|
|
161
|
+
expect(testService?.dependencies).toEqual(["db"]);
|
|
162
|
+
expect(testService?.volumes).toEqual(["/app/data:/data"]);
|
|
163
|
+
|
|
164
|
+
const dbService = services.find((s) => s.name === "db");
|
|
165
|
+
expect(dbService?.image).toBe("postgres:13");
|
|
166
|
+
expect(dbService?.ports[0].host).toBe(5432);
|
|
167
|
+
|
|
168
|
+
// Cleanup mocks
|
|
169
|
+
await cleanupMocks();
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it("should handle service operations - health, dependencies, URLs, and caching", async () => {
|
|
173
|
+
await setupMocks();
|
|
174
|
+
|
|
175
|
+
// Use default YAML for this test - it already has the dependencies we need
|
|
176
|
+
const mockYamlParse = mock(() => defaultYaml);
|
|
177
|
+
|
|
178
|
+
const mockFileText = mock(() => Promise.resolve("mock yaml content"));
|
|
179
|
+
setupBunMocks(mockYamlParse, mockFileText);
|
|
180
|
+
|
|
181
|
+
const { EntityCompose } = await import("./compose");
|
|
182
|
+
const entityCompose = new EntityCompose("docker-compose.yml");
|
|
183
|
+
|
|
184
|
+
// Test getServiceHealth (lines 79-81)
|
|
185
|
+
const health = await entityCompose.getServiceHealth();
|
|
186
|
+
expect(health).toHaveLength(2);
|
|
187
|
+
expect(health[0]).toEqual({
|
|
188
|
+
name: "test-service",
|
|
189
|
+
status: "healthy",
|
|
190
|
+
checks: 10,
|
|
191
|
+
failures: 0,
|
|
192
|
+
lastCheck: expect.any(Date),
|
|
193
|
+
});
|
|
194
|
+
expect(health[1]).toEqual({
|
|
195
|
+
name: "db",
|
|
196
|
+
status: "healthy",
|
|
197
|
+
checks: 10,
|
|
198
|
+
failures: 0,
|
|
199
|
+
lastCheck: expect.any(Date),
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// Test getServiceDependencies
|
|
203
|
+
const dependencies = await entityCompose.getServiceDependencies();
|
|
204
|
+
expect(dependencies.services).toHaveLength(2);
|
|
205
|
+
expect(dependencies.dependencies).toEqual({
|
|
206
|
+
"test-service": ["db"],
|
|
207
|
+
db: [],
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// Test getServiceUrls (lines 93-95)
|
|
211
|
+
const urls = await entityCompose.getServiceUrls();
|
|
212
|
+
expect(urls).toEqual({
|
|
213
|
+
"3000": "http://localhost:3000",
|
|
214
|
+
"5432": "http://localhost:5432",
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
// Test getPortMappings
|
|
218
|
+
const portMappings = await entityCompose.getPortMappings();
|
|
219
|
+
expect(portMappings).toHaveLength(2);
|
|
220
|
+
expect(portMappings[0]).toEqual({
|
|
221
|
+
host: 3000,
|
|
222
|
+
container: 3000,
|
|
223
|
+
protocol: "tcp",
|
|
224
|
+
});
|
|
225
|
+
expect(portMappings[1]).toEqual({
|
|
226
|
+
host: 5432,
|
|
227
|
+
container: 5432,
|
|
228
|
+
protocol: "tcp",
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// Cleanup mocks
|
|
232
|
+
await cleanupMocks();
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it("should handle static parsing methods with comprehensive edge cases", async () => {
|
|
236
|
+
await setupMocks();
|
|
237
|
+
const { EntityCompose } = await import("./compose");
|
|
238
|
+
|
|
239
|
+
// Test parsePortMappings with various scenarios
|
|
240
|
+
const portTestCases = [
|
|
241
|
+
"3000:3000", // Normal
|
|
242
|
+
"8080", // Host only
|
|
243
|
+
":80", // Container only
|
|
244
|
+
"0:3000", // Zero host port
|
|
245
|
+
"3000:0", // Zero container port
|
|
246
|
+
"65535:3000", // Max port number
|
|
247
|
+
"abc:3000", // Non-numeric host
|
|
248
|
+
"3000:def", // Non-numeric container
|
|
249
|
+
"", // Empty string
|
|
250
|
+
];
|
|
251
|
+
|
|
252
|
+
const result = EntityCompose.parsePortMappings(portTestCases);
|
|
253
|
+
expect(result).toHaveLength(9);
|
|
254
|
+
|
|
255
|
+
// Normal case
|
|
256
|
+
expect(result[0]).toEqual({ host: 3000, container: 3000, protocol: "tcp" });
|
|
257
|
+
|
|
258
|
+
// Host only
|
|
259
|
+
expect(result[1]).toEqual({ host: 8080, container: 8080, protocol: "tcp" });
|
|
260
|
+
|
|
261
|
+
// Container only - empty string becomes 0, then 0 ?? 80 = 0 (0 is not null/undefined)
|
|
262
|
+
expect(result[2]).toEqual({ host: 0, container: 80, protocol: "tcp" });
|
|
263
|
+
|
|
264
|
+
// Zero ports (should preserve 0, not treat as falsy)
|
|
265
|
+
expect(result[3]).toEqual({ host: 0, container: 3000, protocol: "tcp" });
|
|
266
|
+
expect(result[4]).toEqual({ host: 3000, container: 0, protocol: "tcp" });
|
|
267
|
+
|
|
268
|
+
// Max port
|
|
269
|
+
expect(result[5]).toEqual({ host: 65535, container: 3000, protocol: "tcp" });
|
|
270
|
+
|
|
271
|
+
// Non-numeric (should result in NaN)
|
|
272
|
+
expect(result[6].host).toBeNaN();
|
|
273
|
+
expect(result[7].container).toBeNaN();
|
|
274
|
+
|
|
275
|
+
// Empty string - Number("") returns 0 for both host and container
|
|
276
|
+
expect(result[8].host).toBe(0);
|
|
277
|
+
expect(result[8].container).toBe(0);
|
|
278
|
+
expect(result[8].protocol).toBe("tcp");
|
|
279
|
+
|
|
280
|
+
// Test parseEnvironment with various scenarios
|
|
281
|
+
const envTestCases = [
|
|
282
|
+
"NODE_ENV=production",
|
|
283
|
+
"PORT=3000",
|
|
284
|
+
"KEY1=value=with=equals",
|
|
285
|
+
"KEY2=", // Empty value
|
|
286
|
+
"KEY3", // No equals
|
|
287
|
+
"=VALUE", // No key
|
|
288
|
+
"", // Empty string
|
|
289
|
+
"KEY4=0", // Zero value
|
|
290
|
+
"KEY5=false", // Falsy value
|
|
291
|
+
];
|
|
292
|
+
|
|
293
|
+
const envResult = EntityCompose.parseEnvironment(envTestCases);
|
|
294
|
+
expect(envResult).toEqual({
|
|
295
|
+
NODE_ENV: "production",
|
|
296
|
+
PORT: "3000",
|
|
297
|
+
KEY1: "value=with=equals",
|
|
298
|
+
KEY2: "", // Empty values are included
|
|
299
|
+
KEY4: "0",
|
|
300
|
+
KEY5: "false",
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
// Test parseDockerCompose with comprehensive YAML
|
|
304
|
+
// Note: The static parseDockerCompose method uses Bun.YAML.parse directly
|
|
305
|
+
// So we need to mock it before calling the static method
|
|
306
|
+
const mockYamlParse = mock((input: string) => {
|
|
307
|
+
if (input.includes('version: "3.9"')) {
|
|
308
|
+
return createTestYaml({
|
|
309
|
+
version: "3.9",
|
|
310
|
+
services: {
|
|
311
|
+
app: {
|
|
312
|
+
image: "node:18",
|
|
313
|
+
ports: ["3000:3000", "8080:80"],
|
|
314
|
+
environment: [
|
|
315
|
+
"NODE_ENV=production",
|
|
316
|
+
"DATABASE_URL=postgresql://user:pass@db:5432/db",
|
|
317
|
+
],
|
|
318
|
+
volumes: ["/app/data:/data", "/app/logs:/logs"],
|
|
319
|
+
depends_on: ["db", "redis"],
|
|
320
|
+
},
|
|
321
|
+
db: {
|
|
322
|
+
image: "postgres:13",
|
|
323
|
+
ports: ["5432:5432"],
|
|
324
|
+
environment: ["POSTGRES_DB=myapp", "POSTGRES_PASSWORD=secret"],
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
return defaultYaml;
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
// Set up Bun mock for static method testing
|
|
333
|
+
(Bun as unknown as CustomBunType).YAML = { parse: mockYamlParse };
|
|
334
|
+
|
|
335
|
+
const yamlInput = `
|
|
336
|
+
version: "3.9"
|
|
337
|
+
services:
|
|
338
|
+
app:
|
|
339
|
+
image: node:18
|
|
340
|
+
ports:
|
|
341
|
+
- "3000:3000"
|
|
342
|
+
- "8080:80"
|
|
343
|
+
environment:
|
|
344
|
+
- NODE_ENV=production
|
|
345
|
+
- DATABASE_URL=postgresql://user:pass@db:5432/db
|
|
346
|
+
volumes:
|
|
347
|
+
- /app/data:/data
|
|
348
|
+
- /app/logs:/logs
|
|
349
|
+
depends_on:
|
|
350
|
+
- db
|
|
351
|
+
- redis
|
|
352
|
+
db:
|
|
353
|
+
image: postgres:13
|
|
354
|
+
ports:
|
|
355
|
+
- "5432:5432"
|
|
356
|
+
environment:
|
|
357
|
+
- POSTGRES_DB=myapp
|
|
358
|
+
- POSTGRES_PASSWORD=secret
|
|
359
|
+
networks:
|
|
360
|
+
default:
|
|
361
|
+
volumes:
|
|
362
|
+
data:
|
|
363
|
+
logs:
|
|
364
|
+
`;
|
|
365
|
+
|
|
366
|
+
const composeData = EntityCompose.parseDockerCompose(yamlInput);
|
|
367
|
+
expect(composeData.version).toBe("3.9");
|
|
368
|
+
expect(composeData.services.app).toBeDefined();
|
|
369
|
+
expect(composeData.services.app.image).toBe("node:18");
|
|
370
|
+
expect(composeData.services.app.ports).toEqual(["3000:3000", "8080:80"]);
|
|
371
|
+
expect(composeData.services.app.depends_on).toEqual(["db", "redis"]);
|
|
372
|
+
expect(composeData.services.db.image).toBe("postgres:13");
|
|
373
|
+
|
|
374
|
+
// Cleanup mocks
|
|
375
|
+
await cleanupMocks();
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
it("should handle complex scenarios and error cases comprehensively", async () => {
|
|
379
|
+
await setupMocks();
|
|
380
|
+
|
|
381
|
+
// Create complex test YAML with multiple services and invalid ones for validation
|
|
382
|
+
const complexYaml = createTestYaml({
|
|
383
|
+
services: {
|
|
384
|
+
"web-app": {
|
|
385
|
+
image: "nginx:alpine",
|
|
386
|
+
ports: ["80:80", "443:443"],
|
|
387
|
+
environment: ["NGINX_HOST=localhost"],
|
|
388
|
+
volumes: ["/var/log/nginx:/var/log/nginx"],
|
|
389
|
+
depends_on: ["api", "db"],
|
|
390
|
+
},
|
|
391
|
+
api: {
|
|
392
|
+
build: ".",
|
|
393
|
+
ports: ["3000:3000"],
|
|
394
|
+
environment: ["NODE_ENV=production", "DB_HOST=db"],
|
|
395
|
+
depends_on: ["db"],
|
|
396
|
+
},
|
|
397
|
+
db: {
|
|
398
|
+
image: "postgres:13",
|
|
399
|
+
ports: ["5432:5432"],
|
|
400
|
+
environment: ["POSTGRES_DB=myapp"],
|
|
401
|
+
volumes: ["postgres_data:/var/lib/postgresql/data"],
|
|
402
|
+
},
|
|
403
|
+
redis: {
|
|
404
|
+
image: "redis:alpine",
|
|
405
|
+
ports: ["6379:6379"],
|
|
406
|
+
},
|
|
407
|
+
"invalid-service": {
|
|
408
|
+
// Missing image and build - should fail validation
|
|
409
|
+
},
|
|
410
|
+
"another-invalid": {
|
|
411
|
+
// Also missing image and build
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
networks: { default: { driver: "bridge" } },
|
|
415
|
+
volumes: { postgres_data: { driver: "local" } },
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
const mockYamlParse = mock(() => complexYaml);
|
|
419
|
+
|
|
420
|
+
const mockFileText = mock(() => Promise.resolve("mock yaml content"));
|
|
421
|
+
setupBunMocks(mockYamlParse, mockFileText);
|
|
422
|
+
|
|
423
|
+
const { EntityCompose } = await import("./compose");
|
|
424
|
+
const entityCompose = new EntityCompose("docker-compose.yml");
|
|
425
|
+
|
|
426
|
+
// Test validation with multiple invalid services
|
|
427
|
+
const validation = await entityCompose.validate();
|
|
428
|
+
expect(validation.isValid).toBe(false);
|
|
429
|
+
expect(validation.errors).toHaveLength(2);
|
|
430
|
+
expect(validation.errors.map((e: { code: string }) => e.code)).toEqual([
|
|
431
|
+
"NO_IMAGE_OR_BUILD",
|
|
432
|
+
"NO_IMAGE_OR_BUILD",
|
|
433
|
+
]);
|
|
434
|
+
|
|
435
|
+
// Test comprehensive service operations
|
|
436
|
+
const services = await entityCompose.getServices();
|
|
437
|
+
expect(services).toHaveLength(6);
|
|
438
|
+
|
|
439
|
+
// Test web-app service
|
|
440
|
+
const webApp = services.find((s) => s.name === "web-app");
|
|
441
|
+
expect(webApp?.image).toBe("nginx:alpine");
|
|
442
|
+
expect(webApp?.ports).toHaveLength(2);
|
|
443
|
+
expect(webApp?.dependencies).toEqual(["api", "db"]);
|
|
444
|
+
|
|
445
|
+
// Test API service
|
|
446
|
+
const api = services.find((s) => s.name === "api");
|
|
447
|
+
expect(api?.image).toBeUndefined(); // API service uses build, not image
|
|
448
|
+
expect(api?.ports[0].host).toBe(3000);
|
|
449
|
+
expect(api?.dependencies).toEqual(["db"]);
|
|
450
|
+
|
|
451
|
+
// Test database service
|
|
452
|
+
const db = services.find((s) => s.name === "db");
|
|
453
|
+
expect(db?.image).toBe("postgres:13");
|
|
454
|
+
expect(db?.ports[0].host).toBe(5432);
|
|
455
|
+
|
|
456
|
+
// Test Redis service
|
|
457
|
+
const redis = services.find((s) => s.name === "redis");
|
|
458
|
+
expect(redis?.image).toBe("redis:alpine");
|
|
459
|
+
expect(redis?.ports[0].host).toBe(6379);
|
|
460
|
+
|
|
461
|
+
// Test port mappings across all services
|
|
462
|
+
const allPortMappings = await entityCompose.getPortMappings();
|
|
463
|
+
expect(allPortMappings).toHaveLength(5); // 5 services with ports: web-app(2), api(1), db(1), redis(1)
|
|
464
|
+
|
|
465
|
+
const portNumbers = allPortMappings.map((p) => p.host).filter((p) => typeof p === "number");
|
|
466
|
+
expect(portNumbers).toEqual([80, 443, 3000, 5432, 6379]);
|
|
467
|
+
|
|
468
|
+
// Test service dependencies graph
|
|
469
|
+
const dependencies = await entityCompose.getServiceDependencies();
|
|
470
|
+
expect(dependencies.services).toHaveLength(6);
|
|
471
|
+
expect(dependencies.dependencies["web-app"]).toEqual(["api", "db"]);
|
|
472
|
+
expect(dependencies.dependencies.api).toEqual(["db"]);
|
|
473
|
+
expect(dependencies.dependencies.db).toEqual([]);
|
|
474
|
+
expect(dependencies.dependencies.redis).toEqual([]);
|
|
475
|
+
|
|
476
|
+
// Test service URLs
|
|
477
|
+
const urls = await entityCompose.getServiceUrls();
|
|
478
|
+
expect(urls).toEqual({
|
|
479
|
+
"80": "http://localhost:80",
|
|
480
|
+
"443": "http://localhost:443",
|
|
481
|
+
"3000": "http://localhost:3000",
|
|
482
|
+
"5432": "http://localhost:5432",
|
|
483
|
+
"6379": "http://localhost:6379",
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
// Test health status
|
|
487
|
+
const health = await entityCompose.getServiceHealth();
|
|
488
|
+
expect(health).toHaveLength(6);
|
|
489
|
+
expect(health.every((h) => h.status === "healthy")).toBe(true);
|
|
490
|
+
expect(health.every((h) => h.checks === 10)).toBe(true);
|
|
491
|
+
expect(health.every((h) => h.failures === 0)).toBe(true);
|
|
492
|
+
|
|
493
|
+
// Cleanup mocks
|
|
494
|
+
await cleanupMocks();
|
|
495
|
+
});
|
|
496
|
+
});
|