@cdmbase/wiki-browser 12.0.18-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/lib/components/Logo.d.ts +4 -0
- package/lib/components/Logo.d.ts.map +1 -0
- package/lib/components/Logo.js +16 -0
- package/lib/components/Logo.js.map +1 -0
- package/lib/components/help/SidebarSearch.d.ts +8 -0
- package/lib/components/help/SidebarSearch.d.ts.map +1 -0
- package/lib/components/help/SidebarSearch.js +111 -0
- package/lib/components/help/SidebarSearch.js.map +1 -0
- package/lib/components/help/index.d.ts +2 -0
- package/lib/components/help/index.d.ts.map +1 -0
- package/lib/components/landing/FeatureCard.d.ts +13 -0
- package/lib/components/landing/FeatureCard.d.ts.map +1 -0
- package/lib/components/landing/FeatureCard.js +85 -0
- package/lib/components/landing/FeatureCard.js.map +1 -0
- package/lib/components/landing/QuickLinkCard.d.ts +8 -0
- package/lib/components/landing/QuickLinkCard.d.ts.map +1 -0
- package/lib/components/landing/QuickLinkCard.js +26 -0
- package/lib/components/landing/QuickLinkCard.js.map +1 -0
- package/lib/components/landing/SearchInput.d.ts +10 -0
- package/lib/components/landing/SearchInput.d.ts.map +1 -0
- package/lib/components/landing/SearchInput.js +223 -0
- package/lib/components/landing/SearchInput.js.map +1 -0
- package/lib/components/landing/index.d.ts +4 -0
- package/lib/components/landing/index.d.ts.map +1 -0
- package/lib/components/welcome.d.ts +3 -0
- package/lib/components/welcome.d.ts.map +1 -0
- package/lib/compute.d.ts +4 -0
- package/lib/compute.d.ts.map +1 -0
- package/lib/compute.js +96 -0
- package/lib/compute.js.map +1 -0
- package/lib/config/env-config.d.ts +4 -0
- package/lib/config/env-config.d.ts.map +1 -0
- package/lib/config/env-config.js +7 -0
- package/lib/config/env-config.js.map +1 -0
- package/lib/docs.config.d.ts +48 -0
- package/lib/docs.config.d.ts.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/loaders/search.d.ts +1 -0
- package/lib/loaders/search.d.ts.map +1 -0
- package/lib/module.d.ts +4 -0
- package/lib/module.d.ts.map +1 -0
- package/lib/module.js +11 -0
- package/lib/module.js.map +1 -0
- package/lib/pages/ArticlePage/ArticlePage.d.ts +4 -0
- package/lib/pages/ArticlePage/ArticlePage.d.ts.map +1 -0
- package/lib/pages/ArticlePage/ArticlePage.js +222 -0
- package/lib/pages/ArticlePage/ArticlePage.js.map +1 -0
- package/lib/pages/ArticlePage/index.d.ts +3 -0
- package/lib/pages/ArticlePage/index.d.ts.map +1 -0
- package/lib/pages/ArticlePage/index.js +3 -0
- package/lib/pages/ArticlePage/index.js.map +1 -0
- package/lib/pages/CategoryCollection/CategoryCollection.d.ts +4 -0
- package/lib/pages/CategoryCollection/CategoryCollection.d.ts.map +1 -0
- package/lib/pages/CategoryCollection/CategoryCollection.js +103 -0
- package/lib/pages/CategoryCollection/CategoryCollection.js.map +1 -0
- package/lib/pages/CategoryCollection/index.d.ts +3 -0
- package/lib/pages/CategoryCollection/index.d.ts.map +1 -0
- package/lib/pages/CategoryCollection/index.js +3 -0
- package/lib/pages/CategoryCollection/index.js.map +1 -0
- package/lib/pages/Help/HelpIndex.d.ts +4 -0
- package/lib/pages/Help/HelpIndex.d.ts.map +1 -0
- package/lib/pages/Help/HelpIndex.js +44 -0
- package/lib/pages/Help/HelpIndex.js.map +1 -0
- package/lib/pages/Help/index.d.ts +4 -0
- package/lib/pages/Help/index.d.ts.map +1 -0
- package/lib/pages/Help/index.js +226 -0
- package/lib/pages/Help/index.js.map +1 -0
- package/lib/pages/Landing/index.d.ts +3 -0
- package/lib/pages/Landing/index.d.ts.map +1 -0
- package/lib/pages/Landing/index.js +281 -0
- package/lib/pages/Landing/index.js.map +1 -0
- package/lib/routes.json +2533 -0
- package/lib/seo.d.ts +22 -0
- package/lib/seo.d.ts.map +1 -0
- package/lib/slot-fill/FooterFill.d.ts +3 -0
- package/lib/slot-fill/FooterFill.d.ts.map +1 -0
- package/lib/slot-fill/FooterFill.js +18 -0
- package/lib/slot-fill/FooterFill.js.map +1 -0
- package/lib/slot-fill/LogoFill.d.ts +5 -0
- package/lib/slot-fill/LogoFill.d.ts.map +1 -0
- package/lib/slot-fill/LogoFill.js +74 -0
- package/lib/slot-fill/LogoFill.js.map +1 -0
- package/lib/slot-fill/consts.d.ts +5 -0
- package/lib/slot-fill/consts.d.ts.map +1 -0
- package/lib/slot-fill/consts.js +1 -0
- package/lib/slot-fill/consts.js.map +1 -0
- package/lib/slot-fill/index.d.ts +4 -0
- package/lib/slot-fill/index.d.ts.map +1 -0
- package/lib/templates/assets/images/add-link-frontend.png +0 -0
- package/lib/templates/assets/images/add-package-backend.png +0 -0
- package/lib/templates/assets/images/add-to-backend-module.png +0 -0
- package/lib/templates/assets/images/add-upload-client-frontend.png +0 -0
- package/lib/templates/assets/images/additional-parameters.png +0 -0
- package/lib/templates/assets/images/aeh-implementation.png +0 -0
- package/lib/templates/assets/images/aeh-usage.png +0 -0
- package/lib/templates/assets/images/apollo-client/recommendation_cache_mgmt.png +0 -0
- package/lib/templates/assets/images/app-deploy-new-version/jenkins1.PNG +0 -0
- package/lib/templates/assets/images/app-deploy-new-version/jenkins2.PNG +0 -0
- package/lib/templates/assets/images/auth-wrapper-code.png +0 -0
- package/lib/templates/assets/images/cdebase.png +0 -0
- package/lib/templates/assets/images/cdm-locales-directory.png +0 -0
- package/lib/templates/assets/images/client-settings.png +0 -0
- package/lib/templates/assets/images/codegen_file_update.png +0 -0
- package/lib/templates/assets/images/configuration.png +0 -0
- package/lib/templates/assets/images/copy-plugin.png +0 -0
- package/lib/templates/assets/images/docusaurus.png +0 -0
- package/lib/templates/assets/images/error-link.png +0 -0
- package/lib/templates/assets/images/error-sample.png +0 -0
- package/lib/templates/assets/images/extension copy.png +0 -0
- package/lib/templates/assets/images/extension.png +0 -0
- package/lib/templates/assets/images/graphql/graphql-folder-backend.png +0 -0
- package/lib/templates/assets/images/graphql/graphql-folder-with-gql.png +0 -0
- package/lib/templates/assets/images/i18n-config.png +0 -0
- package/lib/templates/assets/images/image.png +0 -0
- package/lib/templates/assets/images/logo.svg +10 -0
- package/lib/templates/assets/images/logo1.svg +1 -0
- package/lib/templates/assets/images/modify-upload-false-server.png +0 -0
- package/lib/templates/assets/images/navigation-auth-enabled.png +0 -0
- package/lib/templates/assets/images/org-dashboard-navigation.png +0 -0
- package/lib/templates/assets/images/org-navigation.png +0 -0
- package/lib/templates/assets/images/preferences_graphql_type.png +0 -0
- package/lib/templates/assets/images/provider.png +0 -0
- package/lib/templates/assets/images/route-config.png +0 -0
- package/lib/templates/assets/images/service-accounts.png +0 -0
- package/lib/templates/assets/images/source-code/source-code-environments.png +0 -0
- package/lib/templates/assets/images/source-code/source-code-organization.png +0 -0
- package/lib/templates/assets/images/spin-clone-develop-deployment/jenkins-changes.png +0 -0
- package/lib/templates/assets/images/spin-clone-develop-deployment/lerna-changes.png +0 -0
- package/lib/templates/assets/images/spin-clone-develop-deployment/root-package-json-changes.png +0 -0
- package/lib/templates/assets/images/spin-clone-develop-deployment/values-dev-changes.png +0 -0
- package/lib/templates/assets/images/sso-mappers.png +0 -0
- package/lib/templates/assets/images/sso-picture-mapper.png +0 -0
- package/lib/templates/assets/images/sso-settings.png +0 -0
- package/lib/templates/assets/images/timesheet_apollo_cache.png +0 -0
- package/lib/templates/assets/images/timesheet_query.png +0 -0
- package/lib/templates/assets/images/tutorial/docsVersionDropdown.png +0 -0
- package/lib/templates/assets/images/tutorial/localeDropdown.png +0 -0
- package/lib/templates/assets/images/unauthenticated.png +0 -0
- package/lib/templates/assets/images/undraw_docusaurus_mountain.svg +170 -0
- package/lib/templates/assets/images/undraw_docusaurus_react.svg +169 -0
- package/lib/templates/assets/images/undraw_docusaurus_tree.svg +1 -0
- package/lib/templates/assets/images/vite-plugin-config.png +0 -0
- package/lib/templates/content/docs/Generators/Project/generate-fullproject.md +12 -0
- package/lib/templates/content/docs/LLM/Logger.llm.md +194 -0
- package/lib/templates/content/docs/LLM/backend-proxies-services-llm.md +2687 -0
- package/lib/templates/content/docs/LLM/backend-service-llm.md +3384 -0
- package/lib/templates/content/docs/LLM/db_migration_llm.md +954 -0
- package/lib/templates/content/docs/LLM/frontend/REMIX-15.3-upgrade-llm.md +1245 -0
- package/lib/templates/content/docs/LLM/inngest/INNGEST_FUNCTION_DEVELOPMENT_GUIDE_LLM.md +1241 -0
- package/lib/templates/content/docs/LLM/inngest/INNGEST_NAMESPACE_LLM.md +384 -0
- package/lib/templates/content/docs/LLM/llm_workflow_namespace.md +384 -0
- package/lib/templates/content/docs/LLM/organization-components-form-llm.md +1395 -0
- package/lib/templates/content/docs/LLM/page-component-llm.md +173 -0
- package/lib/templates/content/docs/LLM/preferences-settings-llm.md +2781 -0
- package/lib/templates/content/docs/LLM/tailwind-css-llm.md +502 -0
- package/lib/templates/content/docs/UI/SchemaBasedUI.md +334 -0
- package/lib/templates/content/docs/UI/SlotFillComponent.md +334 -0
- package/lib/templates/content/docs/adminide-modules/account/auth0-login.md +31 -0
- package/lib/templates/content/docs/adminide-modules/account/index.md +14 -0
- package/lib/templates/content/docs/adminide-modules/account/keycloak-remix-setup.md +86 -0
- package/lib/templates/content/docs/adminide-modules/account/remix-auth-setup.md +79 -0
- package/lib/templates/content/docs/adminide-modules/account/various-auth-qatest.md +157 -0
- package/lib/templates/content/docs/adminide-modules/api-builders/graphql.md +906 -0
- package/lib/templates/content/docs/adminide-modules/billing/payments/index.md +14 -0
- package/lib/templates/content/docs/adminide-modules/billing/payments/stripe/index.md +14 -0
- package/lib/templates/content/docs/adminide-modules/billing/payments/stripe/settingup-stripe-locally.md +25 -0
- package/lib/templates/content/docs/adminide-modules/billing/tier-config.md +293 -0
- package/lib/templates/content/docs/adminide-modules/connectors/Connector.md +207 -0
- package/lib/templates/content/docs/adminide-modules/file-upload/index.md +16 -0
- package/lib/templates/content/docs/adminide-modules/file-upload/setup.md +435 -0
- package/lib/templates/content/docs/adminide-modules/file-upload/upload-file-using-signed-url.md +161 -0
- package/lib/templates/content/docs/adminide-modules/preferences/AddAdditionalPermissions.md +151 -0
- package/lib/templates/content/docs/adminide-modules/preferences/Configuration.md +241 -0
- package/lib/templates/content/docs/adminide-modules/preferences/Policy-Configuration.md +61 -0
- package/lib/templates/content/docs/adminide-modules/preferences/UI-components/ResourceSettingsLoader.md +319 -0
- package/lib/templates/content/docs/adminide-modules/preferences/contribute_scope_target.md +280 -0
- package/lib/templates/content/docs/adminide-modules/preferences/generate-urii.md +94 -0
- package/lib/templates/content/docs/adminide-modules/preferences/index.md +28 -0
- package/lib/templates/content/docs/adminide-modules/preferences/machine-configuration.md +157 -0
- package/lib/templates/content/docs/adminide-modules/preferences/pageSettings/generateCdecodeUri.md +1289 -0
- package/lib/templates/content/docs/adminide-modules/preferences/pageSettings/migratingFromUseSettings.md +215 -0
- package/lib/templates/content/docs/adminide-modules/preferences/permissions/Roles-Permissions.md +72 -0
- package/lib/templates/content/docs/adminide-modules/preferences/permissions/settingUserPermissions.md +139 -0
- package/lib/templates/content/docs/adminide-modules/preferences/preference-dependency.md +138 -0
- package/lib/templates/content/docs/adminide-modules/preferences/route-based-configuration.md +41 -0
- package/lib/templates/content/docs/adminide-modules/preferences/schema-configuration.md +71 -0
- package/lib/templates/content/docs/adminide-modules/preferences/supported.md +24 -0
- package/lib/templates/content/docs/adminide-modules/preferences/useSettingsLoader.md +248 -0
- package/lib/templates/content/docs/adminide-modules/project-tools/auth-providers.md +1317 -0
- package/lib/templates/content/docs/adminide-modules/project-tools/keycloak-guide.md +543 -0
- package/lib/templates/content/docs/adminide-modules/project-tools/tenant-management/tenant-based-authentication.md +846 -0
- package/lib/templates/content/docs/adminide-modules/project-tools/tenant-management/tenant-management.md +708 -0
- package/lib/templates/content/docs/adminide-modules/project-tools/tenant-management/tenants.md +1117 -0
- package/lib/templates/content/docs/chrome-extension/index.md +14 -0
- package/lib/templates/content/docs/chrome-extension/setup.md +30 -0
- package/lib/templates/content/docs/contributing/adding-package.md +23 -0
- package/lib/templates/content/docs/contributing/adding_new_modules.md +99 -0
- package/lib/templates/content/docs/contributing/architecture-updates.md +19 -0
- package/lib/templates/content/docs/contributing/avoid-using-promises-ui.md +116 -0
- package/lib/templates/content/docs/contributing/coding-guidelines.md +111 -0
- package/lib/templates/content/docs/contributing/do-and-dont.md +42 -0
- package/lib/templates/content/docs/contributing/faq.md +22 -0
- package/lib/templates/content/docs/contributing/folder-setup/browser.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/config.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/containers-server.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/core.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/graphql.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/index.md +30 -0
- package/lib/templates/content/docs/contributing/folder-setup/module.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/server.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/services.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/store.md +12 -0
- package/lib/templates/content/docs/contributing/frontend-coding.md +30 -0
- package/lib/templates/content/docs/contributing/git-subtree-sharing.md +73 -0
- package/lib/templates/content/docs/contributing/graphql-subscriptions.md +69 -0
- package/lib/templates/content/docs/contributing/how-to-contribute.md +30 -0
- package/lib/templates/content/docs/contributing/how_to_check_pure_esm.md +29 -0
- package/lib/templates/content/docs/contributing/index.md +60 -0
- package/lib/templates/content/docs/contributing/installation-issues.md +23 -0
- package/lib/templates/content/docs/contributing/keyboard-shortcut.md +131 -0
- package/lib/templates/content/docs/contributing/language/locale-support.md +12 -0
- package/lib/templates/content/docs/contributing/lerna-build-tools.md +516 -0
- package/lib/templates/content/docs/contributing/lerna-yarn-workspaces.md +95 -0
- package/lib/templates/content/docs/contributing/lint-and-formatter.md +20 -0
- package/lib/templates/content/docs/contributing/mobile-setup.md +16 -0
- package/lib/templates/content/docs/contributing/project-setup.md +233 -0
- package/lib/templates/content/docs/contributing/react/index.md +14 -0
- package/lib/templates/content/docs/contributing/react/lazy-component.md +70 -0
- package/lib/templates/content/docs/contributing/run-various-options.md +124 -0
- package/lib/templates/content/docs/contributing/schema-first-graphql-types.md +37 -0
- package/lib/templates/content/docs/contributing/source-code-organization.md +57 -0
- package/lib/templates/content/docs/contributing/staging-docker.md +88 -0
- package/lib/templates/content/docs/contributing/third-party/apollo-client-v3-tutorials.md +28 -0
- package/lib/templates/content/docs/contributing/third-party/index.md +18 -0
- package/lib/templates/content/docs/contributing/typescript-contribution.md +16 -0
- package/lib/templates/content/docs/devops/app-deploy-new-version.md +30 -0
- package/lib/templates/content/docs/devops/index.md +14 -0
- package/lib/templates/content/docs/devops/mobile-jenkins-build.md +40 -0
- package/lib/templates/content/docs/devops/versioning-the-project.md +128 -0
- package/lib/templates/content/docs/error-handler/application-error-handler.md +40 -0
- package/lib/templates/content/docs/error-handler/error-handling.md +26 -0
- package/lib/templates/content/docs/error-handler/index.md +16 -0
- package/lib/templates/content/docs/error-handler/logging-errors.md +14 -0
- package/lib/templates/content/docs/feature-api/copy-operation.md +427 -0
- package/lib/templates/content/docs/feature-api/feature-browser/assets.md +46 -0
- package/lib/templates/content/docs/feature-api/feature-browser/auth-permissions.md +12 -0
- package/lib/templates/content/docs/feature-api/feature-browser/feature.md +131 -0
- package/lib/templates/content/docs/feature-api/feature-browser/index.md +22 -0
- package/lib/templates/content/docs/feature-api/feature-browser/routes-menu.md +110 -0
- package/lib/templates/content/docs/feature-api/feature-browser/routing-convention.md +124 -0
- package/lib/templates/content/docs/feature-api/feature-browser/routing.md +338 -0
- package/lib/templates/content/docs/feature-api/feature-mobile/auth-permissions.md +20 -0
- package/lib/templates/content/docs/feature-api/feature-mobile/feature.md +130 -0
- package/lib/templates/content/docs/feature-api/feature-mobile/index.md +18 -0
- package/lib/templates/content/docs/feature-api/feature-mobile/navigation.md +187 -0
- package/lib/templates/content/docs/feature-api/feature-server/Scheduling.md +44 -0
- package/lib/templates/content/docs/feature-api/feature-server/dataloader.md +320 -0
- package/lib/templates/content/docs/feature-api/feature-server/dependency-injection.md +81 -0
- package/lib/templates/content/docs/feature-api/feature-server/feature.md +65 -0
- package/lib/templates/content/docs/feature-api/feature-server/generic-dataloader.md +135 -0
- package/lib/templates/content/docs/feature-api/feature-server/index.md +40 -0
- package/lib/templates/content/docs/feature-api/feature-server/migration.md +127 -0
- package/lib/templates/content/docs/feature-api/feature-server/mongo-model.md +72 -0
- package/lib/templates/content/docs/feature-api/feature-server/permissions.md +12 -0
- package/lib/templates/content/docs/feature-api/feature-server/policies.md +57 -0
- package/lib/templates/content/docs/feature-api/feature-server/preferences.md +57 -0
- package/lib/templates/content/docs/feature-api/feature-server/repositories.md +114 -0
- package/lib/templates/content/docs/feature-api/feature-server/resolvers.md +126 -0
- package/lib/templates/content/docs/feature-api/feature-server/rules.md +132 -0
- package/lib/templates/content/docs/feature-api/feature-server/schema.md +12 -0
- package/lib/templates/content/docs/feature-api/feature-server/services.md +102 -0
- package/lib/templates/content/docs/feature-api/feature-server/setup-resource-crud.md +359 -0
- package/lib/templates/content/docs/feature-api/index.md +18 -0
- package/lib/templates/content/docs/graphql/apolloClient-mutation.md +94 -0
- package/lib/templates/content/docs/graphql/index.md +14 -0
- package/lib/templates/content/docs/graphql/scalars.md +15 -0
- package/lib/templates/content/docs/help/index.md +14 -0
- package/lib/templates/content/docs/help/intro.md +16 -0
- package/lib/templates/content/docs/intl/ant-design-menu-translation.md +74 -0
- package/lib/templates/content/docs/intl/intl-namespace.md +129 -0
- package/lib/templates/content/docs/intl/vite-plugin-intl.md +87 -0
- package/lib/templates/content/docs/intl/webpack-plugin-intl.md +12 -0
- package/lib/templates/content/docs/intro.md +18 -0
- package/lib/templates/content/docs/knowledge/basic-fullstack.md +238 -0
- package/lib/templates/content/docs/mailing/index.md +14 -0
- package/lib/templates/content/docs/mailing/mailing-template.md +148 -0
- package/lib/templates/content/docs/mobile/App-navigation-generator.md +410 -0
- package/lib/templates/content/docs/mobile/MobileTestCases.md +264 -0
- package/lib/templates/content/docs/mobile/eas-profile-build.md +107 -0
- package/lib/templates/content/docs/mobile/expo-push-notification-setup.md +216 -0
- package/lib/templates/content/docs/mobile/index.md +14 -0
- package/lib/templates/content/docs/mobile/routes.md +83 -0
- package/lib/templates/content/docs/organization/adding-account-context.md +116 -0
- package/lib/templates/content/docs/organization/adding-org-mobile-navigation.md +22 -0
- package/lib/templates/content/docs/organization/adding-org-web-navigation.md +12 -0
- package/lib/templates/content/docs/organization/index.md +20 -0
- package/lib/templates/content/docs/organization/initialization.md +20 -0
- package/lib/templates/content/docs/organization/organization-resource-vs-resource.md +112 -0
- package/lib/templates/content/docs/remix/configuration/component-structure-best-practices.md +152 -0
- package/lib/templates/content/docs/remix/configuration/configurations.md +218 -0
- package/lib/templates/content/docs/remix/configuration/css-import-and-stylesheets.md +142 -0
- package/lib/templates/content/docs/remix/configuration/dont-subcomponent-network.md +166 -0
- package/lib/templates/content/docs/remix/configuration/generated-data-loaders.md +122 -0
- package/lib/templates/content/docs/remix/configuration/generated-resource-loaders.md +257 -0
- package/lib/templates/content/docs/remix/configuration/query-params-generator.md +216 -0
- package/lib/templates/content/docs/remix/configuration/routes-extra-icons.md +103 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-advanced.md +86 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-auth.md +113 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-best-practices.md +55 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-fields.md +79 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-graphql.md +79 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-index.md +112 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-loaders.md +165 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-middleware.md +196 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-overview.md +53 -0
- package/lib/templates/content/docs/remix/data-loaders.md +43 -0
- package/lib/templates/content/docs/remix/devtools/remix-devtools.md +58 -0
- package/lib/templates/content/docs/remix/examples/changes-using-servercode.md +79 -0
- package/lib/templates/content/docs/remix/extra-icons.md +62 -0
- package/lib/templates/content/docs/remix/extra-links.md +65 -0
- package/lib/templates/content/docs/remix/generated-data-loaders.md +114 -0
- package/lib/templates/content/docs/remix/queryParamsGenerator.md +89 -0
- package/lib/templates/content/docs/remix/resources.md +16 -0
- package/lib/templates/content/docs/remix/styles.md +132 -0
- package/lib/templates/content/docs/remix/wiki.md +12 -0
- package/lib/templates/content/docs/security/auth-wrapper/auth-wrapper.md +24 -0
- package/lib/templates/content/docs/security/index.md +18 -0
- package/lib/templates/content/docs/security/secure-button-mobilenative.md +88 -0
- package/lib/templates/content/docs/security/secure-button-web.md +89 -0
- package/lib/templates/content/docs/server-side/account-customization.md +82 -0
- package/lib/templates/content/docs/server-side/apollo/caching.md +164 -0
- package/lib/templates/content/docs/server-side/backend-architecture/FINAL-DECISION.md +209 -0
- package/lib/templates/content/docs/server-side/backend-architecture/TRUE-FINAL-ARCHITECTURE.md +603 -0
- package/lib/templates/content/docs/server-side/backend-architecture/index1.md +0 -0
- package/lib/templates/content/docs/server-side/backend-coding.md +839 -0
- package/lib/templates/content/docs/server-side/e2b/manageing-template.md +197 -0
- package/lib/templates/content/docs/server-side/index.md +14 -0
- package/lib/templates/content/docs/server-side/inngest-functions-module.md +309 -0
- package/lib/templates/content/docs/server-side/listen-stripe-events.md +43 -0
- package/lib/templates/content/docs/server-side/slug-service.md +323 -0
- package/lib/templates/content/docs/tests/index.md +18 -0
- package/lib/templates/content/docs/tests/jest-test-debug-vscode.md +40 -0
- package/lib/templates/content/docs/tests/known-errors.md +116 -0
- package/lib/templates/content/docs/tests/service-test-template.md +118 -0
- package/lib/templates/content/docs/tests/test-setup.md +93 -0
- package/lib/templates/content/docs/xstate.md +23 -0
- package/lib/types.d.ts +37 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/utils/docsNavigation.d.ts +9 -0
- package/lib/utils/docsNavigation.d.ts.map +1 -0
- package/lib/utils/docsNavigation.js +37 -0
- package/lib/utils/docsNavigation.js.map +1 -0
- package/lib/utils/helpCenterUtils.d.ts +26 -0
- package/lib/utils/helpCenterUtils.d.ts.map +1 -0
- package/lib/utils/index.d.ts +3 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +3 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/markdownLoader.d.ts +36 -0
- package/lib/utils/markdownLoader.d.ts.map +1 -0
- package/lib/utils/markdownLoader.js +2242 -0
- package/lib/utils/markdownLoader.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,906 @@
|
|
|
1
|
+
# GraphQL Builder - Comprehensive Documentation
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
GraphQL Builder is a powerful, directive-based GraphQL API generation tool that automatically generates Prisma schemas, resolvers, queries, mutations, and DataLoaders from a GraphQL Schema Definition Language (SDL). It provides a visual code editor interface for managing GraphQL projects and enables rapid API development with minimal boilerplate code.
|
|
6
|
+
|
|
7
|
+
## Key Features
|
|
8
|
+
|
|
9
|
+
### 1. **Directive-Based Code Generation**
|
|
10
|
+
|
|
11
|
+
- Automatically converts GraphQL SDL to Prisma schema
|
|
12
|
+
- Generates TypeScript resolvers for queries and mutations
|
|
13
|
+
- Creates DataLoaders for efficient data fetching
|
|
14
|
+
- Supports custom directives for extending functionality
|
|
15
|
+
|
|
16
|
+
### 2. **Visual Code Editor**
|
|
17
|
+
|
|
18
|
+
- Monaco Editor-based IDE for editing GraphQL schemas
|
|
19
|
+
- File tree management for organizing schema, resolvers, and directives
|
|
20
|
+
- Tab-based editing interface
|
|
21
|
+
- Real-time syntax highlighting and validation
|
|
22
|
+
- Auto-save functionality
|
|
23
|
+
|
|
24
|
+
### 3. **Auto-Generated Queries & Mutations**
|
|
25
|
+
|
|
26
|
+
- Automatically generates CRUD operations for all entity types
|
|
27
|
+
- Supports filtering, pagination, and sorting
|
|
28
|
+
- Generates both single-item and list queries
|
|
29
|
+
- Creates create, update, and delete mutations
|
|
30
|
+
|
|
31
|
+
### 4. **Custom Directives Support**
|
|
32
|
+
|
|
33
|
+
- Create and manage custom directives via file-based system
|
|
34
|
+
- Directives are stored as TypeScript files in `/directives` folder
|
|
35
|
+
- Automatic directive extraction and compilation
|
|
36
|
+
- Support for directive composition and reuse
|
|
37
|
+
|
|
38
|
+
### 5. **DataLoader Generation**
|
|
39
|
+
|
|
40
|
+
- Automatically generates DataLoaders for relationships
|
|
41
|
+
- Prevents N+1 query problems
|
|
42
|
+
- Supports both single and batch loading
|
|
43
|
+
- Generated DataLoaders are type-safe and optimized
|
|
44
|
+
|
|
45
|
+
### 6. **Project Management**
|
|
46
|
+
|
|
47
|
+
- Multi-project support with tenant isolation
|
|
48
|
+
- Project deployment to Express.js servers
|
|
49
|
+
- Environment-specific configurations
|
|
50
|
+
- Connection status monitoring
|
|
51
|
+
|
|
52
|
+
## Resolvers
|
|
53
|
+
|
|
54
|
+
### Overview
|
|
55
|
+
|
|
56
|
+
Resolvers are functions that resolve the value for a field in your GraphQL schema. GraphQL Builder automatically generates resolvers for all entity types, handling queries, mutations, and field relationships.
|
|
57
|
+
|
|
58
|
+
### Types of Resolvers
|
|
59
|
+
|
|
60
|
+
#### 1. Query Resolvers
|
|
61
|
+
|
|
62
|
+
Query resolvers handle read operations. For each entity type, two query resolvers are automatically generated:
|
|
63
|
+
|
|
64
|
+
**Single Item Query (`get{TypeName}`)**
|
|
65
|
+
|
|
66
|
+
- Fetches a single entity by ID
|
|
67
|
+
- Uses Prisma's `findUnique` method
|
|
68
|
+
- Returns `null` if not found
|
|
69
|
+
|
|
70
|
+
**List Query (`getAll{TypeName}s`)**
|
|
71
|
+
|
|
72
|
+
- Fetches multiple entities with filtering and pagination
|
|
73
|
+
- Uses Prisma's `findMany` method
|
|
74
|
+
- Supports `filter`, `limit`, and `offset` arguments
|
|
75
|
+
|
|
76
|
+
**Generated Code Example:**
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
const queryResolvers = {
|
|
80
|
+
Query: {
|
|
81
|
+
getUser: async (_parent, { id }, _context) => {
|
|
82
|
+
const { prisma } = _context;
|
|
83
|
+
return prisma.user.findUnique({
|
|
84
|
+
where: { id },
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
getAllUsers: async (_, args, _context) => {
|
|
88
|
+
const { prisma } = _context;
|
|
89
|
+
const { filter, limit, offset } = args;
|
|
90
|
+
return prisma.user.findMany({
|
|
91
|
+
where: filter || {},
|
|
92
|
+
take: limit || 10,
|
|
93
|
+
skip: offset || 0,
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### 2. Mutation Resolvers
|
|
101
|
+
|
|
102
|
+
Mutation resolvers handle write operations. For each entity type, three mutation resolvers are automatically generated:
|
|
103
|
+
|
|
104
|
+
**Create Mutation (`create{TypeName}`)**
|
|
105
|
+
|
|
106
|
+
- Creates a new entity
|
|
107
|
+
- Uses Prisma's `create` method
|
|
108
|
+
- Accepts `data` argument with entity fields
|
|
109
|
+
|
|
110
|
+
**Update Mutation (`update{TypeName}`)**
|
|
111
|
+
|
|
112
|
+
- Updates an existing entity by ID
|
|
113
|
+
- Uses Prisma's `update` method
|
|
114
|
+
- Accepts `id` and `data` arguments
|
|
115
|
+
|
|
116
|
+
**Delete Mutation (`delete{TypeName}`)**
|
|
117
|
+
|
|
118
|
+
- Deletes an entity by ID
|
|
119
|
+
- Uses Prisma's `delete` method
|
|
120
|
+
- Accepts `id` argument
|
|
121
|
+
|
|
122
|
+
**Generated Code Example:**
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
const mutationResolvers = {
|
|
126
|
+
Mutation: {
|
|
127
|
+
createUser: async (_parent, args, _context) => {
|
|
128
|
+
const { prisma } = _context;
|
|
129
|
+
return prisma.user.create({
|
|
130
|
+
data: args.data,
|
|
131
|
+
});
|
|
132
|
+
},
|
|
133
|
+
updateUser: async (_parent, { id, data }, _context) => {
|
|
134
|
+
const { prisma } = _context;
|
|
135
|
+
return prisma.user.update({
|
|
136
|
+
where: { id },
|
|
137
|
+
data,
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
deleteUser: async (_parent, { id }, _context) => {
|
|
141
|
+
const { prisma } = _context;
|
|
142
|
+
return prisma.user.delete({
|
|
143
|
+
where: { id },
|
|
144
|
+
});
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
#### 3. Field Resolvers (Type Resolvers)
|
|
151
|
+
|
|
152
|
+
Field resolvers resolve fields on entity types. They are generated for:
|
|
153
|
+
|
|
154
|
+
- **Non-column fields**: Fields without `@column` directive that need custom resolution
|
|
155
|
+
- **DataLoader fields**: Fields with `@useLoader` directive for efficient relationship loading
|
|
156
|
+
- **Computed fields**: Fields that require custom logic
|
|
157
|
+
|
|
158
|
+
**DataLoader Field Resolver Example:**
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
const typeResolvers = {
|
|
162
|
+
Post: {
|
|
163
|
+
author: (parent, args, context) => {
|
|
164
|
+
const { userAuthorDataLoader } = context;
|
|
165
|
+
return userAuthorDataLoader.load(parent.authorId);
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
User: {
|
|
169
|
+
posts: (parent, args, context) => {
|
|
170
|
+
const { userPostsDataLoader } = context;
|
|
171
|
+
const postIds = (parent.postIds || []).filter(Boolean);
|
|
172
|
+
return userPostsDataLoader.loadMany(postIds);
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**TODO Field Resolver Example:**
|
|
179
|
+
For fields that need custom implementation but don't have `@useLoader`:
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
const typeResolvers = {
|
|
183
|
+
User: {
|
|
184
|
+
fullName: (parent, args, context) => {
|
|
185
|
+
// TODO: Implement resolver for fullName
|
|
186
|
+
return null;
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Resolver Structure
|
|
193
|
+
|
|
194
|
+
All resolvers follow this structure:
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
export const resolvers = [
|
|
198
|
+
queryResolvers, // Query resolvers
|
|
199
|
+
mutationResolvers, // Mutation resolvers
|
|
200
|
+
typeResolvers, // Field/Type resolvers
|
|
201
|
+
];
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Resolver Parameters
|
|
205
|
+
|
|
206
|
+
All resolvers receive three parameters:
|
|
207
|
+
|
|
208
|
+
1. **`parent`** (or `_parent`): The result from the resolver on the parent field
|
|
209
|
+
2. **`args`**: Arguments passed to the field
|
|
210
|
+
3. **`context`** (or `_context`): Context object containing:
|
|
211
|
+
- `prisma`: PrismaClient instance
|
|
212
|
+
- `[DataLoaderName]`: Generated DataLoaders for relationships
|
|
213
|
+
- `user`: Authenticated user (if using `@auth` directive)
|
|
214
|
+
- Other context properties
|
|
215
|
+
|
|
216
|
+
### Resolver Context
|
|
217
|
+
|
|
218
|
+
The resolver context provides access to:
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
interface ResolverContext {
|
|
222
|
+
prisma: PrismaClient;
|
|
223
|
+
// Generated DataLoaders
|
|
224
|
+
userAuthorDataLoader?: DataLoader<string, User>;
|
|
225
|
+
postCommentsDataLoader?: DataLoader<string[], Comment[]>;
|
|
226
|
+
// Authentication
|
|
227
|
+
user?: User;
|
|
228
|
+
// Request object
|
|
229
|
+
req?: Express.Request;
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Customizing Resolvers
|
|
234
|
+
|
|
235
|
+
#### Editing Generated Resolvers
|
|
236
|
+
|
|
237
|
+
The generated `resolvers.ts` file can be edited directly in the editor. You can:
|
|
238
|
+
|
|
239
|
+
1. **Modify existing resolvers**: Update the generated resolver logic
|
|
240
|
+
2. **Add custom resolvers**: Add new query/mutation/field resolvers
|
|
241
|
+
3. **Override defaults**: Replace generated resolvers with custom implementations
|
|
242
|
+
|
|
243
|
+
**Example: Adding Custom Query Resolver**
|
|
244
|
+
|
|
245
|
+
```typescript
|
|
246
|
+
const queryResolvers = {
|
|
247
|
+
Query: {
|
|
248
|
+
getUser: async (_parent, { id }, _context) => {
|
|
249
|
+
// Generated resolver
|
|
250
|
+
const { prisma } = _context;
|
|
251
|
+
return prisma.user.findUnique({ where: { id } });
|
|
252
|
+
},
|
|
253
|
+
// Custom resolver
|
|
254
|
+
getUserByEmail: async (_parent, { email }, _context) => {
|
|
255
|
+
const { prisma } = _context;
|
|
256
|
+
return prisma.user.findUnique({ where: { email } });
|
|
257
|
+
},
|
|
258
|
+
searchUsers: async (_parent, { query }, _context) => {
|
|
259
|
+
const { prisma } = _context;
|
|
260
|
+
return prisma.user.findMany({
|
|
261
|
+
where: {
|
|
262
|
+
OR: [{ name: { contains: query } }, { email: { contains: query } }],
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Example: Adding Custom Field Resolver**
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
const typeResolvers = {
|
|
274
|
+
User: {
|
|
275
|
+
// Generated DataLoader resolver
|
|
276
|
+
posts: (parent, args, context) => {
|
|
277
|
+
const { userPostsDataLoader } = context;
|
|
278
|
+
return userPostsDataLoader.loadMany(parent.postIds || []);
|
|
279
|
+
},
|
|
280
|
+
// Custom computed field
|
|
281
|
+
postCount: async (parent, args, context) => {
|
|
282
|
+
const { prisma } = context;
|
|
283
|
+
return prisma.post.count({
|
|
284
|
+
where: { authorId: parent.id },
|
|
285
|
+
});
|
|
286
|
+
},
|
|
287
|
+
// Custom field with business logic
|
|
288
|
+
isActive: (parent) => {
|
|
289
|
+
return parent.status === 'active' && parent.emailVerified;
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
#### Resolver Best Practices
|
|
296
|
+
|
|
297
|
+
1. **Use DataLoaders for Relationships**: Always use `@useLoader` directive for relationships to prevent N+1 queries
|
|
298
|
+
2. **Keep Resolvers Thin**: Move business logic to service layers
|
|
299
|
+
3. **Handle Errors**: Wrap resolver logic in try-catch blocks
|
|
300
|
+
4. **Validate Input**: Validate arguments before database operations
|
|
301
|
+
5. **Use Context**: Access shared resources through context (prisma, user, etc.)
|
|
302
|
+
6. **Async/Await**: Use async/await for database operations
|
|
303
|
+
7. **Type Safety**: Leverage TypeScript types for resolver parameters and return values
|
|
304
|
+
|
|
305
|
+
### Resolver Generation Rules
|
|
306
|
+
|
|
307
|
+
#### Entity Types
|
|
308
|
+
|
|
309
|
+
- All entity types (`@entity` directive) get query and mutation resolvers
|
|
310
|
+
- Field resolvers are generated for non-column fields and DataLoader fields
|
|
311
|
+
- ID field resolvers are skipped (handled by Prisma)
|
|
312
|
+
|
|
313
|
+
#### Abstract Entities
|
|
314
|
+
|
|
315
|
+
- Abstract entities (`@abstractEntity` directive) get query and mutation resolvers
|
|
316
|
+
- Implementing types inherit resolvers from abstract entity
|
|
317
|
+
- Polymorphic queries are generated
|
|
318
|
+
|
|
319
|
+
#### Non-Entity Types
|
|
320
|
+
|
|
321
|
+
- Non-entity object types get stub resolvers with TODO comments
|
|
322
|
+
- Stub resolvers return `null` by default
|
|
323
|
+
- You must implement these manually
|
|
324
|
+
|
|
325
|
+
### Resolver File Location
|
|
326
|
+
|
|
327
|
+
Generated resolvers are saved in:
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
project-name/resolvers.ts
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
This file is editable in the GraphQL Builder editor and persists across deployments.
|
|
334
|
+
|
|
335
|
+
### Resolver Regeneration
|
|
336
|
+
|
|
337
|
+
Resolvers are regenerated when:
|
|
338
|
+
|
|
339
|
+
- Schema changes are saved
|
|
340
|
+
- Project is deployed
|
|
341
|
+
- Types are generated manually
|
|
342
|
+
|
|
343
|
+
**Important**: Custom resolver modifications are preserved during regeneration. Only new resolvers are added; existing ones are not overwritten unless the schema structure changes significantly.
|
|
344
|
+
|
|
345
|
+
## Supported Directives
|
|
346
|
+
|
|
347
|
+
### Core Directives
|
|
348
|
+
|
|
349
|
+
#### `@entity`
|
|
350
|
+
|
|
351
|
+
Marks a GraphQL type as a database entity. Only types with this directive are included in Prisma schema generation.
|
|
352
|
+
|
|
353
|
+
```graphql
|
|
354
|
+
type User @entity {
|
|
355
|
+
id: ID! @id
|
|
356
|
+
name: String! @column
|
|
357
|
+
}
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
#### `@column(overrideType: String)`
|
|
361
|
+
|
|
362
|
+
Marks a field to be stored as a database column. The `overrideType` parameter allows overriding the Prisma type.
|
|
363
|
+
|
|
364
|
+
```graphql
|
|
365
|
+
type User @entity {
|
|
366
|
+
id: ID! @id
|
|
367
|
+
email: String! @column
|
|
368
|
+
age: Int @column(overrideType: "Int")
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
#### `@id`
|
|
373
|
+
|
|
374
|
+
Marks a field as the primary key. Automatically maps to MongoDB ObjectId.
|
|
375
|
+
|
|
376
|
+
```graphql
|
|
377
|
+
type User @entity {
|
|
378
|
+
id: ID! @id
|
|
379
|
+
# or
|
|
380
|
+
userId: ID! @id
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
#### `@useLoader(fieldName: String)`
|
|
385
|
+
|
|
386
|
+
Generates a DataLoader for efficient relationship loading. The `fieldName` specifies which field contains the foreign key.
|
|
387
|
+
|
|
388
|
+
```graphql
|
|
389
|
+
type Post @entity {
|
|
390
|
+
id: ID! @id
|
|
391
|
+
authorId: String! @column
|
|
392
|
+
author: User @useLoader(fieldName: "authorId")
|
|
393
|
+
}
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
#### `@abstractEntity(discriminatorField: String!)`
|
|
397
|
+
|
|
398
|
+
Creates a polymorphic entity pattern. Useful for inheritance-like structures.
|
|
399
|
+
|
|
400
|
+
```graphql
|
|
401
|
+
interface Content @abstractEntity(discriminatorField: "contentType") {
|
|
402
|
+
id: ID! @id
|
|
403
|
+
title: String! @column
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
type Article implements Content @entity {
|
|
407
|
+
contentType: ContentType!
|
|
408
|
+
body: String! @column
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
type Video implements Content @entity {
|
|
412
|
+
contentType: ContentType!
|
|
413
|
+
url: String! @column
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
#### `@auth`
|
|
418
|
+
|
|
419
|
+
Adds authentication middleware to queries, mutations, or fields. Requires valid Keycloak JWT token.
|
|
420
|
+
|
|
421
|
+
```graphql
|
|
422
|
+
type Query {
|
|
423
|
+
protectedData: String @auth
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
type Mutation {
|
|
427
|
+
updateUser(id: ID!): User @auth
|
|
428
|
+
}
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Prisma-Specific Directives
|
|
432
|
+
|
|
433
|
+
#### `@unique`
|
|
434
|
+
|
|
435
|
+
Marks a field as unique in the database.
|
|
436
|
+
|
|
437
|
+
```graphql
|
|
438
|
+
type User @entity {
|
|
439
|
+
email: String! @column @unique
|
|
440
|
+
}
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
#### `@relation(field: String)`
|
|
444
|
+
|
|
445
|
+
Defines relationships between entities.
|
|
446
|
+
|
|
447
|
+
```graphql
|
|
448
|
+
type User @entity {
|
|
449
|
+
id: ID! @id
|
|
450
|
+
posts: [Post!] @relation(field: "authorId")
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
type Post @entity {
|
|
454
|
+
id: ID! @id
|
|
455
|
+
authorId: String! @column
|
|
456
|
+
author: User @useLoader(fieldName: "authorId")
|
|
457
|
+
}
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
#### `@default(value: String)`
|
|
461
|
+
|
|
462
|
+
Sets a default value for a field.
|
|
463
|
+
|
|
464
|
+
```graphql
|
|
465
|
+
type User @entity {
|
|
466
|
+
status: String! @column @default(value: "active")
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
#### `@defaultBoolean(value: Boolean)`
|
|
471
|
+
|
|
472
|
+
Sets a default boolean value.
|
|
473
|
+
|
|
474
|
+
```graphql
|
|
475
|
+
type User @entity {
|
|
476
|
+
isActive: Boolean! @column @defaultBoolean(value: true)
|
|
477
|
+
}
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
#### `@defaultInt(value: Int)`
|
|
481
|
+
|
|
482
|
+
Sets a default integer value.
|
|
483
|
+
|
|
484
|
+
```graphql
|
|
485
|
+
type Post @entity {
|
|
486
|
+
viewCount: Int! @column @defaultInt(value: 0)
|
|
487
|
+
}
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
#### `@defaultFloat(value: Float)`
|
|
491
|
+
|
|
492
|
+
Sets a default float value.
|
|
493
|
+
|
|
494
|
+
```graphql
|
|
495
|
+
type Product @entity {
|
|
496
|
+
price: Float! @column @defaultFloat(value: 0.0)
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
## Auto-Generated Operations
|
|
501
|
+
|
|
502
|
+
### Query Operations
|
|
503
|
+
|
|
504
|
+
For each entity type, the following queries are automatically generated:
|
|
505
|
+
|
|
506
|
+
#### Single Item Query
|
|
507
|
+
|
|
508
|
+
```graphql
|
|
509
|
+
query {
|
|
510
|
+
getUser(id: "123") {
|
|
511
|
+
id
|
|
512
|
+
name
|
|
513
|
+
email
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
#### List Query with Filtering & Pagination
|
|
519
|
+
|
|
520
|
+
```graphql
|
|
521
|
+
query {
|
|
522
|
+
getAllUsers(filter: { name: { contains: "John" } }, limit: 10, offset: 0) {
|
|
523
|
+
id
|
|
524
|
+
name
|
|
525
|
+
email
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### Mutation Operations
|
|
531
|
+
|
|
532
|
+
For each entity type, the following mutations are automatically generated:
|
|
533
|
+
|
|
534
|
+
#### Create Mutation
|
|
535
|
+
|
|
536
|
+
```graphql
|
|
537
|
+
mutation {
|
|
538
|
+
createUser(data: { name: "John Doe", email: "john@example.com" }) {
|
|
539
|
+
id
|
|
540
|
+
name
|
|
541
|
+
email
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
#### Update Mutation
|
|
547
|
+
|
|
548
|
+
```graphql
|
|
549
|
+
mutation {
|
|
550
|
+
updateUser(id: "123", data: { name: "Jane Doe" }) {
|
|
551
|
+
id
|
|
552
|
+
name
|
|
553
|
+
email
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
#### Delete Mutation
|
|
559
|
+
|
|
560
|
+
```graphql
|
|
561
|
+
mutation {
|
|
562
|
+
deleteUser(id: "123") {
|
|
563
|
+
id
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
## Architecture
|
|
569
|
+
|
|
570
|
+
### Code Generation Flow
|
|
571
|
+
|
|
572
|
+
1. **Schema Input**: User writes GraphQL SDL in the editor
|
|
573
|
+
2. **Validation**: Schema is validated for syntax and semantic correctness
|
|
574
|
+
3. **Parsing**: GraphQL schema is parsed into AST
|
|
575
|
+
4. **Directive Processing**: Directives are analyzed and processed
|
|
576
|
+
5. **Prisma Schema Generation**: Prisma schema is generated from entity types
|
|
577
|
+
6. **Resolver Generation**: TypeScript resolvers are generated
|
|
578
|
+
7. **DataLoader Generation**: DataLoaders are created for relationships
|
|
579
|
+
8. **Code Compilation**: Generated code is written to project directory
|
|
580
|
+
9. **Prisma Generate**: Prisma Client is generated
|
|
581
|
+
10. **Deployment**: Project is deployed to Express.js server
|
|
582
|
+
|
|
583
|
+
### File Structure
|
|
584
|
+
|
|
585
|
+
```
|
|
586
|
+
project-name/
|
|
587
|
+
├── schema.prisma # Generated Prisma schema
|
|
588
|
+
├── schema.graphql # Original GraphQL schema
|
|
589
|
+
├── resolvers.ts # Generated resolvers
|
|
590
|
+
├── server.ts # Express server setup
|
|
591
|
+
├── client/ # Generated Prisma Client
|
|
592
|
+
│ └── index.js
|
|
593
|
+
└── dataloaders/ # Generated DataLoaders
|
|
594
|
+
├── index.ts
|
|
595
|
+
└── [entity]DataLoader.ts
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
### Editor File Structure
|
|
599
|
+
|
|
600
|
+
```
|
|
601
|
+
/
|
|
602
|
+
├── schema.graphql # Main GraphQL schema
|
|
603
|
+
├── resolver.ts # Custom resolvers (optional)
|
|
604
|
+
├── model.ts # Generated model types
|
|
605
|
+
├── directives/ # Custom directive files
|
|
606
|
+
│ ├── directive.ts # Compiled directives index
|
|
607
|
+
│ └── [custom].ts # Individual directive files
|
|
608
|
+
└── _generated/ # Auto-generated client files
|
|
609
|
+
└── ...
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
## Usage Guide
|
|
613
|
+
|
|
614
|
+
### Creating a New Project
|
|
615
|
+
|
|
616
|
+
1. Navigate to the GraphQL Builder interface
|
|
617
|
+
2. Select your organization
|
|
618
|
+
3. Start editing the default schema template
|
|
619
|
+
4. Define your entities using directives
|
|
620
|
+
5. Save the project
|
|
621
|
+
6. Deploy when ready
|
|
622
|
+
|
|
623
|
+
### Example Schema
|
|
624
|
+
|
|
625
|
+
```graphql
|
|
626
|
+
type User @entity {
|
|
627
|
+
id: ID! @id
|
|
628
|
+
email: String! @column @unique
|
|
629
|
+
name: String! @column
|
|
630
|
+
posts: [Post!] @relation(field: "authorId")
|
|
631
|
+
createdAt: DateTime! @column
|
|
632
|
+
updatedAt: DateTime! @column
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
type Post @entity {
|
|
636
|
+
id: ID! @id
|
|
637
|
+
title: String! @column
|
|
638
|
+
content: String! @column
|
|
639
|
+
authorId: String! @column
|
|
640
|
+
author: User @useLoader(fieldName: "authorId")
|
|
641
|
+
published: Boolean! @column @defaultBoolean(value: false)
|
|
642
|
+
createdAt: DateTime! @column
|
|
643
|
+
updatedAt: DateTime! @column
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
type Query {
|
|
647
|
+
getUser(id: ID!): User
|
|
648
|
+
getAllUsers(filter: JSON, limit: Int, offset: Int): [User!]!
|
|
649
|
+
getPost(id: ID!): Post
|
|
650
|
+
getAllPosts(filter: JSON, limit: Int, offset: Int): [Post!]!
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
type Mutation {
|
|
654
|
+
createUser(data: JSON!): User!
|
|
655
|
+
updateUser(id: ID!, data: JSON!): User!
|
|
656
|
+
deleteUser(id: ID!): User!
|
|
657
|
+
createPost(data: JSON!): Post!
|
|
658
|
+
updatePost(id: ID!, data: JSON!): Post!
|
|
659
|
+
deletePost(id: ID!): Post!
|
|
660
|
+
}
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
### Creating Custom Directives
|
|
664
|
+
|
|
665
|
+
1. Create a new `.ts` file in the `/directives` folder
|
|
666
|
+
2. Export a directive function:
|
|
667
|
+
|
|
668
|
+
```typescript
|
|
669
|
+
export const myCustomDirective = (next, source, args, context, info) => {
|
|
670
|
+
// Custom logic here
|
|
671
|
+
return next();
|
|
672
|
+
};
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
3. The directive will be automatically extracted and compiled
|
|
676
|
+
4. Use it in your schema:
|
|
677
|
+
|
|
678
|
+
```graphql
|
|
679
|
+
type Query {
|
|
680
|
+
myField: String @myCustomDirective
|
|
681
|
+
}
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
### Deploying a Project
|
|
685
|
+
|
|
686
|
+
1. Save your project changes
|
|
687
|
+
2. Click the "Deploy" button
|
|
688
|
+
3. The system will:
|
|
689
|
+
- Generate Prisma schema
|
|
690
|
+
- Generate resolvers
|
|
691
|
+
- Generate DataLoaders
|
|
692
|
+
- Run `prisma generate`
|
|
693
|
+
- Deploy to Express server
|
|
694
|
+
- Create Apollo Server endpoint
|
|
695
|
+
|
|
696
|
+
## API Endpoints
|
|
697
|
+
|
|
698
|
+
### GraphQL Endpoint
|
|
699
|
+
|
|
700
|
+
After deployment, each project gets its own GraphQL endpoint:
|
|
701
|
+
|
|
702
|
+
```
|
|
703
|
+
POST /graphql/{projectName}
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
### Project Management Endpoints
|
|
707
|
+
|
|
708
|
+
#### Get Projects
|
|
709
|
+
|
|
710
|
+
```graphql
|
|
711
|
+
query {
|
|
712
|
+
prismaProjects(
|
|
713
|
+
tenantProject: { projectId: "project-id", environmentTag: "env-tag" }
|
|
714
|
+
criteria: { name: "project-name" }
|
|
715
|
+
) {
|
|
716
|
+
data {
|
|
717
|
+
id
|
|
718
|
+
name
|
|
719
|
+
schema
|
|
720
|
+
lastDeployedAt
|
|
721
|
+
}
|
|
722
|
+
totalCount
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
#### Create Project
|
|
728
|
+
|
|
729
|
+
```graphql
|
|
730
|
+
mutation {
|
|
731
|
+
createPrismaProject(
|
|
732
|
+
prismaProject: {
|
|
733
|
+
name: "my-project"
|
|
734
|
+
schema: "type User @entity { ... }"
|
|
735
|
+
resolvers: "..."
|
|
736
|
+
directives: []
|
|
737
|
+
projectId: "project-id"
|
|
738
|
+
environmentTag: "env-tag"
|
|
739
|
+
}
|
|
740
|
+
) {
|
|
741
|
+
id
|
|
742
|
+
name
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
#### Deploy Project
|
|
748
|
+
|
|
749
|
+
```graphql
|
|
750
|
+
mutation {
|
|
751
|
+
deployPrismaProject(id: "project-id")
|
|
752
|
+
}
|
|
753
|
+
```
|
|
754
|
+
|
|
755
|
+
#### Generate Types
|
|
756
|
+
|
|
757
|
+
```graphql
|
|
758
|
+
query {
|
|
759
|
+
generateTypes(schema: "type User @entity { ... }") {
|
|
760
|
+
types
|
|
761
|
+
resolvers
|
|
762
|
+
collections
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
```
|
|
766
|
+
|
|
767
|
+
## Advanced Features
|
|
768
|
+
|
|
769
|
+
### Polymorphic Types
|
|
770
|
+
|
|
771
|
+
Use `@abstractEntity` to create polymorphic relationships:
|
|
772
|
+
|
|
773
|
+
```graphql
|
|
774
|
+
interface Media @abstractEntity(discriminatorField: "mediaType") {
|
|
775
|
+
id: ID! @id
|
|
776
|
+
title: String! @column
|
|
777
|
+
url: String! @column
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
type Image implements Media @entity {
|
|
781
|
+
mediaType: MediaType!
|
|
782
|
+
width: Int @column
|
|
783
|
+
height: Int @column
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
type Video implements Media @entity {
|
|
787
|
+
mediaType: MediaType!
|
|
788
|
+
duration: Int @column
|
|
789
|
+
}
|
|
790
|
+
```
|
|
791
|
+
|
|
792
|
+
### Custom Resolvers
|
|
793
|
+
|
|
794
|
+
You can add custom resolvers in the `resolver.ts` file:
|
|
795
|
+
|
|
796
|
+
```typescript
|
|
797
|
+
export const resolvers = [
|
|
798
|
+
{
|
|
799
|
+
Query: {
|
|
800
|
+
// Custom query resolvers
|
|
801
|
+
customQuery: async (parent, args, context) => {
|
|
802
|
+
// Your custom logic
|
|
803
|
+
},
|
|
804
|
+
},
|
|
805
|
+
Mutation: {
|
|
806
|
+
// Custom mutation resolvers
|
|
807
|
+
customMutation: async (parent, args, context) => {
|
|
808
|
+
// Your custom logic
|
|
809
|
+
},
|
|
810
|
+
},
|
|
811
|
+
User: {
|
|
812
|
+
// Custom field resolvers
|
|
813
|
+
customField: (parent, args, context) => {
|
|
814
|
+
// Your custom logic
|
|
815
|
+
},
|
|
816
|
+
},
|
|
817
|
+
},
|
|
818
|
+
];
|
|
819
|
+
```
|
|
820
|
+
|
|
821
|
+
### Authentication
|
|
822
|
+
|
|
823
|
+
Use `@auth` directive to protect operations:
|
|
824
|
+
|
|
825
|
+
```graphql
|
|
826
|
+
type Query {
|
|
827
|
+
publicData: String
|
|
828
|
+
privateData: String @auth
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
type Mutation {
|
|
832
|
+
updateProfile(id: ID!): User @auth
|
|
833
|
+
}
|
|
834
|
+
```
|
|
835
|
+
|
|
836
|
+
The `@auth` directive validates Keycloak JWT tokens and ensures the user is authenticated before executing the resolver.
|
|
837
|
+
|
|
838
|
+
## Best Practices
|
|
839
|
+
|
|
840
|
+
1. **Use Descriptive Entity Names**: Use clear, singular nouns for entity types
|
|
841
|
+
2. **Leverage Directives**: Use appropriate directives to reduce boilerplate
|
|
842
|
+
3. **Organize Directives**: Keep custom directives in separate files
|
|
843
|
+
4. **Validate Early**: Use the editor's validation before deploying
|
|
844
|
+
5. **Version Control**: Keep your GraphQL schemas in version control
|
|
845
|
+
6. **Use DataLoaders**: Always use `@useLoader` for relationships to avoid N+1 queries
|
|
846
|
+
7. **Test Locally**: Test your schema locally before deploying to production
|
|
847
|
+
8. **Customize Resolvers**: Edit generated resolvers to add business logic
|
|
848
|
+
9. **Handle Errors**: Implement proper error handling in custom resolvers
|
|
849
|
+
10. **Use TypeScript**: Leverage TypeScript types for type safety
|
|
850
|
+
|
|
851
|
+
## Troubleshooting
|
|
852
|
+
|
|
853
|
+
### Schema Validation Errors
|
|
854
|
+
|
|
855
|
+
- Check for syntax errors in your GraphQL SDL
|
|
856
|
+
- Ensure all directives are properly formatted
|
|
857
|
+
- Verify entity types have `@entity` directive
|
|
858
|
+
|
|
859
|
+
### Deployment Failures
|
|
860
|
+
|
|
861
|
+
- Check database connection string
|
|
862
|
+
- Verify Prisma schema is valid
|
|
863
|
+
- Ensure all required fields have proper types
|
|
864
|
+
|
|
865
|
+
### DataLoader Issues
|
|
866
|
+
|
|
867
|
+
- Verify `@useLoader` directive has correct `fieldName`
|
|
868
|
+
- Check that the field specified exists on the entity
|
|
869
|
+
- Ensure foreign key relationships are properly defined
|
|
870
|
+
|
|
871
|
+
### Resolver Issues
|
|
872
|
+
|
|
873
|
+
- Check that resolver context includes required DataLoaders
|
|
874
|
+
- Verify Prisma client is properly initialized
|
|
875
|
+
- Ensure resolver return types match schema types
|
|
876
|
+
- Check for async/await usage in async resolvers
|
|
877
|
+
|
|
878
|
+
## Technical Details
|
|
879
|
+
|
|
880
|
+
### Prisma Schema Generation
|
|
881
|
+
|
|
882
|
+
- Converts GraphQL types to Prisma models
|
|
883
|
+
- Maps GraphQL types to Prisma types
|
|
884
|
+
- Generates relationships based on directives
|
|
885
|
+
- Creates indexes for unique fields
|
|
886
|
+
|
|
887
|
+
### Resolver Generation
|
|
888
|
+
|
|
889
|
+
- Generates CRUD operations for all entities
|
|
890
|
+
- Creates field resolvers for relationships
|
|
891
|
+
- Implements DataLoader resolvers
|
|
892
|
+
- Adds TODO placeholders for custom resolvers
|
|
893
|
+
- Preserves custom resolver modifications
|
|
894
|
+
|
|
895
|
+
### DataLoader Generation
|
|
896
|
+
|
|
897
|
+
- Creates DataLoader classes for each relationship
|
|
898
|
+
- Implements batch loading logic
|
|
899
|
+
- Handles both single and list relationships
|
|
900
|
+
- Optimizes database queries
|
|
901
|
+
|
|
902
|
+
### Video Tutorial
|
|
903
|
+
|
|
904
|
+
https://www.loom.com/share/18b5b92fd3bf406da27c58b3496c8be6
|
|
905
|
+
|
|
906
|
+
https://www.loom.com/share/7264060666124560b549a082b266fcf8
|