From 0db7875bc1515845e1f15813f2679368c1e81f2a Mon Sep 17 00:00:00 2001 From: Jo Date: Fri, 28 Jun 2024 14:56:29 +0200 Subject: [PATCH] [backend/frontend/shared] server-side plugins and basic spa frontend feat(backend): finish server-side plugin system feat(frontend): implement basic frontend with typescript, vite, vue and vue-router feat(shared/plugins): implement example-plugin, to showcase the server-side plugin implementation feat(shared/plugins): implement base file-structure for client-side plugins --- .idea/material_theme_project_new.xml | 4 +- apps/backend/package.json | 1 + apps/backend/src/app.module.ts | 2 +- .../src/common/plugins/plugin.interface.ts | 4 +- .../src/common/plugins/plugin.loader.ts | 4 +- .../src/common/plugins/plugin.module.ts | 9 +- .../src/common/plugins/plugin.service.ts | 16 ++-- apps/backend/src/main.ts | 4 - apps/frontend/.env.development | 4 + apps/frontend/.env.production | 4 + apps/frontend/.gitignore | 25 ++++++ apps/frontend/index.html | 18 ++++ apps/frontend/package.json | 20 ++++- apps/frontend/public/vite.png | Bin 0 -> 13144 bytes apps/frontend/public/vite.svg | 1 + apps/frontend/src/App.vue | 13 +++ apps/frontend/src/assets/vue.svg | 1 + apps/frontend/src/components/HelloWorld.vue | 38 +++++++++ apps/frontend/src/main.js | 0 apps/frontend/src/main.ts | 8 ++ apps/frontend/src/router.ts | 14 ++++ apps/frontend/src/routes/AboutView.vue | 6 ++ apps/frontend/src/routes/HomeView.vue | 6 ++ apps/frontend/src/style.css | 79 ++++++++++++++++++ apps/frontend/src/vite-env.d.ts | 1 + apps/frontend/tsconfig.json | 25 ++++++ apps/frontend/tsconfig.node.json | 17 ++++ apps/frontend/vite.config.ts | 13 +++ .../example-plugin/example-plugin.plugin.ts | 42 ++++++++-- .../plugins/example-plugin/tsconfig.json | 20 +++++ bun.lockb | Bin 195200 -> 225760 bytes 31 files changed, 369 insertions(+), 30 deletions(-) create mode 100644 apps/frontend/.env.development create mode 100644 apps/frontend/.env.production create mode 100644 apps/frontend/.gitignore create mode 100644 apps/frontend/index.html create mode 100644 apps/frontend/public/vite.png create mode 100644 apps/frontend/public/vite.svg create mode 100644 apps/frontend/src/App.vue create mode 100644 apps/frontend/src/assets/vue.svg create mode 100644 apps/frontend/src/components/HelloWorld.vue delete mode 100644 apps/frontend/src/main.js create mode 100644 apps/frontend/src/main.ts create mode 100644 apps/frontend/src/router.ts create mode 100644 apps/frontend/src/routes/AboutView.vue create mode 100644 apps/frontend/src/routes/HomeView.vue create mode 100644 apps/frontend/src/style.css create mode 100644 apps/frontend/src/vite-env.d.ts create mode 100644 apps/frontend/tsconfig.json create mode 100644 apps/frontend/tsconfig.node.json create mode 100644 apps/frontend/vite.config.ts create mode 100644 apps/shared/plugins/example-plugin/tsconfig.json diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml index 4cfa67d..bf4105a 100644 --- a/.idea/material_theme_project_new.xml +++ b/.idea/material_theme_project_new.xml @@ -3,7 +3,9 @@ diff --git a/apps/backend/package.json b/apps/backend/package.json index ced3a46..6fa64dc 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -16,6 +16,7 @@ "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", "@nestjs/typeorm": "^10.0.1", + "ascii-table": "^0.0.9", "glob": "^10.4.2", "mongodb": "^6.7.0", "pg": "^8.11.3", diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts index 2fab81f..6edf59d 100644 --- a/apps/backend/src/app.module.ts +++ b/apps/backend/src/app.module.ts @@ -1,4 +1,4 @@ -import { Module, type Type } from '@nestjs/common'; +import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { User } from './entities/user.entity'; import { PluginModule } from "./common/plugins/plugin.module"; diff --git a/apps/backend/src/common/plugins/plugin.interface.ts b/apps/backend/src/common/plugins/plugin.interface.ts index 3c8e041..ffe1d28 100644 --- a/apps/backend/src/common/plugins/plugin.interface.ts +++ b/apps/backend/src/common/plugins/plugin.interface.ts @@ -1,5 +1,3 @@ -import {INestApplication} from "@nestjs/common"; - export interface Plugin { - register(app: INestApplication): void + register(): void } \ No newline at end of file diff --git a/apps/backend/src/common/plugins/plugin.loader.ts b/apps/backend/src/common/plugins/plugin.loader.ts index f4ac565..6f0ee98 100644 --- a/apps/backend/src/common/plugins/plugin.loader.ts +++ b/apps/backend/src/common/plugins/plugin.loader.ts @@ -1,9 +1,9 @@ import { glob } from 'glob'; import { join } from 'path'; -export async function loadPlugins(): Promise { +export async function loadPlugins(): Promise { return new Promise(async (resolve, reject) => { - const files = await glob('homespace-shared/plugins/**/*.plugin.{ts,js}'); + const files = await glob('../shared/plugins/**/*.plugin.{ts,js}'); console.log(files) diff --git a/apps/backend/src/common/plugins/plugin.module.ts b/apps/backend/src/common/plugins/plugin.module.ts index 97c7c09..a8ab660 100644 --- a/apps/backend/src/common/plugins/plugin.module.ts +++ b/apps/backend/src/common/plugins/plugin.module.ts @@ -1,6 +1,5 @@ -import { Module, DynamicModule, Global, type Type } from '@nestjs/common'; +import { Module, DynamicModule, Global } from '@nestjs/common'; import { PluginService } from './plugin.service'; -import { type Plugin } from './plugin.interface'; import { loadPlugins } from './plugin.loader'; @Global() @@ -9,8 +8,14 @@ export class PluginModule { static async register(): Promise { const plugins = await loadPlugins(); + const pluginModules = plugins.map(pluginClass => { + const pluginInstance = new pluginClass(); + return pluginInstance.getModule(); + }) + return { module: PluginModule, + imports: [...pluginModules], providers: [ PluginService, ...plugins, diff --git a/apps/backend/src/common/plugins/plugin.service.ts b/apps/backend/src/common/plugins/plugin.service.ts index ea9c1df..b7bc7c6 100644 --- a/apps/backend/src/common/plugins/plugin.service.ts +++ b/apps/backend/src/common/plugins/plugin.service.ts @@ -1,18 +1,14 @@ -import {Injectable, OnModuleInit, Inject, type Type, INestApplication} from '@nestjs/common'; +import { Injectable, OnModuleInit, Inject, type Type } from '@nestjs/common'; import { type Plugin } from './plugin.interface'; @Injectable() -export class PluginService { - private plugins: Type[] = []; +export class PluginService implements OnModuleInit { + constructor(@Inject('PLUGIN_PROVIDERS') private readonly pluginProviders: Type[]) {} - constructor(@Inject('PLUGIN_PROVIDERS') private readonly pluginProviders: Type[]) { - this.plugins = pluginProviders; - } - - initializePlugins(app: INestApplication) { - this.plugins.forEach(plugin => { + onModuleInit() { + this.pluginProviders.forEach(plugin => { const pluginInstance = new plugin(); - pluginInstance.register(app); + pluginInstance.register(); }); } } \ No newline at end of file diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index 8eb642d..71df0f3 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -1,13 +1,9 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; -import { PluginService } from "./common/plugins/plugin.service"; async function bootstrap() { const app = await NestFactory.create(AppModule); - const pluginService = app.get(PluginService); - pluginService.initializePlugins(app); - await app.listen(4300); } diff --git a/apps/frontend/.env.development b/apps/frontend/.env.development new file mode 100644 index 0000000..a77284a --- /dev/null +++ b/apps/frontend/.env.development @@ -0,0 +1,4 @@ +# .env.development +VITE_APP_TITLE=HomeSpace +VITE_APP_DESC='The HomeSpace project' +VITE_APP_URL=http://localhost:5173/ \ No newline at end of file diff --git a/apps/frontend/.env.production b/apps/frontend/.env.production new file mode 100644 index 0000000..4d7afbc --- /dev/null +++ b/apps/frontend/.env.production @@ -0,0 +1,4 @@ +# .env.production +VITE_APP_TITLE=HomeSpace +VITE_APP_DESC='The HomeSpace project' +VITE_APP_URL=https://homespace.thevoid.cafe \ No newline at end of file diff --git a/apps/frontend/.gitignore b/apps/frontend/.gitignore new file mode 100644 index 0000000..0cadcc4 --- /dev/null +++ b/apps/frontend/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +!.vscode/tasks.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? \ No newline at end of file diff --git a/apps/frontend/index.html b/apps/frontend/index.html new file mode 100644 index 0000000..d4d309b --- /dev/null +++ b/apps/frontend/index.html @@ -0,0 +1,18 @@ + + + + + + + %VITE_APP_TITLE% + + + + + + + +
+ + + \ No newline at end of file diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 1417fef..e4f98a0 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -1,4 +1,22 @@ { "name": "homespace-frontend", - "version": "0.0.1" + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@types/node": "^20.14.9", + "@vitejs/plugin-vue": "^5.0.5", + "typescript": "^5.5.2", + "vite": "^5.3.2", + "vue-tsc": "^2.0.22" + }, + "dependencies": { + "vue": "^3.4.31", + "vue-router": "^4.4.0" + } } \ No newline at end of file diff --git a/apps/frontend/public/vite.png b/apps/frontend/public/vite.png new file mode 100644 index 0000000000000000000000000000000000000000..78593164dcbdf986aa0bc167e885f2b277a839d2 GIT binary patch literal 13144 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 literal 0 HcmV?d00001 diff --git a/apps/frontend/public/vite.svg b/apps/frontend/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/apps/frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/frontend/src/App.vue b/apps/frontend/src/App.vue new file mode 100644 index 0000000..64c9f44 --- /dev/null +++ b/apps/frontend/src/App.vue @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/apps/frontend/src/assets/vue.svg b/apps/frontend/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/apps/frontend/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/frontend/src/components/HelloWorld.vue b/apps/frontend/src/components/HelloWorld.vue new file mode 100644 index 0000000..df8ed84 --- /dev/null +++ b/apps/frontend/src/components/HelloWorld.vue @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/apps/frontend/src/main.js b/apps/frontend/src/main.js deleted file mode 100644 index e69de29..0000000 diff --git a/apps/frontend/src/main.ts b/apps/frontend/src/main.ts new file mode 100644 index 0000000..f32225b --- /dev/null +++ b/apps/frontend/src/main.ts @@ -0,0 +1,8 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' +import { router } from './router.ts'; + +createApp(App) + .use(router) + .mount('#app') \ No newline at end of file diff --git a/apps/frontend/src/router.ts b/apps/frontend/src/router.ts new file mode 100644 index 0000000..b06babd --- /dev/null +++ b/apps/frontend/src/router.ts @@ -0,0 +1,14 @@ +import { createWebHistory, createRouter } from 'vue-router' + +import HomeView from './routes/HomeView.vue' +import AboutView from './routes/AboutView.vue' + +const routes = [ + { path: '/', component: HomeView }, + { path: '/about', component: AboutView }, +] + +export const router = createRouter({ + history: createWebHistory(), + routes, +}) \ No newline at end of file diff --git a/apps/frontend/src/routes/AboutView.vue b/apps/frontend/src/routes/AboutView.vue new file mode 100644 index 0000000..3af429b --- /dev/null +++ b/apps/frontend/src/routes/AboutView.vue @@ -0,0 +1,6 @@ + + + diff --git a/apps/frontend/src/routes/HomeView.vue b/apps/frontend/src/routes/HomeView.vue new file mode 100644 index 0000000..38d69cb --- /dev/null +++ b/apps/frontend/src/routes/HomeView.vue @@ -0,0 +1,6 @@ + + + diff --git a/apps/frontend/src/style.css b/apps/frontend/src/style.css new file mode 100644 index 0000000..25356ed --- /dev/null +++ b/apps/frontend/src/style.css @@ -0,0 +1,79 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +.card { + padding: 2em; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} \ No newline at end of file diff --git a/apps/frontend/src/vite-env.d.ts b/apps/frontend/src/vite-env.d.ts new file mode 100644 index 0000000..151aa68 --- /dev/null +++ b/apps/frontend/src/vite-env.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/apps/frontend/tsconfig.json b/apps/frontend/tsconfig.json new file mode 100644 index 0000000..ee019e9 --- /dev/null +++ b/apps/frontend/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} \ No newline at end of file diff --git a/apps/frontend/tsconfig.node.json b/apps/frontend/tsconfig.node.json new file mode 100644 index 0000000..f5c7296 --- /dev/null +++ b/apps/frontend/tsconfig.node.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + /* Paths */ + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": [ + "vite.config.ts" + ] +} \ No newline at end of file diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts new file mode 100644 index 0000000..dee1613 --- /dev/null +++ b/apps/frontend/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import path from 'node:path' + +// https://vitejs.dev/config/ +export default defineConfig({ + resolve: { + alias: { + '@': path.resolve(__dirname, './src') + } + }, + plugins: [vue()] +}) \ No newline at end of file diff --git a/apps/shared/plugins/example-plugin/example-plugin.plugin.ts b/apps/shared/plugins/example-plugin/example-plugin.plugin.ts index dbcfac3..9ea02a8 100644 --- a/apps/shared/plugins/example-plugin/example-plugin.plugin.ts +++ b/apps/shared/plugins/example-plugin/example-plugin.plugin.ts @@ -1,8 +1,38 @@ -// Todo: create example plugin -import { type Plugin } from "homespace-backend/src/common/plugins/plugin.interface"; +import { type Plugin } from 'homespace-backend/src/common/plugins/plugin.interface'; +import { Injectable, Controller, Get, Module, Logger } from '@nestjs/common'; -export class ExamplePlugin implements Plugin { - register() { - console.log("plugin registered: ExamplePlugin"); +// Service +@Injectable() +class ExampleService { + getData(): { plugin: string } { + return { plugin: "example-plugin" }; } -} \ No newline at end of file +} + +// Controller +@Controller('example') +class ExampleController { + constructor(private readonly exampleService: ExampleService) {} + + @Get() + getExampleData(): { plugin: string } { + return this.exampleService.getData(); + } +} + +// Plugin +export class ExamplePlugin implements Plugin { + getModule() { + @Module({ + controllers: [ExampleController], + providers: [ExampleService], + }) + class ExampleModule {} + + return ExampleModule; + } + + register(): void { + Logger.log('Example Plugin Registered', 'ExamplePlugin'); + } +} diff --git a/apps/shared/plugins/example-plugin/tsconfig.json b/apps/shared/plugins/example-plugin/tsconfig.json new file mode 100644 index 0000000..d0aa348 --- /dev/null +++ b/apps/shared/plugins/example-plugin/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "ES2021", + "sourceMap": true, + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false + } +} diff --git a/bun.lockb b/bun.lockb index d941ab861535d88d69b65be47c126a70822c1827..d8a3d690a2bf1eb0e2c61cae49cc861c2c1a1d7d 100755 GIT binary patch delta 57718 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 RgJ)W7N?5!Z@Q8oe{{gSJS=ayo