From b5fe8508b15b96e0686d547b9071601f66e6d928 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Thu, 20 May 2021 10:22:08 +0200 Subject: [PATCH] [ackaged plugins for electron optimalization --- .github/workflows/build-app-beta.yaml | 3 ++ .github/workflows/build-app.yaml | 3 ++ .gitignore | 1 + fillPackagedPlugins.js | 23 +++++++++++++ package.json | 4 ++- packages/api/src/controllers/plugins.js | 44 +++++++++++++++++-------- resetPackagedPlugins.js | 3 ++ 7 files changed, 67 insertions(+), 14 deletions(-) create mode 100644 fillPackagedPlugins.js create mode 100644 resetPackagedPlugins.js diff --git a/.github/workflows/build-app-beta.yaml b/.github/workflows/build-app-beta.yaml index 7f33bd52e..33feb1c8f 100644 --- a/.github/workflows/build-app-beta.yaml +++ b/.github/workflows/build-app-beta.yaml @@ -35,6 +35,9 @@ jobs: - name: fillNativeModulesElectron run: | yarn fillNativeModulesElectron + - name: fillPackagedPlugins + run: | + yarn fillPackagedPlugins - name: Install Snapcraft if: matrix.os == 'ubuntu-18.04' uses: samuelmeuli/action-snapcraft@v1 diff --git a/.github/workflows/build-app.yaml b/.github/workflows/build-app.yaml index 5af9d11b1..86368c37d 100644 --- a/.github/workflows/build-app.yaml +++ b/.github/workflows/build-app.yaml @@ -39,6 +39,9 @@ jobs: - name: fillNativeModulesElectron run: | yarn fillNativeModulesElectron + - name: fillPackagedPlugins + run: | + yarn fillPackagedPlugins - name: Install Snapcraft if: matrix.os == 'ubuntu-18.04' uses: samuelmeuli/action-snapcraft@v1 diff --git a/.gitignore b/.gitignore index 718d20748..686ceb6c6 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,5 @@ yarn-debug.log* yarn-error.log* app/src/nativeModulesContent.js packages/api/src/nativeModulesContent.js +packages/api/src/packagedPluginsContent.js .VSCodeCounter \ No newline at end of file diff --git a/fillPackagedPlugins.js b/fillPackagedPlugins.js new file mode 100644 index 000000000..43ccd79ae --- /dev/null +++ b/fillPackagedPlugins.js @@ -0,0 +1,23 @@ +const fs = require('fs'); +const path = require('path'); + +function load() { + const plugins = {}; + + for (const packageName of fs.readdirSync('plugins')) { + if (!packageName.startsWith('dbgate-plugin-')) continue; + const dir = path.join('plugins', packageName); + const frontend = fs.readFileSync(path.join(dir, 'dist', 'frontend.js'), 'utf-8'); + const readme = fs.readFileSync(path.join(dir, 'README.md'), 'utf-8'); + const manifest = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf-8')); + plugins[packageName] = { + manifest, + frontend, + readme, + }; + } + + return plugins; +} + +fs.writeFileSync('packages/api/src/packagedPluginsContent.js', `module.exports = () => (${JSON.stringify(load())});`); diff --git a/package.json b/package.json index 608cbb4e8..dd82107da 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,8 @@ "generatePadFile": "node generatePadFile", "fillNativeModules": "node fillNativeModules", "fillNativeModulesElectron": "node fillNativeModules --electron", + "fillPackagedPlugins": "node fillPackagedPlugins", + "resetPackagedPlugins": "node resetPackagedPlugins", "prettier": "prettier --write packages/api/src && prettier --write packages/datalib/src && prettier --write packages/filterparser/src && prettier --write packages/sqltree/src && prettier --write packages/tools/src && prettier --write packages/types && prettier --write packages/web/src && prettier --write app/src", "copy:docker:build": "copyfiles packages/api/dist/* docker -f && copyfiles packages/web/public/* docker -u 2 && copyfiles \"packages/web/public/**/*\" docker -u 2 && copyfiles \"plugins/dist/**/*\" docker/plugins -u 2", "prepare:docker": "yarn plugins:copydist && yarn build:web:docker && yarn build:api && yarn copy:docker:build", @@ -40,7 +42,7 @@ "ts:api": "yarn workspace dbgate-api ts", "ts:web": "yarn workspace dbgate-web ts", "ts": "yarn ts:api && yarn ts:web", - "postinstall": "yarn build:lib && patch-package && yarn fillNativeModules && yarn build:plugins:frontend" + "postinstall": "yarn resetPackagedPlugins && yarn build:lib && patch-package && yarn fillNativeModules && yarn build:plugins:frontend" }, "dependencies": { "concurrently": "^5.1.0", diff --git a/packages/api/src/controllers/plugins.js b/packages/api/src/controllers/plugins.js index 6800ba791..c45545285 100644 --- a/packages/api/src/controllers/plugins.js +++ b/packages/api/src/controllers/plugins.js @@ -9,10 +9,17 @@ const requirePlugin = require('../shell/requirePlugin'); const downloadPackage = require('../utility/downloadPackage'); const hasPermission = require('../utility/hasPermission'); const _ = require('lodash'); +const packagedPluginsContent = require('../packagedPluginsContent'); module.exports = { script_meta: 'get', async script({ packageName }) { + const packagedContent = packagedPluginsContent(); + + if (packagedContent && packagedContent[packageName]) { + return packagedContent[packageName].frontend; + } + const file1 = path.join(packagedPluginsDir(), packageName, 'dist', 'frontend.js'); const file2 = path.join(pluginsdir(), packageName, 'dist', 'frontend.js'); // @ts-ignore @@ -58,26 +65,37 @@ module.exports = { installed_meta: 'get', async installed() { - const files1 = await fs.readdir(packagedPluginsDir()); + const packagedContent = packagedPluginsContent(); + + const files1 = packagedContent ? _.keys(packagedContent) : await fs.readdir(packagedPluginsDir()); const files2 = await fs.readdir(pluginsdir()); const res = []; for (const packageName of _.union(files1, files2)) { if (!/^dbgate-plugin-.*$/.test(packageName)) continue; try { - const isPackaged = files1.includes(packageName); - const manifest = await fs - .readFile(path.join(isPackaged ? packagedPluginsDir() : pluginsdir(), packageName, 'package.json'), { - encoding: 'utf-8', - }) - .then(x => JSON.parse(x)); - const readmeFile = path.join(isPackaged ? packagedPluginsDir() : pluginsdir(), packageName, 'README.md'); - // @ts-ignore - if (await fs.exists(readmeFile)) { - manifest.readme = await fs.readFile(readmeFile, { encoding: 'utf-8' }); + if (packagedContent && packagedContent[packageName]) { + const manifest = { + ...packagedContent[packageName].manifest, + }; + manifest.isPackaged = true; + manifest.readme = packagedContent[packageName].readme; + res.push(manifest); + } else { + const isPackaged = files1.includes(packageName); + const manifest = await fs + .readFile(path.join(isPackaged ? packagedPluginsDir() : pluginsdir(), packageName, 'package.json'), { + encoding: 'utf-8', + }) + .then(x => JSON.parse(x)); + const readmeFile = path.join(isPackaged ? packagedPluginsDir() : pluginsdir(), packageName, 'README.md'); + // @ts-ignore + if (await fs.exists(readmeFile)) { + manifest.readme = await fs.readFile(readmeFile, { encoding: 'utf-8' }); + } + manifest.isPackaged = isPackaged; + res.push(manifest); } - manifest.isPackaged = isPackaged; - res.push(manifest); } catch (err) { console.log(`Skipped plugin ${packageName}, error:`, err.message); } diff --git a/resetPackagedPlugins.js b/resetPackagedPlugins.js new file mode 100644 index 000000000..f140b1a14 --- /dev/null +++ b/resetPackagedPlugins.js @@ -0,0 +1,3 @@ +const fs = require('fs'); + +fs.writeFileSync('packages/api/src/packagedPluginsContent.js', `module.exports = () => null;`);