From fec25af3b40cfe901d318cf4c8366627132c3722 Mon Sep 17 00:00:00 2001 From: Chris Miller Date: Wed, 9 Aug 2023 13:09:27 -0500 Subject: [PATCH 1/4] updates to support embroider/compat >3.1 --- packages/ember-cli-code-coverage/index.js | 29 ++++++++++++------- .../lib/attach-middleware.js | 11 +++++-- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/packages/ember-cli-code-coverage/index.js b/packages/ember-cli-code-coverage/index.js index 26818a34..45268166 100644 --- a/packages/ember-cli-code-coverage/index.js +++ b/packages/ember-cli-code-coverage/index.js @@ -55,10 +55,23 @@ module.exports = { } if (opts.embroider === true) { - let { - stableWorkspaceDir, - } = require('@embroider/compat/src/default-pipeline'); - cwd = stableWorkspaceDir(cwd, process.env.EMBER_ENV); + let version = pkgJSON['devDependencies']['@embroider/compat']; + let semver = require('semver'); + + let usesNewTempDirLocation = semver.satisfies( + semver.valid(semver.coerce(version)), + '>3.1' + ); + + if (usesNewTempDirLocation) { + let { locateEmbroiderWorkingDir } = require('@embroider/core'); + cwd = path.resolve(locateEmbroiderWorkingDir(cwd), 'rewritten-app'); + } else { + let { + stableWorkspaceDir, + } = require('@embroider/compat/src/default-pipeline'); + cwd = stableWorkspaceDir(cwd, process.env.EMBER_ENV); + } } const IstanbulPlugin = require.resolve('babel-plugin-istanbul'); @@ -115,12 +128,8 @@ module.exports = { * If coverage is enabled attach coverage middleware to the express server run by ember-cli * @param {Object} startOptions - Express server start options */ - serverMiddleware(startOptions) { - attachMiddleware.serverMiddleware(startOptions.app, { - configPath: this.project.configPath(), - root: this.project.root, - namespaceMappings: this.buildNamespaceMappings(), - }); + serverMiddleware(startOptions, config) { + attachMiddleware.serverMiddleware(startOptions.app, config); }, testemMiddleware(app) { diff --git a/packages/ember-cli-code-coverage/lib/attach-middleware.js b/packages/ember-cli-code-coverage/lib/attach-middleware.js index 421c56c5..0c9ec69d 100644 --- a/packages/ember-cli-code-coverage/lib/attach-middleware.js +++ b/packages/ember-cli-code-coverage/lib/attach-middleware.js @@ -22,8 +22,15 @@ function logError(err, req, res, next) { * in-repo-namespace/components/foo.js. */ function normalizeRelativePath(root, filepath) { - let embroiderTmpPathRegex = /embroider\/.{6}/gm; - let relativePath = filepath.split(embroiderTmpPathRegex)[1].slice(1); + let relativePath; + let embroiderCompatLT31TmpPathRegex = /embroider\/.{6}/gm; + let embroiderCompatGT31TmpPathRegex = /\.embroider\/rewritten-app\//gm; + + if (embroiderCompatGT31TmpPathRegex.test(filepath)) { + relativePath = filepath.split(embroiderCompatGT31TmpPathRegex)[1]; + } else { + relativePath = filepath.split(embroiderCompatLT31TmpPathRegex)[1].slice(1); + } if (fs.existsSync(path.join(root, 'package.json'))) { let pkgJSON = fs.readJsonSync(path.join(root, 'package.json')); From 8329f105f9306267ea27ed7a4dabe09bd0eae40f Mon Sep 17 00:00:00 2001 From: Chris Miller Date: Thu, 17 Aug 2023 13:18:19 -0500 Subject: [PATCH 2/4] add semver to dependencies --- packages/ember-cli-code-coverage/package.json | 1 + yarn.lock | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/packages/ember-cli-code-coverage/package.json b/packages/ember-cli-code-coverage/package.json index 9a05072a..76f884ff 100644 --- a/packages/ember-cli-code-coverage/package.json +++ b/packages/ember-cli-code-coverage/package.json @@ -43,6 +43,7 @@ "istanbul-lib-report": "^3.0.0", "istanbul-reports": "^3.0.2", "node-dir": "^0.1.17", + "semver": "^7.5.4", "walk-sync": "^2.1.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 5d45c11a..64e05272 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18839,6 +18839,13 @@ semver@^7.3.4, semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + send@0.17.2: version "0.17.2" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" From f7759913a2046554f0f9f67a5d6f5d0590864611 Mon Sep 17 00:00:00 2001 From: Chris Miller Date: Fri, 17 Nov 2023 17:30:03 +0000 Subject: [PATCH 3/4] Enable tests for embroider compat >3.1.0 --- test-packages/my-embroider-app-test.js | 72 ------------------ test-packages/my-embroider-app-test.mjs | 2 +- .../-package-with-compat-3.json | 75 ------------------- 3 files changed, 1 insertion(+), 148 deletions(-) delete mode 100644 test-packages/my-embroider-app-test.js delete mode 100644 test-packages/my-embroider-app/-package-with-compat-3.json diff --git a/test-packages/my-embroider-app-test.js b/test-packages/my-embroider-app-test.js deleted file mode 100644 index 75db3d87..00000000 --- a/test-packages/my-embroider-app-test.js +++ /dev/null @@ -1,72 +0,0 @@ -'use strict'; - -const fs = require('fs-extra'); -const util = require('util'); -const rimraf = util.promisify(require('rimraf')); -const { dir, file } = require('chai-files'); -const path = require('path'); -const execa = require('execa'); - -const APP_DIR = 'my-embroider-app'; -const BASE_PATH = path.join(__dirname,APP_DIR); - -describe('app coverage generation', function () { - jest.setTimeout(10000000); - - beforeEach(async function () { - await rimraf(`${BASE_PATH}/coverage*`); - await execa('git', ['clean', '-f',APP_DIR], { cwd: __dirname }); - await execa('git', ['restore',APP_DIR], { cwd: __dirname }); - }); - - afterEach(async function () { - await rimraf(`${BASE_PATH}/coverage*`); - await execa('git', ['clean', '-f',APP_DIR], { cwd: __dirname }); - await execa('git', ['restore',APP_DIR], { cwd: __dirname }); - await execa('git', ['clean', '-f', 'yarn.lock']); - await execa('git', ['restore', 'yarn.lock']); - }); - - it('runs coverage when env var is set', async function () { - dir(`${BASE_PATH}/coverage`).assertDoesNotExist(); - - let env = { COVERAGE: 'true' }; - await execa('yarn',['install'], { env }); - await execa('ember', ['test'], { cwd: BASE_PATH, env }); - file(`${BASE_PATH}/coverage/lcov-report/index.html`).assertIsNotEmpty(); - file(`${BASE_PATH}/coverage/index.html`).assertIsNotEmpty(); - - let summary = fs.readJSONSync(`${BASE_PATH}/coverage/coverage-summary.json`); - expect(summary).toMatchSnapshot(); - }); - - it('generates coverage with @ember/compat >= 2.1.0', async function () { - dir(`${BASE_PATH}/coverage`).assertDoesNotExist(); - - let env = { COVERAGE: 'true' }; - fs.copySync(`${BASE_PATH}/-package-with-compat-2.json`, `${BASE_PATH}/package.json`); - await execa('yarn',['install'], { env }); - await execa('ember', ['test'], { cwd: BASE_PATH, env }); - - file(`${BASE_PATH}/coverage/lcov-report/index.html`).assertIsNotEmpty(); - file(`${BASE_PATH}/coverage/index.html`).assertIsNotEmpty(); - - let summary = fs.readJSONSync(`${BASE_PATH}/coverage/coverage-summary.json`); - expect(summary).toMatchSnapshot(); - }); - - it('generates coverage with @ember/compat >= 3.1.0', async function () { - dir(`${BASE_PATH}/coverage`).assertDoesNotExist(); - - let env = { COVERAGE: 'true' }; - fs.copySync(`${BASE_PATH}/-package-with-compat-3.json`, `${BASE_PATH}/package.json`); - await execa('yarn',['install'], { env }); - await execa('ember', ['test'], { cwd: BASE_PATH, env }); - - file(`${BASE_PATH}/coverage/lcov-report/index.html`).assertIsNotEmpty(); - file(`${BASE_PATH}/coverage/index.html`).assertIsNotEmpty(); - - let summary = fs.readJSONSync(`${BASE_PATH}/coverage/coverage-summary.json`); - expect(summary).toMatchSnapshot(); - }); -}); diff --git a/test-packages/my-embroider-app-test.mjs b/test-packages/my-embroider-app-test.mjs index bbac336b..4f199f00 100644 --- a/test-packages/my-embroider-app-test.mjs +++ b/test-packages/my-embroider-app-test.mjs @@ -13,7 +13,7 @@ describe('app coverage generation', function () { '^0.47.0', '^1.0.0', '^2.1.0', - // '^3.1.0' remove when PR https://github.com/ember-cli-code-coverage/ember-cli-code-coverage/pull/387 is merged + '^3.1.0' ]) { it(`generates coverage with @embroider ${embroiderVersion}`, async function (context) { let buildPath = await setupTestDir(APP_DIR, env, { diff --git a/test-packages/my-embroider-app/-package-with-compat-3.json b/test-packages/my-embroider-app/-package-with-compat-3.json deleted file mode 100644 index 9b5d3f95..00000000 --- a/test-packages/my-embroider-app/-package-with-compat-3.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "my-embroider-app", - "version": "0.0.0", - "private": true, - "description": "Small description for my-embroider-app goes here", - "repository": "", - "license": "MIT", - "author": "", - "directories": { - "doc": "doc", - "test": "tests" - }, - "scripts": { - "build": "ember build --environment=production", - "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"", - "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix", - "lint:hbs": "ember-template-lint .", - "lint:hbs:fix": "ember-template-lint . --fix", - "lint:js": "eslint . --cache", - "lint:js:fix": "eslint . --fix", - "start": "ember serve", - "test": "npm-run-all lint test:*", - "test:ember": "ember test" - }, - "devDependencies": { - "@ember/optional-features": "^2.0.0", - "@ember/test-helpers": "^2.4.2", - "@embroider/compat": "3.2.1", - "@embroider/core": "3.2.1", - "@embroider/webpack": "3.1.5", - "@glimmer/component": "^1.0.4", - "@glimmer/tracking": "^1.0.4", - "babel-eslint": "^10.1.0", - "broccoli-asset-rev": "^3.0.0", - "ember-auto-import": "^1.11.3", - "ember-cli-code-coverage": "2.0.0", - "ember-cli": "~3.28.0", - "ember-cli-app-version": "^5.0.0", - "ember-cli-babel": "^7.26.6", - "ember-cli-dependency-checker": "^3.2.0", - "ember-cli-htmlbars": "^5.7.1", - "ember-cli-inject-live-reload": "^2.1.0", - "ember-cli-sri": "^2.1.1", - "ember-cli-terser": "^4.0.2", - "ember-data": "~3.28.0", - "ember-export-application-global": "^2.0.1", - "ember-fetch": "^8.1.1", - "ember-load-initializers": "^2.1.2", - "ember-maybe-import-regenerator": "^0.1.6", - "ember-page-title": "^6.2.2", - "ember-qunit": "^5.1.4", - "ember-resolver": "^8.0.2", - "ember-source": "~3.28.0", - "ember-template-lint": "^3.6.0", - "ember-welcome-page": "^4.0.0", - "eslint": "^7.32.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-ember": "^10.5.4", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^3.4.1", - "eslint-plugin-qunit": "^6.2.0", - "loader.js": "^4.7.0", - "npm-run-all": "^4.1.5", - "prettier": "^2.3.2", - "qunit": "^2.16.0", - "qunit-dom": "^1.6.0", - "webpack": "^5.51.1" - }, - "engines": { - "node": "12.* || 14.* || >= 16" - }, - "ember": { - "edition": "octane" - } - } \ No newline at end of file From a110624695428b9d340572e6fc7804c82686982f Mon Sep 17 00:00:00 2001 From: Chris Miller Date: Fri, 17 Nov 2023 20:52:20 -0600 Subject: [PATCH 4/4] Update to use presence of new method as indicator - if `locateEmbroiderWorkingDir` exists, use it. otherwise use prior - remove (seemingly) unnecessary update to ^3.0 peer dep - remove semver. no longer used --- packages/ember-cli-code-coverage/index.js | 15 ++-- packages/ember-cli-code-coverage/package.json | 5 +- .../ember-cli-code-coverage/pnpm-lock.yaml | 3 - .../my-embroider-app-test.mjs.snap | 89 +++++++++++++++++++ 4 files changed, 96 insertions(+), 16 deletions(-) diff --git a/packages/ember-cli-code-coverage/index.js b/packages/ember-cli-code-coverage/index.js index b5e066f2..9f33dbb2 100644 --- a/packages/ember-cli-code-coverage/index.js +++ b/packages/ember-cli-code-coverage/index.js @@ -55,19 +55,14 @@ module.exports = { } if (opts.embroider === true) { - let version = pkgJSON['devDependencies']['@embroider/compat']; - let semver = require('semver'); - - let usesNewTempDirLocation = semver.satisfies( - semver.valid(semver.coerce(version)), - '>3.1' - ); - - if (usesNewTempDirLocation) { + try { + // Attempt to import the utility @embroider/compat uses in >3.1 to locate the embroider working directory + // the presence of this `locateEmbroiderWorkingDir` method coincides with the shift to utilize `rewritten-app` tmp dir // eslint-disable-next-line node/no-missing-require let { locateEmbroiderWorkingDir } = require('@embroider/core'); cwd = path.resolve(locateEmbroiderWorkingDir(cwd), 'rewritten-app'); - } else { + } catch (err) { + // otherwise, fall back to the method used in embroider <3.1 let { stableWorkspaceDir, // eslint-disable-next-line node/no-missing-require diff --git a/packages/ember-cli-code-coverage/package.json b/packages/ember-cli-code-coverage/package.json index 807c99d3..427363d6 100644 --- a/packages/ember-cli-code-coverage/package.json +++ b/packages/ember-cli-code-coverage/package.json @@ -43,7 +43,6 @@ "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.1.6", "node-dir": "^0.1.17", - "semver": "^7.5.4", "walk-sync": "^2.1.0" }, "devDependencies": { @@ -90,8 +89,8 @@ "sinon": "^4.2.2" }, "peerDependencies": { - "@embroider/compat": "^0.47.0 || ^1.0.0 || ^2.0.0 || >=3.1.0", - "@embroider/core": "^0.47.0 || ^1.0.0 || ^2.0.0 || >=3.1.0" + "@embroider/compat": "^0.47.0 || ^1.0.0 || ^2.0.0 || >=3.0.0", + "@embroider/core": "^0.47.0 || ^1.0.0 || ^2.0.0 || >=3.0.0" }, "peerDependenciesMeta": { "@embroider/compat": { diff --git a/packages/ember-cli-code-coverage/pnpm-lock.yaml b/packages/ember-cli-code-coverage/pnpm-lock.yaml index fca41949..3404c11d 100644 --- a/packages/ember-cli-code-coverage/pnpm-lock.yaml +++ b/packages/ember-cli-code-coverage/pnpm-lock.yaml @@ -38,9 +38,6 @@ dependencies: node-dir: specifier: ^0.1.17 version: 0.1.17 - semver: - specifier: ^7.5.4 - version: 7.5.4 walk-sync: specifier: ^2.1.0 version: 2.2.0 diff --git a/test-packages/__snapshots__/my-embroider-app-test.mjs.snap b/test-packages/__snapshots__/my-embroider-app-test.mjs.snap index 6bbb14a3..2254c01d 100644 --- a/test-packages/__snapshots__/my-embroider-app-test.mjs.snap +++ b/test-packages/__snapshots__/my-embroider-app-test.mjs.snap @@ -266,3 +266,92 @@ exports[`app coverage generation > generates coverage with @embroider ^2.1.0 1`] }, } `; + +exports[`app coverage generation > generates coverage with @embroider ^3.1.0 1`] = ` +{ + "app/app.js": { + "branches": { + "covered": 0, + "pct": 100, + "skipped": 0, + "total": 0, + }, + "functions": { + "covered": 0, + "pct": 100, + "skipped": 0, + "total": 0, + }, + "lines": { + "covered": 4, + "pct": 100, + "skipped": 0, + "total": 4, + }, + "statements": { + "covered": 4, + "pct": 100, + "skipped": 0, + "total": 4, + }, + }, + "app/router.js": { + "branches": { + "covered": 0, + "pct": 100, + "skipped": 0, + "total": 0, + }, + "functions": { + "covered": 0, + "pct": 0, + "skipped": 0, + "total": 1, + }, + "lines": { + "covered": 1, + "pct": 33.33, + "skipped": 0, + "total": 3, + }, + "statements": { + "covered": 1, + "pct": 33.33, + "skipped": 0, + "total": 3, + }, + }, + "total": { + "branches": { + "covered": 0, + "pct": 100, + "skipped": 0, + "total": 0, + }, + "branchesTrue": { + "covered": 0, + "pct": "Unknown", + "skipped": 0, + "total": 0, + }, + "functions": { + "covered": 0, + "pct": 0, + "skipped": 0, + "total": 1, + }, + "lines": { + "covered": 5, + "pct": 71.42, + "skipped": 0, + "total": 7, + }, + "statements": { + "covered": 5, + "pct": 71.42, + "skipped": 0, + "total": 7, + }, + }, +} +`;