fumadocs-openapi 10.10.1 → 10.10.3
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/css/generated/shared.css +16 -8
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/bundle.js +239 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/dereference.js +187 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/index.js +136 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/normalize-args.js +41 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/options.js +124 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/parse.js +109 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/parsers/binary.js +30 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/parsers/json.js +46 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/parsers/text.js +36 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/parsers/yaml.js +49 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/pointer.js +242 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/ref.js +247 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/refs.js +210 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/resolve-external.js +100 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/resolvers/file.js +41 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/resolvers/http.js +112 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/util/convert-path-to-posix.js +8 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/util/errors.js +146 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/util/is-windows.js +5 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/util/maybe.js +18 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/util/next.js +11 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/util/plugins.js +99 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/util/schema-resources.js +30 -0
- package/dist/node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/util/url.js +315 -0
- package/dist/ui/schema/client.js +70 -69
- package/dist/utils/document/process.js +7 -12
- package/package.json +4 -7
- package/dist/node_modules/.pnpm/@scalar_helpers@0.8.0/node_modules/@scalar/helpers/dist/general/create-limiter.js +0 -43
- package/dist/node_modules/.pnpm/@scalar_helpers@0.8.0/node_modules/@scalar/helpers/dist/object/is-object.js +0 -27
- package/dist/node_modules/.pnpm/@scalar_helpers@0.8.0/node_modules/@scalar/helpers/dist/object/prevent-pollution.js +0 -33
- package/dist/node_modules/.pnpm/@scalar_helpers@0.8.0/node_modules/@scalar/helpers/dist/queue/queue.js +0 -106
- package/dist/node_modules/.pnpm/@scalar_helpers@0.8.0/node_modules/@scalar/helpers/dist/string/generate-hash.js +0 -120
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/bundle/bundle.js +0 -357
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/bundle/plugins/fetch-urls/index.js +0 -73
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/bundle/plugins/node.js +0 -3
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/bundle/plugins/parse-yaml/index.js +0 -1
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/bundle/plugins/read-files/index.js +0 -51
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/bundle/value-generator.js +0 -102
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/convert-to-local-ref.js +0 -24
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/escape-json-pointer.js +0 -11
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/get-schemas.js +0 -44
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/get-segments-from-path.js +0 -10
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/get-value-by-path.js +0 -42
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/is-file-path.js +0 -23
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/is-http-url.js +0 -23
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/is-json-object.js +0 -28
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/is-yaml.js +0 -21
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/normalize.js +0 -33
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/resolve-reference-path.js +0 -30
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/set-value-at-path.js +0 -70
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/to-relative-path.js +0 -33
- package/dist/node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/helpers/unescape-json-pointer.js +0 -12
- package/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -19
- package/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -430
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/compose-collection.js +0 -50
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/compose-doc.js +0 -39
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/compose-node.js +0 -85
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/compose-scalar.js +0 -57
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/composer.js +0 -193
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/resolve-block-map.js +0 -82
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +0 -174
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +0 -40
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/resolve-end.js +0 -36
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +0 -153
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +0 -203
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/resolve-props.js +0 -105
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/util-contains-newline.js +0 -27
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +0 -25
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +0 -10
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/compose/util-map-includes.js +0 -10
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/doc/Document.js +0 -277
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/doc/anchors.js +0 -62
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/doc/applyReviver.js +0 -38
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/doc/createNode.js +0 -61
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/doc/directives.js +0 -163
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/errors.js +0 -48
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/index.js +0 -16
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/log.js +0 -6
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/nodes/Alias.js +0 -92
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/nodes/Collection.js +0 -117
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/nodes/Node.js +0 -32
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/nodes/Pair.js +0 -29
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/nodes/Scalar.js +0 -24
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/nodes/YAMLMap.js +0 -106
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +0 -104
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +0 -49
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/nodes/identity.js +0 -33
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/nodes/toJS.js +0 -35
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/parse/cst-scalar.js +0 -3
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/parse/cst-visit.js +0 -89
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/parse/cst.js +0 -40
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/parse/lexer.js +0 -529
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/parse/line-counter.js +0 -45
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/parse/parser.js +0 -859
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/public-api.js +0 -44
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/Schema.js +0 -27
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/common/map.js +0 -16
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/common/null.js +0 -13
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/common/seq.js +0 -16
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/common/string.js +0 -14
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/core/bool.js +0 -17
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/core/float.js +0 -38
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/core/int.js +0 -37
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/core/schema.js +0 -23
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/json/schema.js +0 -61
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/tags.js +0 -81
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +0 -52
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +0 -24
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +0 -41
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +0 -70
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +0 -39
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +0 -60
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +0 -56
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +0 -39
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +0 -65
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +0 -79
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +0 -111
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/stringify/stringify.js +0 -105
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +0 -116
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/stringify/stringifyComment.js +0 -16
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +0 -59
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +0 -19
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/stringify/stringifyPair.js +0 -95
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/stringify/stringifyString.js +0 -222
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/dist/visit.js +0 -187
- package/dist/node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/browser/index.js +0 -16
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import convertPathToPosix from "./convert-path-to-posix.js";
|
|
2
|
+
import { isWindows } from "./is-windows.js";
|
|
3
|
+
//#region ../../node_modules/.pnpm/@apidevtools+json-schema-ref-parser@15.3.5_@types+json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/util/url.js
|
|
4
|
+
const forwardSlashPattern = /\//g;
|
|
5
|
+
const protocolPattern = /^(\w{2,}):\/\//i;
|
|
6
|
+
const jsonPointerSlash = /~1/g;
|
|
7
|
+
const jsonPointerTilde = /~0/g;
|
|
8
|
+
const isAbsoluteWin32Path = /^[a-zA-Z]:[\\/]/;
|
|
9
|
+
const urlEncodePatterns = [[/\?/g, "%3F"], [/#/g, "%23"]];
|
|
10
|
+
const urlDecodePatterns = [
|
|
11
|
+
/%23/g,
|
|
12
|
+
"#",
|
|
13
|
+
/%24/g,
|
|
14
|
+
"$",
|
|
15
|
+
/%26/g,
|
|
16
|
+
"&",
|
|
17
|
+
/%2C/g,
|
|
18
|
+
",",
|
|
19
|
+
/%40/g,
|
|
20
|
+
"@"
|
|
21
|
+
];
|
|
22
|
+
const parse = (u) => new URL(u);
|
|
23
|
+
/**
|
|
24
|
+
* Returns resolved target URL relative to a base URL in a manner similar to that of a Web browser resolving an anchor tag HREF.
|
|
25
|
+
*
|
|
26
|
+
* @returns
|
|
27
|
+
*/
|
|
28
|
+
function resolve(from, to) {
|
|
29
|
+
const fromUrl = new URL(convertPathToPosix(from), "https://aaa.nonexistanturl.com");
|
|
30
|
+
const resolvedUrl = new URL(convertPathToPosix(to), fromUrl);
|
|
31
|
+
const endSpaces = to.match(/(\s*)$/)?.[1] || "";
|
|
32
|
+
if (resolvedUrl.hostname === "aaa.nonexistanturl.com") {
|
|
33
|
+
const { pathname, search, hash } = resolvedUrl;
|
|
34
|
+
return pathname + search + decodeURIComponent(hash) + endSpaces;
|
|
35
|
+
}
|
|
36
|
+
const resolved = resolvedUrl.toString() + endSpaces;
|
|
37
|
+
if (resolved.includes("#")) {
|
|
38
|
+
const [base, hash] = resolved.split("#", 2);
|
|
39
|
+
return base + "#" + decodeURIComponent(hash || "");
|
|
40
|
+
}
|
|
41
|
+
return resolved;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Returns the current working directory (in Node) or the current page URL (in browsers).
|
|
45
|
+
*
|
|
46
|
+
* @returns
|
|
47
|
+
*/
|
|
48
|
+
function cwd() {
|
|
49
|
+
if (typeof window !== "undefined" && window.location && window.location.href) {
|
|
50
|
+
const href = window.location.href;
|
|
51
|
+
if (!href || !href.startsWith("http")) try {
|
|
52
|
+
new URL(href);
|
|
53
|
+
return href;
|
|
54
|
+
} catch {
|
|
55
|
+
return "/";
|
|
56
|
+
}
|
|
57
|
+
return href;
|
|
58
|
+
}
|
|
59
|
+
if (typeof process !== "undefined" && process.cwd) {
|
|
60
|
+
const path = process.cwd();
|
|
61
|
+
const lastChar = path.slice(-1);
|
|
62
|
+
if (lastChar === "/" || lastChar === "\\") return path;
|
|
63
|
+
else return path + "/";
|
|
64
|
+
}
|
|
65
|
+
return "/";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Returns the protocol of the given URL, or `undefined` if it has no protocol.
|
|
69
|
+
*
|
|
70
|
+
* @param path
|
|
71
|
+
* @returns
|
|
72
|
+
*/
|
|
73
|
+
function getProtocol(path) {
|
|
74
|
+
const match = protocolPattern.exec(path || "");
|
|
75
|
+
if (match) return match[1].toLowerCase();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Returns the lowercased file extension of the given URL,
|
|
79
|
+
* or an empty string if it has no extension.
|
|
80
|
+
*
|
|
81
|
+
* @param path
|
|
82
|
+
* @returns
|
|
83
|
+
*/
|
|
84
|
+
function getExtension(path) {
|
|
85
|
+
const lastDot = path.lastIndexOf(".");
|
|
86
|
+
if (lastDot >= 0) return stripQuery(path.substring(lastDot).toLowerCase());
|
|
87
|
+
return "";
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Removes the query, if any, from the given path.
|
|
91
|
+
*
|
|
92
|
+
* @param path
|
|
93
|
+
* @returns
|
|
94
|
+
*/
|
|
95
|
+
function stripQuery(path) {
|
|
96
|
+
const queryIndex = path.indexOf("?");
|
|
97
|
+
if (queryIndex >= 0) path = path.substring(0, queryIndex);
|
|
98
|
+
return path;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Returns the hash (URL fragment), of the given path.
|
|
102
|
+
* If there is no hash, then the root hash ("#") is returned.
|
|
103
|
+
*
|
|
104
|
+
* @param path
|
|
105
|
+
* @returns
|
|
106
|
+
*/
|
|
107
|
+
function getHash(path) {
|
|
108
|
+
if (!path) return "#";
|
|
109
|
+
const hashIndex = path.indexOf("#");
|
|
110
|
+
if (hashIndex >= 0) return path.substring(hashIndex);
|
|
111
|
+
return "#";
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Removes the hash (URL fragment), if any, from the given path.
|
|
115
|
+
*
|
|
116
|
+
* @param path
|
|
117
|
+
* @returns
|
|
118
|
+
*/
|
|
119
|
+
function stripHash(path) {
|
|
120
|
+
if (!path) return "";
|
|
121
|
+
const hashIndex = path.indexOf("#");
|
|
122
|
+
if (hashIndex >= 0) path = path.substring(0, hashIndex);
|
|
123
|
+
return path;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Determines whether the given path is an HTTP(S) URL.
|
|
127
|
+
*
|
|
128
|
+
* @param path
|
|
129
|
+
* @returns
|
|
130
|
+
*/
|
|
131
|
+
function isHttp(path) {
|
|
132
|
+
const protocol = getProtocol(path);
|
|
133
|
+
if (protocol === "http" || protocol === "https") return true;
|
|
134
|
+
else if (protocol === void 0) return typeof window !== "undefined";
|
|
135
|
+
else return false;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Determines whether the given url is an unsafe or internal url.
|
|
139
|
+
*
|
|
140
|
+
* @param path - The URL or path to check
|
|
141
|
+
* @returns true if the URL is unsafe/internal, false otherwise
|
|
142
|
+
*/
|
|
143
|
+
function isUnsafeUrl(path) {
|
|
144
|
+
if (!path || typeof path !== "string") return true;
|
|
145
|
+
const normalizedPath = path.trim().toLowerCase();
|
|
146
|
+
if (!normalizedPath) return true;
|
|
147
|
+
if (normalizedPath.startsWith("javascript:") || normalizedPath.startsWith("vbscript:") || normalizedPath.startsWith("data:")) return true;
|
|
148
|
+
if (normalizedPath.startsWith("file:")) return true;
|
|
149
|
+
if (typeof window !== "undefined" && window.location && window.location.href) return false;
|
|
150
|
+
const localPatterns = [
|
|
151
|
+
"localhost",
|
|
152
|
+
"127.0.0.1",
|
|
153
|
+
"::1",
|
|
154
|
+
"10.",
|
|
155
|
+
"172.16.",
|
|
156
|
+
"172.17.",
|
|
157
|
+
"172.18.",
|
|
158
|
+
"172.19.",
|
|
159
|
+
"172.20.",
|
|
160
|
+
"172.21.",
|
|
161
|
+
"172.22.",
|
|
162
|
+
"172.23.",
|
|
163
|
+
"172.24.",
|
|
164
|
+
"172.25.",
|
|
165
|
+
"172.26.",
|
|
166
|
+
"172.27.",
|
|
167
|
+
"172.28.",
|
|
168
|
+
"172.29.",
|
|
169
|
+
"172.30.",
|
|
170
|
+
"172.31.",
|
|
171
|
+
"192.168.",
|
|
172
|
+
"169.254.",
|
|
173
|
+
".local",
|
|
174
|
+
".internal",
|
|
175
|
+
".intranet",
|
|
176
|
+
".corp",
|
|
177
|
+
".home",
|
|
178
|
+
".lan"
|
|
179
|
+
];
|
|
180
|
+
try {
|
|
181
|
+
const url = new URL(normalizedPath.startsWith("//") ? "http:" + normalizedPath : normalizedPath);
|
|
182
|
+
const hostname = url.hostname.toLowerCase();
|
|
183
|
+
for (const pattern of localPatterns) if (hostname === pattern || hostname.startsWith(pattern) || hostname.endsWith(pattern)) return true;
|
|
184
|
+
if (isPrivateIP(hostname)) return true;
|
|
185
|
+
const port = url.port;
|
|
186
|
+
if (port && isInternalPort(parseInt(port))) return true;
|
|
187
|
+
} catch {
|
|
188
|
+
if (normalizedPath.startsWith("/") && !normalizedPath.startsWith("//")) return false;
|
|
189
|
+
for (const pattern of localPatterns) if (normalizedPath.includes(pattern)) return true;
|
|
190
|
+
}
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Helper function to check if an IP address is in a private range
|
|
195
|
+
*/
|
|
196
|
+
function isPrivateIP(ip) {
|
|
197
|
+
const match = ip.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
|
|
198
|
+
if (!match) return false;
|
|
199
|
+
const [, a, b, c, d] = match.map(Number);
|
|
200
|
+
if (a > 255 || b > 255 || c > 255 || d > 255) return false;
|
|
201
|
+
return a === 10 || a === 127 || a === 172 && b >= 16 && b <= 31 || a === 192 && b === 168 || a === 169 && b === 254;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Helper function to check if a port is typically used for internal services
|
|
205
|
+
*/
|
|
206
|
+
function isInternalPort(port) {
|
|
207
|
+
return [
|
|
208
|
+
22,
|
|
209
|
+
23,
|
|
210
|
+
25,
|
|
211
|
+
53,
|
|
212
|
+
135,
|
|
213
|
+
139,
|
|
214
|
+
445,
|
|
215
|
+
993,
|
|
216
|
+
995,
|
|
217
|
+
1433,
|
|
218
|
+
1521,
|
|
219
|
+
3306,
|
|
220
|
+
3389,
|
|
221
|
+
5432,
|
|
222
|
+
5900,
|
|
223
|
+
6379,
|
|
224
|
+
8080,
|
|
225
|
+
8443,
|
|
226
|
+
9200,
|
|
227
|
+
27017
|
|
228
|
+
].includes(port);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Determines whether the given path is a filesystem path.
|
|
232
|
+
* This includes "file://" URLs.
|
|
233
|
+
*
|
|
234
|
+
* @param path
|
|
235
|
+
* @returns
|
|
236
|
+
*/
|
|
237
|
+
function isFileSystemPath(path) {
|
|
238
|
+
if (typeof window !== "undefined" || typeof process !== "undefined" && process.browser) return false;
|
|
239
|
+
const protocol = getProtocol(path);
|
|
240
|
+
return protocol === void 0 || protocol === "file";
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Converts a filesystem path to a properly-encoded URL.
|
|
244
|
+
*
|
|
245
|
+
* This is intended to handle situations where JSON Schema $Ref Parser is called
|
|
246
|
+
* with a filesystem path that contains characters which are not allowed in URLs.
|
|
247
|
+
*
|
|
248
|
+
* @example
|
|
249
|
+
* The following filesystem paths would be converted to the following URLs:
|
|
250
|
+
*
|
|
251
|
+
* <"!@#$%^&*+=?'>.json ==> %3C%22!@%23$%25%5E&*+=%3F\'%3E.json
|
|
252
|
+
* C:\\My Documents\\File (1).json ==> C:/My%20Documents/File%20(1).json
|
|
253
|
+
* file://Project #42/file.json ==> file://Project%20%2342/file.json
|
|
254
|
+
*
|
|
255
|
+
* @param path
|
|
256
|
+
* @returns
|
|
257
|
+
*/
|
|
258
|
+
function fromFileSystemPath(path) {
|
|
259
|
+
if (isWindows()) {
|
|
260
|
+
const projectDir = cwd();
|
|
261
|
+
const upperPath = path.toUpperCase();
|
|
262
|
+
const posixUpper = convertPathToPosix(projectDir).toUpperCase();
|
|
263
|
+
const hasProjectDir = upperPath.includes(posixUpper);
|
|
264
|
+
const hasProjectUri = upperPath.includes(posixUpper);
|
|
265
|
+
const isAbsolutePath = isAbsoluteWin32Path.test(path) || path.startsWith("http://") || path.startsWith("https://") || path.startsWith("file://");
|
|
266
|
+
if (!(hasProjectDir || hasProjectUri || isAbsolutePath) && !projectDir.startsWith("http")) {
|
|
267
|
+
const join = (a, b) => {
|
|
268
|
+
if (a.endsWith("/") || a.endsWith("\\")) return a + b;
|
|
269
|
+
else return a + "/" + b;
|
|
270
|
+
};
|
|
271
|
+
path = join(projectDir, path);
|
|
272
|
+
}
|
|
273
|
+
path = convertPathToPosix(path);
|
|
274
|
+
}
|
|
275
|
+
path = encodeURI(path);
|
|
276
|
+
for (const pattern of urlEncodePatterns) path = path.replace(pattern[0], pattern[1]);
|
|
277
|
+
return path;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Converts a URL to a local filesystem path.
|
|
281
|
+
*/
|
|
282
|
+
function toFileSystemPath(path, keepFileProtocol) {
|
|
283
|
+
path = path.replace(/%(?![0-9A-Fa-f]{2})/g, "%25");
|
|
284
|
+
path = decodeURI(path);
|
|
285
|
+
for (let i = 0; i < urlDecodePatterns.length; i += 2) path = path.replace(urlDecodePatterns[i], urlDecodePatterns[i + 1]);
|
|
286
|
+
let isFileUrl = path.toLowerCase().startsWith("file://");
|
|
287
|
+
if (isFileUrl) {
|
|
288
|
+
path = path.replace(/^file:\/\//, "").replace(/^\//, "");
|
|
289
|
+
if (isWindows() && path[1] === "/") path = `${path[0]}:${path.substring(1)}`;
|
|
290
|
+
if (keepFileProtocol) path = "file:///" + path;
|
|
291
|
+
else {
|
|
292
|
+
isFileUrl = false;
|
|
293
|
+
path = isWindows() ? path : "/" + path;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (isWindows() && !isFileUrl) {
|
|
297
|
+
path = path.replace(forwardSlashPattern, "\\");
|
|
298
|
+
if (path.match(/^[a-z]:\\/i)) path = path[0].toUpperCase() + path.substring(1);
|
|
299
|
+
}
|
|
300
|
+
return path;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Converts a $ref pointer to a valid JSON Path.
|
|
304
|
+
*
|
|
305
|
+
* @param pointer
|
|
306
|
+
* @returns
|
|
307
|
+
*/
|
|
308
|
+
function safePointerToPath(pointer) {
|
|
309
|
+
if (pointer.length <= 1 || pointer[0] !== "#" || pointer[1] !== "/") return [];
|
|
310
|
+
return pointer.slice(2).split("/").map((value) => {
|
|
311
|
+
return value.replace(jsonPointerSlash, "/").replace(jsonPointerTilde, "~");
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
//#endregion
|
|
315
|
+
export { cwd, fromFileSystemPath, getExtension, getHash, isFileSystemPath, isHttp, isUnsafeUrl, parse, resolve, safePointerToPath, stripHash, toFileSystemPath };
|
package/dist/ui/schema/client.js
CHANGED
|
@@ -20,24 +20,15 @@ function useStates() {
|
|
|
20
20
|
}
|
|
21
21
|
function SchemaUI({ name, required = false, as = "property", generated }) {
|
|
22
22
|
const rootId = useAnchorId([name]);
|
|
23
|
-
const [path,
|
|
23
|
+
const [path, setPath] = useState(() => [{
|
|
24
24
|
$ref: generated.$root,
|
|
25
25
|
name
|
|
26
26
|
}]);
|
|
27
27
|
const ref = useRef(null);
|
|
28
|
-
const popoverRef =
|
|
29
|
-
const setPath = useCallback((v) => {
|
|
30
|
-
for (const item of v) delete item.highlighted;
|
|
31
|
-
_setPath((current) => {
|
|
32
|
-
if (popoverRef.current && current.length > 0) current[current.length - 1].scrollTop = popoverRef.current.scrollTop;
|
|
33
|
-
return v;
|
|
34
|
-
});
|
|
35
|
-
}, []);
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
const element = popoverRef.current;
|
|
28
|
+
const popoverRef = useCallback((element) => {
|
|
38
29
|
if (!element) return;
|
|
39
30
|
element.scrollTop = path.at(-1).scrollTop ?? 0;
|
|
40
|
-
const current = parseFloat(element.style.getPropertyValue("--min-height") || "
|
|
31
|
+
const current = parseFloat(element.style.getPropertyValue("--min-height") || "200px");
|
|
41
32
|
element.style.setProperty("--min-height", Math.max(element.clientHeight + 2, current) + "px");
|
|
42
33
|
}, [path]);
|
|
43
34
|
useEffect(() => {
|
|
@@ -46,7 +37,7 @@ function SchemaUI({ name, required = false, as = "property", generated }) {
|
|
|
46
37
|
if (url.hash !== `#${rootId}` || !param) return;
|
|
47
38
|
const decoded = decodePath(param, url.searchParams.get("s-highlight"));
|
|
48
39
|
if (!decoded || decoded.length === 0 || decoded.some((item) => !generated.refs[item.$ref])) return;
|
|
49
|
-
|
|
40
|
+
setPath(decoded);
|
|
50
41
|
if (!decoded.at(-1).highlighted) ref.current?.scrollIntoView({ behavior: "smooth" });
|
|
51
42
|
}, [rootId]);
|
|
52
43
|
return /* @__PURE__ */ jsx(Context, {
|
|
@@ -56,24 +47,30 @@ function SchemaUI({ name, required = false, as = "property", generated }) {
|
|
|
56
47
|
generated,
|
|
57
48
|
setPath,
|
|
58
49
|
renderTypeInfoTrigger: ({ $ref, children, pathName }) => /* @__PURE__ */ jsxs(Popover, {
|
|
59
|
-
open: path
|
|
50
|
+
open: path.length > 1 && path[1].$ref === $ref && path[1].name === pathName && !path[0].closed,
|
|
60
51
|
onOpenChange: (v) => {
|
|
61
|
-
if (v) setPath([
|
|
52
|
+
if (v) setPath([{
|
|
53
|
+
...path[0],
|
|
54
|
+
closed: false
|
|
55
|
+
}, {
|
|
62
56
|
name: pathName,
|
|
63
57
|
$ref
|
|
64
58
|
}]);
|
|
65
|
-
else {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
59
|
+
else setPath(path.map((item, i) => i === 0 ? {
|
|
60
|
+
...item,
|
|
61
|
+
closed: true
|
|
62
|
+
} : item));
|
|
70
63
|
},
|
|
71
64
|
children: [/* @__PURE__ */ jsx(PopoverTrigger, {
|
|
72
65
|
className: cn(typeVariants({ variant: "trigger" })),
|
|
73
66
|
children
|
|
74
67
|
}), /* @__PURE__ */ jsx(PopoverContent, {
|
|
75
68
|
ref: popoverRef,
|
|
76
|
-
|
|
69
|
+
collisionPadding: 10,
|
|
70
|
+
className: "w-[600px] max-w-(--radix-popover-content-available-width) min-h-(--min-height,200px) fd-scroll-container max-h-[460px] px-3 pt-0",
|
|
71
|
+
onScrollEnd: (e) => {
|
|
72
|
+
path.at(-1).scrollTop = e.target.scrollTop;
|
|
73
|
+
},
|
|
77
74
|
onOpenAutoFocus: (e) => {
|
|
78
75
|
const input = e.target.querySelector("input[data-object-search-input]");
|
|
79
76
|
if (!(input instanceof HTMLInputElement)) return;
|
|
@@ -87,13 +84,14 @@ function SchemaUI({ name, required = false, as = "property", generated }) {
|
|
|
87
84
|
generated,
|
|
88
85
|
path,
|
|
89
86
|
rootId,
|
|
90
|
-
|
|
87
|
+
popoverRef
|
|
91
88
|
]),
|
|
92
89
|
children: as === "property" || generated.refs[generated.$root].type === "primitive" ? /* @__PURE__ */ jsx(ObjectProperty, {
|
|
93
90
|
ref,
|
|
94
91
|
id: rootId,
|
|
95
92
|
name,
|
|
96
93
|
$type: generated.$root,
|
|
94
|
+
parentPathIndex: 0,
|
|
97
95
|
required
|
|
98
96
|
}) : /* @__PURE__ */ jsx("div", {
|
|
99
97
|
id: rootId,
|
|
@@ -112,11 +110,21 @@ function SchemaDescription({ schema, ...props }) {
|
|
|
112
110
|
})]
|
|
113
111
|
});
|
|
114
112
|
}
|
|
115
|
-
function ObjectProperty({ name, $type, required, ...props }) {
|
|
113
|
+
function ObjectProperty({ name, $type, required, parentPathIndex, ...props }) {
|
|
116
114
|
const t = useTranslations();
|
|
117
115
|
const { path, generated: { refs }, rootId } = useStates();
|
|
118
116
|
const schema = refs[$type];
|
|
119
|
-
const
|
|
117
|
+
const parentItem = path[parentPathIndex];
|
|
118
|
+
const ref = useCallback((element) => {
|
|
119
|
+
if (!element || parentItem.highlighted !== name) return;
|
|
120
|
+
window.setTimeout(() => {
|
|
121
|
+
element.scrollIntoView({
|
|
122
|
+
behavior: "smooth",
|
|
123
|
+
block: "end"
|
|
124
|
+
});
|
|
125
|
+
delete parentItem.highlighted;
|
|
126
|
+
}, 300);
|
|
127
|
+
}, [parentItem, name]);
|
|
120
128
|
const [isChecked, onClick] = useCopyButton(() => {
|
|
121
129
|
const url = new URL(window.location.href);
|
|
122
130
|
url.hash = `#${rootId}`;
|
|
@@ -126,17 +134,15 @@ function ObjectProperty({ name, $type, required, ...props }) {
|
|
|
126
134
|
});
|
|
127
135
|
return /* @__PURE__ */ jsxs("div", {
|
|
128
136
|
...props,
|
|
129
|
-
ref: mergeRefs(props.ref,
|
|
130
|
-
|
|
131
|
-
}, [highlighted])),
|
|
132
|
-
className: cn("group/property text-sm border-t py-4 first:border-t-0", props.className),
|
|
137
|
+
ref: mergeRefs(props.ref, ref),
|
|
138
|
+
className: cn("text-sm border-t py-4 scroll-m-20 first:border-t-0", props.className),
|
|
133
139
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
134
|
-
className: "flex flex-wrap items-center gap-
|
|
140
|
+
className: "flex flex-wrap items-center gap-2 not-prose",
|
|
135
141
|
children: [
|
|
136
142
|
/* @__PURE__ */ jsxs("span", {
|
|
137
143
|
className: "font-medium font-mono",
|
|
138
144
|
children: [/* @__PURE__ */ jsx("span", {
|
|
139
|
-
className: cn(highlighted ? "bg-fd-primary text-fd-primary-foreground rounded-sm" : "text-fd-primary", schema.deprecated && "line-through opacity-80"),
|
|
145
|
+
className: cn(parentItem.highlighted === name ? "bg-fd-primary text-fd-primary-foreground rounded-sm" : "text-fd-primary", schema.deprecated && "line-through opacity-80"),
|
|
140
146
|
children: name
|
|
141
147
|
}), required ? /* @__PURE__ */ jsx("span", {
|
|
142
148
|
className: "text-red-400",
|
|
@@ -164,7 +170,7 @@ function ObjectProperty({ name, $type, required, ...props }) {
|
|
|
164
170
|
className: cn(buttonVariants({
|
|
165
171
|
size: "icon-xs",
|
|
166
172
|
variant: "ghost"
|
|
167
|
-
}), "text-fd-muted-foreground"),
|
|
173
|
+
}), "text-fd-muted-foreground [&_svg]:size-3.5"),
|
|
168
174
|
onClick,
|
|
169
175
|
children: isChecked ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx(LinkIcon, {})
|
|
170
176
|
})
|
|
@@ -218,37 +224,33 @@ function PathItemBody({ pathIndex, asSchema, tabDepth = 0, objectSearchOverrides
|
|
|
218
224
|
});
|
|
219
225
|
}
|
|
220
226
|
if (schema.type === "object" && schema.props.length > 0) return /* @__PURE__ */ jsx(ObjectSearch, {
|
|
221
|
-
|
|
227
|
+
pathIndex,
|
|
228
|
+
schema,
|
|
222
229
|
...objectSearchOverrides,
|
|
223
230
|
children: /* @__PURE__ */ jsx(SchemaDescription, { schema })
|
|
224
231
|
});
|
|
225
232
|
if (schema.type === "array") return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(SchemaDescription, { schema }), /* @__PURE__ */ jsx(ObjectProperty, {
|
|
226
233
|
name: "[index: integer]",
|
|
227
|
-
$type: schema.item.$type
|
|
234
|
+
$type: schema.item.$type,
|
|
235
|
+
parentPathIndex: pathIndex
|
|
228
236
|
})] });
|
|
229
237
|
return /* @__PURE__ */ jsx(SchemaDescription, { schema });
|
|
230
238
|
}
|
|
231
|
-
function ObjectSearch({ variant = "
|
|
239
|
+
function ObjectSearch({ variant = "default", schema, pathIndex, children }) {
|
|
232
240
|
const { path, setPath } = useStates();
|
|
233
241
|
const [search, setSearch] = useState("");
|
|
234
242
|
const deferredValue = useDeferredValue(search);
|
|
235
243
|
const firstItemRef = useRef(null);
|
|
236
|
-
const prevProperties = useRef(properties);
|
|
237
244
|
const t = useTranslations();
|
|
238
|
-
if (prevProperties.current !== properties) {
|
|
239
|
-
prevProperties.current = properties;
|
|
240
|
-
setSearch("");
|
|
241
|
-
}
|
|
242
245
|
return /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
243
246
|
/* @__PURE__ */ jsxs("div", {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
children: [/* @__PURE__ */ jsx(FilterIcon, { className: "text-fd-muted-foreground ms-2 size-3.5 transition-colors" }), /* @__PURE__ */ jsx("input", {
|
|
247
|
+
className: cn("flex items-center bg-fd-secondary text-fd-secondary-foreground transition-colors", variant === "in-popover" && "sticky top-10 -mx-3 ps-3 border-b focus-within:[&_svg]:text-fd-primary", variant === "default" && "border rounded-md ps-2 shadow-sm focus-within:ring-2 focus-within:ring-fd-ring"),
|
|
248
|
+
children: [/* @__PURE__ */ jsx(FilterIcon, { className: "text-fd-muted-foreground size-3.5 transition-colors" }), /* @__PURE__ */ jsx("input", {
|
|
247
249
|
value: search,
|
|
248
250
|
"data-object-search-input": "",
|
|
249
251
|
onChange: (e) => setSearch(e.target.value),
|
|
250
252
|
placeholder: t.schemaFilterPropertiesPlaceholder,
|
|
251
|
-
className: "
|
|
253
|
+
className: "text-sm ps-2 py-2 flex-1 outline-none placeholder:text-fd-muted-foreground",
|
|
252
254
|
onKeyDown: (e) => {
|
|
253
255
|
if (e.key === "Enter") {
|
|
254
256
|
const item = firstItemRef.current;
|
|
@@ -264,34 +266,36 @@ function ObjectSearch({ variant = "secondary", properties, inputContainer, child
|
|
|
264
266
|
children,
|
|
265
267
|
/* @__PURE__ */ jsx(Suspense, { children: /* @__PURE__ */ jsx(ObjectSearchContent, {
|
|
266
268
|
search: deferredValue,
|
|
267
|
-
properties,
|
|
268
|
-
firstItemRef
|
|
269
|
+
properties: schema.props,
|
|
270
|
+
firstItemRef,
|
|
271
|
+
empty: () => /* @__PURE__ */ jsxs("p", {
|
|
272
|
+
className: "text-fd-muted-foreground text-sm mt-2! mb-0!",
|
|
273
|
+
children: [
|
|
274
|
+
t.schemaFilterPropertiesEmpty,
|
|
275
|
+
" ",
|
|
276
|
+
/* @__PURE__ */ jsx("span", {
|
|
277
|
+
className: "text-fd-foreground font-medium",
|
|
278
|
+
children: `"${deferredValue}"`
|
|
279
|
+
})
|
|
280
|
+
]
|
|
281
|
+
}),
|
|
282
|
+
render: (item) => /* @__PURE__ */ jsx(ObjectProperty, {
|
|
283
|
+
name: item.name,
|
|
284
|
+
$type: item.$type,
|
|
285
|
+
required: item.required,
|
|
286
|
+
parentPathIndex: pathIndex
|
|
287
|
+
}, item.name)
|
|
269
288
|
}) })
|
|
270
289
|
] });
|
|
271
290
|
}
|
|
272
|
-
function ObjectSearchContent({ search: rawSearch, firstItemRef, properties }) {
|
|
273
|
-
const t = useTranslations();
|
|
291
|
+
function ObjectSearchContent({ search: rawSearch, firstItemRef, properties, empty, render }) {
|
|
274
292
|
const filtered = useMemo(() => {
|
|
275
293
|
const search = rawSearch.trim().toLowerCase();
|
|
276
294
|
return search.length > 0 ? properties.filter((prop) => prop.name.toLowerCase().includes(search)) : properties;
|
|
277
295
|
}, [properties, rawSearch]);
|
|
278
296
|
firstItemRef.current = filtered[0] ?? null;
|
|
279
|
-
if (filtered.length === 0) return
|
|
280
|
-
|
|
281
|
-
children: [
|
|
282
|
-
t.schemaFilterPropertiesEmpty,
|
|
283
|
-
" ",
|
|
284
|
-
/* @__PURE__ */ jsx("span", {
|
|
285
|
-
className: "text-fd-foreground font-medium",
|
|
286
|
-
children: `"${rawSearch}"`
|
|
287
|
-
})
|
|
288
|
-
]
|
|
289
|
-
});
|
|
290
|
-
return filtered.map((prop) => /* @__PURE__ */ jsx(ObjectProperty, {
|
|
291
|
-
name: prop.name,
|
|
292
|
-
$type: prop.$type,
|
|
293
|
-
required: prop.required
|
|
294
|
-
}, prop.name));
|
|
297
|
+
if (filtered.length === 0) return empty();
|
|
298
|
+
return filtered.map(render);
|
|
295
299
|
}
|
|
296
300
|
function InfoTag({ tag }) {
|
|
297
301
|
const ref = useRef(null);
|
|
@@ -325,7 +329,7 @@ function SchemaUIPopover() {
|
|
|
325
329
|
})
|
|
326
330
|
}), [states]),
|
|
327
331
|
children: [/* @__PURE__ */ jsx("div", {
|
|
328
|
-
className: "sticky top-0 -mx-
|
|
332
|
+
className: "sticky top-0 -mx-3 flex overflow-x-auto overflow-y-hidden items-center text-sm font-medium font-mono bg-fd-secondary text-fd-secondary-foreground px-3 h-10 border-b z-20",
|
|
329
333
|
children: path.map((item, i) => {
|
|
330
334
|
if (i === 0) return;
|
|
331
335
|
const isDuplicated = path.some((other, j) => j !== i && other.$ref === item.$ref);
|
|
@@ -342,10 +346,7 @@ function SchemaUIPopover() {
|
|
|
342
346
|
})
|
|
343
347
|
}), /* @__PURE__ */ jsx(PathItemBody, {
|
|
344
348
|
pathIndex: path.length - 1,
|
|
345
|
-
objectSearchOverrides: {
|
|
346
|
-
variant: "ghost",
|
|
347
|
-
inputContainer: { className: "sticky top-10 -mx-2" }
|
|
348
|
-
}
|
|
349
|
+
objectSearchOverrides: { variant: "in-popover" }
|
|
349
350
|
})]
|
|
350
351
|
});
|
|
351
352
|
}
|
|
@@ -390,7 +391,7 @@ function encodePath(path) {
|
|
|
390
391
|
item.name,
|
|
391
392
|
item.$ref,
|
|
392
393
|
...item.tabValues ?? []
|
|
393
|
-
].join("\0")
|
|
394
|
+
].join("\0")).join("|");
|
|
394
395
|
}
|
|
395
396
|
function decodePath(path, highlighted) {
|
|
396
397
|
const out = [];
|
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
import { bundle } from "../../node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/bundle/bundle.js";
|
|
2
1
|
import { upgrade } from "../../node_modules/.pnpm/@scalar_openapi-upgrader@0.2.8/node_modules/@scalar/openapi-upgrader/dist/upgrade.js";
|
|
3
|
-
import { fetchUrls } from "../../node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/bundle/plugins/fetch-urls/index.js";
|
|
4
|
-
import { readFiles } from "../../node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/bundle/plugins/read-files/index.js";
|
|
5
|
-
import "../../node_modules/.pnpm/@scalar_json-magic@0.12.14/node_modules/@scalar/json-magic/dist/bundle/plugins/node.js";
|
|
6
2
|
import { dereferenceDocument } from "./dereference.js";
|
|
3
|
+
import { bundle } from "../../node_modules/.pnpm/@apidevtools_json-schema-ref-parser@15.3.5_@types_json-schema@7.0.15/node_modules/@apidevtools/json-schema-ref-parser/dist/lib/index.js";
|
|
7
4
|
//#region src/utils/document/process.ts
|
|
8
5
|
/**
|
|
9
6
|
* process & reference input document to a Fumadocs OpenAPI compatible format
|
|
10
7
|
*/
|
|
11
8
|
async function processDocument(input) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
} }
|
|
18
|
-
}).then((v) => upgrade(v, "3.2")).catch((e) => {
|
|
9
|
+
try {
|
|
10
|
+
let bundled = await bundle(input);
|
|
11
|
+
bundled = upgrade(bundled, "3.2");
|
|
12
|
+
return dereferenceDocument(bundled);
|
|
13
|
+
} catch (e) {
|
|
19
14
|
throw new Error(`[OpenAPI] Failed to resolve input: ${input}`, { cause: e });
|
|
20
|
-
}
|
|
15
|
+
}
|
|
21
16
|
}
|
|
22
17
|
//#endregion
|
|
23
18
|
export { processDocument };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fumadocs-openapi",
|
|
3
|
-
"version": "10.10.
|
|
3
|
+
"version": "10.10.3",
|
|
4
4
|
"description": "Generate MDX docs for your OpenAPI spec",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Docs",
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
"@fumari/stf": "1.0.5"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
+
"@apidevtools/json-schema-ref-parser": "^15.3.5",
|
|
60
61
|
"@fastify/deepmerge": "^3.2.1",
|
|
61
62
|
"@scalar/api-client-react": "2.0.20",
|
|
62
|
-
"@scalar/json-magic": "^0.12.14",
|
|
63
63
|
"@scalar/openapi-upgrader": "^0.2.8",
|
|
64
64
|
"@tailwindcss/oxide": "^4.3.0",
|
|
65
65
|
"@types/js-yaml": "^4.0.9",
|
|
@@ -96,18 +96,15 @@
|
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"inlinedDependencies": {
|
|
99
|
+
"@apidevtools/json-schema-ref-parser": "15.3.5",
|
|
99
100
|
"@fastify/deepmerge": "3.2.1",
|
|
100
|
-
"@scalar/helpers": "0.8.0",
|
|
101
|
-
"@scalar/json-magic": "0.12.14",
|
|
102
101
|
"@scalar/openapi-upgrader": "0.2.8",
|
|
103
102
|
"ajv": "8.20.0",
|
|
104
103
|
"fast-content-type-parse": "3.0.0",
|
|
105
104
|
"fast-deep-equal": "3.1.3",
|
|
106
105
|
"fast-uri": "3.1.0",
|
|
107
106
|
"json-schema-traverse": "1.0.0",
|
|
108
|
-
"
|
|
109
|
-
"xml-js": "1.6.11",
|
|
110
|
-
"yaml": "2.9.0"
|
|
107
|
+
"xml-js": "1.6.11"
|
|
111
108
|
},
|
|
112
109
|
"scripts": {
|
|
113
110
|
"build": "tsdown",
|