Skip to content

Commit 3f86356

Browse files
authored
Merge pull request #1148 from mrloop/middleware-options
perf: don't use middleware if has build
2 parents 2111f01 + ad62d02 commit 3f86356

File tree

9 files changed

+134
-18
lines changed

9 files changed

+134
-18
lines changed

test-fixtures/skeleton-app/config/environment.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
module.exports = function(environment) {
55
return {
66
environment,
7-
modulePrefix: 'skeleton-app'
7+
modulePrefix: 'skeleton-app',
8+
rootURL: '/'
89
};
910
};

test-fixtures/skeleton-app/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"ember-cli-htmlbars": "*",
66
"ember-cli-babel": "*",
77
"ember-source": "*",
8+
"ember-qunit": "*",
89
"loader.js": "*",
910
"typescript": "*"
1011
},
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'use strict';
2+
3+
module.exports = {
4+
test_page: 'tests/index.html?hidepassed',
5+
disable_watching: true,
6+
launch_in_ci: ['Chrome'],
7+
launch_in_dev: ['Chrome'],
8+
browser_start_timeout: 120,
9+
browser_args: {
10+
Chrome: {
11+
ci: [
12+
// --no-sandbox is needed when running Chrome inside a container
13+
process.env.CI ? '--no-sandbox' : null,
14+
'--headless',
15+
'--disable-dev-shm-usage',
16+
'--disable-software-rasterizer',
17+
'--mute-audio',
18+
'--remote-debugging-port=0',
19+
'--window-size=1440,900'
20+
].filter(Boolean)
21+
}
22+
}
23+
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8">
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
6+
<title>Dummy Tests</title>
7+
<meta name="description" content="">
8+
<meta name="viewport" content="width=device-width, initial-scale=1">
9+
10+
{{content-for "head"}}
11+
{{content-for "test-head"}}
12+
13+
<link rel="stylesheet" href="{{rootURL}}assets/vendor.css">
14+
<link rel="stylesheet" href="{{rootURL}}assets/skeleton-app.css">
15+
<link rel="stylesheet" href="{{rootURL}}assets/test-support.css">
16+
17+
{{content-for "head-footer"}}
18+
{{content-for "test-head-footer"}}
19+
</head>
20+
<body>
21+
{{content-for "body"}}
22+
{{content-for "test-body"}}
23+
24+
<script src="/testem.js" integrity=""></script>
25+
<script src="{{rootURL}}assets/vendor.js"></script>
26+
<script src="{{rootURL}}assets/test-support.js"></script>
27+
<script src="{{rootURL}}assets/skeleton-app.js"></script>
28+
<script src="{{rootURL}}assets/tests.js"></script>
29+
30+
{{content-for "body-footer"}}
31+
{{content-for "test-body-footer"}}
32+
</body>
33+
</html>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { start } from 'ember-qunit';
2+
3+
start();

ts/addon.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import TypecheckMiddleware from './lib/typechecking/middleware';
1010
import { Application } from 'express';
1111
import walkSync from 'walk-sync';
1212
import fs from 'fs-extra';
13+
import logger from 'debug';
14+
15+
const debug = logger('ember-cli-typescript:addon');
1316

1417
export const ADDON_NAME = 'ember-cli-typescript';
1518

@@ -45,12 +48,22 @@ export default addon({
4548
return `${__dirname}/blueprints`;
4649
},
4750

48-
serverMiddleware({ app }) {
49-
this._addTypecheckMiddleware(app);
51+
serverMiddleware({ app, options }) {
52+
if (!options || !options.path) {
53+
debug('Installing typecheck server middleware');
54+
this._addTypecheckMiddleware(app);
55+
} else {
56+
debug('Skipping typecheck server middleware');
57+
}
5058
},
5159

52-
testemMiddleware(app) {
53-
this._addTypecheckMiddleware(app);
60+
testemMiddleware(app, options) {
61+
if (!options || !options.path) {
62+
debug('Installing typecheck testem middleware');
63+
this._addTypecheckMiddleware(app);
64+
} else {
65+
debug('Skipping typecheck testem middleware');
66+
}
5467
},
5568

5669
async postBuild() {

ts/tests/acceptance/build-test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,32 @@ describe('Acceptance: build', function () {
6969
);
7070
});
7171

72+
it("doesn't launch type checking for `ember serve` when --path is used", async () => {
73+
await app.build();
74+
75+
let server = app.serve({
76+
args: ['--path', 'dist'],
77+
env: { DEBUG: 'ember-cli-typescript:addon' },
78+
});
79+
80+
let result = await server.waitForOutput('Serving on');
81+
82+
expect(result).to.include('ember-cli-typescript:addon Skipping typecheck server middleware');
83+
});
84+
85+
it("doesn't launch type checking for `ember test` when --path is used", async () => {
86+
await app.build({ args: ['--environment', 'test'] });
87+
88+
let result = await app.test({
89+
args: ['--path', 'dist'],
90+
env: { DEBUG: 'ember-cli-typescript:addon' },
91+
});
92+
93+
expect(result.all).to.include(
94+
'ember-cli-typescript:addon Skipping typecheck testem middleware'
95+
);
96+
});
97+
7298
it('fails the build when noEmitOnError is set and an error is emitted', async () => {
7399
app.writeFile('app/app.ts', `import { foo } from 'nonexistent';`);
74100

ts/tests/helpers/skeleton-app.ts

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@ const getEmberPort = (() => {
1313
return () => lastPort++;
1414
})();
1515

16+
interface EmberCliOptions {
17+
args?: string[];
18+
env?: Record<string, string>;
19+
}
20+
1621
export default class SkeletonApp {
1722
port = getEmberPort();
18-
watched: WatchedBuild | null = null;
23+
watched: WatchedEmberProcess | null = null;
1924
cleanupTempDir = () => rimraf(this.root, (error) => error && console.error(error));
2025
root = path.join(process.cwd(), `test-skeleton-app-${Math.random().toString(36).slice(2)}`);
2126

@@ -25,18 +30,22 @@ export default class SkeletonApp {
2530
process.on('beforeExit', this.cleanupTempDir);
2631
}
2732

28-
build() {
29-
return this._ember(['build']);
33+
build({ args = [], env }: EmberCliOptions = {}) {
34+
return this._ember({ args: ['build', ...args], env });
35+
}
36+
37+
test({ args = [], env }: EmberCliOptions = {}) {
38+
return this._ember({ args: ['test', '--test-port', `${this.port}`, ...args], env });
3039
}
3140

32-
serve() {
41+
serve({ args = [], env }: EmberCliOptions = {}) {
3342
if (this.watched) {
3443
throw new Error('Already serving');
3544
}
36-
return (this.watched = new WatchedBuild(
37-
this._ember(['serve', '--port', `${this.port}`]),
38-
this.port
39-
));
45+
46+
let childProcess = this._ember({ args: ['serve', '--port', `${this.port}`, ...args], env });
47+
48+
return (this.watched = new WatchedEmberProcess(childProcess, this.port));
4049
}
4150

4251
updatePackageJSON(callback: (arg: any) => any) {
@@ -68,13 +77,13 @@ export default class SkeletonApp {
6877
process.off('beforeExit', this.cleanupTempDir);
6978
}
7079

71-
_ember(args: string[]) {
80+
_ember({ args, env }: EmberCliOptions) {
7281
let ember = require.resolve('ember-cli/bin/ember');
73-
return execa.node(ember, args, { cwd: this.root, all: true });
82+
return execa.node(ember, args, { cwd: this.root, all: true, env });
7483
}
7584
}
7685

77-
class WatchedBuild extends EventEmitter {
86+
class WatchedEmberProcess extends EventEmitter {
7887
constructor(protected ember: execa.ExecaChildProcess, protected port: number) {
7988
super();
8089
this.ember.stdout?.on('data', (data) => {

ts/types/ember-cli/index.d.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ declare module 'ember-cli/lib/models/addon' {
1111
import UI from 'console-ui';
1212
import { Application } from 'express';
1313
import Project from 'ember-cli/lib/models/project';
14+
import { TaskOptions } from 'ember-cli/lib/models/task';
1415
import Command from 'ember-cli/lib/models/command';
1516
import EmberApp from 'ember-cli/lib/broccoli/ember-app';
1617
import PreprocessRegistry from 'ember-cli-preprocess-registry';
@@ -36,8 +37,8 @@ declare module 'ember-cli/lib/models/addon' {
3637
includedCommands(): Record<string, typeof Command | ExtendOptions<Command>> | void;
3738
shouldIncludeChildAddon(addon: Addon): boolean;
3839
isDevelopingAddon(): boolean;
39-
serverMiddleware(options: { app: Application }): void | Promise<void>;
40-
testemMiddleware(app: Application): void;
40+
serverMiddleware(options: { app: Application; options?: TaskOptions }): void | Promise<void>;
41+
testemMiddleware(app: Application, options?: TaskOptions): void;
4142
setupPreprocessorRegistry(type: 'self' | 'parent', registry: PreprocessRegistry): void;
4243
}
4344
}
@@ -49,6 +50,12 @@ declare module 'ember-cli/lib/models/blueprint' {
4950
export = Blueprint;
5051
}
5152

53+
declare module 'ember-cli/lib/models/task' {
54+
export interface TaskOptions {
55+
path?: string;
56+
}
57+
}
58+
5259
declare module 'ember-cli/lib/models/command' {
5360
import CoreObject from 'core-object';
5461
import UI from 'console-ui';

0 commit comments

Comments
 (0)