Config is now loaded eagerly during project bootstrap so users can see config loading in traces during startup. This helps diagnose configuration issues earlier in the initialization flow. NPM installation logic has been refactored with a unified reify function and improved InstallFailedError that includes both the packages being installed and the target directory. This provides users with complete context when package installations fail, making it easier to identify which dependency or project directory caused the issue.
43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
import { Plugin } from "../plugin"
|
|
import { Format } from "../format"
|
|
import { LSP } from "../lsp"
|
|
import { File } from "../file"
|
|
import { Snapshot } from "../snapshot"
|
|
import * as Project from "./project"
|
|
import * as Vcs from "./vcs"
|
|
import { Bus } from "../bus"
|
|
import { Command } from "../command"
|
|
import { Instance } from "./instance"
|
|
import { Log } from "@/util"
|
|
import { FileWatcher } from "@/file/watcher"
|
|
import { ShareNext } from "@/share"
|
|
import * as Effect from "effect/Effect"
|
|
import { Config } from "@/config"
|
|
|
|
export const InstanceBootstrap = Effect.gen(function* () {
|
|
Log.Default.info("bootstrapping", { directory: Instance.directory })
|
|
// everything depends on config so eager load it for nice traces
|
|
yield* Config.Service.use((svc) => svc.get())
|
|
// Plugin can mutate config so it has to be initialized before anything else.
|
|
yield* Plugin.Service.use((svc) => svc.init())
|
|
yield* Effect.all(
|
|
[
|
|
LSP.Service,
|
|
ShareNext.Service,
|
|
Format.Service,
|
|
File.Service,
|
|
FileWatcher.Service,
|
|
Vcs.Service,
|
|
Snapshot.Service,
|
|
].map((s) => Effect.forkDetach(s.use((i) => i.init()))),
|
|
).pipe(Effect.withSpan("InstanceBootstrap.init"))
|
|
|
|
yield* Bus.Service.use((svc) =>
|
|
svc.subscribeCallback(Command.Event.Executed, async (payload) => {
|
|
if (payload.properties.name === Command.Default.INIT) {
|
|
Project.setInitialized(Instance.project.id)
|
|
}
|
|
}),
|
|
)
|
|
}).pipe(Effect.withSpan("InstanceBootstrap"))
|