Skip to content
Source
Sign inSign up

npmRelease.ts

59 lines2.4 KB

1import { type ServerConfig, ServerNpmReleaseError } from "@t3tools/contracts";
2import * as Cause from "effect/Cause";
3import * as Effect from "effect/Effect";
4import * as Option from "effect/Option";
5import * as Schema from "effect/Schema";
6import { Atom } from "effect/reactivity";
7​
8import { environmentSummaries } from "./presentation";
9import { primaryEnvironmentIdAtom } from "./primaryEnvironment";
10import { serverEnvironment } from "./server";
11​
12const isServerNpmReleaseError = Schema.is(ServerNpmReleaseError);
13​
14function unsupportedLookup(config: ServerConfig | null): ServerNpmReleaseError | null {
15 if (config === null) {
16 return new ServerNpmReleaseError({ reason: "Connect to this server to check releases." });
17 }
18 return config.environment.capabilities.npmReleaseLookup === true
19 ? null
20 : new ServerNpmReleaseError({
21 reason: "This server does not support registry lookups. Update it before switching tracks.",
22 });
24​
25export function npmReleaseFailureMessage(cause: Cause.Cause<unknown>): string {
26 const error = Option.getOrUndefined(Cause.findErrorOption(cause));
27 return isServerNpmReleaseError(error)
28 ? error.message
29 : "Could not check this environment's npm registry. Check the connection and registry settings.";
31​
32export const npmReleaseAtom = Atom.family((spec: string) =>
33 Atom.make((get) => {
34 const primary = get(primaryEnvironmentIdAtom);
35 // With the desktop's local server turned off there is no primary, so a connected server answers.
36 const candidates =
37 primary === null ? get(environmentSummaries.connectedEnvironmentIdsAtom) : [primary];
38 const environmentId =
39 candidates.find(
40 (id) => unsupportedLookup(get(serverEnvironment.configValueAtom(id))) === null,
41 ) ?? candidates[0];
42 if (environmentId === undefined) {
43 return Effect.fail(
44 new ServerNpmReleaseError({ reason: "Connect to a server to check releases." }),
45 );
46 }
47 const unsupported = unsupportedLookup(get(serverEnvironment.configValueAtom(environmentId)));
48 if (unsupported !== null) return Effect.fail(unsupported);
49 return get
50 .result(serverEnvironment.npmRelease({ environmentId, input: { spec } }))
51 .pipe(
52 Effect.map((release) =>
53 release === null
54 ? null
55 : { version: release.version, databaseMigration: release.databaseMigration },
56 ),
57 );
58 }).pipe(Atom.withLabel(`npm-release:${spec}`)),
59);