typescript-to-lua
Advanced tools
Comparing version 0.41.2 to 0.42.0
# Changelog | ||
## 0.42.0 | ||
- **[Breaking]** The `/** @tupleReturn */` is now deprecated, and will be removed next release. If you are still using it, please upgrade to the [LuaMultiReturn language extension](https://typescripttolua.github.io/docs/advanced/language-extensions#luamultireturn-type). | ||
- Added support for TSX, see [documentation](https://typescripttolua.github.io/docs/tsx) for more information. | ||
- Added support for the `baseUrl` configuration key for module resolution. | ||
A large list of bugfixes: | ||
- Fixed an exception causing tstl to exit when trying to assign to an optional chain. | ||
- Fixed resolved files appearing duplicated in lua bundles. | ||
- Fixed a problem resolving external Lua files in nested directories. | ||
- Fixed `@noResolution` in library packages losing their NoResolution tag, causing attempts to resolve them for package users. | ||
- Fixed a bug in the bundling code causing modules not to be cached if they return nil (which happens if they are not a module) | ||
- Fixed module resolution trying to incorrectly resolve and rewrite things like `myObject.require()` or `my_custom_require()`. | ||
- Fixed lualib bundle not being included in the output if external packages use it, but the client code does not. | ||
## 0.41.0 | ||
@@ -4,0 +20,0 @@ |
@@ -100,5 +100,6 @@ "use strict"; | ||
ArrayFlatMap: [LuaLibFeature.ArrayConcat, LuaLibFeature.ArrayIsArray], | ||
Decorate: [LuaLibFeature.CloneDescriptor], | ||
Decorate: [LuaLibFeature.ObjectGetOwnPropertyDescriptor, LuaLibFeature.SetDescriptor, LuaLibFeature.ObjectAssign], | ||
DelegatedYield: [LuaLibFeature.StringAccess], | ||
Delete: [LuaLibFeature.ObjectGetOwnPropertyDescriptors], | ||
Error: [LuaLibFeature.New, LuaLibFeature.Class], | ||
Error: [LuaLibFeature.Class, LuaLibFeature.ClassExtends, LuaLibFeature.New], | ||
FunctionBind: [LuaLibFeature.Unpack], | ||
@@ -108,4 +109,10 @@ Generator: [LuaLibFeature.Symbol], | ||
Iterator: [LuaLibFeature.Symbol], | ||
NumberToString: [LuaLibFeature.StringAccess], | ||
ObjectDefineProperty: [LuaLibFeature.CloneDescriptor, LuaLibFeature.SetDescriptor], | ||
ObjectFromEntries: [LuaLibFeature.Iterator, LuaLibFeature.Symbol], | ||
ParseFloat: [LuaLibFeature.StringAccess], | ||
ParseInt: [LuaLibFeature.StringSubstr, LuaLibFeature.StringSubstring], | ||
SetDescriptor: [LuaLibFeature.CloneDescriptor], | ||
StringSplit: [LuaLibFeature.StringSubstring, LuaLibFeature.StringAccess], | ||
SymbolRegistry: [LuaLibFeature.Symbol], | ||
Map: [LuaLibFeature.InstanceOf, LuaLibFeature.Iterator, LuaLibFeature.Symbol, LuaLibFeature.Class], | ||
@@ -115,5 +122,3 @@ Set: [LuaLibFeature.InstanceOf, LuaLibFeature.Iterator, LuaLibFeature.Symbol, LuaLibFeature.Class], | ||
WeakSet: [LuaLibFeature.InstanceOf, LuaLibFeature.Iterator, LuaLibFeature.Symbol, LuaLibFeature.Class], | ||
Spread: [LuaLibFeature.Iterator, LuaLibFeature.Unpack], | ||
StringSplit: [LuaLibFeature.StringSubstring, LuaLibFeature.StringAccess], | ||
SymbolRegistry: [LuaLibFeature.Symbol], | ||
Spread: [LuaLibFeature.Iterator, LuaLibFeature.StringAccess, LuaLibFeature.Unpack], | ||
}; | ||
@@ -120,0 +125,0 @@ /* eslint-enable @typescript-eslint/naming-convention */ |
@@ -5,2 +5,3 @@ "use strict"; | ||
const ts = require("typescript"); | ||
const diagnostics_1 = require("./diagnostics"); | ||
const typescript_1 = require("./typescript"); | ||
@@ -107,2 +108,3 @@ var AnnotationKind; | ||
if (getSignatureAnnotations(context, signature).has(AnnotationKind.TupleReturn)) { | ||
context.diagnostics.push(diagnostics_1.annotationDeprecated(node, AnnotationKind.TupleReturn)); | ||
return true; | ||
@@ -120,3 +122,7 @@ } | ||
const type = context.checker.getTypeAtLocation(node.expression); | ||
return getTypeAnnotations(type).has(AnnotationKind.TupleReturn); | ||
const result = getTypeAnnotations(type).has(AnnotationKind.TupleReturn); | ||
if (result) { | ||
context.diagnostics.push(diagnostics_1.annotationDeprecated(node, AnnotationKind.TupleReturn)); | ||
} | ||
return result; | ||
} | ||
@@ -123,0 +129,0 @@ exports.isTupleReturnCall = isTupleReturnCall; |
@@ -37,3 +37,3 @@ "use strict"; | ||
const accessExpression = transformElementAccessArgument(context, node); | ||
if (ts.isCallExpression(node.expression) && multi_1.returnsMultiType(context, node.expression)) { | ||
if (multi_1.isMultiReturnCall(context, node.expression)) { | ||
const accessType = context.checker.getTypeAtLocation(node.argumentExpression); | ||
@@ -43,5 +43,11 @@ if (!typescript_1.isNumberType(context, accessType)) { | ||
} | ||
const selectIdentifier = lua.createIdentifier("select"); | ||
const selectCall = lua.createCallExpression(selectIdentifier, [accessExpression, table]); | ||
return selectCall; | ||
// When selecting the first element, we can shortcut | ||
if (ts.isNumericLiteral(node.argumentExpression) && node.argumentExpression.text === "0") { | ||
return table; | ||
} | ||
else { | ||
const selectIdentifier = lua.createIdentifier("select"); | ||
const selectCall = lua.createCallExpression(selectIdentifier, [accessExpression, table]); | ||
return selectCall; | ||
} | ||
} | ||
@@ -48,0 +54,0 @@ if (ts.isOptionalChain(node)) { |
@@ -7,3 +7,2 @@ "use strict"; | ||
const utils_1 = require("../../../utils"); | ||
const annotations_1 = require("../../utils/annotations"); | ||
const assignment_validation_1 = require("../../utils/assignment-validation"); | ||
@@ -58,3 +57,3 @@ const export_1 = require("../../utils/export"); | ||
let right = context.transformExpression(expression.right); | ||
if (annotations_1.isTupleReturnCall(context, expression.right) || multi_1.isMultiReturnCall(context, expression.right)) { | ||
if (multi_1.isMultiReturnCall(context, expression.right)) { | ||
right = lua_ast_1.wrapInTable(right); | ||
@@ -148,4 +147,6 @@ } | ||
let right = context.transformExpression(expression.right); | ||
if (!(annotations_1.isTupleReturnCall(context, expression.right) || multi_1.isMultiReturnCall(context, expression.right)) && | ||
typescript_1.isArrayType(context, rightType)) { | ||
if (ts.isArrayLiteralExpression(expression.right)) { | ||
right = expression.right.elements.map(e => context.transformExpression(e)); | ||
} | ||
else if (!multi_1.isMultiReturnCall(context, expression.right) && typescript_1.isArrayType(context, rightType)) { | ||
right = lua_ast_1.createUnpackCall(context, right, expression.right); | ||
@@ -157,3 +158,3 @@ } | ||
let right = context.transformExpression(expression.right); | ||
if (annotations_1.isTupleReturnCall(context, expression.right) || multi_1.isMultiReturnCall(context, expression.right)) { | ||
if (multi_1.isMultiReturnCall(context, expression.right)) { | ||
right = lua_ast_1.wrapInTable(right); | ||
@@ -160,0 +161,0 @@ } |
@@ -46,5 +46,7 @@ "use strict"; | ||
const typeRight = context.checker.getTypeAtLocation(node.right); | ||
if (typescript_1.isStringType(context, typeLeft) || typescript_1.isStringType(context, typeRight)) { | ||
left = lua_ast_1.wrapInToStringForConcat(left); | ||
right = lua_ast_1.wrapInToStringForConcat(right); | ||
const isLeftString = typescript_1.isStringType(context, typeLeft); | ||
const isRightString = typescript_1.isStringType(context, typeRight); | ||
if (isLeftString || isRightString) { | ||
left = isLeftString ? left : lua_ast_1.wrapInToStringForConcat(left); | ||
right = isRightString ? right : lua_ast_1.wrapInToStringForConcat(right); | ||
luaOperator = lua.SyntaxKind.ConcatOperator; | ||
@@ -51,0 +53,0 @@ } |
@@ -174,8 +174,3 @@ "use strict"; | ||
const transformCallExpression = (node, context) => { | ||
const isTupleReturn = annotations_1.isTupleReturnCall(context, node); | ||
const isTupleReturnForward = node.parent && ts.isReturnStatement(node.parent) && annotations_1.isInTupleReturnFunction(context, node); | ||
const isInSpread = node.parent && ts.isSpreadElement(node.parent); | ||
const returnValueIsUsed = node.parent && !ts.isExpressionStatement(node.parent); | ||
const wrapTupleReturn = isTupleReturn && !isTupleReturnForward && !typescript_1.isInDestructingAssignment(node) && !isInSpread && returnValueIsUsed; | ||
const wrapResultInTable = wrapTupleReturn || multi_1.shouldMultiReturnCallBeWrapped(context, node); | ||
const wrapResultInTable = multi_1.isMultiReturnCall(context, node) && multi_1.shouldMultiReturnCallBeWrapped(context, node); | ||
const wrapResultInOptional = ts.isOptionalChain(node); | ||
@@ -182,0 +177,0 @@ const builtinResult = builtins_1.transformBuiltinCallExpression(context, node); |
import * as ts from "typescript"; | ||
import { TransformationContext } from "../../context"; | ||
export declare function isMultiReturnType(type: ts.Type): boolean; | ||
export declare function canBeMultiReturnType(type: ts.Type): boolean; | ||
export declare function isMultiFunctionCall(context: TransformationContext, expression: ts.CallExpression): boolean; | ||
@@ -5,0 +6,0 @@ export declare function returnsMultiType(context: TransformationContext, node: ts.CallExpression): boolean; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.findMultiAssignmentViolations = exports.shouldMultiReturnCallBeWrapped = exports.isInMultiReturnFunction = exports.isMultiFunctionNode = exports.isMultiReturnCall = exports.returnsMultiType = exports.isMultiFunctionCall = exports.isMultiReturnType = void 0; | ||
exports.findMultiAssignmentViolations = exports.shouldMultiReturnCallBeWrapped = exports.isInMultiReturnFunction = exports.isMultiFunctionNode = exports.isMultiReturnCall = exports.returnsMultiType = exports.isMultiFunctionCall = exports.canBeMultiReturnType = exports.isMultiReturnType = void 0; | ||
const ts = require("typescript"); | ||
@@ -9,2 +9,3 @@ const extensions = require("../../utils/language-extensions"); | ||
const diagnostics_1 = require("../../utils/diagnostics"); | ||
const annotations_1 = require("../../utils/annotations"); | ||
function isMultiReturnType(type) { | ||
@@ -14,2 +15,6 @@ return extensions.isExtensionType(type, extensions.ExtensionKind.MultiType); | ||
exports.isMultiReturnType = isMultiReturnType; | ||
function canBeMultiReturnType(type) { | ||
return isMultiReturnType(type) || (type.isUnion() && type.types.some(canBeMultiReturnType)); | ||
} | ||
exports.canBeMultiReturnType = canBeMultiReturnType; | ||
function isMultiFunctionCall(context, expression) { | ||
@@ -26,3 +31,4 @@ return isMultiFunctionNode(context, expression.expression); | ||
function isMultiReturnCall(context, expression) { | ||
return ts.isCallExpression(expression) && returnsMultiType(context, expression); | ||
return ((ts.isCallExpression(expression) && returnsMultiType(context, expression)) || | ||
annotations_1.isTupleReturnCall(context, expression)); | ||
} | ||
@@ -46,3 +52,3 @@ exports.isMultiReturnCall = isMultiReturnCall; | ||
function shouldMultiReturnCallBeWrapped(context, node) { | ||
if (!returnsMultiType(context, node)) { | ||
if (!returnsMultiType(context, node) && !annotations_1.isTupleReturnCall(context, node)) { | ||
return false; | ||
@@ -49,0 +55,0 @@ } |
@@ -21,3 +21,3 @@ "use strict"; | ||
const type = context.checker.getContextualType(node); | ||
if (type && !multi_1.isMultiReturnType(type)) { | ||
if (type && !multi_1.canBeMultiReturnType(type)) { | ||
context.diagnostics.push(diagnostics_1.invalidMultiFunctionReturnType(node)); | ||
@@ -49,3 +49,3 @@ } | ||
} | ||
else if (!annotations_1.isTupleReturnCall(context, node) && typescript_1.isArrayType(context, expressionType)) { | ||
else if (!multi_1.isMultiReturnCall(context, node) && typescript_1.isArrayType(context, expressionType)) { | ||
// If return expression is an array-type and not another TupleReturn call, unpack it | ||
@@ -52,0 +52,0 @@ results = [lua_ast_1.createUnpackCall(context, context.transformExpression(node), node)]; |
@@ -59,6 +59,4 @@ "use strict"; | ||
const innerExpression = context.transformExpression(node.expression); | ||
if (annotations_1.isTupleReturnCall(context, node.expression)) | ||
if (multi_1.isMultiReturnCall(context, node.expression)) | ||
return innerExpression; | ||
if (ts.isCallExpression(node.expression) && multi_1.returnsMultiType(context, node.expression)) | ||
return innerExpression; | ||
const type = context.checker.getTypeAtLocation(node.expression); | ||
@@ -65,0 +63,0 @@ if (typescript_1.isArrayType(context, type)) { |
@@ -7,3 +7,2 @@ "use strict"; | ||
const utils_1 = require("../../utils"); | ||
const annotations_1 = require("../utils/annotations"); | ||
const assignment_validation_1 = require("../utils/assignment-validation"); | ||
@@ -118,3 +117,3 @@ const diagnostics_1 = require("../utils/diagnostics"); | ||
let expression = context.transformExpression(initializer); | ||
if (annotations_1.isTupleReturnCall(context, initializer) || multi_1.isMultiReturnCall(context, initializer)) { | ||
if (multi_1.isMultiReturnCall(context, initializer)) { | ||
expression = lua_ast_1.wrapInTable(expression); | ||
@@ -132,4 +131,4 @@ } | ||
if (initializer) { | ||
if (annotations_1.isTupleReturnCall(context, initializer) || multi_1.isMultiReturnCall(context, initializer)) { | ||
// Don't unpack @tupleReturn or LuaMultiReturn functions | ||
if (multi_1.isMultiReturnCall(context, initializer)) { | ||
// Don't unpack LuaMultiReturn functions | ||
statements.push(...lua_ast_1.createLocalOrExportedOrGlobalDeclaration(context, vars, context.transformExpression(initializer), initializer)); | ||
@@ -136,0 +135,0 @@ } |
@@ -112,2 +112,3 @@ "use strict"; | ||
if (required === "lualib_bundle") { | ||
dependencies.push({ fileName: "lualib_bundle", code: "" }); | ||
continue; | ||
@@ -114,0 +115,0 @@ } |
@@ -46,4 +46,9 @@ "use strict"; | ||
} | ||
const lualibRequired = files.some(f => f.code.includes('require("lualib_bundle")')); | ||
// Resolve imported modules and modify output Lua requires | ||
const resolutionResult = resolve_1.resolveDependencies(program, files, this.emitHost); | ||
diagnostics.push(...resolutionResult.diagnostics); | ||
const lualibRequired = resolutionResult.resolvedFiles.some(f => f.fileName === "lualib_bundle"); | ||
if (lualibRequired) { | ||
// Remove lualib placeholders from resolution result | ||
resolutionResult.resolvedFiles = resolutionResult.resolvedFiles.filter(f => f.fileName !== "lualib_bundle"); | ||
if (options.tstlVerbose) { | ||
@@ -54,7 +59,4 @@ console.log("Including lualib bundle"); | ||
const fileName = utils_1.normalizeSlashes(path.resolve(getSourceDir(program), "lualib_bundle.lua")); | ||
files.unshift({ fileName, code: LuaLib_1.getLuaLibBundle(this.emitHost) }); | ||
resolutionResult.resolvedFiles.unshift({ fileName, code: LuaLib_1.getLuaLibBundle(this.emitHost) }); | ||
} | ||
// Resolve imported modules and modify output Lua requires | ||
const resolutionResult = resolve_1.resolveDependencies(program, files, this.emitHost); | ||
diagnostics.push(...resolutionResult.diagnostics); | ||
let emitPlan; | ||
@@ -61,0 +63,0 @@ if (CompilerOptions_1.isBundleEnabled(options)) { |
@@ -90,3 +90,3 @@ #!/usr/bin/env node | ||
diagnostics.forEach(reportDiagnostic); | ||
const exitCode = diagnostics.length === 0 | ||
const exitCode = diagnostics.filter(d => d.category === ts.DiagnosticCategory.Error).length === 0 | ||
? ts.ExitStatus.Success | ||
@@ -93,0 +93,0 @@ : emitSkipped |
{ | ||
"name": "typescript-to-lua", | ||
"version": "0.41.2", | ||
"version": "0.42.0", | ||
"description": "A generic TypeScript to Lua transpiler. Write your code in TypeScript and publish Lua!", | ||
@@ -65,3 +65,3 @@ "repository": "https://github.com/TypeScriptToLua/TypeScriptToLua", | ||
"jest-circus": "^25.1.0", | ||
"lua-types": "^2.8.0", | ||
"lua-types": "2.10.1", | ||
"lua-wasm-bindings": "^0.2.2", | ||
@@ -68,0 +68,0 @@ "prettier": "^2.3.2", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
762961
11966