typescript-to-lua 1.4.2 → 1.5.0

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 (90) hide show
  1. package/dist/CompilerOptions.d.ts +5 -1
  2. package/dist/LuaAST.d.ts +9 -7
  3. package/dist/LuaAST.js +19 -13
  4. package/dist/LuaLib.d.ts +1 -2
  5. package/dist/LuaLib.js +1 -2
  6. package/dist/LuaPrinter.js +1 -2
  7. package/dist/cli/parse.js +10 -0
  8. package/dist/lualib/ArrayConcat.lua +16 -12
  9. package/dist/lualib/ArrayEvery.lua +4 -8
  10. package/dist/lualib/ArrayFilter.lua +6 -8
  11. package/dist/lualib/ArrayFind.lua +4 -7
  12. package/dist/lualib/ArrayFindIndex.lua +4 -9
  13. package/dist/lualib/ArrayFlat.lua +17 -7
  14. package/dist/lualib/ArrayFlatMap.lua +11 -10
  15. package/dist/lualib/ArrayForEach.lua +3 -7
  16. package/dist/lualib/ArrayFrom.lua +2 -5
  17. package/dist/lualib/ArrayIncludes.lua +2 -2
  18. package/dist/lualib/ArrayIndexOf.lua +13 -21
  19. package/dist/lualib/ArrayIsArray.lua +1 -1
  20. package/dist/lualib/ArrayJoin.lua +4 -7
  21. package/dist/lualib/ArrayMap.lua +5 -9
  22. package/dist/lualib/ArrayPush.lua +6 -4
  23. package/dist/lualib/ArrayPushArray.lua +8 -0
  24. package/dist/lualib/ArrayReduce.lua +8 -8
  25. package/dist/lualib/ArrayReduceRight.lua +8 -8
  26. package/dist/lualib/ArrayReverse.lua +7 -7
  27. package/dist/lualib/ArraySetLength.lua +3 -7
  28. package/dist/lualib/ArraySlice.lua +26 -19
  29. package/dist/lualib/ArraySome.lua +4 -8
  30. package/dist/lualib/ArraySort.lua +4 -4
  31. package/dist/lualib/ArraySplice.lua +47 -58
  32. package/dist/lualib/ArrayToObject.lua +3 -7
  33. package/dist/lualib/ArrayUnshift.lua +11 -8
  34. package/dist/lualib/Await.lua +21 -34
  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/SourceMapTraceBack.lua +14 -1
  44. package/dist/lualib/Spread.lua +5 -7
  45. package/dist/lualib/StringReplace.lua +17 -14
  46. package/dist/lualib/StringReplaceAll.lua +36 -29
  47. package/dist/lualib/StringSplit.lua +32 -32
  48. package/dist/lualib/lualib_bundle.lua +393 -423
  49. package/dist/lualib/lualib_module_info.json +13 -23
  50. package/dist/transformation/builtins/array.d.ts +2 -3
  51. package/dist/transformation/builtins/array.js +43 -12
  52. package/dist/transformation/builtins/console.d.ts +2 -2
  53. package/dist/transformation/builtins/console.js +8 -9
  54. package/dist/transformation/builtins/function.d.ts +1 -2
  55. package/dist/transformation/builtins/function.js +5 -6
  56. package/dist/transformation/builtins/index.js +22 -23
  57. package/dist/transformation/builtins/math.d.ts +1 -2
  58. package/dist/transformation/builtins/math.js +3 -4
  59. package/dist/transformation/builtins/number.d.ts +3 -3
  60. package/dist/transformation/builtins/number.js +10 -12
  61. package/dist/transformation/builtins/object.d.ts +2 -3
  62. package/dist/transformation/builtins/object.js +16 -17
  63. package/dist/transformation/builtins/promise.d.ts +2 -2
  64. package/dist/transformation/builtins/promise.js +7 -7
  65. package/dist/transformation/builtins/string.d.ts +2 -3
  66. package/dist/transformation/builtins/string.js +8 -10
  67. package/dist/transformation/builtins/symbol.d.ts +2 -2
  68. package/dist/transformation/builtins/symbol.js +6 -7
  69. package/dist/transformation/utils/diagnostics.d.ts +7 -2
  70. package/dist/transformation/utils/diagnostics.js +4 -1
  71. package/dist/transformation/utils/lua-ast.d.ts +1 -0
  72. package/dist/transformation/utils/lua-ast.js +89 -3
  73. package/dist/transformation/utils/typescript/index.d.ts +1 -0
  74. package/dist/transformation/utils/typescript/index.js +9 -1
  75. package/dist/transformation/visitors/async-await.d.ts +1 -1
  76. package/dist/transformation/visitors/async-await.js +7 -14
  77. package/dist/transformation/visitors/call.d.ts +1 -3
  78. package/dist/transformation/visitors/call.js +26 -13
  79. package/dist/transformation/visitors/class/index.js +1 -1
  80. package/dist/transformation/visitors/class/members/accessors.js +1 -1
  81. package/dist/transformation/visitors/class/members/constructor.js +1 -1
  82. package/dist/transformation/visitors/errors.js +52 -9
  83. package/dist/transformation/visitors/function.js +5 -5
  84. package/dist/transformation/visitors/modules/import.d.ts +1 -0
  85. package/dist/transformation/visitors/modules/import.js +9 -1
  86. package/dist/transformation/visitors/return.js +5 -4
  87. package/dist/transformation/visitors/spread.js +1 -7
  88. package/package.json +1 -1
  89. package/dist/lualib/ArrayShift.lua +0 -3
  90. package/dist/lualib/StringConcat.lua +0 -8
@@ -5,19 +5,58 @@ const __1 = require("../..");
5
5
  const lua = require("../../LuaAST");
6
6
  const diagnostics_1 = require("../utils/diagnostics");
7
7
  const lua_ast_1 = require("../utils/lua-ast");
8
+ const lualib_1 = require("../utils/lualib");
8
9
  const scope_1 = require("../utils/scope");
9
10
  const typescript_1 = require("../utils/typescript");
11
+ const async_await_1 = require("./async-await");
10
12
  const block_1 = require("./block");
11
13
  const identifier_1 = require("./identifier");
12
14
  const multi_1 = require("./language-extensions/multi");
13
15
  const return_1 = require("./return");
16
+ const transformAsyncTry = (statement, context) => {
17
+ const [tryBlock] = (0, block_1.transformScopeBlock)(context, statement.tryBlock, scope_1.ScopeType.Try);
18
+ if (context.options.luaTarget === __1.LuaTarget.Lua51 && !context.options.lua51AllowTryCatchInAsyncAwait) {
19
+ context.diagnostics.push((0, diagnostics_1.unsupportedForTargetButOverrideAvailable)(statement, "try/catch inside async functions", __1.LuaTarget.Lua51, "lua51AllowTryCatchInAsyncAwait"));
20
+ return tryBlock.statements;
21
+ }
22
+ // __TS__AsyncAwaiter(<catch block>)
23
+ const awaiter = (0, async_await_1.wrapInAsyncAwaiter)(context, tryBlock.statements, false);
24
+ const awaiterIdentifier = lua.createIdentifier("____try");
25
+ const awaiterDefinition = lua.createVariableDeclarationStatement(awaiterIdentifier, awaiter);
26
+ // local ____try = __TS__AsyncAwaiter(<catch block>)
27
+ const result = [awaiterDefinition];
28
+ if (statement.finallyBlock) {
29
+ const awaiterFinally = lua.createTableIndexExpression(awaiterIdentifier, lua.createStringLiteral("finally"));
30
+ const finallyFunction = lua.createFunctionExpression(lua.createBlock(context.transformStatements(statement.finallyBlock.statements)));
31
+ const finallyCall = lua.createCallExpression(awaiterFinally, [awaiterIdentifier, finallyFunction], statement.finallyBlock);
32
+ // ____try.finally(<finally function>)
33
+ result.push(lua.createExpressionStatement(finallyCall));
34
+ }
35
+ if (statement.catchClause) {
36
+ // ____try.catch(<catch function>)
37
+ const [catchFunction] = transformCatchClause(context, statement.catchClause);
38
+ if (catchFunction.params) {
39
+ catchFunction.params.unshift(lua.createAnonymousIdentifier());
40
+ }
41
+ const awaiterCatch = lua.createTableIndexExpression(awaiterIdentifier, lua.createStringLiteral("catch"));
42
+ const catchCall = lua.createCallExpression(awaiterCatch, [awaiterIdentifier, catchFunction]);
43
+ // await ____try.catch(<catch function>)
44
+ const promiseAwait = (0, lualib_1.transformLuaLibFunction)(context, __1.LuaLibFeature.Await, statement, catchCall);
45
+ result.push(lua.createExpressionStatement(promiseAwait, statement));
46
+ }
47
+ else {
48
+ // await ____try
49
+ const promiseAwait = (0, lualib_1.transformLuaLibFunction)(context, __1.LuaLibFeature.Await, statement, awaiterIdentifier);
50
+ result.push(lua.createExpressionStatement(promiseAwait, statement));
51
+ }
52
+ return result;
53
+ };
14
54
  const transformTryStatement = (statement, context) => {
15
55
  var _a;
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));
19
- return tryBlock.statements;
56
+ if ((0, typescript_1.isInAsyncFunction)(statement)) {
57
+ return transformAsyncTry(statement, context);
20
58
  }
59
+ const [tryBlock, tryScope] = (0, block_1.transformScopeBlock)(context, statement.tryBlock, scope_1.ScopeType.Try);
21
60
  if (context.options.luaTarget === __1.LuaTarget.Lua51 && (0, typescript_1.isInGeneratorFunction)(statement)) {
22
61
  context.diagnostics.push((0, diagnostics_1.unsupportedForTarget)(statement, "try/catch inside generator functions", __1.LuaTarget.Lua51));
23
62
  return tryBlock.statements;
@@ -31,11 +70,7 @@ const transformTryStatement = (statement, context) => {
31
70
  const tryCall = lua.createCallExpression(pCall, [lua.createFunctionExpression(tryBlock)]);
32
71
  if (statement.catchClause && statement.catchClause.block.statements.length > 0) {
33
72
  // try with catch
34
- const [catchBlock, catchScope] = (0, block_1.transformScopeBlock)(context, statement.catchClause.block, scope_1.ScopeType.Catch);
35
- const catchParameter = statement.catchClause.variableDeclaration
36
- ? (0, identifier_1.transformIdentifier)(context, statement.catchClause.variableDeclaration.name)
37
- : undefined;
38
- const catchFunction = lua.createFunctionExpression(catchBlock, catchParameter ? [lua.cloneIdentifier(catchParameter)] : []);
73
+ const [catchFunction, catchScope] = transformCatchClause(context, statement.catchClause);
39
74
  const catchIdentifier = lua.createIdentifier("____catch");
40
75
  result.push(lua.createVariableDeclarationStatement(catchIdentifier, catchFunction));
41
76
  const hasReturn = (_a = tryScope.functionReturned) !== null && _a !== void 0 ? _a : catchScope.functionReturned;
@@ -94,4 +129,12 @@ const transformThrowStatement = (statement, context) => {
94
129
  return lua.createExpressionStatement(lua.createCallExpression(lua.createIdentifier("error"), parameters), statement);
95
130
  };
96
131
  exports.transformThrowStatement = transformThrowStatement;
132
+ function transformCatchClause(context, catchClause) {
133
+ const [catchBlock, catchScope] = (0, block_1.transformScopeBlock)(context, catchClause.block, scope_1.ScopeType.Catch);
134
+ const catchParameter = catchClause.variableDeclaration
135
+ ? (0, identifier_1.transformIdentifier)(context, catchClause.variableDeclaration.name)
136
+ : undefined;
137
+ const catchFunction = lua.createFunctionExpression(catchBlock, catchParameter ? [lua.cloneIdentifier(catchParameter)] : []);
138
+ return [catchFunction, catchScope];
139
+ }
97
140
  //# sourceMappingURL=errors.js.map
@@ -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(),
@@ -114,7 +114,7 @@ function transformFunctionBody(context, parameters, body, spreadIdentifier, node
114
114
  scope.node = node;
115
115
  let bodyStatements = transformFunctionBodyContent(context, body);
116
116
  if (node && (0, async_await_1.isAsyncFunction)(node)) {
117
- bodyStatements = (0, async_await_1.wrapInAsyncAwaiter)(context, bodyStatements);
117
+ bodyStatements = [lua.createReturnStatement([(0, async_await_1.wrapInAsyncAwaiter)(context, bodyStatements)])];
118
118
  }
119
119
  const headerStatements = transformFunctionBodyHeader(context, scope, parameters, spreadIdentifier);
120
120
  (0, scope_1.popScope)(context);
@@ -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
@@ -61,14 +61,15 @@ const transformReturnStatement = (statement, context) => {
61
61
  exports.transformReturnStatement = transformReturnStatement;
62
62
  function createReturnStatement(context, values, node) {
63
63
  const results = [...values];
64
+ if ((0, typescript_1.isInAsyncFunction)(node)) {
65
+ return lua.createReturnStatement([
66
+ lua.createCallExpression(lua.createIdentifier("____awaiter_resolve"), [lua.createNilLiteral(), ...values]),
67
+ ]);
68
+ }
64
69
  if (isInTryCatch(context)) {
65
70
  // Bubble up explicit return flag and check if we're inside a try/catch block
66
71
  results.unshift(lua.createBooleanLiteral(true));
67
72
  }
68
- else if ((0, typescript_1.isInAsyncFunction)(node)) {
69
- // Add nil error handler in async function and not in try
70
- results.unshift(lua.createNilLiteral());
71
- }
72
73
  return lua.createReturnStatement(results, node);
73
74
  }
74
75
  exports.createReturnStatement = createReturnStatement;
@@ -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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typescript-to-lua",
3
- "version": "1.4.2",
3
+ "version": "1.5.0",
4
4
  "description": "A generic TypeScript to Lua transpiler. Write your code in TypeScript and publish Lua!",
5
5
  "repository": "https://github.com/TypeScriptToLua/TypeScriptToLua",
6
6
  "homepage": "https://typescripttolua.github.io/",
@@ -1,3 +0,0 @@
1
- local function __TS__ArrayShift(arr)
2
- return table.remove(arr, 1)
3
- end
@@ -1,8 +0,0 @@
1
- local function __TS__StringConcat(str1, ...)
2
- local args = {...}
3
- local out = str1
4
- for ____, arg in ipairs(args) do
5
- out = out .. arg
6
- end
7
- return out
8
- end