Skip to content

Commit be032ce

Browse files
authored
Add support for Glob-Patterns in "noResolvePaths" (#1475)
* Add support for Glob-Patterns in "noResolvePaths" * Add Tests for Glob noResolvePaths
1 parent abd6b35 commit be032ce

File tree

3 files changed

+68
-4
lines changed

3 files changed

+68
-4
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,12 @@
4747
"dependencies": {
4848
"@typescript-to-lua/language-extensions": "1.0.0",
4949
"enhanced-resolve": "^5.8.2",
50+
"picomatch": "^2.3.1",
5051
"resolve": "^1.15.1",
5152
"source-map": "^0.7.3"
5253
},
5354
"devDependencies": {
55+
"@types/picomatch": "^2.3.0",
5456
"@types/fs-extra": "^8.1.0",
5557
"@types/glob": "^7.1.1",
5658
"@types/jest": "^27.5.2",

src/transpilation/resolve.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ import { couldNotReadDependency, couldNotResolveRequire } from "./diagnostics";
1010
import { BuildMode, CompilerOptions } from "../CompilerOptions";
1111
import { findLuaRequires, LuaRequire } from "./find-lua-requires";
1212
import { Plugin } from "./plugins";
13+
import * as picomatch from "picomatch";
1314

1415
const resolver = resolve.ResolverFactory.createResolver({
1516
extensions: [".lua"],
1617
enforceExtension: true, // Resolved file must be a lua file
17-
fileSystem: { ...new resolve.CachedInputFileSystem(fs) },
18+
fileSystem: { ...new resolve.CachedInputFileSystem(fs, 0) },
1819
useSyncFileSystemCalls: true,
1920
conditionNames: ["require", "node", "tstl", "default"],
2021
symlinks: false, // Do not resolve symlinks to their original paths (that breaks node_modules detection)
@@ -26,7 +27,7 @@ interface ResolutionResult {
2627
}
2728

2829
class ResolutionContext {
29-
private noResolvePaths: Set<string>;
30+
private noResolvePaths: picomatch.Matcher[];
3031

3132
public diagnostics: ts.Diagnostic[] = [];
3233
public resolvedFiles = new Map<string, ProcessedFile>();
@@ -37,7 +38,9 @@ class ResolutionContext {
3738
private readonly emitHost: EmitHost,
3839
private readonly plugins: Plugin[]
3940
) {
40-
this.noResolvePaths = new Set(options.noResolvePaths);
41+
const unique = [...new Set(options.noResolvePaths)];
42+
const matchers = unique.map(x => picomatch(x));
43+
this.noResolvePaths = matchers;
4144
}
4245

4346
public addAndResolveDependencies(file: ProcessedFile): void {
@@ -70,7 +73,7 @@ class ResolutionContext {
7073
return;
7174
}
7275

73-
if (this.noResolvePaths.has(required.requirePath)) {
76+
if (this.noResolvePaths.find(isMatch => isMatch(required.requirePath))) {
7477
if (this.options.tstlVerbose) {
7578
console.log(
7679
`Skipping module resolution of ${required.requirePath} as it is in the tsconfig noResolvePaths.`

test/transpile/module-resolution.spec.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,65 @@ describe("module resolution should not try to resolve modules in noResolvePaths"
441441
.setOptions({ noResolvePaths: ["a.b.c.foo", "somethingExtra", "dontResolveThis"] })
442442
.expectToHaveNoDiagnostics();
443443
});
444+
445+
test("can ignore specific files with glob pattern", () => {
446+
util.testModule`
447+
// Pre-Load as to not error out at runtime
448+
import "preload";
449+
450+
import "ignoreme";
451+
import * as b from "./actualfile";
452+
453+
export const result = b.foo();
454+
`
455+
.addExtraFile("preload.lua", 'package.preload["ignoreme"] = function() return nil end')
456+
.addExtraFile(
457+
"actualfile.ts",
458+
`export function foo()
459+
{
460+
return 'foo';
461+
}`
462+
)
463+
.addExtraFile(
464+
"ignoreme.d.ts",
465+
`declare module "ignoreme" {
466+
export function foo(): void;
467+
}`
468+
)
469+
.setOptions({ noResolvePaths: ["ignore*"] })
470+
.expectToHaveNoDiagnostics()
471+
.expectToEqual({ result: "foo" });
472+
});
473+
474+
test("can ignore all files with glob pattern in require", () => {
475+
util.testModule`
476+
declare function require(this: void, module: string): any;
477+
478+
const a = require("a")
479+
const b = require("b/b")
480+
const c = require("c/c/c")
481+
const d = require("!:?somefile")
482+
`
483+
.setOptions({ noResolvePaths: ["**"] })
484+
.expectToHaveNoDiagnostics();
485+
});
486+
487+
test("can ignore all files with glob pattern as used in imported lua sources", () => {
488+
util.testModule`
489+
import * as lua from "./luasource";
490+
lua.foo();
491+
`
492+
.addExtraFile("luasource.d.ts", "export function foo(): void;")
493+
.addExtraFile(
494+
"luasource.lua",
495+
`
496+
require("ignoreme!")
497+
require("i.g.n.o.r.e")
498+
`
499+
)
500+
.setOptions({ noResolvePaths: ["**"] })
501+
.expectToHaveNoDiagnostics();
502+
});
444503
});
445504

446505
// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1062

0 commit comments

Comments
 (0)