@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.
- package/dist/cli/cli.js +51 -36
- package/dist/declarations/config/config.d.ts +3 -0
- package/dist/declarations/config/validators/ZudokuConfig.d.ts +12 -0
- package/dist/declarations/lib/authentication/components/ProductionUnlockPage.d.ts +1 -0
- package/dist/declarations/lib/authentication/hook.d.ts +2 -0
- package/dist/declarations/lib/authentication/providers/dev-portal-constants.d.ts +16 -0
- package/dist/declarations/lib/authentication/providers/dev-portal-utils.d.ts +9 -0
- package/dist/declarations/lib/authentication/providers/dev-portal.d.ts +36 -0
- package/dist/declarations/lib/authentication/state.d.ts +3 -0
- package/dist/declarations/lib/ui/ActionButton.d.ts +1 -1
- package/dist/declarations/lib/ui/Command.d.ts +1 -1
- package/dist/declarations/lib/util/MdxComponents.d.ts +1 -1
- package/dist/flat-config.d.ts +6 -0
- package/docs/configuration/authentication.md +32 -2
- package/package.json +6 -1
- package/src/app/main.tsx +2 -2
- package/src/config/config.ts +4 -0
- package/src/config/validators/ZudokuConfig.ts +7 -0
- package/src/lib/auth/issuer.ts +3 -0
- package/src/lib/authentication/components/CallbackHandler.tsx +1 -1
- package/src/lib/authentication/components/ProductionUnlockPage.tsx +27 -0
- package/src/lib/authentication/components/SignIn.tsx +2 -2
- package/src/lib/authentication/components/SignUp.tsx +2 -2
- package/src/lib/authentication/hook.ts +2 -0
- package/src/lib/authentication/providers/clerk.tsx +1 -1
- package/src/lib/authentication/providers/dev-portal-constants.ts +21 -0
- package/src/lib/authentication/providers/dev-portal-utils.ts +107 -0
- package/src/lib/authentication/providers/dev-portal.tsx +218 -0
- package/src/lib/authentication/state.ts +12 -0
- package/src/lib/authentication/ui/AuthCard.tsx +1 -1
- package/src/lib/authentication/ui/EmailLinkCallbackUi.tsx +5 -5
- package/src/lib/authentication/ui/EmailLinkSentUi.tsx +3 -3
- package/src/lib/authentication/ui/EmailLinkSignInUi.tsx +4 -4
- package/src/lib/authentication/ui/EmailVerificationUi.tsx +4 -4
- package/src/lib/authentication/ui/ZudokuAuthUi.tsx +6 -6
- package/src/lib/components/AiAssistantMenuItems.tsx +1 -1
- package/src/lib/components/Autocomplete.tsx +2 -2
- package/src/lib/components/DeveloperHint.tsx +1 -1
- package/src/lib/components/Header.tsx +4 -4
- package/src/lib/components/LandingLayout.tsx +1 -1
- package/src/lib/components/Layout.tsx +1 -1
- package/src/lib/components/Main.tsx +1 -1
- package/src/lib/components/Mermaid.tsx +1 -1
- package/src/lib/components/MobileTopNavigation.tsx +6 -5
- package/src/lib/components/MultiSelect.tsx +1 -1
- package/src/lib/components/TopNavigation.tsx +1 -1
- package/src/lib/components/context/ZudokuContext.ts +1 -1
- package/src/lib/components/navigation/NavigationCategory.tsx +1 -1
- package/src/lib/components/navigation/NavigationFilterInput.tsx +1 -1
- package/src/lib/components/navigation/NavigationItem.tsx +2 -2
- package/src/lib/core/RouteGuard.tsx +13 -3
- package/src/lib/errors/ErrorMessage.tsx +2 -2
- package/src/lib/plugins/api-catalog/Catalog.tsx +1 -1
- package/src/lib/plugins/api-keys/CreateApiKey.tsx +4 -4
- package/src/lib/plugins/api-keys/CreateApiKeyDialog.tsx +1 -1
- package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +3 -3
- package/src/lib/plugins/api-keys/settings/ApiKeyItem.tsx +5 -5
- package/src/lib/plugins/api-keys/settings/RevealApiKey.tsx +3 -3
- package/src/lib/plugins/markdown/MdxPage.tsx +3 -3
- package/src/lib/plugins/openapi/ApiHeader.tsx +1 -1
- package/src/lib/plugins/openapi/CollapsibleCode.tsx +2 -2
- package/src/lib/plugins/openapi/DownloadSchemaButton.tsx +3 -3
- package/src/lib/plugins/openapi/GeneratedExampleSidecarBox.tsx +2 -2
- package/src/lib/plugins/openapi/OperationListItem.tsx +2 -2
- package/src/lib/plugins/openapi/RequestBodySidecarBox.tsx +2 -2
- package/src/lib/plugins/openapi/ResponsesSidecarBox.tsx +4 -4
- package/src/lib/plugins/openapi/SchemaInfo.tsx +1 -1
- package/src/lib/plugins/openapi/SchemaList.tsx +2 -2
- package/src/lib/plugins/openapi/Sidecar.tsx +4 -4
- package/src/lib/plugins/openapi/SidecarExamples.tsx +2 -2
- package/src/lib/plugins/openapi/components/EnumValues.tsx +1 -1
- package/src/lib/plugins/openapi/components/ResponseContent.tsx +3 -3
- package/src/lib/plugins/openapi/playground/BodyPanel.tsx +4 -4
- package/src/lib/plugins/openapi/playground/CollapsibleHeader.tsx +1 -1
- package/src/lib/plugins/openapi/playground/ExamplesDropdown.tsx +2 -2
- package/src/lib/plugins/openapi/playground/Headers.tsx +3 -3
- package/src/lib/plugins/openapi/playground/IdentityDialog.tsx +5 -5
- package/src/lib/plugins/openapi/playground/IdentitySelector.tsx +2 -2
- package/src/lib/plugins/openapi/playground/ParamsGrid.tsx +2 -2
- package/src/lib/plugins/openapi/playground/Playground.tsx +4 -4
- package/src/lib/plugins/openapi/playground/PlaygroundDialog.tsx +3 -3
- package/src/lib/plugins/openapi/playground/QueryParams.tsx +2 -2
- package/src/lib/plugins/openapi/playground/RequestLoginDialog.tsx +4 -4
- package/src/lib/plugins/openapi/playground/request-panel/MultipartField.tsx +2 -2
- package/src/lib/plugins/openapi/playground/result-panel/AudioPlayer.tsx +1 -1
- package/src/lib/plugins/openapi/playground/result-panel/ResponseTab.tsx +5 -5
- package/src/lib/plugins/openapi/playground/result-panel/ResultPanel.tsx +2 -2
- package/src/lib/plugins/openapi/schema/SchemaPropertyItem.tsx +1 -1
- package/src/lib/plugins/openapi/schema/SchemaView.tsx +2 -2
- package/src/lib/plugins/search-pagefind/IndexingDialog.tsx +2 -2
- package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +4 -4
- package/src/lib/plugins/search-pagefind/ResultList.tsx +1 -1
- package/src/lib/ui/ActionButton.tsx +1 -1
- package/src/lib/ui/Command.tsx +1 -1
- package/src/lib/util/MdxComponents.tsx +2 -2
- package/src/vite/config.ts +4 -4
- package/src/vite/plugin-api-keys.ts +1 -1
- package/src/vite/plugin-api.ts +2 -2
- package/src/vite/plugin-auth.ts +1 -1
- package/src/vite/plugin-component.ts +5 -5
- package/src/vite/plugin-config.ts +1 -1
- package/src/vite/plugin-custom-pages.ts +1 -1
- package/src/vite/plugin-docs.ts +1 -1
- package/src/vite/plugin-mdx.ts +1 -1
- package/src/vite/plugin-modules.ts +2 -2
- package/src/vite/plugin-navigation.ts +1 -1
- package/src/vite/plugin-search.ts +2 -2
- 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("@
|
|
24
|
-
getZudokuRootDir = () => path.dirname(getPackageJsonPath("@
|
|
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: "@
|
|
4114
|
-
version: "0.1.
|
|
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": "@
|
|
4169
|
-
"./modules/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": "@
|
|
4442
|
-
"./modules/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 "@
|
|
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 "@
|
|
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 "@
|
|
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 "@
|
|
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 "@
|
|
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
|
-
["@
|
|
6730
|
+
["@mehdad67/apitogo/components", "src/lib/components/index.ts"],
|
|
6716
6731
|
[
|
|
6717
|
-
"@
|
|
6732
|
+
"@mehdad67/apitogo/plugins/openapi",
|
|
6718
6733
|
"src/lib/plugins/openapi/index.tsx"
|
|
6719
6734
|
],
|
|
6720
6735
|
[
|
|
6721
|
-
"@
|
|
6736
|
+
"@mehdad67/apitogo/plugins/api-catalog",
|
|
6722
6737
|
"src/lib/plugins/api-catalog/index.tsx"
|
|
6723
6738
|
],
|
|
6724
6739
|
[
|
|
6725
|
-
"@
|
|
6740
|
+
"@mehdad67/apitogo/plugins/search-inkeep",
|
|
6726
6741
|
"src/lib/plugins/search-inkeep/index.tsx"
|
|
6727
6742
|
],
|
|
6728
6743
|
[
|
|
6729
|
-
"@
|
|
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 "@
|
|
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 "@
|
|
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 "@
|
|
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" : "@
|
|
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")) : "@
|
|
7641
|
-
var getUserPanelModuleImport = (moduleDir, mode) => mode === "internal" ? normalizePath2(path18.join(moduleDir, "../module-user-panel/src/index.tsx")) : "@
|
|
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 "@
|
|
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 "@
|
|
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: ["@
|
|
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
|
-
"@
|
|
8030
|
+
"@mehdad67/apitogo/app/entry.server.tsx",
|
|
8016
8031
|
config2.__meta.configPath
|
|
8017
|
-
] : "@
|
|
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: ["@
|
|
8053
|
+
exclude: ["@mehdad67/apitogo"],
|
|
8039
8054
|
include: [
|
|
8040
8055
|
"react-dom/client",
|
|
8041
|
-
"@
|
|
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 @
|
|
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 @
|
|
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 @
|
|
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
|
-
"@
|
|
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 "@
|
|
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 { DialogContent } from "@
|
|
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 "@
|
|
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;
|
package/dist/flat-config.d.ts
CHANGED
|
@@ -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,
|
|
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.
|
|
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 "@
|
|
2
|
-
import { Outlet } from "@
|
|
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";
|
package/src/config/config.ts
CHANGED
|
@@ -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
|
package/src/lib/auth/issuer.ts
CHANGED
|
@@ -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
|
}
|
|
@@ -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 "@
|
|
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 "@
|
|
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 "@
|
|
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 "@
|
|
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";
|