mirror of
https://github.com/cdr/code-server.git
synced 2025-12-13 03:43:22 +01:00
Mostly because express-serve-static-core is an implicit dependency. We could make it explicit, but the type we imported from it is just an alias for qs.ParsedQs anyway.
56 lines
1.4 KiB
TypeScript
56 lines
1.4 KiB
TypeScript
import { logger } from "@coder/logger"
|
|
import type { ParsedQs } from "qs"
|
|
import { promises as fs } from "fs"
|
|
|
|
export type Settings = { [key: string]: Settings | string | boolean | number }
|
|
|
|
/**
|
|
* Provides read and write access to settings.
|
|
*/
|
|
export class SettingsProvider<T> {
|
|
public constructor(private readonly settingsPath: string) {}
|
|
|
|
/**
|
|
* Read settings from the file. On a failure return last known settings and
|
|
* log a warning.
|
|
*/
|
|
public async read(): Promise<T> {
|
|
try {
|
|
const raw = (await fs.readFile(this.settingsPath, "utf8")).trim()
|
|
return raw ? JSON.parse(raw) : ({} as T)
|
|
} catch (error: any) {
|
|
if (error.code !== "ENOENT") {
|
|
logger.warn(error.message)
|
|
}
|
|
}
|
|
return {} as T
|
|
}
|
|
|
|
/**
|
|
* Write settings combined with current settings. On failure log a warning.
|
|
* Settings will be merged shallowly.
|
|
*/
|
|
public async write(settings: Partial<T>): Promise<void> {
|
|
try {
|
|
const oldSettings = await this.read()
|
|
const nextSettings = { ...oldSettings, ...settings }
|
|
await fs.writeFile(this.settingsPath, JSON.stringify(nextSettings, null, 2))
|
|
} catch (error: any) {
|
|
logger.warn(error.message)
|
|
}
|
|
}
|
|
}
|
|
|
|
export interface UpdateSettings {
|
|
update: {
|
|
checked: number
|
|
version: string
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Global code-server settings.
|
|
*/
|
|
export interface CoderSettings extends UpdateSettings {
|
|
query?: ParsedQs
|
|
}
|