typescript-to-lua 0.42.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/dist/CompilerOptions.d.ts +4 -3
  3. package/dist/LuaAST.js +4 -4
  4. package/dist/LuaLib.d.ts +7 -0
  5. package/dist/LuaLib.js +32 -1
  6. package/dist/LuaPrinter.d.ts +6 -2
  7. package/dist/LuaPrinter.js +25 -16
  8. package/dist/cli/diagnostics.js +2 -2
  9. package/dist/cli/parse.d.ts +1 -1
  10. package/dist/cli/parse.js +14 -0
  11. package/dist/cli/report.js +1 -1
  12. package/dist/cli/tsconfig.js +4 -4
  13. package/dist/lualib/Await.lua +59 -0
  14. package/dist/lualib/OptionalMethodCall.lua +3 -1
  15. package/dist/lualib/Promise.lua +172 -0
  16. package/dist/lualib/PromiseAll.lua +44 -0
  17. package/dist/lualib/PromiseAllSettled.lua +48 -0
  18. package/dist/lualib/PromiseAny.lua +41 -0
  19. package/dist/lualib/PromiseRace.lua +28 -0
  20. package/dist/lualib/SourceMapTraceBack.lua +20 -10
  21. package/dist/lualib/StringReplace.lua +8 -13
  22. package/dist/lualib/StringReplaceAll.lua +35 -0
  23. package/dist/lualib/lualib_bundle.lua +503 -62
  24. package/dist/transformation/builtins/array.js +29 -29
  25. package/dist/transformation/builtins/console.js +2 -2
  26. package/dist/transformation/builtins/function.js +9 -9
  27. package/dist/transformation/builtins/global.js +8 -8
  28. package/dist/transformation/builtins/index.js +35 -32
  29. package/dist/transformation/builtins/math.js +4 -4
  30. package/dist/transformation/builtins/number.js +7 -7
  31. package/dist/transformation/builtins/object.js +11 -11
  32. package/dist/transformation/builtins/promise.d.ts +7 -0
  33. package/dist/transformation/builtins/promise.js +46 -0
  34. package/dist/transformation/builtins/string.js +32 -30
  35. package/dist/transformation/builtins/symbol.js +3 -3
  36. package/dist/transformation/context/context.js +5 -5
  37. package/dist/transformation/index.js +1 -1
  38. package/dist/transformation/utils/annotations.d.ts +1 -4
  39. package/dist/transformation/utils/annotations.js +2 -39
  40. package/dist/transformation/utils/assignment-validation.js +8 -7
  41. package/dist/transformation/utils/diagnostics.d.ts +3 -0
  42. package/dist/transformation/utils/diagnostics.js +6 -5
  43. package/dist/transformation/utils/export.d.ts +3 -2
  44. package/dist/transformation/utils/export.js +14 -7
  45. package/dist/transformation/utils/function-context.js +19 -13
  46. package/dist/transformation/utils/lua-ast.js +18 -19
  47. package/dist/transformation/utils/lualib.js +1 -1
  48. package/dist/transformation/utils/safe-names.js +5 -5
  49. package/dist/transformation/utils/scope.d.ts +6 -0
  50. package/dist/transformation/utils/scope.js +70 -40
  51. package/dist/transformation/utils/symbols.js +6 -6
  52. package/dist/transformation/utils/transform.js +3 -3
  53. package/dist/transformation/utils/typescript/nodes.d.ts +2 -0
  54. package/dist/transformation/utils/typescript/nodes.js +21 -1
  55. package/dist/transformation/visitors/access.js +16 -16
  56. package/dist/transformation/visitors/async-await.d.ts +6 -0
  57. package/dist/transformation/visitors/async-await.js +38 -0
  58. package/dist/transformation/visitors/binary-expression/assignments.js +29 -29
  59. package/dist/transformation/visitors/binary-expression/bit.js +4 -4
  60. package/dist/transformation/visitors/binary-expression/compound.js +18 -18
  61. package/dist/transformation/visitors/binary-expression/destructuring-assignments.js +17 -17
  62. package/dist/transformation/visitors/binary-expression/index.js +21 -21
  63. package/dist/transformation/visitors/block.js +6 -6
  64. package/dist/transformation/visitors/break-continue.js +4 -9
  65. package/dist/transformation/visitors/call.js +38 -33
  66. package/dist/transformation/visitors/class/decorators.js +3 -3
  67. package/dist/transformation/visitors/class/index.js +41 -34
  68. package/dist/transformation/visitors/class/members/accessors.js +6 -6
  69. package/dist/transformation/visitors/class/members/constructor.js +7 -7
  70. package/dist/transformation/visitors/class/members/fields.js +6 -6
  71. package/dist/transformation/visitors/class/members/method.js +6 -6
  72. package/dist/transformation/visitors/class/new.js +13 -13
  73. package/dist/transformation/visitors/class/setup.js +11 -11
  74. package/dist/transformation/visitors/class/utils.js +2 -2
  75. package/dist/transformation/visitors/conditional.js +6 -6
  76. package/dist/transformation/visitors/delete.js +4 -4
  77. package/dist/transformation/visitors/enum.js +8 -8
  78. package/dist/transformation/visitors/errors.js +30 -31
  79. package/dist/transformation/visitors/expression-statement.js +10 -6
  80. package/dist/transformation/visitors/function.js +33 -21
  81. package/dist/transformation/visitors/identifier.js +25 -19
  82. package/dist/transformation/visitors/index.js +4 -2
  83. package/dist/transformation/visitors/language-extensions/iterable.js +7 -7
  84. package/dist/transformation/visitors/language-extensions/multi.d.ts +1 -1
  85. package/dist/transformation/visitors/language-extensions/multi.js +5 -7
  86. package/dist/transformation/visitors/language-extensions/operators.js +6 -6
  87. package/dist/transformation/visitors/language-extensions/range.js +6 -6
  88. package/dist/transformation/visitors/language-extensions/table.js +5 -5
  89. package/dist/transformation/visitors/literal.d.ts +1 -2
  90. package/dist/transformation/visitors/literal.js +19 -42
  91. package/dist/transformation/visitors/loops/do-while.js +2 -2
  92. package/dist/transformation/visitors/loops/for-in.js +4 -4
  93. package/dist/transformation/visitors/loops/for-of.js +13 -13
  94. package/dist/transformation/visitors/loops/for.js +3 -3
  95. package/dist/transformation/visitors/loops/utils.js +9 -9
  96. package/dist/transformation/visitors/modules/export.js +13 -14
  97. package/dist/transformation/visitors/modules/import.js +10 -10
  98. package/dist/transformation/visitors/namespace.js +13 -13
  99. package/dist/transformation/visitors/return.d.ts +1 -0
  100. package/dist/transformation/visitors/return.js +41 -49
  101. package/dist/transformation/visitors/sourceFile.js +8 -8
  102. package/dist/transformation/visitors/spread.js +16 -11
  103. package/dist/transformation/visitors/switch.js +132 -30
  104. package/dist/transformation/visitors/template.js +5 -5
  105. package/dist/transformation/visitors/typeof.js +2 -2
  106. package/dist/transformation/visitors/typescript.js +1 -1
  107. package/dist/transformation/visitors/unary-expression.js +9 -9
  108. package/dist/transformation/visitors/variable-declaration.js +28 -28
  109. package/dist/transformation/visitors/void.d.ts +6 -0
  110. package/dist/transformation/visitors/void.js +23 -0
  111. package/dist/transpilation/bundle.d.ts +3 -0
  112. package/dist/transpilation/bundle.js +56 -13
  113. package/dist/transpilation/diagnostics.js +3 -3
  114. package/dist/transpilation/index.js +2 -2
  115. package/dist/transpilation/output-collector.js +2 -2
  116. package/dist/transpilation/plugins.js +1 -1
  117. package/dist/transpilation/resolve.js +28 -15
  118. package/dist/transpilation/transformers.d.ts +1 -0
  119. package/dist/transpilation/transformers.js +61 -25
  120. package/dist/transpilation/transpile.js +7 -7
  121. package/dist/transpilation/transpiler.js +8 -8
  122. package/dist/transpilation/utils.js +3 -2
  123. package/dist/tstl.js +8 -8
  124. package/dist/utils.js +2 -2
  125. package/package.json +15 -12
  126. package/dist/transformation/visitors/jsx/jsx.d.ts +0 -9
  127. package/dist/transformation/visitors/jsx/jsx.js +0 -237
  128. package/dist/transformation/visitors/jsx/xhtml.d.ts +0 -3
  129. package/dist/transformation/visitors/jsx/xhtml.js +0 -260
@@ -17,16 +17,16 @@ function transformArrayBindingElement(context, name) {
17
17
  return lua.createAnonymousIdentifier(name);
18
18
  }
19
19
  else if (ts.isIdentifier(name)) {
20
- return identifier_1.transformIdentifier(context, name);
20
+ return (0, identifier_1.transformIdentifier)(context, name);
21
21
  }
22
22
  else if (ts.isBindingElement(name)) {
23
23
  // TODO: It should always be true when called from `transformVariableDeclaration`,
24
24
  // but could be false from `transformForOfLuaIteratorStatement`.
25
- utils_1.assert(ts.isIdentifier(name.name));
26
- return identifier_1.transformIdentifier(context, name.name);
25
+ (0, utils_1.assert)(ts.isIdentifier(name.name));
26
+ return (0, identifier_1.transformIdentifier)(context, name.name);
27
27
  }
28
28
  else {
29
- utils_1.assertNever(name);
29
+ (0, utils_1.assertNever)(name);
30
30
  }
31
31
  }
32
32
  exports.transformArrayBindingElement = transformArrayBindingElement;
@@ -48,11 +48,11 @@ function transformBindingPattern(context, pattern, table, propertyAccessStack =
48
48
  continue;
49
49
  }
50
50
  // Build the path to the table
51
- const tableExpression = propertyAccessStack.reduce((path, property) => lua.createTableIndexExpression(path, literal_1.transformPropertyName(context, property)), table);
51
+ const tableExpression = propertyAccessStack.reduce((path, property) => lua.createTableIndexExpression(path, (0, literal_1.transformPropertyName)(context, property)), table);
52
52
  // The identifier of the new variable
53
- const variableName = identifier_1.transformIdentifier(context, element.name);
53
+ const variableName = (0, identifier_1.transformIdentifier)(context, element.name);
54
54
  // The field to extract
55
- const propertyName = literal_1.transformPropertyName(context, (_a = element.propertyName) !== null && _a !== void 0 ? _a : element.name);
55
+ const propertyName = (0, literal_1.transformPropertyName)(context, (_a = element.propertyName) !== null && _a !== void 0 ? _a : element.name);
56
56
  let expression;
57
57
  if (element.dotDotDotToken) {
58
58
  if (index !== pattern.elements.length - 1) {
@@ -78,18 +78,18 @@ function transformBindingPattern(context, pattern, table, propertyAccessStack =
78
78
  }
79
79
  }
80
80
  const excludedPropertiesTable = excludedProperties.map(e => lua.createTableFieldExpression(lua.createBooleanLiteral(true), lua.createStringLiteral(e.text, e)));
81
- expression = lualib_1.transformLuaLibFunction(context, lualib_1.LuaLibFeature.ObjectRest, undefined, tableExpression, lua.createTableExpression(excludedPropertiesTable));
81
+ expression = (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ObjectRest, undefined, tableExpression, lua.createTableExpression(excludedPropertiesTable));
82
82
  }
83
83
  else {
84
- expression = lualib_1.transformLuaLibFunction(context, lualib_1.LuaLibFeature.ArraySlice, undefined, tableExpression, lua.createNumericLiteral(index));
84
+ expression = (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArraySlice, undefined, tableExpression, lua.createNumericLiteral(index));
85
85
  }
86
86
  }
87
87
  else {
88
88
  expression = lua.createTableIndexExpression(tableExpression, ts.isObjectBindingPattern(pattern) ? propertyName : lua.createNumericLiteral(index + 1));
89
89
  }
90
- result.push(...lua_ast_1.createLocalOrExportedOrGlobalDeclaration(context, variableName, expression));
90
+ result.push(...(0, lua_ast_1.createLocalOrExportedOrGlobalDeclaration)(context, variableName, expression));
91
91
  if (element.initializer) {
92
- const identifier = export_1.addExportToIdentifier(context, variableName);
92
+ const identifier = (0, export_1.addExportToIdentifier)(context, variableName);
93
93
  result.push(lua.createIfStatement(lua.createBinaryExpression(identifier, lua.createNilLiteral(), lua.SyntaxKind.EqualityOperator), lua.createBlock([
94
94
  lua.createAssignmentStatement(identifier, context.transformExpression(element.initializer)),
95
95
  ])));
@@ -106,15 +106,15 @@ function transformBindingVariableDeclaration(context, bindingPattern, initialize
106
106
  if (ts.isObjectBindingPattern(bindingPattern) || bindingPattern.elements.some(isComplexBindingElement)) {
107
107
  let table;
108
108
  if (initializer !== undefined && ts.isIdentifier(initializer)) {
109
- table = identifier_1.transformIdentifier(context, initializer);
109
+ table = (0, identifier_1.transformIdentifier)(context, initializer);
110
110
  }
111
111
  else {
112
112
  // Contain the expression in a temporary variable
113
113
  table = lua.createAnonymousIdentifier();
114
114
  if (initializer) {
115
115
  let expression = context.transformExpression(initializer);
116
- if (multi_1.isMultiReturnCall(context, initializer)) {
117
- expression = lua_ast_1.wrapInTable(expression);
116
+ if ((0, multi_1.isMultiReturnCall)(context, initializer)) {
117
+ expression = (0, lua_ast_1.wrapInTable)(expression);
118
118
  }
119
119
  statements.push(lua.createVariableDeclarationStatement(table, expression));
120
120
  }
@@ -126,30 +126,30 @@ function transformBindingVariableDeclaration(context, bindingPattern, initialize
126
126
  ? bindingPattern.elements.map(e => transformArrayBindingElement(context, e))
127
127
  : lua.createAnonymousIdentifier();
128
128
  if (initializer) {
129
- if (multi_1.isMultiReturnCall(context, initializer)) {
129
+ if ((0, multi_1.isMultiReturnCall)(context, initializer)) {
130
130
  // Don't unpack LuaMultiReturn functions
131
- statements.push(...lua_ast_1.createLocalOrExportedOrGlobalDeclaration(context, vars, context.transformExpression(initializer), initializer));
131
+ statements.push(...(0, lua_ast_1.createLocalOrExportedOrGlobalDeclaration)(context, vars, context.transformExpression(initializer), initializer));
132
132
  }
133
133
  else if (ts.isArrayLiteralExpression(initializer)) {
134
134
  // Don't unpack array literals
135
135
  const values = initializer.elements.length > 0
136
136
  ? initializer.elements.map(e => context.transformExpression(e))
137
137
  : lua.createNilLiteral();
138
- statements.push(...lua_ast_1.createLocalOrExportedOrGlobalDeclaration(context, vars, values, initializer));
138
+ statements.push(...(0, lua_ast_1.createLocalOrExportedOrGlobalDeclaration)(context, vars, values, initializer));
139
139
  }
140
140
  else {
141
141
  // local vars = this.transpileDestructingAssignmentValue(node.initializer);
142
- const unpackedInitializer = lua_ast_1.createUnpackCall(context, context.transformExpression(initializer), initializer);
143
- statements.push(...lua_ast_1.createLocalOrExportedOrGlobalDeclaration(context, vars, unpackedInitializer, initializer));
142
+ const unpackedInitializer = (0, lua_ast_1.createUnpackCall)(context, context.transformExpression(initializer), initializer);
143
+ statements.push(...(0, lua_ast_1.createLocalOrExportedOrGlobalDeclaration)(context, vars, unpackedInitializer, initializer));
144
144
  }
145
145
  }
146
146
  else {
147
- statements.push(...lua_ast_1.createLocalOrExportedOrGlobalDeclaration(context, vars, lua.createNilLiteral(), initializer));
147
+ statements.push(...(0, lua_ast_1.createLocalOrExportedOrGlobalDeclaration)(context, vars, lua.createNilLiteral(), initializer));
148
148
  }
149
149
  for (const element of bindingPattern.elements) {
150
150
  if (!ts.isOmittedExpression(element) && element.initializer) {
151
- const variableName = identifier_1.transformIdentifier(context, element.name);
152
- const identifier = export_1.addExportToIdentifier(context, variableName);
151
+ const variableName = (0, identifier_1.transformIdentifier)(context, element.name);
152
+ const identifier = (0, export_1.addExportToIdentifier)(context, variableName);
153
153
  statements.push(lua.createIfStatement(lua.createBinaryExpression(identifier, lua.createNilLiteral(), lua.SyntaxKind.EqualityOperator), lua.createBlock([
154
154
  lua.createAssignmentStatement(identifier, context.transformExpression(element.initializer)),
155
155
  ])));
@@ -163,27 +163,27 @@ function transformVariableDeclaration(context, statement) {
163
163
  if (statement.initializer && statement.type) {
164
164
  const initializerType = context.checker.getTypeAtLocation(statement.initializer);
165
165
  const varType = context.checker.getTypeFromTypeNode(statement.type);
166
- assignment_validation_1.validateAssignment(context, statement.initializer, initializerType, varType);
166
+ (0, assignment_validation_1.validateAssignment)(context, statement.initializer, initializerType, varType);
167
167
  }
168
168
  if (ts.isIdentifier(statement.name)) {
169
169
  // Find variable identifier
170
- const identifierName = identifier_1.transformIdentifier(context, statement.name);
170
+ const identifierName = (0, identifier_1.transformIdentifier)(context, statement.name);
171
171
  const value = statement.initializer && context.transformExpression(statement.initializer);
172
- return lua_ast_1.createLocalOrExportedOrGlobalDeclaration(context, identifierName, value, statement);
172
+ return (0, lua_ast_1.createLocalOrExportedOrGlobalDeclaration)(context, identifierName, value, statement);
173
173
  }
174
174
  else if (ts.isArrayBindingPattern(statement.name) || ts.isObjectBindingPattern(statement.name)) {
175
175
  return transformBindingVariableDeclaration(context, statement.name, statement.initializer);
176
176
  }
177
177
  else {
178
- return utils_1.assertNever(statement.name);
178
+ return (0, utils_1.assertNever)(statement.name);
179
179
  }
180
180
  }
181
181
  exports.transformVariableDeclaration = transformVariableDeclaration;
182
182
  function checkVariableDeclarationList(context, node) {
183
183
  if ((node.flags & (ts.NodeFlags.Let | ts.NodeFlags.Const)) === 0) {
184
184
  const token = node.getFirstToken();
185
- utils_1.assert(token);
186
- context.diagnostics.push(diagnostics_1.unsupportedVarDeclaration(token));
185
+ (0, utils_1.assert)(token);
186
+ context.diagnostics.push((0, diagnostics_1.unsupportedVarDeclaration)(token));
187
187
  }
188
188
  }
189
189
  exports.checkVariableDeclarationList = checkVariableDeclarationList;
@@ -0,0 +1,6 @@
1
+ import * as ts from "typescript";
2
+ import * as lua from "../../LuaAST";
3
+ import { TransformationContext } from "../context";
4
+ import { FunctionVisitor } from "../context/visitors";
5
+ export declare const transformVoidExpression: FunctionVisitor<ts.VoidExpression>;
6
+ export declare const transformVoidExpressionStatement: (node: ts.VoidExpression, context: TransformationContext) => lua.VariableDeclarationStatement;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transformVoidExpressionStatement = exports.transformVoidExpression = void 0;
4
+ const ts = require("typescript");
5
+ const lua = require("../../LuaAST");
6
+ const lua_ast_1 = require("../utils/lua-ast");
7
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void
8
+ const transformVoidExpression = (node, context) => {
9
+ // If content is a literal it is safe to replace the entire expression with nil
10
+ if (ts.isLiteralExpression(node.expression)) {
11
+ return lua.createNilLiteral(node);
12
+ }
13
+ // (function() local ____ = <expression> end)()
14
+ return (0, lua_ast_1.createImmediatelyInvokedFunctionExpression)([
15
+ lua.createVariableDeclarationStatement(lua.createAnonymousIdentifier(), context.transformExpression(node.expression)),
16
+ ], [], node);
17
+ };
18
+ exports.transformVoidExpression = transformVoidExpression;
19
+ const transformVoidExpressionStatement = (node, context) =>
20
+ // In case of a void expression statement we can omit the IIFE
21
+ lua.createVariableDeclarationStatement(lua.createAnonymousIdentifier(), context.transformExpression(node.expression), node);
22
+ exports.transformVoidExpressionStatement = transformVoidExpressionStatement;
23
+ //# sourceMappingURL=void.js.map
@@ -1,3 +1,6 @@
1
+ import { SourceNode } from "source-map";
1
2
  import * as ts from "typescript";
2
3
  import { EmitFile, ProcessedFile } from "./utils";
4
+ export declare const sourceMapTracebackBundlePlaceholder = "{#SourceMapTracebackBundle}";
5
+ export declare function printStackTraceBundleOverride(rootNode: SourceNode): string;
3
6
  export declare function getBundleResult(program: ts.Program, files: ProcessedFile[]): [ts.Diagnostic[], EmitFile];
@@ -1,24 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getBundleResult = void 0;
3
+ exports.getBundleResult = exports.printStackTraceBundleOverride = exports.sourceMapTracebackBundlePlaceholder = void 0;
4
4
  const path = require("path");
5
5
  const source_map_1 = require("source-map");
6
6
  const LuaPrinter_1 = require("../LuaPrinter");
7
7
  const utils_1 = require("../utils");
8
8
  const diagnostics_1 = require("./diagnostics");
9
9
  const transpiler_1 = require("./transpiler");
10
- const createModulePath = (pathToResolve, program) => LuaPrinter_1.escapeString(utils_1.formatPathToLuaPath(utils_1.trimExtension(transpiler_1.getEmitPathRelativeToOutDir(pathToResolve, program))));
10
+ const createModulePath = (pathToResolve, program) => (0, LuaPrinter_1.escapeString)((0, utils_1.formatPathToLuaPath)((0, utils_1.trimExtension)((0, transpiler_1.getEmitPathRelativeToOutDir)(pathToResolve, program))));
11
11
  // Override `require` to read from ____modules table.
12
12
  const requireOverride = `
13
13
  local ____modules = {}
14
14
  local ____moduleCache = {}
15
15
  local ____originalRequire = require
16
- local function require(file)
16
+ local function require(file, ...)
17
17
  if ____moduleCache[file] then
18
18
  return ____moduleCache[file].value
19
19
  end
20
20
  if ____modules[file] then
21
- ____moduleCache[file] = { value = ____modules[file]() }
21
+ local module = ____modules[file]
22
+ ____moduleCache[file] = { value = (select("#", ...) > 0) and module(...) or module(file) }
22
23
  return ____moduleCache[file].value
23
24
  else
24
25
  if ____originalRequire then
@@ -29,29 +30,71 @@ local function require(file)
29
30
  end
30
31
  end
31
32
  `;
33
+ exports.sourceMapTracebackBundlePlaceholder = "{#SourceMapTracebackBundle}";
34
+ function printStackTraceBundleOverride(rootNode) {
35
+ const map = {};
36
+ const getLineNumber = (line, fallback) => {
37
+ const data = map[line];
38
+ if (data === undefined) {
39
+ return fallback;
40
+ }
41
+ if (typeof data === "number") {
42
+ return data;
43
+ }
44
+ return data.line;
45
+ };
46
+ const transformLineData = (data) => {
47
+ if (typeof data === "number") {
48
+ return data;
49
+ }
50
+ return `{line = ${data.line}, file = "${data.file}"}`;
51
+ };
52
+ let currentLine = 1;
53
+ rootNode.walk((chunk, mappedPosition) => {
54
+ if (mappedPosition.line !== undefined && mappedPosition.line > 0) {
55
+ const line = getLineNumber(currentLine, mappedPosition.line);
56
+ map[currentLine] = {
57
+ line,
58
+ file: path.basename(mappedPosition.source),
59
+ };
60
+ }
61
+ currentLine += chunk.split("\n").length - 1;
62
+ });
63
+ const mapItems = Object.entries(map).map(([line, original]) => `["${line}"] = ${transformLineData(original)}`);
64
+ const mapString = "{" + mapItems.join(",") + "}";
65
+ return `__TS__SourceMapTraceBack(debug.getinfo(1).short_src, ${mapString});`;
66
+ }
67
+ exports.printStackTraceBundleOverride = printStackTraceBundleOverride;
32
68
  function getBundleResult(program, files) {
33
69
  const diagnostics = [];
34
70
  const options = program.getCompilerOptions();
35
- const bundleFile = utils_1.cast(options.luaBundle, utils_1.isNonNull);
36
- const entryModule = utils_1.cast(options.luaBundleEntry, utils_1.isNonNull);
71
+ const bundleFile = (0, utils_1.cast)(options.luaBundle, utils_1.isNonNull);
72
+ const entryModule = (0, utils_1.cast)(options.luaBundleEntry, utils_1.isNonNull);
37
73
  // Resolve project settings relative to project file.
38
- const resolvedEntryModule = path.resolve(transpiler_1.getSourceDir(program), entryModule);
39
- const outputPath = path.resolve(transpiler_1.getEmitOutDir(program), bundleFile);
74
+ const resolvedEntryModule = path.resolve((0, transpiler_1.getSourceDir)(program), entryModule);
75
+ const outputPath = path.resolve((0, transpiler_1.getEmitOutDir)(program), bundleFile);
40
76
  if (program.getSourceFile(resolvedEntryModule) === undefined && program.getSourceFile(entryModule) === undefined) {
41
- diagnostics.push(diagnostics_1.couldNotFindBundleEntryPoint(entryModule));
77
+ diagnostics.push((0, diagnostics_1.couldNotFindBundleEntryPoint)(entryModule));
42
78
  }
43
79
  // For each file: ["<module path>"] = function() <lua content> end,
44
80
  const moduleTableEntries = files.map(f => moduleSourceNode(f, createModulePath(f.fileName, program)));
45
81
  // Create ____modules table containing all entries from moduleTableEntries
46
82
  const moduleTable = createModuleTableNode(moduleTableEntries);
47
83
  // return require("<entry module path>")
48
- const entryPoint = `return require(${createModulePath(entryModule, program)})\n`;
49
- const sourceChunks = [requireOverride, moduleTable, entryPoint];
84
+ const entryPoint = `return require(${createModulePath(entryModule, program)}, ...)\n`;
85
+ const footers = [];
86
+ if (options.sourceMapTraceback) {
87
+ // Generates SourceMapTraceback for the entire file
88
+ footers.push('require("lualib_bundle")\n');
89
+ footers.push(`${exports.sourceMapTracebackBundlePlaceholder}\n`);
90
+ }
91
+ const sourceChunks = [requireOverride, moduleTable, ...footers, entryPoint];
50
92
  if (!options.noHeader) {
51
93
  sourceChunks.unshift(LuaPrinter_1.tstlHeader);
52
94
  }
53
95
  const bundleNode = joinSourceChunks(sourceChunks);
54
- const { code, map } = bundleNode.toStringWithSourceMap();
96
+ let { code, map } = bundleNode.toStringWithSourceMap();
97
+ code = code.replace(exports.sourceMapTracebackBundlePlaceholder, printStackTraceBundleOverride(bundleNode));
55
98
  return [
56
99
  diagnostics,
57
100
  {
@@ -64,7 +107,7 @@ function getBundleResult(program, files) {
64
107
  }
65
108
  exports.getBundleResult = getBundleResult;
66
109
  function moduleSourceNode({ code, sourceMapNode }, modulePath) {
67
- const tableEntryHead = `[${modulePath}] = function() `;
110
+ const tableEntryHead = `[${modulePath}] = function(...) \n`;
68
111
  const tableEntryTail = " end,\n";
69
112
  return joinSourceChunks([tableEntryHead, sourceMapNode !== null && sourceMapNode !== void 0 ? sourceMapNode : code, tableEntryTail]);
70
113
  }
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.unsupportedJsxEmit = exports.cannotBundleLibrary = exports.usingLuaBundleWithInlineMightGenerateDuplicateCode = exports.luaBundleEntryIsRequired = exports.couldNotFindBundleEntryPoint = exports.transformerShouldBeATsTransformerFactory = exports.shouldHaveAExport = exports.couldNotResolveFrom = exports.toLoadItShouldBeTranspiled = exports.couldNotReadDependency = exports.couldNotResolveRequire = void 0;
4
4
  const ts = require("typescript");
5
5
  const utils_1 = require("../utils");
6
- const createDiagnosticFactory = (getMessage, category = ts.DiagnosticCategory.Error) => utils_1.createSerialDiagnosticFactory((...args) => ({ messageText: getMessage(...args), category }));
7
- exports.couldNotResolveRequire = createDiagnosticFactory((requirePath, containingFile) => `Could not resolve require path '${requirePath}' in file ${containingFile}.`);
6
+ const createDiagnosticFactory = (getMessage, category = ts.DiagnosticCategory.Error) => (0, utils_1.createSerialDiagnosticFactory)((...args) => ({ messageText: getMessage(...args), category }));
7
+ exports.couldNotResolveRequire = createDiagnosticFactory((requirePath, containingFile) => `Could not resolve lua source files for require path '${requirePath}' in file ${containingFile}.`);
8
8
  exports.couldNotReadDependency = createDiagnosticFactory((dependency) => `Could not read content of resolved dependency ${dependency}.`);
9
9
  exports.toLoadItShouldBeTranspiled = createDiagnosticFactory((kind, transform) => `To load "${transform}" ${kind} it should be transpiled or "ts-node" should be installed.`);
10
10
  exports.couldNotResolveFrom = createDiagnosticFactory((kind, transform, base) => `Could not resolve "${transform}" ${kind} from "${base}".`);
@@ -12,7 +12,7 @@ exports.shouldHaveAExport = createDiagnosticFactory((kind, transform, importName
12
12
  exports.transformerShouldBeATsTransformerFactory = createDiagnosticFactory((transform) => `"${transform}" transformer should be a ts.TransformerFactory or an object with ts.TransformerFactory values.`);
13
13
  exports.couldNotFindBundleEntryPoint = createDiagnosticFactory((entryPoint) => `Could not find bundle entry point '${entryPoint}'. It should be a file in the project.`);
14
14
  exports.luaBundleEntryIsRequired = createDiagnosticFactory(() => "'luaBundleEntry' is required when 'luaBundle' is enabled.");
15
- exports.usingLuaBundleWithInlineMightGenerateDuplicateCode = utils_1.createSerialDiagnosticFactory(() => ({
15
+ exports.usingLuaBundleWithInlineMightGenerateDuplicateCode = (0, utils_1.createSerialDiagnosticFactory)(() => ({
16
16
  category: ts.DiagnosticCategory.Warning,
17
17
  messageText: "Using 'luaBundle' with 'luaLibImport: \"inline\"' might generate duplicate code. " +
18
18
  "It is recommended to use 'luaLibImport: \"require\"'.",
@@ -30,7 +30,7 @@ function transpileFiles(rootNames, options = {}, writeFile) {
30
30
  }
31
31
  exports.transpileFiles = transpileFiles;
32
32
  function transpileProject(configFileName, optionsToExtend, writeFile) {
33
- const parseResult = tsconfig_1.parseConfigFileWithSystem(configFileName, optionsToExtend);
33
+ const parseResult = (0, tsconfig_1.parseConfigFileWithSystem)(configFileName, optionsToExtend);
34
34
  if (parseResult.errors.length > 0) {
35
35
  return { diagnostics: parseResult.errors, emitSkipped: true };
36
36
  }
@@ -76,7 +76,7 @@ function createVirtualProgram(input, options = {}) {
76
76
  exports.createVirtualProgram = createVirtualProgram;
77
77
  function transpileVirtualProject(files, options = {}) {
78
78
  const program = createVirtualProgram(files, options);
79
- const collector = output_collector_1.createEmitOutputCollector();
79
+ const collector = (0, output_collector_1.createEmitOutputCollector)();
80
80
  const { diagnostics: transpileDiagnostics } = new transpiler_1.Transpiler().emit({ program, writeFile: collector.writeFile });
81
81
  const diagnostics = ts.sortAndDeduplicateDiagnostics([
82
82
  ...ts.getPreEmitDiagnostics(program),
@@ -5,13 +5,13 @@ const utils_1 = require("../utils");
5
5
  function createEmitOutputCollector() {
6
6
  const files = [];
7
7
  const writeFile = (fileName, data, _bom, _onError, sourceFiles = []) => {
8
- let file = files.find(f => utils_1.intersection(f.sourceFiles, sourceFiles).length > 0);
8
+ let file = files.find(f => (0, utils_1.intersection)(f.sourceFiles, sourceFiles).length > 0);
9
9
  if (!file) {
10
10
  file = { outPath: fileName, sourceFiles: [...sourceFiles] };
11
11
  files.push(file);
12
12
  }
13
13
  else {
14
- file.sourceFiles = utils_1.union(file.sourceFiles, sourceFiles);
14
+ file.sourceFiles = (0, utils_1.union)(file.sourceFiles, sourceFiles);
15
15
  }
16
16
  if (fileName.endsWith(".lua")) {
17
17
  file.lua = data;
@@ -8,7 +8,7 @@ function getPlugins(program, diagnostics, customPlugins) {
8
8
  const options = program.getCompilerOptions();
9
9
  for (const [index, pluginOption] of ((_a = options.luaPlugins) !== null && _a !== void 0 ? _a : []).entries()) {
10
10
  const optionName = `tstl.luaPlugins[${index}]`;
11
- const { error: resolveError, result: factory } = utils_1.resolvePlugin("plugin", `${optionName}.name`, utils_1.getConfigDirectory(options), pluginOption.name, pluginOption.import);
11
+ const { error: resolveError, result: factory } = (0, utils_1.resolvePlugin)("plugin", `${optionName}.name`, (0, utils_1.getConfigDirectory)(options), pluginOption.name, pluginOption.import);
12
12
  if (resolveError)
13
13
  diagnostics.push(resolveError);
14
14
  if (factory === undefined)
@@ -21,15 +21,22 @@ class ResolutionContext {
21
21
  this.options = options;
22
22
  this.emitHost = emitHost;
23
23
  this.resultsCache = new Map();
24
+ this.noResolvePaths = new Set(options.noResolvePaths);
24
25
  }
25
26
  resolve(file, required) {
27
+ if (this.noResolvePaths.has(required)) {
28
+ if (this.options.tstlVerbose) {
29
+ console.log(`Skipping module resolution of ${required} as it is in the tsconfig noResolvePaths.`);
30
+ }
31
+ return { resolvedFiles: [], diagnostics: [] };
32
+ }
26
33
  const resolvedDependency = resolveDependency(file, required, this.program, this.emitHost);
27
34
  if (resolvedDependency) {
28
35
  if (this.options.tstlVerbose) {
29
- console.log(`Resolved ${required} to ${utils_1.normalizeSlashes(resolvedDependency)}`);
36
+ console.log(`Resolved ${required} to ${(0, utils_1.normalizeSlashes)(resolvedDependency)}`);
30
37
  }
31
38
  // Figure out resolved require path and dependency output path
32
- const resolvedRequire = transpiler_1.getEmitPathRelativeToOutDir(resolvedDependency, this.program);
39
+ const resolvedRequire = (0, transpiler_1.getEmitPathRelativeToOutDir)(resolvedDependency, this.program);
33
40
  if (shouldRewriteRequires(resolvedDependency, this.program)) {
34
41
  replaceRequireInCode(file, required, resolvedRequire);
35
42
  replaceRequireInSourceMap(file, required, resolvedRequire);
@@ -37,7 +44,7 @@ class ResolutionContext {
37
44
  // Check cache to prevent resolving nested dependencies double to break dependency loops
38
45
  if (this.resultsCache.has(resolvedDependency)) {
39
46
  if (this.options.tstlVerbose) {
40
- console.log(`Resolution cache hit for ${utils_1.normalizeSlashes(resolvedDependency)}`);
47
+ console.log(`Resolution cache hit for ${(0, utils_1.normalizeSlashes)(resolvedDependency)}`);
41
48
  }
42
49
  return this.resultsCache.get(resolvedDependency);
43
50
  }
@@ -46,7 +53,7 @@ class ResolutionContext {
46
53
  // If dependency resolved successfully, read its content
47
54
  const dependencyContent = this.emitHost.readFile(resolvedDependency);
48
55
  if (dependencyContent === undefined) {
49
- return { resolvedFiles: [], diagnostics: [diagnostics_1.couldNotReadDependency(resolvedDependency)] };
56
+ return { resolvedFiles: [], diagnostics: [(0, diagnostics_1.couldNotReadDependency)(resolvedDependency)] };
50
57
  }
51
58
  const dependency = {
52
59
  fileName: resolvedDependency,
@@ -71,13 +78,13 @@ class ResolutionContext {
71
78
  }
72
79
  }
73
80
  else {
74
- const fallbackRequire = fallbackResolve(required, transpiler_1.getSourceDir(this.program), path.dirname(file.fileName));
81
+ const fallbackRequire = fallbackResolve(required, (0, transpiler_1.getSourceDir)(this.program), path.dirname(file.fileName));
75
82
  replaceRequireInCode(file, required, fallbackRequire);
76
83
  replaceRequireInSourceMap(file, required, fallbackRequire);
77
84
  return {
78
85
  resolvedFiles: [],
79
86
  diagnostics: [
80
- diagnostics_1.couldNotResolveRequire(required, path.relative(transpiler_1.getProjectRoot(this.program), file.fileName)),
87
+ (0, diagnostics_1.couldNotResolveRequire)(required, path.relative((0, transpiler_1.getProjectRoot)(this.program), file.fileName)),
81
88
  ],
82
89
  };
83
90
  }
@@ -91,7 +98,7 @@ function resolveDependencies(program, files, emitHost) {
91
98
  // Resolve dependencies for all processed files
92
99
  for (const file of files) {
93
100
  if (options.tstlVerbose) {
94
- console.log(`Resolving dependencies for ${utils_1.normalizeSlashes(file.fileName)}`);
101
+ console.log(`Resolving dependencies for ${(0, utils_1.normalizeSlashes)(file.fileName)}`);
95
102
  }
96
103
  const resolutionResult = resolveFileDependencies(file, resolutionContext);
97
104
  outFiles.push(...resolutionResult.resolvedFiles);
@@ -135,10 +142,15 @@ function resolveDependency(requiringFile, dependency, program, emitHost) {
135
142
  const options = program.getCompilerOptions();
136
143
  const fileDirectory = path.dirname(requiringFile.fileName);
137
144
  if (options.tstlVerbose) {
138
- console.log(`Resolving "${dependency}" from ${utils_1.normalizeSlashes(fileDirectory)}`);
145
+ console.log(`Resolving "${dependency}" from ${(0, utils_1.normalizeSlashes)(fileDirectory)}`);
139
146
  }
147
+ // Check if the import is relative
148
+ const isRelative = ["/", "./", "../"].some(p => dependency.startsWith(p));
149
+ // If the import is relative, always resolve it relative to the requiring file
150
+ // If the import is not relative, resolve it relative to options.baseUrl if it is set
151
+ const relativeTo = isRelative ? fileDirectory : (_a = options.baseUrl) !== null && _a !== void 0 ? _a : fileDirectory;
140
152
  // Check if file is a file in the project
141
- const resolvedPath = path.join((_a = options.baseUrl) !== null && _a !== void 0 ? _a : fileDirectory, dependency);
153
+ const resolvedPath = path.join(relativeTo, dependency);
142
154
  const possibleProjectFiles = [
143
155
  resolvedPath,
144
156
  resolvedPath + ".ts",
@@ -154,7 +166,8 @@ function resolveDependency(requiringFile, dependency, program, emitHost) {
154
166
  // Check if this is a lua file in the project sources
155
167
  const possibleLuaProjectFiles = [
156
168
  resolvedPath + ".lua",
157
- path.join(resolvedPath, "index.lua"), // lua index file in sources
169
+ path.join(resolvedPath, "index.lua"),
170
+ path.join(resolvedPath, "init.lua"), // lua looks for <require>/init.lua if it cannot find <require>.lua
158
171
  ];
159
172
  for (const possibleFile of possibleLuaProjectFiles) {
160
173
  if (emitHost.fileExists(possibleFile)) {
@@ -231,7 +244,7 @@ function isBuildModeLibrary(program) {
231
244
  function findRequiredPaths(code) {
232
245
  // Find all require("<path>") paths in a lua code string
233
246
  const paths = [];
234
- const pattern = /(^|\s|;|=)require\("(.+)"\)/g;
247
+ const pattern = /(^|\s|;|=)require\("(.+?)"\)/g;
235
248
  // eslint-disable-next-line @typescript-eslint/ban-types
236
249
  let match;
237
250
  while ((match = pattern.exec(code))) {
@@ -240,13 +253,13 @@ function findRequiredPaths(code) {
240
253
  return paths;
241
254
  }
242
255
  function replaceRequireInCode(file, originalRequire, newRequire) {
243
- const requirePath = utils_1.formatPathToLuaPath(newRequire.replace(".lua", ""));
256
+ const requirePath = (0, utils_1.formatPathToLuaPath)(newRequire.replace(".lua", ""));
244
257
  // Escape special characters to prevent the regex from breaking...
245
258
  const escapedRequire = originalRequire.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
246
259
  file.code = file.code.replace(new RegExp(`(^|\\s|;|=)require\\("${escapedRequire}"\\)`), `$1require("${requirePath}")`);
247
260
  }
248
261
  function replaceRequireInSourceMap(file, originalRequire, newRequire) {
249
- const requirePath = utils_1.formatPathToLuaPath(newRequire.replace(".lua", ""));
262
+ const requirePath = (0, utils_1.formatPathToLuaPath)(newRequire.replace(".lua", ""));
250
263
  if (file.sourceMapNode) {
251
264
  replaceInSourceMap(file.sourceMapNode, file.sourceMapNode, `"${originalRequire}"`, `"${requirePath}"`);
252
265
  }
@@ -275,14 +288,14 @@ function isProjectFile(file, program) {
275
288
  return program.getSourceFile(file) !== undefined;
276
289
  }
277
290
  function hasSourceFileInProject(filePath, program) {
278
- const pathWithoutExtension = utils_1.trimExtension(filePath);
291
+ const pathWithoutExtension = (0, utils_1.trimExtension)(filePath);
279
292
  return (isProjectFile(pathWithoutExtension + ".ts", program) ||
280
293
  isProjectFile(pathWithoutExtension + ".tsx", program) ||
281
294
  isProjectFile(pathWithoutExtension + ".json", program));
282
295
  }
283
296
  // Transform an import path to a lua require that is probably not correct, but can be used as fallback when regular resolution fails
284
297
  function fallbackResolve(required, sourceRootDir, fileDir) {
285
- return utils_1.formatPathToLuaPath(path
298
+ return (0, utils_1.formatPathToLuaPath)(path
286
299
  .normalize(path.join(path.relative(sourceRootDir, fileDir), required))
287
300
  .split(path.sep)
288
301
  .filter(s => s !== "." && s !== "..")
@@ -1,3 +1,4 @@
1
1
  import * as ts from "typescript";
2
2
  export declare function getTransformers(program: ts.Program, diagnostics: ts.Diagnostic[], customTransformers: ts.CustomTransformers, onSourceFile: (sourceFile: ts.SourceFile) => void): ts.CustomTransformers;
3
3
  export declare const noImplicitSelfTransformer: ts.TransformerFactory<ts.SourceFile | ts.Bundle>;
4
+ export declare const stripParenthesisExpressionsTransformer: ts.TransformerFactory<ts.SourceFile>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.noImplicitSelfTransformer = exports.getTransformers = void 0;
3
+ exports.stripParenthesisExpressionsTransformer = exports.noImplicitSelfTransformer = exports.getTransformers = void 0;
4
4
  const ts = require("typescript");
5
5
  // TODO: Don't depend on CLI?
6
6
  const cliDiagnostics = require("../cli/diagnostics");
@@ -28,6 +28,7 @@ function getTransformers(program, diagnostics, customTransformers, onSourceFile)
28
28
  ...((_d = transformersFromOptions.before) !== null && _d !== void 0 ? _d : []),
29
29
  ...((_e = transformersFromOptions.after) !== null && _e !== void 0 ? _e : []),
30
30
  ...((_f = customTransformers.after) !== null && _f !== void 0 ? _f : []),
31
+ exports.stripParenthesisExpressionsTransformer,
31
32
  luaTransformer,
32
33
  ],
33
34
  };
@@ -44,6 +45,27 @@ const noImplicitSelfTransformer = () => node => {
44
45
  : transformSourceFile(node);
45
46
  };
46
47
  exports.noImplicitSelfTransformer = noImplicitSelfTransformer;
48
+ const stripParenthesisExpressionsTransformer = context => sourceFile => {
49
+ // Remove parenthesis expressions before transforming to Lua, so transpiler is not hindered by extra ParenthesizedExpression nodes
50
+ function unwrapParentheses(node) {
51
+ while (ts.isParenthesizedExpression(node)) {
52
+ node = node.expression;
53
+ }
54
+ return node;
55
+ }
56
+ function visit(node) {
57
+ // For now only call expressions strip their expressions of parentheses, there could be more cases where this is required
58
+ if (ts.isCallExpression(node)) {
59
+ return ts.factory.updateCallExpression(node, unwrapParentheses(node.expression), node.typeArguments, node.arguments);
60
+ }
61
+ else if (ts.isVoidExpression(node)) {
62
+ return ts.factory.updateVoidExpression(node, unwrapParentheses(node.expression));
63
+ }
64
+ return ts.visitEachChild(node, visit, context);
65
+ }
66
+ return ts.visitNode(sourceFile, visit);
67
+ };
68
+ exports.stripParenthesisExpressionsTransformer = stripParenthesisExpressionsTransformer;
47
69
  function loadTransformersFromOptions(program, diagnostics) {
48
70
  const customTransformers = {
49
71
  before: [],
@@ -51,32 +73,46 @@ function loadTransformersFromOptions(program, diagnostics) {
51
73
  afterDeclarations: [],
52
74
  };
53
75
  const options = program.getCompilerOptions();
54
- if (!options.plugins)
55
- return customTransformers;
56
- for (const [index, transformerImport] of options.plugins.entries()) {
57
- if (!("transform" in transformerImport))
58
- continue;
59
- const optionName = `compilerOptions.plugins[${index}]`;
60
- const { error: resolveError, result: factory } = utils_1.resolvePlugin("transformer", `${optionName}.transform`, utils_1.getConfigDirectory(options), transformerImport.transform, transformerImport.import);
61
- if (resolveError)
62
- diagnostics.push(resolveError);
63
- if (factory === undefined)
64
- continue;
65
- const { error: loadError, transformer } = loadTransformer(optionName, program, factory, transformerImport);
66
- if (loadError)
67
- diagnostics.push(loadError);
68
- if (transformer === undefined)
69
- continue;
70
- if (transformer.before) {
71
- customTransformers.before.push(transformer.before);
72
- }
73
- if (transformer.after) {
74
- customTransformers.after.push(transformer.after);
75
- }
76
- if (transformer.afterDeclarations) {
77
- customTransformers.afterDeclarations.push(transformer.afterDeclarations);
76
+ if (options.plugins) {
77
+ for (const [index, transformerImport] of options.plugins.entries()) {
78
+ if (!("transform" in transformerImport))
79
+ continue;
80
+ const optionName = `compilerOptions.plugins[${index}]`;
81
+ const { error: resolveError, result: factory } = (0, utils_1.resolvePlugin)("transformer", `${optionName}.transform`, (0, utils_1.getConfigDirectory)(options), transformerImport.transform, transformerImport.import);
82
+ if (resolveError)
83
+ diagnostics.push(resolveError);
84
+ if (factory === undefined)
85
+ continue;
86
+ const { error: loadError, transformer } = loadTransformer(optionName, program, factory, transformerImport);
87
+ if (loadError)
88
+ diagnostics.push(loadError);
89
+ if (transformer === undefined)
90
+ continue;
91
+ if (transformer.before) {
92
+ customTransformers.before.push(transformer.before);
93
+ }
94
+ if (transformer.after) {
95
+ customTransformers.after.push(transformer.after);
96
+ }
97
+ if (transformer.afterDeclarations) {
98
+ customTransformers.afterDeclarations.push(transformer.afterDeclarations);
99
+ }
78
100
  }
79
101
  }
102
+ if (options.jsx === ts.JsxEmit.React) {
103
+ customTransformers.before.push(context => {
104
+ // if target < ES2017, typescript generates some unnecessary additional transformations in transformJSX.
105
+ // We can't control the target compiler option, so we override here.
106
+ const patchedContext = {
107
+ ...context,
108
+ getCompilerOptions: () => ({
109
+ ...context.getCompilerOptions(),
110
+ target: ts.ScriptTarget.ESNext,
111
+ }),
112
+ };
113
+ return ts.transformJsx(patchedContext);
114
+ });
115
+ }
80
116
  return customTransformers;
81
117
  }
82
118
  function loadTransformer(optionPath, program, factory, { transform, after = false, afterDeclarations = false, type = "program", ...extraOptions }) {