Skip to content

Commit

Permalink
Don't include appended TS extension in webpack dependencies. (#497)
Browse files Browse the repository at this point in the history
* Don't include appended TS extension in dependencies.

* test

* fix test

* .

* .
  • Loading branch information
WearyMonkey authored and johnnyreilly committed Mar 22, 2017
1 parent 8987ac6 commit 5e20c2c
Show file tree
Hide file tree
Showing 17 changed files with 323 additions and 21 deletions.
8 changes: 5 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ function loader(this: interfaces.Webpack, contents: string) {

const { outputText, sourceMapText } = options.transpileOnly
? getTranspilationEmit(filePath, contents, instance, this)
: getEmit(filePath, instance, this);
: getEmit(rawFilePath, filePath, instance, this);

if (outputText === null || outputText === undefined) {
const additionalGuidance = filePath.indexOf('node_modules') !== -1
Expand Down Expand Up @@ -119,6 +119,7 @@ function updateFileInCache(filePath: string, contents: string, instance: interfa
}

function getEmit(
rawFilePath: string,
filePath: string,
instance: interfaces.TSInstance,
loader: interfaces.Webpack
Expand All @@ -127,7 +128,7 @@ function getEmit(
const output = instance.languageService.getEmitOutput(filePath);

loader.clearDependencies();
loader.addDependency(filePath);
loader.addDependency(rawFilePath);

const allDefinitionFiles = Object.keys(instance.files).filter(defFilePath => !!defFilePath.match(constants.dtsDtsxRegex));

Expand All @@ -145,7 +146,8 @@ function getEmit(
*/

// Additionally make this file dependent on all imported files
const additionalDependencies = instance.dependencyGraph[filePath];
const additionalDependencies = instance.dependencyGraph[filePath]
&& instance.dependencyGraph[filePath].map(module => module.originalFileName);
if (additionalDependencies) {
additionalDependencies.forEach(addDependency);
}
Expand Down
3 changes: 2 additions & 1 deletion src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ export interface TSInstances {
}

export interface DependencyGraph {
[file: string]: string[];
[file: string]: ResolvedModule[];
}

export interface ReverseDependencyGraph {
Expand Down Expand Up @@ -266,6 +266,7 @@ export interface TSFiles {
}

export interface ResolvedModule {
originalFileName: string;
resolvedFileName: string;
resolvedModule?: ResolvedModule;
isExternalLibraryImport?: boolean;
Expand Down
27 changes: 14 additions & 13 deletions src/servicesHost.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,19 +110,21 @@ function resolveModuleName(
let resolutionResult: interfaces.ResolvedModule;

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

if (resolvedFileName.match(scriptRegex)) {
resolutionResult = { resolvedFileName };
resolutionResult = { resolvedFileName, originalFileName };
}
} catch (e) { }

const tsResolution = compiler.resolveModuleName(moduleName, containingFile, compilerOptions, moduleResolutionHost);

if (tsResolution.resolvedModule) {
let tsResolutionResult: interfaces.ResolvedModule = {
resolvedFileName: path.normalize(tsResolution.resolvedModule.resolvedFileName),
const resolvedFileName = path.normalize(tsResolution.resolvedModule.resolvedFileName);
const tsResolutionResult: interfaces.ResolvedModule = {
originalFileName: resolvedFileName,
resolvedFileName,
isExternalLibraryImport: tsResolution.resolvedModule.isExternalLibraryImport
};
if (resolutionResult) {
Expand All @@ -141,17 +143,16 @@ function populateDependencyGraphs(
instance: interfaces.TSInstance,
containingFile: string
) {
const importedFiles = resolvedModules
.filter(m => m !== null && m !== undefined)
.map(m => m.resolvedFileName);
resolvedModules = resolvedModules
.filter(m => m !== null && m !== undefined);

instance.dependencyGraph[path.normalize(containingFile)] = importedFiles;
instance.dependencyGraph[path.normalize(containingFile)] = resolvedModules;

importedFiles.forEach(importedFileName => {
if (!instance.reverseDependencyGraph[importedFileName]) {
instance.reverseDependencyGraph[importedFileName] = {};
resolvedModules.forEach(resolvedModule => {
if (!instance.reverseDependencyGraph[resolvedModule.resolvedFileName]) {
instance.reverseDependencyGraph[resolvedModule.resolvedFileName] = {};
}
instance.reverseDependencyGraph[importedFileName][path.normalize(containingFile)] = true;
instance.reverseDependencyGraph[resolvedModule.resolvedFileName][path.normalize(containingFile)] = true;
});
}

Expand Down
6 changes: 3 additions & 3 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,9 @@ export function collectAllDependencies(
collected[filePath] = true;
let directDependencies = dependencyGraph[filePath];
if (directDependencies) {
directDependencies.forEach(dependencyFilePath => {
if (!collected[dependencyFilePath]) {
collectAllDependencies(dependencyGraph, dependencyFilePath, collected)
directDependencies.forEach(dependencyModule => {
if (!collected[dependencyModule.originalFileName]) {
collectAllDependencies(dependencyGraph, dependencyModule.resolvedFileName, collected)
.forEach(filePath => result[filePath] = true);
}
});
Expand Down
1 change: 1 addition & 0 deletions test/comparison-tests/appendSuffixToWatch/component.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default "some value";
1 change: 1 addition & 0 deletions test/comparison-tests/appendSuffixToWatch/entry1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
console.log('banana')
3 changes: 3 additions & 0 deletions test/comparison-tests/appendSuffixToWatch/entry2.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import Component from './component.vue';

console.log(Component);
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 1);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */,
/* 1 */
/***/ (function(module, exports) {

console.log('banana');


/***/ })
/******/ ]);
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 2);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";

exports.__esModule = true;
exports["default"] = "some value";


/***/ }),
/* 1 */,
/* 2 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";

exports.__esModule = true;
var component_vue_1 = __webpack_require__(0);
console.log(component_vue_1["default"]);


/***/ })
/******/ ]);
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Asset Size Chunks Chunk Names
bundle.entry2.js 2.94 kB 0 [emitted] entry2
bundle.entry1.js 2.66 kB 1 [emitted] entry1
chunk {0} bundle.entry2.js (entry2) 208 bytes [entry] [rendered]
[0] ./.test/appendSuffixToWatch/component.vue 76 bytes {0} [built]
[2] ./.test/appendSuffixToWatch/entry2.ts 132 bytes {0} [built]
chunk {1} bundle.entry1.js (entry1) 23 bytes [entry] [rendered]
[1] ./.test/appendSuffixToWatch/entry1.ts 23 bytes {1} [built]
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 1);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */,
/* 1 */
/***/ (function(module, exports) {

console.log('something!');


/***/ })
/******/ ]);
Loading

0 comments on commit 5e20c2c

Please sign in to comment.