@lukoweb/apitogo 0.1.23 → 0.1.37
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/README.md +92 -0
- package/cli.js +13 -13
- package/client.d.ts +8 -8
- package/dist/cli/cli.js +1117 -624
- package/dist/declarations/config/config.d.ts +4 -0
- package/dist/declarations/config/loader.d.ts +2 -0
- package/dist/declarations/config/resolve-modules.d.ts +34 -0
- package/dist/declarations/config/validators/InputNavigationSchema.d.ts +7 -7
- package/dist/declarations/config/validators/ModulesSchema.d.ts +417 -0
- package/dist/declarations/config/validators/ZudokuConfig.d.ts +123 -4
- package/dist/declarations/index.d.ts +3 -1
- package/dist/declarations/lib/authentication/components/ProductionUnlockPage.d.ts +1 -0
- package/dist/declarations/lib/authentication/hook.d.ts +3 -19
- 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 +39 -0
- package/dist/declarations/lib/authentication/state.d.ts +12 -26
- package/dist/declarations/lib/components/LandingLayout.d.ts +4 -0
- package/dist/declarations/lib/components/index.d.ts +2 -0
- package/dist/declarations/lib/plugins/api-keys/index.d.ts +2 -1
- package/dist/flat-config.d.ts +209 -24
- package/docs/components/alert.mdx +130 -0
- package/docs/components/badge.mdx +70 -0
- package/docs/components/button.mdx +132 -0
- package/docs/components/callout.mdx +112 -0
- package/docs/components/card.mdx +104 -0
- package/docs/components/checkbox.mdx +72 -0
- package/docs/components/client-only.mdx +79 -0
- package/docs/components/code-tabs.mdx +179 -0
- package/docs/components/dialog.mdx +167 -0
- package/docs/components/head.mdx +200 -0
- package/docs/components/icons.mdx +27 -0
- package/docs/components/input.mdx +96 -0
- package/docs/components/label.mdx +86 -0
- package/docs/components/link.mdx +242 -0
- package/docs/components/markdown.mdx +151 -0
- package/docs/components/mermaid.mdx +81 -0
- package/docs/components/playground.mdx +87 -0
- package/docs/components/secret.mdx +79 -0
- package/docs/components/select.mdx +176 -0
- package/docs/components/shadcn.mdx +73 -0
- package/docs/components/slider.mdx +108 -0
- package/docs/components/slot.mdx +119 -0
- package/docs/components/stepper.mdx +138 -0
- package/docs/components/switch.mdx +96 -0
- package/docs/components/syntax-highlight.mdx +602 -0
- package/docs/components/textarea.mdx +78 -0
- package/docs/components/tooltip.mdx +195 -0
- package/docs/components/typography.mdx +61 -0
- package/docs/concepts/auth-provider-api-identities.md +109 -0
- package/docs/configuration/ai-assistants.md +65 -0
- package/docs/configuration/api-catalog.md +109 -0
- package/docs/configuration/api-reference.md +397 -0
- package/docs/configuration/authentication-auth0.md +174 -0
- package/docs/configuration/authentication-azure-ad.md +238 -0
- package/docs/configuration/authentication-clerk.md +110 -0
- package/docs/configuration/authentication-firebase.md +62 -0
- package/docs/configuration/authentication-pingfederate.md +136 -0
- package/docs/configuration/authentication-supabase.md +226 -0
- package/docs/configuration/authentication.md +231 -0
- package/docs/configuration/build-configuration.mdx +147 -0
- package/docs/configuration/docs.md +282 -0
- package/docs/configuration/footer.mdx +214 -0
- package/docs/configuration/llms.md +90 -0
- package/docs/configuration/make-config.mdx +90 -0
- package/docs/configuration/navigation.mdx +422 -0
- package/docs/configuration/overview.md +380 -0
- package/docs/configuration/protected-routes.md +150 -0
- package/docs/configuration/search.md +163 -0
- package/docs/configuration/sentry.mdx +44 -0
- package/docs/configuration/site.md +124 -0
- package/docs/configuration/slots.mdx +125 -0
- package/docs/configuration/vite-config.md +18 -0
- package/docs/custom-plugins.md +285 -0
- package/docs/customization/colors-theme.mdx +276 -0
- package/docs/customization/fonts.md +110 -0
- package/docs/deploy/apache-nginx.md +41 -0
- package/docs/deploy/apitogo.md +139 -0
- package/docs/deploy/cloudflare-pages.md +75 -0
- package/docs/deploy/direct-upload.md +18 -0
- package/docs/deploy/github-pages.md +50 -0
- package/docs/deploy/vercel.md +103 -0
- package/docs/deployment.md +21 -0
- package/docs/extending/events.md +124 -0
- package/docs/guides/custom-pages.md +106 -0
- package/docs/guides/environment-variables.md +99 -0
- package/docs/guides/managing-api-keys-and-identities.md +172 -0
- package/docs/guides/mermaid.mdx +70 -0
- package/docs/guides/navigation-migration.md +87 -0
- package/docs/guides/navigation-rules.mdx +203 -0
- package/docs/guides/processors.mdx +234 -0
- package/docs/guides/static-files.md +55 -0
- package/docs/guides/transforming-examples.md +156 -0
- package/docs/guides/using-multiple-apis.md +87 -0
- package/docs/markdown/admonitions.md +128 -0
- package/docs/markdown/code-blocks.md +196 -0
- package/docs/markdown/frontmatter.md +173 -0
- package/docs/markdown/mdx.md +68 -0
- package/docs/markdown/overview.md +275 -0
- package/docs/plugins.md +5 -0
- package/docs/quickstart.md +87 -0
- package/docs/writing.mdx +72 -0
- package/package.json +170 -116
- package/src/app/ZuploBuildConfig.ts +36 -36
- package/src/app/defaultTheme.css +77 -77
- package/src/app/demo-cdn.html +37 -37
- package/src/app/demo.html +21 -21
- package/src/app/demo.tsx +77 -77
- package/src/app/entry.client.tsx +118 -118
- package/src/app/entry.server.tsx +160 -160
- package/src/app/env.ts +40 -40
- package/src/app/font.geist.css +73 -73
- package/src/app/main.css +390 -390
- package/src/app/main.tsx +8 -1
- package/src/app/polyfills.ts +47 -47
- package/src/app/processRoutes.tsx +51 -25
- package/src/app/sentry.ts +24 -24
- package/src/app/standalone.html +23 -23
- package/src/app/standalone.tsx +60 -60
- package/src/app/utils/createRedirectRoutes.ts +11 -11
- package/src/config/config.ts +32 -0
- package/src/config/create-plugin.ts +71 -71
- package/src/config/file-exists.ts +6 -6
- package/src/config/loader.ts +11 -1
- package/src/config/resolve-modules.ts +260 -0
- package/src/config/validators/BuildSchema.ts +95 -95
- package/src/config/validators/HeaderNavigationSchema.ts +41 -41
- package/src/config/validators/InputNavigationSchema.test-d.ts +178 -178
- package/src/config/validators/InputNavigationSchema.ts +206 -206
- package/src/config/validators/ModulesSchema.ts +312 -0
- package/src/config/validators/ProtectedRoutesSchema.ts +35 -35
- package/src/config/validators/ZudokuConfig.ts +766 -729
- package/src/config/validators/auth.ts +3 -3
- package/src/config/validators/reason-codes.ts +7 -7
- package/src/env.d.ts +11 -11
- package/src/index.ts +31 -0
- package/src/lib/MissingIcon.tsx +22 -22
- package/src/lib/assets/language-icons/bun.tsx +50 -50
- package/src/lib/assets/language-icons/c.tsx +31 -31
- package/src/lib/assets/language-icons/commonlisp.tsx +22 -22
- package/src/lib/assets/language-icons/cpp.tsx +35 -35
- package/src/lib/assets/language-icons/csharp.tsx +35 -35
- package/src/lib/assets/language-icons/css.tsx +36 -36
- package/src/lib/assets/language-icons/dart.tsx +39 -39
- package/src/lib/assets/language-icons/elixir.tsx +19 -19
- package/src/lib/assets/language-icons/go.tsx +19 -19
- package/src/lib/assets/language-icons/graphql.tsx +19 -19
- package/src/lib/assets/language-icons/html.tsx +24 -24
- package/src/lib/assets/language-icons/java.tsx +35 -35
- package/src/lib/assets/language-icons/javascript.tsx +11 -11
- package/src/lib/assets/language-icons/json.tsx +19 -19
- package/src/lib/assets/language-icons/kotlin.tsx +30 -30
- package/src/lib/assets/language-icons/markdown.tsx +19 -19
- package/src/lib/assets/language-icons/mdx.tsx +23 -23
- package/src/lib/assets/language-icons/npm.tsx +15 -15
- package/src/lib/assets/language-icons/objectivec.tsx +23 -23
- package/src/lib/assets/language-icons/ocaml.tsx +34 -34
- package/src/lib/assets/language-icons/php.tsx +19 -19
- package/src/lib/assets/language-icons/pnpm.tsx +32 -32
- package/src/lib/assets/language-icons/powershell.tsx +27 -27
- package/src/lib/assets/language-icons/python.tsx +23 -23
- package/src/lib/assets/language-icons/react.tsx +21 -21
- package/src/lib/assets/language-icons/ruby.tsx +19 -19
- package/src/lib/assets/language-icons/rust.tsx +19 -19
- package/src/lib/assets/language-icons/scala.tsx +19 -19
- package/src/lib/assets/language-icons/shell.tsx +19 -19
- package/src/lib/assets/language-icons/swift.tsx +19 -19
- package/src/lib/assets/language-icons/toml.tsx +23 -23
- package/src/lib/assets/language-icons/typescript.tsx +23 -23
- package/src/lib/assets/language-icons/xml.tsx +19 -19
- package/src/lib/assets/language-icons/yaml.tsx +23 -23
- package/src/lib/assets/language-icons/yarn.tsx +17 -17
- package/src/lib/assets/language-icons/zig.tsx +32 -32
- package/src/lib/auth/issuer.ts +34 -31
- package/src/lib/authentication/AuthenticationPlugin.tsx +33 -33
- package/src/lib/authentication/authentication.ts +48 -48
- package/src/lib/authentication/components/OAuthErrorPage.tsx +197 -197
- package/src/lib/authentication/components/ProductionUnlockPage.tsx +27 -0
- package/src/lib/authentication/components/SignOut.tsx +15 -15
- package/src/lib/authentication/constants.ts +1 -1
- package/src/lib/authentication/errors.ts +34 -34
- package/src/lib/authentication/hook.ts +141 -139
- package/src/lib/authentication/providers/auth0.tsx +91 -91
- package/src/lib/authentication/providers/azureb2c.tsx +223 -223
- 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 +270 -0
- package/src/lib/authentication/providers/firebase.tsx +486 -486
- package/src/lib/authentication/providers/openid.tsx +516 -516
- package/src/lib/authentication/providers/supabase.tsx +412 -412
- package/src/lib/authentication/providers/util.ts +26 -26
- package/src/lib/authentication/state.ts +179 -91
- package/src/lib/authentication/ui/icons/Apple.tsx +10 -10
- package/src/lib/authentication/ui/icons/Facebook.tsx +15 -15
- package/src/lib/authentication/ui/icons/Github.tsx +16 -16
- package/src/lib/authentication/ui/icons/Google.tsx +16 -16
- package/src/lib/authentication/ui/icons/Microsoft.tsx +12 -12
- package/src/lib/authentication/ui/icons/X.tsx +10 -10
- package/src/lib/authentication/utils/relativeRedirectUrl.ts +16 -16
- package/src/lib/components/AnchorLink.tsx +24 -24
- package/src/lib/components/Banner.tsx +52 -52
- package/src/lib/components/Bootstrap.tsx +77 -77
- package/src/lib/components/BuildCheck.tsx +87 -87
- package/src/lib/components/CategoryHeading.tsx +19 -19
- package/src/lib/components/ClientOnly.tsx +19 -19
- package/src/lib/components/ErrorPage.tsx +26 -26
- package/src/lib/components/Footer.tsx +140 -140
- package/src/lib/components/Framed.tsx +51 -51
- package/src/lib/components/Header.tsx +11 -3
- package/src/lib/components/HeaderNavigation.tsx +148 -148
- package/src/lib/components/Heading.tsx +84 -84
- package/src/lib/components/InlineCode.tsx +15 -15
- package/src/lib/components/LandingLayout.tsx +21 -0
- package/src/lib/components/LanguageIcon.tsx +199 -199
- package/src/lib/components/Markdown.tsx +55 -55
- package/src/lib/components/Meta.tsx +46 -46
- package/src/lib/components/MobileTopNavigation.tsx +11 -3
- package/src/lib/components/NotFoundPage.tsx +37 -37
- package/src/lib/components/PageProgress.tsx +28 -28
- package/src/lib/components/PagefindSearchMeta.tsx +14 -14
- package/src/lib/components/Pagination.tsx +44 -44
- package/src/lib/components/PathRenderer.tsx +61 -61
- package/src/lib/components/PluginHeads.tsx +17 -17
- package/src/lib/components/Search.tsx +70 -70
- package/src/lib/components/Slot.tsx +64 -64
- package/src/lib/components/Spinner.tsx +5 -5
- package/src/lib/components/StatusPage.tsx +96 -96
- package/src/lib/components/ThemeSwitch.tsx +49 -49
- package/src/lib/components/Typography.tsx +12 -12
- package/src/lib/components/Zudoku.tsx +106 -106
- package/src/lib/components/cache.ts +27 -27
- package/src/lib/components/context/RenderContext.ts +11 -11
- package/src/lib/components/context/RouterEventsEmitter.tsx +19 -19
- package/src/lib/components/context/SlotProvider.tsx +149 -149
- package/src/lib/components/context/ViewportAnchorContext.tsx +137 -137
- package/src/lib/components/context/ZudokuContext.ts +140 -140
- package/src/lib/components/context/ZudokuProvider.tsx +22 -22
- package/src/lib/components/context/ZudokuReactContext.tsx +17 -17
- package/src/lib/components/index.ts +2 -0
- package/src/lib/components/navigation/Navigation.tsx +51 -51
- package/src/lib/components/navigation/NavigationBadge.tsx +48 -48
- package/src/lib/components/navigation/NavigationFilterContext.tsx +28 -28
- package/src/lib/components/navigation/NavigationWrapper.tsx +49 -49
- package/src/lib/components/navigation/Toc.tsx +137 -137
- package/src/lib/components/navigation/ZudokuLogo.tsx +25 -25
- package/src/lib/components/navigation/ZuploLogo.tsx +14 -14
- package/src/lib/components/navigation/utils.ts +234 -234
- package/src/lib/core/RouteGuard.tsx +11 -1
- package/src/lib/core/ZudokuContext.ts +271 -271
- package/src/lib/core/plugins.ts +138 -138
- package/src/lib/core/react-query.ts +1 -1
- package/src/lib/core/router.ts +1 -1
- package/src/lib/core/transform-config.ts +67 -67
- package/src/lib/demo/DemoAnnouncement.tsx +17 -17
- package/src/lib/errors/ErrorAlert.tsx +28 -28
- package/src/lib/errors/RouterError.tsx +18 -18
- package/src/lib/errors/ServerError.tsx +5 -5
- package/src/lib/errors/TopLevelError.tsx +6 -6
- package/src/lib/hooks/index.ts +13 -13
- package/src/lib/hooks/useEvent.ts +41 -41
- package/src/lib/hooks/useHighlighter.ts +15 -15
- package/src/lib/hooks/useHotkey.ts +70 -70
- package/src/lib/icons.ts +2 -2
- package/src/lib/navigation/applyRules.ts +127 -127
- package/src/lib/navigation/pathMatcher.ts +81 -81
- package/src/lib/oas/graphql/circular.ts +69 -69
- package/src/lib/oas/graphql/constants.ts +2 -2
- package/src/lib/oas/graphql/index.ts +791 -791
- package/src/lib/oas/parser/dereference/index.ts +84 -84
- package/src/lib/oas/parser/dereference/resolveRef.ts +32 -32
- package/src/lib/oas/parser/index.ts +129 -129
- package/src/lib/oas/parser/schemas/v3.0.json +1489 -1489
- package/src/lib/oas/parser/schemas/v3.1.json +1298 -1298
- package/src/lib/oas/parser/upgrade/index.ts +174 -174
- package/src/lib/plugins/api-catalog/index.tsx +119 -119
- package/src/lib/plugins/api-keys/ProtectedRoute.tsx +33 -33
- package/src/lib/plugins/api-keys/index.tsx +274 -272
- package/src/lib/plugins/api-keys/settings/ApiKeyList.tsx +67 -67
- package/src/lib/plugins/custom-pages/index.tsx +32 -32
- package/src/lib/plugins/markdown/assets/ChatGPTLogo.tsx +11 -11
- package/src/lib/plugins/markdown/assets/ClaudeLogo.tsx +19 -19
- package/src/lib/plugins/markdown/index.tsx +62 -62
- package/src/lib/plugins/openapi/ColorizedParam.tsx +115 -115
- package/src/lib/plugins/openapi/Endpoint.tsx +85 -85
- package/src/lib/plugins/openapi/MCPEndpoint.tsx +273 -273
- package/src/lib/plugins/openapi/OasProvider.tsx +74 -74
- package/src/lib/plugins/openapi/OperationList.tsx +275 -275
- package/src/lib/plugins/openapi/ParamInfos.tsx +96 -96
- package/src/lib/plugins/openapi/ParameterList.tsx +53 -53
- package/src/lib/plugins/openapi/ParameterListItem.tsx +161 -161
- package/src/lib/plugins/openapi/PlaygroundDialogWrapper.tsx +67 -67
- package/src/lib/plugins/openapi/SidecarBox.tsx +57 -57
- package/src/lib/plugins/openapi/SimpleSelect.tsx +46 -46
- package/src/lib/plugins/openapi/client/GraphQLClient.tsx +73 -73
- package/src/lib/plugins/openapi/client/GraphQLContext.tsx +16 -16
- package/src/lib/plugins/openapi/client/createServer.ts +35 -35
- package/src/lib/plugins/openapi/client/useCreateQuery.ts +44 -44
- package/src/lib/plugins/openapi/components/ConstValue.tsx +24 -24
- package/src/lib/plugins/openapi/components/NonHighlightedCode.tsx +22 -22
- package/src/lib/plugins/openapi/components/SelectOnClick.tsx +29 -29
- package/src/lib/plugins/openapi/context.tsx +16 -16
- package/src/lib/plugins/openapi/graphql/fragment-masking.ts +104 -104
- package/src/lib/plugins/openapi/graphql/gql.ts +95 -95
- package/src/lib/plugins/openapi/graphql/graphql.ts +835 -835
- package/src/lib/plugins/openapi/graphql/index.ts +2 -2
- package/src/lib/plugins/openapi/index.tsx +221 -221
- package/src/lib/plugins/openapi/interfaces.ts +100 -100
- package/src/lib/plugins/openapi/playground/Headers.tsx +6 -6
- package/src/lib/plugins/openapi/playground/PathParams.tsx +53 -53
- package/src/lib/plugins/openapi/playground/Spinner.tsx +87 -87
- package/src/lib/plugins/openapi/playground/createUrl.ts +25 -25
- package/src/lib/plugins/openapi/playground/fileUtils.ts +36 -36
- package/src/lib/plugins/openapi/playground/rememberedIdentity.ts +26 -26
- package/src/lib/plugins/openapi/playground/request-panel/UrlPath.tsx +31 -31
- package/src/lib/plugins/openapi/playground/request-panel/UrlQueryParams.tsx +29 -29
- package/src/lib/plugins/openapi/playground/request-panel/useKeyValueFieldManager.ts +340 -340
- package/src/lib/plugins/openapi/playground/result-panel/ResponseStatusBar.tsx +117 -117
- package/src/lib/plugins/openapi/playground/result-panel/convertToTypes.ts +36 -36
- package/src/lib/plugins/openapi/playground/serializeQueryParams.ts +125 -125
- package/src/lib/plugins/openapi/playground/useRememberSkipLoginDialog.tsx +23 -23
- package/src/lib/plugins/openapi/processors/removeExtensions.ts +29 -29
- package/src/lib/plugins/openapi/processors/removeParameters.ts +103 -103
- package/src/lib/plugins/openapi/processors/removePaths.ts +57 -57
- package/src/lib/plugins/openapi/processors/traverse.ts +1 -1
- package/src/lib/plugins/openapi/schema/SchemaExampleAndDefault.tsx +39 -39
- package/src/lib/plugins/openapi/schema/UnionView.tsx +132 -132
- package/src/lib/plugins/openapi/schema/union-helpers.ts +123 -123
- package/src/lib/plugins/openapi/schema/utils.ts +49 -49
- package/src/lib/plugins/openapi/state.ts +36 -36
- package/src/lib/plugins/openapi/util/buildTagCategories.ts +54 -54
- package/src/lib/plugins/openapi/util/createHttpSnippet.ts +135 -135
- package/src/lib/plugins/openapi/util/createNavigationCategory.tsx +39 -39
- package/src/lib/plugins/openapi/util/generateSchemaExample.ts +191 -191
- package/src/lib/plugins/openapi/util/getRoutes.tsx +265 -265
- package/src/lib/plugins/openapi/util/methodColorMap.tsx +11 -11
- package/src/lib/plugins/openapi/util/methodToColor.ts +27 -27
- package/src/lib/plugins/openapi/util/sanitizeMarkdownForMetatag.tsx +32 -32
- package/src/lib/plugins/openapi/util/useWarmupSchema.ts +23 -23
- package/src/lib/plugins/search-inkeep/index.tsx +108 -108
- package/src/lib/plugins/search-inkeep/inkeep.ts +24 -24
- package/src/lib/plugins/search-pagefind/get-results.tsx +74 -74
- package/src/lib/plugins/search-pagefind/index.tsx +21 -21
- package/src/lib/plugins/search-pagefind/types.ts +118 -118
- package/src/lib/shiki-constants.ts +24 -24
- package/src/lib/testing/index.tsx +146 -146
- package/src/lib/ui/Accordion.tsx +55 -55
- package/src/lib/ui/Alert.tsx +84 -84
- package/src/lib/ui/AlertDialog.tsx +195 -195
- package/src/lib/ui/AspectRatio.tsx +5 -5
- package/src/lib/ui/Badge.tsx +48 -48
- package/src/lib/ui/Breadcrumb.tsx +115 -115
- package/src/lib/ui/Button.tsx +65 -65
- package/src/lib/ui/ButtonGroup.tsx +80 -80
- package/src/lib/ui/Callout.tsx +113 -113
- package/src/lib/ui/Card.tsx +95 -95
- package/src/lib/ui/Carousel.tsx +259 -259
- package/src/lib/ui/Checkbox.tsx +28 -28
- package/src/lib/ui/CodeBlock.tsx +92 -92
- package/src/lib/ui/CodeTabPanel.tsx +13 -13
- package/src/lib/ui/CodeTabs.tsx +161 -161
- package/src/lib/ui/Collapsible.tsx +31 -31
- package/src/lib/ui/Dialog.tsx +138 -138
- package/src/lib/ui/DismissibleAlert.tsx +74 -74
- package/src/lib/ui/Drawer.tsx +121 -121
- package/src/lib/ui/DropdownMenu.tsx +254 -254
- package/src/lib/ui/EmbeddedCodeBlock.tsx +99 -99
- package/src/lib/ui/Form.tsx +176 -176
- package/src/lib/ui/Frame.tsx +81 -81
- package/src/lib/ui/HoverCard.tsx +26 -26
- package/src/lib/ui/Input.tsx +23 -23
- package/src/lib/ui/InputGroup.tsx +168 -168
- package/src/lib/ui/Item.tsx +213 -213
- package/src/lib/ui/Kbd.tsx +28 -28
- package/src/lib/ui/Label.tsx +23 -23
- package/src/lib/ui/NativeSelect.tsx +48 -48
- package/src/lib/ui/NavigationMenu.tsx +169 -169
- package/src/lib/ui/Pagination.tsx +115 -115
- package/src/lib/ui/Popover.tsx +28 -28
- package/src/lib/ui/Progress.tsx +25 -25
- package/src/lib/ui/RadioGroup.tsx +41 -41
- package/src/lib/ui/ReactComponentDoc.tsx +68 -68
- package/src/lib/ui/ScrollArea.tsx +45 -45
- package/src/lib/ui/Secret.tsx +133 -133
- package/src/lib/ui/Select.tsx +184 -184
- package/src/lib/ui/Separator.tsx +25 -25
- package/src/lib/ui/Skeleton.tsx +15 -15
- package/src/lib/ui/Slider.tsx +25 -25
- package/src/lib/ui/Stepper.tsx +8 -8
- package/src/lib/ui/Switch.tsx +26 -26
- package/src/lib/ui/SyntaxHighlight.tsx +54 -54
- package/src/lib/ui/Tabs.tsx +52 -52
- package/src/lib/ui/Textarea.tsx +22 -22
- package/src/lib/ui/Toggle.tsx +42 -42
- package/src/lib/ui/ToggleGroup.tsx +58 -58
- package/src/lib/ui/Tooltip.tsx +65 -65
- package/src/lib/ui/Value.tsx +42 -42
- package/src/lib/ui/util.tsx +8 -8
- package/src/lib/util/cn.ts +6 -6
- package/src/lib/util/createVariantComponent.tsx +61 -61
- package/src/lib/util/ensureArray.ts +3 -3
- package/src/lib/util/flattenAllOf.ts +72 -72
- package/src/lib/util/flattenAllOfProcessor.ts +74 -74
- package/src/lib/util/hastToJsx.tsx +67 -67
- package/src/lib/util/humanFileSize.ts +15 -15
- package/src/lib/util/invariant.ts +52 -52
- package/src/lib/util/joinUrl.ts +60 -60
- package/src/lib/util/logInit.ts +9 -9
- package/src/lib/util/objectEntries.ts +5 -5
- package/src/lib/util/os.ts +18 -18
- package/src/lib/util/pastellize.ts +25 -25
- package/src/lib/util/problemJson.ts +63 -63
- package/src/lib/util/readFrontmatter.ts +14 -14
- package/src/lib/util/renderIf.ts +4 -4
- package/src/lib/util/scrollIntoViewIfNeeded.ts +18 -18
- package/src/lib/util/slugify.ts +21 -21
- package/src/lib/util/syncZustandState.ts +22 -22
- package/src/lib/util/traverse.ts +70 -70
- package/src/lib/util/types.ts +7 -7
- package/src/lib/util/url.ts +18 -18
- package/src/lib/util/useCopyToClipboard.ts +17 -17
- package/src/lib/util/useExposedProps.tsx +27 -27
- package/src/lib/util/useIsomorphicLayoutEffect.ts +6 -6
- package/src/lib/util/useLatest.ts +18 -18
- package/src/lib/util/useOnScreen.ts +34 -34
- package/src/lib/util/useScrollToAnchor.ts +70 -70
- package/src/lib/util/useScrollToTop.ts +18 -18
- package/src/types.d.ts +57 -53
- package/src/vite/api/SchemaManager.ts +371 -371
- package/src/vite/api/schema-codegen.ts +163 -163
- package/src/vite/config.ts +5 -1
- package/src/vite/css/collect.ts +42 -42
- package/src/vite/css/plugin.ts +105 -105
- package/src/vite/debug.ts +18 -18
- package/src/vite/dev-portal-env.ts +93 -0
- package/src/vite/html.ts +54 -54
- package/src/vite/index.ts +2 -2
- package/src/vite/mdx/rehype-extract-toc-with-jsx-export.ts +19 -19
- package/src/vite/mdx/rehype-extract-toc-with-jsx.ts +70 -70
- package/src/vite/mdx/remark-code-tabs.ts +47 -47
- package/src/vite/mdx/remark-inject-filepath.ts +13 -13
- package/src/vite/mdx/remark-last-modified.ts +103 -103
- package/src/vite/mdx/remark-link-rewrite.ts +23 -23
- package/src/vite/mdx/remark-normalize-image-url.ts +15 -15
- package/src/vite/mdx/remark-static-generation.ts +149 -149
- package/src/vite/mdx/utils.ts +32 -32
- package/src/vite/output.ts +261 -261
- package/src/vite/package-root.ts +12 -12
- package/src/vite/pagefind-dev-index.ts +100 -100
- package/src/vite/plugin-api-keys.ts +6 -1
- package/src/vite/plugin-api.ts +4 -1
- package/src/vite/plugin-auth.ts +5 -1
- package/src/vite/plugin-component.ts +1 -1
- package/src/vite/plugin-config-reload.ts +49 -49
- package/src/vite/plugin-doc-metadata.ts +45 -45
- package/src/vite/plugin-docs.ts +4 -1
- package/src/vite/plugin-metadata.ts +30 -30
- package/src/vite/plugin-modules.ts +144 -0
- package/src/vite/plugin-shiki-register.ts +97 -97
- package/src/vite/plugin-theme.ts +399 -399
- package/src/vite/plugin.ts +2 -0
- package/src/vite/prerender/utils.ts +76 -76
- package/src/vite/prerender/worker.ts +118 -118
- package/src/vite/reporter.ts +34 -34
- package/src/vite/shadcn-registry.ts +48 -48
- package/src/vite/sitemap.ts +78 -78
- package/src/vite/ssr-templates/cloudflare.ts +19 -19
- package/src/vite/ssr-templates/node.ts +25 -25
- package/src/vite/ssr-templates/vercel.ts +22 -22
- package/src/vite/zuplo.ts +30 -30
- package/src/vite-env.d.ts +6 -6
- package/src/zuplo/enrich-with-zuplo-mcp.ts +168 -168
- package/src/zuplo/enrich-with-zuplo.ts +256 -256
- package/src/zuplo/policy-types.ts +46 -46
- package/src/zuplo/with-zuplo-processors.ts +36 -36
- package/src/zuplo/with-zuplo.ts +14 -14
- package/LICENSE.md +0 -18
- package/dist/declarations/lib/components/navigation/ZudokuLogo.d.ts +0 -6
|
@@ -1,163 +1,163 @@
|
|
|
1
|
-
import { type RecordAny, traverse } from "../../lib/util/traverse.js";
|
|
2
|
-
|
|
3
|
-
const unescapeJsonPointer = (uri: string) =>
|
|
4
|
-
decodeURIComponent(uri.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
5
|
-
|
|
6
|
-
const getSegmentsFromPath = (path: string) =>
|
|
7
|
-
path.split("/").slice(1).map(unescapeJsonPointer);
|
|
8
|
-
|
|
9
|
-
// Find all $ref occurrences in the schema and assign them unique variable names
|
|
10
|
-
const createLocalRefMap = (obj: RecordAny) => {
|
|
11
|
-
const refMap = new Map<string, number>();
|
|
12
|
-
const siblingsMap = new Map<
|
|
13
|
-
string,
|
|
14
|
-
{ refPath: string; siblings: RecordAny }
|
|
15
|
-
>();
|
|
16
|
-
|
|
17
|
-
traverse(obj, (node) => {
|
|
18
|
-
if (typeof node.$ref === "string" && node.$ref.startsWith("#/")) {
|
|
19
|
-
if (!refMap.has(node.$ref)) {
|
|
20
|
-
refMap.set(node.$ref, refMap.size);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const { $ref, ...siblings } = node;
|
|
24
|
-
|
|
25
|
-
if (Object.keys(siblings).length > 0) {
|
|
26
|
-
const uniqueKey = `${$ref}__${siblingsMap.size}`;
|
|
27
|
-
siblingsMap.set(uniqueKey, { refPath: $ref, siblings });
|
|
28
|
-
node.__uniqueRefKey = uniqueKey;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return node;
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
return { refMap, siblingsMap };
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
// Replace $ref nodes with markers that become JS variable references
|
|
38
|
-
const setRefMarkers = (obj: RecordAny, refMap: Map<string, number>) =>
|
|
39
|
-
traverse(obj, (node) => {
|
|
40
|
-
const { $ref, __uniqueRefKey } = node;
|
|
41
|
-
if (typeof $ref === "string" && refMap.has($ref)) {
|
|
42
|
-
return __uniqueRefKey
|
|
43
|
-
? `__refMap+Siblings:${__uniqueRefKey}`
|
|
44
|
-
: `__refMap:${$ref}`;
|
|
45
|
-
}
|
|
46
|
-
return node;
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// Replace ref markers in generated code with actual variable references
|
|
50
|
-
const replaceMarkers = (code: string, mergedRefs: Map<string, string>) =>
|
|
51
|
-
code
|
|
52
|
-
.replace(/"__refMap:(.*?)"/g, '__refMap["$1"]')
|
|
53
|
-
.replace(
|
|
54
|
-
/"__refMap\+Siblings:(.*?)"/g,
|
|
55
|
-
(_, key) => mergedRefs.get(key) ?? `__refMap["${key}"]`,
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
const lookup = (
|
|
59
|
-
schema: RecordAny,
|
|
60
|
-
path: string,
|
|
61
|
-
filePath?: string,
|
|
62
|
-
): RecordAny => {
|
|
63
|
-
const parts = getSegmentsFromPath(path);
|
|
64
|
-
let val = schema;
|
|
65
|
-
|
|
66
|
-
for (const part of parts) {
|
|
67
|
-
while (val.$ref?.startsWith("#/")) {
|
|
68
|
-
val = val.$ref === path ? val : lookup(schema, val.$ref, filePath);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (val[part] === undefined) {
|
|
72
|
-
throw new Error(
|
|
73
|
-
`Error in ${filePath ?? "code generation"}: Could not find path segment ${part} in path: ${path}`,
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
val = val[part];
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return val;
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
const stringify = (obj: unknown, indent = 2) =>
|
|
84
|
-
JSON.stringify(obj, null, indent);
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Generate JavaScript code that exports the schema with all references resolved as variables.
|
|
88
|
-
*
|
|
89
|
-
* Handles circular references by:
|
|
90
|
-
* 1. Creating empty objects first to establish the references
|
|
91
|
-
* 2. Adding these objects to the reference map
|
|
92
|
-
* 3. Using Object.assign to populate their properties later
|
|
93
|
-
*
|
|
94
|
-
* This ensures object identity throughout the circular references.
|
|
95
|
-
*/
|
|
96
|
-
export const generateCode = (schema: RecordAny, filePath?: string) => {
|
|
97
|
-
const { refMap, siblingsMap } = createLocalRefMap(schema);
|
|
98
|
-
const lines: string[] = [];
|
|
99
|
-
|
|
100
|
-
lines.push(
|
|
101
|
-
`const __refs = Array.from({ length: ${refMap.size} }, () => ({}));`,
|
|
102
|
-
"const __refMap = {",
|
|
103
|
-
Array.from(refMap)
|
|
104
|
-
.map(([refPath, index]) => ` "${refPath}": __refs[${index}]`)
|
|
105
|
-
.join(",\n"),
|
|
106
|
-
"};",
|
|
107
|
-
"const __refMapPaths = Object.keys(__refMap);",
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
// Pre-declare merged ref variables as empty objects so they can be referenced
|
|
111
|
-
// during base ref population (they get populated after)
|
|
112
|
-
const mergedRefs = new Map<string, string>();
|
|
113
|
-
|
|
114
|
-
for (const uniqueKey of siblingsMap.keys()) {
|
|
115
|
-
const varName = `__merged_${mergedRefs.size}`;
|
|
116
|
-
mergedRefs.set(uniqueKey, varName);
|
|
117
|
-
lines.push(`const ${varName} = {};`);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const toCode = (obj: RecordAny) =>
|
|
121
|
-
replaceMarkers(stringify(setRefMarkers(obj, refMap)), mergedRefs);
|
|
122
|
-
|
|
123
|
-
// Pass 1: Populate all base refs. Bare $ref+siblings aliases are deferred
|
|
124
|
-
// until all regular base refs are populated (ordering is DFS-dependent).
|
|
125
|
-
const deferred: string[] = [];
|
|
126
|
-
for (const [refPath, index] of refMap) {
|
|
127
|
-
const value = lookup(schema, refPath, filePath);
|
|
128
|
-
|
|
129
|
-
if (!value) {
|
|
130
|
-
// biome-ignore lint/suspicious/noConsole: Logging allowed here
|
|
131
|
-
console.warn(`Could not find value for refPath: ${refPath}`);
|
|
132
|
-
continue;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const siblingEntry =
|
|
136
|
-
value.__uniqueRefKey && siblingsMap.get(value.__uniqueRefKey);
|
|
137
|
-
const target = siblingEntry ? deferred : lines;
|
|
138
|
-
|
|
139
|
-
target.push(
|
|
140
|
-
siblingEntry
|
|
141
|
-
? `Object.assign(__refs[${index}], __refMap["${siblingEntry.refPath}"], ${stringify(siblingEntry.siblings)});`
|
|
142
|
-
: `Object.assign(__refs[${index}], ${toCode(value)});`,
|
|
143
|
-
`Object.defineProperty(__refs[${index}], "__$ref", { value: __refMapPaths[${index}], enumerable: false });`,
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
lines.push(...deferred);
|
|
147
|
-
|
|
148
|
-
// Pass 2: Populate merged objects (refs with sibling overrides like description)
|
|
149
|
-
for (const [uniqueKey, { refPath, siblings }] of siblingsMap) {
|
|
150
|
-
const varName = mergedRefs.get(uniqueKey);
|
|
151
|
-
const refIndex = refMap.get(refPath);
|
|
152
|
-
lines.push(
|
|
153
|
-
`Object.assign(${varName}, __refMap["${refPath}"], ${stringify(siblings)});`,
|
|
154
|
-
`Object.defineProperty(${varName}, "__$ref", { value: __refMapPaths[${refIndex}], enumerable: false });`,
|
|
155
|
-
);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const finalCode = toCode(schema);
|
|
159
|
-
|
|
160
|
-
lines.push(`export const schema = ${finalCode};`);
|
|
161
|
-
|
|
162
|
-
return lines.join("\n");
|
|
163
|
-
};
|
|
1
|
+
import { type RecordAny, traverse } from "../../lib/util/traverse.js";
|
|
2
|
+
|
|
3
|
+
const unescapeJsonPointer = (uri: string) =>
|
|
4
|
+
decodeURIComponent(uri.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
5
|
+
|
|
6
|
+
const getSegmentsFromPath = (path: string) =>
|
|
7
|
+
path.split("/").slice(1).map(unescapeJsonPointer);
|
|
8
|
+
|
|
9
|
+
// Find all $ref occurrences in the schema and assign them unique variable names
|
|
10
|
+
const createLocalRefMap = (obj: RecordAny) => {
|
|
11
|
+
const refMap = new Map<string, number>();
|
|
12
|
+
const siblingsMap = new Map<
|
|
13
|
+
string,
|
|
14
|
+
{ refPath: string; siblings: RecordAny }
|
|
15
|
+
>();
|
|
16
|
+
|
|
17
|
+
traverse(obj, (node) => {
|
|
18
|
+
if (typeof node.$ref === "string" && node.$ref.startsWith("#/")) {
|
|
19
|
+
if (!refMap.has(node.$ref)) {
|
|
20
|
+
refMap.set(node.$ref, refMap.size);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const { $ref, ...siblings } = node;
|
|
24
|
+
|
|
25
|
+
if (Object.keys(siblings).length > 0) {
|
|
26
|
+
const uniqueKey = `${$ref}__${siblingsMap.size}`;
|
|
27
|
+
siblingsMap.set(uniqueKey, { refPath: $ref, siblings });
|
|
28
|
+
node.__uniqueRefKey = uniqueKey;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return node;
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
return { refMap, siblingsMap };
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// Replace $ref nodes with markers that become JS variable references
|
|
38
|
+
const setRefMarkers = (obj: RecordAny, refMap: Map<string, number>) =>
|
|
39
|
+
traverse(obj, (node) => {
|
|
40
|
+
const { $ref, __uniqueRefKey } = node;
|
|
41
|
+
if (typeof $ref === "string" && refMap.has($ref)) {
|
|
42
|
+
return __uniqueRefKey
|
|
43
|
+
? `__refMap+Siblings:${__uniqueRefKey}`
|
|
44
|
+
: `__refMap:${$ref}`;
|
|
45
|
+
}
|
|
46
|
+
return node;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Replace ref markers in generated code with actual variable references
|
|
50
|
+
const replaceMarkers = (code: string, mergedRefs: Map<string, string>) =>
|
|
51
|
+
code
|
|
52
|
+
.replace(/"__refMap:(.*?)"/g, '__refMap["$1"]')
|
|
53
|
+
.replace(
|
|
54
|
+
/"__refMap\+Siblings:(.*?)"/g,
|
|
55
|
+
(_, key) => mergedRefs.get(key) ?? `__refMap["${key}"]`,
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
const lookup = (
|
|
59
|
+
schema: RecordAny,
|
|
60
|
+
path: string,
|
|
61
|
+
filePath?: string,
|
|
62
|
+
): RecordAny => {
|
|
63
|
+
const parts = getSegmentsFromPath(path);
|
|
64
|
+
let val = schema;
|
|
65
|
+
|
|
66
|
+
for (const part of parts) {
|
|
67
|
+
while (val.$ref?.startsWith("#/")) {
|
|
68
|
+
val = val.$ref === path ? val : lookup(schema, val.$ref, filePath);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (val[part] === undefined) {
|
|
72
|
+
throw new Error(
|
|
73
|
+
`Error in ${filePath ?? "code generation"}: Could not find path segment ${part} in path: ${path}`,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
val = val[part];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return val;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const stringify = (obj: unknown, indent = 2) =>
|
|
84
|
+
JSON.stringify(obj, null, indent);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Generate JavaScript code that exports the schema with all references resolved as variables.
|
|
88
|
+
*
|
|
89
|
+
* Handles circular references by:
|
|
90
|
+
* 1. Creating empty objects first to establish the references
|
|
91
|
+
* 2. Adding these objects to the reference map
|
|
92
|
+
* 3. Using Object.assign to populate their properties later
|
|
93
|
+
*
|
|
94
|
+
* This ensures object identity throughout the circular references.
|
|
95
|
+
*/
|
|
96
|
+
export const generateCode = (schema: RecordAny, filePath?: string) => {
|
|
97
|
+
const { refMap, siblingsMap } = createLocalRefMap(schema);
|
|
98
|
+
const lines: string[] = [];
|
|
99
|
+
|
|
100
|
+
lines.push(
|
|
101
|
+
`const __refs = Array.from({ length: ${refMap.size} }, () => ({}));`,
|
|
102
|
+
"const __refMap = {",
|
|
103
|
+
Array.from(refMap)
|
|
104
|
+
.map(([refPath, index]) => ` "${refPath}": __refs[${index}]`)
|
|
105
|
+
.join(",\n"),
|
|
106
|
+
"};",
|
|
107
|
+
"const __refMapPaths = Object.keys(__refMap);",
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
// Pre-declare merged ref variables as empty objects so they can be referenced
|
|
111
|
+
// during base ref population (they get populated after)
|
|
112
|
+
const mergedRefs = new Map<string, string>();
|
|
113
|
+
|
|
114
|
+
for (const uniqueKey of siblingsMap.keys()) {
|
|
115
|
+
const varName = `__merged_${mergedRefs.size}`;
|
|
116
|
+
mergedRefs.set(uniqueKey, varName);
|
|
117
|
+
lines.push(`const ${varName} = {};`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const toCode = (obj: RecordAny) =>
|
|
121
|
+
replaceMarkers(stringify(setRefMarkers(obj, refMap)), mergedRefs);
|
|
122
|
+
|
|
123
|
+
// Pass 1: Populate all base refs. Bare $ref+siblings aliases are deferred
|
|
124
|
+
// until all regular base refs are populated (ordering is DFS-dependent).
|
|
125
|
+
const deferred: string[] = [];
|
|
126
|
+
for (const [refPath, index] of refMap) {
|
|
127
|
+
const value = lookup(schema, refPath, filePath);
|
|
128
|
+
|
|
129
|
+
if (!value) {
|
|
130
|
+
// biome-ignore lint/suspicious/noConsole: Logging allowed here
|
|
131
|
+
console.warn(`Could not find value for refPath: ${refPath}`);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const siblingEntry =
|
|
136
|
+
value.__uniqueRefKey && siblingsMap.get(value.__uniqueRefKey);
|
|
137
|
+
const target = siblingEntry ? deferred : lines;
|
|
138
|
+
|
|
139
|
+
target.push(
|
|
140
|
+
siblingEntry
|
|
141
|
+
? `Object.assign(__refs[${index}], __refMap["${siblingEntry.refPath}"], ${stringify(siblingEntry.siblings)});`
|
|
142
|
+
: `Object.assign(__refs[${index}], ${toCode(value)});`,
|
|
143
|
+
`Object.defineProperty(__refs[${index}], "__$ref", { value: __refMapPaths[${index}], enumerable: false });`,
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
lines.push(...deferred);
|
|
147
|
+
|
|
148
|
+
// Pass 2: Populate merged objects (refs with sibling overrides like description)
|
|
149
|
+
for (const [uniqueKey, { refPath, siblings }] of siblingsMap) {
|
|
150
|
+
const varName = mergedRefs.get(uniqueKey);
|
|
151
|
+
const refIndex = refMap.get(refPath);
|
|
152
|
+
lines.push(
|
|
153
|
+
`Object.assign(${varName}, __refMap["${refPath}"], ${stringify(siblings)});`,
|
|
154
|
+
`Object.defineProperty(${varName}, "__$ref", { value: __refMapPaths[${refIndex}], enumerable: false });`,
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const finalCode = toCode(schema);
|
|
159
|
+
|
|
160
|
+
lines.push(`export const schema = ${finalCode};`);
|
|
161
|
+
|
|
162
|
+
return lines.join("\n");
|
|
163
|
+
};
|
package/src/vite/config.ts
CHANGED
|
@@ -15,8 +15,9 @@ import { getZudokuRootDir } from "../cli/common/package-json.js";
|
|
|
15
15
|
import { loadZudokuConfig } from "../config/loader.js";
|
|
16
16
|
import { CdnUrlSchema } from "../config/validators/ZudokuConfig.js";
|
|
17
17
|
import { joinUrl } from "../lib/util/joinUrl.js";
|
|
18
|
-
import {
|
|
18
|
+
import { loadDevPortalViteDefines } from "./dev-portal-env.js";
|
|
19
19
|
import { findPackageRoot } from "./package-root.js";
|
|
20
|
+
import { ensurePagefindDevStub } from "./pagefind-dev-stub.js";
|
|
20
21
|
import vitePlugin from "./plugin.js";
|
|
21
22
|
import { getZuploSystemConfigurations } from "./zuplo.js";
|
|
22
23
|
|
|
@@ -96,6 +97,8 @@ export async function getViteConfig(
|
|
|
96
97
|
getZuploSystemConfigurations(process.env.ZUPLO_SYSTEM_CONFIGURATIONS)
|
|
97
98
|
?.__ZUPLO_DEPLOYMENT_NAME;
|
|
98
99
|
|
|
100
|
+
const devPortalDefines = await loadDevPortalViteDefines(dir, configEnv.mode);
|
|
101
|
+
|
|
99
102
|
const viteConfig: InlineConfig = {
|
|
100
103
|
root: dir,
|
|
101
104
|
base,
|
|
@@ -126,6 +129,7 @@ export async function getViteConfig(
|
|
|
126
129
|
"ZUPLO_GATEWAY_SERVICE_URL",
|
|
127
130
|
]),
|
|
128
131
|
...publicVarsProcessEnvDefine,
|
|
132
|
+
...devPortalDefines,
|
|
129
133
|
},
|
|
130
134
|
ssr: {
|
|
131
135
|
target: "node",
|
package/src/vite/css/collect.ts
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import { type DevEnvironment, isCSSRequest } from "vite";
|
|
2
|
-
|
|
3
|
-
export async function collectStyle(
|
|
4
|
-
server: DevEnvironment,
|
|
5
|
-
entries: string[],
|
|
6
|
-
cssModuleMap: Map<string, string>,
|
|
7
|
-
) {
|
|
8
|
-
const urls = await collectStyleUrls(server, entries);
|
|
9
|
-
|
|
10
|
-
return urls.map((url) => cssModuleMap.get(url) ?? "").join("\n");
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
async function collectStyleUrls(
|
|
14
|
-
server: DevEnvironment,
|
|
15
|
-
entries: string[],
|
|
16
|
-
): Promise<string[]> {
|
|
17
|
-
const visited = new Set<string>();
|
|
18
|
-
|
|
19
|
-
async function traverse(url: string) {
|
|
20
|
-
const [, id] = await server.moduleGraph.resolveUrl(url);
|
|
21
|
-
if (visited.has(id)) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
visited.add(id);
|
|
25
|
-
const mod = server.moduleGraph.getModuleById(id);
|
|
26
|
-
if (!mod) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
await Promise.all(
|
|
30
|
-
[...mod.importedModules].map((childMod) => traverse(childMod.url)),
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// ensure vite's import analysis is ready _only_ for top entries to not go too aggresive
|
|
35
|
-
await Promise.all(entries.map((e) => server.transformRequest(e)));
|
|
36
|
-
|
|
37
|
-
// traverse
|
|
38
|
-
await Promise.all(entries.map((url) => traverse(url)));
|
|
39
|
-
|
|
40
|
-
// filter
|
|
41
|
-
return [...visited].filter((url) => isCSSRequest(url));
|
|
42
|
-
}
|
|
1
|
+
import { type DevEnvironment, isCSSRequest } from "vite";
|
|
2
|
+
|
|
3
|
+
export async function collectStyle(
|
|
4
|
+
server: DevEnvironment,
|
|
5
|
+
entries: string[],
|
|
6
|
+
cssModuleMap: Map<string, string>,
|
|
7
|
+
) {
|
|
8
|
+
const urls = await collectStyleUrls(server, entries);
|
|
9
|
+
|
|
10
|
+
return urls.map((url) => cssModuleMap.get(url) ?? "").join("\n");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async function collectStyleUrls(
|
|
14
|
+
server: DevEnvironment,
|
|
15
|
+
entries: string[],
|
|
16
|
+
): Promise<string[]> {
|
|
17
|
+
const visited = new Set<string>();
|
|
18
|
+
|
|
19
|
+
async function traverse(url: string) {
|
|
20
|
+
const [, id] = await server.moduleGraph.resolveUrl(url);
|
|
21
|
+
if (visited.has(id)) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
visited.add(id);
|
|
25
|
+
const mod = server.moduleGraph.getModuleById(id);
|
|
26
|
+
if (!mod) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
await Promise.all(
|
|
30
|
+
[...mod.importedModules].map((childMod) => traverse(childMod.url)),
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// ensure vite's import analysis is ready _only_ for top entries to not go too aggresive
|
|
35
|
+
await Promise.all(entries.map((e) => server.transformRequest(e)));
|
|
36
|
+
|
|
37
|
+
// traverse
|
|
38
|
+
await Promise.all(entries.map((url) => traverse(url)));
|
|
39
|
+
|
|
40
|
+
// filter
|
|
41
|
+
return [...visited].filter((url) => isCSSRequest(url));
|
|
42
|
+
}
|
package/src/vite/css/plugin.ts
CHANGED
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
// Taken and adapted from
|
|
2
|
-
// https://github.com/hi-ogawa/vite-plugins/tree/main/packages/ssr-css
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import { type DevEnvironment, isCSSRequest, type Plugin } from "vite";
|
|
5
|
-
import { getCurrentConfig } from "../../config/loader.js";
|
|
6
|
-
import { virtualModuleId as THEME_VIRTUAL_MODULE } from "../plugin-theme.js";
|
|
7
|
-
import { collectStyle } from "./collect.js";
|
|
8
|
-
|
|
9
|
-
const VIRTUAL_ENTRY = "virtual:ssr-css.css";
|
|
10
|
-
|
|
11
|
-
export function vitePluginSsrCss(pluginOpts: { entries: string[] }): Plugin {
|
|
12
|
-
let server: DevEnvironment;
|
|
13
|
-
|
|
14
|
-
const config = getCurrentConfig();
|
|
15
|
-
|
|
16
|
-
const virtualHref = path.join(
|
|
17
|
-
config.basePath ?? "",
|
|
18
|
-
`/@id/__x00__${VIRTUAL_ENTRY}?direct`,
|
|
19
|
-
);
|
|
20
|
-
const cssModuleMap = new Map<string, string>();
|
|
21
|
-
|
|
22
|
-
return {
|
|
23
|
-
name: "zudoku-ssr-css",
|
|
24
|
-
apply: "serve",
|
|
25
|
-
configureServer(server_) {
|
|
26
|
-
server = server_.environments.ssr;
|
|
27
|
-
|
|
28
|
-
// invalidate virtual modules for each inline request
|
|
29
|
-
server_.middlewares.use((req, _res, next) => {
|
|
30
|
-
if (req.url === virtualHref) {
|
|
31
|
-
invalidateModule(server, `\0${VIRTUAL_ENTRY}?direct`);
|
|
32
|
-
}
|
|
33
|
-
next();
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
// Clear CSS cache when config files change
|
|
37
|
-
server_.watcher.on("change", (file) => {
|
|
38
|
-
const currentConfig = getCurrentConfig();
|
|
39
|
-
if (
|
|
40
|
-
currentConfig.__meta.dependencies.includes(file) ||
|
|
41
|
-
file === currentConfig.__meta.configPath
|
|
42
|
-
) {
|
|
43
|
-
cssModuleMap.clear();
|
|
44
|
-
invalidateModule(server, `\0${VIRTUAL_ENTRY}?direct`);
|
|
45
|
-
invalidateModule(server, `\0${THEME_VIRTUAL_MODULE}`);
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
resolveId(id) {
|
|
51
|
-
return id.startsWith(VIRTUAL_ENTRY) ? `\0${id}` : undefined;
|
|
52
|
-
},
|
|
53
|
-
transform(code, id) {
|
|
54
|
-
if (!isCSSRequest(id)) return;
|
|
55
|
-
|
|
56
|
-
cssModuleMap.set(id, code);
|
|
57
|
-
},
|
|
58
|
-
async load(id) {
|
|
59
|
-
if (!id.startsWith(`\0${VIRTUAL_ENTRY}`)) return;
|
|
60
|
-
|
|
61
|
-
const url = new URL(id.slice(1), "https://test.local");
|
|
62
|
-
let code = await collectStyle(server, pluginOpts.entries, cssModuleMap);
|
|
63
|
-
if (!url.searchParams.has("direct")) {
|
|
64
|
-
code = `export default ${JSON.stringify(code)};`;
|
|
65
|
-
}
|
|
66
|
-
return code;
|
|
67
|
-
},
|
|
68
|
-
|
|
69
|
-
// also expose via transformIndexHtml
|
|
70
|
-
transformIndexHtml: {
|
|
71
|
-
handler: async () => {
|
|
72
|
-
return [
|
|
73
|
-
{
|
|
74
|
-
tag: "link",
|
|
75
|
-
injectTo: "head",
|
|
76
|
-
attrs: {
|
|
77
|
-
rel: "stylesheet",
|
|
78
|
-
href: virtualHref,
|
|
79
|
-
"data-ssr-css": true,
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
tag: "script",
|
|
84
|
-
injectTo: "head",
|
|
85
|
-
attrs: { type: "module" },
|
|
86
|
-
children: `
|
|
87
|
-
import { createHotContext } from "/@vite/client";
|
|
88
|
-
const hot = createHotContext("/__clear_ssr_css");
|
|
89
|
-
hot.on("vite:afterUpdate", () => {
|
|
90
|
-
document.querySelectorAll("[data-ssr-css]").forEach(node => node.remove());
|
|
91
|
-
});
|
|
92
|
-
`,
|
|
93
|
-
},
|
|
94
|
-
];
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function invalidateModule(server: DevEnvironment, id: string) {
|
|
101
|
-
const mod = server.moduleGraph.getModuleById(id);
|
|
102
|
-
if (mod) {
|
|
103
|
-
server.moduleGraph.invalidateModule(mod);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
1
|
+
// Taken and adapted from
|
|
2
|
+
// https://github.com/hi-ogawa/vite-plugins/tree/main/packages/ssr-css
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { type DevEnvironment, isCSSRequest, type Plugin } from "vite";
|
|
5
|
+
import { getCurrentConfig } from "../../config/loader.js";
|
|
6
|
+
import { virtualModuleId as THEME_VIRTUAL_MODULE } from "../plugin-theme.js";
|
|
7
|
+
import { collectStyle } from "./collect.js";
|
|
8
|
+
|
|
9
|
+
const VIRTUAL_ENTRY = "virtual:ssr-css.css";
|
|
10
|
+
|
|
11
|
+
export function vitePluginSsrCss(pluginOpts: { entries: string[] }): Plugin {
|
|
12
|
+
let server: DevEnvironment;
|
|
13
|
+
|
|
14
|
+
const config = getCurrentConfig();
|
|
15
|
+
|
|
16
|
+
const virtualHref = path.join(
|
|
17
|
+
config.basePath ?? "",
|
|
18
|
+
`/@id/__x00__${VIRTUAL_ENTRY}?direct`,
|
|
19
|
+
);
|
|
20
|
+
const cssModuleMap = new Map<string, string>();
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
name: "zudoku-ssr-css",
|
|
24
|
+
apply: "serve",
|
|
25
|
+
configureServer(server_) {
|
|
26
|
+
server = server_.environments.ssr;
|
|
27
|
+
|
|
28
|
+
// invalidate virtual modules for each inline request
|
|
29
|
+
server_.middlewares.use((req, _res, next) => {
|
|
30
|
+
if (req.url === virtualHref) {
|
|
31
|
+
invalidateModule(server, `\0${VIRTUAL_ENTRY}?direct`);
|
|
32
|
+
}
|
|
33
|
+
next();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Clear CSS cache when config files change
|
|
37
|
+
server_.watcher.on("change", (file) => {
|
|
38
|
+
const currentConfig = getCurrentConfig();
|
|
39
|
+
if (
|
|
40
|
+
currentConfig.__meta.dependencies.includes(file) ||
|
|
41
|
+
file === currentConfig.__meta.configPath
|
|
42
|
+
) {
|
|
43
|
+
cssModuleMap.clear();
|
|
44
|
+
invalidateModule(server, `\0${VIRTUAL_ENTRY}?direct`);
|
|
45
|
+
invalidateModule(server, `\0${THEME_VIRTUAL_MODULE}`);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
resolveId(id) {
|
|
51
|
+
return id.startsWith(VIRTUAL_ENTRY) ? `\0${id}` : undefined;
|
|
52
|
+
},
|
|
53
|
+
transform(code, id) {
|
|
54
|
+
if (!isCSSRequest(id)) return;
|
|
55
|
+
|
|
56
|
+
cssModuleMap.set(id, code);
|
|
57
|
+
},
|
|
58
|
+
async load(id) {
|
|
59
|
+
if (!id.startsWith(`\0${VIRTUAL_ENTRY}`)) return;
|
|
60
|
+
|
|
61
|
+
const url = new URL(id.slice(1), "https://test.local");
|
|
62
|
+
let code = await collectStyle(server, pluginOpts.entries, cssModuleMap);
|
|
63
|
+
if (!url.searchParams.has("direct")) {
|
|
64
|
+
code = `export default ${JSON.stringify(code)};`;
|
|
65
|
+
}
|
|
66
|
+
return code;
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
// also expose via transformIndexHtml
|
|
70
|
+
transformIndexHtml: {
|
|
71
|
+
handler: async () => {
|
|
72
|
+
return [
|
|
73
|
+
{
|
|
74
|
+
tag: "link",
|
|
75
|
+
injectTo: "head",
|
|
76
|
+
attrs: {
|
|
77
|
+
rel: "stylesheet",
|
|
78
|
+
href: virtualHref,
|
|
79
|
+
"data-ssr-css": true,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
tag: "script",
|
|
84
|
+
injectTo: "head",
|
|
85
|
+
attrs: { type: "module" },
|
|
86
|
+
children: `
|
|
87
|
+
import { createHotContext } from "/@vite/client";
|
|
88
|
+
const hot = createHotContext("/__clear_ssr_css");
|
|
89
|
+
hot.on("vite:afterUpdate", () => {
|
|
90
|
+
document.querySelectorAll("[data-ssr-css]").forEach(node => node.remove());
|
|
91
|
+
});
|
|
92
|
+
`,
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function invalidateModule(server: DevEnvironment, id: string) {
|
|
101
|
+
const mod = server.moduleGraph.getModuleById(id);
|
|
102
|
+
if (mod) {
|
|
103
|
+
server.moduleGraph.invalidateModule(mod);
|
|
104
|
+
}
|
|
105
|
+
}
|