2021-07-27 17:07:28 +02:00
/* eslint-env jest */
import { transform } from 'next/dist/build/swc'
2023-11-27 17:53:26 +01:00
import path from 'path'
import fsp from 'fs/promises'
2021-07-27 17:07:28 +02:00
const swc = async ( code ) = > {
let output = await transform ( code )
return output . code
}
const trim = ( s ) = > s . join ( '\n' ) . trim ( ) . replace ( /^\s+/gm , '' )
describe ( 'next/swc' , ( ) = > {
describe ( 'hook_optimizer' , ( ) = > {
2022-10-06 10:12:34 +02:00
it ( 'should leave alone array destructuring of hooks' , async ( ) = > {
2021-07-27 17:07:28 +02:00
const output = await swc (
trim `
import { useState } from 'react' ;
const [ count , setCount ] = useState ( 0 ) ;
`
)
expect ( output ) . toMatchInlineSnapshot ( `
2023-04-18 08:59:52 +02:00
" function _array_like_to_array ( arr , len ) {
2022-11-20 03:18:31 +01:00
if ( len == null || len > arr . length ) len = arr . length ;
for ( var i = 0 , arr2 = new Array ( len ) ; i < len ; i ++ ) arr2 [ i ] = arr [ i ] ;
return arr2 ;
2022-10-06 10:12:34 +02:00
}
2023-04-18 08:59:52 +02:00
function _array_with_holes ( arr ) {
2022-11-20 03:18:31 +01:00
if ( Array . isArray ( arr ) ) return arr ;
2022-10-06 10:12:34 +02:00
}
2023-04-18 08:59:52 +02:00
function _iterable_to_array_limit ( arr , i ) {
2023-10-19 19:38:24 +02:00
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr [ Symbol . iterator ] || arr [ "@@iterator" ] ;
2022-11-20 03:18:31 +01:00
if ( _i == null ) return ;
var _arr = [ ] ;
var _n = true ;
var _d = false ;
var _s , _e ;
try {
for ( _i = _i . call ( arr ) ; ! ( _n = ( _s = _i . next ( ) ) . done ) ; _n = true ) {
_arr . push ( _s . value ) ;
if ( i && _arr . length === i ) break ;
}
} catch ( err ) {
_d = true ;
_e = err ;
} finally {
try {
2023-10-19 19:38:24 +02:00
if ( ! _n && _i [ "return" ] != null ) _i [ "return" ] ( ) ;
2022-11-20 03:18:31 +01:00
} finally {
if ( _d ) throw _e ;
}
}
return _arr ;
}
2023-04-18 08:59:52 +02:00
function _non_iterable_rest() {
2023-10-19 19:38:24 +02:00
throw new TypeError ( "Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." ) ;
2022-11-20 03:18:31 +01:00
}
2023-04-18 08:59:52 +02:00
function _sliced_to_array ( arr , i ) {
return _array_with_holes ( arr ) || _iterable_to_array_limit ( arr , i ) || _unsupported_iterable_to_array ( arr , i ) || _non_iterable_rest ( ) ;
2022-11-20 03:18:31 +01:00
}
2023-04-18 08:59:52 +02:00
function _unsupported_iterable_to_array ( o , minLen ) {
2022-11-20 03:18:31 +01:00
if ( ! o ) return ;
2023-10-19 19:38:24 +02:00
if ( typeof o === "string" ) return _array_like_to_array ( o , minLen ) ;
2022-11-20 03:18:31 +01:00
var n = Object . prototype . toString . call ( o ) . slice ( 8 , - 1 ) ;
2023-10-19 19:38:24 +02:00
if ( n === "Object" && o . constructor ) n = o . constructor . name ;
if ( n === "Map" || n === "Set" ) return Array . from ( n ) ;
if ( n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/ . test ( n ) ) return _array_like_to_array ( o , minLen ) ;
2022-11-20 03:18:31 +01:00
}
2023-10-19 19:38:24 +02:00
import { useState } from "react" ;
2023-04-18 08:59:52 +02:00
var _useState = _sliced_to_array ( useState ( 0 ) , 2 ) , count = _useState [ 0 ] , setCount = _useState [ 1 ] ;
2022-11-20 03:18:31 +01:00
"
` )
2021-07-27 17:07:28 +02:00
} )
2022-10-06 10:12:34 +02:00
it ( 'should leave alone array spread of hooks' , async ( ) = > {
2021-07-27 17:07:28 +02:00
const output = await swc (
trim `
import { useState } from 'react' ;
2022-10-06 10:12:34 +02:00
const [ . . . copy ] = useState ( 0 ) ;
2021-07-27 17:07:28 +02:00
`
)
expect ( output ) . toMatchInlineSnapshot ( `
2023-04-18 08:59:52 +02:00
" function _array_like_to_array ( arr , len ) {
2022-11-20 03:18:31 +01:00
if ( len == null || len > arr . length ) len = arr . length ;
for ( var i = 0 , arr2 = new Array ( len ) ; i < len ; i ++ ) arr2 [ i ] = arr [ i ] ;
return arr2 ;
}
2023-04-18 08:59:52 +02:00
function _array_with_holes ( arr ) {
2022-11-20 03:18:31 +01:00
if ( Array . isArray ( arr ) ) return arr ;
}
2023-04-18 08:59:52 +02:00
function _iterable_to_array ( iter ) {
2023-10-19 19:38:24 +02:00
if ( typeof Symbol !== "undefined" && iter [ Symbol . iterator ] != null || iter [ "@@iterator" ] != null ) return Array . from ( iter ) ;
2022-11-20 03:18:31 +01:00
}
2023-04-18 08:59:52 +02:00
function _non_iterable_rest() {
2023-10-19 19:38:24 +02:00
throw new TypeError ( "Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." ) ;
2022-11-20 03:18:31 +01:00
}
2023-04-18 08:59:52 +02:00
function _to_array ( arr ) {
return _array_with_holes ( arr ) || _iterable_to_array ( arr ) || _unsupported_iterable_to_array ( arr ) || _non_iterable_rest ( ) ;
2022-11-20 03:18:31 +01:00
}
2023-04-18 08:59:52 +02:00
function _unsupported_iterable_to_array ( o , minLen ) {
2022-11-20 03:18:31 +01:00
if ( ! o ) return ;
2023-10-19 19:38:24 +02:00
if ( typeof o === "string" ) return _array_like_to_array ( o , minLen ) ;
2022-11-20 03:18:31 +01:00
var n = Object . prototype . toString . call ( o ) . slice ( 8 , - 1 ) ;
2023-10-19 19:38:24 +02:00
if ( n === "Object" && o . constructor ) n = o . constructor . name ;
if ( n === "Map" || n === "Set" ) return Array . from ( n ) ;
if ( n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/ . test ( n ) ) return _array_like_to_array ( o , minLen ) ;
2022-11-20 03:18:31 +01:00
}
2023-10-19 19:38:24 +02:00
import { useState } from "react" ;
2023-04-18 08:59:52 +02:00
var _useState = _to_array ( useState ( 0 ) ) , copy = _useState . slice ( 0 ) ;
2022-11-20 03:18:31 +01:00
"
` )
2021-07-27 17:07:28 +02:00
} )
} )
2023-11-27 17:53:26 +01:00
describe ( 'private env replacement' , ( ) = > {
it ( '__NEXT_REQUIRED_NODE_VERSION is replaced' , async ( ) = > {
const pkgDir = path . dirname ( require . resolve ( 'next/package.json' ) )
const nextEntryContent = await fsp . readFile (
path . join ( pkgDir , 'dist/bin/next' ) ,
'utf8'
)
expect ( nextEntryContent ) . not . toContain ( '__NEXT_REQUIRED_NODE_VERSION' )
expect ( nextEntryContent ) . toMatch (
/For Next.js, Node.js version >= v\$\{"\d+\.\d+\.\d*"\}/
)
} )
} )
2021-07-27 17:07:28 +02:00
} )