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,637 @@
|
|
|
1
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: Mock types require any for flexibility */
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test";
|
|
3
|
+
import { EntityPackage } from "./package";
|
|
4
|
+
export function mockEntityPackage(EntityPackage) {
|
|
5
|
+
// Return the mock object directly instead of using mock.module
|
|
6
|
+
return EntityPackage;
|
|
7
|
+
}
|
|
8
|
+
describe("EntityPackage", () => {
|
|
9
|
+
let packages;
|
|
10
|
+
const mockPackageName = "test-package";
|
|
11
|
+
const mockPackageJson = (overrides = {}) => ({
|
|
12
|
+
name: "test-package",
|
|
13
|
+
version: "1.0.0",
|
|
14
|
+
description: "Test package",
|
|
15
|
+
...overrides,
|
|
16
|
+
});
|
|
17
|
+
let mockPackagesShell;
|
|
18
|
+
let mockEntitiesShell;
|
|
19
|
+
// Store original methods to restore after tests
|
|
20
|
+
let originalPackagesShellReadJsonFile;
|
|
21
|
+
let originalPackagesShellWriteJsonFile;
|
|
22
|
+
let originalPackagesShellReadChangelogFile;
|
|
23
|
+
let originalPackagesShellWriteChangelogFile;
|
|
24
|
+
let originalPackagesShellFileExists;
|
|
25
|
+
let originalPackagesShellReadDirectory;
|
|
26
|
+
let originalPackagesShellCanAccessFile;
|
|
27
|
+
let originalPackagesShellReadFileAsText;
|
|
28
|
+
let originalPackagesShellGetWorkspaceRoot;
|
|
29
|
+
let originalEntitiesShellRunBiomeCheck;
|
|
30
|
+
beforeEach(async () => {
|
|
31
|
+
// Import fresh modules to avoid interference
|
|
32
|
+
const { packagesShell } = await import("./package.shell");
|
|
33
|
+
const { entitiesShell } = await import("../entities.shell");
|
|
34
|
+
// Store original methods if not already stored
|
|
35
|
+
if (!originalPackagesShellReadJsonFile) {
|
|
36
|
+
originalPackagesShellReadJsonFile = packagesShell.readJsonFile;
|
|
37
|
+
}
|
|
38
|
+
if (!originalPackagesShellWriteJsonFile) {
|
|
39
|
+
originalPackagesShellWriteJsonFile = packagesShell.writeJsonFile;
|
|
40
|
+
}
|
|
41
|
+
if (!originalPackagesShellReadChangelogFile) {
|
|
42
|
+
originalPackagesShellReadChangelogFile = packagesShell.readChangelogFile;
|
|
43
|
+
}
|
|
44
|
+
if (!originalPackagesShellWriteChangelogFile) {
|
|
45
|
+
originalPackagesShellWriteChangelogFile = packagesShell.writeChangelogFile;
|
|
46
|
+
}
|
|
47
|
+
if (!originalPackagesShellFileExists) {
|
|
48
|
+
originalPackagesShellFileExists = packagesShell.fileExists;
|
|
49
|
+
}
|
|
50
|
+
if (!originalPackagesShellReadDirectory) {
|
|
51
|
+
originalPackagesShellReadDirectory = packagesShell.readDirectory;
|
|
52
|
+
}
|
|
53
|
+
if (!originalPackagesShellCanAccessFile) {
|
|
54
|
+
originalPackagesShellCanAccessFile = packagesShell.canAccessFile;
|
|
55
|
+
}
|
|
56
|
+
if (!originalPackagesShellReadFileAsText) {
|
|
57
|
+
originalPackagesShellReadFileAsText = packagesShell.readFileAsText;
|
|
58
|
+
}
|
|
59
|
+
if (!originalPackagesShellGetWorkspaceRoot) {
|
|
60
|
+
originalPackagesShellGetWorkspaceRoot = packagesShell.getWorkspaceRoot;
|
|
61
|
+
}
|
|
62
|
+
if (!originalEntitiesShellRunBiomeCheck) {
|
|
63
|
+
originalEntitiesShellRunBiomeCheck = entitiesShell.runBiomeCheck;
|
|
64
|
+
}
|
|
65
|
+
// Clear any existing mock state
|
|
66
|
+
mock.clearAllMocks();
|
|
67
|
+
// Mock packagesShell
|
|
68
|
+
mockPackagesShell = {
|
|
69
|
+
readJsonFile: mock((path) => {
|
|
70
|
+
if (path.includes("package.json")) {
|
|
71
|
+
return mockPackageJson();
|
|
72
|
+
}
|
|
73
|
+
throw new Error(`File not found: ${path}`);
|
|
74
|
+
}),
|
|
75
|
+
writeJsonFile: mock(() => Promise.resolve()),
|
|
76
|
+
readChangelogFile: mock((path) => {
|
|
77
|
+
if (path.includes("CHANGELOG.md")) {
|
|
78
|
+
return "# Test Changelog\n\n## 1.0.0\n- Initial release";
|
|
79
|
+
}
|
|
80
|
+
return "";
|
|
81
|
+
}),
|
|
82
|
+
writeChangelogFile: mock(() => Promise.resolve()),
|
|
83
|
+
runBiomeCheck: mock(() => Promise.resolve()),
|
|
84
|
+
fileExists: mock(() => Promise.resolve(true)),
|
|
85
|
+
readDirectory: mock(() => Promise.resolve([])),
|
|
86
|
+
canAccessFile: mock(() => Promise.resolve(true)),
|
|
87
|
+
readFileAsText: mock((path) => {
|
|
88
|
+
if (path.includes("package.json")) {
|
|
89
|
+
return Promise.resolve(JSON.stringify(mockPackageJson()));
|
|
90
|
+
}
|
|
91
|
+
return Promise.resolve("");
|
|
92
|
+
}),
|
|
93
|
+
getWorkspaceRoot: mock(() => Promise.resolve("/workspace")),
|
|
94
|
+
};
|
|
95
|
+
// Mock the packagesShell methods directly
|
|
96
|
+
packagesShell.readJsonFile = mockPackagesShell.readJsonFile;
|
|
97
|
+
packagesShell.writeJsonFile = mockPackagesShell.writeJsonFile;
|
|
98
|
+
packagesShell.readChangelogFile = mockPackagesShell.readChangelogFile;
|
|
99
|
+
packagesShell.writeChangelogFile = mockPackagesShell.writeChangelogFile;
|
|
100
|
+
packagesShell.fileExists = mockPackagesShell.fileExists;
|
|
101
|
+
packagesShell.readDirectory = mockPackagesShell.readDirectory;
|
|
102
|
+
packagesShell.canAccessFile = mockPackagesShell.canAccessFile;
|
|
103
|
+
packagesShell.readFileAsText = mockPackagesShell.readFileAsText;
|
|
104
|
+
packagesShell.getWorkspaceRoot = mockPackagesShell.getWorkspaceRoot;
|
|
105
|
+
// Mock the entitiesShell methods directly
|
|
106
|
+
mockEntitiesShell = {
|
|
107
|
+
runBiomeCheck: mock(() => Promise.resolve()),
|
|
108
|
+
};
|
|
109
|
+
entitiesShell.runBiomeCheck = mockEntitiesShell.runBiomeCheck;
|
|
110
|
+
// Store for cleanup
|
|
111
|
+
// Original methods are now stored globally above
|
|
112
|
+
// Original methods are now stored globally above
|
|
113
|
+
// Create instance after mocking
|
|
114
|
+
packages = new EntityPackage(mockPackageName);
|
|
115
|
+
});
|
|
116
|
+
afterEach(async () => {
|
|
117
|
+
// Restore original methods
|
|
118
|
+
const { packagesShell } = await import("./package.shell");
|
|
119
|
+
const { entitiesShell } = await import("../entities.shell");
|
|
120
|
+
if (originalPackagesShellReadJsonFile) {
|
|
121
|
+
packagesShell.readJsonFile = originalPackagesShellReadJsonFile;
|
|
122
|
+
}
|
|
123
|
+
if (originalPackagesShellWriteJsonFile) {
|
|
124
|
+
packagesShell.writeJsonFile = originalPackagesShellWriteJsonFile;
|
|
125
|
+
}
|
|
126
|
+
if (originalPackagesShellReadChangelogFile) {
|
|
127
|
+
packagesShell.readChangelogFile = originalPackagesShellReadChangelogFile;
|
|
128
|
+
}
|
|
129
|
+
if (originalPackagesShellWriteChangelogFile) {
|
|
130
|
+
packagesShell.writeChangelogFile = originalPackagesShellWriteChangelogFile;
|
|
131
|
+
}
|
|
132
|
+
if (originalPackagesShellFileExists) {
|
|
133
|
+
packagesShell.fileExists = originalPackagesShellFileExists;
|
|
134
|
+
}
|
|
135
|
+
if (originalPackagesShellReadDirectory) {
|
|
136
|
+
packagesShell.readDirectory = originalPackagesShellReadDirectory;
|
|
137
|
+
}
|
|
138
|
+
if (originalPackagesShellCanAccessFile) {
|
|
139
|
+
packagesShell.canAccessFile = originalPackagesShellCanAccessFile;
|
|
140
|
+
}
|
|
141
|
+
if (originalPackagesShellReadFileAsText) {
|
|
142
|
+
packagesShell.readFileAsText = originalPackagesShellReadFileAsText;
|
|
143
|
+
}
|
|
144
|
+
if (originalPackagesShellGetWorkspaceRoot) {
|
|
145
|
+
packagesShell.getWorkspaceRoot = originalPackagesShellGetWorkspaceRoot;
|
|
146
|
+
}
|
|
147
|
+
if (originalEntitiesShellRunBiomeCheck) {
|
|
148
|
+
entitiesShell.runBiomeCheck = originalEntitiesShellRunBiomeCheck;
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
describe("constructor", () => {
|
|
152
|
+
it("should create instance with package name", () => {
|
|
153
|
+
packages = new EntityPackage(mockPackageName);
|
|
154
|
+
expect(packages).toBeInstanceOf(EntityPackage);
|
|
155
|
+
});
|
|
156
|
+
it("should read package.json on construction", () => {
|
|
157
|
+
packages = new EntityPackage(mockPackageName);
|
|
158
|
+
expect(packages).toBeInstanceOf(EntityPackage);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe("getPath", () => {
|
|
162
|
+
beforeEach(() => {
|
|
163
|
+
packages = new EntityPackage(mockPackageName);
|
|
164
|
+
});
|
|
165
|
+
it("should return root path for root package", () => {
|
|
166
|
+
const rootPackages = new EntityPackage("root");
|
|
167
|
+
expect(rootPackages.getPath()).toBe(".");
|
|
168
|
+
});
|
|
169
|
+
it("should return packages path for @repo packages", () => {
|
|
170
|
+
const repoPackages = new EntityPackage("@repo/test-package");
|
|
171
|
+
expect(repoPackages.getPath()).toBe("packages/test-package");
|
|
172
|
+
});
|
|
173
|
+
it("should return apps path for regular packages", () => {
|
|
174
|
+
expect(packages.getPath()).toBe("apps/test-package");
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
describe("getJsonPath", () => {
|
|
178
|
+
beforeEach(() => {
|
|
179
|
+
packages = new EntityPackage(mockPackageName);
|
|
180
|
+
});
|
|
181
|
+
it("should return correct package.json path", () => {
|
|
182
|
+
expect(packages.getJsonPath()).toBe("apps/test-package/package.json");
|
|
183
|
+
});
|
|
184
|
+
it("should return correct path for root package", () => {
|
|
185
|
+
const rootPackages = new EntityPackage("root");
|
|
186
|
+
expect(rootPackages.getJsonPath()).toBe("./package.json");
|
|
187
|
+
});
|
|
188
|
+
it("should return correct path for @repo package", () => {
|
|
189
|
+
const repoPackages = new EntityPackage("@repo/test-package");
|
|
190
|
+
expect(repoPackages.getJsonPath()).toBe("packages/test-package/package.json");
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
describe.skip("readJson", () => {
|
|
194
|
+
beforeEach(() => {
|
|
195
|
+
packages = new EntityPackage(mockPackageName);
|
|
196
|
+
});
|
|
197
|
+
it("should return cached package.json if available", () => {
|
|
198
|
+
const result1 = packages.readJson();
|
|
199
|
+
expect(result1).toEqual(mockPackageJson());
|
|
200
|
+
const result2 = packages.readJson();
|
|
201
|
+
expect(result2).toEqual(mockPackageJson());
|
|
202
|
+
});
|
|
203
|
+
it("should read and parse package.json from file", () => {
|
|
204
|
+
const result = packages.readJson();
|
|
205
|
+
expect(result).toEqual(mockPackageJson());
|
|
206
|
+
});
|
|
207
|
+
it("should throw error when file read fails", async () => {
|
|
208
|
+
// Create a fresh mock for this test
|
|
209
|
+
const { packagesShell } = await import("./package.shell");
|
|
210
|
+
packagesShell.readJsonFile = mock(() => {
|
|
211
|
+
throw new Error("File read failed");
|
|
212
|
+
});
|
|
213
|
+
expect(() => {
|
|
214
|
+
new EntityPackage("error-package");
|
|
215
|
+
}).toThrow("Package not found error-package at apps/error-package/package.json: Error: File read failed");
|
|
216
|
+
});
|
|
217
|
+
it("should throw error when JSON parsing fails", () => {
|
|
218
|
+
// Mock packagesShell to return invalid JSON for this test
|
|
219
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => {
|
|
220
|
+
throw new Error("Invalid JSON");
|
|
221
|
+
});
|
|
222
|
+
expect(() => {
|
|
223
|
+
new EntityPackage("invalid-json-package");
|
|
224
|
+
}).toThrow("Package not found invalid-json-package at apps/invalid-json-package/package.json: Error: Invalid JSON");
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe.skip("writeJson", () => {
|
|
228
|
+
beforeEach(() => {
|
|
229
|
+
packages = new EntityPackage(mockPackageName);
|
|
230
|
+
});
|
|
231
|
+
it("should write package.json and run biome check", async () => {
|
|
232
|
+
// Use the already mocked packagesShell methods from beforeEach
|
|
233
|
+
// No need for additional mock.module since we're already mocking at the method level
|
|
234
|
+
const newData = { ...mockPackageJson(), version: "2.0.0" };
|
|
235
|
+
await packages.writeJson(newData);
|
|
236
|
+
expect(packages.readJson().version).toBe("2.0.0");
|
|
237
|
+
});
|
|
238
|
+
it("should update cached package.json", async () => {
|
|
239
|
+
const newData = { ...mockPackageJson(), version: "3.0.0" };
|
|
240
|
+
await packages.writeJson(newData);
|
|
241
|
+
expect(packages.readJson().version).toBe("3.0.0");
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
describe("readVersion", () => {
|
|
245
|
+
beforeEach(() => {
|
|
246
|
+
packages = new EntityPackage(mockPackageName);
|
|
247
|
+
});
|
|
248
|
+
it("should return version from package.json", () => {
|
|
249
|
+
const version = packages.readVersion();
|
|
250
|
+
expect(version).toBe("1.0.0");
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
describe.skip("writeVersion", () => {
|
|
254
|
+
beforeEach(() => {
|
|
255
|
+
packages = new EntityPackage(mockPackageName);
|
|
256
|
+
});
|
|
257
|
+
it("should update version and write package.json", async () => {
|
|
258
|
+
await packages.writeVersion("2.0.0");
|
|
259
|
+
expect(packages.readVersion()).toBe("2.0.0");
|
|
260
|
+
});
|
|
261
|
+
it("should update cached package.json version", async () => {
|
|
262
|
+
await packages.writeVersion("3.0.0");
|
|
263
|
+
expect(packages.readVersion()).toBe("3.0.0");
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
describe("getChangelogPath", () => {
|
|
267
|
+
beforeEach(() => {
|
|
268
|
+
packages = new EntityPackage(mockPackageName);
|
|
269
|
+
});
|
|
270
|
+
it("should return correct changelog path", () => {
|
|
271
|
+
expect(packages.getChangelogPath()).toBe("apps/test-package/CHANGELOG.md");
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
describe("readChangelog", () => {
|
|
275
|
+
beforeEach(() => {
|
|
276
|
+
packages = new EntityPackage(mockPackageName);
|
|
277
|
+
});
|
|
278
|
+
it("should read changelog content", () => {
|
|
279
|
+
// Update the mock for this specific test
|
|
280
|
+
mockPackagesShell.readChangelogFile.mockImplementationOnce((path) => {
|
|
281
|
+
if (path.includes("CHANGELOG.md")) {
|
|
282
|
+
return "# Test Changelog\n\n## 1.0.0\n- Initial release";
|
|
283
|
+
}
|
|
284
|
+
return "";
|
|
285
|
+
});
|
|
286
|
+
const changelogPackages = new EntityPackage("test-package");
|
|
287
|
+
const result = changelogPackages.readChangelog();
|
|
288
|
+
expect(result).toBe("# Test Changelog\n\n## 1.0.0\n- Initial release");
|
|
289
|
+
});
|
|
290
|
+
it("should return empty string when changelog is empty", () => {
|
|
291
|
+
// Update the mock for this specific test
|
|
292
|
+
mockPackagesShell.readChangelogFile.mockImplementationOnce(() => "");
|
|
293
|
+
const emptyChangelogPackages = new EntityPackage("test-package");
|
|
294
|
+
const result = emptyChangelogPackages.readChangelog();
|
|
295
|
+
expect(result).toBe("");
|
|
296
|
+
});
|
|
297
|
+
it("should not throw error when changelog read fails", () => {
|
|
298
|
+
// The readChangelog method should handle errors gracefully
|
|
299
|
+
expect(() => packages.readChangelog()).not.toThrow();
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
describe("writeChangelog", () => {
|
|
303
|
+
beforeEach(() => {
|
|
304
|
+
packages = new EntityPackage(mockPackageName);
|
|
305
|
+
});
|
|
306
|
+
it("should write changelog when file exists", async () => {
|
|
307
|
+
const content = "# New Changelog\n\n## 2.0.0\n- New features";
|
|
308
|
+
await packages.writeChangelog(content);
|
|
309
|
+
expect(packages).toBeDefined();
|
|
310
|
+
});
|
|
311
|
+
it("should create changelog with createPath when file doesn't exist", async () => {
|
|
312
|
+
const content = "# New Changelog\n\n## 2.0.0\n- New features";
|
|
313
|
+
await packages.writeChangelog(content);
|
|
314
|
+
expect(packages).toBeDefined();
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
describe("validatePackage", () => {
|
|
318
|
+
beforeEach(() => {
|
|
319
|
+
packages = new EntityPackage(mockPackageName);
|
|
320
|
+
});
|
|
321
|
+
it.skip("should return valid result for valid package", () => {
|
|
322
|
+
const result = packages.validatePackage();
|
|
323
|
+
expect(result).toHaveLength(0);
|
|
324
|
+
});
|
|
325
|
+
it.skip("should return error for invalid version format", () => {
|
|
326
|
+
// Mock packagesShell to return invalid version for this test
|
|
327
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ version: "invalid-version" }));
|
|
328
|
+
const invalidPackages = new EntityPackage("invalid-version-package");
|
|
329
|
+
const result = invalidPackages.validatePackage();
|
|
330
|
+
expect(result).toHaveLength(1);
|
|
331
|
+
expect(result[0]).toContain("invalid-version-package: Version should follow semantic versioning");
|
|
332
|
+
});
|
|
333
|
+
it.skip("should return error for missing description", () => {
|
|
334
|
+
const packageJson = mockPackageJson();
|
|
335
|
+
delete packageJson.description;
|
|
336
|
+
// Mock packagesShell to return package without description for this test
|
|
337
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => packageJson);
|
|
338
|
+
const noDescPackages = new EntityPackage("no-description-package");
|
|
339
|
+
const result = noDescPackages.validatePackage();
|
|
340
|
+
expect(result).toHaveLength(1);
|
|
341
|
+
expect(result[0]).toContain("no-description-package: Consider adding a description to package.json");
|
|
342
|
+
});
|
|
343
|
+
it.skip("should return multiple errors for multiple issues", () => {
|
|
344
|
+
const packageJson = mockPackageJson({ version: "invalid" });
|
|
345
|
+
delete packageJson.description;
|
|
346
|
+
// Mock packagesShell to return package with multiple issues for this test
|
|
347
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => packageJson);
|
|
348
|
+
const multiIssuePackages = new EntityPackage("multi-issue-package");
|
|
349
|
+
const result = multiIssuePackages.validatePackage();
|
|
350
|
+
expect(result).toHaveLength(2);
|
|
351
|
+
expect(result).toEqual(expect.arrayContaining([
|
|
352
|
+
expect.stringContaining("Version should follow semantic versioning"),
|
|
353
|
+
expect.stringContaining("Consider adding a description to package.json"),
|
|
354
|
+
]));
|
|
355
|
+
});
|
|
356
|
+
it.skip("should validate semantic versioning correctly", () => {
|
|
357
|
+
const validVersions = ["1.0.0", "2.1.3", "10.20.30"];
|
|
358
|
+
const invalidVersions = ["1.0", "1.0.0.0", "1.0.0-beta", "v1.0.0"];
|
|
359
|
+
validVersions.forEach((version) => {
|
|
360
|
+
// Mock packagesShell to return valid version for this test
|
|
361
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ version }));
|
|
362
|
+
const validPackages = new EntityPackage(`valid-${version}-package`);
|
|
363
|
+
const result = validPackages.validatePackage();
|
|
364
|
+
expect(result).toHaveLength(0);
|
|
365
|
+
});
|
|
366
|
+
invalidVersions.forEach((version) => {
|
|
367
|
+
// Mock packagesShell to return invalid version for this test
|
|
368
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ version }));
|
|
369
|
+
const invalidPackages = new EntityPackage(`invalid-${version}-package`);
|
|
370
|
+
const result = invalidPackages.validatePackage();
|
|
371
|
+
expect(result.length).toBeGreaterThan(0);
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
describe("selective versioning", () => {
|
|
376
|
+
describe("shouldVersion", () => {
|
|
377
|
+
it.skip("should return true for packages with private: false", () => {
|
|
378
|
+
// Mock packagesShell to return package with private: false for this test
|
|
379
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ private: false }));
|
|
380
|
+
const publicPackages = new EntityPackage("public-package");
|
|
381
|
+
expect(publicPackages.shouldVersion()).toBe(true);
|
|
382
|
+
});
|
|
383
|
+
it.skip("should return true for packages with no private field", () => {
|
|
384
|
+
const packageJson = mockPackageJson();
|
|
385
|
+
delete packageJson.private;
|
|
386
|
+
// Mock packagesShell to return package without private field for this test
|
|
387
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => packageJson);
|
|
388
|
+
const defaultPackages = new EntityPackage("default-package");
|
|
389
|
+
expect(defaultPackages.shouldVersion()).toBe(true);
|
|
390
|
+
});
|
|
391
|
+
it.skip("should return false for packages with private: true", () => {
|
|
392
|
+
// Mock packagesShell to return package with private: true for this test
|
|
393
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ private: true }));
|
|
394
|
+
const privatePackages = new EntityPackage("private-package");
|
|
395
|
+
expect(privatePackages.shouldVersion()).toBe(false);
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
describe("getTagSeriesName", () => {
|
|
399
|
+
it.skip("should return 'v' for root package", () => {
|
|
400
|
+
// Mock packagesShell to return root package for this test
|
|
401
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ name: "root", private: false }));
|
|
402
|
+
const rootPackages = new EntityPackage("root");
|
|
403
|
+
expect(rootPackages.getTagSeriesName()).toBe("v");
|
|
404
|
+
});
|
|
405
|
+
it.skip("should return 'package-name-v' for @repo packages", () => {
|
|
406
|
+
// Mock packagesShell to return @repo package for this test
|
|
407
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ name: "@repo/package-name", private: false }));
|
|
408
|
+
const intershellPackages = new EntityPackage("@repo/package-name");
|
|
409
|
+
expect(intershellPackages.getTagSeriesName()).toBe("package-name-v");
|
|
410
|
+
});
|
|
411
|
+
it.skip("should return 'package-name-v' for regular packages", () => {
|
|
412
|
+
// Mock packagesShell to return regular package for this test
|
|
413
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ name: "my-app", private: false }));
|
|
414
|
+
const appPackages = new EntityPackage("my-app");
|
|
415
|
+
expect(appPackages.getTagSeriesName()).toBe("my-app-v");
|
|
416
|
+
});
|
|
417
|
+
it.skip("should return null for private packages", () => {
|
|
418
|
+
// Mock packagesShell to return private package for this test
|
|
419
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ private: true }));
|
|
420
|
+
const privatePackages = new EntityPackage("private-package");
|
|
421
|
+
expect(privatePackages.getTagSeriesName()).toBe(null);
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
describe("static methods", () => {
|
|
426
|
+
describe("getRepoUrl", () => {
|
|
427
|
+
it.skip("should return repository URL when repository is a string", () => {
|
|
428
|
+
// Mock packagesShell to return root package with string repository for this test
|
|
429
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
|
|
430
|
+
name: "root",
|
|
431
|
+
repository: "https://github.com/user/repo.git",
|
|
432
|
+
}));
|
|
433
|
+
const result = EntityPackage.getRepoUrl();
|
|
434
|
+
expect(result).toBe("https://github.com/user/repo.git");
|
|
435
|
+
});
|
|
436
|
+
it.skip("should return repository URL when repository is an object", () => {
|
|
437
|
+
// Mock packagesShell to return root package with object repository for this test
|
|
438
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
|
|
439
|
+
name: "root",
|
|
440
|
+
repository: {
|
|
441
|
+
type: "git",
|
|
442
|
+
url: "https://github.com/user/repo.git",
|
|
443
|
+
},
|
|
444
|
+
}));
|
|
445
|
+
const result = EntityPackage.getRepoUrl();
|
|
446
|
+
expect(result).toBe("https://github.com/user/repo.git");
|
|
447
|
+
});
|
|
448
|
+
it("should return empty string when repository is missing", () => {
|
|
449
|
+
const packageJson = mockPackageJson({ name: "root" });
|
|
450
|
+
delete packageJson.repository;
|
|
451
|
+
// Mock packagesShell to return root package without repository for this test
|
|
452
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => packageJson);
|
|
453
|
+
const result = EntityPackage.getRepoUrl();
|
|
454
|
+
expect(result).toBe("");
|
|
455
|
+
});
|
|
456
|
+
it("should return empty string when repository object has no url", () => {
|
|
457
|
+
// Mock packagesShell to return root package with repository object without url for this test
|
|
458
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
|
|
459
|
+
name: "root",
|
|
460
|
+
repository: {
|
|
461
|
+
type: "git",
|
|
462
|
+
url: "",
|
|
463
|
+
},
|
|
464
|
+
}));
|
|
465
|
+
const result = EntityPackage.getRepoUrl();
|
|
466
|
+
expect(result).toBe("");
|
|
467
|
+
});
|
|
468
|
+
it("should return empty string when repository object has no url property", () => {
|
|
469
|
+
// Mock packagesShell to return root package with repository object without url property for this test
|
|
470
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
|
|
471
|
+
name: "root",
|
|
472
|
+
repository: {
|
|
473
|
+
type: "git",
|
|
474
|
+
url: "", // Provide empty url to satisfy type requirements
|
|
475
|
+
},
|
|
476
|
+
}));
|
|
477
|
+
const result = EntityPackage.getRepoUrl();
|
|
478
|
+
expect(result).toBe("");
|
|
479
|
+
});
|
|
480
|
+
it("should return empty string when repository is undefined", () => {
|
|
481
|
+
// Mock packagesShell to return root package with undefined repository for this test
|
|
482
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
|
|
483
|
+
name: "root",
|
|
484
|
+
repository: undefined,
|
|
485
|
+
}));
|
|
486
|
+
const result = EntityPackage.getRepoUrl();
|
|
487
|
+
expect(result).toBe("");
|
|
488
|
+
});
|
|
489
|
+
it.skip("should return repository URL when repository is a string", () => {
|
|
490
|
+
// Mock packagesShell to return root package with string repository for this test
|
|
491
|
+
mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
|
|
492
|
+
name: "root",
|
|
493
|
+
repository: "https://github.com/example/repo",
|
|
494
|
+
}));
|
|
495
|
+
const result = EntityPackage.getRepoUrl();
|
|
496
|
+
expect(result).toBe("https://github.com/example/repo");
|
|
497
|
+
});
|
|
498
|
+
});
|
|
499
|
+
describe("getAllPackages", () => {
|
|
500
|
+
it("should return list of packages including root", async () => {
|
|
501
|
+
// Mock packagesShell methods for this test
|
|
502
|
+
mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
|
|
503
|
+
mockPackagesShell.readDirectory
|
|
504
|
+
.mockResolvedValueOnce(["test-app", "another-app"]) // apps
|
|
505
|
+
.mockResolvedValueOnce(["ui", "utils"]); // packages
|
|
506
|
+
mockPackagesShell.canAccessFile
|
|
507
|
+
.mockResolvedValueOnce(true) // apps/test-app/package.json
|
|
508
|
+
.mockResolvedValueOnce(true) // apps/another-app/package.json
|
|
509
|
+
.mockResolvedValueOnce(true) // packages/ui/package.json
|
|
510
|
+
.mockResolvedValueOnce(true); // packages/utils/package.json
|
|
511
|
+
mockPackagesShell.readFileAsText
|
|
512
|
+
.mockResolvedValueOnce('{"name": "test-app", "version": "1.0.0"}')
|
|
513
|
+
.mockResolvedValueOnce('{"name": "another-app", "version": "1.0.0"}')
|
|
514
|
+
.mockResolvedValueOnce('{"name": "@repo/ui", "version": "1.0.0"}')
|
|
515
|
+
.mockResolvedValueOnce('{"name": "@repo/utils", "version": "1.0.0"}');
|
|
516
|
+
const result = await EntityPackage.getAllPackages();
|
|
517
|
+
expect(result).toContain("root");
|
|
518
|
+
expect(result).toContain("test-app");
|
|
519
|
+
expect(result).toContain("another-app");
|
|
520
|
+
expect(result).toContain("@repo/ui");
|
|
521
|
+
expect(result).toContain("@repo/utils");
|
|
522
|
+
});
|
|
523
|
+
it("should handle empty directories gracefully", async () => {
|
|
524
|
+
// Mock packagesShell methods for this test
|
|
525
|
+
mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
|
|
526
|
+
mockPackagesShell.readDirectory
|
|
527
|
+
.mockResolvedValueOnce([]) // apps
|
|
528
|
+
.mockResolvedValueOnce([]); // packages
|
|
529
|
+
const result = await EntityPackage.getAllPackages();
|
|
530
|
+
expect(result).toEqual(["root"]);
|
|
531
|
+
});
|
|
532
|
+
it("should filter out packages without valid package.json", async () => {
|
|
533
|
+
// Mock packagesShell methods for this test
|
|
534
|
+
mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
|
|
535
|
+
mockPackagesShell.readDirectory
|
|
536
|
+
.mockResolvedValueOnce(["invalid-app"]) // apps
|
|
537
|
+
.mockResolvedValueOnce(["invalid-pkg"]); // packages
|
|
538
|
+
mockPackagesShell.canAccessFile
|
|
539
|
+
.mockResolvedValueOnce(false) // apps/invalid-app/package.json
|
|
540
|
+
.mockResolvedValueOnce(false); // packages/invalid-pkg/package.json
|
|
541
|
+
const result = await EntityPackage.getAllPackages();
|
|
542
|
+
expect(result).toEqual(["root"]);
|
|
543
|
+
});
|
|
544
|
+
});
|
|
545
|
+
});
|
|
546
|
+
describe("edge cases and error handling", () => {
|
|
547
|
+
it("should handle package names with special characters", () => {
|
|
548
|
+
const specialPackages = new EntityPackage("test-package@1.0.0");
|
|
549
|
+
expect(specialPackages.getPath()).toBe("apps/test-package@1.0.0");
|
|
550
|
+
});
|
|
551
|
+
it("should handle empty package name", () => {
|
|
552
|
+
const emptyPackages = new EntityPackage("");
|
|
553
|
+
expect(emptyPackages.getPath()).toBe("apps/");
|
|
554
|
+
});
|
|
555
|
+
it("should handle very long package names", () => {
|
|
556
|
+
const longName = "a".repeat(1000);
|
|
557
|
+
const longPackages = new EntityPackage(longName);
|
|
558
|
+
expect(longPackages.getPath()).toBe(`apps/${longName}`);
|
|
559
|
+
});
|
|
560
|
+
it("should handle package names with spaces", () => {
|
|
561
|
+
const spacedPackages = new EntityPackage("test package");
|
|
562
|
+
expect(spacedPackages.getPath()).toBe("apps/test package");
|
|
563
|
+
});
|
|
564
|
+
});
|
|
565
|
+
describe("getVersionedPackages", () => {
|
|
566
|
+
it.skip("should return packages that should be versioned", async () => {
|
|
567
|
+
// Mock packagesShell methods for this test
|
|
568
|
+
mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
|
|
569
|
+
mockPackagesShell.readDirectory
|
|
570
|
+
.mockResolvedValueOnce(["test-app"]) // apps
|
|
571
|
+
.mockResolvedValueOnce(["ui"]); // packages
|
|
572
|
+
mockPackagesShell.canAccessFile
|
|
573
|
+
.mockResolvedValueOnce(true) // apps/test-app/package.json
|
|
574
|
+
.mockResolvedValueOnce(true); // packages/ui/package.json
|
|
575
|
+
mockPackagesShell.readFileAsText
|
|
576
|
+
.mockResolvedValueOnce('{"name": "test-app", "version": "1.0.0", "private": false}')
|
|
577
|
+
.mockResolvedValueOnce('{"name": "@repo/ui", "version": "1.0.0", "private": false}');
|
|
578
|
+
const result = await EntityPackage.getVersionedPackages();
|
|
579
|
+
expect(Array.isArray(result)).toBe(true);
|
|
580
|
+
expect(result).toContain("test-app");
|
|
581
|
+
expect(result).toContain("@repo/ui");
|
|
582
|
+
});
|
|
583
|
+
});
|
|
584
|
+
describe("getUnversionedPackages", () => {
|
|
585
|
+
it.skip("should return packages that should not be versioned", async () => {
|
|
586
|
+
// Override the readJsonFile mock for this specific test to return private packages
|
|
587
|
+
mockPackagesShell.readJsonFile.mockImplementation((path) => {
|
|
588
|
+
if (path.includes("test-app")) {
|
|
589
|
+
return { name: "test-app", version: "1.0.0", private: true };
|
|
590
|
+
}
|
|
591
|
+
if (path.includes("ui")) {
|
|
592
|
+
return { name: "@repo/ui", version: "1.0.0", private: true };
|
|
593
|
+
}
|
|
594
|
+
// Default fallback
|
|
595
|
+
return mockPackageJson();
|
|
596
|
+
});
|
|
597
|
+
// Mock packagesShell methods for this test
|
|
598
|
+
mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
|
|
599
|
+
mockPackagesShell.readDirectory
|
|
600
|
+
.mockResolvedValueOnce(["test-app"]) // apps
|
|
601
|
+
.mockResolvedValueOnce(["ui"]); // packages
|
|
602
|
+
mockPackagesShell.canAccessFile
|
|
603
|
+
.mockResolvedValueOnce(true) // apps/test-app/package.json
|
|
604
|
+
.mockResolvedValueOnce(true); // packages/ui/package.json
|
|
605
|
+
mockPackagesShell.readFileAsText
|
|
606
|
+
.mockResolvedValueOnce('{"name": "test-app", "version": "1.0.0", "private": true}')
|
|
607
|
+
.mockResolvedValueOnce('{"name": "@repo/ui", "version": "1.0.0", "private": true}');
|
|
608
|
+
const result = await EntityPackage.getUnversionedPackages();
|
|
609
|
+
expect(Array.isArray(result)).toBe(true);
|
|
610
|
+
expect(result).toContain("test-app");
|
|
611
|
+
expect(result).toContain("@repo/ui");
|
|
612
|
+
});
|
|
613
|
+
});
|
|
614
|
+
describe.skip("validateAllPackages", () => {
|
|
615
|
+
it("should validate all packages and return results", async () => {
|
|
616
|
+
// Mock packagesShell methods for this test
|
|
617
|
+
mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
|
|
618
|
+
mockPackagesShell.readDirectory
|
|
619
|
+
.mockResolvedValueOnce(["test-app"]) // apps
|
|
620
|
+
.mockResolvedValueOnce(["ui"]); // packages
|
|
621
|
+
mockPackagesShell.canAccessFile
|
|
622
|
+
.mockResolvedValueOnce(true) // apps/test-app/package.json
|
|
623
|
+
.mockResolvedValueOnce(true); // packages/ui/package.json
|
|
624
|
+
mockPackagesShell.readFileAsText
|
|
625
|
+
.mockResolvedValueOnce('{"name": "test-app", "version": "1.0.0", "private": false}')
|
|
626
|
+
.mockResolvedValueOnce('{"name": "@repo/ui", "version": "1.0.0", "private": false}');
|
|
627
|
+
const result = await EntityPackage.validateAllPackages();
|
|
628
|
+
expect(Array.isArray(result)).toBe(true);
|
|
629
|
+
console.log(result);
|
|
630
|
+
expect(result).toHaveLength(3);
|
|
631
|
+
expect(result).toContain("root: Consider adding a description to package.json");
|
|
632
|
+
expect(result).toContain("test-app: Consider adding a description to package.json");
|
|
633
|
+
expect(result).toContain("@repo/ui: Consider adding a description to package.json");
|
|
634
|
+
});
|
|
635
|
+
});
|
|
636
|
+
});
|
|
637
|
+
//# sourceMappingURL=package.test.js.map
|