From cf3f12a7194e62b8194afa596fc0213b23df7bd8 Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Sat, 4 Jan 2025 14:46:10 -0800 Subject: [PATCH] test: demonstrate dev dependencies between workspace projects --- e2e/pnpm_lockfiles/.bazelignore | 1 + e2e/pnpm_lockfiles/lockfile-test.bzl | 5 +- .../projects/a-types/BUILD.bazel | 10 ++++ e2e/pnpm_lockfiles/projects/a-types/a.d.ts | 1 + .../projects/a-types/package.json | 7 +++ e2e/pnpm_lockfiles/projects/b/package.json | 4 ++ e2e/pnpm_lockfiles/v54/BUILD.bazel | 4 +- e2e/pnpm_lockfiles/v54/pnpm-lock.yaml | 12 +++- e2e/pnpm_lockfiles/v54/snapshots/defs.bzl | 58 ++++++++++++++++++- e2e/pnpm_lockfiles/v60/BUILD.bazel | 4 +- e2e/pnpm_lockfiles/v60/pnpm-lock.yaml | 14 ++++- e2e/pnpm_lockfiles/v60/snapshots/defs.bzl | 58 ++++++++++++++++++- e2e/pnpm_lockfiles/v61/BUILD.bazel | 4 +- e2e/pnpm_lockfiles/v61/pnpm-lock.yaml | 14 ++++- e2e/pnpm_lockfiles/v61/snapshots/defs.bzl | 58 ++++++++++++++++++- e2e/pnpm_lockfiles/v90/BUILD.bazel | 4 +- e2e/pnpm_lockfiles/v90/pnpm-lock.yaml | 13 +++++ e2e/pnpm_lockfiles/v90/snapshots/defs.bzl | 58 ++++++++++++++++++- 18 files changed, 309 insertions(+), 20 deletions(-) create mode 100644 e2e/pnpm_lockfiles/projects/a-types/BUILD.bazel create mode 100644 e2e/pnpm_lockfiles/projects/a-types/a.d.ts create mode 100644 e2e/pnpm_lockfiles/projects/a-types/package.json diff --git a/e2e/pnpm_lockfiles/.bazelignore b/e2e/pnpm_lockfiles/.bazelignore index c3059a4a0..37f70f9cb 100644 --- a/e2e/pnpm_lockfiles/.bazelignore +++ b/e2e/pnpm_lockfiles/.bazelignore @@ -1,6 +1,7 @@ node_modules/ cases/node_modules projects/a/node_modules +projects/a-types/node_modules projects/b/node_modules projects/c/node_modules projects/d/node_modules diff --git a/e2e/pnpm_lockfiles/lockfile-test.bzl b/e2e/pnpm_lockfiles/lockfile-test.bzl index f6d31b04d..e69fdf1e5 100644 --- a/e2e/pnpm_lockfiles/lockfile-test.bzl +++ b/e2e/pnpm_lockfiles/lockfile-test.bzl @@ -29,17 +29,20 @@ BZL_FILES = { "rollup3_package_json.bzl": "@REPO_NAME__rollup__3.29.4//VERSION:package_json.bzl", } -def lockfile_test(name = None): +def lockfile_test(npm_link_all_packages, name = None): """ Tests for a lockfile and associated targets + files generated by rules_js. Args: name: the lockfile version name + npm_link_all_packages: the npm_link_all_packages function """ lock_version = name if name else native.package_name() lock_repo = "lock-%s" % lock_version + npm_link_all_packages(name = "node_modules") + # Copy each test to this lockfile dir for test in ["patched-dependencies-test.js", "aliases-test.js"]: copy_file( diff --git a/e2e/pnpm_lockfiles/projects/a-types/BUILD.bazel b/e2e/pnpm_lockfiles/projects/a-types/BUILD.bazel new file mode 100644 index 000000000..65d85d8a5 --- /dev/null +++ b/e2e/pnpm_lockfiles/projects/a-types/BUILD.bazel @@ -0,0 +1,10 @@ +load("@aspect_rules_js//js:defs.bzl", "js_library") + +js_library( + name = "pkg", + srcs = [ + "a.d.ts", + "package.json", + ], + visibility = ["//visibility:public"], +) diff --git a/e2e/pnpm_lockfiles/projects/a-types/a.d.ts b/e2e/pnpm_lockfiles/projects/a-types/a.d.ts new file mode 100644 index 000000000..e51367dee --- /dev/null +++ b/e2e/pnpm_lockfiles/projects/a-types/a.d.ts @@ -0,0 +1 @@ +export const A: number diff --git a/e2e/pnpm_lockfiles/projects/a-types/package.json b/e2e/pnpm_lockfiles/projects/a-types/package.json new file mode 100644 index 000000000..5c09fa8d4 --- /dev/null +++ b/e2e/pnpm_lockfiles/projects/a-types/package.json @@ -0,0 +1,7 @@ +{ + "name": "a-types", + "private": true, + "dependencies": { + "@types/node": "16.18.11" + } +} diff --git a/e2e/pnpm_lockfiles/projects/b/package.json b/e2e/pnpm_lockfiles/projects/b/package.json index da16dd8db..12b206152 100644 --- a/e2e/pnpm_lockfiles/projects/b/package.json +++ b/e2e/pnpm_lockfiles/projects/b/package.json @@ -3,5 +3,9 @@ "private": true, "dependencies": { "@scoped/a": "workspace:*" + }, + "devDependencies": { + "@types/node": "16.18.11", + "a-types": "workspace:*" } } diff --git a/e2e/pnpm_lockfiles/v54/BUILD.bazel b/e2e/pnpm_lockfiles/v54/BUILD.bazel index 647dcd96c..0d1fbac79 100644 --- a/e2e/pnpm_lockfiles/v54/BUILD.bazel +++ b/e2e/pnpm_lockfiles/v54/BUILD.bazel @@ -1,6 +1,4 @@ load("@lock-v54//:defs.bzl", "npm_link_all_packages") load("//:lockfile-test.bzl", "lockfile_test") -npm_link_all_packages() - -lockfile_test() +lockfile_test(npm_link_all_packages = npm_link_all_packages) diff --git a/e2e/pnpm_lockfiles/v54/pnpm-lock.yaml b/e2e/pnpm_lockfiles/v54/pnpm-lock.yaml index 184db34c0..7ac55692f 100644 --- a/e2e/pnpm_lockfiles/v54/pnpm-lock.yaml +++ b/e2e/pnpm_lockfiles/v54/pnpm-lock.yaml @@ -95,11 +95,22 @@ importers: ../projects/a: specifiers: {} + ../projects/a-types: + specifiers: + '@types/node': 16.18.11 + dependencies: + '@types/node': registry.npmjs.org/@types/node/16.18.11 + ../projects/b: specifiers: '@scoped/a': workspace:* + '@types/node': 16.18.11 + a-types: workspace:* dependencies: '@scoped/a': link:../a + devDependencies: + '@types/node': registry.npmjs.org/@types/node/16.18.11 + a-types: link:../a-types ../projects/c: specifiers: @@ -533,7 +544,6 @@ packages: resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz} name: '@types/node' version: 16.18.11 - dev: true registry.npmjs.org/@types/sizzle/2.3.9: resolution: {integrity: sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz} diff --git a/e2e/pnpm_lockfiles/v54/snapshots/defs.bzl b/e2e/pnpm_lockfiles/v54/snapshots/defs.bzl index c41f824e3..35efb05bd 100644 --- a/e2e/pnpm_lockfiles/v54/snapshots/defs.bzl +++ b/e2e/pnpm_lockfiles/v54/snapshots/defs.bzl @@ -70,7 +70,7 @@ load("@aspect_rules_js//npm/private:npm_link_package_store.bzl", _npm_link_packa # buildifier: disable=bzl-visibility load("@aspect_rules_js//npm/private:npm_package_store.bzl", _npm_package_store = "npm_package_store") -_LINK_PACKAGES = ["", "projects/a", "projects/b", "projects/c", "projects/d", "vendored/is-number"] +_LINK_PACKAGES = ["", "projects/a", "projects/a-types", "projects/b", "projects/c", "projects/d", "vendored/is-number"] # buildifier: disable=function-docstring def npm_link_all_packages(name = "node_modules", imported_links = []): @@ -251,6 +251,20 @@ def npm_link_all_packages(name = "node_modules", imported_links = []): link_targets.append("//{}:{}/typescript".format(bazel_package, name)) link_57(name = "{}/uvu".format(name)) link_targets.append("//{}:{}/uvu".format(bazel_package, name)) + elif bazel_package == "projects/a-types": + link_17(name = "{}/@types/node".format(name)) + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + if "@types" not in scope_targets: + scope_targets["@types"] = [link_targets[-1]] + else: + scope_targets["@types"].append(link_targets[-1]) + elif bazel_package == "projects/b": + link_17(name = "{}/@types/node".format(name)) + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + if "@types" not in scope_targets: + scope_targets["@types"] = [link_targets[-1]] + else: + scope_targets["@types"].append(link_targets[-1]) if is_root: _npm_package_store( @@ -447,6 +461,40 @@ def npm_link_all_packages(name = "node_modules", imported_links = []): ) link_targets.append(":{}/scoped/bad".format(name)) + if is_root: + _npm_package_store( + name = ".aspect_rules_js/{}/a-types@0.0.0".format(name), + src = "//projects/a-types:pkg", + package = "a-types", + version = "0.0.0", + deps = { + "//:.aspect_rules_js/{}/@types+node@16.18.11".format(name): "@types/node", + }, + visibility = ["//visibility:public"], + tags = ["manual"], + ) + + for link_package in ["projects/b"]: + if link_package == bazel_package: + # terminal target for direct dependencies + _npm_link_package_store( + name = "{}/a-types".format(name), + src = "//:.aspect_rules_js/{}/a-types@0.0.0".format(name), + visibility = ["//visibility:public"], + tags = ["manual"], + ) + + # filegroup target that provides a single file which is + # package directory for use in $(execpath) and $(rootpath) + native.filegroup( + name = "{}/a-types/dir".format(name), + srcs = [":{}/a-types".format(name)], + output_group = "package_directory", + visibility = ["//visibility:public"], + tags = ["manual"], + ) + link_targets.append(":{}/a-types".format(name)) + for scope, scoped_targets in scope_targets.items(): _js_library( name = "{}/{}".format(name, scope), @@ -501,6 +549,10 @@ def npm_link_targets(name = "node_modules", package = None): link_targets.append("//{}:{}/tslib".format(bazel_package, name)) link_targets.append("//{}:{}/typescript".format(bazel_package, name)) link_targets.append("//{}:{}/uvu".format(bazel_package, name)) + elif bazel_package == "projects/a-types": + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + elif bazel_package == "projects/b": + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) for link_package in [""]: if link_package == bazel_package: @@ -521,4 +573,8 @@ def npm_link_targets(name = "node_modules", package = None): for link_package in [""]: if link_package == bazel_package: link_targets.append("//{}:{}/scoped/bad".format(bazel_package, name)) + + for link_package in ["projects/b"]: + if link_package == bazel_package: + link_targets.append("//{}:{}/a-types".format(bazel_package, name)) return link_targets diff --git a/e2e/pnpm_lockfiles/v60/BUILD.bazel b/e2e/pnpm_lockfiles/v60/BUILD.bazel index 5814a53f1..e5ce7c2bc 100644 --- a/e2e/pnpm_lockfiles/v60/BUILD.bazel +++ b/e2e/pnpm_lockfiles/v60/BUILD.bazel @@ -1,6 +1,4 @@ load("@lock-v60//:defs.bzl", "npm_link_all_packages") load("//:lockfile-test.bzl", "lockfile_test") -npm_link_all_packages() - -lockfile_test() +lockfile_test(npm_link_all_packages = npm_link_all_packages) diff --git a/e2e/pnpm_lockfiles/v60/pnpm-lock.yaml b/e2e/pnpm_lockfiles/v60/pnpm-lock.yaml index 71606432f..673a89cc9 100644 --- a/e2e/pnpm_lockfiles/v60/pnpm-lock.yaml +++ b/e2e/pnpm_lockfiles/v60/pnpm-lock.yaml @@ -131,11 +131,24 @@ importers: ../projects/a: {} + ../projects/a-types: + dependencies: + '@types/node': + specifier: 16.18.11 + version: registry.npmjs.org/@types/node@16.18.11 + ../projects/b: dependencies: '@scoped/a': specifier: workspace:* version: link:../a + devDependencies: + '@types/node': + specifier: 16.18.11 + version: registry.npmjs.org/@types/node@16.18.11 + a-types: + specifier: workspace:* + version: link:../a-types ../projects/c: dependencies: @@ -573,7 +586,6 @@ packages: resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz} name: '@types/node' version: 16.18.11 - dev: true registry.npmjs.org/@types/sizzle@2.3.9: resolution: {integrity: sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz} diff --git a/e2e/pnpm_lockfiles/v60/snapshots/defs.bzl b/e2e/pnpm_lockfiles/v60/snapshots/defs.bzl index 20deac9e5..91a5aaeb9 100644 --- a/e2e/pnpm_lockfiles/v60/snapshots/defs.bzl +++ b/e2e/pnpm_lockfiles/v60/snapshots/defs.bzl @@ -71,7 +71,7 @@ load("@aspect_rules_js//npm/private:npm_link_package_store.bzl", _npm_link_packa # buildifier: disable=bzl-visibility load("@aspect_rules_js//npm/private:npm_package_store.bzl", _npm_package_store = "npm_package_store") -_LINK_PACKAGES = ["", "projects/a", "projects/b", "projects/c", "projects/d", "vendored/is-number"] +_LINK_PACKAGES = ["", "projects/a", "projects/a-types", "projects/b", "projects/c", "projects/d", "vendored/is-number"] # buildifier: disable=function-docstring def npm_link_all_packages(name = "node_modules", imported_links = []): @@ -259,6 +259,20 @@ def npm_link_all_packages(name = "node_modules", imported_links = []): link_targets.append("//{}:{}/typescript".format(bazel_package, name)) link_58(name = "{}/uvu".format(name)) link_targets.append("//{}:{}/uvu".format(bazel_package, name)) + elif bazel_package == "projects/a-types": + link_18(name = "{}/@types/node".format(name)) + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + if "@types" not in scope_targets: + scope_targets["@types"] = [link_targets[-1]] + else: + scope_targets["@types"].append(link_targets[-1]) + elif bazel_package == "projects/b": + link_18(name = "{}/@types/node".format(name)) + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + if "@types" not in scope_targets: + scope_targets["@types"] = [link_targets[-1]] + else: + scope_targets["@types"].append(link_targets[-1]) if is_root: _npm_package_store( @@ -455,6 +469,40 @@ def npm_link_all_packages(name = "node_modules", imported_links = []): ) link_targets.append(":{}/scoped/bad".format(name)) + if is_root: + _npm_package_store( + name = ".aspect_rules_js/{}/a-types@0.0.0".format(name), + src = "//projects/a-types:pkg", + package = "a-types", + version = "0.0.0", + deps = { + "//:.aspect_rules_js/{}/@types+node@16.18.11".format(name): "@types/node", + }, + visibility = ["//visibility:public"], + tags = ["manual"], + ) + + for link_package in ["projects/b"]: + if link_package == bazel_package: + # terminal target for direct dependencies + _npm_link_package_store( + name = "{}/a-types".format(name), + src = "//:.aspect_rules_js/{}/a-types@0.0.0".format(name), + visibility = ["//visibility:public"], + tags = ["manual"], + ) + + # filegroup target that provides a single file which is + # package directory for use in $(execpath) and $(rootpath) + native.filegroup( + name = "{}/a-types/dir".format(name), + srcs = [":{}/a-types".format(name)], + output_group = "package_directory", + visibility = ["//visibility:public"], + tags = ["manual"], + ) + link_targets.append(":{}/a-types".format(name)) + for scope, scoped_targets in scope_targets.items(): _js_library( name = "{}/{}".format(name, scope), @@ -510,6 +558,10 @@ def npm_link_targets(name = "node_modules", package = None): link_targets.append("//{}:{}/tslib".format(bazel_package, name)) link_targets.append("//{}:{}/typescript".format(bazel_package, name)) link_targets.append("//{}:{}/uvu".format(bazel_package, name)) + elif bazel_package == "projects/a-types": + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + elif bazel_package == "projects/b": + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) for link_package in [""]: if link_package == bazel_package: @@ -530,4 +582,8 @@ def npm_link_targets(name = "node_modules", package = None): for link_package in [""]: if link_package == bazel_package: link_targets.append("//{}:{}/scoped/bad".format(bazel_package, name)) + + for link_package in ["projects/b"]: + if link_package == bazel_package: + link_targets.append("//{}:{}/a-types".format(bazel_package, name)) return link_targets diff --git a/e2e/pnpm_lockfiles/v61/BUILD.bazel b/e2e/pnpm_lockfiles/v61/BUILD.bazel index 8af83ae39..f6f49b563 100644 --- a/e2e/pnpm_lockfiles/v61/BUILD.bazel +++ b/e2e/pnpm_lockfiles/v61/BUILD.bazel @@ -1,6 +1,4 @@ load("@lock-v61//:defs.bzl", "npm_link_all_packages") load("//:lockfile-test.bzl", "lockfile_test") -npm_link_all_packages() - -lockfile_test() +lockfile_test(npm_link_all_packages = npm_link_all_packages) diff --git a/e2e/pnpm_lockfiles/v61/pnpm-lock.yaml b/e2e/pnpm_lockfiles/v61/pnpm-lock.yaml index a5a8a932c..de2fb16ef 100644 --- a/e2e/pnpm_lockfiles/v61/pnpm-lock.yaml +++ b/e2e/pnpm_lockfiles/v61/pnpm-lock.yaml @@ -135,11 +135,24 @@ importers: ../projects/a: {} + ../projects/a-types: + dependencies: + '@types/node': + specifier: 16.18.11 + version: registry.npmjs.org/@types/node@16.18.11 + ../projects/b: dependencies: '@scoped/a': specifier: workspace:* version: link:../a + devDependencies: + '@types/node': + specifier: 16.18.11 + version: registry.npmjs.org/@types/node@16.18.11 + a-types: + specifier: workspace:* + version: link:../a-types ../projects/c: dependencies: @@ -577,7 +590,6 @@ packages: resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz} name: '@types/node' version: 16.18.11 - dev: true registry.npmjs.org/@types/sizzle@2.3.9: resolution: {integrity: sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz} diff --git a/e2e/pnpm_lockfiles/v61/snapshots/defs.bzl b/e2e/pnpm_lockfiles/v61/snapshots/defs.bzl index 20deac9e5..91a5aaeb9 100644 --- a/e2e/pnpm_lockfiles/v61/snapshots/defs.bzl +++ b/e2e/pnpm_lockfiles/v61/snapshots/defs.bzl @@ -71,7 +71,7 @@ load("@aspect_rules_js//npm/private:npm_link_package_store.bzl", _npm_link_packa # buildifier: disable=bzl-visibility load("@aspect_rules_js//npm/private:npm_package_store.bzl", _npm_package_store = "npm_package_store") -_LINK_PACKAGES = ["", "projects/a", "projects/b", "projects/c", "projects/d", "vendored/is-number"] +_LINK_PACKAGES = ["", "projects/a", "projects/a-types", "projects/b", "projects/c", "projects/d", "vendored/is-number"] # buildifier: disable=function-docstring def npm_link_all_packages(name = "node_modules", imported_links = []): @@ -259,6 +259,20 @@ def npm_link_all_packages(name = "node_modules", imported_links = []): link_targets.append("//{}:{}/typescript".format(bazel_package, name)) link_58(name = "{}/uvu".format(name)) link_targets.append("//{}:{}/uvu".format(bazel_package, name)) + elif bazel_package == "projects/a-types": + link_18(name = "{}/@types/node".format(name)) + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + if "@types" not in scope_targets: + scope_targets["@types"] = [link_targets[-1]] + else: + scope_targets["@types"].append(link_targets[-1]) + elif bazel_package == "projects/b": + link_18(name = "{}/@types/node".format(name)) + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + if "@types" not in scope_targets: + scope_targets["@types"] = [link_targets[-1]] + else: + scope_targets["@types"].append(link_targets[-1]) if is_root: _npm_package_store( @@ -455,6 +469,40 @@ def npm_link_all_packages(name = "node_modules", imported_links = []): ) link_targets.append(":{}/scoped/bad".format(name)) + if is_root: + _npm_package_store( + name = ".aspect_rules_js/{}/a-types@0.0.0".format(name), + src = "//projects/a-types:pkg", + package = "a-types", + version = "0.0.0", + deps = { + "//:.aspect_rules_js/{}/@types+node@16.18.11".format(name): "@types/node", + }, + visibility = ["//visibility:public"], + tags = ["manual"], + ) + + for link_package in ["projects/b"]: + if link_package == bazel_package: + # terminal target for direct dependencies + _npm_link_package_store( + name = "{}/a-types".format(name), + src = "//:.aspect_rules_js/{}/a-types@0.0.0".format(name), + visibility = ["//visibility:public"], + tags = ["manual"], + ) + + # filegroup target that provides a single file which is + # package directory for use in $(execpath) and $(rootpath) + native.filegroup( + name = "{}/a-types/dir".format(name), + srcs = [":{}/a-types".format(name)], + output_group = "package_directory", + visibility = ["//visibility:public"], + tags = ["manual"], + ) + link_targets.append(":{}/a-types".format(name)) + for scope, scoped_targets in scope_targets.items(): _js_library( name = "{}/{}".format(name, scope), @@ -510,6 +558,10 @@ def npm_link_targets(name = "node_modules", package = None): link_targets.append("//{}:{}/tslib".format(bazel_package, name)) link_targets.append("//{}:{}/typescript".format(bazel_package, name)) link_targets.append("//{}:{}/uvu".format(bazel_package, name)) + elif bazel_package == "projects/a-types": + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + elif bazel_package == "projects/b": + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) for link_package in [""]: if link_package == bazel_package: @@ -530,4 +582,8 @@ def npm_link_targets(name = "node_modules", package = None): for link_package in [""]: if link_package == bazel_package: link_targets.append("//{}:{}/scoped/bad".format(bazel_package, name)) + + for link_package in ["projects/b"]: + if link_package == bazel_package: + link_targets.append("//{}:{}/a-types".format(bazel_package, name)) return link_targets diff --git a/e2e/pnpm_lockfiles/v90/BUILD.bazel b/e2e/pnpm_lockfiles/v90/BUILD.bazel index e6d1703ef..a9e1d7789 100644 --- a/e2e/pnpm_lockfiles/v90/BUILD.bazel +++ b/e2e/pnpm_lockfiles/v90/BUILD.bazel @@ -1,6 +1,4 @@ load("@lock-v90//:defs.bzl", "npm_link_all_packages") load("//:lockfile-test.bzl", "lockfile_test") -npm_link_all_packages() - -lockfile_test() +lockfile_test(npm_link_all_packages = npm_link_all_packages) diff --git a/e2e/pnpm_lockfiles/v90/pnpm-lock.yaml b/e2e/pnpm_lockfiles/v90/pnpm-lock.yaml index adc4262a6..e88209463 100644 --- a/e2e/pnpm_lockfiles/v90/pnpm-lock.yaml +++ b/e2e/pnpm_lockfiles/v90/pnpm-lock.yaml @@ -132,11 +132,24 @@ importers: ../projects/a: {} + ../projects/a-types: + dependencies: + '@types/node': + specifier: 16.18.11 + version: 16.18.11 + ../projects/b: dependencies: '@scoped/a': specifier: workspace:* version: link:../a + devDependencies: + '@types/node': + specifier: 16.18.11 + version: 16.18.11 + a-types: + specifier: workspace:* + version: link:../a-types ../projects/c: dependencies: diff --git a/e2e/pnpm_lockfiles/v90/snapshots/defs.bzl b/e2e/pnpm_lockfiles/v90/snapshots/defs.bzl index 604ce0015..f3195e7e6 100644 --- a/e2e/pnpm_lockfiles/v90/snapshots/defs.bzl +++ b/e2e/pnpm_lockfiles/v90/snapshots/defs.bzl @@ -71,7 +71,7 @@ load("@aspect_rules_js//npm/private:npm_link_package_store.bzl", _npm_link_packa # buildifier: disable=bzl-visibility load("@aspect_rules_js//npm/private:npm_package_store.bzl", _npm_package_store = "npm_package_store") -_LINK_PACKAGES = ["", "projects/a", "projects/b", "projects/c", "projects/d", "vendored/is-number"] +_LINK_PACKAGES = ["", "projects/a", "projects/a-types", "projects/b", "projects/c", "projects/d", "vendored/is-number"] # buildifier: disable=function-docstring def npm_link_all_packages(name = "node_modules", imported_links = []): @@ -259,6 +259,20 @@ def npm_link_all_packages(name = "node_modules", imported_links = []): link_targets.append("//{}:{}/typescript".format(bazel_package, name)) link_58(name = "{}/uvu".format(name)) link_targets.append("//{}:{}/uvu".format(bazel_package, name)) + elif bazel_package == "projects/a-types": + link_18(name = "{}/@types/node".format(name)) + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + if "@types" not in scope_targets: + scope_targets["@types"] = [link_targets[-1]] + else: + scope_targets["@types"].append(link_targets[-1]) + elif bazel_package == "projects/b": + link_18(name = "{}/@types/node".format(name)) + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + if "@types" not in scope_targets: + scope_targets["@types"] = [link_targets[-1]] + else: + scope_targets["@types"].append(link_targets[-1]) if is_root: _npm_package_store( @@ -455,6 +469,40 @@ def npm_link_all_packages(name = "node_modules", imported_links = []): ) link_targets.append(":{}/scoped/bad".format(name)) + if is_root: + _npm_package_store( + name = ".aspect_rules_js/{}/a-types@0.0.0".format(name), + src = "//projects/a-types:pkg", + package = "a-types", + version = "0.0.0", + deps = { + "//:.aspect_rules_js/{}/@types+node@16.18.11".format(name): "@types/node", + }, + visibility = ["//visibility:public"], + tags = ["manual"], + ) + + for link_package in ["projects/b"]: + if link_package == bazel_package: + # terminal target for direct dependencies + _npm_link_package_store( + name = "{}/a-types".format(name), + src = "//:.aspect_rules_js/{}/a-types@0.0.0".format(name), + visibility = ["//visibility:public"], + tags = ["manual"], + ) + + # filegroup target that provides a single file which is + # package directory for use in $(execpath) and $(rootpath) + native.filegroup( + name = "{}/a-types/dir".format(name), + srcs = [":{}/a-types".format(name)], + output_group = "package_directory", + visibility = ["//visibility:public"], + tags = ["manual"], + ) + link_targets.append(":{}/a-types".format(name)) + for scope, scoped_targets in scope_targets.items(): _js_library( name = "{}/{}".format(name, scope), @@ -510,6 +558,10 @@ def npm_link_targets(name = "node_modules", package = None): link_targets.append("//{}:{}/tslib".format(bazel_package, name)) link_targets.append("//{}:{}/typescript".format(bazel_package, name)) link_targets.append("//{}:{}/uvu".format(bazel_package, name)) + elif bazel_package == "projects/a-types": + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) + elif bazel_package == "projects/b": + link_targets.append("//{}:{}/@types/node".format(bazel_package, name)) for link_package in [""]: if link_package == bazel_package: @@ -530,4 +582,8 @@ def npm_link_targets(name = "node_modules", package = None): for link_package in [""]: if link_package == bazel_package: link_targets.append("//{}:{}/scoped/bad".format(bazel_package, name)) + + for link_package in ["projects/b"]: + if link_package == bazel_package: + link_targets.append("//{}:{}/a-types".format(bazel_package, name)) return link_targets