diff --git a/symfony/ux-react/2.8/manifest.json b/symfony/ux-react/2.8/manifest.json
new file mode 100644
index 000000000..be0ff742e
--- /dev/null
+++ b/symfony/ux-react/2.8/manifest.json
@@ -0,0 +1,5 @@
+{
+ "bundles": {
+ "Symfony\\UX\\React\\ReactBundle": ["all"]
+ }
+}
diff --git a/symfony/ux-react/2.9/assets/react/controllers/Hello.jsx b/symfony/ux-react/2.9/assets/react/controllers/Hello.jsx
new file mode 100644
index 000000000..54fe3686c
--- /dev/null
+++ b/symfony/ux-react/2.9/assets/react/controllers/Hello.jsx
@@ -0,0 +1,5 @@
+import React from 'react';
+
+export default function (props) {
+ return
Hello {props.fullName}
;
+}
diff --git a/symfony/ux-react/2.9/manifest.json b/symfony/ux-react/2.9/manifest.json
new file mode 100644
index 000000000..444d845b1
--- /dev/null
+++ b/symfony/ux-react/2.9/manifest.json
@@ -0,0 +1,40 @@
+{
+ "bundles": {
+ "Symfony\\UX\\React\\ReactBundle": ["all"]
+ },
+ "copy-from-recipe": {
+ "assets/": "assets/"
+ },
+ "conflict": {
+ "symfony/webpack-encore-bundle": "<2.0",
+ "symfony/flex": "<1.20.0 || >=2.0.0,<2.3.0"
+ },
+ "add-lines": [
+ {
+ "file": "webpack.config.js",
+ "content": "\n .enableReactPreset()",
+ "position": "after_target",
+ "target": ".splitEntryChunks()"
+ },
+ {
+ "file": "assets/app.js",
+ "content": "import { registerReactControllerComponents } from '@symfony/ux-react';",
+ "position": "top",
+ "warn_if_missing": true
+ },
+ {
+ "file": "assets/app.js",
+ "content": "registerReactControllerComponents(require.context('./react/controllers', true, /\\.(j|t)sx?$/));",
+ "position": "bottom",
+ "warn_if_missing": true,
+ "requires": "symfony/webpack-encore-bundle"
+ },
+ {
+ "file": "assets/app.js",
+ "content": "registerReactControllerComponents();",
+ "position": "bottom",
+ "warn_if_missing": true,
+ "requires": "symfony/asset-mapper"
+ }
+ ]
+}
diff --git a/symfony/ux-svelte/2.8/manifest.json b/symfony/ux-svelte/2.8/manifest.json
new file mode 100644
index 000000000..7c82371ec
--- /dev/null
+++ b/symfony/ux-svelte/2.8/manifest.json
@@ -0,0 +1,5 @@
+{
+ "bundles": {
+ "Symfony\\UX\\Svelte\\SvelteBundle": ["all"]
+ }
+}
diff --git a/symfony/ux-svelte/2.9/assets/svelte/controllers/Hello.svelte b/symfony/ux-svelte/2.9/assets/svelte/controllers/Hello.svelte
new file mode 100644
index 000000000..3499af48b
--- /dev/null
+++ b/symfony/ux-svelte/2.9/assets/svelte/controllers/Hello.svelte
@@ -0,0 +1,5 @@
+
+
+Hello {name}
diff --git a/symfony/ux-svelte/2.9/manifest.json b/symfony/ux-svelte/2.9/manifest.json
new file mode 100644
index 000000000..c5e3457b8
--- /dev/null
+++ b/symfony/ux-svelte/2.9/manifest.json
@@ -0,0 +1,40 @@
+{
+ "bundles": {
+ "Symfony\\UX\\Svelte\\SvelteBundle": ["all"]
+ },
+ "copy-from-recipe": {
+ "assets/": "assets/"
+ },
+ "conflict": {
+ "symfony/webpack-encore-bundle": "<2.0",
+ "symfony/flex": "<1.20.0 || >=2.0.0,<2.3.0"
+ },
+ "add-lines": [
+ {
+ "file": "webpack.config.js",
+ "content": "\n .enableSvelte()",
+ "position": "after_target",
+ "target": ".splitEntryChunks()"
+ },
+ {
+ "file": "assets/app.js",
+ "content": "import { registerSvelteControllerComponents } from '@symfony/ux-svelte';",
+ "position": "top",
+ "warn_if_missing": true
+ },
+ {
+ "file": "assets/app.js",
+ "content": "registerSvelteControllerComponents(require.context('./svelte/controllers', true, /\\.svelte$/));",
+ "position": "bottom",
+ "warn_if_missing": true,
+ "requires": "symfony/webpack-encore-bundle"
+ },
+ {
+ "file": "assets/app.js",
+ "content": "registerSvelteControllerComponents();",
+ "position": "bottom",
+ "warn_if_missing": true,
+ "requires": "symfony/asset-mapper"
+ }
+ ]
+}
diff --git a/symfony/ux-vue/2.8/manifest.json b/symfony/ux-vue/2.8/manifest.json
new file mode 100644
index 000000000..9010c6f25
--- /dev/null
+++ b/symfony/ux-vue/2.8/manifest.json
@@ -0,0 +1,5 @@
+{
+ "bundles": {
+ "Symfony\\UX\\Vue\\VueBundle": ["all"]
+ }
+}
diff --git a/symfony/ux-vue/2.9/assets/vue/controllers/Hello.vue b/symfony/ux-vue/2.9/assets/vue/controllers/Hello.vue
new file mode 100644
index 000000000..2812aa432
--- /dev/null
+++ b/symfony/ux-vue/2.9/assets/vue/controllers/Hello.vue
@@ -0,0 +1,9 @@
+
+ Hello {{ name }}!
+
+
+
diff --git a/symfony/ux-vue/2.9/manifest.json b/symfony/ux-vue/2.9/manifest.json
new file mode 100644
index 000000000..2682a6221
--- /dev/null
+++ b/symfony/ux-vue/2.9/manifest.json
@@ -0,0 +1,40 @@
+{
+ "bundles": {
+ "Symfony\\UX\\Vue\\VueBundle": ["all"]
+ },
+ "copy-from-recipe": {
+ "assets/": "assets/"
+ },
+ "conflict": {
+ "symfony/webpack-encore-bundle": "<2.0",
+ "symfony/flex": "<1.20.0 || >=2.0.0,<2.3.0"
+ },
+ "add-lines": [
+ {
+ "file": "webpack.config.js",
+ "content": "\n .enableVueLoader()",
+ "position": "after_target",
+ "target": ".splitEntryChunks()"
+ },
+ {
+ "file": "assets/app.js",
+ "content": "import { registerVueControllerComponents } from '@symfony/ux-vue';",
+ "position": "top",
+ "warn_if_missing": true
+ },
+ {
+ "file": "assets/app.js",
+ "content": "registerVueControllerComponents(require.context('./vue/controllers', true, /\\.vue$/));",
+ "position": "bottom",
+ "warn_if_missing": true,
+ "requires": "symfony/webpack-encore-bundle"
+ },
+ {
+ "file": "assets/app.js",
+ "content": "registerVueControllerComponents();",
+ "position": "bottom",
+ "warn_if_missing": true,
+ "requires": "symfony/asset-mapper"
+ }
+ ]
+}