+ I listen for events specified in the eventListeners object
+
diff --git a/packages/@lwc/integration-karma/test-hydration/directives/lwc-on/x/main/main.js b/packages/@lwc/integration-karma/test-hydration/directives/lwc-on/x/main/main.js
new file mode 100644
index 0000000000..4464d2fd7b
--- /dev/null
+++ b/packages/@lwc/integration-karma/test-hydration/directives/lwc-on/x/main/main.js
@@ -0,0 +1,25 @@
+import { LightningElement, api } from 'lwc';
+
+export default class Main extends LightningElement {
+ _clickedHandlerCounter = 0;
+ _fooHandlerCounter = 0;
+
+ @api
+ get timesClickedHandlerIsExecuted() {
+ return this._clickedHandlerCounter;
+ }
+
+ @api
+ get timesFooHandlerIsExecuted() {
+ return this._fooHandlerCounter;
+ }
+
+ eventListeners = {
+ click: function () {
+ this._clickedHandlerCounter++;
+ },
+ foo: function () {
+ this._fooHandlerCounter++;
+ },
+ };
+}
diff --git a/packages/@lwc/integration-tests/package.json b/packages/@lwc/integration-tests/package.json
index d2fbf5715b..02e4f1d8cc 100644
--- a/packages/@lwc/integration-tests/package.json
+++ b/packages/@lwc/integration-tests/package.json
@@ -1,7 +1,7 @@
{
"name": "@lwc/integration-tests",
"private": true,
- "version": "8.19.1",
+ "version": "8.20.0",
"scripts": {
"build": "node scripts/build.js",
"build:dev": "MODE=dev yarn build",
@@ -18,7 +18,7 @@
"sauce:prod:ci": "MODE=prod yarn build:prod && MODE=prod ../../../scripts/ci/retry.sh wdio ./scripts/wdio.sauce.conf.js"
},
"devDependencies": {
- "@lwc/rollup-plugin": "8.19.1",
+ "@lwc/rollup-plugin": "8.20.0",
"@wdio/cli": "^9.9.1",
"@wdio/local-runner": "^9.9.1",
"@wdio/mocha-framework": "^9.9.0",
@@ -27,7 +27,7 @@
"@wdio/static-server-service": "^9.9.0",
"deepmerge": "^4.3.1",
"dotenv": "^16.5.0",
- "lwc": "8.19.1",
+ "lwc": "8.20.0",
"minimist": "^1.2.8",
"webdriverio": "^9.0.7"
},
diff --git a/packages/@lwc/integration-types/package.json b/packages/@lwc/integration-types/package.json
index 11e1ee7a4f..45f66870d0 100644
--- a/packages/@lwc/integration-types/package.json
+++ b/packages/@lwc/integration-types/package.json
@@ -1,7 +1,7 @@
{
"name": "@lwc/integration-types",
"private": true,
- "version": "8.19.1",
+ "version": "8.20.0",
"description": "Type validation for LWC packages",
"type": "module",
"scripts": {
@@ -9,8 +9,8 @@
"playground": "rollup -c src/playground/rollup.config.js --watch"
},
"dependencies": {
- "@lwc/rollup-plugin": "8.19.1",
- "lwc": "8.19.1"
+ "@lwc/rollup-plugin": "8.20.0",
+ "lwc": "8.20.0"
},
"devDependencies": {
"@rollup/plugin-replace": "^6.0.2",
diff --git a/packages/@lwc/module-resolver/package.json b/packages/@lwc/module-resolver/package.json
index 9f35d9e0c6..72fa02fa2d 100644
--- a/packages/@lwc/module-resolver/package.json
+++ b/packages/@lwc/module-resolver/package.json
@@ -4,7 +4,7 @@
"You can safely modify dependencies, devDependencies, keywords, etc., but other props will be overwritten."
],
"name": "@lwc/module-resolver",
- "version": "8.19.1",
+ "version": "8.20.0",
"description": "Resolves paths for LWC components",
"keywords": [
"lwc"
diff --git a/packages/@lwc/perf-benchmarks-components/package.json b/packages/@lwc/perf-benchmarks-components/package.json
index 68ab5eb234..d970c4de02 100644
--- a/packages/@lwc/perf-benchmarks-components/package.json
+++ b/packages/@lwc/perf-benchmarks-components/package.json
@@ -1,12 +1,12 @@
{
"name": "@lwc/perf-benchmarks-components",
- "version": "8.19.1",
+ "version": "8.20.0",
"private": true,
"scripts": {
"build": "rm -fr dist && rollup -c ./rollup.config.mjs"
},
"devDependencies": {
- "@lwc/rollup-plugin": "8.19.1"
+ "@lwc/rollup-plugin": "8.20.0"
},
"nx": {
"targets": {
diff --git a/packages/@lwc/perf-benchmarks/package.json b/packages/@lwc/perf-benchmarks/package.json
index d8c0d8ef64..ec6e074496 100644
--- a/packages/@lwc/perf-benchmarks/package.json
+++ b/packages/@lwc/perf-benchmarks/package.json
@@ -1,6 +1,6 @@
{
"name": "@lwc/perf-benchmarks",
- "version": "8.19.1",
+ "version": "8.20.0",
"private": true,
"scripts": {
"build": "rm -fr dist && rollup -c ./rollup.config.mjs && node scripts/build.js && ./scripts/fix-deps.sh",
@@ -15,11 +15,11 @@
"Don't forget to add these to fix-deps.sh as well."
],
"dependencies": {
- "@lwc/engine-dom": "8.19.1",
- "@lwc/engine-server": "8.19.1",
- "@lwc/perf-benchmarks-components": "8.19.1",
- "@lwc/ssr-runtime": "8.19.1",
- "@lwc/synthetic-shadow": "8.19.1"
+ "@lwc/engine-dom": "8.20.0",
+ "@lwc/engine-server": "8.20.0",
+ "@lwc/perf-benchmarks-components": "8.20.0",
+ "@lwc/ssr-runtime": "8.20.0",
+ "@lwc/synthetic-shadow": "8.20.0"
},
"devDependencies": {
"@best/cli": "^14.0.0",
diff --git a/packages/@lwc/rollup-plugin/package.json b/packages/@lwc/rollup-plugin/package.json
index cfc6045c7f..3488aa9028 100644
--- a/packages/@lwc/rollup-plugin/package.json
+++ b/packages/@lwc/rollup-plugin/package.json
@@ -4,7 +4,7 @@
"You can safely modify dependencies, devDependencies, keywords, etc., but other props will be overwritten."
],
"name": "@lwc/rollup-plugin",
- "version": "8.19.1",
+ "version": "8.20.0",
"description": "Rollup plugin to compile LWC",
"keywords": [
"lwc"
@@ -46,13 +46,13 @@
}
},
"dependencies": {
- "@lwc/compiler": "8.19.1",
- "@lwc/module-resolver": "8.19.1",
- "@lwc/shared": "8.19.1",
+ "@lwc/compiler": "8.20.0",
+ "@lwc/module-resolver": "8.20.0",
+ "@lwc/shared": "8.20.0",
"@rollup/pluginutils": "~5.1.4"
},
"devDependencies": {
- "@lwc/errors": "8.19.1"
+ "@lwc/errors": "8.20.0"
},
"peerDependencies": {
"rollup": "^1.2.0||^2.0.0||^3.0.0||^4.0.0"
diff --git a/packages/@lwc/shared/package.json b/packages/@lwc/shared/package.json
index b8780c0d65..985a0f1d7d 100644
--- a/packages/@lwc/shared/package.json
+++ b/packages/@lwc/shared/package.json
@@ -4,7 +4,7 @@
"You can safely modify dependencies, devDependencies, keywords, etc., but other props will be overwritten."
],
"name": "@lwc/shared",
- "version": "8.19.1",
+ "version": "8.20.0",
"description": "Utilities and methods that are shared across packages",
"keywords": [
"lwc"
diff --git a/packages/@lwc/signals/package.json b/packages/@lwc/signals/package.json
index 7aa52f9f0f..31859c5958 100644
--- a/packages/@lwc/signals/package.json
+++ b/packages/@lwc/signals/package.json
@@ -4,7 +4,7 @@
"You can safely modify dependencies, devDependencies, keywords, etc., but other props will be overwritten."
],
"name": "@lwc/signals",
- "version": "8.19.1",
+ "version": "8.20.0",
"description": "Provides the interface to interact with reactivity from outside the framework",
"keywords": [
"lwc"
@@ -46,6 +46,6 @@
}
},
"devDependencies": {
- "@lwc/shared": "8.19.1"
+ "@lwc/shared": "8.20.0"
}
}
diff --git a/packages/@lwc/ssr-client-utils/package.json b/packages/@lwc/ssr-client-utils/package.json
index d88c03d529..da844eb971 100644
--- a/packages/@lwc/ssr-client-utils/package.json
+++ b/packages/@lwc/ssr-client-utils/package.json
@@ -4,7 +4,7 @@
"You can safely modify dependencies, devDependencies, keywords, etc., but other props will be overwritten."
],
"name": "@lwc/ssr-client-utils",
- "version": "8.19.1",
+ "version": "8.20.0",
"description": "Client-side complement to @lwc/ssr-compiler",
"keywords": [
"lwc",
diff --git a/packages/@lwc/ssr-compiler/package.json b/packages/@lwc/ssr-compiler/package.json
index e333f0cb55..d648b8025f 100644
--- a/packages/@lwc/ssr-compiler/package.json
+++ b/packages/@lwc/ssr-compiler/package.json
@@ -4,7 +4,7 @@
"You can safely modify dependencies, devDependencies, keywords, etc., but other props will be overwritten."
],
"name": "@lwc/ssr-compiler",
- "version": "8.19.1",
+ "version": "8.20.0",
"description": "Compile component for use during server-side rendering",
"keywords": [
"compiler",
@@ -49,9 +49,9 @@
},
"dependencies": {
"@babel/types": "7.27.0",
- "@lwc/errors": "8.19.1",
- "@lwc/shared": "8.19.1",
- "@lwc/template-compiler": "8.19.1",
+ "@lwc/errors": "8.20.0",
+ "@lwc/shared": "8.20.0",
+ "@lwc/template-compiler": "8.20.0",
"acorn": "8.14.1",
"astring": "^1.9.0",
"estree-toolkit": "^1.7.12",
@@ -59,7 +59,7 @@
"meriyah": "^5.0.0"
},
"devDependencies": {
- "@lwc/babel-plugin-component": "8.19.1",
+ "@lwc/babel-plugin-component": "8.20.0",
"@types/estree": "^1.0.7"
}
}
diff --git a/packages/@lwc/ssr-compiler/src/__tests__/fixtures.spec.ts b/packages/@lwc/ssr-compiler/src/__tests__/fixtures.spec.ts
index 82be0af3c0..8c39d7ba7c 100644
--- a/packages/@lwc/ssr-compiler/src/__tests__/fixtures.spec.ts
+++ b/packages/@lwc/ssr-compiler/src/__tests__/fixtures.spec.ts
@@ -65,6 +65,7 @@ async function compileFixture({ entry, dirname }: { entry: string; dirname: stri
targetSSR: true,
ssrMode: SSR_MODE,
enableDynamicComponents: true,
+ enableLwcOn: true,
// TODO [#3331]: remove usage of lwc:dynamic in 246
experimentalDynamicDirective: true,
modules: [{ dir: modulesDir }],
diff --git a/packages/@lwc/ssr-compiler/src/compile-template/context.ts b/packages/@lwc/ssr-compiler/src/compile-template/context.ts
index 6de3a6b23c..a2208ba6e2 100644
--- a/packages/@lwc/ssr-compiler/src/compile-template/context.ts
+++ b/packages/@lwc/ssr-compiler/src/compile-template/context.ts
@@ -6,7 +6,7 @@
*/
import { ImportManager } from '../imports';
-import type { ImportDeclaration as EsImportDeclaration } from 'estree';
+import type { ImportDeclaration as EsImportDeclaration, Statement as EsStatement } from 'estree';
import type { TemplateOpts, TransformerContext } from './types';
export function createNewContext(templateOptions: TemplateOpts): {
@@ -33,6 +33,65 @@ export function createNewContext(templateOptions: TemplateOpts): {
}
return false;
};
+ const getLocalVars = () => localVarStack.flatMap((varsSet) => Array.from(varsSet));
+
+ const hoistedStatements = {
+ module: [] as EsStatement[],
+ templateFn: [] as EsStatement[],
+ };
+ const hoistedModuleDedupe = new Set