mppx 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/dist/Challenge.d.ts +18 -18
  2. package/dist/Challenge.d.ts.map +1 -1
  3. package/dist/Challenge.js +8 -8
  4. package/dist/Challenge.js.map +1 -1
  5. package/dist/Errors.d.ts +58 -8
  6. package/dist/Errors.d.ts.map +1 -1
  7. package/dist/Errors.js +51 -9
  8. package/dist/Errors.js.map +1 -1
  9. package/dist/Method.d.ts +154 -0
  10. package/dist/Method.d.ts.map +1 -0
  11. package/dist/Method.js +81 -0
  12. package/dist/Method.js.map +1 -0
  13. package/dist/PaymentRequest.d.ts +5 -5
  14. package/dist/PaymentRequest.d.ts.map +1 -1
  15. package/dist/PaymentRequest.js +11 -6
  16. package/dist/PaymentRequest.js.map +1 -1
  17. package/dist/cli.js +67 -18
  18. package/dist/cli.js.map +1 -1
  19. package/dist/client/Methods.d.ts +2 -2
  20. package/dist/client/Methods.d.ts.map +1 -1
  21. package/dist/client/Methods.js +2 -2
  22. package/dist/client/Methods.js.map +1 -1
  23. package/dist/client/Mppx.d.ts +7 -7
  24. package/dist/client/Mppx.d.ts.map +1 -1
  25. package/dist/client/Mppx.js +3 -3
  26. package/dist/client/Mppx.js.map +1 -1
  27. package/dist/client/internal/Fetch.d.ts +10 -10
  28. package/dist/client/internal/Fetch.d.ts.map +1 -1
  29. package/dist/client/internal/Fetch.js +2 -2
  30. package/dist/client/internal/Fetch.js.map +1 -1
  31. package/dist/index.d.ts +1 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/mcp-sdk/client/McpClient.d.ts +6 -6
  36. package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -1
  37. package/dist/mcp-sdk/client/McpClient.js +4 -4
  38. package/dist/mcp-sdk/client/McpClient.js.map +1 -1
  39. package/dist/middlewares/elysia.d.ts +1 -1
  40. package/dist/middlewares/express.d.ts +1 -1
  41. package/dist/middlewares/hono.d.ts +1 -1
  42. package/dist/middlewares/internal/mppx.d.ts +7 -7
  43. package/dist/middlewares/internal/mppx.d.ts.map +1 -1
  44. package/dist/middlewares/internal/mppx.js +5 -5
  45. package/dist/middlewares/internal/mppx.js.map +1 -1
  46. package/dist/middlewares/nextjs.d.ts +1 -1
  47. package/dist/proxy/Service.js +2 -2
  48. package/dist/proxy/Service.js.map +1 -1
  49. package/dist/server/Methods.d.ts +2 -2
  50. package/dist/server/Methods.d.ts.map +1 -1
  51. package/dist/server/Methods.js +2 -2
  52. package/dist/server/Methods.js.map +1 -1
  53. package/dist/server/Mppx.d.ts +17 -17
  54. package/dist/server/Mppx.d.ts.map +1 -1
  55. package/dist/server/Mppx.js +9 -9
  56. package/dist/server/Mppx.js.map +1 -1
  57. package/dist/stripe/{Intents.d.ts → Methods.d.ts} +22 -22
  58. package/dist/stripe/Methods.d.ts.map +1 -0
  59. package/dist/stripe/Methods.js +42 -0
  60. package/dist/stripe/Methods.js.map +1 -0
  61. package/dist/stripe/client/Charge.d.ts +40 -27
  62. package/dist/stripe/client/Charge.d.ts.map +1 -1
  63. package/dist/stripe/client/Charge.js +15 -7
  64. package/dist/stripe/client/Charge.js.map +1 -1
  65. package/dist/stripe/client/{MethodIntents.d.ts → Methods.d.ts} +24 -23
  66. package/dist/stripe/client/Methods.d.ts.map +1 -0
  67. package/dist/stripe/client/{MethodIntents.js → Methods.js} +3 -3
  68. package/dist/stripe/client/Methods.js.map +1 -0
  69. package/dist/stripe/client/index.d.ts +1 -1
  70. package/dist/stripe/client/index.d.ts.map +1 -1
  71. package/dist/stripe/client/index.js +1 -1
  72. package/dist/stripe/client/index.js.map +1 -1
  73. package/dist/stripe/index.d.ts +1 -1
  74. package/dist/stripe/index.d.ts.map +1 -1
  75. package/dist/stripe/index.js +1 -1
  76. package/dist/stripe/index.js.map +1 -1
  77. package/dist/stripe/internal/types.d.ts +25 -0
  78. package/dist/stripe/internal/types.d.ts.map +1 -0
  79. package/dist/stripe/internal/types.js +2 -0
  80. package/dist/stripe/internal/types.js.map +1 -0
  81. package/dist/stripe/server/Charge.d.ts +47 -28
  82. package/dist/stripe/server/Charge.d.ts.map +1 -1
  83. package/dist/stripe/server/Charge.js +90 -32
  84. package/dist/stripe/server/Charge.js.map +1 -1
  85. package/dist/stripe/server/{MethodIntents.d.ts → Methods.d.ts} +24 -23
  86. package/dist/stripe/server/Methods.d.ts.map +1 -0
  87. package/dist/stripe/server/{MethodIntents.js → Methods.js} +3 -3
  88. package/dist/stripe/server/Methods.js.map +1 -0
  89. package/dist/stripe/server/index.d.ts +1 -1
  90. package/dist/stripe/server/index.d.ts.map +1 -1
  91. package/dist/stripe/server/index.js +1 -1
  92. package/dist/stripe/server/index.js.map +1 -1
  93. package/dist/tempo/{Intents.d.ts → Methods.d.ts} +72 -69
  94. package/dist/tempo/Methods.d.ts.map +1 -0
  95. package/dist/tempo/Methods.js +118 -0
  96. package/dist/tempo/Methods.js.map +1 -0
  97. package/dist/tempo/client/ChannelOps.d.ts +1 -1
  98. package/dist/tempo/client/ChannelOps.js +1 -1
  99. package/dist/tempo/client/Charge.d.ts +25 -25
  100. package/dist/tempo/client/Charge.d.ts.map +1 -1
  101. package/dist/tempo/client/Charge.js +3 -3
  102. package/dist/tempo/client/Charge.js.map +1 -1
  103. package/dist/tempo/client/{MethodIntents.d.ts → Methods.d.ts} +74 -70
  104. package/dist/tempo/client/Methods.d.ts.map +1 -0
  105. package/dist/tempo/client/{MethodIntents.js → Methods.js} +3 -3
  106. package/dist/tempo/client/Methods.js.map +1 -0
  107. package/dist/tempo/client/Session.d.ts +49 -45
  108. package/dist/tempo/client/Session.d.ts.map +1 -1
  109. package/dist/tempo/client/Session.js +4 -4
  110. package/dist/tempo/client/Session.js.map +1 -1
  111. package/dist/tempo/client/SessionManager.d.ts +1 -1
  112. package/dist/tempo/client/SessionManager.js +1 -1
  113. package/dist/tempo/client/index.d.ts +1 -1
  114. package/dist/tempo/client/index.d.ts.map +1 -1
  115. package/dist/tempo/client/index.js +1 -1
  116. package/dist/tempo/client/index.js.map +1 -1
  117. package/dist/tempo/index.d.ts +1 -1
  118. package/dist/tempo/index.d.ts.map +1 -1
  119. package/dist/tempo/index.js +1 -1
  120. package/dist/tempo/index.js.map +1 -1
  121. package/dist/tempo/server/Charge.d.ts +27 -27
  122. package/dist/tempo/server/Charge.d.ts.map +1 -1
  123. package/dist/tempo/server/Charge.js +3 -3
  124. package/dist/tempo/server/Charge.js.map +1 -1
  125. package/dist/tempo/server/{MethodIntents.d.ts → Methods.d.ts} +73 -69
  126. package/dist/tempo/server/Methods.d.ts.map +1 -0
  127. package/dist/tempo/server/{MethodIntents.js → Methods.js} +4 -4
  128. package/dist/tempo/server/Methods.js.map +1 -0
  129. package/dist/tempo/server/Session.d.ts +51 -47
  130. package/dist/tempo/server/Session.d.ts.map +1 -1
  131. package/dist/tempo/server/Session.js +4 -4
  132. package/dist/tempo/server/Session.js.map +1 -1
  133. package/dist/tempo/server/index.d.ts +6 -0
  134. package/dist/tempo/server/index.d.ts.map +1 -0
  135. package/dist/tempo/server/index.js +6 -0
  136. package/dist/tempo/server/index.js.map +1 -0
  137. package/package.json +2 -1
  138. package/src/Challenge.test-d.ts +3 -3
  139. package/src/Challenge.test.ts +7 -7
  140. package/src/Challenge.ts +34 -34
  141. package/src/Errors.test.ts +75 -21
  142. package/src/Errors.ts +74 -9
  143. package/src/Method.test.ts +76 -0
  144. package/src/Method.ts +228 -0
  145. package/src/PaymentRequest.test.ts +5 -5
  146. package/src/PaymentRequest.ts +15 -10
  147. package/src/cli.test.ts +12 -22
  148. package/src/cli.ts +74 -21
  149. package/src/client/Methods.ts +2 -2
  150. package/src/client/Mppx.test-d.ts +6 -6
  151. package/src/client/Mppx.test.ts +26 -22
  152. package/src/client/Mppx.ts +10 -10
  153. package/src/client/Transport.test.ts +6 -6
  154. package/src/client/internal/Fetch.ts +21 -24
  155. package/src/index.ts +1 -2
  156. package/src/mcp-sdk/client/McpClient.test.ts +1 -1
  157. package/src/mcp-sdk/client/McpClient.ts +11 -13
  158. package/src/middlewares/elysia.ts +1 -1
  159. package/src/middlewares/express.ts +1 -1
  160. package/src/middlewares/hono.ts +1 -1
  161. package/src/middlewares/internal/mppx.ts +10 -10
  162. package/src/middlewares/nextjs.ts +1 -1
  163. package/src/proxy/Service.ts +2 -2
  164. package/src/server/Methods.ts +2 -2
  165. package/src/server/Mppx.test-d.ts +27 -29
  166. package/src/server/Mppx.test.ts +23 -19
  167. package/src/server/Mppx.ts +43 -43
  168. package/src/server/Transport.test.ts +8 -8
  169. package/src/stripe/{Intents.test.ts → Methods.test.ts} +12 -12
  170. package/src/stripe/Methods.ts +45 -0
  171. package/src/stripe/client/Charge.test.ts +189 -0
  172. package/src/stripe/client/Charge.ts +29 -16
  173. package/src/stripe/client/{MethodIntents.ts → Methods.ts} +2 -2
  174. package/src/stripe/client/index.ts +1 -1
  175. package/src/stripe/index.ts +1 -1
  176. package/src/stripe/internal/types.ts +22 -0
  177. package/src/stripe/server/Charge.test.ts +241 -0
  178. package/src/stripe/server/Charge.ts +124 -38
  179. package/src/stripe/server/{MethodIntents.ts → Methods.ts} +2 -2
  180. package/src/stripe/server/index.ts +1 -1
  181. package/src/tempo/{Intents.test.ts → Methods.test.ts} +15 -15
  182. package/src/tempo/{Intents.ts → Methods.ts} +77 -22
  183. package/src/tempo/client/ChannelOps.ts +1 -1
  184. package/src/tempo/client/Charge.ts +3 -3
  185. package/src/tempo/client/{MethodIntents.ts → Methods.ts} +2 -2
  186. package/src/tempo/client/Session.ts +4 -4
  187. package/src/tempo/client/SessionManager.ts +1 -1
  188. package/src/tempo/client/index.ts +1 -1
  189. package/src/tempo/index.ts +1 -1
  190. package/src/tempo/server/Charge.ts +4 -7
  191. package/src/tempo/server/{MethodIntents.ts → Methods.ts} +3 -3
  192. package/src/tempo/server/Session.test.ts +4 -7
  193. package/src/tempo/server/Session.ts +6 -6
  194. package/src/tempo/server/index.ts +1 -1
  195. package/dist/Intent.d.ts +0 -101
  196. package/dist/Intent.d.ts.map +0 -1
  197. package/dist/Intent.js +0 -83
  198. package/dist/Intent.js.map +0 -1
  199. package/dist/MethodIntent.d.ts +0 -225
  200. package/dist/MethodIntent.d.ts.map +0 -1
  201. package/dist/MethodIntent.js +0 -156
  202. package/dist/MethodIntent.js.map +0 -1
  203. package/dist/stripe/Intents.d.ts.map +0 -1
  204. package/dist/stripe/Intents.js +0 -27
  205. package/dist/stripe/Intents.js.map +0 -1
  206. package/dist/stripe/client/MethodIntents.d.ts.map +0 -1
  207. package/dist/stripe/client/MethodIntents.js.map +0 -1
  208. package/dist/stripe/server/MethodIntents.d.ts.map +0 -1
  209. package/dist/stripe/server/MethodIntents.js.map +0 -1
  210. package/dist/tempo/Intents.d.ts.map +0 -1
  211. package/dist/tempo/Intents.js +0 -81
  212. package/dist/tempo/Intents.js.map +0 -1
  213. package/dist/tempo/client/MethodIntents.d.ts.map +0 -1
  214. package/dist/tempo/client/MethodIntents.js.map +0 -1
  215. package/dist/tempo/server/MethodIntents.d.ts.map +0 -1
  216. package/dist/tempo/server/MethodIntents.js.map +0 -1
  217. package/src/Intent.test.ts +0 -180
  218. package/src/Intent.ts +0 -109
  219. package/src/MethodIntent.test.ts +0 -303
  220. package/src/MethodIntent.ts +0 -388
  221. package/src/stripe/Intents.ts +0 -27
@@ -1,388 +0,0 @@
1
- import type * as Challenge from './Challenge.js'
2
- import type * as Credential from './Credential.js'
3
- import * as Intent from './Intent.js'
4
- import type { ExactPartial, LooseOmit, MaybePromise } from './internal/types.js'
5
- import type * as Receipt from './Receipt.js'
6
- import type * as Transport from './server/Transport.js'
7
- import * as z from './zod.js'
8
-
9
- /**
10
- * A payment method-specific intent.
11
- */
12
- export type MethodIntent<
13
- intent extends Intent.Intent = Intent.Intent,
14
- options extends fromIntent.Options<intent> = fromIntent.Options<intent>,
15
- > = {
16
- method: options['method']
17
- name: intent['name']
18
- schema: {
19
- credential: {
20
- payload: options['schema']['credential']['payload']
21
- }
22
- request: MergedRequestSchema<intent, options>
23
- }
24
- }
25
- export type AnyMethodIntent = MethodIntent<any, any>
26
-
27
- /**
28
- * Creates a method-specific intent.
29
- *
30
- * @example
31
- * ```ts
32
- * import { z } from 'zod/mini'
33
- * import { MethodIntent } from 'mppx'
34
- *
35
- * const tempoCharge = MethodIntent.from({
36
- * method: 'tempo',
37
- * name: 'charge',
38
- * schema: {
39
- * credential: {
40
- * payload: z.object({
41
- * signature: z.string(),
42
- * type: z.literal('transaction'),
43
- * }),
44
- * },
45
- * request: z.object({
46
- * amount: z.string(),
47
- * currency: z.string(),
48
- * recipient: z.string(),
49
- * }),
50
- * },
51
- * })
52
- * ```
53
- */
54
- export function from<const intent extends MethodIntent>(intent: intent): intent {
55
- return intent
56
- }
57
-
58
- /**
59
- * Creates a method-specific intent from a base intent.
60
- *
61
- * @example
62
- * ```ts
63
- * import { z } from 'zod/mini'
64
- * import { Intent, MethodIntent } from 'mppx'
65
- *
66
- * const tempoCharge = MethodIntent.fromIntent(Intent.charge, {
67
- * method: 'tempo',
68
- * schema: {
69
- * credential: {
70
- * payload: z.object({
71
- * signature: z.string(),
72
- * type: z.literal('transaction'),
73
- * }),
74
- * },
75
- * request: {
76
- * methodDetails: z.object({
77
- * chainId: z.number(),
78
- * }),
79
- * requires: ['recipient'],
80
- * },
81
- * },
82
- * })
83
- * ```
84
- */
85
- export function fromIntent<
86
- const intent extends Intent.Intent,
87
- const options extends fromIntent.Options<intent>,
88
- >(intent: intent, options: options): MethodIntent<intent, options> {
89
- const { name } = intent
90
- const { method, schema } = options
91
-
92
- const requestShape = Intent.shapeOf(intent) as Record<string, z.ZodMiniType>
93
-
94
- const methodDetails = schema.request?.methodDetails
95
- const requires = schema.request?.requires ?? []
96
-
97
- const requestInputShape: Record<string, z.ZodMiniType> = {}
98
- for (const [key, field] of Object.entries(requestShape)) {
99
- if (requires.includes(key as never)) requestInputShape[key] = z.unwrapOptional(field)
100
- else requestInputShape[key] = field
101
- }
102
-
103
- const methodDetailsKeys: string[] = []
104
- if (methodDetails)
105
- for (const [key, field] of Object.entries(
106
- methodDetails.shape as Record<string, z.ZodMiniType>,
107
- )) {
108
- requestInputShape[key] = field
109
- methodDetailsKeys.push(key)
110
- }
111
-
112
- const intentRequest = intent.schema.request
113
- const hasPipe = !('shape' in intentRequest)
114
-
115
- const request = z.pipe(
116
- z.object(requestInputShape),
117
- z.transform((input: Record<string, unknown>) => {
118
- const transformed = hasPipe ? (intentRequest as z.ZodMiniType).parse(input) : input
119
-
120
- const result: Record<string, unknown> = {}
121
- const details: Record<string, unknown> = {}
122
-
123
- for (const [key, value] of Object.entries(transformed as Record<string, unknown>)) {
124
- result[key] = value
125
- }
126
-
127
- for (const key of methodDetailsKeys) {
128
- const value = input[key]
129
- if (value !== undefined) details[key] = value
130
- }
131
-
132
- if (Object.keys(details).length > 0) result.methodDetails = details
133
- return result
134
- }),
135
- )
136
-
137
- return {
138
- method,
139
- name,
140
- schema: {
141
- credential: { payload: schema.credential.payload },
142
- request,
143
- },
144
- } as unknown as MethodIntent<intent, options>
145
- }
146
-
147
- export namespace fromIntent {
148
- export type Options<intent extends Intent.Intent> = {
149
- method: string
150
- schema: {
151
- credential: { payload: z.ZodMiniType }
152
- request?:
153
- | {
154
- methodDetails?: z.ZodMiniObject | undefined
155
- requires?: readonly (keyof Intent.ShapeOf<intent>)[] | undefined
156
- }
157
- | undefined
158
- }
159
- }
160
- }
161
-
162
- /** @internal */
163
- type RequiresKeys<
164
- intent extends Intent.Intent,
165
- options extends fromIntent.Options<intent>,
166
- > = options['schema']['request'] extends { requires: readonly (infer key)[] } ? key : never
167
-
168
- /** @internal */
169
- type UnwrapOptional<schema> = schema extends z.ZodMiniOptional<infer inner> ? inner : schema
170
-
171
- /** @internal */
172
- type MethodDetailsShape<
173
- intent extends Intent.Intent,
174
- options extends fromIntent.Options<intent>,
175
- > = options['schema']['request'] extends { methodDetails: infer details extends z.ZodMiniObject }
176
- ? details['shape']
177
- : Record<never, never>
178
-
179
- /** @internal */
180
- type InputRequestShape<intent extends Intent.Intent, options extends fromIntent.Options<intent>> = {
181
- [K in keyof Intent.ShapeOf<intent>]: K extends RequiresKeys<intent, options>
182
- ? UnwrapOptional<Intent.ShapeOf<intent>[K]>
183
- : Intent.ShapeOf<intent>[K]
184
- } & MethodDetailsShape<intent, options>
185
-
186
- /** @internal */
187
- type MethodDetailsOutput<
188
- intent extends Intent.Intent,
189
- options extends fromIntent.Options<intent>,
190
- > = options['schema']['request'] extends { methodDetails: infer details extends z.ZodMiniObject }
191
- ? { methodDetails?: z.output<details> }
192
- : Record<never, never>
193
-
194
- /** @internal */
195
- type OutputRequestType<intent extends Intent.Intent, options extends fromIntent.Options<intent>> = {
196
- [K in keyof Intent.ShapeOf<intent>]: K extends RequiresKeys<intent, options>
197
- ? z.output<UnwrapOptional<Intent.ShapeOf<intent>[K]>>
198
- : z.output<Intent.ShapeOf<intent>[K]>
199
- } & MethodDetailsOutput<intent, options>
200
-
201
- /** @internal */
202
- type MergedRequestSchema<
203
- intent extends Intent.Intent,
204
- options extends fromIntent.Options<intent>,
205
- > = z.ZodMiniType<
206
- OutputRequestType<intent, options>,
207
- z.input<z.ZodMiniObject<InputRequestShape<intent, options>>>
208
- >
209
-
210
- /**
211
- * A client-side configured method intent with credential creation logic.
212
- */
213
- export type Client<
214
- intent extends AnyMethodIntent = MethodIntent,
215
- context extends z.ZodMiniType | undefined = z.ZodMiniType | undefined,
216
- > = intent & {
217
- context?: context
218
- createCredential: CreateCredentialFn<
219
- intent,
220
- context extends z.ZodMiniType ? z.output<context> : Record<never, never>
221
- >
222
- }
223
- export type AnyClient = Client<any, any>
224
-
225
- /**
226
- * A server-side configured method intent with verification logic.
227
- */
228
- export type Server<
229
- intent extends AnyMethodIntent = MethodIntent,
230
- defaults extends ExactPartial<z.input<intent['schema']['request']>> = {},
231
- transportOverride = undefined,
232
- > = intent & {
233
- defaults?: defaults | undefined
234
- request?: RequestFn<intent> | undefined
235
- respond?: RespondFn<intent> | undefined
236
- transport?: transportOverride | undefined
237
- verify: VerifyFn<intent>
238
- }
239
- export type AnyServer = Server<any, any, any>
240
-
241
- /** Credential creation function for a single intent. */
242
- export type CreateCredentialFn<intent extends AnyMethodIntent, context = unknown> = (
243
- parameters: {
244
- challenge: Challenge.Challenge<
245
- z.output<intent['schema']['request']>,
246
- intent['name'],
247
- intent['method']
248
- >
249
- } & ([keyof context] extends [never] ? unknown : { context: context }),
250
- ) => Promise<string>
251
-
252
- /** Request transform function for a single intent. */
253
- export type RequestFn<intent extends AnyMethodIntent> = (options: {
254
- credential?: Credential.Credential | null | undefined
255
- request: z.input<intent['schema']['request']>
256
- }) => MaybePromise<z.input<intent['schema']['request']>>
257
-
258
- /** Verification function for a single intent. */
259
- export type VerifyFn<intent extends AnyMethodIntent> = (parameters: {
260
- credential: Credential.Credential<
261
- z.output<intent['schema']['credential']['payload']>,
262
- Challenge.Challenge<z.output<intent['schema']['request']>, intent['name'], intent['method']>
263
- >
264
- request: z.input<intent['schema']['request']>
265
- }) => Promise<Receipt.Receipt>
266
-
267
- /**
268
- * Optional respond function for a server-side method intent.
269
- *
270
- * Called after `verify` succeeds. If it returns a `Response`, the library
271
- * treats the request as fully handled (e.g. channel open/close) and
272
- * `withReceipt()` will short-circuit — returning the management response
273
- * with the receipt header attached without invoking any user-supplied
274
- * response or generator. If it returns `undefined`, the server handler
275
- * is expected to serve content via `withReceipt(response)`.
276
- *
277
- * **HTTP-only.** The `input` parameter is a `Request` object; MCP transports
278
- * do not invoke this hook.
279
- */
280
- export type RespondFn<intent extends AnyMethodIntent> = (parameters: {
281
- credential: Credential.Credential<
282
- z.output<intent['schema']['credential']['payload']>,
283
- Challenge.Challenge<z.output<intent['schema']['request']>, intent['name'], intent['method']>
284
- >
285
- input: globalThis.Request
286
- receipt: Receipt.Receipt
287
- request: z.input<intent['schema']['request']>
288
- }) => MaybePromise<globalThis.Response | undefined>
289
-
290
- /** Partial request type for defaults. */
291
- export type RequestDefaults<intent extends AnyMethodIntent> = ExactPartial<
292
- z.input<intent['schema']['request']>
293
- >
294
-
295
- /** Makes fields optional if they exist in defaults. */
296
- export type WithDefaults<request, defaults> = [keyof defaults] extends [never]
297
- ? request
298
- : LooseOmit<request, keyof defaults & string> &
299
- ExactPartial<Pick<request, keyof defaults & keyof request>>
300
-
301
- /**
302
- * Extends a method intent with client-side credential creation logic.
303
- *
304
- * @example
305
- * ```ts
306
- * import { MethodIntent } from 'mppx'
307
- * import { Intents } from 'mppx/tempo'
308
- *
309
- * const tempoCharge = MethodIntent.toClient(Intents.charge, {
310
- * async createCredential({ challenge }) {
311
- * return Credential.serialize({ challenge, payload: { ... } })
312
- * },
313
- * })
314
- * ```
315
- */
316
- export function toClient<
317
- const intent extends AnyMethodIntent,
318
- const context extends z.ZodMiniType | undefined = undefined,
319
- >(intent: intent, options: toClient.Options<intent, context>): Client<intent, context> {
320
- const { context, createCredential } = options
321
- return {
322
- ...intent,
323
- context,
324
- createCredential,
325
- } as Client<intent, context>
326
- }
327
-
328
- export declare namespace toClient {
329
- type Options<
330
- intent extends AnyMethodIntent,
331
- context extends z.ZodMiniType | undefined = undefined,
332
- > = {
333
- context?: context
334
- createCredential: CreateCredentialFn<
335
- intent,
336
- context extends z.ZodMiniType ? z.output<context> : Record<never, never>
337
- >
338
- }
339
- }
340
-
341
- /**
342
- * Extends a method intent with server-side verification logic.
343
- *
344
- * @example
345
- * ```ts
346
- * import { MethodIntent } from 'mppx'
347
- * import { Intents } from 'mppx/tempo'
348
- *
349
- * const tempoCharge = MethodIntent.toServer(Intents.charge, {
350
- * async verify({ credential }) {
351
- * // verification logic
352
- * return { status: 'success', ... }
353
- * },
354
- * })
355
- * ```
356
- */
357
- export function toServer<
358
- const intent extends AnyMethodIntent,
359
- const defaults extends RequestDefaults<intent> = {},
360
- const transportOverride extends Transport.AnyTransport | undefined = undefined,
361
- >(
362
- intent: intent,
363
- options: toServer.Options<intent, defaults, transportOverride>,
364
- ): Server<intent, defaults, transportOverride> {
365
- const { defaults, request, respond, transport, verify } = options
366
- return {
367
- ...intent,
368
- defaults,
369
- request,
370
- respond,
371
- transport,
372
- verify,
373
- } as Server<intent, defaults, transportOverride>
374
- }
375
-
376
- export declare namespace toServer {
377
- type Options<
378
- intent extends AnyMethodIntent,
379
- defaults extends RequestDefaults<intent> = {},
380
- transportOverride extends Transport.AnyTransport | undefined = undefined,
381
- > = {
382
- defaults?: defaults | undefined
383
- request?: RequestFn<intent> | undefined
384
- respond?: RespondFn<intent> | undefined
385
- transport?: transportOverride | undefined
386
- verify: VerifyFn<intent>
387
- }
388
- }
@@ -1,27 +0,0 @@
1
- import * as Intent from '../Intent.js'
2
- import * as MethodIntent from '../MethodIntent.js'
3
- import * as z from '../zod.js'
4
-
5
- /**
6
- * Stripe charge intent for one-time payments via Shared Payment Tokens (SPTs).
7
- *
8
- * @see https://github.com/tempoxyz/payment-auth-spec/blob/main/specs/methods/stripe/draft-stripe-charge-00.md
9
- */
10
- export const charge = MethodIntent.fromIntent(Intent.charge, {
11
- method: 'stripe',
12
- schema: {
13
- credential: {
14
- payload: z.object({
15
- spt: z.string(),
16
- externalId: z.optional(z.string()),
17
- }),
18
- },
19
- request: {
20
- methodDetails: z.object({
21
- networkId: z.string(),
22
- paymentMethodTypes: z.array(z.string()).check(z.minLength(1)),
23
- metadata: z.optional(z.record(z.string(), z.string())),
24
- }),
25
- },
26
- },
27
- })