mirror of
				https://github.com/Instadapp/chains.git
				synced 2024-07-29 22:37:19 +00:00 
			
		
		
		
	Check and validate JSON schema (#1509)
* Validate json * wip: gh workflow test * wip: added workflow for JSON validation * Schema Improved. * Improved Workflow and Schema check for JSON files * Fixed JSON Schema * Fixed typo * Removed auto generated file * updated required fields in chainSchema * updated chain schema * removed `network` from README.md example * improved schemaCheck script * Matching ChainID with file name schema.
This commit is contained in:
		
							parent
							
								
									a3cd16b7a7
								
							
						
					
					
						commit
						bf8ce68096
					
				
							
								
								
									
										24
									
								
								.github/workflows/validate_json.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								.github/workflows/validate_json.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | |||
| name: Check JSON Schema | ||||
| 
 | ||||
| on: | ||||
|   push: | ||||
|   pull_request: | ||||
| 
 | ||||
| jobs: | ||||
|   validate_json: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - name: Check out repo | ||||
|       uses: actions/checkout@v2 | ||||
|     - uses: actions/cache@v2 | ||||
|       name: Configure npm caching | ||||
|       with: | ||||
|         path: ~/.npm | ||||
|         key: ${{ runner.os }}-npm-${{ hashFiles('**/workflows/validate_json.yml') }} | ||||
|         restore-keys: | | ||||
|           ${{ runner.os }}-npm- | ||||
|     - name: Run JSON Validation | ||||
|       working-directory: ./tools | ||||
|       run: |- | ||||
|         npm install | ||||
|         node schemaCheck.js | ||||
							
								
								
									
										114
									
								
								tools/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								tools/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,114 @@ | |||
| { | ||||
|   "name": "tools", | ||||
|   "lockfileVersion": 2, | ||||
|   "requires": true, | ||||
|   "packages": { | ||||
|     "": { | ||||
|       "devDependencies": { | ||||
|         "ajv": "^8.11.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/ajv": { | ||||
|       "version": "8.11.0", | ||||
|       "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", | ||||
|       "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "fast-deep-equal": "^3.1.1", | ||||
|         "json-schema-traverse": "^1.0.0", | ||||
|         "require-from-string": "^2.0.2", | ||||
|         "uri-js": "^4.2.2" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "type": "github", | ||||
|         "url": "https://github.com/sponsors/epoberezkin" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/fast-deep-equal": { | ||||
|       "version": "3.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", | ||||
|       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/json-schema-traverse": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", | ||||
|       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/punycode": { | ||||
|       "version": "2.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | ||||
|       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=6" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/require-from-string": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", | ||||
|       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=0.10.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/uri-js": { | ||||
|       "version": "4.4.1", | ||||
|       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", | ||||
|       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "punycode": "^2.1.0" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "ajv": { | ||||
|       "version": "8.11.0", | ||||
|       "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", | ||||
|       "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "fast-deep-equal": "^3.1.1", | ||||
|         "json-schema-traverse": "^1.0.0", | ||||
|         "require-from-string": "^2.0.2", | ||||
|         "uri-js": "^4.2.2" | ||||
|       } | ||||
|     }, | ||||
|     "fast-deep-equal": { | ||||
|       "version": "3.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", | ||||
|       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "json-schema-traverse": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", | ||||
|       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "punycode": { | ||||
|       "version": "2.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | ||||
|       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "require-from-string": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", | ||||
|       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "uri-js": { | ||||
|       "version": "4.4.1", | ||||
|       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", | ||||
|       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "punycode": "^2.1.0" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										5
									
								
								tools/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								tools/package.json
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| { | ||||
|   "devDependencies": { | ||||
|     "ajv": "^8.11.0" | ||||
|   } | ||||
| } | ||||
|  | @ -2,18 +2,20 @@ | |||
|  * This removed `network` param from all the chain files | ||||
|  * Since this is the only tool here, it is here in index.js | ||||
|  */ | ||||
| 
 | ||||
| const fs = require('fs'); | ||||
| const { exec } = require('child_process'); | ||||
| const chainFiles = fs.readdirSync('../_data/chains/'); | ||||
| 
 | ||||
| for(const chainFile of chainFiles){ | ||||
| for (const chainFile of chainFiles) { | ||||
|     const fileLocation = `../_data/chains/${chainFile}` | ||||
|     const fileData = fs.readFileSync(fileLocation,'utf8') | ||||
|     const fileData = fs.readFileSync(fileLocation, 'utf8') | ||||
|     const fileDataJson = JSON.parse(fileData) | ||||
|     if(fileDataJson.network){ | ||||
| 
 | ||||
|     if (fileDataJson.network) { | ||||
|         delete fileDataJson.network | ||||
|         fs.writeFileSync(fileLocation, JSON.stringify(fileDataJson, null, 2)) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // TODO: Run `npx prettier --write --ignore-unknown _data`from Project Directory
 | ||||
| // Note: 
 | ||||
| // Run `npx prettier --write --ignore-unknown _data`from Project Directory
 | ||||
							
								
								
									
										123
									
								
								tools/schema/chainSchema.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								tools/schema/chainSchema.json
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,123 @@ | |||
| { | ||||
|     "$schema": "http://json-schema.org/schema#", | ||||
|     "title": "EIP155 Chain Data", | ||||
|     "type":"object", | ||||
|     "required": ["name","shortName","chain","chainId","networkId","rpc","faucets","infoURL","nativeCurrency"], | ||||
|     "properties": { | ||||
|         "name":{ | ||||
|             "type":"string", | ||||
|             "description": "Name of the Network" | ||||
|         }, | ||||
|         "shortName":{ | ||||
|             "type":"string" | ||||
|         }, | ||||
|         "title":{ | ||||
|             "type":"string", | ||||
|             "description": "Optional title for the Network" | ||||
|         }, | ||||
|         "chain":{ | ||||
|             "type":"string", | ||||
|             "description": "Name of the Network" | ||||
|         }, | ||||
|         "icon":{ | ||||
|             "type":"string", | ||||
|             "description": "Icon type" | ||||
|         }, | ||||
|         "rpc":{ | ||||
|             "type":"array", | ||||
|             "items":{ | ||||
|                 "type":"string" | ||||
|             } | ||||
|         }, | ||||
|         "faucets":{ | ||||
|             "type":"array", | ||||
|             "items":{ | ||||
|                 "type":"string" | ||||
|             } | ||||
|         }, | ||||
|         "nativeCurrency":{ | ||||
|             "type":"object", | ||||
|             "properties": { | ||||
|                 "name":{ | ||||
|                     "type":"string", | ||||
|                     "description":"Name of the Native Currency" | ||||
|                 }, | ||||
|                 "symbol":{ | ||||
|                     "type":"string", | ||||
|                     "description":"Symbol of the Native Currency" | ||||
|                 }, | ||||
|                 "decimals":{ | ||||
|                     "type":"number", | ||||
|                     "description":"Decimal points supported" | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         "infoURL":{ | ||||
|             "type":"string", | ||||
|             "description": "infoURL" | ||||
|         }, | ||||
|         "chainId":{ | ||||
|             "type":"number", | ||||
|             "description": "Chain ID of the Network" | ||||
|         }, | ||||
|         "networkId":{ | ||||
|             "type":"number", | ||||
|             "description": "Network ID of the Network" | ||||
|         }, | ||||
|         "slip44":{ | ||||
|             "type":"number", | ||||
|             "description": "Slip44 of the Network" | ||||
|         }, | ||||
|         "ens":{ | ||||
|             "type":"object", | ||||
|             "properties": { | ||||
|                 "registry":{ | ||||
|                     "type":"string" | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         "explorers":{ | ||||
|             "type":"array", | ||||
|             "items":{ | ||||
|                 "type":"object", | ||||
|                 "properties": { | ||||
|                     "name":{ | ||||
|                         "type":"string" | ||||
|                     }, | ||||
|                     "url":{ | ||||
|                         "type":"string" | ||||
|                     }, | ||||
|                     "standard":{ | ||||
|                         "type":"string" | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         "parent":{ | ||||
|             "type":"object", | ||||
|             "properties": { | ||||
|                 "type":{ | ||||
|                     "type":"string" | ||||
|                 }, | ||||
|                 "chain":{ | ||||
|                     "type":"string" | ||||
|                 }, | ||||
|                 "bridges":{ | ||||
|                     "type":"array", | ||||
|                     "items": { | ||||
|                         "type":"object", | ||||
|                         "properties":{ | ||||
|                             "url": { | ||||
|                                 "type":"string" | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         "status":{ | ||||
|             "type":"string" | ||||
|         } | ||||
|     }, | ||||
|     "additionalProperties": false | ||||
| } | ||||
							
								
								
									
										25
									
								
								tools/schemaCheck.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								tools/schemaCheck.js
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| const fs = require('fs'); | ||||
| const Ajv = require("ajv") | ||||
| const ajv = new Ajv() | ||||
| const schema = require('./schema/chainSchema.json') | ||||
| const chainFiles = fs.readdirSync('../_data/chains/'); | ||||
| 
 | ||||
| const filesWithErrors = [] | ||||
| for(const chainFile of chainFiles){ | ||||
|     const fileLocation = `../_data/chains/${chainFile}` | ||||
|     const fileData = fs.readFileSync(fileLocation,'utf8') | ||||
|     const fileDataJson = JSON.parse(fileData) | ||||
|     const chainIdFromFileName = chainFile.match(/eip155-(\d+)\.json/)[1] | ||||
|     if(chainIdFromFileName != fileDataJson.chainId){ | ||||
|         throw new Error(`File Name does not match with ChainID in ${chainFile}`) | ||||
|     } | ||||
|     const valid = ajv.validate(schema, fileDataJson) | ||||
|     if(!valid) { | ||||
|         console.error(ajv.errors) | ||||
|         filesWithErrors.push(chainFile)    | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| if(filesWithErrors.length > 0){ | ||||
|     throw new Error(`Invalid JSON Schema in ${filesWithErrors.length} files at ${filesWithErrors.join(",")}`) | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Ashutosh Kumar
						Ashutosh Kumar