From b4edd14e0c0474aadff4ee0e94f73165417de687 Mon Sep 17 00:00:00 2001 From: Gaurav Munjal Date: Thu, 29 Oct 2026 10:50:11 -0400 Subject: [PATCH 1/3] SCF-2416: upgrade ember-element-helper to ^0.8.7 0.8.7 is a v2 addon that no longer depends on @embroider/util. The element helper's API is unchanged. Co-Authored-By: Claude Opus 5.5 --- package.json | 2 +- yarn.lock | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 72639294a..719727e89 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "ember-cli-version-checker": "^5.1.2", "ember-concurrency": "^2.1.2", "ember-decorators": "^6.1.0", - "ember-element-helper": "^0.7.1", + "ember-element-helper": "^0.8.7", "ember-focus-trap": "^1.0.0", "ember-on-helper": "^0.1.0", "ember-popper-modifier": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index 8d3b570e1..d59e1846c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1044,7 +1044,7 @@ ember-cli-version-checker "^5.1.2" semver "^7.3.5" -"@embroider/addon-shim@1.10.2", "@embroider/addon-shim@1.8.3", "@embroider/addon-shim@^1.0.0", "@embroider/addon-shim@^1.8.7": +"@embroider/addon-shim@1.10.2", "@embroider/addon-shim@^1.0.0", "@embroider/addon-shim@^1.8.3", "@embroider/addon-shim@^1.8.7": version "1.10.2" resolved "https://registry.yarnpkg.com/@embroider/addon-shim/-/addon-shim-1.10.2.tgz#5164c65de0fd242422594c2f94b3c5eab4ab8e36" integrity sha512-EfI9cJ5/3QSUJtwm7x1MXrx3TEa2p7RNgSHefy7fvGm8/DP1xUFL25nST1NaHbHcqR1UhMlrTtv5iUIDoVzeQQ== @@ -1172,7 +1172,7 @@ lodash "^4.17.21" resolve "^1.20.0" -"@embroider/util@^0.39.1 || ^0.40.0 || ^0.41.0 || ^1.0.0", "@embroider/util@^1.13.3", "@embroider/util@^1.9.0": +"@embroider/util@^1.13.3", "@embroider/util@^1.9.0": version "1.13.3" resolved "https://registry.yarnpkg.com/@embroider/util/-/util-1.13.3.tgz#ac6a12f54097173167a9a1189a49ea6cd5b45755" integrity sha512-fb9S137zZqSI1IeWpGKVJ+WZHsRiIrD9D2A4aVwVH0dZeBKDg6lMaMN2MiXJ/ldUAG3DUFxnClnpiG5m2g3JFA== @@ -5100,13 +5100,12 @@ ember-destroyable-polyfill@^2.0.1, ember-destroyable-polyfill@^2.0.2, ember-dest ember-cli-version-checker "^5.1.1" ember-compatibility-helpers "^1.2.1" -ember-element-helper@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ember-element-helper/-/ember-element-helper-0.7.1.tgz#dcbfc6a07ed9d7c9e071df84845ba7b3de8892e8" - integrity sha512-vpD/ZVXU3MCbW/oKw/Wg2z3H/KHYIiO9ej28By1POnN+HVw4sHHJVStxgVoztiK1P43JoGRpyoJvMB986xrGSw== +ember-element-helper@^0.8.7: + version "0.8.8" + resolved "https://registry.yarnpkg.com/ember-element-helper/-/ember-element-helper-0.8.8.tgz#b7cb5a6450ec00ae6bc4974a5f6d7224aced8f35" + integrity sha512-3slTltQV5ke53t3YVP2GYoswsQ6y+lhuVzKmt09tbEx91DapG8I/xa8W5OA0StvcQlavL3/vHrz/vCQEFs8bBA== dependencies: - "@embroider/addon-shim" "1.8.3" - "@embroider/util" "^0.39.1 || ^0.40.0 || ^0.41.0 || ^1.0.0" + "@embroider/addon-shim" "^1.8.3" ember-focus-trap@^1.0.0: version "1.1.1" From e426144136f6c3f29d9b09508ccc01120f48d4ce Mon Sep 17 00:00:00 2001 From: Gaurav Munjal Date: Thu, 29 Oct 2026 10:53:40 -0400 Subject: [PATCH 2/3] SCF-2416: require Node 20 The SeeClickFix @embroider/util fork requires Node >= 20, and its dependency tree doesn't install on Node 18 with yarn v1: pkg-entry-points 1.1.2 needs Node >= 20.19.5, and every mktemp 2.x needs Node 20. engines.node and the README move to Node 20, and CI runs on Node 20. The pkg-entry-points 1.1.1 resolution only existed to keep installs working on Node 16/18, so it's dropped and the lockfile moves to 1.1.2. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/ci.yml | 6 +++--- README.md | 2 +- package.json | 3 +-- yarn.lock | 8 ++++---- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 572934af0..2cd171445 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: - name: Setup node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Setup yarn run: npm install -g yarn - name: Install dependencies @@ -41,7 +41,7 @@ jobs: - name: Setup node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Setup yarn run: npm install -g yarn - name: Install dependencies @@ -102,7 +102,7 @@ jobs: - name: Setup node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Setup yarn run: npm install -g yarn - name: Install dependencies diff --git a/README.md b/README.md index 969dcbd3d..bb6de3fe0 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Ember Bootstrap works and is fully [tested](https://github.com/kaliber5/ember-bo * Ember CLI 4.8 or above * Bootstrap 3-5 * all modern evergreen browsers (Chrome, Firefox, Safari, Edge) -* node.js 18+ +* node.js 20+ * FastBoot 4.0+ * Embroider: we strive (and test) for maximum compatibility with Embroider, including the most aggressive setting (`staticComponents`) for tree shaking and code splitting. However as Embroider itself is still considered beta software, diff --git a/package.json b/package.json index 719727e89..6fd69549d 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ "lodash": "^4.18.1", "testem": "~3.18.0", "@embroider/addon-shim": "1.10.2", - "pkg-entry-points": "1.1.1", "ember-a11y-testing/ember-auto-import": "^2.10.0", "@babel/plugin-transform-modules-systemjs": "^7.29.4", "browserslist": "^4.28.7", @@ -169,7 +168,7 @@ "ember-source": ">=4.8.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" }, "publishConfig": { "registry": "https://registry.npmjs.org" diff --git a/yarn.lock b/yarn.lock index d59e1846c..eaddbb8bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9580,10 +9580,10 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" -pkg-entry-points@1.1.1, pkg-entry-points@^1.1.0, pkg-entry-points@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pkg-entry-points/-/pkg-entry-points-1.1.1.tgz#d5cd87f934e873bf73143ed1d0baf637e5f8fda4" - integrity sha512-BhZa7iaPmB4b3vKIACoppyUoYn8/sFs17VJJtzrzPZvEnN2nqrgg911tdL65lA2m1ml6UI3iPeYbZQ4VXpn1mA== +pkg-entry-points@^1.1.0, pkg-entry-points@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pkg-entry-points/-/pkg-entry-points-1.1.2.tgz#82f259db7db02e0d1bebfb1b6610fb4983952f66" + integrity sha512-bmmM+SdLXNNetFr4o53QiiZRZicls2apmzj8HRpo4bU+3nJHiPO/omv8TXHIOzTcirua3YBAwTlKE+7zkICh4g== pkg-up@^2.0.0: version "2.0.0" From cbd26a6e77df9be786b3307e34a884dcb556b5a3 Mon Sep 17 00:00:00 2001 From: Gaurav Munjal Date: Fri, 30 Oct 2026 10:45:40 -0400 Subject: [PATCH 3/3] SCF-2416: switch @embroider/util to a fork and cap @embroider/macros @embroider/util 1.13.1-1.13.5 depend on ember-cli-babel 7, which pulls tmp 0.0.x and @babel/runtime 7.12 into every consumer install. 1.13.0 used ember-cli-babel 8, but 1.13.1 reverted that only to keep Node 12 working, and util won't be released again upstream. @embroider/util now comes from Gaurav0/embroider-util#v1.13.5-scf.1, a fork of 1.13.5 whose only changes are in package.json: ember-cli-babel ^8.3.2, @embroider/macros >=1.19.7 <1.21.0 and Node >= 20. Its runtime files are byte-identical to 1.13.0-1.13.5, and it keeps the @embroider/util name, so the ensure-safe-component helper that Embroider trusts by name is unchanged and no templates change. The fork moves to SeeClickFix/embroider-util before 5.0.0 is tagged. Unwrapping ensure-safe-component instead isn't an option for a v1 addon: Embroider's compat resolver only accepts (component (X ...)) when X is component or ensure-safe-component, so the 25 currying sites would fail with "Unsafe dynamic component". @embroider/macros moves from ^1.8.3 to >=1.19.7 <1.21.0 and stays in dependencies, since ember-cli only finds child addons there. - 1.18.1 fixed lazy importSync, which util relies on. - 1.19.7 is the first release that allows ember-cli-babel 8. - 1.21.0 turned macros into a v2 addon, which we're not taking yet. A ~1.20.7 resolution keeps dev dependencies from pulling a second 1.21.x copy, so the dummy app runs the macros version consumers get. New BsModal tests pass a curried (component "...") and a component class as @headerComponent (a currying site, onClose still reaches the custom header) and @bodyComponent (a plain site). Release notes: apps need @embroider/macros >= 1.18.1. Apps whose lockfile is older should run `yarn upgrade @embroider/macros`. ember-bootstrap now has a git dependency, so installs fetch the fork from GitHub. Co-Authored-By: Claude Opus 5.5 --- package.json | 7 +- tests/integration/components/bs-modal-test.js | 67 ++++++++++++++- yarn.lock | 86 +++++-------------- 3 files changed, 92 insertions(+), 68 deletions(-) diff --git a/package.json b/package.json index 6fd69549d..d5bec29d8 100644 --- a/package.json +++ b/package.json @@ -65,13 +65,14 @@ "markdown-it": "^14.3.3", "lodash.template": "^4.18.1", "ansi-html": "0.0.9", - "mocha/js-yaml": "^4.3.2" + "mocha/js-yaml": "^4.3.2", + "@embroider/macros": "~1.20.7" }, "dependencies": { "@babel/core": "^7.29.0", "@ember/render-modifiers": "^2.1.0", - "@embroider/macros": "^1.8.3", - "@embroider/util": "^1.13.3", + "@embroider/macros": ">=1.19.7 <1.21.0", + "@embroider/util": "Gaurav0/embroider-util#v1.13.5-scf.1", "broccoli-debug": "^0.6.3", "broccoli-funnel": "^3.0.6", "broccoli-merge-trees": "^4.2.0", diff --git a/tests/integration/components/bs-modal-test.js b/tests/integration/components/bs-modal-test.js index 6155fa4f7..bcb6bf23e 100644 --- a/tests/integration/components/bs-modal-test.js +++ b/tests/integration/components/bs-modal-test.js @@ -1,4 +1,5 @@ -import Component from '@ember/component'; +import Component, { setComponentTemplate } from '@ember/component'; +import GlimmerComponent from '@glimmer/component'; import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { render, click, find, triggerEvent, settled, waitFor, waitUntil } from '@ember/test-helpers'; @@ -106,6 +107,70 @@ module('Integration | Component | bs-modal', function (hooks) { assert.ok(submitAction.calledOnce, 'submit action has been called.'); }); + module('custom components', function (hooks) { + hooks.beforeEach(function () { + this.CustomHeader = setComponentTemplate( + hbs``, + class extends GlimmerComponent {} + ); + this.CustomBody = setComponentTemplate( + hbs``, + class extends GlimmerComponent {} + ); + this.hide = sinon.spy(); + }); + + test('it renders a curried @headerComponent and passes onClose', async function (assert) { + this.owner.register('component:test-component', this.CustomHeader); + + await render(hbs` + + + Hello world! + + `); + + assert.dom('.modal .custom-header').exists({ count: 1 }, 'custom header is rendered'); + await click('.modal .custom-close'); + assert.ok(this.hide.calledOnce, 'onHide has been called'); + }); + + test('it renders a component class passed as @headerComponent and passes onClose', async function (assert) { + await render(hbs` + + + Hello world! + + `); + + assert.dom('.modal .custom-header').exists({ count: 1 }, 'custom header is rendered'); + await click('.modal .custom-close'); + assert.ok(this.hide.calledOnce, 'onHide has been called'); + }); + + test('it renders a curried @bodyComponent', async function (assert) { + this.owner.register('component:test-component', this.CustomBody); + + await render(hbs` + + Hello world! + + `); + + assert.dom('.modal .custom-body').hasText('Hello world!', 'custom body is rendered'); + }); + + test('it renders a component class passed as @bodyComponent', async function (assert) { + await render(hbs` + + Hello world! + + `); + + assert.dom('.modal .custom-body').hasText('Hello world!', 'custom body is rendered'); + }); + }); + test('Modal has accesibility attributes with custom title', async function (assert) { await render(hbs` diff --git a/yarn.lock b/yarn.lock index eaddbb8bc..7b0f554d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1054,29 +1054,15 @@ common-ancestor-path "^1.0.1" semver "^7.3.8" -"@embroider/macros@^1.0.0", "@embroider/macros@^1.10.0", "@embroider/macros@^1.8.3": - version "1.18.0" - resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-1.18.0.tgz#d79c4474667559ac9baf903e8fb89f1b00a0c45a" - integrity sha512-KanP80XxNK4bmQ1HKTcUjy/cdCt9n7knPMLK1vzHdOFymACHo+GbhgUjXjYdOCuBTv+ZwcjL2P2XDmBcYS9r8g== +"@embroider/macros@>=1.19.7 <1.21.0", "@embroider/macros@^1.0.0", "@embroider/macros@^1.10.0", "@embroider/macros@~1.16.0", "@embroider/macros@~1.20.7": + version "1.20.7" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-1.20.7.tgz#70a56727b45903c5c1243026f411bd30844a0bd0" + integrity sha512-B9KJuqeODyad6rWYFK4yKKKSR9H2OsClMzHREmEx94FrwA9/PS37ebTHWeuzLKspas7UclpYE8sBmxSbi/pWig== dependencies: - "@embroider/shared-internals" "3.0.0" + "@embroider/shared-internals" "3.2.0" assert-never "^1.2.1" babel-import-util "^3.0.1" - ember-cli-babel "^7.26.6" - find-up "^5.0.0" - lodash "^4.17.21" - resolve "^1.20.0" - semver "^7.3.2" - -"@embroider/macros@~1.16.0": - version "1.16.13" - resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-1.16.13.tgz#3647839de7154400115e0b874bbf5aed9312a7a8" - integrity sha512-2oGZh0m1byBYQFWEa8b2cvHJB2LzaF3DdMCLCqcRAccABMROt1G3sultnNCT30NhfdGWMEsJOT3Jm4nFxXmTRw== - dependencies: - "@embroider/shared-internals" "2.9.0" - assert-never "^1.2.1" - babel-import-util "^2.0.0" - ember-cli-babel "^7.26.6" + ember-cli-babel "^7.26.6 || ^8.3.1" find-up "^5.0.0" lodash "^4.17.21" resolve "^1.20.0" @@ -1090,28 +1076,10 @@ mem "^8.0.0" resolve.exports "^2.0.2" -"@embroider/shared-internals@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-2.9.0.tgz#5d945b92e08db163de60d82f7c388e2b7260f0cc" - integrity sha512-8untWEvGy6av/oYibqZWMz/yB+LHsKxEOoUZiLvcpFwWj2Sipc0DcXeTJQZQZ++otNkLCWyDrDhOLrOkgjOPSg== - dependencies: - babel-import-util "^2.0.0" - debug "^4.3.2" - ember-rfc176-data "^0.3.17" - fs-extra "^9.1.0" - is-subdir "^1.2.0" - js-string-escape "^1.0.1" - lodash "^4.17.21" - minimatch "^3.0.4" - pkg-entry-points "^1.1.0" - resolve-package-path "^4.0.1" - semver "^7.3.5" - typescript-memoize "^1.0.1" - -"@embroider/shared-internals@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-3.0.0.tgz#98251e6b99d36d64120361a449569ef5384b3812" - integrity sha512-5J5ipUMCAinQS38WW7wedruq5Z4VnHvNo+ZgOduw0PtI9w0CQWx7/HE+98PBDW8jclikeF+aHwF317vc1hwuzg== +"@embroider/shared-internals@3.2.0", "@embroider/shared-internals@^3.0.1": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-3.2.0.tgz#2379a2f320a72289bde72005dce0835359396f6a" + integrity sha512-TzLZnwfhhrNkdTVGGyysovvciFCwyxEgMbzF9AZMzNbFlXirhocQSpGjy9V4AQArklu4wDFRYqqe5GMKULGIkw== dependencies: babel-import-util "^3.0.1" debug "^4.3.2" @@ -1121,7 +1089,7 @@ js-string-escape "^1.0.1" lodash "^4.17.21" minimatch "^3.0.4" - pkg-entry-points "^1.1.0" + pkg-entry-points "^1.1.1" resolve-package-path "^4.0.1" resolve.exports "^2.0.2" semver "^7.3.5" @@ -1145,25 +1113,6 @@ semver "^7.3.5" typescript-memoize "^1.0.1" -"@embroider/shared-internals@^3.0.1": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-3.2.0.tgz#2379a2f320a72289bde72005dce0835359396f6a" - integrity sha512-TzLZnwfhhrNkdTVGGyysovvciFCwyxEgMbzF9AZMzNbFlXirhocQSpGjy9V4AQArklu4wDFRYqqe5GMKULGIkw== - dependencies: - babel-import-util "^3.0.1" - debug "^4.3.2" - ember-rfc176-data "^0.3.17" - fs-extra "^9.1.0" - is-subdir "^1.2.0" - js-string-escape "^1.0.1" - lodash "^4.17.21" - minimatch "^3.0.4" - pkg-entry-points "^1.1.1" - resolve-package-path "^4.0.1" - resolve.exports "^2.0.2" - semver "^7.3.5" - typescript-memoize "^1.0.1" - "@embroider/test-setup@^3.0.2": version "3.0.3" resolved "https://registry.yarnpkg.com/@embroider/test-setup/-/test-setup-3.0.3.tgz#938f36db1578ad70f357a09ef4ebd16fca0434f9" @@ -1172,7 +1121,16 @@ lodash "^4.17.21" resolve "^1.20.0" -"@embroider/util@^1.13.3", "@embroider/util@^1.9.0": +"@embroider/util@Gaurav0/embroider-util#v1.13.5-scf.1": + version "1.13.5" + resolved "https://codeload.github.com/Gaurav0/embroider-util/tar.gz/87b98c66c11a25949ca9076b5bd1c64960e1d0b6" + dependencies: + "@babel/core" "^7.29.0" + "@embroider/macros" ">=1.19.7 <1.21.0" + broccoli-funnel "^3.0.5" + ember-cli-babel "^8.3.2" + +"@embroider/util@^1.9.0": version "1.13.3" resolved "https://registry.yarnpkg.com/@embroider/util/-/util-1.13.3.tgz#ac6a12f54097173167a9a1189a49ea6cd5b45755" integrity sha512-fb9S137zZqSI1IeWpGKVJ+WZHsRiIrD9D2A4aVwVH0dZeBKDg6lMaMN2MiXJ/ldUAG3DUFxnClnpiG5m2g3JFA== @@ -4594,7 +4552,7 @@ ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.13.0, ember- rimraf "^3.0.1" semver "^5.5.0" -ember-cli-babel@^8.3.2: +"ember-cli-babel@^7.26.6 || ^8.3.1", ember-cli-babel@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-8.3.2.tgz#e34944c104a280a3dcc7f1e3c136bdfb483901f7" integrity sha512-Thvqx+jwGYhimYbkkL0gwhwMlhghTIR3uQ9R0yNaTjBIttZIfSWJ/2W40kaJlwhnsElXq7zbFjZcff22p6nzCg==