@@ -56,7 +56,20 @@ export function create(createOptions: SwcTranspilerOptions): Transpiler {
56
56
const nonTsxOptions = createSwcOptions ( false ) ;
57
57
const tsxOptions = createSwcOptions ( true ) ;
58
58
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 ] ;
60
73
const keepClassNames = target ! >= /* ts.ScriptTarget.ES2016 */ 3 ;
61
74
const moduleType =
62
75
module === ModuleKind . CommonJS
@@ -119,16 +132,35 @@ export function create(createOptions: SwcTranspilerOptions): Transpiler {
119
132
} ;
120
133
}
121
134
122
- const targetMapping = new Map < ts . ScriptTarget , swcTypes . JscTarget > ( ) ;
135
+ /** @internal */
136
+ export const targetMapping = new Map < ts . ScriptTarget , SwcTarget > ( ) ;
123
137
targetMapping . set ( /* ts.ScriptTarget.ES3 */ 0 , 'es3' ) ;
124
138
targetMapping . set ( /* ts.ScriptTarget.ES5 */ 1 , 'es5' ) ;
125
139
targetMapping . set ( /* ts.ScriptTarget.ES2015 */ 2 , 'es2015' ) ;
126
140
targetMapping . set ( /* ts.ScriptTarget.ES2016 */ 3 , 'es2016' ) ;
127
141
targetMapping . set ( /* ts.ScriptTarget.ES2017 */ 4 , 'es2017' ) ;
128
142
targetMapping . set ( /* ts.ScriptTarget.ES2018 */ 5 , 'es2018' ) ;
129
143
targetMapping . 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 ;
132
164
133
165
const ModuleKind = {
134
166
None : 0 ,
0 commit comments