Socket
Socket
Sign inDemoInstall

typescript-to-lua

Package Overview
Dependencies
Maintainers
2
Versions
157
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

typescript-to-lua - npm Package Compare versions

Comparing version 1.12.0 to 1.12.1

3

dist/CompilerOptions.d.ts

@@ -42,3 +42,4 @@ import * as ts from "typescript";

Inline = "inline",
Require = "require"
Require = "require",
RequireMinimal = "require-minimal"
}

@@ -45,0 +46,0 @@ export declare enum LuaTarget {

@@ -11,2 +11,3 @@ "use strict";

LuaLibImportKind["Require"] = "require";
LuaLibImportKind["RequireMinimal"] = "require-minimal";
})(LuaLibImportKind = exports.LuaLibImportKind || (exports.LuaLibImportKind = {}));

@@ -13,0 +14,0 @@ var LuaTarget;

@@ -52,3 +52,3 @@ "use strict";

const exports = allFeatures.flatMap(feature => luaLibModuleInfo[feature].exports);
lualibBundle += `\nreturn {\n${exports.map(exportName => ` ${exportName} = ${exportName}`).join(",\n")}\n}\n`;
lualibBundle += (0, LuaLib_1.getLualibBundleReturn)(exports);
result.push({ fileName: "lualib_bundle.lua", code: lualibBundle });

@@ -55,0 +55,0 @@ return diagnostics;

@@ -113,2 +113,3 @@ import { EmitHost } from "./transpilation";

export declare function getLuaLibModulesInfo(luaTarget: LuaTarget, emitHost: EmitHost): LuaLibModulesInfo;
export declare function getLuaLibExportToFeatureMap(luaTarget: LuaTarget, emitHost: EmitHost): ReadonlyMap<string, LuaLibFeature>;
export declare function readLuaLibFeature(feature: LuaLibFeature, luaTarget: LuaTarget, emitHost: EmitHost): string;

@@ -119,1 +120,4 @@ export declare function resolveRecursiveLualibFeatures(features: Iterable<LuaLibFeature>, luaTarget: LuaTarget, emitHost: EmitHost, luaLibModulesInfo?: LuaLibModulesInfo): LuaLibFeature[];

export declare function getLuaLibBundle(luaTarget: LuaTarget, emitHost: EmitHost): string;
export declare function getLualibBundleReturn(exportedValues: string[]): string;
export declare function buildMinimalLualibBundle(features: Iterable<LuaLibFeature>, luaTarget: LuaTarget, emitHost: EmitHost): string;
export declare function findUsedLualibFeatures(luaTarget: LuaTarget, emitHost: EmitHost, luaContents: string[]): Set<LuaLibFeature>;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getLuaLibBundle = exports.loadImportedLualibFeatures = exports.loadInlineLualibFeatures = exports.resolveRecursiveLualibFeatures = exports.readLuaLibFeature = exports.getLuaLibModulesInfo = exports.luaLibModulesInfoFileName = exports.resolveLuaLibDir = exports.LuaLibFeature = void 0;
exports.findUsedLualibFeatures = exports.buildMinimalLualibBundle = exports.getLualibBundleReturn = exports.getLuaLibBundle = exports.loadImportedLualibFeatures = exports.loadInlineLualibFeatures = exports.resolveRecursiveLualibFeatures = exports.readLuaLibFeature = exports.getLuaLibExportToFeatureMap = exports.getLuaLibModulesInfo = exports.luaLibModulesInfoFileName = exports.resolveLuaLibDir = exports.LuaLibFeature = void 0;
const path = require("path");
const lua = require("./LuaAST");
const CompilerOptions_1 = require("./CompilerOptions");
const utils_1 = require("./utils");
var LuaLibFeature;

@@ -117,7 +118,7 @@ (function (LuaLibFeature) {

function getLuaLibModulesInfo(luaTarget, emitHost) {
const lualibPath = path.join(resolveLuaLibDir(luaTarget), exports.luaLibModulesInfoFileName);
if (!luaLibModulesInfo.has(lualibPath)) {
if (!luaLibModulesInfo.has(luaTarget)) {
const lualibPath = path.join(resolveLuaLibDir(luaTarget), exports.luaLibModulesInfoFileName);
const result = emitHost.readFile(lualibPath);
if (result !== undefined) {
luaLibModulesInfo.set(lualibPath, JSON.parse(result));
luaLibModulesInfo.set(luaTarget, JSON.parse(result));
}

@@ -128,12 +129,33 @@ else {

}
return luaLibModulesInfo.get(lualibPath);
return luaLibModulesInfo.get(luaTarget);
}
exports.getLuaLibModulesInfo = getLuaLibModulesInfo;
// This caches the names of lualib exports to their LuaLibFeature, avoiding a linear search for every lookup
const lualibExportToFeature = new Map();
function getLuaLibExportToFeatureMap(luaTarget, emitHost) {
if (!lualibExportToFeature.has(luaTarget)) {
const luaLibModulesInfo = getLuaLibModulesInfo(luaTarget, emitHost);
const map = new Map();
for (const [feature, info] of Object.entries(luaLibModulesInfo)) {
for (const exportName of info.exports) {
map.set(exportName, feature);
}
}
lualibExportToFeature.set(luaTarget, map);
}
return lualibExportToFeature.get(luaTarget);
}
exports.getLuaLibExportToFeatureMap = getLuaLibExportToFeatureMap;
const lualibFeatureCache = new Map();
function readLuaLibFeature(feature, luaTarget, emitHost) {
const featurePath = path.join(resolveLuaLibDir(luaTarget), `${feature}.lua`);
const luaLibFeature = emitHost.readFile(featurePath);
if (luaLibFeature === undefined) {
throw new Error(`Could not load lualib feature from '${featurePath}'`);
const featureMap = (0, utils_1.getOrUpdate)(lualibFeatureCache, luaTarget, () => new Map());
if (!featureMap.has(feature)) {
const featurePath = path.join(resolveLuaLibDir(luaTarget), `${feature}.lua`);
const luaLibFeature = emitHost.readFile(featurePath);
if (luaLibFeature === undefined) {
throw new Error(`Could not load lualib feature from '${featurePath}'`);
}
featureMap.set(feature, luaLibFeature);
}
return luaLibFeature;
return featureMap.get(feature);
}

@@ -162,8 +184,5 @@ exports.readLuaLibFeature = readLuaLibFeature;

function loadInlineLualibFeatures(features, luaTarget, emitHost) {
let result = "";
for (const feature of resolveRecursiveLualibFeatures(features, luaTarget, emitHost)) {
const luaLibFeature = readLuaLibFeature(feature, luaTarget, emitHost);
result += luaLibFeature + "\n";
}
return result;
return resolveRecursiveLualibFeatures(features, luaTarget, emitHost)
.map(feature => readLuaLibFeature(feature, luaTarget, emitHost))
.join("\n");
}

@@ -174,8 +193,8 @@ exports.loadInlineLualibFeatures = loadInlineLualibFeatures;

const imports = Array.from(features).flatMap(feature => luaLibModuleInfo[feature].exports);
if (imports.length === 0) {
return [];
}
const requireCall = lua.createCallExpression(lua.createIdentifier("require"), [
lua.createStringLiteral("lualib_bundle"),
]);
if (imports.length === 0) {
return [];
}
const luaLibId = lua.createIdentifier("____lualib");

@@ -206,2 +225,33 @@ const importStatement = lua.createVariableDeclarationStatement(luaLibId, requireCall);

exports.getLuaLibBundle = getLuaLibBundle;
function getLualibBundleReturn(exportedValues) {
return `\nreturn {\n${exportedValues.map(exportName => ` ${exportName} = ${exportName}`).join(",\n")}\n}\n`;
}
exports.getLualibBundleReturn = getLualibBundleReturn;
function buildMinimalLualibBundle(features, luaTarget, emitHost) {
const code = loadInlineLualibFeatures(features, luaTarget, emitHost);
const moduleInfo = getLuaLibModulesInfo(luaTarget, emitHost);
const exports = Array.from(features).flatMap(feature => moduleInfo[feature].exports);
return code + getLualibBundleReturn(exports);
}
exports.buildMinimalLualibBundle = buildMinimalLualibBundle;
function findUsedLualibFeatures(luaTarget, emitHost, luaContents) {
const features = new Set();
const exportToFeatureMap = getLuaLibExportToFeatureMap(luaTarget, emitHost);
for (const lua of luaContents) {
const regex = /^local (\w+) = ____lualib\.(\w+)$/gm;
while (true) {
const match = regex.exec(lua);
if (!match)
break;
const [, localName, exportName] = match;
if (localName !== exportName)
continue;
const feature = exportToFeatureMap.get(exportName);
if (feature)
features.add(feature);
}
}
return features;
}
exports.findUsedLualibFeatures = findUsedLualibFeatures;
//# sourceMappingURL=LuaLib.js.map

@@ -138,3 +138,4 @@ "use strict";

const luaLibImport = (_b = this.options.luaLibImport) !== null && _b !== void 0 ? _b : CompilerOptions_1.LuaLibImportKind.Require;
if (luaLibImport === CompilerOptions_1.LuaLibImportKind.Require && file.luaLibFeatures.size > 0) {
if ((luaLibImport === CompilerOptions_1.LuaLibImportKind.Require || luaLibImport === CompilerOptions_1.LuaLibImportKind.RequireMinimal) &&
file.luaLibFeatures.size > 0) {
// Import lualib features

@@ -141,0 +142,0 @@ sourceChunks = this.printStatementArray((0, LuaLib_1.loadImportedLualibFeatures)(file.luaLibFeatures, luaTarget, this.emitHost));

@@ -45,6 +45,6 @@ "use strict";

function transformSingleElementArrayPush(context, node, caller, param) {
const expressionIsUsed = !ts.isExpressionStatement((0, typescript_1.findFirstNonOuterParent)(node));
const arrayIdentifier = lua.isIdentifier(caller) ? caller : (0, expression_list_1.moveToPrecedingTemp)(context, caller);
// #array + 1
let lengthExpression = lua.createBinaryExpression(createTableLengthExpression(context, arrayIdentifier), lua.createNumericLiteral(1), lua.SyntaxKind.AdditionOperator);
const expressionIsUsed = (0, typescript_1.expressionResultIsUsed)(node);
if (expressionIsUsed) {

@@ -51,0 +51,0 @@ // store length in a temp

@@ -94,1 +94,7 @@ import * as ts from "typescript";

};
export declare const invalidMethodCallExtensionUse: ((node: ts.Node, ...args: any[]) => ts.Diagnostic) & {
code: number;
};
export declare const invalidSpreadInCallExtension: ((node: ts.Node, ...args: any[]) => ts.Diagnostic) & {
code: number;
};
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.undefinedInArrayLiteral = exports.unsupportedOptionalCompileMembersOnly = exports.unsupportedBuiltinOptionalCall = exports.awaitMustBeInAsyncFunction = exports.notAllowedOptionalAssignment = exports.truthyOnlyConditionalValue = exports.annotationDeprecated = exports.invalidCallExtensionUse = exports.invalidMultiReturnAccess = 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;
exports.invalidSpreadInCallExtension = exports.invalidMethodCallExtensionUse = exports.undefinedInArrayLiteral = exports.unsupportedOptionalCompileMembersOnly = exports.unsupportedBuiltinOptionalCall = exports.awaitMustBeInAsyncFunction = exports.notAllowedOptionalAssignment = exports.truthyOnlyConditionalValue = exports.annotationDeprecated = exports.invalidCallExtensionUse = exports.invalidMultiReturnAccess = 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;
const ts = require("typescript");

@@ -62,2 +62,4 @@ const CompilerOptions_1 = require("../../CompilerOptions");

exports.undefinedInArrayLiteral = createErrorDiagnosticFactory("Array literals may not contain undefined or null.");
exports.invalidMethodCallExtensionUse = createErrorDiagnosticFactory("This language extension must be called as a method.");
exports.invalidSpreadInCallExtension = createErrorDiagnosticFactory("Spread elements are not supported in call extensions.");
//# sourceMappingURL=diagnostics.js.map

@@ -66,1 +66,5 @@ import * as ts from "typescript";

export declare function getIterableExtensionKindForNode(context: TransformationContext, node: ts.Node): IterableExtensionKind | undefined;
export declare const methodExtensionKinds: ReadonlySet<ExtensionKind>;
export declare function getNaryCallExtensionArgs(context: TransformationContext, node: ts.CallExpression, kind: ExtensionKind, numArgs: number): readonly ts.Expression[] | undefined;
export declare function getUnaryCallExtensionArg(context: TransformationContext, node: ts.CallExpression, kind: ExtensionKind): ts.Expression | undefined;
export declare function getBinaryCallExtensionArgs(context: TransformationContext, node: ts.CallExpression, kind: ExtensionKind): readonly [ts.Expression, ts.Expression] | undefined;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getIterableExtensionKindForNode = exports.getIterableExtensionTypeForType = exports.isLuaIterable = exports.IterableExtensionKind = exports.getExtensionKindForSymbol = exports.getExtensionKindForNode = exports.getExtensionKindForType = exports.ExtensionKind = void 0;
exports.getBinaryCallExtensionArgs = exports.getUnaryCallExtensionArg = exports.getNaryCallExtensionArgs = exports.methodExtensionKinds = exports.getIterableExtensionKindForNode = exports.getIterableExtensionTypeForType = exports.isLuaIterable = exports.IterableExtensionKind = exports.getExtensionKindForSymbol = exports.getExtensionKindForNode = exports.getExtensionKindForType = exports.ExtensionKind = void 0;
const ts = require("typescript");
const diagnostics_1 = require("./diagnostics");
var ExtensionKind;

@@ -115,2 +116,66 @@ (function (ExtensionKind) {

exports.getIterableExtensionKindForNode = getIterableExtensionKindForNode;
exports.methodExtensionKinds = new Set([
ExtensionKind.AdditionOperatorMethodType,
ExtensionKind.SubtractionOperatorMethodType,
ExtensionKind.MultiplicationOperatorMethodType,
ExtensionKind.DivisionOperatorMethodType,
ExtensionKind.ModuloOperatorMethodType,
ExtensionKind.PowerOperatorMethodType,
ExtensionKind.FloorDivisionOperatorMethodType,
ExtensionKind.BitwiseAndOperatorMethodType,
ExtensionKind.BitwiseOrOperatorMethodType,
ExtensionKind.BitwiseExclusiveOrOperatorMethodType,
ExtensionKind.BitwiseLeftShiftOperatorMethodType,
ExtensionKind.BitwiseRightShiftOperatorMethodType,
ExtensionKind.ConcatOperatorMethodType,
ExtensionKind.LessThanOperatorMethodType,
ExtensionKind.GreaterThanOperatorMethodType,
ExtensionKind.NegationOperatorMethodType,
ExtensionKind.BitwiseNotOperatorMethodType,
ExtensionKind.LengthOperatorMethodType,
ExtensionKind.TableDeleteMethodType,
ExtensionKind.TableGetMethodType,
ExtensionKind.TableHasMethodType,
ExtensionKind.TableSetMethodType,
ExtensionKind.TableAddKeyMethodType,
]);
function getNaryCallExtensionArgs(context, node, kind, numArgs) {
let expressions;
if (node.arguments.some(ts.isSpreadElement)) {
context.diagnostics.push((0, diagnostics_1.invalidSpreadInCallExtension)(node));
return undefined;
}
if (exports.methodExtensionKinds.has(kind)) {
if (!(ts.isPropertyAccessExpression(node.expression) || ts.isElementAccessExpression(node.expression))) {
context.diagnostics.push((0, diagnostics_1.invalidMethodCallExtensionUse)(node));
return undefined;
}
if (node.arguments.length < numArgs - 1) {
// assumed to be TS error
return undefined;
}
expressions = [node.expression.expression, ...node.arguments];
}
else {
if (node.arguments.length < numArgs) {
// assumed to be TS error
return undefined;
}
expressions = node.arguments;
}
return expressions;
}
exports.getNaryCallExtensionArgs = getNaryCallExtensionArgs;
function getUnaryCallExtensionArg(context, node, kind) {
var _a;
return (_a = getNaryCallExtensionArgs(context, node, kind, 1)) === null || _a === void 0 ? void 0 : _a[0];
}
exports.getUnaryCallExtensionArg = getUnaryCallExtensionArg;
function getBinaryCallExtensionArgs(context, node, kind) {
const expressions = getNaryCallExtensionArgs(context, node, kind, 2);
if (expressions === undefined)
return undefined;
return [expressions[0], expressions[1]];
}
exports.getBinaryCallExtensionArgs = getBinaryCallExtensionArgs;
//# sourceMappingURL=language-extensions.js.map

@@ -11,2 +11,3 @@ import * as ts from "typescript";

export declare function findFirstNonOuterParent(node: ts.Node): ts.Node;
export declare function expressionResultIsUsed(node: ts.Expression): boolean;
export declare function getFirstDeclarationInFile(symbol: ts.Symbol, sourceFile: ts.SourceFile): ts.Declaration | undefined;

@@ -13,0 +14,0 @@ export declare function isStandardLibraryDeclaration(context: TransformationContext, declaration: ts.Declaration): boolean;

@@ -17,3 +17,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.isConstIdentifier = exports.getFunctionTypeForCall = exports.isExpressionWithEvaluationEffect = exports.getAllCallSignatures = exports.inferAssignedType = exports.hasStandardLibrarySignature = exports.isStandardLibraryType = exports.isStandardLibraryDeclaration = exports.getFirstDeclarationInFile = exports.findFirstNonOuterParent = exports.findFirstNodeAbove = exports.hasExportEquals = void 0;
exports.isConstIdentifier = exports.getFunctionTypeForCall = exports.isExpressionWithEvaluationEffect = exports.getAllCallSignatures = exports.inferAssignedType = exports.hasStandardLibrarySignature = exports.isStandardLibraryType = exports.isStandardLibraryDeclaration = exports.getFirstDeclarationInFile = exports.expressionResultIsUsed = exports.findFirstNonOuterParent = exports.findFirstNodeAbove = exports.hasExportEquals = void 0;
const ts = require("typescript");

@@ -50,2 +50,6 @@ __exportStar(require("./nodes"), exports);

exports.findFirstNonOuterParent = findFirstNonOuterParent;
function expressionResultIsUsed(node) {
return !ts.isExpressionStatement(findFirstNonOuterParent(node));
}
exports.expressionResultIsUsed = expressionResultIsUsed;
function getFirstDeclarationInFile(symbol, sourceFile) {

@@ -52,0 +56,0 @@ var _a, _b;

@@ -106,5 +106,2 @@ "use strict";

function canBeFalsyWhenNotNull(context, type) {
const strictNullChecks = context.options.strict === true || context.options.strictNullChecks === true;
if (!strictNullChecks && !type.isLiteral())
return true;
const falsyFlags = ts.TypeFlags.Boolean |

@@ -111,0 +108,0 @@ ts.TypeFlags.BooleanLiteral |

import * as ts from "typescript";
import * as lua from "../../LuaAST";
import { FunctionVisitor, TransformationContext } from "../context";
import { FunctionVisitor } from "../context";
export declare const transformExpressionStatement: FunctionVisitor<ts.ExpressionStatement>;
export declare function transformExpressionToStatement(context: TransformationContext, expression: ts.Expression): lua.Statement | undefined;
export declare function wrapInStatement(result: lua.Expression): lua.Statement | undefined;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformExpressionToStatement = exports.transformExpressionStatement = void 0;
exports.wrapInStatement = exports.transformExpressionStatement = void 0;
const lua = require("../../LuaAST");

@@ -17,7 +17,6 @@ const context_1 = require("../context");

}
return transformExpressionToStatement(context, node.expression);
return wrapInStatement(context.transformExpression(node.expression));
};
exports.transformExpressionStatement = transformExpressionStatement;
function transformExpressionToStatement(context, expression) {
const result = context.transformExpression(expression);
function wrapInStatement(result) {
const isTempVariable = lua.isIdentifier(result) && result.symbolId === context_1.tempSymbolId;

@@ -38,3 +37,3 @@ if (isTempVariable) {

}
exports.transformExpressionToStatement = transformExpressionToStatement;
exports.wrapInStatement = wrapInStatement;
//# sourceMappingURL=expression-statement.js.map

@@ -24,3 +24,5 @@ "use strict";

if ((0, optional_chaining_1.isOptionalContinuation)(identifier)) {
return lua.createIdentifier(identifier.text, undefined, context_1.tempSymbolId);
const result = lua.createIdentifier(identifier.text, undefined, context_1.tempSymbolId);
(0, optional_chaining_1.getOptionalContinuationData)(identifier).usedIdentifiers.push(result);
return result;
}

@@ -27,0 +29,0 @@ const extensionKind = symbol

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.operatorExtensionTransformers = void 0;
const ts = require("typescript");
const lua = require("../../../LuaAST");

@@ -10,2 +9,3 @@ const utils_1 = require("../../../utils");

const language_extensions_1 = require("../../utils/language-extensions");
const expression_list_1 = require("../expression-list");
const binaryOperatorMappings = new Map([

@@ -80,10 +80,9 @@ [language_extensions_1.ExtensionKind.AdditionOperatorType, lua.SyntaxKind.AdditionOperator],

checkHasLua53(context, node, kind);
let args = node.arguments;
if (args.length === 1 &&
(ts.isPropertyAccessExpression(node.expression) || ts.isElementAccessExpression(node.expression))) {
args = [node.expression.expression, ...args];
}
const args = (0, language_extensions_1.getBinaryCallExtensionArgs)(context, node, kind);
if (!args)
return lua.createNilLiteral();
const [left, right] = (0, expression_list_1.transformOrderedExpressions)(context, args);
const luaOperator = binaryOperatorMappings.get(kind);
(0, utils_1.assert)(luaOperator);
return lua.createBinaryExpression(context.transformExpression(args[0]), context.transformExpression(args[1]), luaOperator);
return lua.createBinaryExpression(left, right, luaOperator);
}

@@ -93,10 +92,5 @@ function transformUnaryOperator(context, node, kind) {

checkHasLua53(context, node, kind);
let arg;
if (node.arguments.length === 0 &&
(ts.isPropertyAccessExpression(node.expression) || ts.isElementAccessExpression(node.expression))) {
arg = node.expression.expression;
}
else {
arg = node.arguments[0];
}
const arg = (0, language_extensions_1.getUnaryCallExtensionArg)(context, node, kind);
if (!arg)
return lua.createNilLiteral();
const luaOperator = unaryOperatorMappings.get(kind);

@@ -103,0 +97,0 @@ (0, utils_1.assert)(luaOperator);

import * as ts from "typescript";
import { TransformationContext } from "../../context";
import { ExtensionKind } from "../../utils/language-extensions";
import { LanguageExtensionCallTransformer } from "./call-extension";
import { LanguageExtensionCallTransformerMap } from "./call-extension";
export declare function isTableNewCall(context: TransformationContext, node: ts.NewExpression): boolean;
export declare const tableNewExtensions: ExtensionKind[];
export declare const tableExtensionTransformers: {
[P in ExtensionKind]?: LanguageExtensionCallTransformer;
};
export declare const tableExtensionTransformers: LanguageExtensionCallTransformerMap;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.tableExtensionTransformers = exports.tableNewExtensions = exports.isTableNewCall = void 0;
const ts = require("typescript");
const lua = require("../../../LuaAST");

@@ -22,39 +21,32 @@ const language_extensions_1 = require("../../utils/language-extensions");

[language_extensions_1.ExtensionKind.TableSetMethodType]: transformTableSetExpression,
[language_extensions_1.ExtensionKind.TableAddKeyType]: transformTableAddExpression,
[language_extensions_1.ExtensionKind.TableAddKeyMethodType]: transformTableAddExpression,
[language_extensions_1.ExtensionKind.TableAddKeyType]: transformTableAddKeyExpression,
[language_extensions_1.ExtensionKind.TableAddKeyMethodType]: transformTableAddKeyExpression,
};
function transformTableDeleteExpression(context, node, extensionKind) {
const args = node.arguments.slice();
if (extensionKind === language_extensions_1.ExtensionKind.TableDeleteMethodType &&
(ts.isPropertyAccessExpression(node.expression) || ts.isElementAccessExpression(node.expression))) {
// In case of method (no table argument), push method owner to front of args list
args.unshift(node.expression.expression);
const args = (0, language_extensions_1.getBinaryCallExtensionArgs)(context, node, extensionKind);
if (!args) {
return lua.createNilLiteral();
}
const [table, accessExpression] = (0, expression_list_1.transformExpressionList)(context, args);
const [table, key] = (0, expression_list_1.transformOrderedExpressions)(context, args);
// arg0[arg1] = nil
context.addPrecedingStatements(lua.createAssignmentStatement(lua.createTableIndexExpression(table, accessExpression), lua.createNilLiteral(), node));
context.addPrecedingStatements(lua.createAssignmentStatement(lua.createTableIndexExpression(table, key), lua.createNilLiteral(), node));
return lua.createBooleanLiteral(true);
}
function transformWithTableArgument(context, node) {
if (ts.isPropertyAccessExpression(node.expression) || ts.isElementAccessExpression(node.expression)) {
return (0, expression_list_1.transformExpressionList)(context, [node.expression.expression, ...node.arguments]);
function transformTableGetExpression(context, node, extensionKind) {
const args = (0, language_extensions_1.getBinaryCallExtensionArgs)(context, node, extensionKind);
if (!args) {
return lua.createNilLiteral();
}
// todo: report diagnostic?
return [lua.createNilLiteral(), ...(0, expression_list_1.transformExpressionList)(context, node.arguments)];
}
function transformTableGetExpression(context, node, extensionKind) {
const args = extensionKind === language_extensions_1.ExtensionKind.TableGetMethodType
? transformWithTableArgument(context, node)
: (0, expression_list_1.transformExpressionList)(context, node.arguments);
const [table, accessExpression] = args;
const [table, key] = (0, expression_list_1.transformOrderedExpressions)(context, args);
// arg0[arg1]
return lua.createTableIndexExpression(table, accessExpression, node);
return lua.createTableIndexExpression(table, key, node);
}
function transformTableHasExpression(context, node, extensionKind) {
const args = extensionKind === language_extensions_1.ExtensionKind.TableHasMethodType
? transformWithTableArgument(context, node)
: (0, expression_list_1.transformExpressionList)(context, node.arguments);
const [table, accessExpression] = args;
const args = (0, language_extensions_1.getBinaryCallExtensionArgs)(context, node, extensionKind);
if (!args) {
return lua.createNilLiteral();
}
const [table, key] = (0, expression_list_1.transformOrderedExpressions)(context, args);
// arg0[arg1]
const tableIndexExpression = lua.createTableIndexExpression(table, accessExpression);
const tableIndexExpression = lua.createTableIndexExpression(table, key);
// arg0[arg1] ~= nil

@@ -64,19 +56,21 @@ return lua.createBinaryExpression(tableIndexExpression, lua.createNilLiteral(), lua.SyntaxKind.InequalityOperator, node);

function transformTableSetExpression(context, node, extensionKind) {
const args = extensionKind === language_extensions_1.ExtensionKind.TableSetMethodType
? transformWithTableArgument(context, node)
: (0, expression_list_1.transformExpressionList)(context, node.arguments);
const [table, accessExpression, value] = args;
const args = (0, language_extensions_1.getNaryCallExtensionArgs)(context, node, extensionKind, 3);
if (!args) {
return lua.createNilLiteral();
}
const [table, key, value] = (0, expression_list_1.transformOrderedExpressions)(context, args);
// arg0[arg1] = arg2
context.addPrecedingStatements(lua.createAssignmentStatement(lua.createTableIndexExpression(table, accessExpression), value, node));
context.addPrecedingStatements(lua.createAssignmentStatement(lua.createTableIndexExpression(table, key), value, node));
return lua.createNilLiteral();
}
function transformTableAddExpression(context, node, extensionKind) {
const args = extensionKind === language_extensions_1.ExtensionKind.TableAddKeyMethodType
? transformWithTableArgument(context, node)
: (0, expression_list_1.transformExpressionList)(context, node.arguments);
const [table, value] = args;
function transformTableAddKeyExpression(context, node, extensionKind) {
const args = (0, language_extensions_1.getNaryCallExtensionArgs)(context, node, extensionKind, 2);
if (!args) {
return lua.createNilLiteral();
}
const [table, key] = (0, expression_list_1.transformOrderedExpressions)(context, args);
// arg0[arg1] = true
context.addPrecedingStatements(lua.createAssignmentStatement(lua.createTableIndexExpression(table, value), lua.createBooleanLiteral(true), node));
context.addPrecedingStatements(lua.createAssignmentStatement(lua.createTableIndexExpression(table, key), lua.createBooleanLiteral(true), node));
return lua.createNilLiteral();
}
//# sourceMappingURL=table.js.map

@@ -11,2 +11,3 @@ import * as ts from "typescript";

contextualCall?: lua.CallExpression;
usedIdentifiers: lua.Identifier[];
}

@@ -16,3 +17,3 @@ export declare function isOptionalContinuation(node: ts.Node): boolean;

export declare function transformOptionalChain(context: TransformationContext, node: ts.OptionalChain): lua.Expression;
export declare function transformOptionalChainWithCapture(context: TransformationContext, node: ts.OptionalChain, thisValueCapture: lua.Identifier | undefined, isDelete?: ts.DeleteExpression): ExpressionWithThisValue;
export declare function transformOptionalChainWithCapture(context: TransformationContext, tsNode: ts.OptionalChain, thisValueCapture: lua.Identifier | undefined, isDelete?: ts.DeleteExpression): ExpressionWithThisValue;
export declare function transformOptionalDeleteExpression(context: TransformationContext, node: ts.DeleteExpression, innerExpression: ts.OptionalChain): lua.BooleanLiteral;

@@ -11,2 +11,4 @@ "use strict";

const expression_list_1 = require("./expression-list");
const typescript_1 = require("../utils/typescript");
const expression_statement_1 = require("./expression-statement");
function skipNonNullChains(chain) {

@@ -43,3 +45,3 @@ while (ts.isNonNullChain(chain)) {

function captureThisValue(context, expression, thisValueCapture, tsOriginal) {
if (!(0, expression_list_1.shouldMoveToTemp)(context, expression, tsOriginal) && !isOptionalContinuation(tsOriginal)) {
if (!(0, expression_list_1.shouldMoveToTemp)(context, expression, tsOriginal)) {
return expression;

@@ -57,3 +59,5 @@ }

ts.setOriginalNode(identifier, tsOriginal);
optionalContinuations.set(identifier, {});
optionalContinuations.set(identifier, {
usedIdentifiers: [],
});
return identifier;

@@ -73,8 +77,7 @@ }

exports.transformOptionalChain = transformOptionalChain;
function transformOptionalChainWithCapture(context, node, thisValueCapture, isDelete) {
var _a;
const luaTemp = context.createTempNameForNode(node);
const { expression: tsLeftExpression, chain } = flattenChain(node);
function transformOptionalChainWithCapture(context, tsNode, thisValueCapture, isDelete) {
const luaTempName = context.createTempName("opt");
const { expression: tsLeftExpression, chain } = flattenChain(tsNode);
// build temp.b.c.d
const tsTemp = createOptionalContinuationIdentifier(luaTemp.text, tsLeftExpression);
const tsTemp = createOptionalContinuationIdentifier(luaTempName, tsLeftExpression);
let tsRightExpression = tsTemp;

@@ -103,11 +106,9 @@ for (const link of chain) {

let returnThisValue;
const [rightPrecedingStatements, rightAssignment] = (0, preceding_statements_1.transformInPrecedingStatementScope)(context, () => {
let result;
if (thisValueCapture) {
({ expression: result, thisValue: returnThisValue } = transformExpressionWithThisValueCapture(context, tsRightExpression, thisValueCapture));
const [rightPrecedingStatements, rightExpression] = (0, preceding_statements_1.transformInPrecedingStatementScope)(context, () => {
if (!thisValueCapture) {
return context.transformExpression(tsRightExpression);
}
else {
result = context.transformExpression(tsRightExpression);
}
return lua.createAssignmentStatement(luaTemp, result);
const { expression: result, thisValue } = transformExpressionWithThisValueCapture(context, tsRightExpression, thisValueCapture);
returnThisValue = thisValue;
return result;
});

@@ -118,3 +119,4 @@ // transform left expression, handle thisValue if needed by rightExpression

let capturedThisValue;
const rightContextualCall = (_a = getOptionalContinuationData(tsTemp)) === null || _a === void 0 ? void 0 : _a.contextualCall;
const optionalContinuationData = getOptionalContinuationData(tsTemp);
const rightContextualCall = optionalContinuationData === null || optionalContinuationData === void 0 ? void 0 : optionalContinuationData.contextualCall;
const [leftPrecedingStatements, leftExpression] = (0, preceding_statements_1.transformInPrecedingStatementScope)(context, () => {

@@ -155,18 +157,62 @@ let result;

}
// <left preceding statements>
// local temp = <left>
// if temp ~= nil then
// <right preceding statements>
// temp = temp.b.c.d
// end
// return temp
context.addPrecedingStatements([
...leftPrecedingStatements,
lua.createVariableDeclarationStatement(luaTemp, leftExpression),
lua.createIfStatement(lua.createBinaryExpression(luaTemp, lua.createNilLiteral(), lua.SyntaxKind.InequalityOperator), lua.createBlock([...rightPrecedingStatements, rightAssignment])),
]);
return {
expression: luaTemp,
thisValue: returnThisValue,
};
// evaluate optional chain
context.addPrecedingStatements(leftPrecedingStatements);
// try use existing variable instead of creating new one, if possible
let leftIdentifier;
const usedLuaIdentifiers = optionalContinuationData === null || optionalContinuationData === void 0 ? void 0 : optionalContinuationData.usedIdentifiers;
const reuseLeftIdentifier = usedLuaIdentifiers &&
usedLuaIdentifiers.length > 0 &&
lua.isIdentifier(leftExpression) &&
(rightPrecedingStatements.length === 0 || !(0, expression_list_1.shouldMoveToTemp)(context, leftExpression, tsLeftExpression));
if (reuseLeftIdentifier) {
leftIdentifier = leftExpression;
for (const usedIdentifier of usedLuaIdentifiers) {
usedIdentifier.text = leftIdentifier.text;
}
}
else {
leftIdentifier = lua.createIdentifier(luaTempName, undefined, context_1.tempSymbolId);
context.addPrecedingStatements(lua.createVariableDeclarationStatement(leftIdentifier, leftExpression));
}
if (!(0, typescript_1.expressionResultIsUsed)(tsNode) || isDelete) {
// if left ~= nil then
// <right preceding statements>
// <right expression>
// end
const innerExpression = (0, expression_statement_1.wrapInStatement)(rightExpression);
const innerStatements = rightPrecedingStatements;
if (innerExpression)
innerStatements.push(innerExpression);
context.addPrecedingStatements(lua.createIfStatement(lua.createBinaryExpression(leftIdentifier, lua.createNilLiteral(), lua.SyntaxKind.InequalityOperator), lua.createBlock(innerStatements)));
return { expression: lua.createNilLiteral(), thisValue: returnThisValue };
}
else if (rightPrecedingStatements.length === 0 &&
!(0, typescript_1.canBeFalsyWhenNotNull)(context, context.checker.getTypeAtLocation(tsLeftExpression))) {
// return a && a.b
return {
expression: lua.createBinaryExpression(leftIdentifier, rightExpression, lua.SyntaxKind.AndOperator, tsNode),
thisValue: returnThisValue,
};
}
else {
let resultIdentifier;
if (!reuseLeftIdentifier) {
// reuse temp variable for output
resultIdentifier = leftIdentifier;
}
else {
resultIdentifier = lua.createIdentifier(context.createTempName("opt_result"), undefined, context_1.tempSymbolId);
context.addPrecedingStatements(lua.createVariableDeclarationStatement(resultIdentifier));
}
// if left ~= nil then
// <right preceding statements>
// result = <right expression>
// end
// return result
context.addPrecedingStatements(lua.createIfStatement(lua.createBinaryExpression(leftIdentifier, lua.createNilLiteral(), lua.SyntaxKind.InequalityOperator), lua.createBlock([
...rightPrecedingStatements,
lua.createAssignmentStatement(resultIdentifier, rightExpression),
])));
return { expression: resultIdentifier, thisValue: returnThisValue };
}
}

@@ -173,0 +219,0 @@ exports.transformOptionalChainWithCapture = transformOptionalChainWithCapture;

@@ -11,3 +11,3 @@ "use strict";

if (!ts.isLiteralExpression(node.expression)) {
const statements = (0, expression_statement_1.transformExpressionToStatement)(context, node.expression);
const statements = (0, expression_statement_1.wrapInStatement)(context.transformExpression(node.expression));
if (statements)

@@ -14,0 +14,0 @@ context.addPrecedingStatements(statements);

@@ -20,5 +20,5 @@ "use strict";

}));
exports.cannotBundleLibrary = createDiagnosticFactory(() => 'Cannot bundle probjects with"buildmode": "library". Projects including the library can still bundle (which will include external library files).');
exports.cannotBundleLibrary = createDiagnosticFactory(() => 'Cannot bundle projects with "buildmode": "library". Projects including the library can still bundle (which will include external library files).');
exports.unsupportedJsxEmit = createDiagnosticFactory(() => 'JSX is only supported with "react" jsx option.');
exports.pathsWithoutBaseUrl = createDiagnosticFactory(() => "When configuring 'paths' in tsconfig.json, the option 'baseUrl' must also be provided.");
//# sourceMappingURL=diagnostics.js.map

@@ -22,2 +22,3 @@ import * as ts from "typescript";

};
private getLuaLibBundleContent;
}

@@ -24,0 +25,0 @@ export declare function getEmitPath(file: string, program: ts.Program): string;

@@ -64,3 +64,2 @@ "use strict";

getEmitPlan(program, diagnostics, files) {
var _a;
performance.startSection("getEmitPlan");

@@ -83,4 +82,4 @@ const options = program.getCompilerOptions();

const fileName = (0, utils_1.normalizeSlashes)(path.resolve(getSourceDir(program), "lualib_bundle.lua"));
const luaTarget = (_a = options.luaTarget) !== null && _a !== void 0 ? _a : CompilerOptions_1.LuaTarget.Universal;
resolutionResult.resolvedFiles.unshift({ fileName, code: (0, LuaLib_1.getLuaLibBundle)(luaTarget, this.emitHost) });
const code = this.getLuaLibBundleContent(options, resolutionResult.resolvedFiles);
resolutionResult.resolvedFiles.unshift({ fileName, code });
}

@@ -102,2 +101,13 @@ let emitPlan;

}
getLuaLibBundleContent(options, resolvedFiles) {
var _a;
const luaTarget = (_a = options.luaTarget) !== null && _a !== void 0 ? _a : CompilerOptions_1.LuaTarget.Universal;
if (options.luaLibImport === CompilerOptions_1.LuaLibImportKind.RequireMinimal) {
const usedFeatures = (0, LuaLib_1.findUsedLualibFeatures)(luaTarget, this.emitHost, resolvedFiles.map(f => f.code));
return (0, LuaLib_1.buildMinimalLualibBundle)(usedFeatures, luaTarget, this.emitHost);
}
else {
return (0, LuaLib_1.getLuaLibBundle)(luaTarget, this.emitHost);
}
}
}

@@ -104,0 +114,0 @@ exports.Transpiler = Transpiler;

{
"name": "typescript-to-lua",
"version": "1.12.0",
"version": "1.12.1",
"description": "A generic TypeScript to Lua transpiler. Write your code in TypeScript and publish Lua!",

@@ -5,0 +5,0 @@ "repository": "https://github.com/TypeScriptToLua/TypeScriptToLua",

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

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc