Skip to content

Commit fd22ba5

Browse files
first gather func test
1 parent 2880c33 commit fd22ba5

10 files changed

Lines changed: 840 additions & 500 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,5 @@ typings/
5959

6060
# next.js build output
6161
.next
62+
63+
test/fixtures/classic-app/dist/

.npmignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*.test.js
2+
**/test/**

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ install:
1818

1919
script:
2020
- yarn lint:js
21-
- yarn test
21+
- yarn test --forceExit
Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1-
module.exports = function parseMeta(meta = {}) {
1+
module.exports = function analyzeEmberObject(possibleEmberObject) {
2+
if (typeof possibleEmberObject !== 'object' || possibleEmberObject === null) {
3+
return undefined;
4+
}
5+
if (possibleEmberObject.default && typeof possibleEmberObject.default.proto !== 'function') {
6+
return undefined;
7+
}
8+
let proto = possibleEmberObject.default.proto();
9+
10+
// Ember here is assumed to be global when ran within the context of the browser
11+
/* globals Ember */
12+
let meta = Ember.meta(proto);
13+
214
// eslint-disable-next-line no-undef
3-
meta = Ember.meta(meta);
415
if (!meta || !meta.source) {
516
return {};
617
}

lib/gather/gather-telemetry.js

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,38 +15,41 @@ module.exports = async function gatherTelemetry(url, gatherFn, puppeteerArgs = {
1515
console.error(message); // eslint-disable-line no-console
1616
});
1717

18-
await page.exposeFunction('gatherFn', gatherFn);
19-
20-
const telemetry = await page.evaluate(() => {
21-
const SKIPPED_MODULES = ['fetch/ajax'];
22-
23-
/* globals window,*/
24-
let telemetry = {};
25-
26-
const modules = Object.keys(window.require.entries);
18+
const telemetry = await bridgeEvaluate(
19+
page,
20+
async gFn => {
21+
const SKIPPED_MODULES = ['fetch/ajax'];
22+
/* globals window,*/
23+
let telemetry = {};
24+
const modules = Object.keys(window.require.entries);
25+
26+
for (let modulePath of modules) {
27+
if (SKIPPED_MODULES.includes(modulePath)) {
28+
continue;
29+
}
2730

28-
for (let modulePath of modules) {
29-
if (SKIPPED_MODULES.includes(modulePath)) {
30-
continue;
31-
}
32-
if (window.gatherFn && typeof window.gatherFn === 'function') {
3331
try {
3432
let module = require(modulePath);
35-
36-
if (module && module.default && module.default.proto) {
37-
let defaultProto = module.default.proto();
38-
39-
telemetry[modulePath] = window.gatherFn(defaultProto);
40-
}
33+
telemetry[modulePath] = await gFn(module);
4134
} catch (error) {
4235
// log the error, but continue
4336
window.logErrorInNodeProcess(`error evaluating \`${modulePath}\`: ${error.message}`);
4437
}
4538
}
46-
}
47-
return telemetry;
48-
});
39+
return telemetry;
40+
},
41+
gatherFn
42+
);
4943

5044
setTelemetry(telemetry);
5145
await browser.close();
46+
47+
async function bridgeEvaluate(page, fn, ...rawArgs) {
48+
const args = await Promise.all(
49+
rawArgs.map(arg => {
50+
return typeof arg === 'function' ? page.evaluateHandle(`(${arg.toString()})`) : arg;
51+
})
52+
);
53+
return page.evaluate(fn, ...args);
54+
}
5255
};
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const startApp = require('../../test/helpers/start-app');
2+
const gatherTelemetry = require('./gather-telemetry');
3+
const { getTelemetry } = require('../utils/telemetry');
4+
const analyzeEmberObject = require('../gather/analyze-ember-object');
5+
const APP_TIMEOUT = 100000;
6+
7+
function helper(possibleEmberObject) {
8+
if (
9+
possibleEmberObject &&
10+
possibleEmberObject.default &&
11+
possibleEmberObject.default.isHelperFactory
12+
) {
13+
return true;
14+
}
15+
}
16+
17+
describe('Provide a personalized `Gathering Function`', () => {
18+
let app;
19+
let localAppPath = './test/fixtures/classic-app';
20+
beforeAll(async () => {
21+
app = await startApp(localAppPath);
22+
console.log(`Spawned PID: ${app.emberServe.pid}`);
23+
}, APP_TIMEOUT);
24+
25+
test('can determine helpers with simple a function', async () => {
26+
await gatherTelemetry('http://localhost:4200', helper);
27+
let telemetry = getTelemetry();
28+
expect(telemetry).toEqual({
29+
'ember-inflector/lib/helpers/pluralize': true,
30+
'ember-inflector/lib/helpers/singularize': true,
31+
'input/helpers/app-version': true,
32+
'input/helpers/pluralize': true,
33+
'input/helpers/singularize': true,
34+
});
35+
});
36+
37+
test('can determine components with a robust function', async () => {
38+
await gatherTelemetry('http://localhost:4200', analyzeEmberObject);
39+
let telemetry = getTelemetry();
40+
expect(Object.keys(telemetry).filter(Boolean).length).toEqual(1);
41+
});
42+
43+
afterAll(async () => {
44+
console.log(`Killing PID: ${app.emberServe.pid}`);
45+
await app.emberServe.kill('SIGTERM', {
46+
forceKillAfterTimeout: 200,
47+
});
48+
}, APP_TIMEOUT);
49+
});

lib/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
const gatherTelemetryForUrl = require('./gather/gather-telemetry');
22
const { getModulePathFor } = require('./utils/get-module-path-for');
33
const { getTelemetry, setTelemetry, getTelemetryFor } = require('./utils/telemetry');
4-
const parseMeta = require('../lib/gather/local-gather');
4+
const analyzeEmberObject = require('./gather/analyze-ember-object');
55

66
module.exports = {
77
getTelemetry,
88
setTelemetry,
99
gatherTelemetryForUrl,
1010
getTelemetryFor,
1111
getModulePathFor,
12-
parseMeta,
12+
analyzeEmberObject,
1313
};

package.json

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,40 @@
55
"main": "lib/index.js",
66
"repository": "https://github.com/ember-codemods/ember-codemods-telemetry-helpers",
77
"author": "",
8+
"contributors": [
9+
"Ryan Mark <[email protected]>"
10+
],
811
"license": "MIT",
912
"private": false,
1013
"scripts": {
1114
"lint:js": "eslint .",
1215
"test": "jest .",
1316
"release": "release-it"
1417
},
15-
"devDependencies": {
16-
"eslint": "^6.1.0",
17-
"eslint-config-prettier": "^6.0.0",
18-
"eslint-plugin-node": "^9.1.0",
19-
"eslint-plugin-prettier": "^3.1.0",
20-
"execa": "^2.0.3",
21-
"jest": "^24.8.0",
22-
"prettier": "^1.18.2",
23-
"release-it": "^12.3.4",
24-
"release-it-lerna-changelog": "^1.0.3"
25-
},
2618
"dependencies": {
2719
"fs-extra": "^8.1.0",
2820
"git-repo-info": "^2.1.0",
29-
"puppeteer": "^1.19.0",
21+
"puppeteer": "^1.20.0",
3022
"sync-disk-cache": "^1.3.3",
3123
"walk-sync": "^2.0.2"
3224
},
25+
"devDependencies": {
26+
"eslint": "^6.5.1",
27+
"eslint-config-prettier": "^6.4.0",
28+
"eslint-plugin-node": "^10.0.0",
29+
"eslint-plugin-prettier": "^3.1.1",
30+
"execa": "^2.1.0",
31+
"jest": "^24.9.0",
32+
"prettier": "^1.18.2",
33+
"release-it": "^12.4.3",
34+
"release-it-lerna-changelog": "^1.0.3"
35+
},
3336
"engines": {
3437
"node": "8.* || 10.* || >= 12.*"
3538
},
39+
"jest": {
40+
"testEnvironment": "node"
41+
},
3642
"publishConfig": {
3743
"registry": "https://registry.npmjs.org"
3844
},

test/helpers/start-app.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const execa = require('execa');
2+
const path = require('path');
3+
4+
module.exports = async function startApp(appPath) {
5+
const classicAppDir = path.resolve(appPath);
6+
const execOpts = { cwd: classicAppDir, stderr: 'inherit' };
7+
console.log('installing deps');
8+
9+
await execa('rm', ['-rf', 'node_modules'], execOpts);
10+
await execa('yarn', ['install'], execOpts);
11+
12+
console.log('starting serve');
13+
const emberServe = execa('yarn', ['start'], execOpts);
14+
emberServe.stdout.pipe(process.stdout);
15+
16+
await new Promise(resolve => {
17+
emberServe.stdout.on('data', data => {
18+
let dataAsStr = data.toString();
19+
if (dataAsStr.includes('Build successful')) {
20+
resolve();
21+
}
22+
});
23+
});
24+
25+
return { emberServe };
26+
};

0 commit comments

Comments
 (0)