| 
1 |  | -import * as fs from 'fs';  | 
2 |  | -import { afterEach, describe, expect, it, vi } from 'vitest';  | 
 | 1 | +import { describe, expect, it } from 'vitest';  | 
3 | 2 | import * as util from '../../src/config/util';  | 
4 | 3 | 
 
  | 
5 |  | -// Mock fs to control what getNextjsVersion reads  | 
6 |  | -vi.mock('fs');  | 
7 |  | - | 
8 | 4 | describe('util', () => {  | 
9 | 5 |   describe('supportsProductionCompileHook', () => {  | 
10 |  | -    afterEach(() => {  | 
11 |  | -      vi.restoreAllMocks();  | 
12 |  | -    });  | 
13 |  | - | 
14 | 6 |     describe('supported versions', () => {  | 
15 | 7 |       it('returns true for Next.js 15.4.1', () => {  | 
16 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
17 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4.1' }));  | 
18 |  | - | 
19 |  | -        const result = util.supportsProductionCompileHook();  | 
 | 8 | +        const result = util.supportsProductionCompileHook('15.4.1');  | 
20 | 9 |         expect(result).toBe(true);  | 
21 | 10 |       });  | 
22 | 11 | 
 
  | 
23 | 12 |       it('returns true for Next.js 15.4.2', () => {  | 
24 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
25 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4.2' }));  | 
26 |  | - | 
27 |  | -        expect(util.supportsProductionCompileHook()).toBe(true);  | 
 | 13 | +        expect(util.supportsProductionCompileHook('15.4.2')).toBe(true);  | 
28 | 14 |       });  | 
29 | 15 | 
 
  | 
30 | 16 |       it('returns true for Next.js 15.5.0', () => {  | 
31 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
32 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.5.0' }));  | 
33 |  | - | 
34 |  | -        expect(util.supportsProductionCompileHook()).toBe(true);  | 
 | 17 | +        expect(util.supportsProductionCompileHook('15.5.0')).toBe(true);  | 
35 | 18 |       });  | 
36 | 19 | 
 
  | 
37 | 20 |       it('returns true for Next.js 16.0.0', () => {  | 
38 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
39 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '16.0.0' }));  | 
40 |  | - | 
41 |  | -        expect(util.supportsProductionCompileHook()).toBe(true);  | 
 | 21 | +        expect(util.supportsProductionCompileHook('16.0.0')).toBe(true);  | 
42 | 22 |       });  | 
43 | 23 | 
 
  | 
44 | 24 |       it('returns true for Next.js 17.0.0', () => {  | 
45 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
46 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '17.0.0' }));  | 
47 |  | - | 
48 |  | -        expect(util.supportsProductionCompileHook()).toBe(true);  | 
 | 25 | +        expect(util.supportsProductionCompileHook('17.0.0')).toBe(true);  | 
49 | 26 |       });  | 
50 | 27 | 
 
  | 
51 | 28 |       it('returns true for supported canary versions', () => {  | 
52 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
53 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4.1-canary.42' }));  | 
54 |  | - | 
55 |  | -        expect(util.supportsProductionCompileHook()).toBe(true);  | 
 | 29 | +        expect(util.supportsProductionCompileHook('15.4.1-canary.42')).toBe(true);  | 
56 | 30 |       });  | 
57 | 31 | 
 
  | 
58 | 32 |       it('returns true for supported rc versions', () => {  | 
59 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
60 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4.1-rc.1' }));  | 
61 |  | - | 
62 |  | -        expect(util.supportsProductionCompileHook()).toBe(true);  | 
 | 33 | +        expect(util.supportsProductionCompileHook('15.4.1-rc.1')).toBe(true);  | 
63 | 34 |       });  | 
64 | 35 |     });  | 
65 | 36 | 
 
  | 
66 | 37 |     describe('unsupported versions', () => {  | 
67 | 38 |       it('returns false for Next.js 15.4.0', () => {  | 
68 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
69 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4.0' }));  | 
70 |  | - | 
71 |  | -        expect(util.supportsProductionCompileHook()).toBe(false);  | 
 | 39 | +        expect(util.supportsProductionCompileHook('15.4.0')).toBe(false);  | 
72 | 40 |       });  | 
73 | 41 | 
 
  | 
74 | 42 |       it('returns false for Next.js 15.3.9', () => {  | 
75 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
76 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.3.9' }));  | 
77 |  | - | 
78 |  | -        expect(util.supportsProductionCompileHook()).toBe(false);  | 
 | 43 | +        expect(util.supportsProductionCompileHook('15.3.9')).toBe(false);  | 
79 | 44 |       });  | 
80 | 45 | 
 
  | 
81 | 46 |       it('returns false for Next.js 15.0.0', () => {  | 
82 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
83 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.0.0' }));  | 
84 |  | - | 
85 |  | -        expect(util.supportsProductionCompileHook()).toBe(false);  | 
 | 47 | +        expect(util.supportsProductionCompileHook('15.0.0')).toBe(false);  | 
86 | 48 |       });  | 
87 | 49 | 
 
  | 
88 | 50 |       it('returns false for Next.js 14.2.0', () => {  | 
89 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
90 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '14.2.0' }));  | 
91 |  | - | 
92 |  | -        expect(util.supportsProductionCompileHook()).toBe(false);  | 
 | 51 | +        expect(util.supportsProductionCompileHook('14.2.0')).toBe(false);  | 
93 | 52 |       });  | 
94 | 53 | 
 
  | 
95 | 54 |       it('returns false for unsupported canary versions', () => {  | 
96 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
97 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4.0-canary.42' }));  | 
98 |  | - | 
99 |  | -        expect(util.supportsProductionCompileHook()).toBe(false);  | 
 | 55 | +        expect(util.supportsProductionCompileHook('15.4.0-canary.42')).toBe(false);  | 
100 | 56 |       });  | 
101 | 57 |     });  | 
102 | 58 | 
 
  | 
103 | 59 |     describe('edge cases', () => {  | 
104 | 60 |       it('returns false for invalid version strings', () => {  | 
105 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
106 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: 'invalid.version' }));  | 
107 |  | - | 
108 |  | -        expect(util.supportsProductionCompileHook()).toBe(false);  | 
 | 61 | +        expect(util.supportsProductionCompileHook('invalid.version')).toBe(false);  | 
109 | 62 |       });  | 
110 | 63 | 
 
  | 
111 | 64 |       it('handles versions with build metadata', () => {  | 
112 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
113 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4.1+build.123' }));  | 
114 |  | - | 
115 |  | -        expect(util.supportsProductionCompileHook()).toBe(true);  | 
 | 65 | +        expect(util.supportsProductionCompileHook('15.4.1+build.123')).toBe(true);  | 
116 | 66 |       });  | 
117 | 67 | 
 
  | 
118 | 68 |       it('handles versions with pre-release identifiers', () => {  | 
119 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
120 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4.1-alpha.1' }));  | 
121 |  | - | 
122 |  | -        expect(util.supportsProductionCompileHook()).toBe(true);  | 
 | 69 | +        expect(util.supportsProductionCompileHook('15.4.1-alpha.1')).toBe(true);  | 
123 | 70 |       });  | 
124 | 71 | 
 
  | 
125 | 72 |       it('returns false for versions missing patch number', () => {  | 
126 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
127 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4' }));  | 
128 |  | - | 
129 |  | -        expect(util.supportsProductionCompileHook()).toBe(false);  | 
 | 73 | +        expect(util.supportsProductionCompileHook('15.4')).toBe(false);  | 
130 | 74 |       });  | 
131 | 75 | 
 
  | 
132 | 76 |       it('returns false for versions missing minor number', () => {  | 
133 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
134 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15' }));  | 
135 |  | - | 
136 |  | -        expect(util.supportsProductionCompileHook()).toBe(false);  | 
 | 77 | +        expect(util.supportsProductionCompileHook('15')).toBe(false);  | 
137 | 78 |       });  | 
138 | 79 |     });  | 
139 | 80 | 
 
  | 
140 | 81 |     describe('version boundary tests', () => {  | 
141 | 82 |       it('returns false for 15.4.0 (just below threshold)', () => {  | 
142 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
143 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4.0' }));  | 
144 |  | - | 
145 |  | -        expect(util.supportsProductionCompileHook()).toBe(false);  | 
 | 83 | +        expect(util.supportsProductionCompileHook('15.4.0')).toBe(false);  | 
146 | 84 |       });  | 
147 | 85 | 
 
  | 
148 | 86 |       it('returns true for 15.4.1 (exact threshold)', () => {  | 
149 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
150 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4.1' }));  | 
151 |  | - | 
152 |  | -        expect(util.supportsProductionCompileHook()).toBe(true);  | 
 | 87 | +        expect(util.supportsProductionCompileHook('15.4.1')).toBe(true);  | 
153 | 88 |       });  | 
154 | 89 | 
 
  | 
155 | 90 |       it('returns true for 15.4.2 (just above threshold)', () => {  | 
156 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
157 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.4.2' }));  | 
158 |  | - | 
159 |  | -        expect(util.supportsProductionCompileHook()).toBe(true);  | 
 | 91 | +        expect(util.supportsProductionCompileHook('15.4.2')).toBe(true);  | 
160 | 92 |       });  | 
161 | 93 | 
 
  | 
162 | 94 |       it('returns false for 15.3.999 (high patch but wrong minor)', () => {  | 
163 |  | -        const mockReadFileSync = fs.readFileSync as any;  | 
164 |  | -        mockReadFileSync.mockReturnValue(JSON.stringify({ version: '15.3.999' }));  | 
165 |  | - | 
166 |  | -        expect(util.supportsProductionCompileHook()).toBe(false);  | 
 | 95 | +        expect(util.supportsProductionCompileHook('15.3.999')).toBe(false);  | 
167 | 96 |       });  | 
168 | 97 |     });  | 
169 | 98 |   });  | 
 | 
0 commit comments