diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2fa05d2..98209b8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,21 +62,20 @@ jobs: matrix: try-scenario: [ - ember-lts-2.12, - ember-lts-2.18, - ember-lts-3.16, - ember-lts-3.20, - ember-lts-3.24, ember-lts-3.28, ember-lts-4.4, ember-lts-4.8, ember-lts-4.12, + ember-lts-5.4, ember-release, ember-beta, ember-canary, ember-3.28-with-jquery, ember-3.28-classic, ] + include: + - ember-try-scenario: ember-canary + allow-failure: true steps: - name: Checkout diff --git a/README.md b/README.md index f4844ac..af712c7 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,12 @@ addressing a single deprecation at a time, and prevents backsliding ### Compatibility +3.x + +- Ember.js 3.28 until at least 5.4 +- Ember CLI 4.12 or above +- Node.js 16 or above + 2.x - Ember.js 2.12 until at least 4.12 @@ -37,13 +43,27 @@ addressing a single deprecation at a time, and prevents backsliding ### Getting started -The initial steps needed to get started: - 1. Install the ember-cli-deprecation-workflow addon (`ember install ember-cli-deprecation-workflow`). -2. Run your test suite\* with `ember test --server`. -3. Navigate to your tests (default: http://localhost:7357/) -4. Run `deprecationWorkflow.flushDeprecations()` from your browsers console. -5. Copy the string output into `config/deprecation-workflow.js` in your project. +2. Create an `app/deprecation-workflow.js` file with the following content: + + ```js + import setupDeprecationWorkflow from 'ember-cli-deprecation-workflow'; + + setupDeprecationWorkflow(); + ``` + +3. In your `app/app.js`, do: + + ```js + import './deprecation-workflow'; + ``` + +4. Run your test suite\* with `ember test --server`. +5. Navigate to your tests (default: http://localhost:7357/) +6. Run `deprecationWorkflow.flushDeprecations()` in your browsers console. +7. Copy the string output and overwrite the content of `app/deprecation-workflow.js`. + + In Chrome, use right click → "Copy string contents" to avoid escape characters. Once this initial setup is completed the "deprecation spew" should be largely "fixed". Only unhandled deprecations will be displayed in your console. diff --git a/addon/index.js b/addon/index.js new file mode 100644 index 0000000..edb8dac --- /dev/null +++ b/addon/index.js @@ -0,0 +1,114 @@ +import { registerDeprecationHandler } from '@ember/debug'; + +const LOG_LIMIT = 100; + +export default function setupDeprecationWorkflow(config) { + self.deprecationWorkflow = self.deprecationWorkflow || {}; + self.deprecationWorkflow.deprecationLog = { + messages: {}, + }; + + registerDeprecationHandler((message, options, next) => + handleDeprecationWorkflow(config, message, options, next), + ); + + registerDeprecationHandler(deprecationCollector); + + self.deprecationWorkflow.flushDeprecations = flushDeprecations; +} + +let preamble = `import setupDeprecationWorkflow from 'ember-cli-deprecation-workflow'; + +setupDeprecationWorkflow({ + workflow: [ +`; + +let postamble = ` ] +});`; + +export function detectWorkflow(config, message, options) { + if (!config || !config.workflow) { + return; + } + + let i, workflow, matcher, idMatcher; + for (i = 0; i < config.workflow.length; i++) { + workflow = config.workflow[i]; + matcher = workflow.matchMessage; + idMatcher = workflow.matchId; + + if (typeof idMatcher === 'string' && options && idMatcher === options.id) { + return workflow; + } else if (typeof matcher === 'string' && matcher === message) { + return workflow; + } else if (matcher instanceof RegExp && matcher.exec(message)) { + return workflow; + } + } +} + +export function flushDeprecations() { + let messages = self.deprecationWorkflow.deprecationLog.messages; + let logs = []; + + for (let message in messages) { + logs.push(messages[message]); + } + + let deprecations = logs.join(',\n') + '\n'; + + return preamble + deprecations + postamble; +} + +export function handleDeprecationWorkflow(config, message, options, next) { + let matchingWorkflow = detectWorkflow(config, message, options); + if (!matchingWorkflow) { + if (config && config.throwOnUnhandled) { + throw new Error(message); + } else { + next(message, options); + } + } else { + switch (matchingWorkflow.handler) { + case 'silence': + // no-op + break; + case 'log': { + let key = (options && options.id) || message; + + if (!self.deprecationWorkflow.logCounts) { + self.deprecationWorkflow.logCounts = {}; + } + + let count = self.deprecationWorkflow.logCounts[key] || 0; + self.deprecationWorkflow.logCounts[key] = ++count; + + if (count <= LOG_LIMIT) { + console.warn('DEPRECATION: ' + message); + if (count === LOG_LIMIT) { + console.warn( + 'To avoid console overflow, this deprecation will not be logged any more in this run.', + ); + } + } + + break; + } + case 'throw': + throw new Error(message); + default: + next(message, options); + break; + } + } +} + +export function deprecationCollector(message, options, next) { + let key = (options && options.id) || message; + let matchKey = options && key === options.id ? 'matchId' : 'matchMessage'; + + self.deprecationWorkflow.deprecationLog.messages[key] = + ' { handler: "silence", ' + matchKey + ': ' + JSON.stringify(key) + ' }'; + + next(message, options); +} diff --git a/package-lock.json b/package-lock.json index ea939df..68544c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,8 @@ "@ember/string": "^3.0.0", "broccoli-funnel": "^3.0.3", "broccoli-merge-trees": "^4.2.0", - "broccoli-plugin": "^4.0.5" + "broccoli-plugin": "^4.0.5", + "ember-cli-babel": "^8.2.0" }, "devDependencies": { "@babel/eslint-parser": "^7.22.15", @@ -27,7 +28,6 @@ "concurrently": "^8.2.2", "ember-auto-import": "^2.6.3", "ember-cli": "~5.4.1", - "ember-cli-babel": "^8.2.0", "ember-cli-clean-css": "^3.0.0", "ember-cli-dependency-checker": "^3.3.2", "ember-cli-htmlbars": "^6.3.0", @@ -6314,7 +6314,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.0.tgz", "integrity": "sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==", - "dev": true, "dependencies": { "find-babel-config": "^2.0.0", "glob": "^8.0.3", @@ -6330,7 +6329,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -6339,7 +6337,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6358,7 +6355,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6890,7 +6886,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-8.0.0.tgz", "integrity": "sha512-3HEp3flvasUKJGWERcrPgM1SWvHJ0O/fmbEtY9L4kDyMSnqjY6hTYvNvgWCIgbwXAYAUlZP0vjAQsmyLNGLwFw==", - "dev": true, "dependencies": { "broccoli-persistent-filter": "^3.0.0", "clone": "^2.1.2", @@ -6912,7 +6907,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/async-disk-cache/-/async-disk-cache-2.1.0.tgz", "integrity": "sha512-iH+boep2xivfD9wMaZWkywYIURSmsL96d6MoqrC94BnGSvXE4Quf8hnJiHGFYhw/nLeIa1XyRaf4vvcvkwAefg==", - "dev": true, "dependencies": { "debug": "^4.1.1", "heimdalljs": "^0.2.3", @@ -6930,7 +6924,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/broccoli-persistent-filter/-/broccoli-persistent-filter-3.1.3.tgz", "integrity": "sha512-Q+8iezprZzL9voaBsDY3rQVl7c7H5h+bvv8SpzCZXPZgfBFCbx7KFQ2c3rZR6lW5k4Kwoqt7jG+rZMUg67Gwxw==", - "dev": true, "dependencies": { "async-disk-cache": "^2.0.0", "async-promise-queue": "^1.0.3", @@ -6952,7 +6945,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", - "dev": true, "dependencies": { "errlop": "^2.0.0", "semver": "^6.3.0" @@ -6968,7 +6960,6 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz", "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", - "dev": true, "dependencies": { "binaryextensions": "^2.1.2", "editions": "^2.2.0", @@ -6985,7 +6976,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -7000,7 +6990,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -7009,7 +6998,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/sync-disk-cache/-/sync-disk-cache-2.1.0.tgz", "integrity": "sha512-vngT2JmkSapgq0z7uIoYtB9kWOOzMihAAYq/D3Pjm/ODOGMgS4r++B+OZ09U4hWR6EaOdy9eqQ7/8ygbH3wehA==", - "dev": true, "dependencies": { "debug": "^4.1.1", "heimdalljs": "^0.2.6", @@ -7646,7 +7634,6 @@ }, "node_modules/broccoli-source": { "version": "3.0.1", - "dev": true, "license": "MIT", "dependencies": { "broccoli-node-api": "^1.6.0" @@ -10154,7 +10141,6 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-8.2.0.tgz", "integrity": "sha512-8H4+jQElCDo6tA7CamksE66NqBXWs7VNpS3a738L9pZCjg2kXIX4zoyHzkORUqCtr0Au7YsCnrlAMi1v2ALo7A==", - "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.20.7", "@babel/plugin-proposal-class-properties": "^7.16.5", @@ -10200,7 +10186,6 @@ }, "node_modules/ember-cli-babel/node_modules/@babel/runtime": { "version": "7.12.18", - "dev": true, "license": "MIT", "dependencies": { "regenerator-runtime": "^0.13.4" @@ -10210,7 +10195,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/resolve-package-path/-/resolve-package-path-4.0.3.tgz", "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", - "dev": true, "dependencies": { "path-root": "^0.1.1" }, @@ -11203,7 +11187,6 @@ }, "node_modules/ember-cli-version-checker": { "version": "5.1.2", - "dev": true, "license": "MIT", "dependencies": { "resolve-package-path": "^3.1.0", @@ -13943,7 +13926,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", - "dev": true, "engines": { "node": ">=0.8" }, @@ -15241,7 +15223,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.0.0.tgz", "integrity": "sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==", - "dev": true, "dependencies": { "json5": "^2.1.1", "path-exists": "^4.0.0" @@ -20363,7 +20344,6 @@ }, "node_modules/p-limit": { "version": "2.3.0", - "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -20416,7 +20396,6 @@ }, "node_modules/p-try": { "version": "2.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -20724,7 +20703,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -20846,7 +20824,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, "dependencies": { "find-up": "^3.0.0" }, @@ -20858,7 +20835,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -20870,7 +20846,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -20883,7 +20858,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -20895,7 +20869,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, "engines": { "node": ">=4" } @@ -22850,8 +22823,7 @@ "node_modules/reselect": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", - "dev": true + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" }, "node_modules/resolve": { "version": "1.22.8", @@ -23318,7 +23290,6 @@ }, "node_modules/semver": { "version": "7.5.4", - "dev": true, "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" @@ -23347,7 +23318,6 @@ }, "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", - "dev": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -26234,7 +26204,6 @@ }, "node_modules/workerpool": { "version": "6.5.1", - "dev": true, "license": "Apache-2.0" }, "node_modules/wrap-ansi": { @@ -26337,7 +26306,6 @@ }, "node_modules/yallist": { "version": "4.0.0", - "dev": true, "license": "ISC" }, "node_modules/yam": { diff --git a/package.json b/package.json index fc29953..1474cf8 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,8 @@ "@ember/string": "^3.0.0", "broccoli-funnel": "^3.0.3", "broccoli-merge-trees": "^4.2.0", - "broccoli-plugin": "^4.0.5" + "broccoli-plugin": "^4.0.5", + "ember-cli-babel": "^8.2.0" }, "devDependencies": { "@babel/eslint-parser": "^7.22.15", @@ -47,7 +48,6 @@ "concurrently": "^8.2.2", "ember-auto-import": "^2.6.3", "ember-cli": "~5.4.1", - "ember-cli-babel": "^8.2.0", "ember-cli-clean-css": "^3.0.0", "ember-cli-dependency-checker": "^3.3.2", "ember-cli-htmlbars": "^6.3.0", diff --git a/tests/acceptance/flush-deprecations-test.js b/tests/acceptance/flush-deprecations-test.js new file mode 100644 index 0000000..f407068 --- /dev/null +++ b/tests/acceptance/flush-deprecations-test.js @@ -0,0 +1,67 @@ +import { deprecate } from '@ember/debug'; +import { module } from 'qunit'; +import test from '../helpers/debug-test'; + +let originalWarn; + +module('flushDeprecations', function (hooks) { + hooks.beforeEach(function () { + originalWarn = window.Testem.handleConsoleMessage; + }); + + hooks.afterEach(function () { + window.deprecationWorkflow.deprecationLog = { messages: {} }; + window.Testem.handleConsoleMessage = originalWarn; + }); + + test('works', function (assert) { + deprecate('silence-strict', false, { + since: '2.0.0', + until: 'forever', + id: 'test', + for: 'testing', + }); + + deprecate('log-strict', false, { + since: '2.0.0', + until: 'forever', + id: 'test', + for: 'testing', + }); + + deprecate(' foo log-match foo', false, { + since: 'now', + until: 'forever', + id: 'test', + for: 'testing', + }); + + deprecate(' foo foo', false, { + since: 'now', + until: 'forever', + id: 'log-strict', + for: 'testing', + }); + + deprecate('arbitrary-unmatched-message', false, { + id: 'log-strict', + since: '2.0.0', + until: '3.0.0', + for: 'testing', + }); + + const deprecationsPayload = self.deprecationWorkflow.flushDeprecations(); + + assert.strictEqual( + deprecationsPayload, + `import setupDeprecationWorkflow from 'ember-cli-deprecation-workflow'; + +setupDeprecationWorkflow({ + workflow: [ + { handler: "silence", matchId: "test" }, + { handler: "silence", matchId: "log-strict" } + ] +});`, + ); + }); +}); diff --git a/tests/dummy/app/app.js b/tests/dummy/app/app.js index 523bad6..7c73522 100644 --- a/tests/dummy/app/app.js +++ b/tests/dummy/app/app.js @@ -2,6 +2,7 @@ import Application from '@ember/application'; import Resolver from 'ember-resolver'; import loadInitializers from 'ember-load-initializers'; import config from 'dummy/config/environment'; +import './deprecation-workflow'; export default class App extends Application { modulePrefix = config.modulePrefix; diff --git a/tests/dummy/config/deprecation-workflow.js b/tests/dummy/app/deprecation-workflow.js similarity index 87% rename from tests/dummy/config/deprecation-workflow.js rename to tests/dummy/app/deprecation-workflow.js index 27cf616..29c90a4 100644 --- a/tests/dummy/config/deprecation-workflow.js +++ b/tests/dummy/app/deprecation-workflow.js @@ -1,6 +1,6 @@ -/* globals self */ -self.deprecationWorkflow = self.deprecationWorkflow || {}; -self.deprecationWorkflow.config = { +import setupDeprecationWorkflow from 'ember-cli-deprecation-workflow'; + +setupDeprecationWorkflow({ throwOnUnhandled: true, workflow: [ /* @@ -26,4 +26,4 @@ self.deprecationWorkflow.config = { { matchMessage: 'throw-strict', handler: 'throw' }, ], -}; +}); diff --git a/tests/dummy/config/ember-try.js b/tests/dummy/config/ember-try.js index 9bf7607..726f53d 100644 --- a/tests/dummy/config/ember-try.js +++ b/tests/dummy/config/ember-try.js @@ -7,73 +7,6 @@ module.exports = async function () { let emberReleaseVersion = await getChannelURL('release'); return { scenarios: [ - { - name: 'ember-lts-2.12', - npm: { - devDependencies: { - '@ember/test-helpers': '^1.7.3', - 'ember-qunit': '^4.6.0', - 'ember-source': '~2.12.0', - qunit: null, - 'ember-cli': '^4.12.0', - 'ember-resolver': '8.1.0', - 'ember-page-title': '^7.0.0', - }, - }, - }, - { - name: 'ember-lts-2.18', - npm: { - devDependencies: { - '@ember/test-helpers': '^1.7.3', - 'ember-qunit': '^4.6.0', - 'ember-source': '~2.18.0', - qunit: null, - 'ember-cli': '^4.12.0', - 'ember-resolver': '8.1.0', - 'ember-page-title': '^7.0.0', - }, - }, - }, - { - name: 'ember-lts-3.16', - npm: { - devDependencies: { - 'ember-source': '~3.16.0', - 'ember-resolver': '8.1.0', - '@ember/test-helpers': '2.2.9', - 'ember-qunit': '~5.0.0', - 'ember-cli': '^4.12.0', - 'ember-page-title': '^7.0.0', - }, - }, - }, - { - name: 'ember-lts-3.20', - npm: { - devDependencies: { - 'ember-source': '~3.20.5', - 'ember-resolver': '8.1.0', - '@ember/test-helpers': '2.2.9', - 'ember-qunit': '~5.0.0', - 'ember-cli': '^4.12.0', - 'ember-page-title': '^7.0.0', - }, - }, - }, - { - name: 'ember-lts-3.24', - npm: { - devDependencies: { - 'ember-source': '~3.24.3', - 'ember-resolver': '8.1.0', - '@ember/test-helpers': '2.2.9', - 'ember-qunit': '~5.0.0', - 'ember-cli': '^4.12.0', - 'ember-page-title': '^7.0.0', - }, - }, - }, { name: 'ember-lts-3.28', npm: { @@ -114,6 +47,14 @@ module.exports = async function () { }, }, }, + { + name: 'ember-lts-5.4', + npm: { + devDependencies: { + 'ember-source': '~5.4.0', + }, + }, + }, { name: 'ember-release', npm: { diff --git a/tests/index.html b/tests/index.html index 8b41ac9..b74fc8b 100644 --- a/tests/index.html +++ b/tests/index.html @@ -20,6 +20,13 @@ {{content-for "body"}} {{content-for "test-body"}} +
+