@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,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Keycloak Authentication Setup with Remix
|
|
4
|
+
description: Keycloak Authentication Setup with Remix
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Keycloak Authentication Setup with Remix ...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Keycloak Authentication Setup with Remix
|
|
13
|
+
|
|
14
|
+
## Introduction
|
|
15
|
+
|
|
16
|
+
This documentation outlines the steps required to set up Keycloak authentication with Remix, utilizing a custom Keycloak strategy. The setup involves configuring the Keycloak dashboard, defining a resource route, and managing user sessions.
|
|
17
|
+
|
|
18
|
+
## Keycloak Strategy Configuration
|
|
19
|
+
|
|
20
|
+
We set up a separate Keycloak strategy to be used for authentication:
|
|
21
|
+
|
|
22
|
+
```javascript
|
|
23
|
+
new KeycloakStrategy() <
|
|
24
|
+
T >
|
|
25
|
+
({
|
|
26
|
+
useSSL: true,
|
|
27
|
+
domain: config.KEYCLOAK_SERVER_DOMAIN,
|
|
28
|
+
realm: config.KEYCLOAK_REALM,
|
|
29
|
+
clientID: config.KEYCLOAK_CLIENT_ID,
|
|
30
|
+
clientSecret: config.KEYCLOAK_CLIENT_SECRET,
|
|
31
|
+
callbackURL: config.CALLBACK_REDIRECT_URL,
|
|
32
|
+
},
|
|
33
|
+
callback);
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Get the values for `KEYCLOAK_CLIENT_ID`, `KEYCLOAK_CLIENT_SECRET`, and `KEYCLOAK_REALM` from the [Keycloak dashboard](https://keycloak.cdebase.dev/).
|
|
37
|
+
|
|
38
|
+
## Resource Route Setup
|
|
39
|
+
|
|
40
|
+
We set up a resource route in the `user-auth-browser` package at `/resources/auth-keycloak`. The purpose of this resource route is to handle the `authentication` request using the Keycloak strategy we configured. You can check `authenticator.server.ts` to see its implementation.
|
|
41
|
+
|
|
42
|
+
## Login Button Integration
|
|
43
|
+
|
|
44
|
+
We have set up a login button on the login page of the `ant` package. When the login button is clicked, it calls the resource route `/resources/auth-keycloak`.
|
|
45
|
+
|
|
46
|
+
## Post-Login Flow
|
|
47
|
+
|
|
48
|
+
Once the user is logged in and redirected back to our platform, the authenticator calls the Keycloak strategy to validate the code received and exchange it for tokens. These tokens are then saved in session storage (using either Redis or cookies, depending on the configuration).
|
|
49
|
+
|
|
50
|
+
## Backend Token Validation
|
|
51
|
+
|
|
52
|
+
For the backend to validate the token properly, ensure the following environment variables are set up:
|
|
53
|
+
|
|
54
|
+
1. `AUTH0_API_AUDIENCE = cdebase` (or whatever the client audience is set in your client configuration from the Keycloak dashboard)
|
|
55
|
+
2. `AUTH0_ISSUER = https://keycloak.cdebase.dev/realms/master`
|
|
56
|
+
3. `AUTH_JWKS_URI = https://keycloak.cdebase.dev/realms/master/protocol/openid-connect/certs`
|
|
57
|
+
|
|
58
|
+
## Keycloak Admin Client
|
|
59
|
+
|
|
60
|
+
We are using the `@keycloak/keycloak-admin-client` to fetch information about user profiles and perform other data manipulations.
|
|
61
|
+
|
|
62
|
+
## Keycloak Dashboard Configuration
|
|
63
|
+
|
|
64
|
+
Following are the important points related to Keycloak dashboard configuration:
|
|
65
|
+
|
|
66
|
+
1. **Setup a new client:** Import service account roles and client scopes.
|
|
67
|
+
2. **SSO Configuration:** Configure the identity provider and set up the client ID and secret obtained from the developer's account. Set the redirect URI in the developer account of the app you are setting up (e.g., Google SSO). The redirect URI would be like this: `https://keycloak.cdebase.dev/realms/master/broker/google/endpoint`. You can copy it after you save the identity configuration.
|
|
68
|
+
3. **Profile Picture from SSO:** To get the user's profile picture from SSO, you need to define a mapper. Check this [Stack Overflow thread](https://stackoverflow.com/questions/42808008/how-to-get-current-user-profile-picture-with-keycloak) for proper configuration.
|
|
69
|
+
|
|
70
|
+
### Cleint Settings
|
|
71
|
+
|
|
72
|
+

|
|
73
|
+
|
|
74
|
+

|
|
75
|
+
|
|
76
|
+
### Client Scopes ( Custom Scope )
|
|
77
|
+
|
|
78
|
+

|
|
79
|
+
|
|
80
|
+
### SSO Configuration
|
|
81
|
+
|
|
82
|
+

|
|
83
|
+
|
|
84
|
+

|
|
85
|
+
|
|
86
|
+

|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Remix Auth Setup
|
|
4
|
+
description: Remix Auth Setup
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Remix Auth Setup ...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Remix Authentication Flow
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
The authentication flow in our Remix application involves several key steps and components. This document outlines the process, focusing on the login route, session state handling, returnTo parameter, and the callback URL.
|
|
17
|
+
|
|
18
|
+
## Login Route
|
|
19
|
+
|
|
20
|
+
The login route calls the resource API (`auth-resource`) from the `web-authentication` class via a call from a Redux epic. The purpose of this API is to set the session state and the `returnTo` URL before the login happens.
|
|
21
|
+
|
|
22
|
+
### Session State
|
|
23
|
+
|
|
24
|
+
While authenticating using Auth0, the state parameter is received and returned to us in the callback URL. We validate the response to ensure it has the correct state parameter to prevent response hijacking or modification. The `RemixAuth0Strategy` sets the session state in session storage, which is then compared during the Proof Key for Code Exchange (PKCE) process.
|
|
25
|
+
**Example Code:**
|
|
26
|
+
|
|
27
|
+
```javascript
|
|
28
|
+
const session = await sessionStorage.getSession(request.headers.get('Cookie'));
|
|
29
|
+
const state = v4(); // Generate a new state value
|
|
30
|
+
await session.set(SESSION_STATE_KEY, state); // Set the state in session storage
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### ReturnTo Parameter
|
|
34
|
+
|
|
35
|
+
The returnTo parameter is used for redirection after a successful login. For instance, if you were at a route and the session expired, or you visited the page after some time and the session was no longer valid, it will redirect you to the login page with the returnTo parameter set as a query parameter. This parameter contains the previous route, ensuring the user is redirected to their intended destination after login.
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
const returnToCookie = await getReturnToCookie();
|
|
39
|
+
const sessionStorage = await getSessionStorage({ request, context });
|
|
40
|
+
const session = await sessionStorage.getSession(request.headers.get('Cookie'));
|
|
41
|
+
const state = v4(); // Generate a new state value
|
|
42
|
+
await session.set(SESSION_STATE_KEY, state); // Set the state in session storage
|
|
43
|
+
const headers = [
|
|
44
|
+
['Set-Cookie', await sessionStorage.commitSession(session)], // Commit the session
|
|
45
|
+
['Set-Cookie', await returnToCookie.serialize(returnToPath)], // Set the returnTo cookie
|
|
46
|
+
];
|
|
47
|
+
return json({ state }, { headers });
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Callback URL
|
|
51
|
+
|
|
52
|
+
The callback URL is executed when the response comes back from Auth0. Here, we call the authenticate method of the RemixAuth strategy, which will validate the code received in the callback URL and exchange it for the idToken, accessToken, and refreshToken. These tokens are saved in our session storage. Additionally, if the returnTo cookie is set, we retrieve it and redirect to the route it contains.
|
|
53
|
+
|
|
54
|
+
```javascript
|
|
55
|
+
const session = await sessionStorage.getSession(request.headers.get('Cookie'));
|
|
56
|
+
logger.debug('Session fetched.');
|
|
57
|
+
|
|
58
|
+
session.set(SESSION_KEY, result); // Set authentication result in session
|
|
59
|
+
session.set(SESSION_STRATEGY_KEY, 'auth0');
|
|
60
|
+
logger.debug('Session updated with authentication result.');
|
|
61
|
+
|
|
62
|
+
context.store.dispatch(
|
|
63
|
+
setUserAccountDetails({ id: result.userId, auth0UserId: result.auth0UserId, profile: result.profile }),
|
|
64
|
+
);
|
|
65
|
+
logger.debug('User account details set in context store.');
|
|
66
|
+
|
|
67
|
+
let redirectPath = '';
|
|
68
|
+
if (!result.userId) {
|
|
69
|
+
logger.warn('User ID not found, redirecting to VerifyUser.');
|
|
70
|
+
redirectPath = Auth0Routes.VerifyUser;
|
|
71
|
+
} else {
|
|
72
|
+
redirectPath = returnTo;
|
|
73
|
+
logger.debug(`User authenticated, redirecting to: ${returnTo}`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
throw redirect(redirectPath, {
|
|
77
|
+
headers: [['Set-Cookie', await sessionStorage.commitSession(session)]],
|
|
78
|
+
});
|
|
79
|
+
```
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Remix Token Renewal Flow
|
|
4
|
+
description: Remix Token Renewal Flow
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Remix Token Renewal Flow ...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Remix Token Renewal Flow
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
The renewal of tokens happens at two key points in our system: within the Remix middleware and during GraphQL server requests. This document details both processes, ensuring that tokens are renewed as needed to maintain user authentication.
|
|
17
|
+
|
|
18
|
+
### Token Renewal at remix
|
|
19
|
+
|
|
20
|
+
The middleware in Remix checks if a route is protected and whether the user has the necessary rights to access the page. If the user is not authenticated or if their idToken has expired, the middleware attempts to renew the token.
|
|
21
|
+
|
|
22
|
+
```javascript
|
|
23
|
+
// File Location: https://github.com/CDEBase/adminIde-stack/blob/508f42f4dffa5e40f612c68120b1d875be1b644c/packages-modules/user-auth0/client/src/auth/RemixAuth0Authenticator.server.ts#L82
|
|
24
|
+
|
|
25
|
+
let authInfo = await this.isAuthenticated(request);
|
|
26
|
+
if (!authInfo) {
|
|
27
|
+
return { sessionInfo: null, redirect: config.LOGIN_PATH }; // Consider using failureRedirect option
|
|
28
|
+
}
|
|
29
|
+
const { expiresAt, refreshToken, rememberMe = false } = authInfo as SessionCookiePayload;
|
|
30
|
+
if (this.isTokenValid(expiresAt)) {
|
|
31
|
+
return { sessionInfo: authInfo };
|
|
32
|
+
}
|
|
33
|
+
if (this.canRenewToken({ expiresAt, rememberMe })) {
|
|
34
|
+
let result;
|
|
35
|
+
try {
|
|
36
|
+
result = await this.getNewToken(refreshToken);
|
|
37
|
+
} catch (err) {
|
|
38
|
+
console.error('RenewToken failed!', err);
|
|
39
|
+
throw new Error(AuthErrors.ResponseNotSuccessful);
|
|
40
|
+
}
|
|
41
|
+
if (result && result.data && result.data.renewAuthUsingRefreshToken) {
|
|
42
|
+
const renewedIdToken = result.data.renewAuthUsingRefreshToken.idToken;
|
|
43
|
+
const renewedAccessToken = result.data.renewAuthUsingRefreshToken.accessToken;
|
|
44
|
+
const decodedJwt = jwtDecode(renewedIdToken);
|
|
45
|
+
let newExpiryTime = decodedJwt.exp;
|
|
46
|
+
// make use of given expiresIn, if not available use default 8 hours
|
|
47
|
+
if (config.isDev) {
|
|
48
|
+
// this is only for logging purpose until we see both are equal
|
|
49
|
+
const expiresIn = result.data.renewAuthUsingRefreshToken.expiresIn;
|
|
50
|
+
const currentTime = Math.floor(Date.now() / 1000);
|
|
51
|
+
const calculatedExpiresAt = currentTime + expiresIn;
|
|
52
|
+
|
|
53
|
+
console.log(
|
|
54
|
+
'--- calculatedExpiresAt: ',
|
|
55
|
+
calculatedExpiresAt,
|
|
56
|
+
'--- jwtDecoded.exp: ',
|
|
57
|
+
newExpiryTime,
|
|
58
|
+
);
|
|
59
|
+
// above one giving 24 hours but jwt is not created that long.
|
|
60
|
+
console.log('--- setting to jwtDecoded.exp until they both gives equal');
|
|
61
|
+
}
|
|
62
|
+
const session = await this.sessionStore.getSession(request.headers.get('Cookie'));
|
|
63
|
+
const sessionPayload = session.get(SESSION_KEY);
|
|
64
|
+
const renewedSessionInfo = {
|
|
65
|
+
...sessionPayload,
|
|
66
|
+
idToken: renewedIdToken,
|
|
67
|
+
expiresAt: newExpiryTime,
|
|
68
|
+
accessToken: renewedAccessToken,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
if (!renewedIdToken) {
|
|
72
|
+
return { sessionInfo: null, redirect: config.LOGIN_PATH, expireCookie: true };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return { sessionInfo: renewedSessionInfo, renewed: true }; // Ensuring redirect logic is clear
|
|
76
|
+
} else {
|
|
77
|
+
return { sessionInfo: null, redirect: config.LOGIN_PATH };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return { sessionInfo: null, redirect: config.LOGIN_PATH, expireCookie: true };
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Token Renewal at Graphql endpoint.
|
|
85
|
+
|
|
86
|
+
The second place where token renewal occurs is within the middleware executed on the GraphQL server. This ensures that tokens are renewed even if the user has been on the same page for longer than the token expiration time, as the Remix middleware won't execute in this case.
|
|
87
|
+
|
|
88
|
+
```javascript
|
|
89
|
+
// File location: https://github.com/CDEBase/adminIde-stack/blob/508f42f4dffa5e40f612c68120b1d875be1b644c/packages-modules/user-auth0/server/src/auth/auth0/auth0RenewTokenHelper.ts#L35
|
|
90
|
+
|
|
91
|
+
export const auth0RenewTokenHelper = async (requestResponsePair, logger: CdmLogger.ILogger) => {
|
|
92
|
+
try {
|
|
93
|
+
const { req, res } = requestResponsePair;
|
|
94
|
+
const sessionStorage = await getSessionStorage({
|
|
95
|
+
request: req,
|
|
96
|
+
context: { redisClient: req.redisClient } as IAppLoadContext,
|
|
97
|
+
});
|
|
98
|
+
const session = await sessionStorage.getSession(req.headers['cookie']);
|
|
99
|
+
|
|
100
|
+
const sessionPayload = session.get(SESSION_KEY);
|
|
101
|
+
logger.trace('(auth0RenewTokenHelper) session cookie payload: [%j]', sessionPayload);
|
|
102
|
+
|
|
103
|
+
const idToken = sessionPayload?.idToken;
|
|
104
|
+
const expiresAt = sessionPayload?.expiresAt;
|
|
105
|
+
const refreshToken = sessionPayload?.refreshToken;
|
|
106
|
+
logger.trace(
|
|
107
|
+
`(auth0RenewTokenHelper) ID Token: ${
|
|
108
|
+
idToken ? '********' : 'None'
|
|
109
|
+
}, Expires At: ${expiresAt}, Refresh Token: ${refreshToken ? '********' : 'None'}`,
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
const isRenewApplicable = canRenewToken(session, logger);
|
|
113
|
+
logger.trace(`(auth0RenewTokenHelper) Is token renewal applicable? ${isRenewApplicable}`);
|
|
114
|
+
|
|
115
|
+
if (isRenewApplicable) {
|
|
116
|
+
const result = await renewAuthUsingRefreshToken(refreshToken, logger);
|
|
117
|
+
const renewedIdToken = result?.idToken;
|
|
118
|
+
const renewedAccessToken = result?.accessToken;
|
|
119
|
+
logger.trace(
|
|
120
|
+
'(auth0RenewTokenHelper) Token renewed using refresh token:',
|
|
121
|
+
renewedIdToken ? '********' : 'None',
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
if (renewedIdToken) {
|
|
125
|
+
const decodedJwt = jwtDecode(renewedIdToken);
|
|
126
|
+
const newExpiryTime = decodedJwt.exp;
|
|
127
|
+
logger.trace(`(auth0RenewTokenHelper) New token expiry time: ${newExpiryTime}`);
|
|
128
|
+
|
|
129
|
+
await session.set(SESSION_KEY, {
|
|
130
|
+
...sessionPayload,
|
|
131
|
+
idToken: renewedIdToken,
|
|
132
|
+
expiresAt: newExpiryTime * 1000,
|
|
133
|
+
accessToken: renewedAccessToken,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const updatedSession = await sessionStorage.commitSession(session);
|
|
137
|
+
|
|
138
|
+
if (updatedSession) {
|
|
139
|
+
res.setHeader('Set-Cookie', updatedSession);
|
|
140
|
+
req.headers['authorization'] = `Bearer ${renewedIdToken}`; // Update authorization header for the current request
|
|
141
|
+
logger.trace('(auth0RenewTokenHelper) Token renewal successful, headers updated');
|
|
142
|
+
} else {
|
|
143
|
+
logger.error('(auth0RenewTokenHelper) Updated session is undefined');
|
|
144
|
+
throw new Error('Failed to update session');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
} else {
|
|
148
|
+
logger.trace('(auth0RenewTokenHelper) Token is not renewable');
|
|
149
|
+
throw new Error('Failed to renew token');
|
|
150
|
+
}
|
|
151
|
+
} catch (error) {
|
|
152
|
+
logger.error(error, '(auth0RenewTokenHelper) AUTH RENEW TOKEN ERROR:');
|
|
153
|
+
throw new AuthRenewTokenError();
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
```
|