typescript-to-lua 1.4.0 → 1.4.3

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 (78) hide show
  1. package/dist/CompilerOptions.d.ts +4 -1
  2. package/dist/LuaAST.d.ts +9 -7
  3. package/dist/LuaAST.js +19 -13
  4. package/dist/LuaLib.d.ts +2 -2
  5. package/dist/LuaLib.js +2 -2
  6. package/dist/LuaPrinter.js +10 -11
  7. package/dist/cli/parse.js +5 -0
  8. package/dist/index.d.ts +1 -1
  9. package/dist/lualib/ArrayConcat.lua +16 -12
  10. package/dist/lualib/ArrayEvery.lua +4 -8
  11. package/dist/lualib/ArrayFilter.lua +6 -8
  12. package/dist/lualib/ArrayFind.lua +4 -7
  13. package/dist/lualib/ArrayFindIndex.lua +4 -9
  14. package/dist/lualib/ArrayFlat.lua +17 -7
  15. package/dist/lualib/ArrayFlatMap.lua +11 -10
  16. package/dist/lualib/ArrayForEach.lua +3 -7
  17. package/dist/lualib/ArrayFrom.lua +29 -0
  18. package/dist/lualib/ArrayIncludes.lua +2 -2
  19. package/dist/lualib/ArrayIndexOf.lua +13 -21
  20. package/dist/lualib/ArrayIsArray.lua +1 -1
  21. package/dist/lualib/ArrayJoin.lua +4 -7
  22. package/dist/lualib/ArrayMap.lua +5 -9
  23. package/dist/lualib/ArrayPush.lua +6 -4
  24. package/dist/lualib/ArrayPushArray.lua +8 -0
  25. package/dist/lualib/ArrayReduce.lua +8 -8
  26. package/dist/lualib/ArrayReduceRight.lua +8 -8
  27. package/dist/lualib/ArrayReverse.lua +7 -7
  28. package/dist/lualib/ArraySetLength.lua +3 -7
  29. package/dist/lualib/ArraySlice.lua +26 -19
  30. package/dist/lualib/ArraySome.lua +4 -8
  31. package/dist/lualib/ArraySort.lua +4 -4
  32. package/dist/lualib/ArraySplice.lua +47 -58
  33. package/dist/lualib/ArrayToObject.lua +3 -7
  34. package/dist/lualib/ArrayUnshift.lua +11 -8
  35. package/dist/lualib/FunctionBind.lua +5 -11
  36. package/dist/lualib/ObjectAssign.lua +5 -7
  37. package/dist/lualib/ObjectEntries.lua +3 -1
  38. package/dist/lualib/ObjectKeys.lua +3 -1
  39. package/dist/lualib/ObjectValues.lua +3 -1
  40. package/dist/lualib/Promise.lua +8 -7
  41. package/dist/lualib/PromiseAny.lua +3 -3
  42. package/dist/lualib/PromiseRace.lua +1 -1
  43. package/dist/lualib/Spread.lua +5 -7
  44. package/dist/lualib/StringReplace.lua +17 -14
  45. package/dist/lualib/StringReplaceAll.lua +36 -29
  46. package/dist/lualib/StringSplit.lua +32 -32
  47. package/dist/lualib/lualib_bundle.lua +425 -421
  48. package/dist/lualib/lualib_module_info.json +21 -22
  49. package/dist/transformation/builtins/array.d.ts +2 -2
  50. package/dist/transformation/builtins/array.js +40 -2
  51. package/dist/transformation/builtins/promise.d.ts +1 -0
  52. package/dist/transformation/builtins/promise.js +2 -1
  53. package/dist/transformation/builtins/string.js +1 -1
  54. package/dist/transformation/utils/diagnostics.d.ts +7 -2
  55. package/dist/transformation/utils/diagnostics.js +4 -1
  56. package/dist/transformation/utils/lua-ast.d.ts +1 -0
  57. package/dist/transformation/utils/lua-ast.js +6 -2
  58. package/dist/transformation/utils/typescript/index.d.ts +1 -0
  59. package/dist/transformation/utils/typescript/index.js +9 -1
  60. package/dist/transformation/visitors/call.js +4 -0
  61. package/dist/transformation/visitors/class/index.js +1 -1
  62. package/dist/transformation/visitors/class/members/accessors.js +1 -1
  63. package/dist/transformation/visitors/class/members/constructor.js +1 -1
  64. package/dist/transformation/visitors/errors.js +4 -2
  65. package/dist/transformation/visitors/function.js +4 -4
  66. package/dist/transformation/visitors/modules/import.d.ts +1 -0
  67. package/dist/transformation/visitors/modules/import.js +9 -1
  68. package/dist/transformation/visitors/spread.js +1 -7
  69. package/dist/transpilation/plugins.d.ts +10 -3
  70. package/dist/transpilation/plugins.js +6 -2
  71. package/dist/transpilation/resolve.js +1 -0
  72. package/dist/transpilation/transpile.d.ts +1 -1
  73. package/dist/transpilation/transpile.js +1 -6
  74. package/dist/transpilation/transpiler.js +19 -9
  75. package/dist/transpilation/utils.d.ts +2 -0
  76. package/package.json +1 -1
  77. package/dist/lualib/ArrayShift.lua +0 -3
  78. package/dist/lualib/StringConcat.lua +0 -8
@@ -40,6 +40,14 @@
40
40
  "__TS__ArrayFindIndex"
41
41
  ]
42
42
  },
43
+ "ArrayFrom": {
44
+ "exports": [
45
+ "__TS__ArrayFrom"
46
+ ],
47
+ "dependencies": [
48
+ "Iterator"
49
+ ]
50
+ },
43
51
  "ArrayIncludes": {
44
52
  "exports": [
45
53
  "__TS__ArrayIncludes"
@@ -70,6 +78,11 @@
70
78
  "__TS__ArrayPush"
71
79
  ]
72
80
  },
81
+ "ArrayPushArray": {
82
+ "exports": [
83
+ "__TS__ArrayPushArray"
84
+ ]
85
+ },
73
86
  "ArrayReduce": {
74
87
  "exports": [
75
88
  "__TS__ArrayReduce"
@@ -85,11 +98,6 @@
85
98
  "__TS__ArrayReverse"
86
99
  ]
87
100
  },
88
- "ArrayShift": {
89
- "exports": [
90
- "__TS__ArrayShift"
91
- ]
92
- },
93
101
  "ArrayUnshift": {
94
102
  "exports": [
95
103
  "__TS__ArrayUnshift"
@@ -126,7 +134,7 @@
126
134
  ],
127
135
  "dependencies": [
128
136
  "ArrayIsArray",
129
- "ArrayConcat"
137
+ "ArrayFlat"
130
138
  ]
131
139
  },
132
140
  "ArrayFlatMap": {
@@ -134,8 +142,7 @@
134
142
  "__TS__ArrayFlatMap"
135
143
  ],
136
144
  "dependencies": [
137
- "ArrayIsArray",
138
- "ArrayConcat"
145
+ "ArrayIsArray"
139
146
  ]
140
147
  },
141
148
  "ArraySetLength": {
@@ -224,7 +231,8 @@
224
231
  "__TS__FunctionBind"
225
232
  ],
226
233
  "dependencies": [
227
- "Unpack"
234
+ "Unpack",
235
+ "ArrayUnshift"
228
236
  ]
229
237
  },
230
238
  "Generator": {
@@ -381,8 +389,7 @@
381
389
  "New",
382
390
  "InstanceOf",
383
391
  "Class",
384
- "FunctionBind",
385
- "ArrayPush"
392
+ "FunctionBind"
386
393
  ]
387
394
  },
388
395
  "PromiseAll": {
@@ -414,7 +421,6 @@
414
421
  "dependencies": [
415
422
  "InstanceOf",
416
423
  "Promise",
417
- "ArrayPush",
418
424
  "Iterator",
419
425
  "New"
420
426
  ]
@@ -426,7 +432,6 @@
426
432
  "dependencies": [
427
433
  "InstanceOf",
428
434
  "Promise",
429
- "ArrayPush",
430
435
  "Iterator",
431
436
  "New"
432
437
  ]
@@ -512,11 +517,6 @@
512
517
  "__TS__StringCharCodeAt"
513
518
  ]
514
519
  },
515
- "StringConcat": {
516
- "exports": [
517
- "__TS__StringConcat"
518
- ]
519
- },
520
520
  "StringEndsWith": {
521
521
  "exports": [
522
522
  "__TS__StringEndsWith"
@@ -545,6 +545,9 @@
545
545
  "StringReplaceAll": {
546
546
  "exports": [
547
547
  "__TS__StringReplaceAll"
548
+ ],
549
+ "dependencies": [
550
+ "StringSplit"
548
551
  ]
549
552
  },
550
553
  "StringSlice": {
@@ -555,10 +558,6 @@
555
558
  "StringSplit": {
556
559
  "exports": [
557
560
  "__TS__StringSplit"
558
- ],
559
- "dependencies": [
560
- "StringAccess",
561
- "StringSubstring"
562
561
  ]
563
562
  },
564
563
  "StringStartsWith": {
@@ -2,6 +2,6 @@ import * as ts from "typescript";
2
2
  import * as lua from "../../LuaAST";
3
3
  import { TransformationContext } from "../context";
4
4
  import { PropertyCallExpression } from "../visitors/call";
5
- export declare function transformArrayConstructorCall(context: TransformationContext, node: PropertyCallExpression): lua.CallExpression | undefined;
6
- export declare function transformArrayPrototypeCall(context: TransformationContext, node: PropertyCallExpression): lua.CallExpression | undefined;
5
+ export declare function transformArrayConstructorCall(context: TransformationContext, node: PropertyCallExpression): lua.Expression | undefined;
6
+ export declare function transformArrayPrototypeCall(context: TransformationContext, node: PropertyCallExpression): lua.Expression | undefined;
7
7
  export declare function transformArrayProperty(context: TransformationContext, node: ts.PropertyAccessExpression): lua.UnaryExpression | undefined;
@@ -1,24 +1,50 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.transformArrayProperty = exports.transformArrayPrototypeCall = exports.transformArrayConstructorCall = void 0;
4
+ const ts = require("typescript");
4
5
  const lua = require("../../LuaAST");
5
6
  const diagnostics_1 = require("../utils/diagnostics");
6
7
  const lualib_1 = require("../utils/lualib");
7
8
  const call_1 = require("../visitors/call");
8
9
  const typescript_1 = require("../utils/typescript");
10
+ const expression_list_1 = require("../visitors/expression-list");
11
+ const lua_ast_1 = require("../utils/lua-ast");
9
12
  function transformArrayConstructorCall(context, node) {
10
13
  const expression = node.expression;
11
14
  const signature = context.checker.getResolvedSignature(node);
12
15
  const params = (0, call_1.transformArguments)(context, node.arguments, signature);
13
16
  const expressionName = expression.name.text;
14
17
  switch (expressionName) {
18
+ case "from":
19
+ return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayFrom, node, ...params);
15
20
  case "isArray":
16
21
  return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayIsArray, node, ...params);
22
+ case "of":
23
+ return (0, lua_ast_1.wrapInTable)(...params);
17
24
  default:
18
25
  context.diagnostics.push((0, diagnostics_1.unsupportedProperty)(expression.name, "Array", expressionName));
19
26
  }
20
27
  }
21
28
  exports.transformArrayConstructorCall = transformArrayConstructorCall;
29
+ /**
30
+ * Optimized single element Array.push
31
+ *
32
+ * array[#array+1] = el
33
+ * return (#array + 1)
34
+ */
35
+ function transformSingleElementArrayPush(context, node, caller, param) {
36
+ const expressionIsUsed = !ts.isExpressionStatement((0, typescript_1.findFirstNonOuterParent)(node));
37
+ const arrayIdentifier = lua.isIdentifier(caller) ? caller : (0, expression_list_1.moveToPrecedingTemp)(context, caller);
38
+ // #array + 1
39
+ let lengthExpression = lua.createBinaryExpression(lua.createUnaryExpression(arrayIdentifier, lua.SyntaxKind.LengthOperator), lua.createNumericLiteral(1), lua.SyntaxKind.AdditionOperator);
40
+ if (expressionIsUsed) {
41
+ // store length in a temp
42
+ lengthExpression = (0, expression_list_1.moveToPrecedingTemp)(context, lengthExpression);
43
+ }
44
+ const pushStatement = lua.createAssignmentStatement(lua.createTableIndexExpression(arrayIdentifier, lengthExpression), param, node);
45
+ context.addPrecedingStatements(pushStatement);
46
+ return expressionIsUsed ? lengthExpression : lua.createNilLiteral();
47
+ }
22
48
  function transformArrayPrototypeCall(context, node) {
23
49
  const expression = node.expression;
24
50
  const signature = context.checker.getResolvedSignature(node);
@@ -30,11 +56,20 @@ function transformArrayPrototypeCall(context, node) {
30
56
  case "entries":
31
57
  return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayEntries, node, caller);
32
58
  case "push":
59
+ if (node.arguments.length === 1) {
60
+ const param = params[0];
61
+ if ((0, lua_ast_1.isUnpackCall)(param)) {
62
+ return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayPushArray, node, caller, param.params[0]);
63
+ }
64
+ if (!lua.isDotsLiteral(param)) {
65
+ return transformSingleElementArrayPush(context, node, caller, param);
66
+ }
67
+ }
33
68
  return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayPush, node, caller, ...params);
34
69
  case "reverse":
35
70
  return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayReverse, node, caller);
36
71
  case "shift":
37
- return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayShift, node, caller);
72
+ return lua.createCallExpression(lua.createTableIndexExpression(lua.createIdentifier("table"), lua.createStringLiteral("remove")), [caller, lua.createNumericLiteral(1)], node);
38
73
  case "unshift":
39
74
  return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ArrayUnshift, node, caller, ...params);
40
75
  case "sort":
@@ -72,11 +107,14 @@ function transformArrayPrototypeCall(context, node) {
72
107
  const elementType = context.checker.getElementTypeOfArrayType(callerType);
73
108
  if (elementType && ((0, typescript_1.isStringType)(context, elementType) || (0, typescript_1.isNumberType)(context, elementType))) {
74
109
  const defaultSeparatorLiteral = lua.createStringLiteral(",");
110
+ const param = params[0];
75
111
  const parameters = [
76
112
  caller,
77
113
  node.arguments.length === 0
78
114
  ? defaultSeparatorLiteral
79
- : lua.createBinaryExpression(params[0], defaultSeparatorLiteral, lua.SyntaxKind.OrOperator),
115
+ : lua.isStringLiteral(param)
116
+ ? param
117
+ : lua.createBinaryExpression(param, defaultSeparatorLiteral, lua.SyntaxKind.OrOperator),
80
118
  ];
81
119
  return lua.createCallExpression(lua.createTableIndexExpression(lua.createIdentifier("table"), lua.createStringLiteral("concat")), parameters, node);
82
120
  }
@@ -5,3 +5,4 @@ import { PropertyCallExpression } from "../visitors/call";
5
5
  export declare function isPromiseClass(context: TransformationContext, node: ts.Identifier): boolean;
6
6
  export declare function createPromiseIdentifier(original: ts.Node): lua.Identifier;
7
7
  export declare function transformPromiseConstructorCall(context: TransformationContext, node: PropertyCallExpression): lua.Expression | undefined;
8
+ export declare function createStaticPromiseFunctionAccessor(functionName: string, node: ts.Node): lua.TableIndexExpression;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.transformPromiseConstructorCall = exports.createPromiseIdentifier = exports.isPromiseClass = void 0;
3
+ exports.createStaticPromiseFunctionAccessor = exports.transformPromiseConstructorCall = exports.createPromiseIdentifier = exports.isPromiseClass = void 0;
4
4
  const lua = require("../../LuaAST");
5
5
  const diagnostics_1 = require("../utils/diagnostics");
6
6
  const lualib_1 = require("../utils/lualib");
@@ -43,4 +43,5 @@ exports.transformPromiseConstructorCall = transformPromiseConstructorCall;
43
43
  function createStaticPromiseFunctionAccessor(functionName, node) {
44
44
  return lua.createTableIndexExpression(lua.createIdentifier("__TS__Promise"), lua.createStringLiteral(functionName), node);
45
45
  }
46
+ exports.createStaticPromiseFunctionAccessor = createStaticPromiseFunctionAccessor;
46
47
  //# sourceMappingURL=promise.js.map
@@ -21,7 +21,7 @@ function transformStringPrototypeCall(context, node) {
21
21
  case "replaceAll":
22
22
  return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.StringReplaceAll, node, caller, ...params);
23
23
  case "concat":
24
- return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.StringConcat, node, caller, ...params);
24
+ return lua.createCallExpression(lua.createTableIndexExpression(lua.createIdentifier("table"), lua.createStringLiteral("concat")), [(0, lua_ast_1.wrapInTable)(caller, ...params)], node);
25
25
  case "indexOf": {
26
26
  const stringExpression = createStringCall("find", node, caller, params[0], params[1]
27
27
  ? // string.find handles negative indexes by making it relative to string end, but for indexOf it's the same as 0
@@ -1,5 +1,5 @@
1
1
  import * as ts from "typescript";
2
- import { LuaTarget } from "../../CompilerOptions";
2
+ import { LuaTarget, TypeScriptToLuaOptions } from "../../CompilerOptions";
3
3
  import { AnnotationKind } from "./annotations";
4
4
  export declare const unsupportedNodeKind: ((node: ts.Node, kind: ts.SyntaxKind) => ts.Diagnostic) & {
5
5
  code: number;
@@ -43,7 +43,11 @@ export declare const unsupportedAccessorInObjectLiteral: ((node: ts.Node, ...arg
43
43
  export declare const unsupportedRightShiftOperator: ((node: ts.Node, ...args: any[]) => ts.Diagnostic) & {
44
44
  code: number;
45
45
  };
46
- export declare const unsupportedForTarget: ((node: ts.Node, functionality: string, version: LuaTarget.Lua51 | LuaTarget.Lua52 | LuaTarget.Lua53 | LuaTarget.Lua54 | LuaTarget.LuaJIT) => ts.Diagnostic) & {
46
+ declare type NonUniversalTarget = Exclude<LuaTarget, LuaTarget.Universal>;
47
+ export declare const unsupportedForTarget: ((node: ts.Node, functionality: string, version: NonUniversalTarget) => ts.Diagnostic) & {
48
+ code: number;
49
+ };
50
+ export declare const unsupportedForTargetButOverrideAvailable: ((node: ts.Node, functionality: string, version: NonUniversalTarget, optionName: keyof TypeScriptToLuaOptions) => ts.Diagnostic) & {
47
51
  code: number;
48
52
  };
49
53
  export declare const unsupportedProperty: ((node: ts.Node, parentName: string, property: string) => ts.Diagnostic) & {
@@ -97,3 +101,4 @@ export declare const unsupportedOptionalCompileMembersOnly: ((node: ts.Node, ...
97
101
  export declare const undefinedInArrayLiteral: ((node: ts.Node, ...args: any[]) => ts.Diagnostic) & {
98
102
  code: number;
99
103
  };
104
+ export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.undefinedInArrayLiteral = exports.unsupportedOptionalCompileMembersOnly = exports.unsupportedBuiltinOptionalCall = exports.awaitMustBeInAsyncFunction = exports.notAllowedOptionalAssignment = exports.annotationDeprecated = exports.annotationRemoved = exports.invalidTableExtensionUse = exports.invalidOperatorMappingUse = exports.invalidMultiReturnAccess = exports.invalidMultiTypeToEmptyPatternOrArrayLiteral = exports.invalidMultiTypeToNonArrayLiteral = exports.invalidMultiFunctionReturnType = exports.invalidMultiFunctionUse = exports.unsupportedVarDeclaration = exports.invalidAmbientIdentifierName = exports.unsupportedProperty = exports.unsupportedForTarget = exports.unsupportedRightShiftOperator = exports.unsupportedAccessorInObjectLiteral = exports.invalidPairsIterableWithoutDestructuring = exports.invalidMultiIterableWithoutDestructuring = exports.invalidRangeControlVariable = exports.invalidVarargUse = exports.invalidRangeUse = exports.annotationInvalidArgumentCount = exports.decoratorInvalidContext = exports.unsupportedOverloadAssignment = exports.unsupportedSelfFunctionConversion = exports.unsupportedNoSelfFunctionConversion = exports.forbiddenForIn = exports.unsupportedNodeKind = void 0;
3
+ exports.undefinedInArrayLiteral = exports.unsupportedOptionalCompileMembersOnly = exports.unsupportedBuiltinOptionalCall = exports.awaitMustBeInAsyncFunction = exports.notAllowedOptionalAssignment = exports.annotationDeprecated = exports.annotationRemoved = exports.invalidTableExtensionUse = exports.invalidOperatorMappingUse = exports.invalidMultiReturnAccess = exports.invalidMultiTypeToEmptyPatternOrArrayLiteral = exports.invalidMultiTypeToNonArrayLiteral = exports.invalidMultiFunctionReturnType = exports.invalidMultiFunctionUse = exports.unsupportedVarDeclaration = exports.invalidAmbientIdentifierName = exports.unsupportedProperty = exports.unsupportedForTargetButOverrideAvailable = exports.unsupportedForTarget = exports.unsupportedRightShiftOperator = exports.unsupportedAccessorInObjectLiteral = exports.invalidPairsIterableWithoutDestructuring = exports.invalidMultiIterableWithoutDestructuring = exports.invalidRangeControlVariable = exports.invalidVarargUse = exports.invalidRangeUse = exports.annotationInvalidArgumentCount = exports.decoratorInvalidContext = exports.unsupportedOverloadAssignment = exports.unsupportedSelfFunctionConversion = exports.unsupportedNoSelfFunctionConversion = exports.forbiddenForIn = exports.unsupportedNodeKind = void 0;
4
4
  const ts = require("typescript");
5
5
  const CompilerOptions_1 = require("../../CompilerOptions");
6
6
  const utils_1 = require("../../utils");
@@ -41,6 +41,9 @@ exports.unsupportedAccessorInObjectLiteral = createErrorDiagnosticFactory("Acces
41
41
  exports.unsupportedRightShiftOperator = createErrorDiagnosticFactory("Right shift operator is not supported for target Lua 5.3. Use `>>>` instead.");
42
42
  const getLuaTargetName = (version) => (version === CompilerOptions_1.LuaTarget.LuaJIT ? "LuaJIT" : `Lua ${version}`);
43
43
  exports.unsupportedForTarget = createErrorDiagnosticFactory((functionality, version) => `${functionality} is/are not supported for target ${getLuaTargetName(version)}.`);
44
+ exports.unsupportedForTargetButOverrideAvailable = createErrorDiagnosticFactory((functionality, version, optionName) => `As a precaution, ${functionality} is/are not supported for target ${getLuaTargetName(version)} due to language features/limitations. ` +
45
+ `However "--${optionName}" can be used to bypass this precaution. ` +
46
+ "See https://typescripttolua.github.io/docs/configuration for more information.");
44
47
  exports.unsupportedProperty = createErrorDiagnosticFactory((parentName, property) => `${parentName}.${property} is unsupported.`);
45
48
  exports.invalidAmbientIdentifierName = createErrorDiagnosticFactory((text) => `Invalid ambient identifier name '${text}'. Ambient identifiers must be valid lua identifiers.`);
46
49
  exports.unsupportedVarDeclaration = createErrorDiagnosticFactory("`var` declarations are not supported. Use `let` or `const` instead.");
@@ -8,6 +8,7 @@ export declare function createExportsIdentifier(): lua.Identifier;
8
8
  export declare function addToNumericExpression(expression: lua.Expression, change: number): lua.Expression;
9
9
  export declare function getNumberLiteralValue(expression?: lua.Expression): number | undefined;
10
10
  export declare function createUnpackCall(context: TransformationContext, expression: lua.Expression, tsOriginal?: ts.Node): lua.Expression;
11
+ export declare function isUnpackCall(node: lua.Node): boolean;
11
12
  export declare function wrapInTable(...expressions: lua.Expression[]): lua.TableExpression;
12
13
  export declare function wrapInToStringForConcat(expression: lua.Expression): lua.Expression;
13
14
  export declare function createHoistableVariableDeclarationStatement(context: TransformationContext, identifier: lua.Identifier, initializer?: lua.Expression, tsOriginal?: ts.Node): lua.AssignmentStatement | lua.VariableDeclarationStatement;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createNaN = exports.createLocalOrExportedOrGlobalDeclaration = exports.createHoistableVariableDeclarationStatement = exports.wrapInToStringForConcat = exports.wrapInTable = exports.createUnpackCall = exports.getNumberLiteralValue = exports.addToNumericExpression = exports.createExportsIdentifier = exports.createSelfIdentifier = exports.unwrapVisitorResult = void 0;
3
+ exports.createNaN = exports.createLocalOrExportedOrGlobalDeclaration = exports.createHoistableVariableDeclarationStatement = exports.wrapInToStringForConcat = exports.wrapInTable = exports.isUnpackCall = exports.createUnpackCall = exports.getNumberLiteralValue = exports.addToNumericExpression = exports.createExportsIdentifier = exports.createSelfIdentifier = exports.unwrapVisitorResult = void 0;
4
4
  const ts = require("typescript");
5
5
  const CompilerOptions_1 = require("../../CompilerOptions");
6
6
  const lua = require("../../LuaAST");
@@ -62,9 +62,13 @@ function createUnpackCall(context, expression, tsOriginal) {
62
62
  const unpack = context.luaTarget === CompilerOptions_1.LuaTarget.Lua51 || context.luaTarget === CompilerOptions_1.LuaTarget.LuaJIT
63
63
  ? lua.createIdentifier("unpack")
64
64
  : lua.createTableIndexExpression(lua.createIdentifier("table"), lua.createStringLiteral("unpack"));
65
- return lua.createCallExpression(unpack, [expression], tsOriginal);
65
+ return lua.setNodeFlags(lua.createCallExpression(unpack, [expression], tsOriginal), lua.NodeFlags.TableUnpackCall);
66
66
  }
67
67
  exports.createUnpackCall = createUnpackCall;
68
+ function isUnpackCall(node) {
69
+ return lua.isCallExpression(node) && (node.flags & lua.NodeFlags.TableUnpackCall) !== 0;
70
+ }
71
+ exports.isUnpackCall = isUnpackCall;
68
72
  function wrapInTable(...expressions) {
69
73
  const fields = expressions.map(e => lua.createTableFieldExpression(e));
70
74
  return lua.createTableExpression(fields);
@@ -7,6 +7,7 @@ export declare function hasExportEquals(sourceFile: ts.SourceFile): boolean;
7
7
  * Search up until finding a node satisfying the callback
8
8
  */
9
9
  export declare function findFirstNodeAbove<T extends ts.Node>(node: ts.Node, callback: (n: ts.Node) => n is T): T | undefined;
10
+ export declare function findFirstNonOuterParent(node: ts.Node): ts.Node;
10
11
  export declare function getFirstDeclarationInFile(symbol: ts.Symbol, sourceFile: ts.SourceFile): ts.Declaration | undefined;
11
12
  export declare function isStandardLibraryType(context: TransformationContext, type: ts.Type, name: string | undefined): boolean;
12
13
  export declare function hasStandardLibrarySignature(context: TransformationContext, callExpression: ts.CallExpression): boolean;
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.isConstIdentifier = exports.getFunctionTypeForCall = exports.isExpressionWithEvaluationEffect = exports.getAllCallSignatures = exports.inferAssignedType = exports.hasStandardLibrarySignature = exports.isStandardLibraryType = exports.getFirstDeclarationInFile = exports.findFirstNodeAbove = exports.hasExportEquals = void 0;
17
+ exports.isConstIdentifier = exports.getFunctionTypeForCall = exports.isExpressionWithEvaluationEffect = exports.getAllCallSignatures = exports.inferAssignedType = exports.hasStandardLibrarySignature = exports.isStandardLibraryType = exports.getFirstDeclarationInFile = exports.findFirstNonOuterParent = exports.findFirstNodeAbove = exports.hasExportEquals = void 0;
18
18
  const ts = require("typescript");
19
19
  __exportStar(require("./nodes"), exports);
20
20
  __exportStar(require("./types"), exports);
@@ -38,6 +38,14 @@ function findFirstNodeAbove(node, callback) {
38
38
  }
39
39
  }
40
40
  exports.findFirstNodeAbove = findFirstNodeAbove;
41
+ function findFirstNonOuterParent(node) {
42
+ let current = node.parent;
43
+ while (ts.isOuterExpression(current)) {
44
+ current = current.parent;
45
+ }
46
+ return current;
47
+ }
48
+ exports.findFirstNonOuterParent = findFirstNonOuterParent;
41
49
  function getFirstDeclarationInFile(symbol, sourceFile) {
42
50
  var _a, _b;
43
51
  const originalSourceFile = (_a = ts.getParseTreeNode(sourceFile)) !== null && _a !== void 0 ? _a : sourceFile;
@@ -17,6 +17,7 @@ const expression_list_1 = require("./expression-list");
17
17
  const preceding_statements_1 = require("../utils/preceding-statements");
18
18
  const optional_chaining_1 = require("./optional-chaining");
19
19
  const language_extensions_1 = require("./language-extensions");
20
+ const import_1 = require("./modules/import");
20
21
  function validateArguments(context, params, signature) {
21
22
  if (!signature || signature.parameters.length < params.length) {
22
23
  return;
@@ -145,6 +146,9 @@ function transformElementCall(context, node) {
145
146
  }
146
147
  const transformCallExpression = (node, context) => {
147
148
  var _a;
149
+ if (node.expression.kind === ts.SyntaxKind.ImportKeyword) {
150
+ return (0, import_1.transformImportExpression)(node, context);
151
+ }
148
152
  if (ts.isOptionalChain(node)) {
149
153
  return (0, optional_chaining_1.transformOptionalChain)(context, node);
150
154
  }
@@ -96,7 +96,7 @@ function transformClassLikeDeclaration(classDeclaration, context, nameOverride)
96
96
  const constructorBody = (0, fields_1.transformClassInstanceFields)(context, instanceFields);
97
97
  const superCall = lua.createExpressionStatement(lua.createCallExpression(lua.createTableIndexExpression(context.transformExpression(ts.factory.createSuper()), lua.createStringLiteral("____constructor")), [(0, lua_ast_1.createSelfIdentifier)(), lua.createDotsLiteral()]));
98
98
  constructorBody.unshift(superCall);
99
- const constructorFunction = lua.createFunctionExpression(lua.createBlock(constructorBody), [(0, lua_ast_1.createSelfIdentifier)()], lua.createDotsLiteral(), lua.FunctionExpressionFlags.Declaration);
99
+ const constructorFunction = lua.createFunctionExpression(lua.createBlock(constructorBody), [(0, lua_ast_1.createSelfIdentifier)()], lua.createDotsLiteral(), lua.NodeFlags.Declaration);
100
100
  result.push(lua.createAssignmentStatement((0, constructor_1.createConstructorName)(localClassName), constructorFunction, classDeclaration));
101
101
  }
102
102
  // Transform accessors
@@ -11,7 +11,7 @@ const constructor_1 = require("./constructor");
11
11
  function transformAccessor(context, node) {
12
12
  const [params, dot, restParam] = (0, function_1.transformParameters)(context, node.parameters, (0, lua_ast_1.createSelfIdentifier)());
13
13
  const body = node.body ? (0, function_1.transformFunctionBody)(context, node.parameters, node.body, restParam)[0] : [];
14
- return lua.createFunctionExpression(lua.createBlock(body), params, dot, lua.FunctionExpressionFlags.Declaration);
14
+ return lua.createFunctionExpression(lua.createBlock(body), params, dot, lua.NodeFlags.Declaration);
15
15
  }
16
16
  function transformAccessorDeclarations(context, { firstAccessor, getAccessor, setAccessor }, className) {
17
17
  const propertyName = (0, literal_1.transformPropertyName)(context, firstAccessor.name);
@@ -59,7 +59,7 @@ function transformConstructorDeclaration(context, statement, className, instance
59
59
  const block = lua.createBlock(bodyWithFieldInitializers);
60
60
  const constructorWasGenerated = statement.pos === -1;
61
61
  (0, scope_1.popScope)(context);
62
- return lua.createAssignmentStatement(createConstructorName(className), lua.createFunctionExpression(block, params, dotsLiteral, lua.FunctionExpressionFlags.Declaration), constructorWasGenerated ? classDeclaration : statement);
62
+ return lua.createAssignmentStatement(createConstructorName(className), lua.createFunctionExpression(block, params, dotsLiteral, lua.NodeFlags.Declaration), constructorWasGenerated ? classDeclaration : statement);
63
63
  }
64
64
  exports.transformConstructorDeclaration = transformConstructorDeclaration;
65
65
  //# sourceMappingURL=constructor.js.map
@@ -14,8 +14,10 @@ const return_1 = require("./return");
14
14
  const transformTryStatement = (statement, context) => {
15
15
  var _a;
16
16
  const [tryBlock, tryScope] = (0, block_1.transformScopeBlock)(context, statement.tryBlock, scope_1.ScopeType.Try);
17
- if (context.options.luaTarget === __1.LuaTarget.Lua51 && (0, typescript_1.isInAsyncFunction)(statement)) {
18
- context.diagnostics.push((0, diagnostics_1.unsupportedForTarget)(statement, "try/catch inside async functions", __1.LuaTarget.Lua51));
17
+ if (context.options.luaTarget === __1.LuaTarget.Lua51 &&
18
+ (0, typescript_1.isInAsyncFunction)(statement) &&
19
+ !context.options.lua51AllowTryCatchInAsyncAwait) {
20
+ context.diagnostics.push((0, diagnostics_1.unsupportedForTargetButOverrideAvailable)(statement, "try/catch inside async functions", __1.LuaTarget.Lua51, "lua51AllowTryCatchInAsyncAwait"));
19
21
  return tryBlock.statements;
20
22
  }
21
23
  if (context.options.luaTarget === __1.LuaTarget.Lua51 && (0, typescript_1.isInGeneratorFunction)(statement)) {
@@ -46,7 +46,7 @@ function createCallableTable(functionExpression) {
46
46
  // so we create a forwarding function to eat the extra argument
47
47
  functionExpression = lua.createFunctionExpression(lua.createBlock([
48
48
  lua.createReturnStatement([lua.createCallExpression(functionExpression, [lua.createDotsLiteral()])]),
49
- ]), [lua.createAnonymousIdentifier()], lua.createDotsLiteral(), lua.FunctionExpressionFlags.Inline);
49
+ ]), [lua.createAnonymousIdentifier()], lua.createDotsLiteral(), lua.NodeFlags.Inline);
50
50
  }
51
51
  return lua.createCallExpression(lua.createIdentifier("setmetatable"), [
52
52
  lua.createTableExpression(),
@@ -169,11 +169,11 @@ function transformFunctionToExpression(context, node) {
169
169
  functionContext = (0, lua_ast_1.createSelfIdentifier)();
170
170
  }
171
171
  }
172
- let flags = lua.FunctionExpressionFlags.None;
172
+ let flags = lua.NodeFlags.None;
173
173
  if (!ts.isBlock(node.body))
174
- flags |= lua.FunctionExpressionFlags.Inline;
174
+ flags |= lua.NodeFlags.Inline;
175
175
  if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) {
176
- flags |= lua.FunctionExpressionFlags.Declaration;
176
+ flags |= lua.NodeFlags.Declaration;
177
177
  }
178
178
  const [paramNames, dotsLiteral, spreadIdentifier] = transformParameters(context, node.parameters, functionContext);
179
179
  const [transformedBody, functionScope] = transformFunctionBody(context, node.parameters, node.body, spreadIdentifier, node);
@@ -5,3 +5,4 @@ export declare function createModuleRequire(context: TransformationContext, modu
5
5
  export declare const transformImportDeclaration: FunctionVisitor<ts.ImportDeclaration>;
6
6
  export declare const transformExternalModuleReference: FunctionVisitor<ts.ExternalModuleReference>;
7
7
  export declare const transformImportEqualsDeclaration: FunctionVisitor<ts.ImportEqualsDeclaration>;
8
+ export declare const transformImportExpression: FunctionVisitor<ts.CallExpression>;
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.transformImportEqualsDeclaration = exports.transformExternalModuleReference = exports.transformImportDeclaration = exports.createModuleRequire = void 0;
3
+ exports.transformImportExpression = exports.transformImportEqualsDeclaration = exports.transformExternalModuleReference = exports.transformImportDeclaration = exports.createModuleRequire = void 0;
4
4
  const path = require("path");
5
5
  const ts = require("typescript");
6
6
  const lua = require("../../../LuaAST");
7
+ const promise_1 = require("../../builtins/promise");
7
8
  const annotations_1 = require("../../utils/annotations");
8
9
  const export_1 = require("../../utils/export");
9
10
  const lua_ast_1 = require("../../utils/lua-ast");
11
+ const lualib_1 = require("../../utils/lualib");
10
12
  const safe_names_1 = require("../../utils/safe-names");
11
13
  const scope_1 = require("../../utils/scope");
12
14
  const identifier_1 = require("../identifier");
@@ -113,4 +115,10 @@ const transformImportEqualsDeclaration = (node, context) => {
113
115
  return (0, lua_ast_1.createHoistableVariableDeclarationStatement)(context, name, expression, node);
114
116
  };
115
117
  exports.transformImportEqualsDeclaration = transformImportEqualsDeclaration;
118
+ const transformImportExpression = (node, context) => {
119
+ (0, lualib_1.importLuaLibFeature)(context, lualib_1.LuaLibFeature.Promise);
120
+ const importPath = node.arguments.map(a => context.transformExpression(a));
121
+ return lua.createCallExpression((0, promise_1.createStaticPromiseFunctionAccessor)("resolve", node), importPath, node);
122
+ };
123
+ exports.transformImportExpression = transformImportExpression;
116
124
  //# sourceMappingURL=import.js.map
@@ -11,15 +11,9 @@ const typescript_1 = require("../utils/typescript");
11
11
  const multi_1 = require("./language-extensions/multi");
12
12
  const diagnostics_1 = require("../utils/diagnostics");
13
13
  const vararg_1 = require("./language-extensions/vararg");
14
- function skipOuterExpressionParents(node) {
15
- while (ts.isOuterExpression(node)) {
16
- node = node.parent;
17
- }
18
- return node;
19
- }
20
14
  function isOptimizedVarArgSpread(context, symbol, identifier) {
21
15
  var _a;
22
- if (!ts.isSpreadElement(skipOuterExpressionParents(identifier.parent))) {
16
+ if (!ts.isSpreadElement((0, typescript_1.findFirstNonOuterParent)(identifier))) {
23
17
  return false;
24
18
  }
25
19
  // Walk up, stopping at any scope types which could stop optimization
@@ -3,7 +3,7 @@ import { EmitHost } from "..";
3
3
  import { CompilerOptions } from "../CompilerOptions";
4
4
  import { Printer } from "../LuaPrinter";
5
5
  import { Visitors } from "../transformation/context";
6
- import { ProcessedFile } from "./utils";
6
+ import { EmitFile, ProcessedFile } from "./utils";
7
7
  export interface Plugin {
8
8
  /**
9
9
  * An augmentation to the map of visitors that transform TypeScript AST to Lua AST.
@@ -22,8 +22,15 @@ export interface Plugin {
22
22
  */
23
23
  beforeTransform?: (program: ts.Program, options: CompilerOptions, emitHost: EmitHost) => ts.Diagnostic[] | void;
24
24
  /**
25
- * This function is called after TypeScriptToLua has translated the input program to Lua.
25
+ * This function is called after translating the input program to Lua, but before resolving dependencies or bundling.
26
26
  */
27
27
  afterPrint?: (program: ts.Program, options: CompilerOptions, emitHost: EmitHost, result: ProcessedFile[]) => ts.Diagnostic[] | void;
28
+ /**
29
+ * This function is called after translating the input program to Lua, after resolving dependencies and after bundling.
30
+ */
31
+ beforeEmit?: (program: ts.Program, options: CompilerOptions, emitHost: EmitHost, result: EmitFile[]) => ts.Diagnostic[] | void;
28
32
  }
29
- export declare function getPlugins(program: ts.Program, diagnostics: ts.Diagnostic[], customPlugins: Plugin[]): Plugin[];
33
+ export declare function getPlugins(program: ts.Program): {
34
+ diagnostics: ts.Diagnostic[];
35
+ plugins: Plugin[];
36
+ };
@@ -2,8 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getPlugins = void 0;
4
4
  const utils_1 = require("./utils");
5
- function getPlugins(program, diagnostics, customPlugins) {
5
+ function getPlugins(program) {
6
6
  var _a;
7
+ const diagnostics = [];
7
8
  const pluginsFromOptions = [];
8
9
  const options = program.getCompilerOptions();
9
10
  for (const [index, pluginOption] of ((_a = options.luaPlugins) !== null && _a !== void 0 ? _a : []).entries()) {
@@ -16,7 +17,10 @@ function getPlugins(program, diagnostics, customPlugins) {
16
17
  const plugin = typeof factory === "function" ? factory(pluginOption) : factory;
17
18
  pluginsFromOptions.push(plugin);
18
19
  }
19
- return [...customPlugins, ...pluginsFromOptions];
20
+ if (options.tstlVerbose) {
21
+ console.log(`Loaded ${pluginsFromOptions.length} plugins`);
22
+ }
23
+ return { diagnostics, plugins: pluginsFromOptions };
20
24
  }
21
25
  exports.getPlugins = getPlugins;
22
26
  //# sourceMappingURL=plugins.js.map
@@ -14,6 +14,7 @@ const resolver = resolve.ResolverFactory.createResolver({
14
14
  enforceExtension: true,
15
15
  fileSystem: { ...new resolve.CachedInputFileSystem(fs) },
16
16
  useSyncFileSystemCalls: true,
17
+ symlinks: false, // Do not resolve symlinks to their original paths (that breaks node_modules detection)
17
18
  });
18
19
  class ResolutionContext {
19
20
  constructor(program, options, emitHost) {
@@ -11,4 +11,4 @@ export interface TranspileResult {
11
11
  diagnostics: ts.Diagnostic[];
12
12
  transpiledFiles: ProcessedFile[];
13
13
  }
14
- export declare function getProgramTranspileResult(emitHost: EmitHost, writeFileResult: ts.WriteFileCallback, { program, sourceFiles: targetSourceFiles, customTransformers, plugins: customPlugins }: TranspileOptions): TranspileResult;
14
+ export declare function getProgramTranspileResult(emitHost: EmitHost, writeFileResult: ts.WriteFileCallback, { program, sourceFiles: targetSourceFiles, customTransformers, plugins }: TranspileOptions): TranspileResult;
@@ -7,9 +7,8 @@ const CompilerOptions_1 = require("../CompilerOptions");
7
7
  const LuaPrinter_1 = require("../LuaPrinter");
8
8
  const transformation_1 = require("../transformation");
9
9
  const utils_1 = require("../utils");
10
- const plugins_1 = require("./plugins");
11
10
  const transformers_1 = require("./transformers");
12
- function getProgramTranspileResult(emitHost, writeFileResult, { program, sourceFiles: targetSourceFiles, customTransformers = {}, plugins: customPlugins = [] }) {
11
+ function getProgramTranspileResult(emitHost, writeFileResult, { program, sourceFiles: targetSourceFiles, customTransformers = {}, plugins = [] }) {
13
12
  var _a, _b;
14
13
  const options = program.getCompilerOptions();
15
14
  if (options.tstlVerbose) {
@@ -40,10 +39,6 @@ function getProgramTranspileResult(emitHost, writeFileResult, { program, sourceF
40
39
  return { diagnostics: preEmitDiagnostics, transpiledFiles };
41
40
  }
42
41
  }
43
- const plugins = (0, plugins_1.getPlugins)(program, diagnostics, customPlugins);
44
- if (options.tstlVerbose) {
45
- console.log(`Successfully loaded ${plugins.length} plugins`);
46
- }
47
42
  for (const plugin of plugins) {
48
43
  if (plugin.beforeTransform) {
49
44
  const pluginDiagnostics = (_a = plugin.beforeTransform(program, options, emitHost)) !== null && _a !== void 0 ? _a : [];