Skip to content

Commit 3773170

Browse files
authored
Merge pull request #141 from jamescdavis/work-out-of-the-box
Work out of the box
2 parents b3f9e9c + aa44c2a commit 3773170

File tree

3 files changed

+135
-5
lines changed

3 files changed

+135
-5
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/**
2+
* Catch-all for ember-data.
3+
*/
4+
declare module 'ember-data' {
5+
interface ModelRegistry {
6+
[key: string]: any;
7+
}
8+
}

blueprints/ember-cli-typescript/index.js

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,45 @@ module.exports = {
9898
this._installPrecompilationHooks();
9999
}
100100

101-
return this.addPackagesToProject([
101+
let packages = [
102102
{ name: 'typescript', target: 'latest' },
103103
{ name: '@types/ember', target: 'latest' },
104-
{ name: '@types/ember-data', target: 'latest' },
105104
{ name: '@types/rsvp', target: 'latest' },
106105
{ name: '@types/ember-test-helpers', target: 'latest' },
107106
{ name: '@types/ember-testing-helpers', target: 'latest' },
108-
]);
107+
];
108+
109+
if (this._has('ember-data')) {
110+
packages.push(
111+
{ name: '@types/ember-data', target: 'latest' }
112+
);
113+
}
114+
115+
if (this._has('ember-cli-qunit')) {
116+
packages = packages.concat([
117+
{ name: '@types/ember-qunit', target: 'latest' },
118+
{ name: '@types/qunit', target: 'latest' },
119+
]);
120+
}
121+
122+
if (this._has('ember-cli-mocha')) {
123+
packages = packages.concat([
124+
{ name: '@types/ember-mocha', target: 'latest' },
125+
{ name: '@types/mocha', target: 'latest' },
126+
]);
127+
}
128+
129+
return this.addPackagesToProject(packages);
130+
},
131+
132+
files() {
133+
let files = this._super.files.apply(this, arguments);
134+
135+
if (!this._has('ember-data')) {
136+
files = files.filter(file => file !== 'types/ember-data.d.ts');
137+
}
138+
139+
return files;
109140
},
110141

111142
_installPrecompilationHooks() {
@@ -130,4 +161,10 @@ module.exports = {
130161

131162
scripts[type] = script;
132163
},
164+
165+
_has(pkg) {
166+
if (this.project) {
167+
return pkg in this.project.dependencies();
168+
}
169+
},
133170
};

node-tests/blueprints/ember-cli-typescript-test.js

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,43 @@
11
'use strict';
22

3-
const fs = require('fs');
3+
const fs = require('fs-extra');
44
const path = require('path');
55
const helpers = require('ember-cli-blueprint-test-helpers/helpers');
66
const chaiHelpers = require('ember-cli-blueprint-test-helpers/chai');
7+
const Blueprint = require('ember-cli/lib/models/blueprint');
78

89
const ects = require('../../blueprints/ember-cli-typescript');
910

1011
const expect = chaiHelpers.expect;
1112
const file = chaiHelpers.file;
1213

1314
describe('Acceptance: ember-cli-typescript generator', function() {
14-
helpers.setupTestHooks(this);
15+
helpers.setupTestHooks(this, { disabledTasks: ['addon-install', 'bower-install'] });
16+
17+
const originalTaskForFn = Blueprint.prototype.taskFor;
18+
19+
beforeEach(function() {
20+
Blueprint.prototype.taskFor = function(taskName) {
21+
if (taskName === 'npm-install') {
22+
// Mock npm-install that only modifies package.json
23+
return {
24+
run: function(options) {
25+
let pkgJson = fs.readJsonSync('package.json')
26+
options.packages.forEach(function(pkg) {
27+
let pkgName = pkg.match(/^(.*)@[^@]*$/);
28+
pkgJson['devDependencies'][pkgName[1]] = '*';
29+
});
30+
fs.writeJsonSync('package.json', pkgJson);
31+
}
32+
}
33+
}
34+
return originalTaskForFn.call(this, taskName);
35+
};
36+
});
37+
38+
afterEach(function() {
39+
Blueprint.prototype.taskFor = originalTaskForFn;
40+
});
1541

1642
it('basic app', function() {
1743
const args = ['ember-cli-typescript'];
@@ -26,6 +52,11 @@ describe('Acceptance: ember-cli-typescript generator', function() {
2652
const pkgJson = JSON.parse(pkg.content);
2753
expect(pkgJson.scripts.prepublishOnly).to.be.undefined;
2854
expect(pkgJson.scripts.postpublish).to.be.undefined;
55+
expect(pkgJson.devDependencies).to.include.all.keys('ember-data');
56+
expect(pkgJson.devDependencies).to.include.all.keys('@types/ember-data');
57+
expect(pkgJson.devDependencies).to.include.all.keys('ember-cli-qunit');
58+
expect(pkgJson.devDependencies).to.include.all.keys('@types/ember-qunit', '@types/qunit');
59+
expect(pkgJson.devDependencies).to.not.have.any.keys('@types/ember-mocha', '@types/mocha');
2960

3061
const tsconfig = file('tsconfig.json');
3162
expect(tsconfig).to.exist;
@@ -48,6 +79,9 @@ describe('Acceptance: ember-cli-typescript generator', function() {
4879

4980
const environmentTypes = file('types/my-app/config/environment.d.ts');
5081
expect(environmentTypes).to.exist;
82+
83+
const emberDataCatchallTypes = file('types/ember-data.d.ts');
84+
expect(emberDataCatchallTypes).to.exist;
5185
});
5286
});
5387

@@ -64,6 +98,11 @@ describe('Acceptance: ember-cli-typescript generator', function() {
6498
const pkgJson = JSON.parse(pkg.content);
6599
expect(pkgJson.scripts.prepublishOnly).to.equal('ember ts:precompile');
66100
expect(pkgJson.scripts.postpublish).to.equal('ember ts:clean');
101+
expect(pkgJson.devDependencies).to.not.have.any.keys('ember-data');
102+
expect(pkgJson.devDependencies).to.not.have.any.keys('@types/ember-data');
103+
expect(pkgJson.devDependencies).to.include.all.keys('ember-cli-qunit');
104+
expect(pkgJson.devDependencies).to.include.all.keys('@types/ember-qunit', '@types/qunit');
105+
expect(pkgJson.devDependencies).to.not.have.any.keys('@types/ember-mocha', '@types/mocha');
67106

68107
const tsconfig = file('tsconfig.json');
69108
expect(tsconfig).to.exist;
@@ -82,6 +121,9 @@ describe('Acceptance: ember-cli-typescript generator', function() {
82121
const projectTypes = file('types/dummy/index.d.ts');
83122
expect(projectTypes).to.exist;
84123
expect(projectTypes).not.to.include(ects.APP_DECLARATIONS);
124+
125+
const emberDataCatchallTypes = file('types/ember-data.d.ts');
126+
expect(emberDataCatchallTypes).not.to.exist;
85127
});
86128
});
87129

@@ -119,6 +161,9 @@ describe('Acceptance: ember-cli-typescript generator', function() {
119161
const projectTypes = file('types/my-app/index.d.ts');
120162
expect(projectTypes).to.exist;
121163
expect(projectTypes).to.include(ects.APP_DECLARATIONS);
164+
165+
const emberDataCatchallTypes = file('types/ember-data.d.ts');
166+
expect(emberDataCatchallTypes).to.exist;
122167
});
123168
});
124169

@@ -179,4 +224,44 @@ describe('Acceptance: ember-cli-typescript generator', function() {
179224
expect(json.include).to.deep.equal(['app', 'addon', 'tests', 'types']);
180225
});
181226
});
227+
228+
it('app with Mocha', function() {
229+
const args = ['ember-cli-typescript'];
230+
231+
return helpers
232+
.emberNew()
233+
.then(() => helpers.modifyPackages([
234+
{ name: 'ember-cli-mocha', dev: true },
235+
{ name: 'ember-cli-qunit', delete: true },
236+
]))
237+
.then(() => helpers.emberGenerate(args))
238+
.then(() => {
239+
const pkg = file('package.json');
240+
expect(pkg).to.exist;
241+
242+
const pkgJson = JSON.parse(pkg.content);
243+
expect(pkgJson.devDependencies).to.include.all.keys('@types/ember-mocha', '@types/mocha');
244+
expect(pkgJson.devDependencies).to.not.have.any.keys('@types/ember-qunit', '@types/qunit');
245+
});
246+
});
247+
248+
it('addon with Mocha', function() {
249+
const args = ['ember-cli-typescript'];
250+
251+
return helpers
252+
.emberNew({ target: 'addon' })
253+
.then(() => helpers.modifyPackages([
254+
{ name: 'ember-cli-mocha', dev: true },
255+
{ name: 'ember-cli-qunit', delete: true },
256+
]))
257+
.then(() => helpers.emberGenerate(args))
258+
.then(() => {
259+
const pkg = file('package.json');
260+
expect(pkg).to.exist;
261+
262+
const pkgJson = JSON.parse(pkg.content);
263+
expect(pkgJson.devDependencies).to.include.all.keys('@types/ember-mocha', '@types/mocha');
264+
expect(pkgJson.devDependencies).to.not.have.any.keys('@types/ember-qunit', '@types/qunit');
265+
});
266+
});
182267
});

0 commit comments

Comments
 (0)