#!/usr/bin/env node import * as NodeRuntime from "@effect/platform-node/NodeRuntime"; import * as NodeServices from "@effect/platform-node/NodeServices"; import * as Effect from "effect/Effect"; import * as FileSystem from "effect/FileSystem"; import * as Option from "effect/Option"; import * as Path from "effect/Path"; import { Argument, Command, Flag } from "effect/unstable/cli"; import { resolveWebAssetBrandForChannel, resolveWebIconOverrides, WEB_ASSET_CHANNELS, type WebAssetBrand, } from "./lib/brand-assets.ts"; const WEB_ASSET_BRANDS = [ "development", "nightly", "production", ] as const satisfies ReadonlyArray; export const applyWebBrandAssets = Effect.fn("applyWebBrandAssets")(function* ( brand: WebAssetBrand, targetDirectory: string, ) { const fs = yield* FileSystem.FileSystem; const path = yield* Path.Path; const repoRoot = yield* path.fromFileUrl(new URL("..", import.meta.url)); yield* Effect.forEach( resolveWebIconOverrides(brand, targetDirectory), (override) => fs.copyFile( path.join(repoRoot, override.sourceRelativePath), path.join(repoRoot, override.targetRelativePath), ), { concurrency: "unbounded" }, ); }); export const applyWebBrandAssetsCommand = Command.make( "apply-web-brand-assets", { brand: Argument.choice("brand", WEB_ASSET_BRANDS).pipe( Argument.withDescription("Asset brand to copy into the hosted web output directory."), Argument.optional, ), channel: Flag.choice("channel", WEB_ASSET_CHANNELS).pipe( Flag.withDescription("Hosted release channel to map to a web asset brand."), Flag.optional, ), targetDirectory: Argument.string("target-directory").pipe( Argument.withDescription("Output directory that contains the hosted web build assets."), Argument.optional, ), }, ({ brand, channel, targetDirectory }) => applyWebBrandAssets( Option.getOrElse(brand, () => Option.match(channel, { onNone: () => "production" as const, onSome: resolveWebAssetBrandForChannel, }), ), Option.getOrElse(targetDirectory, () => "apps/web/dist"), ), ).pipe(Command.withDescription("Copy web brand assets into a built hosted web app.")); if (import.meta.main) { Command.run(applyWebBrandAssetsCommand, { version: "0.0.0" }).pipe( Effect.provide(NodeServices.layer), NodeRuntime.runMain, ); }