|
1 | 1 | import Joi from 'joi' |
2 | | -import type { SelectAccountOptions } from './types' |
3 | 2 |
|
4 | | -const basePath = Joi.object({ |
5 | | - label: Joi.string().required(), |
6 | | - value: Joi.string().required() |
| 3 | +export type ValidateReturn = Joi.ValidationResult | null |
| 4 | + |
| 5 | +export function validate(validator: Joi.Schema, data: unknown): ValidateReturn { |
| 6 | + const result = validator.validate(data) |
| 7 | + return result.error ? result : null |
| 8 | +} |
| 9 | + |
| 10 | +export const chainIdValidation = Joi.alternatives().try( |
| 11 | + Joi.string().pattern(/^0x[0-9a-fA-F]+$/), |
| 12 | + Joi.number().positive() |
| 13 | +) |
| 14 | + |
| 15 | +export const chainNamespaceValidation = Joi.string().valid('evm') |
| 16 | + |
| 17 | +/** Related to ConnectionInfo from 'ethers/lib/utils' */ |
| 18 | +export const providerConnectionInfoValidation = Joi.object({ |
| 19 | + url: Joi.string().required(), |
| 20 | + headers: Joi.object(), |
| 21 | + user: Joi.string(), |
| 22 | + password: Joi.string(), |
| 23 | + allowInsecureAuthentication: Joi.boolean(), |
| 24 | + allowGzip: Joi.boolean(), |
| 25 | + throttleLimit: Joi.number(), |
| 26 | + throttleSlotInterval: Joi.number(), |
| 27 | + throttleCallback: Joi.function(), |
| 28 | + timeout: Joi.number() |
7 | 29 | }) |
8 | | -const basePaths = Joi.array().items(basePath) |
9 | 30 |
|
10 | | -const chain = Joi.object({ |
11 | | - namespace: Joi.string(), |
12 | | - id: Joi.string() |
13 | | - .pattern(/^0x[0-9a-fA-F]+$/) |
14 | | - .required(), |
| 31 | +export const chainValidation = Joi.object({ |
| 32 | + namespace: chainNamespaceValidation, |
| 33 | + id: chainIdValidation.required(), |
15 | 34 | rpcUrl: Joi.string().required(), |
16 | 35 | label: Joi.string().required(), |
17 | 36 | token: Joi.string().required(), |
18 | 37 | icon: Joi.string(), |
19 | | - color: Joi.string() |
20 | | -}) |
21 | | - |
22 | | -const chains = Joi.array().items(chain) |
23 | | - |
24 | | -const asset = Joi.object({ |
25 | | - label: Joi.string().required(), |
26 | | - address: Joi.string() |
| 38 | + color: Joi.string(), |
| 39 | + publicRpcUrl: Joi.string(), |
| 40 | + blockExplorerUrl: Joi.string(), |
| 41 | + providerConnectionInfoValidation |
27 | 42 | }) |
28 | | -const assets = Joi.array().items(asset) |
29 | | - |
30 | | -const selectAccountOptions = Joi.object({ |
31 | | - basePaths: basePaths, |
32 | | - assets: assets, |
33 | | - chains: chains, |
34 | | - scanAccounts: Joi.function().arity(1).required(), |
35 | | - supportsCustomPath: Joi.bool() |
36 | | -}) |
37 | | - |
38 | | -type ValidateReturn = Joi.ValidationResult | null |
39 | | - |
40 | | -const validate = (validator: Joi.Schema, data: unknown): ValidateReturn => { |
41 | | - const result = validator.validate(data) |
42 | | - return result.error ? result : null |
43 | | -} |
44 | | - |
45 | | -export const validateSelectAccountOptions = ( |
46 | | - data: SelectAccountOptions |
47 | | -): ValidateReturn => { |
48 | | - return validate(selectAccountOptions, data) |
49 | | -} |
0 commit comments