@dipansrimany/mlink-sdk 0.3.0 → 0.4.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.
- package/dist/adapters/express.d.mts +2 -2
- package/dist/adapters/express.d.ts +2 -2
- package/dist/adapters/express.js +117 -10
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +117 -10
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/next.d.mts +2 -2
- package/dist/adapters/next.d.ts +2 -2
- package/dist/adapters/next.js +117 -10
- package/dist/adapters/next.js.map +1 -1
- package/dist/adapters/next.mjs +117 -10
- package/dist/adapters/next.mjs.map +1 -1
- package/dist/builders-CLqoe2Kx.d.ts +245 -0
- package/dist/builders-pKj4NiIj.d.mts +245 -0
- package/dist/index.d.mts +1129 -24
- package/dist/index.d.ts +1129 -24
- package/dist/index.js +343 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +316 -22
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.d.mts +9 -3
- package/dist/react/index.d.ts +9 -3
- package/dist/react/index.js +407 -30
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +407 -30
- package/dist/react/index.mjs.map +1 -1
- package/dist/styles.css +191 -0
- package/dist/types-DD9rJ58Y.d.mts +214 -0
- package/dist/types-DD9rJ58Y.d.ts +214 -0
- package/package.json +2 -2
- package/dist/builders-CJNt88dM.d.ts +0 -19
- package/dist/builders-CN5ijFpW.d.mts +0 -19
- package/dist/types-CAnUIaVe.d.mts +0 -68
- package/dist/types-CAnUIaVe.d.ts +0 -68
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/validators.ts","../../src/adapters/next.ts"],"names":["z","NextResponse"],"mappings":"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","file":"next.js","sourcesContent":["import { z } from 'zod';\nimport type {\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\n ValidationResult,\n} from './types';\n\n// Ethereum address regex\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n// Hex string regex\nconst hexRegex = /^0x[a-fA-F0-9]*$/;\n\n// Zod Schemas\nexport const ActionButtonSchema = z.object({\n label: z.string().min(1).max(50),\n value: z.string().min(1),\n type: z.enum(['button', 'input']),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\nexport const ActionMetadataSchema = z.object({\n title: z.string().min(1).max(100),\n icon: z.string().url(),\n description: z.string().min(1).max(500),\n actions: z.array(ActionButtonSchema).min(1),\n disabled: z.boolean().optional(),\n error: z.object({ message: z.string() }).optional(),\n});\n\nexport const TransactionRequestSchema = z.object({\n account: z.string().regex(addressRegex, 'Invalid Ethereum address'),\n action: z.string().min(1),\n input: z.string().optional(),\n});\n\nexport const EVMTransactionSchema = z.object({\n to: z.string().regex(addressRegex, 'Invalid to address'),\n value: z.string(),\n data: z.string().regex(hexRegex, 'Invalid hex data'),\n chainId: z.number().positive(),\n});\n\nexport const TransactionResponseSchema = z.object({\n transaction: EVMTransactionSchema,\n message: z.string().optional(),\n});\n\n// Validation functions\nexport function validateActionMetadata(\n data: unknown\n): ValidationResult<ActionMetadata> {\n const result = ActionMetadataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as ActionMetadata };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionRequest(\n data: unknown\n): ValidationResult<TransactionRequest> {\n const result = TransactionRequestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionResponse(\n data: unknown\n): ValidationResult<TransactionResponse> {\n const result = TransactionResponseSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TransactionResponse };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function isValidAddress(address: string): boolean {\n return addressRegex.test(address);\n}\n\nexport function isValidHex(hex: string): boolean {\n return hexRegex.test(hex);\n}\n","import type { NextRequest } from 'next/server';\nimport { NextResponse } from 'next/server';\nimport type { Action } from '../builders';\nimport { validateTransactionRequest } from '../validators';\n\n// CORS headers\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type',\n};\n\n// Create Next.js App Router handlers\nexport function createNextHandler(action: Action) {\n // GET handler - returns action metadata\n async function GET() {\n try {\n const metadata = action.getMetadata();\n return NextResponse.json(metadata, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // POST handler - returns transaction\n async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n\n // Validate request\n const validation = validateTransactionRequest(body);\n if (!validation.success) {\n return NextResponse.json(\n { error: { message: validation.error } },\n { status: 400, headers: corsHeaders }\n );\n }\n\n // Handle request\n const response = await action.handleRequest(validation.data);\n\n return NextResponse.json(response, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // OPTIONS handler - CORS preflight\n async function OPTIONS() {\n return new NextResponse(null, { headers: corsHeaders });\n }\n\n return { GET, POST, OPTIONS };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/validators.ts","../../src/adapters/next.ts"],"names":["z","NextResponse"],"mappings":";;;;;;AAWA,IAAM,YAAA,GAAe,qBAAA;AAGrB,IAAM,QAAA,GAAW,kBAAA;AAMV,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,EAC/B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,MAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,EAChC,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,QAAA,EAAUA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACxB,CAAC,CAAA;AASwCA,MAAE,IAAA,CAAK;AAAA,EAC9C,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC;AAKM,IAAM,2BAAA,GAA8BA,MAAE,MAAA,CAAO;AAAA,EAClD,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,QAAA,EAAUA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACxB,CAAC,CAAA;AAKD,IAAM,yBAAA,GAA4BA,MAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAMA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,EAC9B,OAAOA,KAAA,CAAE,MAAA,GAAS,GAAA,CAAI,GAAG,EAAE,QAAA,EAAS;AAAA,EACpC,QAAA,EAAUA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC/B,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,kBAAA,EAAoBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACxC,GAAA,EAAKA,KAAA,CAAE,KAAA,CAAM,CAACA,KAAA,CAAE,MAAA,EAAO,EAAGA,KAAA,CAAE,MAAA,EAAQ,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAChD,GAAA,EAAKA,KAAA,CAAE,KAAA,CAAM,CAACA,KAAA,CAAE,MAAA,EAAO,EAAGA,KAAA,CAAE,MAAA,EAAQ,CAAC,CAAA,CAAE,QAAA;AACzC,CAAC,CAAA;AAKM,IAAM,qBAAA,GAAwB,0BAA0B,MAAA,CAAO;AAAA,EACpE,IAAA,EAAMA,MAAE,IAAA,CAAK;AAAA,IACX,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS,KAAA;AAAA,IAAO,MAAA;AAAA,IAAQ,gBAAA;AAAA,IAC1C,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,OAAA;AAAA,IAAS;AAAA,GACjC,EAAE,QAAA;AACL,CAAC,CAAA;AAKM,IAAM,+BAAA,GAAkC,0BAA0B,MAAA,CAAO;AAAA,EAC9E,MAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,EAC5C,SAASA,KAAA,CAAE,KAAA,CAAM,2BAA2B,CAAA,CAAE,IAAI,CAAC;AACrD,CAAC,CAAA;AAKM,IAAM,0BAAA,GAA6BA,MAAE,KAAA,CAAM;AAAA,EAChD,+BAAA;AAAA,EACA;AACF,CAAC,CAAA;AASM,IAAM,yBAAyBA,KAAA,CAAE,IAAA,CAAK,CAAC,aAAA,EAAe,MAAA,EAAQ,eAAe,CAAC,CAAA;AAK9E,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAM,uBAAuB,QAAA,EAAS;AAAA,EACtC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,EAC/B,QAAA,EAAUA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC/B,UAAA,EAAYA,KAAA,CAAE,KAAA,CAAM,0BAA0B,EAAE,QAAA;AAClD,CAAC,CAAA;AAKM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,SAASA,KAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA,CAAE,IAAI,CAAC;AAC5C,CAAC,CAAA;AAMM,IAAM,wBAAA,GAA2BA,MAAE,MAAA,CAAO;AAAA,EAC/C,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC;AACxB,CAAC,CAAA;AAEM,IAAM,0BAAA,GAAoFA,MAAE,MAAA,CAAO;AAAA,EACxG,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACxB,MAAA,EAAQA,KAAA,CAAE,IAAA,CAAK,MAAM,oBAAoB;AAC3C,CAAC,CAAA;AAEM,IAAM,oBAAA,GAAuBA,MAAE,KAAA,CAAM;AAAA,EAC1C,wBAAA;AAAA,EACA;AACF,CAAC,CAAA;AASD,IAAM,UAAA,GAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAA;AAAA,EAC5B,CAAC,GAAA,KAAQ;AAEP,IAAA,IAAI,GAAA,CAAI,WAAW,SAAS,CAAA,IAAK,IAAI,UAAA,CAAW,UAAU,GAAG,OAAO,IAAA;AAEpE,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA,EAAG,OAAO,IAAA;AAE1C,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,IAAA;AAChC,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,EAAE,SAAS,6DAAA;AACb,CAAA;AAKO,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,IAAA,EAAMA,MAAE,IAAA,CAAK,CAAC,UAAU,WAAW,CAAC,EAAE,QAAA,EAAS;AAAA,EAC/C,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EAChC,IAAA,EAAM,UAAA;AAAA,EACN,WAAA,EAAaA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EACvC,OAAOA,KAAA,CAAE,MAAA,GAAS,GAAA,CAAI,EAAE,EAAE,QAAA,EAAS;AAAA;AAAA,EAEnC,OAAA,EAASA,KAAA,CAAE,KAAA,CAAM,kBAAkB,EAAE,QAAA,EAAS;AAAA;AAAA,EAE9C,KAAA,EAAO,kBAAkB,QAAA,EAAS;AAAA,EAClC,QAAA,EAAUA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC/B,KAAA,EAAOA,KAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAASA,MAAE,MAAA,EAAO,EAAG,CAAA,CAAE,QAAA;AAC3C,CAAC,CAAA,CAAE,MAAA;AAAA,EACD,CAAC,IAAA,KAAS;AAER,IAAA,OAAQ,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,IACtC,IAAA,CAAK,KAAA,EAAO,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,EAC7D,CAAA;AAAA,EACA,EAAE,SAAS,gDAAA;AACb,CAAA;AAKO,IAAM,wBAAA,GAA2BA,MAAE,MAAA,CAAO;AAAA,EAC/C,SAASA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,cAAc,0BAA0B,CAAA;AAAA,EAClE,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACxB,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE3B,MAAMA,KAAA,CAAE,MAAA,CAAOA,MAAE,KAAA,CAAM,CAACA,MAAE,MAAA,EAAO,EAAGA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,CAAC,CAAC,CAAC,EAAE,QAAA;AAC7D,CAAC,CAAA;AAEM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,IAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,cAAc,oBAAoB,CAAA;AAAA,EACvD,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,MAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,UAAU,kBAAkB,CAAA;AAAA,EACnD,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACtB,CAAC,CAAA;AAKwCA,MAAE,MAAA,CAAO;AAAA;AAAA,EAEhD,WAAA,EAAa,qBAAqB,QAAA,EAAS;AAAA;AAAA,EAE3C,YAAA,EAAcA,KAAA,CAAE,KAAA,CAAM,oBAAoB,EAAE,QAAA,EAAS;AAAA,EACrD,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE7B,KAAA,EAAOA,MAAE,MAAA,CAAO;AAAA,IACd,IAAA,EAAM,qBAAqB,QAAA;AAAS,GACrC,EAAE,QAAA;AACL,CAAC,CAAA,CAAE,MAAA;AAAA,EACD,CAAC,IAAA,KAAS;AAER,IAAA,OAAO,KAAK,WAAA,KAAgB,MAAA,IAAc,KAAK,YAAA,IAAgB,IAAA,CAAK,aAAa,MAAA,GAAS,CAAA;AAAA,EAC5F,CAAA;AAAA,EACA,EAAE,SAAS,8CAAA;AACb;AAaO,SAAS,2BACd,IAAA,EACsC;AACtC,EAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,SAAA,CAAU,IAAI,CAAA;AACtD,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,EAC5C;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,MAAM,OAAA,EAAQ;AACvD;;;ACjPA,IAAM,WAAA,GAAc;AAAA,EAClB,6BAAA,EAA+B,GAAA;AAAA,EAC/B,8BAAA,EAAgC,oBAAA;AAAA,EAChC,8BAAA,EAAgC;AAClC,CAAA;AAGO,SAAS,kBAAkB,MAAA,EAAgB;AAEhD,EAAA,eAAe,GAAA,GAAM;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,OAAO,WAAA,EAAY;AACpC,MAAA,OAAOC,oBAAa,IAAA,CAAK,QAAA,EAAU,EAAE,OAAA,EAAS,aAAa,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,OAAOA,mBAAA,CAAa,IAAA;AAAA,QAClB,EAAE,KAAA,EAAO,EAAE,OAAA,EAAQ,EAAE;AAAA,QACrB,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,WAAA;AAAY,OACtC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,eAAe,KAAK,OAAA,EAAsB;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,EAAK;AAGhC,MAAA,MAAM,UAAA,GAAa,2BAA2B,IAAI,CAAA;AAClD,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAOA,mBAAA,CAAa,IAAA;AAAA,UAClB,EAAE,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA,CAAW,OAAM,EAAE;AAAA,UACvC,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,WAAA;AAAY,SACtC;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,aAAA,CAAc,WAAW,IAAI,CAAA;AAE3D,MAAA,OAAOA,oBAAa,IAAA,CAAK,QAAA,EAAU,EAAE,OAAA,EAAS,aAAa,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,OAAOA,mBAAA,CAAa,IAAA;AAAA,QAClB,EAAE,KAAA,EAAO,EAAE,OAAA,EAAQ,EAAE;AAAA,QACrB,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,WAAA;AAAY,OACtC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,eAAe,OAAA,GAAU;AACvB,IAAA,OAAO,IAAIA,mBAAA,CAAa,IAAA,EAAM,EAAE,OAAA,EAAS,aAAa,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAQ;AAC9B","file":"next.js","sourcesContent":["import { z } from 'zod';\nimport type {\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\n LinkedAction,\n TypedActionParameter,\n ValidationResult,\n} from './types';\n\n// Ethereum address regex\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n// Hex string regex\nconst hexRegex = /^0x[a-fA-F0-9]*$/;\n\n// =============================================================================\n// LEGACY SCHEMAS (Backwards compatible)\n// =============================================================================\n\nexport const ActionButtonSchema = z.object({\n label: z.string().min(1).max(50),\n value: z.string().min(1),\n type: z.enum(['button', 'input']),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\n// =============================================================================\n// SOLANA-STYLE PARAMETER SCHEMAS\n// =============================================================================\n\n/**\n * Parameter types enum\n */\nexport const ActionParameterTypeSchema = z.enum([\n 'text',\n 'number',\n 'email',\n 'url',\n 'date',\n 'datetime-local',\n 'textarea',\n 'select',\n 'radio',\n 'checkbox',\n 'address',\n 'token',\n 'amount',\n]);\n\n/**\n * Option for select/radio/checkbox\n */\nexport const ActionParameterOptionSchema = z.object({\n label: z.string().min(1),\n value: z.string(),\n selected: z.boolean().optional(),\n});\n\n/**\n * Base parameter fields\n */\nconst ActionParameterBaseSchema = z.object({\n name: z.string().min(1).max(50),\n label: z.string().max(100).optional(),\n required: z.boolean().optional(),\n pattern: z.string().optional(),\n patternDescription: z.string().optional(),\n min: z.union([z.string(), z.number()]).optional(),\n max: z.union([z.string(), z.number()]).optional(),\n});\n\n/**\n * Non-selectable parameter (text, number, etc.)\n */\nexport const ActionParameterSchema = ActionParameterBaseSchema.extend({\n type: z.enum([\n 'text', 'number', 'email', 'url', 'date', 'datetime-local',\n 'textarea', 'address', 'token', 'amount'\n ]).optional(),\n});\n\n/**\n * Selectable parameter (select, radio, checkbox)\n */\nexport const ActionParameterSelectableSchema = ActionParameterBaseSchema.extend({\n type: z.enum(['select', 'radio', 'checkbox']),\n options: z.array(ActionParameterOptionSchema).min(1),\n});\n\n/**\n * Union of all parameter types\n */\nexport const TypedActionParameterSchema = z.union([\n ActionParameterSelectableSchema,\n ActionParameterSchema,\n]);\n\n// =============================================================================\n// LINKED ACTION SCHEMAS\n// =============================================================================\n\n/**\n * Linked action type enum\n */\nexport const LinkedActionTypeSchema = z.enum(['transaction', 'post', 'external-link']);\n\n/**\n * Linked action with href template and parameters\n */\nexport const LinkedActionSchema = z.object({\n type: LinkedActionTypeSchema.optional(),\n href: z.string().min(1),\n label: z.string().min(1).max(50),\n disabled: z.boolean().optional(),\n parameters: z.array(TypedActionParameterSchema).optional(),\n});\n\n/**\n * Links section containing linked actions\n */\nexport const ActionLinksSchema = z.object({\n actions: z.array(LinkedActionSchema).min(1),\n});\n\n// =============================================================================\n// ACTION CHAINING SCHEMAS\n// =============================================================================\n\nexport const PostNextActionLinkSchema = z.object({\n type: z.literal('post'),\n href: z.string().min(1),\n});\n\nexport const InlineNextActionLinkSchema: z.ZodType<{ type: 'inline'; action: ActionMetadata }> = z.object({\n type: z.literal('inline'),\n action: z.lazy(() => ActionMetadataSchema),\n});\n\nexport const NextActionLinkSchema = z.union([\n PostNextActionLinkSchema,\n InlineNextActionLinkSchema,\n]);\n\n// =============================================================================\n// MAIN SCHEMAS (Enhanced)\n// =============================================================================\n\n/**\n * Icon can be URL or base64 data URI\n */\nconst iconSchema = z.string().refine(\n (val) => {\n // Allow URLs\n if (val.startsWith('http://') || val.startsWith('https://')) return true;\n // Allow base64 data URIs\n if (val.startsWith('data:image/')) return true;\n // Allow relative paths\n if (val.startsWith('/')) return true;\n return false;\n },\n { message: 'Icon must be a valid URL, base64 data URI, or relative path' }\n);\n\n/**\n * Enhanced ActionMetadata schema with links support\n */\nexport const ActionMetadataSchema = z.object({\n type: z.enum(['action', 'completed']).optional(),\n title: z.string().min(1).max(200),\n icon: iconSchema,\n description: z.string().min(1).max(1000),\n label: z.string().max(50).optional(),\n // Legacy actions (optional)\n actions: z.array(ActionButtonSchema).optional(),\n // Solana-style linked actions (optional)\n links: ActionLinksSchema.optional(),\n disabled: z.boolean().optional(),\n error: z.object({ message: z.string() }).optional(),\n}).refine(\n (data) => {\n // Must have either actions or links (or both)\n return (data.actions && data.actions.length > 0) ||\n (data.links?.actions && data.links.actions.length > 0);\n },\n { message: 'Must have at least one action or linked action' }\n);\n\n/**\n * Enhanced TransactionRequest with data support\n */\nexport const TransactionRequestSchema = z.object({\n account: z.string().regex(addressRegex, 'Invalid Ethereum address'),\n action: z.string().min(1),\n input: z.string().optional(),\n // Solana-style parameter data\n data: z.record(z.union([z.string(), z.array(z.string())])).optional(),\n});\n\nexport const EVMTransactionSchema = z.object({\n to: z.string().regex(addressRegex, 'Invalid to address'),\n value: z.string(),\n data: z.string().regex(hexRegex, 'Invalid hex data'),\n chainId: z.number().positive(),\n});\n\n/**\n * Enhanced TransactionResponse with multi-tx and chaining support\n */\nexport const TransactionResponseSchema = z.object({\n // Single transaction (legacy)\n transaction: EVMTransactionSchema.optional(),\n // Multiple transactions (batch)\n transactions: z.array(EVMTransactionSchema).optional(),\n message: z.string().optional(),\n // Action chaining\n links: z.object({\n next: NextActionLinkSchema.optional(),\n }).optional(),\n}).refine(\n (data) => {\n // Must have either transaction or transactions\n return data.transaction !== undefined || (data.transactions && data.transactions.length > 0);\n },\n { message: 'Must have either transaction or transactions' }\n);\n\n// Validation functions\nexport function validateActionMetadata(\n data: unknown\n): ValidationResult<ActionMetadata> {\n const result = ActionMetadataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as ActionMetadata };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionRequest(\n data: unknown\n): ValidationResult<TransactionRequest> {\n const result = TransactionRequestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionResponse(\n data: unknown\n): ValidationResult<TransactionResponse> {\n const result = TransactionResponseSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TransactionResponse };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function isValidAddress(address: string): boolean {\n return addressRegex.test(address);\n}\n\nexport function isValidHex(hex: string): boolean {\n return hexRegex.test(hex);\n}\n\n// =============================================================================\n// NEW VALIDATION FUNCTIONS\n// =============================================================================\n\n/**\n * Validate a linked action\n */\nexport function validateLinkedAction(\n data: unknown\n): ValidationResult<LinkedAction> {\n const result = LinkedActionSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as LinkedAction };\n }\n return { success: false, error: result.error.message };\n}\n\n/**\n * Validate a parameter\n */\nexport function validateParameter(\n data: unknown\n): ValidationResult<TypedActionParameter> {\n const result = TypedActionParameterSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TypedActionParameter };\n }\n return { success: false, error: result.error.message };\n}\n\n/**\n * Validate parameter values against their definitions\n */\nexport function validateParameterValues(\n parameters: TypedActionParameter[],\n values: Record<string, string | string[]>\n): ValidationResult<Record<string, string | string[]>> {\n const errors: string[] = [];\n\n for (const param of parameters) {\n const value = values[param.name];\n\n // Check required\n if (param.required && (value === undefined || value === '' || (Array.isArray(value) && value.length === 0))) {\n errors.push(`${param.label || param.name} is required`);\n continue;\n }\n\n // Skip validation if no value and not required\n if (value === undefined || value === '') continue;\n\n const strValue = Array.isArray(value) ? value[0] : value;\n\n // Validate pattern\n if (param.pattern && strValue) {\n const regex = new RegExp(param.pattern);\n if (!regex.test(strValue)) {\n errors.push(param.patternDescription || `${param.label || param.name} has invalid format`);\n }\n }\n\n // Validate min/max for number types\n if ((param.type === 'number' || param.type === 'amount') && strValue) {\n const numValue = parseFloat(strValue);\n if (isNaN(numValue)) {\n errors.push(`${param.label || param.name} must be a number`);\n } else {\n if (param.min !== undefined && numValue < Number(param.min)) {\n errors.push(`${param.label || param.name} must be at least ${param.min}`);\n }\n if (param.max !== undefined && numValue > Number(param.max)) {\n errors.push(`${param.label || param.name} must be at most ${param.max}`);\n }\n }\n }\n\n // Validate address type\n if (param.type === 'address' && strValue && !isValidAddress(strValue)) {\n errors.push(`${param.label || param.name} must be a valid Ethereum address`);\n }\n }\n\n if (errors.length > 0) {\n return { success: false, error: errors.join(', ') };\n }\n\n return { success: true, data: values };\n}\n","import type { NextRequest } from 'next/server';\nimport { NextResponse } from 'next/server';\nimport type { Action } from '../builders';\nimport { validateTransactionRequest } from '../validators';\n\n// CORS headers\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type',\n};\n\n// Create Next.js App Router handlers\nexport function createNextHandler(action: Action) {\n // GET handler - returns action metadata\n async function GET() {\n try {\n const metadata = action.getMetadata();\n return NextResponse.json(metadata, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // POST handler - returns transaction\n async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n\n // Validate request\n const validation = validateTransactionRequest(body);\n if (!validation.success) {\n return NextResponse.json(\n { error: { message: validation.error } },\n { status: 400, headers: corsHeaders }\n );\n }\n\n // Handle request\n const response = await action.handleRequest(validation.data);\n\n return NextResponse.json(response, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // OPTIONS handler - CORS preflight\n async function OPTIONS() {\n return new NextResponse(null, { headers: corsHeaders });\n }\n\n return { GET, POST, OPTIONS };\n}\n"]}
|
package/dist/adapters/next.mjs
CHANGED
|
@@ -11,18 +11,113 @@ var ActionButtonSchema = z.object({
|
|
|
11
11
|
placeholder: z.string().optional(),
|
|
12
12
|
disabled: z.boolean().optional()
|
|
13
13
|
});
|
|
14
|
-
z.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
z.enum([
|
|
15
|
+
"text",
|
|
16
|
+
"number",
|
|
17
|
+
"email",
|
|
18
|
+
"url",
|
|
19
|
+
"date",
|
|
20
|
+
"datetime-local",
|
|
21
|
+
"textarea",
|
|
22
|
+
"select",
|
|
23
|
+
"radio",
|
|
24
|
+
"checkbox",
|
|
25
|
+
"address",
|
|
26
|
+
"token",
|
|
27
|
+
"amount"
|
|
28
|
+
]);
|
|
29
|
+
var ActionParameterOptionSchema = z.object({
|
|
30
|
+
label: z.string().min(1),
|
|
31
|
+
value: z.string(),
|
|
32
|
+
selected: z.boolean().optional()
|
|
33
|
+
});
|
|
34
|
+
var ActionParameterBaseSchema = z.object({
|
|
35
|
+
name: z.string().min(1).max(50),
|
|
36
|
+
label: z.string().max(100).optional(),
|
|
37
|
+
required: z.boolean().optional(),
|
|
38
|
+
pattern: z.string().optional(),
|
|
39
|
+
patternDescription: z.string().optional(),
|
|
40
|
+
min: z.union([z.string(), z.number()]).optional(),
|
|
41
|
+
max: z.union([z.string(), z.number()]).optional()
|
|
42
|
+
});
|
|
43
|
+
var ActionParameterSchema = ActionParameterBaseSchema.extend({
|
|
44
|
+
type: z.enum([
|
|
45
|
+
"text",
|
|
46
|
+
"number",
|
|
47
|
+
"email",
|
|
48
|
+
"url",
|
|
49
|
+
"date",
|
|
50
|
+
"datetime-local",
|
|
51
|
+
"textarea",
|
|
52
|
+
"address",
|
|
53
|
+
"token",
|
|
54
|
+
"amount"
|
|
55
|
+
]).optional()
|
|
56
|
+
});
|
|
57
|
+
var ActionParameterSelectableSchema = ActionParameterBaseSchema.extend({
|
|
58
|
+
type: z.enum(["select", "radio", "checkbox"]),
|
|
59
|
+
options: z.array(ActionParameterOptionSchema).min(1)
|
|
60
|
+
});
|
|
61
|
+
var TypedActionParameterSchema = z.union([
|
|
62
|
+
ActionParameterSelectableSchema,
|
|
63
|
+
ActionParameterSchema
|
|
64
|
+
]);
|
|
65
|
+
var LinkedActionTypeSchema = z.enum(["transaction", "post", "external-link"]);
|
|
66
|
+
var LinkedActionSchema = z.object({
|
|
67
|
+
type: LinkedActionTypeSchema.optional(),
|
|
68
|
+
href: z.string().min(1),
|
|
69
|
+
label: z.string().min(1).max(50),
|
|
19
70
|
disabled: z.boolean().optional(),
|
|
20
|
-
|
|
71
|
+
parameters: z.array(TypedActionParameterSchema).optional()
|
|
72
|
+
});
|
|
73
|
+
var ActionLinksSchema = z.object({
|
|
74
|
+
actions: z.array(LinkedActionSchema).min(1)
|
|
75
|
+
});
|
|
76
|
+
var PostNextActionLinkSchema = z.object({
|
|
77
|
+
type: z.literal("post"),
|
|
78
|
+
href: z.string().min(1)
|
|
79
|
+
});
|
|
80
|
+
var InlineNextActionLinkSchema = z.object({
|
|
81
|
+
type: z.literal("inline"),
|
|
82
|
+
action: z.lazy(() => ActionMetadataSchema)
|
|
21
83
|
});
|
|
84
|
+
var NextActionLinkSchema = z.union([
|
|
85
|
+
PostNextActionLinkSchema,
|
|
86
|
+
InlineNextActionLinkSchema
|
|
87
|
+
]);
|
|
88
|
+
var iconSchema = z.string().refine(
|
|
89
|
+
(val) => {
|
|
90
|
+
if (val.startsWith("http://") || val.startsWith("https://")) return true;
|
|
91
|
+
if (val.startsWith("data:image/")) return true;
|
|
92
|
+
if (val.startsWith("/")) return true;
|
|
93
|
+
return false;
|
|
94
|
+
},
|
|
95
|
+
{ message: "Icon must be a valid URL, base64 data URI, or relative path" }
|
|
96
|
+
);
|
|
97
|
+
var ActionMetadataSchema = z.object({
|
|
98
|
+
type: z.enum(["action", "completed"]).optional(),
|
|
99
|
+
title: z.string().min(1).max(200),
|
|
100
|
+
icon: iconSchema,
|
|
101
|
+
description: z.string().min(1).max(1e3),
|
|
102
|
+
label: z.string().max(50).optional(),
|
|
103
|
+
// Legacy actions (optional)
|
|
104
|
+
actions: z.array(ActionButtonSchema).optional(),
|
|
105
|
+
// Solana-style linked actions (optional)
|
|
106
|
+
links: ActionLinksSchema.optional(),
|
|
107
|
+
disabled: z.boolean().optional(),
|
|
108
|
+
error: z.object({ message: z.string() }).optional()
|
|
109
|
+
}).refine(
|
|
110
|
+
(data) => {
|
|
111
|
+
return data.actions && data.actions.length > 0 || data.links?.actions && data.links.actions.length > 0;
|
|
112
|
+
},
|
|
113
|
+
{ message: "Must have at least one action or linked action" }
|
|
114
|
+
);
|
|
22
115
|
var TransactionRequestSchema = z.object({
|
|
23
116
|
account: z.string().regex(addressRegex, "Invalid Ethereum address"),
|
|
24
117
|
action: z.string().min(1),
|
|
25
|
-
input: z.string().optional()
|
|
118
|
+
input: z.string().optional(),
|
|
119
|
+
// Solana-style parameter data
|
|
120
|
+
data: z.record(z.union([z.string(), z.array(z.string())])).optional()
|
|
26
121
|
});
|
|
27
122
|
var EVMTransactionSchema = z.object({
|
|
28
123
|
to: z.string().regex(addressRegex, "Invalid to address"),
|
|
@@ -31,9 +126,21 @@ var EVMTransactionSchema = z.object({
|
|
|
31
126
|
chainId: z.number().positive()
|
|
32
127
|
});
|
|
33
128
|
z.object({
|
|
34
|
-
transaction
|
|
35
|
-
|
|
36
|
-
|
|
129
|
+
// Single transaction (legacy)
|
|
130
|
+
transaction: EVMTransactionSchema.optional(),
|
|
131
|
+
// Multiple transactions (batch)
|
|
132
|
+
transactions: z.array(EVMTransactionSchema).optional(),
|
|
133
|
+
message: z.string().optional(),
|
|
134
|
+
// Action chaining
|
|
135
|
+
links: z.object({
|
|
136
|
+
next: NextActionLinkSchema.optional()
|
|
137
|
+
}).optional()
|
|
138
|
+
}).refine(
|
|
139
|
+
(data) => {
|
|
140
|
+
return data.transaction !== void 0 || data.transactions && data.transactions.length > 0;
|
|
141
|
+
},
|
|
142
|
+
{ message: "Must have either transaction or transactions" }
|
|
143
|
+
);
|
|
37
144
|
function validateTransactionRequest(data) {
|
|
38
145
|
const result = TransactionRequestSchema.safeParse(data);
|
|
39
146
|
if (result.success) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/validators.ts","../../src/adapters/next.ts"],"names":[],"mappings":"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","file":"next.mjs","sourcesContent":["import { z } from 'zod';\nimport type {\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\n ValidationResult,\n} from './types';\n\n// Ethereum address regex\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n// Hex string regex\nconst hexRegex = /^0x[a-fA-F0-9]*$/;\n\n// Zod Schemas\nexport const ActionButtonSchema = z.object({\n label: z.string().min(1).max(50),\n value: z.string().min(1),\n type: z.enum(['button', 'input']),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\nexport const ActionMetadataSchema = z.object({\n title: z.string().min(1).max(100),\n icon: z.string().url(),\n description: z.string().min(1).max(500),\n actions: z.array(ActionButtonSchema).min(1),\n disabled: z.boolean().optional(),\n error: z.object({ message: z.string() }).optional(),\n});\n\nexport const TransactionRequestSchema = z.object({\n account: z.string().regex(addressRegex, 'Invalid Ethereum address'),\n action: z.string().min(1),\n input: z.string().optional(),\n});\n\nexport const EVMTransactionSchema = z.object({\n to: z.string().regex(addressRegex, 'Invalid to address'),\n value: z.string(),\n data: z.string().regex(hexRegex, 'Invalid hex data'),\n chainId: z.number().positive(),\n});\n\nexport const TransactionResponseSchema = z.object({\n transaction: EVMTransactionSchema,\n message: z.string().optional(),\n});\n\n// Validation functions\nexport function validateActionMetadata(\n data: unknown\n): ValidationResult<ActionMetadata> {\n const result = ActionMetadataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as ActionMetadata };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionRequest(\n data: unknown\n): ValidationResult<TransactionRequest> {\n const result = TransactionRequestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionResponse(\n data: unknown\n): ValidationResult<TransactionResponse> {\n const result = TransactionResponseSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TransactionResponse };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function isValidAddress(address: string): boolean {\n return addressRegex.test(address);\n}\n\nexport function isValidHex(hex: string): boolean {\n return hexRegex.test(hex);\n}\n","import type { NextRequest } from 'next/server';\nimport { NextResponse } from 'next/server';\nimport type { Action } from '../builders';\nimport { validateTransactionRequest } from '../validators';\n\n// CORS headers\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type',\n};\n\n// Create Next.js App Router handlers\nexport function createNextHandler(action: Action) {\n // GET handler - returns action metadata\n async function GET() {\n try {\n const metadata = action.getMetadata();\n return NextResponse.json(metadata, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // POST handler - returns transaction\n async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n\n // Validate request\n const validation = validateTransactionRequest(body);\n if (!validation.success) {\n return NextResponse.json(\n { error: { message: validation.error } },\n { status: 400, headers: corsHeaders }\n );\n }\n\n // Handle request\n const response = await action.handleRequest(validation.data);\n\n return NextResponse.json(response, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // OPTIONS handler - CORS preflight\n async function OPTIONS() {\n return new NextResponse(null, { headers: corsHeaders });\n }\n\n return { GET, POST, OPTIONS };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/validators.ts","../../src/adapters/next.ts"],"names":[],"mappings":"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","file":"next.mjs","sourcesContent":["import { z } from 'zod';\nimport type {\n ActionMetadata,\n TransactionRequest,\n TransactionResponse,\n LinkedAction,\n TypedActionParameter,\n ValidationResult,\n} from './types';\n\n// Ethereum address regex\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n// Hex string regex\nconst hexRegex = /^0x[a-fA-F0-9]*$/;\n\n// =============================================================================\n// LEGACY SCHEMAS (Backwards compatible)\n// =============================================================================\n\nexport const ActionButtonSchema = z.object({\n label: z.string().min(1).max(50),\n value: z.string().min(1),\n type: z.enum(['button', 'input']),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n});\n\n// =============================================================================\n// SOLANA-STYLE PARAMETER SCHEMAS\n// =============================================================================\n\n/**\n * Parameter types enum\n */\nexport const ActionParameterTypeSchema = z.enum([\n 'text',\n 'number',\n 'email',\n 'url',\n 'date',\n 'datetime-local',\n 'textarea',\n 'select',\n 'radio',\n 'checkbox',\n 'address',\n 'token',\n 'amount',\n]);\n\n/**\n * Option for select/radio/checkbox\n */\nexport const ActionParameterOptionSchema = z.object({\n label: z.string().min(1),\n value: z.string(),\n selected: z.boolean().optional(),\n});\n\n/**\n * Base parameter fields\n */\nconst ActionParameterBaseSchema = z.object({\n name: z.string().min(1).max(50),\n label: z.string().max(100).optional(),\n required: z.boolean().optional(),\n pattern: z.string().optional(),\n patternDescription: z.string().optional(),\n min: z.union([z.string(), z.number()]).optional(),\n max: z.union([z.string(), z.number()]).optional(),\n});\n\n/**\n * Non-selectable parameter (text, number, etc.)\n */\nexport const ActionParameterSchema = ActionParameterBaseSchema.extend({\n type: z.enum([\n 'text', 'number', 'email', 'url', 'date', 'datetime-local',\n 'textarea', 'address', 'token', 'amount'\n ]).optional(),\n});\n\n/**\n * Selectable parameter (select, radio, checkbox)\n */\nexport const ActionParameterSelectableSchema = ActionParameterBaseSchema.extend({\n type: z.enum(['select', 'radio', 'checkbox']),\n options: z.array(ActionParameterOptionSchema).min(1),\n});\n\n/**\n * Union of all parameter types\n */\nexport const TypedActionParameterSchema = z.union([\n ActionParameterSelectableSchema,\n ActionParameterSchema,\n]);\n\n// =============================================================================\n// LINKED ACTION SCHEMAS\n// =============================================================================\n\n/**\n * Linked action type enum\n */\nexport const LinkedActionTypeSchema = z.enum(['transaction', 'post', 'external-link']);\n\n/**\n * Linked action with href template and parameters\n */\nexport const LinkedActionSchema = z.object({\n type: LinkedActionTypeSchema.optional(),\n href: z.string().min(1),\n label: z.string().min(1).max(50),\n disabled: z.boolean().optional(),\n parameters: z.array(TypedActionParameterSchema).optional(),\n});\n\n/**\n * Links section containing linked actions\n */\nexport const ActionLinksSchema = z.object({\n actions: z.array(LinkedActionSchema).min(1),\n});\n\n// =============================================================================\n// ACTION CHAINING SCHEMAS\n// =============================================================================\n\nexport const PostNextActionLinkSchema = z.object({\n type: z.literal('post'),\n href: z.string().min(1),\n});\n\nexport const InlineNextActionLinkSchema: z.ZodType<{ type: 'inline'; action: ActionMetadata }> = z.object({\n type: z.literal('inline'),\n action: z.lazy(() => ActionMetadataSchema),\n});\n\nexport const NextActionLinkSchema = z.union([\n PostNextActionLinkSchema,\n InlineNextActionLinkSchema,\n]);\n\n// =============================================================================\n// MAIN SCHEMAS (Enhanced)\n// =============================================================================\n\n/**\n * Icon can be URL or base64 data URI\n */\nconst iconSchema = z.string().refine(\n (val) => {\n // Allow URLs\n if (val.startsWith('http://') || val.startsWith('https://')) return true;\n // Allow base64 data URIs\n if (val.startsWith('data:image/')) return true;\n // Allow relative paths\n if (val.startsWith('/')) return true;\n return false;\n },\n { message: 'Icon must be a valid URL, base64 data URI, or relative path' }\n);\n\n/**\n * Enhanced ActionMetadata schema with links support\n */\nexport const ActionMetadataSchema = z.object({\n type: z.enum(['action', 'completed']).optional(),\n title: z.string().min(1).max(200),\n icon: iconSchema,\n description: z.string().min(1).max(1000),\n label: z.string().max(50).optional(),\n // Legacy actions (optional)\n actions: z.array(ActionButtonSchema).optional(),\n // Solana-style linked actions (optional)\n links: ActionLinksSchema.optional(),\n disabled: z.boolean().optional(),\n error: z.object({ message: z.string() }).optional(),\n}).refine(\n (data) => {\n // Must have either actions or links (or both)\n return (data.actions && data.actions.length > 0) ||\n (data.links?.actions && data.links.actions.length > 0);\n },\n { message: 'Must have at least one action or linked action' }\n);\n\n/**\n * Enhanced TransactionRequest with data support\n */\nexport const TransactionRequestSchema = z.object({\n account: z.string().regex(addressRegex, 'Invalid Ethereum address'),\n action: z.string().min(1),\n input: z.string().optional(),\n // Solana-style parameter data\n data: z.record(z.union([z.string(), z.array(z.string())])).optional(),\n});\n\nexport const EVMTransactionSchema = z.object({\n to: z.string().regex(addressRegex, 'Invalid to address'),\n value: z.string(),\n data: z.string().regex(hexRegex, 'Invalid hex data'),\n chainId: z.number().positive(),\n});\n\n/**\n * Enhanced TransactionResponse with multi-tx and chaining support\n */\nexport const TransactionResponseSchema = z.object({\n // Single transaction (legacy)\n transaction: EVMTransactionSchema.optional(),\n // Multiple transactions (batch)\n transactions: z.array(EVMTransactionSchema).optional(),\n message: z.string().optional(),\n // Action chaining\n links: z.object({\n next: NextActionLinkSchema.optional(),\n }).optional(),\n}).refine(\n (data) => {\n // Must have either transaction or transactions\n return data.transaction !== undefined || (data.transactions && data.transactions.length > 0);\n },\n { message: 'Must have either transaction or transactions' }\n);\n\n// Validation functions\nexport function validateActionMetadata(\n data: unknown\n): ValidationResult<ActionMetadata> {\n const result = ActionMetadataSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as ActionMetadata };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionRequest(\n data: unknown\n): ValidationResult<TransactionRequest> {\n const result = TransactionRequestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function validateTransactionResponse(\n data: unknown\n): ValidationResult<TransactionResponse> {\n const result = TransactionResponseSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TransactionResponse };\n }\n return { success: false, error: result.error.message };\n}\n\nexport function isValidAddress(address: string): boolean {\n return addressRegex.test(address);\n}\n\nexport function isValidHex(hex: string): boolean {\n return hexRegex.test(hex);\n}\n\n// =============================================================================\n// NEW VALIDATION FUNCTIONS\n// =============================================================================\n\n/**\n * Validate a linked action\n */\nexport function validateLinkedAction(\n data: unknown\n): ValidationResult<LinkedAction> {\n const result = LinkedActionSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as LinkedAction };\n }\n return { success: false, error: result.error.message };\n}\n\n/**\n * Validate a parameter\n */\nexport function validateParameter(\n data: unknown\n): ValidationResult<TypedActionParameter> {\n const result = TypedActionParameterSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as TypedActionParameter };\n }\n return { success: false, error: result.error.message };\n}\n\n/**\n * Validate parameter values against their definitions\n */\nexport function validateParameterValues(\n parameters: TypedActionParameter[],\n values: Record<string, string | string[]>\n): ValidationResult<Record<string, string | string[]>> {\n const errors: string[] = [];\n\n for (const param of parameters) {\n const value = values[param.name];\n\n // Check required\n if (param.required && (value === undefined || value === '' || (Array.isArray(value) && value.length === 0))) {\n errors.push(`${param.label || param.name} is required`);\n continue;\n }\n\n // Skip validation if no value and not required\n if (value === undefined || value === '') continue;\n\n const strValue = Array.isArray(value) ? value[0] : value;\n\n // Validate pattern\n if (param.pattern && strValue) {\n const regex = new RegExp(param.pattern);\n if (!regex.test(strValue)) {\n errors.push(param.patternDescription || `${param.label || param.name} has invalid format`);\n }\n }\n\n // Validate min/max for number types\n if ((param.type === 'number' || param.type === 'amount') && strValue) {\n const numValue = parseFloat(strValue);\n if (isNaN(numValue)) {\n errors.push(`${param.label || param.name} must be a number`);\n } else {\n if (param.min !== undefined && numValue < Number(param.min)) {\n errors.push(`${param.label || param.name} must be at least ${param.min}`);\n }\n if (param.max !== undefined && numValue > Number(param.max)) {\n errors.push(`${param.label || param.name} must be at most ${param.max}`);\n }\n }\n }\n\n // Validate address type\n if (param.type === 'address' && strValue && !isValidAddress(strValue)) {\n errors.push(`${param.label || param.name} must be a valid Ethereum address`);\n }\n }\n\n if (errors.length > 0) {\n return { success: false, error: errors.join(', ') };\n }\n\n return { success: true, data: values };\n}\n","import type { NextRequest } from 'next/server';\nimport { NextResponse } from 'next/server';\nimport type { Action } from '../builders';\nimport { validateTransactionRequest } from '../validators';\n\n// CORS headers\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type',\n};\n\n// Create Next.js App Router handlers\nexport function createNextHandler(action: Action) {\n // GET handler - returns action metadata\n async function GET() {\n try {\n const metadata = action.getMetadata();\n return NextResponse.json(metadata, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // POST handler - returns transaction\n async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n\n // Validate request\n const validation = validateTransactionRequest(body);\n if (!validation.success) {\n return NextResponse.json(\n { error: { message: validation.error } },\n { status: 400, headers: corsHeaders }\n );\n }\n\n // Handle request\n const response = await action.handleRequest(validation.data);\n\n return NextResponse.json(response, { headers: corsHeaders });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return NextResponse.json(\n { error: { message } },\n { status: 500, headers: corsHeaders }\n );\n }\n }\n\n // OPTIONS handler - CORS preflight\n async function OPTIONS() {\n return new NextResponse(null, { headers: corsHeaders });\n }\n\n return { GET, POST, OPTIONS };\n}\n"]}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { g as ActionDefinition, d as ActionButton, o as ActionLinks, A as ActionMetadata, T as TransactionRequest, a as TransactionResponse, b as TypedActionParameter, L as LinkedAction, m as ActionParameterSelectable, l as ActionParameter, j as ActionParameterOption } from './types-DD9rJ58Y.js';
|
|
2
|
+
|
|
3
|
+
declare function button(config: {
|
|
4
|
+
label: string;
|
|
5
|
+
value: string;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
}): ActionButton;
|
|
8
|
+
declare function input(config: {
|
|
9
|
+
label: string;
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
}): ActionButton;
|
|
13
|
+
/**
|
|
14
|
+
* Create a linked action with optional parameters
|
|
15
|
+
* Uses Solana-style href templates with {parameter} placeholders
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* linkedAction({
|
|
20
|
+
* href: '/api/swap?amount={amount}&token={token}',
|
|
21
|
+
* label: 'Swap Tokens',
|
|
22
|
+
* parameters: [
|
|
23
|
+
* textParam({ name: 'amount', label: 'Amount', required: true }),
|
|
24
|
+
* selectParam({
|
|
25
|
+
* name: 'token',
|
|
26
|
+
* label: 'Token',
|
|
27
|
+
* options: [
|
|
28
|
+
* { label: 'USDC', value: '0x...' },
|
|
29
|
+
* { label: 'USDT', value: '0x...' }
|
|
30
|
+
* ]
|
|
31
|
+
* })
|
|
32
|
+
* ]
|
|
33
|
+
* })
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
declare function linkedAction(config: {
|
|
37
|
+
href: string;
|
|
38
|
+
label: string;
|
|
39
|
+
disabled?: boolean;
|
|
40
|
+
parameters?: TypedActionParameter[];
|
|
41
|
+
}): LinkedAction;
|
|
42
|
+
/**
|
|
43
|
+
* Create a simple linked action button (no parameters, just a static href)
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* actionButton({
|
|
48
|
+
* href: '/api/tip?amount=1',
|
|
49
|
+
* label: 'Tip 1 MNT'
|
|
50
|
+
* })
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
declare function actionButton(config: {
|
|
54
|
+
href: string;
|
|
55
|
+
label: string;
|
|
56
|
+
disabled?: boolean;
|
|
57
|
+
}): LinkedAction;
|
|
58
|
+
/**
|
|
59
|
+
* Create a text parameter
|
|
60
|
+
*/
|
|
61
|
+
declare function textParam(config: {
|
|
62
|
+
name: string;
|
|
63
|
+
label?: string;
|
|
64
|
+
required?: boolean;
|
|
65
|
+
pattern?: string;
|
|
66
|
+
patternDescription?: string;
|
|
67
|
+
}): ActionParameter;
|
|
68
|
+
/**
|
|
69
|
+
* Create a number parameter
|
|
70
|
+
*/
|
|
71
|
+
declare function numberParam(config: {
|
|
72
|
+
name: string;
|
|
73
|
+
label?: string;
|
|
74
|
+
required?: boolean;
|
|
75
|
+
min?: number | string;
|
|
76
|
+
max?: number | string;
|
|
77
|
+
}): ActionParameter;
|
|
78
|
+
/**
|
|
79
|
+
* Create an amount parameter (for token/ETH amounts)
|
|
80
|
+
*/
|
|
81
|
+
declare function amountParam(config: {
|
|
82
|
+
name: string;
|
|
83
|
+
label?: string;
|
|
84
|
+
required?: boolean;
|
|
85
|
+
min?: number | string;
|
|
86
|
+
max?: number | string;
|
|
87
|
+
}): ActionParameter;
|
|
88
|
+
/**
|
|
89
|
+
* Create an address parameter (for wallet addresses)
|
|
90
|
+
*/
|
|
91
|
+
declare function addressParam(config: {
|
|
92
|
+
name: string;
|
|
93
|
+
label?: string;
|
|
94
|
+
required?: boolean;
|
|
95
|
+
}): ActionParameter;
|
|
96
|
+
/**
|
|
97
|
+
* Create a select dropdown parameter
|
|
98
|
+
*/
|
|
99
|
+
declare function selectParam(config: {
|
|
100
|
+
name: string;
|
|
101
|
+
label?: string;
|
|
102
|
+
required?: boolean;
|
|
103
|
+
options: ActionParameterOption[];
|
|
104
|
+
}): ActionParameterSelectable;
|
|
105
|
+
/**
|
|
106
|
+
* Create a radio button group parameter
|
|
107
|
+
*/
|
|
108
|
+
declare function radioParam(config: {
|
|
109
|
+
name: string;
|
|
110
|
+
label?: string;
|
|
111
|
+
required?: boolean;
|
|
112
|
+
options: ActionParameterOption[];
|
|
113
|
+
}): ActionParameterSelectable;
|
|
114
|
+
/**
|
|
115
|
+
* Create a checkbox parameter (multiple selection)
|
|
116
|
+
*/
|
|
117
|
+
declare function checkboxParam(config: {
|
|
118
|
+
name: string;
|
|
119
|
+
label?: string;
|
|
120
|
+
required?: boolean;
|
|
121
|
+
options: ActionParameterOption[];
|
|
122
|
+
}): ActionParameterSelectable;
|
|
123
|
+
/**
|
|
124
|
+
* Create a date parameter
|
|
125
|
+
*/
|
|
126
|
+
declare function dateParam(config: {
|
|
127
|
+
name: string;
|
|
128
|
+
label?: string;
|
|
129
|
+
required?: boolean;
|
|
130
|
+
min?: string;
|
|
131
|
+
max?: string;
|
|
132
|
+
}): ActionParameter;
|
|
133
|
+
/**
|
|
134
|
+
* Create a textarea parameter (multi-line text)
|
|
135
|
+
*/
|
|
136
|
+
declare function textareaParam(config: {
|
|
137
|
+
name: string;
|
|
138
|
+
label?: string;
|
|
139
|
+
required?: boolean;
|
|
140
|
+
}): ActionParameter;
|
|
141
|
+
/**
|
|
142
|
+
* Create an option for select/radio/checkbox parameters
|
|
143
|
+
*/
|
|
144
|
+
declare function option(label: string, value: string, selected?: boolean): ActionParameterOption;
|
|
145
|
+
/**
|
|
146
|
+
* Create a links object with actions array
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* createLinks([
|
|
151
|
+
* actionButton({ href: '/api/tip?amount=1', label: 'Tip 1 MNT' }),
|
|
152
|
+
* actionButton({ href: '/api/tip?amount=5', label: 'Tip 5 MNT' }),
|
|
153
|
+
* linkedAction({
|
|
154
|
+
* href: '/api/tip?amount={amount}',
|
|
155
|
+
* label: 'Custom Amount',
|
|
156
|
+
* parameters: [amountParam({ name: 'amount', required: true })]
|
|
157
|
+
* })
|
|
158
|
+
* ])
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
declare function createLinks(actions: LinkedAction[]): ActionLinks;
|
|
162
|
+
/**
|
|
163
|
+
* Replace placeholders in href template with parameter values
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```ts
|
|
167
|
+
* buildHref('/api/swap?amount={amount}&token={token}', { amount: '100', token: '0x...' })
|
|
168
|
+
* // Returns: '/api/swap?amount=100&token=0x...'
|
|
169
|
+
* ```
|
|
170
|
+
*/
|
|
171
|
+
declare function buildHref(template: string, params: Record<string, string | string[]>): string;
|
|
172
|
+
/**
|
|
173
|
+
* Extract parameter names from href template
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```ts
|
|
177
|
+
* extractParams('/api/swap?amount={amount}&token={token}')
|
|
178
|
+
* // Returns: ['amount', 'token']
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
declare function extractParams(template: string): string[];
|
|
182
|
+
/**
|
|
183
|
+
* Check if a linked action has parameters that need to be collected
|
|
184
|
+
*/
|
|
185
|
+
declare function hasParameters(action: LinkedAction): boolean;
|
|
186
|
+
/**
|
|
187
|
+
* Check if a parameter is selectable (select/radio/checkbox)
|
|
188
|
+
*/
|
|
189
|
+
declare function isSelectableParam(param: TypedActionParameter): param is ActionParameterSelectable;
|
|
190
|
+
interface Action {
|
|
191
|
+
getMetadata(): ActionMetadata;
|
|
192
|
+
handleRequest(request: TransactionRequest): Promise<TransactionResponse>;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Extended action definition that supports both legacy actions and linked actions
|
|
196
|
+
*/
|
|
197
|
+
interface ExtendedActionDefinition extends Omit<ActionDefinition, 'actions'> {
|
|
198
|
+
/** Primary button label */
|
|
199
|
+
label?: string;
|
|
200
|
+
/** Legacy actions array (backwards compatible) */
|
|
201
|
+
actions?: ActionButton[];
|
|
202
|
+
/** Solana-style linked actions */
|
|
203
|
+
links?: ActionLinks;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Create a complete action with support for both legacy and Solana-style linked actions
|
|
207
|
+
*
|
|
208
|
+
* @example Legacy style (backwards compatible):
|
|
209
|
+
* ```ts
|
|
210
|
+
* createAction({
|
|
211
|
+
* title: 'Tip',
|
|
212
|
+
* icon: 'https://...',
|
|
213
|
+
* description: 'Send a tip',
|
|
214
|
+
* actions: [
|
|
215
|
+
* button({ label: '1 MNT', value: '1' }),
|
|
216
|
+
* input({ label: 'Custom' })
|
|
217
|
+
* ],
|
|
218
|
+
* handler: async (ctx) => ({ transaction: {...} })
|
|
219
|
+
* })
|
|
220
|
+
* ```
|
|
221
|
+
*
|
|
222
|
+
* @example Solana-style linked actions:
|
|
223
|
+
* ```ts
|
|
224
|
+
* createAction({
|
|
225
|
+
* title: 'Swap Tokens',
|
|
226
|
+
* icon: 'https://...',
|
|
227
|
+
* description: 'Swap tokens on DEX',
|
|
228
|
+
* links: createLinks([
|
|
229
|
+
* actionButton({ href: '/api/swap?amount=10', label: 'Swap 10' }),
|
|
230
|
+
* linkedAction({
|
|
231
|
+
* href: '/api/swap?amount={amount}&token={token}',
|
|
232
|
+
* label: 'Custom Swap',
|
|
233
|
+
* parameters: [
|
|
234
|
+
* amountParam({ name: 'amount', required: true }),
|
|
235
|
+
* selectParam({ name: 'token', options: [...] })
|
|
236
|
+
* ]
|
|
237
|
+
* })
|
|
238
|
+
* ]),
|
|
239
|
+
* handler: async (ctx) => ({ transaction: {...} })
|
|
240
|
+
* })
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
declare function createAction(definition: ExtendedActionDefinition): Action;
|
|
244
|
+
|
|
245
|
+
export { type Action as A, type ExtendedActionDefinition as E, actionButton as a, button as b, createAction as c, createLinks as d, buildHref as e, extractParams as f, isSelectableParam as g, hasParameters as h, input as i, amountParam as j, addressParam as k, linkedAction as l, checkboxParam as m, numberParam as n, dateParam as o, textareaParam as p, option as q, radioParam as r, selectParam as s, textParam as t };
|