| # Copyright 2018 The Bazel Authors. All rights reserved. |
| # |
| # 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. |
| load( |
| "//kotlin/internal:defs.bzl", |
| _KT_COMPILER_REPO = "KT_COMPILER_REPO", |
| _KtJsInfo = "KtJsInfo", |
| _TOOLCHAIN_TYPE = "TOOLCHAIN_TYPE", |
| ) |
| load( |
| "//kotlin/internal/js:impl.bzl", |
| _kt_js_import_impl = "kt_js_import_impl", |
| _kt_js_library_impl = "kt_js_library_impl", |
| ) |
| |
| _JS_STDLIB_MAP = { |
| "kotlin-stdlib-js": "kotlin", |
| "kotlin-test-js": "kotlin-test", |
| } |
| |
| # The macro, and the ones using it exist to ensure compatibility with the nodejs rules, the nodejs rules process the |
| # attributes and not the providers. Ideally providers would be used so the rules can pass the information along without |
| # having to have user facing attributes visible. |
| # module_root: if the module_root is made settable then there is a possibility of collisions. Keeping it simple here. |
| # module_name: The require statement generated by Kotlinc-js seems to be based on the name of the jar. Unlike the jvm |
| # compiler, there is no 'module-name' flag available. So to keep things simple it's hard coded to the module name. |
| def _lock_attrs(name, kwargs): |
| if native.repository_name().startswith("@") and native.repository_name().endswith(_KT_COMPILER_REPO): |
| name = _JS_STDLIB_MAP.get(name, default = name) |
| if kwargs.get("module_root") != None: |
| fail("The module_root is an internal attribute.") |
| else: |
| kwargs["module_root"] = name + ".js" |
| if kwargs.get("module_name") != None: |
| fail("module_name is an internal attribute.") |
| else: |
| kwargs["module_name"] = name |
| return kwargs |
| |
| kt_js_library = rule( |
| attrs = { |
| "srcs": attr.label_list( |
| allow_empty = False, |
| allow_files = [".kt"], |
| mandatory = True, |
| ), |
| "data": attr.label_list( |
| allow_files = True, |
| default = [], |
| ), |
| "deps": attr.label_list( |
| doc = """A list of other kotlin JS libraries.""", |
| default = [], |
| allow_empty = True, |
| providers = [_KtJsInfo], |
| ), |
| "runtime_deps": attr.label_list( |
| doc = """A list of other kotlin JS libraries that should be available at runtime.""", |
| default = [], |
| allow_empty = True, |
| providers = [_KtJsInfo], |
| ), |
| "module_kind": attr.string( |
| doc = """The Kind of a module generated by compiler, users should stick to commonjs.""", |
| default = "commonjs", |
| values = ["umd", "commonjs", "amd", "plain"], |
| ), |
| "js_target": attr.string( |
| default = "v5", |
| values = ["v5"], |
| ), |
| "module_root": attr.string( |
| doc = "internal attriubte", |
| mandatory = False, |
| ), |
| "module_name": attr.string( |
| doc = "internal attribute", |
| mandatory = False, |
| ), |
| "_toolchain": attr.label( |
| doc = """The Kotlin JS Runtime.""", |
| default = Label("@" + _KT_COMPILER_REPO + "//:kotlin-stdlib-js"), |
| cfg = "target", |
| ), |
| }, |
| implementation = _kt_js_library_impl, |
| outputs = dict( |
| js = "%{name}.js", |
| js_map = "%{name}.js.map", |
| jar = "%{name}.jar", |
| srcjar = "%{name}-sources.jar", |
| ), |
| toolchains = [_TOOLCHAIN_TYPE], |
| provides = [_KtJsInfo], |
| ) |
| |
| def kt_js_library_macro(name, **kwargs): |
| kwargs = _lock_attrs(name, kwargs) |
| |
| # TODO this is a runtime dep, it should be picked up from the _toolchain attr or from a provider. |
| kwargs["deps"] = kwargs.get("deps", []) + ["@" + _KT_COMPILER_REPO + "//:kotlin-stdlib-js"] |
| kt_js_library(name = name, **kwargs) |
| |
| kt_js_import = rule( |
| attrs = { |
| "jars": attr.label_list( |
| allow_files = [".jar"], |
| mandatory = True, |
| ), |
| "srcjar": attr.label( |
| mandatory = False, |
| allow_single_file = ["-sources.jar"], |
| ), |
| "runtime_deps": attr.label_list( |
| default = [], |
| allow_files = [".jar"], |
| mandatory = False, |
| ), |
| "module_name": attr.string( |
| doc = "internal attribute", |
| mandatory = False, |
| ), |
| "module_root": attr.string( |
| doc = "internal attriubte", |
| mandatory = False, |
| ), |
| "_importer": attr.label( |
| default = "//kotlin/internal/js:importer", |
| allow_files = True, |
| executable = True, |
| cfg = "host", |
| ), |
| }, |
| outputs = dict( |
| js = "%{module_name}.js", |
| js_map = "%{module_name}.js.map", |
| ), |
| implementation = _kt_js_import_impl, |
| provides = [_KtJsInfo], |
| ) |
| |
| def kt_js_import_macro(name, **kwargs): |
| kwargs = _lock_attrs(name, kwargs) |
| kt_js_import(name = name, **kwargs) |