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 Layer from "effect/Layer";import * as Option from "effect/Option";import * as Sink from "effect/Sink";import * as Stream from "effect/Stream";import { ChildProcessSpawner } from "effect/unstable/process"; import { BuildCommandFailedError, createStageWorkspaceConfig, createStagePatchedDependencies, createBuildConfig, DESKTOP_ELECTRON_LANGUAGES, DESKTOP_FILE_EXCLUSIONS, DESKTOP_EXTRA_RESOURCES, InvalidMacPasskeyRpDomainError, InvalidMacPasskeyPublishableKeyError, InvalidMockUpdateServerPortError, UnsupportedDesktopBuildArchitectureError, isMacPasskeySigningConfigurationError, LinuxIconResizeError, MacPasskeySigningConfigurationResolutionError, MissingMacPasskeyProvisioningProfileError, renderMacPasskeyEntitlements, resolveClerkPasskeyNativeArtifacts, resolveMacPasskeySigningConfiguration, resolveDesktopRuntimeDependencies, resolveFffNativeDependencies, resolveBuildOptions, resolveDesktopBuildIconAssets, resolveDesktopProductName, resolveDesktopUpdateChannel, resolveDesktopWebAssetBrand, resolveResourceMonitorRustTargets, resourceMonitorExecutableName, resolveGitHubPublishConfig, resolveMockUpdateServerPort, resolveMockUpdateServerUrl, resolvePackageManagerUserAgent, stageLinuxIconSize, STAGE_INSTALL_ARGS, WINDOWS_ASAR_UNPACK,} from "./build-desktop-artifact.ts";import { BRAND_ASSET_PATHS } from "./lib/brand-assets.ts";import { HostProcessArchitecture, HostProcessPlatform } from "@t3tools/shared/hostProcess"; function mockProcess(exitCode: number) { return ChildProcessSpawner.makeHandle({ pid: ChildProcessSpawner.ProcessId(1), exitCode: Effect.succeed(ChildProcessSpawner.ExitCode(exitCode)), isRunning: Effect.succeed(false), kill: () => Effect.void, unref: Effect.succeed(Effect.void), stdin: Sink.drain, stdout: Stream.empty, stderr: Stream.empty, all: Stream.empty, getInputFd: () => Sink.drain, getOutputFd: () => Stream.empty, });} function iconResizeSpawnerLayer( commands: Array<{ readonly command: string; readonly args: ReadonlyArray<string> }>, exitCodes: ReadonlyArray<number>,) { let commandIndex = 0; return Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make((command) => { const childProcess = command as unknown as { readonly command: string; readonly args: ReadonlyArray<string>; }; commands.push({ command: childProcess.command, args: childProcess.args, }); return Effect.succeed(mockProcess(exitCodes[commandIndex++] ?? 0)); }), );} 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("switches the bundled splash and favicon branding for nightly versions", () => { assert.equal(resolveDesktopWebAssetBrand("0.0.17"), "production"); assert.equal(resolveDesktopWebAssetBrand("0.0.17-nightly.20260413.42"), "nightly"); }); it.effect("resolves GitHub desktop publish config from Effect config", () => Effect.gen(function* () { const latestConfig = yield* resolveGitHubPublishConfig("latest").pipe( Effect.provide( ConfigProvider.layer( ConfigProvider.fromEnv({ env: { T3CODE_DESKTOP_UPDATE_REPOSITORY: "pingdotgg/t3code", }, }), ), ), ); const nightlyConfig = yield* resolveGitHubPublishConfig("nightly").pipe( Effect.provide( ConfigProvider.layer( ConfigProvider.fromEnv({ env: { GITHUB_REPOSITORY: "pingdotgg/t3code", }, }), ), ), ); assert.deepStrictEqual(latestConfig, { provider: "github", owner: "pingdotgg", repo: "t3code", releaseType: "release", }); assert.deepStrictEqual(nightlyConfig, { provider: "github", owner: "pingdotgg", repo: "t3code", releaseType: "prerelease", channel: "nightly", }); }), ); it("omits bundled workspace packages from staged desktop dependencies", () => { assert.deepStrictEqual( resolveDesktopRuntimeDependencies( { "@effect/platform-node": "catalog:", "@t3tools/contracts": "workspace:*", "@t3tools/shared": "workspace:*", "@t3tools/ssh": "workspace:*", "@t3tools/tailscale": "workspace:*", effect: "catalog:", electron: "41.5.0", }, { "@effect/platform-node": "4.0.0-beta.59", effect: "4.0.0-beta.59", }, ), { "@effect/platform-node": "4.0.0-beta.59", effect: "4.0.0-beta.59", }, ); }); it("carries only staged dependency patch metadata into staged desktop installs", () => { assert.deepStrictEqual( createStagePatchedDependencies( { "@expo/metro-config@56.0.13": "patches/@expo%2Fmetro-config@56.0.13.patch", "@ff-labs/fff-node@0.9.4": "patches/@ff-labs__fff-node@0.9.4.patch", "@pierre/diffs@1.1.20": "patches/@pierre%2Fdiffs@1.1.20.patch", "alchemy@2.0.0-beta.49": "patches/alchemy@2.0.0-beta.49.patch", "effect@4.0.0-beta.73": "patches/effect@4.0.0-beta.73.patch", }, { "@ff-labs/fff-node": "0.9.4", "@pierre/diffs": "1.1.20", effect: "4.0.0-beta.73", }, ), { "@ff-labs/fff-node@0.9.4": "patches/@ff-labs__fff-node@0.9.4.patch", "@pierre/diffs@1.1.20": "patches/@pierre%2Fdiffs@1.1.20.patch", "effect@4.0.0-beta.73": "patches/effect@4.0.0-beta.73.patch", }, ); assert.deepStrictEqual( createStagePatchedDependencies( { "@expo/metro-config@56.0.13": "patches/@expo%2Fmetro-config@56.0.13.patch", }, { effect: "4.0.0-beta.73" }, ), {}, ); }); it("installs optional native dependencies for the target desktop architecture", () => { assert.deepStrictEqual(STAGE_INSTALL_ARGS, ["install", "--prod"]); assert.deepStrictEqual(createStageWorkspaceConfig({ platform: "mac", arch: "x64" }), { supportedArchitectures: { os: ["darwin"], cpu: ["x64"], }, }); assert.deepStrictEqual(createStageWorkspaceConfig({ platform: "linux", arch: "x64" }), { supportedArchitectures: { os: ["linux"], cpu: ["x64"], libc: ["glibc"], }, }); // Windows artifacts also bundle the same-architecture WSL (Linux, glibc) backend, so the // staged install must fetch its native optional deps (e.g. ffi-rs) too. assert.deepStrictEqual(createStageWorkspaceConfig({ platform: "win", arch: "x64" }), { supportedArchitectures: { os: ["win32", "linux"], cpu: ["x64"], libc: ["glibc"], }, }); assert.deepStrictEqual(createStageWorkspaceConfig({ platform: "win", arch: "arm64" }), { supportedArchitectures: { os: ["win32", "linux"], cpu: ["arm64"], libc: ["glibc"], }, }); assert.deepStrictEqual(createStageWorkspaceConfig({ platform: "mac", arch: "universal" }), { supportedArchitectures: { os: ["darwin"], cpu: ["arm64", "x64"], }, }); }); it("stages pnpm 11 allowBuilds and patchedDependencies in the workspace yaml", () => { assert.deepStrictEqual( createStageWorkspaceConfig({ platform: "linux", arch: "x64", allowBuilds: { electron: true, "node-pty": true, "browser-tabs-lock": false, }, patchedDependencies: { "effect@4.0.0-beta.73": "patches/effect@4.0.0-beta.73.patch", }, overrides: { effect: "4.0.0-beta.73", }, }), { supportedArchitectures: { os: ["linux"], cpu: ["x64"], libc: ["glibc"], }, allowBuilds: { electron: true, "node-pty": true, "browser-tabs-lock": false, }, patchedDependencies: { "effect@4.0.0-beta.73": "patches/effect@4.0.0-beta.73.patch", }, overrides: { effect: "4.0.0-beta.73", }, }, ); // Empty maps must not be written — pnpm would still require reviewed // packages if allowBuilds is present but incomplete, and omitting empty // patchedDependencies keeps the stage yaml minimal. assert.deepStrictEqual( createStageWorkspaceConfig({ platform: "mac", arch: "arm64", allowBuilds: {}, patchedDependencies: {}, overrides: {}, }), { supportedArchitectures: { os: ["darwin"], cpu: ["arm64"], }, }, ); }); it("limits Electron locales and excludes the unused Claude SDK executable", () => { assert.deepStrictEqual(DESKTOP_ELECTRON_LANGUAGES, ["en-US"]); assert.deepStrictEqual(DESKTOP_FILE_EXCLUSIONS, [ "!**/node_modules/@anthropic-ai/claude-agent-sdk-*/**/*", ]); }); it.effect("applies platform-specific packaging to the build config", () => Effect.gen(function* () { const mac = yield* createBuildConfig( "mac", "dmg", "1.2.3", false, false, undefined, undefined, ); const linux = yield* createBuildConfig( "linux", "AppImage", "1.2.3", false, false, undefined, undefined, ); const win = yield* createBuildConfig( "win", "nsis", "1.2.3", false, false, undefined, undefined, ); assert.notProperty(mac, "asarUnpack"); assert.notProperty(linux, "asarUnpack"); assert.deepStrictEqual(win.asarUnpack, WINDOWS_ASAR_UNPACK); // Linux must register the renderer schemes so the generated .desktop // entry advertises MimeType=x-scheme-handler/t3code; for OAuth deep links. assert.deepStrictEqual((linux.linux as Record<string, unknown>).protocols, [ { name: "T3 Code", schemes: ["t3code", "t3code-dev"] }, ]); for (const config of [mac, linux, win]) { assert.deepStrictEqual(config.electronLanguages, DESKTOP_ELECTRON_LANGUAGES); assert.deepStrictEqual(config.files, DESKTOP_FILE_EXCLUSIONS); } }).pipe(Effect.provide(ConfigProvider.layer(ConfigProvider.fromEnv({ env: {} })))), ); it.effect("preserves both Linux icon resize failures with structural context", () => { const commands: Array<{ readonly command: string; readonly args: ReadonlyArray<string> }> = []; return Effect.gen(function* () { const error = yield* stageLinuxIconSize("source.png", "target.png", 512, false).pipe( Effect.provide(iconResizeSpawnerLayer(commands, [1, 2])), Effect.flip, ); assert.instanceOf(error, LinuxIconResizeError); assert.equal(error.operation, "resize"); assert.equal(error.iconSize, 512); assert.equal(error.primaryTool, "magick"); assert.equal(error.fallbackTool, "convert"); assert.include(error.message, "512x512"); assert.include(error.message, "`magick`"); assert.include(error.message, "`convert`"); assert.notInclude(error.message, "non-zero exit code"); assert.instanceOf(error.cause, AggregateError); const aggregateCause = error.cause as AggregateError; assert.lengthOf(aggregateCause.errors, 2); assert.strictEqual(aggregateCause.cause, aggregateCause.errors[0]); assert.instanceOf(aggregateCause.errors[0], BuildCommandFailedError); assert.instanceOf(aggregateCause.errors[1], BuildCommandFailedError); const primaryError = aggregateCause.errors[0] as BuildCommandFailedError; const fallbackError = aggregateCause.errors[1] as BuildCommandFailedError; assert.equal(primaryError.command, "magick linux icon 512x512"); assert.equal(primaryError.exitCode, 1); assert.include(primaryError.message, "magick linux icon"); assert.equal(fallbackError.command, "convert linux icon 512x512"); assert.equal(fallbackError.exitCode, 2); assert.include(fallbackError.message, "convert linux icon"); assert.deepStrictEqual( commands.map(({ command }) => command), ["magick", "convert"], ); }); }); it("derives macOS passkey signing configuration from the Clerk publishable key", () => { const configuration = resolveMacPasskeySigningConfiguration({ T3CODE_APPLE_TEAM_ID: "abc1234567", T3CODE_MACOS_PROVISIONING_PROFILE: "/tmp/t3code.provisionprofile", T3CODE_CLERK_PUBLISHABLE_KEY: `pk_test_${btoa("example.clerk.accounts.dev$")}`, }); assert.deepStrictEqual(configuration, { appId: "com.t3tools.t3code", teamId: "ABC1234567", rpDomains: ["example.clerk.accounts.dev"], provisioningProfilePath: "/tmp/t3code.provisionprofile", }); }); it("normalizes explicit macOS passkey RP domains and renders required entitlements", () => { const configuration = resolveMacPasskeySigningConfiguration({ T3CODE_APPLE_TEAM_ID: "ABC1234567", T3CODE_MACOS_PROVISIONING_PROFILE: "/tmp/t3code.provisionprofile", T3CODE_CLERK_PASSKEY_RP_DOMAINS: " Clerk.Example.com,example.clerk.accounts.dev,clerk.example.com ", }); const entitlements = renderMacPasskeyEntitlements(configuration); assert.deepStrictEqual(configuration.rpDomains, [ "clerk.example.com", "example.clerk.accounts.dev", ]); assert.include(entitlements, "<string>ABC1234567.com.t3tools.t3code</string>"); assert.include(entitlements, "<string>webcredentials:clerk.example.com</string>"); assert.include(entitlements, "<string>webcredentials:example.clerk.accounts.dev</string>"); assert.include(entitlements, "<key>com.apple.security.cs.allow-jit</key>"); }); it("rejects incomplete macOS passkey signing configuration", () => { const captureError = (env: Readonly<Record<string, string | undefined>>) => { try { resolveMacPasskeySigningConfiguration(env); } catch (error) { return error; } return assert.fail("Expected passkey signing configuration to fail."); }; const missingProfileError = captureError({ T3CODE_APPLE_TEAM_ID: "ABC1234567", T3CODE_CLERK_PASSKEY_RP_DOMAINS: "example.clerk.accounts.dev", }); assert.instanceOf(missingProfileError, MissingMacPasskeyProvisioningProfileError); assert.equal( missingProfileError.message, "T3CODE_MACOS_PROVISIONING_PROFILE must point to an Associated Domains provisioning profile.", ); const unsafeDomain = "https://domain-user:domain-secret@example.clerk.accounts.dev/path?token=query-secret"; const invalidDomainError = captureError({ T3CODE_APPLE_TEAM_ID: "ABC1234567", T3CODE_MACOS_PROVISIONING_PROFILE: "/tmp/t3code.provisionprofile", T3CODE_CLERK_PASSKEY_RP_DOMAINS: unsafeDomain, }); assert.instanceOf(invalidDomainError, InvalidMacPasskeyRpDomainError); assert.equal(invalidDomainError.reason, "scheme-not-allowed"); assert.equal(invalidDomainError.inputLength, unsafeDomain.length); assert.equal(invalidDomainError.message, "Invalid passkey RP domain (scheme-not-allowed)."); assert.notProperty(invalidDomainError, "domain"); assert.notProperty(invalidDomainError, "cause"); const serializedInvalidDomainError = JSON.stringify(invalidDomainError); assert.notInclude(serializedInvalidDomainError, unsafeDomain); assert.notInclude(serializedInvalidDomainError, "domain-user"); assert.notInclude(serializedInvalidDomainError, "domain-secret"); assert.notInclude(serializedInvalidDomainError, "query-secret"); assert.throws( () => resolveMacPasskeySigningConfiguration({ T3CODE_APPLE_TEAM_ID: "ABC1234567", T3CODE_MACOS_PROVISIONING_PROFILE: "/tmp/t3code.provisionprofile", T3CODE_CLERK_PASSKEY_RP_DOMAINS: "example.clerk.accounts.dev:8443", }), /Invalid passkey RP domain/u, ); const invalidPublishableKeyError = captureError({ T3CODE_APPLE_TEAM_ID: "ABC1234567", T3CODE_MACOS_PROVISIONING_PROFILE: "/tmp/t3code.provisionprofile", T3CODE_CLERK_PUBLISHABLE_KEY: "pk_test_%", }); assert.instanceOf(invalidPublishableKeyError, InvalidMacPasskeyPublishableKeyError); assert.ok(invalidPublishableKeyError.cause); assert.equal(invalidPublishableKeyError.message, "T3CODE_CLERK_PUBLISHABLE_KEY is invalid."); assert.notProperty(invalidPublishableKeyError, "publishableKey"); assert.notInclude(invalidPublishableKeyError.message, "pk_test_%"); }); it("preserves known passkey signing configuration errors at the build boundary", () => { const decodingCause = new Error("publishable-key-decode-failed"); const knownError = new InvalidMacPasskeyPublishableKeyError({ cause: decodingCause }); const error = MacPasskeySigningConfigurationResolutionError.fromCause(knownError);Lines 1–500 of 769. Load more
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 Layer from "effect/Layer"; import * as Option from "effect/Option"; import * as Sink from "effect/Sink"; import * as Stream from "effect/Stream"; import { ChildProcessSpawner } from "effect/unstable/process"; import { BuildCommandFailedError, createStageWorkspaceConfig, createStagePatchedDependencies, createBuildConfig, DESKTOP_ELECTRON_LANGUAGES, DESKTOP_FILE_EXCLUSIONS, DESKTOP_EXTRA_RESOURCES, InvalidMacPasskeyRpDomainError, InvalidMacPasskeyPublishableKeyError, InvalidMockUpdateServerPortError, UnsupportedDesktopBuildArchitectureError, isMacPasskeySigningConfigurationError, LinuxIconResizeError, MacPasskeySigningConfigurationResolutionError, MissingMacPasskeyProvisioningProfileError, renderMacPasskeyEntitlements, resolveClerkPasskeyNativeArtifacts, resolveMacPasskeySigningConfiguration, resolveDesktopRuntimeDependencies, resolveFffNativeDependencies, resolveBuildOptions, resolveDesktopBuildIconAssets, resolveDesktopProductName, resolveDesktopUpdateChannel, resolveDesktopWebAssetBrand, resolveResourceMonitorRustTargets, resourceMonitorExecutableName, resolveGitHubPublishConfig, resolveMockUpdateServerPort, resolveMockUpdateServerUrl, resolvePackageManagerUserAgent, stageLinuxIconSize, STAGE_INSTALL_ARGS, WINDOWS_ASAR_UNPACK, } from "./build-desktop-artifact.ts"; import { BRAND_ASSET_PATHS } from "./lib/brand-assets.ts"; import { HostProcessArchitecture, HostProcessPlatform } from "@t3tools/shared/hostProcess"; function mockProcess(exitCode: number) { return ChildProcessSpawner.makeHandle({ pid: ChildProcessSpawner.ProcessId(1), exitCode: Effect.succeed(ChildProcessSpawner.ExitCode(exitCode)), isRunning: Effect.succeed(false), kill: () => Effect.void, unref: Effect.succeed(Effect.void), stdin: Sink.drain, stdout: Stream.empty, stderr: Stream.empty, all: Stream.empty, getInputFd: () => Sink.drain, getOutputFd: () => Stream.empty, }); } function iconResizeSpawnerLayer( commands: Array<{ readonly command: string; readonly args: ReadonlyArray<string> }>, exitCodes: ReadonlyArray<number>, ) { let commandIndex = 0; return Layer.succeed( ChildProcessSpawner.ChildProcessSpawner, ChildProcessSpawner.make((command) => { const childProcess = command as unknown as { readonly command: string; readonly args: ReadonlyArray<string>; }; commands.push({ command: childProcess.command, args: childProcess.args, }); return Effect.succeed(mockProcess(exitCodes[commandIndex++] ?? 0)); }), ); } 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("switches the bundled splash and favicon branding for nightly versions", () => { assert.equal(resolveDesktopWebAssetBrand("0.0.17"), "production"); assert.equal(resolveDesktopWebAssetBrand("0.0.17-nightly.20260413.42"), "nightly"); }); it.effect("resolves GitHub desktop publish config from Effect config", () => Effect.gen(function* () { const latestConfig = yield* resolveGitHubPublishConfig("latest").pipe( Effect.provide( ConfigProvider.layer( ConfigProvider.fromEnv({ env: { T3CODE_DESKTOP_UPDATE_REPOSITORY: "pingdotgg/t3code", }, }), ), ), ); const nightlyConfig = yield* resolveGitHubPublishConfig("nightly").pipe( Effect.provide( ConfigProvider.layer( ConfigProvider.fromEnv({ env: { GITHUB_REPOSITORY: "pingdotgg/t3code", }, }), ), ), ); assert.deepStrictEqual(latestConfig, { provider: "github", owner: "pingdotgg", repo: "t3code", releaseType: "release", }); assert.deepStrictEqual(nightlyConfig, { provider: "github", owner: "pingdotgg", repo: "t3code", releaseType: "prerelease", channel: "nightly", }); }), ); it("omits bundled workspace packages from staged desktop dependencies", () => { assert.deepStrictEqual( resolveDesktopRuntimeDependencies( { "@effect/platform-node": "catalog:", "@t3tools/contracts": "workspace:*", "@t3tools/shared": "workspace:*", "@t3tools/ssh": "workspace:*", "@t3tools/tailscale": "workspace:*", effect: "catalog:", electron: "41.5.0", }, { "@effect/platform-node": "4.0.0-beta.59", effect: "4.0.0-beta.59", }, ), { "@effect/platform-node": "4.0.0-beta.59", effect: "4.0.0-beta.59", }, ); }); it("carries only staged dependency patch metadata into staged desktop installs", () => { assert.deepStrictEqual( createStagePatchedDependencies( { "@expo/metro-config@56.0.13": "patches/@expo%2Fmetro-config@56.0.13.patch", "@ff-labs/fff-node@0.9.4": "patches/@ff-labs__fff-node@0.9.4.patch", "@pierre/diffs@1.1.20": "patches/@pierre%2Fdiffs@1.1.20.patch", "alchemy@2.0.0-beta.49": "patches/alchemy@2.0.0-beta.49.patch", "effect@4.0.0-beta.73": "patches/effect@4.0.0-beta.73.patch", }, { "@ff-labs/fff-node": "0.9.4", "@pierre/diffs": "1.1.20", effect: "4.0.0-beta.73", }, ), { "@ff-labs/fff-node@0.9.4": "patches/@ff-labs__fff-node@0.9.4.patch", "@pierre/diffs@1.1.20": "patches/@pierre%2Fdiffs@1.1.20.patch", "effect@4.0.0-beta.73": "patches/effect@4.0.0-beta.73.patch", }, ); assert.deepStrictEqual( createStagePatchedDependencies( { "@expo/metro-config@56.0.13": "patches/@expo%2Fmetro-config@56.0.13.patch", }, { effect: "4.0.0-beta.73" }, ), {}, ); }); it("installs optional native dependencies for the target desktop architecture", () => { assert.deepStrictEqual(STAGE_INSTALL_ARGS, ["install", "--prod"]); assert.deepStrictEqual(createStageWorkspaceConfig({ platform: "mac", arch: "x64" }), { supportedArchitectures: { os: ["darwin"], cpu: ["x64"], }, }); assert.deepStrictEqual(createStageWorkspaceConfig({ platform: "linux", arch: "x64" }), { supportedArchitectures: { os: ["linux"], cpu: ["x64"], libc: ["glibc"], }, }); // Windows artifacts also bundle the same-architecture WSL (Linux, glibc) backend, so the // staged install must fetch its native optional deps (e.g. ffi-rs) too. assert.deepStrictEqual(createStageWorkspaceConfig({ platform: "win", arch: "x64" }), { supportedArchitectures: { os: ["win32", "linux"], cpu: ["x64"], libc: ["glibc"], }, }); assert.deepStrictEqual(createStageWorkspaceConfig({ platform: "win", arch: "arm64" }), { supportedArchitectures: { os: ["win32", "linux"], cpu: ["arm64"], libc: ["glibc"], }, }); assert.deepStrictEqual(createStageWorkspaceConfig({ platform: "mac", arch: "universal" }), { supportedArchitectures: { os: ["darwin"], cpu: ["arm64", "x64"], }, }); }); it("stages pnpm 11 allowBuilds and patchedDependencies in the workspace yaml", () => { assert.deepStrictEqual( createStageWorkspaceConfig({ platform: "linux", arch: "x64", allowBuilds: { electron: true, "node-pty": true, "browser-tabs-lock": false, }, patchedDependencies: { "effect@4.0.0-beta.73": "patches/effect@4.0.0-beta.73.patch", }, overrides: { effect: "4.0.0-beta.73", }, }), { supportedArchitectures: { os: ["linux"], cpu: ["x64"], libc: ["glibc"], }, allowBuilds: { electron: true, "node-pty": true, "browser-tabs-lock": false, }, patchedDependencies: { "effect@4.0.0-beta.73": "patches/effect@4.0.0-beta.73.patch", }, overrides: { effect: "4.0.0-beta.73", }, }, ); // Empty maps must not be written — pnpm would still require reviewed // packages if allowBuilds is present but incomplete, and omitting empty // patchedDependencies keeps the stage yaml minimal. assert.deepStrictEqual( createStageWorkspaceConfig({ platform: "mac", arch: "arm64", allowBuilds: {}, patchedDependencies: {}, overrides: {}, }), { supportedArchitectures: { os: ["darwin"], cpu: ["arm64"], }, }, ); }); it("limits Electron locales and excludes the unused Claude SDK executable", () => { assert.deepStrictEqual(DESKTOP_ELECTRON_LANGUAGES, ["en-US"]); assert.deepStrictEqual(DESKTOP_FILE_EXCLUSIONS, [ "!**/node_modules/@anthropic-ai/claude-agent-sdk-*/**/*", ]); }); it.effect("applies platform-specific packaging to the build config", () => Effect.gen(function* () { const mac = yield* createBuildConfig( "mac", "dmg", "1.2.3", false, false, undefined, undefined, ); const linux = yield* createBuildConfig( "linux", "AppImage", "1.2.3", false, false, undefined, undefined, ); const win = yield* createBuildConfig( "win", "nsis", "1.2.3", false, false, undefined, undefined, ); assert.notProperty(mac, "asarUnpack"); assert.notProperty(linux, "asarUnpack"); assert.deepStrictEqual(win.asarUnpack, WINDOWS_ASAR_UNPACK); // Linux must register the renderer schemes so the generated .desktop // entry advertises MimeType=x-scheme-handler/t3code; for OAuth deep links. assert.deepStrictEqual((linux.linux as Record<string, unknown>).protocols, [ { name: "T3 Code", schemes: ["t3code", "t3code-dev"] }, ]); for (const config of [mac, linux, win]) { assert.deepStrictEqual(config.electronLanguages, DESKTOP_ELECTRON_LANGUAGES); assert.deepStrictEqual(config.files, DESKTOP_FILE_EXCLUSIONS); } }).pipe(Effect.provide(ConfigProvider.layer(ConfigProvider.fromEnv({ env: {} })))), ); it.effect("preserves both Linux icon resize failures with structural context", () => { const commands: Array<{ readonly command: string; readonly args: ReadonlyArray<string> }> = []; return Effect.gen(function* () { const error = yield* stageLinuxIconSize("source.png", "target.png", 512, false).pipe( Effect.provide(iconResizeSpawnerLayer(commands, [1, 2])), Effect.flip, ); assert.instanceOf(error, LinuxIconResizeError); assert.equal(error.operation, "resize"); assert.equal(error.iconSize, 512); assert.equal(error.primaryTool, "magick"); assert.equal(error.fallbackTool, "convert"); assert.include(error.message, "512x512"); assert.include(error.message, "`magick`"); assert.include(error.message, "`convert`"); assert.notInclude(error.message, "non-zero exit code"); assert.instanceOf(error.cause, AggregateError); const aggregateCause = error.cause as AggregateError; assert.lengthOf(aggregateCause.errors, 2); assert.strictEqual(aggregateCause.cause, aggregateCause.errors[0]); assert.instanceOf(aggregateCause.errors[0], BuildCommandFailedError); assert.instanceOf(aggregateCause.errors[1], BuildCommandFailedError); const primaryError = aggregateCause.errors[0] as BuildCommandFailedError; const fallbackError = aggregateCause.errors[1] as BuildCommandFailedError; assert.equal(primaryError.command, "magick linux icon 512x512"); assert.equal(primaryError.exitCode, 1); assert.include(primaryError.message, "magick linux icon"); assert.equal(fallbackError.command, "convert linux icon 512x512"); assert.equal(fallbackError.exitCode, 2); assert.include(fallbackError.message, "convert linux icon"); assert.deepStrictEqual( commands.map(({ command }) => command), ["magick", "convert"], ); }); }); it("derives macOS passkey signing configuration from the Clerk publishable key", () => { const configuration = resolveMacPasskeySigningConfiguration({ T3CODE_APPLE_TEAM_ID: "abc1234567", T3CODE_MACOS_PROVISIONING_PROFILE: "/tmp/t3code.provisionprofile", T3CODE_CLERK_PUBLISHABLE_KEY: `pk_test_${btoa("example.clerk.accounts.dev$")}`, }); assert.deepStrictEqual(configuration, { appId: "com.t3tools.t3code", teamId: "ABC1234567", rpDomains: ["example.clerk.accounts.dev"], provisioningProfilePath: "/tmp/t3code.provisionprofile", }); }); it("normalizes explicit macOS passkey RP domains and renders required entitlements", () => { const configuration = resolveMacPasskeySigningConfiguration({ T3CODE_APPLE_TEAM_ID: "ABC1234567", T3CODE_MACOS_PROVISIONING_PROFILE: "/tmp/t3code.provisionprofile", T3CODE_CLERK_PASSKEY_RP_DOMAINS: " Clerk.Example.com,example.clerk.accounts.dev,clerk.example.com ", }); const entitlements = renderMacPasskeyEntitlements(configuration); assert.deepStrictEqual(configuration.rpDomains, [ "clerk.example.com", "example.clerk.accounts.dev", ]); assert.include(entitlements, "<string>ABC1234567.com.t3tools.t3code</string>"); assert.include(entitlements, "<string>webcredentials:clerk.example.com</string>"); assert.include(entitlements, "<string>webcredentials:example.clerk.accounts.dev</string>"); assert.include(entitlements, "<key>com.apple.security.cs.allow-jit</key>"); }); it("rejects incomplete macOS passkey signing configuration", () => { const captureError = (env: Readonly<Record<string, string | undefined>>) => { try { resolveMacPasskeySigningConfiguration(env); } catch (error) { return error; } return assert.fail("Expected passkey signing configuration to fail."); }; const missingProfileError = captureError({ T3CODE_APPLE_TEAM_ID: "ABC1234567", T3CODE_CLERK_PASSKEY_RP_DOMAINS: "example.clerk.accounts.dev", }); assert.instanceOf(missingProfileError, MissingMacPasskeyProvisioningProfileError); assert.equal( missingProfileError.message, "T3CODE_MACOS_PROVISIONING_PROFILE must point to an Associated Domains provisioning profile.", ); const unsafeDomain = "https://domain-user:domain-secret@example.clerk.accounts.dev/path?token=query-secret"; const invalidDomainError = captureError({ T3CODE_APPLE_TEAM_ID: "ABC1234567", T3CODE_MACOS_PROVISIONING_PROFILE: "/tmp/t3code.provisionprofile", T3CODE_CLERK_PASSKEY_RP_DOMAINS: unsafeDomain, }); assert.instanceOf(invalidDomainError, InvalidMacPasskeyRpDomainError); assert.equal(invalidDomainError.reason, "scheme-not-allowed"); assert.equal(invalidDomainError.inputLength, unsafeDomain.length); assert.equal(invalidDomainError.message, "Invalid passkey RP domain (scheme-not-allowed)."); assert.notProperty(invalidDomainError, "domain"); assert.notProperty(invalidDomainError, "cause"); const serializedInvalidDomainError = JSON.stringify(invalidDomainError); assert.notInclude(serializedInvalidDomainError, unsafeDomain); assert.notInclude(serializedInvalidDomainError, "domain-user"); assert.notInclude(serializedInvalidDomainError, "domain-secret"); assert.notInclude(serializedInvalidDomainError, "query-secret"); assert.throws( () => resolveMacPasskeySigningConfiguration({ T3CODE_APPLE_TEAM_ID: "ABC1234567", T3CODE_MACOS_PROVISIONING_PROFILE: "/tmp/t3code.provisionprofile", T3CODE_CLERK_PASSKEY_RP_DOMAINS: "example.clerk.accounts.dev:8443", }), /Invalid passkey RP domain/u, ); const invalidPublishableKeyError = captureError({ T3CODE_APPLE_TEAM_ID: "ABC1234567", T3CODE_MACOS_PROVISIONING_PROFILE: "/tmp/t3code.provisionprofile", T3CODE_CLERK_PUBLISHABLE_KEY: "pk_test_%", }); assert.instanceOf(invalidPublishableKeyError, InvalidMacPasskeyPublishableKeyError); assert.ok(invalidPublishableKeyError.cause); assert.equal(invalidPublishableKeyError.message, "T3CODE_CLERK_PUBLISHABLE_KEY is invalid."); assert.notProperty(invalidPublishableKeyError, "publishableKey"); assert.notInclude(invalidPublishableKeyError.message, "pk_test_%"); }); it("preserves known passkey signing configuration errors at the build boundary", () => { const decodingCause = new Error("publishable-key-decode-failed"); const knownError = new InvalidMacPasskeyPublishableKeyError({ cause: decodingCause }); const error = MacPasskeySigningConfigurationResolutionError.fromCause(knownError);