Google internally has some rules regarding TS-imports-JS. Added rules validate that these requirements are met. Change-Id: I2fd3506271fc52e891d172495d6dba0899a44200
111 lines
4.7 KiB
Python
111 lines
4.7 KiB
Python
# Copyright (C) 2020 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""This file contains macro to run eslint and define a eslint test rule."""
|
|
|
|
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary", "nodejs_test")
|
|
|
|
def eslint(name, plugins, srcs, config, ignore, extensions = [".js"], data = []):
|
|
""" Macro to define eslint rules for files.
|
|
|
|
Args:
|
|
name: name of the rule
|
|
plugins: list of npm dependencies with plugins, for example "@npm//eslint-config-google"
|
|
srcs: list of files to be checked (ignored in {name}_bin rule)
|
|
config: eslint config file
|
|
ignore: eslint ignore file
|
|
extensions: list of file extensions to be checked. This is an additional filter for
|
|
srcs list. Each extension must start with '.' character.
|
|
Default: [".js"].
|
|
data: list of additional dependencies. For example if a config file extends an another
|
|
file, this other file must be added to data.
|
|
|
|
Generate: 2 rules:
|
|
{name}_test rule - runs eslint tests. You can run this rule with
|
|
'bazel test {name}_test' command. The rule tests all files from srcs with specified
|
|
extensions inside the package where eslint macro is called.
|
|
{name}_bin rule - runs eslint with specified settings; ignores srcs. To use this rule
|
|
you must pass a folder to check, for example:
|
|
bazel run {name}_test -- --fix $(pwd)/polygerrit-ui/app
|
|
"""
|
|
entry_point = "@npm//:node_modules/eslint/bin/eslint.js"
|
|
|
|
# There are custom eslint rules in eslint-rules directory. Eslint loads
|
|
# custom rules from a directory specified with the --rulesdir argument.
|
|
# When bazel runs eslint, it places the eslint-rules directory into
|
|
# some location in the filesystem, and the location is not known in advance.
|
|
# It is not possible to get the directory location in bazel directly.
|
|
# Instead, we can use dirname to get a directory for a file in the
|
|
# eslint-rules directory.
|
|
# README.md is the most "stable" file in the eslint-rules directory
|
|
# (i.e. it is unlikely will be removed), and we are using it to calculate
|
|
# exact directory path in bazel.
|
|
eslint_rules_toplevel_file = "//tools/js/eslint-rules:README.md"
|
|
bin_data = [
|
|
"@npm//eslint:eslint",
|
|
config,
|
|
ignore,
|
|
"//tools/js/eslint-rules:eslint-rules-srcs",
|
|
eslint_rules_toplevel_file,
|
|
] + plugins + data
|
|
common_templated_args = [
|
|
"--ext",
|
|
",".join(extensions),
|
|
"-c",
|
|
# Use rlocation/rootpath instead of location.
|
|
# See note and example here:
|
|
# https://bazelbuild.github.io/rules_nodejs/Built-ins.html#nodejs_binary
|
|
"$$(rlocation $(rootpath {}))".format(config),
|
|
"--ignore-path",
|
|
"$$(rlocation $(rootpath {}))".format(ignore),
|
|
# Load custom rules from eslint-rules directory
|
|
"--rulesdir",
|
|
"$$(dirname $$(rlocation $(rootpath {})))".format(eslint_rules_toplevel_file),
|
|
]
|
|
nodejs_test(
|
|
name = name + "_test",
|
|
entry_point = entry_point,
|
|
data = bin_data + srcs,
|
|
# Bazel generates 2 .js files, where names of the files are generated from the name
|
|
# of the rule: {name}_test_require_patch.js and {name}_test_loader.js
|
|
# Ignore these 2 files, for simplicity do not use {name} in the patterns.
|
|
templated_args = common_templated_args + [
|
|
"--ignore-pattern",
|
|
"*_test_require_patch.js",
|
|
"--ignore-pattern",
|
|
"*_test_loader.js",
|
|
native.package_name(),
|
|
],
|
|
# Should not run sandboxed.
|
|
tags = [
|
|
"local",
|
|
"manual",
|
|
],
|
|
)
|
|
|
|
nodejs_binary(
|
|
name = name + "_bin",
|
|
entry_point = "@npm//:node_modules/eslint/bin/eslint.js",
|
|
data = bin_data,
|
|
# Bazel generates 2 .js files, where names of the files are generated from the name
|
|
# of the rule: {name}_bin_require_patch.js and {name}_bin_loader.js
|
|
# Ignore these 2 files, for simplicity do not use {name} in the patterns.
|
|
templated_args = common_templated_args + [
|
|
"--ignore-pattern",
|
|
"*_bin_require_patch.js",
|
|
"--ignore-pattern",
|
|
"*_bin_loader.js",
|
|
],
|
|
)
|