Skip to content

Commit

Permalink
Merge pull request #245 from stefanpenner/lazily-read-babel-config
Browse files Browse the repository at this point in the history
lazily access babel config, this ensures all other "writers" have
  • Loading branch information
ef4 authored Oct 3, 2019
2 parents b1c2f91 + f8843c6 commit a9f41b1
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 12 deletions.
1 change: 1 addition & 0 deletions packages/ember-auto-import/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"repository": "https://github.com/ef4/ember-auto-import",
"scripts": {
"compile": "tsc",
"clean": "git clean -x -f",
"build": "ember build",
"lint": "eslint . && tslint --project .",
"start": "ember serve",
Expand Down
40 changes: 29 additions & 11 deletions packages/ember-auto-import/ts/package.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,11 @@ export default class Package {
public name: string;
public root: string;
public isAddon: boolean;
public babelOptions: any;
public babelMajorVersion: number;
private _options: any;
private _parent: any;
private _hasBabelDetails = false;
private _babelMajorVersion?: number;
private _babelOptions: any;
private autoImportOptions: Options | undefined;
private emberCLIBabelExtensions: string[];
private isAddonCache = new Map<string, boolean>();
Expand All @@ -46,25 +49,40 @@ export default class Package {
this.isDeveloping = !this.isAddon || this.root === appOrAddon.project.root;

// This is the per-package options from ember-cli
let options = this.isAddon
this._options = this.isAddon
? appOrAddon.parent.options
: appOrAddon.app.options;
this._parent = appOrAddon.parent;

// Stash our own config options
this.autoImportOptions = options.autoImport;
this.autoImportOptions = this._options.autoImport;

this.emberCLIBabelExtensions = options['ember-cli-babel']
&& options['ember-cli-babel'].extensions || ['js'];

let { babelOptions, version } = this.buildBabelOptions(appOrAddon.parent, options);

this.babelOptions = babelOptions;
this.babelMajorVersion = version;
this.emberCLIBabelExtensions = this._options['ember-cli-babel']
&& this._options['ember-cli-babel'].extensions || ['js'];

this.pkgCache = appOrAddon.parent.pkg;
this.pkgGeneration = pkgGeneration;
}

_ensureBabelDetails() {
if (this._hasBabelDetails) { return; }
let { babelOptions, version } = this.buildBabelOptions(this._parent, this._options);

this._babelOptions = babelOptions;
this._babelMajorVersion = version;
this._hasBabelDetails = true;
}

get babelOptions() {
this._ensureBabelDetails();
return this._babelOptions;
}

get babelMajorVersion() {
this._ensureBabelDetails();
return this._babelMajorVersion;
}

private buildBabelOptions(instance: any, options: any) {
// Generate the same babel options that the package (meaning app or addon)
// is using. We will use these so we can configure our parser to
Expand Down
17 changes: 16 additions & 1 deletion packages/ember-auto-import/ts/tests/analyzer-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,37 @@ Qmodule('analyzer', function(hooks) {
let upstream: string;
let analyzer: Analyzer;
let pack: Partial<Package>;
let babelOptionsWasAccessed = false;

hooks.beforeEach(function(this: any) {
quickTemp.makeOrRemake(this, 'workDir', 'auto-import-analyzer-tests');
ensureDirSync(upstream = join(this.workDir, 'upstream'));
pack = { babelOptions: {}, babelMajorVersion: 6, fileExtensions: ['js'] };
pack = {
get babelOptions() {
babelOptionsWasAccessed = true;
return {};
},
babelMajorVersion: 6,
fileExtensions: ['js']
};
analyzer = new Analyzer(new UnwatchedDir(upstream), pack as Package);
builder = new broccoli.Builder(analyzer);
});

hooks.afterEach(function(this: any) {
babelOptionsWasAccessed = false;
removeSync(this.workDir);
if (builder) {
return builder.cleanup();
}
});

test('babelOptions are accessed only during build', async function(assert) {
assert.notOk(babelOptionsWasAccessed);
await builder.build();
assert.ok(babelOptionsWasAccessed);
});

test('initial file passes through', async function(assert) {
let original = "import 'some-package';";
outputFileSync(join(upstream, 'sample.js'), original);
Expand Down

0 comments on commit a9f41b1

Please sign in to comment.