@epcc-sdk/sdks-cart-checkout-order 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/client/mcp-support.gen.cjs +1 -1
- package/dist/client/mcp-support.gen.cjs.map +1 -1
- package/dist/client/mcp-support.gen.mjs +1 -1
- package/dist/client/mcp-support.gen.mjs.map +1 -1
- package/dist/client/mcp.gen.cjs +120 -120
- package/dist/client/mcp.gen.cjs.map +1 -1
- package/dist/client/mcp.gen.mjs +120 -120
- package/dist/client/mcp.gen.mjs.map +1 -1
- package/dist/mcp.d.cts +1744 -907
- package/dist/mcp.d.ts +1744 -907
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -184,8 +184,8 @@ const cart = zCartResponse.parse(data?.data[0]);
|
|
|
184
184
|
## MCP endpoint tools
|
|
185
185
|
|
|
186
186
|
The `/mcp` subpath turns each of the 60 cart, checkout and order operations into a Model Context
|
|
187
|
-
Protocol (MCP) tool. The main entry imports none of it. `zod` 4 and
|
|
188
|
-
needed only for this subpath.
|
|
187
|
+
Protocol (MCP) tool for MCP SDK v2. The main entry imports none of it. `zod` 4 and
|
|
188
|
+
`@modelcontextprotocol/server` 2 are needed only for this subpath.
|
|
189
189
|
|
|
190
190
|
Each operation has one tool factory, named after its function with `Tool` added, such as
|
|
191
191
|
`getCartsTool`. A factory returns `{ name, config, handler }`, the three arguments that
|
|
@@ -195,7 +195,7 @@ API error as an `isError` result and does not throw.
|
|
|
195
195
|
Register one tool:
|
|
196
196
|
|
|
197
197
|
```ts
|
|
198
|
-
import { McpServer } from "@modelcontextprotocol/
|
|
198
|
+
import { McpServer } from "@modelcontextprotocol/server"
|
|
199
199
|
import { getCartsTool } from "@epcc-sdk/sdks-cart-checkout-order/mcp"
|
|
200
200
|
|
|
201
201
|
const server = new McpServer({ name: "cart-checkout-order", version: "1.0.0" })
|
|
@@ -255,9 +255,9 @@ server.registerTool(
|
|
|
255
255
|
Wrap a handler. The arguments keep the operation's types:
|
|
256
256
|
|
|
257
257
|
```ts
|
|
258
|
-
server.registerTool(tool.name, tool.config, async (args,
|
|
258
|
+
server.registerTool(tool.name, tool.config, async (args, ctx) => {
|
|
259
259
|
console.log("listing carts", args.query)
|
|
260
|
-
return tool.handler(args,
|
|
260
|
+
return tool.handler(args, ctx)
|
|
261
261
|
})
|
|
262
262
|
```
|
|
263
263
|
Each tool is named `cart_checkout_order_<snake_case_function>`, and its arguments are grouped under
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/mcp-support.gen.ts"],"sourcesContent":["import type { ToolCallback } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport type { AnySchema } from \"@modelcontextprotocol/sdk/server/zod-compat.js\"\nimport type {\n CallToolResult,\n ToolAnnotations,\n} from \"@modelcontextprotocol/sdk/types.js\"\nimport * as z from \"zod\"\n\nexport type OperationMeta = {\n id: string\n method: string\n path: string\n risk: \"read\" | \"create\" | \"update\" | \"delete\"\n}\n\nexport type ToolConfig = {\n title?: string\n description?: string\n inputSchema: z.ZodObject<Record<string, z.ZodType<any>>>\n outputSchema?: AnySchema\n annotations?: ToolAnnotations\n _meta: {\n \"com.elasticpath/operation\": OperationMeta\n }\n}\n\nexport type Tool = {\n readonly name: string\n readonly config: ToolConfig\n readonly handler: ToolCallback<AnySchema>\n}\n\nconst messageOf = (error: unknown) =>\n error instanceof Error ? error.message : JSON.stringify(error)\n\nexport const toToolResult = async (\n request: Promise<{\n data?: unknown\n error?: unknown\n response?: Response\n }>,\n): Promise<CallToolResult> => {\n let text: string\n try {\n const result = await request\n if (result.error === undefined) {\n const structuredContent =\n typeof result.data === \"object\" &&\n result.data !== null &&\n !Array.isArray(result.data)\n ? (result.data as Record<string, unknown>)\n : { data: result.data ?? null }\n return {\n structuredContent,\n content: [{ type: \"text\", text: JSON.stringify(structuredContent) }],\n }\n }\n text = result.response\n ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}`\n : messageOf(result.error)\n } catch (error) {\n text = messageOf(error)\n }\n return { isError: true, content: [{ type: \"text\", text }] }\n}\n\nconst WRAPPER_TYPES = [\n \"optional\",\n \"nullable\",\n \"default\",\n \"readonly\",\n \"nonoptional\",\n \"catch\",\n \"prefault\",\n]\n\ntype LooseCopies = WeakMap<z.ZodType, z.ZodType>\n\nconst madeByLoose = new WeakSet<z.ZodType>()\n\nfunction shapeCopiedOnFirstRead(\n copies: LooseCopies,\n shape: Record<string, z.ZodType>,\n) {\n const copy: Record<string, z.ZodType> = {}\n for (const key of Object.keys(shape)) {\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n get() {\n const value = looseIn(copies, shape[key]!)\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value,\n })\n return value\n },\n })\n }\n return copy\n}\n\nfunction looseCopyOf<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n const def: any = schema._zod.def\n const copy = (changes: object): T =>\n schema.clone({ ...def, ...changes }, { parent: true })\n const looseChild = (child: z.ZodType) => looseIn(copies, child)\n if (def.type === \"object\") {\n return copy({\n catchall: z.unknown(),\n shape: shapeCopiedOnFirstRead(copies, def.shape),\n })\n }\n if (def.type === \"array\") {\n return copy({ element: looseChild(def.element) })\n }\n if (def.type === \"record\") {\n return copy({ valueType: looseChild(def.valueType) })\n }\n if (def.type === \"lazy\") {\n return copy({ getter: () => looseChild(def.getter()) })\n }\n if (WRAPPER_TYPES.includes(def.type)) {\n return copy({ innerType: looseChild(def.innerType) })\n }\n if (def.type === \"union\") {\n return copy({ options: def.options.map(looseChild) })\n }\n if (def.type === \"intersection\") {\n return copy({ left: looseChild(def.left), right: looseChild(def.right) })\n }\n return schema\n}\n\nfunction looseIn<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n if (madeByLoose.has(schema)) return schema\n const known = copies.get(schema)\n if (known) return known as T\n const copy = looseCopyOf(copies, schema)\n copies.set(schema, copy)\n if (copy !== schema) madeByLoose.add(copy)\n return copy\n}\n\nexport const loose = <T extends z.ZodType>(schema: T): T =>\n looseIn(new WeakMap(), schema)\n\nconst SHARED_SCHEMA_MIN_LENGTH = 1000\n\nfunction reachesFrom(schema: z.ZodType, name: string) {\n const def: any = schema._zod.def\n const reach = (child: z.ZodType): [string, z.ZodType] => [name, child]\n if (def.type === \"object\") {\n return Object.keys(def.shape).map((key): [string, z.ZodType] => [\n key,\n def.shape[key],\n ])\n }\n if (def.type === \"array\") return [reach(def.element)]\n if (def.type === \"record\") return [reach(def.valueType)]\n if (def.type === \"lazy\") return [reach(def.getter())]\n if (WRAPPER_TYPES.includes(def.type)) return [reach(def.innerType)]\n if (def.type === \"union\") {\n return def.options.map((option: z.ZodType) => reach(option))\n }\n if (def.type === \"intersection\") return [reach(def.left), reach(def.right)]\n return []\n}\n\nfunction reachedSchemas(input: z.ZodType) {\n const reached = new Map<z.ZodType, { name: string; count: number }>()\n const visit = (name: string, schema: z.ZodType) => {\n const seen = reached.get(schema)\n if (seen) {\n seen.count++\n return\n }\n reached.set(schema, { name, count: 1 })\n for (const [childName, child] of reachesFrom(schema, name)) {\n visit(childName, child)\n }\n }\n visit(\"input\", input)\n return reached\n}\n\nconst listedLengthOf = (schema: z.ZodType) =>\n JSON.stringify(\n z.toJSONSchema(schema, {\n io: \"input\",\n target: \"draft-7\",\n unrepresentable: \"any\",\n }),\n ).length\n\nfunction unusedIdFor(api: string, name: string) {\n const base = `${api}_${name.replace(/[^A-Za-z0-9_]/g, \"_\")}`\n let id = base\n for (let suffix = 2; z.globalRegistry._idmap.has(id); suffix++) {\n id = `${base}_${suffix}`\n }\n return id\n}\n\nexport const withSharedSchemaIds = <T extends z.ZodType>(\n api: string,\n input: T,\n): T => {\n const candidates = [...reachedSchemas(input)]\n .filter(\n ([schema, { count }]) =>\n count > 1 && madeByLoose.has(schema) && !z.globalRegistry.has(schema),\n )\n .map(([schema, { name }]) => ({\n schema,\n name,\n length: listedLengthOf(schema),\n }))\n .filter(({ length }) => length >= SHARED_SCHEMA_MIN_LENGTH)\n .sort((a, b) => b.length - a.length)\n let inputLength = listedLengthOf(input)\n for (const { schema, name } of candidates) {\n z.globalRegistry.add(schema, {\n ...z.globalRegistry.get(schema),\n id: unusedIdFor(api, name),\n })\n const lengthWithId = listedLengthOf(input)\n if (lengthWithId < inputLength) {\n inputLength = lengthWithId\n } else {\n z.globalRegistry.remove(schema)\n }\n }\n return input\n}\n\ntype FileNameFields<K extends string> = {\n [P in `${K}_name`]: z.ZodOptional<z.ZodString>\n}\n\nexport const dataUriFields = <\n S extends z.ZodRawShape,\n C extends z.core.$ZodObjectConfig,\n K extends string,\n>(\n schema: z.ZodObject<S, C>,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C> =>\n schema.extend(\n Object.fromEntries(\n fields.flatMap((field) => {\n const current = schema.shape[field] as unknown as z.ZodType\n const uri = z.string().meta({\n format: \"uri\",\n \"x-mcp-file\": { maxSize: maxBytes },\n description: [\n current.description,\n `Send the file as a data: URI, such as data:text/csv;base64,<base64 bytes>, at most ${maxBytes} bytes once decoded.`,\n ]\n .filter(Boolean)\n .join(\" \"),\n })\n const name = z\n .string()\n .meta({\n description: `The name of the file sent in ${field}, such as products.csv.`,\n })\n .optional()\n return [\n [field, current.isOptional() ? uri.optional() : uri],\n [`${field}_name`, name],\n ]\n }),\n ),\n ) as unknown as z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C>\n\ntype DataUrisDecoded<T, K extends string> = T extends object\n ? Omit<T, K | `${K}_name`> & {\n [P in K & keyof T]: undefined extends T[P] ? File | undefined : File\n }\n : T\n\nconst DATA_URI = /^data:([^,]*),(.*)$/is\nconst PERCENT_ENCODED = /^[0-9a-f]{2}$/i\n\nconst notADataUriError = (field: string) =>\n new Error(\n `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`,\n )\n\nconst fileTooBigError = (field: string, bytes: number, maxBytes: number) =>\n new Error(\n `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`,\n )\n\nfunction percentDecoded(field: string, text: string) {\n const bytes: number[] = []\n const encoder = new TextEncoder()\n for (let index = 0; index < text.length; index++) {\n if (text[index] === \"%\") {\n const hex = text.slice(index + 1, index + 3)\n if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field)\n bytes.push(parseInt(hex, 16))\n index += 2\n } else {\n const codePoint = text.codePointAt(index)!\n const character = String.fromCodePoint(codePoint)\n bytes.push(...encoder.encode(character))\n index += character.length - 1\n }\n }\n return new Uint8Array(bytes)\n}\n\nfunction base64Decoded(field: string, text: string, maxBytes: number) {\n const data = text.replace(/\\s/g, \"\")\n const padding = data.endsWith(\"==\") ? 2 : data.endsWith(\"=\") ? 1 : 0\n const bytes = Math.floor((data.length * 3) / 4) - padding\n if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes)\n let binary: string\n try {\n binary = atob(data)\n } catch {\n throw new Error(`${field} is not valid base64`)\n }\n return Uint8Array.from(binary, (character) => character.charCodeAt(0))\n}\n\nfunction fileFromDataUri(\n field: string,\n uri: unknown,\n maxBytes: number,\n givenName: unknown,\n) {\n const match = typeof uri === \"string\" ? DATA_URI.exec(uri) : null\n if (!match) throw notADataUriError(field)\n const parameters = match[1]!.split(\";\")\n const isBase64 = parameters.at(-1)!.toLowerCase() === \"base64\"\n if (isBase64) parameters.pop()\n const mediaType = parameters.shift()!.trim()\n const nameParameter = parameters.find((parameter) =>\n parameter.trim().toLowerCase().startsWith(\"name=\"),\n )\n let name = field\n if (typeof givenName === \"string\" && givenName.trim()) {\n name = givenName.trim()\n } else if (nameParameter) {\n try {\n name = decodeURIComponent(nameParameter.trim().slice(\"name=\".length))\n } catch {\n throw notADataUriError(field)\n }\n }\n const bytes = isBase64\n ? base64Decoded(field, match[2]!, maxBytes)\n : percentDecoded(field, match[2]!)\n if (bytes.length > maxBytes)\n throw fileTooBigError(field, bytes.length, maxBytes)\n return new File([bytes], name, {\n type: mediaType.includes(\"/\") ? mediaType : \"text/plain\",\n })\n}\n\nexport const decodeDataUris = async <T, K extends string>(\n body: T,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): Promise<DataUrisDecoded<T, K>> => {\n if (typeof body !== \"object\" || body === null) {\n return body as DataUrisDecoded<T, K>\n }\n const decoded = { ...body } as Record<string, unknown>\n for (const field of fields) {\n const givenName = decoded[`${field}_name`]\n delete decoded[`${field}_name`]\n if (decoded[field] !== undefined) {\n decoded[field] = fileFromDataUri(\n field,\n decoded[field],\n maxBytes,\n givenName,\n )\n }\n }\n return decoded as DataUrisDecoded<T, K>\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/mcp-support.gen.ts"],"sourcesContent":["import type {\n CallToolResult,\n StandardSchemaWithJSON,\n ToolAnnotations,\n ToolCallback,\n} from \"@modelcontextprotocol/server\"\nimport * as z from \"zod\"\n\nexport type OperationMeta = {\n id: string\n method: string\n path: string\n risk: \"read\" | \"create\" | \"update\" | \"delete\"\n}\n\nexport type ToolConfig = {\n title?: string\n description?: string\n inputSchema: z.ZodObject<Record<string, z.ZodType<any>>>\n outputSchema?: StandardSchemaWithJSON\n annotations?: ToolAnnotations\n _meta: {\n \"com.elasticpath/operation\": OperationMeta\n }\n}\n\nexport type Tool = {\n readonly name: string\n readonly config: ToolConfig\n readonly handler: ToolCallback<StandardSchemaWithJSON<any>>\n}\n\nconst messageOf = (error: unknown) =>\n error instanceof Error ? error.message : JSON.stringify(error)\n\nexport const toToolResult = async (\n request: Promise<{\n data?: unknown\n error?: unknown\n response?: Response\n }>,\n): Promise<CallToolResult> => {\n let text: string\n try {\n const result = await request\n if (result.error === undefined) {\n const structuredContent =\n typeof result.data === \"object\" &&\n result.data !== null &&\n !Array.isArray(result.data)\n ? (result.data as Record<string, unknown>)\n : { data: result.data ?? null }\n return {\n structuredContent,\n content: [{ type: \"text\", text: JSON.stringify(structuredContent) }],\n }\n }\n text = result.response\n ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}`\n : messageOf(result.error)\n } catch (error) {\n text = messageOf(error)\n }\n return { isError: true, content: [{ type: \"text\", text }] }\n}\n\nconst WRAPPER_TYPES = [\n \"optional\",\n \"nullable\",\n \"default\",\n \"readonly\",\n \"nonoptional\",\n \"catch\",\n \"prefault\",\n]\n\ntype LooseCopies = WeakMap<z.ZodType, z.ZodType>\n\nconst madeByLoose = new WeakSet<z.ZodType>()\n\nfunction shapeCopiedOnFirstRead(\n copies: LooseCopies,\n shape: Record<string, z.ZodType>,\n) {\n const copy: Record<string, z.ZodType> = {}\n for (const key of Object.keys(shape)) {\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n get() {\n const value = looseIn(copies, shape[key]!)\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value,\n })\n return value\n },\n })\n }\n return copy\n}\n\nfunction looseCopyOf<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n const def: any = schema._zod.def\n const copy = (changes: object): T =>\n schema.clone({ ...def, ...changes }, { parent: true })\n const looseChild = (child: z.ZodType) => looseIn(copies, child)\n if (def.type === \"object\") {\n return copy({\n catchall: z.unknown(),\n shape: shapeCopiedOnFirstRead(copies, def.shape),\n })\n }\n if (def.type === \"array\") {\n return copy({ element: looseChild(def.element) })\n }\n if (def.type === \"record\") {\n return copy({ valueType: looseChild(def.valueType) })\n }\n if (def.type === \"lazy\") {\n return copy({ getter: () => looseChild(def.getter()) })\n }\n if (WRAPPER_TYPES.includes(def.type)) {\n return copy({ innerType: looseChild(def.innerType) })\n }\n if (def.type === \"union\") {\n return copy({ options: def.options.map(looseChild) })\n }\n if (def.type === \"intersection\") {\n return copy({ left: looseChild(def.left), right: looseChild(def.right) })\n }\n return schema\n}\n\nfunction looseIn<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n if (madeByLoose.has(schema)) return schema\n const known = copies.get(schema)\n if (known) return known as T\n const copy = looseCopyOf(copies, schema)\n copies.set(schema, copy)\n if (copy !== schema) madeByLoose.add(copy)\n return copy\n}\n\nexport const loose = <T extends z.ZodType>(schema: T): T =>\n looseIn(new WeakMap(), schema)\n\nconst SHARED_SCHEMA_MIN_LENGTH = 1000\n\nfunction reachesFrom(schema: z.ZodType, name: string) {\n const def: any = schema._zod.def\n const reach = (child: z.ZodType): [string, z.ZodType] => [name, child]\n if (def.type === \"object\") {\n return Object.keys(def.shape).map((key): [string, z.ZodType] => [\n key,\n def.shape[key],\n ])\n }\n if (def.type === \"array\") return [reach(def.element)]\n if (def.type === \"record\") return [reach(def.valueType)]\n if (def.type === \"lazy\") return [reach(def.getter())]\n if (WRAPPER_TYPES.includes(def.type)) return [reach(def.innerType)]\n if (def.type === \"union\") {\n return def.options.map((option: z.ZodType) => reach(option))\n }\n if (def.type === \"intersection\") return [reach(def.left), reach(def.right)]\n return []\n}\n\nfunction reachedSchemas(input: z.ZodType) {\n const reached = new Map<z.ZodType, { name: string; count: number }>()\n const visit = (name: string, schema: z.ZodType) => {\n const seen = reached.get(schema)\n if (seen) {\n seen.count++\n return\n }\n reached.set(schema, { name, count: 1 })\n for (const [childName, child] of reachesFrom(schema, name)) {\n visit(childName, child)\n }\n }\n visit(\"input\", input)\n return reached\n}\n\nconst listedLengthOf = (schema: z.ZodType) =>\n JSON.stringify(\n z.toJSONSchema(schema, {\n io: \"input\",\n target: \"draft-2020-12\",\n unrepresentable: \"any\",\n }),\n ).length\n\nfunction unusedIdFor(api: string, name: string) {\n const base = `${api}_${name.replace(/[^A-Za-z0-9_]/g, \"_\")}`\n let id = base\n for (let suffix = 2; z.globalRegistry._idmap.has(id); suffix++) {\n id = `${base}_${suffix}`\n }\n return id\n}\n\nexport const withSharedSchemaIds = <T extends z.ZodType>(\n api: string,\n input: T,\n): T => {\n const candidates = [...reachedSchemas(input)]\n .filter(\n ([schema, { count }]) =>\n count > 1 && madeByLoose.has(schema) && !z.globalRegistry.has(schema),\n )\n .map(([schema, { name }]) => ({\n schema,\n name,\n length: listedLengthOf(schema),\n }))\n .filter(({ length }) => length >= SHARED_SCHEMA_MIN_LENGTH)\n .sort((a, b) => b.length - a.length)\n let inputLength = listedLengthOf(input)\n for (const { schema, name } of candidates) {\n z.globalRegistry.add(schema, {\n ...z.globalRegistry.get(schema),\n id: unusedIdFor(api, name),\n })\n const lengthWithId = listedLengthOf(input)\n if (lengthWithId < inputLength) {\n inputLength = lengthWithId\n } else {\n z.globalRegistry.remove(schema)\n }\n }\n return input\n}\n\ntype FileNameFields<K extends string> = {\n [P in `${K}_name`]: z.ZodOptional<z.ZodString>\n}\n\nexport const dataUriFields = <\n S extends z.ZodRawShape,\n C extends z.core.$ZodObjectConfig,\n K extends string,\n>(\n schema: z.ZodObject<S, C>,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C> =>\n schema.extend(\n Object.fromEntries(\n fields.flatMap((field) => {\n const current = schema.shape[field] as unknown as z.ZodType\n const uri = z.string().meta({\n format: \"uri\",\n \"x-mcp-file\": { maxSize: maxBytes },\n description: [\n current.description,\n `Send the file as a data: URI, such as data:text/csv;base64,<base64 bytes>, at most ${maxBytes} bytes once decoded.`,\n ]\n .filter(Boolean)\n .join(\" \"),\n })\n const name = z\n .string()\n .meta({\n description: `The name of the file sent in ${field}, such as products.csv.`,\n })\n .optional()\n return [\n [field, current.isOptional() ? uri.optional() : uri],\n [`${field}_name`, name],\n ]\n }),\n ),\n ) as unknown as z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C>\n\ntype DataUrisDecoded<T, K extends string> = T extends object\n ? Omit<T, K | `${K}_name`> & {\n [P in K & keyof T]: undefined extends T[P] ? File | undefined : File\n }\n : T\n\nconst DATA_URI = /^data:([^,]*),(.*)$/is\nconst PERCENT_ENCODED = /^[0-9a-f]{2}$/i\n\nconst notADataUriError = (field: string) =>\n new Error(\n `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`,\n )\n\nconst fileTooBigError = (field: string, bytes: number, maxBytes: number) =>\n new Error(\n `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`,\n )\n\nfunction percentDecoded(field: string, text: string) {\n const bytes: number[] = []\n const encoder = new TextEncoder()\n for (let index = 0; index < text.length; index++) {\n if (text[index] === \"%\") {\n const hex = text.slice(index + 1, index + 3)\n if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field)\n bytes.push(parseInt(hex, 16))\n index += 2\n } else {\n const codePoint = text.codePointAt(index)!\n const character = String.fromCodePoint(codePoint)\n bytes.push(...encoder.encode(character))\n index += character.length - 1\n }\n }\n return new Uint8Array(bytes)\n}\n\nfunction base64Decoded(field: string, text: string, maxBytes: number) {\n const data = text.replace(/\\s/g, \"\")\n const padding = data.endsWith(\"==\") ? 2 : data.endsWith(\"=\") ? 1 : 0\n const bytes = Math.floor((data.length * 3) / 4) - padding\n if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes)\n let binary: string\n try {\n binary = atob(data)\n } catch {\n throw new Error(`${field} is not valid base64`)\n }\n return Uint8Array.from(binary, (character) => character.charCodeAt(0))\n}\n\nfunction fileFromDataUri(\n field: string,\n uri: unknown,\n maxBytes: number,\n givenName: unknown,\n) {\n const match = typeof uri === \"string\" ? DATA_URI.exec(uri) : null\n if (!match) throw notADataUriError(field)\n const parameters = match[1]!.split(\";\")\n const isBase64 = parameters.at(-1)!.toLowerCase() === \"base64\"\n if (isBase64) parameters.pop()\n const mediaType = parameters.shift()!.trim()\n const nameParameter = parameters.find((parameter) =>\n parameter.trim().toLowerCase().startsWith(\"name=\"),\n )\n let name = field\n if (typeof givenName === \"string\" && givenName.trim()) {\n name = givenName.trim()\n } else if (nameParameter) {\n try {\n name = decodeURIComponent(nameParameter.trim().slice(\"name=\".length))\n } catch {\n throw notADataUriError(field)\n }\n }\n const bytes = isBase64\n ? base64Decoded(field, match[2]!, maxBytes)\n : percentDecoded(field, match[2]!)\n if (bytes.length > maxBytes)\n throw fileTooBigError(field, bytes.length, maxBytes)\n return new File([bytes], name, {\n type: mediaType.includes(\"/\") ? mediaType : \"text/plain\",\n })\n}\n\nexport const decodeDataUris = async <T, K extends string>(\n body: T,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): Promise<DataUrisDecoded<T, K>> => {\n if (typeof body !== \"object\" || body === null) {\n return body as DataUrisDecoded<T, K>\n }\n const decoded = { ...body } as Record<string, unknown>\n for (const field of fields) {\n const givenName = decoded[`${field}_name`]\n delete decoded[`${field}_name`]\n if (decoded[field] !== undefined) {\n decoded[field] = fileFromDataUri(\n field,\n decoded[field],\n maxBytes,\n givenName,\n )\n }\n }\n return decoded as DataUrisDecoded<T, K>\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/mcp-support.gen.ts"],"sourcesContent":["import type { ToolCallback } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport type { AnySchema } from \"@modelcontextprotocol/sdk/server/zod-compat.js\"\nimport type {\n CallToolResult,\n ToolAnnotations,\n} from \"@modelcontextprotocol/sdk/types.js\"\nimport * as z from \"zod\"\n\nexport type OperationMeta = {\n id: string\n method: string\n path: string\n risk: \"read\" | \"create\" | \"update\" | \"delete\"\n}\n\nexport type ToolConfig = {\n title?: string\n description?: string\n inputSchema: z.ZodObject<Record<string, z.ZodType<any>>>\n outputSchema?: AnySchema\n annotations?: ToolAnnotations\n _meta: {\n \"com.elasticpath/operation\": OperationMeta\n }\n}\n\nexport type Tool = {\n readonly name: string\n readonly config: ToolConfig\n readonly handler: ToolCallback<AnySchema>\n}\n\nconst messageOf = (error: unknown) =>\n error instanceof Error ? error.message : JSON.stringify(error)\n\nexport const toToolResult = async (\n request: Promise<{\n data?: unknown\n error?: unknown\n response?: Response\n }>,\n): Promise<CallToolResult> => {\n let text: string\n try {\n const result = await request\n if (result.error === undefined) {\n const structuredContent =\n typeof result.data === \"object\" &&\n result.data !== null &&\n !Array.isArray(result.data)\n ? (result.data as Record<string, unknown>)\n : { data: result.data ?? null }\n return {\n structuredContent,\n content: [{ type: \"text\", text: JSON.stringify(structuredContent) }],\n }\n }\n text = result.response\n ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}`\n : messageOf(result.error)\n } catch (error) {\n text = messageOf(error)\n }\n return { isError: true, content: [{ type: \"text\", text }] }\n}\n\nconst WRAPPER_TYPES = [\n \"optional\",\n \"nullable\",\n \"default\",\n \"readonly\",\n \"nonoptional\",\n \"catch\",\n \"prefault\",\n]\n\ntype LooseCopies = WeakMap<z.ZodType, z.ZodType>\n\nconst madeByLoose = new WeakSet<z.ZodType>()\n\nfunction shapeCopiedOnFirstRead(\n copies: LooseCopies,\n shape: Record<string, z.ZodType>,\n) {\n const copy: Record<string, z.ZodType> = {}\n for (const key of Object.keys(shape)) {\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n get() {\n const value = looseIn(copies, shape[key]!)\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value,\n })\n return value\n },\n })\n }\n return copy\n}\n\nfunction looseCopyOf<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n const def: any = schema._zod.def\n const copy = (changes: object): T =>\n schema.clone({ ...def, ...changes }, { parent: true })\n const looseChild = (child: z.ZodType) => looseIn(copies, child)\n if (def.type === \"object\") {\n return copy({\n catchall: z.unknown(),\n shape: shapeCopiedOnFirstRead(copies, def.shape),\n })\n }\n if (def.type === \"array\") {\n return copy({ element: looseChild(def.element) })\n }\n if (def.type === \"record\") {\n return copy({ valueType: looseChild(def.valueType) })\n }\n if (def.type === \"lazy\") {\n return copy({ getter: () => looseChild(def.getter()) })\n }\n if (WRAPPER_TYPES.includes(def.type)) {\n return copy({ innerType: looseChild(def.innerType) })\n }\n if (def.type === \"union\") {\n return copy({ options: def.options.map(looseChild) })\n }\n if (def.type === \"intersection\") {\n return copy({ left: looseChild(def.left), right: looseChild(def.right) })\n }\n return schema\n}\n\nfunction looseIn<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n if (madeByLoose.has(schema)) return schema\n const known = copies.get(schema)\n if (known) return known as T\n const copy = looseCopyOf(copies, schema)\n copies.set(schema, copy)\n if (copy !== schema) madeByLoose.add(copy)\n return copy\n}\n\nexport const loose = <T extends z.ZodType>(schema: T): T =>\n looseIn(new WeakMap(), schema)\n\nconst SHARED_SCHEMA_MIN_LENGTH = 1000\n\nfunction reachesFrom(schema: z.ZodType, name: string) {\n const def: any = schema._zod.def\n const reach = (child: z.ZodType): [string, z.ZodType] => [name, child]\n if (def.type === \"object\") {\n return Object.keys(def.shape).map((key): [string, z.ZodType] => [\n key,\n def.shape[key],\n ])\n }\n if (def.type === \"array\") return [reach(def.element)]\n if (def.type === \"record\") return [reach(def.valueType)]\n if (def.type === \"lazy\") return [reach(def.getter())]\n if (WRAPPER_TYPES.includes(def.type)) return [reach(def.innerType)]\n if (def.type === \"union\") {\n return def.options.map((option: z.ZodType) => reach(option))\n }\n if (def.type === \"intersection\") return [reach(def.left), reach(def.right)]\n return []\n}\n\nfunction reachedSchemas(input: z.ZodType) {\n const reached = new Map<z.ZodType, { name: string; count: number }>()\n const visit = (name: string, schema: z.ZodType) => {\n const seen = reached.get(schema)\n if (seen) {\n seen.count++\n return\n }\n reached.set(schema, { name, count: 1 })\n for (const [childName, child] of reachesFrom(schema, name)) {\n visit(childName, child)\n }\n }\n visit(\"input\", input)\n return reached\n}\n\nconst listedLengthOf = (schema: z.ZodType) =>\n JSON.stringify(\n z.toJSONSchema(schema, {\n io: \"input\",\n target: \"draft-7\",\n unrepresentable: \"any\",\n }),\n ).length\n\nfunction unusedIdFor(api: string, name: string) {\n const base = `${api}_${name.replace(/[^A-Za-z0-9_]/g, \"_\")}`\n let id = base\n for (let suffix = 2; z.globalRegistry._idmap.has(id); suffix++) {\n id = `${base}_${suffix}`\n }\n return id\n}\n\nexport const withSharedSchemaIds = <T extends z.ZodType>(\n api: string,\n input: T,\n): T => {\n const candidates = [...reachedSchemas(input)]\n .filter(\n ([schema, { count }]) =>\n count > 1 && madeByLoose.has(schema) && !z.globalRegistry.has(schema),\n )\n .map(([schema, { name }]) => ({\n schema,\n name,\n length: listedLengthOf(schema),\n }))\n .filter(({ length }) => length >= SHARED_SCHEMA_MIN_LENGTH)\n .sort((a, b) => b.length - a.length)\n let inputLength = listedLengthOf(input)\n for (const { schema, name } of candidates) {\n z.globalRegistry.add(schema, {\n ...z.globalRegistry.get(schema),\n id: unusedIdFor(api, name),\n })\n const lengthWithId = listedLengthOf(input)\n if (lengthWithId < inputLength) {\n inputLength = lengthWithId\n } else {\n z.globalRegistry.remove(schema)\n }\n }\n return input\n}\n\ntype FileNameFields<K extends string> = {\n [P in `${K}_name`]: z.ZodOptional<z.ZodString>\n}\n\nexport const dataUriFields = <\n S extends z.ZodRawShape,\n C extends z.core.$ZodObjectConfig,\n K extends string,\n>(\n schema: z.ZodObject<S, C>,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C> =>\n schema.extend(\n Object.fromEntries(\n fields.flatMap((field) => {\n const current = schema.shape[field] as unknown as z.ZodType\n const uri = z.string().meta({\n format: \"uri\",\n \"x-mcp-file\": { maxSize: maxBytes },\n description: [\n current.description,\n `Send the file as a data: URI, such as data:text/csv;base64,<base64 bytes>, at most ${maxBytes} bytes once decoded.`,\n ]\n .filter(Boolean)\n .join(\" \"),\n })\n const name = z\n .string()\n .meta({\n description: `The name of the file sent in ${field}, such as products.csv.`,\n })\n .optional()\n return [\n [field, current.isOptional() ? uri.optional() : uri],\n [`${field}_name`, name],\n ]\n }),\n ),\n ) as unknown as z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C>\n\ntype DataUrisDecoded<T, K extends string> = T extends object\n ? Omit<T, K | `${K}_name`> & {\n [P in K & keyof T]: undefined extends T[P] ? File | undefined : File\n }\n : T\n\nconst DATA_URI = /^data:([^,]*),(.*)$/is\nconst PERCENT_ENCODED = /^[0-9a-f]{2}$/i\n\nconst notADataUriError = (field: string) =>\n new Error(\n `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`,\n )\n\nconst fileTooBigError = (field: string, bytes: number, maxBytes: number) =>\n new Error(\n `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`,\n )\n\nfunction percentDecoded(field: string, text: string) {\n const bytes: number[] = []\n const encoder = new TextEncoder()\n for (let index = 0; index < text.length; index++) {\n if (text[index] === \"%\") {\n const hex = text.slice(index + 1, index + 3)\n if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field)\n bytes.push(parseInt(hex, 16))\n index += 2\n } else {\n const codePoint = text.codePointAt(index)!\n const character = String.fromCodePoint(codePoint)\n bytes.push(...encoder.encode(character))\n index += character.length - 1\n }\n }\n return new Uint8Array(bytes)\n}\n\nfunction base64Decoded(field: string, text: string, maxBytes: number) {\n const data = text.replace(/\\s/g, \"\")\n const padding = data.endsWith(\"==\") ? 2 : data.endsWith(\"=\") ? 1 : 0\n const bytes = Math.floor((data.length * 3) / 4) - padding\n if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes)\n let binary: string\n try {\n binary = atob(data)\n } catch {\n throw new Error(`${field} is not valid base64`)\n }\n return Uint8Array.from(binary, (character) => character.charCodeAt(0))\n}\n\nfunction fileFromDataUri(\n field: string,\n uri: unknown,\n maxBytes: number,\n givenName: unknown,\n) {\n const match = typeof uri === \"string\" ? DATA_URI.exec(uri) : null\n if (!match) throw notADataUriError(field)\n const parameters = match[1]!.split(\";\")\n const isBase64 = parameters.at(-1)!.toLowerCase() === \"base64\"\n if (isBase64) parameters.pop()\n const mediaType = parameters.shift()!.trim()\n const nameParameter = parameters.find((parameter) =>\n parameter.trim().toLowerCase().startsWith(\"name=\"),\n )\n let name = field\n if (typeof givenName === \"string\" && givenName.trim()) {\n name = givenName.trim()\n } else if (nameParameter) {\n try {\n name = decodeURIComponent(nameParameter.trim().slice(\"name=\".length))\n } catch {\n throw notADataUriError(field)\n }\n }\n const bytes = isBase64\n ? base64Decoded(field, match[2]!, maxBytes)\n : percentDecoded(field, match[2]!)\n if (bytes.length > maxBytes)\n throw fileTooBigError(field, bytes.length, maxBytes)\n return new File([bytes], name, {\n type: mediaType.includes(\"/\") ? mediaType : \"text/plain\",\n })\n}\n\nexport const decodeDataUris = async <T, K extends string>(\n body: T,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): Promise<DataUrisDecoded<T, K>> => {\n if (typeof body !== \"object\" || body === null) {\n return body as DataUrisDecoded<T, K>\n }\n const decoded = { ...body } as Record<string, unknown>\n for (const field of fields) {\n const givenName = decoded[`${field}_name`]\n delete decoded[`${field}_name`]\n if (decoded[field] !== undefined) {\n decoded[field] = fileFromDataUri(\n field,\n decoded[field],\n maxBytes,\n givenName,\n )\n }\n }\n return decoded as DataUrisDecoded<T, K>\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/mcp-support.gen.ts"],"sourcesContent":["import type {\n CallToolResult,\n StandardSchemaWithJSON,\n ToolAnnotations,\n ToolCallback,\n} from \"@modelcontextprotocol/server\"\nimport * as z from \"zod\"\n\nexport type OperationMeta = {\n id: string\n method: string\n path: string\n risk: \"read\" | \"create\" | \"update\" | \"delete\"\n}\n\nexport type ToolConfig = {\n title?: string\n description?: string\n inputSchema: z.ZodObject<Record<string, z.ZodType<any>>>\n outputSchema?: StandardSchemaWithJSON\n annotations?: ToolAnnotations\n _meta: {\n \"com.elasticpath/operation\": OperationMeta\n }\n}\n\nexport type Tool = {\n readonly name: string\n readonly config: ToolConfig\n readonly handler: ToolCallback<StandardSchemaWithJSON<any>>\n}\n\nconst messageOf = (error: unknown) =>\n error instanceof Error ? error.message : JSON.stringify(error)\n\nexport const toToolResult = async (\n request: Promise<{\n data?: unknown\n error?: unknown\n response?: Response\n }>,\n): Promise<CallToolResult> => {\n let text: string\n try {\n const result = await request\n if (result.error === undefined) {\n const structuredContent =\n typeof result.data === \"object\" &&\n result.data !== null &&\n !Array.isArray(result.data)\n ? (result.data as Record<string, unknown>)\n : { data: result.data ?? null }\n return {\n structuredContent,\n content: [{ type: \"text\", text: JSON.stringify(structuredContent) }],\n }\n }\n text = result.response\n ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}`\n : messageOf(result.error)\n } catch (error) {\n text = messageOf(error)\n }\n return { isError: true, content: [{ type: \"text\", text }] }\n}\n\nconst WRAPPER_TYPES = [\n \"optional\",\n \"nullable\",\n \"default\",\n \"readonly\",\n \"nonoptional\",\n \"catch\",\n \"prefault\",\n]\n\ntype LooseCopies = WeakMap<z.ZodType, z.ZodType>\n\nconst madeByLoose = new WeakSet<z.ZodType>()\n\nfunction shapeCopiedOnFirstRead(\n copies: LooseCopies,\n shape: Record<string, z.ZodType>,\n) {\n const copy: Record<string, z.ZodType> = {}\n for (const key of Object.keys(shape)) {\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n get() {\n const value = looseIn(copies, shape[key]!)\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value,\n })\n return value\n },\n })\n }\n return copy\n}\n\nfunction looseCopyOf<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n const def: any = schema._zod.def\n const copy = (changes: object): T =>\n schema.clone({ ...def, ...changes }, { parent: true })\n const looseChild = (child: z.ZodType) => looseIn(copies, child)\n if (def.type === \"object\") {\n return copy({\n catchall: z.unknown(),\n shape: shapeCopiedOnFirstRead(copies, def.shape),\n })\n }\n if (def.type === \"array\") {\n return copy({ element: looseChild(def.element) })\n }\n if (def.type === \"record\") {\n return copy({ valueType: looseChild(def.valueType) })\n }\n if (def.type === \"lazy\") {\n return copy({ getter: () => looseChild(def.getter()) })\n }\n if (WRAPPER_TYPES.includes(def.type)) {\n return copy({ innerType: looseChild(def.innerType) })\n }\n if (def.type === \"union\") {\n return copy({ options: def.options.map(looseChild) })\n }\n if (def.type === \"intersection\") {\n return copy({ left: looseChild(def.left), right: looseChild(def.right) })\n }\n return schema\n}\n\nfunction looseIn<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n if (madeByLoose.has(schema)) return schema\n const known = copies.get(schema)\n if (known) return known as T\n const copy = looseCopyOf(copies, schema)\n copies.set(schema, copy)\n if (copy !== schema) madeByLoose.add(copy)\n return copy\n}\n\nexport const loose = <T extends z.ZodType>(schema: T): T =>\n looseIn(new WeakMap(), schema)\n\nconst SHARED_SCHEMA_MIN_LENGTH = 1000\n\nfunction reachesFrom(schema: z.ZodType, name: string) {\n const def: any = schema._zod.def\n const reach = (child: z.ZodType): [string, z.ZodType] => [name, child]\n if (def.type === \"object\") {\n return Object.keys(def.shape).map((key): [string, z.ZodType] => [\n key,\n def.shape[key],\n ])\n }\n if (def.type === \"array\") return [reach(def.element)]\n if (def.type === \"record\") return [reach(def.valueType)]\n if (def.type === \"lazy\") return [reach(def.getter())]\n if (WRAPPER_TYPES.includes(def.type)) return [reach(def.innerType)]\n if (def.type === \"union\") {\n return def.options.map((option: z.ZodType) => reach(option))\n }\n if (def.type === \"intersection\") return [reach(def.left), reach(def.right)]\n return []\n}\n\nfunction reachedSchemas(input: z.ZodType) {\n const reached = new Map<z.ZodType, { name: string; count: number }>()\n const visit = (name: string, schema: z.ZodType) => {\n const seen = reached.get(schema)\n if (seen) {\n seen.count++\n return\n }\n reached.set(schema, { name, count: 1 })\n for (const [childName, child] of reachesFrom(schema, name)) {\n visit(childName, child)\n }\n }\n visit(\"input\", input)\n return reached\n}\n\nconst listedLengthOf = (schema: z.ZodType) =>\n JSON.stringify(\n z.toJSONSchema(schema, {\n io: \"input\",\n target: \"draft-2020-12\",\n unrepresentable: \"any\",\n }),\n ).length\n\nfunction unusedIdFor(api: string, name: string) {\n const base = `${api}_${name.replace(/[^A-Za-z0-9_]/g, \"_\")}`\n let id = base\n for (let suffix = 2; z.globalRegistry._idmap.has(id); suffix++) {\n id = `${base}_${suffix}`\n }\n return id\n}\n\nexport const withSharedSchemaIds = <T extends z.ZodType>(\n api: string,\n input: T,\n): T => {\n const candidates = [...reachedSchemas(input)]\n .filter(\n ([schema, { count }]) =>\n count > 1 && madeByLoose.has(schema) && !z.globalRegistry.has(schema),\n )\n .map(([schema, { name }]) => ({\n schema,\n name,\n length: listedLengthOf(schema),\n }))\n .filter(({ length }) => length >= SHARED_SCHEMA_MIN_LENGTH)\n .sort((a, b) => b.length - a.length)\n let inputLength = listedLengthOf(input)\n for (const { schema, name } of candidates) {\n z.globalRegistry.add(schema, {\n ...z.globalRegistry.get(schema),\n id: unusedIdFor(api, name),\n })\n const lengthWithId = listedLengthOf(input)\n if (lengthWithId < inputLength) {\n inputLength = lengthWithId\n } else {\n z.globalRegistry.remove(schema)\n }\n }\n return input\n}\n\ntype FileNameFields<K extends string> = {\n [P in `${K}_name`]: z.ZodOptional<z.ZodString>\n}\n\nexport const dataUriFields = <\n S extends z.ZodRawShape,\n C extends z.core.$ZodObjectConfig,\n K extends string,\n>(\n schema: z.ZodObject<S, C>,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C> =>\n schema.extend(\n Object.fromEntries(\n fields.flatMap((field) => {\n const current = schema.shape[field] as unknown as z.ZodType\n const uri = z.string().meta({\n format: \"uri\",\n \"x-mcp-file\": { maxSize: maxBytes },\n description: [\n current.description,\n `Send the file as a data: URI, such as data:text/csv;base64,<base64 bytes>, at most ${maxBytes} bytes once decoded.`,\n ]\n .filter(Boolean)\n .join(\" \"),\n })\n const name = z\n .string()\n .meta({\n description: `The name of the file sent in ${field}, such as products.csv.`,\n })\n .optional()\n return [\n [field, current.isOptional() ? uri.optional() : uri],\n [`${field}_name`, name],\n ]\n }),\n ),\n ) as unknown as z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C>\n\ntype DataUrisDecoded<T, K extends string> = T extends object\n ? Omit<T, K | `${K}_name`> & {\n [P in K & keyof T]: undefined extends T[P] ? File | undefined : File\n }\n : T\n\nconst DATA_URI = /^data:([^,]*),(.*)$/is\nconst PERCENT_ENCODED = /^[0-9a-f]{2}$/i\n\nconst notADataUriError = (field: string) =>\n new Error(\n `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`,\n )\n\nconst fileTooBigError = (field: string, bytes: number, maxBytes: number) =>\n new Error(\n `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`,\n )\n\nfunction percentDecoded(field: string, text: string) {\n const bytes: number[] = []\n const encoder = new TextEncoder()\n for (let index = 0; index < text.length; index++) {\n if (text[index] === \"%\") {\n const hex = text.slice(index + 1, index + 3)\n if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field)\n bytes.push(parseInt(hex, 16))\n index += 2\n } else {\n const codePoint = text.codePointAt(index)!\n const character = String.fromCodePoint(codePoint)\n bytes.push(...encoder.encode(character))\n index += character.length - 1\n }\n }\n return new Uint8Array(bytes)\n}\n\nfunction base64Decoded(field: string, text: string, maxBytes: number) {\n const data = text.replace(/\\s/g, \"\")\n const padding = data.endsWith(\"==\") ? 2 : data.endsWith(\"=\") ? 1 : 0\n const bytes = Math.floor((data.length * 3) / 4) - padding\n if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes)\n let binary: string\n try {\n binary = atob(data)\n } catch {\n throw new Error(`${field} is not valid base64`)\n }\n return Uint8Array.from(binary, (character) => character.charCodeAt(0))\n}\n\nfunction fileFromDataUri(\n field: string,\n uri: unknown,\n maxBytes: number,\n givenName: unknown,\n) {\n const match = typeof uri === \"string\" ? DATA_URI.exec(uri) : null\n if (!match) throw notADataUriError(field)\n const parameters = match[1]!.split(\";\")\n const isBase64 = parameters.at(-1)!.toLowerCase() === \"base64\"\n if (isBase64) parameters.pop()\n const mediaType = parameters.shift()!.trim()\n const nameParameter = parameters.find((parameter) =>\n parameter.trim().toLowerCase().startsWith(\"name=\"),\n )\n let name = field\n if (typeof givenName === \"string\" && givenName.trim()) {\n name = givenName.trim()\n } else if (nameParameter) {\n try {\n name = decodeURIComponent(nameParameter.trim().slice(\"name=\".length))\n } catch {\n throw notADataUriError(field)\n }\n }\n const bytes = isBase64\n ? base64Decoded(field, match[2]!, maxBytes)\n : percentDecoded(field, match[2]!)\n if (bytes.length > maxBytes)\n throw fileTooBigError(field, bytes.length, maxBytes)\n return new File([bytes], name, {\n type: mediaType.includes(\"/\") ? mediaType : \"text/plain\",\n })\n}\n\nexport const decodeDataUris = async <T, K extends string>(\n body: T,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): Promise<DataUrisDecoded<T, K>> => {\n if (typeof body !== \"object\" || body === null) {\n return body as DataUrisDecoded<T, K>\n }\n const decoded = { ...body } as Record<string, unknown>\n for (const field of fields) {\n const givenName = decoded[`${field}_name`]\n delete decoded[`${field}_name`]\n if (decoded[field] !== undefined) {\n decoded[field] = fileFromDataUri(\n field,\n decoded[field],\n maxBytes,\n givenName,\n )\n }\n }\n return decoded as DataUrisDecoded<T, K>\n}\n"],"mappings":"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","names":[]}
|