@clarify-labs/renderer 0.6.7 → 0.7.1
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/output/{OpenApiOperation-CxQQyEHK.cjs → OpenApiOperation-C4xZu4i0.cjs} +154 -79
- package/output/OpenApiOperation-C4xZu4i0.cjs.map +1 -0
- package/output/{OpenApiOperation-CI_PeMSy.js → OpenApiOperation-LIL7bqxW.js} +129 -60
- package/output/OpenApiOperation-LIL7bqxW.js.map +1 -0
- package/output/{shell-D4tS8Jts.cjs → PageActions-1RDCHcUY.cjs} +597 -160
- package/output/PageActions-1RDCHcUY.cjs.map +1 -0
- package/output/{shell-DvTfFx6M.js → PageActions-yoDRjkq8.js} +531 -148
- package/output/PageActions-yoDRjkq8.js.map +1 -0
- package/output/{ThemeRoot-DErmHskn.js → ThemeRoot-CLa0yvRQ.js} +302 -106
- package/output/ThemeRoot-CLa0yvRQ.js.map +1 -0
- package/output/{ThemeRoot-BhP5M3Hd.cjs → ThemeRoot-DYS-lcK-.cjs} +349 -129
- package/output/ThemeRoot-DYS-lcK-.cjs.map +1 -0
- package/output/app/AppShell.d.ts +5 -2
- package/output/app/PageActions.d.ts +12 -0
- package/output/app/PageBanner.d.ts +7 -0
- package/output/app/PageFooter.d.ts +5 -1
- package/output/app/SectionProvider.d.ts +1 -0
- package/output/client.cjs +14 -4
- package/output/client.d.ts +4 -1
- package/output/client.js +4 -3
- package/output/components/LocalizedLink.d.ts +6 -0
- package/output/components/WebFrame.d.ts +11 -0
- package/output/components/index.d.ts +4 -0
- package/output/context.d.ts +1 -1
- package/output/core/context.d.ts +5 -5
- package/output/core/index.d.ts +1 -1
- package/output/core/types.d.ts +74 -59
- package/output/index.cjs +57 -28
- package/output/index.cjs.map +1 -1
- package/output/index.d.ts +9 -7
- package/output/index.js +37 -12
- package/output/index.js.map +1 -1
- package/output/mdx/components.d.ts +2 -0
- package/output/mdx/primitives.d.ts +3 -2
- package/output/preview.cjs +66 -28
- package/output/preview.cjs.map +1 -1
- package/output/preview.js +63 -25
- package/output/preview.js.map +1 -1
- package/output/{render-C_NHO3rz.cjs → render-CRTqZzyY.cjs} +10 -8
- package/output/render-CRTqZzyY.cjs.map +1 -0
- package/output/{render-HeCAMIGm.js → render-D0ls3d2j.js} +8 -6
- package/output/render-D0ls3d2j.js.map +1 -0
- package/output/renderer.css +575 -280
- package/output/server.cjs +10 -8
- package/output/server.cjs.map +1 -1
- package/output/server.js +7 -5
- package/output/server.js.map +1 -1
- package/output/shell/ContentActions.d.ts +0 -1
- package/output/shell/Header.d.ts +3 -2
- package/output/shell/Search.d.ts +4 -0
- package/output/shell/SiteLogo.d.ts +2 -2
- package/output/shell/mobile.d.ts +2 -2
- package/output/shell/search/Highlight.d.ts +11 -0
- package/output/shell/search/SearchDialog.d.ts +13 -0
- package/output/shell/search/SearchInput.d.ts +8 -0
- package/output/shell/search/SearchResult.d.ts +10 -0
- package/output/shell/search/items.d.ts +3 -0
- package/output/shell/search/pagefind.d.ts +5 -0
- package/output/shell/search/types.d.ts +37 -0
- package/output/shell/search/useSearchProps.d.ts +10 -0
- package/output/theme/ThemeEditor.d.ts +53 -17
- package/output/theme/ThemeProvider.d.ts +2 -1
- package/output/theme/ThemeRoot.d.ts +2 -2
- package/output/theme/cookies.d.ts +11 -0
- package/output/theme/randomTheme.d.ts +2 -2
- package/output/theme/variables.d.ts +58 -18
- package/output/utils/href.d.ts +3 -3
- package/package.json +1 -1
- package/output/OpenApiOperation-CI_PeMSy.js.map +0 -1
- package/output/OpenApiOperation-CxQQyEHK.cjs.map +0 -1
- package/output/ThemeRoot-BhP5M3Hd.cjs.map +0 -1
- package/output/ThemeRoot-DErmHskn.js.map +0 -1
- package/output/render-C_NHO3rz.cjs.map +0 -1
- package/output/render-HeCAMIGm.js.map +0 -1
- package/output/shell-D4tS8Jts.cjs.map +0 -1
- package/output/shell-DvTfFx6M.js.map +0 -1
package/output/core/types.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { ComponentType } from 'react';
|
|
2
2
|
import { OpenAPISpec } from '../openapi/lib/utils';
|
|
3
|
+
export type FooterComponentPath = string;
|
|
3
4
|
export type RouteComponent = ComponentType | (() => Promise<{
|
|
4
5
|
default: ComponentType;
|
|
5
6
|
}>);
|
|
6
7
|
export type RouteSection = {
|
|
7
8
|
id: string;
|
|
8
9
|
title: string;
|
|
10
|
+
level?: number;
|
|
9
11
|
badge?: string;
|
|
10
12
|
tags?: string[];
|
|
11
13
|
};
|
|
@@ -32,122 +34,127 @@ export type RouteItem = {
|
|
|
32
34
|
contentArtifactUrl?: string;
|
|
33
35
|
sourceUrl?: string;
|
|
34
36
|
};
|
|
35
|
-
export type
|
|
37
|
+
export type LogoConfig = string | {
|
|
36
38
|
light?: string;
|
|
37
39
|
dark?: string;
|
|
38
40
|
};
|
|
39
|
-
export type
|
|
41
|
+
export type FaviconConfig = string | {
|
|
40
42
|
light?: string;
|
|
41
43
|
dark?: string;
|
|
42
44
|
};
|
|
43
|
-
export type
|
|
44
|
-
export type
|
|
45
|
+
export type LocalizedText = string | Record<string, string>;
|
|
46
|
+
export type LocaleConfig = {
|
|
45
47
|
code: string;
|
|
46
48
|
label: string;
|
|
47
49
|
dir?: 'ltr' | 'rtl';
|
|
48
50
|
};
|
|
49
|
-
export type
|
|
51
|
+
export type I18nConfig = {
|
|
50
52
|
defaultLocale: string;
|
|
51
53
|
missing: 'fallback' | '404' | 'hide';
|
|
52
|
-
locales:
|
|
54
|
+
locales: LocaleConfig[];
|
|
53
55
|
};
|
|
54
|
-
export type
|
|
55
|
-
label:
|
|
56
|
+
export type NavbarLink = {
|
|
57
|
+
label: LocalizedText;
|
|
56
58
|
href: string;
|
|
57
59
|
external?: boolean;
|
|
58
60
|
};
|
|
59
|
-
export type
|
|
60
|
-
|
|
61
|
+
export type BannerComponentPath = string;
|
|
62
|
+
export type BannerConfigOptions = {
|
|
63
|
+
content: LocalizedText;
|
|
61
64
|
dismissible?: boolean;
|
|
65
|
+
link?: NavbarLink;
|
|
62
66
|
};
|
|
63
|
-
export type
|
|
64
|
-
|
|
67
|
+
export type BannerConfig = BannerConfigOptions | BannerComponentPath;
|
|
68
|
+
export type FooterLinksConfig = {
|
|
69
|
+
links?: NavbarLink[];
|
|
65
70
|
socials?: Record<string, string>;
|
|
66
|
-
copyright?:
|
|
71
|
+
copyright?: LocalizedText;
|
|
67
72
|
};
|
|
68
|
-
export type
|
|
73
|
+
export type FooterConfig = FooterLinksConfig | FooterComponentPath;
|
|
74
|
+
export type SourceConfig = {
|
|
69
75
|
repository: string;
|
|
70
76
|
branch?: string;
|
|
71
77
|
directory?: string;
|
|
72
78
|
};
|
|
73
|
-
export type
|
|
74
|
-
export type
|
|
79
|
+
export type ThemePreset = 'default' | 'base';
|
|
80
|
+
export type ThemeModeColorValue = {
|
|
75
81
|
light?: string;
|
|
76
82
|
dark?: string;
|
|
77
83
|
};
|
|
78
|
-
export type
|
|
79
|
-
export type
|
|
80
|
-
primary:
|
|
81
|
-
accent:
|
|
82
|
-
background:
|
|
83
|
-
foreground:
|
|
84
|
-
surface:
|
|
85
|
-
muted:
|
|
86
|
-
border:
|
|
87
|
-
codeBackground:
|
|
88
|
-
};
|
|
89
|
-
export type
|
|
84
|
+
export type ThemeColorValue = string | ThemeModeColorValue;
|
|
85
|
+
export type ThemeColorTokensConfig = {
|
|
86
|
+
primary: ThemeColorValue;
|
|
87
|
+
accent: ThemeColorValue;
|
|
88
|
+
background: ThemeColorValue;
|
|
89
|
+
foreground: ThemeColorValue;
|
|
90
|
+
surface: ThemeColorValue;
|
|
91
|
+
muted: ThemeColorValue;
|
|
92
|
+
border: ThemeColorValue;
|
|
93
|
+
codeBackground: ThemeColorValue;
|
|
94
|
+
};
|
|
95
|
+
export type ThemeRadiusTokensConfig = {
|
|
90
96
|
sm: string;
|
|
91
97
|
md: string;
|
|
92
98
|
lg: string;
|
|
93
99
|
xl: string;
|
|
94
100
|
};
|
|
95
|
-
export type
|
|
96
|
-
colors:
|
|
97
|
-
radius:
|
|
101
|
+
export type ThemeTokensConfig = {
|
|
102
|
+
colors: ThemeColorTokensConfig;
|
|
103
|
+
radius: ThemeRadiusTokensConfig;
|
|
98
104
|
};
|
|
99
|
-
export type
|
|
105
|
+
export type ThemeLayoutConfig = {
|
|
100
106
|
maxWidth: string;
|
|
101
107
|
};
|
|
102
|
-
export type
|
|
103
|
-
preset:
|
|
104
|
-
tokens:
|
|
105
|
-
layout:
|
|
108
|
+
export type ThemeConfig = {
|
|
109
|
+
preset: ThemePreset;
|
|
110
|
+
tokens: ThemeTokensConfig;
|
|
111
|
+
layout: ThemeLayoutConfig;
|
|
106
112
|
editor: boolean;
|
|
107
113
|
};
|
|
108
|
-
export type
|
|
114
|
+
export type PagesItem = string | {
|
|
109
115
|
page: string;
|
|
110
|
-
title?:
|
|
116
|
+
title?: LocalizedText;
|
|
111
117
|
icon?: string;
|
|
112
118
|
redirect?: string;
|
|
113
119
|
} | {
|
|
114
120
|
openapi: string;
|
|
115
121
|
icon?: string;
|
|
116
|
-
title?:
|
|
122
|
+
title?: LocalizedText;
|
|
117
123
|
filter?: {
|
|
118
124
|
tags?: string[];
|
|
119
125
|
};
|
|
120
126
|
};
|
|
121
|
-
export type
|
|
122
|
-
group:
|
|
127
|
+
export type PagesGroup = {
|
|
128
|
+
group: LocalizedText;
|
|
123
129
|
icon?: string;
|
|
124
|
-
pages:
|
|
130
|
+
pages: PagesItem[];
|
|
125
131
|
};
|
|
126
|
-
export type
|
|
127
|
-
export type
|
|
128
|
-
tab:
|
|
132
|
+
export type PagesConfig = PagesGroup[] | 'FileTree';
|
|
133
|
+
export type TabItem = {
|
|
134
|
+
tab: LocalizedText;
|
|
129
135
|
icon?: string;
|
|
130
|
-
pages?:
|
|
136
|
+
pages?: PagesConfig;
|
|
131
137
|
};
|
|
132
|
-
export type
|
|
133
|
-
export type
|
|
138
|
+
export type TabsConfig = TabItem[];
|
|
139
|
+
export type Config = {
|
|
134
140
|
title: string;
|
|
135
|
-
logo?:
|
|
136
|
-
|
|
137
|
-
|
|
141
|
+
logo?: LogoConfig;
|
|
142
|
+
homeUrl?: string;
|
|
143
|
+
favicon?: FaviconConfig;
|
|
144
|
+
theme: ThemeConfig;
|
|
138
145
|
description: string;
|
|
139
146
|
siteUrl?: string;
|
|
140
|
-
source?:
|
|
147
|
+
source?: SourceConfig;
|
|
141
148
|
rootDirectory: string;
|
|
142
149
|
routePrefix: string;
|
|
143
150
|
outputDirectory: string;
|
|
144
151
|
navbar?: {
|
|
145
|
-
links?:
|
|
152
|
+
links?: NavbarLink[];
|
|
146
153
|
};
|
|
147
|
-
banner?:
|
|
148
|
-
footer?:
|
|
149
|
-
i18n?:
|
|
150
|
-
tabs?:
|
|
154
|
+
banner?: BannerConfig;
|
|
155
|
+
footer?: FooterConfig;
|
|
156
|
+
i18n?: I18nConfig;
|
|
157
|
+
tabs?: TabsConfig;
|
|
151
158
|
};
|
|
152
159
|
export type NavigationTab = {
|
|
153
160
|
type: 'tab';
|
|
@@ -164,13 +171,17 @@ export type LocalizedTabbedNavigation = Record<string, TabbedNavigation>;
|
|
|
164
171
|
export type NavigationTree = NavigationNode[] | LocalizedNavigation | TabbedNavigation | LocalizedTabbedNavigation;
|
|
165
172
|
export type RenderOptions = {
|
|
166
173
|
/** 从 virtual:clarify-config 导入的 config */
|
|
167
|
-
config:
|
|
174
|
+
config: Config;
|
|
168
175
|
/** 从 virtual:clarify-routes 导入的路由数组 */
|
|
169
176
|
routes: RouteItem[];
|
|
170
177
|
/** 从 virtual:clarify-routes 导入的导航树;启用 i18n 时为按 locale 分组的导航树 */
|
|
171
178
|
navigation?: NavigationTree;
|
|
172
179
|
/** 从 virtual:clarify-openapi-registry 导入的 OpenAPI 规范表 */
|
|
173
180
|
openApis?: Record<string, OpenAPISpec>;
|
|
181
|
+
/** Custom banner component imported from a configured banner path. */
|
|
182
|
+
bannerComponent?: ComponentType;
|
|
183
|
+
/** Custom footer component imported from a configured footer path. */
|
|
184
|
+
footerComponent?: ComponentType;
|
|
174
185
|
/** Whether to render the live theme editor inside the app tree. */
|
|
175
186
|
themeEditor?: boolean;
|
|
176
187
|
/** 挂载节点,默认 document.getElementById('root') */
|
|
@@ -181,13 +192,17 @@ export type ServerRouteItem = Omit<RouteItem, 'component'> & {
|
|
|
181
192
|
};
|
|
182
193
|
export type ServerRenderOptions = {
|
|
183
194
|
/** 从 virtual:clarify-config 导入的 config */
|
|
184
|
-
config:
|
|
195
|
+
config: Config;
|
|
185
196
|
/** 从 virtual:clarify-routes 导入的服务端路由数组 */
|
|
186
197
|
routes: ServerRouteItem[];
|
|
187
198
|
/** 从 virtual:clarify-routes 导入的导航树;启用 i18n 时为按 locale 分组的导航树 */
|
|
188
199
|
navigation?: NavigationTree;
|
|
189
200
|
/** 从 virtual:clarify-openapi-registry 导入的 OpenAPI 规范表 */
|
|
190
201
|
openApis?: Record<string, OpenAPISpec>;
|
|
202
|
+
/** Custom banner component imported from a configured banner path. */
|
|
203
|
+
bannerComponent?: ComponentType;
|
|
204
|
+
/** Custom footer component imported from a configured footer path. */
|
|
205
|
+
footerComponent?: ComponentType;
|
|
191
206
|
/** Whether to render the live theme editor inside the app tree. */
|
|
192
207
|
themeEditor?: boolean;
|
|
193
208
|
/** 当前请求的 URL */
|
package/output/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const
|
|
3
|
-
const require_ThemeRoot = require("./ThemeRoot-
|
|
4
|
-
const require_OpenApiOperation = require("./OpenApiOperation-
|
|
2
|
+
const require_PageActions = require("./PageActions-1RDCHcUY.cjs");
|
|
3
|
+
const require_ThemeRoot = require("./ThemeRoot-DYS-lcK-.cjs");
|
|
4
|
+
const require_OpenApiOperation = require("./OpenApiOperation-C4xZu4i0.cjs");
|
|
5
5
|
const require_remark = require("./remark-Dv3owbSH.cjs");
|
|
6
|
-
const require_render = require("./render-
|
|
6
|
+
const require_render = require("./render-CRTqZzyY.cjs");
|
|
7
7
|
let react_router_dom = require("react-router-dom");
|
|
8
8
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
9
9
|
//#region source/openapi/lib/spec-path.ts
|
|
@@ -23,13 +23,32 @@ function normalizeSpecPath(specPath, currentRoutePath, routePrefix = "") {
|
|
|
23
23
|
const fromDir = currentRoutePath === "/" ? "" : currentRoutePath?.replace(/^\//, "").replace(/\/[^/]*$/, "") ?? "";
|
|
24
24
|
return VIRTUAL_PREFIX + resolveRelativePath(normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`) ? fromDir.slice(normalizedRoutePrefix.length + 1) : fromDir, normalizedSpecPath);
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* 为绝对 specPath 生成带 locale 前缀的候选模块 ID。
|
|
28
|
+
*
|
|
29
|
+
* 局部嵌入(OpenApiOperation / OpenApiDocument)通常使用 `/api` 这样的绝对路径。
|
|
30
|
+
* 默认 locale 的 spec 注册在 `virtual:clarify-page/api`,而其他 locale 的 spec
|
|
31
|
+
* 注册在 `virtual:clarify-page/<locale>/api`。相对路径会因为当前路由已含 locale 前缀
|
|
32
|
+
* 而自动解析到正确的 spec,但绝对路径不会,因此这里显式注入 locale 前缀。
|
|
33
|
+
*/
|
|
34
|
+
function localizeSpecModuleId(moduleId, specPath, locale, defaultLocale) {
|
|
35
|
+
if (!locale || locale === defaultLocale) return void 0;
|
|
36
|
+
if (!specPath.startsWith("/") || specPath.startsWith(VIRTUAL_PREFIX)) return void 0;
|
|
37
|
+
const rest = moduleId.slice(21);
|
|
38
|
+
if (rest.startsWith(`${locale}/`) || rest === locale) return void 0;
|
|
39
|
+
return `${VIRTUAL_PREFIX}${locale}/${rest}`;
|
|
40
|
+
}
|
|
26
41
|
function useOpenApiSpec(spec, specPath) {
|
|
27
|
-
const specs =
|
|
42
|
+
const specs = require_PageActions.useOpenApis();
|
|
28
43
|
const location = (0, react_router_dom.useLocation)();
|
|
29
|
-
const config =
|
|
44
|
+
const config = require_PageActions.useConfig();
|
|
45
|
+
const locale = require_PageActions.useLocale();
|
|
30
46
|
if (spec) return spec;
|
|
31
47
|
if (!specPath) return null;
|
|
32
|
-
|
|
48
|
+
const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix);
|
|
49
|
+
const localized = localizeSpecModuleId(normalized, specPath, locale, config.i18n?.defaultLocale);
|
|
50
|
+
if (localized && specs[localized]) return specs[localized];
|
|
51
|
+
return specs[normalized] ?? null;
|
|
33
52
|
}
|
|
34
53
|
//#endregion
|
|
35
54
|
//#region source/openapi/lib/utils.ts
|
|
@@ -83,21 +102,27 @@ function listOpenApiOperations(spec) {
|
|
|
83
102
|
//#region source/openapi/entry.tsx
|
|
84
103
|
function OpenApiHeader(arg0) {
|
|
85
104
|
const { spec } = arg0;
|
|
86
|
-
const t =
|
|
105
|
+
const t = require_PageActions.useBuiltInText();
|
|
87
106
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
|
|
88
|
-
className: "mb-16",
|
|
107
|
+
className: "clarify-openapi-header mb-16 border-b border-(--clarify-theme-tokens-colors-border) pb-8",
|
|
89
108
|
children: [
|
|
90
109
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
91
|
-
className: "mb-3 text-xs/6 font-medium tracking-widest text-
|
|
110
|
+
className: "mb-3 text-xs/6 font-medium tracking-widest text-(--clarify-ui-accent-text) uppercase",
|
|
92
111
|
children: t("openapi.openApiReference")
|
|
93
112
|
}),
|
|
94
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
113
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
114
|
+
className: "clarify-page-title-row flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",
|
|
115
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", {
|
|
116
|
+
className: "clarify-page-title min-w-0 flex-1",
|
|
117
|
+
children: spec.info?.title ?? t("openapi.apiDocumentation")
|
|
118
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_PageActions.PageTitleActions, {})]
|
|
119
|
+
}),
|
|
95
120
|
spec.info?.description ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_OpenApiOperation.Markdown, {
|
|
96
|
-
className: "lead *:first:mt-0 *:last:mb-0",
|
|
121
|
+
className: "lead mt-4 *:first:mt-0 *:last:mb-0",
|
|
97
122
|
children: spec.info.description
|
|
98
123
|
}) : null,
|
|
99
124
|
spec.info?.version ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
100
|
-
className: "text-sm text-
|
|
125
|
+
className: "mt-4 text-sm text-(--clarify-ui-text-faint)",
|
|
101
126
|
children: t("openapi.version", { version: spec.info.version })
|
|
102
127
|
}) : null
|
|
103
128
|
]
|
|
@@ -132,7 +157,7 @@ function WarningBox(arg0) {
|
|
|
132
157
|
}
|
|
133
158
|
function OpenApiDocument(arg0) {
|
|
134
159
|
const { spec, specPath, tagFilter } = arg0;
|
|
135
|
-
const t =
|
|
160
|
+
const t = require_PageActions.useBuiltInText();
|
|
136
161
|
const resolved = useOpenApiSpec(spec, specPath);
|
|
137
162
|
if (!resolved) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WarningBox, { children: t("openapi.specNotFound", { specPath: specPath ?? t("openapi.specPathMissing") }) });
|
|
138
163
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("article", {
|
|
@@ -148,7 +173,7 @@ function OpenApiDocument(arg0) {
|
|
|
148
173
|
}
|
|
149
174
|
function OpenApiOperationWithSpec(arg0) {
|
|
150
175
|
const { spec, path, method } = arg0;
|
|
151
|
-
const t =
|
|
176
|
+
const t = require_PageActions.useBuiltInText();
|
|
152
177
|
const op = getOpenApiOperation(spec, path, method);
|
|
153
178
|
if (!op) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WarningBox, {
|
|
154
179
|
tone: "red",
|
|
@@ -164,7 +189,7 @@ function OpenApiOperationWithSpec(arg0) {
|
|
|
164
189
|
}
|
|
165
190
|
function OpenApiOperation(arg0) {
|
|
166
191
|
const { specPath, path, method } = arg0;
|
|
167
|
-
const t =
|
|
192
|
+
const t = require_PageActions.useBuiltInText();
|
|
168
193
|
const spec = useOpenApiSpec(void 0, specPath);
|
|
169
194
|
if (!spec) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WarningBox, { children: t("openapi.specNotFound", { specPath }) });
|
|
170
195
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OpenApiOperationWithSpec, {
|
|
@@ -219,10 +244,10 @@ exports.Button = require_OpenApiOperation.Button;
|
|
|
219
244
|
exports.Callout = require_OpenApiOperation.Callout;
|
|
220
245
|
exports.Card = require_OpenApiOperation.Card;
|
|
221
246
|
exports.CardGroup = require_OpenApiOperation.CardGroup;
|
|
222
|
-
exports.ClarifyConfigContext = require_shell.ClarifyConfigContext;
|
|
223
247
|
exports.Code = require_OpenApiOperation.Code;
|
|
224
248
|
exports.CodeGroup = require_OpenApiOperation.CodeGroup;
|
|
225
249
|
exports.Collapse = require_OpenApiOperation.Collapse;
|
|
250
|
+
exports.ConfigContext = require_PageActions.ConfigContext;
|
|
226
251
|
exports.DocShell = DocShell;
|
|
227
252
|
exports.Feedback = require_OpenApiOperation.Feedback;
|
|
228
253
|
exports.GridPattern = require_OpenApiOperation.GridPattern;
|
|
@@ -232,24 +257,28 @@ exports.Logo = require_OpenApiOperation.Logo;
|
|
|
232
257
|
exports.Markdown = require_OpenApiOperation.Markdown;
|
|
233
258
|
exports.OpenApiDocument = OpenApiDocument;
|
|
234
259
|
exports.OpenApiOperation = OpenApiOperation;
|
|
235
|
-
exports.OpenApisContext =
|
|
260
|
+
exports.OpenApisContext = require_PageActions.OpenApisContext;
|
|
261
|
+
exports.PageBanner = require_ThemeRoot.PageBanner;
|
|
236
262
|
exports.PageFooter = require_ThemeRoot.PageFooter;
|
|
237
263
|
exports.Pre = require_OpenApiOperation.Pre;
|
|
238
264
|
exports.Prose = require_OpenApiOperation.Prose;
|
|
239
|
-
exports.SectionProvider =
|
|
265
|
+
exports.SectionProvider = require_PageActions.SectionProvider;
|
|
240
266
|
exports.Tag = require_OpenApiOperation.Tag;
|
|
241
267
|
exports.ThemeEditor = require_ThemeRoot.ThemeEditor;
|
|
242
|
-
exports.ThemeProvider =
|
|
243
|
-
exports.ThemeToggle =
|
|
244
|
-
exports.
|
|
245
|
-
exports.
|
|
268
|
+
exports.ThemeProvider = require_PageActions.ThemeProvider;
|
|
269
|
+
exports.ThemeToggle = require_PageActions.ThemeToggle;
|
|
270
|
+
exports.WebFrame = require_OpenApiOperation.WebFrame;
|
|
271
|
+
exports.applyThemeVariables = require_ThemeRoot.applyThemeVariables;
|
|
246
272
|
exports.markdownRemarkPlugins = require_remark.markdownRemarkPlugins;
|
|
247
|
-
exports.remToPx =
|
|
273
|
+
exports.remToPx = require_PageActions.remToPx;
|
|
248
274
|
exports.render = require_render.render;
|
|
249
|
-
exports.
|
|
275
|
+
exports.themeBootstrapScript = require_ThemeRoot.themeBootstrapScript;
|
|
276
|
+
exports.themeEditorPresets = require_ThemeRoot.themeEditorPresets;
|
|
277
|
+
exports.themePresets = require_ThemeRoot.themePresets;
|
|
278
|
+
exports.useConfig = require_PageActions.useConfig;
|
|
250
279
|
exports.useMDXComponents = useMDXComponents;
|
|
251
|
-
exports.useOpenApis =
|
|
252
|
-
exports.useSectionStore =
|
|
253
|
-
exports.useTheme =
|
|
280
|
+
exports.useOpenApis = require_PageActions.useOpenApis;
|
|
281
|
+
exports.useSectionStore = require_PageActions.useSectionStore;
|
|
282
|
+
exports.useTheme = require_PageActions.useTheme;
|
|
254
283
|
|
|
255
284
|
//# sourceMappingURL=index.cjs.map
|
package/output/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../source/openapi/lib/spec-path.ts","../source/openapi/lib/utils.ts","../source/openapi/entry.tsx","../source/mdx/components.ts","../source/mdx/DocShell.tsx"],"sourcesContent":["import { useLocation } from 'react-router-dom'\n\nimport { useClarifyConfig, useOpenApis } from '../../core/context'\n\nimport type { OpenAPISpec } from './utils'\n\nconst VIRTUAL_PREFIX = 'virtual:clarify-page/'\n\nfunction resolveRelativePath(fromDir: string, to: string): string {\n const parts = (fromDir + '/' + to).split('/').filter(Boolean)\n const stack: string[] = []\n for (const part of parts) {\n if (part === '..') {\n stack.pop()\n } else if (part !== '.') {\n stack.push(part)\n }\n }\n return stack.join('/')\n}\n\nfunction normalizeSpecPath(specPath: string, currentRoutePath?: string, routePrefix = ''): string {\n if (specPath.startsWith(VIRTUAL_PREFIX)) return specPath\n\n const normalizedRoutePrefix = routePrefix.replace(/^\\/+|\\/+$/g, '')\n const normalizedSpecPath = specPath.startsWith('/') && normalizedRoutePrefix && specPath.slice(1).startsWith(`${normalizedRoutePrefix}/`)\n ? '/' + specPath.slice(normalizedRoutePrefix.length + 2)\n : specPath\n\n if (normalizedSpecPath.startsWith('/')) {\n return VIRTUAL_PREFIX + normalizedSpecPath.replace(/^\\//, '')\n }\n const fromDir = currentRoutePath === '/' ? '' : currentRoutePath?.replace(/^\\//, '').replace(/\\/[^/]*$/, '') ?? ''\n const normalizedFromDir = normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`)\n ? fromDir.slice(normalizedRoutePrefix.length + 1)\n : fromDir\n return VIRTUAL_PREFIX + resolveRelativePath(normalizedFromDir, normalizedSpecPath)\n}\n\nexport function useOpenApiSpec(spec?: OpenAPISpec, specPath?: string): OpenAPISpec | null {\n const specs = useOpenApis()\n const location = useLocation()\n const config = useClarifyConfig()\n\n if (spec) return spec\n if (!specPath) return null\n\n const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix)\n return specs[normalized] ?? null\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types'\n\nimport type { OpenApiRecord } from '../types'\n\nexport type OpenAPISpec = OpenAPIV3.Document | OpenAPIV3_1.Document\nexport type OpenAPIOperation = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject\n\nexport const OPENAPI_HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const\n\nexport type OpenAPIHttpMethod = typeof OPENAPI_HTTP_METHODS[number]\n\nexport function isOpenAPIHttpMethod(method: string): method is OpenAPIHttpMethod {\n return (OPENAPI_HTTP_METHODS as readonly string[]).includes(method.toLowerCase())\n}\n\nfunction isRecord(value: unknown): value is OpenApiRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction resolveOpenApiRef(spec: OpenAPISpec, ref: string): unknown {\n if (!ref.startsWith('#/')) return undefined\n\n return ref\n .slice(2)\n .split('/')\n .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => (isRecord(current) ? current[part] : undefined), spec)\n}\n\nfunction getPathItem(spec: OpenAPISpec, path: string): OpenApiRecord | undefined {\n const pathItem = spec.paths?.[path]\n const resolved = isRecord(pathItem) && typeof pathItem.$ref === 'string' ? resolveOpenApiRef(spec, pathItem.$ref) : pathItem\n return isRecord(resolved) ? resolved : undefined\n}\n\nexport function getOpenApiOperation(spec: OpenAPISpec, path: string, method: string): OpenAPIOperation | undefined {\n if (!isOpenAPIHttpMethod(method)) return undefined\n return getPathItem(spec, path)?.[method.toLowerCase() as OpenAPIHttpMethod] as OpenAPIOperation | undefined\n}\n\nexport function listOpenApiOperations(spec: OpenAPISpec): Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> {\n const paths = spec.paths ?? {}\n const operations: Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> = []\n\n for (const path of Object.keys(paths)) {\n const pathItem = getPathItem(spec, path)\n if (!pathItem) continue\n for (const method of OPENAPI_HTTP_METHODS) {\n const operation = pathItem[method]\n if (operation) operations.push({ path, method, operation: operation as OpenAPIOperation })\n }\n }\n\n return operations\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\nimport { useBuiltInText } from '../core/i18n'\nimport { Markdown } from '../mdx/Markdown'\n\nimport { OpenApiOperation as OpenApiOperationComponent } from './components/OpenApiOperation'\nimport { useOpenApiSpec } from './lib/spec-path'\nimport { getOpenApiOperation, listOpenApiOperations } from './lib/utils'\nimport type { OpenAPISpec } from './lib/utils'\n\ntype OpenApiPathsProps = { spec: OpenAPISpec; tagFilter?: string[] }\n\ntype OpenApiHeaderProps = { spec: OpenAPISpec }\n\ntype WarningBoxProps = {\n children: ReactNode\n tone?: 'amber' | 'red'\n}\n\nexport type OpenApiDocumentProps = {\n spec?: OpenAPISpec\n specPath?: string\n tagFilter?: string[]\n}\n\ntype OpenApiOperationWithSpecProps = {\n spec: OpenAPISpec\n path: string\n method: string\n}\n\nexport type OpenApiOperationProps = {\n specPath: string\n path: string\n method: string\n}\n\nfunction OpenApiHeader(arg0: OpenApiHeaderProps): ReactNode {\n const { spec } = arg0\n\n const t = useBuiltInText()\n return (\n <header className=\"mb-16\">\n <p className=\"mb-3 text-xs/6 font-medium tracking-widest text-emerald-500 uppercase dark:text-emerald-400\">\n {t('openapi.openApiReference')}\n </p>\n <h1>{spec.info?.title ?? t('openapi.apiDocumentation')}</h1>\n {spec.info?.description ? <Markdown className=\"lead *:first:mt-0 *:last:mb-0\">{spec.info.description}</Markdown> : null}\n {spec.info?.version ? <p className=\"text-sm text-zinc-500 dark:text-zinc-400\">{t('openapi.version', { version: spec.info.version })}</p> : null}\n </header>\n )\n}\n\nfunction operationMatchesTags(operationTags: string[] | undefined, filterTags: string[] | undefined): boolean {\n if (!filterTags?.length) return true\n return operationTags?.some(tag => filterTags.includes(tag)) ?? false\n}\n\nfunction OpenApiPaths(arg0: OpenApiPathsProps): ReactNode {\n const { spec, tagFilter } = arg0\n\n const entries = listOpenApiOperations(spec)\n .filter(({ operation }) => operationMatchesTags(operation.tags, tagFilter))\n .map(({ path, method, operation }) => ({\n path,\n method: method.toUpperCase(),\n operation,\n }))\n\n return (\n <div className=\"clarify-api-endpoints divide-y divide-zinc-200/70 dark:divide-white/10\">\n {entries.map(({ path, method, operation }) => (\n <OpenApiOperationComponent key={`${method}-${path}`} spec={spec} path={path} method={method} operation={operation} />\n ))}\n </div>\n )\n}\n\nfunction WarningBox(arg0: WarningBoxProps): ReactNode {\n const { children, tone = 'amber' } = arg0\n\n const classes = tone === 'red'\n ? 'rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200'\n : 'rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200'\n\n return <div className={`clarify-warning ${classes}`}>{children}</div>\n}\n\nexport function OpenApiDocument(arg0: OpenApiDocumentProps): ReactNode {\n const { spec, specPath, tagFilter } = arg0\n const t = useBuiltInText()\n const resolved = useOpenApiSpec(spec, specPath)\n\n if (!resolved) {\n return <WarningBox>{t('openapi.specNotFound', { specPath: specPath ?? t('openapi.specPathMissing') })}</WarningBox>\n }\n\n return (\n <article className=\"clarify-openapi-page flex h-full flex-col pt-16 pb-10\">\n <Prose className=\"flex-auto\">\n <OpenApiHeader spec={resolved} />\n <OpenApiPaths spec={resolved} tagFilter={tagFilter} />\n </Prose>\n </article>\n )\n}\n\nfunction OpenApiOperationWithSpec(arg0: OpenApiOperationWithSpecProps): ReactNode {\n const { spec, path, method } = arg0\n const t = useBuiltInText()\n const op = getOpenApiOperation(spec, path, method)\n\n if (!op) {\n return <WarningBox tone=\"red\">{t('openapi.endpointNotFound', { endpoint: `${method.toUpperCase()} ${path}` })}</WarningBox>\n }\n\n const normalizedMethod = method.toUpperCase()\n return <OpenApiOperationComponent key={`${normalizedMethod}-${path}`} spec={spec} path={path} method={normalizedMethod} operation={op} />\n}\n\nexport function OpenApiOperation(arg0: OpenApiOperationProps): ReactNode {\n const { specPath, path, method } = arg0\n const t = useBuiltInText()\n const spec = useOpenApiSpec(undefined, specPath)\n\n if (!spec) {\n return <WarningBox>{t('openapi.specNotFound', { specPath })}</WarningBox>\n }\n\n return <OpenApiOperationWithSpec spec={spec} path={path} method={method} />\n}\n","import { Collapse } from '../components/Collapse'\nimport { OpenApiDocument, OpenApiOperation } from '../openapi'\n\nimport { Markdown } from './Markdown'\nimport * as mdxPrimitives from './primitives'\n\nconst builtInMDXComponents = {\n ...mdxPrimitives,\n Markdown,\n Collapse,\n}\n\nconst builtInOpenAPIComponents = {\n OpenApiDocument,\n OpenApiOperation,\n}\n\nexport function useMDXComponents(components: Record<string, unknown> = {}) {\n return {\n ...components,\n ...builtInMDXComponents,\n ...builtInOpenAPIComponents,\n }\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\n\nexport type DocShellProps = {\n title: string\n subtitle?: string\n children: ReactNode\n}\n\nexport function DocShell(arg0: DocShellProps) {\n const { title, subtitle, children } = arg0\n\n return (\n <main className=\"clarify-doc-shell min-h-screen bg-(--clarify-theme-tokens-colors-background) px-6 py-10 text-(--clarify-theme-tokens-colors-foreground) md:px-10\">\n <div className=\"mx-auto max-w-6xl\">\n <header className=\"mb-10\">\n <h1 className=\"text-3xl font-bold tracking-tight md:text-5xl\">{title}</h1>\n {subtitle ? <p className=\"mt-3 max-w-2xl text-(--clarify-ui-text-soft)\">{subtitle}</p> : null}\n </header>\n <Prose>{children}</Prose>\n </div>\n </main>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../source/openapi/lib/spec-path.ts","../source/openapi/lib/utils.ts","../source/openapi/entry.tsx","../source/mdx/components.ts","../source/mdx/DocShell.tsx"],"sourcesContent":["import { useLocation } from 'react-router-dom'\n\nimport { useConfig, useLocale, useOpenApis } from '../../core/context'\n\nimport type { OpenAPISpec } from './utils'\n\nconst VIRTUAL_PREFIX = 'virtual:clarify-page/'\n\nfunction resolveRelativePath(fromDir: string, to: string): string {\n const parts = (fromDir + '/' + to).split('/').filter(Boolean)\n const stack: string[] = []\n for (const part of parts) {\n if (part === '..') {\n stack.pop()\n } else if (part !== '.') {\n stack.push(part)\n }\n }\n return stack.join('/')\n}\n\nfunction normalizeSpecPath(specPath: string, currentRoutePath?: string, routePrefix = ''): string {\n if (specPath.startsWith(VIRTUAL_PREFIX)) return specPath\n\n const normalizedRoutePrefix = routePrefix.replace(/^\\/+|\\/+$/g, '')\n const normalizedSpecPath = specPath.startsWith('/') && normalizedRoutePrefix && specPath.slice(1).startsWith(`${normalizedRoutePrefix}/`)\n ? '/' + specPath.slice(normalizedRoutePrefix.length + 2)\n : specPath\n\n if (normalizedSpecPath.startsWith('/')) {\n return VIRTUAL_PREFIX + normalizedSpecPath.replace(/^\\//, '')\n }\n const fromDir = currentRoutePath === '/' ? '' : currentRoutePath?.replace(/^\\//, '').replace(/\\/[^/]*$/, '') ?? ''\n const normalizedFromDir = normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`)\n ? fromDir.slice(normalizedRoutePrefix.length + 1)\n : fromDir\n return VIRTUAL_PREFIX + resolveRelativePath(normalizedFromDir, normalizedSpecPath)\n}\n\n/**\n * 为绝对 specPath 生成带 locale 前缀的候选模块 ID。\n *\n * 局部嵌入(OpenApiOperation / OpenApiDocument)通常使用 `/api` 这样的绝对路径。\n * 默认 locale 的 spec 注册在 `virtual:clarify-page/api`,而其他 locale 的 spec\n * 注册在 `virtual:clarify-page/<locale>/api`。相对路径会因为当前路由已含 locale 前缀\n * 而自动解析到正确的 spec,但绝对路径不会,因此这里显式注入 locale 前缀。\n */\nfunction localizeSpecModuleId(moduleId: string, specPath: string, locale: string | undefined, defaultLocale: string | undefined): string | undefined {\n if (!locale || locale === defaultLocale) return undefined\n // 仅处理绝对路径;相对路径已经基于含 locale 前缀的当前路由解析。\n if (!specPath.startsWith('/') || specPath.startsWith(VIRTUAL_PREFIX)) return undefined\n const rest = moduleId.slice(VIRTUAL_PREFIX.length)\n if (rest.startsWith(`${locale}/`) || rest === locale) return undefined\n return `${VIRTUAL_PREFIX}${locale}/${rest}`\n}\n\nexport function useOpenApiSpec(spec?: OpenAPISpec, specPath?: string): OpenAPISpec | null {\n const specs = useOpenApis()\n const location = useLocation()\n const config = useConfig()\n const locale = useLocale()\n\n if (spec) return spec\n if (!specPath) return null\n\n const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix)\n const localized = localizeSpecModuleId(normalized, specPath, locale, config.i18n?.defaultLocale)\n\n if (localized && specs[localized]) return specs[localized]\n return specs[normalized] ?? null\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types'\n\nimport type { OpenApiRecord } from '../types'\n\nexport type OpenAPISpec = OpenAPIV3.Document | OpenAPIV3_1.Document\nexport type OpenAPIOperation = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject\n\nexport const OPENAPI_HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const\n\nexport type OpenAPIHttpMethod = typeof OPENAPI_HTTP_METHODS[number]\n\nexport function isOpenAPIHttpMethod(method: string): method is OpenAPIHttpMethod {\n return (OPENAPI_HTTP_METHODS as readonly string[]).includes(method.toLowerCase())\n}\n\nfunction isRecord(value: unknown): value is OpenApiRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction resolveOpenApiRef(spec: OpenAPISpec, ref: string): unknown {\n if (!ref.startsWith('#/')) return undefined\n\n return ref\n .slice(2)\n .split('/')\n .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => (isRecord(current) ? current[part] : undefined), spec)\n}\n\nfunction getPathItem(spec: OpenAPISpec, path: string): OpenApiRecord | undefined {\n const pathItem = spec.paths?.[path]\n const resolved = isRecord(pathItem) && typeof pathItem.$ref === 'string' ? resolveOpenApiRef(spec, pathItem.$ref) : pathItem\n return isRecord(resolved) ? resolved : undefined\n}\n\nexport function getOpenApiOperation(spec: OpenAPISpec, path: string, method: string): OpenAPIOperation | undefined {\n if (!isOpenAPIHttpMethod(method)) return undefined\n return getPathItem(spec, path)?.[method.toLowerCase() as OpenAPIHttpMethod] as OpenAPIOperation | undefined\n}\n\nexport function listOpenApiOperations(spec: OpenAPISpec): Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> {\n const paths = spec.paths ?? {}\n const operations: Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> = []\n\n for (const path of Object.keys(paths)) {\n const pathItem = getPathItem(spec, path)\n if (!pathItem) continue\n for (const method of OPENAPI_HTTP_METHODS) {\n const operation = pathItem[method]\n if (operation) operations.push({ path, method, operation: operation as OpenAPIOperation })\n }\n }\n\n return operations\n}\n","import type { ReactNode } from 'react'\n\nimport { PageTitleActions } from '../app/PageActions'\nimport { Prose } from '../components/Prose'\nimport { useBuiltInText } from '../core/i18n'\nimport { Markdown } from '../mdx/Markdown'\n\nimport { OpenApiOperation as OpenApiOperationComponent } from './components/OpenApiOperation'\nimport { useOpenApiSpec } from './lib/spec-path'\nimport { getOpenApiOperation, listOpenApiOperations } from './lib/utils'\nimport type { OpenAPISpec } from './lib/utils'\n\ntype OpenApiPathsProps = { spec: OpenAPISpec; tagFilter?: string[] }\n\ntype OpenApiHeaderProps = { spec: OpenAPISpec }\n\ntype WarningBoxProps = {\n children: ReactNode\n tone?: 'amber' | 'red'\n}\n\nexport type OpenApiDocumentProps = {\n spec?: OpenAPISpec\n specPath?: string\n tagFilter?: string[]\n}\n\ntype OpenApiOperationWithSpecProps = {\n spec: OpenAPISpec\n path: string\n method: string\n}\n\nexport type OpenApiOperationProps = {\n specPath: string\n path: string\n method: string\n}\n\nfunction OpenApiHeader(arg0: OpenApiHeaderProps): ReactNode {\n const { spec } = arg0\n\n const t = useBuiltInText()\n return (\n <header className=\"clarify-openapi-header mb-16 border-b border-(--clarify-theme-tokens-colors-border) pb-8\">\n <p className=\"mb-3 text-xs/6 font-medium tracking-widest text-(--clarify-ui-accent-text) uppercase\">\n {t('openapi.openApiReference')}\n </p>\n <div className=\"clarify-page-title-row flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <h1 className=\"clarify-page-title min-w-0 flex-1\">{spec.info?.title ?? t('openapi.apiDocumentation')}</h1>\n <PageTitleActions />\n </div>\n {spec.info?.description ? <Markdown className=\"lead mt-4 *:first:mt-0 *:last:mb-0\">{spec.info.description}</Markdown> : null}\n {spec.info?.version ? <p className=\"mt-4 text-sm text-(--clarify-ui-text-faint)\">{t('openapi.version', { version: spec.info.version })}</p> : null}\n </header>\n )\n}\n\nfunction operationMatchesTags(operationTags: string[] | undefined, filterTags: string[] | undefined): boolean {\n if (!filterTags?.length) return true\n return operationTags?.some(tag => filterTags.includes(tag)) ?? false\n}\n\nfunction OpenApiPaths(arg0: OpenApiPathsProps): ReactNode {\n const { spec, tagFilter } = arg0\n\n const entries = listOpenApiOperations(spec)\n .filter(({ operation }) => operationMatchesTags(operation.tags, tagFilter))\n .map(({ path, method, operation }) => ({\n path,\n method: method.toUpperCase(),\n operation,\n }))\n\n return (\n <div className=\"clarify-api-endpoints divide-y divide-zinc-200/70 dark:divide-white/10\">\n {entries.map(({ path, method, operation }) => (\n <OpenApiOperationComponent key={`${method}-${path}`} spec={spec} path={path} method={method} operation={operation} />\n ))}\n </div>\n )\n}\n\nfunction WarningBox(arg0: WarningBoxProps): ReactNode {\n const { children, tone = 'amber' } = arg0\n\n const classes = tone === 'red'\n ? 'rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200'\n : 'rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200'\n\n return <div className={`clarify-warning ${classes}`}>{children}</div>\n}\n\nexport function OpenApiDocument(arg0: OpenApiDocumentProps): ReactNode {\n const { spec, specPath, tagFilter } = arg0\n const t = useBuiltInText()\n const resolved = useOpenApiSpec(spec, specPath)\n\n if (!resolved) {\n return <WarningBox>{t('openapi.specNotFound', { specPath: specPath ?? t('openapi.specPathMissing') })}</WarningBox>\n }\n\n return (\n <article className=\"clarify-openapi-page flex h-full flex-col pt-16 pb-10\">\n <Prose className=\"flex-auto\">\n <OpenApiHeader spec={resolved} />\n <OpenApiPaths spec={resolved} tagFilter={tagFilter} />\n </Prose>\n </article>\n )\n}\n\nfunction OpenApiOperationWithSpec(arg0: OpenApiOperationWithSpecProps): ReactNode {\n const { spec, path, method } = arg0\n const t = useBuiltInText()\n const op = getOpenApiOperation(spec, path, method)\n\n if (!op) {\n return <WarningBox tone=\"red\">{t('openapi.endpointNotFound', { endpoint: `${method.toUpperCase()} ${path}` })}</WarningBox>\n }\n\n const normalizedMethod = method.toUpperCase()\n return <OpenApiOperationComponent key={`${normalizedMethod}-${path}`} spec={spec} path={path} method={normalizedMethod} operation={op} />\n}\n\nexport function OpenApiOperation(arg0: OpenApiOperationProps): ReactNode {\n const { specPath, path, method } = arg0\n const t = useBuiltInText()\n const spec = useOpenApiSpec(undefined, specPath)\n\n if (!spec) {\n return <WarningBox>{t('openapi.specNotFound', { specPath })}</WarningBox>\n }\n\n return <OpenApiOperationWithSpec spec={spec} path={path} method={method} />\n}\n","import { Collapse } from '../components/Collapse'\nimport { OpenApiDocument, OpenApiOperation } from '../openapi'\n\nimport { Markdown } from './Markdown'\nimport * as mdxPrimitives from './primitives'\n\nconst builtInMDXComponents = {\n ...mdxPrimitives,\n Markdown,\n Collapse,\n}\n\nconst builtInOpenAPIComponents = {\n OpenApiDocument,\n OpenApiOperation,\n}\n\nexport function useMDXComponents(components: Record<string, unknown> = {}) {\n return {\n ...components,\n ...builtInMDXComponents,\n ...builtInOpenAPIComponents,\n }\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\n\nexport type DocShellProps = {\n title: string\n subtitle?: string\n children: ReactNode\n}\n\nexport function DocShell(arg0: DocShellProps) {\n const { title, subtitle, children } = arg0\n\n return (\n <main className=\"clarify-doc-shell min-h-screen bg-(--clarify-theme-tokens-colors-background) px-6 py-10 text-(--clarify-theme-tokens-colors-foreground) md:px-10\">\n <div className=\"mx-auto max-w-6xl\">\n <header className=\"mb-10\">\n <h1 className=\"text-3xl font-bold tracking-tight md:text-5xl\">{title}</h1>\n {subtitle ? <p className=\"mt-3 max-w-2xl text-(--clarify-ui-text-soft)\">{subtitle}</p> : null}\n </header>\n <Prose>{children}</Prose>\n </div>\n </main>\n )\n}\n"],"mappings":"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"}
|
package/output/index.d.ts
CHANGED
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
import { AppShell } from './app/AppShell';
|
|
2
2
|
import { BuiltWithClarify } from './app/BuiltWithClarify';
|
|
3
|
+
import { PageBanner } from './app/PageBanner';
|
|
3
4
|
import { PageFooter } from './app/PageFooter';
|
|
4
5
|
import { SectionProvider, useSectionStore, Section } from './app/SectionProvider';
|
|
5
|
-
import { Button, Callout, Card, CardGroup, Code, CodeGroup, Collapse, Feedback, GridPattern, Heading, HeroPattern, Logo, Pre, Prose, Tag } from './components';
|
|
6
|
-
import {
|
|
6
|
+
import { Button, Callout, Card, CardGroup, Code, CodeGroup, Collapse, Feedback, GridPattern, Heading, HeroPattern, Logo, Pre, Prose, Tag, WebFrame } from './components';
|
|
7
|
+
import { ConfigContext, OpenApisContext, useConfig, useOpenApis } from './context';
|
|
7
8
|
import { useMDXComponents } from './mdx/components';
|
|
8
9
|
import { DocShell } from './mdx/DocShell';
|
|
9
10
|
import { Markdown } from './mdx/Markdown';
|
|
10
11
|
import { markdownRemarkPlugins } from './mdx/remark';
|
|
11
12
|
import { OpenApiDocument, OpenApiOperation } from './openapi';
|
|
12
13
|
import { render } from './runtime/render';
|
|
13
|
-
import {
|
|
14
|
+
import { applyThemeVariables, themeEditorPresets, ThemeEditor } from './theme/ThemeEditor';
|
|
14
15
|
import { ThemeProvider, useTheme } from './theme/ThemeProvider';
|
|
15
16
|
import { ThemeToggle } from './theme/ThemeToggle';
|
|
16
|
-
import {
|
|
17
|
+
import { themePresets, themeBootstrapScript } from './theme/variables';
|
|
18
|
+
import { Config, RouteItem, RenderOptions, ServerRenderOptions } from './types';
|
|
17
19
|
import { remToPx } from './utils/remToPx';
|
|
18
20
|
export type { OpenApiOperationProps, OpenApiDocumentProps, OpenAPIOperation, OpenAPISpec } from './openapi';
|
|
19
21
|
export type { ThemeEditorProps } from './theme/ThemeEditor';
|
|
20
|
-
export type {
|
|
21
|
-
export { AppShell, render,
|
|
22
|
-
export { Button, Callout, Card, CardGroup, Code, CodeGroup, Collapse, Pre, Prose, Heading, Logo, GridPattern, HeroPattern, Feedback, Tag };
|
|
22
|
+
export type { Config, RouteItem, RenderOptions, ServerRenderOptions, Section };
|
|
23
|
+
export { AppShell, render, ConfigContext, OpenApisContext, useConfig, useOpenApis, BuiltWithClarify, PageBanner, PageFooter, ThemeProvider, ThemeToggle, ThemeEditor, useTheme, SectionProvider, useSectionStore, remToPx, applyThemeVariables, themeEditorPresets, themePresets, themeBootstrapScript };
|
|
24
|
+
export { Button, Callout, Card, CardGroup, Code, CodeGroup, Collapse, Pre, Prose, Heading, Logo, GridPattern, HeroPattern, Feedback, Tag, WebFrame };
|
|
23
25
|
export { DocShell, Markdown, useMDXComponents, markdownRemarkPlugins };
|
|
24
26
|
export { OpenApiDocument, OpenApiOperation };
|
package/output/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { C as
|
|
2
|
-
import {
|
|
3
|
-
import { a as AppShell, i as
|
|
1
|
+
import { C as Code, D as CardGroup, E as Card, O as Callout, S as Collapse, T as Pre, _ as HeroPattern, b as Tag, f as Markdown, g as GridPattern, h as Prose, k as Button, m as WebFrame, n as OpenApiOperation$1, p as primitives_exports, v as Logo, w as CodeGroup, x as Feedback, y as Heading } from "./OpenApiOperation-LIL7bqxW.js";
|
|
2
|
+
import { A as OpenApisContext, D as useBuiltInText, M as useLocale, N as useOpenApis, O as ConfigContext, c as remToPx, h as useTheme, j as useConfig, m as ThemeProvider, n as PageTitleActions, o as SectionProvider, p as ThemeToggle, s as useSectionStore } from "./PageActions-yoDRjkq8.js";
|
|
3
|
+
import { a as themeBootstrapScript, c as AppShell, d as PageBanner, i as themeEditorPresets, l as PageFooter, n as ThemeEditor, o as themePresets, r as applyThemeVariables, u as BuiltWithClarify } from "./ThemeRoot-CLa0yvRQ.js";
|
|
4
4
|
import { t as markdownRemarkPlugins } from "./remark-Dd2WU50s.js";
|
|
5
|
-
import { t as render } from "./render-
|
|
5
|
+
import { t as render } from "./render-D0ls3d2j.js";
|
|
6
6
|
import { useLocation } from "react-router-dom";
|
|
7
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
//#region source/openapi/lib/spec-path.ts
|
|
@@ -22,13 +22,32 @@ function normalizeSpecPath(specPath, currentRoutePath, routePrefix = "") {
|
|
|
22
22
|
const fromDir = currentRoutePath === "/" ? "" : currentRoutePath?.replace(/^\//, "").replace(/\/[^/]*$/, "") ?? "";
|
|
23
23
|
return VIRTUAL_PREFIX + resolveRelativePath(normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`) ? fromDir.slice(normalizedRoutePrefix.length + 1) : fromDir, normalizedSpecPath);
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* 为绝对 specPath 生成带 locale 前缀的候选模块 ID。
|
|
27
|
+
*
|
|
28
|
+
* 局部嵌入(OpenApiOperation / OpenApiDocument)通常使用 `/api` 这样的绝对路径。
|
|
29
|
+
* 默认 locale 的 spec 注册在 `virtual:clarify-page/api`,而其他 locale 的 spec
|
|
30
|
+
* 注册在 `virtual:clarify-page/<locale>/api`。相对路径会因为当前路由已含 locale 前缀
|
|
31
|
+
* 而自动解析到正确的 spec,但绝对路径不会,因此这里显式注入 locale 前缀。
|
|
32
|
+
*/
|
|
33
|
+
function localizeSpecModuleId(moduleId, specPath, locale, defaultLocale) {
|
|
34
|
+
if (!locale || locale === defaultLocale) return void 0;
|
|
35
|
+
if (!specPath.startsWith("/") || specPath.startsWith(VIRTUAL_PREFIX)) return void 0;
|
|
36
|
+
const rest = moduleId.slice(21);
|
|
37
|
+
if (rest.startsWith(`${locale}/`) || rest === locale) return void 0;
|
|
38
|
+
return `${VIRTUAL_PREFIX}${locale}/${rest}`;
|
|
39
|
+
}
|
|
25
40
|
function useOpenApiSpec(spec, specPath) {
|
|
26
41
|
const specs = useOpenApis();
|
|
27
42
|
const location = useLocation();
|
|
28
|
-
const config =
|
|
43
|
+
const config = useConfig();
|
|
44
|
+
const locale = useLocale();
|
|
29
45
|
if (spec) return spec;
|
|
30
46
|
if (!specPath) return null;
|
|
31
|
-
|
|
47
|
+
const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix);
|
|
48
|
+
const localized = localizeSpecModuleId(normalized, specPath, locale, config.i18n?.defaultLocale);
|
|
49
|
+
if (localized && specs[localized]) return specs[localized];
|
|
50
|
+
return specs[normalized] ?? null;
|
|
32
51
|
}
|
|
33
52
|
//#endregion
|
|
34
53
|
//#region source/openapi/lib/utils.ts
|
|
@@ -84,19 +103,25 @@ function OpenApiHeader(arg0) {
|
|
|
84
103
|
const { spec } = arg0;
|
|
85
104
|
const t = useBuiltInText();
|
|
86
105
|
return /* @__PURE__ */ jsxs("header", {
|
|
87
|
-
className: "mb-16",
|
|
106
|
+
className: "clarify-openapi-header mb-16 border-b border-(--clarify-theme-tokens-colors-border) pb-8",
|
|
88
107
|
children: [
|
|
89
108
|
/* @__PURE__ */ jsx("p", {
|
|
90
|
-
className: "mb-3 text-xs/6 font-medium tracking-widest text-
|
|
109
|
+
className: "mb-3 text-xs/6 font-medium tracking-widest text-(--clarify-ui-accent-text) uppercase",
|
|
91
110
|
children: t("openapi.openApiReference")
|
|
92
111
|
}),
|
|
93
|
-
/* @__PURE__ */
|
|
112
|
+
/* @__PURE__ */ jsxs("div", {
|
|
113
|
+
className: "clarify-page-title-row flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",
|
|
114
|
+
children: [/* @__PURE__ */ jsx("h1", {
|
|
115
|
+
className: "clarify-page-title min-w-0 flex-1",
|
|
116
|
+
children: spec.info?.title ?? t("openapi.apiDocumentation")
|
|
117
|
+
}), /* @__PURE__ */ jsx(PageTitleActions, {})]
|
|
118
|
+
}),
|
|
94
119
|
spec.info?.description ? /* @__PURE__ */ jsx(Markdown, {
|
|
95
|
-
className: "lead *:first:mt-0 *:last:mb-0",
|
|
120
|
+
className: "lead mt-4 *:first:mt-0 *:last:mb-0",
|
|
96
121
|
children: spec.info.description
|
|
97
122
|
}) : null,
|
|
98
123
|
spec.info?.version ? /* @__PURE__ */ jsx("p", {
|
|
99
|
-
className: "text-sm text-
|
|
124
|
+
className: "mt-4 text-sm text-(--clarify-ui-text-faint)",
|
|
100
125
|
children: t("openapi.version", { version: spec.info.version })
|
|
101
126
|
}) : null
|
|
102
127
|
]
|
|
@@ -212,6 +237,6 @@ function DocShell(arg0) {
|
|
|
212
237
|
});
|
|
213
238
|
}
|
|
214
239
|
//#endregion
|
|
215
|
-
export { AppShell, BuiltWithClarify, Button, Callout, Card, CardGroup,
|
|
240
|
+
export { AppShell, BuiltWithClarify, Button, Callout, Card, CardGroup, Code, CodeGroup, Collapse, ConfigContext, DocShell, Feedback, GridPattern, Heading, HeroPattern, Logo, Markdown, OpenApiDocument, OpenApiOperation, OpenApisContext, PageBanner, PageFooter, Pre, Prose, SectionProvider, Tag, ThemeEditor, ThemeProvider, ThemeToggle, WebFrame, applyThemeVariables, markdownRemarkPlugins, remToPx, render, themeBootstrapScript, themeEditorPresets, themePresets, useConfig, useMDXComponents, useOpenApis, useSectionStore, useTheme };
|
|
216
241
|
|
|
217
242
|
//# sourceMappingURL=index.js.map
|