fumadocs-openapi 10.3.14 → 10.3.16
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 +4 -4
- package/dist/_openapi/types.d.ts +2 -1
- package/dist/_openapi/types.d.ts.map +1 -0
- package/dist/generate-file.d.ts +2 -2
- package/dist/generate-file.d.ts.map +1 -0
- package/dist/generate-file.js +2 -1
- package/dist/generate-file.js.map +1 -0
- package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/dereference.js +2 -1
- package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/dereference.js.map +1 -0
- package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/index.js +2 -1
- package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/index.js.map +1 -0
- package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/klona.js +2 -1
- package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/klona.js.map +1 -0
- package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/resolveRef.js +2 -1
- package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/resolveRef.js.map +1 -0
- package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/types.js +2 -1
- package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/types.js.map +1 -0
- package/dist/playground/client.d.ts +2 -1
- package/dist/playground/client.d.ts.map +1 -0
- package/dist/playground/client.js +4 -3
- package/dist/playground/client.js.map +1 -0
- package/dist/playground/components/inputs.js +25 -27
- package/dist/playground/components/inputs.js.map +1 -0
- package/dist/playground/components/oauth-dialog.js +2 -1
- package/dist/playground/components/oauth-dialog.js.map +1 -0
- package/dist/playground/components/server-select.js +2 -1
- package/dist/playground/components/server-select.js.map +1 -0
- package/dist/playground/fetcher.d.ts +2 -3
- package/dist/playground/fetcher.d.ts.map +1 -0
- package/dist/playground/fetcher.js +2 -1
- package/dist/playground/fetcher.js.map +1 -0
- package/dist/playground/index.d.ts +2 -1
- package/dist/playground/index.d.ts.map +1 -0
- package/dist/playground/index.js +2 -1
- package/dist/playground/index.js.map +1 -0
- package/dist/playground/lazy.js +2 -1
- package/dist/playground/lazy.js.map +1 -0
- package/dist/playground/schema.d.ts +2 -4
- package/dist/playground/schema.d.ts.map +1 -0
- package/dist/playground/schema.js +18 -11
- package/dist/playground/schema.js.map +1 -0
- package/dist/playground/status-info.js +2 -1
- package/dist/playground/status-info.js.map +1 -0
- package/dist/requests/generators/all.d.ts +2 -1
- package/dist/requests/generators/all.d.ts.map +1 -0
- package/dist/requests/generators/all.js +2 -1
- package/dist/requests/generators/all.js.map +1 -0
- package/dist/requests/generators/csharp.d.ts +2 -1
- package/dist/requests/generators/csharp.d.ts.map +1 -0
- package/dist/requests/generators/csharp.js +2 -1
- package/dist/requests/generators/csharp.js.map +1 -0
- package/dist/requests/generators/curl.d.ts +2 -1
- package/dist/requests/generators/curl.d.ts.map +1 -0
- package/dist/requests/generators/curl.js +2 -1
- package/dist/requests/generators/curl.js.map +1 -0
- package/dist/requests/generators/go.d.ts +2 -1
- package/dist/requests/generators/go.d.ts.map +1 -0
- package/dist/requests/generators/go.js +2 -1
- package/dist/requests/generators/go.js.map +1 -0
- package/dist/requests/generators/index.d.ts +2 -1
- package/dist/requests/generators/index.d.ts.map +1 -0
- package/dist/requests/generators/index.js +2 -1
- package/dist/requests/generators/index.js.map +1 -0
- package/dist/requests/generators/java.d.ts +2 -1
- package/dist/requests/generators/java.d.ts.map +1 -0
- package/dist/requests/generators/java.js +2 -1
- package/dist/requests/generators/java.js.map +1 -0
- package/dist/requests/generators/javascript.d.ts +2 -1
- package/dist/requests/generators/javascript.d.ts.map +1 -0
- package/dist/requests/generators/javascript.js +2 -1
- package/dist/requests/generators/javascript.js.map +1 -0
- package/dist/requests/generators/python.d.ts +2 -1
- package/dist/requests/generators/python.d.ts.map +1 -0
- package/dist/requests/generators/python.js +2 -1
- package/dist/requests/generators/python.js.map +1 -0
- package/dist/requests/media/adapter.d.ts +2 -1
- package/dist/requests/media/adapter.d.ts.map +1 -0
- package/dist/requests/media/adapter.js +2 -1
- package/dist/requests/media/adapter.js.map +1 -0
- package/dist/requests/media/encode.d.ts +2 -5
- package/dist/requests/media/encode.d.ts.map +1 -0
- package/dist/requests/media/encode.js +4 -2
- package/dist/requests/media/encode.js.map +1 -0
- package/dist/requests/media/resolve-adapter.js +2 -1
- package/dist/requests/media/resolve-adapter.js.map +1 -0
- package/dist/requests/string-utils.js +2 -1
- package/dist/requests/string-utils.js.map +1 -0
- package/dist/requests/to-python-object.js +2 -1
- package/dist/requests/to-python-object.js.map +1 -0
- package/dist/requests/types.d.ts +2 -1
- package/dist/requests/types.d.ts.map +1 -0
- package/dist/scalar/client.js +2 -1
- package/dist/scalar/client.js.map +1 -0
- package/dist/scalar/index.d.ts +2 -3
- package/dist/scalar/index.d.ts.map +1 -0
- package/dist/scalar/index.js +2 -1
- package/dist/scalar/index.js.map +1 -0
- package/dist/server/create.d.ts +2 -1
- package/dist/server/create.d.ts.map +1 -0
- package/dist/server/create.js +2 -1
- package/dist/server/create.js.map +1 -0
- package/dist/server/proxy.d.ts +2 -1
- package/dist/server/proxy.d.ts.map +1 -0
- package/dist/server/proxy.js +2 -1
- package/dist/server/proxy.js.map +1 -0
- package/dist/server/source-api.d.ts +2 -1
- package/dist/server/source-api.d.ts.map +1 -0
- package/dist/server/source-api.js +2 -1
- package/dist/server/source-api.js.map +1 -0
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -0
- package/dist/ui/api-page.d.ts +2 -3
- package/dist/ui/api-page.d.ts.map +1 -0
- package/dist/ui/api-page.js +2 -1
- package/dist/ui/api-page.js.map +1 -0
- package/dist/ui/base.d.ts +10 -5
- package/dist/ui/base.d.ts.map +1 -0
- package/dist/ui/base.js +13 -3
- package/dist/ui/base.js.map +1 -0
- package/dist/ui/client/index.d.ts +2 -1
- package/dist/ui/client/index.d.ts.map +1 -0
- package/dist/ui/client/index.js +2 -1
- package/dist/ui/client/index.js.map +1 -0
- package/dist/ui/client/storage-key.js +2 -1
- package/dist/ui/client/storage-key.js.map +1 -0
- package/dist/ui/components/accordion.js +2 -1
- package/dist/ui/components/accordion.js.map +1 -0
- package/dist/ui/components/dialog.js +2 -1
- package/dist/ui/components/dialog.js.map +1 -0
- package/dist/ui/components/input.js +2 -1
- package/dist/ui/components/input.js.map +1 -0
- package/dist/ui/components/method-label.js +2 -1
- package/dist/ui/components/method-label.js.map +1 -0
- package/dist/ui/components/select.js +2 -1
- package/dist/ui/components/select.js.map +1 -0
- package/dist/ui/contexts/api.js +2 -1
- package/dist/ui/contexts/api.js.map +1 -0
- package/dist/ui/contexts/api.lazy.js +2 -1
- package/dist/ui/contexts/api.lazy.js.map +1 -0
- package/dist/ui/full.client.js +2 -1
- package/dist/ui/full.client.js.map +1 -0
- package/dist/ui/full.d.ts +2 -2
- package/dist/ui/full.d.ts.map +1 -0
- package/dist/ui/full.js +2 -1
- package/dist/ui/full.js.map +1 -0
- package/dist/ui/operation/client.js +2 -1
- package/dist/ui/operation/client.js.map +1 -0
- package/dist/ui/operation/index.js +2 -1
- package/dist/ui/operation/index.js.map +1 -0
- package/dist/ui/operation/request-tabs.d.ts +2 -5
- package/dist/ui/operation/request-tabs.d.ts.map +1 -0
- package/dist/ui/operation/request-tabs.js +2 -1
- package/dist/ui/operation/request-tabs.js.map +1 -0
- package/dist/ui/operation/response-tabs.d.ts +2 -1
- package/dist/ui/operation/response-tabs.d.ts.map +1 -0
- package/dist/ui/operation/response-tabs.js +2 -1
- package/dist/ui/operation/response-tabs.js.map +1 -0
- package/dist/ui/operation/usage-tabs/client.js +2 -1
- package/dist/ui/operation/usage-tabs/client.js.map +1 -0
- package/dist/ui/operation/usage-tabs/index.js +2 -1
- package/dist/ui/operation/usage-tabs/index.js.map +1 -0
- package/dist/ui/operation/usage-tabs/lazy.js +2 -1
- package/dist/ui/operation/usage-tabs/lazy.js.map +1 -0
- package/dist/ui/schema/client.d.ts +2 -3
- package/dist/ui/schema/client.d.ts.map +1 -0
- package/dist/ui/schema/client.js +2 -1
- package/dist/ui/schema/client.js.map +1 -0
- package/dist/ui/schema/index.d.ts +2 -4
- package/dist/ui/schema/index.d.ts.map +1 -0
- package/dist/ui/schema/index.js +2 -1
- package/dist/ui/schema/index.js.map +1 -0
- package/dist/ui/schema/lazy.js +2 -1
- package/dist/ui/schema/lazy.js.map +1 -0
- package/dist/utils/deep-equal.js +2 -1
- package/dist/utils/deep-equal.js.map +1 -0
- package/dist/utils/id-to-title.js +2 -1
- package/dist/utils/id-to-title.js.map +1 -0
- package/dist/utils/lazy.js +2 -1
- package/dist/utils/lazy.js.map +1 -0
- package/dist/utils/merge-schema.js +20 -5
- package/dist/utils/merge-schema.js.map +1 -0
- package/dist/utils/pages/builder.d.ts +2 -2
- package/dist/utils/pages/builder.d.ts.map +1 -0
- package/dist/utils/pages/builder.js +2 -1
- package/dist/utils/pages/builder.js.map +1 -0
- package/dist/utils/pages/preset-auto.d.ts +2 -1
- package/dist/utils/pages/preset-auto.d.ts.map +1 -0
- package/dist/utils/pages/preset-auto.js +2 -1
- package/dist/utils/pages/preset-auto.js.map +1 -0
- package/dist/utils/pages/to-body.js +2 -1
- package/dist/utils/pages/to-body.js.map +1 -0
- package/dist/utils/pages/to-static-data.js +2 -1
- package/dist/utils/pages/to-static-data.js.map +1 -0
- package/dist/utils/pages/to-text.d.ts +2 -4
- package/dist/utils/pages/to-text.d.ts.map +1 -0
- package/dist/utils/pages/to-text.js +2 -1
- package/dist/utils/pages/to-text.js.map +1 -0
- package/dist/utils/process-document.d.ts +2 -1
- package/dist/utils/process-document.d.ts.map +1 -0
- package/dist/utils/process-document.js +2 -1
- package/dist/utils/process-document.js.map +1 -0
- package/dist/utils/remove-undefined.js +2 -1
- package/dist/utils/remove-undefined.js.map +1 -0
- package/dist/utils/schema-to-string.d.ts +1 -2
- package/dist/utils/schema-to-string.js +2 -1
- package/dist/utils/schema-to-string.js.map +1 -0
- package/dist/utils/schema.d.ts +2 -1
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +2 -1
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/url.js +3 -2
- package/dist/utils/url.js.map +1 -0
- package/dist/utils/use-query.js +2 -1
- package/dist/utils/use-query.js.map +1 -0
- package/package.json +9 -9
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import "../requests/types.js";
|
|
2
|
-
|
|
3
1
|
//#region src/playground/fetcher.d.ts
|
|
4
2
|
interface FetchResult {
|
|
5
3
|
status: number;
|
|
@@ -7,4 +5,5 @@ interface FetchResult {
|
|
|
7
5
|
data: unknown;
|
|
8
6
|
}
|
|
9
7
|
//#endregion
|
|
10
|
-
export { FetchResult };
|
|
8
|
+
export { FetchResult };
|
|
9
|
+
//# sourceMappingURL=fetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","names":[],"sources":["../../src/playground/fetcher.ts"],"mappings":";UAQiB,WAAA;EACf,MAAA;EACA,IAAA;EACA,IAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.js","names":[],"sources":["../../src/playground/fetcher.ts"],"sourcesContent":["import type { RequestData } from '@/requests/types';\nimport type { MediaAdapter } from '@/requests/media/adapter';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport interface FetchOptions extends RequestData {\n proxyUrl?: string;\n}\n\nexport interface FetchResult {\n status: number;\n type: 'json' | 'html' | 'text';\n data: unknown;\n}\n\nexport interface Fetcher {\n /**\n * This method will not apply the path & search parameters from `options` to given `url`.\n *\n * @param url - The full URL of request.\n */\n fetch: (url: string, options: FetchOptions) => Promise<FetchResult>;\n}\n\nexport function createBrowserFetcher(\n adapters: Record<string, MediaAdapter>,\n requestTimeout: number,\n): Fetcher {\n return {\n async fetch(url, options) {\n const headers = new Headers();\n if (options.bodyMediaType && options.bodyMediaType !== 'multipart/form-data')\n headers.append('Content-Type', options.bodyMediaType);\n\n for (const key in options.header) {\n const param = options.header[key];\n headers.append(key, param.value);\n }\n\n const proxyUrl = options.proxyUrl ? new URL(options.proxyUrl, document.baseURI) : null;\n\n if (proxyUrl) {\n proxyUrl.searchParams.append('url', url);\n url = proxyUrl.toString();\n }\n\n let body: BodyInit | undefined = undefined;\n if (options.bodyMediaType && options.body) {\n const adapter = resolveMediaAdapter(options.bodyMediaType, adapters);\n if (!adapter)\n return {\n status: 400,\n type: 'text',\n data: `[Fumadocs] No adapter for ${options.bodyMediaType}, you need to specify one from 'createOpenAPI()'.`,\n };\n\n body = adapter.encode(options as { body: unknown });\n }\n\n // cookies\n for (const key in options.cookie) {\n const param = options.cookie[key];\n const segs: string[] = [`${key}=${param.value}`];\n\n if (proxyUrl && proxyUrl.origin !== window.location.origin)\n segs.push(`domain=${proxyUrl.host}`);\n segs.push('path=/', 'max-age=30');\n\n document.cookie = segs.join('; ');\n }\n\n return fetch(url, {\n method: options.method,\n cache: 'no-cache',\n headers,\n body,\n signal: AbortSignal.timeout(requestTimeout * 1000),\n })\n .then(async (res) => {\n const contentType = res.headers.get('Content-Type') ?? '';\n let type: FetchResult['type'];\n let data: unknown;\n\n if (contentType.startsWith('application/json')) {\n type = 'json';\n data = await res.json();\n } else {\n type = contentType.startsWith('text/html') ? 'html' : 'text';\n data = await res.text();\n }\n\n return { status: res.status, type, data };\n })\n .catch((e) => {\n const message = e instanceof Error ? `[${e.name}] ${e.message}` : e.toString();\n\n return {\n status: 400,\n type: 'text',\n data: `Client side error: ${message}`,\n };\n });\n },\n };\n}\n"],"mappings":";;;;AAuBA,SAAgB,qBACd,UACA,gBACS;AACT,QAAO,EACL,MAAM,MAAM,KAAK,SAAS;EACxB,MAAM,UAAU,IAAI,SAAS;AAC7B,MAAI,QAAQ,iBAAiB,QAAQ,kBAAkB,sBACrD,SAAQ,OAAO,gBAAgB,QAAQ,cAAc;AAEvD,OAAK,MAAM,OAAO,QAAQ,QAAQ;GAChC,MAAM,QAAQ,QAAQ,OAAO;AAC7B,WAAQ,OAAO,KAAK,MAAM,MAAM;;EAGlC,MAAM,WAAW,QAAQ,WAAW,IAAI,IAAI,QAAQ,UAAU,SAAS,QAAQ,GAAG;AAElF,MAAI,UAAU;AACZ,YAAS,aAAa,OAAO,OAAO,IAAI;AACxC,SAAM,SAAS,UAAU;;EAG3B,IAAI,OAA6B;AACjC,MAAI,QAAQ,iBAAiB,QAAQ,MAAM;GACzC,MAAM,UAAU,oBAAoB,QAAQ,eAAe,SAAS;AACpE,OAAI,CAAC,QACH,QAAO;IACL,QAAQ;IACR,MAAM;IACN,MAAM,6BAA6B,QAAQ,cAAc;IAC1D;AAEH,UAAO,QAAQ,OAAO,QAA6B;;AAIrD,OAAK,MAAM,OAAO,QAAQ,QAAQ;GAEhC,MAAM,OAAiB,CAAC,GAAG,IAAI,GADjB,QAAQ,OAAO,KACW,QAAQ;AAEhD,OAAI,YAAY,SAAS,WAAW,OAAO,SAAS,OAClD,MAAK,KAAK,UAAU,SAAS,OAAO;AACtC,QAAK,KAAK,UAAU,aAAa;AAEjC,YAAS,SAAS,KAAK,KAAK,KAAK;;AAGnC,SAAO,MAAM,KAAK;GAChB,QAAQ,QAAQ;GAChB,OAAO;GACP;GACA;GACA,QAAQ,YAAY,QAAQ,iBAAiB,IAAK;GACnD,CAAC,CACC,KAAK,OAAO,QAAQ;GACnB,MAAM,cAAc,IAAI,QAAQ,IAAI,eAAe,IAAI;GACvD,IAAI;GACJ,IAAI;AAEJ,OAAI,YAAY,WAAW,mBAAmB,EAAE;AAC9C,WAAO;AACP,WAAO,MAAM,IAAI,MAAM;UAClB;AACL,WAAO,YAAY,WAAW,YAAY,GAAG,SAAS;AACtD,WAAO,MAAM,IAAI,MAAM;;AAGzB,UAAO;IAAE,QAAQ,IAAI;IAAQ;IAAM;IAAM;IACzC,CACD,OAAO,MAAM;AAGZ,UAAO;IACL,QAAQ;IACR,MAAM;IACN,MAAM,sBALQ,aAAa,QAAQ,IAAI,EAAE,KAAK,IAAI,EAAE,YAAY,EAAE,UAAU;IAM7E;IACD;IAEP"}
|
|
@@ -23,4 +23,5 @@ declare function APIPlayground({
|
|
|
23
23
|
ctx
|
|
24
24
|
}: APIPlaygroundProps): Promise<string | number | bigint | boolean | react_jsx_runtime0.JSX.Element | Iterable<react.ReactNode> | null | undefined>;
|
|
25
25
|
//#endregion
|
|
26
|
-
export { APIPlayground, APIPlaygroundProps, ParameterField, SecurityEntry };
|
|
26
|
+
export { APIPlayground, APIPlaygroundProps, ParameterField, SecurityEntry };
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/playground/index.tsx"],"mappings":";;;;;;KAUY,cAAA,GAAiB,WAAA,CAAY,eAAA;EACvC,MAAA,EAAQ,YAAA;EACR,EAAA;AAAA;AAAA,UASe,kBAAA;EACf,IAAA;EACA,MAAA,EAAQ,iBAAA;EACR,GAAA,EAAK,aAAA;AAAA;AAAA,KAGK,aAAA,GAAgB,oBAAA;EAC1B,MAAA;EACA,EAAA;AAAA;AAAA,iBAGoB,aAAA,CAAA;EAAgB,IAAA;EAAM,MAAA;EAAQ;AAAA,GAAO,kBAAA,GAAkB,OAAA,sCAAA,kBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,KAAA,CAAA,SAAA"}
|
package/dist/playground/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/playground/index.tsx"],"sourcesContent":["import type {\n MethodInformation,\n ParameterObject,\n RenderContext,\n SecuritySchemeObject,\n} from '@/types';\nimport { getPreferredType, type NoReference, type ParsedSchema } from '@/utils/schema';\nimport { type PlaygroundClientProps } from './client';\nimport { ClientLazy } from './lazy';\n\nexport type ParameterField = NoReference<ParameterObject> & {\n schema: ParsedSchema;\n in: 'cookie' | 'header' | 'query' | 'path';\n};\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 async 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 as ParameterField[],\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 <ClientLazy {...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":";;;;;AAgCA,eAAsB,cAAc,EAAE,MAAM,QAAQ,OAA2B;AAC7E,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;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;AAoBD,QAAO,oBAAC;EAjBN,YAAY,gBAAgB,QAAQ,IAAI;EACxC,QAAQ,OAAO;EACf,OAAO;EACP,YAAY,OAAO;EACnB,MACE,eAAe,YACV;GACC,QAAQ,gBAAgB,YAAY,WAAW,QAAwB,QAAQ;GAC/E;GACD,GACD;EACN,YAAY,QAAQ;EACpB,UAAU,IAAI;EACd,WAAW;EACX,UAAU;GAGoB;;AAGlC,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"}
|
package/dist/playground/lazy.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.js","names":[],"sources":["../../src/playground/lazy.ts"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../utils/lazy';\n\nexport const ClientLazy = wrapLazy(() => import('./client'));\n"],"mappings":";;;;;AAGA,MAAa,aAAa,eAAe,OAAO,eAAY"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import "../utils/schema.js";
|
|
2
|
-
import "../utils/schema-to-string.js";
|
|
3
1
|
import { ReactNode } from "react";
|
|
4
|
-
import "react/jsx-runtime";
|
|
5
2
|
import { Ajv2020 } from "ajv/dist/2020";
|
|
6
3
|
import { FieldKey } from "@fumari/stf";
|
|
7
4
|
|
|
@@ -17,4 +14,5 @@ interface SchemaScope {
|
|
|
17
14
|
readOnly: boolean;
|
|
18
15
|
}
|
|
19
16
|
//#endregion
|
|
20
|
-
export { SchemaScope };
|
|
17
|
+
export { SchemaScope };
|
|
18
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/playground/schema.tsx"],"mappings":";;;;;UAciB,WAAA;;;;EAIf,SAAA;;;;EAKA,QAAA;AAAA"}
|
|
@@ -48,7 +48,7 @@ function useSchemaScope() {
|
|
|
48
48
|
* A hook to store dynamic info of a field, such as selected schema of `oneOf`.
|
|
49
49
|
*
|
|
50
50
|
* @param fieldName - field name of form.
|
|
51
|
-
* @param schema - The JSON Schema to generate initial values.
|
|
51
|
+
* @param schema - The **resolved** JSON Schema to generate initial values.
|
|
52
52
|
* @param depth - The depth to avoid duplicated field name with same schema (e.g. nested `oneOf`).
|
|
53
53
|
*/
|
|
54
54
|
function useFieldInfo(fieldName, schema, depth = 0) {
|
|
@@ -80,17 +80,12 @@ function useFieldInfo(fieldName, schema, depth = 0) {
|
|
|
80
80
|
}, value);
|
|
81
81
|
}) ?? types[0];
|
|
82
82
|
}
|
|
83
|
-
if (schema.allOf) {
|
|
84
|
-
const merged = mergeAllOf(schema, { dereference(schema) {
|
|
85
|
-
return dereference(schema, references);
|
|
86
|
-
} });
|
|
87
|
-
if (typeof merged !== "boolean") out.intersection = { merged };
|
|
88
|
-
}
|
|
89
83
|
return out;
|
|
90
84
|
}
|
|
91
85
|
}) });
|
|
92
86
|
return {
|
|
93
87
|
info,
|
|
88
|
+
schema,
|
|
94
89
|
updateInfo(value) {
|
|
95
90
|
const updated = {
|
|
96
91
|
...info,
|
|
@@ -119,9 +114,6 @@ function useSchemaUtils() {
|
|
|
119
114
|
quiet: true
|
|
120
115
|
}, references);
|
|
121
116
|
},
|
|
122
|
-
resolve(schema) {
|
|
123
|
-
return fallbackAny(dereference(schema, references));
|
|
124
|
-
},
|
|
125
117
|
schemaToString(value, flags) {
|
|
126
118
|
return schemaToString(value, (s) => ({
|
|
127
119
|
dereferenced: dereference(s, references),
|
|
@@ -130,6 +122,20 @@ function useSchemaUtils() {
|
|
|
130
122
|
}
|
|
131
123
|
};
|
|
132
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* resolve $ref & merge `allOf`.
|
|
127
|
+
*/
|
|
128
|
+
function useResolvedSchema(raw) {
|
|
129
|
+
const { references } = use(SchemaContext);
|
|
130
|
+
return useMemo(() => {
|
|
131
|
+
const schema = dereference(raw, references);
|
|
132
|
+
if (typeof schema === "boolean") return anyFields;
|
|
133
|
+
if (schema.allOf) return fallbackAny(mergeAllOf(schema, { dereference(schema) {
|
|
134
|
+
return dereference(schema, references);
|
|
135
|
+
} }));
|
|
136
|
+
return schema;
|
|
137
|
+
}, [raw, references]);
|
|
138
|
+
}
|
|
133
139
|
function dereference(schema, references) {
|
|
134
140
|
if (typeof schema === "boolean") return schema;
|
|
135
141
|
let ref = schema.$ref;
|
|
@@ -148,4 +154,5 @@ function getUnion(schema) {
|
|
|
148
154
|
}
|
|
149
155
|
|
|
150
156
|
//#endregion
|
|
151
|
-
export { SchemaProvider, anyFields, useFieldInfo, useSchemaScope, useSchemaUtils };
|
|
157
|
+
export { SchemaProvider, anyFields, useFieldInfo, useResolvedSchema, useSchemaScope, useSchemaUtils };
|
|
158
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../src/playground/schema.tsx"],"sourcesContent":["import { Ajv2020 } from 'ajv/dist/2020';\nimport { createContext, ReactNode, use, useMemo } from 'react';\nimport type { ParsedSchema, ResolvedSchema } from '@/utils/schema';\nimport { mergeAllOf } from '@/utils/merge-schema';\nimport { FieldKey, useDataEngine, useFieldValue, useNamespace } from '@fumari/stf';\nimport { stringifyFieldKey } from '@fumari/stf/lib/utils';\nimport { sample } from 'openapi-sampler';\nimport { FormatFlags, schemaToString } from '@/utils/schema-to-string';\n\ninterface SchemaContextType extends SchemaScope {\n references: Record<string, ParsedSchema>;\n ajv: Ajv2020;\n}\n\nexport interface SchemaScope {\n /**\n * show write only fields\n */\n writeOnly: boolean;\n\n /**\n * show read only fields\n */\n readOnly: boolean;\n}\n\ntype UnionField = 'anyOf' | 'oneOf';\n\nexport interface FieldInfo {\n selectedType?: string;\n oneOf: number;\n\n /**\n * The actual field that represents union members.\n */\n unionField?: UnionField;\n}\n\nconst SchemaContext = createContext<SchemaContextType | undefined>(undefined);\nexport const anyFields = {\n type: ['string', 'number', 'boolean', 'array', 'object'],\n items: true,\n additionalProperties: true,\n} satisfies ParsedSchema;\n\nexport function SchemaProvider({\n references,\n readOnly,\n writeOnly,\n children,\n}: Omit<SchemaContextType, 'ajv'> & { children: ReactNode }) {\n const ajv = useMemo(\n () =>\n new Ajv2020({\n strict: false,\n validateSchema: false,\n validateFormats: false,\n }),\n [],\n );\n\n return (\n <SchemaContext.Provider\n value={useMemo(\n () => ({ references, ajv, readOnly, writeOnly }),\n [references, ajv, readOnly, writeOnly],\n )}\n >\n {children}\n </SchemaContext.Provider>\n );\n}\n\nexport function useSchemaScope(): SchemaScope {\n return use(SchemaContext)!;\n}\n\n/**\n * A hook to store dynamic info of a field, such as selected schema of `oneOf`.\n *\n * @param fieldName - field name of form.\n * @param schema - The **resolved** JSON Schema to generate initial values.\n * @param depth - The depth to avoid duplicated field name with same schema (e.g. nested `oneOf`).\n */\nexport function useFieldInfo(\n fieldName: FieldKey,\n schema: Exclude<ParsedSchema, boolean>,\n depth = 0,\n): {\n info: FieldInfo;\n schema: Exclude<ParsedSchema, boolean>;\n updateInfo: (value: Partial<FieldInfo>) => void;\n} {\n const { ajv, references } = use(SchemaContext)!;\n const engine = useDataEngine();\n const { generateDefault } = useSchemaUtils();\n const fieldData = useNamespace({\n namespace: `field-info:${depth}:${stringifyFieldKey(fieldName)}`,\n initial(): FieldInfo {\n const value = engine.get(fieldName);\n const out: FieldInfo = {\n oneOf: -1,\n };\n const union = getUnion(schema);\n if (union) {\n const [members, field] = union;\n\n out.oneOf = members.findIndex((item) =>\n ajv.validate(typeof item === 'object' ? { ...item, ...references } : item, value),\n );\n if (out.oneOf === -1) out.oneOf = 0;\n out.unionField = field;\n }\n\n if (Array.isArray(schema.type)) {\n const types = schema.type;\n\n out.selectedType =\n types.find((type) => {\n return ajv.validate({ ...schema, ...references, type }, value);\n }) ?? types[0];\n }\n\n return out;\n },\n });\n const [info, setInfo] = useFieldValue<FieldInfo>([], {\n stf: fieldData,\n });\n\n return {\n info,\n schema,\n updateInfo(value) {\n const updated = {\n ...info,\n ...value,\n };\n\n if (updated.oneOf === info.oneOf && updated.selectedType === info.selectedType) return;\n\n setInfo(updated);\n\n let valueSchema: ParsedSchema = schema;\n if (updated.unionField) {\n valueSchema = schema[updated.unionField]![updated.oneOf];\n } else if (updated.selectedType) {\n // must remove to `examples` to avoid invalid default values\n valueSchema = { ...schema, type: updated.selectedType, examples: undefined };\n }\n\n engine.update(fieldName, generateDefault(valueSchema));\n },\n };\n}\n\nexport function useSchemaUtils() {\n const { references } = use(SchemaContext)!;\n\n return {\n generateDefault(schema: ParsedSchema): unknown {\n return sample(\n schema as never,\n { skipNonRequired: true, skipReadOnly: true, quiet: true },\n references,\n );\n },\n schemaToString(value: ResolvedSchema, flags?: FormatFlags) {\n return schemaToString(\n value,\n (s) => ({ dereferenced: dereference(s, references), raw: s }),\n flags,\n );\n },\n };\n}\n\n/**\n * resolve $ref & merge `allOf`.\n */\nexport function useResolvedSchema(raw: ParsedSchema): Exclude<ParsedSchema, boolean> {\n const { references } = use(SchemaContext)!;\n\n return useMemo(() => {\n const schema = dereference(raw, references);\n if (typeof schema === 'boolean') return anyFields;\n\n if (schema.allOf) {\n return fallbackAny(\n mergeAllOf(schema, {\n dereference(schema) {\n return dereference(schema, references);\n },\n }),\n );\n }\n\n return schema;\n }, [raw, references]);\n}\n\nfunction dereference(schema: ParsedSchema, references: Record<string, ParsedSchema>): ParsedSchema {\n if (typeof schema === 'boolean') return schema;\n\n let ref = schema.$ref;\n if (ref) {\n // use swallow resolution as it is already preprocessed in `playground/index.tsx`\n const prefix = '#/';\n if (ref.startsWith(prefix)) ref = ref.slice(prefix.length);\n if (ref in references) return references[ref];\n }\n\n return schema;\n}\n\nfunction fallbackAny(schema: ParsedSchema): Exclude<ParsedSchema, boolean> {\n return typeof schema === 'boolean' ? anyFields : schema;\n}\n\nfunction getUnion(\n schema: Exclude<ParsedSchema, boolean>,\n): [readonly ParsedSchema[], UnionField] | undefined {\n if (schema.anyOf) {\n return [schema.anyOf, 'anyOf'];\n }\n\n if (schema.oneOf) return [schema.oneOf, 'oneOf'];\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-info.js","names":[],"sources":["../../src/playground/status-info.tsx"],"sourcesContent":["import { CircleCheck, CircleX } from 'lucide-react';\n\ninterface StatusInfo {\n description: string;\n color: string;\n icon: React.ElementType;\n}\n\nconst statusMap: Record<number, StatusInfo> = {\n 400: { description: 'Bad Request', color: 'text-red-500', icon: CircleX },\n 401: {\n description: 'Unauthorized',\n color: 'text-red-500',\n icon: CircleX,\n },\n 403: { description: 'Forbidden', color: 'text-red-500', icon: CircleX },\n 404: {\n description: 'Not Found',\n color: 'text-fd-muted-foreground',\n icon: CircleX,\n },\n 500: {\n description: 'Internal Server Error',\n color: 'text-red-500',\n icon: CircleX,\n },\n};\n\nexport function getStatusInfo(status: number): StatusInfo {\n if (status in statusMap) {\n return statusMap[status];\n }\n\n if (status >= 200 && status < 300) {\n return {\n description: 'Successful',\n color: 'text-green-500',\n icon: CircleCheck,\n };\n }\n\n if (status >= 400) {\n return { description: 'Error', color: 'text-red-500', icon: CircleX };\n }\n\n return {\n description: 'No Description',\n color: 'text-fd-muted-foreground',\n icon: CircleX,\n };\n}\n"],"mappings":";;;AAQA,MAAM,YAAwC;CAC5C,KAAK;EAAE,aAAa;EAAe,OAAO;EAAgB,MAAM;EAAS;CACzE,KAAK;EACH,aAAa;EACb,OAAO;EACP,MAAM;EACP;CACD,KAAK;EAAE,aAAa;EAAa,OAAO;EAAgB,MAAM;EAAS;CACvE,KAAK;EACH,aAAa;EACb,OAAO;EACP,MAAM;EACP;CACD,KAAK;EACH,aAAa;EACb,OAAO;EACP,MAAM;EACP;CACF;AAED,SAAgB,cAAc,QAA4B;AACxD,KAAI,UAAU,UACZ,QAAO,UAAU;AAGnB,KAAI,UAAU,OAAO,SAAS,IAC5B,QAAO;EACL,aAAa;EACb,OAAO;EACP,MAAM;EACP;AAGH,KAAI,UAAU,IACZ,QAAO;EAAE,aAAa;EAAS,OAAO;EAAgB,MAAM;EAAS;AAGvE,QAAO;EACL,aAAa;EACb,OAAO;EACP,MAAM;EACP"}
|
|
@@ -3,4 +3,5 @@ import { CodeUsageGeneratorRegistry } from "./index.js";
|
|
|
3
3
|
//#region src/requests/generators/all.d.ts
|
|
4
4
|
declare function registerDefault(registry: CodeUsageGeneratorRegistry): void;
|
|
5
5
|
//#endregion
|
|
6
|
-
export { registerDefault };
|
|
6
|
+
export { registerDefault };
|
|
7
|
+
//# sourceMappingURL=all.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"all.d.ts","names":[],"sources":["../../../src/requests/generators/all.ts"],"mappings":";;;iBAQgB,eAAA,CAAgB,QAAA,EAAU,0BAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"all.js","names":[],"sources":["../../../src/requests/generators/all.ts"],"sourcesContent":["import type { CodeUsageGeneratorRegistry } from '.';\nimport { csharp } from './csharp';\nimport { curl } from './curl';\nimport { go } from './go';\nimport { java } from './java';\nimport { javascript } from './javascript';\nimport { python } from './python';\n\nexport function registerDefault(registry: CodeUsageGeneratorRegistry) {\n registry.add('curl', curl);\n registry.add('js', javascript);\n registry.add('go', go);\n registry.add('python', python);\n registry.add('java', java);\n registry.add('csharp', csharp);\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,gBAAgB,UAAsC;AACpE,UAAS,IAAI,QAAQ,KAAK;AAC1B,UAAS,IAAI,MAAM,WAAW;AAC9B,UAAS,IAAI,MAAM,GAAG;AACtB,UAAS,IAAI,UAAU,OAAO;AAC9B,UAAS,IAAI,QAAQ,KAAK;AAC1B,UAAS,IAAI,UAAU,OAAO"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csharp.d.ts","names":[],"sources":["../../../src/requests/generators/csharp.ts"],"mappings":";;;cAGa,MAAA,EAAQ,kBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csharp.js","names":[],"sources":["../../../src/requests/generators/csharp.ts"],"sourcesContent":["import type { CodeUsageGenerator } from '@/requests/generators';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const csharp: CodeUsageGenerator = {\n label: 'C#',\n lang: 'csharp',\n generate(url, data, { mediaAdapters }) {\n const s: string[] = [];\n const imports = new Set<string>(['System', 'System.Net.Http', 'System.Text']);\n const headers = { ...data.header };\n\n // Handle request body\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: 'csharp',\n addImport(from) {\n imports.add(from);\n },\n });\n }\n\n for (const specifier of imports) {\n s.push(`using ${specifier};`);\n }\n\n s.push('');\n\n if (body) {\n s.push(body, '');\n }\n\n s.push('var client = new HttpClient();');\n const headerLines: string[] = [];\n\n function addHeader(key: string, value: string) {\n headerLines.push(`client.DefaultRequestHeaders.Add(\"${key}\", ${JSON.stringify(value)});`);\n }\n for (const k in headers) {\n addHeader(k, headers[k].value);\n }\n\n // Add cookie header if cookies are present\n if (Object.keys(data.cookie).length > 0) {\n const cookie = Object.entries(data.cookie)\n .map(([key, param]) => `${key}=${param.value}`)\n .join('; ');\n\n addHeader('cookie', cookie);\n }\n\n s.push(...headerLines);\n\n // Build the request\n const method = data.method[0].toUpperCase() + data.method.slice(1).toLowerCase() + 'Async';\n\n if (body) {\n s.push(`var response = await client.${method}(\"${url}\", body);`);\n } else {\n s.push(`var response = await client.${method}(\"${url}\");`);\n }\n\n // Add response handling\n s.push('var responseBody = await response.Content.ReadAsStringAsync();');\n\n return s.join('\\n');\n },\n};\n"],"mappings":";;;;AAGA,MAAa,SAA6B;CACxC,OAAO;CACP,MAAM;CACN,SAAS,KAAK,MAAM,EAAE,iBAAiB;EACrC,MAAM,IAAc,EAAE;EACtB,MAAM,UAAU,IAAI,IAAY;GAAC;GAAU;GAAmB;GAAc,CAAC;EAC7E,MAAM,UAAU,EAAE,GAAG,KAAK,QAAQ;EAGlC,IAAI;AACJ,MAAI,KAAK,QAAQ,KAAK,cAEpB,QADgB,oBAAoB,KAAK,eAAe,cAAc,EACtD,gBAAgB,MAA2B;GACzD,MAAM;GACN,UAAU,MAAM;AACd,YAAQ,IAAI,KAAK;;GAEpB,CAAC;AAGJ,OAAK,MAAM,aAAa,QACtB,GAAE,KAAK,SAAS,UAAU,GAAG;AAG/B,IAAE,KAAK,GAAG;AAEV,MAAI,KACF,GAAE,KAAK,MAAM,GAAG;AAGlB,IAAE,KAAK,iCAAiC;EACxC,MAAM,cAAwB,EAAE;EAEhC,SAAS,UAAU,KAAa,OAAe;AAC7C,eAAY,KAAK,qCAAqC,IAAI,KAAK,KAAK,UAAU,MAAM,CAAC,IAAI;;AAE3F,OAAK,MAAM,KAAK,QACd,WAAU,GAAG,QAAQ,GAAG,MAAM;AAIhC,MAAI,OAAO,KAAK,KAAK,OAAO,CAAC,SAAS,EAKpC,WAAU,UAJK,OAAO,QAAQ,KAAK,OAAO,CACvC,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,QAAQ,CAC9C,KAAK,KAAK,CAEc;AAG7B,IAAE,KAAK,GAAG,YAAY;EAGtB,MAAM,SAAS,KAAK,OAAO,GAAG,aAAa,GAAG,KAAK,OAAO,MAAM,EAAE,CAAC,aAAa,GAAG;AAEnF,MAAI,KACF,GAAE,KAAK,+BAA+B,OAAO,IAAI,IAAI,WAAW;MAEhE,GAAE,KAAK,+BAA+B,OAAO,IAAI,IAAI,KAAK;AAI5D,IAAE,KAAK,iEAAiE;AAExE,SAAO,EAAE,KAAK,KAAK;;CAEtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curl.d.ts","names":[],"sources":["../../../src/requests/generators/curl.ts"],"mappings":";;;cAGa,IAAA,EAAM,kBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curl.js","names":[],"sources":["../../../src/requests/generators/curl.ts"],"sourcesContent":["import { escapeString, ident, 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) => ident(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,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,QAAQ;;CAEpE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go.d.ts","names":[],"sources":["../../../src/requests/generators/go.ts"],"mappings":";;;cAIa,EAAA,EAAI,kBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go.js","names":[],"sources":["../../../src/requests/generators/go.ts"],"sourcesContent":["import { ident } 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${ident(imports.map((v) => `\"${v}\"`).join('\\n'))}\n)\n\nfunc main() {\n${Array.from(variables.entries())\n .map(([k, v]) => ident(`${k} := ${v}`))\n .join('\\n')}\n${body ? ident(body) : ''}\n req, _ := http.NewRequest(\"${data.method}\", url, ${body ? 'body' : 'nil'})\n${ident(\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,MAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC;;;;EAI/C,MAAM,KAAK,UAAU,SAAS,CAAC,CAC9B,KAAK,CAAC,GAAG,OAAO,MAAM,GAAG,EAAE,MAAM,IAAI,CAAC,CACtC,KAAK,KAAK,CAAC;EACZ,OAAO,MAAM,KAAK,GAAG,GAAG;+BACK,KAAK,OAAO,UAAU,OAAO,SAAS,MAAM;EACzE,MACA,MAAM,KAAK,QAAQ,SAAS,CAAC,CAC1B,KAAK,CAAC,KAAK,WAAW,mBAAmB,IAAI,KAAK,MAAM,GAAG,CAC3D,KAAK,KAAK,CACd,CAAC;;;;;;;;;CASD"}
|
|
@@ -52,4 +52,5 @@ type CodeUsageGeneratorFn<ServerContext = unknown> = (url: string, data: Request
|
|
|
52
52
|
server: ServerContext;
|
|
53
53
|
}) => string;
|
|
54
54
|
//#endregion
|
|
55
|
-
export { CodeUsageGenerator, CodeUsageGeneratorFn, CodeUsageGeneratorRegistry, InlineCodeUsageGenerator, createCodeUsageGeneratorRegistry };
|
|
55
|
+
export { CodeUsageGenerator, CodeUsageGeneratorFn, CodeUsageGeneratorRegistry, InlineCodeUsageGenerator, createCodeUsageGeneratorRegistry };
|
|
56
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/requests/generators/index.ts"],"mappings":";;;;UAGiB,0BAAA;EACf,GAAA,GAAM,EAAA,UAAY,SAAA,EAAW,kBAAA;EAC7B,GAAA,GAAM,EAAA,aAAe,kBAAA;EACrB,SAAA,GAAY,SAAA,EAAW,wBAAA;;;;EAIvB,MAAA,GAAS,EAAA;EACT,GAAA,QAAW,GAAA,SAAY,kBAAA;AAAA;;;;UAMR,kBAAA;EACf,QAAA,EAAU,oBAAA;EACV,IAAA;EACA,KAAA;EAfM;;;EAoBN,OAAA;IACE,QAAA,WAAmB,oBAAA;IACnB,aAAA;EAAA;AAAA;;;;UAOa,wBAAA;EACf,EAAA;EACA,IAAA;EACA,KAAA;EAXyC;;;;;;EAkBzC,MAAA,YAAkB,oBAAA,CAAqB,CAAA;EAlBlB;;;EAuBrB,aAAA,GAAgB,CAAA;AAAA;AAAA,iBAGF,gCAAA,CACd,OAAA,GAAU,0BAAA,GACT,0BAAA;AAAA,KAuCS,oBAAA,6BACV,GAAA,UACA,IAAA,EAAM,WAAA,EACN,OAAA;EACE,aAAA,EAAe,MAAA,SAAe,YAAA;EAC9B,MAAA,EAAQ,aAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/requests/generators/index.ts"],"sourcesContent":["import type { MediaAdapter } from '../media/adapter';\nimport type { RequestData } from '../types';\n\nexport interface CodeUsageGeneratorRegistry {\n add: (id: string, generator: CodeUsageGenerator) => void;\n get: (id: string) => CodeUsageGenerator | undefined;\n addInline: (generator: InlineCodeUsageGenerator) => void;\n /**\n * @returns if the generator is removed\n */\n remove: (id: string) => boolean;\n map: () => Map<string, CodeUsageGenerator>;\n}\n\n/**\n * Generate code example for given programming language\n */\nexport interface CodeUsageGenerator {\n generate: CodeUsageGeneratorFn;\n lang: string;\n label?: string;\n\n /**\n * for inline generators passed from server, this stores info available for client (e.g. forwarded from \"use client\").\n */\n _client?: {\n generate: string | CodeUsageGeneratorFn;\n serverContext?: unknown;\n };\n}\n\n/**\n * Generate code example for given programming language\n */\nexport interface InlineCodeUsageGenerator<T = unknown> {\n id?: string;\n lang: string;\n label?: string;\n /**\n * either:\n * - code\n * - a function imported from a file with \"use client\" directive\n * - false (disabled)\n */\n source?: string | CodeUsageGeneratorFn<T> | false;\n\n /**\n * Pass extra context to client-side source generator\n */\n serverContext?: T;\n}\n\nexport function createCodeUsageGeneratorRegistry(\n ihherit?: CodeUsageGeneratorRegistry,\n): CodeUsageGeneratorRegistry {\n const registry = new Map<string, CodeUsageGenerator>(ihherit?.map());\n\n return {\n add(id, generator) {\n registry.set(id, generator);\n },\n get(id) {\n return registry.get(id);\n },\n addInline(generator) {\n const source = generator.source;\n const id = generator.id ?? generator.lang;\n if (!source) {\n this.remove(id);\n return;\n }\n\n registry.set(id, {\n lang: generator.lang,\n label: generator.label,\n generate() {\n return typeof source === 'string' ? source : '';\n },\n _client: {\n generate: source,\n serverContext: generator.serverContext,\n },\n });\n },\n remove(id) {\n return registry.delete(id);\n },\n map() {\n return registry;\n },\n };\n}\n\nexport type CodeUsageGeneratorFn<ServerContext = unknown> = (\n url: string,\n data: RequestData,\n context: {\n mediaAdapters: Record<string, MediaAdapter>;\n server: ServerContext;\n },\n) => string;\n"],"mappings":";AAoDA,SAAgB,iCACd,SAC4B;CAC5B,MAAM,WAAW,IAAI,IAAgC,SAAS,KAAK,CAAC;AAEpE,QAAO;EACL,IAAI,IAAI,WAAW;AACjB,YAAS,IAAI,IAAI,UAAU;;EAE7B,IAAI,IAAI;AACN,UAAO,SAAS,IAAI,GAAG;;EAEzB,UAAU,WAAW;GACnB,MAAM,SAAS,UAAU;GACzB,MAAM,KAAK,UAAU,MAAM,UAAU;AACrC,OAAI,CAAC,QAAQ;AACX,SAAK,OAAO,GAAG;AACf;;AAGF,YAAS,IAAI,IAAI;IACf,MAAM,UAAU;IAChB,OAAO,UAAU;IACjB,WAAW;AACT,YAAO,OAAO,WAAW,WAAW,SAAS;;IAE/C,SAAS;KACP,UAAU;KACV,eAAe,UAAU;KAC1B;IACF,CAAC;;EAEJ,OAAO,IAAI;AACT,UAAO,SAAS,OAAO,GAAG;;EAE5B,MAAM;AACJ,UAAO;;EAEV"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"java.d.ts","names":[],"sources":["../../../src/requests/generators/java.ts"],"mappings":";;;cAIa,IAAA,EAAM,kBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"java.js","names":[],"sources":["../../../src/requests/generators/java.ts"],"sourcesContent":["import { ident } 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(ident('.connectTimeout(Duration.ofSeconds(10))'));\n s.push(ident('.build();'));\n s.push('');\n\n // Build request\n s.push('HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()');\n s.push(ident(`.uri(URI.create(${JSON.stringify(url)}))`));\n\n // Add headers\n for (const [key, param] of Object.entries(headers)) {\n s.push(ident(`.header(${JSON.stringify(key)}, ${JSON.stringify(param.value)})`));\n }\n\n if (data.bodyMediaType) {\n s.push(ident(`.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(ident(`.header(\"Cookie\", ${JSON.stringify(cookieString)})`));\n }\n\n const arg = body ? 'body' : '';\n s.push(ident(`.${data.method.toUpperCase()}(${arg})`));\n s.push(ident('.build();'));\n s.push('');\n\n // Add response handling\n s.push('try {');\n s.push(\n ident(\n 'HttpResponse<String> response = client.send(requestBuilder.build(), BodyHandlers.ofString());',\n ),\n );\n s.push(ident('System.out.println(\"Status code: \" + response.statusCode());'));\n s.push(ident('System.out.println(\"Response body: \" + response.body());'));\n s.push('} catch (Exception e) {');\n s.push(ident('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,MAAM,0CAA0C,CAAC;AACxD,IAAE,KAAK,MAAM,YAAY,CAAC;AAC1B,IAAE,KAAK,GAAG;AAGV,IAAE,KAAK,gEAAgE;AACvE,IAAE,KAAK,MAAM,mBAAmB,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC;AAGzD,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,CAChD,GAAE,KAAK,MAAM,WAAW,KAAK,UAAU,IAAI,CAAC,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,CAAC;AAGlF,MAAI,KAAK,cACP,GAAE,KAAK,MAAM,4BAA4B,KAAK,cAAc,IAAI,CAAC;EAInE,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,MAAM,qBAAqB,KAAK,UAAU,aAAa,CAAC,GAAG,CAAC;;EAGrE,MAAM,MAAM,OAAO,SAAS;AAC5B,IAAE,KAAK,MAAM,IAAI,KAAK,OAAO,aAAa,CAAC,GAAG,IAAI,GAAG,CAAC;AACtD,IAAE,KAAK,MAAM,YAAY,CAAC;AAC1B,IAAE,KAAK,GAAG;AAGV,IAAE,KAAK,QAAQ;AACf,IAAE,KACA,MACE,gGACD,CACF;AACD,IAAE,KAAK,MAAM,iEAA+D,CAAC;AAC7E,IAAE,KAAK,MAAM,6DAA2D,CAAC;AACzE,IAAE,KAAK,0BAA0B;AACjC,IAAE,KAAK,MAAM,uBAAuB,CAAC;AACrC,IAAE,KAAK,IAAI;AAEX,SAAO,EAAE,KAAK,KAAK;;CAEtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript.d.ts","names":[],"sources":["../../../src/requests/generators/javascript.ts"],"mappings":";;;cAIa,UAAA,EAAY,kBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript.js","names":[],"sources":["../../../src/requests/generators/javascript.ts"],"sourcesContent":["import { ident } 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]) => ident(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,MAAM,MAAM,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,CAClD,KAAK,MAAM;AAEd,UAAO,KAAK,MAAM,IAAI,KAAK;;AAG7B,IAAE,KAAK,SAAS,OAAO,KAAK,KAAK,CAAC,GAAG;AAErC,SAAO,EAAE,KAAK,OAAO;;CAExB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.d.ts","names":[],"sources":["../../../src/requests/generators/python.ts"],"mappings":";;;cAIa,MAAA,EAAQ,kBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.js","names":[],"sources":["../../../src/requests/generators/python.ts"],"sourcesContent":["import type { CodeUsageGenerator } from '@/requests/generators';\nimport { generatePythonObject } from '@/requests/to-python-object';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const python: CodeUsageGenerator = {\n label: 'Python',\n lang: 'python',\n generate(url, data, { mediaAdapters }) {\n const headers: Record<string, string> = {};\n const imports = new Set<string>();\n const params = [`\"${data.method}\"`, 'url'];\n let body: string | undefined;\n\n imports.add('requests');\n\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n headers['Content-Type'] = data.bodyMediaType;\n\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'python',\n });\n\n if (body) {\n params.push('data = body');\n }\n }\n\n for (const [k, v] of Object.entries(data.header)) {\n headers[k] = v.value;\n }\n\n if (Object.keys(headers).length > 0) {\n params.push(`headers = ${generatePythonObject(headers, imports)}`);\n }\n\n const inputCookies = Object.entries(data.cookie);\n if (inputCookies.length > 0) {\n const cookies: Record<string, string> = {};\n\n for (const [k, v] of inputCookies) {\n cookies[k] = v.value;\n }\n\n params.push(`cookies = ${generatePythonObject(cookies, imports)}`);\n }\n\n return `${Array.from(imports)\n .map((name) => 'import ' + name)\n .join('\\n')}\n\nurl = ${JSON.stringify(url)}\n${body ?? ''}\nresponse = requests.request(${params.join(', ')})\n\nprint(response.text)`;\n },\n};\n"],"mappings":";;;;;AAIA,MAAa,SAA6B;CACxC,OAAO;CACP,MAAM;CACN,SAAS,KAAK,MAAM,EAAE,iBAAiB;EACrC,MAAM,UAAkC,EAAE;EAC1C,MAAM,0BAAU,IAAI,KAAa;EACjC,MAAM,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM;EAC1C,IAAI;AAEJ,UAAQ,IAAI,WAAW;AAEvB,MAAI,KAAK,QAAQ,KAAK,eAAe;GACnC,MAAM,UAAU,oBAAoB,KAAK,eAAe,cAAc;AACtE,WAAQ,kBAAkB,KAAK;AAE/B,UAAO,SAAS,gBAAgB,MAA2B,EACzD,MAAM,UACP,CAAC;AAEF,OAAI,KACF,QAAO,KAAK,cAAc;;AAI9B,OAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,OAAO,CAC9C,SAAQ,KAAK,EAAE;AAGjB,MAAI,OAAO,KAAK,QAAQ,CAAC,SAAS,EAChC,QAAO,KAAK,aAAa,qBAAqB,SAAS,QAAQ,GAAG;EAGpE,MAAM,eAAe,OAAO,QAAQ,KAAK,OAAO;AAChD,MAAI,aAAa,SAAS,GAAG;GAC3B,MAAM,UAAkC,EAAE;AAE1C,QAAK,MAAM,CAAC,GAAG,MAAM,aACnB,SAAQ,KAAK,EAAE;AAGjB,UAAO,KAAK,aAAa,qBAAqB,SAAS,QAAQ,GAAG;;AAGpE,SAAO,GAAG,MAAM,KAAK,QAAQ,CAC1B,KAAK,SAAS,YAAY,KAAK,CAC/B,KAAK,KAAK,CAAC;;QAEV,KAAK,UAAU,IAAI,CAAC;EAC1B,QAAQ,GAAG;8BACiB,OAAO,KAAK,KAAK,CAAC;;;;CAI/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","names":[],"sources":["../../../src/requests/media/adapter.ts"],"mappings":";UAKU,WAAA;EAAW;;;EAInB,UAAA,GAAa,MAAA;AAAA;AAAA,UAGL,SAAA,SAAkB,WAAA;EAC1B,IAAA;EACA,SAAA,GAAY,IAAA;AAAA;AAAA,UAGJ,iBAAA,SAA0B,WAAA;EAClC,IAAA;EACA,SAAA,GAAY,GAAA,UAAa,IAAA;AAAA;AAAA,UAGjB,WAAA,SAAoB,WAAA;EAC5B,IAAA;EACA,SAAA,GAAY,SAAA;AAAA;AAAA,UAGJ,aAAA,SAAsB,WAAA;EAC9B,IAAA;EACA,SAAA,GAAY,SAAA;AAAA;AAAA,KAGF,YAAA,GACR,WAAA,GACA,SAAA,GACA,iBAAA,GACA,aAAA,IACC,WAAA;EAAgB,IAAA;AAAA;AAAA,UAEJ,YAAA;EAjBP;;;;;EAuBR,MAAA,GAAS,IAAA;IAAQ,IAAA;EAAA,MAAoB,QAAA;EArBR;;AAAA;;;;;;;EAgC7B,eAAA,GAAkB,IAAA;IAAQ,IAAA;EAAA,GAAiB,GAAA,EAAK,YAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","names":[],"sources":["../../../src/requests/media/adapter.ts"],"sourcesContent":["import { escapeString, inputToString } from '@/requests/string-utils';\nexport { resolveMediaAdapter, isMediaTypeSupported } from './resolve-adapter';\n// @ts-expect-error -- untyped\nimport js2xml from 'xml-js/lib/js2xml';\n\ninterface BaseContext {\n /**\n * Passed by your custom example generator, for your custom media adapter to receive.\n */\n customData?: Record<string, unknown>;\n}\n\ninterface GoContext extends BaseContext {\n lang: 'go';\n addImport: (name: string) => void;\n}\n\ninterface JavaScriptContext extends BaseContext {\n lang: 'js';\n addImport: (pkg: string, name: string) => void;\n}\n\ninterface JavaContext extends BaseContext {\n lang: 'java';\n addImport: (specifier: string) => void;\n}\n\ninterface CSharpContext extends BaseContext {\n lang: 'csharp';\n addImport: (specifier: string) => void;\n}\n\nexport type MediaContext =\n | JavaContext\n | GoContext\n | JavaScriptContext\n | CSharpContext\n | (BaseContext & { lang: string });\n\nexport interface MediaAdapter {\n /**\n * encode data into specified media type for `fetch()`.\n *\n * Return the encoded form of `data.body` property.\n */\n encode: (data: { body: unknown }) => BodyInit;\n\n /**\n * generate code example for creating the body in a given programming language.\n *\n * @param data - request data.\n * @param lang - name of programming language.\n * @param ctx - context passed from the generator of programming language.\n *\n * @returns code that inits a `body` variable, or undefined if not supported (skip example for that language).\n */\n generateExample: (data: { body: unknown }, ctx: MediaContext) => string | undefined;\n}\n\nexport const defaultAdapters = {\n 'application/json': {\n encode(data) {\n return JSON.stringify(data.body);\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/json', ctx);\n },\n },\n 'application/xml': {\n encode(data) {\n return js2xml(data.body as Record<string, unknown>, {\n compact: true,\n spaces: 2,\n });\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/xml', ctx);\n },\n },\n 'application/x-ndjson': {\n encode(data) {\n if (Array.isArray(data.body)) {\n return data.body.map((v) => JSON.stringify(v)).join('\\n');\n }\n\n return JSON.stringify(data.body);\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/x-ndjson', ctx);\n },\n },\n 'application/x-www-form-urlencoded': {\n encode(data) {\n if (typeof data.body !== 'object')\n throw new Error(`Input value must be object, received: ${typeof data.body}`);\n\n const params = new URLSearchParams();\n for (const key in data.body) {\n params.set(key, String(data.body[key as keyof object]));\n }\n\n return params;\n },\n generateExample(data, ctx) {\n if (ctx.lang === 'js') {\n return `const body = new URLSearchParams(${JSON.stringify(data.body, null, 2)})`;\n }\n\n return str(data.body, 'application/x-www-form-urlencoded', ctx);\n },\n },\n 'multipart/form-data': {\n encode(data) {\n const formData = new FormData();\n const body = data.body as Record<string, unknown>;\n\n if (typeof body !== 'object' || !body) {\n throw new Error(`Unsupported body type: ${typeof body}, expected: object`);\n }\n\n for (const key in body) {\n const prop = body[key];\n\n if (prop === null || prop === undefined || Number.isNaN(prop)) continue;\n\n // Arrays (multi-value field)\n if (Array.isArray(prop)) {\n for (const item of prop) {\n if (item === null || item === undefined) continue;\n if (item instanceof File) {\n formData.append(key, item, item.name);\n } else if (item instanceof Blob) {\n formData.append(key, item, 'blob');\n } else if (typeof item === 'object') {\n formData.append(key, JSON.stringify(item));\n } else {\n formData.append(key, String(item));\n }\n }\n }\n\n // Single File\n else if (prop instanceof File) {\n formData.set(key, prop, prop.name);\n }\n\n // Single Blob\n else if (prop instanceof Blob) {\n formData.set(key, prop, 'blob');\n }\n\n // Any other object (stringify)\n else if (typeof prop === 'object') {\n formData.set(key, JSON.stringify(prop));\n }\n\n // Primitive types\n else {\n formData.set(key, String(prop));\n }\n }\n\n return formData;\n },\n generateExample(data, ctx) {\n if (ctx.lang === 'python') {\n return `body = ${JSON.stringify(data.body, null, 2)}`;\n }\n\n const s: string[] = [];\n if (ctx.lang === 'js') {\n s.push(`const body = new FormData();`);\n\n for (const [key, value] of Object.entries(data.body as object)) {\n s.push(`body.set(${key}, ${JSON.stringify(inputToString(value))})`);\n }\n }\n\n if (ctx.lang === 'go') {\n const { addImport } = ctx as GoContext;\n addImport('mime/multipart');\n addImport('bytes');\n\n s.push('body := new(bytes.Buffer)');\n s.push('mp := multipart.NewWriter(payload)');\n\n for (const [key, value] of Object.entries(data.body as object)) {\n if (!value) continue;\n\n const escaped = escapeString(inputToString(value, 'application/json'), '`');\n\n s.push(`mp.WriteField(\"${key}\", ${escaped})`);\n }\n }\n\n if (ctx.lang === 'java') {\n const { addImport } = ctx as JavaContext;\n addImport('java.net.http.HttpRequest.BodyPublishers');\n\n s.push(`var body = BodyPublishers.ofByteArray(new byte[] { ... });`);\n }\n\n if (ctx.lang === 'csharp') {\n s.push(`var body = new MultipartFormDataContent();`);\n }\n\n if (s.length > 0) return s.join('\\n');\n },\n },\n 'application/octet-stream': {\n encode(data) {\n return data.body as BodyInit;\n },\n generateExample() {\n // not supported\n return undefined;\n },\n },\n} satisfies Record<string, MediaAdapter>;\n\nfunction str(\n init: unknown,\n mediaType:\n | 'application/x-www-form-urlencoded'\n | 'application/x-ndjson'\n | 'application/json'\n | 'application/xml',\n ctx: MediaContext,\n) {\n if (ctx.lang === 'js') {\n if (mediaType === 'application/json') {\n return `const body = JSON.stringify(${JSON.stringify(init, null, 2)})`;\n }\n return `const body = ${escapeString(inputToString(init, mediaType), '`')}`;\n }\n\n if (ctx.lang === 'python') {\n return `body = ${escapeString(inputToString(init, mediaType), '\"\"\"')}`;\n }\n\n if (ctx.lang === 'go') {\n const { addImport } = ctx as GoContext;\n addImport('strings');\n return `body := strings.NewReader(${escapeString(inputToString(init, mediaType), '`')})`;\n }\n\n if (ctx.lang === 'java') {\n const { addImport } = ctx as JavaContext;\n addImport('java.net.http.HttpRequest.BodyPublishers');\n return `var body = BodyPublishers.ofString(${escapeString(inputToString(init, mediaType), '\"\"\"')});`;\n }\n\n if (ctx.lang === 'csharp') {\n const input = `\\n${inputToString(init, mediaType)}\\n`;\n\n return `var body = new StringContent(${escapeString(input, '\"\"\"')}, Encoding.UTF8, \"${mediaType}\");`;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import "../../utils/schema.js";
|
|
2
|
-
import "../types.js";
|
|
3
|
-
import "../../types.js";
|
|
4
|
-
|
|
5
1
|
//#region src/requests/media/encode.d.ts
|
|
6
2
|
interface EncodedParameter {
|
|
7
3
|
readonly value: string;
|
|
@@ -10,4 +6,5 @@ interface EncodedParameterMultiple {
|
|
|
10
6
|
readonly values: string[];
|
|
11
7
|
}
|
|
12
8
|
//#endregion
|
|
13
|
-
export { EncodedParameter, EncodedParameterMultiple };
|
|
9
|
+
export { EncodedParameter, EncodedParameterMultiple };
|
|
10
|
+
//# sourceMappingURL=encode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.d.ts","names":[],"sources":["../../../src/requests/media/encode.ts"],"mappings":";UAMiB,gBAAA;EAAA,SACN,KAAA;AAAA;AAAA,UAGM,wBAAA;EAAA,SACN,MAAA;AAAA"}
|
|
@@ -29,7 +29,8 @@ function encodeRequestData(from, adapters, parameters = []) {
|
|
|
29
29
|
};
|
|
30
30
|
const encoder = getMediaEncoder(field, adapters);
|
|
31
31
|
if (encoder) {
|
|
32
|
-
result[type][key] = {
|
|
32
|
+
if (type === "query") result[type][key] = { values: [encoder(value)] };
|
|
33
|
+
else result[type][key] = { value: encoder(value) };
|
|
33
34
|
continue;
|
|
34
35
|
}
|
|
35
36
|
switch (type) {
|
|
@@ -128,4 +129,5 @@ function serializeCookieParameter(field, value, output) {
|
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
//#endregion
|
|
131
|
-
export { encodeRequestData };
|
|
132
|
+
export { encodeRequestData };
|
|
133
|
+
//# sourceMappingURL=encode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.js","names":[],"sources":["../../../src/requests/media/encode.ts"],"sourcesContent":["import type { MediaAdapter } from '@/requests/media/adapter';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\nimport type { NoReference } from '@/utils/schema';\nimport type { ParameterObject } from '@/types';\nimport type { RawRequestData, RequestData } from '@/requests/types';\n\nexport interface EncodedParameter {\n readonly value: string;\n}\n\nexport interface EncodedParameterMultiple {\n readonly values: string[];\n}\n\n/**\n * serialize parameters, see https://swagger.io/docs/specification/v3_0/serialization.\n */\nexport function encodeRequestData(\n from: RawRequestData,\n adapters: Record<string, MediaAdapter>,\n parameters: NoReference<ParameterObject>[] = [],\n): RequestData {\n const result: RequestData = {\n method: from.method,\n body: from.body,\n bodyMediaType: from.bodyMediaType,\n cookie: {},\n header: {},\n path: {},\n query: {},\n };\n\n for (const type of ['cookie', 'query', 'header', 'path'] as const) {\n for (const key in from[type]) {\n const value = from[type][key];\n if (value == null) continue;\n\n const field: NoReference<ParameterObject> = parameters.find(\n (p) => p.name === key && p.in === type,\n ) ?? {\n name: key,\n in: type,\n };\n\n const encoder = getMediaEncoder(field, adapters);\n if (encoder) {\n if (type === 'query') result[type][key] = { values: [encoder(value)] };\n else result[type][key] = { value: encoder(value) };\n continue;\n }\n\n switch (type) {\n case 'path':\n serializePathParameter(field, value, result.path);\n break;\n case 'query':\n serializeQueryParameter(field, value, result.query);\n break;\n case 'header': {\n result.header[key] = {\n value: serializeSimple(value, field.explode ?? false),\n };\n break;\n }\n case 'cookie':\n serializeCookieParameter(field, value, result.cookie);\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction getMediaEncoder(\n field: NoReference<ParameterObject>,\n adapters: Record<string, MediaAdapter>,\n) {\n if (!field.content) return;\n\n for (const k in field.content) {\n const adapter = resolveMediaAdapter(k, adapters);\n if (adapter) {\n return (v: unknown) => String(adapter.encode({ body: v }));\n }\n }\n}\n\nfunction serializeSimple(value: NonNullable<unknown>, explode: boolean): string {\n if (Array.isArray(value)) {\n return value.join(',');\n }\n if (typeof value === 'object') {\n return explode\n ? Object.entries(value)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n : Object.entries(value).flat().join(',');\n }\n return String(value);\n}\n\nfunction serializePathParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameter>,\n): void {\n const { explode = false, name } = field;\n\n switch (field.style) {\n case 'label':\n if (Array.isArray(value)) {\n output[field.name!] = {\n value: '.' + value.join(explode ? '.' : ','),\n };\n break;\n }\n if (typeof value === 'object') {\n output[field.name!] = {\n value:\n '.' +\n (explode\n ? Object.entries(value)\n .map(([k, v]) => `${k}=${v}`)\n .join('.')\n : Object.entries(value).flat().join(',')),\n };\n break;\n }\n output[field.name!] = {\n value: `.${value}`,\n };\n break;\n case 'matrix': {\n const specifier = `;${name}=`;\n\n if (Array.isArray(value)) {\n output[field.name!] = {\n value: explode\n ? `${specifier}${value.join(',')}`\n : `${specifier}${value.join(specifier)}`,\n };\n break;\n }\n if (typeof value === 'object') {\n output[field.name!] = {\n value: explode\n ? Object.entries(value)\n .map(([k, v]) => `;${k}=${v}`)\n .join('')\n : specifier + Object.entries(value).flat().join(','),\n };\n break;\n }\n\n output[field.name!] = {\n value: `${specifier}${value}`,\n };\n break;\n }\n // simple\n default:\n output[field.name!] = {\n value: serializeSimple(value, explode),\n };\n }\n}\n\nfunction serializeQueryParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameterMultiple>,\n): void {\n const { style, explode = true } = field;\n\n if (style === 'spaceDelimited' && !explode && Array.isArray(value)) {\n output[field.name!] = {\n values: [value.join(' ')],\n };\n return;\n }\n\n if (style === 'pipeDelimited' && !explode && Array.isArray(value)) {\n output[field.name!] = {\n values: [value.join('|')],\n };\n return;\n }\n\n if (style === 'deepObject' && !Array.isArray(value) && typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n output[`${field.name}[${k}]`] = {\n // note: the behaviour of nested array is undefined, we do this to avoid edge cases\n values: Array.isArray(v) ? v : [String(v)],\n };\n }\n return;\n }\n\n if (Array.isArray(value)) {\n output[field.name!] = {\n values: explode ? value : [value.join(',')],\n };\n return;\n }\n\n if (typeof value === 'object' && explode) {\n for (const [k, v] of Object.entries(value)) {\n output[k] = {\n values: [String(v)],\n };\n }\n return;\n }\n\n if (typeof value === 'object') {\n output[field.name!] = {\n values: [Object.entries(value).flat().join(',')],\n };\n return;\n }\n\n output[field.name!] = {\n values: [String(value)],\n };\n}\n\nfunction serializeCookieParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameter>,\n) {\n const { explode = true } = field;\n\n // form\n if (Array.isArray(value)) {\n output[field.name!] = {\n value: explode ? value.map((v) => `${field.name}=${v}`).join('&') : value.join(','),\n };\n } else if (typeof value === 'object' && explode) {\n for (const [k, v] of Object.entries(value)) {\n output[k] = {\n value: String(v),\n };\n }\n } else if (typeof value === 'object') {\n output[field.name!] = {\n value: Object.entries(value).flat().join(','),\n };\n } else {\n output[field.name!] = {\n value: String(value),\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-adapter.js","names":[],"sources":["../../../src/requests/media/resolve-adapter.ts"],"sourcesContent":["import type { MediaAdapter } from './adapter';\n\nconst VariantMediaTypeRegex =\n /^(?<dir>[a-zA-Z0-9._-]+)\\/(?<content>[a-zA-Z0-9._-]+)\\+(?<variant>[a-zA-Z0-9._-]+)$/;\n\n/**\n * Resolve a media adapter for a given media type.\n * Supports exact matches and pattern matching (e.g., +json suffix).\n *\n * @param mediaType - The media type to resolve (e.g., \"application/json\", \"application/json-patch+json\")\n * @param adapters - Record of media adapters\n * @returns The resolved adapter or undefined if not found\n */\nexport function resolveMediaAdapter(\n mediaType: string,\n adapters: Record<string, MediaAdapter>,\n): MediaAdapter | undefined {\n // Normalize media type (remove parameters like charset)\n const normalized = mediaType.split(';', 2)[0].trim().toLowerCase();\n\n if (normalized in adapters) {\n return adapters[normalized];\n }\n\n const match = VariantMediaTypeRegex.exec(normalized);\n if (match?.groups) {\n const baseType = `${match.groups.dir}/${match.groups.variant}`;\n\n if (baseType in adapters) {\n return adapters[baseType];\n }\n }\n\n if (mediaType === 'text/plain') {\n console.warn(\n 'there is no defined behaviour for encoding form values into \"text/plain\", using JSON encoder for now.',\n );\n return adapters['application/json'];\n }\n}\n\n/**\n * Check if a media type is supported by the given adapters.\n *\n * @param mediaType - The media type to check\n * @param adapters - Record of media adapters\n * @returns true if the media type is supported\n */\nexport function isMediaTypeSupported(\n mediaType: string,\n adapters: Record<string, MediaAdapter>,\n): boolean {\n return resolveMediaAdapter(mediaType, adapters) !== undefined;\n}\n"],"mappings":";AAEA,MAAM,wBACJ;;;;;;;;;AAUF,SAAgB,oBACd,WACA,UAC0B;CAE1B,MAAM,aAAa,UAAU,MAAM,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,aAAa;AAElE,KAAI,cAAc,SAChB,QAAO,SAAS;CAGlB,MAAM,QAAQ,sBAAsB,KAAK,WAAW;AACpD,KAAI,OAAO,QAAQ;EACjB,MAAM,WAAW,GAAG,MAAM,OAAO,IAAI,GAAG,MAAM,OAAO;AAErD,MAAI,YAAY,SACd,QAAO,SAAS;;AAIpB,KAAI,cAAc,cAAc;AAC9B,UAAQ,KACN,0GACD;AACD,SAAO,SAAS;;;;;;;;;;AAWpB,SAAgB,qBACd,WACA,UACS;AACT,QAAO,oBAAoB,WAAW,SAAS,KAAK"}
|
|
@@ -0,0 +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 ident(code: string, tab: number = 1) {\n return code\n .split('\\n')\n .map((v) => ' '.repeat(tab) + 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,MAAM,MAAc,MAAc,GAAG;AACnD,QAAO,KACJ,MAAM,KAAK,CACX,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,EAAE,CAChC,KAAK,KAAK"}
|