@cdmbase/wiki-browser 12.0.18-alpha.10
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,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Feature Mobile API
|
|
4
|
+
description: Feature Mobile API
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Feature Mobile API...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Feature Mobile API
|
|
13
|
+
|
|
14
|
+
Similar to Feature Browser API, the backend Feature API support all that need to run the backend application..
|
|
15
|
+
|
|
16
|
+
It is opiniated and it supports
|
|
17
|
+
|
|
18
|
+
- react-native
|
|
19
|
+
- expo
|
|
20
|
+
- apollo-client
|
|
21
|
+
- redux-observable
|
|
22
|
+
- redux
|
|
23
|
+
- redux-persist
|
|
24
|
+
- react-navigation
|
|
25
|
+
|
|
26
|
+
Components are rendered only through `react-navigation`, for that we pass `routeConfig`.
|
|
27
|
+
|
|
28
|
+
Dynamic Components are provided using `slot-fill` logic using `componentFillPlugins` configuration.
|
|
29
|
+
|
|
30
|
+
Third-party Scripts can be inserted into HTML page as well.
|
|
31
|
+
|
|
32
|
+
Each of these packaged module is used in the `mobile-device` like below
|
|
33
|
+
|
|
34
|
+
```js
|
|
35
|
+
import counterModule from '@sample-stack/counter-module-mobile';
|
|
36
|
+
import accountModule from '@sample-stack/account-module-mobile';
|
|
37
|
+
import paymentModule from '@sample-stack/payment-module-mobile';
|
|
38
|
+
|
|
39
|
+
const features = new Feature(FeatureWithRouterFactory, counterModule, accountModule, paymentModule);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The `mobile-device` have all required logic to consolidate the `reducers`, `epics`, `apollo-client configuration`, `react-router configuration` etc to run the application.
|
|
43
|
+
|
|
44
|
+
For example provide all the required configuration to the `Feature` like below.
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
const module = new Feature({
|
|
48
|
+
/**
|
|
49
|
+
Customizing ID in the apollo cache.
|
|
50
|
+
**/
|
|
51
|
+
dataIdFromObject,
|
|
52
|
+
/**
|
|
53
|
+
load apollo-client state management.
|
|
54
|
+
**/
|
|
55
|
+
clientStateParams: { resolvers, typeDefs: schema },
|
|
56
|
+
/**
|
|
57
|
+
load redux-observables to manage the client state.
|
|
58
|
+
**/
|
|
59
|
+
epic: [onUserAccountNotFound],
|
|
60
|
+
/**
|
|
61
|
+
load react-router configuration to display component based on navigation.
|
|
62
|
+
for more information check [Routing](./routing.mx)
|
|
63
|
+
**/
|
|
64
|
+
routeConfig: filteredRoutes,
|
|
65
|
+
componentFillPlugins: [
|
|
66
|
+
{
|
|
67
|
+
name: 'teams-contribution',
|
|
68
|
+
render: TeamsContribution,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
createContainerFunc: [Auth0Module],
|
|
72
|
+
/**
|
|
73
|
+
load reducers to the Redux Store when this Feature Module is used.
|
|
74
|
+
**/
|
|
75
|
+
reducer: { user: userReducer, redirectRoutes: redirectRoutesReducer, authErrors: authErrorsReducer },
|
|
76
|
+
/**
|
|
77
|
+
By default all redux state is persisted using redux-persist, if you need to manipulate the persist state
|
|
78
|
+
add configuration here.
|
|
79
|
+
**/
|
|
80
|
+
reduxPersistTransforms: [blacklistErrorFilter, blacklistUserFilter],
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
We don't need to put the `redux` store creation nor apollo-client setup in the Module as this action will be taken care at the higher level (frontend-server).
|
|
85
|
+
|
|
86
|
+
### Client State Management
|
|
87
|
+
|
|
88
|
+
Applciation state can be managed using Apollo Link State and Redux.
|
|
89
|
+
|
|
90
|
+
#### Redux
|
|
91
|
+
|
|
92
|
+
Support [redux's reducers](https://redux.js.org/usage/structuring-reducers/basic-reducer-structure)
|
|
93
|
+
Example:
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
const module = new Feature({
|
|
97
|
+
reducer: { user: userReducer, redirectRoutes: redirectRoutesReducer, authErrors: authErrorsReducer },
|
|
98
|
+
....
|
|
99
|
+
});
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### Apollo Client State Management
|
|
103
|
+
|
|
104
|
+
Support [interacting with local data in Apollo Client](https://www.apollographql.com/docs/react/local-state/local-state-management/)
|
|
105
|
+
|
|
106
|
+
Example:
|
|
107
|
+
|
|
108
|
+
```js
|
|
109
|
+
const module = new Feature({
|
|
110
|
+
clientStateParams: { resolvers, typeDefs: schema, typePolicies },
|
|
111
|
+
....
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
##### dataIdFromObject
|
|
116
|
+
|
|
117
|
+
Support cusotmizing the ID in the apollo cache. More infromation is [here](https://www.apollographql.com/docs/react/caching/cache-configuration/#dataidfromobject)
|
|
118
|
+
|
|
119
|
+
#### Epic
|
|
120
|
+
|
|
121
|
+
Support [redux-observable](https://redux-observable.js.org/docs/basics/Epics.html)
|
|
122
|
+
|
|
123
|
+
Example:
|
|
124
|
+
|
|
125
|
+
```js
|
|
126
|
+
const module = new Feature({
|
|
127
|
+
epic: [onUserAccountNotFound],
|
|
128
|
+
....
|
|
129
|
+
});
|
|
130
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Feature Mobile
|
|
4
|
+
description: Feature Mobile
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Feature Mobile...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Feature Mobile
|
|
13
|
+
|
|
14
|
+
**[Feature Mobile API](/docs/feature-api/feature-mobile/feature)**
|
|
15
|
+
|
|
16
|
+
**[Navigation](/docs/feature-api/feature-mobile/navigation)**
|
|
17
|
+
|
|
18
|
+
**[Auth & Permissions](/docs/feature-api/feature-mobile/auth-permissions)**
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Navigation
|
|
4
|
+
description: Navigation
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Navigation...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Navigation
|
|
13
|
+
|
|
14
|
+
## Configuring Navigation
|
|
15
|
+
|
|
16
|
+
Configure through `routeConfig` in the configuration file, the format is an object of routing information.
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
const routerConfig1: IRouteData = {
|
|
20
|
+
['/']: {
|
|
21
|
+
exact: false,
|
|
22
|
+
container: createStackNavigator(),
|
|
23
|
+
name: 'MainStack',
|
|
24
|
+
props: {
|
|
25
|
+
initialRouteName: 'Guest',
|
|
26
|
+
screenOptions: {
|
|
27
|
+
headerShown: false,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
['//guest']: {
|
|
32
|
+
container: createBottomTabNavigator(),
|
|
33
|
+
exact: false,
|
|
34
|
+
name: 'Guest',
|
|
35
|
+
props: {
|
|
36
|
+
initialRouteName: 'Home',
|
|
37
|
+
screenOptions: {
|
|
38
|
+
headerShown: false,
|
|
39
|
+
tabBarLabel: 'About',
|
|
40
|
+
// tabBarIcon: ({ color }) => <Ionicons name="person" size={24} color={color} />,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
['//guest/home']: {
|
|
45
|
+
name: 'Home',
|
|
46
|
+
props: {
|
|
47
|
+
initialParams: {},
|
|
48
|
+
component: MyComponent,
|
|
49
|
+
options: {
|
|
50
|
+
headerShown: true,
|
|
51
|
+
tabBarLabel: 'Home',
|
|
52
|
+
headerTitle: 'Home',
|
|
53
|
+
// tabBarIcon: ({ color }) => <Ionicons name="home" size={24} color={color} />,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
['//guest/about']: {
|
|
58
|
+
exact: false,
|
|
59
|
+
container: createStackNavigator(),
|
|
60
|
+
name: 'About',
|
|
61
|
+
props: {
|
|
62
|
+
initialRouteName: 'Hello',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
['//guest/about/hello']: {
|
|
66
|
+
name: 'Hello',
|
|
67
|
+
props: {
|
|
68
|
+
initialParams: {},
|
|
69
|
+
component: MyComponent,
|
|
70
|
+
options: {
|
|
71
|
+
headerTitle: 'About',
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
['//guest/about/personalinfo']: {
|
|
76
|
+
name: 'PersonalInfo',
|
|
77
|
+
props: {
|
|
78
|
+
initialParams: { name: 'Test' },
|
|
79
|
+
component: MyComponent,
|
|
80
|
+
options: {
|
|
81
|
+
headerTitle: 'Personal Info',
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
['//setting']: {
|
|
86
|
+
name: 'Setting',
|
|
87
|
+
props: {
|
|
88
|
+
initialParams: {},
|
|
89
|
+
component: MyComponent,
|
|
90
|
+
options: {
|
|
91
|
+
headerShown: true,
|
|
92
|
+
headerTitle: 'Settings',
|
|
93
|
+
headerBackTitle: 'Back',
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
exact: false,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
It generates
|
|
102
|
+
|
|
103
|
+
```js
|
|
104
|
+
<StackNavigator
|
|
105
|
+
initialRouteName="Guest"
|
|
106
|
+
screenOptions={
|
|
107
|
+
Object {
|
|
108
|
+
"headerShown": false,
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
>
|
|
112
|
+
<Screen
|
|
113
|
+
name="MainStack.Guest"
|
|
114
|
+
>
|
|
115
|
+
<BottomTabNavigator
|
|
116
|
+
initialRouteName="Home"
|
|
117
|
+
screenOptions={
|
|
118
|
+
Object {
|
|
119
|
+
"headerShown": false,
|
|
120
|
+
"tabBarLabel": "About",
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
>
|
|
124
|
+
<Screen
|
|
125
|
+
initialParams={Object {}}
|
|
126
|
+
name="MainStack.Guest.Home"
|
|
127
|
+
options={
|
|
128
|
+
Object {
|
|
129
|
+
"headerShown": true,
|
|
130
|
+
"headerTitle": "Home",
|
|
131
|
+
"tabBarLabel": "Home",
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
>
|
|
135
|
+
[Function]
|
|
136
|
+
</Screen>
|
|
137
|
+
<Screen
|
|
138
|
+
name="MainStack.Guest.About"
|
|
139
|
+
>
|
|
140
|
+
<StackNavigator
|
|
141
|
+
initialRouteName="Hello"
|
|
142
|
+
>
|
|
143
|
+
<Screen
|
|
144
|
+
initialParams={Object {}}
|
|
145
|
+
name="MainStack.Guest.About.Hello"
|
|
146
|
+
options={
|
|
147
|
+
Object {
|
|
148
|
+
"headerTitle": "About",
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
>
|
|
152
|
+
[Function]
|
|
153
|
+
</Screen>
|
|
154
|
+
<Screen
|
|
155
|
+
initialParams={
|
|
156
|
+
Object {
|
|
157
|
+
"name": "Test",
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
name="MainStack.Guest.About.PersonalInfo"
|
|
161
|
+
options={
|
|
162
|
+
Object {
|
|
163
|
+
"headerTitle": "Personal Info",
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
>
|
|
167
|
+
[Function]
|
|
168
|
+
</Screen>
|
|
169
|
+
</StackNavigator>
|
|
170
|
+
</Screen>
|
|
171
|
+
</BottomTabNavigator>
|
|
172
|
+
</Screen>
|
|
173
|
+
<Screen
|
|
174
|
+
initialParams={Object {}}
|
|
175
|
+
name="MainStack.Setting"
|
|
176
|
+
options={
|
|
177
|
+
Object {
|
|
178
|
+
"headerBackTitle": "Back",
|
|
179
|
+
"headerShown": true,
|
|
180
|
+
"headerTitle": "Settings",
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
>
|
|
184
|
+
[Function]
|
|
185
|
+
</Screen>
|
|
186
|
+
</StackNavigator>
|
|
187
|
+
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Scheduling / Cron Jobs
|
|
4
|
+
description: Scheduling / Cron Jobs
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Scheduling / Cron Jobs...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Scheduling / Cron Jobs
|
|
13
|
+
|
|
14
|
+
## What are Cron Jobs
|
|
15
|
+
|
|
16
|
+
Cron jobs are scheduled tasks that are run automatically at specified intervals. Cron jobs are an essential component of many applications and software systems. They allow developers and system administrators to schedule and automate recurring tasks that need to be performed on a regular basis. These tasks can be anything from running a script to sending an email to cleaning up temporary files.
|
|
17
|
+
|
|
18
|
+
For example, an e-commerce website might use a cron job to perform a daily inventory update, which would update the stock levels of each product based on the sales from the previous day. A social media platform might use a cron job to generate a weekly activity report for each user, which would summarize their engagement with the platform over the past week.
|
|
19
|
+
Cron jobs are needed in applications because they provide a reliable and efficient way to automate repetitive tasks, reducing the workload on human operators and improving the overall efficiency of the system. They can also help ensure that critical tasks are performed on time, reducing the risk of errors or delays that could impact the user experience.
|
|
20
|
+
|
|
21
|
+
In summary, cron jobs are an important tool for developers and system administrators that can help improve the performance, reliability, and functionality of an application.
|
|
22
|
+
|
|
23
|
+
## Adding a Cron Job
|
|
24
|
+
|
|
25
|
+
There are numerous ways to add cron jobs to your Node JS application, we are defining them
|
|
26
|
+
using the [Moleculer Services](https://moleculer.services/). Creating cron jobs is simple using the
|
|
27
|
+
Moleculer Service and [Cron Tasker](https://www.npmjs.com/package/@skoropletov/moleculer-cron-tasks.
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
this.broker.createService({
|
|
31
|
+
name: 'cron-service', // Name of Moleculer Service
|
|
32
|
+
mixins: [CronTasks], // Cron Tasker Plugin to enable Cron Jobs
|
|
33
|
+
tasks: [
|
|
34
|
+
{
|
|
35
|
+
name: 'log-seconds', // Cron Task Name
|
|
36
|
+
cronTime: '* * * * * *', // Unix Cron Schedule
|
|
37
|
+
callback: (): void => {
|
|
38
|
+
// Call back function to run on each job
|
|
39
|
+
console.log('[!] second passed');
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
});
|
|
44
|
+
```
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Dataloader
|
|
4
|
+
description: Dataloader
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Dataloader...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Dataloader
|
|
13
|
+
|
|
14
|
+
### How Dataloaders are Used and Their Benefits
|
|
15
|
+
|
|
16
|
+
Based on [PR #2716](https://github.com/CDEBase/adminIde-stack/pull/2716), dataloaders were introduced to optimize GraphQL performance by **batching and caching** requests. This document provides an in-depth explanation of their implementation, usage, and advantages.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
#### What is a DataLoader?
|
|
21
|
+
|
|
22
|
+
A **DataLoader** is a utility for batching and caching requests in a GraphQL environment. It allows efficient resolution of GraphQL queries by queuing up multiple requests during execution and batching them into a single query to the database or API.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
#### Implementation of Dataloaders
|
|
27
|
+
|
|
28
|
+
1. **Defining the DataLoader Type**:
|
|
29
|
+
- A specific `ITeamsDataLoader` type is created to handle team entities.
|
|
30
|
+
- This type is derived from a generic `IDataLoader` interface for flexibility and reuse.
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
export type ITeamsDataLoader = IDataLoader<ITeam>;
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
2. **Integrating Dataloaders in Service Interfaces**:
|
|
37
|
+
- To ensure seamless access throughout the application, the `teamsDataLoader` is added to the `IServices` interface.
|
|
38
|
+
- This allows dependency injection and promotes consistency.
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
export interface IServices {
|
|
42
|
+
teamService: ITeamService;
|
|
43
|
+
accountUserDataLoader: IAccountUserDataLoader;
|
|
44
|
+
teamsDataLoader: ITeamsDataLoader;
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
3. **Creating the DataLoader Instance**:
|
|
49
|
+
- The DataLoader instance is initialized to handle batching and caching logic.
|
|
50
|
+
- Below is an example of how a DataLoader might be initialized and how batched results are mapped back to GraphQL child resolvers:
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import DataLoader from 'dataloader';
|
|
54
|
+
import { getTeamsByIds } from './teamRepository';
|
|
55
|
+
|
|
56
|
+
export const createTeamsDataLoader = (): ITeamsDataLoader => {
|
|
57
|
+
return new DataLoader<string, ITeam>(async (teamIds) => {
|
|
58
|
+
// Fetch all teams in a single batch based on provided IDs
|
|
59
|
+
const teams = await getTeamsByIds(teamIds);
|
|
60
|
+
|
|
61
|
+
// Map the fetched teams back to their corresponding IDs
|
|
62
|
+
return teamIds.map((id) => teams.find((team) => team.id === id) || new Error(`Team not found: ${id}`));
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Explanation of Mapping**:
|
|
68
|
+
- **Input**: A list of `teamIds` queued by the DataLoader (e.g., `['team1', 'team2', 'team3']`).
|
|
69
|
+
- **Process**: Fetch the data for all `teamIds` in a single query (e.g., `getTeamsByIds(teamIds)`).
|
|
70
|
+
- **Mapping Back**:
|
|
71
|
+
- Use the input `teamIds` to order the results so they correspond to the original request order.
|
|
72
|
+
- If a team is missing, return an error or handle it gracefully.
|
|
73
|
+
|
|
74
|
+
This ensures that the batched result aligns with the request order, even if the database query returns the results in a different sequence.
|
|
75
|
+
|
|
76
|
+
4. **Using the DataLoader in GraphQL Resolvers**:
|
|
77
|
+
- Resolvers can now delegate data fetching to the DataLoader, ensuring efficient data retrieval and proper mapping back to the GraphQL schema.
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
const resolvers = {
|
|
81
|
+
Query: {
|
|
82
|
+
team: async (_: any, { id }: { id: string }, { services }: { services: IServices }) => {
|
|
83
|
+
return services.teamsDataLoader.load(id); // Delegates to the DataLoader
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
User: {
|
|
87
|
+
teams: async (parent: IUser, _: any, { services }: { services: IServices }) => {
|
|
88
|
+
// Batch fetch all team IDs associated with the user
|
|
89
|
+
return services.teamsDataLoader.loadMany(parent.teamIds);
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
#### Benefits of Using Dataloaders
|
|
98
|
+
|
|
99
|
+
1. **Batching Requests**:
|
|
100
|
+
- Groups multiple identical or related queries into a single request.
|
|
101
|
+
- Reduces the overhead caused by multiple queries, improving efficiency.
|
|
102
|
+
|
|
103
|
+
Example:
|
|
104
|
+
Without DataLoader:
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
Query: getTeam(1)
|
|
108
|
+
Query: getTeam(2)
|
|
109
|
+
Query: getTeam(3)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
With DataLoader:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
Single Query: getTeams([1, 2, 3])
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
2. **Caching**:
|
|
119
|
+
- Automatically caches the results of requests made during the same execution cycle.
|
|
120
|
+
- Prevents fetching the same data more than once, reducing redundant calls.
|
|
121
|
+
|
|
122
|
+
Example:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
First Request: getTeam(1) -> Fetch from database
|
|
126
|
+
Second Request: getTeam(1) -> Return from cache
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
3. **Improved Performance**:
|
|
130
|
+
- Fewer queries mean reduced latency and lower server/database load.
|
|
131
|
+
- Scales better as the number of concurrent requests increases.
|
|
132
|
+
|
|
133
|
+
4. **Solves the N+1 Problem**:
|
|
134
|
+
- In GraphQL, resolvers often make repetitive requests (N+1 Problem). DataLoader batches these queries, solving this inefficiency.
|
|
135
|
+
|
|
136
|
+
Example:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
Query: Get all teams for users
|
|
140
|
+
Team Resolvers: Fetch team for each user -> N queries
|
|
141
|
+
With DataLoader: Fetch all teams in one query
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
5. **Mapping Ensures Correctness**:
|
|
145
|
+
- By maintaining a consistent mapping of inputs to outputs, DataLoader guarantees that each GraphQL child resolver receives the data it requested, even if some IDs are missing.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
### Key Steps to Map Batched Results Back to GraphQL Children
|
|
150
|
+
|
|
151
|
+
1. **Use the Input IDs for Consistent Ordering**:
|
|
152
|
+
- The input IDs passed to the DataLoader (`teamIds`) must dictate the order of the output array.
|
|
153
|
+
|
|
154
|
+
2. **Handle Missing Data Gracefully**:
|
|
155
|
+
- If the requested ID is not found in the fetched data, return an error or null to the corresponding resolver.
|
|
156
|
+
- Example:
|
|
157
|
+
```typescript
|
|
158
|
+
teamIds.map((id) => teams.find((team) => team.id === id) || new Error(`Team not found: ${id}`));
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
3. **Leverage `loadMany` for Collections**:
|
|
162
|
+
- When fetching collections of data (e.g., all teams for a user), use `loadMany` to handle multiple IDs at once.
|
|
163
|
+
- Example:
|
|
164
|
+
```typescript
|
|
165
|
+
const teamData = await services.teamsDataLoader.loadMany(parent.teamIds);
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
### Example Usage in GraphQL Context
|
|
171
|
+
|
|
172
|
+
Here’s how DataLoader optimizes GraphQL child resolvers:
|
|
173
|
+
|
|
174
|
+
```graphql
|
|
175
|
+
query {
|
|
176
|
+
user(id: "123") {
|
|
177
|
+
id
|
|
178
|
+
name
|
|
179
|
+
teams {
|
|
180
|
+
id
|
|
181
|
+
name
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
- The `User` resolver fetches `teamIds` for the user.
|
|
188
|
+
- The `teams` field uses `loadMany` to batch all `teamIds` into a single request.
|
|
189
|
+
- DataLoader maps the results back to each team field for the user in the correct order.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
### Changes Required to Add DataLoader to Existing Code
|
|
194
|
+
|
|
195
|
+
#### **Steps to Integrate DataLoader**
|
|
196
|
+
|
|
197
|
+
1. **Create the DataLoader File**:
|
|
198
|
+
- Create a file named `teams-dataloader.ts` for defining the DataLoader logic.
|
|
199
|
+
- This file will contain the initialization and batching logic for the `TeamsDataLoader`.
|
|
200
|
+
|
|
201
|
+
2. **Modify `types.ts` to Add DataLoader Type**:
|
|
202
|
+
- Update the `TYPES` constant to include a new type for `TeamsDataLoader`.
|
|
203
|
+
|
|
204
|
+
3. **Update Service Interfaces**:
|
|
205
|
+
- Add the `TeamsDataLoader` to the `IServices` interface, ensuring it can be accessed across the application.
|
|
206
|
+
|
|
207
|
+
4. **Implement DataLoader in Team Service**:
|
|
208
|
+
- Use the `TeamsDataLoader` in the `ITeamService` implementation for efficient data fetching.
|
|
209
|
+
|
|
210
|
+
5. **Inject DataLoader in Dependency Container**:
|
|
211
|
+
- Register the `TeamsDataLoader` in your dependency injection container, ensuring it is initialized and injected where required.
|
|
212
|
+
|
|
213
|
+
### Files Modified for DataLoader Implementation
|
|
214
|
+
|
|
215
|
+
Here is a list of files modified for integrating DataLoader, along with a new file for the `TeamsDataLoader`.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
#### **New File: `teams-dataloader.ts`**
|
|
220
|
+
|
|
221
|
+
Here you can use the `BulkDataLoader` to simplify the boilerplate code.
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
import { injectable, inject } from 'inversify';
|
|
225
|
+
import { BulkDataLoader } from '@common-stack/store-mongo';
|
|
226
|
+
import { ITeamService, TYPES } from '@adminide-stack/account-api-core';
|
|
227
|
+
import { IAccountTeam as ITeam } from '@adminide-stack/core';
|
|
228
|
+
|
|
229
|
+
@injectable()
|
|
230
|
+
export class TeamsDataLoader extends BulkDataLoader<ITeam & { id: string }> {
|
|
231
|
+
constructor(
|
|
232
|
+
@inject(TYPES.ITeamService)
|
|
233
|
+
teamService: ITeamService,
|
|
234
|
+
) {
|
|
235
|
+
super(teamService as never); // Pass the teamService to the BulkDataLoader utility
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
#### **Modified File: `types.ts`**
|
|
243
|
+
|
|
244
|
+
```diff
|
|
245
|
+
export const TYPES = {
|
|
246
|
+
IOrganizationRepository: Symbol('IOrganizationRepository'),
|
|
247
|
+
IOrganizationMicroservice: Symbol('IOrganizationMicroservice'),
|
|
248
|
+
AccountUserDataLoader: Symbol('AccountUserDataLoader'),
|
|
249
|
+
+ TeamsDataLoader: Symbol('TeamsDataLoader'),
|
|
250
|
+
};
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
#### **Modified File: `services.ts`**
|
|
256
|
+
|
|
257
|
+
```diff
|
|
258
|
+
import { IPreferencesService } from '@adminide-stack/core';
|
|
259
|
+
import { IOrganizationService } from './organization-service';
|
|
260
|
+
import { IAccountService } from './account-service';
|
|
261
|
+
import { ITeamsDataLoader, ITeamService } from './team-service';
|
|
262
|
+
import { IAccountUserDataLoader } from './account-user-data-loader';
|
|
263
|
+
import { ICountryService } from '@container-stack/territory';
|
|
264
|
+
|
|
265
|
+
export interface IServices {
|
|
266
|
+
teamService: ITeamService;
|
|
267
|
+
preferenceService?: IPreferencesService;
|
|
268
|
+
countryService?: ICountryService;
|
|
269
|
+
accountUserDataLoader: IAccountUserDataLoader;
|
|
270
|
+
+ teamsDataLoader: ITeamsDataLoader;
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
#### **Modified File: `team-service.ts`**
|
|
277
|
+
|
|
278
|
+
```diff
|
|
279
|
+
import { IBaseService, IDataLoader } from '@common-stack/store-mongo';
|
|
280
|
+
|
|
281
|
+
export type ITeamsDataLoader = IDataLoader<ITeam>;
|
|
282
|
+
|
|
283
|
+
export interface ITeamService extends IBaseService<ITeam> {
|
|
284
|
+
getTeam(id: string): Promise<ITeam>;
|
|
285
|
+
|
|
286
|
+
getTeamByName(orgName: string, teamName: string): Promise<ITeam>;
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
#### **Modified File: Dependency Injection Container**
|
|
293
|
+
|
|
294
|
+
Ensure the `TeamsDataLoader` is registered in your DI container:
|
|
295
|
+
|
|
296
|
+
```typescript
|
|
297
|
+
container.bind<IDataLoader<ITeam>>(TYPES.TeamsDataLoader).toDynamicValue(() => createTeamsDataLoader());
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## For more details on how to use generic dataloader you can read [Generic Dataloader from common-stac](./generic-dataloader.md)
|
|
301
|
+
|
|
302
|
+
### Guidelines for Developers
|
|
303
|
+
|
|
304
|
+
1. **Create a DataLoader for Each Entity**:
|
|
305
|
+
- Define a specific DataLoader type for each data entity (e.g., `ITeamsDataLoader`, `IUsersDataLoader`).
|
|
306
|
+
|
|
307
|
+
2. **Ensure Proper Mapping in Batch Functions**:
|
|
308
|
+
- Always map the batched results back to the original input keys.
|
|
309
|
+
|
|
310
|
+
3. **Use Dependency Injection**:
|
|
311
|
+
- Pass DataLoader instances via service interfaces (`IServices`) to ensure easy access across the application.
|
|
312
|
+
|
|
313
|
+
4. **Gracefully Handle Errors**:
|
|
314
|
+
- Ensure missing or invalid IDs are handled correctly without breaking the execution.
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
For more details on implementation, review the [files changed in PR #2716](https://github.com/CDEBase/adminIde-stack/pull/2716/files).
|
|
319
|
+
|
|
320
|
+
---
|