From 6fb017b6fa7d036217089bd4d5e4dadb8c5b9d95 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Mon, 31 Oct 2022 13:48:00 +0100 Subject: [PATCH] fix: respect folders with dot at the start, when mocking --- packages/ui/client/auto-imports.d.ts | 5 ++++ packages/vite-node/src/utils.ts | 16 +++-------- test/vite-node/test/utils.test.ts | 40 ++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 test/vite-node/test/utils.test.ts diff --git a/packages/ui/client/auto-imports.d.ts b/packages/ui/client/auto-imports.d.ts index 148c5b0e4739..58e175b362a0 100644 --- a/packages/ui/client/auto-imports.d.ts +++ b/packages/ui/client/auto-imports.d.ts @@ -41,6 +41,8 @@ declare global { const nextTick: typeof import('vue')['nextTick'] const onActivated: typeof import('vue')['onActivated'] const onBeforeMount: typeof import('vue')['onBeforeMount'] + const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] + const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] const onClickOutside: typeof import('@vueuse/core')['onClickOutside'] @@ -72,6 +74,7 @@ declare global { const refThrottled: typeof import('@vueuse/core')['refThrottled'] const refWithControl: typeof import('@vueuse/core')['refWithControl'] const resolveComponent: typeof import('vue')['resolveComponent'] + const resolveDirective: typeof import('vue')['resolveDirective'] const resolveRef: typeof import('@vueuse/core')['resolveRef'] const resolveUnref: typeof import('@vueuse/core')['resolveUnref'] const shallowReactive: typeof import('vue')['shallowReactive'] @@ -164,6 +167,7 @@ declare global { const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn'] const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier'] const useLastChanged: typeof import('@vueuse/core')['useLastChanged'] + const useLink: typeof import('vue-router')['useLink'] const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage'] const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys'] const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory'] @@ -205,6 +209,7 @@ declare global { const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage'] const useShare: typeof import('@vueuse/core')['useShare'] const useSlots: typeof import('vue')['useSlots'] + const useSorted: typeof import('@vueuse/core')['useSorted'] const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition'] const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis'] const useStepper: typeof import('@vueuse/core')['useStepper'] diff --git a/packages/vite-node/src/utils.ts b/packages/vite-node/src/utils.ts index 138778195921..2adb87a0451e 100644 --- a/packages/vite-node/src/utils.ts +++ b/packages/vite-node/src/utils.ts @@ -58,21 +58,11 @@ export function pathFromRoot(root: string, filename: string) { return filename const relativePath = relative(root, filename) - // foo.js -> /foo.js - if (!relativePath.startsWith('/') && !relativePath.startsWith('.')) - return `/${relativePath}` - let index = 0 - for (const char of relativePath) { - // ../../foo.js - // ^ returns from here -> /foo.js - if (char !== '.' && char !== '/') - return relativePath.slice(index - 1) + const segments = relativePath.split('/') + const startIndex = segments.findIndex(segment => segment !== '..' && segment !== '.') - index++ - } - - return relativePath + return `/${segments.slice(startIndex).join('/')}` } export function toFilePath(id: string, root: string): string { diff --git a/test/vite-node/test/utils.test.ts b/test/vite-node/test/utils.test.ts new file mode 100644 index 000000000000..18a37bac95db --- /dev/null +++ b/test/vite-node/test/utils.test.ts @@ -0,0 +1,40 @@ +import { describe, expect, test } from 'vitest' +import { pathFromRoot } from 'vite-node/utils' + +describe('vite-node utils', () => { + test('usual path from root returns correct path', () => { + const root = '/Users/name/project' + const filename = '/Users/name/project/test.ts' + expect(pathFromRoot(root, filename)).toBe('/test.ts') + }) + + test('correct path when file and directory share a name', () => { + const root = '/Users/name/project/test' + const filename = '/Users/name/project/test/test/test.ts' + expect(pathFromRoot(root, filename)).toBe('/test/test.ts') + }) + + test('correct path for node builtins', () => { + const root = '/Users/name/project' + const filename = 'fs' + expect(pathFromRoot(root, filename)).toBe('fs') + }) + + test('correct path when relative path has back symbols', () => { + const root = '/Users/name/project' + const filename = '/Users/name/project/../test/test.ts' + expect(pathFromRoot(root, filename)).toBe('/test/test.ts') + }) + + test('correct path when name has a dot at the start', () => { + const root = '/Users/name/project' + const filename = '/Users/name/project/.test.ts' + expect(pathFromRoot(root, filename)).toBe('/.test.ts') + }) + + test('correct path when subfolder has a dot at the start', () => { + const root = '/Users/name/project' + const filename = '/Users/name/project/../.test/test.ts' + expect(pathFromRoot(root, filename)).toBe('/.test/test.ts') + }) +})