Skip to content

Commit

Permalink
Merge pull request #411 from johnnyreilly/master
Browse files Browse the repository at this point in the history
upgrade enhanced-resolve to v3
  • Loading branch information
johnnyreilly authored Dec 11, 2016
2 parents b5062db + 72136de commit a5ca0e7
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 64 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"homepage": "https://github.com/TypeStrong/ts-loader",
"dependencies": {
"colors": "^1.0.3",
"enhanced-resolve": "^0.9.0",
"enhanced-resolve": "^3.0.0",
"loader-utils": "^0.2.6",
"object-assign": "^4.1.0",
"semver": "^5.0.1"
Expand Down Expand Up @@ -58,7 +58,7 @@
"phantomjs-prebuilt": "^2.1.2",
"rimraf": "^2.4.2",
"typescript": "^2.0.3",
"typings": "^1.4.0",
"typings": "^2.0.0",
"vue": "^2.0.5",
"vue-loader": "^9.7.0",
"webpack": "^1.11.0"
Expand Down
4 changes: 2 additions & 2 deletions src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,8 @@ export interface Resolve {
unsafeCache?: RegExp | RegExp[] | boolean;
}

export interface Resolver {
resolveSync(path: string, moduleName: string): string;
export interface ResolveSync {
(context: string, path: string, moduleName: string): string;
}

export interface ModuleResolutionHost {
Expand Down
55 changes: 3 additions & 52 deletions src/resolver.ts
Original file line number Diff line number Diff line change
@@ -1,58 +1,9 @@
// This file serves as a hacky workaround for the lack of "resolveSync" support in webpack.
// We make our own resolver using a sync file system but using the same plugins & options
// that webpack does.
import interfaces = require('./interfaces');

const Resolver = require("enhanced-resolve/lib/Resolver");
const SyncNodeJsInputFileSystem = require("enhanced-resolve/lib/SyncNodeJsInputFileSystem");
const CachedInputFileSystem = require("enhanced-resolve/lib/CachedInputFileSystem");
const UnsafeCachePlugin = require("enhanced-resolve/lib/UnsafeCachePlugin");
const ModulesInDirectoriesPlugin = require("enhanced-resolve/lib/ModulesInDirectoriesPlugin");
const ModulesInRootPlugin = require("enhanced-resolve/lib/ModulesInRootPlugin");
const ModuleAsFilePlugin = require("enhanced-resolve/lib/ModuleAsFilePlugin");
const ModuleAsDirectoryPlugin = require("enhanced-resolve/lib/ModuleAsDirectoryPlugin");
const ModuleAliasPlugin = require("enhanced-resolve/lib/ModuleAliasPlugin");
const DirectoryDefaultFilePlugin = require("enhanced-resolve/lib/DirectoryDefaultFilePlugin");
const DirectoryDescriptionFilePlugin = require("enhanced-resolve/lib/DirectoryDescriptionFilePlugin");
const DirectoryDescriptionFileFieldAliasPlugin = require("enhanced-resolve/lib/DirectoryDescriptionFileFieldAliasPlugin");
const FileAppendPlugin = require("enhanced-resolve/lib/FileAppendPlugin");
const ResultSymlinkPlugin = require("enhanced-resolve/lib/ResultSymlinkPlugin");
const node = require("enhanced-resolve/lib/node");

function makeRootPlugin(name: string, root: string | string[]) {
if (typeof root === "string") {
return new ModulesInRootPlugin(name, root);
} else if (Array.isArray(root)) {
return function() {
root.forEach(function(root) {
this.apply(new ModulesInRootPlugin(name, root));
}, this);
};
}
return function() {};
}

function makeResolver(options: { resolve: interfaces.Resolve }) {
let fileSystem = new CachedInputFileSystem(new SyncNodeJsInputFileSystem(), 60000);

let resolver = new Resolver(fileSystem);

// apply the same plugins that webpack does, see webpack/lib/WebpackOptionsApply.js
resolver.apply(
new UnsafeCachePlugin(options.resolve.unsafeCache),
options.resolve.packageAlias ? new DirectoryDescriptionFileFieldAliasPlugin("package.json", options.resolve.packageAlias) : function() {},
new ModuleAliasPlugin(options.resolve.alias),
makeRootPlugin("module", options.resolve.root),
new ModulesInDirectoriesPlugin("module", options.resolve.modulesDirectories),
makeRootPlugin("module", options.resolve.fallback),
new ModuleAsFilePlugin("module"),
new ModuleAsDirectoryPlugin("module"),
new DirectoryDescriptionFilePlugin("package.json", options.resolve.packageMains),
new DirectoryDefaultFilePlugin(["index"]),
new FileAppendPlugin(options.resolve.extensions),
new ResultSymlinkPlugin()
);

return resolver;
function makeResolver(options: { resolve: interfaces.Resolve }): interfaces.ResolveSync {
return node.create.sync(options.resolve);
}

export = makeResolver;
15 changes: 7 additions & 8 deletions src/servicesHost.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ function makeServicesHost(
constants.EOL;

// make a (sync) resolver that follows webpack's rules
const resolver = makeResolver(loader.options);
const resolveSync = makeResolver(loader.options);

const moduleResolutionHost = {
fileExists: (fileName: string) => utils.readFile(fileName) !== undefined,
Expand Down Expand Up @@ -71,23 +71,22 @@ function makeServicesHost(
log: log.log,
resolveModuleNames: (moduleNames: string[], containingFile: string) =>
resolveModuleNames(
resolver, moduleResolutionHost, appendTsSuffixTo, scriptRegex, instance,
resolveSync, moduleResolutionHost, appendTsSuffixTo, scriptRegex, instance,
moduleNames, containingFile)
};
}

function resolveModuleNames(
resolver: interfaces.Resolver,
resolveSync: interfaces.ResolveSync,
moduleResolutionHost: interfaces.ModuleResolutionHost,
appendTsSuffixTo: RegExp[],
scriptRegex: RegExp,
instance: interfaces.TSInstance,

moduleNames: string[],
containingFile: string
) {
const resolvedModules = moduleNames.map(moduleName =>
resolveModuleName(resolver, moduleResolutionHost, appendTsSuffixTo, scriptRegex, instance,
resolveModuleName(resolveSync, moduleResolutionHost, appendTsSuffixTo, scriptRegex, instance,
moduleName, containingFile)
);

Expand All @@ -97,7 +96,7 @@ function resolveModuleNames(
}

function resolveModuleName(
resolver: interfaces.Resolver,
resolveSync: interfaces.ResolveSync,
moduleResolutionHost: interfaces.ModuleResolutionHost,
appendTsSuffixTo: RegExp[],
scriptRegex: RegExp,
Expand All @@ -107,11 +106,11 @@ function resolveModuleName(
containingFile: string
) {
const { compiler, compilerOptions } = instance;

let resolutionResult: interfaces.ResolvedModule;

try {
let resolvedFileName = resolver.resolveSync(path.normalize(path.dirname(containingFile)), moduleName);
let resolvedFileName = resolveSync(undefined, path.normalize(path.dirname(containingFile)), moduleName);
resolvedFileName = utils.appendTsSuffixIfMatch(appendTsSuffixTo, resolvedFileName);

if (resolvedFileName.match(scriptRegex)) {
Expand Down

0 comments on commit a5ca0e7

Please sign in to comment.