diff --git a/package.json b/package.json index 0ee708fa2..9f4c64743 100644 --- a/package.json +++ b/package.json @@ -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" @@ -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" diff --git a/src/interfaces.ts b/src/interfaces.ts index 556d9d339..3c2d34fc1 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -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 { diff --git a/src/resolver.ts b/src/resolver.ts index 230ddbeb0..242abd2cf 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -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; diff --git a/src/servicesHost.ts b/src/servicesHost.ts index 55917c513..4a83bb8f4 100644 --- a/src/servicesHost.ts +++ b/src/servicesHost.ts @@ -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, @@ -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) ); @@ -97,7 +96,7 @@ function resolveModuleNames( } function resolveModuleName( - resolver: interfaces.Resolver, + resolveSync: interfaces.ResolveSync, moduleResolutionHost: interfaces.ModuleResolutionHost, appendTsSuffixTo: RegExp[], scriptRegex: RegExp, @@ -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)) {