From 3e58a944a7262b655d0f4331400cc84adc6ce3bc Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Thu, 8 Feb 2024 16:07:02 +0100 Subject: [PATCH] enh: Allow sharing JavaScript modules across apps and core Initially `vue` and `@nextcloud/vue` are shared by server core. Signed-off-by: Ferdinand Thiessen --- .../BeforeTemplateRenderedListener.php | 4 +++ core/src/modules/nextcloud-vue.ts | 1 + core/src/modules/vue.ts | 4 +++ lib/private/TemplateLayout.php | 8 +++++ lib/private/legacy/template/functions.php | 9 ++++-- lib/public/Util.php | 29 +++++++++++++++++++ server.modules.mjs | 4 ++- vite.config.mjs | 1 + 8 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 core/src/modules/nextcloud-vue.ts create mode 100644 core/src/modules/vue.ts diff --git a/core/Listener/BeforeTemplateRenderedListener.php b/core/Listener/BeforeTemplateRenderedListener.php index e1bda246afe4b..e850e46ddc82c 100644 --- a/core/Listener/BeforeTemplateRenderedListener.php +++ b/core/Listener/BeforeTemplateRenderedListener.php @@ -43,6 +43,10 @@ public function handle(Event $event): void { return; } + // Modules we share everywhere + Util::addSharedModule('core', 'shared-vue', 'vue'); + Util::addSharedModule('core', 'shared-nextcloud-vue', '@nextcloud/vue'); + if ($event->getResponse()->getRenderAs() === TemplateResponse::RENDER_AS_USER) { // Making sure to inject just after core Util::addScript('core', 'unsupported-browser-redirect'); diff --git a/core/src/modules/nextcloud-vue.ts b/core/src/modules/nextcloud-vue.ts new file mode 100644 index 0000000000000..350604d036c01 --- /dev/null +++ b/core/src/modules/nextcloud-vue.ts @@ -0,0 +1 @@ +export * from '@nextcloud/vue' diff --git a/core/src/modules/vue.ts b/core/src/modules/vue.ts new file mode 100644 index 0000000000000..9b25ab1430d6d --- /dev/null +++ b/core/src/modules/vue.ts @@ -0,0 +1,4 @@ +import Vue from 'vue' + +export * from 'vue' +export default Vue diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php index b4490dfe101d0..4e28a9e4362ca 100644 --- a/lib/private/TemplateLayout.php +++ b/lib/private/TemplateLayout.php @@ -274,6 +274,14 @@ public function __construct($renderAs, $appId = '') { $this->append('jsfiles', $web.'/'.$file . $this->getVersionHashSuffix()); } + $jsModules = array_map(function (string $path) { + $info = end(self::findJavascriptFiles([$path])); + $web = $info[1]; + $file = $info[2]; + return $web . '/' . $file . $this->getVersionHashSuffix(); + }, Util::getSharedModules()); + $this->assign('jsmodules', $jsModules); + try { $pathInfo = \OC::$server->getRequest()->getPathInfo(); } catch (\Exception $e) { diff --git a/lib/private/legacy/template/functions.php b/lib/private/legacy/template/functions.php index bcc0906dcdfb3..bbd435778a138 100644 --- a/lib/private/legacy/template/functions.php +++ b/lib/private/legacy/template/functions.php @@ -80,10 +80,10 @@ function emit_script_tag(string $src, string $script_content = '', string $conte $defer_str = ' defer'; $type = $content_type !== '' ? ' type="' . $content_type . '"' : ''; - $s = '