@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.
Files changed (367) hide show
  1. package/LICENSE +21 -0
  2. package/lib/components/Logo.d.ts +4 -0
  3. package/lib/components/Logo.d.ts.map +1 -0
  4. package/lib/components/Logo.js +16 -0
  5. package/lib/components/Logo.js.map +1 -0
  6. package/lib/components/help/SidebarSearch.d.ts +8 -0
  7. package/lib/components/help/SidebarSearch.d.ts.map +1 -0
  8. package/lib/components/help/SidebarSearch.js +111 -0
  9. package/lib/components/help/SidebarSearch.js.map +1 -0
  10. package/lib/components/help/index.d.ts +2 -0
  11. package/lib/components/help/index.d.ts.map +1 -0
  12. package/lib/components/landing/FeatureCard.d.ts +13 -0
  13. package/lib/components/landing/FeatureCard.d.ts.map +1 -0
  14. package/lib/components/landing/FeatureCard.js +85 -0
  15. package/lib/components/landing/FeatureCard.js.map +1 -0
  16. package/lib/components/landing/QuickLinkCard.d.ts +8 -0
  17. package/lib/components/landing/QuickLinkCard.d.ts.map +1 -0
  18. package/lib/components/landing/QuickLinkCard.js +26 -0
  19. package/lib/components/landing/QuickLinkCard.js.map +1 -0
  20. package/lib/components/landing/SearchInput.d.ts +10 -0
  21. package/lib/components/landing/SearchInput.d.ts.map +1 -0
  22. package/lib/components/landing/SearchInput.js +223 -0
  23. package/lib/components/landing/SearchInput.js.map +1 -0
  24. package/lib/components/landing/index.d.ts +4 -0
  25. package/lib/components/landing/index.d.ts.map +1 -0
  26. package/lib/components/welcome.d.ts +3 -0
  27. package/lib/components/welcome.d.ts.map +1 -0
  28. package/lib/compute.d.ts +4 -0
  29. package/lib/compute.d.ts.map +1 -0
  30. package/lib/compute.js +96 -0
  31. package/lib/compute.js.map +1 -0
  32. package/lib/config/env-config.d.ts +4 -0
  33. package/lib/config/env-config.d.ts.map +1 -0
  34. package/lib/config/env-config.js +7 -0
  35. package/lib/config/env-config.js.map +1 -0
  36. package/lib/docs.config.d.ts +48 -0
  37. package/lib/docs.config.d.ts.map +1 -0
  38. package/lib/index.d.ts +4 -0
  39. package/lib/index.d.ts.map +1 -0
  40. package/lib/index.js +2 -0
  41. package/lib/index.js.map +1 -0
  42. package/lib/loaders/search.d.ts +1 -0
  43. package/lib/loaders/search.d.ts.map +1 -0
  44. package/lib/module.d.ts +4 -0
  45. package/lib/module.d.ts.map +1 -0
  46. package/lib/module.js +11 -0
  47. package/lib/module.js.map +1 -0
  48. package/lib/pages/ArticlePage/ArticlePage.d.ts +4 -0
  49. package/lib/pages/ArticlePage/ArticlePage.d.ts.map +1 -0
  50. package/lib/pages/ArticlePage/ArticlePage.js +222 -0
  51. package/lib/pages/ArticlePage/ArticlePage.js.map +1 -0
  52. package/lib/pages/ArticlePage/index.d.ts +3 -0
  53. package/lib/pages/ArticlePage/index.d.ts.map +1 -0
  54. package/lib/pages/ArticlePage/index.js +3 -0
  55. package/lib/pages/ArticlePage/index.js.map +1 -0
  56. package/lib/pages/CategoryCollection/CategoryCollection.d.ts +4 -0
  57. package/lib/pages/CategoryCollection/CategoryCollection.d.ts.map +1 -0
  58. package/lib/pages/CategoryCollection/CategoryCollection.js +103 -0
  59. package/lib/pages/CategoryCollection/CategoryCollection.js.map +1 -0
  60. package/lib/pages/CategoryCollection/index.d.ts +3 -0
  61. package/lib/pages/CategoryCollection/index.d.ts.map +1 -0
  62. package/lib/pages/CategoryCollection/index.js +3 -0
  63. package/lib/pages/CategoryCollection/index.js.map +1 -0
  64. package/lib/pages/Help/HelpIndex.d.ts +4 -0
  65. package/lib/pages/Help/HelpIndex.d.ts.map +1 -0
  66. package/lib/pages/Help/HelpIndex.js +44 -0
  67. package/lib/pages/Help/HelpIndex.js.map +1 -0
  68. package/lib/pages/Help/index.d.ts +4 -0
  69. package/lib/pages/Help/index.d.ts.map +1 -0
  70. package/lib/pages/Help/index.js +226 -0
  71. package/lib/pages/Help/index.js.map +1 -0
  72. package/lib/pages/Landing/index.d.ts +3 -0
  73. package/lib/pages/Landing/index.d.ts.map +1 -0
  74. package/lib/pages/Landing/index.js +281 -0
  75. package/lib/pages/Landing/index.js.map +1 -0
  76. package/lib/routes.json +2533 -0
  77. package/lib/seo.d.ts +22 -0
  78. package/lib/seo.d.ts.map +1 -0
  79. package/lib/slot-fill/FooterFill.d.ts +3 -0
  80. package/lib/slot-fill/FooterFill.d.ts.map +1 -0
  81. package/lib/slot-fill/FooterFill.js +18 -0
  82. package/lib/slot-fill/FooterFill.js.map +1 -0
  83. package/lib/slot-fill/LogoFill.d.ts +5 -0
  84. package/lib/slot-fill/LogoFill.d.ts.map +1 -0
  85. package/lib/slot-fill/LogoFill.js +74 -0
  86. package/lib/slot-fill/LogoFill.js.map +1 -0
  87. package/lib/slot-fill/consts.d.ts +5 -0
  88. package/lib/slot-fill/consts.d.ts.map +1 -0
  89. package/lib/slot-fill/consts.js +1 -0
  90. package/lib/slot-fill/consts.js.map +1 -0
  91. package/lib/slot-fill/index.d.ts +4 -0
  92. package/lib/slot-fill/index.d.ts.map +1 -0
  93. package/lib/templates/assets/images/add-link-frontend.png +0 -0
  94. package/lib/templates/assets/images/add-package-backend.png +0 -0
  95. package/lib/templates/assets/images/add-to-backend-module.png +0 -0
  96. package/lib/templates/assets/images/add-upload-client-frontend.png +0 -0
  97. package/lib/templates/assets/images/additional-parameters.png +0 -0
  98. package/lib/templates/assets/images/aeh-implementation.png +0 -0
  99. package/lib/templates/assets/images/aeh-usage.png +0 -0
  100. package/lib/templates/assets/images/apollo-client/recommendation_cache_mgmt.png +0 -0
  101. package/lib/templates/assets/images/app-deploy-new-version/jenkins1.PNG +0 -0
  102. package/lib/templates/assets/images/app-deploy-new-version/jenkins2.PNG +0 -0
  103. package/lib/templates/assets/images/auth-wrapper-code.png +0 -0
  104. package/lib/templates/assets/images/cdebase.png +0 -0
  105. package/lib/templates/assets/images/cdm-locales-directory.png +0 -0
  106. package/lib/templates/assets/images/client-settings.png +0 -0
  107. package/lib/templates/assets/images/codegen_file_update.png +0 -0
  108. package/lib/templates/assets/images/configuration.png +0 -0
  109. package/lib/templates/assets/images/copy-plugin.png +0 -0
  110. package/lib/templates/assets/images/docusaurus.png +0 -0
  111. package/lib/templates/assets/images/error-link.png +0 -0
  112. package/lib/templates/assets/images/error-sample.png +0 -0
  113. package/lib/templates/assets/images/extension copy.png +0 -0
  114. package/lib/templates/assets/images/extension.png +0 -0
  115. package/lib/templates/assets/images/graphql/graphql-folder-backend.png +0 -0
  116. package/lib/templates/assets/images/graphql/graphql-folder-with-gql.png +0 -0
  117. package/lib/templates/assets/images/i18n-config.png +0 -0
  118. package/lib/templates/assets/images/image.png +0 -0
  119. package/lib/templates/assets/images/logo.svg +10 -0
  120. package/lib/templates/assets/images/logo1.svg +1 -0
  121. package/lib/templates/assets/images/modify-upload-false-server.png +0 -0
  122. package/lib/templates/assets/images/navigation-auth-enabled.png +0 -0
  123. package/lib/templates/assets/images/org-dashboard-navigation.png +0 -0
  124. package/lib/templates/assets/images/org-navigation.png +0 -0
  125. package/lib/templates/assets/images/preferences_graphql_type.png +0 -0
  126. package/lib/templates/assets/images/provider.png +0 -0
  127. package/lib/templates/assets/images/route-config.png +0 -0
  128. package/lib/templates/assets/images/service-accounts.png +0 -0
  129. package/lib/templates/assets/images/source-code/source-code-environments.png +0 -0
  130. package/lib/templates/assets/images/source-code/source-code-organization.png +0 -0
  131. package/lib/templates/assets/images/spin-clone-develop-deployment/jenkins-changes.png +0 -0
  132. package/lib/templates/assets/images/spin-clone-develop-deployment/lerna-changes.png +0 -0
  133. package/lib/templates/assets/images/spin-clone-develop-deployment/root-package-json-changes.png +0 -0
  134. package/lib/templates/assets/images/spin-clone-develop-deployment/values-dev-changes.png +0 -0
  135. package/lib/templates/assets/images/sso-mappers.png +0 -0
  136. package/lib/templates/assets/images/sso-picture-mapper.png +0 -0
  137. package/lib/templates/assets/images/sso-settings.png +0 -0
  138. package/lib/templates/assets/images/timesheet_apollo_cache.png +0 -0
  139. package/lib/templates/assets/images/timesheet_query.png +0 -0
  140. package/lib/templates/assets/images/tutorial/docsVersionDropdown.png +0 -0
  141. package/lib/templates/assets/images/tutorial/localeDropdown.png +0 -0
  142. package/lib/templates/assets/images/unauthenticated.png +0 -0
  143. package/lib/templates/assets/images/undraw_docusaurus_mountain.svg +170 -0
  144. package/lib/templates/assets/images/undraw_docusaurus_react.svg +169 -0
  145. package/lib/templates/assets/images/undraw_docusaurus_tree.svg +1 -0
  146. package/lib/templates/assets/images/vite-plugin-config.png +0 -0
  147. package/lib/templates/content/docs/Generators/Project/generate-fullproject.md +12 -0
  148. package/lib/templates/content/docs/LLM/Logger.llm.md +194 -0
  149. package/lib/templates/content/docs/LLM/backend-proxies-services-llm.md +2687 -0
  150. package/lib/templates/content/docs/LLM/backend-service-llm.md +3384 -0
  151. package/lib/templates/content/docs/LLM/db_migration_llm.md +954 -0
  152. package/lib/templates/content/docs/LLM/frontend/REMIX-15.3-upgrade-llm.md +1245 -0
  153. package/lib/templates/content/docs/LLM/inngest/INNGEST_FUNCTION_DEVELOPMENT_GUIDE_LLM.md +1241 -0
  154. package/lib/templates/content/docs/LLM/inngest/INNGEST_NAMESPACE_LLM.md +384 -0
  155. package/lib/templates/content/docs/LLM/llm_workflow_namespace.md +384 -0
  156. package/lib/templates/content/docs/LLM/organization-components-form-llm.md +1395 -0
  157. package/lib/templates/content/docs/LLM/page-component-llm.md +173 -0
  158. package/lib/templates/content/docs/LLM/preferences-settings-llm.md +2781 -0
  159. package/lib/templates/content/docs/LLM/tailwind-css-llm.md +502 -0
  160. package/lib/templates/content/docs/UI/SchemaBasedUI.md +334 -0
  161. package/lib/templates/content/docs/UI/SlotFillComponent.md +334 -0
  162. package/lib/templates/content/docs/adminide-modules/account/auth0-login.md +31 -0
  163. package/lib/templates/content/docs/adminide-modules/account/index.md +14 -0
  164. package/lib/templates/content/docs/adminide-modules/account/keycloak-remix-setup.md +86 -0
  165. package/lib/templates/content/docs/adminide-modules/account/remix-auth-setup.md +79 -0
  166. package/lib/templates/content/docs/adminide-modules/account/various-auth-qatest.md +157 -0
  167. package/lib/templates/content/docs/adminide-modules/api-builders/graphql.md +906 -0
  168. package/lib/templates/content/docs/adminide-modules/billing/payments/index.md +14 -0
  169. package/lib/templates/content/docs/adminide-modules/billing/payments/stripe/index.md +14 -0
  170. package/lib/templates/content/docs/adminide-modules/billing/payments/stripe/settingup-stripe-locally.md +25 -0
  171. package/lib/templates/content/docs/adminide-modules/billing/tier-config.md +293 -0
  172. package/lib/templates/content/docs/adminide-modules/connectors/Connector.md +207 -0
  173. package/lib/templates/content/docs/adminide-modules/file-upload/index.md +16 -0
  174. package/lib/templates/content/docs/adminide-modules/file-upload/setup.md +435 -0
  175. package/lib/templates/content/docs/adminide-modules/file-upload/upload-file-using-signed-url.md +161 -0
  176. package/lib/templates/content/docs/adminide-modules/preferences/AddAdditionalPermissions.md +151 -0
  177. package/lib/templates/content/docs/adminide-modules/preferences/Configuration.md +241 -0
  178. package/lib/templates/content/docs/adminide-modules/preferences/Policy-Configuration.md +61 -0
  179. package/lib/templates/content/docs/adminide-modules/preferences/UI-components/ResourceSettingsLoader.md +319 -0
  180. package/lib/templates/content/docs/adminide-modules/preferences/contribute_scope_target.md +280 -0
  181. package/lib/templates/content/docs/adminide-modules/preferences/generate-urii.md +94 -0
  182. package/lib/templates/content/docs/adminide-modules/preferences/index.md +28 -0
  183. package/lib/templates/content/docs/adminide-modules/preferences/machine-configuration.md +157 -0
  184. package/lib/templates/content/docs/adminide-modules/preferences/pageSettings/generateCdecodeUri.md +1289 -0
  185. package/lib/templates/content/docs/adminide-modules/preferences/pageSettings/migratingFromUseSettings.md +215 -0
  186. package/lib/templates/content/docs/adminide-modules/preferences/permissions/Roles-Permissions.md +72 -0
  187. package/lib/templates/content/docs/adminide-modules/preferences/permissions/settingUserPermissions.md +139 -0
  188. package/lib/templates/content/docs/adminide-modules/preferences/preference-dependency.md +138 -0
  189. package/lib/templates/content/docs/adminide-modules/preferences/route-based-configuration.md +41 -0
  190. package/lib/templates/content/docs/adminide-modules/preferences/schema-configuration.md +71 -0
  191. package/lib/templates/content/docs/adminide-modules/preferences/supported.md +24 -0
  192. package/lib/templates/content/docs/adminide-modules/preferences/useSettingsLoader.md +248 -0
  193. package/lib/templates/content/docs/adminide-modules/project-tools/auth-providers.md +1317 -0
  194. package/lib/templates/content/docs/adminide-modules/project-tools/keycloak-guide.md +543 -0
  195. package/lib/templates/content/docs/adminide-modules/project-tools/tenant-management/tenant-based-authentication.md +846 -0
  196. package/lib/templates/content/docs/adminide-modules/project-tools/tenant-management/tenant-management.md +708 -0
  197. package/lib/templates/content/docs/adminide-modules/project-tools/tenant-management/tenants.md +1117 -0
  198. package/lib/templates/content/docs/chrome-extension/index.md +14 -0
  199. package/lib/templates/content/docs/chrome-extension/setup.md +30 -0
  200. package/lib/templates/content/docs/contributing/adding-package.md +23 -0
  201. package/lib/templates/content/docs/contributing/adding_new_modules.md +99 -0
  202. package/lib/templates/content/docs/contributing/architecture-updates.md +19 -0
  203. package/lib/templates/content/docs/contributing/avoid-using-promises-ui.md +116 -0
  204. package/lib/templates/content/docs/contributing/coding-guidelines.md +111 -0
  205. package/lib/templates/content/docs/contributing/do-and-dont.md +42 -0
  206. package/lib/templates/content/docs/contributing/faq.md +22 -0
  207. package/lib/templates/content/docs/contributing/folder-setup/browser.md +12 -0
  208. package/lib/templates/content/docs/contributing/folder-setup/config.md +12 -0
  209. package/lib/templates/content/docs/contributing/folder-setup/containers-server.md +12 -0
  210. package/lib/templates/content/docs/contributing/folder-setup/core.md +12 -0
  211. package/lib/templates/content/docs/contributing/folder-setup/graphql.md +12 -0
  212. package/lib/templates/content/docs/contributing/folder-setup/index.md +30 -0
  213. package/lib/templates/content/docs/contributing/folder-setup/module.md +12 -0
  214. package/lib/templates/content/docs/contributing/folder-setup/server.md +12 -0
  215. package/lib/templates/content/docs/contributing/folder-setup/services.md +12 -0
  216. package/lib/templates/content/docs/contributing/folder-setup/store.md +12 -0
  217. package/lib/templates/content/docs/contributing/frontend-coding.md +30 -0
  218. package/lib/templates/content/docs/contributing/git-subtree-sharing.md +73 -0
  219. package/lib/templates/content/docs/contributing/graphql-subscriptions.md +69 -0
  220. package/lib/templates/content/docs/contributing/how-to-contribute.md +30 -0
  221. package/lib/templates/content/docs/contributing/how_to_check_pure_esm.md +29 -0
  222. package/lib/templates/content/docs/contributing/index.md +60 -0
  223. package/lib/templates/content/docs/contributing/installation-issues.md +23 -0
  224. package/lib/templates/content/docs/contributing/keyboard-shortcut.md +131 -0
  225. package/lib/templates/content/docs/contributing/language/locale-support.md +12 -0
  226. package/lib/templates/content/docs/contributing/lerna-build-tools.md +516 -0
  227. package/lib/templates/content/docs/contributing/lerna-yarn-workspaces.md +95 -0
  228. package/lib/templates/content/docs/contributing/lint-and-formatter.md +20 -0
  229. package/lib/templates/content/docs/contributing/mobile-setup.md +16 -0
  230. package/lib/templates/content/docs/contributing/project-setup.md +233 -0
  231. package/lib/templates/content/docs/contributing/react/index.md +14 -0
  232. package/lib/templates/content/docs/contributing/react/lazy-component.md +70 -0
  233. package/lib/templates/content/docs/contributing/run-various-options.md +124 -0
  234. package/lib/templates/content/docs/contributing/schema-first-graphql-types.md +37 -0
  235. package/lib/templates/content/docs/contributing/source-code-organization.md +57 -0
  236. package/lib/templates/content/docs/contributing/staging-docker.md +88 -0
  237. package/lib/templates/content/docs/contributing/third-party/apollo-client-v3-tutorials.md +28 -0
  238. package/lib/templates/content/docs/contributing/third-party/index.md +18 -0
  239. package/lib/templates/content/docs/contributing/typescript-contribution.md +16 -0
  240. package/lib/templates/content/docs/devops/app-deploy-new-version.md +30 -0
  241. package/lib/templates/content/docs/devops/index.md +14 -0
  242. package/lib/templates/content/docs/devops/mobile-jenkins-build.md +40 -0
  243. package/lib/templates/content/docs/devops/versioning-the-project.md +128 -0
  244. package/lib/templates/content/docs/error-handler/application-error-handler.md +40 -0
  245. package/lib/templates/content/docs/error-handler/error-handling.md +26 -0
  246. package/lib/templates/content/docs/error-handler/index.md +16 -0
  247. package/lib/templates/content/docs/error-handler/logging-errors.md +14 -0
  248. package/lib/templates/content/docs/feature-api/copy-operation.md +427 -0
  249. package/lib/templates/content/docs/feature-api/feature-browser/assets.md +46 -0
  250. package/lib/templates/content/docs/feature-api/feature-browser/auth-permissions.md +12 -0
  251. package/lib/templates/content/docs/feature-api/feature-browser/feature.md +131 -0
  252. package/lib/templates/content/docs/feature-api/feature-browser/index.md +22 -0
  253. package/lib/templates/content/docs/feature-api/feature-browser/routes-menu.md +110 -0
  254. package/lib/templates/content/docs/feature-api/feature-browser/routing-convention.md +124 -0
  255. package/lib/templates/content/docs/feature-api/feature-browser/routing.md +338 -0
  256. package/lib/templates/content/docs/feature-api/feature-mobile/auth-permissions.md +20 -0
  257. package/lib/templates/content/docs/feature-api/feature-mobile/feature.md +130 -0
  258. package/lib/templates/content/docs/feature-api/feature-mobile/index.md +18 -0
  259. package/lib/templates/content/docs/feature-api/feature-mobile/navigation.md +187 -0
  260. package/lib/templates/content/docs/feature-api/feature-server/Scheduling.md +44 -0
  261. package/lib/templates/content/docs/feature-api/feature-server/dataloader.md +320 -0
  262. package/lib/templates/content/docs/feature-api/feature-server/dependency-injection.md +81 -0
  263. package/lib/templates/content/docs/feature-api/feature-server/feature.md +65 -0
  264. package/lib/templates/content/docs/feature-api/feature-server/generic-dataloader.md +135 -0
  265. package/lib/templates/content/docs/feature-api/feature-server/index.md +40 -0
  266. package/lib/templates/content/docs/feature-api/feature-server/migration.md +127 -0
  267. package/lib/templates/content/docs/feature-api/feature-server/mongo-model.md +72 -0
  268. package/lib/templates/content/docs/feature-api/feature-server/permissions.md +12 -0
  269. package/lib/templates/content/docs/feature-api/feature-server/policies.md +57 -0
  270. package/lib/templates/content/docs/feature-api/feature-server/preferences.md +57 -0
  271. package/lib/templates/content/docs/feature-api/feature-server/repositories.md +114 -0
  272. package/lib/templates/content/docs/feature-api/feature-server/resolvers.md +126 -0
  273. package/lib/templates/content/docs/feature-api/feature-server/rules.md +132 -0
  274. package/lib/templates/content/docs/feature-api/feature-server/schema.md +12 -0
  275. package/lib/templates/content/docs/feature-api/feature-server/services.md +102 -0
  276. package/lib/templates/content/docs/feature-api/feature-server/setup-resource-crud.md +359 -0
  277. package/lib/templates/content/docs/feature-api/index.md +18 -0
  278. package/lib/templates/content/docs/graphql/apolloClient-mutation.md +94 -0
  279. package/lib/templates/content/docs/graphql/index.md +14 -0
  280. package/lib/templates/content/docs/graphql/scalars.md +15 -0
  281. package/lib/templates/content/docs/help/index.md +14 -0
  282. package/lib/templates/content/docs/help/intro.md +16 -0
  283. package/lib/templates/content/docs/intl/ant-design-menu-translation.md +74 -0
  284. package/lib/templates/content/docs/intl/intl-namespace.md +129 -0
  285. package/lib/templates/content/docs/intl/vite-plugin-intl.md +87 -0
  286. package/lib/templates/content/docs/intl/webpack-plugin-intl.md +12 -0
  287. package/lib/templates/content/docs/intro.md +18 -0
  288. package/lib/templates/content/docs/knowledge/basic-fullstack.md +238 -0
  289. package/lib/templates/content/docs/mailing/index.md +14 -0
  290. package/lib/templates/content/docs/mailing/mailing-template.md +148 -0
  291. package/lib/templates/content/docs/mobile/App-navigation-generator.md +410 -0
  292. package/lib/templates/content/docs/mobile/MobileTestCases.md +264 -0
  293. package/lib/templates/content/docs/mobile/eas-profile-build.md +107 -0
  294. package/lib/templates/content/docs/mobile/expo-push-notification-setup.md +216 -0
  295. package/lib/templates/content/docs/mobile/index.md +14 -0
  296. package/lib/templates/content/docs/mobile/routes.md +83 -0
  297. package/lib/templates/content/docs/organization/adding-account-context.md +116 -0
  298. package/lib/templates/content/docs/organization/adding-org-mobile-navigation.md +22 -0
  299. package/lib/templates/content/docs/organization/adding-org-web-navigation.md +12 -0
  300. package/lib/templates/content/docs/organization/index.md +20 -0
  301. package/lib/templates/content/docs/organization/initialization.md +20 -0
  302. package/lib/templates/content/docs/organization/organization-resource-vs-resource.md +112 -0
  303. package/lib/templates/content/docs/remix/configuration/component-structure-best-practices.md +152 -0
  304. package/lib/templates/content/docs/remix/configuration/configurations.md +218 -0
  305. package/lib/templates/content/docs/remix/configuration/css-import-and-stylesheets.md +142 -0
  306. package/lib/templates/content/docs/remix/configuration/dont-subcomponent-network.md +166 -0
  307. package/lib/templates/content/docs/remix/configuration/generated-data-loaders.md +122 -0
  308. package/lib/templates/content/docs/remix/configuration/generated-resource-loaders.md +257 -0
  309. package/lib/templates/content/docs/remix/configuration/query-params-generator.md +216 -0
  310. package/lib/templates/content/docs/remix/configuration/routes-extra-icons.md +103 -0
  311. package/lib/templates/content/docs/remix/configuration/routes-json-advanced.md +86 -0
  312. package/lib/templates/content/docs/remix/configuration/routes-json-auth.md +113 -0
  313. package/lib/templates/content/docs/remix/configuration/routes-json-best-practices.md +55 -0
  314. package/lib/templates/content/docs/remix/configuration/routes-json-fields.md +79 -0
  315. package/lib/templates/content/docs/remix/configuration/routes-json-graphql.md +79 -0
  316. package/lib/templates/content/docs/remix/configuration/routes-json-index.md +112 -0
  317. package/lib/templates/content/docs/remix/configuration/routes-json-loaders.md +165 -0
  318. package/lib/templates/content/docs/remix/configuration/routes-json-middleware.md +196 -0
  319. package/lib/templates/content/docs/remix/configuration/routes-json-overview.md +53 -0
  320. package/lib/templates/content/docs/remix/data-loaders.md +43 -0
  321. package/lib/templates/content/docs/remix/devtools/remix-devtools.md +58 -0
  322. package/lib/templates/content/docs/remix/examples/changes-using-servercode.md +79 -0
  323. package/lib/templates/content/docs/remix/extra-icons.md +62 -0
  324. package/lib/templates/content/docs/remix/extra-links.md +65 -0
  325. package/lib/templates/content/docs/remix/generated-data-loaders.md +114 -0
  326. package/lib/templates/content/docs/remix/queryParamsGenerator.md +89 -0
  327. package/lib/templates/content/docs/remix/resources.md +16 -0
  328. package/lib/templates/content/docs/remix/styles.md +132 -0
  329. package/lib/templates/content/docs/remix/wiki.md +12 -0
  330. package/lib/templates/content/docs/security/auth-wrapper/auth-wrapper.md +24 -0
  331. package/lib/templates/content/docs/security/index.md +18 -0
  332. package/lib/templates/content/docs/security/secure-button-mobilenative.md +88 -0
  333. package/lib/templates/content/docs/security/secure-button-web.md +89 -0
  334. package/lib/templates/content/docs/server-side/account-customization.md +82 -0
  335. package/lib/templates/content/docs/server-side/apollo/caching.md +164 -0
  336. package/lib/templates/content/docs/server-side/backend-architecture/FINAL-DECISION.md +209 -0
  337. package/lib/templates/content/docs/server-side/backend-architecture/TRUE-FINAL-ARCHITECTURE.md +603 -0
  338. package/lib/templates/content/docs/server-side/backend-architecture/index1.md +0 -0
  339. package/lib/templates/content/docs/server-side/backend-coding.md +839 -0
  340. package/lib/templates/content/docs/server-side/e2b/manageing-template.md +197 -0
  341. package/lib/templates/content/docs/server-side/index.md +14 -0
  342. package/lib/templates/content/docs/server-side/inngest-functions-module.md +309 -0
  343. package/lib/templates/content/docs/server-side/listen-stripe-events.md +43 -0
  344. package/lib/templates/content/docs/server-side/slug-service.md +323 -0
  345. package/lib/templates/content/docs/tests/index.md +18 -0
  346. package/lib/templates/content/docs/tests/jest-test-debug-vscode.md +40 -0
  347. package/lib/templates/content/docs/tests/known-errors.md +116 -0
  348. package/lib/templates/content/docs/tests/service-test-template.md +118 -0
  349. package/lib/templates/content/docs/tests/test-setup.md +93 -0
  350. package/lib/templates/content/docs/xstate.md +23 -0
  351. package/lib/types.d.ts +37 -0
  352. package/lib/types.d.ts.map +1 -0
  353. package/lib/utils/docsNavigation.d.ts +9 -0
  354. package/lib/utils/docsNavigation.d.ts.map +1 -0
  355. package/lib/utils/docsNavigation.js +37 -0
  356. package/lib/utils/docsNavigation.js.map +1 -0
  357. package/lib/utils/helpCenterUtils.d.ts +26 -0
  358. package/lib/utils/helpCenterUtils.d.ts.map +1 -0
  359. package/lib/utils/index.d.ts +3 -0
  360. package/lib/utils/index.d.ts.map +1 -0
  361. package/lib/utils/index.js +3 -0
  362. package/lib/utils/index.js.map +1 -0
  363. package/lib/utils/markdownLoader.d.ts +36 -0
  364. package/lib/utils/markdownLoader.d.ts.map +1 -0
  365. package/lib/utils/markdownLoader.js +2242 -0
  366. package/lib/utils/markdownLoader.js.map +1 -0
  367. package/package.json +71 -0
@@ -0,0 +1,708 @@
1
+ # Tenant Management System - Complete Setup & Usage Guide
2
+
3
+ ## Table of Contents
4
+
5
+ 1. [Overview](#overview)
6
+ 2. [Prerequisites](#prerequisites)
7
+ 3. [Creating a Tenant](#creating-a-tenant)
8
+ 4. [Understanding API Keys (Client Configurations)](#understanding-api-keys-client-configurations)
9
+ 5. [Authentication & Usage](#authentication--usage)
10
+ 6. [Managing Tenants](#managing-tenants)
11
+ 7. [API Integration Examples](#api-integration-examples)
12
+ 8. [Troubleshooting](#troubleshooting)
13
+
14
+ ---
15
+
16
+ ## Overview
17
+
18
+ The Tenant Management System provides **multi-tenancy support** for your application, allowing you to:
19
+
20
+ - Isolate resources per tenant
21
+ - Authenticate API requests using tenant-specific credentials
22
+ - Manage multiple API keys per tenant
23
+ - Track tenant status and configurations
24
+ - Associate tenants with organizations and projects
25
+
26
+ ### Key Concepts
27
+
28
+ - **Tenant**: An isolated instance representing a client/customer in your system
29
+ - **Client Configurations (API Keys)**: Keycloak-based authentication credentials for accessing tenant resources
30
+ - **Project/Vault**: A logical grouping that tenants belong to (for resource management)
31
+ - **Environment Tag**: Deployment environment (development, staging, production)
32
+ - **Organization**: The owning organization of the tenant
33
+
34
+ ---
35
+
36
+ ## Prerequisites
37
+
38
+ Before creating a tenant, ensure you have the following set up:
39
+
40
+ ### 1. **Organization**
41
+
42
+ Your tenant must belong to an organization.
43
+
44
+ ```typescript
45
+ // Organizations are managed separately in the system
46
+ // Ensure you have an organization ID or slug available
47
+ const organizationSlug = 'my-company';
48
+ ```
49
+
50
+ ### 2. **Project (Vault)**
51
+
52
+ Projects provide logical grouping and resource isolation.
53
+
54
+ **Creating a Project:**
55
+
56
+ - Navigate to **Project Management** in your dashboard
57
+ - Click **"Create Project"**
58
+ - Provide:
59
+ - Project Name (e.g., "Production Services")
60
+ - Description
61
+ - Associated Organization
62
+
63
+ **Note:** The `vault` field in tenant creation maps to `project`. This is used for:
64
+
65
+ - Resource scoping
66
+ - Access control
67
+ - Billing/usage tracking
68
+
69
+ ### 3. **Environment Tag**
70
+
71
+ Environment tags categorize deployments.
72
+
73
+ **Available Environments:**
74
+
75
+ - `development` - For dev/test environments
76
+ - `staging` - Pre-production testing
77
+ - `production` - Live production environment
78
+
79
+ **Creating Environment Tags:**
80
+
81
+ ```graphql
82
+ # Environment tags are typically created during system setup
83
+ # Contact your system administrator if tags are missing
84
+ ```
85
+
86
+ ### 4. **Keycloak Configuration**
87
+
88
+ Ensure your Keycloak instance is configured:
89
+
90
+ - Keycloak server URL: `KEYCLOAK_SERVER_DOMAIN`
91
+ - Realm name: `KEYCLOAK_REALM`
92
+ - Admin credentials configured
93
+
94
+ ---
95
+
96
+ ## Creating a Tenant
97
+
98
+ ### Via UI (Recommended)
99
+
100
+ 1. **Navigate to Tenant Management**
101
+ - Go to `/{organizationSlug}/tenants`
102
+ - Click **"Create Tenant"** button
103
+
104
+ 2. **Fill in Tenant Details**
105
+
106
+ | Field | Required | Description |
107
+ | ----------- | ----------- | ---------------------------------------------- |
108
+ | Name | ✅ Yes | Tenant display name (e.g., "Acme Corp API") |
109
+ | Description | ✅ Yes | Purpose or details about the tenant |
110
+ | Environment | ✅ Yes | Select development/staging/production |
111
+ | Project | ⚠️ Optional | Associate with a project for resource tracking |
112
+ | Auth Type | ✅ Yes | Authentication method (default: ClientSecret) |
113
+
114
+ 3. **Add API Keys (Client Configurations)**
115
+
116
+ **⚠️ Important:** You must add at least one API key during creation.
117
+
118
+ Click **"Add Secret Key"** and provide:
119
+ - **Name**: Unique identifier (e.g., "PRODUCTION_API_KEY", "MOBILE_APP_KEY")
120
+ - **Description**: Optional note about key usage
121
+
122
+ You can add multiple keys for different applications/services.
123
+
124
+ 4. **Submit**
125
+ - Click **"Create Tenant"**
126
+ - Status will initially be **"PENDING"**
127
+ - Keycloak clients are created asynchronously via Inngest workflow
128
+ - Status changes to **"ACTIVE"** once complete
129
+
130
+ ### Via GraphQL API
131
+
132
+ ```graphql
133
+ mutation CreateTenant($input: TenantInput!) {
134
+ createTenant(input: $input) {
135
+ tenant {
136
+ id
137
+ tenantId
138
+ name
139
+ status
140
+ clientConfigurations {
141
+ id
142
+ name
143
+ clientId
144
+ }
145
+ }
146
+ jobId
147
+ message
148
+ }
149
+ }
150
+ ```
151
+
152
+ **Variables:**
153
+
154
+ ```json
155
+ {
156
+ "input": {
157
+ "name": "Acme Corp Production",
158
+ "description": "Production API tenant for Acme Corp",
159
+ "organization": "my-company",
160
+ "vault": "64f3a1b2c9d8e7f6a5b4c3d2",
161
+ "environmentTag": "64a2b3c4d5e6f7g8h9i0j1k2",
162
+ "authType": "ClientSecret",
163
+ "clientConfigurations": [
164
+ {
165
+ "name": "WEB_APP_KEY",
166
+ "description": "API key for web application"
167
+ },
168
+ {
169
+ "name": "MOBILE_APP_KEY",
170
+ "description": "API key for mobile apps"
171
+ }
172
+ ]
173
+ }
174
+ }
175
+ ```
176
+
177
+ ### What Happens During Creation?
178
+
179
+ 1. **Tenant Record Created**
180
+ - Stored in MongoDB with status `PENDING`
181
+ - Generates unique `tenantId` (UUID)
182
+ - Creates `appName` (slug version of name)
183
+ - Generates `connectionId` for internal tracking
184
+
185
+ 2. **Keycloak Client Creation (Async)**
186
+ - Inngest workflow triggered: `TENANT_MGMT_CREATE_CLIENT_EVENT`
187
+ - For each `clientConfiguration`:
188
+ - Creates Keycloak confidential client
189
+ - Generates client credentials
190
+ - Stores `clientId` in tenant record
191
+
192
+ 3. **Status Update**
193
+ - Changes to `ACTIVE` on success
194
+ - Changes to `ERROR` if creation fails (can be retried)
195
+
196
+ ---
197
+
198
+ ## Understanding API Keys (Client Configurations)
199
+
200
+ ### What are Client Configurations?
201
+
202
+ Client Configurations are **Keycloak-based API keys** that authenticate requests to your tenant.
203
+
204
+ ### Key Components
205
+
206
+ Each API key consists of:
207
+
208
+ | Component | Description | Example |
209
+ | ----------------- | -------------------------- | ------------------------------ |
210
+ | **Name** | Human-readable identifier | `PRODUCTION_API_KEY` |
211
+ | **Client ID** | Keycloak client identifier | `64f3a1b2-c9d8-e7f6-a5b4-c3d2` |
212
+ | **Client Secret** | Authentication password | `dGVzdHNlY3JldGZvcmF1dGg=` |
213
+ | **Created At** | Timestamp | `2025-11-11T08:00:00Z` |
214
+
215
+ ### Secret Generation
216
+
217
+ Secrets are **deterministically generated** using:
218
+
219
+ ```typescript
220
+ generateSecretFromName(keyName, tenantId);
221
+ ```
222
+
223
+ Formula:
224
+
225
+ ```
226
+ secret = SHA256(keyName + tenantId + SALT)
227
+ .toBase64()
228
+ .removeNonAlphanumeric()
229
+ .substring(0, 32)
230
+ ```
231
+
232
+ This ensures:
233
+
234
+ - ✅ Reproducible (can be regenerated)
235
+ - ✅ Unique per tenant
236
+ - ✅ Keycloak-compatible (32 chars, alphanumeric)
237
+
238
+ ### Viewing API Keys
239
+
240
+ **In UI:**
241
+
242
+ 1. Go to Tenant Management
243
+ 2. Click **"Actions" → "View Details"** on a tenant
244
+ 3. Scroll to **"Secret API Keys"** section
245
+ 4. Click **"Reveal"** to view the full secret
246
+ 5. Click **"Copy"** to copy to clipboard
247
+
248
+ **Via GraphQL:**
249
+
250
+ ```graphql
251
+ mutation RevealSecretKey($tenantId: ID!, $keyId: ID!) {
252
+ revealSecretKey(tenantId: $tenantId, keyId: $keyId)
253
+ }
254
+ ```
255
+
256
+ **Response:**
257
+
258
+ ```
259
+ "base64EncodedClientId:Secret"
260
+ ```
261
+
262
+ ### Managing API Keys
263
+
264
+ **Add New Key** (During Update):
265
+
266
+ ```graphql
267
+ mutation UpdateTenant($id: ID!, $input: TenantUpdateInput!) {
268
+ updateTenant(id: $id, input: $input) {
269
+ id
270
+ clientConfigurations {
271
+ id
272
+ name
273
+ clientId
274
+ }
275
+ }
276
+ }
277
+ ```
278
+
279
+ **Revoke Key:**
280
+
281
+ ```graphql
282
+ mutation RevokeSecretKey($tenantId: ID!, $keyId: ID!) {
283
+ revokeSecretKey(tenantId: $tenantId, keyId: $keyId)
284
+ }
285
+ ```
286
+
287
+ ---
288
+
289
+ ## Authentication & Usage
290
+
291
+ ### How Tenant Authentication Works
292
+
293
+ The system uses **header-based authentication** validated against Keycloak.
294
+
295
+ #### Authentication Flow
296
+
297
+ ```
298
+ ┌─────────────┐
299
+ │ Client │
300
+ │ Application │
301
+ └──────┬──────┘
302
+ │ 1. Make API Request
303
+ │ Headers:
304
+ │ - x-tenant-id: {tenantId}
305
+ │ - x-tenant-key: {base64(clientId:secret)}
306
+
307
+
308
+ ┌──────────────────────────────────────┐
309
+ │ Middleware: cached-tenant-info │
310
+ │ │
311
+ │ 2. Extract Headers │
312
+ │ 3. Lookup Tenant in MongoDB │
313
+ │ 4. Validate with Keycloak │
314
+ │ - Verify clientId exists │
315
+ │ - Check credentials valid │
316
+ └──────┬───────────────────────────────┘
317
+
318
+
319
+ ┌─────────────────┐
320
+ │ Request Valid │◄─── Success (200)
321
+ │ Set req.tenant │
322
+ └─────────────────┘
323
+
324
+
325
+
326
+ ┌─────────────────┐
327
+ │ Unauthorized │◄─── Failure (401)
328
+ │ Error Response │
329
+ └─────────────────┘
330
+ ```
331
+
332
+ ### Implementation (Middleware)
333
+
334
+ Located in: `cached-tenant-info.middleware.ts`
335
+
336
+ **Key Functions:**
337
+
338
+ 1. **Header Extraction**
339
+
340
+ ```typescript
341
+ const tenantId = req.headers['x-tenant-id'];
342
+ const tenantKey = req.headers['x-tenant-key'];
343
+ ```
344
+
345
+ 2. **Tenant Lookup**
346
+
347
+ ```typescript
348
+ const tenantData = await TenantModel.findById(tenantId);
349
+ ```
350
+
351
+ 3. **Keycloak Validation**
352
+
353
+ ```typescript
354
+ // Decode: clientId:secret
355
+ const [clientId, clientSecret] = Buffer.from(tenantKey, 'base64').toString('utf-8').split(':');
356
+
357
+ // Verify against Keycloak
358
+ const isValid = await keycloakAdminService.verifyClientCredentials(clientId, clientSecret);
359
+ ```
360
+
361
+ 4. **Authorization**
362
+
363
+ ```typescript
364
+ if (isValid) {
365
+ req.tenant = tenantData; // Attach tenant to request
366
+ next();
367
+ } else {
368
+ res.status(401).json({ error: 'Invalid tenant credentials' });
369
+ }
370
+ ```
371
+
372
+ ---
373
+
374
+ ## API Integration Examples
375
+
376
+ ### Node.js / JavaScript
377
+
378
+ ```javascript
379
+ const axios = require('axios');
380
+
381
+ // Your tenant credentials
382
+ const TENANT_ID = '64f3a1b2c9d8e7f6a5b4c3d2';
383
+ const CLIENT_ID = 'your-keycloak-client-id';
384
+ const CLIENT_SECRET = 'your-client-secret';
385
+
386
+ // Encode credentials
387
+ const tenantKey = Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString('base64');
388
+
389
+ // Make authenticated request
390
+ axios
391
+ .post(
392
+ 'https://api.yourapp.com/graphql',
393
+ {
394
+ query: `
395
+ query GetData {
396
+ myData {
397
+ id
398
+ name
399
+ }
400
+ }
401
+ `,
402
+ },
403
+ {
404
+ headers: {
405
+ 'x-tenant-id': TENANT_ID,
406
+ 'x-tenant-key': tenantKey,
407
+ 'Content-Type': 'application/json',
408
+ },
409
+ },
410
+ )
411
+ .then((response) => console.log(response.data))
412
+ .catch((error) => console.error(error));
413
+ ```
414
+
415
+ ### cURL
416
+
417
+ ```bash
418
+ # Your credentials
419
+ TENANT_ID="64f3a1b2c9d8e7f6a5b4c3d2"
420
+ CLIENT_ID="your-keycloak-client-id"
421
+ CLIENT_SECRET="your-client-secret"
422
+
423
+ # Encode credentials
424
+ TENANT_KEY=$(echo -n "${CLIENT_ID}:${CLIENT_SECRET}" | base64)
425
+
426
+ # Make request
427
+ curl -X POST https://api.yourapp.com/graphql \
428
+ -H "x-tenant-id: ${TENANT_ID}" \
429
+ -H "x-tenant-key: ${TENANT_KEY}" \
430
+ -H "Content-Type: application/json" \
431
+ -d '{
432
+ "query": "query GetData { myData { id name } }"
433
+ }'
434
+ ```
435
+
436
+ ---
437
+
438
+ ## Managing Tenants
439
+
440
+ ### Viewing Tenants
441
+
442
+ **UI:**
443
+
444
+ - Navigate to `/{organizationSlug}/tenants`
445
+ - View list of all tenants with:
446
+ - Name, Description
447
+ - Environment
448
+ - Status (Pending, Active, Error)
449
+ - Created date
450
+
451
+ **GraphQL:**
452
+
453
+ ```graphql
454
+ query GetTenants($orgName: String!) {
455
+ tenants(orgName: $orgName) {
456
+ id
457
+ tenantId
458
+ name
459
+ description
460
+ status
461
+ environmentTag {
462
+ name
463
+ }
464
+ clientConfigurations {
465
+ id
466
+ name
467
+ createdAt
468
+ }
469
+ }
470
+ }
471
+ ```
472
+
473
+ ### Updating Tenants
474
+
475
+ **UI:**
476
+
477
+ 1. Click **"Actions" → "Edit"** on a tenant
478
+ 2. Modify:
479
+ - Name
480
+ - Description
481
+ - Environment Tag
482
+ - Project
483
+ 3. **Add new API keys** if needed
484
+ 4. Click **"Update Tenant"**
485
+
486
+ **GraphQL:**
487
+
488
+ ```graphql
489
+ mutation UpdateTenant($id: ID!, $input: TenantUpdateInput!) {
490
+ updateTenant(id: $id, input: $input) {
491
+ id
492
+ name
493
+ description
494
+ clientConfigurations {
495
+ id
496
+ name
497
+ }
498
+ }
499
+ }
500
+ ```
501
+
502
+ **Variables:**
503
+
504
+ ```json
505
+ {
506
+ "id": "6911f062534d4b0db1e1ced2",
507
+ "input": {
508
+ "name": "Updated Tenant Name",
509
+ "description": "New description",
510
+ "clientConfigurations": [
511
+ {
512
+ "name": "NEW_API_KEY",
513
+ "description": "Additional key for new service"
514
+ }
515
+ ]
516
+ }
517
+ }
518
+ ```
519
+
520
+ **⚠️ Note:** Existing API keys are preserved. New keys are appended.
521
+
522
+ ### Deleting Tenants
523
+
524
+ **UI:**
525
+
526
+ - Click **"Actions" → "Delete"** on a tenant
527
+ - Confirm deletion
528
+ - This will:
529
+ - Delete tenant record
530
+ - Trigger Keycloak client cleanup (async)
531
+
532
+ **GraphQL:**
533
+
534
+ ```graphql
535
+ mutation DeleteTenant($id: ID!) {
536
+ deleteTenant(id: $id)
537
+ }
538
+ ```
539
+
540
+ ### Retry Failed Creation
541
+
542
+ If tenant creation fails (status: `ERROR`):
543
+
544
+ **UI:**
545
+
546
+ - Click **"Actions" → "Retry Creation"**
547
+
548
+ **GraphQL:**
549
+
550
+ ```graphql
551
+ mutation RetryTenantCreation($tenantId: ID!) {
552
+ retryTenantCreation(tenantId: $tenantId)
553
+ }
554
+ ```
555
+
556
+ ---
557
+
558
+ ## Troubleshooting
559
+
560
+ ### Common Issues
561
+
562
+ #### 1. **"Tenant with ID not found"**
563
+
564
+ **Cause:** Passing MongoDB `_id` instead of `tenantId`
565
+
566
+ **Solution:** Always use the `tenantId` field (UUID format):
567
+
568
+ ```typescript
569
+ // ✅ Correct
570
+ const id = tenant.tenantId; // "6911f062-534d-4b0d-b1e1-ced2..."
571
+
572
+ // ❌ Wrong
573
+ const id = tenant.id; // MongoDB ObjectId
574
+ ```
575
+
576
+ #### 2. **"Invalid tenant credentials" (401)**
577
+
578
+ **Causes:**
579
+
580
+ - Incorrect `x-tenant-key` encoding
581
+ - Using MongoDB ID instead of `tenantId`
582
+ - Client doesn't exist in Keycloak
583
+ - Client secret is wrong
584
+
585
+ **Debug Steps:**
586
+
587
+ ```javascript
588
+ // 1. Check encoding
589
+ const decoded = Buffer.from(tenantKey, 'base64').toString();
590
+ console.log('Decoded:', decoded); // Should be "clientId:secret"
591
+
592
+ // 2. Verify clientId exists
593
+ // Check in Keycloak admin console or reveal key in UI
594
+
595
+ // 3. Test credentials
596
+ // Use "Reveal" in UI to get correct credentials
597
+ ```
598
+
599
+ #### 3. **Tenant Status Stuck on "PENDING"**
600
+
601
+ **Causes:**
602
+
603
+ - Inngest workflow not running
604
+ - Keycloak connection failed
605
+ - Network issues
606
+
607
+ **Resolution:**
608
+
609
+ 1. Check Inngest dashboard for failed jobs
610
+ 2. Verify Keycloak is accessible
611
+ 3. Check server logs for errors
612
+ 4. Use **"Retry Creation"** if needed
613
+
614
+ #### 4. **"At least one secret API key is required"**
615
+
616
+ **Cause:** Trying to create tenant without API keys
617
+
618
+ **Solution:** Add at least one client configuration:
619
+
620
+ ```json
621
+ {
622
+ "clientConfigurations": [
623
+ {
624
+ "name": "DEFAULT_KEY",
625
+ "description": "Primary API key"
626
+ }
627
+ ]
628
+ }
629
+ ```
630
+
631
+ #### 5. **Environment Tag Not Found**
632
+
633
+ **Cause:** Invalid or missing environment tag ID
634
+
635
+ **Solution:**
636
+
637
+ 1. Fetch available tags:
638
+
639
+ ```graphql
640
+ query GetEnvironmentTags($projectId: ID!) {
641
+ getEnvironmentTags(projectId: $projectId) {
642
+ id
643
+ name
644
+ }
645
+ }
646
+ ```
647
+
648
+ 2. Use a valid tag ID in tenant creation
649
+
650
+ ---
651
+
652
+ ## Best Practices
653
+
654
+ ### Security
655
+
656
+ 1. **Never expose client secrets in frontend code**
657
+ - Store in backend environment variables
658
+ - Use server-to-server communication
659
+
660
+ 2. **Rotate API keys regularly**
661
+ - Add new key
662
+ - Update services to use new key
663
+ - Revoke old key
664
+
665
+ 3. **Use separate keys per service**
666
+ - Easier to track usage
667
+ - Limit blast radius if compromised
668
+
669
+ ### Organization
670
+
671
+ 1. **Use descriptive names**
672
+
673
+ ```
674
+ ✅ "PRODUCTION_WEB_APP"
675
+ ✅ "STAGING_MOBILE_IOS"
676
+ ❌ "key1"
677
+ ❌ "test"
678
+ ```
679
+
680
+ 2. **Match environment to usage**
681
+ - Don't use production tenants in development
682
+ - Create separate tenants per environment
683
+
684
+ 3. **Associate with projects**
685
+ - Helps with resource tracking
686
+ - Enables better access control
687
+
688
+ ---
689
+
690
+ ## Additional Resources
691
+
692
+ - **GraphQL API Documentation**: `/graphql` (GraphiQL interface)
693
+ - **Keycloak Admin Console**: Check configured clients
694
+ - **Inngest Dashboard**: Monitor tenant creation jobs
695
+ - **Server Logs**: Check for detailed error messages
696
+
697
+ ---
698
+
699
+ ## Support
700
+
701
+ For issues or questions:
702
+
703
+ 1. Check this documentation
704
+ 2. Review server logs
705
+ 3. Contact your system administrator
706
+ 4. Check Keycloak and Inngest status
707
+
708
+ ---