import * as NodeServices from "@effect/platform-node/NodeServices";import { assert, it } from "@effect/vitest";import * as ConfigProvider from "effect/ConfigProvider";import * as Effect from "effect/Effect";import * as Option from "effect/Option"; import { resolveBuildOptions, resolveDesktopBuildIconAssets, resolveDesktopProductName, resolveDesktopUpdateChannel, resolveMockUpdateServerPort, resolveMockUpdateServerUrl,} from "./build-desktop-artifact.ts";import { BRAND_ASSET_PATHS } from "./lib/brand-assets.ts"; it.layer(NodeServices.layer)("build-desktop-artifact", (it) => { it("resolves the dedicated nightly updater channel from nightly versions", () => { assert.equal(resolveDesktopUpdateChannel("0.0.17-nightly.20260413.42"), "nightly"); assert.equal(resolveDesktopUpdateChannel("0.0.17"), "latest"); }); it("switches desktop packaging product names to nightly for nightly builds", () => { assert.equal(resolveDesktopProductName("0.0.17"), "T3 Code (Alpha)"); assert.equal(resolveDesktopProductName("0.0.17-nightly.20260413.42"), "T3 Code (Nightly)"); }); it("switches desktop packaging icons to the nightly artwork for nightly versions", () => { assert.deepStrictEqual(resolveDesktopBuildIconAssets("0.0.17"), { macIconPng: BRAND_ASSET_PATHS.productionMacIconPng, linuxIconPng: BRAND_ASSET_PATHS.productionLinuxIconPng, windowsIconIco: BRAND_ASSET_PATHS.productionWindowsIconIco, }); assert.deepStrictEqual(resolveDesktopBuildIconAssets("0.0.17-nightly.20260413.42"), { macIconPng: BRAND_ASSET_PATHS.nightlyMacIconPng, linuxIconPng: BRAND_ASSET_PATHS.nightlyLinuxIconPng, windowsIconIco: BRAND_ASSET_PATHS.nightlyWindowsIconIco, }); }); it("falls back to the default mock update port when the configured port is blank", () => { assert.equal(resolveMockUpdateServerUrl(undefined), "http://localhost:3000"); assert.equal(resolveMockUpdateServerUrl(4123), "http://localhost:4123"); }); it.effect("normalizes mock update server ports from env-style strings", () => Effect.gen(function* () { assert.equal(yield* resolveMockUpdateServerPort(undefined), undefined); assert.equal(yield* resolveMockUpdateServerPort(""), undefined); assert.equal(yield* resolveMockUpdateServerPort(" "), undefined); assert.equal(yield* resolveMockUpdateServerPort("4123"), 4123); }), ); it.effect("rejects non-numeric or out-of-range mock update ports", () => Effect.gen(function* () { const invalidPorts = ["abc", "12.5", "0", "65536"]; for (const port of invalidPorts) { const exit = yield* Effect.exit(resolveMockUpdateServerPort(port)); assert.equal(exit._tag, "Failure"); } }), ); it.effect("preserves explicit false boolean flags over true env defaults", () => Effect.gen(function* () { const resolved = yield* resolveBuildOptions({ platform: Option.some("mac"), target: Option.none(), arch: Option.some("arm64"), buildVersion: Option.none(), outputDir: Option.some("release-test"), skipBuild: Option.some(false), keepStage: Option.some(false), signed: Option.some(false), verbose: Option.some(false), mockUpdates: Option.some(false), mockUpdateServerPort: Option.none(), }).pipe( Effect.provide( ConfigProvider.layer( ConfigProvider.fromEnv({ env: { T3CODE_DESKTOP_SKIP_BUILD: "true", T3CODE_DESKTOP_KEEP_STAGE: "true", T3CODE_DESKTOP_SIGNED: "true", T3CODE_DESKTOP_VERBOSE: "true", T3CODE_DESKTOP_MOCK_UPDATES: "true", }, }), ), ), ); assert.equal(resolved.skipBuild, false); assert.equal(resolved.keepStage, false); assert.equal(resolved.signed, false); assert.equal(resolved.verbose, false); assert.equal(resolved.mockUpdates, false); }), );});
import * as NodeServices from "@effect/platform-node/NodeServices";
import { assert, it } from "@effect/vitest";
import * as ConfigProvider from "effect/ConfigProvider";
import * as Effect from "effect/Effect";
import * as Option from "effect/Option";
import {
resolveBuildOptions,
resolveDesktopBuildIconAssets,
resolveDesktopProductName,
resolveDesktopUpdateChannel,
resolveMockUpdateServerPort,
resolveMockUpdateServerUrl,
} from "./build-desktop-artifact.ts";
import { BRAND_ASSET_PATHS } from "./lib/brand-assets.ts";
it.layer(NodeServices.layer)("build-desktop-artifact", (it) => {
it("resolves the dedicated nightly updater channel from nightly versions", () => {
assert.equal(resolveDesktopUpdateChannel("0.0.17-nightly.20260413.42"), "nightly");
assert.equal(resolveDesktopUpdateChannel("0.0.17"), "latest");
});
it("switches desktop packaging product names to nightly for nightly builds", () => {
assert.equal(resolveDesktopProductName("0.0.17"), "T3 Code (Alpha)");
assert.equal(resolveDesktopProductName("0.0.17-nightly.20260413.42"), "T3 Code (Nightly)");
});
it("switches desktop packaging icons to the nightly artwork for nightly versions", () => {
assert.deepStrictEqual(resolveDesktopBuildIconAssets("0.0.17"), {
macIconPng: BRAND_ASSET_PATHS.productionMacIconPng,
linuxIconPng: BRAND_ASSET_PATHS.productionLinuxIconPng,
windowsIconIco: BRAND_ASSET_PATHS.productionWindowsIconIco,
});
assert.deepStrictEqual(resolveDesktopBuildIconAssets("0.0.17-nightly.20260413.42"), {
macIconPng: BRAND_ASSET_PATHS.nightlyMacIconPng,
linuxIconPng: BRAND_ASSET_PATHS.nightlyLinuxIconPng,
windowsIconIco: BRAND_ASSET_PATHS.nightlyWindowsIconIco,
});
});
it("falls back to the default mock update port when the configured port is blank", () => {
assert.equal(resolveMockUpdateServerUrl(undefined), "http://localhost:3000");
assert.equal(resolveMockUpdateServerUrl(4123), "http://localhost:4123");
});
it.effect("normalizes mock update server ports from env-style strings", () =>
Effect.gen(function* () {
assert.equal(yield* resolveMockUpdateServerPort(undefined), undefined);
assert.equal(yield* resolveMockUpdateServerPort(""), undefined);
assert.equal(yield* resolveMockUpdateServerPort(" "), undefined);
assert.equal(yield* resolveMockUpdateServerPort("4123"), 4123);
}),
);
it.effect("rejects non-numeric or out-of-range mock update ports", () =>
Effect.gen(function* () {
const invalidPorts = ["abc", "12.5", "0", "65536"];
for (const port of invalidPorts) {
const exit = yield* Effect.exit(resolveMockUpdateServerPort(port));
assert.equal(exit._tag, "Failure");
}
}),
);
it.effect("preserves explicit false boolean flags over true env defaults", () =>
Effect.gen(function* () {
const resolved = yield* resolveBuildOptions({
platform: Option.some("mac"),
target: Option.none(),
arch: Option.some("arm64"),
buildVersion: Option.none(),
outputDir: Option.some("release-test"),
skipBuild: Option.some(false),
keepStage: Option.some(false),
signed: Option.some(false),
verbose: Option.some(false),
mockUpdates: Option.some(false),
mockUpdateServerPort: Option.none(),
}).pipe(
Effect.provide(
ConfigProvider.layer(
ConfigProvider.fromEnv({
env: {
T3CODE_DESKTOP_SKIP_BUILD: "true",
T3CODE_DESKTOP_KEEP_STAGE: "true",
T3CODE_DESKTOP_SIGNED: "true",
T3CODE_DESKTOP_VERBOSE: "true",
T3CODE_DESKTOP_MOCK_UPDATES: "true",
},
}),
),
),
);
assert.equal(resolved.skipBuild, false);
assert.equal(resolved.keepStage, false);
assert.equal(resolved.signed, false);
assert.equal(resolved.verbose, false);
assert.equal(resolved.mockUpdates, false);
}),
);
});