@@ -56,7 +56,20 @@ export function create(createOptions: SwcTranspilerOptions): Transpiler {
5656 const nonTsxOptions = createSwcOptions ( false ) ;
5757 const tsxOptions = createSwcOptions ( true ) ;
5858 function createSwcOptions ( isTsx : boolean ) : swcTypes . Options {
59- const swcTarget = targetMapping . get ( target ! ) ?? 'es3' ;
59+ let swcTarget = targetMapping . get ( target ! ) ?? 'es3' ;
60+ // Downgrade to lower target if swc does not support the selected target.
61+ // Perhaps project has an older version of swc.
62+ // TODO cache the results of this; slightly faster
63+ let swcTargetIndex = swcTargets . indexOf ( swcTarget ) ;
64+ for ( ; swcTargetIndex >= 0 ; swcTargetIndex -- ) {
65+ try {
66+ swcInstance . transformSync ( '' , {
67+ jsc : { target : swcTargets [ swcTargetIndex ] } ,
68+ } ) ;
69+ break ;
70+ } catch ( e ) { }
71+ }
72+ swcTarget = swcTargets [ swcTargetIndex ] ;
6073 const keepClassNames = target ! >= /* ts.ScriptTarget.ES2016 */ 3 ;
6174 const moduleType =
6275 module === ModuleKind . CommonJS
@@ -119,16 +132,35 @@ export function create(createOptions: SwcTranspilerOptions): Transpiler {
119132 } ;
120133}
121134
122- const targetMapping = new Map < ts . ScriptTarget , swcTypes . JscTarget > ( ) ;
135+ /** @internal */
136+ export const targetMapping = new Map < ts . ScriptTarget , SwcTarget > ( ) ;
123137targetMapping . set ( /* ts.ScriptTarget.ES3 */ 0 , 'es3' ) ;
124138targetMapping . set ( /* ts.ScriptTarget.ES5 */ 1 , 'es5' ) ;
125139targetMapping . set ( /* ts.ScriptTarget.ES2015 */ 2 , 'es2015' ) ;
126140targetMapping . set ( /* ts.ScriptTarget.ES2016 */ 3 , 'es2016' ) ;
127141targetMapping . set ( /* ts.ScriptTarget.ES2017 */ 4 , 'es2017' ) ;
128142targetMapping . set ( /* ts.ScriptTarget.ES2018 */ 5 , 'es2018' ) ;
129143targetMapping . set ( /* ts.ScriptTarget.ES2019 */ 6 , 'es2019' ) ;
130- targetMapping . set ( /* ts.ScriptTarget.ES2020 */ 7 , 'es2019' ) ;
131- targetMapping . set ( /* ts.ScriptTarget.ESNext */ 99 , 'es2019' ) ;
144+ targetMapping . set ( /* ts.ScriptTarget.ES2020 */ 7 , 'es2020' ) ;
145+ targetMapping . set ( /* ts.ScriptTarget.ES2021 */ 8 , 'es2021' ) ;
146+ targetMapping . set ( /* ts.ScriptTarget.ESNext */ 99 , 'es2021' ) ;
147+
148+ type SwcTarget = typeof swcTargets [ number ] ;
149+ /**
150+ * @internal
151+ * We use this list to downgrade to a prior target when we probe swc to detect if it supports a particular target
152+ */
153+ const swcTargets = [
154+ 'es3' ,
155+ 'es5' ,
156+ 'es2015' ,
157+ 'es2016' ,
158+ 'es2017' ,
159+ 'es2018' ,
160+ 'es2019' ,
161+ 'es2020' ,
162+ 'es2021' ,
163+ ] as const ;
132164
133165const ModuleKind = {
134166 None : 0 ,
0 commit comments