Skip to content

Commit 2ddf24e

Browse files
committed
feat: proper source map rewrite. refactor trace pipeline
closes #6
1 parent b0e3478 commit 2ddf24e

40 files changed

Lines changed: 3281 additions & 1502 deletions

package.json

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
"postversion": "git push && git push --tags && npm publish",
1919
"pretest": "npm run lint",
2020
"prepare": "del-cli dist && babel src -d dist",
21-
"nodejs-test": "tape -r @babel/register \"test/**/*.spec.js\" | tap-dot",
22-
"coverage": "nyc --reporter=lcov tape -r @babel/register \"test/**/*.spec.js\" | tap-dot",
21+
"nodejs-test": "tape -r @babel/register test/hide-log.js \"test/**/*.spec.js\" | tap-dot",
22+
"coverage": "nyc --reporter=lcov tape -r @babel/register test/hide-log.js \"test/**/*.spec.js\" | tap-dot",
2323
"browser-test": "browserify -t babelify test/all-browser-spec.js | tape-run | tap-dot",
2424
"test": "npm run nodejs-test && npm run browser-test"
2525
},
@@ -40,7 +40,7 @@
4040
},
4141
"homepage": "https://github.com/dumberjs/dumber#readme",
4242
"dependencies": {
43-
"@babel/core": "^7.2.2",
43+
"@babel/core": "^7.3.4",
4444
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
4545
"@babel/plugin-transform-modules-commonjs": "^7.2.0",
4646
"ast-matcher": "^1.0.2",
@@ -51,6 +51,7 @@
5151
"dumber-module-loader": "^0.16.0",
5252
"escope": "^3.6.0",
5353
"mkdirp": "^0.5.1",
54+
"modify-code": "^0.2.1",
5455
"node-fetch": "^2.3.0",
5556
"node-libs-browser": "^2.2.0",
5657
"readable-stream": "^2.3.6",
@@ -59,17 +60,18 @@
5960
},
6061
"devDependencies": {
6162
"@babel/cli": "^7.2.3",
62-
"@babel/preset-env": "^7.3.1",
63+
"@babel/preset-env": "^7.3.4",
6364
"@babel/register": "^7.0.0",
6465
"babel-eslint": "^10.0.1",
6566
"babelify": "^10.0.0",
6667
"browserify": "^16.2.3",
6768
"del-cli": "^1.1.0",
6869
"eslint": "^5.15.1",
69-
"nyc": "^13.2.0",
70-
"standard-changelog": "^2.0.6",
70+
"nyc": "^13.3.0",
71+
"sourcemap-codec": "^1.4.4",
72+
"standard-changelog": "^2.0.7",
7173
"tap-dot": "^2.0.0",
72-
"tape": "^4.9.2",
74+
"tape": "^4.10.1",
7375
"tape-run": "^5.0.0"
7476
}
7577
}

src/index.js

Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import trace from './trace';
22
import {cleanPath, parse, mapId} from 'dumber-module-loader/dist/id-utils';
3-
import alias from './transformers/alias';
43
import defaultPackageFileReader from './package-file-reader/default';
54
import PackageReader from './package-reader';
65
import Package from './package';
@@ -9,7 +8,6 @@ import {info, error, warn} from './log';
98
import {generateHash, stripJsExtension, resolvePackagePath, contentOrFile} from './shared';
109
import * as cache from './cache/default';
1110
import path from 'path';
12-
import mergeTransformed from './transformers/merge';
1311
import ModulesDone from './modules-done';
1412
import ModulesTodo from './modules-todo';
1513

@@ -167,7 +165,9 @@ export default class Bundler {
167165
}
168166

169167
_capture(tracedUnit) {
170-
this._unitsMap[tracedUnit.path] = tracedUnit;
168+
let key = tracedUnit.path;
169+
if (tracedUnit.packageName) key = tracedUnit.packageName + ':' + key;
170+
this._unitsMap[key] = tracedUnit;
171171

172172
// mark as done.
173173
this._modules_done.addUnit(tracedUnit);
@@ -194,10 +194,7 @@ export default class Bundler {
194194
p = p.then(() => this.packageReaderFor(pkg)).then(reader => {
195195
if (!pkg.lazyMain) {
196196
return reader.readMain()
197-
.then(unit => this.capture(unit))
198-
.then(tracedUnit => {
199-
this._ensureNpmAlias(tracedUnit, pkg.name);
200-
});
197+
.then(unit => this.capture(unit));
201198
}
202199
});
203200
});
@@ -222,31 +219,6 @@ export default class Bundler {
222219
})
223220
}
224221

225-
// this ensures alias to package main, and alias to direct require
226-
// to some browser replacement.
227-
// e.g. readable-stream/readable -> readable-stream/readable-browser
228-
_ensureNpmAlias(tracedUnit, id) {
229-
const defined = tracedUnit.defined;
230-
let toId;
231-
if (Array.isArray(defined)) {
232-
const ds = defined.map(d => parse(d).bareId);
233-
if (ds.indexOf(id) !== -1) return;
234-
toId = ds[0];
235-
} else if (typeof defined === 'string') {
236-
toId = parse(defined).bareId;
237-
}
238-
239-
// alias to main is also created here
240-
if (!toId) warn('no defined module found in ' + tracedUnit.path);
241-
242-
// only create alias when defined id is not same as package name
243-
if (toId !== id && toId !== tracedUnit.packageName) {
244-
const aliasResult = alias(id, toId);
245-
mergeTransformed(tracedUnit, aliasResult);
246-
this._modules_done.addUnit(tracedUnit);
247-
}
248-
}
249-
250222
_supportInjectCssIfNeeded() {
251223
if (!this._modules_todo.needCssInjection || !this._injectCss || this._isInjectCssTurnedOn) {
252224
return Promise.resolve();
@@ -280,11 +252,16 @@ export default class Bundler {
280252
const requiredBy = opts.requiredBy;
281253
const parsedId = parse(mapId(id, this._paths));
282254

255+
if (this._modules_done.has(parsedId.bareId, checkUserSpace, checkPackageSpace)) {
256+
return Promise.resolve();
257+
}
258+
283259
// TODO add a callback point to fillup missing local dep.
284260
// This is needed by dumberify.
285261
if (checkUserSpace && !checkPackageSpace) {
286262
// detected missing local dep
287263
warn(`local dependency ${parsedId.bareId} (requiredBy ${requiredBy.join(', ')}) is missing`);
264+
return Promise.resolve();
288265
}
289266

290267
return new Promise(resolve => {
@@ -344,9 +321,6 @@ export default class Bundler {
344321
return this.packageReaderFor(stub || {name: packageName})
345322
.then(reader => resource ? reader.readResource(resource) : reader.readMain())
346323
.then(unit => this.capture(unit))
347-
.then(tracedUnit => {
348-
this._ensureNpmAlias(tracedUnit, bareId);
349-
})
350324
.catch(err => {
351325
error('Resolving failed for module ' + bareId);
352326
error(err);
@@ -357,8 +331,8 @@ export default class Bundler {
357331
_unitsForBundle(bundle) {
358332
let units = [];
359333

360-
Object.keys(this._unitsMap).forEach(filePath => {
361-
const unit = this._unitsMap[filePath];
334+
Object.keys(this._unitsMap).forEach(key => {
335+
const unit = this._unitsMap[key];
362336
if (unit.bundle === bundle) units.push(unit);
363337
});
364338

src/modules-todo.js

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ const PACKAGE = '1';
66
const USER_OR_PACKAGE = '2';
77

88
export default class ModulesTodo {
9-
constructor(modulesDone) {
9+
constructor() {
1010
this._reset();
11-
this._modulesDone = modulesDone;
1211
}
1312

1413
_reset() {
@@ -68,27 +67,14 @@ export default class ModulesTodo {
6867
return Promise.resolve();
6968
}
7069

71-
const actualTodos = Object.create(null);
72-
73-
Object.keys(this.todos).sort().forEach(key => {
74-
const [space, id] = spaceAndId(key);
75-
76-
let checkUserSpace = true;
77-
let checkPackageSpace = true;
78-
if (space === USER) checkPackageSpace = false;
79-
else if (space === PACKAGE) checkUserSpace = false;
80-
81-
if (!this._modulesDone.has(id, checkUserSpace, checkPackageSpace)) {
82-
actualTodos[key] = this.todos[key];
83-
}
84-
});
70+
const {todos} = this;
8571
this._reset();
8672

8773
let p = Promise.resolve();
8874

89-
Object.keys(actualTodos).forEach(key => {
75+
Object.keys(todos).sort().forEach(key => {
9076
const [space, id] = spaceAndId(key);
91-
const requiredBy = actualTodos[key];
77+
const requiredBy = todos[key];
9278

9379
p = p.then(() => cb(id, {
9480
user: space !== PACKAGE,

src/package-file-reader/default.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ export default function (packageConfig, mock) {
5656
}
5757
throw err;
5858
}
59-
);
59+
).then(unit => {
60+
if (filePath === 'package.json' || filePath === './package.json') {
61+
const meta = JSON.parse(unit.contents);
62+
if (meta.name !== name) {
63+
meta.name = name;
64+
unit.contents = JSON.stringify(meta);
65+
}
66+
}
67+
return unit;
68+
});
6069
});
6170
}

src/package-file-reader/jsDelivr.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ function fetchContent(fetchApi, url) {
2525
}
2626

2727
function fetchJson(fetchApi, url) {
28-
return fetchContent(fetchApi, url).then(function(text) {
29-
return JSON.parse(text);
30-
});
28+
return fetchContent(fetchApi, url).then(text => JSON.parse(text));
3129
}
3230

3331
// use jsDelivr to find npm package files
@@ -70,11 +68,15 @@ export default function (packageConfig, mock) {
7068

7169
return function(filePath) {
7270
const fp = packagePath + '/' + filePath;
73-
return fetchContent(_fetch, fp).then(function (text) {
74-
return {
75-
path: fp,
76-
contents: text
71+
return fetchContent(_fetch, fp).then(text => {
72+
if (filePath === 'package.json' || filePath === './package.json') {
73+
const meta = JSON.parse(text);
74+
if (meta.name !== name) {
75+
meta.name = name;
76+
text = JSON.stringify(meta);
77+
}
7778
}
79+
return {path: fp, contents: text};
7880
});
7981
}
8082
});

src/package-reader.js

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {ext, parse, resolveModuleId, relativeModuleId} from 'dumber-module-loader/dist/id-utils';
22
import {stripJsExtension, isPackageName, stripSourceMappingUrl, getSourceMap} from './shared';
3-
import replace from './transformers/replace';
43
import {error} from './log';
54
import path from 'path';
65

@@ -40,7 +39,16 @@ export default class PackageReader {
4039
}
4140

4241
readMain() {
43-
return this.ensureMainPath().then(() => this._readFile(this.mainPath));
42+
return this.ensureMainPath()
43+
.then(() => this._readFile(this.mainPath))
44+
.then(unit => {
45+
// add alias from package name to main file module id.
46+
// but don't add alias from "foo" to "foo/main.css".
47+
if (ext(unit.moduleId) === ext(this.name)) {
48+
unit.alias = this.name;
49+
}
50+
return unit;
51+
});
4452
}
4553

4654
readResource(resource) {
@@ -75,6 +83,15 @@ export default class PackageReader {
7583
}
7684

7785
return findResource();
86+
}).then(unit => {
87+
const requested = this.name + '/' + resource;
88+
if (unit.moduleId !== requested) {
89+
// The requested id could be different from real id.
90+
// for example, some browser replacement.
91+
// e.g. readable-stream/readable -> readable-stream/readable-browser
92+
unit.alias = requested;
93+
}
94+
return unit;
7895
});
7996
}
8097

@@ -83,9 +100,8 @@ export default class PackageReader {
83100
return this.loadFile(filePath).then(file => {
84101
const moduleId = this.name + '/' + parse(stripJsExtension(filePath)).bareId;
85102

103+
let replacement;
86104
if (ext(filePath) === '.js') {
87-
const replacement = {};
88-
89105
Object.keys(this.browserReplacement).forEach(key => {
90106
const target = this.browserReplacement[key];
91107
const baseId = this.name + '/index';
@@ -102,19 +118,22 @@ export default class PackageReader {
102118
targetModule = '__ignore__';
103119
}
104120

121+
if (!replacement) replacement = {};
105122
replacement[sourceModule] = targetModule;
106123
});
107-
108-
file.contents = replace(file.contents, replacement);
109124
}
110125

111-
return {
126+
const unit = {
112127
path: file.path.replace(/\\/g, '/'),
113128
contents: stripSourceMappingUrl(file.contents),
114129
moduleId,
115130
packageName: this.name,
116131
sourceMap: getSourceMap(file.contents, file.path)
117132
};
133+
134+
// the replacement will be picked up by transformers/replace.js
135+
if (replacement) unit.replacement = replacement;
136+
return unit;
118137
});
119138
}
120139

0 commit comments

Comments
 (0)