From d3a5c97c0e1db0a4835c286ad2e9e14d173cc686 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Sat, 12 Oct 2024 22:14:34 +0700 Subject: [PATCH] feat: check plugins --- .gitignore | 2 +- .gitmodules | 6 ++ apps/backend/src/app.module.ts | 25 +++++---- apps/frontend/next-env.d.ts | 2 +- build.plugins.js | 77 ++++++++++++++++++++++++++ libraries/plugins/.eslintrc.json | 18 ++++++ libraries/plugins/README.md | 3 + libraries/plugins/project.json | 13 +++++ libraries/plugins/src/list/public-api | 1 + libraries/plugins/src/plugin.module.ts | 13 +++++ libraries/plugins/src/plugins.ts | 3 + libraries/plugins/tsconfig.json | 18 ++++++ libraries/plugins/tsconfig.lib.json | 10 ++++ package.json | 3 +- tsconfig.base.json | 3 +- 15 files changed, 182 insertions(+), 15 deletions(-) create mode 100644 .gitmodules create mode 100644 build.plugins.js create mode 100644 libraries/plugins/.eslintrc.json create mode 100644 libraries/plugins/README.md create mode 100644 libraries/plugins/project.json create mode 160000 libraries/plugins/src/list/public-api create mode 100644 libraries/plugins/src/plugin.module.ts create mode 100644 libraries/plugins/src/plugins.ts create mode 100644 libraries/plugins/tsconfig.json create mode 100644 libraries/plugins/tsconfig.lib.json diff --git a/.gitignore b/.gitignore index f2be1821..5f37162d 100644 --- a/.gitignore +++ b/.gitignore @@ -54,4 +54,4 @@ Thumbs.db *.tsbuildinfo # ignore Secrets folder -.secrets/ +.secrets/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..9a2b601a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "libraries/plugins/src/list/--force"] + path = libraries/plugins/src/list/--force + url = git@notifire:gitroomhq/public-api.git +[submodule "libraries/plugins/src/list/public-api"] + path = libraries/plugins/src/list/public-api + url = git@notifire:gitroomhq/public-api.git diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts index f2f81a3f..154dff84 100644 --- a/apps/backend/src/app.module.ts +++ b/apps/backend/src/app.module.ts @@ -1,21 +1,24 @@ -import {Global, Module} from '@nestjs/common'; +import { Global, Module } from '@nestjs/common'; -import {DatabaseModule} from "@gitroom/nestjs-libraries/database/prisma/database.module"; -import {ApiModule} from "@gitroom/backend/api/api.module"; -import {APP_GUARD} from "@nestjs/core"; -import {PoliciesGuard} from "@gitroom/backend/services/auth/permissions/permissions.guard"; +import { DatabaseModule } from '@gitroom/nestjs-libraries/database/prisma/database.module'; +import { ApiModule } from '@gitroom/backend/api/api.module'; +import { APP_GUARD } from '@nestjs/core'; +import { PoliciesGuard } from '@gitroom/backend/services/auth/permissions/permissions.guard'; import { BullMqModule } from '@gitroom/nestjs-libraries/bull-mq-transport-new/bull.mq.module'; +import { PluginModule } from '@gitroom/plugins/plugin.module'; @Global() @Module({ - imports: [BullMqModule, DatabaseModule, ApiModule], + imports: [BullMqModule, DatabaseModule, ApiModule, PluginModule], controllers: [], - providers: [{ - provide: APP_GUARD, - useClass: PoliciesGuard - }], + providers: [ + { + provide: APP_GUARD, + useClass: PoliciesGuard, + }, + ], get exports() { return [...this.imports]; - } + }, }) export class AppModule {} diff --git a/apps/frontend/next-env.d.ts b/apps/frontend/next-env.d.ts index 4f11a03d..40c3d680 100644 --- a/apps/frontend/next-env.d.ts +++ b/apps/frontend/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/build.plugins.js b/build.plugins.js new file mode 100644 index 00000000..c7fcde93 --- /dev/null +++ b/build.plugins.js @@ -0,0 +1,77 @@ +const { readdirSync, statSync, writeFileSync } = require('fs'); +const { join } = require('path'); + +function isNonEmptyFolder(folderPath) { + const items = readdirSync(folderPath); + // Check if there are any items in the folder + return items.some((item) => { + const fullPath = join(folderPath, item); + // Check if the item is a file or a non-empty directory + const stats = statSync(fullPath); + if (stats.isDirectory()) { + return isNonEmptyFolder(fullPath); // Recursively check subfolders + } + return true; // It's a file + }); +} + +// Function to get all non-empty folders +function getNonEmptyFolders(rootFolder) { + const result = []; + const items = readdirSync(rootFolder); + + items.forEach((item) => { + const fullPath = join(rootFolder, item); + const stats = statSync(fullPath); + if (stats.isDirectory() && isNonEmptyFolder(fullPath)) { + result.push(item); + } + }); + + return result; +} +const abc = [ + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + 'y', + 'z', +]; +const list = getNonEmptyFolders('./libraries/plugins/src/list'); +const fileContent = `${list + .map((p, index) => { + return `import Module${abc[ + index + ].toUpperCase()} from '@gitroom/plugins/list/${p}/backend/module';`; + }) + .join('\n')} + +export default [${list + .map((p, index) => { + return `Module${abc[index].toUpperCase()}`; + }) + .join(', ')}]; +`; + +writeFileSync('./libraries/plugins/src/plugins.ts', fileContent); diff --git a/libraries/plugins/.eslintrc.json b/libraries/plugins/.eslintrc.json new file mode 100644 index 00000000..9d9c0db5 --- /dev/null +++ b/libraries/plugins/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/libraries/plugins/README.md b/libraries/plugins/README.md new file mode 100644 index 00000000..8690b148 --- /dev/null +++ b/libraries/plugins/README.md @@ -0,0 +1,3 @@ +# plugins + +This library was generated with [Nx](https://nx.dev). diff --git a/libraries/plugins/project.json b/libraries/plugins/project.json new file mode 100644 index 00000000..0070fb88 --- /dev/null +++ b/libraries/plugins/project.json @@ -0,0 +1,13 @@ +{ + "name": "plugins", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libraries/plugins/src", + "projectType": "library", + "targets": { + "lint": { + "executor": "@nx/eslint:lint", + "outputs": ["{options.outputFile}"] + } + }, + "tags": [] +} diff --git a/libraries/plugins/src/list/public-api b/libraries/plugins/src/list/public-api new file mode 160000 index 00000000..ebdb67cc --- /dev/null +++ b/libraries/plugins/src/list/public-api @@ -0,0 +1 @@ +Subproject commit ebdb67cc66976b00b74d6717d6c012d94a7644c3 diff --git a/libraries/plugins/src/plugin.module.ts b/libraries/plugins/src/plugin.module.ts new file mode 100644 index 00000000..a30d3db1 --- /dev/null +++ b/libraries/plugins/src/plugin.module.ts @@ -0,0 +1,13 @@ +import {Global, Module} from '@nestjs/common'; +import module from './plugins'; + +@Global() +@Module({ + imports: [...module], + controllers: [], + providers: [], + get exports() { + return [...this.imports]; + } +}) +export class PluginModule {} diff --git a/libraries/plugins/src/plugins.ts b/libraries/plugins/src/plugins.ts new file mode 100644 index 00000000..b85ed130 --- /dev/null +++ b/libraries/plugins/src/plugins.ts @@ -0,0 +1,3 @@ + + +export default []; diff --git a/libraries/plugins/tsconfig.json b/libraries/plugins/tsconfig.json new file mode 100644 index 00000000..d6072f46 --- /dev/null +++ b/libraries/plugins/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/libraries/plugins/tsconfig.lib.json b/libraries/plugins/tsconfig.lib.json new file mode 100644 index 00000000..faa09cc1 --- /dev/null +++ b/libraries/plugins/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/package.json b/package.json index 06cd8dcd..522c62a7 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "build:frontend": "npx nx run frontend:build:production", "dev:frontend": "npx nx run frontend:serve:development", "dev:backend": "npx nx run backend:serve:development", + "update-plugins": "node ./build.plugins.js", "dev:workers": "npx nx run workers:serve:development", "dev:cron": "npx nx run cron:serve:development", "dev:docker": "docker compose -f ./docker-compose.dev.yaml up -d", @@ -27,7 +28,7 @@ "prisma-reset": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma db push --force-reset && npx prisma db push", "docker-build": "./var/docker/docker-build.sh", "docker-create": "./var/docker/docker-create.sh", - "postinstall": "npm run prisma-generate" + "postinstall": "npm run update-plugins && npm run prisma-generate" }, "private": true, "dependencies": { diff --git a/tsconfig.base.json b/tsconfig.base.json index daf74911..caf8b5df 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -26,7 +26,8 @@ "@gitroom/helpers/*": ["libraries/helpers/src/*"], "@gitroom/nestjs-libraries/*": ["libraries/nestjs-libraries/src/*"], "@gitroom/react/*": ["libraries/react-shared-libraries/src/*"], - "@gitroom/workers/*": ["apps/workers/src/*"] + "@gitroom/plugins/*": ["libraries/plugins/src/*"], + "@gitroom/workers/*": ["apps/workers/src/*"], } }, "exclude": ["node_modules", "tmp"]