Skip to content

Commit fcb11c9

Browse files
committed
feat: conventional alias from npm package module foo/dist/lib/bar (or foo/dist/_favor_/lib/bar) to foo/bar
1 parent 5d4be04 commit fcb11c9

8 files changed

Lines changed: 110 additions & 45 deletions

File tree

spec/trace.spec.js

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ test('trace transforms json', t => {
128128
contents: "define('text!foo/bar.json',function(){return \"{\\\"a\\\":1}\";});\n",
129129
sourceMap: undefined,
130130
moduleId: 'foo/bar.json',
131-
defined: ['text!foo/bar.json'],
131+
defined: 'text!foo/bar.json',
132132
deps: [],
133133
packageName: undefined,
134134
shimed: undefined
@@ -150,7 +150,7 @@ test('trace transforms text file', t => {
150150
contents: "define('text!foo/bar.html',function(){return \"<p></p>\";});\n",
151151
sourceMap: undefined,
152152
moduleId: 'foo/bar.html',
153-
defined: ['text!foo/bar.html'],
153+
defined: 'text!foo/bar.html',
154154
deps: [],
155155
packageName: undefined,
156156
shimed: undefined
@@ -288,3 +288,49 @@ test('trace supports cache', t => {
288288
t.end();
289289
});
290290
});
291+
292+
test('trace traces npm js with dist alias', t => {
293+
const unit = {
294+
path: 'node_modules/foo/dist/bar.js',
295+
contents: "define(['a','text!./b.css'],function() {});",
296+
moduleId: 'foo/dist/bar',
297+
packageName: 'foo'
298+
}
299+
300+
trace(unit).then(traced => {
301+
t.deepEqual(traced, {
302+
path: 'node_modules/foo/dist/bar.js',
303+
contents: "define('foo/dist/bar',['a','text!./b.css'],function() {});define('foo/bar',['foo/dist/bar'],function(m){return m;});\n",
304+
sourceMap: undefined,
305+
moduleId: 'foo/dist/bar',
306+
defined: ['foo/dist/bar', 'foo/bar'],
307+
deps: ['a', 'text!foo/dist/b.css'],
308+
packageName: 'foo',
309+
shimed: undefined
310+
})
311+
t.end();
312+
});
313+
});
314+
315+
test('trace traces npm html with dist alias', t => {
316+
const unit = {
317+
path: 'node_modules/foo/dist/cjs/bar.html',
318+
contents: "<p></p>",
319+
moduleId: 'foo/dist/cjs/bar.html',
320+
packageName: 'foo'
321+
}
322+
323+
trace(unit).then(traced => {
324+
t.deepEqual(traced, {
325+
path: 'node_modules/foo/dist/cjs/bar.html',
326+
contents: "define('text!foo/dist/cjs/bar.html',function(){return \"<p></p>\";});\ndefine('text!foo/bar.html',['text!foo/dist/cjs/bar.html'],function(m){return m;});\n",
327+
sourceMap: undefined,
328+
moduleId: 'foo/dist/cjs/bar.html',
329+
defined: ['text!foo/dist/cjs/bar.html', 'text!foo/bar.html'],
330+
deps: [],
331+
packageName: 'foo',
332+
shimed: undefined
333+
})
334+
t.end();
335+
});
336+
});

spec/transformers/alias.spec.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,12 @@ test('alias creates aliases for js module', t => {
2323

2424
test('alias creates aliases for other modules', t => {
2525
t.deepEqual(alias('from/id.json', 'to/id.json'), {
26-
defined: ['text!from/id.json', 'from/id.json', 'json!from/id.json'],
27-
contents: "define('text!from/id.json',['text!to/id.json'],function(m){return m;});\n" +
28-
"define('from/id.json',['to/id.json'],function(m){return m;});\n" +
29-
"define('json!from/id.json',['json!to/id.json'],function(m){return m;});\n"
26+
defined: 'text!from/id.json',
27+
contents: "define('text!from/id.json',['text!to/id.json'],function(m){return m;});\n"
3028
});
3129
t.deepEqual(alias('from/id.css', 'to/id.css'), {
32-
defined: ['text!from/id.css', 'from/id.css'],
33-
contents: "define('text!from/id.css',['text!to/id.css'],function(m){return m;});\n" +
34-
"define('from/id.css',['to/id.css'],function(m){return m;});\n"
30+
defined: 'text!from/id.css',
31+
contents: "define('text!from/id.css',['text!to/id.css'],function(m){return m;});\n"
3532
});
3633
t.end();
3734
});

spec/transformers/text.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ test('text wraps text into amd module', t => {
66
const target = "define('text!a.html',function(){return \"<p></p>\";});\n";
77

88
t.deepEqual(text('a.html', source), {
9-
defined: ['text!a.html'],
9+
defined: 'text!a.html',
1010
contents: target
1111
});
1212
t.end();

src/index.js

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,7 @@ import stubModule from './stub-module';
88
import {error, warn, stripJsExtension, resolvePackagePath, contentOrFile} from './shared';
99
import * as cache from './cache/default';
1010
import path from 'path';
11-
12-
function mergeTransformed(unit, transformed) {
13-
if (transformed.defined) {
14-
let newDefined = transformed.defined
15-
if (!Array.isArray(newDefined)) newDefined = [newDefined];
16-
17-
if (!unit.defined) {
18-
unit.defined = []
19-
} else if (typeof unit.defined === 'string') {
20-
unit.defined = [unit.defined];
21-
}
22-
unit.defined.push.apply(unit.defined, newDefined);
23-
}
24-
25-
if (transformed.contents) {
26-
unit.contents += transformed.contents;
27-
}
28-
}
11+
import mergeTransformed from './transformers/merge';
2912

3013
// Bundler does
3114
// 1. capture: capture units (unit is a file like object plus meta data)
@@ -168,7 +151,7 @@ export default class Bundler {
168151
return reader.readMain()
169152
.then(unit => this.capture(unit))
170153
.then(tracedUnit => {
171-
this._createAliasToNpmResourceIfNeeded(tracedUnit, pkg.name);
154+
this._ensureNpmMainAlias(tracedUnit, pkg.name);
172155
});
173156
}
174157
});
@@ -194,7 +177,7 @@ export default class Bundler {
194177
})
195178
}
196179

197-
_createAliasToNpmResourceIfNeeded(tracedUnit, id) {
180+
_ensureNpmMainAlias(tracedUnit, id) {
198181
if (this._moduleId_done.has(id)) return;
199182

200183
const defined = tracedUnit.defined;
@@ -212,7 +195,7 @@ export default class Bundler {
212195

213196
// only create alias when defined id is not same as package name
214197
if (toId !== id && toId !== tracedUnit.packageName) {
215-
let aliasResult = alias(id, toId);
198+
const aliasResult = alias(id, toId);
216199
mergeTransformed(tracedUnit, aliasResult);
217200
this._addToDone(aliasResult.defined);
218201
}
@@ -296,7 +279,9 @@ export default class Bundler {
296279
.then(reader => resource ? reader.readResource(resource) : reader.readMain())
297280
.then(unit => this.capture(unit))
298281
.then(tracedUnit => {
299-
this._createAliasToNpmResourceIfNeeded(tracedUnit, bareId);
282+
if (!resource) {
283+
this._ensureNpmMainAlias(tracedUnit, bareId);
284+
}
300285
})
301286
.catch(err => {
302287
error(err);

src/trace.js

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
'use strict';
2+
import alias from './transformers/alias';
23
import text from './transformers/text';
34
import cjsEs from './transformers/cjs-es';
45
import defines from './transformers/defines';
5-
import {ext, resolveModuleId} from 'dumber-module-loader/dist/id-utils';
6+
import mergeTransformed from './transformers/merge';
7+
import {ext, parse, resolveModuleId} from 'dumber-module-loader/dist/id-utils';
68
import {generateHash} from './shared';
79

10+
const DIST_FOLDERS = ['dist', 'dists', 'output', 'out', 'lib', 'libs'];
11+
const DIST_FAVORS = ['amd', 'cjs', 'commonjs', 'es2015', 'native-modules', 'umd'];
12+
813
// depsFinder is optional
914
export default function (unit, opts = {}) {
1015
const {cache, depsFinder} = opts;
@@ -70,7 +75,9 @@ export default function (unit, opts = {}) {
7075
contents = defResult.contents;
7176
defined = defResult.defined;
7277
shimed = defResult.shimed;
73-
} else if (extname !== '.wasm') {
78+
} else if (extname === '.wasm') {
79+
// TODO wasm
80+
} else {
7481
// use text! for everything else including unknown extname
7582
sourceMap = undefined;
7683
let textResult = text(moduleId, contents);
@@ -102,6 +109,27 @@ export default function (unit, opts = {}) {
102109
shimed: shimed
103110
};
104111

112+
// conventional alias mainly for aurelia
113+
// aurelia-foo/dist/cjs/bar -> aurelia-foo/bar
114+
115+
// only for npm file and defined a single module
116+
if (packageName && typeof defined === 'string') {
117+
const {parts, cleanId} = parse(unit.moduleId);
118+
let toSkip = 0;
119+
120+
if (DIST_FOLDERS.indexOf(parts[1].toLowerCase()) !== -1) {
121+
toSkip = 1;
122+
if (parts.length > 3 && DIST_FAVORS.indexOf(parts[2].toLowerCase()) !== -1) {
123+
toSkip = 2;
124+
}
125+
}
126+
127+
if (toSkip) {
128+
const shortId = packageName + '/' + parts.slice(toSkip + 1).join('/');
129+
mergeTransformed(traced, alias(shortId, cleanId));
130+
}
131+
}
132+
105133
if (cache) {
106134
cache.setCache(hash, traced);
107135
}

src/transformers/alias.js

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,9 @@ export default function (fromId, toId) {
1313

1414
// if got ext, then ext is not .js, we need wrapper
1515
if (parsedFromId.ext) {
16-
let defined = ['text!' + parsedFromId.bareId, parsedFromId.bareId];
16+
let defined = 'text!' + parsedFromId.bareId;
1717
let contents = "define('text!" + parsedFromId.bareId + "',['text!" + parsedToId.bareId +
18-
"'],function(m){return m;});\n" +
19-
"define('" + parsedFromId.bareId + "',['" + parsedToId.bareId +
20-
"'],function(m){return m;});\n"
21-
22-
if (parsedFromId.ext === '.json') {
23-
defined.push('json!' + parsedFromId.bareId);
24-
contents += "define('json!" + parsedFromId.bareId + "',['json!" + parsedToId.bareId +
25-
"'],function(m){return m;});\n";
26-
}
18+
"'],function(m){return m;});\n";
2719

2820
return {
2921
defined: defined,

src/transformers/merge.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export default function (unit, transformed) {
2+
if (transformed.defined) {
3+
let newDefined = transformed.defined
4+
if (!Array.isArray(newDefined)) newDefined = [newDefined];
5+
6+
if (!unit.defined) {
7+
unit.defined = []
8+
} else if (typeof unit.defined === 'string') {
9+
unit.defined = [unit.defined];
10+
}
11+
unit.defined.push.apply(unit.defined, newDefined);
12+
}
13+
14+
if (transformed.contents) {
15+
unit.contents += transformed.contents;
16+
}
17+
}

src/transformers/text.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// wrap html/svg/css into amd
22
export default function (moduleId, contents) {
33
return {
4-
defined: ['text!' + moduleId],
4+
defined: 'text!' + moduleId,
55
contents:`define('text!${moduleId}',function(){return ${JSON.stringify(contents)};});\n`
66
};
77
}

0 commit comments

Comments
 (0)