summaryrefslogtreecommitdiffhomepage
path: root/packages/shared/src/global.ts
blob: 538cc091b5342896d70785cd487a8a42f155c02d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import path from "path"
import { xdgData, xdgCache, xdgConfig, xdgState } from "xdg-basedir"
import os from "os"
import { Context, Effect, Layer } from "effect"

export namespace Global {
  export class Service extends Context.Service<Service, Interface>()("@opencode/Global") {}

  export interface Interface {
    readonly home: string
    readonly data: string
    readonly cache: string
    readonly config: string
    readonly state: string
    readonly bin: string
    readonly log: string
  }

  export const layer = Layer.effect(
    Service,
    Effect.gen(function* () {
      const app = "opencode"
      const home = process.env.OPENCODE_TEST_HOME ?? os.homedir()
      const data = path.join(xdgData!, app)
      const cache = path.join(xdgCache!, app)
      const cfg = path.join(xdgConfig!, app)
      const state = path.join(xdgState!, app)
      const bin = path.join(cache, "bin")
      const log = path.join(data, "log")

      return Service.of({
        home,
        data,
        cache,
        config: cfg,
        state,
        bin,
        log,
      })
    }),
  )
}