Skip to content

Commit

Permalink
Don’t pass package.json and options over IPC (#1304)
Browse files Browse the repository at this point in the history
* Don’t pass package.json over IPC
* Add backward compatibility getter for asset.package
  • Loading branch information
devongovett committed May 6, 2018
1 parent 98a293f commit 2f7be14
Show file tree
Hide file tree
Showing 30 changed files with 133 additions and 103 deletions.
29 changes: 26 additions & 3 deletions src/Asset.js
Expand Up @@ -5,6 +5,8 @@ const objectHash = require('./utils/objectHash');
const md5 = require('./utils/md5');
const isURL = require('./utils/is-url');
const config = require('./utils/config');
const syncPromise = require('./utils/syncPromise');
const logger = require('./Logger');

let ASSET_ID = 1;

Expand All @@ -15,12 +17,11 @@ let ASSET_ID = 1;
* for subclasses to implement.
*/
class Asset {
constructor(name, pkg, options) {
constructor(name, options) {
this.id = ASSET_ID++;
this.name = name;
this.basename = path.basename(this.name);
this.relativeName = path.relative(options.rootDir, this.name);
this.package = pkg || {};
this.options = options;
this.encoding = 'utf8';
this.type = path.extname(this.name).slice(1);
Expand Down Expand Up @@ -98,13 +99,35 @@ class Asset {
);

parsed.pathname = this.options.parser
.getAsset(resolved, this.package, this.options)
.getAsset(resolved, this.options)
.generateBundleName();

return URL.format(parsed);
}

get package() {
logger.warn(
'`asset.package` is deprecated. Please use `await asset.getPackage()` instead.'
);
return syncPromise(this.getPackage());
}

async getPackage() {
if (!this._package) {
this._package = await this.getConfig(['package.json']);
}

return this._package;
}

async getConfig(filenames, opts = {}) {
if (opts.packageKey) {
let pkg = await this.getPackage();
if (pkg && pkg[opts.packageKey]) {
return pkg[opts.packageKey];
}
}

// Resolve the config file
let conf = await config.resolve(opts.path || this.name, filenames);
if (conf) {
Expand Down
10 changes: 7 additions & 3 deletions src/Bundler.js
Expand Up @@ -357,12 +357,16 @@ class Bundler extends EventEmitter {
}

async resolveAsset(name, parent) {
let {path, pkg} = await this.resolver.resolve(name, parent);
let {path} = await this.resolver.resolve(name, parent);
return this.getLoadedAsset(path);
}

getLoadedAsset(path) {
if (this.loadedAssets.has(path)) {
return this.loadedAssets.get(path);
}

let asset = this.parser.getAsset(path, pkg, this.options);
let asset = this.parser.getAsset(path, this.options);
this.loadedAssets.set(path, asset);

this.watch(path, asset);
Expand Down Expand Up @@ -490,7 +494,7 @@ class Bundler extends EventEmitter {
let startTime = Date.now();
let processed = this.cache && (await this.cache.read(asset.name));
if (!processed || asset.shouldInvalidate(processed.cacheData)) {
processed = await this.farm.run(asset.name, asset.package, this.options);
processed = await this.farm.run(asset.name);
if (this.cache) {
this.cache.write(asset.name, processed);
}
Expand Down
4 changes: 2 additions & 2 deletions src/Parser.js
Expand Up @@ -75,10 +75,10 @@ class Parser {
return parser;
}

getAsset(filename, pkg, options = {}) {
getAsset(filename, options = {}) {
let Asset = this.findParser(filename);
options.parser = this;
return new Asset(filename, pkg, options);
return new Asset(filename, options);
}
}

Expand Down
11 changes: 8 additions & 3 deletions src/Pipeline.js
Expand Up @@ -11,8 +11,13 @@ class Pipeline {
this.parser = new Parser(options);
}

async process(path, pkg, options) {
let asset = this.parser.getAsset(path, pkg, options);
async process(path, isWarmUp) {
let options = this.options;
if (isWarmUp) {
options = Object.assign({isWarmUp}, options);
}

let asset = this.parser.getAsset(path, options);
let generated = await this.processAsset(asset);
let generatedMap = {};
for (let rendition of generated) {
Expand Down Expand Up @@ -51,7 +56,7 @@ class Pipeline {
);
if (!(asset instanceof AssetType)) {
let opts = Object.assign({rendition}, asset.options);
let subAsset = new AssetType(asset.name, asset.package, opts);
let subAsset = new AssetType(asset.name, opts);
subAsset.contents = value;
subAsset.dependencies = asset.dependencies;

Expand Down
4 changes: 2 additions & 2 deletions src/assets/CSSAsset.js
Expand Up @@ -9,8 +9,8 @@ const IMPORT_RE = /@import/;
const PROTOCOL_RE = /^[a-z]+:/;

class CSSAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'css';
}

Expand Down
4 changes: 2 additions & 2 deletions src/assets/CoffeeScriptAsset.js
Expand Up @@ -2,8 +2,8 @@ const Asset = require('../Asset');
const localRequire = require('../utils/localRequire');

class CoffeeScriptAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'js';
}

Expand Down
4 changes: 2 additions & 2 deletions src/assets/GLSLAsset.js
Expand Up @@ -5,8 +5,8 @@ const promisify = require('../utils/promisify');
const Resolver = require('../Resolver');

class GLSLAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'js';
}

Expand Down
4 changes: 2 additions & 2 deletions src/assets/GlobAsset.js
Expand Up @@ -4,8 +4,8 @@ const micromatch = require('micromatch');
const path = require('path');

class GlobAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = null; // allows this asset to be included in any type bundle
}

Expand Down
4 changes: 2 additions & 2 deletions src/assets/GraphqlAsset.js
Expand Up @@ -2,8 +2,8 @@ const Asset = require('../Asset');
const localRequire = require('../utils/localRequire');

class GraphqlAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'js';
}

Expand Down
4 changes: 2 additions & 2 deletions src/assets/HTMLAsset.js
Expand Up @@ -73,8 +73,8 @@ const OPTIONS = {
};

class HTMLAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'html';
this.isAstDirty = false;
}
Expand Down
15 changes: 11 additions & 4 deletions src/assets/JSAsset.js
Expand Up @@ -21,8 +21,8 @@ const SW_RE = /\bnavigator\s*\.\s*serviceWorker\s*\.\s*register\s*\(/;
const WORKER_RE = /\bnew\s*Worker\s*\(/;

class JSAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'js';
this.globals = new Map();
this.isAstDirty = false;
Expand Down Expand Up @@ -106,8 +106,15 @@ class JSAsset extends Asset {
async transform() {
if (this.options.target === 'browser') {
if (this.dependencies.has('fs') && FS_RE.test(this.contents)) {
await this.parseIfNeeded();
this.traverse(fsVisitor);
// Check if we should ignore fs calls
// See https://github.com/defunctzombie/node-browser-resolve#skip
let pkg = await this.getPackage();
let ignore = pkg && pkg.browser && pkg.browser.fs === false;

if (!ignore) {
await this.parseIfNeeded();
this.traverse(fsVisitor);
}
}

if (GLOBAL_RE.test(this.contents)) {
Expand Down
4 changes: 2 additions & 2 deletions src/assets/JSONAsset.js
Expand Up @@ -4,8 +4,8 @@ const json5 = require('json5');
const {minify} = require('uglify-es');

class JSONAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'js';
}

Expand Down
11 changes: 5 additions & 6 deletions src/assets/LESSAsset.js
Expand Up @@ -3,8 +3,8 @@ const localRequire = require('../utils/localRequire');
const promisify = require('../utils/promisify');

class LESSAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'css';
}

Expand All @@ -13,10 +13,9 @@ class LESSAsset extends Asset {
let less = await localRequire('less', this.name);
let render = promisify(less.render.bind(less));

let opts = Object.assign(
{},
this.package.less || (await this.getConfig(['.lessrc', '.lessrc.js']))
);
let opts =
(await this.getConfig(['.lessrc', '.lessrc.js'], {packageKey: 'less'})) ||
{};
opts.filename = this.name;
opts.plugins = (opts.plugins || []).concat(urlPlugin(this));

Expand Down
4 changes: 2 additions & 2 deletions src/assets/PugAsset.js
Expand Up @@ -3,8 +3,8 @@ const Asset = require('../Asset');
const localRequire = require('../utils/localRequire');

class PugAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'html';
}

Expand Down
4 changes: 2 additions & 2 deletions src/assets/ReasonAsset.js
Expand Up @@ -3,8 +3,8 @@ const fs = require('../utils/fs');
const localRequire = require('../utils/localRequire');

class ReasonAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'js';
}

Expand Down
4 changes: 2 additions & 2 deletions src/assets/RustAsset.js
Expand Up @@ -18,8 +18,8 @@ let rustInstalled = false;
let wasmGCInstalled = false;

class RustAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'wasm';
}

Expand Down
11 changes: 5 additions & 6 deletions src/assets/SASSAsset.js
Expand Up @@ -7,8 +7,8 @@ const Resolver = require('../Resolver');
const syncPromise = require('../utils/syncPromise');

class SASSAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'css';
}

Expand All @@ -21,10 +21,9 @@ class SASSAsset extends Asset {
rootDir: this.options.rootDir
});

let opts = Object.assign(
{},
this.package.sass || (await this.getConfig(['.sassrc', '.sassrc.js']))
);
let opts =
(await this.getConfig(['.sassrc', '.sassrc.js'], {packageKey: 'sass'})) ||
{};
opts.includePaths = (opts.includePaths || []).concat(
path.dirname(this.name)
);
Expand Down
10 changes: 5 additions & 5 deletions src/assets/StylusAsset.js
Expand Up @@ -7,17 +7,17 @@ const syncPromise = require('../utils/syncPromise');
const URL_RE = /^(?:url\s*\(\s*)?['"]?(?:[#/]|(?:https?:)?\/\/)/i;

class StylusAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'css';
}

async parse(code) {
// stylus should be installed locally in the module that's being required
let stylus = await localRequire('stylus', this.name);
let opts =
this.package.stylus ||
(await this.getConfig(['.stylusrc', '.stylusrc.js']));
let opts = await this.getConfig(['.stylusrc', '.stylusrc.js'], {
packageKey: 'stylus'
});
let style = stylus(code, opts);
style.set('filename', this.name);
style.set('include css', true);
Expand Down
4 changes: 2 additions & 2 deletions src/assets/TOMLAsset.js
Expand Up @@ -3,8 +3,8 @@ const toml = require('toml');
const serializeObject = require('../utils/serializeObject');

class TOMLAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'js';
}

Expand Down
4 changes: 2 additions & 2 deletions src/assets/TypeScriptAsset.js
Expand Up @@ -2,8 +2,8 @@ const Asset = require('../Asset');
const localRequire = require('../utils/localRequire');

class TypeScriptAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'js';
}

Expand Down
4 changes: 2 additions & 2 deletions src/assets/VueAsset.js
Expand Up @@ -4,8 +4,8 @@ const md5 = require('../utils/md5');
const {minify} = require('uglify-es');

class VueAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'js';
}

Expand Down
4 changes: 2 additions & 2 deletions src/assets/WebManifestAsset.js
@@ -1,8 +1,8 @@
const Asset = require('../Asset');

class WebManifestAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'webmanifest';
}

Expand Down
4 changes: 2 additions & 2 deletions src/assets/YAMLAsset.js
Expand Up @@ -3,8 +3,8 @@ const yaml = require('js-yaml');
const serializeObject = require('../utils/serializeObject');

class YAMLAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
constructor(name, options) {
super(name, options);
this.type = 'js';
}

Expand Down

0 comments on commit 2f7be14

Please sign in to comment.