diff --git a/drizzle.config.ts b/drizzle.config.ts index bb1c4171..4ca638ee 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,11 +1,12 @@ import 'dotenv/config'; import { defineConfig } from 'drizzle-kit'; -import { configDir, projectDir } from './src/backend/common/index.js'; +import { configDir } from './src/backend/common/index.js'; import * as path from 'path'; +import { projectRootDir } from './src/core/Atomic.ts'; export default defineConfig({ - schema: path.resolve(projectDir, 'src/backend/common/database/drizzle/schema'), - out: path.resolve(projectDir, 'src/backend/common/database/drizzle/migrations'), + schema: path.resolve(projectRootDir, 'src/backend/common/database/drizzle/schema'), + out: path.resolve(projectRootDir, 'src/backend/common/database/drizzle/migrations'), dialect: 'sqlite', dbCredentials: { url: path.resolve(configDir, 'ms.db'), diff --git a/package-lock.json b/package-lock.json index d7bb04ec..e76dd202 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,6 +54,7 @@ "discord.js": "^14.26.0", "dotenv": "^10.0.0", "drizzle-orm": "^1.0.0-rc.2-c5a84d1", + "env-paths": "^4.0.0", "express": "^5.2.1", "express-session": "^1.19.0", "fast-equals": "^6.0.0", @@ -10176,6 +10177,21 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", + "integrity": "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==", + "license": "MIT", + "dependencies": { + "is-safe-filename": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -13025,6 +13041,18 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, + "node_modules/is-safe-filename": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", + "integrity": "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-stream": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", diff --git a/package.json b/package.json index d7c37635..16b75814 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,7 @@ "discord.js": "^14.26.0", "dotenv": "^10.0.0", "drizzle-orm": "^1.0.0-rc.2-c5a84d1", + "env-paths": "^4.0.0", "express": "^5.2.1", "express-session": "^1.19.0", "fast-equals": "^6.0.0", diff --git a/src/backend/common/database/appMigrator.ts b/src/backend/common/database/appMigrator.ts index 3dd233be..8809cfbb 100644 --- a/src/backend/common/database/appMigrator.ts +++ b/src/backend/common/database/appMigrator.ts @@ -2,9 +2,9 @@ import type {DbConcrete} from "./drizzle/drizzleUtils.ts"; import { loggerNoop } from "../MaybeLogger.ts"; import * as path from 'path'; import { childLogger, type Logger } from "@foxxmd/logging"; -import { projectDir } from "../index.ts"; import { Migrator } from 'sqlite-up'; import type {MigrationStatus} from "../infrastructure/Atomic.ts"; +import { projectRootDir } from "../../../core/Atomic.ts"; export interface MigrateBaseContext { db: DbConcrete @@ -16,7 +16,7 @@ const migrationsTable = '__app_migrations'; export const getAppMigrationStatus = async (db: DbConcrete, opts: {logger?: Logger, migrationsAppFolder?: string} = {}): Promise => { const { logger: parentLogger = loggerNoop, - migrationsAppFolder = path.resolve(projectDir, 'src/backend/common/database/appMigrations') + migrationsAppFolder = path.resolve(projectRootDir, 'src/backend/common/database/appMigrations') } = opts; const logger = childLogger(parentLogger, 'App Migrations'); @@ -40,7 +40,7 @@ export const getAppMigrationStatus = async (db: DbConcrete, opts: {logger?: Logg export const migrateApp = async (db: DbConcrete, opts: {logger?: Logger, migrationsAppFolder?: string} = {}): Promise => { const { logger: parentLogger = loggerNoop, - migrationsAppFolder = path.resolve(projectDir, 'src/backend/common/database/appMigrations') + migrationsAppFolder = path.resolve(projectRootDir, 'src/backend/common/database/appMigrations') } = opts; const logger = childLogger(parentLogger, ['App', 'Migrations']); diff --git a/src/backend/common/database/drizzle/drizzleUtils.ts b/src/backend/common/database/drizzle/drizzleUtils.ts index 86986342..46252f22 100644 --- a/src/backend/common/database/drizzle/drizzleUtils.ts +++ b/src/backend/common/database/drizzle/drizzleUtils.ts @@ -8,16 +8,16 @@ import { backupDb, getDbBackupPath, MEMORY_DB_NAME } from '../Database.ts'; import { fileExists, fileOrDirectoryIsWriteable } from '../../../utils/FSUtils.ts'; import { childLogger, type Logger, type LogLevel } from '@foxxmd/logging'; import { loggerNoop } from '../../MaybeLogger.ts'; -import { projectDir } from '../../index.ts'; import { relations } from './schema/schema.ts'; import { addToContext, executeQuery } from './logContext.ts'; import { migrateApp, getAppMigrationStatus } from '../appMigrator.ts'; import type {MigrationStatus} from '../../infrastructure/Atomic.ts'; +import { projectRootDir } from '../../../../core/Atomic.ts'; export async function getDbMigrationStatus(dbVal: string | DbConcrete, opts: {logger?: Logger, migrationsFolder?: string} = {}): Promise { const { logger: parentLogger = loggerNoop, - migrationsFolder = path.resolve(projectDir, 'src/backend/common/database/drizzle/migrations') + migrationsFolder = path.resolve(projectRootDir, 'src/backend/common/database/drizzle/migrations') } = opts; const logger = childLogger(parentLogger, 'Migrations'); @@ -91,7 +91,7 @@ export const migrateDb = async (db: DbConcrete, opts: {logger?: Logger, migratio try { logger.info('Starting migrations...'); - await executeQuery('migrations', async () => migrate(db, { migrationsFolder: migrationsFolder ?? path.resolve(projectDir, 'src/backend/common/database/drizzle/migrations') }), logger, process.env.LOG_MIGRATION === 'true' ? true : 'error'); + await executeQuery('migrations', async () => migrate(db, { migrationsFolder: migrationsFolder ?? path.resolve(projectRootDir, 'src/backend/common/database/drizzle/migrations') }), logger, process.env.LOG_MIGRATION === 'true' ? true : 'error'); logger.info('Migrations complete'); } catch (e) { throw new Error('Failed to migrate database', { cause: e }); @@ -107,7 +107,7 @@ export const migrateDbSync = (db: ReturnType, opts: {logger?: Lo try { logger.info('Starting migrations...'); - migrate(db, { migrationsFolder: migrationsFolder ?? path.resolve(projectDir, 'src/backend/common/database/drizzle/migrations') }); + migrate(db, { migrationsFolder: migrationsFolder ?? path.resolve(projectRootDir, 'src/backend/common/database/drizzle/migrations') }); logger.info('Migrations complete'); } catch (e) { throw new Error('Failed to migrate database', { cause: e }); diff --git a/src/backend/common/index.ts b/src/backend/common/index.ts index 234de76d..3124a3c0 100644 --- a/src/backend/common/index.ts +++ b/src/backend/common/index.ts @@ -1,8 +1,8 @@ import * as path from 'path'; -//import {fileURLToPath} from "url"; //const __filename = fileURLToPath(import.meta.url); //const __dirname = path.dirname(__filename); export const projectDir = process.cwd(); //path.resolve(__dirname, '../../../'); export const configDir: string = process.env.CONFIG_DIR || path.resolve(projectDir, `./config`); +export const getPathFromCWD = (...relativePaths: string[]) => path.resolve(process.cwd(), ...relativePaths); \ No newline at end of file diff --git a/src/backend/server/index.ts b/src/backend/server/index.ts index 74e8b106..052eea45 100644 --- a/src/backend/server/index.ts +++ b/src/backend/server/index.ts @@ -8,14 +8,13 @@ import passport from 'passport'; import path from "path"; import qs from 'qs'; import ViteExpress from "vite-express"; -import { projectDir } from "../common/index.ts"; import { getRoot } from "../ioc.ts"; import { parseBool } from "../utils.ts"; import { getAddress } from "../utils/NetworkUtils.ts"; import { setupApi } from "./api.ts"; import type ScrobbleSources from '../sources/ScrobbleSources.ts'; import type ScrobbleClients from '../scrobblers/ScrobbleClients.ts'; -import { qsOptions } from '../../core/Atomic.ts'; +import { projectRootDir, qsOptions } from '../../core/Atomic.ts'; const app = express(); const router = Router(); @@ -79,7 +78,7 @@ export const initServer = async (parentLogger: Logger, appLoggerStream: PassThro } } - app.use('/docs', express.static(path.resolve(projectDir, `./docsite/build`))); + app.use('/docs', express.static(path.resolve(projectRootDir, `./docsite/build`))); if(process.env.USE_HASH_ROUTER === undefined) { process.env.USE_HASH_ROUTER = root.get('isSubPath').toString(); diff --git a/src/backend/tests/config/config.test.ts b/src/backend/tests/config/config.test.ts index 16a9f720..f7e71940 100644 --- a/src/backend/tests/config/config.test.ts +++ b/src/backend/tests/config/config.test.ts @@ -4,19 +4,18 @@ import asPromised from 'chai-as-promised'; import withLocalTmpDir from 'with-local-tmp-dir'; import {constants, copyFile, access} from 'node:fs/promises'; import path from "path"; -import {projectDir} from '../../common/index.ts'; import ScrobbleClients from '../../scrobblers/ScrobbleClients.ts'; import ScrobbleSources from '../../sources/ScrobbleSources.ts'; import EventEmitter from "events"; import {loggerTest} from '@foxxmd/logging'; -import { clientTypes } from "../../../core/Atomic.ts"; +import { clientTypes, projectRootDir } from "../../../core/Atomic.ts"; import { sourceTypes } from "../../../core/Atomic.ts"; import { Notifiers } from '../../notifier/Notifiers.ts'; import { difference } from '../../utils.ts'; chai.use(asPromised); -const samplePath = (name: string) => path.resolve(projectDir, 'config', `${name}.json.example`); +const samplePath = (name: string) => path.resolve(projectRootDir, 'config', `${name}.json.example`); describe('Sample Configs', function () { diff --git a/src/backend/tests/database/drizzle.test.ts b/src/backend/tests/database/drizzle.test.ts index a6a50009..dab36e0a 100644 --- a/src/backend/tests/database/drizzle.test.ts +++ b/src/backend/tests/database/drizzle.test.ts @@ -8,7 +8,6 @@ import { getDbPath } from '../../common/database/Database.ts'; import { x } from 'tinyexec'; import * as path from 'path'; import * as fs from 'fs/promises'; -import { projectDir } from '../../common/index.ts'; import { fixtureCreateComponent, fixtureCreateInput, fixtureCreatePlay } from '../utils/databaseFixtures.ts'; import { DrizzlePlayRepository, type RepositoryCreatePlayOpts } from '../../common/database/drizzle/repositories/PlayRepository.ts'; import { generatePlayWithLifecycle, generateRandomObj } from '../../../core/tests/utils/fixtures.ts'; @@ -20,6 +19,7 @@ import { transientDb } from '../utils/TransientTestUtils.ts'; import { getRoot } from '../../ioc.ts'; import { after } from 'mocha'; import { migrateApp } from '../../common/database/appMigrator.ts'; +import { projectRootDir } from '../../../core/Atomic.ts'; // would be great to push migrations directly from schema but doesn't seem supported in newest beta // https://github.com/drizzle-team/drizzle-orm/discussions/4373 @@ -50,7 +50,7 @@ describe('Migrations', function () { it('Detects pending migrations', async function () { - const allFiles = await fs.readdir(path.resolve(projectDir, 'src/backend/common/database/drizzle/migrations')); + const allFiles = await fs.readdir(path.resolve(projectRootDir, 'src/backend/common/database/drizzle/migrations')); const migrationFiles = allFiles .sort(); @@ -59,7 +59,7 @@ describe('Migrations', function () { // copy first migration await fs.mkdir('migrations'); try { - await fs.cp(path.resolve(projectDir, `src/backend/common/database/drizzle/migrations/${migrationFiles[0]}`), path.resolve('./migrations/', migrationFiles[0]), { recursive: true }); + await fs.cp(path.resolve(projectRootDir, `src/backend/common/database/drizzle/migrations/${migrationFiles[0]}`), path.resolve('./migrations/', migrationFiles[0]), { recursive: true }); const mf = path.resolve('./migrations'); const db = await getDb(':memory:'); await migrateDb(db, { migrationsFolder: mf }); @@ -71,7 +71,7 @@ describe('Migrations', function () { `${mf}`, '--custom', '--schema', - path.resolve(projectDir, 'src/backend/common/database/drizzle/schema'), + path.resolve(projectRootDir, 'src/backend/common/database/drizzle/schema'), '--dialect', 'sqlite' ], {throwOnError: true}); @@ -88,7 +88,7 @@ describe('Migrations', function () { it('Detects no pending migrations correctly', async function () { - const allFiles = await fs.readdir(path.resolve(projectDir, 'src/backend/common/database/drizzle/migrations')); + const allFiles = await fs.readdir(path.resolve(projectRootDir, 'src/backend/common/database/drizzle/migrations')); const migrationFiles = allFiles .sort(); @@ -97,7 +97,7 @@ describe('Migrations', function () { // copy first migration await fs.mkdir('migrations'); try { - await fs.cp(path.resolve(projectDir, `src/backend/common/database/drizzle/migrations/${migrationFiles[0]}`), path.resolve('./migrations/', migrationFiles[0]), { recursive: true }); + await fs.cp(path.resolve(projectRootDir, `src/backend/common/database/drizzle/migrations/${migrationFiles[0]}`), path.resolve('./migrations/', migrationFiles[0]), { recursive: true }); const mf = path.resolve('./migrations'); const db = await getDb(':memory:'); await migrateDb(db, { migrationsFolder: mf }); @@ -113,7 +113,7 @@ describe('Migrations', function () { it('Backs up database when migrations are pending', async function () { - const allFiles = await fs.readdir(path.resolve(projectDir, 'src/backend/common/database/drizzle/migrations')); + const allFiles = await fs.readdir(path.resolve(projectRootDir, 'src/backend/common/database/drizzle/migrations')); const migrationFiles = allFiles .sort(); @@ -123,7 +123,7 @@ describe('Migrations', function () { // copy first migration await fs.mkdir('migrations'); try { - await fs.cp(path.resolve(projectDir, `src/backend/common/database/drizzle/migrations/${migrationFiles[0]}`), path.resolve('./migrations/', migrationFiles[0]), { recursive: true }); + await fs.cp(path.resolve(projectRootDir, `src/backend/common/database/drizzle/migrations/${migrationFiles[0]}`), path.resolve('./migrations/', migrationFiles[0]), { recursive: true }); const mf = path.resolve('./migrations'); const [db, _] = await getMigratedDb(dbPath, {migrationsFolder: mf}); await migrateDb(db, { migrationsFolder: mf }); @@ -135,7 +135,7 @@ describe('Migrations', function () { `${mf}`, '--custom', '--schema', - path.resolve(projectDir, 'src/backend/common/database/drizzle/schema'), + path.resolve(projectRootDir, 'src/backend/common/database/drizzle/schema'), '--dialect', 'sqlite' ], {throwOnError: true}); @@ -742,7 +742,7 @@ describe('App Migrations', function() { ] await repo.createPlays(playData); - await migrateApp(db, {migrationsAppFolder: path.resolve(projectDir, `src/backend/tests/database/testAppMigrations`)}); + await migrateApp(db, {migrationsAppFolder: path.resolve(projectRootDir, `src/backend/tests/database/testAppMigrations`)}); const plays = await repo.findPlays({}); diff --git a/src/backend/tests/musicbrainz/musicbrainz.test.ts b/src/backend/tests/musicbrainz/musicbrainz.test.ts index 2aeb5b5c..b2ecfa34 100644 --- a/src/backend/tests/musicbrainz/musicbrainz.test.ts +++ b/src/backend/tests/musicbrainz/musicbrainz.test.ts @@ -7,7 +7,7 @@ import { initMemoryCache } from "../../common/Cache.ts"; import { Cacheable } from "cacheable"; import MusicbrainzTransformer, { DEFAULT_SEARCHTYPE_ORDER, type MusicbrainzTransformerDataStage } from "../../common/transforms/MusicbrainzTransformer.ts"; import { DEFAULT_MISSING_TYPES, type PlayObject } from "../../../core/Atomic.ts"; -import { projectDir } from '../../common/index.ts'; +import { getPathFromCWD } from '../../common/index.ts'; import path from 'path'; import type {MusicbrainzApiConfigData} from '../../common/infrastructure/Atomic.ts'; import { MockNetworkError, withRequestInterception } from '../utils/networking.ts'; @@ -19,7 +19,7 @@ import { artistNamesToCredits, artistNameToCredit } from '../../../core/StringUt chai.use(asPromised); -const envPath = path.join(projectDir, '.env'); +const envPath = path.join(getPathFromCWD(), '.env'); dotenv.config({ path: envPath }); const memorycache = () => new Cacheable({ primary: initMemoryCache({ ttl: '1ms' }) }); diff --git a/src/backend/tests/sonos/sonos.test.ts b/src/backend/tests/sonos/sonos.test.ts index 879f99dc..a752f41c 100644 --- a/src/backend/tests/sonos/sonos.test.ts +++ b/src/backend/tests/sonos/sonos.test.ts @@ -5,9 +5,9 @@ import type {SonosData} from "../../common/infrastructure/config/source/sonos.ts import { SonosSource } from "../../sources/SonosSource.ts"; import * as dotenv from 'dotenv'; import path from 'path'; -import { projectDir } from "../../common/index.ts"; +import { getPathFromCWD } from "../../common/index.ts"; -const envPath = path.join(projectDir, '.env'); +const envPath = path.join(getPathFromCWD(), '.env'); dotenv.config({ path: envPath }); const createSource = async (data: SonosData): Promise => { diff --git a/src/backend/utils/SchemaAppStaticUtils.ts b/src/backend/utils/SchemaAppStaticUtils.ts index 21c2ce68..f06d4dbb 100644 --- a/src/backend/utils/SchemaAppStaticUtils.ts +++ b/src/backend/utils/SchemaAppStaticUtils.ts @@ -1,16 +1,16 @@ import { writeFileSync } from "node:fs"; import { resolve } from "path"; -import { projectDir } from "../common/index.ts"; import {getTypeSchemaFromConfigGenerator} from "./SchemaUtils.ts"; import { clientInterfaces } from '../common/infrastructure/config/client/clients.ts'; import { sourceInterfaces } from '../common/infrastructure/config/source/sources.ts'; +import { projectRootDir } from "../../core/Atomic.ts"; for(const inter of sourceInterfaces) { const schema = getTypeSchemaFromConfigGenerator(inter); - writeFileSync(resolve(projectDir, `src/backend/common/schema/${inter}.json`), JSON.stringify(schema)); + writeFileSync(resolve(projectRootDir, `src/backend/common/schema/${inter}.json`), JSON.stringify(schema)); } for(const inter of clientInterfaces) { const schema = getTypeSchemaFromConfigGenerator(inter); - writeFileSync(resolve(projectDir, `src/backend/common/schema/${inter}.json`), JSON.stringify(schema)); + writeFileSync(resolve(projectRootDir, `src/backend/common/schema/${inter}.json`), JSON.stringify(schema)); } \ No newline at end of file diff --git a/src/backend/utils/SchemaCompiledUtils.ts b/src/backend/utils/SchemaCompiledUtils.ts index c82ea156..7f8dac41 100644 --- a/src/backend/utils/SchemaCompiledUtils.ts +++ b/src/backend/utils/SchemaCompiledUtils.ts @@ -1,11 +1,11 @@ import { readFileSync, accessSync } from "node:fs"; import { constants } from "fs"; import { resolve } from "path"; -import { projectDir } from "../common/index.ts"; import { MaybeLogger } from '../common/MaybeLogger.ts'; +import { projectRootDir } from "../../core/Atomic.ts"; export const getSchemaForType = (type: string, logger: MaybeLogger = new MaybeLogger()): any => { - const path = resolve(projectDir, `src/backend/common/schema/${type}.json`); + const path = resolve(projectRootDir, `src/backend/common/schema/${type}.json`); try { accessSync(path, constants.R_OK); } catch (e) { diff --git a/src/backend/utils/SchemaDocsStaticUtils.ts b/src/backend/utils/SchemaDocsStaticUtils.ts index 88928bd6..ee8777bb 100644 --- a/src/backend/utils/SchemaDocsStaticUtils.ts +++ b/src/backend/utils/SchemaDocsStaticUtils.ts @@ -1,21 +1,21 @@ import { writeFileSync, mkdirSync } from "node:fs"; import { resolve } from "path"; -import { projectDir } from "../common/index.ts"; import {getTypeSchemaFromConfigGenerator} from "./SchemaUtils.ts"; import { atomicClientInterfaces } from '../common/infrastructure/config/client/clients.ts'; import { atomicSourceInterfaces } from '../common/infrastructure/config/source/sources.ts'; +import { projectRootDir } from "../../core/Atomic.ts"; -mkdirSync(resolve(projectDir, 'docsite/static/schemas'), {recursive: true}); +mkdirSync(resolve(projectRootDir, 'docsite/static/schemas'), {recursive: true}); const aio = getTypeSchemaFromConfigGenerator('AIOConfig'); -writeFileSync(resolve(projectDir, 'docsite/static/schemas/aio.json'), JSON.stringify(aio)); +writeFileSync(resolve(projectRootDir, 'docsite/static/schemas/aio.json'), JSON.stringify(aio)); for(const inter of atomicSourceInterfaces) { const schema = getTypeSchemaFromConfigGenerator(`${inter}s`); - writeFileSync(resolve(projectDir, `docsite/static/schemas/${inter}.json`), JSON.stringify(schema)); + writeFileSync(resolve(projectRootDir, `docsite/static/schemas/${inter}.json`), JSON.stringify(schema)); } for(const inter of atomicClientInterfaces) { const schema = getTypeSchemaFromConfigGenerator(`${inter}s`); - writeFileSync(resolve(projectDir, `docsite/static/schemas/${inter}.json`), JSON.stringify(schema)); + writeFileSync(resolve(projectRootDir, `docsite/static/schemas/${inter}.json`), JSON.stringify(schema)); } \ No newline at end of file diff --git a/src/backend/utils/SchemaUtils.ts b/src/backend/utils/SchemaUtils.ts index 54f03582..38f4d3ef 100644 --- a/src/backend/utils/SchemaUtils.ts +++ b/src/backend/utils/SchemaUtils.ts @@ -1,5 +1,4 @@ import { resolve } from "path"; -import { projectDir } from "../common/index.ts"; import type { LiteralType} from "ts-json-schema-generator"; import { type Definition as TSJDefinition, @@ -11,6 +10,7 @@ import { SchemaGenerator, LiteralTypeFormatter } from "ts-json-schema-generator"; import { MaybeLogger } from '../common/MaybeLogger.ts'; +import { projectRootDir } from "../../core/Atomic.ts"; // https://github.com/vega/ts-json-schema-generator/issues/1899#issuecomment-2407674526 // https://github.com/vega/ts-json-schema-generator?tab=readme-ov-file#custom-formatting @@ -34,8 +34,8 @@ const tsjConfig: TSJCompletedConfig = { markdownDescription: true, minify: false, topRef: false, - path: resolve(projectDir, "src/backend/common/infrastructure/config/aioConfig.ts"), - tsconfig: resolve(projectDir, "src/backend/tsconfig.json"), + path: resolve(projectRootDir, "src/backend/common/infrastructure/config/aioConfig.ts"), + tsconfig: resolve(projectRootDir, "src/backend/tsconfig.json"), }; const formatter = createFormatter(tsjConfig, (fmt, circularReferenceTypeFormatter) => { diff --git a/src/backend/utils/ValidationUtils.ts b/src/backend/utils/ValidationUtils.ts index 5697ed53..6243bcf6 100644 --- a/src/backend/utils/ValidationUtils.ts +++ b/src/backend/utils/ValidationUtils.ts @@ -3,7 +3,7 @@ import type * as AjvNS from "ajv"; import Ajv from "ajv"; import f from "ajv-formats" import { resolve } from "path"; -import { projectDir } from "../common/index.ts"; +import { projectRootDir } from "../../core/Atomic.ts"; const ajvInstances: Record = {}; @@ -91,9 +91,9 @@ const getSchemaFunc = async () => { return schemaFetchFunc; } const useCompiled = process.env.NODE_ENV === 'production' || process.env.COMPILED_VALIDATION === 'true'; - const schemaFuncPath = resolve(projectDir, useCompiled ? compiledPath : dynamicPath); + const schemaFuncPath = resolve(projectRootDir, useCompiled ? compiledPath : dynamicPath); try { - const module = await import(resolve(projectDir, schemaFuncPath)) + const module = await import(resolve(projectRootDir, schemaFuncPath)) schemaFetchFunc = module.getSchemaForType; } catch (e) { throw new Error(`Could not load module from path: ${schemaFuncPath}`, {cause: e}); diff --git a/src/core/Atomic.ts b/src/core/Atomic.ts index c897ba91..46bf11b1 100644 --- a/src/core/Atomic.ts +++ b/src/core/Atomic.ts @@ -5,6 +5,11 @@ import type {ErrorObject} from "serialize-error"; import type { FlowControlTerm, TransformHook } from "./Transform.ts"; import type {Changeset} from "json-diff-ts"; import type {IParseBaseOptions} from 'qs'; +import { fileURLToPath } from 'url'; +import * as path from 'path'; + +const __filename = fileURLToPath(import.meta.url); +export const projectRootDir = path.resolve(__filename, '../../../'); export type ComponentTypeClient = 'client'; export const COMPONENT_TYPE_CLIENT: ComponentTypeClient = 'client';