@mehdad67/apitogo 0.1.26 → 0.1.28

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 (108) hide show
  1. package/dist/cli/cli.js +51 -36
  2. package/dist/declarations/config/config.d.ts +3 -0
  3. package/dist/declarations/config/validators/ZudokuConfig.d.ts +12 -0
  4. package/dist/declarations/lib/authentication/components/ProductionUnlockPage.d.ts +1 -0
  5. package/dist/declarations/lib/authentication/hook.d.ts +2 -0
  6. package/dist/declarations/lib/authentication/providers/dev-portal-constants.d.ts +16 -0
  7. package/dist/declarations/lib/authentication/providers/dev-portal-utils.d.ts +9 -0
  8. package/dist/declarations/lib/authentication/providers/dev-portal.d.ts +36 -0
  9. package/dist/declarations/lib/authentication/state.d.ts +3 -0
  10. package/dist/declarations/lib/ui/ActionButton.d.ts +1 -1
  11. package/dist/declarations/lib/ui/Command.d.ts +1 -1
  12. package/dist/declarations/lib/util/MdxComponents.d.ts +1 -1
  13. package/dist/flat-config.d.ts +6 -0
  14. package/docs/configuration/authentication.md +32 -2
  15. package/package.json +6 -1
  16. package/src/app/main.tsx +2 -2
  17. package/src/config/config.ts +4 -0
  18. package/src/config/validators/ZudokuConfig.ts +7 -0
  19. package/src/lib/auth/issuer.ts +3 -0
  20. package/src/lib/authentication/components/CallbackHandler.tsx +1 -1
  21. package/src/lib/authentication/components/ProductionUnlockPage.tsx +27 -0
  22. package/src/lib/authentication/components/SignIn.tsx +2 -2
  23. package/src/lib/authentication/components/SignUp.tsx +2 -2
  24. package/src/lib/authentication/hook.ts +2 -0
  25. package/src/lib/authentication/providers/clerk.tsx +1 -1
  26. package/src/lib/authentication/providers/dev-portal-constants.ts +21 -0
  27. package/src/lib/authentication/providers/dev-portal-utils.ts +107 -0
  28. package/src/lib/authentication/providers/dev-portal.tsx +218 -0
  29. package/src/lib/authentication/state.ts +12 -0
  30. package/src/lib/authentication/ui/AuthCard.tsx +1 -1
  31. package/src/lib/authentication/ui/EmailLinkCallbackUi.tsx +5 -5
  32. package/src/lib/authentication/ui/EmailLinkSentUi.tsx +3 -3
  33. package/src/lib/authentication/ui/EmailLinkSignInUi.tsx +4 -4
  34. package/src/lib/authentication/ui/EmailVerificationUi.tsx +4 -4
  35. package/src/lib/authentication/ui/ZudokuAuthUi.tsx +6 -6
  36. package/src/lib/components/AiAssistantMenuItems.tsx +1 -1
  37. package/src/lib/components/Autocomplete.tsx +2 -2
  38. package/src/lib/components/DeveloperHint.tsx +1 -1
  39. package/src/lib/components/Header.tsx +4 -4
  40. package/src/lib/components/LandingLayout.tsx +1 -1
  41. package/src/lib/components/Layout.tsx +1 -1
  42. package/src/lib/components/Main.tsx +1 -1
  43. package/src/lib/components/Mermaid.tsx +1 -1
  44. package/src/lib/components/MobileTopNavigation.tsx +6 -5
  45. package/src/lib/components/MultiSelect.tsx +1 -1
  46. package/src/lib/components/TopNavigation.tsx +1 -1
  47. package/src/lib/components/context/ZudokuContext.ts +1 -1
  48. package/src/lib/components/navigation/NavigationCategory.tsx +1 -1
  49. package/src/lib/components/navigation/NavigationFilterInput.tsx +1 -1
  50. package/src/lib/components/navigation/NavigationItem.tsx +2 -2
  51. package/src/lib/core/RouteGuard.tsx +13 -3
  52. package/src/lib/errors/ErrorMessage.tsx +2 -2
  53. package/src/lib/plugins/api-catalog/Catalog.tsx +1 -1
  54. package/src/lib/plugins/api-keys/CreateApiKey.tsx +4 -4
  55. package/src/lib/plugins/api-keys/CreateApiKeyDialog.tsx +1 -1
  56. package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +3 -3
  57. package/src/lib/plugins/api-keys/settings/ApiKeyItem.tsx +5 -5
  58. package/src/lib/plugins/api-keys/settings/RevealApiKey.tsx +3 -3
  59. package/src/lib/plugins/markdown/MdxPage.tsx +3 -3
  60. package/src/lib/plugins/openapi/ApiHeader.tsx +1 -1
  61. package/src/lib/plugins/openapi/CollapsibleCode.tsx +2 -2
  62. package/src/lib/plugins/openapi/DownloadSchemaButton.tsx +3 -3
  63. package/src/lib/plugins/openapi/GeneratedExampleSidecarBox.tsx +2 -2
  64. package/src/lib/plugins/openapi/OperationListItem.tsx +2 -2
  65. package/src/lib/plugins/openapi/RequestBodySidecarBox.tsx +2 -2
  66. package/src/lib/plugins/openapi/ResponsesSidecarBox.tsx +4 -4
  67. package/src/lib/plugins/openapi/SchemaInfo.tsx +1 -1
  68. package/src/lib/plugins/openapi/SchemaList.tsx +2 -2
  69. package/src/lib/plugins/openapi/Sidecar.tsx +4 -4
  70. package/src/lib/plugins/openapi/SidecarExamples.tsx +2 -2
  71. package/src/lib/plugins/openapi/components/EnumValues.tsx +1 -1
  72. package/src/lib/plugins/openapi/components/ResponseContent.tsx +3 -3
  73. package/src/lib/plugins/openapi/playground/BodyPanel.tsx +4 -4
  74. package/src/lib/plugins/openapi/playground/CollapsibleHeader.tsx +1 -1
  75. package/src/lib/plugins/openapi/playground/ExamplesDropdown.tsx +2 -2
  76. package/src/lib/plugins/openapi/playground/Headers.tsx +3 -3
  77. package/src/lib/plugins/openapi/playground/IdentityDialog.tsx +5 -5
  78. package/src/lib/plugins/openapi/playground/IdentitySelector.tsx +2 -2
  79. package/src/lib/plugins/openapi/playground/ParamsGrid.tsx +2 -2
  80. package/src/lib/plugins/openapi/playground/Playground.tsx +4 -4
  81. package/src/lib/plugins/openapi/playground/PlaygroundDialog.tsx +3 -3
  82. package/src/lib/plugins/openapi/playground/QueryParams.tsx +2 -2
  83. package/src/lib/plugins/openapi/playground/RequestLoginDialog.tsx +4 -4
  84. package/src/lib/plugins/openapi/playground/request-panel/MultipartField.tsx +2 -2
  85. package/src/lib/plugins/openapi/playground/result-panel/AudioPlayer.tsx +1 -1
  86. package/src/lib/plugins/openapi/playground/result-panel/ResponseTab.tsx +5 -5
  87. package/src/lib/plugins/openapi/playground/result-panel/ResultPanel.tsx +2 -2
  88. package/src/lib/plugins/openapi/schema/SchemaPropertyItem.tsx +1 -1
  89. package/src/lib/plugins/openapi/schema/SchemaView.tsx +2 -2
  90. package/src/lib/plugins/search-pagefind/IndexingDialog.tsx +2 -2
  91. package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +4 -4
  92. package/src/lib/plugins/search-pagefind/ResultList.tsx +1 -1
  93. package/src/lib/ui/ActionButton.tsx +1 -1
  94. package/src/lib/ui/Command.tsx +1 -1
  95. package/src/lib/util/MdxComponents.tsx +2 -2
  96. package/src/vite/config.ts +4 -4
  97. package/src/vite/plugin-api-keys.ts +1 -1
  98. package/src/vite/plugin-api.ts +2 -2
  99. package/src/vite/plugin-auth.ts +1 -1
  100. package/src/vite/plugin-component.ts +5 -5
  101. package/src/vite/plugin-config.ts +1 -1
  102. package/src/vite/plugin-custom-pages.ts +1 -1
  103. package/src/vite/plugin-docs.ts +1 -1
  104. package/src/vite/plugin-mdx.ts +1 -1
  105. package/src/vite/plugin-modules.ts +2 -2
  106. package/src/vite/plugin-navigation.ts +1 -1
  107. package/src/vite/plugin-search.ts +2 -2
  108. package/src/vite/plugin.ts +1 -1
package/dist/cli/cli.js CHANGED
@@ -20,8 +20,8 @@ var init_package_json = __esm({
20
20
  path.posix.sep
21
21
  );
22
22
  getPackageJson = (pkgPath) => JSON.parse(readFileSync(pkgPath, "utf-8"));
23
- getZudokuPackageJson = () => getPackageJson(getPackageJsonPath("@lukoweb/apitogo"));
24
- getZudokuRootDir = () => path.dirname(getPackageJsonPath("@lukoweb/apitogo"));
23
+ getZudokuPackageJson = () => getPackageJson(getPackageJsonPath("@mehdad67/apitogo"));
24
+ getZudokuRootDir = () => path.dirname(getPackageJsonPath("@mehdad67/apitogo"));
25
25
  }
26
26
  });
27
27
 
@@ -3545,6 +3545,13 @@ var init_ZudokuConfig = __esm({
3545
3545
  redirectToAfterSignUp: z8.string().optional(),
3546
3546
  redirectToAfterSignIn: z8.string().optional(),
3547
3547
  redirectToAfterSignOut: z8.string().optional()
3548
+ }),
3549
+ z8.object({
3550
+ type: z8.literal("dev-portal"),
3551
+ apiBaseUrl: z8.string().optional(),
3552
+ redirectToAfterSignUp: z8.string().optional(),
3553
+ redirectToAfterSignIn: z8.string().optional(),
3554
+ redirectToAfterSignOut: z8.string().optional()
3548
3555
  })
3549
3556
  ]);
3550
3557
  MetadataSchema = z8.object({
@@ -4086,6 +4093,9 @@ var getIssuer = async (config2) => {
4086
4093
  case "firebase": {
4087
4094
  return `https://securetoken.google.com/${config2.authentication.projectId}`;
4088
4095
  }
4096
+ case "dev-portal": {
4097
+ return void 0;
4098
+ }
4089
4099
  case void 0: {
4090
4100
  return void 0;
4091
4101
  }
@@ -4110,8 +4120,8 @@ import {
4110
4120
 
4111
4121
  // package.json
4112
4122
  var package_default = {
4113
- name: "@lukoweb/apitogo",
4114
- version: "0.1.26",
4123
+ name: "@mehdad67/apitogo",
4124
+ version: "0.1.28",
4115
4125
  type: "module",
4116
4126
  sideEffects: [
4117
4127
  "**/*.css",
@@ -4157,6 +4167,7 @@ var package_default = {
4157
4167
  "./auth/supabase": "./src/lib/authentication/providers/supabase.tsx",
4158
4168
  "./auth/azureb2c": "./src/lib/authentication/providers/azureb2c.tsx",
4159
4169
  "./auth/firebase": "./src/lib/authentication/providers/firebase.tsx",
4170
+ "./auth/dev-portal": "./src/lib/authentication/providers/dev-portal.tsx",
4160
4171
  "./plugins": "./src/lib/core/plugins.ts",
4161
4172
  "./plugins/api-keys": "./src/lib/plugins/api-keys/index.tsx",
4162
4173
  "./plugins/markdown": "./src/lib/plugins/markdown/index.tsx",
@@ -4165,8 +4176,8 @@ var package_default = {
4165
4176
  "./plugins/search-inkeep": "./src/lib/plugins/search-inkeep/index.tsx",
4166
4177
  "./plugins/search-pagefind": "./src/lib/plugins/search-pagefind/index.tsx",
4167
4178
  "./plugins/api-catalog": "./src/lib/plugins/api-catalog/index.tsx",
4168
- "./modules/landing": "@lukoweb/apitogo-module-landing",
4169
- "./modules/user-panel": "@lukoweb/apitogo-module-user-panel",
4179
+ "./modules/landing": "@mehdad67/apitogo-module-landing",
4180
+ "./modules/user-panel": "@mehdad67/apitogo-module-user-panel",
4170
4181
  "./components": "./src/lib/components/index.ts",
4171
4182
  "./mermaid": "./src/lib/components/Mermaid.tsx",
4172
4183
  "./router": "./src/lib/core/router.ts",
@@ -4406,6 +4417,10 @@ var package_default = {
4406
4417
  types: "./dist/declarations/lib/authentication/providers/firebase.d.ts",
4407
4418
  default: "./src/lib/authentication/providers/firebase.tsx"
4408
4419
  },
4420
+ "./auth/dev-portal": {
4421
+ types: "./dist/declarations/lib/authentication/providers/dev-portal.d.ts",
4422
+ default: "./src/lib/authentication/providers/dev-portal.tsx"
4423
+ },
4409
4424
  "./plugins": {
4410
4425
  types: "./dist/declarations/lib/core/plugins.d.ts",
4411
4426
  default: "./src/lib/core/plugins.ts"
@@ -4438,8 +4453,8 @@ var package_default = {
4438
4453
  types: "./dist/declarations/lib/plugins/api-catalog/index.d.ts",
4439
4454
  default: "./src/lib/plugins/api-catalog/index.tsx"
4440
4455
  },
4441
- "./modules/landing": "@lukoweb/apitogo-module-landing",
4442
- "./modules/user-panel": "@lukoweb/apitogo-module-user-panel",
4456
+ "./modules/landing": "@mehdad67/apitogo-module-landing",
4457
+ "./modules/user-panel": "@mehdad67/apitogo-module-user-panel",
4443
4458
  "./components": {
4444
4459
  types: "./dist/declarations/lib/components/index.d.ts",
4445
4460
  default: "./src/lib/components/index.ts"
@@ -4679,7 +4694,7 @@ var viteApiKeysPlugin = () => {
4679
4694
  const deploymentName = ZuploEnv.buildConfig?.deploymentName || getZuploSystemConfigurations(process.env.ZUPLO_SYSTEM_CONFIGURATIONS)?.__ZUPLO_DEPLOYMENT_NAME;
4680
4695
  const code = [
4681
4696
  `import config from "virtual:zudoku-config";`,
4682
- config2.__meta.mode === "internal" ? `import { apiKeyPlugin } from "${config2.__meta.moduleDir}/src/lib/plugins/api-keys/index.tsx";` : `import { apiKeyPlugin } from "@lukoweb/apitogo/plugins/api-keys";`,
4697
+ config2.__meta.mode === "internal" ? `import { apiKeyPlugin } from "${config2.__meta.moduleDir}/src/lib/plugins/api-keys/index.tsx";` : `import { apiKeyPlugin } from "@mehdad67/apitogo/plugins/api-keys";`,
4683
4698
  `export const configuredApiKeysPlugin = apiKeyPlugin({
4684
4699
  ...config.apiKeys,
4685
4700
  path: "${apiKeysPath}",
@@ -6389,7 +6404,7 @@ export const rules = ${rulesCode};`,
6389
6404
  if (hasMissingIcon) {
6390
6405
  collectedIcons.add("MissingIcon");
6391
6406
  }
6392
- const importStatement = collectedIcons.size > 0 ? `import { ${[...collectedIcons].join(", ")} } from "@lukoweb/apitogo/icons";
6407
+ const importStatement = collectedIcons.size > 0 ? `import { ${[...collectedIcons].join(", ")} } from "@mehdad67/apitogo/icons";
6393
6408
  ` : "";
6394
6409
  return [
6395
6410
  importStatement,
@@ -6515,7 +6530,7 @@ var viteApiPlugin = async () => {
6515
6530
  ];
6516
6531
  if (config2.apis) {
6517
6532
  code.push(
6518
- 'import { openApiPlugin } from "@lukoweb/apitogo/plugins/openapi";'
6533
+ 'import { openApiPlugin } from "@mehdad67/apitogo/plugins/openapi";'
6519
6534
  );
6520
6535
  code.push(
6521
6536
  `const apis = Array.isArray(config.apis) ? config.apis : [config.apis]`
@@ -6608,7 +6623,7 @@ var viteApiPlugin = async () => {
6608
6623
  }
6609
6624
  if (config2.catalogs) {
6610
6625
  code.push(
6611
- 'import { apiCatalogPlugin } from "@lukoweb/apitogo/plugins/api-catalog";'
6626
+ 'import { apiCatalogPlugin } from "@mehdad67/apitogo/plugins/api-catalog";'
6612
6627
  );
6613
6628
  const catalogs = ensureArray(config2.catalogs);
6614
6629
  const categories = apis.flatMap((api) => api.categories ?? []).reduce((acc, catalog) => {
@@ -6694,7 +6709,7 @@ var viteAuthPlugin = () => {
6694
6709
  ...${JSON.stringify(config2.authentication, null, 2)},
6695
6710
  basePath: ${config2.basePath ? JSON.stringify(config2.basePath) : "undefined"},
6696
6711
  };`,
6697
- config2.__meta.mode === "internal" ? `import authProvider from "${config2.__meta.moduleDir}/src/lib/authentication/providers/${config2.authentication.type}.tsx";` : `import authProvider from "@lukoweb/apitogo/auth/${config2.authentication.type}";`,
6712
+ config2.__meta.mode === "internal" ? `import authProvider from "${config2.__meta.moduleDir}/src/lib/authentication/providers/${config2.authentication.type}.tsx";` : `import authProvider from "@mehdad67/apitogo/auth/${config2.authentication.type}";`,
6698
6713
  `export const configuredAuthProvider = authProvider(config);`
6699
6714
  ].join("\n");
6700
6715
  }
@@ -6712,21 +6727,21 @@ var viteAliasPlugin = () => {
6712
6727
  config: () => {
6713
6728
  const config2 = getCurrentConfig();
6714
6729
  const replacements = [
6715
- ["@lukoweb/apitogo/components", "src/lib/components/index.ts"],
6730
+ ["@mehdad67/apitogo/components", "src/lib/components/index.ts"],
6716
6731
  [
6717
- "@lukoweb/apitogo/plugins/openapi",
6732
+ "@mehdad67/apitogo/plugins/openapi",
6718
6733
  "src/lib/plugins/openapi/index.tsx"
6719
6734
  ],
6720
6735
  [
6721
- "@lukoweb/apitogo/plugins/api-catalog",
6736
+ "@mehdad67/apitogo/plugins/api-catalog",
6722
6737
  "src/lib/plugins/api-catalog/index.tsx"
6723
6738
  ],
6724
6739
  [
6725
- "@lukoweb/apitogo/plugins/search-inkeep",
6740
+ "@mehdad67/apitogo/plugins/search-inkeep",
6726
6741
  "src/lib/plugins/search-inkeep/index.tsx"
6727
6742
  ],
6728
6743
  [
6729
- "@lukoweb/apitogo/plugins/search-pagefind",
6744
+ "@mehdad67/apitogo/plugins/search-pagefind",
6730
6745
  "src/lib/plugins/search-pagefind/index.tsx"
6731
6746
  ],
6732
6747
  [/^@lukoweb\/apitogo\/ui\/(.*)\.js/, "src/lib/ui/$1.tsx"]
@@ -6765,7 +6780,7 @@ var viteConfigPlugin = () => {
6765
6780
  }
6766
6781
  return `
6767
6782
  import rawConfig from "${normalizePath(configPath)}";
6768
- import { runPluginTransformConfig } from "@lukoweb/apitogo/plugins";
6783
+ import { runPluginTransformConfig } from "@mehdad67/apitogo/plugins";
6769
6784
 
6770
6785
  const config = await runPluginTransformConfig(rawConfig);
6771
6786
  export default config;
@@ -6821,7 +6836,7 @@ var viteCustomPagesPlugin = () => {
6821
6836
  }
6822
6837
  const code = [
6823
6838
  `import config from "virtual:zudoku-config";`,
6824
- config2.__meta.mode === "internal" ? `import { customPagesPlugin } from "${config2.__meta.moduleDir}/src/lib/plugins/custom-pages/index.tsx";` : `import { customPagesPlugin } from "@lukoweb/apitogo/plugins/custom-pages";`,
6839
+ config2.__meta.mode === "internal" ? `import { customPagesPlugin } from "${config2.__meta.moduleDir}/src/lib/plugins/custom-pages/index.tsx";` : `import { customPagesPlugin } from "@mehdad67/apitogo/plugins/custom-pages";`,
6825
6840
  `export const configuredCustomPagesPlugin = customPagesPlugin(config.navigation);`
6826
6841
  ];
6827
6842
  return code.join("\n");
@@ -7007,7 +7022,7 @@ var viteDocsPlugin = () => {
7007
7022
  const code = [
7008
7023
  // IMPORTANT! This path here is important, we MUST resolve
7009
7024
  // files here as Typescript from the appDir
7010
- config2.__meta.mode === "internal" ? `import { markdownPlugin } from "${config2.__meta.moduleDir}/src/lib/plugins/markdown/index.tsx";` : `import { markdownPlugin } from "@lukoweb/apitogo/plugins/markdown";`
7025
+ config2.__meta.mode === "internal" ? `import { markdownPlugin } from "${config2.__meta.moduleDir}/src/lib/plugins/markdown/index.tsx";` : `import { markdownPlugin } from "@mehdad67/apitogo/plugins/markdown";`
7011
7026
  ];
7012
7027
  const docsConfig = DocsConfigSchema.parse(config2.docs ?? {});
7013
7028
  const globImportBasePath = process.env.NODE_ENV === "development" ? config2.basePath ?? "" : "";
@@ -7622,7 +7637,7 @@ var viteMdxPlugin = async () => {
7622
7637
  return {
7623
7638
  enforce: "pre",
7624
7639
  ...mdx({
7625
- providerImportSource: config2.__meta.mode === "internal" || config2.__meta.mode === "standalone" ? "@mdx-js/react" : "@lukoweb/apitogo/components",
7640
+ providerImportSource: config2.__meta.mode === "internal" || config2.__meta.mode === "standalone" ? "@mdx-js/react" : "@mehdad67/apitogo/components",
7626
7641
  mdxExtensions: [".mdx"],
7627
7642
  format: "detect",
7628
7643
  remarkPlugins,
@@ -7637,8 +7652,8 @@ var plugin_mdx_default = viteMdxPlugin;
7637
7652
  init_loader();
7638
7653
  import path18 from "node:path";
7639
7654
  import { normalizePath as normalizePath2 } from "vite";
7640
- var getLandingModuleImport = (moduleDir, mode) => mode === "internal" ? normalizePath2(path18.join(moduleDir, "../module-landing/src/index.tsx")) : "@lukoweb/apitogo-module-landing";
7641
- var getUserPanelModuleImport = (moduleDir, mode) => mode === "internal" ? normalizePath2(path18.join(moduleDir, "../module-user-panel/src/index.tsx")) : "@lukoweb/apitogo-module-user-panel";
7655
+ var getLandingModuleImport = (moduleDir, mode) => mode === "internal" ? normalizePath2(path18.join(moduleDir, "../module-landing/src/index.tsx")) : "@mehdad67/apitogo-module-landing";
7656
+ var getUserPanelModuleImport = (moduleDir, mode) => mode === "internal" ? normalizePath2(path18.join(moduleDir, "../module-user-panel/src/index.tsx")) : "@mehdad67/apitogo-module-user-panel";
7642
7657
  var resolveProjectPageImport = (rootDir, pagePath) => normalizePath2(path18.resolve(rootDir, pagePath));
7643
7658
  var viteModulesPlugin = () => {
7644
7659
  const virtualModuleId4 = "virtual:zudoku-modules-plugin";
@@ -7783,7 +7798,7 @@ var viteSearchPlugin = () => {
7783
7798
  if (config2.search.type === "inkeep") {
7784
7799
  code.push(
7785
7800
  `import config from 'virtual:zudoku-config';`,
7786
- `import { inkeepSearchPlugin } from "@lukoweb/apitogo/plugins/search-inkeep";`,
7801
+ `import { inkeepSearchPlugin } from "@mehdad67/apitogo/plugins/search-inkeep";`,
7787
7802
  `export const configuredSearchPlugin = inkeepSearchPlugin(config.search);`
7788
7803
  );
7789
7804
  return code.join("\n");
@@ -7791,7 +7806,7 @@ var viteSearchPlugin = () => {
7791
7806
  if (config2.search.type === "pagefind") {
7792
7807
  code.push(
7793
7808
  `import config from 'virtual:zudoku-config';`,
7794
- `import { pagefindSearchPlugin } from "@lukoweb/apitogo/plugins/search-pagefind";`,
7809
+ `import { pagefindSearchPlugin } from "@mehdad67/apitogo/plugins/search-pagefind";`,
7795
7810
  `export const configuredSearchPlugin = pagefindSearchPlugin(config.search);`
7796
7811
  );
7797
7812
  return code.join("\n");
@@ -7901,7 +7916,7 @@ function vitePlugin() {
7901
7916
  viteSearchPlugin(),
7902
7917
  plugin_component_default(),
7903
7918
  plugin_markdown_export_default(),
7904
- vitePluginSsrCss({ entries: ["@lukoweb/apitogo/app/entry.server.tsx"] }),
7919
+ vitePluginSsrCss({ entries: ["@mehdad67/apitogo/app/entry.server.tsx"] }),
7905
7920
  viteThemePlugin(),
7906
7921
  tailwindcss()
7907
7922
  ];
@@ -8012,9 +8027,9 @@ async function getViteConfig(dir, configEnv) {
8012
8027
  emptyOutDir: true,
8013
8028
  rollupOptions: {
8014
8029
  input: configEnv.command === "build" ? configEnv.isSsrBuild ? [
8015
- "@lukoweb/apitogo/app/entry.server.tsx",
8030
+ "@mehdad67/apitogo/app/entry.server.tsx",
8016
8031
  config2.__meta.configPath
8017
- ] : "@lukoweb/apitogo/app/entry.client.tsx" : void 0,
8032
+ ] : "@mehdad67/apitogo/app/entry.client.tsx" : void 0,
8018
8033
  external: [joinUrl(config2.basePath, "/pagefind/pagefind.js")]
8019
8034
  },
8020
8035
  chunkSizeWarningLimit: 1500
@@ -8035,10 +8050,10 @@ async function getViteConfig(dir, configEnv) {
8035
8050
  target: "es2022"
8036
8051
  },
8037
8052
  entries: [path20.posix.join(getZudokuRootDir(), "src/{app,lib}/**")],
8038
- exclude: ["@lukoweb/apitogo"],
8053
+ exclude: ["@mehdad67/apitogo"],
8039
8054
  include: [
8040
8055
  "react-dom/client",
8041
- "@lukoweb/apitogo/icons",
8056
+ "@mehdad67/apitogo/icons",
8042
8057
  ...process.env.SENTRY_DSN ? ["@sentry/react"] : []
8043
8058
  ]
8044
8059
  },
@@ -8947,7 +8962,7 @@ jobs:
8947
8962
  run: npm ci
8948
8963
 
8949
8964
  - name: Install APIToGo CLI
8950
- run: npm install -g @lukoweb/apitogo@latest
8965
+ run: npm install -g @mehdad67/apitogo@latest
8951
8966
 
8952
8967
  - name: Check APIToGo version
8953
8968
  run: apitogo --version
@@ -8979,7 +8994,7 @@ jobs:
8979
8994
 
8980
8995
  steps:
8981
8996
  - name: Install APIToGo CLI
8982
- run: npm install -g @lukoweb/apitogo@latest
8997
+ run: npm install -g @mehdad67/apitogo@latest
8983
8998
 
8984
8999
  - name: Remove preview deployment
8985
9000
  env:
@@ -9011,7 +9026,7 @@ jobs:
9011
9026
  run: npm ci
9012
9027
 
9013
9028
  - name: Install APIToGo CLI
9014
- run: npm install -g @lukoweb/apitogo@latest
9029
+ run: npm install -g @mehdad67/apitogo@latest
9015
9030
 
9016
9031
  - name: Check APIToGo version
9017
9032
  run: apitogo --version
@@ -9721,7 +9736,7 @@ async function ensurePackageJson(dir) {
9721
9736
  const baseDeps = {
9722
9737
  react: ">=19.0.0",
9723
9738
  "react-dom": ">=19.0.0",
9724
- "@lukoweb/apitogo": apitogoVer
9739
+ "@mehdad67/apitogo": apitogoVer
9725
9740
  };
9726
9741
  const baseScripts = {
9727
9742
  dev: "apitogo dev",
@@ -10092,7 +10107,7 @@ var buildNewConfigContents = (pagesDir, openApiSpecRelative) => {
10092
10107
  input: "${openapiInputForConfig(openApiSpecRelative)}",
10093
10108
  path: "api",
10094
10109
  },`;
10095
- return `import type { ApitogoConfig } from "@lukoweb/apitogo";
10110
+ return `import type { ApitogoConfig } from "@mehdad67/apitogo";
10096
10111
 
10097
10112
  const config: ApitogoConfig = {
10098
10113
  docs: {
@@ -24,3 +24,6 @@ export type FirebaseAuthenticationConfig = Extract<AuthenticationConfig, {
24
24
  export type AzureB2CAuthenticationConfig = Extract<AuthenticationConfig, {
25
25
  type: "azureb2c";
26
26
  }>;
27
+ export type DevPortalAuthenticationConfig = Extract<AuthenticationConfig, {
28
+ type: "dev-portal";
29
+ }>;
@@ -366,6 +366,12 @@ declare const AuthenticationSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
366
366
  redirectToAfterSignUp: z.ZodOptional<z.ZodString>;
367
367
  redirectToAfterSignIn: z.ZodOptional<z.ZodString>;
368
368
  redirectToAfterSignOut: z.ZodOptional<z.ZodString>;
369
+ }, z.core.$strip>, z.ZodObject<{
370
+ type: z.ZodLiteral<"dev-portal">;
371
+ apiBaseUrl: z.ZodOptional<z.ZodString>;
372
+ redirectToAfterSignUp: z.ZodOptional<z.ZodString>;
373
+ redirectToAfterSignIn: z.ZodOptional<z.ZodString>;
374
+ redirectToAfterSignOut: z.ZodOptional<z.ZodString>;
369
375
  }, z.core.$strip>], "type">;
370
376
  declare const FontConfigSchema: z.ZodUnion<readonly [z.ZodEnum<{
371
377
  Inter: "Inter";
@@ -6728,6 +6734,12 @@ export declare const ZudokuConfig: z.ZodObject<{
6728
6734
  redirectToAfterSignUp: z.ZodOptional<z.ZodString>;
6729
6735
  redirectToAfterSignIn: z.ZodOptional<z.ZodString>;
6730
6736
  redirectToAfterSignOut: z.ZodOptional<z.ZodString>;
6737
+ }, z.core.$strip>, z.ZodObject<{
6738
+ type: z.ZodLiteral<"dev-portal">;
6739
+ apiBaseUrl: z.ZodOptional<z.ZodString>;
6740
+ redirectToAfterSignUp: z.ZodOptional<z.ZodString>;
6741
+ redirectToAfterSignIn: z.ZodOptional<z.ZodString>;
6742
+ redirectToAfterSignOut: z.ZodOptional<z.ZodString>;
6731
6743
  }, z.core.$strip>], "type">>;
6732
6744
  search: z.ZodOptional<z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
6733
6745
  type: z.ZodLiteral<"inkeep">;
@@ -0,0 +1 @@
1
+ export declare const ProductionUnlockPage: () => import("react/jsx-runtime").JSX.Element;
@@ -11,6 +11,8 @@ export declare const useVerifiedEmail: () => {
11
11
  requestEmailVerification: (options?: AuthActionOptions) => Promise<void>;
12
12
  };
13
13
  export declare const useAuth: () => {
14
+ isBackendAvailable: boolean;
15
+ authMode: import("./state.js").AuthMode;
14
16
  login: (options?: AuthActionOptions) => Promise<void>;
15
17
  logout: () => Promise<void>;
16
18
  signup: (options?: AuthActionOptions) => Promise<void>;
@@ -0,0 +1,16 @@
1
+ export declare const DEV_PORTAL_PLACEHOLDER_API_URL = "https://dp-example.azurecontainerapps.io";
2
+ export type DevPortalAuthMode = "live" | "preview";
3
+ export type EndUserMeResponse = {
4
+ userId: string;
5
+ displayName: string | null;
6
+ subscriptions: Array<{
7
+ planSku: string;
8
+ status: string;
9
+ entitlementState: string | null;
10
+ currentPeriodEnd: string | null;
11
+ }>;
12
+ };
13
+ export type DevPortalAuthStatusResponse = {
14
+ available: boolean;
15
+ oidcConfigured: boolean;
16
+ };
@@ -0,0 +1,9 @@
1
+ import type { DevPortalAuthenticationConfig } from "../../../config/config.js";
2
+ import { type EndUserMeResponse } from "./dev-portal-constants.js";
3
+ export declare function resolveDevPortalApiBaseUrl(config: Pick<DevPortalAuthenticationConfig, "apiBaseUrl">): string | undefined;
4
+ export declare function isPlaceholderDevPortalApiUrl(apiBaseUrl: string | undefined): boolean;
5
+ export declare function toAbsoluteReturnUrl(pathOrUrl: string): string;
6
+ export declare function buildDevPortalLoginUrl(apiBaseUrl: string, returnUrl: string): string;
7
+ export declare function buildDevPortalLogoutUrl(apiBaseUrl: string, returnUrl: string): string;
8
+ export declare function probeDevPortalBackend(apiBaseUrl: string, fetchImpl?: typeof fetch): Promise<boolean>;
9
+ export declare function mapEndUserMeToProfile(me: EndUserMeResponse): import("../state.js").UserProfile;
@@ -0,0 +1,36 @@
1
+ import type { DevPortalAuthenticationConfig } from "../../../config/config.js";
2
+ import type { ZudokuContext } from "../../core/ZudokuContext.js";
3
+ import type { AuthActionContext, AuthActionOptions, AuthenticationPlugin, AuthenticationProviderInitializer } from "../authentication.js";
4
+ import { CoreAuthenticationPlugin } from "../AuthenticationPlugin.js";
5
+ import type { DevPortalAuthMode } from "./dev-portal-constants.js";
6
+ export type DevPortalProviderData = {
7
+ type: "dev-portal";
8
+ apiBaseUrl: string;
9
+ authMode: DevPortalAuthMode;
10
+ };
11
+ declare module "../state.js" {
12
+ interface ProviderDataRegistry {
13
+ "dev-portal": DevPortalProviderData;
14
+ }
15
+ }
16
+ export declare class DevPortalAuthenticationProvider extends CoreAuthenticationPlugin implements AuthenticationPlugin {
17
+ private readonly apiBaseUrl;
18
+ private readonly redirectToAfterSignIn;
19
+ private readonly redirectToAfterSignUp;
20
+ private readonly redirectToAfterSignOut;
21
+ private authMode;
22
+ private backendAvailable;
23
+ constructor({ apiBaseUrl, redirectToAfterSignIn, redirectToAfterSignUp, redirectToAfterSignOut, }: DevPortalAuthenticationConfig);
24
+ initialize(_context: ZudokuContext): Promise<void>;
25
+ onPageLoad: () => Promise<void>;
26
+ private syncBackendAvailability;
27
+ private setPreviewState;
28
+ private ensureLiveBackend;
29
+ refreshUserProfile(): Promise<boolean>;
30
+ signIn(_: AuthActionContext, { redirectTo }?: AuthActionOptions): Promise<void>;
31
+ signUp(_: AuthActionContext, { redirectTo }?: AuthActionOptions): Promise<void>;
32
+ signOut(_: AuthActionContext): Promise<void>;
33
+ signRequest(request: Request): Promise<Request>;
34
+ }
35
+ declare const devPortalAuth: AuthenticationProviderInitializer<DevPortalAuthenticationConfig>;
36
+ export default devPortalAuth;
@@ -1,11 +1,14 @@
1
1
  export interface ProviderDataRegistry {
2
2
  }
3
3
  export type ProviderData = [keyof ProviderDataRegistry] extends [never] ? unknown : ProviderDataRegistry[keyof ProviderDataRegistry];
4
+ export type AuthMode = "live" | "preview";
4
5
  export interface AuthState {
5
6
  isAuthenticated: boolean;
6
7
  isPending: boolean;
7
8
  profile: UserProfile | null;
8
9
  providerData: ProviderData | null;
10
+ isBackendAvailable: boolean;
11
+ authMode: AuthMode;
9
12
  setAuthenticationPending: () => void;
10
13
  setLoggedOut: () => void;
11
14
  setLoggedIn: (args: {
@@ -1,4 +1,4 @@
1
- import { type ButtonProps } from "@lukoweb/apitogo/ui/Button.js";
1
+ import { type ButtonProps } from "@mehdad67/apitogo/ui/Button.js";
2
2
  type ActionButtonProps = ButtonProps & {
3
3
  isPending?: boolean;
4
4
  };
@@ -1,4 +1,4 @@
1
- import { DialogContent } from "@lukoweb/apitogo/ui/Dialog.js";
1
+ import { DialogContent } from "@mehdad67/apitogo/ui/Dialog.js";
2
2
  import type { DialogProps } from "@radix-ui/react-dialog";
3
3
  import { Command as CommandPrimitive } from "cmdk";
4
4
  import type { ComponentPropsWithoutRef } from "react";
@@ -1,4 +1,4 @@
1
- import { Alert } from "@lukoweb/apitogo/ui/Alert.js";
1
+ import { Alert } from "@mehdad67/apitogo/ui/Alert.js";
2
2
  import type { MDXComponents } from "mdx/types.js";
3
3
  import { Badge } from "../ui/Badge.js";
4
4
  export type MdxComponentsType = Readonly<MDXComponents> | null | undefined;
@@ -305,6 +305,12 @@ export interface FlatZudokuConfig {
305
305
  redirectToAfterSignUp?: string
306
306
  redirectToAfterSignIn?: string
307
307
  redirectToAfterSignOut?: string
308
+ } | {
309
+ type: "dev-portal"
310
+ apiBaseUrl?: string
311
+ redirectToAfterSignUp?: string
312
+ redirectToAfterSignIn?: string
313
+ redirectToAfterSignOut?: string
308
314
  })
309
315
  search?: ({
310
316
  type: "inkeep"
@@ -15,12 +15,42 @@ the authentication provider you use.
15
15
 
16
16
  ## Authentication Providers
17
17
 
18
- APIToGo supports Clerk, Auth0, Supabase, Azure B2C, and any OpenID provider that supports the OpenID
19
- Connect protocol.
18
+ APIToGo supports Clerk, Auth0, Supabase, Azure B2C, any OpenID provider that supports the OpenID
19
+ Connect protocol, and **dev-portal** (backend-delegated OIDC for APItoGo provisioned developer
20
+ portals).
20
21
 
21
22
  Not seeing your authentication provider?
22
23
  [Let us know](https://github.com/lukoweb/apitogo-doc-tool/issues)
23
24
 
25
+ ### Dev portal (APItoGo)
26
+
27
+ For sites provisioned through APItoGo MCP, use backend-delegated authentication. The static site
28
+ redirects sign-in to the provisioned dev-portal API; OIDC client credentials stay on the backend
29
+ only.
30
+
31
+ ```typescript
32
+ {
33
+ // ...
34
+ authentication: {
35
+ type: "dev-portal",
36
+ },
37
+ // ...
38
+ }
39
+ ```
40
+
41
+ Set the backend API URL via environment variable (MCP writes this at scaffold/publish):
42
+
43
+ ```bash
44
+ VITE_APITOGO_DEV_PORTAL_API_URL=https://your-dev-portal-api.example.com
45
+ ```
46
+
47
+ **Local preview:** When the backend URL is a placeholder or unreachable, the account area shows a
48
+ message that sign-in unlocks after publish. Docs and API reference remain public.
49
+
50
+ **Production:** Register one OIDC app with redirect URI `https://{backend}/signin-oidc` (see MCP
51
+ `manualSteps.oidcRedirectUri`). The frontend uses cookie sessions via `credentials: "include"` on
52
+ `/api/v1/auth/me`.
53
+
24
54
  ### Auth0
25
55
 
26
56
  For Auth0, you will need the `clientId` associated with the domain you are using.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mehdad67/apitogo",
3
- "version": "0.1.26",
3
+ "version": "0.1.28",
4
4
  "type": "module",
5
5
  "sideEffects": [
6
6
  "**/*.css",
@@ -46,6 +46,7 @@
46
46
  "./auth/supabase": "./src/lib/authentication/providers/supabase.tsx",
47
47
  "./auth/azureb2c": "./src/lib/authentication/providers/azureb2c.tsx",
48
48
  "./auth/firebase": "./src/lib/authentication/providers/firebase.tsx",
49
+ "./auth/dev-portal": "./src/lib/authentication/providers/dev-portal.tsx",
49
50
  "./plugins": "./src/lib/core/plugins.ts",
50
51
  "./plugins/api-keys": "./src/lib/plugins/api-keys/index.tsx",
51
52
  "./plugins/markdown": "./src/lib/plugins/markdown/index.tsx",
@@ -295,6 +296,10 @@
295
296
  "types": "./dist/declarations/lib/authentication/providers/firebase.d.ts",
296
297
  "default": "./src/lib/authentication/providers/firebase.tsx"
297
298
  },
299
+ "./auth/dev-portal": {
300
+ "types": "./dist/declarations/lib/authentication/providers/dev-portal.d.ts",
301
+ "default": "./src/lib/authentication/providers/dev-portal.tsx"
302
+ },
298
303
  "./plugins": {
299
304
  "types": "./dist/declarations/lib/core/plugins.d.ts",
300
305
  "default": "./src/lib/core/plugins.ts"
package/src/app/main.tsx CHANGED
@@ -1,5 +1,5 @@
1
- import { Apitogo } from "@lukoweb/apitogo/components";
2
- import { Outlet } from "@lukoweb/apitogo/router";
1
+ import { Apitogo } from "@mehdad67/apitogo/components";
2
+ import { Outlet } from "@mehdad67/apitogo/router";
3
3
  import type { RouteObject } from "react-router";
4
4
  import type { HighlighterCore } from "shiki";
5
5
  import { configuredApiKeysPlugin } from "virtual:zudoku-api-keys-plugin";
@@ -68,3 +68,7 @@ export type AzureB2CAuthenticationConfig = Extract<
68
68
  AuthenticationConfig,
69
69
  { type: "azureb2c" }
70
70
  >;
71
+ export type DevPortalAuthenticationConfig = Extract<
72
+ AuthenticationConfig,
73
+ { type: "dev-portal" }
74
+ >;
@@ -491,6 +491,13 @@ const AuthenticationSchema = z.discriminatedUnion("type", [
491
491
  redirectToAfterSignIn: z.string().optional(),
492
492
  redirectToAfterSignOut: z.string().optional(),
493
493
  }),
494
+ z.object({
495
+ type: z.literal("dev-portal"),
496
+ apiBaseUrl: z.string().optional(),
497
+ redirectToAfterSignUp: z.string().optional(),
498
+ redirectToAfterSignIn: z.string().optional(),
499
+ redirectToAfterSignOut: z.string().optional(),
500
+ }),
494
501
  ]);
495
502
 
496
503
  const MetadataSchema = z
@@ -21,6 +21,9 @@ export const getIssuer = async (config: ZudokuConfig) => {
21
21
  case "firebase": {
22
22
  return `https://securetoken.google.com/${config.authentication.projectId}`;
23
23
  }
24
+ case "dev-portal": {
25
+ return undefined;
26
+ }
24
27
  case undefined: {
25
28
  return undefined;
26
29
  }
@@ -1,4 +1,4 @@
1
- import { useZudoku } from "@lukoweb/apitogo/components";
1
+ import { useZudoku } from "@mehdad67/apitogo/components";
2
2
  import { useSuspenseQuery } from "@tanstack/react-query";
3
3
  import { Navigate } from "react-router";
4
4
  import { joinUrl } from "../../util/joinUrl.js";
@@ -0,0 +1,27 @@
1
+ import { Button } from "@mehdad67/apitogo/ui/Button.js";
2
+ import { Link } from "react-router";
3
+ import { Layout } from "../../components/Layout.js";
4
+
5
+ export const ProductionUnlockPage = () => (
6
+ <Layout>
7
+ <div className="mx-auto flex min-h-[50vh] max-w-lg flex-col items-center justify-center gap-4 px-4 text-center">
8
+ <h1 className="text-2xl font-semibold tracking-tight">
9
+ Account sign-in unlocks after publish
10
+ </h1>
11
+ <p className="text-muted-foreground">
12
+ Your developer portal account area uses live authentication backed by
13
+ APItoGo. Preview this site locally for docs and API reference; sign-in,
14
+ plans, and subscriptions activate once the portal is published to
15
+ production.
16
+ </p>
17
+ <div className="flex flex-wrap items-center justify-center gap-3">
18
+ <Button asChild variant="default">
19
+ <Link to="/introduction">Browse documentation</Link>
20
+ </Button>
21
+ <Button asChild variant="outline">
22
+ <Link to="/">Back to home</Link>
23
+ </Button>
24
+ </div>
25
+ </div>
26
+ </Layout>
27
+ );
@@ -1,11 +1,11 @@
1
- import { Spinner } from "@lukoweb/apitogo/components";
1
+ import { Spinner } from "@mehdad67/apitogo/components";
2
2
  import {
3
3
  Card,
4
4
  CardContent,
5
5
  CardDescription,
6
6
  CardHeader,
7
7
  CardTitle,
8
- } from "@lukoweb/apitogo/ui/Card.js";
8
+ } from "@mehdad67/apitogo/ui/Card.js";
9
9
  import { useEffect } from "react";
10
10
  import { useSearchParams } from "react-router";
11
11
  import { useLatest } from "../../util/useLatest.js";
@@ -1,11 +1,11 @@
1
- import { Button, Link } from "@lukoweb/apitogo/components";
1
+ import { Button, Link } from "@mehdad67/apitogo/components";
2
2
  import {
3
3
  Card,
4
4
  CardContent,
5
5
  CardDescription,
6
6
  CardHeader,
7
7
  CardTitle,
8
- } from "@lukoweb/apitogo/ui/Card.js";
8
+ } from "@mehdad67/apitogo/ui/Card.js";
9
9
  import { useEffect } from "react";
10
10
  import { useSearchParams } from "react-router";
11
11
  import { useLatest } from "../../util/useLatest.js";