diff --git a/packages/fastify-vite/config.js b/packages/fastify-vite/config.js index 4fd4e2e3..769a53eb 100644 --- a/packages/fastify-vite/config.js +++ b/packages/fastify-vite/config.js @@ -11,6 +11,7 @@ const { stat, read, sep, + determineOutDirRoot, } = require('./ioutils.cjs') const { createHtmlTemplateFunction } = require('./html.js') @@ -317,25 +318,19 @@ async function resolveViteConfig(root, dev, { spa, distDir } = {}) { ] } -async function determineOutDirRoot(vite) { - const { usePathsRelativeToAppRoot } = vite.fastify - if (usePathsRelativeToAppRoot) { - const { packageDirectory } = await import('package-directory') - return await packageDirectory() - } - return vite.root -} - async function resolveSSRBundle({ dev, vite }) { const bundle = {} let clientOutDir if (!dev) { if (vite.fastify) { - clientOutDir = resolveIfRelative(vite.fastify.outDirs.client, await determineOutDirRoot(vite)) + clientOutDir = await resolveIfRelative( + vite.fastify.outDirs.client, + await determineOutDirRoot(vite), + ) } else { // Backwards compatibility for projects that do not use the viteFastify plugin. - bundle.dir = resolveIfRelative(vite.build.outDir, vite.root) + bundle.dir = await resolveIfRelative(vite.build.outDir, vite.root) clientOutDir = resolve(bundle.dir, 'client') } @@ -369,10 +364,13 @@ async function resolveSPABundle({ dev, vite }) { let clientOutDir if (vite.fastify) { - clientOutDir = resolveIfRelative(vite.fastify.outDirs.client, await determineOutDirRoot(vite)) + clientOutDir = await resolveIfRelative( + vite.fastify.outDirs.client, + await determineOutDirRoot(vite), + ) } else { // Backwards compatibility for projects that do not use the viteFastify plugin. - bundle.dir = resolveIfRelative(vite.build.outDir, vite.root) + bundle.dir = await resolveIfRelative(vite.build.outDir, vite.root) clientOutDir = resolve(bundle.dir, 'client') } diff --git a/packages/fastify-vite/ioutils.cjs b/packages/fastify-vite/ioutils.cjs index 9bafec72..a633e4a0 100644 --- a/packages/fastify-vite/ioutils.cjs +++ b/packages/fastify-vite/ioutils.cjs @@ -12,8 +12,45 @@ const { const { ensureDir, remove } = require('fs-extra') const klaw = require('klaw') -function resolveIfRelative(p, root) { - return isAbsolute(p) ? p : resolve(root, p) +function getAppRoot() { + const file = require?.main?.filename || process.argv[1] + if (!file) return + + return dirname(resolve(file)) +} + +async function resolveIfRelative(p, root) { + if (isAbsolute(p)) return p + if (isAbsolute(root)) return resolve(root, p) + if (existsSync(resolve(root, p))) return resolve(root, p) + + const { packageDirectory } = await import('package-directory') + let _packageDirectory = await packageDirectory() + + if (!_packageDirectory) { + _packageDirectory = await packageDirectory({ + cwd: getAppRoot() || process.cwd(), + }) + } + + return resolve(_packageDirectory, root, p) +} + +async function determineOutDirRoot(vite) { + const { usePathsRelativeToAppRoot } = vite.fastify + if (usePathsRelativeToAppRoot) { + const { packageDirectory } = await import('package-directory') + const _packageDirectory = await packageDirectory() + if (_packageDirectory) { + return _packageDirectory + } + + return await packageDirectory({ + cwd: getAppRoot() || process.cwd(), + }) + } + + return vite.root } async function* walk(dir, ignorePatterns = []) { @@ -43,6 +80,8 @@ module.exports = { remove, isAbsolute, sep, + getAppRoot, + determineOutDirRoot, write: writeFile, read: readFile, exists: existsSync, diff --git a/packages/fastify-vite/mode/production.js b/packages/fastify-vite/mode/production.js index 81edf778..fec57200 100644 --- a/packages/fastify-vite/mode/production.js +++ b/packages/fastify-vite/mode/production.js @@ -1,6 +1,12 @@ const { join, resolve } = require('node:path') const FastifyStatic = require('@fastify/static') -const { parse, resolveIfRelative, read, exists } = require('../ioutils.cjs') +const { + parse, + resolveIfRelative, + read, + exists, + determineOutDirRoot, +} = require('../ioutils.cjs') function fileUrl(str) { if (typeof str !== 'string') { @@ -23,19 +29,15 @@ async function setup(config) { let ssrOutDir if (vite.fastify) { - const { outDirs, usePathsRelativeToAppRoot } = vite.fastify + const { outDirs } = vite.fastify - let outDirRoot = vite.root - if (usePathsRelativeToAppRoot) { - const { packageDirectory } = await import('package-directory') - outDirRoot = await packageDirectory() - } + const outDirRoot = await determineOutDirRoot(vite) - clientOutDir = resolveIfRelative(outDirs.client, outDirRoot) - ssrOutDir = resolveIfRelative(outDirs.ssr || '', outDirRoot) + clientOutDir = await resolveIfRelative(outDirs.client, outDirRoot) + ssrOutDir = await resolveIfRelative(outDirs.ssr || '', outDirRoot) } else { // Backwards compatibility for projects that do not use the viteFastify plugin. - const outDir = resolveIfRelative(vite.build.outDir, vite.root) + const outDir = await resolveIfRelative(vite.build.outDir, vite.root) clientOutDir = resolve(outDir, 'client') ssrOutDir = resolve(outDir, 'server') diff --git a/packages/fastify-vite/plugin.mjs b/packages/fastify-vite/plugin.mjs index ebe53c8a..9200e509 100644 --- a/packages/fastify-vite/plugin.mjs +++ b/packages/fastify-vite/plugin.mjs @@ -1,8 +1,12 @@ +import { writeFile } from 'node:fs/promises' import { isAbsolute, join, relative, sep } from 'node:path' import getDeepMergeFunction from '@fastify/deepmerge' -import { writeFile } from 'node:fs/promises' -export function viteFastify({ spa, clientModule, useRelativePaths = false } = {}) { +export function viteFastify({ + spa, + clientModule, + useRelativePaths = false, +} = {}) { let customOutDir let jsonFilePath let configToWrite = {} @@ -30,7 +34,8 @@ export function viteFastify({ spa, clientModule, useRelativePaths = false } = {} rawConfig.environments.client ?? {}, ) if (!spa) { - const ssrEntryPoint = clientModule ?? resolveClientModule(rawConfig.root) + const ssrEntryPoint = + clientModule ?? resolveClientModule(rawConfig.root) rawConfig.environments.ssr = deepMerge( createSSREnvironment(isDevMode, outDir, ssrEntryPoint), rawConfig.environments.ssr ?? {}, @@ -99,10 +104,11 @@ export function viteFastify({ spa, clientModule, useRelativePaths = false } = {} let commonDistFolder = customOutDir // respect custom build.outDir config if provided if (!commonDistFolder) { const outDirs = Object.values(fastify.outDirs) - commonDistFolder = outDirs.length > 1 - ? findCommonPath(outDirs) - // Handle SPA case where there's only dist/client - : outDirs[0].split(sep)[0] + commonDistFolder = + outDirs.length > 1 + ? findCommonPath(outDirs) + : // Handle SPA case where there's only dist/client + outDirs[0].split(sep)[0] } if (isAbsolute(commonDistFolder)) { @@ -152,7 +158,10 @@ async function makeAllPathsRelative(viteConfig) { } Object.keys(fastify.outDirs).forEach((key) => { - fastify.outDirs[key] = relative(applicationRootDirectory, fastify.outDirs[key]) + fastify.outDirs[key] = relative( + applicationRootDirectory, + fastify.outDirs[key], + ) }) }