├── .nvmrc ├── apps ├── ai │ ├── .nvmrc │ ├── .gitignore │ ├── server │ │ ├── services │ │ │ ├── system-agents │ │ │ │ └── plain-agent.ts │ │ │ └── logger.ts │ │ ├── routes │ │ │ └── index.ts │ │ ├── middlewares │ │ │ └── integration-kind-check.ts │ │ └── models │ │ │ └── index.ts │ ├── index.ts │ ├── README.md │ └── helpers │ │ └── remove.ts ├── auth │ ├── .nvmrc │ ├── helpers │ │ ├── init.js │ │ ├── mongo-utils.ts │ │ ├── form-validations.ts │ │ ├── init.ts │ │ └── reset.ts │ ├── coverage │ │ ├── lcov-report │ │ │ ├── sort-arrow-sprite.png │ │ │ └── prettify.css │ │ └── lcov.info │ ├── server │ │ ├── services │ │ │ ├── req-host.ts │ │ │ ├── logger.ts │ │ │ ├── dates.ts │ │ │ ├── cache-manager.ts │ │ │ ├── content-service-api.ts │ │ │ ├── plugins-service-api.ts │ │ │ ├── workspaces.ts │ │ │ └── __mocks__ │ │ │ │ └── tokens.ts │ │ ├── passport │ │ │ └── index.ts │ │ ├── routes │ │ │ ├── user-profile.ts │ │ │ ├── roles.ts │ │ │ ├── index.ts │ │ │ └── invites.ts │ │ ├── middleware │ │ │ └── auth-config-check.ts │ │ └── controllers │ │ │ └── roles.ts │ ├── jest.config.js │ ├── tsconfig.json │ ├── index.ts │ ├── mocks │ │ └── express-res.mock.ts │ └── Dockerfile ├── admin │ ├── .nvmrc │ ├── public │ │ ├── favicon.ico │ │ └── logos │ │ │ ├── n8n.png │ │ │ ├── gemini.png │ │ │ ├── facebook.png │ │ │ ├── linkedin.png │ │ │ ├── supabase.png │ │ │ ├── qelos_small.jpg │ │ │ ├── storage-ftp.png │ │ │ ├── storage-gcs.png │ │ │ ├── storage-s3.png │ │ │ └── storage-cloudinary.png │ ├── src │ │ ├── modules │ │ │ ├── core │ │ │ │ ├── components │ │ │ │ │ ├── layout │ │ │ │ │ │ ├── EmptyRoute.vue │ │ │ │ │ │ ├── EmptyState.vue │ │ │ │ │ │ ├── BlockItem.vue │ │ │ │ │ │ └── ErrorBoundary.vue │ │ │ │ │ ├── forms │ │ │ │ │ │ ├── AddMore.vue │ │ │ │ │ │ ├── RemoveButton.vue │ │ │ │ │ │ ├── SaveButton.vue │ │ │ │ │ │ └── LabelsInput.vue │ │ │ │ │ └── semantics │ │ │ │ │ │ └── PageTitle.vue │ │ │ │ ├── store │ │ │ │ │ └── types │ │ │ │ │ │ ├── auth-store.ts │ │ │ │ │ │ └── user.ts │ │ │ │ ├── compositions │ │ │ │ │ ├── notifications.ts │ │ │ │ │ ├── model-change.ts │ │ │ │ │ └── edited-inputs.ts │ │ │ │ ├── utils │ │ │ │ │ ├── clear-nulls.ts │ │ │ │ │ ├── storage.ts │ │ │ │ │ └── texts.ts │ │ │ │ ├── NonPrivilegedHome.vue │ │ │ │ └── Home.vue │ │ │ ├── plugins │ │ │ │ ├── types.ts │ │ │ │ ├── store │ │ │ │ │ └── types.ts │ │ │ │ ├── components │ │ │ │ │ ├── EditPluginHeader.vue │ │ │ │ │ └── plugin-form │ │ │ │ │ │ └── index.ts │ │ │ │ └── EditPlugin.vue │ │ │ ├── integrations │ │ │ │ ├── compositions │ │ │ │ │ ├── use-secured-headers-masked.ts │ │ │ │ │ └── integrations.ts │ │ │ │ ├── store │ │ │ │ │ └── integrations.ts │ │ │ │ └── components │ │ │ │ │ └── BlueprintDropdown.vue │ │ │ ├── pre-designed │ │ │ │ ├── components │ │ │ │ │ ├── InfoIcon.vue │ │ │ │ │ ├── TemplatedViewButton.vue │ │ │ │ │ ├── TemplatedEditButton.vue │ │ │ │ │ ├── TemplatedRemoveButton.vue │ │ │ │ │ ├── ContentBox.vue │ │ │ │ │ ├── Pre.vue │ │ │ │ │ └── ConfirmMessage.vue │ │ │ │ └── compositions │ │ │ │ │ ├── global-styles.ts │ │ │ │ │ └── dynamic-route-item.ts │ │ │ ├── drafts │ │ │ │ ├── routes.ts │ │ │ │ └── Drafts.vue │ │ │ ├── blocks │ │ │ │ ├── Blocks.vue │ │ │ │ └── compositions │ │ │ │ │ ├── vue-file-template.ts │ │ │ │ │ └── editor-config.ts │ │ │ ├── users │ │ │ │ ├── compositions │ │ │ │ │ └── users-stats.ts │ │ │ │ ├── EditUser.vue │ │ │ │ └── CreateUser.vue │ │ │ ├── assets │ │ │ │ └── StorageList.vue │ │ │ ├── admins │ │ │ │ ├── routes.ts │ │ │ │ ├── components │ │ │ │ │ └── PrivilegedAddons.vue │ │ │ │ └── store │ │ │ │ │ └── admin-assistant.ts │ │ │ ├── layouts │ │ │ │ └── compositions │ │ │ │ │ └── styles-marketplace.ts │ │ │ ├── no-code │ │ │ │ └── components │ │ │ │ │ └── WorkspaceLabelSelector.vue │ │ │ └── configurations │ │ │ │ └── types │ │ │ │ └── colors-palette.ts │ │ ├── services │ │ │ ├── types │ │ │ │ ├── storage.ts │ │ │ │ ├── category.ts │ │ │ │ ├── block.ts │ │ │ │ ├── draft.ts │ │ │ │ └── plugin.ts │ │ │ ├── apis │ │ │ │ ├── invites-service.ts │ │ │ │ ├── storages-service.ts │ │ │ │ ├── threads-service.ts │ │ │ │ ├── configurations-service.ts │ │ │ │ ├── blocks-service.ts │ │ │ │ ├── integration-sources-service.ts │ │ │ │ ├── users-service.ts │ │ │ │ ├── plugins-service.ts │ │ │ │ ├── blueprints-service.ts │ │ │ │ ├── workspaces-service.ts │ │ │ │ ├── components-service.ts │ │ │ │ ├── integrations-service.ts │ │ │ │ ├── events-service.ts │ │ │ │ └── data-manipulation-service.ts │ │ │ └── markdown-converter.ts │ │ ├── plugins │ │ │ ├── prime.ts │ │ │ ├── element.ts │ │ │ └── font-awesome.ts │ │ ├── pre-designed │ │ │ └── editor │ │ │ │ ├── MockListPageTitle.vue │ │ │ │ ├── MockAiChat.vue │ │ │ │ ├── MockStatsCard.vue │ │ │ │ └── EditButtons.vue │ │ ├── vue-globals.d.ts │ │ ├── vue-shims.d.ts │ │ ├── style │ │ │ └── mobile.scss │ │ └── i18n │ │ │ └── i18n.test.ts │ ├── vitest.config.ts │ ├── server.js │ ├── tsconfig.json │ ├── Dockerfile │ └── index.html ├── assets │ ├── .nvmrc │ ├── server │ │ ├── utils │ │ │ └── asset-types.json │ │ ├── routes │ │ │ ├── index.js │ │ │ └── upload.ts │ │ ├── middleware │ │ │ ├── upload.js │ │ │ └── editor-check.js │ │ └── services │ │ │ ├── identifier.js │ │ │ ├── get-asset-type.js │ │ │ ├── logger.js │ │ │ └── url.js │ ├── index.ts │ ├── config │ │ └── index.js │ ├── Dockerfile │ └── README.md ├── content │ ├── .nvmrc │ ├── migrator │ │ ├── consts.js │ │ ├── migrations │ │ │ ├── 1 │ │ │ │ └── index.js │ │ │ ├── 3 │ │ │ │ └── index.js │ │ │ ├── 4 │ │ │ │ └── index.js │ │ │ └── 5 │ │ │ │ └── index.js │ │ └── migration-handler.js │ ├── server │ │ ├── routes │ │ │ └── index.js │ │ ├── utils │ │ │ └── cache-manager.js │ │ └── middleware │ │ │ └── populate-user.js │ ├── index.js │ └── Dockerfile ├── drafts │ ├── .nvmrc │ ├── index.ts │ ├── server │ │ ├── dao │ │ │ └── types │ │ │ │ ├── set-draft-contexts.ts │ │ │ │ └── get-draft-query.ts │ │ └── routes │ │ │ ├── index.ts │ │ │ └── drafts.ts │ ├── config │ │ └── index.ts │ ├── README.md │ ├── helpers │ │ └── remove.ts │ └── Dockerfile ├── gateway │ ├── .nvmrc │ ├── .gitignore │ ├── cache-manager.ts │ ├── Dockerfile │ ├── index.ts │ └── README.md ├── no-code │ ├── .nvmrc │ ├── .gitignore │ ├── server │ │ ├── services │ │ │ ├── components-compiler │ │ │ │ ├── env.d.ts │ │ │ │ ├── src │ │ │ │ │ ├── .gitkeep │ │ │ │ │ └── components │ │ │ │ │ │ └── TestComponent.ts │ │ │ │ ├── tsconfig.json │ │ │ │ └── .gitignore │ │ │ ├── logger.ts │ │ │ ├── cache-manager.ts │ │ │ └── blueprints.service.ts │ │ ├── routes │ │ │ └── index.ts │ │ └── middlewares │ │ │ └── blueprints.ts │ ├── README.md │ ├── index.ts │ └── config │ │ └── index.ts ├── plugins │ ├── .nvmrc │ ├── .gitignore │ ├── server │ │ ├── services │ │ │ ├── http-agent.ts │ │ │ ├── hook-events.ts │ │ │ ├── cache-manager.ts │ │ │ ├── logger.ts │ │ │ └── plugins-call.ts │ │ └── routes │ │ │ ├── integration-tools.ts │ │ │ └── data-manipulation.ts │ ├── index.ts │ ├── helpers │ │ └── encryptionHelper.ts │ └── README.md ├── secrets │ ├── .nvmrc │ ├── config │ │ ├── __mocks__ │ │ │ └── index.js │ │ └── index.js │ ├── index.js │ ├── server │ │ ├── routes │ │ │ └── index.js │ │ ├── middleware │ │ │ ├── internal-call-check.js │ │ │ └── __snapshots__ │ │ │ │ └── internal-call-check.test.js.snap │ │ ├── dao │ │ │ ├── mongo │ │ │ │ ├── models │ │ │ │ │ └── secret.js │ │ │ │ └── secret.js │ │ │ └── secrets.js │ │ └── controllers │ │ │ ├── get.js │ │ │ └── set.js │ ├── README.md │ ├── Dockerfile │ └── helpers │ │ └── remove.js ├── local-mcp │ ├── .nvmrc │ ├── .gitignore │ ├── tools │ │ └── types.ts │ └── resources │ │ ├── types.ts │ │ └── index.ts ├── db │ ├── .gitignore │ ├── docker-compose.yaml │ └── package.json └── redis │ ├── docker-compose.yaml │ └── package.json ├── compose └── .nvmrc ├── tools ├── cli │ ├── .nvmrc │ ├── .npmignore │ ├── services │ │ ├── hashing.js │ │ └── create.js │ ├── store │ │ └── cli.js │ ├── utils │ │ ├── progress-bar.mjs │ │ ├── colors.mjs │ │ └── process-handler.js │ ├── tests │ │ ├── utils │ │ │ └── test-suite.js │ │ └── e2e │ │ │ └── create.test.js │ └── commands │ │ └── generate.mjs ├── dev-cli │ ├── .nvmrc │ ├── .npmignore │ ├── controllers │ │ └── compose │ │ │ ├── pull.js │ │ │ ├── prune.js │ │ │ └── populate.js │ ├── services │ │ ├── hashing.js │ │ ├── heroku.js │ │ ├── create.js │ │ ├── populate.js │ │ └── missing.js │ ├── store │ │ └── cli.js │ ├── README.md │ ├── utils │ │ ├── question.js │ │ ├── acceptance.js │ │ ├── execute.js │ │ ├── progress-bar.js │ │ ├── process-handler.js │ │ └── colors.js │ ├── cli.js │ ├── package.json │ └── tests │ │ ├── utils │ │ └── test-suite.js │ │ └── e2e │ │ └── create.test.js ├── create-press │ ├── index.mjs │ ├── package-lock.json │ └── package.json ├── create-play │ ├── index.js │ ├── package-lock.json │ └── package.json ├── ingest-helm-values │ └── package.json └── bundler │ ├── packages-basic-info.mjs │ └── rename-pack.js ├── helm ├── .gitignore └── qelos │ └── Chart.yaml ├── .npmrc ├── documentation ├── docs │ ├── .vitepress │ │ └── .gitignore │ ├── public │ │ ├── qelos.jpg │ │ ├── docker-logo.png │ │ ├── nodeJS-logo.png │ │ ├── design │ │ │ ├── design1.png │ │ │ ├── design2.png │ │ │ ├── design3.png │ │ │ ├── design4.png │ │ │ ├── design5.png │ │ │ ├── design6.png │ │ │ ├── design7.png │ │ │ └── design-start.png │ │ ├── plugin │ │ │ ├── plugin1.png │ │ │ ├── plugin6.png │ │ │ ├── plugin100.png │ │ │ ├── plugin101.png │ │ │ ├── plugin102.png │ │ │ ├── plugin103.png │ │ │ ├── plugin12.png │ │ │ ├── plugin13.png │ │ │ ├── plugin14.png │ │ │ ├── plugin15.png │ │ │ ├── plugin17.png │ │ │ ├── plugin18.png │ │ │ ├── plugin19.png │ │ │ ├── plugin20.png │ │ │ ├── plugin21.png │ │ │ ├── plugin22.png │ │ │ ├── plugin23.png │ │ │ ├── plugin24.png │ │ │ ├── plugin29.png │ │ │ ├── plugin30.png │ │ │ ├── plugin31.png │ │ │ ├── plugin32.png │ │ │ ├── plugin33.png │ │ │ ├── plugin34.png │ │ │ ├── plugin35.png │ │ │ ├── plugin36.png │ │ │ ├── plugin37.png │ │ │ ├── plugin38.png │ │ │ ├── plugin39.png │ │ │ ├── plugin40.png │ │ │ ├── plugin41.png │ │ │ ├── plugin42.png │ │ │ ├── plugin43.png │ │ │ ├── plugin44.png │ │ │ ├── plugin45.png │ │ │ ├── plugin46.png │ │ │ ├── plugin47.png │ │ │ ├── plugin48.png │ │ │ ├── plugin49.png │ │ │ ├── plugin50.png │ │ │ ├── plugin51.png │ │ │ ├── plugin52.png │ │ │ ├── plugin53.png │ │ │ ├── plugin55.png │ │ │ ├── plugin56.png │ │ │ ├── plugin57.png │ │ │ ├── plugin58.png │ │ │ ├── plugin59.png │ │ │ ├── plugin60.png │ │ │ ├── plugin61.png │ │ │ ├── plugin62.png │ │ │ ├── plugin63.png │ │ │ ├── plugin64.png │ │ │ ├── plugin66.png │ │ │ ├── plugin67.png │ │ │ ├── plugin68.png │ │ │ ├── plugin69.png │ │ │ ├── plugin70.png │ │ │ ├── plugin71.png │ │ │ ├── plugin72.png │ │ │ ├── plugin73.png │ │ │ ├── plugin74.png │ │ │ ├── plugin75.png │ │ │ ├── plugin80.png │ │ │ ├── plugin81.png │ │ │ ├── plugin82.png │ │ │ ├── plugin83.png │ │ │ ├── plugin84.png │ │ │ ├── plugin85.png │ │ │ ├── plugin86.png │ │ │ ├── plugin87.png │ │ │ ├── plugin88.png │ │ │ ├── plugin89.png │ │ │ ├── plugin90.png │ │ │ ├── plugin91.png │ │ │ ├── plugin92.png │ │ │ ├── plugin93.png │ │ │ ├── plugin94.png │ │ │ ├── plugin95.png │ │ │ ├── plugin96.png │ │ │ ├── plugin97.png │ │ │ ├── plugin98.png │ │ │ ├── plugin99.png │ │ │ └── create-plugin.png │ │ ├── vs-code-logo.png │ │ ├── admin-log-in-min.png │ │ ├── blueprints │ │ │ ├── blueprint1.png │ │ │ ├── blueprint2.png │ │ │ ├── blueprint3.png │ │ │ ├── blueprint4.png │ │ │ ├── blueprint10.png │ │ │ ├── blueprint12.png │ │ │ ├── blueprint13.png │ │ │ ├── blueprint14.png │ │ │ ├── blueprint16.png │ │ │ ├── blueprint17.png │ │ │ ├── blueprint18.png │ │ │ └── blueprint19.png │ │ ├── mongodb-compass-logo.png │ │ ├── code_icon.svg │ │ ├── desktop_mac_icon.svg │ │ ├── cloud_done_icon.svg │ │ └── cloud_upload_icon.svg │ ├── plugins │ │ ├── api-proxy.md │ │ ├── test.md │ │ ├── deploy.md │ │ ├── micro-frontend.md │ │ ├── pre-designed-frontends.md │ │ └── create.md │ ├── getting-started │ │ └── deployment.md │ ├── pre-designed-frontends │ │ ├── rows-list.md │ │ └── blocks-list.md │ ├── mfe │ │ └── cross-domain-authorization.md │ ├── web-sdk │ │ ├── examples.md │ │ ├── api-reference.md │ │ ├── styling.md │ │ ├── modals.md │ │ ├── events.md │ │ └── router.md │ └── plugin-play │ │ ├── examples.md │ │ ├── api-reference.md │ │ ├── authentication.md │ │ ├── crud.md │ │ ├── sdk-integration.md │ │ ├── lifecycle.md │ │ ├── micro-frontends.md │ │ └── configuration.md └── package.json ├── packages ├── cache-manager │ ├── .npmignore │ ├── .gitignore │ ├── cache-manager-options.ts │ ├── cache-type.ts │ ├── tsconfig.json │ └── package.json ├── plugin-play │ ├── test │ │ └── e2e │ │ │ └── api-plugin │ │ │ ├── .gitignore │ │ │ └── package.json │ ├── .gitignore │ ├── cert │ │ └── .gitignore │ ├── .npmignore │ ├── create-cert.js │ ├── src │ │ ├── injectables.ts │ │ ├── logger.ts │ │ ├── cache-manager.ts │ │ ├── request.types.ts │ │ └── response-error.ts │ └── tsconfig.json ├── sdk │ ├── .npmignore │ ├── .gitignore │ ├── src │ │ ├── administrator │ │ │ └── roles.ts │ │ └── types.ts │ └── tsconfig.json ├── api-kit │ ├── .npmignore │ ├── .gitignore │ ├── src │ │ ├── router.ts │ │ ├── index.ts │ │ ├── response-error.ts │ │ └── emit-internal-event.ts │ ├── README.md │ └── tsconfig.json ├── web-sdk │ ├── .npmignore │ ├── .gitignore │ ├── src │ │ ├── index.ts │ │ ├── router.ts │ │ ├── modals.ts │ │ ├── shared-style.ts │ │ └── route.ts │ ├── tsconfig.json │ ├── package.json │ └── README.md └── global-types │ ├── injectable.ts │ ├── event-subscriber.ts │ ├── navbar-group.ts │ ├── query-filters.ts │ ├── plugin-crud.ts │ ├── package.json │ ├── screen-requirement.ts │ ├── app-configuration-metadata.ts │ ├── workspace-configuration-metadata.ts │ └── index.ts ├── .windsurf └── rules │ └── graph.png ├── Dockerfile.local ├── Dockerfile.test ├── .editorconfig ├── run.sh ├── .dockerignore ├── Dockerfile ├── pnpm-workspace.yaml ├── .gitignore ├── e2e └── package.json └── .env /.nvmrc: -------------------------------------------------------------------------------- 1 | 22 -------------------------------------------------------------------------------- /apps/ai/.nvmrc: -------------------------------------------------------------------------------- 1 | 22 -------------------------------------------------------------------------------- /apps/auth/.nvmrc: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /compose/.nvmrc: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /apps/admin/.nvmrc: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /apps/assets/.nvmrc: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /apps/content/.nvmrc: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /apps/drafts/.nvmrc: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /apps/gateway/.nvmrc: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /apps/no-code/.nvmrc: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /apps/plugins/.nvmrc: -------------------------------------------------------------------------------- 1 | 22 -------------------------------------------------------------------------------- /apps/secrets/.nvmrc: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /tools/cli/.nvmrc: -------------------------------------------------------------------------------- 1 | 16 2 | -------------------------------------------------------------------------------- /apps/local-mcp/.nvmrc: -------------------------------------------------------------------------------- 1 | 24 2 | -------------------------------------------------------------------------------- /helm/.gitignore: -------------------------------------------------------------------------------- 1 | values.yaml -------------------------------------------------------------------------------- /tools/dev-cli/.nvmrc: -------------------------------------------------------------------------------- 1 | 16 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | legacy-peer-deps=true 2 | -------------------------------------------------------------------------------- /documentation/docs/.vitepress/.gitignore: -------------------------------------------------------------------------------- 1 | /cache -------------------------------------------------------------------------------- /apps/gateway/.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | -------------------------------------------------------------------------------- /apps/no-code/.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | -------------------------------------------------------------------------------- /apps/plugins/.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | -------------------------------------------------------------------------------- /packages/cache-manager/.npmignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .vscode 3 | -------------------------------------------------------------------------------- /apps/ai/.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | components.d.ts -------------------------------------------------------------------------------- /apps/auth/helpers/init.js: -------------------------------------------------------------------------------- 1 | require('../dist/helpers/init') 2 | -------------------------------------------------------------------------------- /packages/plugin-play/test/e2e/api-plugin/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /packages/sdk/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .vscode 4 | -------------------------------------------------------------------------------- /packages/api-kit/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .vscode 4 | -------------------------------------------------------------------------------- /packages/web-sdk/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .vscode 4 | -------------------------------------------------------------------------------- /packages/sdk/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .vscode 4 | dist 5 | -------------------------------------------------------------------------------- /packages/api-kit/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .vscode 4 | dist 5 | -------------------------------------------------------------------------------- /packages/web-sdk/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .vscode 4 | dist 5 | -------------------------------------------------------------------------------- /packages/cache-manager/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .vscode 4 | dist 5 | -------------------------------------------------------------------------------- /packages/plugin-play/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .vscode 4 | dist 5 | -------------------------------------------------------------------------------- /packages/plugin-play/cert/.gitignore: -------------------------------------------------------------------------------- 1 | *.pem 2 | ca* 3 | key* 4 | *.cnf 5 | openssl.* -------------------------------------------------------------------------------- /apps/db/.gitignore: -------------------------------------------------------------------------------- 1 | db-data 2 | /db-data 3 | temp 4 | tmp 5 | node_modules 6 | *.tgz 7 | -------------------------------------------------------------------------------- /apps/local-mcp/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .env 4 | *.log 5 | .DS_Store 6 | -------------------------------------------------------------------------------- /tools/cli/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | tmp 3 | logs 4 | tests 5 | *.test.js 6 | coverage 7 | -------------------------------------------------------------------------------- /packages/plugin-play/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .vscode 4 | examples 5 | cert 6 | test -------------------------------------------------------------------------------- /tools/dev-cli/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | tmp 3 | logs 4 | tests 5 | *.test.js 6 | coverage 7 | -------------------------------------------------------------------------------- /.windsurf/rules/graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/.windsurf/rules/graph.png -------------------------------------------------------------------------------- /apps/no-code/server/services/components-compiler/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /apps/admin/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/admin/public/favicon.ico -------------------------------------------------------------------------------- /apps/admin/public/logos/n8n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/admin/public/logos/n8n.png -------------------------------------------------------------------------------- /apps/admin/src/modules/core/components/layout/EmptyRoute.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /apps/admin/public/logos/gemini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/admin/public/logos/gemini.png -------------------------------------------------------------------------------- /apps/admin/public/logos/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/admin/public/logos/facebook.png -------------------------------------------------------------------------------- /apps/admin/public/logos/linkedin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/admin/public/logos/linkedin.png -------------------------------------------------------------------------------- /apps/admin/public/logos/supabase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/admin/public/logos/supabase.png -------------------------------------------------------------------------------- /documentation/docs/public/qelos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/qelos.jpg -------------------------------------------------------------------------------- /apps/admin/public/logos/qelos_small.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/admin/public/logos/qelos_small.jpg -------------------------------------------------------------------------------- /apps/admin/public/logos/storage-ftp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/admin/public/logos/storage-ftp.png -------------------------------------------------------------------------------- /apps/admin/public/logos/storage-gcs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/admin/public/logos/storage-gcs.png -------------------------------------------------------------------------------- /apps/admin/public/logos/storage-s3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/admin/public/logos/storage-s3.png -------------------------------------------------------------------------------- /apps/content/migrator/consts.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | CONFIG_KEY: 'versions', 3 | MIGRATION_KEY: 'migration', 4 | } 5 | -------------------------------------------------------------------------------- /apps/no-code/server/services/components-compiler/src/.gitkeep: -------------------------------------------------------------------------------- 1 | components/TestComponent.vue 2 | components/TestComponent.ts 3 | -------------------------------------------------------------------------------- /apps/assets/server/utils/asset-types.json: -------------------------------------------------------------------------------- 1 | { 2 | "ASSET": "asset", 3 | "DIRECTORY": "directory", 4 | "IMAGE": "image" 5 | } 6 | -------------------------------------------------------------------------------- /documentation/docs/plugins/api-proxy.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: API Proxy 3 | editLink: true 4 | --- 5 | 6 | # {{ $frontmatter.title }} 7 | -------------------------------------------------------------------------------- /documentation/docs/plugins/test.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Test your Plugin 3 | editLink: true 4 | --- 5 | 6 | # {{ $frontmatter.title }} 7 | -------------------------------------------------------------------------------- /documentation/docs/public/docker-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/docker-logo.png -------------------------------------------------------------------------------- /documentation/docs/public/nodeJS-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/nodeJS-logo.png -------------------------------------------------------------------------------- /Dockerfile.local: -------------------------------------------------------------------------------- 1 | FROM node:22.14 2 | COPY . . 3 | ENV NODE_ENV=development 4 | RUN npm install --unsafe-perm 5 | RUN npm run build 6 | -------------------------------------------------------------------------------- /documentation/docs/plugins/deploy.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Deploy your Plugin 3 | editLink: true 4 | --- 5 | 6 | # {{ $frontmatter.title }} 7 | -------------------------------------------------------------------------------- /documentation/docs/public/design/design1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/design/design1.png -------------------------------------------------------------------------------- /documentation/docs/public/design/design2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/design/design2.png -------------------------------------------------------------------------------- /documentation/docs/public/design/design3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/design/design3.png -------------------------------------------------------------------------------- /documentation/docs/public/design/design4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/design/design4.png -------------------------------------------------------------------------------- /documentation/docs/public/design/design5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/design/design5.png -------------------------------------------------------------------------------- /documentation/docs/public/design/design6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/design/design6.png -------------------------------------------------------------------------------- /documentation/docs/public/design/design7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/design/design7.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin1.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin6.png -------------------------------------------------------------------------------- /documentation/docs/public/vs-code-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/vs-code-logo.png -------------------------------------------------------------------------------- /apps/admin/public/logos/storage-cloudinary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/admin/public/logos/storage-cloudinary.png -------------------------------------------------------------------------------- /documentation/docs/getting-started/deployment.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Deployment 3 | editLink: true 4 | --- 5 | 6 | # {{ $frontmatter.title }} 7 | -------------------------------------------------------------------------------- /documentation/docs/plugins/micro-frontend.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Micro-Frontend 3 | editLink: true 4 | --- 5 | 6 | # {{ $frontmatter.title }} 7 | -------------------------------------------------------------------------------- /documentation/docs/public/admin-log-in-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/admin-log-in-min.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin100.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin101.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin102.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin102.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin103.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin103.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin12.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin13.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin14.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin15.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin17.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin18.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin19.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin20.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin21.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin22.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin23.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin24.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin29.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin30.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin31.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin32.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin33.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin34.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin35.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin36.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin37.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin38.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin39.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin40.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin41.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin42.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin43.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin44.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin45.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin46.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin47.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin48.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin49.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin50.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin51.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin52.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin53.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin55.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin56.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin57.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin58.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin59.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin60.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin61.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin62.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin63.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin64.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin66.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin67.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin67.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin68.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin69.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin70.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin71.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin71.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin72.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin73.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin74.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin75.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin80.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin81.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin82.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin82.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin83.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin84.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin85.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin86.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin87.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin88.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin89.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin90.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin91.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin92.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin93.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin94.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin94.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin95.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin96.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin97.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin97.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin98.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/plugin99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/plugin99.png -------------------------------------------------------------------------------- /packages/cache-manager/cache-manager-options.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface CacheManagerOptions { 3 | // in seconds 4 | ttl: number 5 | } 6 | -------------------------------------------------------------------------------- /documentation/docs/pre-designed-frontends/rows-list.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Rows List 3 | editLink: true 4 | --- 5 | 6 | # {{ $frontmatter.title }} 7 | -------------------------------------------------------------------------------- /documentation/docs/public/design/design-start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/design/design-start.png -------------------------------------------------------------------------------- /packages/api-kit/src/router.ts: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | 3 | export function getRouter(): Router { 4 | return Router(); 5 | } 6 | -------------------------------------------------------------------------------- /documentation/docs/pre-designed-frontends/blocks-list.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Blocks List 3 | editLink: true 4 | --- 5 | 6 | # {{ $frontmatter.title }} 7 | -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint1.png -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint2.png -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint3.png -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint4.png -------------------------------------------------------------------------------- /documentation/docs/public/mongodb-compass-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/mongodb-compass-logo.png -------------------------------------------------------------------------------- /documentation/docs/public/plugin/create-plugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/plugin/create-plugin.png -------------------------------------------------------------------------------- /Dockerfile.test: -------------------------------------------------------------------------------- 1 | FROM node:22.14 2 | COPY . . 3 | ENV NODE_ENV=development 4 | RUN npm install --unsafe-perm 5 | RUN npm run build 6 | RUN npm run test 7 | -------------------------------------------------------------------------------- /apps/auth/coverage/lcov-report/sort-arrow-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/apps/auth/coverage/lcov-report/sort-arrow-sprite.png -------------------------------------------------------------------------------- /documentation/docs/plugins/pre-designed-frontends.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Pre-Designed Frontends 3 | editLink: true 4 | --- 5 | 6 | # {{ $frontmatter.title }} 7 | -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint10.png -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint12.png -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint13.png -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint14.png -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint16.png -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint17.png -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint18.png -------------------------------------------------------------------------------- /documentation/docs/public/blueprints/blueprint19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qelos-io/qelos/HEAD/documentation/docs/public/blueprints/blueprint19.png -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [{*.js,*.ts, *.vue, *.md, *.mjs}] 2 | indent_size = 2 3 | indent_style = space 4 | ij_any_spaces_within_braces = true 5 | quote_type = single 6 | -------------------------------------------------------------------------------- /apps/admin/src/services/types/storage.ts: -------------------------------------------------------------------------------- 1 | export interface IStorage { 2 | _id: string; 3 | name: string; 4 | kind: string; 5 | [key: string]: any; 6 | } 7 | -------------------------------------------------------------------------------- /packages/global-types/injectable.ts: -------------------------------------------------------------------------------- 1 | export interface IInjectable { 2 | name?: string, 3 | description?: string, 4 | html: string, 5 | active: boolean 6 | } -------------------------------------------------------------------------------- /documentation/docs/mfe/cross-domain-authorization.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Cross-domain Authentication 3 | editLink: true 4 | --- 5 | 6 | # {{ $frontmatter.title }} 7 | 8 | -------------------------------------------------------------------------------- /apps/admin/src/plugins/prime.ts: -------------------------------------------------------------------------------- 1 | import PrimeVue from 'primevue/config'; 2 | 3 | export default function usePrimeVue (app) { 4 | app.use(PrimeVue, { 5 | }); 6 | } 7 | -------------------------------------------------------------------------------- /apps/drafts/index.ts: -------------------------------------------------------------------------------- 1 | import { port, ip } from "./config"; 2 | 3 | require("./server/routes"); 4 | 5 | require("@qelos/api-kit") 6 | .start("Drafts Service", port, ip); 7 | -------------------------------------------------------------------------------- /packages/global-types/event-subscriber.ts: -------------------------------------------------------------------------------- 1 | export interface IEventSubscriber { 2 | source?: string, 3 | kind?: string, 4 | eventName?: string, 5 | hookUrl: string; 6 | } -------------------------------------------------------------------------------- /apps/admin/src/modules/plugins/types.ts: -------------------------------------------------------------------------------- 1 | export enum MfeBaseTemplate { 2 | 'basic-form' = 'Basic Form', 3 | 'rows-list' = 'Rows List', 4 | 'plain' = 'Plain (blank page)' 5 | } -------------------------------------------------------------------------------- /apps/admin/src/services/apis/invites-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | 3 | const invitesService = getCrud('/api/invites') 4 | 5 | export default invitesService 6 | -------------------------------------------------------------------------------- /apps/admin/src/services/apis/storages-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | 3 | const storagesService = getCrud('/api/storage') 4 | 5 | export default storagesService 6 | -------------------------------------------------------------------------------- /apps/admin/src/services/apis/threads-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | 3 | const threadsService = getCrud('/api/ai/threads') 4 | 5 | export default threadsService 6 | -------------------------------------------------------------------------------- /apps/drafts/server/dao/types/set-draft-contexts.ts: -------------------------------------------------------------------------------- 1 | export interface SetDraftContexts { 2 | contextDisplayName: string; 3 | contextRouteParams: any; 4 | contextData: any; 5 | } 6 | -------------------------------------------------------------------------------- /apps/drafts/server/routes/index.ts: -------------------------------------------------------------------------------- 1 | import { app as getApp } from "@qelos/api-kit"; 2 | import draftRoutes from "./drafts"; 3 | 4 | const app = getApp(); 5 | draftRoutes(app); 6 | -------------------------------------------------------------------------------- /apps/assets/server/routes/index.js: -------------------------------------------------------------------------------- 1 | const app = require('@qelos/api-kit').app() 2 | 3 | app.use(require('./assets')) 4 | app.use(require('./storage')) 5 | app.use(require('./upload')) 6 | -------------------------------------------------------------------------------- /apps/drafts/server/dao/types/get-draft-query.ts: -------------------------------------------------------------------------------- 1 | export type GetDraftQuery = { 2 | contextId: string | null; 3 | contextType: string; 4 | user: string; 5 | tenant: string; 6 | } 7 | -------------------------------------------------------------------------------- /apps/no-code/server/services/components-compiler/src/components/TestComponent.ts: -------------------------------------------------------------------------------- 1 | import TestComponent from "./TestComponent.vue"; 2 | window['components:TestComponent.vue'] = TestComponent; -------------------------------------------------------------------------------- /apps/secrets/config/__mocks__/index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | mongoUri: 'this-is-mongo-uri', 3 | secretKey: 'mock-secret-key', 4 | internalSecret: 'mock-internal-secret' 5 | } 6 | -------------------------------------------------------------------------------- /packages/global-types/navbar-group.ts: -------------------------------------------------------------------------------- 1 | export interface INavbarGroup { 2 | key: string, 3 | name: string, 4 | iconName?: string, 5 | iconSvg?: string, 6 | priority?: number 7 | } -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - 2 | sudo apt-get install -y nodejs 3 | sudo apt-get install gcc g++ make 4 | npm i --location=global @qelos/cli 5 | 6 | -------------------------------------------------------------------------------- /apps/secrets/index.js: -------------------------------------------------------------------------------- 1 | require("./server/routes"); 2 | 3 | require("@qelos/api-kit").start( 4 | "Secrets Service", 5 | process.env.PORT || 9002, 6 | process.env.IP || "127.0.0.1" 7 | ); 8 | -------------------------------------------------------------------------------- /apps/admin/vitest.config.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import {defineConfig} from 'vitest/config' 3 | 4 | export default defineConfig({ 5 | test: { 6 | globals: true, 7 | }, 8 | }) 9 | -------------------------------------------------------------------------------- /apps/auth/helpers/mongo-utils.ts: -------------------------------------------------------------------------------- 1 | const checkForHexRegExp = new RegExp('^[0-9a-fA-F]{24}$') 2 | 3 | export function isObjectId (id:string) { 4 | return checkForHexRegExp.test(id) 5 | } 6 | 7 | 8 | -------------------------------------------------------------------------------- /apps/content/server/routes/index.js: -------------------------------------------------------------------------------- 1 | const app = require('@qelos/api-kit').app() 2 | 3 | require('./configurations')(app); 4 | require('./blocks')(app); 5 | require('./tenants-configurations')(app); 6 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | db-data 4 | compose 5 | tmp 6 | dev 7 | .vscode 8 | tools/cli 9 | docs 10 | coverage 11 | .cloudfairy/libraries 12 | .cloudfairy/*-data 13 | .cloudfairy.build -------------------------------------------------------------------------------- /apps/admin/src/services/apis/configurations-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | 3 | const configurationsService = getCrud('/api/configurations') 4 | 5 | export default configurationsService 6 | -------------------------------------------------------------------------------- /apps/assets/server/middleware/upload.js: -------------------------------------------------------------------------------- 1 | const multer = require('multer'); 2 | 3 | // Configure multer with our custom streaming storage engine 4 | const upload = multer(); 5 | 6 | module.exports = upload; 7 | -------------------------------------------------------------------------------- /packages/global-types/query-filters.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface ICommonQueryFilters { 3 | $populate?: boolean; 4 | $sort?: string; 5 | $limit?: number; 6 | $page?: number; 7 | $flat?: boolean; 8 | } 9 | -------------------------------------------------------------------------------- /documentation/docs/web-sdk/examples.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Examples 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | Practical examples and use cases for the Web SDK. 10 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/store/types/auth-store.ts: -------------------------------------------------------------------------------- 1 | import { IUser } from './user' 2 | 3 | export interface IAuthStore { 4 | user: IUser | null, 5 | isLoaded: boolean, 6 | userPromise: Promise | null, 7 | } 8 | -------------------------------------------------------------------------------- /apps/admin/src/services/apis/blocks-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | import { IBlock } from '../types/block'; 3 | 4 | const blocksService = getCrud('/api/blocks') 5 | 6 | export default blocksService 7 | -------------------------------------------------------------------------------- /apps/admin/src/services/apis/integration-sources-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | 3 | const integrationSourcesService = getCrud('/api/integration-sources') 4 | 5 | export default integrationSourcesService 6 | -------------------------------------------------------------------------------- /apps/drafts/config/index.ts: -------------------------------------------------------------------------------- 1 | export const mongoUri = process.env.MONGO_URI || 2 | "mongodb://localhost/drafts-service"; 3 | export const port = process.env.PORT || 9005; 4 | export const ip = process.env.IP || "127.0.0.1"; 5 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:22.14 2 | COPY . . 3 | ENV NODE_ENV=development 4 | RUN pnpm install --unsafe-perm 5 | RUN pnpm run build 6 | 7 | RUN pnpm run clean 8 | ENV NODE_ENV=production 9 | RUN pnpm run install:prod-only 10 | -------------------------------------------------------------------------------- /helm/qelos/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v2 2 | name: qelos 3 | description: Helm chart for Qelos - Multi-tenant SaaS Platform 4 | type: application 5 | version: 0.1.0 6 | appVersion: "1.0.0" 7 | maintainers: 8 | - name: Qelos Team 9 | -------------------------------------------------------------------------------- /apps/admin/src/services/apis/users-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | import {IUser} from '@/modules/core/store/types/user'; 3 | 4 | const usersService = getCrud('/api/users') 5 | 6 | export default usersService 7 | -------------------------------------------------------------------------------- /documentation/docs/web-sdk/api-reference.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: API Reference 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | Complete API reference for all Web SDK functions and types. 10 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - apps/* 3 | - packages/* 4 | 5 | onlyBuiltDependencies: 6 | - '@parcel/watcher' 7 | - core-js 8 | - esbuild 9 | - node-jq 10 | - protobufjs 11 | - sharp 12 | - vue-demi 13 | -------------------------------------------------------------------------------- /tools/create-press/index.mjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { execSync } from 'child_process'; 4 | 5 | const [ , , ...argv ] = process.argv; 6 | 7 | execSync('npx @qelos/cli create ' + argv.join(' '), { stdio: 'inherit' }); 8 | -------------------------------------------------------------------------------- /apps/admin/src/services/apis/plugins-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | import {IPlugin} from '@/services/types/plugin'; 3 | 4 | const pluginsService = getCrud('/api/plugins') 5 | 6 | export default pluginsService 7 | -------------------------------------------------------------------------------- /apps/admin/src/services/markdown-converter.ts: -------------------------------------------------------------------------------- 1 | import {Remarkable} from 'remarkable'; 2 | 3 | const remarkable = new Remarkable({html: true, breaks: true}); 4 | 5 | export function toHTML(md: string) { 6 | return remarkable.render(md) 7 | } -------------------------------------------------------------------------------- /apps/admin/src/services/types/category.ts: -------------------------------------------------------------------------------- 1 | export interface ICategory { 2 | _id: string; 3 | created: Date, 4 | isPublic: boolean, 5 | name: string 6 | path: string 7 | tenant: string, 8 | homePage?: boolean 9 | } 10 | -------------------------------------------------------------------------------- /tools/create-play/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {execSync} = require('child_process'); 4 | const [, ,...argv] = process.argv; 5 | 6 | execSync('npx @qelos/plugins-cli@latest create ' + argv.join(' '), { 7 | stdio: 'inherit', 8 | }); -------------------------------------------------------------------------------- /documentation/docs/plugin-play/examples.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Examples 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | Practical examples and complete use cases for building plugins with Plugin Play. 10 | -------------------------------------------------------------------------------- /apps/admin/src/services/apis/blueprints-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | import { IBlueprint } from '@qelos/global-types'; 3 | 4 | const blueprintsService = getCrud('/api/blueprints') 5 | 6 | export default blueprintsService 7 | -------------------------------------------------------------------------------- /apps/redis/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | qelos-redis: 3 | image: redis/redis-stack-server:latest 4 | container_name: qelos-redis 5 | ports: 6 | - "6379:6379" 7 | restart: always 8 | networks: 9 | common_network: 10 | -------------------------------------------------------------------------------- /documentation/docs/plugin-play/api-reference.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: API Reference 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | Complete API reference for all Plugin Play functions, types, and interfaces. 10 | -------------------------------------------------------------------------------- /documentation/docs/plugin-play/authentication.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Authentication 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | Learn how Plugin Play handles authentication with JWT tokens and sessions. 10 | -------------------------------------------------------------------------------- /packages/web-sdk/src/index.ts: -------------------------------------------------------------------------------- 1 | import loadStyles from './shared-style'; 2 | import {getCode, authorize, unAuthorize} from './auth'; 3 | 4 | export const code = getCode(); 5 | 6 | export { 7 | authorize, 8 | unAuthorize 9 | } 10 | 11 | loadStyles(); -------------------------------------------------------------------------------- /apps/admin/src/services/apis/workspaces-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | import { IWorkspace } from '@qelos/sdk/dist/workspaces'; 3 | 4 | const workspacesService = getCrud('/api/workspaces') 5 | 6 | export default workspacesService 7 | -------------------------------------------------------------------------------- /apps/assets/server/services/identifier.js: -------------------------------------------------------------------------------- 1 | const uniqid = require('uniqid'); 2 | 3 | function generateIdentifier(name, extension) { 4 | return `${name}-${uniqid()}.${extension}`; 5 | } 6 | 7 | 8 | module.exports = { 9 | generateIdentifier 10 | }; 11 | -------------------------------------------------------------------------------- /apps/auth/server/services/req-host.ts: -------------------------------------------------------------------------------- 1 | import {AuthRequest} from '../../types'; 2 | 3 | export function getRequestHost(req: AuthRequest): string { 4 | return (req.headers.tenanthost || req.headers.host || new URL(req.headers.origin).host).split(':')[0]; 5 | } 6 | -------------------------------------------------------------------------------- /packages/api-kit/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './shutdown' 2 | export * from './app' 3 | export * from './router' 4 | export * from './internal-service' 5 | export * from './user-middlewares' 6 | export * from './emit-internal-event' 7 | export * from './response-error'; -------------------------------------------------------------------------------- /apps/admin/src/services/apis/components-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | import { INoCodeComponent } from '@qelos/global-types'; 3 | 4 | const componentsService = getCrud('/api/components') 5 | 6 | export default componentsService 7 | -------------------------------------------------------------------------------- /apps/admin/src/services/apis/integrations-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud'; 2 | import { IIntegration } from '@qelos/global-types'; 3 | 4 | const integrationsService = getCrud('/api/integrations') 5 | 6 | export default integrationsService 7 | -------------------------------------------------------------------------------- /apps/admin/src/services/types/block.ts: -------------------------------------------------------------------------------- 1 | export interface IBlock { 2 | _id: string; 3 | tenant: string 4 | name: string 5 | description: string 6 | path: string 7 | content: string 8 | contentType: 'html' | 'content' 9 | created: Date 10 | } 11 | -------------------------------------------------------------------------------- /tools/dev-cli/controllers/compose/pull.js: -------------------------------------------------------------------------------- 1 | const execute = require('../../utils/execute'); 2 | 3 | module.exports = function () { 4 | console.log('pull updated images'); 5 | execute('docker-compose -f docker-compose.yml -p qelos pull', { stdio: 'inherit' }); 6 | } 7 | -------------------------------------------------------------------------------- /apps/admin/src/modules/integrations/compositions/use-secured-headers-masked.ts: -------------------------------------------------------------------------------- 1 | import { ref } from 'vue'; 2 | 3 | const securedHeadersMasked = ref>({}); 4 | 5 | export function useSecuredHeadersMasked() { 6 | return { securedHeadersMasked }; 7 | } -------------------------------------------------------------------------------- /apps/no-code/README.md: -------------------------------------------------------------------------------- 1 | # Qelos no-code service 2 | 3 | An HTTP server to manage the APIs to support the no-code mechanism. 4 | 5 | ## Dependencies 6 | - Node.js 7 | - npm OR yarn 8 | - MongoDB 9 | - [Authentication-service](../auth) 10 | - [Secrets-service](../secrets) -------------------------------------------------------------------------------- /apps/plugins/server/services/http-agent.ts: -------------------------------------------------------------------------------- 1 | const isProduction = process.env.NODE_ENV === 'production'; 2 | 3 | const httpAgent = isProduction ? 4 | new (require('node:https').Agent)({ 5 | rejectUnauthorized: false, 6 | }) 7 | : undefined 8 | 9 | export default httpAgent; -------------------------------------------------------------------------------- /tools/dev-cli/controllers/compose/prune.js: -------------------------------------------------------------------------------- 1 | const execute = require('../../utils/execute'); 2 | 3 | module.exports = function () { 4 | console.log('cleaning unused images'); 5 | execute('docker system prune --all -f', { stdio: 'inherit' }); 6 | console.log('Done!'); 7 | } 8 | -------------------------------------------------------------------------------- /packages/global-types/plugin-crud.ts: -------------------------------------------------------------------------------- 1 | export interface IPluginCrud { 2 | name: string, 3 | display: { 4 | name: string; 5 | plural: string; 6 | capitalized: string; 7 | capitalizedPlural: string; 8 | }, 9 | identifierKey: string; 10 | schema: any; 11 | } -------------------------------------------------------------------------------- /packages/cache-manager/cache-type.ts: -------------------------------------------------------------------------------- 1 | import { CacheManagerOptions } from "./cache-manager-options"; 2 | 3 | export interface ICache { 4 | getItem: (key: string) => Promise; 5 | setItem: (key: string, value: string, options: CacheManagerOptions) => Promise; 6 | } 7 | -------------------------------------------------------------------------------- /apps/admin/src/pre-designed/editor/MockListPageTitle.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /tools/ingest-helm-values/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ingest-helm-values", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "description": "Convert values.yaml to use environment variables", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "node index.js" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /documentation/docs/public/code_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/admin/src/modules/pre-designed/components/InfoIcon.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /packages/plugin-play/create-cert.js: -------------------------------------------------------------------------------- 1 | const {execSync} = require('child_process'); 2 | 3 | execSync(`mkdir -p cert && cd cert && docker run -v ${process.cwd()}/cert:/certs \\ 4 | -e SSL_SUBJECT=${process.env.HOSTNAME || '0.0.0.0'} stakater/ssl-certs-generator:1.0`, {stdio: 'inherit'}); 5 | 6 | console.log('done.'); -------------------------------------------------------------------------------- /packages/plugin-play/src/injectables.ts: -------------------------------------------------------------------------------- 1 | import manifest from './manifest'; 2 | 3 | export interface Injectable { 4 | name?: string; 5 | description?: string; 6 | html: string; 7 | } 8 | 9 | export function addInjectable(injectable: Injectable) { 10 | manifest.injectables.push(injectable); 11 | } -------------------------------------------------------------------------------- /apps/admin/src/modules/core/compositions/notifications.ts: -------------------------------------------------------------------------------- 1 | import { ElNotification } from 'element-plus'; 2 | import { h } from 'vue'; 3 | 4 | export function useNotifications() { 5 | return { 6 | success: msg => ElNotification.success(msg), 7 | error: msg => ElNotification.error(msg), 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/admin/src/plugins/element.ts: -------------------------------------------------------------------------------- 1 | import ElementPlus from 'element-plus'; 2 | import * as icons from '@element-plus/icons-vue'; 3 | 4 | export default function (app) { 5 | app.use(ElementPlus); 6 | 7 | Object.keys(icons).forEach((name) => { 8 | app.component('Icon' + name, icons[name]); 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /apps/db/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | qelos-db: 3 | image: mongo 4 | container_name: qelos-db 5 | ports: 6 | - "27017:27017" 7 | - "27018:27018" 8 | - "27019:27019" 9 | volumes: 10 | - ./db-data:/data/db 11 | restart: always 12 | networks: 13 | common_network: 14 | -------------------------------------------------------------------------------- /apps/secrets/server/routes/index.js: -------------------------------------------------------------------------------- 1 | const app = require('@qelos/api-kit').app() 2 | const internalCheck = require('../middleware/internal-call-check') 3 | 4 | app.use(internalCheck) 5 | 6 | app 7 | .post('/api/secrets/get', require('../controllers/get')) 8 | .post('/api/secrets/set', require('../controllers/set')) 9 | -------------------------------------------------------------------------------- /packages/web-sdk/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "target": "esnext", 5 | "outDir": "./dist", 6 | "sourceMap": true, 7 | "declaration": true, 8 | "skipLibCheck": true 9 | }, 10 | "exclude": [ 11 | "node_modules", 12 | "dist" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/components/forms/AddMore.vue: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /apps/admin/src/modules/drafts/routes.ts: -------------------------------------------------------------------------------- 1 | import { RouteRecordRaw } from 'vue-router' 2 | 3 | const draftsRoutes: RouteRecordRaw = { 4 | path: '/drafts', 5 | name: 'drafts', 6 | component: async () => (await import('./Drafts.vue')).default, 7 | meta: { roles: ['admin'] }, 8 | } 9 | 10 | export default draftsRoutes 11 | -------------------------------------------------------------------------------- /apps/secrets/config/index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | mongoUri: process.env.MONGO_URI || 'mongodb://localhost/secrets-service', 3 | secretKey: process.env.SECRET || process.env.SECRETS_SERVICE_SECRET || 'secrets-service-secret', 4 | internalSecret: process.env.INTERNAL_SECRET || 'no one can access this service without it', 5 | } 6 | -------------------------------------------------------------------------------- /packages/cache-manager/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "esnext", 5 | "outDir": "./dist", 6 | "sourceMap": true, 7 | "declaration": true, 8 | "skipLibCheck": true 9 | }, 10 | "exclude": [ 11 | "node_modules", 12 | "dist" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /apps/admin/src/modules/pre-designed/components/TemplatedViewButton.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | 14 | -------------------------------------------------------------------------------- /apps/admin/src/vue-globals.d.ts: -------------------------------------------------------------------------------- 1 | import { PubSubService } from './services/pubsub' 2 | 3 | // This is a declaration file for Vue global properties 4 | declare module 'vue' { 5 | interface ComponentCustomProperties { 6 | $isMobile: boolean 7 | $pubsub: PubSubService 8 | $t: (key: string) => string 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/ai/server/services/system-agents/plain-agent.ts: -------------------------------------------------------------------------------- 1 | import { processChatCompletion } from "../chat-completion-system-agents-service"; 2 | 3 | /** 4 | * Processes a plain chat completion request 5 | */ 6 | export function processPlainChatCompletion(req: any, res: any) { 7 | return processChatCompletion(req, res, null, () => []); 8 | } -------------------------------------------------------------------------------- /apps/secrets/server/middleware/internal-call-check.js: -------------------------------------------------------------------------------- 1 | const { internalSecret } = require('../../config') 2 | 3 | module.exports = (req, res, next) => { 4 | if (req.headers.internal_secret === internalSecret) { 5 | next() 6 | } else { 7 | res.status(401).json({ message: 'you are not allowed' }).end() 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/admin/src/modules/pre-designed/components/TemplatedEditButton.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | 14 | -------------------------------------------------------------------------------- /apps/assets/index.ts: -------------------------------------------------------------------------------- 1 | import { mongoUri } from './config' 2 | 3 | // connect to the database and load models 4 | require('./server/models').connect(mongoUri) 5 | 6 | require('./server/routes') 7 | 8 | require('@qelos/api-kit') 9 | .start('Assets Service', 10 | process.env.PORT || 9003, 11 | process.env.IP || '127.0.0.1') 12 | -------------------------------------------------------------------------------- /tools/cli/services/hashing.js: -------------------------------------------------------------------------------- 1 | const crypto = require('crypto'); 2 | 3 | function getRandomHash() { 4 | const currentDate = new Date().valueOf().toString() 5 | const random = Math.random().toString() 6 | return crypto.createHash('sha1').update(currentDate + random).digest('hex'); 7 | } 8 | 9 | module.exports = { getRandomHash } 10 | -------------------------------------------------------------------------------- /apps/admin/src/modules/pre-designed/components/TemplatedRemoveButton.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | 14 | -------------------------------------------------------------------------------- /tools/dev-cli/services/hashing.js: -------------------------------------------------------------------------------- 1 | const crypto = require('crypto'); 2 | 3 | function getRandomHash() { 4 | const currentDate = new Date().valueOf().toString() 5 | const random = Math.random().toString() 6 | return crypto.createHash('sha1').update(currentDate + random).digest('hex'); 7 | } 8 | 9 | module.exports = { getRandomHash } 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .vscode 4 | db-data 5 | compose/.env 6 | compose/*.env 7 | tmp 8 | dist 9 | common/temp 10 | *.log 11 | qelos-*.tgz 12 | *.lerna_backup 13 | coverage 14 | *k8s 15 | *.tgz 16 | Chart.lock 17 | .DS_Store 18 | .cloudfairy/libraries 19 | .cloudfairy/*-data 20 | .cloudfairy.build 21 | apps/admin/components.d.ts 22 | -------------------------------------------------------------------------------- /apps/admin/src/modules/drafts/Drafts.vue: -------------------------------------------------------------------------------- 1 | 7 | 11 | -------------------------------------------------------------------------------- /apps/auth/server/passport/index.ts: -------------------------------------------------------------------------------- 1 | const app = require('@qelos/api-kit').app() 2 | import passport from 'passport'; 3 | 4 | // pass the passport middleware 5 | app.use(passport.initialize()); 6 | 7 | // load passport strategies 8 | passport.use('local-signup', require('./local-signup')); 9 | passport.use('local-login', require('./local-login')); 10 | -------------------------------------------------------------------------------- /apps/no-code/index.ts: -------------------------------------------------------------------------------- 1 | import { start } from '@qelos/api-kit'; 2 | import { connect } from './server/models'; 3 | import { mongoUri } from './config'; 4 | import './server/routes'; 5 | 6 | // // connect to the database and load models 7 | connect(mongoUri) 8 | start('No-Code Service', process.env.PORT || 9004, process.env.IP || '127.0.0.1') 9 | 10 | -------------------------------------------------------------------------------- /apps/plugins/server/services/hook-events.ts: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events'; 2 | 3 | import { IEvent } from '../models/event'; 4 | 5 | class HooksEmitter extends EventEmitter { 6 | } 7 | 8 | export const hookEvents = new HooksEmitter(); 9 | 10 | export function emitPlatformEvent(event: IEvent) { 11 | hookEvents.emit('hook', event); 12 | } 13 | -------------------------------------------------------------------------------- /tools/cli/store/cli.js: -------------------------------------------------------------------------------- 1 | class CliStore { 2 | 3 | isVerbose = true; 4 | 5 | constructor() { 6 | this.isVerbose = process.argv.includes('--verbose'); 7 | } 8 | } 9 | 10 | let store; 11 | 12 | 13 | module.exports = { 14 | getCliStore() { 15 | if (!store) { 16 | store = new CliStore(); 17 | } 18 | return store; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /apps/admin/src/services/types/draft.ts: -------------------------------------------------------------------------------- 1 | export interface IDraftContexts { 2 | contextType: string, 3 | contextId: string | null, 4 | contextData: T, 5 | contextDisplayName: string, 6 | contextRouteParams: any 7 | } 8 | 9 | export interface Draft extends IDraftContexts { 10 | _id: string, 11 | user: string, 12 | tenant: string, 13 | } 14 | -------------------------------------------------------------------------------- /apps/auth/server/services/logger.ts: -------------------------------------------------------------------------------- 1 | import {showLogs} from '../../config'; 2 | 3 | const logger = { 4 | log: (() => undefined) as ((...data: any[]) => void), 5 | error: (() => undefined) as ((...data: any[]) => void) 6 | } 7 | 8 | if (showLogs) { 9 | logger.log = console.log; 10 | logger.error = console.error; 11 | } 12 | 13 | export default logger; 14 | -------------------------------------------------------------------------------- /tools/dev-cli/store/cli.js: -------------------------------------------------------------------------------- 1 | class CliStore { 2 | 3 | isVerbose = true; 4 | 5 | constructor() { 6 | this.isVerbose = process.argv.includes('--verbose'); 7 | } 8 | } 9 | 10 | let store; 11 | 12 | 13 | module.exports = { 14 | getCliStore() { 15 | if (!store) { 16 | store = new CliStore(); 17 | } 18 | return store; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/components/layout/EmptyState.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /apps/no-code/server/services/logger.ts: -------------------------------------------------------------------------------- 1 | import {showLogs} from '../../config'; 2 | 3 | const logger = { 4 | log: (() => undefined) as ((...data: any[]) => void), 5 | error: (() => undefined) as ((...data: any[]) => void) 6 | } 7 | 8 | if (showLogs) { 9 | logger.log = console.log; 10 | logger.error = console.error; 11 | } 12 | 13 | export default logger; 14 | -------------------------------------------------------------------------------- /e2e/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "e2e", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "test": "node --test --import tsx **/*.test.ts" 7 | }, 8 | "keywords": [], 9 | "author": "", 10 | "license": "ISC", 11 | "description": "", 12 | "dependencies": { 13 | "@qelos/sdk": "^3.6.5", 14 | "tsx": "^4.19.1" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /tools/create-play/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-play", 3 | "version": "1.0.21", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "create-play", 9 | "version": "1.0.21", 10 | "license": "MIT", 11 | "bin": { 12 | "create-play": "index.js" 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /tools/create-press/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-press", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "create-press", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "bin": { 12 | "create-press": "index.mjs" 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/utils/clear-nulls.ts: -------------------------------------------------------------------------------- 1 | export function clearNulls(obj) { 2 | if (typeof obj !== 'object' || obj instanceof Array) { 3 | return {}; 4 | } 5 | return Object.keys(obj).reduce((newObj, key) => { 6 | const val = obj[key] 7 | if (val !== null) { 8 | newObj[key] = val 9 | } 10 | return newObj 11 | }, {}) 12 | } 13 | 14 | 15 | -------------------------------------------------------------------------------- /apps/auth/server/services/dates.ts: -------------------------------------------------------------------------------- 1 | 2 | function twoDigits(num: number | string) { 3 | num = num.toString(); 4 | return num.length === 1 ? `0${num}` : num; 5 | } 6 | 7 | export function getAbsoluteDate(date: string | Date): string { 8 | date = new Date(date); 9 | 10 | return `${date.getFullYear()}-${twoDigits(date.getMonth())}-${twoDigits(date.getDay())}`; 11 | } 12 | -------------------------------------------------------------------------------- /packages/global-types/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@qelos/global-types", 3 | "version": "3.11.2", 4 | "description": "", 5 | "main": "index.ts", 6 | "types": "index.ts", 7 | "scripts": {}, 8 | "author": "", 9 | "gitHead": "13468bc51557291935b96b1aeaa837b8b52861e8", 10 | "license": "MIT", 11 | "publishConfig": { 12 | "access": "public" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /apps/admin/src/modules/plugins/store/types.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from '@/services/apis/crud'; 2 | 3 | export interface IMetaCrud { 4 | api: ReturnType 5 | identifierKey: string, 6 | navigateAfterSubmit?: { 7 | name: string, 8 | params: Record, 9 | query: Record, 10 | }, 11 | clearAfterSubmit?: boolean, 12 | } 13 | -------------------------------------------------------------------------------- /packages/api-kit/README.md: -------------------------------------------------------------------------------- 1 | # Qelos API Kit 2 | 3 | This code brings together all Qelos services 4 | 5 | ## Main Features 6 | 7 | ### Express 8 | 9 | `api-kit` creates Express apps to make the development easier. 10 | 11 | ### Auth Middlewares 12 | 13 | `api-kit` provides simple authentication middlewares from the authentication service, without having to worry about fetching. 14 | -------------------------------------------------------------------------------- /apps/admin/src/modules/blocks/Blocks.vue: -------------------------------------------------------------------------------- 1 | 7 | 11 | -------------------------------------------------------------------------------- /apps/admin/src/modules/integrations/compositions/integrations.ts: -------------------------------------------------------------------------------- 1 | import { IIntegration } from '@qelos/global-types' 2 | import { useDispatcher } from '@/modules/core/compositions/dispatcher'; 3 | import integrationsService from '@/services/apis/integrations-service'; 4 | 5 | export function useIntegrations() { 6 | return useDispatcher(() => integrationsService.getAll(), []); 7 | } -------------------------------------------------------------------------------- /apps/db/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@qelos/db", 3 | "version": "3.11.0", 4 | "scripts": { 5 | "db": "docker compose up -d" 6 | }, 7 | "author": "David Meir-Levy ", 8 | "license": "Apache-2.0", 9 | "gitHead": "13468bc51557291935b96b1aeaa837b8b52861e8", 10 | "private": false, 11 | "publishConfig": { 12 | "access": "public" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /documentation/docs/web-sdk/styling.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Styling 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | The Web SDK automatically loads shared styles from the host application to ensure your micro-frontend matches the application's theme. 10 | 11 | Styles are automatically injected into a `` 18 | } 19 | } -------------------------------------------------------------------------------- /apps/admin/src/modules/core/components/forms/SaveButton.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /apps/no-code/server/services/cache-manager.ts: -------------------------------------------------------------------------------- 1 | import { createCacheManager } from '@qelos/cache-manager'; 2 | import { redisUrl } from '../../config'; 3 | 4 | const cacher = redisUrl ? 5 | require('@qelos/cache-manager/dist/redis-cache').createRedisCache(redisUrl) : 6 | require('@qelos/cache-manager/dist/memory-cache').createMemoryCache() 7 | 8 | export const cacheManager = createCacheManager(cacher); 9 | -------------------------------------------------------------------------------- /apps/plugins/server/services/cache-manager.ts: -------------------------------------------------------------------------------- 1 | import {createCacheManager} from '@qelos/cache-manager'; 2 | import {redisUrl} from '../../config'; 3 | 4 | const cacher = redisUrl ? 5 | require('@qelos/cache-manager/dist/redis-cache').createRedisCache(redisUrl) : 6 | require('@qelos/cache-manager/dist/memory-cache').createMemoryCache() 7 | 8 | export const cacheManager = createCacheManager(cacher); 9 | -------------------------------------------------------------------------------- /apps/redis/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@qelos/redis", 3 | "version": "3.11.0", 4 | "scripts": { 5 | "db": "docker compose up -d" 6 | }, 7 | "author": "David Meir-Levy ", 8 | "license": "Apache-2.0", 9 | "gitHead": "13468bc51557291935b96b1aeaa837b8b52861e8", 10 | "private": false, 11 | "publishConfig": { 12 | "access": "public" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/plugin-play/src/logger.ts: -------------------------------------------------------------------------------- 1 | import config from './config'; 2 | 3 | const showLogs = config.dev || process.env.VERBOSE_LOGS; 4 | const logger = { 5 | log: (() => undefined) as ((...data: any[]) => void), 6 | error: (() => undefined) as ((...data: any[]) => void) 7 | } 8 | 9 | if (showLogs) { 10 | logger.log = console.log; 11 | logger.error = console.error; 12 | } 13 | 14 | export default logger; -------------------------------------------------------------------------------- /apps/auth/helpers/form-validations.ts: -------------------------------------------------------------------------------- 1 | import validator from 'validator'; 2 | 3 | export function validateBasicSignUpForm(payload: { email: string }) { 4 | const errors: Record = {}; 5 | if (!payload || typeof payload.email !== 'string' || !validator.isEmail(payload.email.trim())) { 6 | errors.email = { 7 | code: 'INVALID_EMAIL', 8 | }; 9 | } 10 | 11 | return errors; 12 | } 13 | -------------------------------------------------------------------------------- /apps/auth/jest.config.js: -------------------------------------------------------------------------------- 1 | // For a detailed explanation regarding each configuration property, visit: 2 | // https://jestjs.io/docs/en/configuration.html 3 | 4 | module.exports = { 5 | clearMocks: true, 6 | preset: 'ts-jest', 7 | coverageDirectory: "coverage", 8 | testEnvironment: "node", 9 | testMatch: [ 10 | "**/__tests__/**/*.js?(x)", 11 | "**/?(*.)+(spec|test).[j|t]s?(x)" 12 | ], 13 | }; 14 | -------------------------------------------------------------------------------- /apps/no-code/server/routes/index.ts: -------------------------------------------------------------------------------- 1 | import { app as getApp } from '@qelos/api-kit' 2 | import blueprintsRouter from './blueprints'; 3 | import entitiesRouter from './entities'; 4 | import chartsRouter from './charts'; 5 | import componentsRouter from './components'; 6 | 7 | const app = getApp() 8 | app.use(entitiesRouter); 9 | app.use(chartsRouter); 10 | app.use(blueprintsRouter); 11 | app.use(componentsRouter); -------------------------------------------------------------------------------- /packages/web-sdk/src/router.ts: -------------------------------------------------------------------------------- 1 | import {dispatch, on} from './qelos'; 2 | 3 | let availableRoutes; 4 | 5 | export function getAvailableRoutes() { 6 | return availableRoutes; 7 | } 8 | 9 | export function changeRoute(routeName: string, params: any) { 10 | dispatch('changeRoute', {routeName, params}) 11 | } 12 | 13 | dispatch('routesInterested'); 14 | on('availableRoutes', routes => availableRoutes = routes) -------------------------------------------------------------------------------- /tools/dev-cli/README.md: -------------------------------------------------------------------------------- 1 | # Qelos CLI 2 | 3 | A command-line interface to help you create and manage your Qelos application / website. 4 | 5 | ## Installation 6 | > npm link 7 | 8 | ## Commands 9 | * **help**: provides information about all the supported commands 10 | usage: qelos h, qelos --help 11 | 12 | * **version**: provides information about installed cli's version 13 | usage: qelos -V, qelos --version 14 | -------------------------------------------------------------------------------- /apps/auth/server/services/cache-manager.ts: -------------------------------------------------------------------------------- 1 | const { redisUrl } = require('../../config') 2 | 3 | const { createCacheManager } = require('@qelos/cache-manager'); 4 | 5 | const cacher = redisUrl ? 6 | require('@qelos/cache-manager/dist/redis-cache').createRedisCache(redisUrl) : 7 | require('@qelos/cache-manager/dist/memory-cache').createMemoryCache() 8 | 9 | export const cacheManager = createCacheManager(cacher); 10 | -------------------------------------------------------------------------------- /tools/create-play/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-play", 3 | "version": "1.0.21", 4 | "description": "Create a new QELOS plugin", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "license": "MIT", 9 | "homepage": "https://qelos.io", 10 | "publishConfig": { 11 | "access": "public" 12 | }, 13 | "bin": { 14 | "create-play": "index.js" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apps/admin/src/modules/users/compositions/users-stats.ts: -------------------------------------------------------------------------------- 1 | import usersService from '../../../services/apis/users-service'; 2 | import { useDispatcher } from '../../core/compositions/dispatcher'; 3 | 4 | export function useUsersStats() { 5 | const { result: stats, loading } = useDispatcher<{ users: number, workspaces: number }>( 6 | () => usersService.getOne('stats') 7 | ); 8 | return { stats, loading }; 9 | } 10 | 11 | -------------------------------------------------------------------------------- /apps/admin/src/services/apis/events-service.ts: -------------------------------------------------------------------------------- 1 | import { getCrud } from './crud' 2 | 3 | export interface IEvent { 4 | _id: string; 5 | tenant: string; 6 | user?: string; 7 | source: string; 8 | kind: string; 9 | eventName: string; 10 | description: string; 11 | metadata: any; 12 | created: Date; 13 | } 14 | 15 | const eventsService = getCrud('/api/events') 16 | 17 | export default eventsService 18 | -------------------------------------------------------------------------------- /apps/no-code/server/services/components-compiler/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../node_modules/@tsconfig/node22/tsconfig.json", 3 | "include": [ 4 | "vite.config.*" 5 | ], 6 | "compilerOptions": { 7 | "noEmit": true, 8 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 9 | 10 | "module": "ESNext", 11 | "moduleResolution": "Bundler", 12 | "types": ["node"] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /apps/plugins/server/routes/integration-tools.ts: -------------------------------------------------------------------------------- 1 | import { getRouter, getBodyParser, verifyInternalCall } from '@qelos/api-kit'; 2 | import { getIntegrationTools } from '../controllers/integration-tools'; 3 | 4 | export function integrationToolsRouter() { 5 | const router = getRouter(); 6 | 7 | router.get('/internal-api/integration-tools', getBodyParser(), verifyInternalCall, getIntegrationTools) 8 | return router; 9 | } 10 | -------------------------------------------------------------------------------- /documentation/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "vitepress dev docs", 8 | "build": "vitepress build docs", 9 | "serve": "vitepress serve docs" 10 | }, 11 | "author": "", 12 | "license": "MIT", 13 | "devDependencies": { 14 | "vitepress": "^1.6.3", 15 | "vue": "^3.5.13" 16 | }, 17 | "type": "module" 18 | } 19 | -------------------------------------------------------------------------------- /packages/sdk/src/administrator/roles.ts: -------------------------------------------------------------------------------- 1 | import { QelosSDKOptions } from '../types'; 2 | import BaseSDK from '../base-sdk'; 3 | 4 | export class QlRoles extends BaseSDK { 5 | private relativePath = '/api/roles'; 6 | 7 | constructor(private options: QelosSDKOptions) { 8 | super(options); 9 | } 10 | 11 | // Method to get all existing roles 12 | getExistingRoles() { 13 | return this.callJsonApi(this.relativePath); 14 | } 15 | } -------------------------------------------------------------------------------- /apps/admin/src/modules/pre-designed/compositions/global-styles.ts: -------------------------------------------------------------------------------- 1 | import { onUnmounted, Ref, watch } from 'vue'; 2 | 3 | export function useGlobalStyles(styles: Ref) { 4 | const styleTag = document.createElement('style'); 5 | document.body.appendChild(styleTag); 6 | 7 | watch(styles, (styles) => { 8 | styleTag.innerHTML = styles; 9 | }, { immediate: true }); 10 | 11 | onUnmounted(() => { 12 | styleTag?.remove(); 13 | }); 14 | } -------------------------------------------------------------------------------- /apps/ai/server/routes/index.ts: -------------------------------------------------------------------------------- 1 | import { app as getApp } from '@qelos/api-kit' 2 | import { chatCompletionRouter } from './chat-completion' 3 | import { sourcesChatCompletionRouter } from './sources-chat-completion' 4 | import { threadsRouter } from './threads' 5 | 6 | export async function loadRoutes() { 7 | const app = getApp() 8 | app.use(sourcesChatCompletionRouter()) 9 | app.use(chatCompletionRouter()) 10 | app.use(threadsRouter()) 11 | } 12 | -------------------------------------------------------------------------------- /apps/content/server/utils/cache-manager.js: -------------------------------------------------------------------------------- 1 | const { redisUrl } = require('../../config') 2 | 3 | const { createCacheManager } = require('@qelos/cache-manager'); 4 | 5 | const cacher = redisUrl ? 6 | require('@qelos/cache-manager/dist/redis-cache').createRedisCache(redisUrl) : 7 | require('@qelos/cache-manager/dist/memory-cache').createMemoryCache() 8 | 9 | const cacheManager = createCacheManager(cacher); 10 | 11 | module.exports = cacheManager; 12 | -------------------------------------------------------------------------------- /packages/plugin-play/src/cache-manager.ts: -------------------------------------------------------------------------------- 1 | import {CacheManager, createCacheManager} from '@qelos/cache-manager'; 2 | 3 | import config from './config'; 4 | 5 | const cacher = config.redisUrl ? 6 | require('@qelos/cache-manager/dist/redis-cache').createRedisCache(config.redisUrl) : 7 | require('@qelos/cache-manager/dist/memory-cache').createMemoryCache() 8 | 9 | export const cacheManager: CacheManager = createCacheManager(cacher, {ttl: 60 * 30}); 10 | -------------------------------------------------------------------------------- /packages/plugin-play/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "rootDir": "src", 4 | "module": "esnext", 5 | "moduleResolution": "node", 6 | "target": "esnext", 7 | "outDir": "./dist", 8 | "sourceMap": true, 9 | "declaration": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true 12 | }, 13 | "exclude": [ 14 | "examples", 15 | "node_modules", 16 | "dist", 17 | "test/e2e" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/components/semantics/PageTitle.vue: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | 18 | -------------------------------------------------------------------------------- /apps/ai/server/middlewares/integration-kind-check.ts: -------------------------------------------------------------------------------- 1 | import { IntegrationSourceKind } from "@qelos/global-types"; 2 | 3 | /** 4 | * Middleware to force specific integration kinds 5 | */ 6 | export function forceTriggerIntegrationKind(kinds: IntegrationSourceKind[], operations?: string[]) { 7 | return (req, res, next) => { 8 | req.integrationTriggerKinds = kinds; 9 | req.integrationTriggerOperations = operations; 10 | next(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /apps/plugins/server/services/logger.ts: -------------------------------------------------------------------------------- 1 | import {showLogs} from '../../config'; 2 | 3 | const logger = { 4 | log: (() => undefined) as ((...data: any[]) => void), 5 | warn: (() => undefined) as ((...data: any[]) => void), 6 | error: (() => undefined) as ((...data: any[]) => void) 7 | } 8 | 9 | if (showLogs) { 10 | logger.log = console.log; 11 | logger.warn = console.warn; 12 | logger.error = console.error; 13 | } 14 | 15 | export default logger; 16 | -------------------------------------------------------------------------------- /apps/content/index.js: -------------------------------------------------------------------------------- 1 | console.log('RUN MIGRATOR') 2 | require('child_process').execSync('node ./migrator', 3 | { stdio: 'inherit', cwd: __dirname, env: process.env }) 4 | console.log('RUN CONTENT') 5 | 6 | const { port, mongoUri } = require('./config') 7 | 8 | // connect to the database and load models 9 | require('./server/models').connect(mongoUri) 10 | 11 | require('./server/routes') 12 | 13 | require('@qelos/api-kit').start('Content Service', port) 14 | 15 | -------------------------------------------------------------------------------- /apps/admin/server.js: -------------------------------------------------------------------------------- 1 | const path = require('node:path') 2 | const express = require('express') 3 | const app = express() 4 | 5 | const port = process.env.PORT || 3001 6 | const base = process.env.BASE_URL || '/' 7 | 8 | app.use(base, express.static(path.join(__dirname, 'dist'), { maxAge: '30d' })) 9 | app.use('*', express.static(path.join(__dirname, 'dist/index.html'))) 10 | 11 | app.listen(port, () => console.log('Admin front-server is up on port ' + port, base)) 12 | -------------------------------------------------------------------------------- /apps/assets/server/middleware/editor-check.js: -------------------------------------------------------------------------------- 1 | const { editorsRoles } = require('../../config'); 2 | /** 3 | * The Auth Checker middleware function. 4 | */ 5 | module.exports = (req, res, next) => { 6 | if (!req.user) { 7 | res.status(401).end(); 8 | return; 9 | } 10 | 11 | if (req.user.roles.find(role => editorsRoles.includes(role))) { 12 | req.user.isEditor = true; 13 | next(); 14 | } else { 15 | res.status(401).end(); 16 | } 17 | }; 18 | -------------------------------------------------------------------------------- /apps/assets/server/services/get-asset-type.js: -------------------------------------------------------------------------------- 1 | const ASSET_TYPES = require('../utils/asset-types.json'); 2 | const { isImage } = require('./url'); 3 | 4 | function getAssetType(metadata) { 5 | 6 | if (isImage(metadata.name)) { 7 | return ASSET_TYPES.IMAGE; 8 | } 9 | 10 | if (metadata.kind !== ASSET_TYPES.DIRECTORY) { 11 | return ASSET_TYPES.ASSET; 12 | } 13 | 14 | return ASSET_TYPES.DIRECTORY; 15 | }; 16 | 17 | module.exports = { getAssetType }; 18 | -------------------------------------------------------------------------------- /apps/assets/server/services/logger.js: -------------------------------------------------------------------------------- 1 | const {showLogs} = require('../../config'); 2 | 3 | const logger = { 4 | log: ((...args) => undefined), 5 | warn: ((...args) => undefined), 6 | error: ((...args) => undefined), 7 | info: ((...args) => undefined) 8 | } 9 | 10 | if (showLogs) { 11 | logger.log = console.log; 12 | logger.warn = console.warn; 13 | logger.info = console.info; 14 | logger.error = console.error; 15 | } 16 | 17 | module.exports = logger; 18 | -------------------------------------------------------------------------------- /apps/auth/server/routes/user-profile.ts: -------------------------------------------------------------------------------- 1 | import { getRouter } from '@qelos/api-kit'; 2 | 3 | 4 | import verifyUser from '../middleware/verify-user'; 5 | import { onlyAuthenticated } from '../middleware/auth-check'; 6 | import { getMe, setMe } from '../controllers/me'; 7 | 8 | const router = getRouter() 9 | 10 | router 11 | .get('/api/me', verifyUser, onlyAuthenticated, getMe) 12 | .post('/api/me', verifyUser, onlyAuthenticated, setMe); 13 | 14 | export default router; -------------------------------------------------------------------------------- /apps/auth/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | "target": "es6", 5 | "module": "commonjs", 6 | "outDir": "./dist", 7 | 8 | /* Type Checking */ 9 | "strict": false, 10 | "noImplicitAny": false, 11 | "skipLibCheck": true, 12 | "noErrorTruncation": true, 13 | 14 | /* Module Resolution Options */ 15 | "esModuleInterop": true, 16 | "forceConsistentCasingInFileNames": true 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tools/dev-cli/utils/question.js: -------------------------------------------------------------------------------- 1 | const readline = require('readline'); 2 | 3 | module.exports = function askQuestion(question, defaultValue) { 4 | const questionInterface = readline.createInterface({ 5 | input: process.stdin, 6 | output: process.stdout 7 | }); 8 | return new Promise((resolve) => { 9 | questionInterface.question(question, 10 | (input) => { 11 | questionInterface.close(); 12 | resolve(input || defaultValue); 13 | }); 14 | }); 15 | } 16 | -------------------------------------------------------------------------------- /apps/admin/src/modules/assets/StorageList.vue: -------------------------------------------------------------------------------- 1 | 7 | 11 | 16 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/components/layout/BlockItem.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/drafts/server/routes/drafts.ts: -------------------------------------------------------------------------------- 1 | import { populateUser, verifyUser } from '@qelos/api-kit' 2 | import { 3 | deleteDraft, 4 | getDraft, 5 | getDraftsList, 6 | setDraft 7 | } from '../controllers/drafts' 8 | 9 | export default (app) => { 10 | app.use(populateUser) 11 | app.use(verifyUser) 12 | 13 | app 14 | .get('/api/drafts/all', getDraftsList) 15 | .get('/api/drafts', getDraft) 16 | .put('/api/drafts', setDraft) 17 | .delete('/api/drafts', deleteDraft) 18 | }; 19 | -------------------------------------------------------------------------------- /apps/ai/index.ts: -------------------------------------------------------------------------------- 1 | import { start } from '@qelos/api-kit'; 2 | import { connect } from './server/models'; 3 | import { mongoUri } from './config'; 4 | import { loadRoutes } from './server/routes'; 5 | 6 | // catch any error and print it 7 | process.on('uncaughtException', (err) => { 8 | console.error(err) 9 | }) 10 | 11 | connect(mongoUri) 12 | 13 | loadRoutes().then(async () => { 14 | return start('AI Service', process.env.PORT || 9007, process.env.IP || '127.0.0.1') 15 | }) 16 | -------------------------------------------------------------------------------- /apps/auth/index.ts: -------------------------------------------------------------------------------- 1 | import {mongoUri} from './config' 2 | import {connect} from './server/models'; 3 | 4 | // connect to the database and load models 5 | connect(mongoUri) 6 | 7 | // load passport strategies 8 | import './server/passport' 9 | import './server/routes' 10 | 11 | // start the server 12 | require('@qelos/api-kit') 13 | .start( 14 | 'Authentication Service', 15 | process.env.PORT || 9000, 16 | process.env.IP || '0.0.0.0' 17 | ) 18 | -------------------------------------------------------------------------------- /apps/auth/server/routes/roles.ts: -------------------------------------------------------------------------------- 1 | import { getRouter } from '@qelos/api-kit'; 2 | import getAllRoles from '../controllers/roles'; 3 | import verifyUser from '../middleware/verify-user'; 4 | import { onlyPrivileged } from '../middleware/auth-check'; 5 | import { handleImpersonation } from '../middleware/impersonation'; 6 | 7 | const router = getRouter(); 8 | 9 | router.get('/api/roles', verifyUser, handleImpersonation, onlyPrivileged, getAllRoles); 10 | 11 | export default router; 12 | -------------------------------------------------------------------------------- /apps/secrets/server/dao/mongo/models/secret.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | 3 | // define the Secret model schema 4 | const SecretSchema = new mongoose.Schema({ 5 | tenant: { 6 | type: String, 7 | required: true, 8 | }, 9 | key: { 10 | type: String, 11 | required: true, 12 | }, 13 | value: String, 14 | }); 15 | 16 | SecretSchema.index({ tenant: 1, key: 1 }, { unique: true }); 17 | 18 | module.exports = mongoose.model('Secret', SecretSchema); 19 | -------------------------------------------------------------------------------- /apps/admin/src/modules/plugins/components/EditPluginHeader.vue: -------------------------------------------------------------------------------- 1 | 6 | 14 | -------------------------------------------------------------------------------- /apps/admin/src/plugins/font-awesome.ts: -------------------------------------------------------------------------------- 1 | import { library } from '@fortawesome/fontawesome-svg-core' 2 | import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' 3 | 4 | import { fas } from '@fortawesome/free-solid-svg-icons' 5 | import { far } from '@fortawesome/free-regular-svg-icons' 6 | import { fab } from '@fortawesome/free-brands-svg-icons' 7 | 8 | export default function (app) { 9 | library.add(fas, far, fab) 10 | app.component('FontAwesomeIcon', FontAwesomeIcon); 11 | } 12 | -------------------------------------------------------------------------------- /apps/auth/server/routes/index.ts: -------------------------------------------------------------------------------- 1 | import invitesRouter from './invites'; 2 | import userProfileRouter from './user-profile'; 3 | import usersRouter from './users'; 4 | import authRouter from './auth'; 5 | import workspaceRouter from './workspace'; 6 | 7 | const app = require('@qelos/api-kit').app(); 8 | app.use(require('cookie-parser')()); 9 | 10 | app.use(userProfileRouter) 11 | app.use(invitesRouter) 12 | app.use(usersRouter); 13 | app.use(authRouter); 14 | app.use(workspaceRouter); 15 | -------------------------------------------------------------------------------- /apps/secrets/server/middleware/__snapshots__/internal-call-check.test.js.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`internal-call-check when request not includes valid secret should response not authorized to user 1`] = ` 4 | { 5 | "end": [ 6 | [], 7 | ], 8 | "json": [ 9 | [ 10 | { 11 | "message": "you are not allowed", 12 | }, 13 | ], 14 | ], 15 | "status": [ 16 | [ 17 | 401, 18 | ], 19 | ], 20 | } 21 | `; 22 | -------------------------------------------------------------------------------- /apps/admin/src/modules/admins/routes.ts: -------------------------------------------------------------------------------- 1 | import {RouteRecordRaw} from 'vue-router' 2 | import EmptyRoute from '../core/components/layout/EmptyRoute.vue' 3 | 4 | export const adminLogRoutes: RouteRecordRaw = { 5 | path: '/admin/log', 6 | redirect: {name: 'log'}, 7 | component: EmptyRoute, 8 | children: [ 9 | { 10 | path: '', 11 | name: 'log', 12 | component: async () => (await import('./Log.vue')).default, 13 | meta: { roles: ['admin'] }, 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /apps/auth/coverage/lcov.info: -------------------------------------------------------------------------------- 1 | TN: 2 | SF:/Users/davidlevy/projects/self/greenpress-pm2/auth/server/middleware/auth-check.js 3 | FN:1,onlyAuthenticated 4 | FN:8,onlyPrivileged 5 | FNF:2 6 | FNH:1 7 | FNDA:1,onlyAuthenticated 8 | FNDA:0,onlyPrivileged 9 | DA:2,1 10 | DA:3,1 11 | DA:5,0 12 | DA:9,0 13 | DA:10,0 14 | DA:12,0 15 | DA:15,1 16 | LF:7 17 | LH:3 18 | BRDA:2,0,0,1 19 | BRDA:2,0,1,0 20 | BRDA:9,1,0,0 21 | BRDA:9,1,1,0 22 | BRDA:9,2,0,0 23 | BRDA:9,2,1,0 24 | BRF:6 25 | BRH:1 26 | end_of_record 27 | -------------------------------------------------------------------------------- /apps/auth/mocks/express-res.mock.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | export function getExpressResMock(): ExpressResMock { 4 | const resMock = jest.fn() 5 | 6 | ;(resMock as any).status = jest.fn(() => resMock) 7 | ;(resMock as any).json = jest.fn(() => resMock) 8 | ;(resMock as any).end = jest.fn(() => resMock) 9 | 10 | return resMock as ExpressResMock 11 | } 12 | 13 | export interface ExpressResMock extends jest.Mock { 14 | status: () => jest.Mock 15 | json: () => jest.Mock 16 | end: () => jest.Mock 17 | } -------------------------------------------------------------------------------- /documentation/docs/public/desktop_mac_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/admin/src/modules/admins/components/PrivilegedAddons.vue: -------------------------------------------------------------------------------- 1 | 5 | 10 | 12 | -------------------------------------------------------------------------------- /apps/admin/src/modules/plugins/components/plugin-form/index.ts: -------------------------------------------------------------------------------- 1 | export { default as BasicInfoTab } from './BasicInfoTab.vue'; 2 | export { default as APIsTab } from './APIsTab.vue'; 3 | export { default as HooksEventsTab } from './HooksEventsTab.vue'; 4 | export { default as CRUDsTab } from './CRUDsTab.vue'; 5 | export { default as MicroFrontendsTab } from './MicroFrontendsTab.vue'; 6 | export { default as InjectablesTab } from './InjectablesTab.vue'; 7 | export { default as SummaryTab } from './SummaryTab.vue'; 8 | -------------------------------------------------------------------------------- /apps/admin/src/pre-designed/editor/MockAiChat.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /apps/local-mcp/tools/types.ts: -------------------------------------------------------------------------------- 1 | import type QelosAdministratorSDK from '@qelos/sdk/src/administrator'; 2 | import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; 3 | 4 | /** 5 | * Context passed to each tool 6 | */ 7 | export interface ToolContext { 8 | sdk: QelosAdministratorSDK; 9 | ensureAuthenticated: () => Promise; 10 | } 11 | 12 | /** 13 | * Tool registration function type 14 | */ 15 | export type ToolRegistration = (server: McpServer, context: ToolContext) => void; 16 | -------------------------------------------------------------------------------- /packages/api-kit/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "esnext", 5 | "outDir": "./dist", 6 | "sourceMap": true, 7 | "declaration": true, 8 | "skipLibCheck": true, 9 | "esModuleInterop": true, 10 | "allowSyntheticDefaultImports": true, 11 | "baseUrl": ".", 12 | "paths": { 13 | "*": [ 14 | "dist/*" 15 | ] 16 | } 17 | }, 18 | "exclude": [ 19 | "node_modules", 20 | "dist" 21 | ], 22 | } 23 | -------------------------------------------------------------------------------- /apps/no-code/server/services/components-compiler/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | 30 | *.tsbuildinfo 31 | -------------------------------------------------------------------------------- /packages/web-sdk/src/modals.ts: -------------------------------------------------------------------------------- 1 | import {dispatch, on} from './qelos'; 2 | 3 | let availableModals; 4 | 5 | export function getAvailableModals() { 6 | return availableModals 7 | } 8 | 9 | export function openModal(modalName: string, props: any) { 10 | dispatch('openModal', {modalName, props}) 11 | } 12 | 13 | export function closeModal(modalName: string) { 14 | dispatch('closeModal', {modalName}) 15 | } 16 | 17 | dispatch('modalsInterested'); 18 | on('availableModals', modals => availableModals = modals) -------------------------------------------------------------------------------- /apps/admin/src/modules/core/utils/storage.ts: -------------------------------------------------------------------------------- 1 | export function getItem(key: string, defaults = null) { 2 | const value: string = localStorage.getItem(key) || '' 3 | try { 4 | return typeof value === 'undefined' ? defaults : (JSON.parse(value)) 5 | } catch (e) { 6 | return value || defaults 7 | } 8 | } 9 | 10 | export function setItem(key, value) { 11 | localStorage.setItem(key, JSON.stringify(value)) 12 | } 13 | 14 | export function removeItem(key) { 15 | localStorage.removeItem(key) 16 | } 17 | -------------------------------------------------------------------------------- /apps/content/server/middleware/populate-user.js: -------------------------------------------------------------------------------- 1 | const { editorsRoles, adminRole } = require('../../config') 2 | const { populateUser } = require('@qelos/api-kit') 3 | 4 | /** 5 | * Populate user on request 6 | */ 7 | module.exports = (req, res, next) => { 8 | populateUser(req, res, () => { 9 | if (req.user) { 10 | const user = req.user 11 | user.isEditor = user.roles.some(role => editorsRoles.includes(role)) 12 | user.isAdmin = user.roles.includes(adminRole) 13 | } 14 | next() 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /packages/global-types/screen-requirement.ts: -------------------------------------------------------------------------------- 1 | export interface IScreenRequirement { 2 | key: string, 3 | fromHTTP?: { 4 | uri: string, 5 | method: string, 6 | query?: any, 7 | }, 8 | fromCrud?: { 9 | name: string, 10 | identifier?: string, 11 | query?: any, 12 | }, 13 | fromBlueprint?: { 14 | name: string, 15 | identifier?: string, 16 | query?: any, 17 | dependsOn?: string; 18 | dependsField?: string; 19 | }, 20 | fromData?: any; 21 | lazy?: boolean; 22 | } -------------------------------------------------------------------------------- /tools/dev-cli/services/heroku.js: -------------------------------------------------------------------------------- 1 | const execute = require('../utils/execute'); 2 | 3 | async function createAddOn(name, addOnName, appName) { 4 | return !!(await execute(`heroku addons:create ${addOnName} -a ${appName} `, `add ${name} addons to heroku app`)); 5 | } 6 | 7 | async function addVariable(key, value, appName) { 8 | await execute(`heroku config:set ${key}="${value.trim()}" -a ${appName}`, `set ${key} environment variable`) 9 | } 10 | 11 | module.exports = { 12 | createAddOn, 13 | addVariable 14 | } 15 | -------------------------------------------------------------------------------- /documentation/docs/plugin-play/crud.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: CRUD Operations 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | Learn how to create auto-generated CRUD APIs for your data models. 10 | 11 | ## Creating a CRUD 12 | 13 | ```typescript 14 | import { createCrud } from '@qelos/plugin-play'; 15 | 16 | createCrud({ 17 | name: 'Product', 18 | schema: { 19 | name: { type: String, public: true }, 20 | price: { type: Number, public: true } 21 | } 22 | }); 23 | ``` 24 | -------------------------------------------------------------------------------- /packages/plugin-play/src/request.types.ts: -------------------------------------------------------------------------------- 1 | import {StandardPayload} from './handlers'; 2 | 3 | export type RequestUser = { 4 | _id: string, 5 | username: string, 6 | email?: string, 7 | phone?: string, 8 | firstName: string, 9 | lastName: string, 10 | roles: string[], 11 | workspace?: { 12 | _id: string, 13 | roles: string[] 14 | } 15 | }; 16 | 17 | declare module 'fastify' { 18 | interface FastifyRequest { 19 | tenantPayload: StandardPayload & any; 20 | user?: RequestUser 21 | } 22 | } -------------------------------------------------------------------------------- /tools/dev-cli/controllers/compose/populate.js: -------------------------------------------------------------------------------- 1 | const execute = require('../../utils/execute'); 2 | const {getCommand} = require('../../services/populate'); 3 | module.exports = function ({tenant, host}) { 4 | if (!host) { 5 | console.log('Host domain is missing, could not populate.'); 6 | return; 7 | } 8 | execute(`docker exec qelos_auth_1 sh -c '${getCommand(tenant, host)}'`, {stdio: 'inherit'}); 9 | execute(`docker exec qelos_content_1 sh -c '${getCommand(tenant, host)}'`, {stdio: 'inherit'}); 10 | } 11 | -------------------------------------------------------------------------------- /documentation/docs/plugin-play/sdk-integration.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: SDK Integration 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | Learn how to use the Qelos SDK within your plugin to make API calls. 10 | 11 | ## Getting the SDK 12 | 13 | ```typescript 14 | import { getSdk, getSdkForTenant } from '@qelos/plugin-play'; 15 | 16 | // Get default SDK 17 | const sdk = getSdk(); 18 | 19 | // Get SDK for specific tenant 20 | const tenantSdk = await getSdkForTenant('tenant-id'); 21 | ``` 22 | -------------------------------------------------------------------------------- /tools/bundler/packages-basic-info.mjs: -------------------------------------------------------------------------------- 1 | import { execSync } from "node:child_process"; 2 | 3 | export function getPackagesBasicInfo() { 4 | const packagesJson = execSync('pnpm ls -r --json', { cwd: process.cwd() }).toString(); 5 | const packages = JSON.parse(packagesJson); 6 | 7 | return packages 8 | .map(pkg => ({ 9 | name: pkg.name, 10 | version: pkg.version, 11 | path: pkg.path 12 | })) 13 | .reduce((obj, row) => { 14 | obj[row.name] = row; 15 | return obj; 16 | }, {}) 17 | } -------------------------------------------------------------------------------- /tools/bundler/rename-pack.js: -------------------------------------------------------------------------------- 1 | const { join } = require('node:path'); 2 | const { renameSync } = require('node:fs'); 3 | const folderPath = process.cwd(); 4 | const pkg = require(join(folderPath, 'package.json')); 5 | 6 | const filePrefix = pkg.name.replace('@', '').replace(/\//, '-'); 7 | const currentFileName = `${filePrefix}-${pkg.version}.tgz`; 8 | const targetFileName = filePrefix + '.tgz'; 9 | 10 | console.log('replacing ' + currentFileName + ' to ' + targetFileName); 11 | renameSync(currentFileName, targetFileName); 12 | -------------------------------------------------------------------------------- /apps/auth/helpers/init.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * this file used to initiate basic data inside the authentication service 3 | */ 4 | import {mongoUri} from "../config"; 5 | require("../server/models").connect(mongoUri); 6 | const User = require("mongoose").model("User"); 7 | const { init } = require("./init-util.js"); 8 | 9 | init() 10 | .then(() => { 11 | console.log("admin created successfully"); 12 | process.exit(0); 13 | }) 14 | .catch((err:Error) => { 15 | console.error(err); 16 | process.exit(1); 17 | }); 18 | -------------------------------------------------------------------------------- /apps/auth/helpers/reset.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * this file used to initiate basic data inside the authentication service 3 | */ 4 | import {mongoUri} from '../config'; 5 | require('../server/models').connect(mongoUri); 6 | const User = require('mongoose').model('User'); 7 | const { reset, init } = require('./init-util.js') 8 | 9 | reset() 10 | .then(init) 11 | .then(() => { 12 | console.log('reset successfully'); 13 | process.exit(0); 14 | }) 15 | .catch((err:Error) => { 16 | console.error(err) 17 | process.exit(1) 18 | }) 19 | -------------------------------------------------------------------------------- /apps/local-mcp/resources/types.ts: -------------------------------------------------------------------------------- 1 | import type QelosAdministratorSDK from '@qelos/sdk/src/administrator'; 2 | import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; 3 | 4 | /** 5 | * Context passed to each resource 6 | */ 7 | export interface ResourceContext { 8 | sdk: QelosAdministratorSDK; 9 | ensureAuthenticated: () => Promise; 10 | } 11 | 12 | /** 13 | * Resource registration function type 14 | */ 15 | export type ResourceRegistration = (server: McpServer, context: ResourceContext) => void; 16 | -------------------------------------------------------------------------------- /apps/admin/src/services/apis/data-manipulation-service.ts: -------------------------------------------------------------------------------- 1 | import { api, getCallData } from './api'; 2 | import type { IDataManipulationStep } from '@qelos/global-types'; 3 | 4 | export interface ExecuteDataManipulationPayload { 5 | payload: Record; 6 | workflow: IDataManipulationStep[]; 7 | } 8 | 9 | export function executeDataManipulationTest({ payload, workflow }: ExecuteDataManipulationPayload) { 10 | return api 11 | .post('/api/data-manipulation', { payload, workflow }) 12 | .then(getCallData); 13 | } 14 | -------------------------------------------------------------------------------- /tools/dev-cli/utils/acceptance.js: -------------------------------------------------------------------------------- 1 | const readline = require('readline'); 2 | 3 | module.exports = function yesNoQuestion(question) { 4 | const questionInterface = readline.createInterface({ 5 | input: process.stdin, 6 | output: process.stdout 7 | }); 8 | return new Promise((resolve, reject) => { 9 | questionInterface.question(question + " [y/N] ", 10 | (input = 'n') => { 11 | input = input.toLowerCase(); 12 | questionInterface.close(); 13 | resolve(input.toLowerCase() === 'y'); 14 | }); 15 | }); 16 | } 17 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/compositions/model-change.ts: -------------------------------------------------------------------------------- 1 | import { ref, watch, Ref } from 'vue' 2 | 3 | export function useModelChange(modelValue: Ref, list: Ref, emit: any) { 4 | const selected = ref(null) 5 | watch( 6 | () => modelValue, 7 | () => { 8 | selected.value = list.value.find(item => item._id === modelValue.value) 9 | }) 10 | 11 | return { 12 | selected, 13 | change: (item) => { 14 | selected.value = item 15 | emit('update:modelValue', item) 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/utils/texts.ts: -------------------------------------------------------------------------------- 1 | 2 | export function getKeyFromName(newName: string) { 3 | return newName 4 | .replace(/ /g, '_') 5 | .replace(/[^a-zA-Z0-9_]/g, '') 6 | .toLowerCase() 7 | } 8 | 9 | export function getPlural(word: string) { 10 | const lastChar = word[word.length - 1].toLowerCase(); 11 | if (['x', 'h', 's'].includes(lastChar)) { 12 | return word + 'es'; 13 | } 14 | if (lastChar === 'y') { 15 | return word.substring(0, word.length - 1) + 'ies'; 16 | } 17 | return word + 's'; 18 | } -------------------------------------------------------------------------------- /apps/gateway/cache-manager.ts: -------------------------------------------------------------------------------- 1 | import { createCacheManager } from "@qelos/cache-manager"; 2 | 3 | const redisUrl = process.env.REDIS_URL || (process.env.REDIS_HOST ? `${process.env.REDIS_HOST}:${process.env.REDIS_PORT}` : undefined); 4 | const cacher = redisUrl 5 | ? require("@qelos/cache-manager/dist/redis-cache").createRedisCache( 6 | redisUrl 7 | ) 8 | : require("@qelos/cache-manager/dist/memory-cache").createMemoryCache(); 9 | 10 | const cacheManager = createCacheManager(cacher); 11 | 12 | export default cacheManager; 13 | -------------------------------------------------------------------------------- /documentation/docs/web-sdk/modals.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Modals 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | The Web SDK allows you to open and close modals in the host Qelos application. 10 | 11 | ## Opening a Modal 12 | 13 | ```typescript 14 | import { openModal } from '@qelos/web-sdk'; 15 | 16 | openModal('modalName', { props: 'value' }); 17 | ``` 18 | 19 | ## Closing a Modal 20 | 21 | ```typescript 22 | import { closeModal } from '@qelos/web-sdk'; 23 | 24 | closeModal('modalName'); 25 | ``` 26 | -------------------------------------------------------------------------------- /tools/cli/utils/progress-bar.mjs: -------------------------------------------------------------------------------- 1 | import * as cliProgress from "cli-progress"; 2 | 3 | export default class ProgressBar { 4 | _progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic); 5 | 6 | constructor(total = 100, start = 0) { 7 | this._progressBar.start(total, start); 8 | } 9 | 10 | stop() { 11 | this._progressBar.stop(); 12 | } 13 | 14 | update(progress) { 15 | this._progressBar.update(progress); 16 | } 17 | 18 | increment(progress = 0) { 19 | this._progressBar.increment(progress); 20 | } 21 | } -------------------------------------------------------------------------------- /tools/dev-cli/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const yargs = require('yargs/yargs') 4 | const { hideBin } = require('yargs/helpers') 5 | const { version } = require('./package.json') 6 | 7 | const program = yargs(hideBin(process.argv)); 8 | 9 | program.version(version) 10 | 11 | program.option('verbose', { 12 | alias: 'V', 13 | type: 'boolean', 14 | description: 'Run with verbose logging' 15 | }); 16 | 17 | require('./commands/create')(program) 18 | // require('./commands/compose')(program) 19 | 20 | program.help().argv; 21 | -------------------------------------------------------------------------------- /tools/dev-cli/utils/execute.js: -------------------------------------------------------------------------------- 1 | const { red } = require('../utils/colors'); 2 | const { execSync } = require('child_process'); 3 | 4 | module.exports = function execute(cmd, actionDescription, execProps = { stdio: 'pipe' }) { 5 | let result; 6 | try { 7 | result = execSync(cmd, execProps); 8 | } catch (error) { 9 | console.log(red(actionDescription ? `Error occurred while trying to ${actionDescription}: ${error.message}` : error.message)); 10 | throw error; 11 | } 12 | 13 | return { 14 | result 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/store/types/user.ts: -------------------------------------------------------------------------------- 1 | export interface IUser { 2 | _id: string, 3 | fullName: string, 4 | firstName: string, 5 | lastName: string, 6 | birthDate: string, 7 | username: string, 8 | email: string, 9 | emailVerified?: boolean, 10 | profileImage?: string, 11 | socialLogins: string[], 12 | roles: Array, 13 | metadata: any, 14 | internalMetadata?: any, 15 | workspace?: { 16 | _id: string, 17 | name: string, 18 | roles: Array, 19 | labels?: string[]; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /apps/admin/src/modules/plugins/EditPlugin.vue: -------------------------------------------------------------------------------- 1 | 6 | 13 | -------------------------------------------------------------------------------- /apps/admin/src/pre-designed/editor/MockStatsCard.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | 16 | -------------------------------------------------------------------------------- /apps/assets/server/services/url.js: -------------------------------------------------------------------------------- 1 | const { extname } = require('path') 2 | const imageExtensions = new Set(require('../utils/image-extensions.json')) 3 | 4 | function joinUrl (baseUrl, relativePath) { 5 | const base = baseUrl.endsWith('/') ? baseUrl : (baseUrl + '/') 6 | 7 | return `${base}${(relativePath.startsWith('/') ? relativePath.substr(1) : relativePath)}` 8 | } 9 | 10 | function isImage (filePath) { 11 | return imageExtensions.has(extname(filePath).slice(1).toLowerCase()) 12 | } 13 | 14 | module.exports = { joinUrl, isImage } 15 | -------------------------------------------------------------------------------- /packages/web-sdk/src/shared-style.ts: -------------------------------------------------------------------------------- 1 | import {dispatch, on} from './qelos'; 2 | 3 | export default function loadStyles() { 4 | dispatch('styleInterested'); 5 | on('sharedStyle', css => { 6 | if (!css) { 7 | return; 8 | } 9 | let appStyle = document.querySelector('#app-style'); 10 | if (!appStyle) { 11 | appStyle = document.createElement('style'); 12 | appStyle.setAttribute('id', 'app-style'); 13 | document.body.prepend(appStyle); 14 | } 15 | appStyle.innerHTML = css; 16 | }, {once: true}) 17 | } -------------------------------------------------------------------------------- /apps/admin/src/modules/integrations/store/integrations.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia'; 2 | import { useIntegrations } from '@/modules/integrations/compositions/integrations'; 3 | 4 | export const useIntegrationsStore = defineStore('integrations', () => { 5 | const { 6 | result, 7 | loading, 8 | loaded, 9 | promise, 10 | error, 11 | retry 12 | } = useIntegrations(); 13 | 14 | return { 15 | integrations: result, 16 | loading, 17 | loaded, 18 | promise, 19 | error, 20 | retry, 21 | } 22 | }) -------------------------------------------------------------------------------- /apps/ai/server/services/logger.ts: -------------------------------------------------------------------------------- 1 | import {showLogs} from '../../config'; 2 | 3 | const logger = { 4 | log: (() => undefined) as ((...data: any[]) => void), 5 | warn: (() => undefined) as ((...data: any[]) => void), 6 | error: (() => undefined) as ((...data: any[]) => void), 7 | info: (() => undefined) as ((...data: any[]) => void) 8 | } 9 | 10 | if (showLogs) { 11 | logger.log = console.log; 12 | logger.warn = console.warn; 13 | logger.error = console.error; 14 | logger.info = console.info; 15 | } 16 | 17 | export default logger; 18 | -------------------------------------------------------------------------------- /apps/assets/config/index.js: -------------------------------------------------------------------------------- 1 | const editorsRoles = process.env.EDITORS_ROLES ? process.env.EDITORS_ROLES.split(',') : ['editor', 'admin'] 2 | 3 | const isDev = process.env.NODE_ENV !== 'production'; 4 | 5 | module.exports = { 6 | dev: isDev, 7 | mongoUri: process.env.MONGO_URI || 'mongodb://localhost/assets-service', 8 | internalServicesSecret: process.env.INTERNAL_SECRET, 9 | secretsToken: process.env.ASSETS_SERVICE_SECRET || process.env.SECRETS_TOKEN, 10 | editorsRoles, 11 | showLogs: isDev || process.env.SHOW_LOGS === 'true', 12 | } 13 | -------------------------------------------------------------------------------- /apps/auth/server/services/content-service-api.ts: -------------------------------------------------------------------------------- 1 | import { internalServicesSecret } from '../../config'; 2 | import { service } from '@qelos/api-kit'; 3 | 4 | const contentService = service('CONTENT', { port: process.env.CONTENT_SERVICE_PORT || 9001 }); 5 | 6 | export function callContentService(url: string, tenant: string, data?: any) { 7 | return contentService({ 8 | headers: { internal_secret: internalServicesSecret, tenant }, 9 | method: 'GET', 10 | data, 11 | url 12 | }) 13 | .then((axiosRes: any) => axiosRes.data) 14 | } -------------------------------------------------------------------------------- /apps/auth/server/services/plugins-service-api.ts: -------------------------------------------------------------------------------- 1 | import { internalServicesSecret } from '../../config'; 2 | import { service } from '@qelos/api-kit'; 3 | 4 | const pluginsService = service('PLUGINS', { port: process.env.PLUGINS_SERVICE_PORT || 9006 }); 5 | 6 | export function callPluginsService(url: string, tenant: string, data?: any) { 7 | return pluginsService({ 8 | headers: { internal_secret: internalServicesSecret, tenant }, 9 | method: 'GET', 10 | data, 11 | url 12 | }) 13 | .then((axiosRes: any) => axiosRes.data) 14 | } -------------------------------------------------------------------------------- /packages/api-kit/src/response-error.ts: -------------------------------------------------------------------------------- 1 | export class ResponseError extends Error { 2 | internalMetadata: any; 3 | 4 | constructor(messageOrData: string | any & { message: string }, public status: number = 401, public responseMessage?: string) { 5 | const message: string = messageOrData.message || messageOrData; 6 | super(message); 7 | if (!this.responseMessage) { 8 | this.responseMessage = message; 9 | } 10 | if (typeof messageOrData === 'object') { 11 | this.internalMetadata = messageOrData; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /apps/drafts/README.md: -------------------------------------------------------------------------------- 1 | # Qelos Drafts service 2 | 3 | ## Main Features 4 | - ES6 5 | - manage dynamic drafts 6 | 7 | ## Dependencies 8 | - Node.js 9 | - pnpm 10 | - MongoDB 11 | - [Authentication-service](https://github.com/qelos-io/qelos) 12 | 13 | ## Usage 14 | 15 | ## Development and Independent Usage 16 | In case you would like to run this project manually, for any reason, there are several commands you need to acknowledge: 17 | 18 | ### Install 19 | ```sh 20 | $ pnpm install 21 | ``` 22 | 23 | ### Launch 24 | ```sh 25 | $ pnpm start 26 | ``` 27 | -------------------------------------------------------------------------------- /packages/plugin-play/src/response-error.ts: -------------------------------------------------------------------------------- 1 | export class ResponseError extends Error { 2 | internalMetadata: any; 3 | 4 | constructor(messageOrData: string | any & { message: string }, public status: number = 401, public responseMessage?: string) { 5 | const message: string = messageOrData.message || messageOrData; 6 | super(message); 7 | if (!this.responseMessage) { 8 | this.responseMessage = message; 9 | } 10 | if (typeof messageOrData === 'object') { 11 | this.internalMetadata = messageOrData; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /packages/plugin-play/test/e2e/api-plugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api-demo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.ts", 6 | "type": "commonjs", 7 | "engines": { 8 | "node": ">20", 9 | "npm": ">9" 10 | }, 11 | "scripts": { 12 | "dev": "tsx watch ./server.ts", 13 | "start": "node --import tsx ./server.ts" 14 | }, 15 | "dependencies": { 16 | "@qelos/plugin-play": "^3.7.7", 17 | "tsx": "^4.19.3" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "^22.5.4" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /packages/sdk/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "rootDir": "./src", 5 | "module": "ESNext", 6 | "target": "esnext", 7 | "outDir": "./dist", 8 | "moduleResolution": "node", 9 | "sourceMap": true, 10 | "declaration": true, 11 | "skipLibCheck": true, 12 | "paths": { 13 | "@qelos/global-types": [ 14 | "node_modules/@qelos/global-types/index.ts" 15 | ] 16 | } 17 | }, 18 | "include": ["src/**/*"], 19 | "exclude": ["dist", "node_modules", "test/**/*"] 20 | } 21 | -------------------------------------------------------------------------------- /apps/plugins/server/services/plugins-call.ts: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | import httpAgent from './http-agent'; 3 | 4 | export function fetchPlugin({ url, method = 'GET', tenant, accessToken, body = '', headers = {} }) { 5 | return fetch(url, { 6 | method, 7 | body: body || undefined, 8 | agent: httpAgent, 9 | headers: { 10 | 'x-tenant': tenant, 11 | 'x-from': 'qelos', 12 | 'Authorization': 'Bearer ' + accessToken, 13 | 'Content-Type': 'application/json', 14 | ...headers 15 | }, 16 | }); 17 | } 18 | -------------------------------------------------------------------------------- /apps/secrets/server/dao/mongo/secret.js: -------------------------------------------------------------------------------- 1 | const Secret = require('./models/secret'); 2 | 3 | function getItem(tenant, key) { 4 | return Secret.findOne({ tenant, key }).lean(); 5 | } 6 | 7 | function setItem(tenant, key, value) { 8 | // TODO: findOneAndUpdate is deprecated 9 | return Secret.findOneAndUpdate({ tenant, key }, { $set: { tenant, key, value } }, { upsert: true }); 10 | } 11 | 12 | function removeAll(tenant) { 13 | Secret.deleteMany({ tenant }) 14 | } 15 | 16 | module.exports = { 17 | getItem, 18 | setItem, 19 | removeAll 20 | }; 21 | -------------------------------------------------------------------------------- /documentation/docs/plugin-play/lifecycle.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Lifecycle Hooks 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | Learn how to hook into the Plugin Play application lifecycle. 10 | 11 | ## Lifecycle Events 12 | 13 | ```typescript 14 | import { on, LifecycleEvent } from '@qelos/plugin-play'; 15 | 16 | on(LifecycleEvent.beforeMount, ({ app }) => { 17 | console.log('App is about to mount'); 18 | }); 19 | 20 | on(LifecycleEvent.mounted, ({ app }) => { 21 | console.log('App has mounted'); 22 | }); 23 | ``` 24 | -------------------------------------------------------------------------------- /packages/web-sdk/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@qelos/web-sdk", 3 | "version": "3.11.2", 4 | "description": "Frontend Web SDK for Qelos API", 5 | "main": "./dist/index.js", 6 | "scripts": { 7 | "prepublishOnly": "npm run build", 8 | "build": "tsc" 9 | }, 10 | "author": "David Meir-Levy ", 11 | "license": "MIT", 12 | "publishConfig": { 13 | "access": "public" 14 | }, 15 | "devDependencies": { 16 | "typescript": "^4.9.5" 17 | }, 18 | "gitHead": "13468bc51557291935b96b1aeaa837b8b52861e8" 19 | } 20 | -------------------------------------------------------------------------------- /apps/admin/src/modules/admins/store/admin-assistant.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from "pinia"; 2 | import { ref } from "vue"; 3 | import { isAdmin } from "@/modules/core/store/auth"; 4 | 5 | export const useAdminAssistantStore = defineStore('adminAssistant', () => { 6 | 7 | const isAdminUser = isAdmin; 8 | 9 | const isOpen = ref(false); 10 | 11 | const toggle = () => { 12 | if (!isAdminUser.value) { 13 | return; 14 | } 15 | isOpen.value = !isOpen.value; 16 | }; 17 | 18 | return { 19 | isOpen, 20 | toggle 21 | } 22 | }); 23 | -------------------------------------------------------------------------------- /tools/dev-cli/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@qelos/dev-cli", 3 | "version": "0.9.18", 4 | "description": "CLI to install Qelos", 5 | "main": "cli.js", 6 | "bin": { 7 | "ql-dev": "cli.js" 8 | }, 9 | "keywords": [ 10 | "qelos", 11 | "cli" 12 | ], 13 | "author": "David Meir-Levy ", 14 | "dependencies": { 15 | "cli-progress": "3.9.0", 16 | "yargs": "^17.2.0" 17 | }, 18 | "scripts": { 19 | "test": "jest --runInBand" 20 | }, 21 | "devDependencies": { 22 | "jest": "^27.5.1" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/NonPrivilegedHome.vue: -------------------------------------------------------------------------------- 1 | 12 | 15 | -------------------------------------------------------------------------------- /apps/admin/src/modules/blocks/compositions/editor-config.ts: -------------------------------------------------------------------------------- 1 | import { computed, watch, ref } from 'vue' 2 | import { useAppConfiguration } from '../../configurations/store/app-configuration' 3 | 4 | export function useEditorConfig() { 5 | const {appConfig} = useAppConfiguration() 6 | const editorConfig = ref({ language: 'en-gb' }) 7 | 8 | const language = computed(() => { 9 | const lang = appConfig.value.language; 10 | if(!lang || lang === 'en') { 11 | return 'en-gb'; 12 | } 13 | return lang 14 | }) 15 | 16 | return { 17 | editorConfig 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /apps/admin/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "module": "ESNext", 5 | "target": "ESNext", 6 | "moduleResolution": "Node", 7 | "paths": { 8 | "@/*": [ 9 | "./src/*" 10 | ] 11 | }, 12 | "types": [ 13 | "vitest/globals", 14 | "element-plus/global", 15 | "vue" 16 | ], 17 | "lib": ["ESNext", "DOM"], 18 | "skipLibCheck": true 19 | }, 20 | "include": [ 21 | "src/**/*.ts", 22 | "src/**/*.d.ts", 23 | "src/**/*.tsx", 24 | "src/**/*.vue" 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /apps/drafts/helpers/remove.ts: -------------------------------------------------------------------------------- 1 | import draftDao from '../server/dao/drafts'; 2 | 3 | const TENANT = process.env.TENANT; 4 | 5 | if (!TENANT) { 6 | console.log('you must specify the tenant you want to be removed'); 7 | process.exit(0); 8 | } 9 | 10 | console.log('initiate remove tenant'); 11 | 12 | Promise.all([ 13 | draftDao.removeTenantDrafts(TENANT), 14 | ]) 15 | .then(() => { 16 | console.log('tenant deleted successfully'); 17 | process.exit(0); 18 | }) 19 | .catch((err) => { 20 | console.log(err); 21 | process.exit(1); 22 | }); 23 | 24 | -------------------------------------------------------------------------------- /apps/secrets/README.md: -------------------------------------------------------------------------------- 1 | # Secrets service 2 | 3 | An HTTP server to manage internal application secrets 4 | 5 | ## Dependencies 6 | - Node.js 7 | - pnpm 8 | - MongoDB 9 | 10 | ## Usage 11 | ### As a Docker container 12 | ```sh 13 | $ docker run -p 3001:3001 qelos/secrets 14 | ``` 15 | 16 | ## Development and Independent Usage 17 | In case you would like to run this project manually, for any reason, there are several commands you need to acknowledge: 18 | 19 | ## Install 20 | ```sh 21 | $ pnpm install 22 | ``` 23 | 24 | ## Launch 25 | ```sh 26 | $ pnpm start 27 | ``` 28 | -------------------------------------------------------------------------------- /apps/secrets/server/controllers/get.js: -------------------------------------------------------------------------------- 1 | const SecretService = require('../services/secrets'); 2 | 3 | module.exports = function getSecret(req, res) { 4 | const { key, token } = req.body || {} 5 | 6 | if (!(key && token)) { 7 | return res.status(400).json({ message: 'missing parameters to recognize values' }).end() 8 | } 9 | 10 | return SecretService.getDecrypted(req.headers.tenant, key, token) 11 | .then(result => { 12 | res.status(200).json(result).end() 13 | }) 14 | .catch(() => { 15 | return res.status(400).end(); 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /tools/dev-cli/utils/progress-bar.js: -------------------------------------------------------------------------------- 1 | const cliProgress = require('cli-progress'); 2 | 3 | class ProgressBar { 4 | _progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic); 5 | 6 | constructor(total = 100, start = 0) { 7 | this._progressBar.start(total, start); 8 | } 9 | 10 | stop() { 11 | this._progressBar.stop(); 12 | } 13 | 14 | update(progress) { 15 | this._progressBar.update(progress); 16 | } 17 | 18 | increment(progress = 0) { 19 | this._progressBar.increment(progress); 20 | } 21 | } 22 | 23 | module.exports = ProgressBar; 24 | -------------------------------------------------------------------------------- /apps/secrets/server/dao/secrets.js: -------------------------------------------------------------------------------- 1 | const { mongoUri } = require('../../config'); 2 | 3 | let secretModel; 4 | if (mongoUri) { 5 | require('./mongo/connect')(mongoUri); 6 | secretModel = require('./mongo/secret'); 7 | } 8 | 9 | module.exports = { 10 | getItem: (tenant, key) => secretModel.getItem(tenant, key), 11 | setItem: (tenant, key, value) => secretModel.setItem(tenant, key, value), 12 | removeAll: (tenant) => { 13 | if (!tenant) { 14 | throw new Error('tenant must be provided'); 15 | } 16 | return secretModel.removeAll(tenant) 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /apps/no-code/server/services/blueprints.service.ts: -------------------------------------------------------------------------------- 1 | import { cacheManager } from './cache-manager'; 2 | import Blueprint, { IBlueprint } from '../models/blueprint'; 3 | 4 | export async function getBlueprint(tenant: string, identifier: string): Promise { 5 | const blueprintJson = await cacheManager.wrap(`blueprint:${tenant}:${identifier}`, async () => { 6 | const blueprint = await Blueprint 7 | .findOne({ tenant, identifier }) 8 | .lean() 9 | .exec() 10 | return JSON.stringify(blueprint); 11 | }) 12 | return JSON.parse(blueprintJson); 13 | } -------------------------------------------------------------------------------- /apps/secrets/server/controllers/set.js: -------------------------------------------------------------------------------- 1 | const SecretsService = require('../services/secrets'); 2 | 3 | module.exports = function setSecret(req, res) { 4 | const { key, value, token } = req.body || {} 5 | 6 | if (!(key && token)) { 7 | res.status(400).json({ message: 'missing parameters to set values' }).end(); 8 | return; 9 | } 10 | 11 | SecretsService.setEncrypted(req.headers.tenant, key, value, token) 12 | .then(() => { 13 | res.status(200).json({ key }).end() 14 | }) 15 | .catch(() => { 16 | res.status(400).json().end() 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /packages/global-types/app-configuration-metadata.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface IAppConfigurationMetadata { 3 | name: string; 4 | logoUrl: string; 5 | description: string; 6 | keywords: string; 7 | slogan: string; 8 | language: string; 9 | direction: string; 10 | themeStylesUrl: string; 11 | scriptUrl: string; 12 | homeScreen: string; 13 | colorsPalette: Record; 14 | borderRadius: number; 15 | baseFontSize: number; 16 | websiteUrls: string[]; 17 | layoutStyle?: 'classic' | 'main-bordered' | 'stacked-header'; 18 | 19 | [key: string]: any; 20 | } -------------------------------------------------------------------------------- /packages/web-sdk/src/route.ts: -------------------------------------------------------------------------------- 1 | import {dispatch, on} from './qelos'; 2 | 3 | let currentRoute; 4 | let subscribers; 5 | 6 | export function getCurrentRoute() { 7 | return currentRoute; 8 | } 9 | 10 | export function onRouteChanged(callback) { 11 | if (!subscribers) { 12 | subscribers = new Set(); 13 | } 14 | subscribers.add(callback); 15 | } 16 | 17 | dispatch('routeChangedInterested'); 18 | 19 | on('routeChanged', route => { 20 | currentRoute = route; 21 | if (subscribers && subscribers.size) { 22 | subscribers.forEach(cb => cb(currentRoute)) 23 | } 24 | }); -------------------------------------------------------------------------------- /tools/cli/tests/utils/test-suite.js: -------------------------------------------------------------------------------- 1 | const { rmSync, mkdirSync } = require('node:fs'); 2 | const { execSync } = require('node:child_process'); 3 | 4 | function initTestSuite() { 5 | beforeEach(() => { 6 | try { 7 | rmSync("tmp", { recursive: true }); 8 | } catch { 9 | // 10 | } 11 | try { 12 | mkdirSync("tmp"); 13 | } catch { 14 | // 15 | } 16 | execSync("npm link"); 17 | }); 18 | 19 | afterAll(() => { 20 | rmSync("tmp", { recursive: true }); 21 | }); 22 | } 23 | 24 | module.exports = { 25 | initTestSuite 26 | } 27 | -------------------------------------------------------------------------------- /tools/dev-cli/tests/utils/test-suite.js: -------------------------------------------------------------------------------- 1 | const { rmdirSync, mkdirSync } = require('fs'); 2 | const { execSync } = require('child_process'); 3 | 4 | function initTestSuite() { 5 | beforeEach(() => { 6 | try { 7 | rmdirSync("tmp", { recursive: true }); 8 | } catch { 9 | // 10 | } 11 | try { 12 | mkdirSync("tmp"); 13 | } catch { 14 | // 15 | } 16 | execSync("npm link"); 17 | }); 18 | 19 | afterAll(() => { 20 | rmdirSync("tmp", { recursive: true }); 21 | }); 22 | } 23 | 24 | module.exports = { 25 | initTestSuite 26 | } 27 | -------------------------------------------------------------------------------- /apps/admin/src/modules/layouts/compositions/styles-marketplace.ts: -------------------------------------------------------------------------------- 1 | import {useDispatcher} from '@/modules/core/compositions/dispatcher'; 2 | 3 | export interface IStyleProduct { 4 | name: string, 5 | description: string, 6 | 'thumbnails': string[], 7 | 'creator': { 8 | name: string, 9 | email: string, 10 | website: string 11 | } 12 | } 13 | 14 | export function useStylesMarketplace() { 15 | const { 16 | result: styles, 17 | retry 18 | } = useDispatcher(() => [], []) 19 | 20 | return { 21 | styles, 22 | retry, 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /apps/admin/src/modules/pre-designed/components/ContentBox.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 19 | 20 | -------------------------------------------------------------------------------- /apps/auth/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:22.14-slim AS builder 2 | ENV PNPM_HOME="/pnpm" 3 | ENV PATH="$PNPM_HOME:$PATH" 4 | RUN corepack enable 5 | ENV PORT=9000 6 | ENV NODE_ENV=production 7 | EXPOSE $PORT 8 | COPY qelos-auth.tgz . 9 | # Extract the tarball directly to root with special flags to handle paths with '..' safely 10 | RUN cd / && tar --absolute-names --no-same-owner --no-same-permissions -xzf qelos-auth.tgz 11 | 12 | # Set working directory to the package directory 13 | WORKDIR /package 14 | 15 | # Install dependencies 16 | RUN pnpm install --no-frozen-lockfile 17 | CMD pnpm start 18 | -------------------------------------------------------------------------------- /apps/auth/server/services/workspaces.ts: -------------------------------------------------------------------------------- 1 | import Workspace from '../models/workspace'; 2 | 3 | export async function getWorkspaceForUser(tenant: string, userId: any, workspaceId?: string) { 4 | const query: any = { 5 | tenant, 6 | 'members.user': userId 7 | }; 8 | if (workspaceId) { 9 | query._id = workspaceId; 10 | } 11 | const { _id, name, members, labels } = await Workspace 12 | .findOne(query) 13 | .select('name labels members.$') 14 | .exec(); 15 | return ({ 16 | _id, 17 | name, 18 | roles: members[0].roles, 19 | labels 20 | }); 21 | } -------------------------------------------------------------------------------- /apps/admin/src/modules/pre-designed/components/Pre.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /apps/admin/src/vue-shims.d.ts: -------------------------------------------------------------------------------- 1 | import { Router } from 'vue-router'; 2 | import { RouteLocationNormalizedLoaded } from 'vue-router'; 3 | 4 | // Extend the Vue types 5 | declare module '@vue/runtime-core' { 6 | interface ComponentCustomProperties { 7 | $router: Router; 8 | $route: RouteLocationNormalizedLoaded; 9 | } 10 | } 11 | 12 | // Add Vite environment variables type 13 | declare interface ImportMeta { 14 | readonly env: Record; 15 | } 16 | 17 | // Add window global properties 18 | interface Window { 19 | SENTRY_DSN?: string; 20 | opera?: any; 21 | } 22 | -------------------------------------------------------------------------------- /apps/assets/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:22.14-slim AS builder 2 | ENV PNPM_HOME="/pnpm" 3 | ENV PATH="$PNPM_HOME:$PATH" 4 | RUN corepack enable 5 | ENV PORT=9003 6 | ENV NODE_ENV=production 7 | EXPOSE $PORT 8 | COPY qelos-assets.tgz . 9 | # Extract the tarball directly to root with special flags to handle paths with '..' safely 10 | RUN cd / && tar --absolute-names --no-same-owner --no-same-permissions -xzf qelos-assets.tgz 11 | 12 | # Set working directory to the package directory 13 | WORKDIR /package 14 | 15 | # Install dependencies 16 | RUN pnpm install --no-frozen-lockfile 17 | CMD pnpm start 18 | -------------------------------------------------------------------------------- /apps/drafts/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:22.14-slim AS builder 2 | ENV PNPM_HOME="/pnpm" 3 | ENV PATH="$PNPM_HOME:$PATH" 4 | RUN corepack enable 5 | ENV NODE_ENV=production 6 | ENV PORT=9005 7 | EXPOSE $PORT 8 | COPY qelos-drafts.tgz . 9 | # Extract the tarball directly to root with special flags to handle paths with '..' safely 10 | RUN cd / && tar --absolute-names --no-same-owner --no-same-permissions -xzf qelos-drafts.tgz 11 | 12 | # Set working directory to the package directory 13 | WORKDIR /package 14 | 15 | # Install dependencies 16 | RUN pnpm install --no-frozen-lockfile 17 | CMD pnpm start 18 | -------------------------------------------------------------------------------- /apps/admin/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:22.14-slim AS builder 2 | ENV PNPM_HOME="/pnpm" 3 | ENV PATH="$PNPM_HOME:$PATH" 4 | RUN corepack enable 5 | ENV PORT=3001 6 | EXPOSE $PORT 7 | ENV NODE_ENV=production 8 | COPY qelos-admin.tgz . 9 | # Extract the tarball directly to root with special flags to handle paths with '..' safely 10 | RUN cd / && tar --absolute-names --no-same-owner --no-same-permissions -xzf qelos-admin.tgz 11 | 12 | # Set working directory to the package directory 13 | WORKDIR /package 14 | 15 | # Install dependencies 16 | RUN pnpm install --no-frozen-lockfile 17 | 18 | CMD pnpm start 19 | -------------------------------------------------------------------------------- /apps/assets/README.md: -------------------------------------------------------------------------------- 1 | # Qelos Assets service 2 | 3 | An HTTP server to manage static assets on several assets providers 4 | 5 | ## Dependencies 6 | - Node.js 7 | - npm OR yarn 8 | - MongoDB 9 | 10 | ## Usage 11 | ### As a Docker container 12 | ```sh 13 | $ docker run -p 3001:3001 qelos/assets 14 | ``` 15 | 16 | ## Development and Independent Usage 17 | In case you would like to run this project manually, for any reason, there are several commands you need to acknowledge: 18 | 19 | ### Install 20 | ```sh 21 | $ pnpm install 22 | ``` 23 | 24 | ### Launch 25 | ```sh 26 | $ pnpm start 27 | ``` 28 | -------------------------------------------------------------------------------- /apps/auth/server/services/__mocks__/tokens.ts: -------------------------------------------------------------------------------- 1 | export const verifyToken = jest.fn().mockImplementation(() => { 2 | return Promise.resolve({ 3 | tokenIdentifier: 'mock-token', 4 | }); 5 | }); 6 | 7 | export const getUniqueId = jest.fn().mockImplementation(() => Math.random() + ':unique-id'); 8 | 9 | export const setCookie = jest.fn().mockImplementation((res, token) => { 10 | res.cookie('mock', token) 11 | return res; 12 | }) 13 | 14 | export const getSignedToken = jest.fn().mockImplementation((user) => { 15 | return { 16 | token: 'mock-token', 17 | payload: user 18 | } 19 | }) -------------------------------------------------------------------------------- /apps/content/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:22.14-slim AS builder 2 | ENV PNPM_HOME="/pnpm" 3 | ENV PATH="$PNPM_HOME:$PATH" 4 | RUN corepack enable 5 | ENV NODE_ENV=production 6 | ENV PORT=9001 7 | EXPOSE $PORT 8 | COPY qelos-content.tgz . 9 | # Extract the tarball directly to root with special flags to handle paths with '..' safely 10 | RUN cd / && tar --absolute-names --no-same-owner --no-same-permissions -xzf qelos-content.tgz 11 | 12 | # Set working directory to the package directory 13 | WORKDIR /package 14 | 15 | # Install dependencies 16 | RUN pnpm install --no-frozen-lockfile 17 | CMD pnpm start 18 | -------------------------------------------------------------------------------- /apps/content/migrator/migrations/1/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * initial migration - example file - nothing to migrate 3 | */ 4 | 5 | /** 6 | * check potential changes to migrate 7 | */ 8 | function check () { 9 | return Promise.resolve(false) 10 | } 11 | 12 | /** 13 | * migrate relevant db rows to fit the new upgrade 14 | */ 15 | function migrate () { 16 | return Promise.resolve() 17 | } 18 | 19 | /** 20 | * check if all migration changes done as expected 21 | */ 22 | function verify () { 23 | return Promise.resolve() 24 | } 25 | 26 | module.exports = { 27 | check, migrate, verify 28 | } 29 | -------------------------------------------------------------------------------- /apps/content/migrator/migrations/3/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * initial migration - example file - nothing to migrate 3 | */ 4 | 5 | /** 6 | * check potential changes to migrate 7 | */ 8 | function check () { 9 | return Promise.resolve(false) 10 | } 11 | 12 | /** 13 | * migrate relevant db rows to fit the new upgrade 14 | */ 15 | function migrate () { 16 | return Promise.resolve() 17 | } 18 | 19 | /** 20 | * check if all migration changes done as expected 21 | */ 22 | function verify () { 23 | return Promise.resolve() 24 | } 25 | 26 | module.exports = { 27 | check, migrate, verify 28 | } 29 | -------------------------------------------------------------------------------- /apps/content/migrator/migrations/4/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * initial migration - example file - nothing to migrate 3 | */ 4 | 5 | /** 6 | * check potential changes to migrate 7 | */ 8 | function check () { 9 | return Promise.resolve(false) 10 | } 11 | 12 | /** 13 | * migrate relevant db rows to fit the new upgrade 14 | */ 15 | function migrate () { 16 | return Promise.resolve() 17 | } 18 | 19 | /** 20 | * check if all migration changes done as expected 21 | */ 22 | function verify () { 23 | return Promise.resolve() 24 | } 25 | 26 | module.exports = { 27 | check, migrate, verify 28 | } 29 | -------------------------------------------------------------------------------- /apps/content/migrator/migrations/5/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * initial migration - example file - nothing to migrate 3 | */ 4 | 5 | /** 6 | * check potential changes to migrate 7 | */ 8 | function check () { 9 | return Promise.resolve(false) 10 | } 11 | 12 | /** 13 | * migrate relevant db rows to fit the new upgrade 14 | */ 15 | function migrate () { 16 | return Promise.resolve() 17 | } 18 | 19 | /** 20 | * check if all migration changes done as expected 21 | */ 22 | function verify () { 23 | return Promise.resolve() 24 | } 25 | 26 | module.exports = { 27 | check, migrate, verify 28 | } 29 | -------------------------------------------------------------------------------- /apps/gateway/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:22.14-slim AS builder 2 | ENV PNPM_HOME="/pnpm" 3 | ENV PATH="$PNPM_HOME:$PATH" 4 | RUN corepack enable 5 | ENV PORT=3000 6 | ENV NODE_ENV=production 7 | EXPOSE $PORT 8 | COPY qelos-gateway.tgz . 9 | # Extract the tarball directly to root with special flags to handle paths with '..' safely 10 | RUN cd / && tar --absolute-names --no-same-owner --no-same-permissions -xzf qelos-gateway.tgz 11 | 12 | # Set working directory to the package directory 13 | WORKDIR /package 14 | 15 | # Install dependencies 16 | RUN pnpm install --no-frozen-lockfile 17 | CMD pnpm start 18 | -------------------------------------------------------------------------------- /apps/secrets/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:22.14-slim AS builder 2 | ENV PNPM_HOME="/pnpm" 3 | ENV PATH="$PNPM_HOME:$PATH" 4 | RUN corepack enable 5 | ENV NODE_ENV=production 6 | ENV PORT=9002 7 | EXPOSE $PORT 8 | COPY qelos-secrets.tgz . 9 | # Extract the tarball directly to root with special flags to handle paths with '..' safely 10 | RUN cd / && tar --absolute-names --no-same-owner --no-same-permissions -xzf qelos-secrets.tgz 11 | 12 | # Set working directory to the package directory 13 | WORKDIR /package 14 | 15 | # Install dependencies 16 | RUN pnpm install --no-frozen-lockfile 17 | CMD pnpm start 18 | -------------------------------------------------------------------------------- /packages/cache-manager/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@qelos/cache-manager", 3 | "version": "3.11.2", 4 | "description": "", 5 | "main": "./dist/index.js", 6 | "private": false, 7 | "scripts": { 8 | "build": "tsc" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "MIT", 13 | "dependencies": { 14 | "redis": "3.1.2" 15 | }, 16 | "devDependencies": { 17 | "@types/redis": "^2.8.32", 18 | "typescript": "^4.9.5" 19 | }, 20 | "publishConfig": { 21 | "access": "public" 22 | }, 23 | "gitHead": "13468bc51557291935b96b1aeaa837b8b52861e8" 24 | } 25 | -------------------------------------------------------------------------------- /apps/assets/server/routes/upload.ts: -------------------------------------------------------------------------------- 1 | import { getRouter, populateUser, verifyUser } from "@qelos/api-kit"; 2 | 3 | import { uploadFile } from "../controllers/upload"; 4 | import upload from "../middleware/upload"; 5 | 6 | const AUTH_MIDDLEWARES = [populateUser, verifyUser]; 7 | 8 | const router = getRouter(); 9 | 10 | router.post("/api/upload", AUTH_MIDDLEWARES, (req, res, next) => { 11 | if (req.get('content-type')?.startsWith('multipart/form-data')) { 12 | upload.single('file')(req, res, next); 13 | } else { 14 | next(); 15 | } 16 | }, uploadFile); 17 | 18 | module.exports = router; 19 | -------------------------------------------------------------------------------- /tools/cli/services/create.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const execute = require("../utils/execute"); 3 | const { red } = require("../utils/colors"); 4 | 5 | function installNodeDependencies(directoryName) { 6 | console.log(process.cwd(), directoryName); 7 | try { 8 | execute(`npm install`, "install dependencies", { 9 | cwd: directoryName, 10 | stdio: "inherit", 11 | }); 12 | } catch { 13 | console.log(red(`Failed to install dependencies using \`npm install\`.`)); 14 | process.exit(1); 15 | } 16 | } 17 | 18 | module.exports = { 19 | installNodeDependencies, 20 | }; 21 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | MONGO_URI=mongodb://localhost/qelos 2 | SECRETS_SERVICE_SECRET=secrets-service-secret 3 | PLUGINS_SERVICE_SECRET=plugins-service-secret 4 | AUTH_SERVICE_SECRET=auth-service-secret 5 | ASSETS_SERVICE_SECRET=assets-service-secret 6 | NO_CODE_SERVICE_SECRET=no-code-service-secret 7 | INTERNAL_SECRET="no one can access this service without it" 8 | SECRETS_SERVICE_PORT=9002 9 | VITE_SENTRY_DSN= 10 | OPEN_AI_TOKEN= 11 | MAIN_TENANT= 12 | REDIS_URL=redis://localhost:6379 13 | 14 | # MCP Service Configuration 15 | MCP_QELOS_URL=http://localhost:3000 16 | MCP_QELOS_USERNAME=test@test.com 17 | MCP_QELOS_PASSWORD=admin -------------------------------------------------------------------------------- /tools/dev-cli/services/create.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const execute = require("../utils/execute"); 3 | const { red } = require("../utils/colors"); 4 | 5 | function installNodeDependencies(directoryName) { 6 | console.log(process.cwd(), directoryName); 7 | try { 8 | execute(`npm install`, "install dependencies", { 9 | cwd: directoryName, 10 | stdio: "inherit", 11 | }); 12 | } catch { 13 | console.log(red(`Failed to install dependencies using \`npm install\`.`)); 14 | process.exit(1); 15 | } 16 | } 17 | 18 | module.exports = { 19 | installNodeDependencies, 20 | }; 21 | -------------------------------------------------------------------------------- /apps/plugins/index.ts: -------------------------------------------------------------------------------- 1 | import { start, config } from '@qelos/api-kit'; 2 | import { connect } from './server/models'; 3 | import { mongoUri } from './config'; 4 | import { loadRoutes } from './server/routes'; 5 | 6 | // catch any error and print it 7 | process.on('uncaughtException', (err) => { 8 | console.error(err) 9 | }) 10 | 11 | connect(mongoUri) 12 | 13 | config({ 14 | bodyParser: null, 15 | }) 16 | 17 | loadRoutes().then(async () => { 18 | await import('./server/services/hook-events-subscriber'); 19 | return start('Plugins Service', process.env.PORT || 9006, process.env.IP || '127.0.0.1') 20 | }) 21 | -------------------------------------------------------------------------------- /apps/admin/src/modules/no-code/components/WorkspaceLabelSelector.vue: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | -------------------------------------------------------------------------------- /apps/plugins/helpers/encryptionHelper.ts: -------------------------------------------------------------------------------- 1 | import { IntegrationSourceKind } from '@qelos/global-types'; 2 | import { storeEncryptedSourceAuthentication } from '../server/services/source-authentication-service'; 3 | 4 | export async function removeEncryptedSourceAuthentication(tenant: string, kind: IntegrationSourceKind, authentication: any) { 5 | if (!authentication || !authentication.clientSecret) { 6 | return; 7 | } 8 | 9 | try { 10 | await storeEncryptedSourceAuthentication(tenant, kind, null, authentication); 11 | } catch (err) { 12 | throw new Error("Failed to remove encrypted authentication"); 13 | } 14 | } -------------------------------------------------------------------------------- /packages/global-types/workspace-configuration-metadata.ts: -------------------------------------------------------------------------------- 1 | export interface WorkspaceLabelDefinition { 2 | title: string, 3 | description: string, 4 | value: string[], 5 | allowedRolesForCreation?: string[], 6 | } 7 | 8 | export interface WorkspaceConfigurationMetadata { 9 | isActive: boolean, 10 | creationPrivilegedRoles: string[], 11 | viewMembersPrivilegedWsRoles: string[], 12 | labels: WorkspaceLabelDefinition[], 13 | allowNonLabeledWorkspaces: boolean, 14 | allowNonWorkspaceUsers: boolean, 15 | allowLogo?: boolean, 16 | createWorkspacePageTitle?: string, 17 | labelsSelectorTitle?: string, 18 | } -------------------------------------------------------------------------------- /apps/admin/src/style/mobile.scss: -------------------------------------------------------------------------------- 1 | @media screen and (max-width: 768px) { 2 | body, html, #app { 3 | overflow-x: hidden; 4 | max-width: 100vw; 5 | } 6 | 7 | * { 8 | max-width: 100%; 9 | } 10 | 11 | .container { 12 | margin: 5px 0; 13 | max-width: 100%; 14 | } 15 | 16 | .el-card { 17 | max-width: 100%; 18 | overflow-x: hidden; 19 | } 20 | 21 | .el-dialog { 22 | --el-dialog-width: 100%; 23 | margin: 70px 0 0 0; 24 | height: calc(100vh - 70px); 25 | 26 | .el-dialog__body { 27 | overflow: auto; 28 | height: calc(100% - 70px); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /apps/auth/server/routes/invites.ts: -------------------------------------------------------------------------------- 1 | import { getRouter } from '@qelos/api-kit'; 2 | import verifyUser from '../middleware/verify-user'; 3 | import { onlyAuthenticated } from '../middleware/auth-check'; 4 | import { getInvites, respondToInvite } from '../controllers/invites'; 5 | import { handleImpersonation } from '../middleware/impersonation'; 6 | 7 | const invitesRouter = getRouter() 8 | 9 | invitesRouter 10 | .get('/api/invites', verifyUser, onlyAuthenticated, handleImpersonation, getInvites) 11 | .post('/api/invites', verifyUser, onlyAuthenticated, handleImpersonation, respondToInvite); 12 | 13 | export default invitesRouter; -------------------------------------------------------------------------------- /apps/admin/src/modules/pre-designed/components/ConfirmMessage.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | -------------------------------------------------------------------------------- /apps/admin/src/modules/users/EditUser.vue: -------------------------------------------------------------------------------- 1 | 9 | 16 | -------------------------------------------------------------------------------- /apps/auth/server/middleware/auth-config-check.ts: -------------------------------------------------------------------------------- 1 | import { NextFunction, Response, RequestHandler } from 'express'; 2 | import { AuthRequest } from '../../types'; 3 | import { getAuthConfiguration } from '../services/auth-configuration'; 4 | 5 | export const authConfigCheck = async function authConfigCheck(req: AuthRequest, res: Response, next: NextFunction) { 6 | const authConfig = await getAuthConfiguration(req.headers.tenant) 7 | if (!authConfig) { 8 | res.status(403).json({ message: 'tenant auth config does not exist' }).end() 9 | return; 10 | } 11 | req.authConfig = authConfig 12 | next() 13 | } 14 | -------------------------------------------------------------------------------- /documentation/docs/plugin-play/micro-frontends.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Micro-Frontends 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | Learn how to register micro-frontends (UI components) in your plugin. 10 | 11 | ## Adding a Micro-Frontend 12 | 13 | ```typescript 14 | import { addMicroFrontend } from '@qelos/plugin-play'; 15 | 16 | addMicroFrontend({ 17 | name: 'My Component', 18 | description: 'A custom UI component', 19 | url: 'https://my-plugin.com/component', 20 | route: { 21 | name: 'my-route', 22 | path: '/my-route', 23 | navBarPosition: 'top' 24 | } 25 | }); 26 | ``` 27 | -------------------------------------------------------------------------------- /tools/cli/commands/generate.mjs: -------------------------------------------------------------------------------- 1 | import generateController from "../controllers/generate.mjs"; 2 | 3 | export default function generateCommand(program) { 4 | program 5 | .command('generate rules ', 'Generate IDE-specific rules files for working with pulled Qelos resources.', 6 | (yargs) => { 7 | return yargs 8 | .positional('type', { 9 | describe: 'Type of IDE rules to generate. Can be windsurf, cursor, claude, or all.', 10 | type: 'string', 11 | choices: ['windsurf', 'cursor', 'claude', 'all'] 12 | }) 13 | }, 14 | generateController) 15 | } 16 | -------------------------------------------------------------------------------- /tools/dev-cli/services/populate.js: -------------------------------------------------------------------------------- 1 | const {join} = require('path'); 2 | const execute = require('../utils/execute'); 3 | 4 | function getCommand(tenant, host) { 5 | return `TENANT=${tenant} HOST=${host} node helpers/init` 6 | } 7 | 8 | function populate({email, password, tenant, host}) { 9 | const cmd = `EMAIL=${email} PASSWORD=${password} ${getCommand(tenant, host)}`; 10 | execute(cmd, 'populate auth', {stdio: 'inherit', cwd: join(process.cwd(), '/apps/auth')}); 11 | execute(cmd, 'populate content', {stdio: 'inherit', cwd: join(process.cwd(), '/apps/content')}); 12 | 13 | } 14 | 15 | module.exports = {populate, getCommand} 16 | -------------------------------------------------------------------------------- /documentation/docs/plugins/create.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Create a Plugin 3 | editLink: true 4 | --- 5 | 6 | # {{ $frontmatter.title }} 7 | 8 | 9 | ### Run: 10 | ```shell 11 | npm init play@latest my-new-plugin 12 | ``` 13 | 14 | ### Go to your new plugin: 15 | ```shell 16 | cd my-new-plugin 17 | npm install 18 | ``` 19 | 20 | The root folder is the backend application. 21 | `@qelos/plugin-play` used **fastify** out of the box. 22 | 23 | The frontend app is located under `/web-ui` folder, and it's a basic **Vite** project with some basic custom configurations in order to mimic production behavior on local dev environment. 24 | 25 | That's it. -------------------------------------------------------------------------------- /documentation/docs/public/cloud_done_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/sdk/src/types.ts: -------------------------------------------------------------------------------- 1 | export type FetchLike = (input: RequestInfo, init?: RequestInit) => Promise; 2 | 3 | export interface QelosSDKOptions { 4 | appUrl: string; 5 | fetch: FetchLike; 6 | accessToken?: string; 7 | refreshToken?: string; 8 | getAccessToken?: () => undefined | string; 9 | extraHeaders?: (relativeUrl: string, forceRefresh?: boolean) => Promise<{ [key: string]: string }>; 10 | forceRefresh?: boolean; 11 | onFailedRefreshToken?: () => Promise; 12 | extraQueryParams?: () => Record 13 | } 14 | 15 | export type RequestExtra = Partial }> -------------------------------------------------------------------------------- /apps/local-mcp/resources/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Resource Registry 3 | * 4 | * Import and export all resources here. 5 | * Add new resources to the array to automatically register them. 6 | */ 7 | 8 | import { registerCurrentUser } from './current-user'; 9 | import type { ResourceRegistration } from './types'; 10 | 11 | /** 12 | * All available resources 13 | * Add new resources to this array to register them automatically 14 | */ 15 | export const allResources: ResourceRegistration[] = [ 16 | registerCurrentUser, 17 | ]; 18 | 19 | // Re-export types for convenience 20 | export type { ResourceContext, ResourceRegistration } from './types'; 21 | -------------------------------------------------------------------------------- /documentation/docs/web-sdk/events.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Event Communication 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | The Web SDK provides a bidirectional event system for communication between your micro-frontend and the host Qelos application. 10 | 11 | ## Sending Events 12 | 13 | ```typescript 14 | import { dispatch } from '@qelos/web-sdk'; 15 | 16 | dispatch('myEvent', { data: 'value' }); 17 | ``` 18 | 19 | ## Receiving Events 20 | 21 | ```typescript 22 | import { on } from '@qelos/web-sdk'; 23 | 24 | on('hostEvent', (payload) => { 25 | console.log('Received event:', payload); 26 | }); 27 | ``` 28 | -------------------------------------------------------------------------------- /packages/global-types/index.ts: -------------------------------------------------------------------------------- 1 | export * from './blueprint' 2 | export * from './injectable' 3 | export * from './event-subscriber' 4 | export * from './plugin' 5 | export * from './micro-frontend' 6 | export * from './screen-requirement' 7 | export * from './navbar-group' 8 | export * from './plugin-crud' 9 | export * from './query-filters' 10 | export * from './workspace-configuration-metadata' 11 | export * from './auth-configuration-metadata' 12 | export * from './app-configuration-metadata' 13 | export * from './integration-sources' 14 | export * from './integration' 15 | export * from './integration-targets' 16 | export * from './no-code-components'; -------------------------------------------------------------------------------- /apps/admin/src/services/types/plugin.ts: -------------------------------------------------------------------------------- 1 | import { IMicroFrontend as IBaseMicroFrontend, IPlugin as IBasePlugin } from '@qelos/global-types'; 2 | 3 | export interface IMicroFrontend extends IBaseMicroFrontend { 4 | callbackUrl?: string; 5 | pluginId?: string; 6 | pluginApiPath?: string; 7 | crudData?: { 8 | name: string, 9 | identifierKey?: string, 10 | display: { 11 | name: string; 12 | plural: string; 13 | capitalized: string; 14 | capitalizedPlural: string; 15 | } 16 | } 17 | } 18 | 19 | export interface IPlugin extends IBasePlugin { 20 | _id: string; 21 | microFrontends: IMicroFrontend[], 22 | } 23 | -------------------------------------------------------------------------------- /documentation/docs/web-sdk/router.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Router Integration 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | The Web SDK provides router integration to navigate within the host application and respond to route changes. 10 | 11 | ## Changing Routes 12 | 13 | ```typescript 14 | import { changeRoute } from '@qelos/web-sdk'; 15 | 16 | changeRoute('routeName', { param: 'value' }); 17 | ``` 18 | 19 | ## Listening to Route Changes 20 | 21 | ```typescript 22 | import { onRouteChanged } from '@qelos/web-sdk'; 23 | 24 | onRouteChanged((route) => { 25 | console.log('Current route:', route); 26 | }); 27 | ``` 28 | -------------------------------------------------------------------------------- /apps/no-code/server/middlewares/blueprints.ts: -------------------------------------------------------------------------------- 1 | import { getBlueprint } from '../services/blueprints.service'; 2 | 3 | export async function getBlueprintByIdentifierMiddleware(req, res, next) { 4 | const blueprintIdentifier = req.params.blueprintIdentifier; 5 | try { 6 | const blueprint = await getBlueprint(req.headers.tenant, blueprintIdentifier); 7 | 8 | if (!blueprint) { 9 | res.status(404).json({ message: 'blueprint not found' }).end(); 10 | return; 11 | } 12 | 13 | req.blueprint = blueprint; 14 | next(); 15 | } catch { 16 | res.status(500).json({ message: 'something went wrong with blueprint' }).end(); 17 | } 18 | } -------------------------------------------------------------------------------- /apps/secrets/helpers/remove.js: -------------------------------------------------------------------------------- 1 | /** 2 | * this file used to initiate basic data inside the authentication service 3 | */ 4 | const { removeAll } = require('../server/dao/secrets') 5 | 6 | const TENANT = process.env.TENANT; 7 | 8 | if (!TENANT) { 9 | console.log('you must specify the tenant you want to be removed'); 10 | process.exit(0); 11 | } 12 | 13 | console.log("initiate remove tenant"); 14 | 15 | Promise.all([ 16 | removeAll(TENANT), 17 | ]) 18 | .then(() => { 19 | console.log("tenant deleted successfully"); 20 | process.exit(0); 21 | }) 22 | .catch((err) => { 23 | console.log(err); 24 | process.exit(1); 25 | }); 26 | 27 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/components/layout/ErrorBoundary.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | -------------------------------------------------------------------------------- /tools/cli/tests/e2e/create.test.js: -------------------------------------------------------------------------------- 1 | const { existsSync } = require("node:fs"); 2 | const { execSync } = require("node:child_process"); 3 | const { initTestSuite } = require('../utils/test-suite'); 4 | 5 | describe("Create command", () => { 6 | initTestSuite(); 7 | 8 | it("should create an app", () => { 9 | execSync("qelos create vue my-app", { cwd: "./tmp" }); 10 | expect(existsSync("tmp/my-app")).toBeTruthy(); 11 | }); 12 | 13 | it("should install app dependencies", () => { 14 | execSync("qelos create vue my-app", { cwd: "./tmp" }); 15 | expect( 16 | existsSync("./tmp/my-app/node_modules") 17 | ).toBeTruthy(); 18 | }); 19 | 20 | }); 21 | -------------------------------------------------------------------------------- /tools/dev-cli/tests/e2e/create.test.js: -------------------------------------------------------------------------------- 1 | const { existsSync } = require("fs"); 2 | const { execSync } = require("child_process"); 3 | const { initTestSuite } = require('../utils/test-suite'); 4 | 5 | describe("Create command", () => { 6 | initTestSuite(); 7 | 8 | it("should create an app", () => { 9 | execSync("qelos create my-app", { cwd: "./tmp" }); 10 | expect(existsSync("tmp/my-app")).toBeTruthy(); 11 | }); 12 | 13 | it("should install app dependencies", () => { 14 | execSync("qelos create my-app", { cwd: "./tmp" }); 15 | expect( 16 | existsSync("tmp/my-app/node_modules", { cwd: "./tmp" }) 17 | ).toBeTruthy(); 18 | }); 19 | 20 | }); 21 | -------------------------------------------------------------------------------- /apps/ai/README.md: -------------------------------------------------------------------------------- 1 | # Qelos AI system service 2 | 3 | An HTTP server to manage AI system. 4 | 5 | ## Dependencies 6 | - Node.js 7 | - npm OR yarn 8 | - MongoDB 9 | - [Secrets-service](https://github.com/qelos-io/qelos) 10 | - [Plugins-service](https://github.com/qelos-io/qelos) 11 | 12 | ## Usage 13 | ### As a Docker container 14 | ```sh 15 | $ docker run -p 9007:9007 qelos/ai 16 | ``` 17 | 18 | ## Development and Independent Usage 19 | In case you would like to run this project manually, for any reason, there are several commands you need to acknowledge: 20 | 21 | ### Install 22 | ```sh 23 | $ pnpm install 24 | ``` 25 | 26 | ### Launch 27 | ```sh 28 | $ pnpm start 29 | ``` 30 | -------------------------------------------------------------------------------- /apps/admin/src/modules/users/CreateUser.vue: -------------------------------------------------------------------------------- 1 | 8 | 22 | -------------------------------------------------------------------------------- /apps/admin/src/modules/configurations/types/colors-palette.ts: -------------------------------------------------------------------------------- 1 | export enum ColorName { 2 | mainColor = 'Main Color', 3 | mainColorLight = 'Main Color Light', 4 | textColor = 'Text Color', 5 | secondaryColor = 'Secondary Color', 6 | thirdColor = 'Third Color', 7 | negativeColor = 'Negative Color', 8 | bgColor = 'Background Color', 9 | inputsTextColor = 'Inputs Text Color', 10 | inputsBgColor = 'Inputs Background', 11 | bordersColor = 'Borders Color', 12 | linksColor = 'Links Color', 13 | navigationBgColor = 'Navigation Background Color', 14 | buttonTextColor = 'Button Text Color', 15 | buttonBgColor = 'Button Background Color', 16 | focusColor = 'Focus Outline Color' 17 | } -------------------------------------------------------------------------------- /apps/gateway/index.ts: -------------------------------------------------------------------------------- 1 | import { start, config, app as getApp } from "@qelos/api-kit"; 2 | import cacheManager from "./cache-manager"; 3 | import apiProxy from "./server/services/proxy-middleware"; 4 | 5 | config({ cors: false, bodyParser: false }); 6 | 7 | const app = getApp(); 8 | apiProxy(app, {}, cacheManager); 9 | 10 | const port = process.env.PORT || 3000; 11 | const address = process.env.IP || "0.0.0.0"; 12 | start("Gateway", port, address) 13 | .finally(() => { 14 | if (process.env.NODE_ENV !== 'production') { 15 | fetch(`http://${address}:${port}`) 16 | .then(res => res.status < 500 ? console.log('Gateway is running on dev') : process.exit(1)); 17 | } 18 | }); 19 | -------------------------------------------------------------------------------- /apps/admin/src/modules/pre-designed/compositions/dynamic-route-item.ts: -------------------------------------------------------------------------------- 1 | import { watch } from 'vue'; 2 | import { useRoute } from 'vue-router'; 3 | import { useNotifications } from '@/modules/core/compositions/notifications'; 4 | 5 | export function useDynamicRouteItem(api, item) { 6 | const route = useRoute() 7 | const { error } = useNotifications() 8 | 9 | watch([() => route.name, () => route.params.id], () => { 10 | if (!route.params.id) { 11 | item.value = {}; 12 | return; 13 | } 14 | api.value?.getOne?.(route.params.id as string) 15 | .then(data => item.value = data) 16 | .catch(() => error('Failed to load page data')) 17 | }, { immediate: true }); 18 | } -------------------------------------------------------------------------------- /apps/auth/coverage/lcov-report/prettify.css: -------------------------------------------------------------------------------- 1 | .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} 2 | -------------------------------------------------------------------------------- /packages/web-sdk/README.md: -------------------------------------------------------------------------------- 1 | # @qelos/web-sdk 2 | 3 | A package to manage communication between a Plugin MFE to a QELOS application host. 4 | ## Installation 5 | 6 | ```shell 7 | npm install @qelos/web-sdk 8 | ``` 9 | 10 | ## Usage 11 | 12 | ```typescript 13 | import { authorize, code } from "@qelos/web-sdk"; 14 | 15 | // authorize your micro-frontend application 16 | // to recognize the user and tenant of host application: 17 | const { user, tenant } = authorize(); 18 | 19 | 20 | // add the "code" parameter given from this web-sdk 21 | // it's a code created for this specific intercation with the user: 22 | fetch('/api/you-own-api', { 23 | headers: { code } 24 | }) 25 | ``` 26 | 27 | Enjoy! 28 | -------------------------------------------------------------------------------- /apps/ai/helpers/remove.ts: -------------------------------------------------------------------------------- 1 | import { mongoUri } from '../config'; 2 | import mongoose from 'mongoose'; 3 | 4 | require('../server/models').connect(mongoUri); 5 | 6 | const TENANT = process.env.TENANT; 7 | 8 | const Thread = mongoose.model('Thread'); 9 | 10 | if (!TENANT) { 11 | console.log('you must specify the tenant you want to be removed'); 12 | process.exit(0); 13 | } 14 | 15 | console.log('initiate remove tenant'); 16 | 17 | Promise.all([ 18 | Thread.deleteMany({ tenant: TENANT }), 19 | ]) 20 | .then(() => { 21 | console.log('tenant deleted successfully'); 22 | process.exit(0); 23 | }) 24 | .catch((err) => { 25 | console.log(err); 26 | process.exit(1); 27 | }); 28 | 29 | -------------------------------------------------------------------------------- /apps/auth/server/controllers/roles.ts: -------------------------------------------------------------------------------- 1 | import { Response } from 'express' 2 | import { AuthRequest } from '../../types' 3 | import User from '../models/user' 4 | import logger from '../services/logger'; 5 | 6 | async function getAllRoles(req: AuthRequest, res: Response) { 7 | const tenant = req.headers.tenant as string; 8 | if (!tenant) { 9 | return res.status(401).end(); 10 | } 11 | 12 | try { 13 | const roles = await User.distinct('roles', { tenant }).exec(); 14 | res.status(200).json(roles).end(); 15 | } catch (err) { 16 | logger.error('Failed to fetch roles', err); 17 | res.status(500).json({ message: 'Failed to fetch roles' }).end(); 18 | } 19 | } 20 | 21 | export default getAllRoles; -------------------------------------------------------------------------------- /tools/dev-cli/services/missing.js: -------------------------------------------------------------------------------- 1 | const { execSync } = require('child_process'); 2 | const { green, red, blue } = require('../utils/colors'); 3 | 4 | function checkDependencyVersion(app, installLink) { 5 | const errMsg = `${red(`${app} is not installed! To download:`)} ${blue(installLink)}`; 6 | try { 7 | const versionCommand = app + " --version"; 8 | const version = execSync(versionCommand).toString(); 9 | if (version.includes('not')) { 10 | console.log(errMsg); 11 | } else { 12 | console.log(`${green(`${app} is installed!`)} Installed version: ${version}`); 13 | } 14 | } catch (err) { 15 | console.log(errMsg); 16 | } 17 | } 18 | 19 | module.exports = { checkDependencyVersion }; 20 | -------------------------------------------------------------------------------- /tools/create-press/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-press", 3 | "version": "1.0.0", 4 | "description": "Create a new Qelos application", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/qelos-io/qelos.git" 11 | }, 12 | "author": "David Meir-Levy ", 13 | "license": "MIT", 14 | "bugs": { 15 | "url": "https://github.com/qelos-io/qelos/issues" 16 | }, 17 | "homepage": "https://github.com/qelos-io/qelos#readme", 18 | "publishConfig": { 19 | "access": "public" 20 | }, 21 | "bin": { 22 | "create-press": "index.mjs" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /apps/admin/src/i18n/i18n.test.ts: -------------------------------------------------------------------------------- 1 | import {readdirSync} from 'node:fs'; 2 | 3 | describe('i18n translations files', () => { 4 | const translationsKeys = Object.keys(require('./en.json')).sort(); 5 | const translations = readdirSync(__dirname).filter(file => file.includes('.json')); 6 | 7 | it('should have at least one translation file', () => { 8 | expect(translations.length).toBeGreaterThan(1); 9 | }); 10 | 11 | 12 | translations.forEach(file => { 13 | describe('translate file: ' + file, () => { 14 | it('should have same keys as "en.json" file', () => { 15 | expect(Object.keys(require('./' + file)).sort()).toEqual(translationsKeys); 16 | }); 17 | }); 18 | }); 19 | }) 20 | -------------------------------------------------------------------------------- /documentation/docs/plugin-play/configuration.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Configuration 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | Documentation coming soon. 8 | 9 | Learn how to configure your Plugin Play application with manifest options and configuration settings. 10 | 11 | ## Manifest Configuration 12 | 13 | ```typescript 14 | import { configure } from '@qelos/plugin-play'; 15 | 16 | configure({ 17 | name: 'My Plugin', 18 | version: '1.0.0', 19 | description: 'Plugin description', 20 | manifestUrl: '/manifest.json', 21 | proxyPath: '/api/proxy' 22 | }, { 23 | qelosUrl: process.env.QELOS_URL, 24 | qelosUsername: process.env.QELOS_USERNAME, 25 | qelosPassword: process.env.QELOS_PASSWORD 26 | }); 27 | ``` 28 | -------------------------------------------------------------------------------- /apps/content/migrator/migration-handler.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const Configuration = mongoose.model('Configuration') 3 | const { MIGRATION_KEY } = require('./consts') 4 | 5 | function getCurrentMigrationHandler () { 6 | return Configuration.findOne({ key: MIGRATION_KEY }).lean() 7 | } 8 | 9 | function clearCurrentMigrationHandler () { 10 | console.log('clear current migration handler'); 11 | return Configuration.updateOne({ key: MIGRATION_KEY }, { 12 | $set: { 13 | metadata: { 14 | isMigrationRunning: false, 15 | handler: null 16 | } 17 | } 18 | }) 19 | } 20 | 21 | module.exports = { 22 | getCurrentMigrationHandler, 23 | clearCurrentMigrationHandler 24 | } 25 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/components/forms/LabelsInput.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 27 | -------------------------------------------------------------------------------- /apps/admin/src/modules/integrations/components/BlueprintDropdown.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | -------------------------------------------------------------------------------- /apps/admin/src/pre-designed/editor/EditButtons.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /packages/api-kit/src/emit-internal-event.ts: -------------------------------------------------------------------------------- 1 | import { service } from './internal-service'; 2 | 3 | const callPluginsService = service('PLUGINS', { port: process.env.PLUGINS_SERVICE_PORT || 9006 }) 4 | 5 | export interface PlatformEvent { 6 | tenant: string; 7 | user?: string; 8 | source: string; 9 | kind: string; 10 | eventName: string; 11 | description: string; 12 | metadata: any; 13 | created?: Date; 14 | } 15 | 16 | export function emitPlatformEvent(platformEvent: PlatformEvent) { 17 | return callPluginsService({ 18 | method: 'POST', 19 | url: '/internal-api/events', 20 | data: platformEvent, 21 | headers: { 22 | tenant: platformEvent.tenant 23 | } 24 | }) 25 | .catch() 26 | } 27 | -------------------------------------------------------------------------------- /tools/cli/utils/colors.mjs: -------------------------------------------------------------------------------- 1 | const colorMap = new Map(); 2 | colorMap.set("cyan", 36); 3 | colorMap.set("yellow", 33); 4 | colorMap.set("green", 32); 5 | colorMap.set("red", 31); 6 | 7 | /** 8 | * logs the text to the console with the required color 9 | * @param {string} text 10 | * @param {string} color 11 | * @returns {string} 12 | */ 13 | function logColor(text, color) { 14 | if (colorMap.has(color)) { 15 | return `\x1b[${colorMap.get(color)}m${text}\x1b[0m`; 16 | } 17 | } 18 | 19 | export const green = (text) => logColor(text, "green"); 20 | export const blue = (text) => logColor(text, "cyan"); 21 | export const yellow = (text) => logColor(text, "yellow"); 22 | export const red = (text) => logColor(text, "red"); 23 | -------------------------------------------------------------------------------- /tools/cli/utils/process-handler.js: -------------------------------------------------------------------------------- 1 | function getProcessHandler(proc) { 2 | let onExit, onData, onError; 3 | 4 | proc.stderr.on('error', (err) => { 5 | console.log(err.toString()); 6 | onError && onError(err); 7 | }); 8 | 9 | proc.stdout.on('data', (data) => { 10 | onData && onData(data); 11 | }); 12 | 13 | proc.on('close', (code) => { 14 | console.log('process exited'); 15 | onExit && onExit(code); 16 | }); 17 | 18 | return { 19 | onExit: (func) => onExit = func, 20 | onData: (func) => onData = func, 21 | onError: (func) => onError = func, 22 | exit: () => proc.kill('SIGTERM'), 23 | process: proc 24 | }; 25 | } 26 | 27 | module.exports = { 28 | getProcessHandler 29 | } 30 | -------------------------------------------------------------------------------- /tools/dev-cli/utils/process-handler.js: -------------------------------------------------------------------------------- 1 | function getProcessHandler(proc) { 2 | let onExit, onData, onError; 3 | 4 | proc.stderr.on('error', (err) => { 5 | console.log(err.toString()); 6 | onError && onError(err); 7 | }); 8 | 9 | proc.stdout.on('data', (data) => { 10 | onData && onData(data); 11 | }); 12 | 13 | proc.on('close', (code) => { 14 | console.log('process exited'); 15 | onExit && onExit(code); 16 | }); 17 | 18 | return { 19 | onExit: (func) => onExit = func, 20 | onData: (func) => onData = func, 21 | onError: (func) => onError = func, 22 | exit: () => proc.kill('SIGTERM'), 23 | process: proc 24 | }; 25 | } 26 | 27 | module.exports = { 28 | getProcessHandler 29 | } 30 | -------------------------------------------------------------------------------- /apps/ai/server/models/index.ts: -------------------------------------------------------------------------------- 1 | import mongoose from 'mongoose' 2 | 3 | // Import models 4 | import './thread' 5 | 6 | export const connect = (uri: string) => { 7 | mongoose.connect(uri, {}) 8 | // plug in the promise library: 9 | mongoose.Promise = global.Promise 10 | 11 | mongoose.connection.on('error', (err) => { 12 | console.error(`Mongoose connection error: ${err}`) 13 | process.exit(1) 14 | }) 15 | 16 | async function disconnect() { 17 | await mongoose.connection.close() 18 | } 19 | 20 | // disconnect on exit 21 | process.on('exit', disconnect) 22 | // disconnect on kill from k8s pod 23 | process.on('SIGTERM', disconnect) 24 | // disconnect on ctrl+c 25 | process.on('SIGINT', disconnect) 26 | } 27 | -------------------------------------------------------------------------------- /documentation/docs/public/cloud_upload_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tools/dev-cli/utils/colors.js: -------------------------------------------------------------------------------- 1 | const colorMap = new Map(); 2 | colorMap.set("cyan", 36); 3 | colorMap.set("yellow", 33); 4 | colorMap.set("green", 32); 5 | colorMap.set("red", 31); 6 | 7 | /** 8 | * logs the text to the console with the required color 9 | * @param {string} text 10 | * @param {string} color 11 | * @returns {string} 12 | */ 13 | function logColor(text, color) { 14 | if (colorMap.has(color)) { 15 | return `\x1b[${colorMap.get(color)}m${text}\x1b[0m`; 16 | } 17 | } 18 | 19 | module.exports.green = (text) => logColor(text, "green"); 20 | module.exports.blue = (text) => logColor(text, "cyan"); 21 | module.exports.yellow = (text) => logColor(text, "yellow"); 22 | module.exports.red = (text) => logColor(text, "red"); 23 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/Home.vue: -------------------------------------------------------------------------------- 1 | 7 | 17 | -------------------------------------------------------------------------------- /apps/no-code/config/index.ts: -------------------------------------------------------------------------------- 1 | export const isDev = process.env.NODE_ENV !== 'production'; 2 | export const mongoUri = process.env.MONGO_URI || 'mongodb://localhost/no-code-service' 3 | export const redisUrl = process.env.REDIS_URL || (process.env.REDIS_HOST ? `${process.env.REDIS_HOST}:${process.env.REDIS_PORT}` : undefined); 4 | export const internalServicesSecret = process.env.INTERNAL_SECRET 5 | export const privilegedEditingRoles = process.env.PRIVILEGED_EDIT_ROLES ? process.env.PRIVILEGED_EDIT_ROLES.split(',') : ['plugin', 'admin']; 6 | export const privilegedViewingRoles = process.env.PRIVILEGED_VIEW_ROLES ? process.env.PRIVILEGED_VIEW_ROLES.split(',') : ['user', 'plugin', 'editor', 'admin']; 7 | 8 | export const showLogs = isDev || process.env.SHOW_LOGS -------------------------------------------------------------------------------- /apps/plugins/server/routes/data-manipulation.ts: -------------------------------------------------------------------------------- 1 | import { getRouter, getBodyParser, verifyInternalCall, populateUser, verifyUser } from '@qelos/api-kit'; 2 | import { getDataManipulation } from '../controllers/data-manipulation'; 3 | import { onlyEditPrivilegedOrPlugin } from '../middlewares/privileged-check'; 4 | 5 | export function dataManipulationRouter() { 6 | const router = getRouter(); 7 | 8 | const AUTHENTICATION_MIDDLEWARES = [populateUser, verifyUser, onlyEditPrivilegedOrPlugin]; 9 | 10 | router.post('/api/data-manipulation', AUTHENTICATION_MIDDLEWARES, getBodyParser(), getDataManipulation); 11 | router.post('/internal-api/data-manipulation', getBodyParser(), verifyInternalCall, getDataManipulation); 12 | return router; 13 | } 14 | -------------------------------------------------------------------------------- /apps/admin/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /apps/gateway/README.md: -------------------------------------------------------------------------------- 1 | # Qelos plugins system service 2 | 3 | An HTTP server to manage 3rd-party plugins for any system, combining frontend and backend plugins. 4 | 5 | ## Dependencies 6 | - Node.js 7 | - pnpm 8 | - MongoDB 9 | - [Authentication-service](https://github.com/qelos-io/qelos) 10 | - [Secrets-service](https://github.com/qelos-io/qelos) 11 | 12 | ## Usage 13 | ### As a Docker container 14 | ```sh 15 | $ docker run -p 3001:3001 qelos/gateway 16 | ``` 17 | 18 | ## Development and Independent Usage 19 | In case you would like to run this project manually, for any reason, there are several commands you need to acknowledge: 20 | 21 | ### Install 22 | ```sh 23 | $ pnpm install 24 | ``` 25 | 26 | ### Launch 27 | ```sh 28 | $ pnpm start 29 | ``` 30 | -------------------------------------------------------------------------------- /apps/admin/src/modules/core/compositions/edited-inputs.ts: -------------------------------------------------------------------------------- 1 | import { computed, Ref } from 'vue' 2 | 3 | export function useEditedInputs(editedObj, originalObj, propsMap = []) { 4 | return propsMap.reduce((comps, prop) => { 5 | comps[prop] = computed(() => editedObj[prop] === null ? originalObj[prop] : editedObj[prop]) 6 | return comps 7 | }, {} as Record) 8 | } 9 | 10 | export function useEditedInputModels(editedObj, originalObj, propsMap: string[] = []) { 11 | return propsMap.reduce((comps, prop) => { 12 | comps[prop] = computed({ 13 | get: () => editedObj[prop] === null ? originalObj[prop] : editedObj[prop], 14 | set: value => editedObj[prop] = value 15 | }) 16 | return comps 17 | }, {} as any) 18 | } 19 | -------------------------------------------------------------------------------- /apps/plugins/README.md: -------------------------------------------------------------------------------- 1 | # Qelos plugins system service 2 | 3 | An HTTP server to manage 3rd-party plugins for any system, combining frontend and backend plugins. 4 | 5 | ## Dependencies 6 | - Node.js 7 | - pnpm 8 | - MongoDB 9 | - [Authentication-service](https://github.com/qelos-io/qelos) 10 | - [Secrets-service](https://github.com/qelos-io/qelos) 11 | 12 | ## Usage 13 | ### As a Docker container 14 | ```sh 15 | $ docker run -p 3001:3001 qelos/plugins 16 | ``` 17 | 18 | ## Development and Independent Usage 19 | In case you would like to run this project manually, for any reason, there are several commands you need to acknowledge: 20 | 21 | ### Install 22 | ```sh 23 | $ pnpm install 24 | ``` 25 | 26 | ### Launch 27 | ```sh 28 | $ pnpm start 29 | ``` 30 | --------------------------------------------------------------------------------