diff --git a/packages/backend/src/global/DependencyService.ts b/packages/backend/src/global/DependencyService.ts new file mode 100644 index 0000000000..5d0e4fc71c --- /dev/null +++ b/packages/backend/src/global/DependencyService.ts @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import nodePath from 'node:path'; +import nodeFs from 'node:fs'; +import { Injectable } from '@nestjs/common'; +import { CacheManagementService, type ManagedMemoryKVCache } from '@/global/CacheManagementService.js'; +import { bindThis } from '@/decorators.js'; + +@Injectable() +export class DependencyService { + protected readonly dependencyVersionCache: ManagedMemoryKVCache; + + constructor(cacheManagementService: CacheManagementService) { + this.dependencyVersionCache = cacheManagementService.createMemoryKVCache(Infinity); + } + + /** + * Returns the installed version of a given dependency, or null if not installed. + */ + @bindThis + public async getDependencyVersion(dependency: string): Promise { + return await this.dependencyVersionCache.fetch(dependency, async () => { + const packageJsonPath = nodePath.join(import.meta.dirname, '../../package.json'); + const packageJsonText = nodeFs.readFileSync(packageJsonPath, 'utf8'); + + // No "dependencies" section -> infer not installed. + const packageJson = JSON.parse(packageJsonText) as { dependencies?: Partial> }; + if (packageJson.dependencies == null) return null; + + // Not listed -> not installed. + const version = packageJson.dependencies['mfm-js']; + if (version == null) return null; + + // Just in case some other value is there + return String(version); + }); + } +} diff --git a/packages/backend/src/global/EnvService.ts b/packages/backend/src/global/EnvService.ts index a638c20292..bb73ff57f9 100644 --- a/packages/backend/src/global/EnvService.ts +++ b/packages/backend/src/global/EnvService.ts @@ -3,25 +3,15 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import nodePath from 'node:path'; -import nodeFs from 'node:fs'; import { Injectable } from '@nestjs/common'; -import { bindThis } from '@/decorators.js'; -import { type ManagedMemoryKVCache, CacheManagementService } from '@/global/CacheManagementService.js'; -import { type EnvOption, createEnvOptions } from '@/env.js'; +import { createEnvOptions, type EnvOption } from '@/env.js'; /** * Provides structured, mockable access to runtime/environment details. */ @Injectable() export class EnvService { - protected readonly dependencyVersionCache: ManagedMemoryKVCache; - protected readonly envOptions: EnvOption; - - constructor(cacheManagementService: CacheManagementService) { - this.dependencyVersionCache = cacheManagementService.createMemoryKVCache(Infinity); - this.envOptions = createEnvOptions(() => this.env); - } + protected readonly envOptions: EnvOption = createEnvOptions(() => this.env); /** * Returns the environment variables of the process. @@ -38,26 +28,4 @@ export class EnvService { public get options(): EnvOption { return this.envOptions; } - - /** - * Returns the installed version of a given dependency, or null if not installed. - */ - @bindThis - public async getDependencyVersion(dependency: string): Promise { - return await this.dependencyVersionCache.fetch(dependency, async () => { - const packageJsonPath = nodePath.join(import.meta.dirname, '../../package.json'); - const packageJsonText = nodeFs.readFileSync(packageJsonPath, 'utf8'); - - // No "dependencies" section -> infer not installed. - const packageJson = JSON.parse(packageJsonText) as { dependencies?: Partial> }; - if (packageJson.dependencies == null) return null; - - // Not listed -> not installed. - const version = packageJson.dependencies['mfm-js']; - if (version == null) return null; - - // Just in case some other value is there - return String(version); - }); - } }