everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
71 lines (69 loc) • 3.14 kB
JavaScript
import { MISSING_CONFIG_MESSAGE } from "../resolution/load.mjs";
import { openResolution } from "../resolution/session.mjs";
import { ProjectEnvLive } from "../../env/project-env.mjs";
import { PortAllocatorLive } from "../../infra/ports.mjs";
import { resolveLogLevel, toEffectLogLevel } from "./logs.mjs";
import { devBootstrap } from "./boot.mjs";
import { startBootstrap } from "../start/boot.mjs";
import { Context, Effect, Layer, References } from "effect";
import process from "node:process";
//#region src/services/dev/flow.ts
const bootstrapLayers = Layer.mergeAll(ProjectEnvLive, PortAllocatorLive);
var DevFlowService = class DevFlowService extends Context.Service()("bos/DevFlowService") {
static Live = Layer.succeed(DevFlowService, DevFlowService.of({
dev: (session, input) => Effect.gen(function* () {
const devTimings = [];
const outcome = yield* devBootstrap({ session }, input, devTimings).pipe(Effect.provideService(References.MinimumLogLevel, toEffectLogLevel(resolveLogLevel(process.env, input.logLevel))), Effect.provide(bootstrapLayers), Effect.catchTags({
DevConfigMissing: () => Effect.succeed({ failed: MISSING_CONFIG_MESSAGE }),
DevProxyMissing: () => Effect.succeed({ failed: "No valid proxy URL configured in the authored config" }),
DevPreflightFailed: (error) => Effect.succeed({ failed: `Infra preflight failed: ${error.messages.join("; ")}` })
}));
if ("failed" in outcome) return {
status: "error",
description: outcome.failed,
processes: [],
timings: devTimings
};
return {
status: "started",
description: outcome.description,
processes: outcome.processes,
timings: devTimings,
session: outcome.session
};
}),
start: (session, input) => Effect.gen(function* () {
let activeSession = session;
if (input.configPath) {
const override = yield* Effect.promise(() => openResolution({ path: input.configPath }));
if (!override) return {
status: "error",
url: "",
error: `No config found at ${input.configPath}`
};
activeSession = override;
}
const outcome = yield* startBootstrap({ session: activeSession }, input).pipe(Effect.provide(bootstrapLayers), Effect.catchTags({
StartRemoteConfigMissing: (error) => Effect.succeed({ failed: error.message }),
StartFetchFailed: (error) => Effect.succeed({ failed: error.message }),
StartConfigMissing: () => Effect.succeed({ failed: "No configuration found. Provide --account and --gateway flags, or create a local authored config (bos.app.ts or bos.config.json)." }),
InfraError: (error) => Effect.succeed({ failed: `${error.phase}: ${error.message}` }),
DevStepError: (error) => Effect.succeed({ failed: `${error.phase} failed: ${error.cause instanceof Error ? error.cause.message : String(error.cause)}` })
}));
if ("failed" in outcome) return {
status: "error",
url: "",
error: outcome.failed
};
return {
status: "running",
url: outcome.url,
session: outcome.session,
summary: outcome.summary
};
})
}));
};
//#endregion
export { DevFlowService };
//# sourceMappingURL=flow.mjs.map