diff --git a/.github/workflows/ci-jobs.yml b/.github/workflows/ci-jobs.yml
index c7b81878dc6..de5b6856e8b 100644
--- a/.github/workflows/ci-jobs.yml
+++ b/.github/workflows/ci-jobs.yml
@@ -220,6 +220,8 @@ jobs:
perf-check:
name: Perf script still works
runs-on: ubuntu-latest
+ timeout-minutes: 10
+ if: ${{ !startsWith(github.ref, 'refs/tags/') }} # Don't run on tags
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml
index 2ef53403460..afb8b104cac 100644
--- a/.github/workflows/cron.yml
+++ b/.github/workflows/cron.yml
@@ -21,7 +21,7 @@ jobs:
matrix:
branch: [main, beta, release]
steps:
- - uses: kategengler/ci-cron@d54b69bfd9147fb125899da4a2891f7fdf35f786 # v1.0.2
+ - uses: kategengler/ci-cron@181db7e5bac13d0b55b6f5c4a8567fd20154576b # v1.0.3
with:
branch: ${{ matrix.branch }}
# This must use a personal access token because of a Github Actions
diff --git a/.github/workflows/glimmer-syntax-prettier-smoke-test.yml b/.github/workflows/glimmer-syntax-prettier-smoke-test.yml
new file mode 100644
index 00000000000..3b87973841f
--- /dev/null
+++ b/.github/workflows/glimmer-syntax-prettier-smoke-test.yml
@@ -0,0 +1,68 @@
+# aka: our primary CLI-land consumer of @glimmer/syntax
+name: "Prettier Smoke Test"
+
+on:
+ push:
+ branches:
+ - main
+ - beta
+ - release
+ - release*
+ - lts*
+ paths:
+ - ".github/workflows/glimmer-syntax-prettier-smoke-test.yml"
+ - ".github/actions/setup/**"
+ - "rollup.config.mjs"
+ - "packages/@glimmer/syntax/**"
+ - "packages/@glimmer/interfaces/**"
+ - "packages/@glimmer/util/**"
+ - "packages/@glimmer/wire-format/**"
+ - "packages/@handlebars/parser/**"
+ pull_request:
+ paths:
+ - ".github/workflows/glimmer-syntax-prettier-smoke-test.yml"
+ - ".github/actions/setup/**"
+ - "rollup.config.mjs"
+ - "packages/@glimmer/syntax/**"
+ - "packages/@glimmer/interfaces/**"
+ - "packages/@glimmer/util/**"
+ - "packages/@glimmer/wire-format/**"
+ - "packages/@handlebars/parser/**"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ prettier-smoke-test:
+ name: Prettier handlebars smoke test
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ persist-credentials: false
+ - uses: ./.github/actions/setup
+ - run: pnpm build
+
+ - name: Pack @glimmer/syntax
+ working-directory: packages/@glimmer/syntax
+ run: pnpm pack --out ${{ github.workspace }}/glimmer-syntax.tgz
+
+ - name: Checkout prettier/prettier
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ persist-credentials: false
+ repository: prettier/prettier
+ path: prettier-repo
+
+ - name: Install prettier dependencies
+ working-directory: prettier-repo
+ run: yarn install
+
+ - name: Install local @glimmer/syntax into prettier
+ working-directory: prettier-repo
+ run: yarn add "@glimmer/syntax@file:${{ github.workspace }}/glimmer-syntax.tgz"
+
+ - name: Run prettier handlebars tests
+ working-directory: prettier-repo
+ run: yarn jest tests/format/handlebars
diff --git a/.github/workflows/pr-title-lint.yml b/.github/workflows/pr-title-lint.yml
index 8a05789535b..7bdc129946f 100644
--- a/.github/workflows/pr-title-lint.yml
+++ b/.github/workflows/pr-title-lint.yml
@@ -1,7 +1,7 @@
name: PR Title Lint
on:
- pull_request:
+ pull_request_target: # This workflow has permissions on the repo, do NOT run code from PRs in this workflow. See https://securitylab.github.com/research/github-actions-preventing-pwn-requests/ # zizmor: ignore[dangerous-triggers] we know what we are doing here
types: [opened, edited, reopened, synchronize]
permissions:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 61b42db7a62..3a554090b6e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
# Ember Changelog
+## v6.12.0-beta.2 (March 9, 2026)
+
+- [#21144](https://github.com/emberjs/ember.js/pull/21144) [BUGFIX] Fix crash *during* destroy in fastboot
+
+## v6.12.0-beta.1 (February 17, 2026)
- [#20908](https://github.com/emberjs/ember.js/pull/20908) / [#21020](https://github.com/emberjs/ember.js/pull/21020) Merge [glimmerjs/glimmer-vm](https://github.com/glimmerjs/glimmer-vm) into the `emberjs/ember.js` monorepo.
- All `@glimmer/*` packages that were formerly dependencies of `ember-source` are now included in the monorepo. This enables us to more easily iterate
on the Glimmer VM and related packages, avoid an integration step with `ember.js` and to more easily share code between them and `ember-source`.
diff --git a/bin/benchmark/run.mjs b/bin/benchmark/run.mjs
index a31d121e975..04c7c8b929d 100644
--- a/bin/benchmark/run.mjs
+++ b/bin/benchmark/run.mjs
@@ -171,24 +171,6 @@ async function bootAndRun({ headless = true } = {}) {
'--debug',
'--browserArgs',
[
- '--no-sandbox',
- '--crash-dumps-dir=./tmp',
- // Disable task throttling (also in TracerBench defaults, but explicit here for clarity)
- '--disable-background-timer-throttling',
- '--disable-backgrounding-occluded-windows',
- '--disable-renderer-backgrounding',
- // Disable caching and unnecessary subsystems
- '--disable-dev-shm-usage',
- '--disable-cache',
- '--disable-v8-idle-tasks',
- '--disable-breakpad',
- '--disable-component-update',
- '--disable-background-networking',
- '--disable-notifications',
- '--disable-hang-monitor',
- '--safebrowsing-disable-auto-update',
- '--ignore-certificate-errors',
- '--v8-cache-options=none',
// Use the new headless mode to support multiple targets
...(headless ? ['--headless=new'] : []),
// GPU: use software rendering via SwiftShader, but do NOT
@@ -196,11 +178,6 @@ async function bootAndRun({ headless = true } = {}) {
// as the contradictory flags cause use-after-free crashes on macOS
'--disable-gpu',
'--disable-gpu-compositing',
- // Disable Chrome ML/TFLite features (suppresses XNNPACK/TFLite init)
- '--disable-features=TranslateUI',
- '--disable-features=UseChromiumML',
- '--disable-features=UseTfLite',
- '--disable-features=TensorFlowLite',
].join(','),
];
diff --git a/eslint.config.mjs b/eslint.config.mjs
index 2915043fe27..160c3340173 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -154,6 +154,11 @@ export default [
Symbol: true,
WeakMap: true,
Event: true,
+ MouseEvent: true,
+ KeyboardEvent: true,
+ DOMRect: true,
+ DOMRectList: true,
+ globalThis: true,
},
ecmaVersion: 2017,
diff --git a/node-tests/blueprints/component-test-test.js b/node-tests/blueprints/component-test-test.js
index 99c4a9273b6..5494e76f997 100644
--- a/node-tests/blueprints/component-test-test.js
+++ b/node-tests/blueprints/component-test-test.js
@@ -20,11 +20,12 @@ describe('Blueprint: component-test', function () {
it('component-test foo', function () {
return emberGenerateDestroy(['component-test', 'foo'], (_file) => {
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -34,7 +35,13 @@ describe('Blueprint: component-test', function () {
it('component-test foo --strict', function () {
return emberGenerateDestroy(['component-test', 'foo', '--strict'], (_file) => {
expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
- fixture('component-test/app.gjs')
+ fixture('component-test/app.gjs', {
+ replace: {
+ component: 'foo',
+ componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
+ },
+ })
);
});
});
@@ -50,8 +57,35 @@ describe('Blueprint: component-test', function () {
);
});
+ it('component-test foo --loose', function () {
+ return emberGenerateDestroy(['component-test', 'foo', '--loose'], (_file) => {
+ expect(_file('tests/integration/components/foo-test.js')).to.equal(
+ fixture('component-test/app.js', {
+ replace: {
+ component: 'foo',
+ componentInvocation: 'Foo',
+ },
+ })
+ );
+ });
+ });
+
it('component-test x-foo --unit', function () {
return emberGenerateDestroy(['component-test', 'x-foo', '--unit'], (_file) => {
+ expect(_file('tests/unit/components/x-foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
+ replace: {
+ component: 'x-foo',
+ componentInvocation: 'XFoo',
+ testDescription: 'Unit | Component | x-foo',
+ },
+ })
+ );
+ });
+ });
+
+ it('component-test x-foo --unit --loose', function () {
+ return emberGenerateDestroy(['component-test', 'x-foo', '--unit', '--loose'], (_file) => {
expect(_file('tests/unit/components/x-foo-test.js')).to.equal(
fixture('component-test/unit.js')
);
@@ -66,11 +100,12 @@ describe('Blueprint: component-test', function () {
it('component-test foo', function () {
return emberGenerateDestroy(['component-test', 'foo'], (_file) => {
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/addon.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/addon.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -79,8 +114,14 @@ describe('Blueprint: component-test', function () {
it('component-test foo --unit', function () {
return emberGenerateDestroy(['component-test', 'foo', '--unit'], (_file) => {
- expect(_file('tests/unit/components/foo-test.js')).to.equal(
- fixture('component-test/addon-unit.js')
+ expect(_file('tests/unit/components/foo-test.gjs')).to.equal(
+ fixture('component-test/addon.gjs', {
+ replace: {
+ component: 'foo',
+ componentInvocation: 'Foo',
+ testDescription: 'Unit | Component | foo',
+ },
+ })
);
});
});
@@ -88,7 +129,13 @@ describe('Blueprint: component-test', function () {
it('component-test foo --strict', function () {
return emberGenerateDestroy(['component-test', 'foo', '--strict'], (_file) => {
expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
- fixture('component-test/addon.gjs')
+ fixture('component-test/addon.gjs', {
+ replace: {
+ component: 'foo',
+ componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
+ },
+ })
);
});
});
@@ -103,6 +150,27 @@ describe('Blueprint: component-test', function () {
}
);
});
+
+ it('component-test foo --loose', function () {
+ return emberGenerateDestroy(['component-test', 'foo', '--loose'], (_file) => {
+ expect(_file('tests/integration/components/foo-test.js')).to.equal(
+ fixture('component-test/addon.js', {
+ replace: {
+ component: 'foo',
+ componentInvocation: 'Foo',
+ },
+ })
+ );
+ });
+ });
+
+ it('component-test foo --unit --loose', function () {
+ return emberGenerateDestroy(['component-test', 'foo', '--unit', '--loose'], (_file) => {
+ expect(_file('tests/unit/components/foo-test.js')).to.equal(
+ fixture('component-test/addon-unit.js')
+ );
+ });
+ });
});
describe('in in-repo-addon', function () {
@@ -114,11 +182,12 @@ describe('Blueprint: component-test', function () {
return emberGenerateDestroy(
['component-test', 'foo', '--in-repo-addon=my-addon'],
(_file) => {
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -129,6 +198,39 @@ describe('Blueprint: component-test', function () {
it('component-test x-foo --in-repo-addon=my-addon --unit', function () {
return emberGenerateDestroy(
['component-test', 'x-foo', '--in-repo-addon=my-addon', '--unit'],
+ (_file) => {
+ expect(_file('tests/unit/components/x-foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
+ replace: {
+ component: 'x-foo',
+ componentInvocation: 'XFoo',
+ testDescription: 'Unit | Component | x-foo',
+ },
+ })
+ );
+ }
+ );
+ });
+
+ it('component-test foo --in-repo-addon=my-addon --loose', function () {
+ return emberGenerateDestroy(
+ ['component-test', 'foo', '--in-repo-addon=my-addon', '--loose'],
+ (_file) => {
+ expect(_file('tests/integration/components/foo-test.js')).to.equal(
+ fixture('component-test/app.js', {
+ replace: {
+ component: 'foo',
+ componentInvocation: 'Foo',
+ },
+ })
+ );
+ }
+ );
+ });
+
+ it('component-test x-foo --in-repo-addon=my-addon --unit --loose', function () {
+ return emberGenerateDestroy(
+ ['component-test', 'x-foo', '--in-repo-addon=my-addon', '--unit', '--loose'],
(_file) => {
expect(_file('tests/unit/components/x-foo-test.js')).to.equal(
fixture('component-test/unit.js')
diff --git a/node-tests/blueprints/component-test.js b/node-tests/blueprints/component-test.js
index 6faf3d9b4d5..db01ff0db12 100644
--- a/node-tests/blueprints/component-test.js
+++ b/node-tests/blueprints/component-test.js
@@ -11,21 +11,11 @@ const expect = chai.expect;
const fixture = require('../helpers/fixture');
-const glimmerComponentContents = `import Component from '@glimmer/component';
-
-export default class Foo extends Component {}
-`;
-
const emberComponentContents = `import Component from '@ember/component';
export default class extends Component {}
`;
-const templateOnlyContents = `import templateOnly from '@ember/component/template-only';
-
-export default templateOnly();
-`;
-
describe('Blueprint: component', function () {
setupTestHooks(this);
@@ -37,13 +27,16 @@ describe('Blueprint: component', function () {
it('component foo', function () {
return emberGenerateDestroy(['component', 'foo'], (_file) => {
expect(_file('app/components/foo.js')).to.not.exist;
- expect(_file('app/components/foo.hbs')).to.equal('{{yield}}');
+ expect(_file('app/components/foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -61,15 +54,18 @@ describe('Blueprint: component', function () {
'foo',
],
(_file) => {
- expect(_file('app/components/foo.js')).to.equal(glimmerComponentContents);
-
- expect(_file('app/components/foo.hbs')).to.equal('{{yield}}');
+ expect(_file('app/components/foo.js')).to.not.exist;
+ expect(_file('app/components/foo.hbs')).to.not.exist;
+ expect(_file('app/components/foo.gjs')).to.equal(
+ fixture('component/glimmer-component.gjs')
+ );
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -81,13 +77,16 @@ describe('Blueprint: component', function () {
return emberGenerateDestroy(
['component', '--component-structure', 'flat', 'foo'],
(_file) => {
- expect(_file('app/components/foo.hbs')).to.equal('{{yield}}');
+ expect(_file('app/components/foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -99,13 +98,16 @@ describe('Blueprint: component', function () {
return emberGenerateDestroy(
['component', '--component-structure', 'nested', 'foo'],
(_file) => {
- expect(_file('app/components/foo/index.hbs')).to.equal('{{yield}}');
+ expect(_file('app/components/foo/index.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -115,7 +117,7 @@ describe('Blueprint: component', function () {
it('component foo --component-class=@ember/component', function () {
return emberGenerateDestroy(
- ['component', '--component-class', '@ember/component', 'foo'],
+ ['component', '--component-class', '@ember/component', '--loose', 'foo'],
(_file) => {
expect(_file('app/components/foo.js')).to.equal(emberComponentContents);
@@ -137,15 +139,18 @@ describe('Blueprint: component', function () {
return emberGenerateDestroy(
['component', '--component-class', '@glimmer/component', 'foo'],
(_file) => {
- expect(_file('app/components/foo.js')).to.equal(glimmerComponentContents);
-
- expect(_file('app/components/foo.hbs')).to.equal('{{yield}}');
+ expect(_file('app/components/foo.js')).to.not.exist;
+ expect(_file('app/components/foo.hbs')).to.not.exist;
+ expect(_file('app/components/foo.gjs')).to.equal(
+ fixture('component/glimmer-component.gjs')
+ );
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -157,15 +162,18 @@ describe('Blueprint: component', function () {
return emberGenerateDestroy(
['component', '--component-class', '@ember/component/template-only', 'foo'],
(_file) => {
- expect(_file('app/components/foo.js')).to.equal(templateOnlyContents);
-
- expect(_file('app/components/foo.hbs')).to.equal('{{yield}}');
+ expect(_file('app/components/foo.js')).to.not.exist;
+ expect(_file('app/components/foo.hbs')).to.not.exist;
+ expect(_file('app/components/foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -177,13 +185,16 @@ describe('Blueprint: component', function () {
return emberGenerateDestroy(['component', '--no-component-class', 'foo'], (_file) => {
expect(_file('app/components/foo.js')).to.not.exist;
- expect(_file('app/components/foo.hbs')).to.equal('{{yield}}');
+ expect(_file('app/components/foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -193,13 +204,16 @@ describe('Blueprint: component', function () {
it('component x-foo', function () {
return emberGenerateDestroy(['component', 'x-foo'], (_file) => {
expect(_file('app/components/x-foo.js')).to.not.exist;
- expect(_file('app/components/x-foo.hbs')).to.equal('{{yield}}');
+ expect(_file('app/components/x-foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
- expect(_file('tests/integration/components/x-foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/x-foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'x-foo',
componentInvocation: 'XFoo',
+ testDescription: 'Integration | Component | x-foo',
},
})
);
@@ -213,13 +227,16 @@ describe('Blueprint: component', function () {
expect(_file('app/templates/components/x-foo.js.hbs')).to.not.exist;
expect(_file('tests/integration/components/x-foo-test.js.js')).to.not.exist;
- expect(_file('app/components/x-foo.hbs')).to.equal('{{yield}}');
+ expect(_file('app/components/x-foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
- expect(_file('tests/integration/components/x-foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/x-foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'x-foo',
componentInvocation: 'XFoo',
+ testDescription: 'Integration | Component | x-foo',
},
})
);
@@ -229,13 +246,16 @@ describe('Blueprint: component', function () {
it('component foo/x-foo', function () {
return emberGenerateDestroy(['component', 'foo/x-foo'], (_file) => {
expect(_file('app/components/foo/x-foo.js')).to.not.exist;
- expect(_file('app/components/foo/x-foo.hbs')).to.equal('{{yield}}');
+ expect(_file('app/components/foo/x-foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
- expect(_file('tests/integration/components/foo/x-foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo/x-foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo/x-foo',
- componentInvocation: 'Foo::XFoo',
+ componentInvocation: 'XFoo',
+ testDescription: 'Integration | Component | foo/x-foo',
},
})
);
@@ -246,16 +266,18 @@ describe('Blueprint: component', function () {
return emberGenerateDestroy(
['component', 'foo/x-foo', '--component-class', '@glimmer/component'],
(_file) => {
- expect(_file('app/components/foo/x-foo.js')).to.equal(
- glimmerComponentContents.replace('Foo', 'FooXFoo')
+ expect(_file('app/components/foo/x-foo.js')).to.not.exist;
+ expect(_file('app/components/foo/x-foo.hbs')).to.not.exist;
+ expect(_file('app/components/foo/x-foo.gjs')).to.equal(
+ fixture('component/glimmer-component.gjs', {}).replace('Foo', 'FooXFoo')
);
- expect(_file('app/components/foo/x-foo.hbs')).to.equal('{{yield}}');
- expect(_file('tests/integration/components/foo/x-foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo/x-foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo/x-foo',
- componentInvocation: 'Foo::XFoo',
+ componentInvocation: 'XFoo',
+ testDescription: 'Integration | Component | foo/x-foo',
},
})
);
@@ -270,7 +292,13 @@ describe('Blueprint: component', function () {
);
expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
- fixture('component-test/app.gjs')
+ fixture('component-test/app.gjs', {
+ replace: {
+ component: 'foo',
+ componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
+ },
+ })
);
});
});
@@ -284,7 +312,13 @@ describe('Blueprint: component', function () {
);
expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
- fixture('component-test/app.gjs')
+ fixture('component-test/app.gjs', {
+ replace: {
+ component: 'foo',
+ componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
+ },
+ })
);
}
);
@@ -335,7 +369,9 @@ describe('Blueprint: component', function () {
return emberGenerateDestroy(['component', 'foo'], (_file) => {
expect(_file('addon/components/foo.js')).to.not.exist;
- expect(_file('addon/components/foo.hbs')).to.equal('{{yield}}');
+ expect(_file('addon/components/foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
expect(_file('app/components/foo.js')).to.contain(
"export { default } from 'my-addon/components/foo';"
@@ -343,11 +379,12 @@ describe('Blueprint: component', function () {
expect(_file('app/templates/components/foo.js')).to.not.exist;
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/addon.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/addon.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -358,7 +395,9 @@ describe('Blueprint: component', function () {
return emberGenerateDestroy(['component', 'x-foo'], (_file) => {
expect(_file('addon/components/x-foo.js')).to.not.exist;
- expect(_file('addon/components/x-foo.hbs')).to.equal('{{yield}}');
+ expect(_file('addon/components/x-foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
expect(_file('app/components/x-foo.js')).to.contain(
"export { default } from 'my-addon/components/x-foo';"
@@ -367,11 +406,12 @@ describe('Blueprint: component', function () {
expect(_file('app/templates/components/x-foo.js')).to.not.exist;
expect(_file('app/components/x-foo.hbs')).to.not.exist;
- expect(_file('tests/integration/components/x-foo-test.js')).to.equal(
- fixture('component-test/addon.js', {
+ expect(_file('tests/integration/components/x-foo-test.gjs')).to.equal(
+ fixture('component-test/addon.gjs', {
replace: {
component: 'x-foo',
componentInvocation: 'XFoo',
+ testDescription: 'Integration | Component | x-foo',
},
})
);
@@ -439,7 +479,9 @@ describe('Blueprint: component', function () {
return emberGenerateDestroy(['component', 'foo/x-foo'], (_file) => {
expect(_file('addon/components/foo/x-foo.js')).to.not.exist;
- expect(_file('addon/components/foo/x-foo.hbs')).to.equal('{{yield}}');
+ expect(_file('addon/components/foo/x-foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
expect(_file('app/components/foo/x-foo.js')).to.contain(
"export { default } from 'my-addon/components/foo/x-foo';"
@@ -447,11 +489,12 @@ describe('Blueprint: component', function () {
expect(_file('app/templates/components/foo/x-foo.js')).to.not.exist;
- expect(_file('tests/integration/components/foo/x-foo-test.js')).to.equal(
- fixture('component-test/addon.js', {
+ expect(_file('tests/integration/components/foo/x-foo-test.gjs')).to.equal(
+ fixture('component-test/addon.gjs', {
replace: {
component: 'foo/x-foo',
- componentInvocation: 'Foo::XFoo',
+ componentInvocation: 'XFoo',
+ testDescription: 'Integration | Component | foo/x-foo',
},
})
);
@@ -462,7 +505,9 @@ describe('Blueprint: component', function () {
return emberGenerateDestroy(['component', 'x-foo', '--dummy'], (_file) => {
expect(_file('tests/dummy/app/components/x-foo.js')).to.not.exist;
- expect(_file('tests/dummy/app/components/x-foo.hbs')).to.equal('{{yield}}');
+ expect(_file('tests/dummy/app/components/x-foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
expect(_file('app/components/x-foo.js')).to.not.exist;
expect(_file('app/components/x-foo.hbs')).to.not.exist;
@@ -476,7 +521,9 @@ describe('Blueprint: component', function () {
return emberGenerateDestroy(['component', 'foo/x-foo', '--dummy'], (_file) => {
expect(_file('tests/dummy/app/components/foo/x-foo.js')).to.not.exist;
- expect(_file('tests/dummy/app/components/foo/x-foo.hbs')).to.equal('{{yield}}');
+ expect(_file('tests/dummy/app/components/foo/x-foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
expect(_file('tests/dummy/app/templates/components/foo/x-foo.hbs')).to.not.exist;
expect(_file('app/components/foo/x-foo.js')).to.not.exist;
@@ -496,7 +543,9 @@ describe('Blueprint: component', function () {
it('component foo --in-repo-addon=my-addon', function () {
return emberGenerateDestroy(['component', 'foo', '--in-repo-addon=my-addon'], (_file) => {
expect(_file('lib/my-addon/addon/components/foo.js')).to.not.exist;
- expect(_file('lib/my-addon/addon/components/foo.hbs')).to.equal('{{yield}}');
+ expect(_file('lib/my-addon/addon/components/foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
expect(_file('lib/my-addon/addon/templates/components/foo.hbs')).to.not.exist;
expect(_file('lib/my-addon/app/components/foo.js')).to.contain(
@@ -506,11 +555,12 @@ describe('Blueprint: component', function () {
expect(_file('lib/my-addon/app/templates/components/foo.js')).to.not.exist;
expect(_file('lib/my-addon/app/components/foo.hbs')).to.not.exist;
- expect(_file('tests/integration/components/foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'foo',
componentInvocation: 'Foo',
+ testDescription: 'Integration | Component | foo',
},
})
);
@@ -520,7 +570,9 @@ describe('Blueprint: component', function () {
it('component x-foo --in-repo-addon=my-addon', function () {
return emberGenerateDestroy(['component', 'x-foo', '--in-repo-addon=my-addon'], (_file) => {
expect(_file('lib/my-addon/addon/components/x-foo.js')).to.not.exist;
- expect(_file('lib/my-addon/addon/components/x-foo.hbs')).to.equal('{{yield}}');
+ expect(_file('lib/my-addon/addon/components/x-foo.gjs')).to.equal(
+ fixture('component/template-only-component.gjs')
+ );
expect(_file('lib/my-addon/addon/templates/components/x-foo.hbs')).to.not.exist;
expect(_file('lib/my-addon/app/components/x-foo.js')).to.contain(
@@ -530,11 +582,12 @@ describe('Blueprint: component', function () {
expect(_file('lib/my-addon/app/templates/components/x-foo.js')).to.not.exist;
expect(_file('lib/my-addon/app/components/x-foo.hbs')).to.not.exist;
- expect(_file('tests/integration/components/x-foo-test.js')).to.equal(
- fixture('component-test/app.js', {
+ expect(_file('tests/integration/components/x-foo-test.gjs')).to.equal(
+ fixture('component-test/app.gjs', {
replace: {
component: 'x-foo',
componentInvocation: 'XFoo',
+ testDescription: 'Integration | Component | x-foo',
},
})
);
diff --git a/node-tests/blueprints/route-test.js b/node-tests/blueprints/route-test.js
index c018165bf66..47dcd142156 100644
--- a/node-tests/blueprints/route-test.js
+++ b/node-tests/blueprints/route-test.js
@@ -16,6 +16,13 @@ const fs = require('fs-extra');
const fixture = require('../helpers/fixture');
+function strictRouteTemplate(routeName, { addTitle = true } = {}) {
+ if (addTitle) {
+ return `import { pageTitle } from 'ember-page-title';\n\n\n {{pageTitle "${routeName}"}}\n {{outlet}}\n\n`;
+ }
+ return '\n {{outlet}}\n\n';
+}
+
describe('Blueprint: route', function () {
setupTestHooks(this);
@@ -28,7 +35,7 @@ describe('Blueprint: route', function () {
return emberGenerateDestroy(['route', 'foo'], (_file) => {
expect(_file('app/routes/foo.js')).to.equal(fixture('route/route.js'));
- expect(_file('app/templates/foo.hbs')).to.equal('{{page-title "Foo"}}\n{{outlet}}');
+ expect(_file('app/templates/foo.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('tests/unit/routes/foo-test.js')).to.equal(fixture('route-test/app.js'));
@@ -46,7 +53,7 @@ describe('Blueprint: route', function () {
expect(_file('app/routes/foo.js')).to.equal(fixture('route/route.js'));
- expect(_file('app/templates/foo.hbs')).to.equal('{{page-title "Foo"}}\n{{outlet}}');
+ expect(_file('app/templates/foo.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('tests/unit/routes/foo-test.js')).to.equal(fixture('route-test/app.js'));
@@ -60,7 +67,7 @@ describe('Blueprint: route', function () {
it('route foo --skip-router', function () {
return emberGenerateDestroy(['route', 'foo', '--skip-router'], (_file) => {
expect(_file('app/routes/foo.js')).to.exist;
- expect(_file('app/templates/foo.hbs')).to.exist;
+ expect(_file('app/templates/foo.gjs')).to.exist;
expect(_file('tests/unit/routes/foo-test.js')).to.exist;
expect(file('app/router.js')).to.not.contain("this.route('foo')");
}).then(() => {
@@ -72,7 +79,7 @@ describe('Blueprint: route', function () {
return emberGenerateDestroy(['route', 'foo', '--path=:foo_id/show'], (_file) => {
expect(_file('app/routes/foo.js')).to.equal(fixture('route/route-with-dynamic-segment.js'));
- expect(_file('app/templates/foo.hbs')).to.equal('{{page-title "Foo"}}\n{{outlet}}');
+ expect(_file('app/templates/foo.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('tests/unit/routes/foo-test.js')).to.equal(fixture('route-test/app.js'));
@@ -91,7 +98,7 @@ describe('Blueprint: route', function () {
return emberGenerateDestroy(['route', 'parent/child', '--reset-namespace'], (_file) => {
expect(_file('app/routes/child.js')).to.equal(fixture('route/route-child.js'));
- expect(_file('app/templates/child.hbs')).to.equal('{{page-title "Child"}}\n{{outlet}}');
+ expect(_file('app/templates/child.gjs')).to.equal(strictRouteTemplate('Child'));
expect(_file('tests/unit/routes/child-test.js')).to.equal(fixture('route-test/child.js'));
@@ -109,7 +116,7 @@ describe('Blueprint: route', function () {
(_file) => {
expect(_file('app/child/route.js')).to.equal(fixture('route/route-child.js'));
- expect(_file('app/child/template.hbs')).to.equal('{{page-title "Child"}}\n{{outlet}}');
+ expect(_file('app/child/template.gjs')).to.equal(strictRouteTemplate('Child'));
expect(_file('tests/unit/child/route-test.js')).to.equal(fixture('route-test/child.js'));
@@ -125,7 +132,7 @@ describe('Blueprint: route', function () {
it('route index', function () {
return emberGenerateDestroy(['route', 'index'], (_file) => {
expect(_file('app/routes/index.js')).to.exist;
- expect(_file('app/templates/index.hbs')).to.exist;
+ expect(_file('app/templates/index.gjs')).to.exist;
expect(_file('tests/unit/routes/index-test.js')).to.exist;
expect(file('app/router.js')).to.not.contain("this.route('index')");
}).then(() => {
@@ -134,7 +141,7 @@ describe('Blueprint: route', function () {
});
it('route application', function () {
- fs.removeSync('app/templates/application.hbs');
+ fs.removeSync('app/templates/application.gjs');
return emberGenerate(['route', 'application']).then(() => {
expect(file('app/router.js')).to.not.contain("this.route('application')");
});
@@ -228,7 +235,7 @@ describe('Blueprint: route', function () {
expect(_file('app/foo/route.js')).to.equal(fixture('route/route.js'));
- expect(_file('app/foo/template.hbs')).to.equal('{{page-title "Foo"}}\n{{outlet}}');
+ expect(_file('app/foo/template.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('tests/unit/foo/route-test.js')).to.equal(fixture('route-test/app.js'));
@@ -246,7 +253,7 @@ describe('Blueprint: route', function () {
expect(_file('app/foo/route.js')).to.equal(fixture('route/route.js'));
- expect(_file('app/foo/template.hbs')).to.equal('{{page-title "Foo"}}\n{{outlet}}');
+ expect(_file('app/foo/template.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('tests/unit/foo/route-test.js')).to.equal(fixture('route-test/app.js'));
@@ -283,7 +290,7 @@ describe('Blueprint: route', function () {
it('route application --pod', function () {
return emberGenerate(['route', 'application', '--pod'])
.then(() => expect(file('app/application/route.js')).to.exist)
- .then(() => expect(file('app/application/template.hbs')).to.exist)
+ .then(() => expect(file('app/application/template.gjs')).to.exist)
.then(() => expect(file('app/router.js')).to.not.contain("this.route('application')"));
});
@@ -303,7 +310,7 @@ describe('Blueprint: route', function () {
return emberGenerateDestroy(['route', 'foo', '--pod'], (_file) => {
expect(_file('app/pods/foo/route.js')).to.equal(fixture('route/route.js'));
- expect(_file('app/pods/foo/template.hbs')).to.equal('{{page-title "Foo"}}\n{{outlet}}');
+ expect(_file('app/pods/foo/template.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('tests/unit/pods/foo/route-test.js')).to.equal(fixture('route-test/app.js'));
@@ -321,7 +328,7 @@ describe('Blueprint: route', function () {
expect(_file('app/pods/foo/route.js')).to.equal(fixture('route/route.js'));
- expect(_file('app/pods/foo/template.hbs')).to.equal('{{page-title "Foo"}}\n{{outlet}}');
+ expect(_file('app/pods/foo/template.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('tests/unit/pods/foo/route-test.js')).to.equal(fixture('route-test/app.js'));
@@ -339,13 +346,17 @@ describe('Blueprint: route', function () {
it('route foo', function () {
return emberGenerateDestroy(['route', 'foo'], (_file) => {
- expect(_file('app/templates/foo.hbs')).to.equal('{{outlet}}');
+ expect(_file('app/templates/foo.gjs')).to.equal(
+ strictRouteTemplate('Foo', { addTitle: false })
+ );
});
});
it('route foo/bar', function () {
return emberGenerateDestroy(['route', 'foo/bar'], (_file) => {
- expect(_file('app/templates/foo/bar.hbs')).to.equal('{{outlet}}');
+ expect(_file('app/templates/foo/bar.gjs')).to.equal(
+ strictRouteTemplate('Bar', { addTitle: false })
+ );
});
});
});
@@ -387,7 +398,7 @@ describe('Blueprint: route', function () {
return emberGenerateDestroy(['route', 'foo'], (_file) => {
expect(_file('addon/routes/foo.js')).to.equal(fixture('route/route.js'));
- expect(_file('addon/templates/foo.hbs')).to.equal('{{page-title "Foo"}}\n{{outlet}}');
+ expect(_file('addon/templates/foo.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('app/routes/foo.js')).to.contain(
"export { default } from 'my-addon/routes/foo';"
@@ -415,7 +426,7 @@ describe('Blueprint: route', function () {
expect(_file('addon/routes/foo.js')).to.equal(fixture('route/route.js'));
- expect(_file('addon/templates/foo.hbs')).to.equal('{{page-title "Foo"}}\n{{outlet}}');
+ expect(_file('addon/templates/foo.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('app/routes/foo.js')).to.contain(
"export { default } from 'my-addon/routes/foo';"
@@ -438,7 +449,7 @@ describe('Blueprint: route', function () {
return emberGenerateDestroy(['route', 'foo/bar'], (_file) => {
expect(_file('addon/routes/foo/bar.js')).to.equal(fixture('route/route-nested.js'));
- expect(_file('addon/templates/foo/bar.hbs')).to.equal('{{page-title "Bar"}}\n{{outlet}}');
+ expect(_file('addon/templates/foo/bar.gjs')).to.equal(strictRouteTemplate('Bar'));
expect(_file('app/routes/foo/bar.js')).to.contain(
"export { default } from 'my-addon/routes/foo/bar';"
@@ -462,9 +473,7 @@ describe('Blueprint: route', function () {
return emberGenerateDestroy(['route', 'foo', '--dummy'], (_file) => {
expect(_file('tests/dummy/app/routes/foo.js')).to.equal(fixture('route/route.js'));
- expect(_file('tests/dummy/app/templates/foo.hbs')).to.equal(
- '{{page-title "Foo"}}\n{{outlet}}'
- );
+ expect(_file('tests/dummy/app/templates/foo.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('app/routes/foo.js')).to.not.exist;
expect(_file('app/templates/foo.hbs')).to.not.exist;
@@ -483,9 +492,7 @@ describe('Blueprint: route', function () {
expect(_file('tests/dummy/app/routes/foo.js')).to.equal(fixture('route/route.js'));
- expect(_file('tests/dummy/app/templates/foo.hbs')).to.equal(
- '{{page-title "Foo"}}\n{{outlet}}'
- );
+ expect(_file('tests/dummy/app/templates/foo.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('app/routes/foo.js')).to.not.exist;
expect(_file('app/templates/foo.hbs')).to.not.exist;
@@ -504,9 +511,7 @@ describe('Blueprint: route', function () {
fixture('route/route-nested.js')
);
- expect(_file('tests/dummy/app/templates/foo/bar.hbs')).to.equal(
- '{{page-title "Bar"}}\n{{outlet}}'
- );
+ expect(_file('tests/dummy/app/templates/foo/bar.gjs')).to.equal(strictRouteTemplate('Bar'));
expect(_file('app/routes/foo/bar.js')).to.not.exist;
expect(_file('app/templates/foo/bar.hbs')).to.not.exist;
@@ -524,7 +529,7 @@ describe('Blueprint: route', function () {
return emberGenerateDestroy(['route', 'foo', '--pod'], (_file) => {
expect(_file('addon/foo/route.js')).to.equal(fixture('route/route.js'));
- expect(_file('addon/foo/template.hbs')).to.equal('{{page-title "Foo"}}\n{{outlet}}');
+ expect(_file('addon/foo/template.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('app/foo/route.js')).to.contain(
"export { default } from 'my-addon/foo/route';"
@@ -548,7 +553,7 @@ describe('Blueprint: route', function () {
expect(_file('addon/foo/route.js')).to.equal(fixture('route/route.js'));
- expect(_file('addon/foo/template.hbs')).to.equal('{{page-title "Foo"}}\n{{outlet}}');
+ expect(_file('addon/foo/template.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('app/foo/route.js')).to.contain(
"export { default } from 'my-addon/foo/route';"
@@ -569,13 +574,17 @@ describe('Blueprint: route', function () {
it('route foo', function () {
return emberGenerateDestroy(['route', 'foo'], (_file) => {
- expect(_file('addon/templates/foo.hbs')).to.equal('{{outlet}}');
+ expect(_file('addon/templates/foo.gjs')).to.equal(
+ strictRouteTemplate('Foo', { addTitle: false })
+ );
});
});
it('route foo/bar', function () {
return emberGenerateDestroy(['route', 'foo/bar'], (_file) => {
- expect(_file('addon/templates/foo/bar.hbs')).to.equal('{{outlet}}');
+ expect(_file('addon/templates/foo/bar.gjs')).to.equal(
+ strictRouteTemplate('Bar', { addTitle: false })
+ );
});
});
});
@@ -616,9 +625,7 @@ describe('Blueprint: route', function () {
return emberGenerateDestroy(['route', 'foo', '--in-repo-addon=my-addon'], (_file) => {
expect(_file('lib/my-addon/addon/routes/foo.js')).to.equal(fixture('route/route.js'));
- expect(_file('lib/my-addon/addon/templates/foo.hbs')).to.equal(
- '{{page-title "Foo"}}\n{{outlet}}'
- );
+ expect(_file('lib/my-addon/addon/templates/foo.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('lib/my-addon/app/routes/foo.js')).to.contain(
"export { default } from 'my-addon/routes/foo';"
@@ -642,9 +649,7 @@ describe('Blueprint: route', function () {
expect(_file('lib/my-addon/addon/routes/foo.js')).to.equal(fixture('route/route.js'));
- expect(_file('lib/my-addon/addon/templates/foo.hbs')).to.equal(
- '{{page-title "Foo"}}\n{{outlet}}'
- );
+ expect(_file('lib/my-addon/addon/templates/foo.gjs')).to.equal(strictRouteTemplate('Foo'));
expect(_file('lib/my-addon/app/routes/foo.js')).to.contain(
"export { default } from 'my-addon/routes/foo';"
@@ -664,8 +669,8 @@ describe('Blueprint: route', function () {
fixture('route/route-nested.js')
);
- expect(_file('lib/my-addon/addon/templates/foo/bar.hbs')).to.equal(
- '{{page-title "Bar"}}\n{{outlet}}'
+ expect(_file('lib/my-addon/addon/templates/foo/bar.gjs')).to.equal(
+ strictRouteTemplate('Bar')
);
expect(_file('lib/my-addon/app/routes/foo/bar.js')).to.contain(
@@ -689,13 +694,17 @@ describe('Blueprint: route', function () {
it('route foo', function () {
return emberGenerateDestroy(['route', 'foo', '--in-repo-addon=my-addon'], (_file) => {
- expect(_file('lib/my-addon/addon/templates/foo.hbs')).to.equal('{{outlet}}');
+ expect(_file('lib/my-addon/addon/templates/foo.gjs')).to.equal(
+ strictRouteTemplate('Foo', { addTitle: false })
+ );
});
});
it('route foo/bar', function () {
return emberGenerateDestroy(['route', 'foo/bar', '--in-repo-addon=my-addon'], (_file) => {
- expect(_file('lib/my-addon/addon/templates/foo/bar.hbs')).to.equal('{{outlet}}');
+ expect(_file('lib/my-addon/addon/templates/foo/bar.gjs')).to.equal(
+ strictRouteTemplate('Bar', { addTitle: false })
+ );
});
});
});
diff --git a/node-tests/fixtures/component-test/addon.gjs b/node-tests/fixtures/component-test/addon.gjs
index f68723e10ca..79a65697eb1 100644
--- a/node-tests/fixtures/component-test/addon.gjs
+++ b/node-tests/fixtures/component-test/addon.gjs
@@ -1,9 +1,9 @@
import { module, test } from 'qunit';
import { setupRenderingTest } from 'dummy/tests/helpers';
import { render } from '@ember/test-helpers';
-import Foo from 'my-addon/components/foo';
+import <%= componentInvocation =%> from 'my-addon/components/<%= component =%>';
-module('Integration | Component | foo', function (hooks) {
+module('<%= testDescription =%>', function (hooks) {
setupRenderingTest(hooks);
test('it renders', async function (assert) {
@@ -12,15 +12,15 @@ module('Integration | Component | foo', function (hooks) {
// and update using state.myProperty = 1; await rerender();
// Handle any actions with function myAction(val) { ... };
- await render();
+ await render(<<%= componentInvocation =%> />);
assert.dom().hasText('');
// Template block usage:
await render(
-
+ <<%= componentInvocation =%>>
template block text
-
+ <%= componentInvocation =%>>
);
assert.dom().hasText('template block text');
diff --git a/node-tests/fixtures/component-test/app.gjs b/node-tests/fixtures/component-test/app.gjs
index 889ab8807a5..ca3015a52e2 100644
--- a/node-tests/fixtures/component-test/app.gjs
+++ b/node-tests/fixtures/component-test/app.gjs
@@ -1,9 +1,9 @@
import { module, test } from 'qunit';
import { setupRenderingTest } from 'my-app/tests/helpers';
import { render } from '@ember/test-helpers';
-import Foo from 'my-app/components/foo';
+import <%= componentInvocation =%> from 'my-app/components/<%= component =%>';
-module('Integration | Component | foo', function (hooks) {
+module('<%= testDescription =%>', function (hooks) {
setupRenderingTest(hooks);
test('it renders', async function (assert) {
@@ -12,15 +12,15 @@ module('Integration | Component | foo', function (hooks) {
// and update using state.myProperty = 1; await rerender();
// Handle any actions with function myAction(val) { ... };
- await render();
+ await render(<<%= componentInvocation =%> />);
assert.dom().hasText('');
// Template block usage:
await render(
-
+ <<%= componentInvocation =%>>
template block text
-
+ <%= componentInvocation =%>>
);
assert.dom().hasText('template block text');
diff --git a/package.json b/package.json
index e7f45dbf34f..02c2e2d0c6f 100644
--- a/package.json
+++ b/package.json
@@ -67,7 +67,6 @@
},
"dependencies": {
"@babel/core": "^7.24.4",
- "@ember/edition-utils": "^1.2.0",
"@embroider/addon-shim": "^1.10.2",
"@simple-dom/interface": "^1.4.0",
"backburner.js": "^2.8.0",
@@ -77,16 +76,13 @@
"chalk": "^4.0.0",
"ember-cli-babel": "^8.2.0",
"ember-cli-get-component-path-option": "^1.0.0",
- "ember-cli-is-package-missing": "^1.0.0",
"ember-cli-normalize-entity-name": "^1.0.0",
"ember-cli-path-utils": "^1.0.0",
"ember-cli-string-utils": "^1.1.0",
"ember-cli-typescript-blueprint-polyfill": "^0.1.0",
- "ember-cli-version-checker": "^5.1.2",
"ember-router-generator": "^2.0.0",
"inflection": "^2.0.1",
"route-recognizer": "^0.3.4",
- "router_js": "^8.0.5",
"semver": "^7.5.2",
"silent-error": "^1.1.1",
"simple-html-tokenizer": "^0.5.11"
@@ -112,7 +108,6 @@
"auto-dist-tag": "^2.1.1",
"babel-plugin-debug-macros": "1.0.0",
"babel-plugin-ember-template-compilation": "3.0.0-alpha.4",
- "brotli": "^1.3.3",
"dag-map": "^2.0.2",
"decorator-transforms": "2.0.0",
"ember-cli": "^6.3.0",
@@ -129,7 +124,6 @@
"eslint-plugin-qunit": "^8.1.2",
"execa": "^5.1.1",
"expect-type": "^0.15.0",
- "filesize": "^10.1.6",
"fs-extra": "^11.1.1",
"git-repo-info": "^2.1.1",
"github": "^0.2.3",
@@ -137,15 +131,14 @@
"globals": "^16.0.0",
"kill-port-process": "^3.2.1",
"mocha": "^10.2.0",
- "node-gzip": "^1.1.2",
- "npm-run-all2": "^6.0.6",
+ "npm-run-all2": "^8.0.0",
"prettier": "^3.5.3",
"qunit": "^2.19.4",
"recast": "^0.22.0",
"resolve.exports": "^2.0.3",
"rollup": "^4.57.1",
+ "router_js": "workspace:*",
"rsvp": "^4.8.5",
- "table": "^6.9.0",
"terser": "^5.42.0",
"testem": "^3.10.1",
"testem-failure-only-reporter": "^1.0.0",
@@ -295,6 +288,7 @@
"@ember/template-compiler/lib/-internal/primitives.js": "ember-source/@ember/template-compiler/lib/-internal/primitives.js",
"@ember/template-compiler/lib/compile-options.js": "ember-source/@ember/template-compiler/lib/compile-options.js",
"@ember/template-compiler/lib/dasherize-component-name.js": "ember-source/@ember/template-compiler/lib/dasherize-component-name.js",
+ "@ember/template-compiler/lib/plugins/allowed-globals.js": "ember-source/@ember/template-compiler/lib/plugins/allowed-globals.js",
"@ember/template-compiler/lib/plugins/assert-against-attrs.js": "ember-source/@ember/template-compiler/lib/plugins/assert-against-attrs.js",
"@ember/template-compiler/lib/plugins/assert-against-named-outlets.js": "ember-source/@ember/template-compiler/lib/plugins/assert-against-named-outlets.js",
"@ember/template-compiler/lib/plugins/assert-input-helper-without-block.js": "ember-source/@ember/template-compiler/lib/plugins/assert-input-helper-without-block.js",
diff --git a/packages/@ember/-internals/environment/index.ts b/packages/@ember/-internals/environment/index.ts
index bd0f49e5b0a..27e1530a895 100644
--- a/packages/@ember/-internals/environment/index.ts
+++ b/packages/@ember/-internals/environment/index.ts
@@ -1,3 +1,2 @@
export * from './lib/context';
export * from './lib/env';
-export { default as global } from './lib/global';
diff --git a/packages/@ember/-internals/environment/lib/context.ts b/packages/@ember/-internals/environment/lib/context.ts
index a6e38c12103..d6d7267f624 100644
--- a/packages/@ember/-internals/environment/lib/context.ts
+++ b/packages/@ember/-internals/environment/lib/context.ts
@@ -1,17 +1,15 @@
-import global from './global';
-
export interface GlobalContext {
imports: object;
exports: object;
lookup: Record;
}
+const global = globalThis as Record;
+const Ember = global['Ember'] as Partial | undefined;
+
// legacy imports/exports/lookup stuff (should we keep this??)
-export const context = (function (
- global: Record,
- Ember: Partial | undefined
-): GlobalContext {
- return Ember === undefined
+export const context: GlobalContext =
+ Ember === undefined
? { imports: global, exports: global, lookup: global }
: {
// import jQuery
@@ -21,7 +19,6 @@ export const context = (function (
// search for Namespaces
lookup: Ember.lookup || global,
};
-})(global, global.Ember);
export function getLookup(): Record {
return context.lookup;
diff --git a/packages/@ember/-internals/environment/lib/env.ts b/packages/@ember/-internals/environment/lib/env.ts
index b71f02d9702..8bf539aef25 100644
--- a/packages/@ember/-internals/environment/lib/env.ts
+++ b/packages/@ember/-internals/environment/lib/env.ts
@@ -1,5 +1,4 @@
import { DEBUG } from '@glimmer/env';
-import global from './global';
/**
The hash of environment variables used to control various configuration
@@ -154,15 +153,15 @@ export const ENV = {
},
};
-((
- EmberENV: Record & {
- EXTEND_PROTOTYPES?: boolean;
- EMBER_LOAD_HOOKS?: Record;
- FEATURES?: Record;
- }
-) => {
- if (typeof EmberENV !== 'object' || EmberENV === null) return;
+interface EmberENVConfig extends Record {
+ EXTEND_PROTOTYPES?: boolean;
+ EMBER_LOAD_HOOKS?: Record;
+ FEATURES?: Record;
+}
+const EmberENV = (globalThis as { EmberENV?: EmberENVConfig }).EmberENV;
+
+if (typeof EmberENV === 'object' && EmberENV !== null) {
for (let flag in EmberENV) {
if (
!Object.prototype.hasOwnProperty.call(EmberENV, flag) ||
@@ -203,7 +202,7 @@ export const ENV = {
if (DEBUG) {
ENV._DEBUG_RENDER_TREE = true;
}
-})(global.EmberENV);
+}
export function getENV(): object {
return ENV;
diff --git a/packages/@ember/-internals/environment/lib/global.ts b/packages/@ember/-internals/environment/lib/global.ts
deleted file mode 100644
index 9744e80da21..00000000000
--- a/packages/@ember/-internals/environment/lib/global.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-/* globals window, self */
-declare const mainContext: object | undefined;
-
-// from lodash to catch fake globals
-function checkGlobal(value: any | null | undefined): object | undefined {
- return value && value.Object === Object ? value : undefined;
-}
-
-// element ids can ruin global miss checks
-function checkElementIdShadowing(value: any | null | undefined) {
- return value && value.nodeType === undefined ? value : undefined;
-}
-
-declare const global: unknown;
-
-// export real global
-export default checkGlobal(checkElementIdShadowing(typeof global === 'object' && global)) ||
- checkGlobal(typeof self === 'object' && self) ||
- checkGlobal(typeof window === 'object' && window) ||
- (typeof mainContext !== 'undefined' && mainContext) || // set before strict mode in Ember loader/wrapper
- new Function('return this')(); // eval outside of strict mode
diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts
index 3dff5f3bace..44b4cdc5c61 100644
--- a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts
+++ b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts
@@ -531,11 +531,11 @@ export function initialRenderInstrumentDetails(component: any): any {
return component.instrumentDetails({ initialRender: true });
}
-export function rerenderInstrumentDetails(component: any): any {
+function rerenderInstrumentDetails(component: any): any {
return component.instrumentDetails({ initialRender: false });
}
-export const CURLY_CAPABILITIES: InternalComponentCapabilities = {
+const CURLY_CAPABILITIES: InternalComponentCapabilities = {
dynamicLayout: true,
dynamicTag: true,
prepareArgs: true,
diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/root.ts b/packages/@ember/-internals/glimmer/lib/component-managers/root.ts
index 00aca8f633c..a0488f74488 100644
--- a/packages/@ember/-internals/glimmer/lib/component-managers/root.ts
+++ b/packages/@ember/-internals/glimmer/lib/component-managers/root.ts
@@ -78,7 +78,7 @@ class RootComponentManager extends CurlyComponentManager {
// ROOT is the top-level template it has nothing but one yield.
// it is supposed to have a dummy element
-export const ROOT_CAPABILITIES: InternalComponentCapabilities = {
+const ROOT_CAPABILITIES: InternalComponentCapabilities = {
dynamicLayout: true,
dynamicTag: true,
prepareArgs: false,
diff --git a/packages/@ember/-internals/glimmer/lib/components/link-to.ts b/packages/@ember/-internals/glimmer/lib/components/link-to.ts
index 1102525721e..a8c55b759e0 100644
--- a/packages/@ember/-internals/glimmer/lib/components/link-to.ts
+++ b/packages/@ember/-internals/glimmer/lib/components/link-to.ts
@@ -554,12 +554,12 @@ class _LinkTo extends InternalComponent {
if (typeof currentWhen === 'boolean') {
return currentWhen;
} else if (typeof currentWhen === 'string') {
- let { models, routing } = this;
+ let { routing } = this;
return currentWhen
.split(' ')
.some((route) =>
- routing.isActiveForRoute(models, undefined, this.namespaceRoute(route), state)
+ routing.isActiveForRoute([], undefined, this.namespaceRoute(route), state)
);
} else {
let { route, models, query, routing } = this;
diff --git a/packages/@ember/-internals/glimmer/lib/helper.ts b/packages/@ember/-internals/glimmer/lib/helper.ts
index 5105852957e..a538c33aeed 100644
--- a/packages/@ember/-internals/glimmer/lib/helper.ts
+++ b/packages/@ember/-internals/glimmer/lib/helper.ts
@@ -14,7 +14,7 @@ import { getInternalHelperManager, helperCapabilities, setHelperManager } from '
import type { DirtyableTag } from '@glimmer/validator';
import { consumeTag, createTag, dirtyTag } from '@glimmer/validator';
-export const RECOMPUTE_TAG = Symbol('RECOMPUTE_TAG');
+const RECOMPUTE_TAG = Symbol('RECOMPUTE_TAG');
// Signature type utilities
type GetOr = K extends keyof T ? T[K] : Else;
@@ -293,7 +293,7 @@ class SimpleClassicHelperManager implements HelperManager<() => unknown> {
}
}
-export const SIMPLE_CLASSIC_HELPER_MANAGER = new SimpleClassicHelperManager();
+const SIMPLE_CLASSIC_HELPER_MANAGER = new SimpleClassicHelperManager();
setHelperManager(() => SIMPLE_CLASSIC_HELPER_MANAGER, Wrapper.prototype);
diff --git a/packages/@ember/-internals/glimmer/lib/modifiers/internal.ts b/packages/@ember/-internals/glimmer/lib/modifiers/internal.ts
deleted file mode 100644
index d62959ceb67..00000000000
--- a/packages/@ember/-internals/glimmer/lib/modifiers/internal.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-import type { InternalOwner } from '@ember/-internals/owner';
-import { setOwner } from '@ember/-internals/owner';
-import { guidFor } from '@ember/-internals/utils';
-import { assert } from '@ember/debug';
-import { registerDestructor } from '@glimmer/destroyable';
-import type {
- CapturedArguments,
- Destroyable,
- InternalModifierManager as ModifierManager,
-} from '@glimmer/interfaces';
-import { valueForRef } from '@glimmer/reference';
-import type { SimpleElement } from '@simple-dom/interface';
-
-export default class InternalModifier {
- // Override this
- static toString(): string {
- return 'internal modifier';
- }
-
- constructor(
- protected owner: InternalOwner,
- protected readonly element: Element,
- protected readonly args: CapturedArguments
- ) {
- setOwner(this, owner);
- }
-
- install(): void {}
-
- remove(): void {}
-
- protected positional(index: number): unknown {
- let ref = this.args.positional[index];
- return ref ? valueForRef(ref) : undefined;
- }
-
- protected named(key: string): unknown {
- let ref = this.args.named[key];
- return ref ? valueForRef(ref) : undefined;
- }
-
- toString(): string {
- return `<${this.constructor.toString()}:${guidFor(this)}>`;
- }
-}
-
-function destructor(modifier: InternalModifier): void {
- modifier.remove();
-}
-
-class InternalModifierState implements Destroyable {
- constructor(readonly instance: InternalModifier) {}
-}
-
-export abstract class InternalModifierManager implements ModifierManager<
- InternalModifierState,
- typeof InternalModifier
-> {
- constructor(
- private ModifierClass: typeof InternalModifier,
- private name: string
- ) {}
-
- create(
- owner: InternalOwner,
- element: SimpleElement,
- _definition: unknown,
- args: CapturedArguments
- ): InternalModifierState {
- assert('element must be an HTMLElement', element instanceof HTMLElement);
-
- let { ModifierClass } = this;
- let instance = new ModifierClass(owner, element, args);
-
- registerDestructor(instance, destructor);
-
- return new InternalModifierState(instance);
- }
-
- // not needed for now, but feel free to implement this
- getTag(): null {
- return null;
- }
-
- abstract getDebugInstance(state: InternalModifierState): unknown;
-
- getDebugName(): string {
- return this.name;
- }
-
- install({ instance }: InternalModifierState): void {
- return instance.install();
- }
-
- // not needed for now, but feel free to implement this
- update(): void {
- assert('update should never be called on an internal modifier');
- }
-
- getDestroyable({ instance }: InternalModifierState): Destroyable {
- return instance;
- }
-}
diff --git a/packages/@ember/-internals/glimmer/lib/renderer.ts b/packages/@ember/-internals/glimmer/lib/renderer.ts
index e2b8d23e74e..cfc74e0e423 100644
--- a/packages/@ember/-internals/glimmer/lib/renderer.ts
+++ b/packages/@ember/-internals/glimmer/lib/renderer.ts
@@ -363,7 +363,7 @@ interface RendererData {
builder: IBuilder;
}
-export class RendererState {
+class RendererState {
static create(data: RendererData, renderer: BaseRenderer): RendererState {
const state = new RendererState(data, renderer);
associateDestroyableChild(renderer, state);
@@ -717,7 +717,7 @@ export function renderComponent(
const RENDER_CACHE = new WeakMap();
const RENDERER_CACHE = new WeakMap