From 2e0f89e275db43b794051e81871e1bdd7dbe639f Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Thu, 18 Jan 2024 19:15:22 +0100 Subject: [PATCH] feat: add filename/dirname to import.meta --- .../ssr/runtime/__tests__/fixtures/basic.js | 2 +- .../runtime/__tests__/server-runtime.spec.ts | 33 ++++++++++++++++--- packages/vite/src/node/ssr/runtime/runtime.ts | 6 ++++ packages/vite/src/node/ssr/runtime/utils.ts | 4 +++ 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/packages/vite/src/node/ssr/runtime/__tests__/fixtures/basic.js b/packages/vite/src/node/ssr/runtime/__tests__/fixtures/basic.js index 5e7e14e6795a0b..777fa9d3ecf08f 100644 --- a/packages/vite/src/node/ssr/runtime/__tests__/fixtures/basic.js +++ b/packages/vite/src/node/ssr/runtime/__tests__/fixtures/basic.js @@ -1,3 +1,3 @@ export const name = 'basic' -export const url = import.meta.url +export const meta = import.meta diff --git a/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts b/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts index c797ca7b39f83d..34d84d8bcee1cd 100644 --- a/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts +++ b/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts @@ -1,5 +1,7 @@ import { existsSync, readdirSync } from 'node:fs' +import { posix, win32 } from 'node:path' import { describe, expect } from 'vitest' +import { isWindows } from '../utils' import { createViteRuntimeTester } from './utils' describe('vite-runtime initialization', async () => { @@ -107,11 +109,34 @@ describe('vite-runtime initialization', async () => { expect(mod.existsSync).toBe(existsSync) }) - it('correctly resolves module url', async ({ runtime }) => { - const mod = await runtime.executeUrl('/fixtures/basic') + it('correctly resolves module url', async ({ runtime, server }) => { + const { meta } = + await runtime.executeUrl( + '/fixtures/basic', + ) // so it isn't transformed by Vitest const _URL = URL - const basicUrl = new _URL('./fixtures/basic.js', import.meta.url) - expect(mod.url).toBe(basicUrl.toString()) + const basicUrl = new _URL('./fixtures/basic.js', import.meta.url).toString() + expect(meta.url).toBe(basicUrl) + + const filename = meta.filename! + const dirname = meta.dirname! + + if (isWindows) { + const cwd = process.cwd() + const drive = `${cwd[0].toUpperCase()}:\\` + const root = server.config.root.replace(/\\/g, '/') + + expect(filename.startsWith(drive)).toBe(true) + expect(dirname.startsWith(drive)).toBe(true) + + expect(filename).toBe(win32.join(root, '.\\fixtures\\basic.js')) + expect(dirname).toBe(win32.join(root, '.\\fixtures')) + } else { + const root = server.config.root + + expect(posix.join(root, './fixtures/basic.js')).toBe(filename) + expect(posix.join(root, './fixtures')).toBe(dirname) + } }) }) diff --git a/packages/vite/src/node/ssr/runtime/runtime.ts b/packages/vite/src/node/ssr/runtime/runtime.ts index 40f67517b2b19f..7f8e6b13ec1713 100644 --- a/packages/vite/src/node/ssr/runtime/runtime.ts +++ b/packages/vite/src/node/ssr/runtime/runtime.ts @@ -16,9 +16,11 @@ import { cleanUrl, createImportMetaEnvProxy, isPrimitive, + isWindows, posixDirname, posixPathToFileHref, posixResolve, + toWindowsPath, unwrapId, } from './utils' import { @@ -244,7 +246,11 @@ export class ViteRuntime { const modulePath = cleanUrl(file || moduleId) // disambiguate the `:/` on windows: see nodejs/node#31710 const href = posixPathToFileHref(modulePath) + const filename = modulePath + const dirname = posixDirname(modulePath) const meta: ViteRuntimeImportMeta = { + filename: isWindows ? toWindowsPath(filename) : filename, + dirname: isWindows ? toWindowsPath(dirname) : dirname, url: href, env: this.envProxy, resolve(id, parent) { diff --git a/packages/vite/src/node/ssr/runtime/utils.ts b/packages/vite/src/node/ssr/runtime/utils.ts index 87d599d4d581ce..1cb3f87b5bbaa8 100644 --- a/packages/vite/src/node/ssr/runtime/utils.ts +++ b/packages/vite/src/node/ssr/runtime/utils.ts @@ -139,6 +139,10 @@ export function posixDirname(filepath: string): string { return normalizedPath.substring(0, normalizedPath.lastIndexOf('/')) || '/' } +export function toWindowsPath(path: string): string { + return path.replace(/\//g, '\\') +} + // inlined from pathe to support environments without access to node:path function cwd(): string { if (typeof process !== 'undefined' && typeof process.cwd === 'function') {