typescript-to-lua
Advanced tools
Comparing version 1.7.1 to 1.7.2
@@ -120,3 +120,3 @@ "use strict"; | ||
const parameters = transformArguments(context, node.arguments, signature, ts.factory.createThis()); | ||
return lua.createCallExpression(context.transformExpression(node.expression), parameters); | ||
return lua.createCallExpression(context.transformExpression(node.expression), parameters, node); | ||
} | ||
@@ -144,3 +144,3 @@ const signatureDeclaration = signature === null || signature === void 0 ? void 0 : signature.getDeclaration(); | ||
const [expression, parameters] = transformCallAndArguments(context, node.expression, node.arguments, signature); | ||
return lua.createCallExpression(expression, parameters); | ||
return lua.createCallExpression(expression, parameters, node); | ||
} | ||
@@ -180,3 +180,3 @@ } | ||
const parameters = transformArguments(context, node.arguments, signature, ts.factory.createThis()); | ||
return lua.createCallExpression(lua.createTableIndexExpression(context.transformExpression(ts.factory.createSuper()), lua.createStringLiteral("____constructor")), parameters); | ||
return lua.createCallExpression(lua.createTableIndexExpression(context.transformExpression(ts.factory.createSuper()), lua.createStringLiteral("____constructor")), parameters, node); | ||
} | ||
@@ -183,0 +183,0 @@ let callPath; |
@@ -12,2 +12,3 @@ "use strict"; | ||
function transformForOfMultiIterableStatement(context, statement, block, luaIterator, invalidMultiUseDiagnostic) { | ||
context.pushPrecedingStatements(); | ||
let identifiers = []; | ||
@@ -40,2 +41,3 @@ if (ts.isVariableDeclarationList(statement.initializer)) { | ||
} | ||
block.statements.unshift(...context.popPrecedingStatements()); | ||
return lua.createForInStatement(block, identifiers, [luaIterator], statement); | ||
@@ -42,0 +44,0 @@ } |
@@ -120,6 +120,6 @@ "use strict"; | ||
(0, lualib_1.importLuaLibFeature)(context, lualib_1.LuaLibFeature.Promise); | ||
const importPath = node.arguments.map(a => context.transformExpression(a)); | ||
return lua.createCallExpression((0, promise_1.createStaticPromiseFunctionAccessor)("resolve", node), importPath, node); | ||
const moduleRequire = node.arguments.length > 0 ? createModuleRequire(context, node.arguments[0], node) : lua.createNilLiteral(); | ||
return lua.createCallExpression((0, promise_1.createStaticPromiseFunctionAccessor)("resolve", node), [moduleRequire], node); | ||
}; | ||
exports.transformImportExpression = transformImportExpression; | ||
//# sourceMappingURL=import.js.map |
@@ -107,2 +107,10 @@ "use strict"; | ||
} | ||
const requiredFromLuaFile = requiringFile.fileName.endsWith(".lua"); | ||
const dependencyPath = requiredFromLuaFile ? luaRequireToPath(dependency) : dependency; | ||
if (requiredFromLuaFile && isNodeModulesFile(requiringFile.fileName)) { | ||
// If requiring file is in lua module, try to resolve sibling in that file first | ||
const resolvedNodeModulesFile = this.resolveLuaDependencyPathFromNodeModules(requiringFile, dependencyPath); | ||
if (resolvedNodeModulesFile) | ||
return resolvedNodeModulesFile; | ||
} | ||
// Check if the import is relative | ||
@@ -114,16 +122,15 @@ const isRelative = ["/", "./", "../"].some(p => dependency.startsWith(p)); | ||
// Check if file is a file in the project | ||
const resolvedPath = path.join(relativeTo, dependency); | ||
const resolvedPath = path.join(relativeTo, dependencyPath); | ||
const fileFromPath = this.getFileFromPath(resolvedPath); | ||
if (fileFromPath) | ||
return fileFromPath; | ||
// Check if this is a sibling of a required lua file | ||
if (requiringFile.fileName.endsWith(".lua")) { | ||
const luaFilePath = resolveLuaPath(fileDirectory, dependency, this.emitHost); | ||
if (luaFilePath) { | ||
return luaFilePath; | ||
} | ||
if (this.options.paths && this.options.baseUrl) { | ||
// If no file found yet and paths are present, try to find project file via paths mappings | ||
const fileFromPaths = this.tryGetModuleNameFromPaths(dependencyPath, this.options.paths, this.options.baseUrl); | ||
if (fileFromPaths) | ||
return fileFromPaths; | ||
} | ||
// Not a TS file in our project sources, use resolver to check if we can find dependency | ||
try { | ||
const resolveResult = resolver.resolveSync({}, fileDirectory, dependency); | ||
const resolveResult = resolver.resolveSync({}, fileDirectory, dependencyPath); | ||
if (resolveResult) | ||
@@ -137,2 +144,21 @@ return resolveResult; | ||
} | ||
resolveLuaDependencyPathFromNodeModules(requiringFile, dependency) { | ||
// We don't know for sure where the lua root is, so guess it is at package root | ||
const splitPath = path.normalize(requiringFile.fileName).split(path.sep); | ||
let packageRootIndex = splitPath.lastIndexOf("node_modules") + 2; | ||
let packageRoot = splitPath.slice(0, packageRootIndex).join(path.sep); | ||
while (packageRootIndex < splitPath.length) { | ||
// Try to find lua file relative to currently guessed Lua root | ||
const resolvedPath = path.join(packageRoot, dependency); | ||
const fileFromPath = this.getFileFromPath(resolvedPath); | ||
if (fileFromPath) { | ||
return fileFromPath; | ||
} | ||
else { | ||
// Did not find file at current root, try again one directory deeper | ||
packageRoot = path.join(packageRoot, splitPath[packageRootIndex++]); | ||
} | ||
} | ||
return undefined; | ||
} | ||
getFileFromPath(resolvedPath) { | ||
@@ -173,2 +199,36 @@ const existingFile = this.pathToFile.get(resolvedPath); | ||
} | ||
// Taken from TS and modified: https://github.com/microsoft/TypeScript/blob/88a1e3a1dd8d2d86e844ff1c16d5f041cebcfdb9/src/compiler/moduleSpecifiers.ts#L562 | ||
tryGetModuleNameFromPaths(relativeToBaseUrl, paths, baseUrl) { | ||
const relativeImport = removeTrailingDirectorySeparator((0, utils_1.normalizeSlashes)(relativeToBaseUrl)); | ||
for (const [importPattern, targetPatterns] of Object.entries(paths)) { | ||
const pattern = removeFileExtension((0, utils_1.normalizeSlashes)(importPattern)); | ||
const indexOfStar = pattern.indexOf("*"); | ||
if (indexOfStar !== -1) { | ||
// Try to match <prefix>*<suffix> to relativeImport | ||
const prefix = pattern.substring(0, indexOfStar); | ||
const suffix = pattern.substring(indexOfStar + 1); | ||
if ((relativeImport.length >= prefix.length + suffix.length && | ||
relativeImport.startsWith(prefix) && | ||
relativeImport.endsWith(suffix)) || | ||
(!suffix && relativeImport === removeTrailingDirectorySeparator(prefix))) { | ||
// If import matches <prefix>*<suffix>, extract the matched * path | ||
const matchedStar = relativeImport.substring(prefix.length, relativeImport.length - suffix.length); | ||
// Try to resolve to the target patterns with filled in * pattern | ||
for (const target of targetPatterns) { | ||
const file = this.getFileFromPath(path.join(baseUrl, target.replace("*", matchedStar))); | ||
if (file) | ||
return file; | ||
} | ||
} | ||
} | ||
else if (pattern === relativeImport) { | ||
// If there is no * pattern, check for exact matches and try those targets | ||
for (const target of targetPatterns) { | ||
const file = this.getFileFromPath(path.join(baseUrl, target)); | ||
if (file) | ||
return file; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
@@ -188,30 +248,2 @@ function resolveDependencies(program, files, emitHost) { | ||
exports.resolveDependencies = resolveDependencies; | ||
function resolveLuaPath(fromPath, dependency, emitHost) { | ||
const splitDependency = dependency.split("."); | ||
if (splitDependency.length === 1) { | ||
// If dependency has just one part (the file), look for a lua file with that name | ||
const fileDirectory = walkUpFileTreeUntil(fromPath, dir => emitHost.fileExists(path.join(dir, dependency) + ".lua")); | ||
if (fileDirectory) { | ||
return path.join(fileDirectory, dependency) + ".lua"; | ||
} | ||
} | ||
else { | ||
// If dependency has multiple parts, look for the first directory of the require path, which must be in the lua root | ||
const luaRoot = walkUpFileTreeUntil(fromPath, dir => emitHost.directoryExists(path.join(dir, splitDependency[0]))); | ||
if (luaRoot) { | ||
return path.join(luaRoot, dependency.replace(/\./g, path.sep)) + ".lua"; | ||
} | ||
} | ||
} | ||
function walkUpFileTreeUntil(fromDirectory, predicate) { | ||
const currentDir = path.normalize(fromDirectory).split(path.sep); | ||
while (currentDir.length > 0) { | ||
const dir = currentDir.join(path.sep); | ||
if (predicate(dir)) { | ||
return dir; | ||
} | ||
currentDir.pop(); | ||
} | ||
return undefined; | ||
} | ||
function shouldRewriteRequires(resolvedDependency, program) { | ||
@@ -236,3 +268,3 @@ return !isBuildModeLibrary(program) || !isNodeModulesFile(resolvedDependency); | ||
const paths = []; | ||
const pattern = /(^|\s|;|=)require\("(.+?)"\)/g; | ||
const pattern = /(^|\s|;|=|\()require\("(.+?)"\)/g; | ||
// eslint-disable-next-line @typescript-eslint/ban-types | ||
@@ -249,3 +281,3 @@ let match; | ||
const escapedRequire = originalRequire.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"); | ||
file.code = file.code.replace(new RegExp(`(^|\\s|;|=)require\\("${escapedRequire}"\\)`), `$1require("${requirePath}")`); | ||
file.code = file.code.replace(new RegExp(`(^|\\s|;|=|\\()require\\("${escapedRequire}"\\)`), `$1require("${requirePath}")`); | ||
} | ||
@@ -295,2 +327,11 @@ function replaceRequireInSourceMap(file, originalRequire, newRequire) { | ||
} | ||
function luaRequireToPath(requirePath) { | ||
return requirePath.replace(/\./g, path.sep); | ||
} | ||
function removeFileExtension(path) { | ||
return path.includes(".") ? (0, utils_1.trimExtension)(path) : path; | ||
} | ||
function removeTrailingDirectorySeparator(path) { | ||
return path.endsWith("/") || path.endsWith("\\") ? path.substring(0, -1) : path; | ||
} | ||
//# sourceMappingURL=resolve.js.map |
{ | ||
"name": "typescript-to-lua", | ||
"version": "1.7.1", | ||
"version": "1.7.2", | ||
"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", |
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
878154
14110