diff --git a/.bazelrc b/.bazelrc index 45014bcd7..fab1fbcef 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,3 +1,5 @@ +# Use embedded JDK +build --repo_env=JAVA_HOME=../bazel_tools/jdk test --test_output=errors coverage --combined_report=lcov @@ -17,6 +19,7 @@ build --android_databinding_use_v3_4_args build --android_databinding_use_androidx build --experimental_google_legacy_api query --experimental_google_legacy_api +sync --experimental_google_legacy_api # Android demo app flags build --noincremental_dexing --fat_apk_cpu=armeabi-v7a,arm64-v8a,x86,x86_64 diff --git a/.circleci/config.yml b/.circleci/config.yml index 3085b7378..b362c4f08 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -53,7 +53,9 @@ commands: - run: mkdir ~/.ssh/ && echo -e "Host github.com\n\tStrictHostKeyChecking no\n" > ~/.ssh/config - run: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - - run: echo -e $GPG_KEY | gpg --import --batch + - run: | + echo -e $GPG_KEY | gpg --import --batch + echo -e "pinentry-mode loopback\npassphrase $DEPLOY_MAVEN_GPG_PASSPHRASE" > ~/.gnupg/gpg.conf - run: | source ~/.bashrc bundle install diff --git a/WORKSPACE b/WORKSPACE index a1b36280b..2b96c7084 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -6,14 +6,26 @@ workspace( }, ) +load("//:build_constants.bzl", "build_constants") + +build_constants() + load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file") load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") -http_archive( +git_repository( + name = "rules_jvm_external", + branch = "maven-export-aar", + patches = [ + "//patches:rules_jvm_external.default_public_visibility.patch", + ], + remote = "https://github.com/sugarmanz/rules_jvm_external", +) + +git_repository( name = "rules_player", - sha256 = "c015a09ce2a5f999a89473cb9f71346c6831e27830a228ebe8f1ba25e83b77b2", - strip_prefix = "rules_player-0.10.4", - urls = ["https://github.com/player-ui/rules_player/archive/refs/tags/v0.10.4.tar.gz"], + branch = "maven-export-distribution", + remote = "https://github.com/player-ui/rules_player", ) load("@rules_player//:workspace.bzl", "deps") @@ -75,17 +87,15 @@ junit5() ###################### # Android Setup # ###################### -load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") - grab_remote = "https://github.com/sugarmanz/grab-bazel-common.git" -grab_commit = "5326c6ba7a4e39e150c33e123134525473baffb6" +grab_commit = "35317b3d1c0da07b42af6e6a2137ebdec0ffe400" git_repository( name = "grab_bazel_common", commit = grab_commit, remote = grab_remote, - shallow_since = "1700536974 -0500", + shallow_since = "1706157787 -0500", ) load("@grab_bazel_common//android:repositories.bzl", "bazel_common_dependencies") @@ -137,12 +147,6 @@ overridden_targets = { load("@bazel_tools//tools/build_defs/repo:maven_rules.bzl", "maven_aar") -# Because J2V8 is published as type `aar.asc` -maven_aar( - name = "android_j2v8", - artifact = "com.eclipsesource.j2v8:j2v8:6.1.0", -) - # Because eyes androidx components is published as type `pom` maven_aar( name = "androidx_eyes_components", @@ -157,6 +161,14 @@ register_toolchains("@androidndk//:all") ###################### # Maven Dependencies # ###################### +load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps") + +rules_jvm_external_deps() + +load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup") + +rules_jvm_external_setup() + load("//jvm/dependencies:deps.bzl", artifacts = "maven") load("@rules_jvm_external//:defs.bzl", "maven_install") @@ -183,7 +195,3 @@ maven_install( "https://repo1.maven.org/maven2", ], ) - -load("@vaticle_bazel_distribution//common:rules.bzl", "workspace_refs") - -workspace_refs(name = "plugin_workspace_refs") diff --git a/android/demo/BUILD b/android/demo/BUILD index 3db069113..c6445dde4 100644 --- a/android/demo/BUILD +++ b/android/demo/BUILD @@ -25,7 +25,6 @@ android_binary( multidex = "native", deps = [ ":demo_lib", - "@android_j2v8//aar", "@maven//:androidx_databinding_databinding_common", "@maven//:androidx_databinding_databinding_runtime", "@maven//:org_jetbrains_kotlin_kotlin_reflect", diff --git a/android/demo/README.md b/android/demo/README.md index a7f36a57a..8a230f9a5 100644 --- a/android/demo/README.md +++ b/android/demo/README.md @@ -56,12 +56,3 @@ Make sure you have done a `bundle install` **Possible Solution:** Check your SDK and NDK versions in SDK Manager in Android Studio. As well as your `ANDROID_HOME` and `ANDROID_NDK_HOME` in your bash or zsh profiles to make sure they are properly set. You can also do `ls $ANDROID_HOME/platforms` and make sure that there are no versions higher than 30. - - - -### 4. Mvn Error Message: -``` - //jvm/j2v8:j2v8-android depends on @android_j2v8//aar:aar in repository @android_j2v8 which failed to fetch. no such package '@android_j2v8//aar': android_j2v8 requires mvn as a dependency. Please check your PATH. -``` -Check to make sure `mvn` is installed. -`brew install maven` \ No newline at end of file diff --git a/android/player/BUILD b/android/player/BUILD index f0ec0c75e..561fa6ac1 100644 --- a/android/player/BUILD +++ b/android/player/BUILD @@ -1,8 +1,11 @@ -load(":deps.bzl", "main_deps", "main_resources", "test_deps") +load(":deps.bzl", "main_deps", "main_exports", "main_resources", "test_deps") +load("@build_constants//:constants.bzl", "VERSION") load("//jvm:build.bzl", "distribution") -load("@grab_bazel_common//tools/databinding:databinding.bzl", "kt_db_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") load("@junit//junit5-jupiter-starter-bazel:junit5.bzl", "kt_jvm_junit5_test") load("@rules_player//kotlin:lint.bzl", "lint") +load("@grab_bazel_common//tools/databinding:databinding.bzl", "kt_db_android_library") kt_db_android_library( name = "player", @@ -11,13 +14,16 @@ kt_db_android_library( manifest = ":src/main/AndroidManifest.xml", resource_files = glob(["src/main/res/**"]), resources = main_resources, - tags = ["maven_coordinates=com.intuit.player.android:player:{pom_version}"], + tags = ["maven_coordinates=com.intuit.player.android:player:aar:%s" % VERSION], visibility = ["//visibility:public"], + exports = main_exports, deps = main_deps, ) distribution( name = "player", + lib_name = "player-databinding", + maven_coordinates = "com.intuit.player.android:player:%s" % VERSION, ) kt_jvm_junit5_test( diff --git a/build_constants.bzl b/build_constants.bzl new file mode 100644 index 000000000..4ef3adfd4 --- /dev/null +++ b/build_constants.bzl @@ -0,0 +1,36 @@ +def _build_constants_impl(repository_ctx): + _BUILD_FILE = """ +# DO NOT EDIT: automatically generated for _build_constants rule +filegroup( + name = 'files', + srcs = glob(['**']), + visibility = ['//visibility:public'] +) +""" + repository_ctx.file("BUILD", _BUILD_FILE, False) + + version = repository_ctx.read(repository_ctx.attr.version_file) + + _CONSTANTS_FILE = """ +# DO NOT EDIT: automatically generated for _build_constants rule +VERSION = \"{version}\" +""" + + repository_ctx.file( + "constants.bzl", + _CONSTANTS_FILE.format(version = version), + False, + ) + +_build_constants = repository_rule( + implementation = _build_constants_impl, + attrs = { + "version_file": attr.label( + default = Label("//:VERSION"), + allow_single_file = True, + ), + }, +) + +def build_constants(): + _build_constants(name = "build_constants") diff --git a/jvm/build.bzl b/jvm/build.bzl index 08f834df3..f5a529e61 100644 --- a/jvm/build.bzl +++ b/jvm/build.bzl @@ -1,13 +1,15 @@ load("@rules_player//kotlin:kt_jvm.bzl", _kt_jvm = "kt_jvm") load("@rules_player//kotlin:distribution.bzl", _distribution = "distribution") +load("@build_constants//:constants.bzl", "VERSION") load("//jvm/dependencies:common.bzl", common_main_deps = "main_deps", common_test_deps = "test_deps") -load("//:index.bzl", "GIT_REPO", "DOCS_URL") +load("//:index.bzl", "DOCS_URL", "GIT_REPO") +DEFAULT_GROUP = "com.intuit.player" DEFAULT_PROJECT_NAME = "Player" DEFAUTL_PROJECT_DESCRIPTION = "A cross-platform semantic rendering engine" DEFAULT_DEVELOPERS = { - "sugarmanz": ["name=Jeremiah Zucker", "email=zucker.jeremiah@gmail.com"], - "brocollie08": ["name=Tony Lin"] + "sugarmanz": ["name=Jeremiah Zucker", "email=zucker.jeremiah@gmail.com"], + "brocollie08": ["name=Tony Lin"], } DEFAULT_RELEASE_REPO = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" DEFAULT_SNAPSHOT_REPO = "https://oss.sonatype.org/content/repositories/snapshots/" @@ -22,14 +24,9 @@ def kt_player_module( include_common_deps = True, # Distribution config - group = "com.intuit.player", - - # (optional) - project_name = DEFAULT_PROJECT_NAME, - project_description = DEFAUTL_PROJECT_DESCRIPTION, - project_url = DOCS_URL, - scm_url = GIT_REPO, - developers = DEFAULT_DEVELOPERS, + group = DEFAULT_GROUP, + deploy_env = None, + excluded_workspaces = None, # Package level config module_name = None, @@ -53,15 +50,9 @@ def kt_player_module( name = name, lint_config = "//jvm:lint_config", group = group, - release_repo = DEFAULT_RELEASE_REPO, - snapshot_repo = DEFAULT_SNAPSHOT_REPO, - version_file = "//:VERSION", - project_name = project_name, - project_description = project_description, - project_url = project_url, - scm_url = scm_url, - developers = developers, - workspace_refs = "@plugin_workspace_refs//:refs.json", + version = VERSION, + deploy_env = deploy_env, + excluded_workspaces = excluded_workspaces, module_name = module_name, main_opts = "//jvm:main_options", main_srcs = main_srcs, @@ -86,22 +77,12 @@ def kt_player_module( def distribution( *, name, - - # (optional) - project_name = DEFAULT_PROJECT_NAME, - project_description = DEFAUTL_PROJECT_DESCRIPTION, - project_url = DOCS_URL, - scm_url = GIT_REPO, - developers = DEFAULT_DEVELOPERS,): + maven_coordinates, + lib_name = None, + **kwargs): _distribution( name = name, - release_repo = DEFAULT_RELEASE_REPO, - snapshot_repo = DEFAULT_SNAPSHOT_REPO, - version_file = "//:VERSION", - project_name = project_name, - project_description = project_description, - project_url = project_url, - scm_url = scm_url, - developers = developers, - workspace_refs = "@plugin_workspace_refs//:refs.json", + maven_coordinates = maven_coordinates, + lib_name = lib_name, + **kwargs ) diff --git a/jvm/core/BUILD b/jvm/core/BUILD index 1f7ece996..ceef2bc3e 100644 --- a/jvm/core/BUILD +++ b/jvm/core/BUILD @@ -4,6 +4,9 @@ load(":deps.bzl", "main_deps", "main_exports", "test_deps") # TODO: Sources jar for src/main/kotlin includes main/kotlin kt_player_module( name = "core", + excluded_workspaces = { + "com_github_jetbrains_kotlin": None, + }, main_deps = main_deps, main_exports = main_exports, test_deps = test_deps, diff --git a/jvm/core/deps.bzl b/jvm/core/deps.bzl index c3ebaabc0..b28d93602 100644 --- a/jvm/core/deps.bzl +++ b/jvm/core/deps.bzl @@ -10,12 +10,12 @@ main_exports = [ "//jvm:kotlin_serialization", ] main_deps = main_exports + [ - "@maven//:org_jetbrains_kotlin_kotlin_reflect" + "@maven//:org_jetbrains_kotlin_kotlin_reflect", ] main_runtime_deps = [] # Test dependencies test_deps = [ - "//plugins/reference-assets/jvm:reference-assets", + "//plugins/reference-assets/jvm:reference-assets", ] test_runtime_deps = [] diff --git a/jvm/core/src/main/kotlin/com/intuit/player/jvm/core/player/state/PlayerFlowState.kt b/jvm/core/src/main/kotlin/com/intuit/player/jvm/core/player/state/PlayerFlowState.kt index 72c86562a..4d1f78694 100644 --- a/jvm/core/src/main/kotlin/com/intuit/player/jvm/core/player/state/PlayerFlowState.kt +++ b/jvm/core/src/main/kotlin/com/intuit/player/jvm/core/player/state/PlayerFlowState.kt @@ -59,8 +59,12 @@ public class CompletedState(override val node: Node) : public val data: JsonElement by NodeSerializableField(JsonElement.serializer()) { JsonNull } + internal val controllers: ControllerState by NodeSerializableField(ControllerState.serializer()) + // TODO: Completed state dataModel change needs rectification here - public val dataModel: DataModelWithParser by NodeSerializableField(DataModelWithParser.serializer()) + public val dataModel: DataModelWithParser by lazy { + DataModelWithParser(controllers.data.node) + } internal object Serializer : NodeWrapperSerializer(::CompletedState, COMPLETED.value) } diff --git a/jvm/core/src/test/kotlin/com/intuit/player/jvm/core/player/state/CompletedStateTest.kt b/jvm/core/src/test/kotlin/com/intuit/player/jvm/core/player/state/CompletedStateTest.kt index 791d9f464..5abbc69f1 100644 --- a/jvm/core/src/test/kotlin/com/intuit/player/jvm/core/player/state/CompletedStateTest.kt +++ b/jvm/core/src/test/kotlin/com/intuit/player/jvm/core/player/state/CompletedStateTest.kt @@ -6,6 +6,7 @@ import com.intuit.player.jvm.core.bridge.Node import com.intuit.player.jvm.core.bridge.getInvokable import com.intuit.player.jvm.core.bridge.runtime.Runtime import com.intuit.player.jvm.core.bridge.serialization.format.RuntimeFormat +import com.intuit.player.jvm.core.data.DataController import com.intuit.player.jvm.core.data.DataModelWithParser import com.intuit.player.jvm.core.flow.Flow import com.intuit.player.jvm.core.player.PlayerFlowStatus @@ -23,6 +24,10 @@ internal class CompletedStateTest : NodeBaseTest() { CompletedState(node) } + private val controllerState by lazy { + ControllerState(node) + } + @MockK private lateinit var mockDataModel: Node @@ -35,6 +40,10 @@ internal class CompletedStateTest : NodeBaseTest() { every { node.runtime } returns runtime every { runtime.containsKey("getSymbol") } returns true every { runtime.getInvokable("getSymbol") } returns Invokable { "Symbol(hello)" } + every { node.getObject("controllers") } returns node + every { node.getSerializable("controllers", any()) } returns controllerState + every { node.getObject("data") } returns node + every { node.getSerializable("data", any()) } returns DataController(node) every { node.getSerializable("flow", Flow.serializer()) } returns Flow("flowId") every { node.getSerializable("dataModel", DataModelWithParser.serializer()) } returns DataModelWithParser(node) every { node.getObject("dataModel") } returns mockDataModel diff --git a/jvm/dependencies/common.bzl b/jvm/dependencies/common.bzl index bae3bae9a..f22761b9f 100644 --- a/jvm/dependencies/common.bzl +++ b/jvm/dependencies/common.bzl @@ -1,6 +1,7 @@ load("//jvm/dependencies:versions.bzl", "versions") maven = [ + "org.jetbrains.kotlin:kotlin-reflect:%s" % "1.7.10", "org.jetbrains.kotlinx:kotlinx-coroutines-core:%s" % versions.kotlin.coroutines, "org.jetbrains.kotlinx:kotlinx-serialization-json:%s" % versions.kotlin.serialization, "com.intuit.hooks:hooks:%s" % versions.hooks, diff --git a/jvm/dependencies/deps.bzl b/jvm/dependencies/deps.bzl index d081e38c0..da280b141 100644 --- a/jvm/dependencies/deps.bzl +++ b/jvm/dependencies/deps.bzl @@ -9,8 +9,7 @@ load("//jvm/testutils:deps.bzl", testutils = "maven") load("//jvm/perf:deps.bzl", perf = "maven") load("//plugins:deps.bzl", plugins = "maven") load("@rules_player//distribution:deps.bzl", distribution = "maven") -load("@grab_bazel_common//:workspace_defs.bzl", grab = "GRAB_BAZEL_COMMON_ARTIFACTS") -tooling = distribution + grab +tooling = distribution maven = remove_duplicates(common + core + graaljs + j2v8 + utils + testutils + perf + plugins + tooling + android) diff --git a/jvm/j2v8/BUILD b/jvm/j2v8/BUILD index e5b6fa109..53e1d61d7 100644 --- a/jvm/j2v8/BUILD +++ b/jvm/j2v8/BUILD @@ -17,6 +17,9 @@ j2v8_platform("macos") j2v8_platform("linux") +# TODO: These should probably be AARs? j2v8_platform("android") +j2v8_platform("android-debug") + j2v8_platform("all") diff --git a/jvm/j2v8/build.bzl b/jvm/j2v8/build.bzl index e353ad225..d414c5800 100644 --- a/jvm/j2v8/build.bzl +++ b/jvm/j2v8/build.bzl @@ -1,17 +1,22 @@ -load("//jvm:build.bzl", "distribution") +load("//jvm:build.bzl", "DEFAULT_GROUP", "distribution") +load("@build_constants//:constants.bzl", "VERSION") deps = { "macos": ["//jvm/j2v8/libs:j2v8_macos"], "linux": ["//jvm/j2v8/libs:j2v8_linux"], - "android": ["@android_j2v8//aar"], + "android": ["@maven//:com_eclipsesource_j2v8_j2v8"], + "android-debug": [ + "//jvm/j2v8:j2v8-android", + "@maven//:com_github_AlexTrotsenko_j2v8_debugger", + ], "all": [ "//jvm/j2v8:j2v8-macos", "//jvm/j2v8:j2v8-linux", "//jvm/j2v8:j2v8-android", - ] + ], } -def j2v8_platform(platform): +def j2v8_platform(platform, group = DEFAULT_GROUP, version = VERSION): if platform not in deps: fail("platform must be defined in " + deps.keys()) @@ -19,10 +24,11 @@ def j2v8_platform(platform): native.java_library( name = name, exports = [":j2v8"] + deps[platform], - tags = ["maven_coordinates=%s:%s:{pom_version}" % ("com.intuit.player", name)], + tags = ["maven_coordinates=%s:%s:%s" % (group, name, version)], visibility = ["//visibility:public"], ) distribution( name = name, + maven_coordinates = "%s:%s:%s" % (group, name, version), ) diff --git a/jvm/j2v8/deps.bzl b/jvm/j2v8/deps.bzl index 1bff1a39d..749604221 100644 --- a/jvm/j2v8/deps.bzl +++ b/jvm/j2v8/deps.bzl @@ -1,7 +1,9 @@ load("//jvm/dependencies:versions.bzl", "versions") load("@rules_player//maven:parse_coordinates.bzl", "parse_coordinates") -maven = [ +maven_main = [] + +maven = maven_main + [ "com.github.AlexTrotsenko:j2v8-debugger:%s" % versions.j2v8.debugger, ] @@ -9,13 +11,13 @@ main_exports = [ "//jvm/core", ] -main_deps = main_exports + parse_coordinates(maven) + [ +main_deps = main_exports + parse_coordinates(maven_main) + [ "//jvm:kotlin_serialization", - - # TODO: Ensure all of these are _just_ compileOnly deps - "//jvm/j2v8/libs:j2v8_empty", + "//jvm/j2v8/libs:j2v8_empty_compile_only", + "//jvm/j2v8/libs:j2v8_debugger_compile_only", ] +# TODO: These should probably just be dependencies of headless main_resources = [ "//core/player:Player_Bundles", ] diff --git a/jvm/j2v8/libs/BUILD b/jvm/j2v8/libs/BUILD index 5664dd127..27f1cb409 100644 --- a/jvm/j2v8/libs/BUILD +++ b/jvm/j2v8/libs/BUILD @@ -1,9 +1,10 @@ package(default_visibility = ["//jvm/j2v8:__pkg__"]) java_import( - name = "j2v8_empty", + name = "j2v8_empty_compile_only", jars = [":j2v8_empty-6.1.0.jar"], neverlink = True, + tags = ["maven:compile-only"], ) java_import( @@ -18,3 +19,11 @@ java_import( name = "j2v8_linux", jars = [":j2v8_linux_x86_64-6.1.0.jar"], ) + +java_import( + name = "j2v8_debugger_compile_only", + jars = [], + neverlink = True, + tags = ["maven:compile-only"], + deps = ["@maven//:com_github_AlexTrotsenko_j2v8_debugger"], +) diff --git a/jvm/j2v8/src/main/kotlin/com/alexii/j2v8debugger/ScriptSourceProvider.kt b/jvm/j2v8/src/main/kotlin/com/alexii/j2v8debugger/ScriptSourceProvider.kt new file mode 100644 index 000000000..3fc02bfe0 --- /dev/null +++ b/jvm/j2v8/src/main/kotlin/com/alexii/j2v8debugger/ScriptSourceProvider.kt @@ -0,0 +1,8 @@ +package com.alexii.j2v8debugger + +/** Redundant declaration of [ScriptSourceProvider] to ensure it exists on classpath at runtime */ +public interface ScriptSourceProvider { + public val allScriptIds: Collection + + public fun getSource(scriptId: String): String +} diff --git a/jvm/j2v8/src/main/kotlin/com/intuit/player/jvm/j2v8/bridge/runtime/V8Runtime.kt b/jvm/j2v8/src/main/kotlin/com/intuit/player/jvm/j2v8/bridge/runtime/V8Runtime.kt index a2f2a645e..776daf3f2 100644 --- a/jvm/j2v8/src/main/kotlin/com/intuit/player/jvm/j2v8/bridge/runtime/V8Runtime.kt +++ b/jvm/j2v8/src/main/kotlin/com/intuit/player/jvm/j2v8/bridge/runtime/V8Runtime.kt @@ -1,7 +1,6 @@ package com.intuit.player.jvm.j2v8.bridge.runtime import com.alexii.j2v8debugger.ScriptSourceProvider -import com.alexii.j2v8debugger.V8Debugger import com.eclipsesource.v8.V8 import com.eclipsesource.v8.V8Array import com.eclipsesource.v8.V8Object @@ -9,6 +8,7 @@ import com.eclipsesource.v8.V8Value import com.eclipsesource.v8.utils.MemoryManager import com.intuit.player.jvm.core.bridge.Invokable import com.intuit.player.jvm.core.bridge.Node +import com.intuit.player.jvm.core.bridge.PlayerRuntimeException import com.intuit.player.jvm.core.bridge.runtime.PlayerRuntimeConfig import com.intuit.player.jvm.core.bridge.runtime.PlayerRuntimeContainer import com.intuit.player.jvm.core.bridge.runtime.PlayerRuntimeFactory @@ -100,7 +100,11 @@ internal class V8Runtime(override val config: J2V8RuntimeConfig) : Runtime