ci: verify locale data (#13849)
* ci: verify locale data * ci: separate workflows * ci: missing installation
This commit is contained in:
		
							parent
							
								
									367bf0c8fc
								
							
						
					
					
						commit
						1d4e6393f3
					
				
					 2 changed files with 80 additions and 0 deletions
				
			
		
							
								
								
									
										27
									
								
								.github/workflows/locale.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								.github/workflows/locale.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					name: Lint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    paths:
 | 
				
			||||||
 | 
					      - locales/**
 | 
				
			||||||
 | 
					  pull_request:
 | 
				
			||||||
 | 
					    paths:
 | 
				
			||||||
 | 
					      - locales/**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  locale_verify:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    continue-on-error: true
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					    - uses: actions/checkout@v4.1.1
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        fetch-depth: 0
 | 
				
			||||||
 | 
					        submodules: true
 | 
				
			||||||
 | 
					    - uses: pnpm/action-setup@v4
 | 
				
			||||||
 | 
					    - uses: actions/setup-node@v4.0.2
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        node-version-file: '.node-version'
 | 
				
			||||||
 | 
					        cache: 'pnpm'
 | 
				
			||||||
 | 
					    - run: corepack enable
 | 
				
			||||||
 | 
					    - run: pnpm i --frozen-lockfile
 | 
				
			||||||
 | 
					    - run: cd locales && node verify.js
 | 
				
			||||||
							
								
								
									
										53
									
								
								locales/verify.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								locales/verify.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,53 @@
 | 
				
			||||||
 | 
					import locales from './index.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let valid = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function writeError(type, lang, tree, data) {
 | 
				
			||||||
 | 
						process.stderr.write(JSON.stringify({ type, lang, tree, data }));
 | 
				
			||||||
 | 
						process.stderr.write('\n');
 | 
				
			||||||
 | 
						valid = false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function verify(expected, actual, lang, trace) {
 | 
				
			||||||
 | 
						for (let key in expected) {
 | 
				
			||||||
 | 
							if (!Object.prototype.hasOwnProperty.call(actual, key)) {
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (typeof expected[key] === 'object') {
 | 
				
			||||||
 | 
								if (typeof actual[key] !== 'object') {
 | 
				
			||||||
 | 
									writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'object', actual: typeof actual[key] });
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								verify(expected[key], actual[key], lang, trace ? `${trace}.${key}` : key);
 | 
				
			||||||
 | 
							} else if (typeof expected[key] === 'string') {
 | 
				
			||||||
 | 
								switch (typeof actual[key]) {
 | 
				
			||||||
 | 
									case 'object':
 | 
				
			||||||
 | 
										writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'string', actual: 'object' });
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									case 'undefined':
 | 
				
			||||||
 | 
										continue;
 | 
				
			||||||
 | 
									case 'string':
 | 
				
			||||||
 | 
										const expectedParameters = new Set(expected[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
 | 
				
			||||||
 | 
										const actualParameters = new Set(actual[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
 | 
				
			||||||
 | 
										for (let parameter of expectedParameters) {
 | 
				
			||||||
 | 
											if (!actualParameters.has(parameter)) {
 | 
				
			||||||
 | 
												writeError('missing_parameter', lang, trace ? `${trace}.${key}` : key, { parameter });
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const { ['ja-JP']: original, ...verifiees } = locales;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for (let lang in verifiees) {
 | 
				
			||||||
 | 
						if (!Object.prototype.hasOwnProperty.call(locales, lang)) {
 | 
				
			||||||
 | 
							continue;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						verify(original, verifiees[lang], lang);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (!valid) {
 | 
				
			||||||
 | 
						process.exit(1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue