Skip to content

Commit f592c38

Browse files
authored
refactor: convert Flag namespace to const object with getters (#22984)
1 parent c026e25 commit f592c38

4 files changed

Lines changed: 77 additions & 137 deletions

File tree

packages/opencode/src/flag/flag.ts

Lines changed: 77 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -10,153 +10,99 @@ function falsy(key: string) {
1010
return value === "false" || value === "0"
1111
}
1212

13-
export namespace Flag {
14-
export const OTEL_EXPORTER_OTLP_ENDPOINT = process.env["OTEL_EXPORTER_OTLP_ENDPOINT"]
15-
export const OTEL_EXPORTER_OTLP_HEADERS = process.env["OTEL_EXPORTER_OTLP_HEADERS"]
13+
function number(key: string) {
14+
const value = process.env[key]
15+
if (!value) return undefined
16+
const parsed = Number(value)
17+
return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined
18+
}
19+
20+
const OPENCODE_EXPERIMENTAL = truthy("OPENCODE_EXPERIMENTAL")
21+
const OPENCODE_DISABLE_CLAUDE_CODE = truthy("OPENCODE_DISABLE_CLAUDE_CODE")
22+
const OPENCODE_DISABLE_CLAUDE_CODE_SKILLS =
23+
OPENCODE_DISABLE_CLAUDE_CODE || truthy("OPENCODE_DISABLE_CLAUDE_CODE_SKILLS")
24+
const copy = process.env["OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"]
25+
26+
export const Flag = {
27+
OTEL_EXPORTER_OTLP_ENDPOINT: process.env["OTEL_EXPORTER_OTLP_ENDPOINT"],
28+
OTEL_EXPORTER_OTLP_HEADERS: process.env["OTEL_EXPORTER_OTLP_HEADERS"],
1629

17-
export const OPENCODE_AUTO_SHARE = truthy("OPENCODE_AUTO_SHARE")
18-
export const OPENCODE_AUTO_HEAP_SNAPSHOT = truthy("OPENCODE_AUTO_HEAP_SNAPSHOT")
19-
export const OPENCODE_GIT_BASH_PATH = process.env["OPENCODE_GIT_BASH_PATH"]
20-
export const OPENCODE_CONFIG = process.env["OPENCODE_CONFIG"]
21-
export declare const OPENCODE_PURE: boolean
22-
export declare const OPENCODE_TUI_CONFIG: string | undefined
23-
export declare const OPENCODE_CONFIG_DIR: string | undefined
24-
export declare const OPENCODE_PLUGIN_META_FILE: string | undefined
25-
export const OPENCODE_CONFIG_CONTENT = process.env["OPENCODE_CONFIG_CONTENT"]
26-
export const OPENCODE_DISABLE_AUTOUPDATE = truthy("OPENCODE_DISABLE_AUTOUPDATE")
27-
export const OPENCODE_ALWAYS_NOTIFY_UPDATE = truthy("OPENCODE_ALWAYS_NOTIFY_UPDATE")
28-
export const OPENCODE_DISABLE_PRUNE = truthy("OPENCODE_DISABLE_PRUNE")
29-
export const OPENCODE_DISABLE_TERMINAL_TITLE = truthy("OPENCODE_DISABLE_TERMINAL_TITLE")
30-
export const OPENCODE_SHOW_TTFD = truthy("OPENCODE_SHOW_TTFD")
31-
export const OPENCODE_PERMISSION = process.env["OPENCODE_PERMISSION"]
32-
export const OPENCODE_DISABLE_DEFAULT_PLUGINS = truthy("OPENCODE_DISABLE_DEFAULT_PLUGINS")
33-
export const OPENCODE_DISABLE_LSP_DOWNLOAD = truthy("OPENCODE_DISABLE_LSP_DOWNLOAD")
34-
export const OPENCODE_ENABLE_EXPERIMENTAL_MODELS = truthy("OPENCODE_ENABLE_EXPERIMENTAL_MODELS")
35-
export const OPENCODE_DISABLE_AUTOCOMPACT = truthy("OPENCODE_DISABLE_AUTOCOMPACT")
36-
export const OPENCODE_DISABLE_MODELS_FETCH = truthy("OPENCODE_DISABLE_MODELS_FETCH")
37-
export const OPENCODE_DISABLE_MOUSE = truthy("OPENCODE_DISABLE_MOUSE")
38-
export const OPENCODE_DISABLE_CLAUDE_CODE = truthy("OPENCODE_DISABLE_CLAUDE_CODE")
39-
export const OPENCODE_DISABLE_CLAUDE_CODE_PROMPT =
40-
OPENCODE_DISABLE_CLAUDE_CODE || truthy("OPENCODE_DISABLE_CLAUDE_CODE_PROMPT")
41-
export const OPENCODE_DISABLE_CLAUDE_CODE_SKILLS =
42-
OPENCODE_DISABLE_CLAUDE_CODE || truthy("OPENCODE_DISABLE_CLAUDE_CODE_SKILLS")
43-
export const OPENCODE_DISABLE_EXTERNAL_SKILLS =
44-
OPENCODE_DISABLE_CLAUDE_CODE_SKILLS || truthy("OPENCODE_DISABLE_EXTERNAL_SKILLS")
45-
export declare const OPENCODE_DISABLE_PROJECT_CONFIG: boolean
46-
export const OPENCODE_FAKE_VCS = process.env["OPENCODE_FAKE_VCS"]
47-
export declare const OPENCODE_CLIENT: string
48-
export const OPENCODE_SERVER_PASSWORD = process.env["OPENCODE_SERVER_PASSWORD"]
49-
export const OPENCODE_SERVER_USERNAME = process.env["OPENCODE_SERVER_USERNAME"]
50-
export const OPENCODE_ENABLE_QUESTION_TOOL = truthy("OPENCODE_ENABLE_QUESTION_TOOL")
30+
OPENCODE_AUTO_SHARE: truthy("OPENCODE_AUTO_SHARE"),
31+
OPENCODE_AUTO_HEAP_SNAPSHOT: truthy("OPENCODE_AUTO_HEAP_SNAPSHOT"),
32+
OPENCODE_GIT_BASH_PATH: process.env["OPENCODE_GIT_BASH_PATH"],
33+
OPENCODE_CONFIG: process.env["OPENCODE_CONFIG"],
34+
OPENCODE_CONFIG_CONTENT: process.env["OPENCODE_CONFIG_CONTENT"],
35+
OPENCODE_DISABLE_AUTOUPDATE: truthy("OPENCODE_DISABLE_AUTOUPDATE"),
36+
OPENCODE_ALWAYS_NOTIFY_UPDATE: truthy("OPENCODE_ALWAYS_NOTIFY_UPDATE"),
37+
OPENCODE_DISABLE_PRUNE: truthy("OPENCODE_DISABLE_PRUNE"),
38+
OPENCODE_DISABLE_TERMINAL_TITLE: truthy("OPENCODE_DISABLE_TERMINAL_TITLE"),
39+
OPENCODE_SHOW_TTFD: truthy("OPENCODE_SHOW_TTFD"),
40+
OPENCODE_PERMISSION: process.env["OPENCODE_PERMISSION"],
41+
OPENCODE_DISABLE_DEFAULT_PLUGINS: truthy("OPENCODE_DISABLE_DEFAULT_PLUGINS"),
42+
OPENCODE_DISABLE_LSP_DOWNLOAD: truthy("OPENCODE_DISABLE_LSP_DOWNLOAD"),
43+
OPENCODE_ENABLE_EXPERIMENTAL_MODELS: truthy("OPENCODE_ENABLE_EXPERIMENTAL_MODELS"),
44+
OPENCODE_DISABLE_AUTOCOMPACT: truthy("OPENCODE_DISABLE_AUTOCOMPACT"),
45+
OPENCODE_DISABLE_MODELS_FETCH: truthy("OPENCODE_DISABLE_MODELS_FETCH"),
46+
OPENCODE_DISABLE_MOUSE: truthy("OPENCODE_DISABLE_MOUSE"),
47+
OPENCODE_DISABLE_CLAUDE_CODE,
48+
OPENCODE_DISABLE_CLAUDE_CODE_PROMPT: OPENCODE_DISABLE_CLAUDE_CODE || truthy("OPENCODE_DISABLE_CLAUDE_CODE_PROMPT"),
49+
OPENCODE_DISABLE_CLAUDE_CODE_SKILLS,
50+
OPENCODE_DISABLE_EXTERNAL_SKILLS: OPENCODE_DISABLE_CLAUDE_CODE_SKILLS || truthy("OPENCODE_DISABLE_EXTERNAL_SKILLS"),
51+
OPENCODE_FAKE_VCS: process.env["OPENCODE_FAKE_VCS"],
52+
OPENCODE_SERVER_PASSWORD: process.env["OPENCODE_SERVER_PASSWORD"],
53+
OPENCODE_SERVER_USERNAME: process.env["OPENCODE_SERVER_USERNAME"],
54+
OPENCODE_ENABLE_QUESTION_TOOL: truthy("OPENCODE_ENABLE_QUESTION_TOOL"),
5155

5256
// Experimental
53-
export const OPENCODE_EXPERIMENTAL = truthy("OPENCODE_EXPERIMENTAL")
54-
export const OPENCODE_EXPERIMENTAL_FILEWATCHER = Config.boolean("OPENCODE_EXPERIMENTAL_FILEWATCHER").pipe(
57+
OPENCODE_EXPERIMENTAL,
58+
OPENCODE_EXPERIMENTAL_FILEWATCHER: Config.boolean("OPENCODE_EXPERIMENTAL_FILEWATCHER").pipe(
5559
Config.withDefault(false),
56-
)
57-
export const OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER = Config.boolean(
58-
"OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER",
59-
).pipe(Config.withDefault(false))
60-
export const OPENCODE_EXPERIMENTAL_ICON_DISCOVERY =
61-
OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_ICON_DISCOVERY")
62-
63-
const copy = process.env["OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"]
64-
export const OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT =
65-
copy === undefined ? process.platform === "win32" : truthy("OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT")
66-
export const OPENCODE_ENABLE_EXA =
67-
truthy("OPENCODE_ENABLE_EXA") || OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_EXA")
68-
export const OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS = number("OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS")
69-
export const OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX = number("OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX")
70-
export const OPENCODE_EXPERIMENTAL_OXFMT = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_OXFMT")
71-
export const OPENCODE_EXPERIMENTAL_LSP_TY = truthy("OPENCODE_EXPERIMENTAL_LSP_TY")
72-
export const OPENCODE_EXPERIMENTAL_LSP_TOOL = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_LSP_TOOL")
73-
export const OPENCODE_DISABLE_FILETIME_CHECK = Config.boolean("OPENCODE_DISABLE_FILETIME_CHECK").pipe(
60+
),
61+
OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: Config.boolean("OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER").pipe(
7462
Config.withDefault(false),
75-
)
76-
export const OPENCODE_EXPERIMENTAL_PLAN_MODE = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_PLAN_MODE")
77-
export const OPENCODE_EXPERIMENTAL_MARKDOWN = !falsy("OPENCODE_EXPERIMENTAL_MARKDOWN")
78-
export const OPENCODE_MODELS_URL = process.env["OPENCODE_MODELS_URL"]
79-
export const OPENCODE_MODELS_PATH = process.env["OPENCODE_MODELS_PATH"]
80-
export const OPENCODE_DISABLE_EMBEDDED_WEB_UI = truthy("OPENCODE_DISABLE_EMBEDDED_WEB_UI")
81-
export const OPENCODE_DB = process.env["OPENCODE_DB"]
82-
export const OPENCODE_DISABLE_CHANNEL_DB = truthy("OPENCODE_DISABLE_CHANNEL_DB")
83-
export const OPENCODE_SKIP_MIGRATIONS = truthy("OPENCODE_SKIP_MIGRATIONS")
84-
export const OPENCODE_STRICT_CONFIG_DEPS = truthy("OPENCODE_STRICT_CONFIG_DEPS")
85-
86-
export const OPENCODE_WORKSPACE_ID = process.env["OPENCODE_WORKSPACE_ID"]
87-
export const OPENCODE_EXPERIMENTAL_HTTPAPI = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_HTTPAPI")
88-
export const OPENCODE_EXPERIMENTAL_WORKSPACES = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_WORKSPACES")
63+
),
64+
OPENCODE_EXPERIMENTAL_ICON_DISCOVERY: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_ICON_DISCOVERY"),
65+
OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT:
66+
copy === undefined ? process.platform === "win32" : truthy("OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"),
67+
OPENCODE_ENABLE_EXA: truthy("OPENCODE_ENABLE_EXA") || OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_EXA"),
68+
OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: number("OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS"),
69+
OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: number("OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX"),
70+
OPENCODE_EXPERIMENTAL_OXFMT: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_OXFMT"),
71+
OPENCODE_EXPERIMENTAL_LSP_TY: truthy("OPENCODE_EXPERIMENTAL_LSP_TY"),
72+
OPENCODE_EXPERIMENTAL_LSP_TOOL: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_LSP_TOOL"),
73+
OPENCODE_DISABLE_FILETIME_CHECK: Config.boolean("OPENCODE_DISABLE_FILETIME_CHECK").pipe(Config.withDefault(false)),
74+
OPENCODE_EXPERIMENTAL_PLAN_MODE: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_PLAN_MODE"),
75+
OPENCODE_EXPERIMENTAL_MARKDOWN: !falsy("OPENCODE_EXPERIMENTAL_MARKDOWN"),
76+
OPENCODE_MODELS_URL: process.env["OPENCODE_MODELS_URL"],
77+
OPENCODE_MODELS_PATH: process.env["OPENCODE_MODELS_PATH"],
78+
OPENCODE_DISABLE_EMBEDDED_WEB_UI: truthy("OPENCODE_DISABLE_EMBEDDED_WEB_UI"),
79+
OPENCODE_DB: process.env["OPENCODE_DB"],
80+
OPENCODE_DISABLE_CHANNEL_DB: truthy("OPENCODE_DISABLE_CHANNEL_DB"),
81+
OPENCODE_SKIP_MIGRATIONS: truthy("OPENCODE_SKIP_MIGRATIONS"),
82+
OPENCODE_STRICT_CONFIG_DEPS: truthy("OPENCODE_STRICT_CONFIG_DEPS"),
8983

90-
function number(key: string) {
91-
const value = process.env[key]
92-
if (!value) return undefined
93-
const parsed = Number(value)
94-
return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined
95-
}
96-
}
84+
OPENCODE_WORKSPACE_ID: process.env["OPENCODE_WORKSPACE_ID"],
85+
OPENCODE_EXPERIMENTAL_HTTPAPI: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_HTTPAPI"),
86+
OPENCODE_EXPERIMENTAL_WORKSPACES: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_WORKSPACES"),
9787

98-
// Dynamic getter for OPENCODE_DISABLE_PROJECT_CONFIG
99-
// This must be evaluated at access time, not module load time,
100-
// because external tooling may set this env var at runtime
101-
Object.defineProperty(Flag, "OPENCODE_DISABLE_PROJECT_CONFIG", {
102-
get() {
88+
// Evaluated at access time (not module load) because tests, the CLI, and
89+
// external tooling set these env vars at runtime.
90+
get OPENCODE_DISABLE_PROJECT_CONFIG() {
10391
return truthy("OPENCODE_DISABLE_PROJECT_CONFIG")
10492
},
105-
enumerable: true,
106-
configurable: false,
107-
})
108-
109-
// Dynamic getter for OPENCODE_TUI_CONFIG
110-
// This must be evaluated at access time, not module load time,
111-
// because tests and external tooling may set this env var at runtime
112-
Object.defineProperty(Flag, "OPENCODE_TUI_CONFIG", {
113-
get() {
93+
get OPENCODE_TUI_CONFIG() {
11494
return process.env["OPENCODE_TUI_CONFIG"]
11595
},
116-
enumerable: true,
117-
configurable: false,
118-
})
119-
120-
// Dynamic getter for OPENCODE_CONFIG_DIR
121-
// This must be evaluated at access time, not module load time,
122-
// because external tooling may set this env var at runtime
123-
Object.defineProperty(Flag, "OPENCODE_CONFIG_DIR", {
124-
get() {
96+
get OPENCODE_CONFIG_DIR() {
12597
return process.env["OPENCODE_CONFIG_DIR"]
12698
},
127-
enumerable: true,
128-
configurable: false,
129-
})
130-
131-
// Dynamic getter for OPENCODE_PURE
132-
// This must be evaluated at access time, not module load time,
133-
// because the CLI can set this flag at runtime
134-
Object.defineProperty(Flag, "OPENCODE_PURE", {
135-
get() {
99+
get OPENCODE_PURE() {
136100
return truthy("OPENCODE_PURE")
137101
},
138-
enumerable: true,
139-
configurable: false,
140-
})
141-
142-
// Dynamic getter for OPENCODE_PLUGIN_META_FILE
143-
// This must be evaluated at access time, not module load time,
144-
// because tests and external tooling may set this env var at runtime
145-
Object.defineProperty(Flag, "OPENCODE_PLUGIN_META_FILE", {
146-
get() {
102+
get OPENCODE_PLUGIN_META_FILE() {
147103
return process.env["OPENCODE_PLUGIN_META_FILE"]
148104
},
149-
enumerable: true,
150-
configurable: false,
151-
})
152-
153-
// Dynamic getter for OPENCODE_CLIENT
154-
// This must be evaluated at access time, not module load time,
155-
// because some commands override the client at runtime
156-
Object.defineProperty(Flag, "OPENCODE_CLIENT", {
157-
get() {
105+
get OPENCODE_CLIENT() {
158106
return process.env["OPENCODE_CLIENT"] ?? "cli"
159107
},
160-
enumerable: true,
161-
configurable: false,
162-
})
108+
}

packages/opencode/test/plugin/workspace-adaptor.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ const { Instance } = await import("../../src/project/instance")
1414

1515
const experimental = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES
1616

17-
// @ts-expect-error tests override the flag directly
1817
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true
1918

2019
afterEach(async () => {
@@ -28,7 +27,6 @@ afterAll(() => {
2827
process.env.OPENCODE_DISABLE_DEFAULT_PLUGINS = disableDefault
2928
}
3029

31-
// @ts-expect-error restore original test flag value
3230
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = experimental
3331
})
3432

packages/opencode/test/sync/index.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@ const original = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES
1515
beforeEach(() => {
1616
Database.close()
1717

18-
// @ts-expect-error don't do this normally, but it works
1918
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true
2019
})
2120

2221
afterEach(() => {
23-
// @ts-expect-error don't do this normally, but it works
2422
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = original
2523
})
2624

packages/opencode/test/workspace/workspace-restore.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@ const original = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES
2525

2626
beforeEach(() => {
2727
Database.close()
28-
// @ts-expect-error test override
2928
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true
3029
})
3130

3231
afterEach(async () => {
3332
mock.restore()
3433
await Instance.disposeAll()
35-
// @ts-expect-error test override
3634
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = original
3735
await resetDatabase()
3836
})

0 commit comments

Comments
 (0)