@@ -9,7 +9,17 @@ jest.mock('../packages/runtime/src/helpers/utils', () => {
9
9
} )
10
10
11
11
const Chance = require ( 'chance' )
12
- const { writeJSON, unlink, existsSync, readFileSync, copy, ensureDir, readJson, pathExists } = require ( 'fs-extra' )
12
+ const {
13
+ writeJSON,
14
+ unlink,
15
+ existsSync,
16
+ readFileSync,
17
+ copy,
18
+ ensureDir,
19
+ readJson,
20
+ pathExists,
21
+ writeFile,
22
+ } = require ( 'fs-extra' )
13
23
const path = require ( 'path' )
14
24
const process = require ( 'process' )
15
25
const os = require ( 'os' )
@@ -35,7 +45,7 @@ const {
35
45
updateRequiredServerFiles,
36
46
generateCustomHeaders,
37
47
} = require ( '../packages/runtime/src/helpers/config' )
38
- const { dirname } = require ( 'path' )
48
+ const { dirname, resolve } = require ( 'path' )
39
49
const { getProblematicUserRewrites } = require ( '../packages/runtime/src/helpers/verification' )
40
50
41
51
const chance = new Chance ( )
@@ -119,8 +129,12 @@ const rewriteAppDir = async function (dir = '.next') {
119
129
}
120
130
121
131
// Move .next from sample project to current directory
122
- export const moveNextDist = async function ( dir = '.next' ) {
123
- await stubModules ( [ 'next' , 'sharp' ] )
132
+ export const moveNextDist = async function ( dir = '.next' , copyMods = false ) {
133
+ if ( copyMods ) {
134
+ await copyModules ( [ 'next' , 'sharp' ] )
135
+ } else {
136
+ await stubModules ( [ 'next' , 'sharp' ] )
137
+ }
124
138
await ensureDir ( dirname ( dir ) )
125
139
await copy ( path . join ( SAMPLE_PROJECT_DIR , '.next' ) , path . join ( process . cwd ( ) , dir ) )
126
140
@@ -134,6 +148,14 @@ export const moveNextDist = async function (dir = '.next') {
134
148
await rewriteAppDir ( dir )
135
149
}
136
150
151
+ const copyModules = async function ( modules ) {
152
+ for ( const mod of modules ) {
153
+ const source = dirname ( require . resolve ( `${ mod } /package.json` ) )
154
+ const dest = path . join ( process . cwd ( ) , 'node_modules' , mod )
155
+ await copy ( source , dest )
156
+ }
157
+ }
158
+
137
159
const stubModules = async function ( modules ) {
138
160
for ( const mod of modules ) {
139
161
const dir = path . join ( process . cwd ( ) , 'node_modules' , mod )
@@ -182,7 +204,9 @@ afterEach(async () => {
182
204
// Cleans up the temporary directory from `getTmpDir()` and do not make it
183
205
// the current directory anymore
184
206
restoreCwd ( )
185
- await cleanup ( )
207
+ if ( ! process . env . TEST_SKIP_CLEANUP ) {
208
+ await cleanup ( )
209
+ }
186
210
} )
187
211
188
212
describe ( 'preBuild()' , ( ) => {
@@ -1719,3 +1743,78 @@ describe('api route file analysis', () => {
1719
1743
)
1720
1744
} )
1721
1745
} )
1746
+
1747
+ const middlewareSourceTs = /* typescript */ `
1748
+ import { NextResponse } from 'next/server'
1749
+ export async function middleware(req: NextRequest) {
1750
+ return NextResponse.next()
1751
+ }
1752
+ `
1753
+
1754
+ const middlewareSourceJs = /* javascript */ `
1755
+ import { NextResponse } from 'next/server'
1756
+ export async function middleware(req) {
1757
+ return NextResponse.next()
1758
+ }
1759
+ `
1760
+
1761
+ const wait = ( seconds = 0.5 ) => new Promise ( ( resolve ) => setTimeout ( resolve , seconds * 1000 ) )
1762
+
1763
+ const middlewareExists = ( ) => existsSync ( resolve ( '.netlify' , 'middleware.js' ) )
1764
+
1765
+ describe ( 'onPreDev' , ( ) => {
1766
+ let runtime
1767
+ beforeAll ( async ( ) => {
1768
+ runtime = await nextRuntimeFactory ( { } , { events : new Set ( [ 'onPreDev' ] ) } )
1769
+ } )
1770
+
1771
+ it ( 'should generate the runtime with onPreDev' , ( ) => {
1772
+ expect ( runtime ) . toHaveProperty ( 'onPreDev' )
1773
+ } )
1774
+
1775
+ it ( 'should run without middleware' , async ( ) => {
1776
+ await moveNextDist ( '.next' , true )
1777
+ await runtime . onPreDev ( defaultArgs )
1778
+ // Allow time for esbuild to compile
1779
+ await wait ( )
1780
+ expect ( middlewareExists ( ) ) . toBeFalsy ( )
1781
+ } )
1782
+
1783
+ it ( 'should compile middleware in the root directory' , async ( ) => {
1784
+ await moveNextDist ( '.next' , true )
1785
+ await writeFile ( path . join ( process . cwd ( ) , 'middleware.ts' ) , middlewareSourceTs )
1786
+ await runtime . onPreDev ( defaultArgs )
1787
+ await wait ( )
1788
+
1789
+ expect ( middlewareExists ( ) ) . toBeTruthy ( )
1790
+ } )
1791
+
1792
+ it ( 'should compile middleware in the src directory' , async ( ) => {
1793
+ await moveNextDist ( '.next' , true )
1794
+ await ensureDir ( path . join ( process . cwd ( ) , 'src' ) )
1795
+ await writeFile ( path . join ( process . cwd ( ) , 'src' , 'middleware.ts' ) , middlewareSourceTs )
1796
+ await runtime . onPreDev ( defaultArgs )
1797
+ await wait ( )
1798
+
1799
+ expect ( middlewareExists ( ) ) . toBeTruthy ( )
1800
+ } )
1801
+
1802
+ it ( 'should compile JS middleware in the root directory' , async ( ) => {
1803
+ await moveNextDist ( '.next' , true )
1804
+ await writeFile ( path . join ( process . cwd ( ) , 'middleware.js' ) , middlewareSourceJs )
1805
+ await runtime . onPreDev ( defaultArgs )
1806
+ await wait ( )
1807
+
1808
+ expect ( middlewareExists ( ) ) . toBeTruthy ( )
1809
+ } )
1810
+
1811
+ it ( 'should compile JS middleware in the src directory' , async ( ) => {
1812
+ await moveNextDist ( '.next' , true )
1813
+ await ensureDir ( path . join ( process . cwd ( ) , 'src' ) )
1814
+ await writeFile ( path . join ( process . cwd ( ) , 'src' , 'middleware.js' ) , middlewareSourceJs )
1815
+ await runtime . onPreDev ( defaultArgs )
1816
+ await wait ( )
1817
+
1818
+ expect ( middlewareExists ( ) ) . toBeTruthy ( )
1819
+ } )
1820
+ } )
0 commit comments