Skip to content
Source
Sign inSign up

update-release-package-versions.test.ts

124 lines4.3 KB

1import * as NodeServices from "@effect/platform-node/NodeServices";
2import { assert, it } from "@effect/vitest";
3import * as ConfigProvider from "effect/ConfigProvider";
4import * as Effect from "effect/Effect";
5import * as FileSystem from "effect/FileSystem";
6import * as Layer from "effect/Layer";
7import * as Path from "effect/Path";
8import * as Schema from "effect/Schema";
9import { Command } from "effect/cli";
10import * as TestConsole from "effect/testing/TestConsole";
11import { fromJsonStringPretty } from "@t3tools/shared/schemaJson";
12​
13import {
14 releasePackageFiles,
15 updateReleasePackageVersions,
16 updateReleasePackageVersionsCommand,
17} from "./update-release-package-versions.ts";
18​
19const ScriptTestLayer = Layer.mergeAll(NodeServices.layer, TestConsole.layer);
20const runCli = Command.runWith(updateReleasePackageVersionsCommand, { version: "0.0.0" });
21const PackageJsonSchema = Schema.Record(Schema.String, Schema.Unknown);
22const PackageJsonPrettyJson = fromJsonStringPretty(PackageJsonSchema);
23const decodePackageJson = Schema.decodeEffect(PackageJsonPrettyJson);
24const encodePackageJson = Schema.encodeEffect(PackageJsonPrettyJson);
25​
26const writePackageJsonFixtures = Effect.fn("writePackageJsonFixtures")(function* (
27 rootDir: string,
28 version: string,
29) {
30 const fs = yield* FileSystem.FileSystem;
31 const path = yield* Path.Path;
32​
33 for (const relativePath of releasePackageFiles) {
34 const filePath = path.join(rootDir, relativePath);
35 yield* fs.makeDirectory(path.dirname(filePath), { recursive: true });
36 yield* fs.writeFileString(
37 filePath,
38 `${yield* encodePackageJson({
39 name: relativePath,
40 version,
41 private: true,
42 })}\n`,
43 );
44 }
45});
46​
47const readReleaseVersions = Effect.fn("readReleaseVersions")(function* (rootDir: string) {
48 const fs = yield* FileSystem.FileSystem;
49 const path = yield* Path.Path;
50 const versions = new Map<string, string>();
51​
52 for (const relativePath of releasePackageFiles) {
53 const filePath = path.join(rootDir, relativePath);
54 const packageJson = yield* fs.readFileString(filePath).pipe(Effect.flatMap(decodePackageJson));
55 versions.set(relativePath, String(packageJson.version));
56 }
57​
58 return versions;
59});
60​
61it.layer(ScriptTestLayer)("update-release-package-versions", (it) => {
62 it.effect("updates all release package versions under the provided root", () =>
63 Effect.gen(function* () {
64 const fs = yield* FileSystem.FileSystem;
65 const baseDir = yield* fs.makeTempDirectoryScoped({
66 prefix: "update-release-package-versions-",
67 });
68​
69 yield* writePackageJsonFixtures(baseDir, "0.0.1");
70​
71 const result = yield* updateReleasePackageVersions("1.2.3", { rootDir: baseDir });
72 const versions = yield* readReleaseVersions(baseDir);
73​
74 assert.deepStrictEqual(result, { changed: true });
75 assert.deepStrictEqual(
76 Array.from(versions.entries()),
77 releasePackageFiles.map((relativePath) => [relativePath, "1.2.3"]),
78 );
79 }),
80 );
81​
82 it.effect("returns changed=false when all versions already match", () =>
83 Effect.gen(function* () {
84 const fs = yield* FileSystem.FileSystem;
85 const baseDir = yield* fs.makeTempDirectoryScoped({
86 prefix: "update-release-package-versions-unchanged-",
87 });
88​
89 yield* writePackageJsonFixtures(baseDir, "1.2.3");
90​
91 const result = yield* updateReleasePackageVersions("1.2.3", { rootDir: baseDir });
92​
93 assert.deepStrictEqual(result, { changed: false });
94 }),
95 );
96​
97 it.effect("accepts flags before the version positional and appends changed output", () =>
98 Effect.gen(function* () {
99 const fs = yield* FileSystem.FileSystem;
100 const path = yield* Path.Path;
101 const baseDir = yield* fs.makeTempDirectoryScoped({
102 prefix: "update-release-package-versions-cli-",
103 });
104 const githubOutputPath = path.join(baseDir, "github-output.txt");
105​
106 yield* writePackageJsonFixtures(baseDir, "0.0.1");
107​
108 yield* runCli(["--github-output", "--root", baseDir, "2.0.0"]).pipe(
109 Effect.provide(
110 ConfigProvider.layer(
111 ConfigProvider.fromEnv({
112 env: {
113 GITHUB_OUTPUT: githubOutputPath,
114 },
115 }),
116 ),
117 ),
118 );
119​
120 const githubOutput = yield* fs.readFileString(githubOutputPath);
121 assert.equal(githubOutput, "changed=true\n");
122 }),
123 );
124});