From 90e515b66b2453d12b99262d302c7d0d250e3668 Mon Sep 17 00:00:00 2001 From: void_malex Date: Sat, 22 Jun 2024 13:33:45 +0100 Subject: [PATCH 1/5] find ember source version of a particular app/engine --- packages/compat/src/compat-app-builder.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/compat/src/compat-app-builder.ts b/packages/compat/src/compat-app-builder.ts index bafb3dbf6..abf1335a9 100644 --- a/packages/compat/src/compat-app-builder.ts +++ b/packages/compat/src/compat-app-builder.ts @@ -694,6 +694,14 @@ export class CompatAppBuilder { return this.activeAddonChildren(this.appPackageWithMovedDeps).find(a => a.name === 'ember-cli-fastboot'); } + private emberVersion() { + let pkg = this.activeAddonChildren(this.appPackageWithMovedDeps).find(a => a.name === 'ember-source'); + if (!pkg) { + throw new Error('no ember version!'); + } + return pkg.version; + } + @Memoize() private get fastbootConfig(): | { packageJSON: PackageInfo; extraAppFiles: string[]; extraVendorFiles: string[] } @@ -1021,6 +1029,7 @@ export class CompatAppBuilder { ) { let opts: ResolverTransformOptions = { appRoot: resolverConfig.appRoot, + emberVersion: this.emberVersion(), }; transforms.push([require.resolve('./resolver-transform'), opts]); } From c9e5151d6a6770ee90a332ac30f93eab8e0af81f Mon Sep 17 00:00:00 2001 From: void_malex Date: Sat, 22 Jun 2024 13:37:41 +0100 Subject: [PATCH 2/5] declare required param --- packages/compat/tests/audit.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/compat/tests/audit.test.ts b/packages/compat/tests/audit.test.ts index b0a9ea286..4efa75db9 100644 --- a/packages/compat/tests/audit.test.ts +++ b/packages/compat/tests/audit.test.ts @@ -61,6 +61,7 @@ describe('audit', function () { let transformOpts: ResolverTransformOptions = { appRoot: resolverConfig.appRoot, + emberVersion: '*', // since no packages are declared ember version can be anything so * is valid }; let transform: Transform = [require.resolve('../src/resolver-transform'), transformOpts]; From 64143751757ad71e32cba68b814bc9bddb103ad4 Mon Sep 17 00:00:00 2001 From: void_malex Date: Sat, 22 Jun 2024 13:38:25 +0100 Subject: [PATCH 3/5] compute built ins based on current ember-source version matched by semver ranges --- packages/compat/src/resolver-transform.ts | 148 ++++++++++++---------- 1 file changed, 80 insertions(+), 68 deletions(-) diff --git a/packages/compat/src/resolver-transform.ts b/packages/compat/src/resolver-transform.ts index 7d160333c..fc1636f0b 100644 --- a/packages/compat/src/resolver-transform.ts +++ b/packages/compat/src/resolver-transform.ts @@ -18,6 +18,7 @@ import { Resolver, locateEmbroiderWorkingDir } from '@embroider/core'; import type CompatOptions from './options'; import type { AuditMessage, Loc } from './audit'; import { camelCase, mergeWith } from 'lodash'; +import { satisfies } from 'semver'; type Env = WithJSUtils & { filename: string; @@ -41,6 +42,7 @@ export interface CompatResolverOptions extends CoreResolverOptions { export interface Options { appRoot: string; + emberVersion: string; } type BuiltIn = { @@ -49,67 +51,73 @@ type BuiltIn = { importableModifier?: [string, string]; }; -const builtInKeywords: Record = { - '-get-dynamic-var': {}, - '-in-element': {}, - '-with-dynamic-vars': {}, - action: {}, - array: { - importableHelper: ['array', '@ember/helper'], - }, - component: {}, - concat: { - importableHelper: ['concat', '@ember/helper'], - }, - debugger: {}, - 'each-in': {}, - each: {}, - fn: { - importableHelper: ['fn', '@ember/helper'], - }, - get: { - importableHelper: ['get', '@ember/helper'], - }, - 'has-block-params': {}, - 'has-block': {}, - hasBlock: {}, - hasBlockParams: {}, - hash: { - importableHelper: ['hash', '@ember/helper'], - }, - helper: {}, - if: {}, - 'in-element': {}, - input: { - importableComponent: ['Input', '@ember/component'], - }, - let: {}, - 'link-to': { - importableComponent: ['LinkTo', '@ember/routing'], - }, - loc: {}, - log: {}, - modifier: {}, - mount: {}, - mut: {}, - on: { - importableModifier: ['on', '@ember/modifier'], - }, - outlet: {}, - partial: {}, - 'query-params': {}, - readonly: {}, - textarea: { - importableComponent: ['Textarea', '@ember/component'], - }, - unbound: {}, - 'unique-id': { - importableHelper: ['uniqueId', '@ember/helper'], - }, - unless: {}, - with: {}, - yield: {}, -}; +function builtInKeywords(emberVersion: string): Record { + const builtInKeywords: Record = { + '-get-dynamic-var': {}, + '-in-element': {}, + '-with-dynamic-vars': {}, + action: {}, + array: { + importableHelper: ['array', '@ember/helper'], + }, + component: {}, + concat: { + importableHelper: ['concat', '@ember/helper'], + }, + debugger: {}, + 'each-in': {}, + each: {}, + fn: { + importableHelper: ['fn', '@ember/helper'], + }, + get: { + importableHelper: ['get', '@ember/helper'], + }, + 'has-block-params': {}, + 'has-block': {}, + hasBlock: {}, + hasBlockParams: {}, + hash: { + importableHelper: ['hash', '@ember/helper'], + }, + helper: {}, + if: {}, + 'in-element': {}, + input: { + importableComponent: ['Input', '@ember/component'], + }, + let: {}, + 'link-to': { + importableComponent: ['LinkTo', '@ember/routing'], + }, + loc: {}, + log: {}, + modifier: {}, + mount: {}, + mut: {}, + on: { + importableModifier: ['on', '@ember/modifier'], + }, + outlet: {}, + partial: {}, + 'query-params': {}, + readonly: {}, + textarea: { + importableComponent: ['Textarea', '@ember/component'], + }, + unbound: {}, + 'unique-id': {}, + unless: {}, + with: {}, + yield: {}, + }; + if (satisfies(emberVersion, '>=5.2')) { + builtInKeywords['unique-id'] = { + importableHelper: ['uniqueId', '@ember/helper'], + }; + } + return builtInKeywords; +} interface ComponentResolution { type: 'component'; @@ -167,7 +175,11 @@ class TemplateResolver implements ASTPlugin { private moduleResolver: Resolver; - constructor(private env: Env, private config: CompatResolverOptions) { + constructor( + private env: Env, + private config: CompatResolverOptions, + private builtInsForEmberVersion: ReturnType + ) { this.moduleResolver = new Resolver(config); if ((globalThis as any).embroider_audit) { this.auditHandler = (globalThis as any).embroider_audit; @@ -399,7 +411,7 @@ class TemplateResolver implements ASTPlugin { return null; } - const builtIn = builtInKeywords[name]; + const builtIn = this.builtInsForEmberVersion[name]; if (builtIn?.importableComponent) { let [importedName, specifier] = builtIn.importableComponent; @@ -482,7 +494,7 @@ class TemplateResolver implements ASTPlugin { // globally-named helpers. It throws an error. So it's fine for us to // prioritize the builtIns here without bothering to resolve a user helper // of the same name. - const builtIn = builtInKeywords[path]; + const builtIn = this.builtInsForEmberVersion[path]; if (builtIn?.importableHelper) { let [importedName, specifier] = builtIn.importableHelper; @@ -567,7 +579,7 @@ class TemplateResolver implements ASTPlugin { return null; } - let builtIn = builtInKeywords[path]; + let builtIn = this.builtInsForEmberVersion[path]; if (builtIn?.importableComponent) { let [importedName, specifier] = builtIn.importableComponent; @@ -656,7 +668,7 @@ class TemplateResolver implements ASTPlugin { return null; } - const builtIn = builtInKeywords[path]; + const builtIn = this.builtInsForEmberVersion[path]; if (builtIn?.importableModifier) { let [importedName, specifier] = builtIn.importableModifier; return { @@ -959,7 +971,7 @@ class TemplateResolver implements ASTPlugin { } // This is the AST transform that resolves components, helpers and modifiers at build time -export default function makeResolverTransform({ appRoot }: Options) { +export default function makeResolverTransform({ appRoot, emberVersion }: Options) { let config: CompatResolverOptions = readJSONSync(join(locateEmbroiderWorkingDir(appRoot), 'resolver.json')); const resolverTransform: ASTPluginBuilder = env => { if (env.strictMode) { @@ -968,7 +980,7 @@ export default function makeResolverTransform({ appRoot }: Options) { visitor: {}, }; } - return new TemplateResolver(env, config); + return new TemplateResolver(env, config, builtInKeywords(emberVersion)); }; (resolverTransform as any).parallelBabel = { requireFile: __filename, From a333b3266ef22584d2a773f9ebd43122554ed295 Mon Sep 17 00:00:00 2001 From: void_malex Date: Sat, 22 Jun 2024 14:53:22 +0100 Subject: [PATCH 4/5] add tests for unique-id helper --- tests/scenarios/compat-resolver-test.ts | 44 +++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/tests/scenarios/compat-resolver-test.ts b/tests/scenarios/compat-resolver-test.ts index 93133c061..0422a10e7 100644 --- a/tests/scenarios/compat-resolver-test.ts +++ b/tests/scenarios/compat-resolver-test.ts @@ -41,7 +41,11 @@ Scenarios.fromProject(() => new Project()) Qmodule(scenario.name, function (hooks) { let expectTranspiled: (file: string) => ReturnType['transform']>; let givenFiles: (files: Record) => void; - let configure: (opts?: Partial, extraOpts?: ConfigureOpts) => Promise; + let configure: ( + opts?: Partial, + extraOpts?: ConfigureOpts, + emberVersion?: string + ) => Promise; interface ConfigureOpts { appPackageRules?: Partial; @@ -59,13 +63,17 @@ Scenarios.fromProject(() => new Project()) outputFileSync(resolve(app.dir, filename), contents, 'utf8'); } }; - configure = async function (opts?: Partial, extraOpts?: ConfigureOpts) { + configure = async function ( + opts?: Partial, + extraOpts?: ConfigureOpts, + emberVersion = '4.6.0' //based on app-template package.json + ) { let etcOptions: EtcOptions = { compilerPath: require.resolve('ember-source-latest/dist/ember-template-compiler'), targetFormat: 'hbs', transforms: [ ...(extraOpts?.astPlugins ?? []), - [require.resolve('@embroider/compat/src/resolver-transform'), { appRoot: app.dir }], + [require.resolve('@embroider/compat/src/resolver-transform'), { appRoot: app.dir, emberVersion }], ], }; @@ -1140,6 +1148,36 @@ Scenarios.fromProject(() => new Project()) `); }); + test('built-in helper unique-id is not imported when used with ember source version <5.2', async function () { + givenFiles({ + 'templates/application.hbs': `{{(unique-id)}}`, + }); + await configure({ staticHelpers: true }, undefined, '4.6.0'); + expectTranspiled('templates/application.hbs').equalsCode(` + import { precompileTemplate } from "@ember/template-compilation"; + export default precompileTemplate("{{(unique-id)}}", { + moduleName: "my-app/templates/application.hbs", + }); + `); + }); + + test('built-in helper unique-id is imported when used with ember source version >=5.2', async function () { + givenFiles({ + 'templates/application.hbs': `{{(unique-id)}}`, + }); + await configure({ staticHelpers: true }, undefined, '5.2.0'); + expectTranspiled('templates/application.hbs').equalsCode(` + import { precompileTemplate } from "@ember/template-compilation"; + import { uniqueId } from "@ember/helper"; + export default precompileTemplate("{{(uniqueId)}}", { + moduleName: "my-app/templates/application.hbs", + scope: () => ({ + uniqueId, + }), + }); + `); + }); + test('built-in modifiers are ignored when used with the modifier keyword', async function () { givenFiles({ 'templates/application.hbs': `{{modifier "on"}}{{modifier "action"}}`, From e1bf7278d120947929f87e8ac112158bc8e791d9 Mon Sep 17 00:00:00 2001 From: mansona <594890+mansona@users.noreply.github.com> Date: Mon, 24 Jun 2024 13:16:57 +0000 Subject: [PATCH 5/5] Prepare Release using 'release-plan' --- .release-plan.json | 46 ++++++++++++++++++++------ CHANGELOG.md | 20 +++++++++++ packages/compat/package.json | 2 +- packages/core/package.json | 2 +- packages/macros/package.json | 2 +- packages/shared-internals/package.json | 2 +- packages/webpack/package.json | 2 +- 7 files changed, 61 insertions(+), 15 deletions(-) diff --git a/.release-plan.json b/.release-plan.json index 8e2101abb..ba10a7499 100644 --- a/.release-plan.json +++ b/.release-plan.json @@ -11,9 +11,13 @@ }, "@embroider/compat": { "impact": "patch", - "oldVersion": "3.5.3", - "newVersion": "3.5.4", + "oldVersion": "3.5.4", + "newVersion": "3.5.5", "constraints": [ + { + "impact": "patch", + "reason": "Appears in changelog section :bug: Bug Fix" + }, { "impact": "patch", "reason": "Has dependency `workspace:*` on @embroider/macros" @@ -23,9 +27,13 @@ }, "@embroider/core": { "impact": "patch", - "oldVersion": "3.4.12", - "newVersion": "3.4.13", + "oldVersion": "3.4.13", + "newVersion": "3.4.14", "constraints": [ + { + "impact": "patch", + "reason": "Has dependency `workspace:*` on @embroider/shared-internals" + }, { "impact": "patch", "reason": "Has dependency `workspace:*` on @embroider/macros" @@ -38,12 +46,12 @@ }, "@embroider/macros": { "impact": "patch", - "oldVersion": "1.16.3", - "newVersion": "1.16.4", + "oldVersion": "1.16.4", + "newVersion": "1.16.5", "constraints": [ { "impact": "patch", - "reason": "Appears in changelog section :bug: Bug Fix" + "reason": "Has dependency `workspace:*` on @embroider/shared-internals" } ], "pkgJSONPath": "./packages/macros/package.json" @@ -55,7 +63,16 @@ "oldVersion": "2.1.8" }, "@embroider/shared-internals": { - "oldVersion": "2.6.1" + "impact": "patch", + "oldVersion": "2.6.1", + "newVersion": "2.6.2", + "constraints": [ + { + "impact": "patch", + "reason": "Appears in changelog section :house: Internal" + } + ], + "pkgJSONPath": "./packages/shared-internals/package.json" }, "@embroider/test-setup": { "oldVersion": "4.0.0" @@ -67,8 +84,17 @@ "oldVersion": "0.2.0" }, "@embroider/webpack": { - "oldVersion": "4.0.3" + "impact": "patch", + "oldVersion": "4.0.3", + "newVersion": "4.0.4", + "constraints": [ + { + "impact": "patch", + "reason": "Has dependency `workspace:*` on @embroider/shared-internals" + } + ], + "pkgJSONPath": "./packages/webpack/package.json" } }, - "description": "## Release (2024-06-20)\n\n@embroider/compat 3.5.4 (patch)\n@embroider/core 3.4.13 (patch)\n@embroider/macros 1.16.4 (patch)\n\n#### :bug: Bug Fix\n* `@embroider/macros`\n * [#1994](https://github.com/embroider-build/embroider/pull/1994) MacrosConfig should sync globalConfigs between copies ([@ef4](https://github.com/ef4))\n\n#### :house: Internal\n* [#1993](https://github.com/embroider-build/embroider/pull/1993) update node to latest LTS for CI ([@mansona](https://github.com/mansona))\n\n#### Committers: 2\n- Chris Manson ([@mansona](https://github.com/mansona))\n- Edward Faulkner ([@ef4](https://github.com/ef4))\n" + "description": "## Release (2024-06-24)\n\n@embroider/compat 3.5.5 (patch)\n@embroider/core 3.4.14 (patch)\n@embroider/macros 1.16.5 (patch)\n@embroider/shared-internals 2.6.2 (patch)\n@embroider/webpack 4.0.4 (patch)\n\n#### :bug: Bug Fix\n* `@embroider/compat`, `@embroider/test-scenarios`\n * [#2005](https://github.com/embroider-build/embroider/pull/2005) unique-id helper import based on ember-source version ([@void-mAlex](https://github.com/void-mAlex))\n\n#### :house: Internal\n* `@embroider/shared-internals`\n * [#2000](https://github.com/embroider-build/embroider/pull/2000) Update typescript and fix issues with Typescript 5.5 ([@mansona](https://github.com/mansona))\n\n#### Committers: 2\n- Alex ([@void-mAlex](https://github.com/void-mAlex))\n- Chris Manson ([@mansona](https://github.com/mansona))\n" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 0078b4e2d..05d4ae43a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Embroider Changelog +## Release (2024-06-24) + +@embroider/compat 3.5.5 (patch) +@embroider/core 3.4.14 (patch) +@embroider/macros 1.16.5 (patch) +@embroider/shared-internals 2.6.2 (patch) +@embroider/webpack 4.0.4 (patch) + +#### :bug: Bug Fix +* `@embroider/compat`, `@embroider/test-scenarios` + * [#2005](https://github.com/embroider-build/embroider/pull/2005) unique-id helper import based on ember-source version ([@void-mAlex](https://github.com/void-mAlex)) + +#### :house: Internal +* `@embroider/shared-internals` + * [#2000](https://github.com/embroider-build/embroider/pull/2000) Update typescript and fix issues with Typescript 5.5 ([@mansona](https://github.com/mansona)) + +#### Committers: 2 +- Alex ([@void-mAlex](https://github.com/void-mAlex)) +- Chris Manson ([@mansona](https://github.com/mansona)) + ## Release (2024-06-20) @embroider/compat 3.5.4 (patch) diff --git a/packages/compat/package.json b/packages/compat/package.json index f3fdea9f7..94e181219 100644 --- a/packages/compat/package.json +++ b/packages/compat/package.json @@ -1,6 +1,6 @@ { "name": "@embroider/compat", - "version": "3.5.4", + "version": "3.5.5", "private": false, "description": "Backward compatibility layer for the Embroider build system.", "repository": { diff --git a/packages/core/package.json b/packages/core/package.json index 11e692a9f..f653cddae 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@embroider/core", - "version": "3.4.13", + "version": "3.4.14", "private": false, "description": "A build system for EmberJS applications.", "repository": { diff --git a/packages/macros/package.json b/packages/macros/package.json index 541bdff5d..5221cff90 100644 --- a/packages/macros/package.json +++ b/packages/macros/package.json @@ -1,6 +1,6 @@ { "name": "@embroider/macros", - "version": "1.16.4", + "version": "1.16.5", "private": false, "description": "Standardized build-time macros for ember apps.", "keywords": [ diff --git a/packages/shared-internals/package.json b/packages/shared-internals/package.json index 6a13b4822..3ddb0ba49 100644 --- a/packages/shared-internals/package.json +++ b/packages/shared-internals/package.json @@ -1,6 +1,6 @@ { "name": "@embroider/shared-internals", - "version": "2.6.1", + "version": "2.6.2", "private": false, "description": "Utilities shared among the other embroider packages", "repository": { diff --git a/packages/webpack/package.json b/packages/webpack/package.json index a8f394edd..f59418923 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -1,6 +1,6 @@ { "name": "@embroider/webpack", - "version": "4.0.3", + "version": "4.0.4", "private": false, "description": "Builds EmberJS apps with Webpack", "repository": {