Skip to content

Commit e444bac

Browse files
committed
Merge pull request #141 from TypeStrong/fix-symbolic-link
Fix support for `npm link`ing dependencies
2 parents 57c813e + 0302c53 commit e444bac

File tree

14 files changed

+251
-16
lines changed

14 files changed

+251
-16
lines changed

index.ts

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -313,12 +313,19 @@ function ensureTypeScriptInstance(loaderOptions: LoaderOptions, loader: any): {
313313
// make a (sync) resolver that follows webpack's rules
314314
let resolver = makeResolver(loader.options);
315315

316-
var moduleResolutionHost = {
317-
fileExists: (fileName: string) => { return servicesHost.getScriptSnapshot(fileName) !== undefined; },
318-
readFile: (fileName: string) => {
319-
let snapshot = servicesHost.getScriptSnapshot(fileName);
320-
return snapshot && snapshot.getText(0, snapshot.getLength());
316+
var readFile = function(fileName) {
317+
fileName = path.normalize(fileName);
318+
try {
319+
return fs.readFileSync(fileName, {encoding: 'utf8'})
320+
}
321+
catch (e) {
322+
return;
321323
}
324+
}
325+
326+
var moduleResolutionHost = {
327+
fileExists: (fileName: string) => readFile(fileName) !== undefined,
328+
readFile: (fileName: string) => readFile(fileName)
322329
};
323330

324331
// Create the TypeScript language service
@@ -334,17 +341,12 @@ function ensureTypeScriptInstance(loaderOptions: LoaderOptions, loader: any): {
334341
// We either load from memory or from disk
335342
fileName = path.normalize(fileName);
336343
var file = files[fileName];
337-
344+
338345
if (!file) {
339-
try {
340-
file = files[fileName] = {
341-
version: 0,
342-
text: fs.readFileSync(fileName, {encoding: 'utf8'})
343-
}
344-
}
345-
catch (e) {
346-
return;
347-
}
346+
let text = readFile(fileName);
347+
if (text == null) return;
348+
349+
file = files[fileName] = { version: 0, text }
348350
}
349351

350352
return compiler.ScriptSnapshot.fromString(file.text);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"main": "index.js",
66
"scripts": {
77
"build": "tsc",
8-
"test": "mocha --reporter spec test/run.js",
8+
"test": "npm link ./test/testLib && mocha --reporter spec test/run.js",
99
"prepublish": "npm run build"
1010
},
1111
"repository": {

test/npmLink/app.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import lib from 'lib/foo';
2+
3+
console.log(lib);
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/******/ (function(modules) { // webpackBootstrap
2+
/******/ // The module cache
3+
/******/ var installedModules = {};
4+
5+
/******/ // The require function
6+
/******/ function __webpack_require__(moduleId) {
7+
8+
/******/ // Check if module is in cache
9+
/******/ if(installedModules[moduleId])
10+
/******/ return installedModules[moduleId].exports;
11+
12+
/******/ // Create a new module (and put it into the cache)
13+
/******/ var module = installedModules[moduleId] = {
14+
/******/ exports: {},
15+
/******/ id: moduleId,
16+
/******/ loaded: false
17+
/******/ };
18+
19+
/******/ // Execute the module function
20+
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21+
22+
/******/ // Flag the module as loaded
23+
/******/ module.loaded = true;
24+
25+
/******/ // Return the exports of the module
26+
/******/ return module.exports;
27+
/******/ }
28+
29+
30+
/******/ // expose the modules object (__webpack_modules__)
31+
/******/ __webpack_require__.m = modules;
32+
33+
/******/ // expose the module cache
34+
/******/ __webpack_require__.c = installedModules;
35+
36+
/******/ // __webpack_public_path__
37+
/******/ __webpack_require__.p = "";
38+
39+
/******/ // Load entry module and return exports
40+
/******/ return __webpack_require__(0);
41+
/******/ })
42+
/************************************************************************/
43+
/******/ ([
44+
/* 0 */
45+
/***/ function(module, exports, __webpack_require__) {
46+
47+
var foo_1 = __webpack_require__(1);
48+
console.log(foo_1["default"]);
49+
50+
51+
/***/ },
52+
/* 1 */
53+
/***/ function(module, exports) {
54+
55+
exports.__esModule = true;
56+
exports["default"] = 'foo';
57+
58+
59+
/***/ }
60+
/******/ ]);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Asset Size Chunks Chunk Names
2+
bundle.js 1.59 kB 0 [emitted] main
3+
chunk {0} bundle.js (main) 118 bytes [rendered]
4+
[0] ./.test/npmLink/app.ts 63 bytes {0} [built]
5+
[1] ./test/testLib/foo.ts 55 bytes {0} [built]
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/******/ (function(modules) { // webpackBootstrap
2+
/******/ // The module cache
3+
/******/ var installedModules = {};
4+
5+
/******/ // The require function
6+
/******/ function __webpack_require__(moduleId) {
7+
8+
/******/ // Check if module is in cache
9+
/******/ if(installedModules[moduleId])
10+
/******/ return installedModules[moduleId].exports;
11+
12+
/******/ // Create a new module (and put it into the cache)
13+
/******/ var module = installedModules[moduleId] = {
14+
/******/ exports: {},
15+
/******/ id: moduleId,
16+
/******/ loaded: false
17+
/******/ };
18+
19+
/******/ // Execute the module function
20+
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21+
22+
/******/ // Flag the module as loaded
23+
/******/ module.loaded = true;
24+
25+
/******/ // Return the exports of the module
26+
/******/ return module.exports;
27+
/******/ }
28+
29+
30+
/******/ // expose the modules object (__webpack_modules__)
31+
/******/ __webpack_require__.m = modules;
32+
33+
/******/ // expose the module cache
34+
/******/ __webpack_require__.c = installedModules;
35+
36+
/******/ // __webpack_public_path__
37+
/******/ __webpack_require__.p = "";
38+
39+
/******/ // Load entry module and return exports
40+
/******/ return __webpack_require__(0);
41+
/******/ })
42+
/************************************************************************/
43+
/******/ ([
44+
/* 0 */
45+
/***/ function(module, exports, __webpack_require__) {
46+
47+
var foo_1 = __webpack_require__(1);
48+
console.log(foo_1["default"]);
49+
50+
51+
/***/ },
52+
/* 1 */
53+
/***/ function(module, exports) {
54+
55+
exports.__esModule = true;
56+
exports["default"] = 'foo';
57+
58+
59+
/***/ }
60+
/******/ ]);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Asset Size Chunks Chunk Names
2+
bundle.js 1.59 kB 0 [emitted] main
3+
chunk {0} bundle.js (main) 118 bytes [rendered]
4+
[0] ./.test/npmLink/app.ts 63 bytes {0} [built]
5+
[1] ./test/testLib/foo.ts 55 bytes {0} [built]
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/******/ (function(modules) { // webpackBootstrap
2+
/******/ // The module cache
3+
/******/ var installedModules = {};
4+
5+
/******/ // The require function
6+
/******/ function __webpack_require__(moduleId) {
7+
8+
/******/ // Check if module is in cache
9+
/******/ if(installedModules[moduleId])
10+
/******/ return installedModules[moduleId].exports;
11+
12+
/******/ // Create a new module (and put it into the cache)
13+
/******/ var module = installedModules[moduleId] = {
14+
/******/ exports: {},
15+
/******/ id: moduleId,
16+
/******/ loaded: false
17+
/******/ };
18+
19+
/******/ // Execute the module function
20+
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21+
22+
/******/ // Flag the module as loaded
23+
/******/ module.loaded = true;
24+
25+
/******/ // Return the exports of the module
26+
/******/ return module.exports;
27+
/******/ }
28+
29+
30+
/******/ // expose the modules object (__webpack_modules__)
31+
/******/ __webpack_require__.m = modules;
32+
33+
/******/ // expose the module cache
34+
/******/ __webpack_require__.c = installedModules;
35+
36+
/******/ // __webpack_public_path__
37+
/******/ __webpack_require__.p = "";
38+
39+
/******/ // Load entry module and return exports
40+
/******/ return __webpack_require__(0);
41+
/******/ })
42+
/************************************************************************/
43+
/******/ ([
44+
/* 0 */
45+
/***/ function(module, exports, __webpack_require__) {
46+
47+
"use strict";
48+
var foo_1 = __webpack_require__(1);
49+
console.log(foo_1["default"]);
50+
51+
52+
/***/ },
53+
/* 1 */
54+
/***/ function(module, exports) {
55+
56+
"use strict";
57+
exports.__esModule = true;
58+
exports["default"] = 'foo';
59+
60+
61+
/***/ }
62+
/******/ ]);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Asset Size Chunks Chunk Names
2+
bundle.js 1.62 kB 0 [emitted] main
3+
chunk {0} bundle.js (main) 146 bytes [rendered]
4+
[0] ./.test/npmLink/app.ts 77 bytes {0} [built]
5+
[1] ./test/testLib/foo.ts 69 bytes {0} [built]

test/npmLink/tsconfig.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"compilerOptions": {
3+
"module": "commonjs"
4+
},
5+
"files": []
6+
}

test/npmLink/webpack.config.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
var path = require('path')
2+
3+
module.exports = {
4+
entry: './app.ts',
5+
output: {
6+
filename: 'bundle.js'
7+
},
8+
resolve: {
9+
extensions: ['', '.ts', '.js']
10+
},
11+
module: {
12+
loaders: [
13+
{ test: /\.ts$/, loader: 'ts-loader' }
14+
]
15+
}
16+
}
17+
18+
// for test harness purposes only, you would not need this in a normal project
19+
module.exports.resolveLoader = { alias: { 'ts-loader': require('path').join(__dirname, "../../index.js") } }

test/run.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ fs.readdirSync(__dirname).forEach(function(test) {
3333
var testPath = path.join(__dirname, test);
3434
if (fs.statSync(testPath).isDirectory()) {
3535

36+
if (test == 'testLib') return;
37+
3638
if (test == 'issue81' && semver.lt(typescript.version, '1.7.0-0')) return;
3739

3840
describe(test, function() {

test/testLib/foo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 'foo';

test/testLib/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"name": "lib",
3+
"version": "0.0.1",
4+
"description": "Dummy lib for npm link testing for ts-loader"
5+
}

0 commit comments

Comments
 (0)