forked from
npmx.dev/npmx.dev
[READ-ONLY]
a fast, modern browser for the npm registry
1import { describe, expect, it, vi } from 'vitest'
2import { mountSuspended, registerEndpoint } from '@nuxt/test-utils/runtime'
3import type { ModuleReplacement } from 'module-replacements'
4
5const SIMPLE_REPLACEMENT: ModuleReplacement = {
6 type: 'simple',
7 moduleName: 'is-even',
8 replacement: 'Use (n % 2) === 0',
9 category: 'micro-utilities',
10}
11
12const NATIVE_REPLACEMENT: ModuleReplacement = {
13 type: 'native',
14 moduleName: 'array-includes',
15 nodeVersion: '6.0.0',
16 replacement: 'Array.prototype.includes',
17 mdnPath: 'Global_Objects/Array/includes',
18 category: 'native',
19}
20
21async function mountWithDeps(deps: Record<string, string> | undefined) {
22 const captured = ref<Record<string, ModuleReplacement>>({})
23
24 const WrapperComponent = defineComponent({
25 setup() {
26 const replacements = useReplacementDependencies(() => deps)
27
28 watchEffect(() => {
29 captured.value = { ...replacements.value }
30 })
31
32 return () => h('div')
33 },
34 })
35
36 await mountSuspended(WrapperComponent)
37
38 return captured
39}
40
41describe('useReplacementDependencies', () => {
42 it('returns replacements for dependencies that have them', async () => {
43 registerEndpoint('/api/replacements/is-even', () => SIMPLE_REPLACEMENT)
44 registerEndpoint('/api/replacements/picoquery', () => null)
45
46 const replacements = await mountWithDeps({
47 'is-even': '^1.0.0',
48 'picoquery': '^1.0.0',
49 })
50
51 await vi.waitFor(() => {
52 expect(replacements.value['is-even']).toBeDefined()
53 })
54
55 expect(replacements.value['is-even']?.type).toBe('simple')
56 expect(replacements.value['picoquery']).toBeUndefined()
57 })
58
59 it('returns empty object for undefined dependencies', async () => {
60 const replacements = await mountWithDeps(undefined)
61
62 await vi.waitFor(() => {
63 expect(replacements.value).toEqual({})
64 })
65 })
66
67 it('returns empty object for empty dependencies', async () => {
68 const replacements = await mountWithDeps({})
69
70 await vi.waitFor(() => {
71 expect(replacements.value).toEqual({})
72 })
73 })
74
75 it('handles multiple dependencies with replacements', async () => {
76 registerEndpoint('/api/replacements/is-even', () => SIMPLE_REPLACEMENT)
77 registerEndpoint('/api/replacements/array-includes', () => NATIVE_REPLACEMENT)
78 registerEndpoint('/api/replacements/picoquery', () => null)
79
80 const replacements = await mountWithDeps({
81 'is-even': '^1.0.0',
82 'array-includes': '^3.0.0',
83 'picoquery': '^1.0.0',
84 })
85
86 await vi.waitFor(() => {
87 expect(Object.keys(replacements.value)).toHaveLength(2)
88 })
89
90 expect(replacements.value['is-even']?.type).toBe('simple')
91 expect(replacements.value['array-includes']?.type).toBe('native')
92 expect(replacements.value['picoquery']).toBeUndefined()
93 })
94
95 it('handles fetch errors gracefully', async () => {
96 registerEndpoint('/api/replacements/failing-package', () => {
97 throw new Error('Network error')
98 })
99 registerEndpoint('/api/replacements/is-even', () => SIMPLE_REPLACEMENT)
100
101 const replacements = await mountWithDeps({
102 'failing-package': '^1.0.0',
103 'is-even': '^1.0.0',
104 })
105
106 await vi.waitFor(() => {
107 expect(replacements.value['is-even']).toBeDefined()
108 })
109
110 expect(replacements.value['failing-package']).toBeUndefined()
111 expect(replacements.value['is-even']?.type).toBe('simple')
112 })
113})