From f83a40310672b1ca57d951b047e485301eb4a8bb Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Tue, 7 Oct 2025 23:13:22 -0400 Subject: [PATCH] implement EnvService.getDependencyVersion --- packages/backend/src/core/EnvService.ts | 40 ++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/core/EnvService.ts b/packages/backend/src/core/EnvService.ts index 8cc3b95735..29d3e78568 100644 --- a/packages/backend/src/core/EnvService.ts +++ b/packages/backend/src/core/EnvService.ts @@ -3,18 +3,50 @@ * 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 '@/core/CacheManagementService.js'; /** - * Provides access to the process environment variables. - * This exists for testing purposes, so that a test can mock the environment without corrupting state for other tests. + * Provides structured, mockable access to runtime/environment details. */ @Injectable() export class EnvService { + protected readonly dependencyVersionCache: ManagedMemoryKVCache; + + constructor(cacheManagementService: CacheManagementService) { + this.dependencyVersionCache = cacheManagementService.createMemoryKVCache(Infinity); + } + /** - * Passthrough to process.env + * Returns the environment variables of the process. + * Can be modified, but modifications are not reflected to the operating system environment. */ - public get env() { + public get env(): Partial> { return process.env; } + + /** + * 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); + }); + } }