/
imports.test.ts
126 lines (98 loc) · 4.22 KB
/
imports.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import { mkdir, writeFile } from 'node:fs/promises'
import { resolve } from 'pathe'
import { describe, expect, test } from 'vitest'
import { dynamicRelativeImport } from '../src/relative-import'
test('dynamic relative import works', async () => {
const stringTimeoutMod = await import('./../src/timeout')
const timeoutPath = './../src/timeout'
const variableTimeoutMod = await import(timeoutPath)
expect(stringTimeoutMod).toBe(variableTimeoutMod)
})
test('Relative imports in imported modules work', async () => {
const relativeImportFromFile = await dynamicRelativeImport('timeout')
const directImport = await import('./../src/timeout')
expect(relativeImportFromFile).toBe(directImport)
})
test('dynamic aliased import works', async () => {
const stringTimeoutMod = await import('./../src/timeout')
const timeoutPath = '#/timeout'
const variableTimeoutMod = await import(timeoutPath)
expect(stringTimeoutMod).toBe(variableTimeoutMod)
})
test('dynamic absolute from root import works', async () => {
const stringTimeoutMod = await import('./../src/timeout')
const timeoutPath = '/src/timeout'
const variableTimeoutMod = await import(timeoutPath)
expect(stringTimeoutMod).toBe(variableTimeoutMod)
})
test('dynamic absolute with extension mport works', async () => {
const stringTimeoutMod = await import('./../src/timeout')
const timeoutPath = '/src/timeout.ts'
const variableTimeoutMod = await import(timeoutPath)
expect(stringTimeoutMod).toBe(variableTimeoutMod)
})
test('dynamic baseUrl import works', async () => {
const staticMod = await import('./../src/timeout')
// @ts-expect-error there is no tsconfig in test/core to handle baseUrl
const dynamicMod = await import('src/timeout')
expect(staticMod).toBe(dynamicMod)
})
test('data with dynamic import works', async () => {
const dataUri = 'data:text/javascript;charset=utf-8,export default "hi"'
const { default: hi } = await import(dataUri)
expect(hi).toBe('hi')
})
test('dynamic import has Module symbol', async () => {
const stringTimeoutMod = await import('./../src/timeout')
// @ts-expect-error The symbol won't exist on the import type
expect(stringTimeoutMod[Symbol.toStringTag]).toBe('Module')
})
test('dynamic import has null prototype', async () => {
const stringTimeoutMod = await import('./../src/timeout')
expect(Object.getPrototypeOf(stringTimeoutMod)).toBe(null)
})
test('dynamic import throws an error', async () => {
const path = './some-unknown-path'
const imported = import(path)
await expect(imported).rejects.toThrowError(/Failed to load/)
// @ts-expect-error path does not exist
await expect(() => import('./some-unknown-path')).rejects.toThrowError(/Failed to load/)
})
test('can import @vite/client', async () => {
const name = '@vite/client'
await expect(import(name)).resolves.not.toThrow()
await expect(import(`/${name}`)).resolves.not.toThrow()
})
describe('importing special files from node_modules', async () => {
const dir = resolve(__dirname, '../src/node_modules')
const wasm = resolve(dir, 'file.wasm')
const css = resolve(dir, 'file.css')
const mp3 = resolve(dir, 'file.mp3')
await mkdir(dir, { recursive: true })
await Promise.all([
writeFile(wasm, '(module)'),
writeFile(css, '.foo { color: red; }'),
writeFile(mp3, ''),
])
const importModule = (path: string) => import(path)
test('importing wasm with ?url query', async () => {
const mod = await importModule('../src/node_modules/file.wasm?url')
expect(mod.default).toBe('/src/node_modules/file.wasm')
})
test('importing wasm with ?raw query', async () => {
const mod = await importModule('../src/node_modules/file.wasm?raw')
expect(mod.default).toBe('(module)')
})
test('importing wasm with ?init query', async () => {
const mod = await importModule('../src/node_modules/file.wasm?init')
expect(mod.default).toBeTypeOf('function')
})
test('importing css with ?inline query', async () => {
const mod = await importModule('../src/node_modules/file.css?inline')
expect(mod.default).toBeTypeOf('string')
})
test('importing asset returns a string', async () => {
const mod = await importModule('../src/node_modules/file.mp3')
expect(mod.default).toBe('/src/node_modules/file.mp3')
})
})