fumadocs-openapi 10.6.0 → 10.6.2
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 +21 -2
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/playground/client.d.ts +8 -6
- package/dist/playground/client.d.ts.map +1 -1
- package/dist/playground/client.js +22 -20
- package/dist/playground/client.js.map +1 -1
- package/dist/playground/fetcher.d.ts +20 -1
- package/dist/playground/fetcher.d.ts.map +1 -1
- package/dist/playground/fetcher.js +28 -24
- package/dist/playground/fetcher.js.map +1 -1
- package/dist/playground/index.d.ts +3 -3
- package/dist/playground/index.d.ts.map +1 -1
- package/dist/playground/index.js +3 -3
- package/dist/playground/index.js.map +1 -1
- package/dist/playground/schema.d.ts +1 -0
- package/dist/playground/schema.d.ts.map +1 -1
- package/dist/requests/generators/curl.js +2 -2
- package/dist/requests/generators/curl.js.map +1 -1
- package/dist/requests/generators/go.js +5 -5
- package/dist/requests/generators/go.js.map +1 -1
- package/dist/requests/generators/java.js +13 -13
- package/dist/requests/generators/java.js.map +1 -1
- package/dist/requests/generators/javascript.js +2 -2
- package/dist/requests/generators/javascript.js.map +1 -1
- package/dist/requests/string-utils.js +4 -3
- package/dist/requests/string-utils.js.map +1 -1
- package/dist/server/create.d.ts +1 -1
- package/dist/server/proxy.d.ts +5 -2
- package/dist/server/proxy.d.ts.map +1 -1
- package/dist/server/proxy.js +41 -31
- package/dist/server/proxy.js.map +1 -1
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/api-page.d.ts +0 -1
- package/dist/ui/api-page.d.ts.map +1 -1
- package/dist/ui/api-page.js +2 -3
- package/dist/ui/api-page.js.map +1 -1
- package/dist/ui/base.d.ts +3 -3
- package/dist/ui/base.js +9 -0
- package/dist/ui/base.js.map +1 -1
- package/dist/ui/client/boundary.d.ts +12 -0
- package/dist/ui/client/boundary.d.ts.map +1 -0
- package/dist/ui/client/boundary.js +19 -0
- package/dist/ui/client/boundary.js.map +1 -0
- package/dist/ui/client/boundary.lazy.js +20 -0
- package/dist/ui/client/boundary.lazy.js.map +1 -0
- package/dist/ui/client/index.d.ts +1 -1
- package/dist/ui/components/codeblock.d.ts +2 -2
- package/dist/ui/components/codeblock.d.ts.map +1 -1
- package/dist/ui/contexts/api.d.ts +27 -0
- package/dist/ui/contexts/api.d.ts.map +1 -0
- package/dist/ui/create-client.d.ts.map +1 -1
- package/dist/ui/create-client.js +2 -0
- package/dist/ui/create-client.js.map +1 -1
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/operation/index.js +1 -2
- package/dist/ui/operation/index.js.map +1 -1
- package/dist/ui/operation/usage-tabs/client.d.ts +15 -0
- package/dist/ui/operation/usage-tabs/client.d.ts.map +1 -0
- package/dist/ui/operation/usage-tabs/index.js +2 -3
- package/dist/ui/operation/usage-tabs/index.js.map +1 -1
- package/dist/ui/schema/client.d.ts +8 -1
- package/dist/ui/schema/client.d.ts.map +1 -1
- package/dist/ui/schema/client.js +17 -6
- package/dist/ui/schema/client.js.map +1 -1
- package/dist/ui/schema/index.d.ts +0 -1
- package/dist/ui/schema/index.d.ts.map +1 -1
- package/dist/ui/schema/index.js +19 -10
- package/dist/ui/schema/index.js.map +1 -1
- package/package.json +7 -8
- package/dist/playground/lazy.js +0 -8
- package/dist/playground/lazy.js.map +0 -1
- package/dist/ui/contexts/api.lazy.js +0 -9
- package/dist/ui/contexts/api.lazy.js.map +0 -1
- package/dist/ui/operation/usage-tabs/lazy.js +0 -9
- package/dist/ui/operation/usage-tabs/lazy.js.map +0 -1
- package/dist/ui/schema/lazy.js +0 -8
- package/dist/ui/schema/lazy.js.map +0 -1
- package/dist/utils/lazy.js +0 -13
- package/dist/utils/lazy.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MethodInformation, RenderContext, SecuritySchemeObject } from "../types.js";
|
|
2
|
-
import * as react from "react";
|
|
3
|
-
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
import * as _$react from "react";
|
|
3
|
+
import * as _$react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
4
|
|
|
5
5
|
//#region src/playground/index.d.ts
|
|
6
6
|
interface APIPlaygroundProps {
|
|
@@ -16,7 +16,7 @@ declare function APIPlayground({
|
|
|
16
16
|
path,
|
|
17
17
|
method,
|
|
18
18
|
ctx
|
|
19
|
-
}: APIPlaygroundProps): string | number | bigint | boolean |
|
|
19
|
+
}: APIPlaygroundProps): string | number | bigint | boolean | Iterable<_$react.ReactNode> | Promise<_$react.ReactNode> | _$react_jsx_runtime0.JSX.Element | null | undefined;
|
|
20
20
|
//#endregion
|
|
21
21
|
export { APIPlayground, APIPlaygroundProps, SecurityEntry };
|
|
22
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/playground/index.tsx"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/playground/index.tsx"],"mappings":";;;;;UAgBiB,kBAAA;EACf,IAAA;EACA,MAAA,EAAQ,iBAAA;EACR,GAAA,EAAK,aAAA;AAAA;AAAA,KAGK,aAAA,GAAgB,oBAAA;EAC1B,MAAA;EACA,EAAA;AAAA;AAAA,iBAGc,aAAA,CAAA;EAAgB,IAAA;EAAM,MAAA;EAAQ;AAAA,GAAO,kBAAA,wCAAkB,QAAA,CAAA,OAAA,CAAA,SAAA,IAAA,OAAA,CAAA,OAAA,CAAA,SAAA,IAAA,oBAAA,CAAA,GAAA,CAAA,OAAA"}
|
package/dist/playground/index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { getPreferredType } from "../utils/schema/index.js";
|
|
2
|
-
import { ClientLazy } from "./lazy.js";
|
|
3
2
|
import { jsx } from "react/jsx-runtime";
|
|
4
3
|
//#region src/playground/index.tsx
|
|
5
4
|
function APIPlayground({ path, method, ctx }) {
|
|
@@ -25,7 +24,7 @@ function APIPlayground({ path, method, ctx }) {
|
|
|
25
24
|
},
|
|
26
25
|
registered: /* @__PURE__ */ new WeakMap()
|
|
27
26
|
};
|
|
28
|
-
|
|
27
|
+
const props = {
|
|
29
28
|
securities: parseSecurities(method, ctx),
|
|
30
29
|
method: method.method,
|
|
31
30
|
route: path,
|
|
@@ -59,7 +58,8 @@ function APIPlayground({ path, method, ctx }) {
|
|
|
59
58
|
proxyUrl: ctx.proxyUrl,
|
|
60
59
|
writeOnly: true,
|
|
61
60
|
readOnly: false
|
|
62
|
-
}
|
|
61
|
+
};
|
|
62
|
+
return /* @__PURE__ */ jsx(ctx.clientBoundary.PlaygroundClient, { ...props });
|
|
63
63
|
}
|
|
64
64
|
function writeReferences(schema, ctx, stack = /* @__PURE__ */ new WeakMap()) {
|
|
65
65
|
if (typeof schema !== "object" || !schema) return schema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/playground/index.tsx"],"sourcesContent":["import type {\n MediaTypeObject,\n MethodInformation,\n ParameterObject,\n RenderContext,\n SecuritySchemeObject,\n} from '@/types';\nimport { getPreferredType, NoReference, type ParsedSchema } from '@/utils/schema';\nimport { type PlaygroundClientProps } from './client';\
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/playground/index.tsx"],"sourcesContent":["import type {\n MediaTypeObject,\n MethodInformation,\n ParameterObject,\n RenderContext,\n SecuritySchemeObject,\n} from '@/types';\nimport { getPreferredType, NoReference, type ParsedSchema } from '@/utils/schema';\nimport { type PlaygroundClientProps } from './client';\n\ninterface Context {\n references: Record<string, ParsedSchema>;\n registered: WeakMap<Exclude<ParsedSchema, boolean>, string>;\n id: (schema?: object) => string;\n}\n\nexport interface APIPlaygroundProps {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n}\n\nexport type SecurityEntry = SecuritySchemeObject & {\n scopes: string[];\n id: string;\n};\n\nexport function APIPlayground({ path, method, ctx }: APIPlaygroundProps) {\n if (ctx.playground?.render) {\n return ctx.playground.render({ path, method, ctx });\n }\n\n const bodyContent = method.requestBody?.content;\n const mediaType = bodyContent ? getPreferredType(bodyContent) : undefined;\n const takenIds = new Map<string, number>();\n\n const context: Context = {\n references: {},\n id(schema) {\n let name = 'r';\n if (schema) {\n const ref = ctx.schema.getRawRef(schema)?.split('/');\n if (ref && ref.length > 0) name = ref[ref.length - 1];\n }\n\n const count = takenIds.get(name) ?? 0;\n takenIds.set(name, count + 1);\n return count === 0 ? name : `${name}${count}`;\n },\n registered: new WeakMap(),\n };\n\n const props: PlaygroundClientProps = {\n securities: parseSecurities(method, ctx),\n method: method.method,\n route: path,\n parameters: method.parameters?.map((param: NoReference<ParameterObject>): ParameterObject => {\n if (param.schema !== undefined) {\n return {\n ...param,\n schema: writeReferences(param.schema, context),\n } as ParameterObject;\n }\n\n if (param.content !== undefined) {\n const content: Record<string, MediaTypeObject> = {};\n\n for (const k in param.content) {\n const original = param.content[k] as NoReference<MediaTypeObject>;\n if (!original || original.schema === undefined) continue;\n\n content[k] = {\n ...original,\n schema: writeReferences(original.schema, context),\n } as MediaTypeObject;\n }\n\n return {\n ...param,\n content,\n } as ParameterObject;\n }\n\n return param;\n }),\n body:\n bodyContent && mediaType\n ? ({\n schema: writeReferences(bodyContent[mediaType].schema as ParsedSchema, context),\n mediaType,\n } as PlaygroundClientProps['body'])\n : undefined,\n references: context.references,\n proxyUrl: ctx.proxyUrl,\n writeOnly: true,\n readOnly: false,\n };\n\n return <ctx.clientBoundary.PlaygroundClient {...props} />;\n}\n\nfunction writeReferences(\n schema: ParsedSchema,\n ctx: Context,\n stack: WeakMap<object, object> = new WeakMap(),\n): ParsedSchema {\n if (typeof schema !== 'object' || !schema) return schema;\n if (stack.has(schema)) {\n const out = stack.get(schema)!;\n const id = ctx.id(schema);\n ctx.references[id] = out;\n\n return {\n $ref: `#/${id}`,\n };\n }\n\n const output = { ...schema };\n stack.set(schema, output);\n for (const _n in output) {\n const name = _n as keyof typeof output;\n if (!output[name]) continue;\n\n switch (name) {\n case 'oneOf':\n case 'allOf':\n case 'anyOf':\n output[name] = output[name].map((item) => writeReferences(item, ctx, stack));\n continue;\n case 'items':\n case 'additionalProperties':\n case 'not':\n output[name] = writeReferences(output[name], ctx, stack);\n continue;\n case 'properties':\n case 'patternProperties':\n output[name] = { ...output[name] };\n\n for (const key in output[name]) {\n output[name][key] = writeReferences(output[name][key], ctx, stack);\n }\n }\n }\n\n return output;\n}\n\nfunction parseSecurities(\n method: MethodInformation,\n { schema: { dereferenced } }: RenderContext,\n): PlaygroundClientProps['securities'] {\n const result: PlaygroundClientProps['securities'] = [];\n const security = method.security ?? dereferenced.security ?? [];\n if (security.length === 0) return result;\n\n for (const map of security) {\n const list: PlaygroundClientProps['securities'][number] = [];\n\n for (const [key, scopes] of Object.entries(map)) {\n const scheme = dereferenced.components?.securitySchemes?.[key];\n if (!scheme) continue;\n\n list.push({\n ...scheme,\n scopes,\n id: key,\n });\n }\n\n if (list.length > 0) result.push(list);\n }\n\n return result;\n}\n"],"mappings":";;;AA2BA,SAAgB,cAAc,EAAE,MAAM,QAAQ,OAA2B;AACvE,KAAI,IAAI,YAAY,OAClB,QAAO,IAAI,WAAW,OAAO;EAAE;EAAM;EAAQ;EAAK,CAAC;CAGrD,MAAM,cAAc,OAAO,aAAa;CACxC,MAAM,YAAY,cAAc,iBAAiB,YAAY,GAAG,KAAA;CAChE,MAAM,2BAAW,IAAI,KAAqB;CAE1C,MAAM,UAAmB;EACvB,YAAY,EAAE;EACd,GAAG,QAAQ;GACT,IAAI,OAAO;AACX,OAAI,QAAQ;IACV,MAAM,MAAM,IAAI,OAAO,UAAU,OAAO,EAAE,MAAM,IAAI;AACpD,QAAI,OAAO,IAAI,SAAS,EAAG,QAAO,IAAI,IAAI,SAAS;;GAGrD,MAAM,QAAQ,SAAS,IAAI,KAAK,IAAI;AACpC,YAAS,IAAI,MAAM,QAAQ,EAAE;AAC7B,UAAO,UAAU,IAAI,OAAO,GAAG,OAAO;;EAExC,4BAAY,IAAI,SAAS;EAC1B;CAED,MAAM,QAA+B;EACnC,YAAY,gBAAgB,QAAQ,IAAI;EACxC,QAAQ,OAAO;EACf,OAAO;EACP,YAAY,OAAO,YAAY,KAAK,UAAyD;AAC3F,OAAI,MAAM,WAAW,KAAA,EACnB,QAAO;IACL,GAAG;IACH,QAAQ,gBAAgB,MAAM,QAAQ,QAAQ;IAC/C;AAGH,OAAI,MAAM,YAAY,KAAA,GAAW;IAC/B,MAAM,UAA2C,EAAE;AAEnD,SAAK,MAAM,KAAK,MAAM,SAAS;KAC7B,MAAM,WAAW,MAAM,QAAQ;AAC/B,SAAI,CAAC,YAAY,SAAS,WAAW,KAAA,EAAW;AAEhD,aAAQ,KAAK;MACX,GAAG;MACH,QAAQ,gBAAgB,SAAS,QAAQ,QAAQ;MAClD;;AAGH,WAAO;KACL,GAAG;KACH;KACD;;AAGH,UAAO;IACP;EACF,MACE,eAAe,YACV;GACC,QAAQ,gBAAgB,YAAY,WAAW,QAAwB,QAAQ;GAC/E;GACD,GACD,KAAA;EACN,YAAY,QAAQ;EACpB,UAAU,IAAI;EACd,WAAW;EACX,UAAU;EACX;AAED,QAAO,oBAAC,IAAI,eAAe,kBAApB,EAAqC,GAAI,OAAS,CAAA;;AAG3D,SAAS,gBACP,QACA,KACA,wBAAiC,IAAI,SAAS,EAChC;AACd,KAAI,OAAO,WAAW,YAAY,CAAC,OAAQ,QAAO;AAClD,KAAI,MAAM,IAAI,OAAO,EAAE;EACrB,MAAM,MAAM,MAAM,IAAI,OAAO;EAC7B,MAAM,KAAK,IAAI,GAAG,OAAO;AACzB,MAAI,WAAW,MAAM;AAErB,SAAO,EACL,MAAM,KAAK,MACZ;;CAGH,MAAM,SAAS,EAAE,GAAG,QAAQ;AAC5B,OAAM,IAAI,QAAQ,OAAO;AACzB,MAAK,MAAM,MAAM,QAAQ;EACvB,MAAM,OAAO;AACb,MAAI,CAAC,OAAO,MAAO;AAEnB,UAAQ,MAAR;GACE,KAAK;GACL,KAAK;GACL,KAAK;AACH,WAAO,QAAQ,OAAO,MAAM,KAAK,SAAS,gBAAgB,MAAM,KAAK,MAAM,CAAC;AAC5E;GACF,KAAK;GACL,KAAK;GACL,KAAK;AACH,WAAO,QAAQ,gBAAgB,OAAO,OAAO,KAAK,MAAM;AACxD;GACF,KAAK;GACL,KAAK;AACH,WAAO,QAAQ,EAAE,GAAG,OAAO,OAAO;AAElC,SAAK,MAAM,OAAO,OAAO,MACvB,QAAO,MAAM,OAAO,gBAAgB,OAAO,MAAM,MAAM,KAAK,MAAM;;;AAK1E,QAAO;;AAGT,SAAS,gBACP,QACA,EAAE,QAAQ,EAAE,kBACyB;CACrC,MAAM,SAA8C,EAAE;CACtD,MAAM,WAAW,OAAO,YAAY,aAAa,YAAY,EAAE;AAC/D,KAAI,SAAS,WAAW,EAAG,QAAO;AAElC,MAAK,MAAM,OAAO,UAAU;EAC1B,MAAM,OAAoD,EAAE;AAE5D,OAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,IAAI,EAAE;GAC/C,MAAM,SAAS,aAAa,YAAY,kBAAkB;AAC1D,OAAI,CAAC,OAAQ;AAEb,QAAK,KAAK;IACR,GAAG;IACH;IACA,IAAI;IACL,CAAC;;AAGJ,MAAI,KAAK,SAAS,EAAG,QAAO,KAAK,KAAK;;AAGxC,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/playground/schema.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/playground/schema.tsx"],"mappings":";;;;;UAeiB,WAAA;;;;EAIf,SAAA;;;;EAKA,QAAA;AAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { escapeString,
|
|
1
|
+
import { escapeString, indent, inputToString } from "../string-utils.js";
|
|
2
2
|
//#region src/requests/generators/curl.ts
|
|
3
3
|
const curl = {
|
|
4
4
|
label: "cURL",
|
|
@@ -22,7 +22,7 @@ const curl = {
|
|
|
22
22
|
s.push(`-H "Content-Type: ${data.bodyMediaType}"`);
|
|
23
23
|
s.push(`-d ${escaped}`);
|
|
24
24
|
}
|
|
25
|
-
return s.flatMap((v, i) =>
|
|
25
|
+
return s.flatMap((v, i) => indent(v, i > 0 ? 1 : 0)).join(" \\\n");
|
|
26
26
|
}
|
|
27
27
|
};
|
|
28
28
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curl.js","names":[],"sources":["../../../src/requests/generators/curl.ts"],"sourcesContent":["import { escapeString,
|
|
1
|
+
{"version":3,"file":"curl.js","names":[],"sources":["../../../src/requests/generators/curl.ts"],"sourcesContent":["import { escapeString, indent, inputToString } from '@/requests/string-utils';\nimport type { CodeUsageGenerator } from '@/requests/generators';\n\nexport const curl: CodeUsageGenerator = {\n label: 'cURL',\n lang: 'bash',\n generate(url, data) {\n const s: string[] = [];\n s.push(`curl -X ${data.method} \"${url}\"`);\n\n for (const header in data.header) {\n const value = `${header}: ${data.header[header].value}`;\n\n s.push(`-H \"${value}\"`);\n }\n\n for (const k in data.cookie) {\n const param = data.cookie[k];\n\n s.push(`--cookie ${JSON.stringify(`${k}=${param.value}`)}`);\n }\n\n if (data.body && data.bodyMediaType === 'multipart/form-data') {\n if (typeof data.body !== 'object') throw new Error('[CURL] request body must be an object.');\n\n for (const [key, value] of Object.entries(data.body)) {\n s.push(`-F ${key}=${JSON.stringify(inputToString(value))}`);\n }\n } else if (data.body && data.bodyMediaType) {\n const escaped = escapeString(\n inputToString(\n data.body,\n // @ts-expect-error -- assume the body media type is supported\n data.bodyMediaType,\n ),\n \"'\",\n );\n\n s.push(`-H \"Content-Type: ${data.bodyMediaType}\"`);\n s.push(`-d ${escaped}`);\n }\n\n return s.flatMap((v, i) => indent(v, i > 0 ? 1 : 0)).join(' \\\\\\n');\n },\n};\n"],"mappings":";;AAGA,MAAa,OAA2B;CACtC,OAAO;CACP,MAAM;CACN,SAAS,KAAK,MAAM;EAClB,MAAM,IAAc,EAAE;AACtB,IAAE,KAAK,WAAW,KAAK,OAAO,IAAI,IAAI,GAAG;AAEzC,OAAK,MAAM,UAAU,KAAK,QAAQ;GAChC,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,OAAO,QAAQ;AAEhD,KAAE,KAAK,OAAO,MAAM,GAAG;;AAGzB,OAAK,MAAM,KAAK,KAAK,QAAQ;GAC3B,MAAM,QAAQ,KAAK,OAAO;AAE1B,KAAE,KAAK,YAAY,KAAK,UAAU,GAAG,EAAE,GAAG,MAAM,QAAQ,GAAG;;AAG7D,MAAI,KAAK,QAAQ,KAAK,kBAAkB,uBAAuB;AAC7D,OAAI,OAAO,KAAK,SAAS,SAAU,OAAM,IAAI,MAAM,yCAAyC;AAE5F,QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,KAAK,CAClD,GAAE,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU,cAAc,MAAM,CAAC,GAAG;aAEpD,KAAK,QAAQ,KAAK,eAAe;GAC1C,MAAM,UAAU,aACd,cACE,KAAK,MAEL,KAAK,cACN,EACD,IACD;AAED,KAAE,KAAK,qBAAqB,KAAK,cAAc,GAAG;AAClD,KAAE,KAAK,MAAM,UAAU;;AAGzB,SAAO,EAAE,SAAS,GAAG,MAAM,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,QAAQ;;CAErE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { indent } from "../string-utils.js";
|
|
2
2
|
import { resolveMediaAdapter } from "../media/resolve-adapter.js";
|
|
3
3
|
import "../media/adapter.js";
|
|
4
4
|
//#region src/requests/generators/go.ts
|
|
@@ -31,14 +31,14 @@ const go = {
|
|
|
31
31
|
return `package main
|
|
32
32
|
|
|
33
33
|
import (
|
|
34
|
-
${
|
|
34
|
+
${indent(imports.map((v) => `"${v}"`).join("\n"))}
|
|
35
35
|
)
|
|
36
36
|
|
|
37
37
|
func main() {
|
|
38
|
-
${Array.from(variables.entries()).map(([k, v]) =>
|
|
39
|
-
${body ?
|
|
38
|
+
${Array.from(variables.entries()).map(([k, v]) => indent(`${k} := ${v}`)).join("\n")}
|
|
39
|
+
${body ? indent(body) : ""}
|
|
40
40
|
req, _ := http.NewRequest("${data.method}", url, ${body ? "body" : "nil"})
|
|
41
|
-
${
|
|
41
|
+
${indent(Array.from(headers.entries()).map(([key, value]) => `req.Header.Add("${key}", ${value})`).join("\n"))}
|
|
42
42
|
res, _ := http.DefaultClient.Do(req)
|
|
43
43
|
defer res.Body.Close()
|
|
44
44
|
body, _ := ioutil.ReadAll(res.Body)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"go.js","names":[],"sources":["../../../src/requests/generators/go.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"go.js","names":[],"sources":["../../../src/requests/generators/go.ts"],"sourcesContent":["import { indent } from '@/requests/string-utils';\nimport type { CodeUsageGenerator } from '@/requests/generators';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const go: CodeUsageGenerator = {\n label: 'Go',\n lang: 'go',\n generate(url, data, { mediaAdapters }) {\n const imports = ['fmt', 'net/http', 'io/ioutil'];\n const headers = new Map<string, string>();\n const variables = new Map<string, string>();\n variables.set('url', JSON.stringify(url));\n\n for (const header in data.header) {\n headers.set(header, JSON.stringify(data.header[header].value));\n }\n\n const cookies = Object.entries(data.cookie);\n if (cookies.length > 0) {\n headers.set(\n 'Cookie',\n JSON.stringify(cookies.map(([k, param]) => `${k}=${param.value}`).join('; ')),\n );\n }\n\n let body: string | undefined;\n\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n headers.set('Content-Type', `\"${data.bodyMediaType}\"`);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'go',\n addImport(from) {\n imports.push(from);\n },\n });\n }\n\n return `package main\n\nimport (\n${indent(imports.map((v) => `\"${v}\"`).join('\\n'))}\n)\n\nfunc main() {\n${Array.from(variables.entries())\n .map(([k, v]) => indent(`${k} := ${v}`))\n .join('\\n')}\n${body ? indent(body) : ''}\n req, _ := http.NewRequest(\"${data.method}\", url, ${body ? 'body' : 'nil'})\n${indent(\n Array.from(headers.entries())\n .map(([key, value]) => `req.Header.Add(\"${key}\", ${value})`)\n .join('\\n'),\n)}\n res, _ := http.DefaultClient.Do(req)\n defer res.Body.Close()\n body, _ := ioutil.ReadAll(res.Body)\n\n fmt.Println(res)\n fmt.Println(string(body))\n}`;\n },\n};\n"],"mappings":";;;;AAIA,MAAa,KAAyB;CACpC,OAAO;CACP,MAAM;CACN,SAAS,KAAK,MAAM,EAAE,iBAAiB;EACrC,MAAM,UAAU;GAAC;GAAO;GAAY;GAAY;EAChD,MAAM,0BAAU,IAAI,KAAqB;EACzC,MAAM,4BAAY,IAAI,KAAqB;AAC3C,YAAU,IAAI,OAAO,KAAK,UAAU,IAAI,CAAC;AAEzC,OAAK,MAAM,UAAU,KAAK,OACxB,SAAQ,IAAI,QAAQ,KAAK,UAAU,KAAK,OAAO,QAAQ,MAAM,CAAC;EAGhE,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO;AAC3C,MAAI,QAAQ,SAAS,EACnB,SAAQ,IACN,UACA,KAAK,UAAU,QAAQ,KAAK,CAAC,GAAG,WAAW,GAAG,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,KAAK,CAAC,CAC9E;EAGH,IAAI;AAEJ,MAAI,KAAK,QAAQ,KAAK,eAAe;GACnC,MAAM,UAAU,oBAAoB,KAAK,eAAe,cAAc;AACtE,WAAQ,IAAI,gBAAgB,IAAI,KAAK,cAAc,GAAG;AACtD,UAAO,SAAS,gBAAgB,MAA2B;IACzD,MAAM;IACN,UAAU,MAAM;AACd,aAAQ,KAAK,KAAK;;IAErB,CAAC;;AAGJ,SAAO;;;EAGT,OAAO,QAAQ,KAAK,MAAM,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC;;;;EAIhD,MAAM,KAAK,UAAU,SAAS,CAAC,CAC9B,KAAK,CAAC,GAAG,OAAO,OAAO,GAAG,EAAE,MAAM,IAAI,CAAC,CACvC,KAAK,KAAK,CAAC;EACZ,OAAO,OAAO,KAAK,GAAG,GAAG;+BACI,KAAK,OAAO,UAAU,OAAO,SAAS,MAAM;EACzE,OACA,MAAM,KAAK,QAAQ,SAAS,CAAC,CAC1B,KAAK,CAAC,KAAK,WAAW,mBAAmB,IAAI,KAAK,MAAM,GAAG,CAC3D,KAAK,KAAK,CACd,CAAC;;;;;;;;;CASD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { indent } from "../string-utils.js";
|
|
2
2
|
import { resolveMediaAdapter } from "../media/resolve-adapter.js";
|
|
3
3
|
import "../media/adapter.js";
|
|
4
4
|
//#region src/requests/generators/java.ts
|
|
@@ -27,28 +27,28 @@ const java = {
|
|
|
27
27
|
s.push("");
|
|
28
28
|
if (body) s.push(body);
|
|
29
29
|
s.push("HttpClient client = HttpClient.newBuilder()");
|
|
30
|
-
s.push(
|
|
31
|
-
s.push(
|
|
30
|
+
s.push(indent(".connectTimeout(Duration.ofSeconds(10))"));
|
|
31
|
+
s.push(indent(".build();"));
|
|
32
32
|
s.push("");
|
|
33
33
|
s.push("HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()");
|
|
34
|
-
s.push(
|
|
35
|
-
for (const [key, param] of Object.entries(headers)) s.push(
|
|
36
|
-
if (data.bodyMediaType) s.push(
|
|
34
|
+
s.push(indent(`.uri(URI.create(${JSON.stringify(url)}))`));
|
|
35
|
+
for (const [key, param] of Object.entries(headers)) s.push(indent(`.header(${JSON.stringify(key)}, ${JSON.stringify(param.value)})`));
|
|
36
|
+
if (data.bodyMediaType) s.push(indent(`.header("Content-Type", "${data.bodyMediaType}")`));
|
|
37
37
|
const cookies = Object.entries(data.cookie);
|
|
38
38
|
if (cookies.length > 0) {
|
|
39
39
|
const cookieString = cookies.map(([key, param]) => `${key}=${param.value}`).join("; ");
|
|
40
|
-
s.push(
|
|
40
|
+
s.push(indent(`.header("Cookie", ${JSON.stringify(cookieString)})`));
|
|
41
41
|
}
|
|
42
42
|
const arg = body ? "body" : "";
|
|
43
|
-
s.push(
|
|
44
|
-
s.push(
|
|
43
|
+
s.push(indent(`.${data.method.toUpperCase()}(${arg})`));
|
|
44
|
+
s.push(indent(".build();"));
|
|
45
45
|
s.push("");
|
|
46
46
|
s.push("try {");
|
|
47
|
-
s.push(
|
|
48
|
-
s.push(
|
|
49
|
-
s.push(
|
|
47
|
+
s.push(indent("HttpResponse<String> response = client.send(requestBuilder.build(), BodyHandlers.ofString());"));
|
|
48
|
+
s.push(indent("System.out.println(\"Status code: \" + response.statusCode());"));
|
|
49
|
+
s.push(indent("System.out.println(\"Response body: \" + response.body());"));
|
|
50
50
|
s.push("} catch (Exception e) {");
|
|
51
|
-
s.push(
|
|
51
|
+
s.push(indent("e.printStackTrace();"));
|
|
52
52
|
s.push("}");
|
|
53
53
|
return s.join("\n");
|
|
54
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"java.js","names":[],"sources":["../../../src/requests/generators/java.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"java.js","names":[],"sources":["../../../src/requests/generators/java.ts"],"sourcesContent":["import { indent } from '@/requests/string-utils';\nimport type { CodeUsageGenerator } from '@/requests/generators';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const java: CodeUsageGenerator = {\n label: 'Java',\n lang: 'java',\n generate(url, data, { mediaAdapters }) {\n const s: string[] = [];\n const headers = { ...data.header };\n const imports = new Set<string>([\n 'java.net.URI',\n 'java.net.http.HttpClient',\n 'java.net.http.HttpRequest',\n 'java.net.http.HttpResponse',\n 'java.net.http.HttpResponse.BodyHandlers',\n 'java.time.Duration',\n ]);\n\n // Handle body if present\n let body: string | undefined;\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'java',\n addImport(specifier) {\n imports.add(specifier);\n },\n });\n }\n\n for (const value of imports.values()) {\n s.push(`import ${value};`);\n }\n s.push('');\n\n if (body) {\n s.push(body);\n }\n\n // Create HttpClient\n s.push('HttpClient client = HttpClient.newBuilder()');\n s.push(indent('.connectTimeout(Duration.ofSeconds(10))'));\n s.push(indent('.build();'));\n s.push('');\n\n // Build request\n s.push('HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()');\n s.push(indent(`.uri(URI.create(${JSON.stringify(url)}))`));\n\n // Add headers\n for (const [key, param] of Object.entries(headers)) {\n s.push(indent(`.header(${JSON.stringify(key)}, ${JSON.stringify(param.value)})`));\n }\n\n if (data.bodyMediaType) {\n s.push(indent(`.header(\"Content-Type\", \"${data.bodyMediaType}\")`));\n }\n\n // Add cookies if present\n const cookies = Object.entries(data.cookie);\n\n if (cookies.length > 0) {\n const cookieString = cookies.map(([key, param]) => `${key}=${param.value}`).join('; ');\n\n s.push(indent(`.header(\"Cookie\", ${JSON.stringify(cookieString)})`));\n }\n\n const arg = body ? 'body' : '';\n s.push(indent(`.${data.method.toUpperCase()}(${arg})`));\n s.push(indent('.build();'));\n s.push('');\n\n // Add response handling\n s.push('try {');\n s.push(\n indent(\n 'HttpResponse<String> response = client.send(requestBuilder.build(), BodyHandlers.ofString());',\n ),\n );\n s.push(indent('System.out.println(\"Status code: \" + response.statusCode());'));\n s.push(indent('System.out.println(\"Response body: \" + response.body());'));\n s.push('} catch (Exception e) {');\n s.push(indent('e.printStackTrace();'));\n s.push('}');\n\n return s.join('\\n');\n },\n};\n"],"mappings":";;;;AAIA,MAAa,OAA2B;CACtC,OAAO;CACP,MAAM;CACN,SAAS,KAAK,MAAM,EAAE,iBAAiB;EACrC,MAAM,IAAc,EAAE;EACtB,MAAM,UAAU,EAAE,GAAG,KAAK,QAAQ;EAClC,MAAM,UAAU,IAAI,IAAY;GAC9B;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;EAGF,IAAI;AACJ,MAAI,KAAK,QAAQ,KAAK,cAEpB,QADgB,oBAAoB,KAAK,eAAe,cAAc,EACtD,gBAAgB,MAA2B;GACzD,MAAM;GACN,UAAU,WAAW;AACnB,YAAQ,IAAI,UAAU;;GAEzB,CAAC;AAGJ,OAAK,MAAM,SAAS,QAAQ,QAAQ,CAClC,GAAE,KAAK,UAAU,MAAM,GAAG;AAE5B,IAAE,KAAK,GAAG;AAEV,MAAI,KACF,GAAE,KAAK,KAAK;AAId,IAAE,KAAK,8CAA8C;AACrD,IAAE,KAAK,OAAO,0CAA0C,CAAC;AACzD,IAAE,KAAK,OAAO,YAAY,CAAC;AAC3B,IAAE,KAAK,GAAG;AAGV,IAAE,KAAK,gEAAgE;AACvE,IAAE,KAAK,OAAO,mBAAmB,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC;AAG1D,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,CAChD,GAAE,KAAK,OAAO,WAAW,KAAK,UAAU,IAAI,CAAC,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,CAAC;AAGnF,MAAI,KAAK,cACP,GAAE,KAAK,OAAO,4BAA4B,KAAK,cAAc,IAAI,CAAC;EAIpE,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO;AAE3C,MAAI,QAAQ,SAAS,GAAG;GACtB,MAAM,eAAe,QAAQ,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,KAAK;AAEtF,KAAE,KAAK,OAAO,qBAAqB,KAAK,UAAU,aAAa,CAAC,GAAG,CAAC;;EAGtE,MAAM,MAAM,OAAO,SAAS;AAC5B,IAAE,KAAK,OAAO,IAAI,KAAK,OAAO,aAAa,CAAC,GAAG,IAAI,GAAG,CAAC;AACvD,IAAE,KAAK,OAAO,YAAY,CAAC;AAC3B,IAAE,KAAK,GAAG;AAGV,IAAE,KAAK,QAAQ;AACf,IAAE,KACA,OACE,gGACD,CACF;AACD,IAAE,KAAK,OAAO,iEAA+D,CAAC;AAC9E,IAAE,KAAK,OAAO,6DAA2D,CAAC;AAC1E,IAAE,KAAK,0BAA0B;AACjC,IAAE,KAAK,OAAO,uBAAuB,CAAC;AACtC,IAAE,KAAK,IAAI;AAEX,SAAO,EAAE,KAAK,KAAK;;CAEtB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { indent } from "../string-utils.js";
|
|
2
2
|
import { resolveMediaAdapter } from "../media/resolve-adapter.js";
|
|
3
3
|
import "../media/adapter.js";
|
|
4
4
|
//#region src/requests/generators/javascript.ts
|
|
@@ -28,7 +28,7 @@ const javascript = {
|
|
|
28
28
|
}
|
|
29
29
|
const params = [JSON.stringify(url)];
|
|
30
30
|
if (options.size > 0) {
|
|
31
|
-
const str = Array.from(options.entries()).map(([k, v]) =>
|
|
31
|
+
const str = Array.from(options.entries()).map(([k, v]) => indent(k === v ? k : `${k}: ${v}`)).join(",\n");
|
|
32
32
|
params.push(`{\n${str}\n}`);
|
|
33
33
|
}
|
|
34
34
|
s.push(`fetch(${params.join(", ")})`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"javascript.js","names":[],"sources":["../../../src/requests/generators/javascript.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"javascript.js","names":[],"sources":["../../../src/requests/generators/javascript.ts"],"sourcesContent":["import { indent } from '@/requests/string-utils';\nimport type { CodeUsageGenerator } from '@/requests/generators';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const javascript: CodeUsageGenerator = {\n label: 'JavaScript',\n lang: 'js',\n generate(url, data, { mediaAdapters }) {\n const s: string[] = [];\n const options = new Map<string, string>();\n const headers: Record<string, string> = {};\n\n options.set('method', JSON.stringify(data.method));\n if (data.bodyMediaType) {\n headers['Content-Type'] = data.bodyMediaType;\n }\n\n for (const [k, v] of Object.entries(data.header)) {\n headers[k] = v.value;\n }\n\n const cookies = Object.entries(data.cookie);\n if (cookies.length > 0) {\n headers['cookie'] = cookies.map(([key, param]) => `${key}=${param.value}`).join('; ');\n }\n\n if (Object.keys(headers).length > 0) {\n options.set('headers', JSON.stringify(headers, null, 2));\n }\n\n let body: string | undefined;\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'js',\n addImport(from, name) {\n s.unshift(`import { ${name} } from \"${from}\"`);\n },\n });\n }\n\n if (body) {\n s.push(body);\n options.set('body', 'body');\n }\n\n const params = [JSON.stringify(url)];\n if (options.size > 0) {\n const str = Array.from(options.entries())\n .map(([k, v]) => indent(k === v ? k : `${k}: ${v}`))\n .join(',\\n');\n\n params.push(`{\\n${str}\\n}`);\n }\n\n s.push(`fetch(${params.join(', ')})`);\n\n return s.join('\\n\\n');\n },\n};\n"],"mappings":";;;;AAIA,MAAa,aAAiC;CAC5C,OAAO;CACP,MAAM;CACN,SAAS,KAAK,MAAM,EAAE,iBAAiB;EACrC,MAAM,IAAc,EAAE;EACtB,MAAM,0BAAU,IAAI,KAAqB;EACzC,MAAM,UAAkC,EAAE;AAE1C,UAAQ,IAAI,UAAU,KAAK,UAAU,KAAK,OAAO,CAAC;AAClD,MAAI,KAAK,cACP,SAAQ,kBAAkB,KAAK;AAGjC,OAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,OAAO,CAC9C,SAAQ,KAAK,EAAE;EAGjB,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO;AAC3C,MAAI,QAAQ,SAAS,EACnB,SAAQ,YAAY,QAAQ,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,KAAK;AAGvF,MAAI,OAAO,KAAK,QAAQ,CAAC,SAAS,EAChC,SAAQ,IAAI,WAAW,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;EAG1D,IAAI;AACJ,MAAI,KAAK,QAAQ,KAAK,cAEpB,QADgB,oBAAoB,KAAK,eAAe,cAAc,EACtD,gBAAgB,MAA2B;GACzD,MAAM;GACN,UAAU,MAAM,MAAM;AACpB,MAAE,QAAQ,YAAY,KAAK,WAAW,KAAK,GAAG;;GAEjD,CAAC;AAGJ,MAAI,MAAM;AACR,KAAE,KAAK,KAAK;AACZ,WAAQ,IAAI,QAAQ,OAAO;;EAG7B,MAAM,SAAS,CAAC,KAAK,UAAU,IAAI,CAAC;AACpC,MAAI,QAAQ,OAAO,GAAG;GACpB,MAAM,MAAM,MAAM,KAAK,QAAQ,SAAS,CAAC,CACtC,KAAK,CAAC,GAAG,OAAO,OAAO,MAAM,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,CACnD,KAAK,MAAM;AAEd,UAAO,KAAK,MAAM,IAAI,KAAK;;AAG7B,IAAE,KAAK,SAAS,OAAO,KAAK,KAAK,CAAC,GAAG;AAErC,SAAO,EAAE,KAAK,OAAO;;CAExB"}
|
|
@@ -22,10 +22,11 @@ function escapeString(str, delimit) {
|
|
|
22
22
|
if (!delimit) return JSON.stringify(str);
|
|
23
23
|
return `${delimit}${str.replaceAll(delimit, `\\${delimit}`)}${delimit}`;
|
|
24
24
|
}
|
|
25
|
-
function
|
|
26
|
-
|
|
25
|
+
function indent(code, tab = 1) {
|
|
26
|
+
const p = " ".repeat(tab);
|
|
27
|
+
return code.split("\n").map((v) => v.length === 0 ? v : p + v).join("\n");
|
|
27
28
|
}
|
|
28
29
|
//#endregion
|
|
29
|
-
export { escapeString,
|
|
30
|
+
export { escapeString, indent, inputToString };
|
|
30
31
|
|
|
31
32
|
//# sourceMappingURL=string-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string-utils.js","names":[],"sources":["../../src/requests/string-utils.ts"],"sourcesContent":["// @ts-expect-error -- nothing\nimport js2xml from 'xml-js/lib/js2xml';\n\n/**\n * Convert input value to hardcoded string (with quotes)\n */\nexport function inputToString(\n value: unknown,\n format:\n | 'application/x-www-form-urlencoded'\n | 'application/x-ndjson'\n | 'application/json'\n | 'application/xml' = 'application/json',\n): string {\n if (typeof value === 'string') return value;\n\n if (format === 'application/json') {\n return JSON.stringify(value, null, 2);\n }\n\n if (format === 'application/x-ndjson') {\n return Array.isArray(value)\n ? value.map((v) => JSON.stringify(v)).join('\\n')\n : JSON.stringify(value, null, 2);\n }\n\n if (format === 'application/x-www-form-urlencoded') {\n const params = new URLSearchParams();\n if (typeof value !== 'object')\n throw new Error(\n `For url encoded data, \\`value\\` must be an object, but received: ${typeof value}`,\n );\n\n for (const key in value) {\n if (value[key as keyof object]) params.set(key, String(value[key as keyof object]));\n }\n\n return params.toString();\n }\n\n return js2xml(value, { compact: true, spaces: 2 });\n}\n\nexport function escapeString(str: string, delimit?: string): string {\n if (!delimit) return JSON.stringify(str);\n\n return `${delimit}${str.replaceAll(delimit, `\\\\${delimit}`)}${delimit}`;\n}\n\nexport function
|
|
1
|
+
{"version":3,"file":"string-utils.js","names":[],"sources":["../../src/requests/string-utils.ts"],"sourcesContent":["// @ts-expect-error -- nothing\nimport js2xml from 'xml-js/lib/js2xml';\n\n/**\n * Convert input value to hardcoded string (with quotes)\n */\nexport function inputToString(\n value: unknown,\n format:\n | 'application/x-www-form-urlencoded'\n | 'application/x-ndjson'\n | 'application/json'\n | 'application/xml' = 'application/json',\n): string {\n if (typeof value === 'string') return value;\n\n if (format === 'application/json') {\n return JSON.stringify(value, null, 2);\n }\n\n if (format === 'application/x-ndjson') {\n return Array.isArray(value)\n ? value.map((v) => JSON.stringify(v)).join('\\n')\n : JSON.stringify(value, null, 2);\n }\n\n if (format === 'application/x-www-form-urlencoded') {\n const params = new URLSearchParams();\n if (typeof value !== 'object')\n throw new Error(\n `For url encoded data, \\`value\\` must be an object, but received: ${typeof value}`,\n );\n\n for (const key in value) {\n if (value[key as keyof object]) params.set(key, String(value[key as keyof object]));\n }\n\n return params.toString();\n }\n\n return js2xml(value, { compact: true, spaces: 2 });\n}\n\nexport function escapeString(str: string, delimit?: string): string {\n if (!delimit) return JSON.stringify(str);\n\n return `${delimit}${str.replaceAll(delimit, `\\\\${delimit}`)}${delimit}`;\n}\n\nexport function indent(code: string, tab: number = 1) {\n const p = ' '.repeat(tab);\n return code\n .split('\\n')\n .map((v) => (v.length === 0 ? v : p + v))\n .join('\\n');\n}\n"],"mappings":";;;;;AAMA,SAAgB,cACd,OACA,SAIwB,oBAChB;AACR,KAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,KAAI,WAAW,mBACb,QAAO,KAAK,UAAU,OAAO,MAAM,EAAE;AAGvC,KAAI,WAAW,uBACb,QAAO,MAAM,QAAQ,MAAM,GACvB,MAAM,KAAK,MAAM,KAAK,UAAU,EAAE,CAAC,CAAC,KAAK,KAAK,GAC9C,KAAK,UAAU,OAAO,MAAM,EAAE;AAGpC,KAAI,WAAW,qCAAqC;EAClD,MAAM,SAAS,IAAI,iBAAiB;AACpC,MAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MACR,oEAAoE,OAAO,QAC5E;AAEH,OAAK,MAAM,OAAO,MAChB,KAAI,MAAM,KAAsB,QAAO,IAAI,KAAK,OAAO,MAAM,KAAqB,CAAC;AAGrF,SAAO,OAAO,UAAU;;AAG1B,QAAO,OAAO,OAAO;EAAE,SAAS;EAAM,QAAQ;EAAG,CAAC;;AAGpD,SAAgB,aAAa,KAAa,SAA0B;AAClE,KAAI,CAAC,QAAS,QAAO,KAAK,UAAU,IAAI;AAExC,QAAO,GAAG,UAAU,IAAI,WAAW,SAAS,KAAK,UAAU,GAAG;;AAGhE,SAAgB,OAAO,MAAc,MAAc,GAAG;CACpD,MAAM,IAAI,KAAK,OAAO,IAAI;AAC1B,QAAO,KACJ,MAAM,KAAK,CACX,KAAK,MAAO,EAAE,WAAW,IAAI,IAAI,IAAI,EAAG,CACxC,KAAK,KAAK"}
|
package/dist/server/create.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createProxy } from "./proxy.js";
|
|
2
1
|
import { InlineCodeUsageGenerator } from "../requests/generators/index.js";
|
|
2
|
+
import { createProxy } from "./proxy.js";
|
|
3
3
|
import { Document } from "../types.js";
|
|
4
4
|
import { ProcessedDocument } from "../utils/process-document.js";
|
|
5
5
|
|
package/dist/server/proxy.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
//#region src/server/proxy.d.ts
|
|
2
|
-
declare const
|
|
3
|
-
type
|
|
2
|
+
declare const methods: readonly ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"];
|
|
3
|
+
type Handler = (req: Request) => Promise<Response>;
|
|
4
|
+
interface Proxy extends Record<(typeof methods)[number], Handler> {
|
|
5
|
+
handle: Handler;
|
|
6
|
+
}
|
|
4
7
|
interface CreateProxyOptions {
|
|
5
8
|
/**
|
|
6
9
|
* Filter by prefixes of request url
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","names":[],"sources":["../../src/server/proxy.ts"],"mappings":";cAAM,
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","names":[],"sources":["../../src/server/proxy.ts"],"mappings":";cAAM,OAAA;AAAA,KAGD,OAAA,IAAW,GAAA,EAAK,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA,UAExB,KAAA,SAAc,MAAA,SAAe,OAAA,WAAkB,OAAA;EAC9D,MAAA,EAAQ,OAAA;AAAA;AAAA,UAGO,kBAAA;EANZ;;;;;EAYH,WAAA;EAZsC;;;EAiBtC,cAAA;EAjB+B;;;;AAEjC;EAsBE,aAAA,IAAiB,OAAA,EAAS,OAAA;;;;EAK1B,SAAA;IACE,OAAA,IAAW,OAAA,EAAS,OAAA,KAAY,OAAA;IAChC,QAAA,IAAY,QAAA,EAAU,QAAA,KAAa,QAAA;EAAA;AAAA;AAAA,iBAIvB,WAAA,CAAY,OAAA,GAAS,kBAAA,GAA0B,KAAA"}
|
package/dist/server/proxy.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/server/proxy.ts
|
|
2
|
-
const
|
|
2
|
+
const methods = [
|
|
3
3
|
"GET",
|
|
4
4
|
"POST",
|
|
5
5
|
"PUT",
|
|
@@ -7,50 +7,60 @@ const keys = [
|
|
|
7
7
|
"PATCH",
|
|
8
8
|
"HEAD"
|
|
9
9
|
];
|
|
10
|
+
const methodsWithBody = new Set([
|
|
11
|
+
"POST",
|
|
12
|
+
"PUT",
|
|
13
|
+
"PATCH",
|
|
14
|
+
"DELETE"
|
|
15
|
+
]);
|
|
10
16
|
function createProxy(options = {}) {
|
|
11
17
|
const { allowedOrigins, allowedUrls, filterRequest = (req) => {
|
|
12
18
|
return !allowedUrls || allowedUrls.some((item) => req.url.startsWith(item));
|
|
13
19
|
}, overrides } = options;
|
|
14
|
-
const handlers = {};
|
|
20
|
+
const handlers = { handle: handler };
|
|
15
21
|
async function handler(req) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
+
const searchParams = new URL(req.url).searchParams;
|
|
23
|
+
const rawUrl = searchParams.get("url");
|
|
24
|
+
if (!rawUrl) return Response.json("[Proxy] A `url` query parameter is required for proxy url", { status: 400 });
|
|
25
|
+
const targetUrl = URL.parse(rawUrl);
|
|
26
|
+
if (!targetUrl) return Response.json("[Proxy] Invalid `url` parameter value.", { status: 400 });
|
|
27
|
+
if (allowedOrigins && !allowedOrigins.includes(targetUrl.origin)) return Response.json(`[Proxy] The origin "${targetUrl.origin}" is not allowed.`, { status: 400 });
|
|
28
|
+
const proxied = await rewriteRequest(req, targetUrl, searchParams.get("cookie"));
|
|
29
|
+
if (!filterRequest(proxied)) return Response.json("[Proxy] The proxied request is not allowed", { status: 403 });
|
|
30
|
+
try {
|
|
31
|
+
return rewriteResponse(await fetch(proxied));
|
|
32
|
+
} catch (err) {
|
|
33
|
+
return Response.json(`[Proxy] Failed to proxy request: ${err instanceof Error ? err.message : "unknown reason"}`, { status: 500 });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function rewriteRequest(request, url, cookie) {
|
|
37
|
+
const headers = new Headers(request.headers);
|
|
38
|
+
headers.delete("origin");
|
|
39
|
+
if (cookie) headers.set("Cookie", cookie);
|
|
40
|
+
const contentLength = headers.get("content-length");
|
|
22
41
|
const hasBody = contentLength && parseInt(contentLength) > 0;
|
|
23
|
-
|
|
24
|
-
method:
|
|
42
|
+
const proxied = new Request(url, {
|
|
43
|
+
method: request.method,
|
|
25
44
|
cache: "no-cache",
|
|
26
|
-
headers
|
|
27
|
-
body: hasBody &&
|
|
28
|
-
"POST",
|
|
29
|
-
"PUT",
|
|
30
|
-
"PATCH",
|
|
31
|
-
"DELETE"
|
|
32
|
-
].includes(req.method.toUpperCase()) ? await req.arrayBuffer() : void 0
|
|
33
|
-
});
|
|
34
|
-
if (overrides?.request) proxied = overrides.request(proxied);
|
|
35
|
-
if (!filterRequest(proxied)) return Response.json("[Proxy] The proxied request is not allowed", { status: 403 });
|
|
36
|
-
proxied.headers.forEach((_value, originalKey) => {
|
|
37
|
-
if (originalKey.toLowerCase() === "origin") proxied.headers.delete(originalKey);
|
|
45
|
+
headers,
|
|
46
|
+
body: hasBody && methodsWithBody.has(request.method.toUpperCase()) ? await request.arrayBuffer() : void 0
|
|
38
47
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
48
|
+
return overrides?.request ? overrides.request(proxied) : proxied;
|
|
49
|
+
}
|
|
50
|
+
async function rewriteResponse(response) {
|
|
51
|
+
if (overrides?.response) response = overrides.response(response);
|
|
52
|
+
const headers = new Headers(response.headers);
|
|
43
53
|
headers.forEach((_value, originalKey) => {
|
|
44
54
|
if (originalKey.toLowerCase().startsWith("access-control-")) headers.delete(originalKey);
|
|
45
55
|
});
|
|
46
|
-
headers.set("X-Forwarded-Host",
|
|
47
|
-
return new Response(
|
|
48
|
-
status:
|
|
49
|
-
statusText:
|
|
56
|
+
headers.set("X-Forwarded-Host", response.url);
|
|
57
|
+
return new Response(response.body, {
|
|
58
|
+
status: response.status,
|
|
59
|
+
statusText: response.statusText,
|
|
50
60
|
headers
|
|
51
61
|
});
|
|
52
62
|
}
|
|
53
|
-
for (const key of
|
|
63
|
+
for (const key of methods) handlers[key] = handler;
|
|
54
64
|
return handlers;
|
|
55
65
|
}
|
|
56
66
|
//#endregion
|
package/dist/server/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","names":[],"sources":["../../src/server/proxy.ts"],"sourcesContent":["const
|
|
1
|
+
{"version":3,"file":"proxy.js","names":[],"sources":["../../src/server/proxy.ts"],"sourcesContent":["const methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD'] as const;\nconst methodsWithBody = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\n\ntype Handler = (req: Request) => Promise<Response>;\n\nexport interface Proxy extends Record<(typeof methods)[number], Handler> {\n handle: Handler;\n}\n\nexport interface CreateProxyOptions {\n /**\n * Filter by prefixes of request url\n *\n * @deprecated Use `allowedOrigins` for filtering origins, or `filterRequest` for more detailed rules.\n */\n allowedUrls?: string[];\n\n /**\n * List of allowed origins to proxy to.\n */\n allowedOrigins?: string[];\n\n /**\n * Determine if the proxied request is allowed.\n *\n * @returns true if allowed, otherwise forbidden.\n */\n filterRequest?: (request: Request) => boolean;\n\n /**\n * Override proxied request/response with yours\n */\n overrides?: {\n request?: (request: Request) => Request;\n response?: (response: Response) => Response;\n };\n}\n\nexport function createProxy(options: CreateProxyOptions = {}): Proxy {\n const {\n allowedOrigins,\n allowedUrls,\n filterRequest = (req) => {\n return !allowedUrls || allowedUrls.some((item) => req.url.startsWith(item));\n },\n overrides,\n } = options;\n const handlers: Partial<Proxy> = {\n handle: handler,\n };\n\n async function handler(req: Request): Promise<Response> {\n const searchParams = new URL(req.url).searchParams;\n const rawUrl = searchParams.get('url');\n\n if (!rawUrl)\n return Response.json('[Proxy] A `url` query parameter is required for proxy url', {\n status: 400,\n });\n\n const targetUrl = URL.parse(rawUrl);\n if (!targetUrl)\n return Response.json('[Proxy] Invalid `url` parameter value.', {\n status: 400,\n });\n\n if (allowedOrigins && !allowedOrigins.includes(targetUrl.origin)) {\n return Response.json(`[Proxy] The origin \"${targetUrl.origin}\" is not allowed.`, {\n status: 400,\n });\n }\n\n const proxied = await rewriteRequest(req, targetUrl, searchParams.get('cookie'));\n\n if (!filterRequest(proxied)) {\n return Response.json('[Proxy] The proxied request is not allowed', {\n status: 403,\n });\n }\n\n try {\n return rewriteResponse(await fetch(proxied));\n } catch (err) {\n return Response.json(\n `[Proxy] Failed to proxy request: ${err instanceof Error ? err.message : 'unknown reason'}`,\n {\n status: 500,\n },\n );\n }\n }\n\n async function rewriteRequest(\n request: Request,\n url: URL,\n cookie: string | null,\n ): Promise<Request> {\n const headers = new Headers(request.headers);\n headers.delete('origin');\n if (cookie) {\n headers.set('Cookie', cookie);\n }\n\n const contentLength = headers.get('content-length');\n const hasBody = contentLength && parseInt(contentLength) > 0;\n\n const proxied = new Request(url, {\n method: request.method,\n cache: 'no-cache',\n headers,\n body:\n hasBody && methodsWithBody.has(request.method.toUpperCase())\n ? await request.arrayBuffer()\n : undefined,\n });\n\n return overrides?.request ? overrides.request(proxied) : proxied;\n }\n\n async function rewriteResponse(response: Response): Promise<Response> {\n if (overrides?.response) {\n response = overrides.response(response);\n }\n\n const headers = new Headers(response.headers);\n headers.forEach((_value, originalKey) => {\n const key = originalKey.toLowerCase();\n\n if (key.startsWith('access-control-')) {\n headers.delete(originalKey);\n }\n });\n headers.set('X-Forwarded-Host', response.url);\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n }\n\n for (const key of methods) {\n handlers[key] = handler;\n }\n\n return handlers as Proxy;\n}\n"],"mappings":";AAAA,MAAM,UAAU;CAAC;CAAO;CAAQ;CAAO;CAAU;CAAS;CAAO;AACjE,MAAM,kBAAkB,IAAI,IAAI;CAAC;CAAQ;CAAO;CAAS;CAAS,CAAC;AAqCnE,SAAgB,YAAY,UAA8B,EAAE,EAAS;CACnE,MAAM,EACJ,gBACA,aACA,iBAAiB,QAAQ;AACvB,SAAO,CAAC,eAAe,YAAY,MAAM,SAAS,IAAI,IAAI,WAAW,KAAK,CAAC;IAE7E,cACE;CACJ,MAAM,WAA2B,EAC/B,QAAQ,SACT;CAED,eAAe,QAAQ,KAAiC;EACtD,MAAM,eAAe,IAAI,IAAI,IAAI,IAAI,CAAC;EACtC,MAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,OACH,QAAO,SAAS,KAAK,6DAA6D,EAChF,QAAQ,KACT,CAAC;EAEJ,MAAM,YAAY,IAAI,MAAM,OAAO;AACnC,MAAI,CAAC,UACH,QAAO,SAAS,KAAK,0CAA0C,EAC7D,QAAQ,KACT,CAAC;AAEJ,MAAI,kBAAkB,CAAC,eAAe,SAAS,UAAU,OAAO,CAC9D,QAAO,SAAS,KAAK,uBAAuB,UAAU,OAAO,oBAAoB,EAC/E,QAAQ,KACT,CAAC;EAGJ,MAAM,UAAU,MAAM,eAAe,KAAK,WAAW,aAAa,IAAI,SAAS,CAAC;AAEhF,MAAI,CAAC,cAAc,QAAQ,CACzB,QAAO,SAAS,KAAK,8CAA8C,EACjE,QAAQ,KACT,CAAC;AAGJ,MAAI;AACF,UAAO,gBAAgB,MAAM,MAAM,QAAQ,CAAC;WACrC,KAAK;AACZ,UAAO,SAAS,KACd,oCAAoC,eAAe,QAAQ,IAAI,UAAU,oBACzE,EACE,QAAQ,KACT,CACF;;;CAIL,eAAe,eACb,SACA,KACA,QACkB;EAClB,MAAM,UAAU,IAAI,QAAQ,QAAQ,QAAQ;AAC5C,UAAQ,OAAO,SAAS;AACxB,MAAI,OACF,SAAQ,IAAI,UAAU,OAAO;EAG/B,MAAM,gBAAgB,QAAQ,IAAI,iBAAiB;EACnD,MAAM,UAAU,iBAAiB,SAAS,cAAc,GAAG;EAE3D,MAAM,UAAU,IAAI,QAAQ,KAAK;GAC/B,QAAQ,QAAQ;GAChB,OAAO;GACP;GACA,MACE,WAAW,gBAAgB,IAAI,QAAQ,OAAO,aAAa,CAAC,GACxD,MAAM,QAAQ,aAAa,GAC3B,KAAA;GACP,CAAC;AAEF,SAAO,WAAW,UAAU,UAAU,QAAQ,QAAQ,GAAG;;CAG3D,eAAe,gBAAgB,UAAuC;AACpE,MAAI,WAAW,SACb,YAAW,UAAU,SAAS,SAAS;EAGzC,MAAM,UAAU,IAAI,QAAQ,SAAS,QAAQ;AAC7C,UAAQ,SAAS,QAAQ,gBAAgB;AAGvC,OAFY,YAAY,aAAa,CAE7B,WAAW,kBAAkB,CACnC,SAAQ,OAAO,YAAY;IAE7B;AACF,UAAQ,IAAI,oBAAoB,SAAS,IAAI;AAE7C,SAAO,IAAI,SAAS,SAAS,MAAM;GACjC,QAAQ,SAAS;GACjB,YAAY,SAAS;GACrB;GACD,CAAC;;AAGJ,MAAK,MAAM,OAAO,QAChB,UAAS,OAAO;AAGlB,QAAO"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { OpenAPIV3, OpenAPIV3_2 } from "./_openapi/types.js";
|
|
2
|
-
import { NoReference } from "./utils/schema/index.js";
|
|
3
1
|
import { MediaAdapter } from "./requests/media/adapter.js";
|
|
2
|
+
import { NoReference } from "./utils/schema/index.js";
|
|
4
3
|
import { InlineCodeUsageGenerator } from "./requests/generators/index.js";
|
|
4
|
+
import { boundary_d_exports } from "./ui/client/boundary.js";
|
|
5
|
+
import { OpenAPIV3, OpenAPIV3_2 } from "./_openapi/types.js";
|
|
5
6
|
import { OpenAPIOptions } from "./server/create.js";
|
|
6
7
|
import { CreateAPIPageOptions } from "./ui/base.js";
|
|
7
8
|
import { ProcessedDocument } from "./utils/process-document.js";
|
|
@@ -36,6 +37,7 @@ interface RenderContext extends Pick<OpenAPIOptions, 'proxyUrl'>, Omit<RequireKe
|
|
|
36
37
|
* dereferenced schema
|
|
37
38
|
*/
|
|
38
39
|
schema: ProcessedDocument;
|
|
40
|
+
clientBoundary: typeof boundary_d_exports;
|
|
39
41
|
mediaAdapters: Record<string, MediaAdapter>;
|
|
40
42
|
renderHeading: (depth: number, text: string | ReactNode, props?: HTMLAttributes<HTMLHeadingElement> & {
|
|
41
43
|
id?: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;;;KASY,QAAA,GAAW,WAAA,CAAY,QAAA;AAAA,KACvB,eAAA,GAAkB,WAAA,CAAY,eAAA;AAAA,KAC9B,eAAA,GAAkB,WAAA,CAAY,eAAA;AAAA,KAC9B,oBAAA,GAAuB,WAAA,CAAY,oBAAA;AAAA,KACnC,eAAA,GAAkB,WAAA,CAAY,eAAA;AAAA,KAC9B,cAAA,GAAiB,WAAA,CAAY,cAAA;AAAA,KAC7B,SAAA,GAAY,WAAA,CAAY,SAAA;AAAA,KACxB,YAAA,GAAe,WAAA,CAAY,YAAA;AAAA,KAC3B,cAAA,GAAiB,WAAA,CAAY,cAAA;AAAA,KAC7B,oBAAA,GAAuB,SAAA,CAAU,oBAAA;AAAA,KACjC,cAAA,GAAiB,WAAA,CAAY,cAAA;AAAA,KAC7B,oBAAA,GAAuB,WAAA,CAAY,oBAAA;AAAA,KACnC,WAAA,GAAc,WAAA,CAAY,WAAA;AAAA,KAC1B,aAAA,GAAgB,WAAA,CAAY,aAAA;AAAA,KAC5B,eAAA,GAAkB,WAAA,CAAY,eAAA;AAAA,KAC9B,iBAAA,GAAoB,WAAA,CAAY,iBAAA;AAAA,KAEhC,iBAAA,GAAoB,WAAA,CAAY,eAAA;EAC1C,MAAA;EACA,eAAA,GAAkB,wBAAA;EAClB,sBAAA;EACA,uBAAA;AAAA;AAAA,KAGG,WAAA,oBAA+B,CAAA,IAAK,IAAA,CAAK,CAAA,EAAG,CAAA,IAAK,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,CAAA;AAAA,UAEtD,aAAA,SAEb,IAAA,CAAK,cAAA,eACL,IAAA,CACE,WAAA,CAAY,oBAAA;EA1BN;;;EAgCV,MAAA,EAAQ,iBAAA;EACR,cAAA,SADyB,kBAAA;EAGzB,aAAA,EAAe,MAAA,SAAe,YAAA;EAE9B,aAAA,GACE,KAAA,UACA,IAAA,WAAe,SAAA,EACf,KAAA,GAAQ,cAAA,CAAe,kBAAA;IAAwB,EAAA;EAAA,MAC5C,SAAA;EACL,eAAA,GAAkB,IAAA,UAAc,IAAA,aAAiB,SAAA;AAAA;AAAA,KAGvC,gBAAA,cAA8B,WAAA,IAAe,CAAA,mBAAoB,IAAA,CAAK,CAAA,EAAG,CAAA;AAAA,KACzE,SAAA,MAAe,CAAA,GAAI,OAAA,CAAQ,CAAA"}
|
package/dist/ui/api-page.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-page.d.ts","names":[],"sources":["../../src/ui/api-page.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-page.d.ts","names":[],"sources":["../../src/ui/api-page.tsx"],"mappings":";;UAIiB,YAAA;EACf,QAAA;EACA,SAAA;EACA,eAAA;EAH2B;;;EAQ3B,UAAA,GAAa,aAAA;EAEb,QAAA,GAAW,WAAA;AAAA;AAAA,UAGI,WAAA;EALF;;;EASb,IAAA;EACA,MAAA,EAAQ,WAAA;AAAA;AAAA,UAGO,aAAA;;;;EAIf,IAAA;EAPQ;;;EAWR,MAAA,EAAQ,WAAA;AAAA"}
|
package/dist/ui/api-page.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { createMethod } from "../utils/schema/index.js";
|
|
2
|
-
import { ApiProviderLazy, ServerProviderLazy } from "./contexts/api.lazy.js";
|
|
3
2
|
import { Operation } from "./operation/index.js";
|
|
4
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
4
|
//#region src/ui/api-page.tsx
|
|
@@ -45,10 +44,10 @@ function APIPage({ showTitle: hasHead = false, showDescription, operations, webh
|
|
|
45
44
|
};
|
|
46
45
|
})
|
|
47
46
|
}, ctx);
|
|
48
|
-
return /* @__PURE__ */ jsx(
|
|
47
|
+
return /* @__PURE__ */ jsx(ctx.clientBoundary.ApiProvider, {
|
|
49
48
|
shikiOptions: ctx.shikiOptions,
|
|
50
49
|
client: ctx.client ?? {},
|
|
51
|
-
children: /* @__PURE__ */ jsx(
|
|
50
|
+
children: /* @__PURE__ */ jsx(ctx.clientBoundary.ServerProvider, {
|
|
52
51
|
servers: dereferenced.servers,
|
|
53
52
|
children: content
|
|
54
53
|
})
|
package/dist/ui/api-page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-page.js","names":[],"sources":["../../src/ui/api-page.tsx"],"sourcesContent":["import { Operation } from '@/ui/operation';\nimport type { HttpMethods, RenderContext, ServerObject } from '@/types';\nimport { createMethod } from '@/utils/schema';\
|
|
1
|
+
{"version":3,"file":"api-page.js","names":[],"sources":["../../src/ui/api-page.tsx"],"sourcesContent":["import { Operation } from '@/ui/operation';\nimport type { HttpMethods, RenderContext, ServerObject } from '@/types';\nimport { createMethod } from '@/utils/schema';\n\nexport interface ApiPageProps {\n document: string;\n showTitle?: boolean;\n showDescription?: boolean;\n\n /**\n * An array of operations\n */\n operations?: OperationItem[];\n\n webhooks?: WebhookItem[];\n}\n\nexport interface WebhookItem {\n /**\n * webhook name in `webhooks`\n */\n name: string;\n method: HttpMethods;\n}\n\nexport interface OperationItem {\n /**\n * the path of operation in `paths`\n */\n path: string;\n /**\n * the HTTP method of operation\n */\n method: HttpMethods;\n}\n\nexport function APIPage({\n showTitle: hasHead = false,\n showDescription,\n operations,\n webhooks,\n ctx,\n}: Omit<ApiPageProps, 'document'> & {\n ctx: RenderContext;\n}) {\n const { dereferenced } = ctx.schema;\n let { renderPageLayout } = ctx.content ?? {};\n renderPageLayout ??= (slots) => (\n <div className=\"flex flex-col gap-24 text-sm @container\">\n {slots.operations?.map((op) => op.children)}\n {slots.webhooks?.map((op) => op.children)}\n </div>\n );\n\n const content = renderPageLayout(\n {\n operations: operations?.map((item) => {\n const pathItem = dereferenced.paths?.[item.path];\n if (!pathItem)\n throw new Error(`[Fumadocs OpenAPI] Path not found in OpenAPI schema: ${item.path}`);\n\n const operation = pathItem[item.method];\n if (!operation)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in operation: ${item.path}`,\n );\n\n const method = createMethod(item.method, pathItem, operation);\n\n return {\n item,\n children: (\n <Operation\n key={`${item.path}:${item.method}`}\n method={method}\n path={item.path}\n ctx={ctx}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n webhooks: webhooks?.map((item) => {\n const webhook = dereferenced.webhooks?.[item.name];\n if (!webhook)\n throw new Error(`[Fumadocs OpenAPI] Webhook not found in OpenAPI schema: ${item.name}`);\n\n const hook = webhook[item.method];\n if (!hook)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in webhook: ${item.name}`,\n );\n\n return {\n item,\n children: (\n <Operation\n type=\"webhook\"\n key={`${item.name}:${item.method}`}\n method={createMethod(item.method, webhook, hook)}\n ctx={ctx}\n path={`/${item.name}`}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n },\n ctx,\n );\n\n return (\n <ctx.clientBoundary.ApiProvider shikiOptions={ctx.shikiOptions} client={ctx.client ?? {}}>\n <ctx.clientBoundary.ServerProvider servers={dereferenced.servers as ServerObject[]}>\n {content}\n </ctx.clientBoundary.ServerProvider>\n </ctx.clientBoundary.ApiProvider>\n );\n}\n"],"mappings":";;;;AAoCA,SAAgB,QAAQ,EACtB,WAAW,UAAU,OACrB,iBACA,YACA,UACA,OAGC;CACD,MAAM,EAAE,iBAAiB,IAAI;CAC7B,IAAI,EAAE,qBAAqB,IAAI,WAAW,EAAE;AAC5C,uBAAsB,UACpB,qBAAC,OAAD;EAAK,WAAU;YAAf,CACG,MAAM,YAAY,KAAK,OAAO,GAAG,SAAS,EAC1C,MAAM,UAAU,KAAK,OAAO,GAAG,SAAS,CACrC;;CAGR,MAAM,UAAU,iBACd;EACE,YAAY,YAAY,KAAK,SAAS;GACpC,MAAM,WAAW,aAAa,QAAQ,KAAK;AAC3C,OAAI,CAAC,SACH,OAAM,IAAI,MAAM,wDAAwD,KAAK,OAAO;GAEtF,MAAM,YAAY,SAAS,KAAK;AAChC,OAAI,CAAC,UACH,OAAM,IAAI,MACR,6BAA6B,KAAK,OAAO,2BAA2B,KAAK,OAC1E;AAIH,UAAO;IACL;IACA,UACE,oBAAC,WAAD;KAEE,QAPS,aAAa,KAAK,QAAQ,UAAU,UAAU;KAQvD,MAAM,KAAK;KACN;KACL,WAAW;KACM;KACjB,EANK,GAAG,KAAK,KAAK,GAAG,KAAK,SAM1B;IAEL;IACD;EACF,UAAU,UAAU,KAAK,SAAS;GAChC,MAAM,UAAU,aAAa,WAAW,KAAK;AAC7C,OAAI,CAAC,QACH,OAAM,IAAI,MAAM,2DAA2D,KAAK,OAAO;GAEzF,MAAM,OAAO,QAAQ,KAAK;AAC1B,OAAI,CAAC,KACH,OAAM,IAAI,MACR,6BAA6B,KAAK,OAAO,yBAAyB,KAAK,OACxE;AAEH,UAAO;IACL;IACA,UACE,oBAAC,WAAD;KACE,MAAK;KAEL,QAAQ,aAAa,KAAK,QAAQ,SAAS,KAAK;KAC3C;KACL,MAAM,IAAI,KAAK;KACf,WAAW;KACM;KACjB,EANK,GAAG,KAAK,KAAK,GAAG,KAAK,SAM1B;IAEL;IACD;EACH,EACD,IACD;AAED,QACE,oBAAC,IAAI,eAAe,aAApB;EAAgC,cAAc,IAAI;EAAc,QAAQ,IAAI,UAAU,EAAE;YACtF,oBAAC,IAAI,eAAe,gBAApB;GAAmC,SAAS,aAAa;aACtD;GACiC,CAAA;EACL,CAAA"}
|
package/dist/ui/base.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { NoReference } from "../utils/schema/index.js";
|
|
2
1
|
import { MediaAdapter } from "../requests/media/adapter.js";
|
|
2
|
+
import { NoReference } from "../utils/schema/index.js";
|
|
3
3
|
import { CodeUsageGeneratorRegistry, InlineCodeUsageGenerator } from "../requests/generators/index.js";
|
|
4
|
-
import { OpenAPIServer } from "../server/create.js";
|
|
5
|
-
import { ApiPageProps, OperationItem, WebhookItem } from "./api-page.js";
|
|
6
4
|
import { ExampleRequestItem } from "./operation/get-example-requests.js";
|
|
7
5
|
import { APIPageClientOptions } from "./client/index.js";
|
|
8
6
|
import { SchemaUIOptions } from "./schema/index.js";
|
|
7
|
+
import { OpenAPIServer } from "../server/create.js";
|
|
8
|
+
import { ApiPageProps, OperationItem, WebhookItem } from "./api-page.js";
|
|
9
9
|
import { ResponseTab } from "./operation/response-tabs.js";
|
|
10
10
|
import { ClientCodeBlockProvider } from "./components/codeblock.js";
|
|
11
11
|
import { Awaitable, MethodInformation, RenderContext } from "../types.js";
|