import * as NodeServices from "@effect/platform-node/NodeServices";import { assert, describe, it } from "@effect/vitest";import * as Effect from "effect/Effect";import * as Layer from "effect/Layer";import * as Option from "effect/Option"; import * as DesktopEnvironment from "./DesktopEnvironment.ts";import * as DesktopConfig from "./DesktopConfig.ts"; const defaultInput = { dirname: "/repo/apps/desktop/dist-electron", homeDirectory: "/Users/alice", platform: "darwin", processArch: "arm64", appVersion: "0.0.22", appPath: "/Applications/T3 Code.app/Contents/Resources/app.asar", isPackaged: false, resourcesPath: "/Applications/T3 Code.app/Contents/Resources", runningUnderArm64Translation: false,} satisfies DesktopEnvironment.MakeDesktopEnvironmentInput; const makeEnvironmentLayer = ( overrides: Partial<DesktopEnvironment.MakeDesktopEnvironmentInput> = {}, env: Record<string, string | undefined> = {},) => DesktopEnvironment.layer({ ...defaultInput, ...overrides, }).pipe(Layer.provide(Layer.mergeAll(NodeServices.layer, DesktopConfig.layerTest(env)))); const makeEnvironment = ( overrides: Partial<DesktopEnvironment.MakeDesktopEnvironmentInput> = {}, env: Record<string, string | undefined> = {},) => DesktopEnvironment.DesktopEnvironment.pipe(Effect.provide(makeEnvironmentLayer(overrides, env))); describe("DesktopEnvironment", () => { it.effect("derives state paths and development identity inside Effect", () => Effect.gen(function* () { const environment = yield* makeEnvironment( {}, { T3CODE_HOME: " /tmp/t3 ", T3CODE_COMMIT_HASH: " 0123456789abcdef ", T3CODE_PORT: "4949", VITE_DEV_SERVER_URL: "http://localhost:5173", T3CODE_DEV_REMOTE_T3_SERVER_ENTRY_PATH: " /remote/server.mjs ", T3CODE_OTLP_TRACES_URL: " http://127.0.0.1:4318/v1/traces ", T3CODE_OTLP_EXPORT_INTERVAL_MS: "2500", }, ); assert.equal(environment.isDevelopment, true); assert.equal(environment.appDataDirectory, "/Users/alice/Library/Application Support"); assert.equal(environment.baseDir, "/tmp/t3"); assert.equal(environment.stateDir, "/tmp/t3/userdata"); assert.equal(environment.desktopSettingsPath, "/tmp/t3/userdata/desktop-settings.json"); assert.equal(environment.clientSettingsPath, "/tmp/t3/userdata/client-settings.json"); assert.equal( environment.savedEnvironmentRegistryPath, "/tmp/t3/userdata/saved-environments.json", ); assert.equal(environment.serverSettingsPath, "/tmp/t3/userdata/settings.json"); assert.equal(environment.logDir, "/tmp/t3/userdata/logs"); assert.equal(environment.browserArtifactsDir, "/tmp/t3/userdata/browser-artifacts"); assert.equal(environment.rootDir, "/repo"); assert.equal(environment.appRoot, "/repo"); assert.equal(environment.backendEntryPath, "/repo/apps/server/dist/bin.mjs"); assert.equal(environment.backendCwd, "/repo"); assert.equal(environment.appUserModelId, "com.t3tools.t3code.dev"); assert.equal(environment.linuxWmClass, "t3code-dev"); assert.deepEqual( Option.map(environment.devServerUrl, (url) => url.href), Option.some("http://localhost:5173/"), ); assert.deepEqual(environment.devRemoteT3ServerEntryPath, Option.some("/remote/server.mjs")); assert.deepEqual(environment.configuredBackendPort, Option.some(4949)); assert.deepEqual(environment.commitHashOverride, Option.some("0123456789abcdef")); assert.deepEqual(environment.otlpTracesUrl, Option.some("http://127.0.0.1:4318/v1/traces")); assert.equal(environment.otlpExportIntervalMs, 2500); }), ); it.effect("stores production state under userdata in an explicit home", () => Effect.gen(function* () { const environment = yield* makeEnvironment( {}, { T3CODE_HOME: "/tmp/t3", }, ); assert.equal(environment.isDevelopment, false); assert.equal(environment.stateDir, "/tmp/t3/userdata"); assert.equal(environment.logDir, "/tmp/t3/userdata/logs"); assert.equal(environment.browserArtifactsDir, "/tmp/t3/userdata/browser-artifacts"); assert.equal(environment.serverSettingsPath, "/tmp/t3/userdata/settings.json"); }), ); it.effect("keeps implicit development state separate from production state", () => Effect.gen(function* () { const development = yield* makeEnvironment( {}, { VITE_DEV_SERVER_URL: "http://localhost:5173" }, ); const production = yield* makeEnvironment(); assert.equal(development.stateDir, "/Users/alice/.t3/dev"); assert.equal(production.stateDir, "/Users/alice/.t3/userdata"); }), ); it.effect("uses a configured app user model id override", () => Effect.gen(function* () { const environment = yield* makeEnvironment( {}, { T3CODE_DESKTOP_APP_USER_MODEL_ID: " com.t3tools.t3code.dev.local ", VITE_DEV_SERVER_URL: "http://localhost:5173", }, ); assert.equal(environment.appUserModelId, "com.t3tools.t3code.dev.local"); }), ); it.effect("resolves picker defaults without nullish sentinels", () => Effect.gen(function* () { const environment = yield* makeEnvironment(); assert.deepEqual(environment.resolvePickFolderDefaultPath(null), Option.none()); assert.deepEqual( environment.resolvePickFolderDefaultPath({ initialPath: " " }), Option.none(), ); assert.deepEqual( environment.resolvePickFolderDefaultPath({ initialPath: "~" }), Option.some("/Users/alice"), ); assert.deepEqual( environment.resolvePickFolderDefaultPath({ initialPath: "~/project" }), Option.some("/Users/alice/project"), ); }), );});
import * as NodeServices from "@effect/platform-node/NodeServices";
import { assert, describe, it } from "@effect/vitest";
import * as Effect from "effect/Effect";
import * as Layer from "effect/Layer";
import * as Option from "effect/Option";
import * as DesktopEnvironment from "./DesktopEnvironment.ts";
import * as DesktopConfig from "./DesktopConfig.ts";
const defaultInput = {
dirname: "/repo/apps/desktop/dist-electron",
homeDirectory: "/Users/alice",
platform: "darwin",
processArch: "arm64",
appVersion: "0.0.22",
appPath: "/Applications/T3 Code.app/Contents/Resources/app.asar",
isPackaged: false,
resourcesPath: "/Applications/T3 Code.app/Contents/Resources",
runningUnderArm64Translation: false,
} satisfies DesktopEnvironment.MakeDesktopEnvironmentInput;
const makeEnvironmentLayer = (
overrides: Partial<DesktopEnvironment.MakeDesktopEnvironmentInput> = {},
env: Record<string, string | undefined> = {},
) =>
DesktopEnvironment.layer({
...defaultInput,
...overrides,
}).pipe(Layer.provide(Layer.mergeAll(NodeServices.layer, DesktopConfig.layerTest(env))));
const makeEnvironment = (
overrides: Partial<DesktopEnvironment.MakeDesktopEnvironmentInput> = {},
env: Record<string, string | undefined> = {},
) =>
DesktopEnvironment.DesktopEnvironment.pipe(Effect.provide(makeEnvironmentLayer(overrides, env)));
describe("DesktopEnvironment", () => {
it.effect("derives state paths and development identity inside Effect", () =>
Effect.gen(function* () {
const environment = yield* makeEnvironment(
{},
{
T3CODE_HOME: " /tmp/t3 ",
T3CODE_COMMIT_HASH: " 0123456789abcdef ",
T3CODE_PORT: "4949",
VITE_DEV_SERVER_URL: "http://localhost:5173",
T3CODE_DEV_REMOTE_T3_SERVER_ENTRY_PATH: " /remote/server.mjs ",
T3CODE_OTLP_TRACES_URL: " http://127.0.0.1:4318/v1/traces ",
T3CODE_OTLP_EXPORT_INTERVAL_MS: "2500",
},
);
assert.equal(environment.isDevelopment, true);
assert.equal(environment.appDataDirectory, "/Users/alice/Library/Application Support");
assert.equal(environment.baseDir, "/tmp/t3");
assert.equal(environment.stateDir, "/tmp/t3/userdata");
assert.equal(environment.desktopSettingsPath, "/tmp/t3/userdata/desktop-settings.json");
assert.equal(environment.clientSettingsPath, "/tmp/t3/userdata/client-settings.json");
assert.equal(
environment.savedEnvironmentRegistryPath,
"/tmp/t3/userdata/saved-environments.json",
);
assert.equal(environment.serverSettingsPath, "/tmp/t3/userdata/settings.json");
assert.equal(environment.logDir, "/tmp/t3/userdata/logs");
assert.equal(environment.browserArtifactsDir, "/tmp/t3/userdata/browser-artifacts");
assert.equal(environment.rootDir, "/repo");
assert.equal(environment.appRoot, "/repo");
assert.equal(environment.backendEntryPath, "/repo/apps/server/dist/bin.mjs");
assert.equal(environment.backendCwd, "/repo");
assert.equal(environment.appUserModelId, "com.t3tools.t3code.dev");
assert.equal(environment.linuxWmClass, "t3code-dev");
assert.deepEqual(
Option.map(environment.devServerUrl, (url) => url.href),
Option.some("http://localhost:5173/"),
);
assert.deepEqual(environment.devRemoteT3ServerEntryPath, Option.some("/remote/server.mjs"));
assert.deepEqual(environment.configuredBackendPort, Option.some(4949));
assert.deepEqual(environment.commitHashOverride, Option.some("0123456789abcdef"));
assert.deepEqual(environment.otlpTracesUrl, Option.some("http://127.0.0.1:4318/v1/traces"));
assert.equal(environment.otlpExportIntervalMs, 2500);
}),
);
it.effect("stores production state under userdata in an explicit home", () =>
Effect.gen(function* () {
const environment = yield* makeEnvironment(
{},
{
T3CODE_HOME: "/tmp/t3",
},
);
assert.equal(environment.isDevelopment, false);
assert.equal(environment.stateDir, "/tmp/t3/userdata");
assert.equal(environment.logDir, "/tmp/t3/userdata/logs");
assert.equal(environment.browserArtifactsDir, "/tmp/t3/userdata/browser-artifacts");
assert.equal(environment.serverSettingsPath, "/tmp/t3/userdata/settings.json");
}),
);
it.effect("keeps implicit development state separate from production state", () =>
Effect.gen(function* () {
const development = yield* makeEnvironment(
{},
{ VITE_DEV_SERVER_URL: "http://localhost:5173" },
);
const production = yield* makeEnvironment();
assert.equal(development.stateDir, "/Users/alice/.t3/dev");
assert.equal(production.stateDir, "/Users/alice/.t3/userdata");
}),
);
it.effect("uses a configured app user model id override", () =>
Effect.gen(function* () {
const environment = yield* makeEnvironment(
{},
{
T3CODE_DESKTOP_APP_USER_MODEL_ID: " com.t3tools.t3code.dev.local ",
VITE_DEV_SERVER_URL: "http://localhost:5173",
},
);
assert.equal(environment.appUserModelId, "com.t3tools.t3code.dev.local");
}),
);
it.effect("resolves picker defaults without nullish sentinels", () =>
Effect.gen(function* () {
const environment = yield* makeEnvironment();
assert.deepEqual(environment.resolvePickFolderDefaultPath(null), Option.none());
assert.deepEqual(
environment.resolvePickFolderDefaultPath({ initialPath: " " }),
Option.none(),
);
assert.deepEqual(
environment.resolvePickFolderDefaultPath({ initialPath: "~" }),
Option.some("/Users/alice"),
);
assert.deepEqual(
environment.resolvePickFolderDefaultPath({ initialPath: "~/project" }),
Option.some("/Users/alice/project"),
);
}),
);
});