| # Copyright 2022 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from pathlib import Path |
| |
| |
| def _CheckNoDirectLitImport(input_api, output_api): |
| """We want to isolate the dependency of LitElement to only one file |
| (ui/file_manager/file_manager/widgets/xf_base.ts), so it's easier to handle |
| the potential breaking changes from LitElement easier. This job checks |
| the imports from the TS/JS files to make sure only xf_base can import from |
| Lit directly. |
| """ |
| def _isLitDisallowed(file_path): |
| xf_base_file_path = input_api.os_path.join('ui', 'file_manager', |
| 'file_manager', 'widgets', |
| 'xf_base.ts') |
| selector_path = input_api.os_path.join('ui', 'file_manager', |
| 'file_manager', 'lib', |
| 'selector.ts') |
| |
| allowed_paths = {xf_base_file_path, selector_path} |
| local_path = file_path.LocalPath() |
| return Path(local_path).suffix in { |
| '.ts', '.js' |
| } and local_path not in allowed_paths |
| |
| ts_files = input_api.AffectedFiles(include_deletes=False, |
| file_filter=_isLitDisallowed) |
| if not ts_files: |
| return [] |
| |
| lit_import_pattern = "from 'chrome://resources/mwc/lit/" |
| results = [] |
| for f in ts_files: |
| for line_num, line in enumerate(f.NewContents(), 1): |
| if lit_import_pattern in line: |
| results.append( |
| output_api.PresubmitPromptWarning( |
| "%s:%d:\n\n %s\n\n" |
| "Direct import from lit is not allowed. All lit " |
| "related dependencies should be limited in file " |
| "ui/file_manager/file_manager/widgets/xf_base.ts and " |
| "all other files should import xf_base instead." % |
| (f.LocalPath(), line_num, line.strip()))) |
| break |
| |
| return results |
| |
| |
| def _IsComment(line): |
| l = line.lstrip() |
| return l.startswith(('//', '/*', '* ')) |
| |
| |
| def _CheckBannedTsTags(input_api, output_api): |
| # It allow @ts-ignore in test files |
| is_test = lambda fname: '_unittest' in fname or 'mock_' in fname |
| ts_only = lambda f: (f.LocalPath().endswith('.ts') and |
| not is_test(f.LocalPath())) |
| results = [] |
| offending_files = [] |
| for f in input_api.AffectedFiles(file_filter=ts_only): |
| for line_num, line in f.ChangedContents(): |
| if not _IsComment(line): |
| continue |
| if '@ts-ignore' in line: |
| offending_files.append(f'{f}: {line_num}: {line[:100]}') |
| |
| if offending_files: |
| results.append( |
| output_api.PresubmitError('@ts-ignore is banned in TS files.', |
| offending_files)) |
| |
| return results |