chromium/ui/file_manager/base/presubmit_support.py

# 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