Enable linting of JS inside templates (#13708)
Indentation-related rules are disabled because indent templates with tabs but our lint rules expect spaces. Also had to exclude a few files where using template variables in the JS is causing syntax errors for the JS parser. I don't think there's a way to solve this otherwise. Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
		
							parent
							
								
									3f13e07849
								
							
						
					
					
						commit
						7ab3633598
					
				
					 7 changed files with 81 additions and 9 deletions
				
			
		
							
								
								
									
										13
									
								
								.eslintrc
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								.eslintrc
									
									
									
									
									
								
							|  | @ -3,6 +3,9 @@ reportUnusedDisableDirectives: true | |||
| 
 | ||||
| ignorePatterns: | ||||
|   - /web_src/js/vendor | ||||
|   - /templates/base/head.tmpl | ||||
|   - /templates/repo/activity.tmpl | ||||
|   - /templates/repo/view_file.tmpl | ||||
| 
 | ||||
| parserOptions: | ||||
|   sourceType: module | ||||
|  | @ -12,6 +15,7 @@ plugins: | |||
|   - eslint-plugin-unicorn | ||||
|   - eslint-plugin-import | ||||
|   - eslint-plugin-vue | ||||
|   - eslint-plugin-html | ||||
| 
 | ||||
| extends: | ||||
|   - plugin:vue/recommended | ||||
|  | @ -27,12 +31,19 @@ globals: | |||
|   SimpleMDE: false | ||||
|   u2fApi: false | ||||
| 
 | ||||
| settings: | ||||
|   html/html-extensions: [".tmpl"] | ||||
| 
 | ||||
| overrides: | ||||
|   - files: ["web_src/**/*.js", "web_src/**/*.vue"] | ||||
|   - files: ["web_src/**/*.js", "web_src/**/*.vue", "templates/**/*.tmpl"] | ||||
|     env: | ||||
|       browser: true | ||||
|       jquery: true | ||||
|       node: false | ||||
|   - files: ["templates/**/*.tmpl"] | ||||
|     rules: | ||||
|       no-tabs: [0] | ||||
|       indent: [2, tab, {SwitchCase: 1}] | ||||
|   - files: ["web_src/**/*worker.js"] | ||||
|     env: | ||||
|       worker: true | ||||
|  |  | |||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							|  | @ -312,7 +312,7 @@ lint: lint-frontend lint-backend | |||
| 
 | ||||
| .PHONY: lint-frontend | ||||
| lint-frontend: node_modules | ||||
| 	npx eslint --max-warnings=0 web_src/js build webpack.config.js | ||||
| 	npx eslint --max-warnings=0 web_src/js build templates webpack.config.js | ||||
| 	npx stylelint --max-warnings=0 web_src/less | ||||
| 
 | ||||
| .PHONY: lint-backend | ||||
|  |  | |||
							
								
								
									
										60
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										60
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							|  | @ -5100,6 +5100,66 @@ | |||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "eslint-plugin-html": { | ||||
|       "version": "6.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.1.1.tgz", | ||||
|       "integrity": "sha512-JSe3ZDb7feKMnQM27XWGeoIjvP4oWQMJD9GZ6wW67J7/plVL87NK72RBwlvfc3tTZiYUchHhxAwtgEd1GdofDA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "htmlparser2": "^5.0.1" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "dom-serializer": { | ||||
|           "version": "1.1.0", | ||||
|           "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.1.0.tgz", | ||||
|           "integrity": "sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ==", | ||||
|           "dev": true, | ||||
|           "requires": { | ||||
|             "domelementtype": "^2.0.1", | ||||
|             "domhandler": "^3.0.0", | ||||
|             "entities": "^2.0.0" | ||||
|           } | ||||
|         }, | ||||
|         "domelementtype": { | ||||
|           "version": "2.0.2", | ||||
|           "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", | ||||
|           "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", | ||||
|           "dev": true | ||||
|         }, | ||||
|         "domhandler": { | ||||
|           "version": "3.3.0", | ||||
|           "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", | ||||
|           "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", | ||||
|           "dev": true, | ||||
|           "requires": { | ||||
|             "domelementtype": "^2.0.1" | ||||
|           } | ||||
|         }, | ||||
|         "domutils": { | ||||
|           "version": "2.4.2", | ||||
|           "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.2.tgz", | ||||
|           "integrity": "sha512-NKbgaM8ZJOecTZsIzW5gSuplsX2IWW2mIK7xVr8hTQF2v1CJWTmLZ1HOCh5sH+IzVPAGE5IucooOkvwBRAdowA==", | ||||
|           "dev": true, | ||||
|           "requires": { | ||||
|             "dom-serializer": "^1.0.1", | ||||
|             "domelementtype": "^2.0.1", | ||||
|             "domhandler": "^3.3.0" | ||||
|           } | ||||
|         }, | ||||
|         "htmlparser2": { | ||||
|           "version": "5.0.1", | ||||
|           "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", | ||||
|           "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", | ||||
|           "dev": true, | ||||
|           "requires": { | ||||
|             "domelementtype": "^2.0.1", | ||||
|             "domhandler": "^3.3.0", | ||||
|             "domutils": "^2.4.2", | ||||
|             "entities": "^2.0.0" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "eslint-plugin-import": { | ||||
|       "version": "2.22.1", | ||||
|       "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", | ||||
|  |  | |||
|  | @ -55,6 +55,7 @@ | |||
|   }, | ||||
|   "devDependencies": { | ||||
|     "eslint": "7.13.0", | ||||
|     "eslint-plugin-html": "6.1.1", | ||||
|     "eslint-plugin-import": "2.22.1", | ||||
|     "eslint-plugin-unicorn": "23.0.0", | ||||
|     "eslint-plugin-vue": "7.1.0", | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ | |||
| 	<script src="{{StaticUrlPrefix}}/vendor/plugins/codemirror/addon/mode/loadmode.js"></script> | ||||
| 	<script src="{{StaticUrlPrefix}}/vendor/plugins/codemirror/mode/meta.js"></script> | ||||
| 	<script> | ||||
| 		CodeMirror.modeURL =  "{{StaticUrlPrefix}}/vendor/plugins/codemirror/mode/%N/%N.js"; | ||||
| 		CodeMirror.modeURL = '{{StaticUrlPrefix}}/vendor/plugins/codemirror/mode/%N/%N.js'; | ||||
| 	</script> | ||||
| {{end}} | ||||
| 
 | ||||
|  |  | |||
|  | @ -278,14 +278,14 @@ | |||
| 
 | ||||
| 		{{if .IsSplitStyle}} | ||||
| 			<script> | ||||
| 				document.addEventListener('DOMContentLoaded', function() { | ||||
| 				document.addEventListener('DOMContentLoaded', () => { | ||||
| 					$('tr.add-code').each(function() { | ||||
| 						var prev = $(this).prev(); | ||||
| 						let prev = $(this).prev(); | ||||
| 						if (prev.is('.del-code') && prev.children().eq(5).text().trim() === '') { | ||||
| 							while (prev.prev().is('.del-code') && prev.prev().children().eq(5).text().trim() === '') { | ||||
| 								prev = prev.prev(); | ||||
| 							} | ||||
| 							prev.children().eq(3).attr("data-line-num", $(this).children().eq(3).attr("data-line-num")); | ||||
| 							prev.children().eq(3).attr('data-line-num', $(this).children().eq(3).attr('data-line-num')); | ||||
| 							prev.children().eq(3).html($(this).children().eq(3).html()); | ||||
| 							prev.children().eq(4).html($(this).children().eq(4).html()); | ||||
| 							prev.children().eq(5).html($(this).children().eq(5).html()); | ||||
|  |  | |||
|  | @ -135,7 +135,7 @@ | |||
| 							if (httpsButton) httpsButton.classList[isSSH ? 'remove' : 'add']('primary'); | ||||
| 							setTimeout(() => { | ||||
| 								if (sshButton) sshButton.classList.remove('no-transition'); | ||||
| 								if (httpsButto) httpsButton.classList.remove('no-transition'); | ||||
| 								if (httpsButton) httpsButton.classList.remove('no-transition'); | ||||
| 							}, 100); | ||||
| 						</script> | ||||
| 						{{if or (not $.DisableHTTP) (and (not $.DisableSSH) (or $.IsSigned $.ExposeAnonSSH))}} | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue