diff --git a/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU= b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=
index 98697c7f8..70035dd61 100755
--- a/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=
+++ b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=
@@ -2,7 +2,7 @@
# Input hashes for repository rule npm_translate_lock(name = "npm", pnpm_lock = "@@//:pnpm-lock.yaml").
# This file should be checked into version control along with the pnpm-lock.yaml file.
.npmrc=-2065072158
-pnpm-lock.yaml=1142601305
+pnpm-lock.yaml=-481966245
examples/npm_deps/patches/meaning-of-life@1.0.0-pnpm.patch=-442666336
package.json=-275319675
pnpm-workspace.yaml=-1178830835
@@ -23,5 +23,5 @@ npm/private/test/vendored/semver-max/package.json=578664053
examples/linked_empty_node_modules/package.json=-1039372825
examples/npm_package/packages/pkg_d/package.json=1110895851
js/private/image/package.json=-1260474848
-js/private/test/image/package.json=1286417612
+js/private/test/image/package.json=-687546763
js/private/test/js_run_devserver/package.json=-260856079
diff --git a/docs/js_image_layer.md b/docs/js_image_layer.md
index 17b1237bb..8ee585ad4 100644
--- a/docs/js_image_layer.md
+++ b/docs/js_image_layer.md
@@ -25,18 +25,53 @@ js_image_layer(name, The rules_js `node_modules/.aspect_rules_js` package store follows the same pattern as the pnpm
+> `node_modules/.pnpm` virtual store. For more information see https://pnpm.io/symlinked-node-modules-structure.
-> WARNING: Structure of the resulting layers are not subject to semver guarantees and may change without a notice. However, it is guaranteed to work when provided together in the `app` and `node_modules` order
+js_image_layer also provides an `OutputGroupInfo` with outputs for each of the layers above which
+can be used to reference an individual layer with using `filegroup` with `output_group`. For example,
+
+```starlark
+js_image_layer(
+ name = "layers",
+ binary = ":bin",
+ root = "/app",
+)
+
+filegroup(
+ name = "app_tar",
+ srcs = [":layers"],
+ output_group = "app",
+)
+```
+
+> WARNING: The structure of the generated layers are not subject to semver guarantees and may change without a notice.
+> However, it is guaranteed to work when all generated layers are provided together in the order specified above.
+
+js_image_layer supports transitioning to specific `platform` to allow building multi-platform container images.
**A partial example using rules_oci with transition to linux/amd64 platform.**
@@ -80,7 +115,6 @@ oci_image(
**A partial example using rules_oci to create multi-platform images.**
-
```starlark
load("@aspect_rules_js//js:defs.bzl", "js_binary", "js_image_layer")
load("@rules_oci//oci:defs.bzl", "oci_image", "oci_image_index")
@@ -133,7 +167,7 @@ oci_image_index(
**An example using legacy rules_docker**
-See `e2e/js_image_rules_docker` for full example.
+See `e2e/js_image_docker` for full example.
```starlark
load("@aspect_rules_js//js:defs.bzl", "js_binary", "js_image_layer")
@@ -155,14 +189,36 @@ js_image_layer(
)
filegroup(
- name = "app_tar",
+ name = "node_tar",
srcs = [":layers"],
- output_group = "app",
+ output_group = "node",
)
container_layer(
- name = "app_layer",
- tars = [":app_tar"],
+ name = "node_layer",
+ tars = [":node_tar"],
+)
+
+filegroup(
+ name = "package_store_3p_tar",
+ srcs = [":layers"],
+ output_group = "package_store_3p",
+)
+
+container_layer(
+ name = "package_store_3p_layer",
+ tars = [":package_store_3p_tar"],
+)
+
+filegroup(
+ name = "package_store_1p_tar",
+ srcs = [":layers"],
+ output_group = "package_store_1p",
+)
+
+container_layer(
+ name = "package_store_1p_layer",
+ tars = [":package_store_1p_tar"],
)
filegroup(
@@ -176,13 +232,27 @@ container_layer(
tars = [":node_modules_tar"],
)
+filegroup(
+ name = "app_tar",
+ srcs = [":layers"],
+ output_group = "app",
+)
+
+container_layer(
+ name = "app_layer",
+ tars = [":app_tar"],
+)
+
container_image(
name = "image",
cmd = ["/app/bin"],
entrypoint = ["bash"],
layers = [
- ":app_layer",
+ ":node_layer",
+ ":package_store_3p_layer",
+ ":package_store_1p_layer",
":node_modules_layer",
+ ":app_layer",
],
workdir = select({
"@aspect_bazel_lib//lib:bzlmod": "/app/bin.runfiles/_main",
diff --git a/e2e/js_image_docker/BUILD.bazel b/e2e/js_image_docker/BUILD.bazel
index 7e2c15af2..fafc5d8f4 100644
--- a/e2e/js_image_docker/BUILD.bazel
+++ b/e2e/js_image_docker/BUILD.bazel
@@ -47,14 +47,25 @@ js_image_layer(
)
filegroup(
- name = "app_tar",
+ name = "node_tar",
srcs = [":layers"],
- output_group = "app",
+ output_group = "node",
)
container_layer(
- name = "app_layer",
- tars = [":app_tar"],
+ name = "node_layer",
+ tars = [":node_tar"],
+)
+
+filegroup(
+ name = "package_store_3p_tar",
+ srcs = [":layers"],
+ output_group = "package_store_3p",
+)
+
+container_layer(
+ name = "package_store_3p_layer",
+ tars = [":package_store_3p_tar"],
)
filegroup(
@@ -68,6 +79,17 @@ container_layer(
tars = [":node_modules_tar"],
)
+filegroup(
+ name = "app_tar",
+ srcs = [":layers"],
+ output_group = "app",
+)
+
+container_layer(
+ name = "app_layer",
+ tars = [":app_tar"],
+)
+
container_image(
name = "image",
architecture = "amd64", # or arm64
@@ -77,8 +99,10 @@ container_image(
cmd = ["/app/bin"],
entrypoint = ["bash"],
layers = [
- ":app_layer",
+ ":node_layer",
+ ":package_store_3p_layer",
":node_modules_layer",
+ ":app_layer",
],
# This is `cmd` + `.runfiles/[workspace name]`
workdir = select({
diff --git a/js/private/js_image_layer.bzl b/js/private/js_image_layer.bzl
index fe588d36b..8a3e11f16 100644
--- a/js/private/js_image_layer.bzl
+++ b/js/private/js_image_layer.bzl
@@ -19,18 +19,53 @@ load("@bazel_skylib//lib:paths.bzl", "paths")
_DOC = """Create container image layers from js_binary targets.
By design, js_image_layer doesn't have any preference over which rule assembles the container image.
-This means the downstream rule (`oci_image`, or `container_image` in this case) must set a proper `workdir` and `cmd` to for the container work.
+This means the downstream rule (`oci_image` from [rules_oci](https://github.com/bazel-contrib/rules_oci)
+or `container_image` from [rules_docker](https://github.com/bazelbuild/rules_docker)) must
+set a proper `workdir` and `cmd` to for the container work.
A proper `cmd` usually looks like /`[ js_image_layer 'root' ]`/`[ package name of js_image_layer 'binary' target ]/[ name of js_image_layer 'binary' target ]`,
unless you have a custom launcher script that invokes the entry_point of the `js_binary` in a different path.
-On the other hand, `workdir` has to be set to `runfiles tree root` which would be exactly `cmd` **but with `.runfiles/[ name of the workspace ]` suffix**.
+On the other hand, `workdir` has to be set to the "runfiles tree root" which would be exactly `cmd` **but with `.runfiles/[ name of the workspace ]` suffix**.
If using bzlmod then name of the local workspace is always `_main`. If bzlmod is not enabled then the name of the local workspace, if not otherwise specified
in the `WORKSPACE` file, is `__main__`. If `workdir` is not set correctly, some attributes such as `chdir` might not work properly.
-js_image_layer supports transitioning to specific `platform` to allow building multi-platform container images.
+js_image_layer creates up to 5 layers depending on what files are included in the runfiles of the provided
+`binary` target.
+
+1. `node` layer contains the Node.js toolchain
+2. `package_store_3p` layer contains all 3p npm deps in the `node_modules/.aspect_rules_js` package store
+3. `package_store_1p` layer contains all 1p npm deps in the `node_modules/.aspect_rules_js` package store
+4. `node_modules` layer contains all `node_modules/*` symlinks which point into the package store
+5. `app` layer contains all files that don't fall into any of the above layers
+
+If no files are found in the runfiles of the `binary` target for one of the layers above, that
+layer is not generated. All generated layer tarballs are provided as `DefaultInfo` files.
+
+> The rules_js `node_modules/.aspect_rules_js` package store follows the same pattern as the pnpm
+> `node_modules/.pnpm` virtual store. For more information see https://pnpm.io/symlinked-node-modules-structure.
+
+js_image_layer also provides an `OutputGroupInfo` with outputs for each of the layers above which
+can be used to reference an individual layer with using `filegroup` with `output_group`. For example,
+
+```starlark
+js_image_layer(
+ name = "layers",
+ binary = ":bin",
+ root = "/app",
+)
+
+filegroup(
+ name = "app_tar",
+ srcs = [":layers"],
+ output_group = "app",
+)
+```
-> WARNING: Structure of the resulting layers are not subject to semver guarantees and may change without a notice. However, it is guaranteed to work when provided together in the `app` and `node_modules` order
+> WARNING: The structure of the generated layers are not subject to semver guarantees and may change without a notice.
+> However, it is guaranteed to work when all generated layers are provided together in the order specified above.
+
+js_image_layer supports transitioning to specific `platform` to allow building multi-platform container images.
**A partial example using rules_oci with transition to linux/amd64 platform.**
@@ -74,7 +109,6 @@ oci_image(
**A partial example using rules_oci to create multi-platform images.**
-
```starlark
load("@aspect_rules_js//js:defs.bzl", "js_binary", "js_image_layer")
load("@rules_oci//oci:defs.bzl", "oci_image", "oci_image_index")
@@ -127,7 +161,7 @@ oci_image_index(
**An example using legacy rules_docker**
-See `e2e/js_image_rules_docker` for full example.
+See `e2e/js_image_docker` for full example.
```starlark
load("@aspect_rules_js//js:defs.bzl", "js_binary", "js_image_layer")
@@ -149,19 +183,41 @@ js_image_layer(
)
filegroup(
- name = "app_tar",
- srcs = [":layers"],
- output_group = "app",
+ name = "node_tar",
+ srcs = [":layers"],
+ output_group = "node",
)
container_layer(
- name = "app_layer",
- tars = [":app_tar"],
+ name = "node_layer",
+ tars = [":node_tar"],
+)
+
+filegroup(
+ name = "package_store_3p_tar",
+ srcs = [":layers"],
+ output_group = "package_store_3p",
+)
+
+container_layer(
+ name = "package_store_3p_layer",
+ tars = [":package_store_3p_tar"],
+)
+
+filegroup(
+ name = "package_store_1p_tar",
+ srcs = [":layers"],
+ output_group = "package_store_1p",
+)
+
+container_layer(
+ name = "package_store_1p_layer",
+ tars = [":package_store_1p_tar"],
)
filegroup(
- name = "node_modules_tar",
- srcs = [":layers"],
+ name = "node_modules_tar",
+ srcs = [":layers"],
output_group = "node_modules",
)
@@ -170,13 +226,27 @@ container_layer(
tars = [":node_modules_tar"],
)
+filegroup(
+ name = "app_tar",
+ srcs = [":layers"],
+ output_group = "app",
+)
+
+container_layer(
+ name = "app_layer",
+ tars = [":app_tar"],
+)
+
container_image(
name = "image",
cmd = ["/app/bin"],
entrypoint = ["bash"],
layers = [
- ":app_layer",
+ ":node_layer",
+ ":package_store_3p_layer",
+ ":package_store_1p_layer",
":node_modules_layer",
+ ":app_layer",
],
workdir = select({
"@aspect_bazel_lib//lib:bzlmod": "/app/bin.runfiles/_main",
@@ -209,6 +279,9 @@ def _runfile_path(ctx, file, runfiles_dir):
return paths.join(runfiles_dir, to_rlocation_path(ctx, file))
def _build_layer(ctx, type, all_entries_json, entries, inputs):
+ if not entries:
+ return None
+
entries_json = ctx.actions.declare_file("{}_{}_entries.json".format(ctx.label.name, type))
ctx.actions.write(entries_json, content = json.encode(entries))
@@ -236,11 +309,22 @@ def _build_layer(ctx, type, all_entries_json, entries, inputs):
return output
-def _should_be_in_node_modules_layer(destination, file):
+def _select_layer(layers, destination, file):
is_node = file.owner.workspace_name != "" and "/bin/nodejs/" in destination
- is_node_modules = "/node_modules/" in destination
is_js_patches = "/js/private/node-patches" in destination
- return is_node or is_node_modules or is_js_patches
+ if is_node or is_js_patches:
+ return layers.node
+ is_package_store = "/.aspect_rules_js/" in destination
+ if is_package_store:
+ is_1p_dep = "@0.0.0/node_modules/" in destination
+ if is_1p_dep:
+ return layers.package_store_1p
+ else:
+ return layers.package_store_3p
+ is_node_modules = "/node_modules/" in destination
+ if is_node_modules:
+ return layers.node_modules
+ return layers.app
def _js_image_layer_impl(ctx):
if len(ctx.attr.binary) != 1:
@@ -260,15 +344,31 @@ def _js_image_layer_impl(ctx):
launcher = _write_laucher(ctx, real_binary_path)
all_files = depset(transitive = [binary_default_info.files, binary_default_info.default_runfiles.files])
-
- app_entries = {binary_path: {"dest": launcher.path, "root": launcher.root.path}}
- app_inputs = [launcher]
-
- node_modules_entries = {}
- node_modules_inputs = []
-
all_entries = {}
+ layers = struct(
+ node = struct(
+ entries = {},
+ inputs = [],
+ ),
+ package_store_3p = struct(
+ entries = {},
+ inputs = [],
+ ),
+ package_store_1p = struct(
+ entries = {},
+ inputs = [],
+ ),
+ node_modules = struct(
+ entries = {},
+ inputs = [],
+ ),
+ app = struct(
+ entries = {binary_path: {"dest": launcher.path, "root": launcher.root.path}},
+ inputs = [launcher],
+ ),
+ )
+
for file in all_files.to_list():
destination = _runfile_path(ctx, file, runfiles_dir)
entry = {
@@ -282,22 +382,65 @@ def _js_image_layer_impl(ctx):
entry["remove_non_hermetic_lines"] = True
all_entries[destination] = entry
- if _should_be_in_node_modules_layer(destination, file):
- node_modules_entries[destination] = entry
- node_modules_inputs.append(file)
- else:
- app_entries[destination] = entry
- app_inputs.append(file)
+
+ layer = _select_layer(layers, destination, file)
+ layer.entries[destination] = entry
+ layer.inputs.append(file)
all_entries_json = ctx.actions.declare_file("{}_all_entries.json".format(ctx.label.name))
ctx.actions.write(all_entries_json, content = json.encode(all_entries))
- app = _build_layer(ctx, type = "app", all_entries_json = all_entries_json, entries = app_entries, inputs = app_inputs)
- node_modules = _build_layer(ctx, type = "node_modules", all_entries_json = all_entries_json, entries = node_modules_entries, inputs = node_modules_inputs)
+ node = _build_layer(
+ ctx,
+ type = "node",
+ all_entries_json = all_entries_json,
+ entries = layers.node.entries,
+ inputs = layers.node.inputs,
+ )
+ package_store_3p = _build_layer(
+ ctx,
+ type = "package_store_3p",
+ all_entries_json = all_entries_json,
+ entries = layers.package_store_3p.entries,
+ inputs = layers.package_store_3p.inputs,
+ )
+ package_store_1p = _build_layer(
+ ctx,
+ type = "package_store_1p",
+ all_entries_json = all_entries_json,
+ entries = layers.package_store_1p.entries,
+ inputs = layers.package_store_1p.inputs,
+ )
+ node_modules = _build_layer(
+ ctx,
+ type = "node_modules",
+ all_entries_json = all_entries_json,
+ entries = layers.node_modules.entries,
+ inputs = layers.node_modules.inputs,
+ )
+ app = _build_layer(
+ ctx,
+ type = "app",
+ all_entries_json = all_entries_json,
+ entries = layers.app.entries,
+ inputs = layers.app.inputs,
+ )
return [
- DefaultInfo(files = depset([node_modules, app])),
- OutputGroupInfo(app = depset([app]), node_modules = depset([node_modules])),
+ DefaultInfo(files = depset([i for i in [
+ node,
+ package_store_3p,
+ package_store_1p,
+ node_modules,
+ app,
+ ] if i])),
+ OutputGroupInfo(
+ node = depset([node]) if node else depset(),
+ package_store_3p = depset([package_store_3p]) if package_store_3p else depset(),
+ package_store_1p = depset([package_store_1p]) if package_store_1p else depset(),
+ node_modules = depset([node_modules]) if node_modules else depset(),
+ app = depset([app]) if app else depset(),
+ ),
]
def _js_image_layer_transition_impl(settings, attr):
diff --git a/js/private/test/image/BUILD.bazel b/js/private/test/image/BUILD.bazel
index d955e93b3..4431441d8 100644
--- a/js/private/test/image/BUILD.bazel
+++ b/js/private/test/image/BUILD.bazel
@@ -8,7 +8,7 @@ npm_link_all_packages(name = "node_modules")
js_binary(
name = "bin",
data = [
- ":node_modules/acorn",
+ ":node_modules",
],
entry_point = "main.js",
)
@@ -67,9 +67,21 @@ make_js_image_layer(
)
assert_tar_listing(
- name = "assert_default_app_layer",
- actual = "default_app_layer",
- expected = "default_app.listing",
+ name = "assert_default_node_layer",
+ actual = "default_node_layer",
+ expected = "default_node.listing",
+)
+
+assert_tar_listing(
+ name = "assert_default_package_store_3p_layer",
+ actual = "default_package_store_3p_layer",
+ expected = "default_package_store_3p.listing",
+)
+
+assert_tar_listing(
+ name = "assert_default_package_store_1p_layer",
+ actual = "default_package_store_1p_layer",
+ expected = "default_package_store_1p.listing",
)
assert_tar_listing(
@@ -78,6 +90,12 @@ assert_tar_listing(
expected = "default_node_modules.listing",
)
+assert_tar_listing(
+ name = "assert_default_app_layer",
+ actual = "default_app_layer",
+ expected = "default_app.listing",
+)
+
# Case 2: Change owner
make_js_image_layer(
name = "custom_owner",
@@ -88,9 +106,21 @@ make_js_image_layer(
)
assert_tar_listing(
- name = "assert_custom_owner_app_layer",
- actual = "custom_owner_app_layer",
- expected = "custom_owner_app.listing",
+ name = "assert_custom_owner_node_layer",
+ actual = "custom_owner_node_layer",
+ expected = "custom_owner_node.listing",
+)
+
+assert_tar_listing(
+ name = "assert_custom_owner_package_store_3p_layer",
+ actual = "custom_owner_package_store_3p_layer",
+ expected = "custom_owner_package_store_3p.listing",
+)
+
+assert_tar_listing(
+ name = "assert_custom_owner_package_store_1p_layer",
+ actual = "custom_owner_package_store_1p_layer",
+ expected = "custom_owner_package_store_1p.listing",
)
assert_tar_listing(
@@ -98,3 +128,9 @@ assert_tar_listing(
actual = "custom_owner_node_modules_layer",
expected = "custom_owner_node_modules.listing",
)
+
+assert_tar_listing(
+ name = "assert_custom_owner_app_layer",
+ actual = "custom_owner_app_layer",
+ expected = "custom_owner_app.listing",
+)
diff --git a/js/private/test/image/asserts.bzl b/js/private/test/image/asserts.bzl
index 0281267db..29481d4dd 100644
--- a/js/private/test/image/asserts.bzl
+++ b/js/private/test/image/asserts.bzl
@@ -3,6 +3,7 @@
load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_file")
load("//js:defs.bzl", "js_image_layer")
+# buildifier: disable=function-docstring
def make_js_image_layer(name, **kwargs):
js_image_layer(
name = name,
@@ -16,9 +17,23 @@ def make_js_image_layer(name, **kwargs):
)
native.filegroup(
- name = name + "_app_layer",
+ name = name + "_node_layer",
srcs = [name],
- output_group = "app",
+ output_group = "node",
+ testonly = 1,
+ )
+
+ native.filegroup(
+ name = name + "_package_store_3p_layer",
+ srcs = [name],
+ output_group = "package_store_3p",
+ testonly = 1,
+ )
+
+ native.filegroup(
+ name = name + "_package_store_1p_layer",
+ srcs = [name],
+ output_group = "package_store_1p",
testonly = 1,
)
@@ -29,6 +44,13 @@ def make_js_image_layer(name, **kwargs):
testonly = 1,
)
+ native.filegroup(
+ name = name + "_app_layer",
+ srcs = [name],
+ output_group = "app",
+ testonly = 1,
+ )
+
# buildifier: disable=function-docstring
def assert_tar_listing(name, actual, expected):
actual_listing = "_{}_listing".format(name)
@@ -37,9 +59,8 @@ def assert_tar_listing(name, actual, expected):
srcs = [actual],
testonly = True,
outs = ["_{}.listing".format(name)],
- # Install gnu-tar on macos to match CI
- # And replace tar below with /opt/homebrew/opt/gnu-tar/libexec/gnubin/tar
- cmd = 'TZ="UTC" LC_ALL="en_US.UTF-8" tar -tvf $(locations {}) >$@'.format(actual),
+ cmd = 'TZ="UTC" LC_ALL="en_US.UTF-8" $(BSDTAR_BIN) -tvf $(execpath {}) >$@'.format(actual),
+ toolchains = ["@bsd_tar_toolchains//:resolved_toolchain"],
)
write_source_file(
diff --git a/js/private/test/image/checksum.expected b/js/private/test/image/checksum.expected
index b21306dc9..559f95e36 100644
--- a/js/private/test/image/checksum.expected
+++ b/js/private/test/image/checksum.expected
@@ -1,2 +1,5 @@
-413693b1ad714b0dac59551b063bc33d0a4a680c9d48b71eba88c06a301cfc4a js/private/test/image/cksum_app.tar
-7990126e5961588efd2af7cdccac3846dfffb8ca2e26206840df8c7a1c34c42e js/private/test/image/cksum_node_modules.tar
+71282f1d6f069723a2030909e98cfbc181430da6e33a1158cca1112c8705ad9a js/private/test/image/cksum_app.tar
+1158897106dbb52f3fcd7b5c5c6ea9f3e4a992fa701041b7756c0e4cb6f7a8b3 js/private/test/image/cksum_node.tar
+c7e5a122704601296eed4b106e5a323ab8fc267c36355784a9538aff9b7ed20b js/private/test/image/cksum_node_modules.tar
+9395e137de4767edfdd663bc6010a597844bdb68663f8b3ecb036175122bcb2f js/private/test/image/cksum_package_store_1p.tar
+842c83159aa2f59c53678ed4cc7d0e23d7e1ea9de0f80af272d1694300bd8012 js/private/test/image/cksum_package_store_3p.tar
diff --git a/js/private/test/image/custom_owner_app.listing b/js/private/test/image/custom_owner_app.listing
index ccbc1857e..21e2f6ac0 100644
--- a/js/private/test/image/custom_owner_app.listing
+++ b/js/private/test/image/custom_owner_app.listing
@@ -1,17 +1,23 @@
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image
--r-xr-xr-x 100/0 136 1970-01-01 00:00 app/js/private/test/image/bin
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_
--r-xr-xr-x 100/0 23908 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_/bin
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_node_bin
--r-xr-xr-x 100/0 133 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_node_bin/node
--r-xr-xr-x 100/0 20 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/main.js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image
+-r-xr-xr-x 0 100 0 136 Jan 1 1970 app/js/private/test/image/bin
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d
+-r-xr-xr-x 0 100 0 387 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d/index.js
+-r-xr-xr-x 0 100 0 164 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d/package.json
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_
+-r-xr-xr-x 0 100 0 23908 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_/bin
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_node_bin
+-r-xr-xr-x 0 100 0 133 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_node_bin/node
+-r-xr-xr-x 0 100 0 20 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/main.js
diff --git a/js/private/test/image/custom_owner_node.listing b/js/private/test/image/custom_owner_node.listing
new file mode 100644
index 000000000..0278e3fe1
--- /dev/null
+++ b/js/private/test/image/custom_owner_node.listing
@@ -0,0 +1,17 @@
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches
+-r-xr-xr-x 0 100 0 32555 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches/fs.js
+-r-xr-xr-x 0 100 0 1698 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches/register.js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs/bin
+-r-xr-xr-x 0 100 0 80316256 Jan 1 1970 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs/bin/node
diff --git a/js/private/test/image/custom_owner_node_modules.listing b/js/private/test/image/custom_owner_node_modules.listing
index 3705ddd6a..421710e0c 100644
--- a/js/private/test/image/custom_owner_node_modules.listing
+++ b/js/private/test/image/custom_owner_node_modules.listing
@@ -1,38 +1,22 @@
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches
--r-xr-xr-x 100/0 32555 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches/fs.js
--r-xr-xr-x 100/0 1698 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches/register.js
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules
-lrwxrwxr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn
--r-xr-xr-x 100/0 19838 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/CHANGELOG.md
--r-xr-xr-x 100/0 1099 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/LICENSE
--r-xr-xr-x 100/0 10364 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/README.md
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/bin
--r-xr-xr-x 100/0 60 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/bin/acorn
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist
--r-xr-xr-x 100/0 6212 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.d.ts
--r-xr-xr-x 100/0 218042 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.js
--r-xr-xr-x 100/0 207423 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.mjs
--r-xr-xr-x 100/0 49 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.mjs.d.ts
--r-xr-xr-x 100/0 3261 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/bin.js
--r-xr-xr-x 100/0 1058 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/package.json
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs
-drwxr-xr-x 100/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs/bin
--r-xr-xr-x 100/0 80316256 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs/bin/node
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d/node_modules
+lrwxrwxr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn
+lrwxrwxr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d/node_modules/uuid -> ../../../../../node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules/@mycorp
+lrwxrwxr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules/@mycorp/pkg-d -> ../../../../../../node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d
+lrwxrwxr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn
diff --git a/js/private/test/image/custom_owner_package_store_1p.listing b/js/private/test/image/custom_owner_package_store_1p.listing
new file mode 100644
index 000000000..0ef478d0c
--- /dev/null
+++ b/js/private/test/image/custom_owner_package_store_1p.listing
@@ -0,0 +1,13 @@
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp
+lrwxrwxr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d -> ../../../../../examples/npm_package/packages/pkg_d
diff --git a/js/private/test/image/custom_owner_package_store_3p.listing b/js/private/test/image/custom_owner_package_store_3p.listing
new file mode 100644
index 000000000..210427d99
--- /dev/null
+++ b/js/private/test/image/custom_owner_package_store_3p.listing
@@ -0,0 +1,113 @@
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn
+-r-xr-xr-x 0 100 0 19126 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/CHANGELOG.md
+-r-xr-xr-x 0 100 0 1099 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/LICENSE
+-r-xr-xr-x 0 100 0 10341 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/README.md
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin
+-r-xr-xr-x 0 100 0 60 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin/acorn
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist
+-r-xr-xr-x 0 100 0 6190 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.d.ts
+-r-xr-xr-x 0 100 0 217950 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.js
+-r-xr-xr-x 0 100 0 207263 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs
+-r-xr-xr-x 0 100 0 49 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs.d.ts
+-r-xr-xr-x 0 100 0 3285 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/bin.js
+-r-xr-xr-x 0 100 0 1058 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/package.json
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn
+-r-xr-xr-x 0 100 0 19838 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/CHANGELOG.md
+-r-xr-xr-x 0 100 0 1099 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/LICENSE
+-r-xr-xr-x 0 100 0 10364 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/README.md
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/bin
+-r-xr-xr-x 0 100 0 60 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/bin/acorn
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist
+-r-xr-xr-x 0 100 0 6212 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.d.ts
+-r-xr-xr-x 0 100 0 218042 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.js
+-r-xr-xr-x 0 100 0 207423 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.mjs
+-r-xr-xr-x 0 100 0 49 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.mjs.d.ts
+-r-xr-xr-x 0 100 0 3261 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/bin.js
+-r-xr-xr-x 0 100 0 1058 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/package.json
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid
+-r-xr-xr-x 0 100 0 12680 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CHANGELOG.md
+-r-xr-xr-x 0 100 0 513 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CONTRIBUTING.md
+-r-xr-xr-x 0 100 0 1109 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/LICENSE.md
+-r-xr-xr-x 0 100 0 16564 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/README.md
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin
+-r-xr-xr-x 0 100 0 44 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin/uuid
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser
+-r-xr-xr-x 0 100 0 412 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/index.js
+-r-xr-xr-x 0 100 0 6852 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/md5.js
+-r-xr-xr-x 0 100 0 54 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/nil.js
+-r-xr-xr-x 0 100 0 1104 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/parse.js
+-r-xr-xr-x 0 100 0 133 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/regex.js
+-r-xr-xr-x 0 100 0 1040 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/rng.js
+-r-xr-xr-x 0 100 0 2488 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/sha1.js
+-r-xr-xr-x 0 100 0 1463 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/stringify.js
+-r-xr-xr-x 0 100 0 3296 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v1.js
+-r-xr-xr-x 0 100 0 105 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v3.js
+-r-xr-xr-x 0 100 0 1657 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v35.js
+-r-xr-xr-x 0 100 0 544 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v4.js
+-r-xr-xr-x 0 100 0 108 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v5.js
+-r-xr-xr-x 0 100 0 141 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/validate.js
+-r-xr-xr-x 0 100 0 200 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/version.js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node
+-r-xr-xr-x 0 100 0 412 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/index.js
+-r-xr-xr-x 0 100 0 281 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/md5.js
+-r-xr-xr-x 0 100 0 54 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/nil.js
+-r-xr-xr-x 0 100 0 1106 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/parse.js
+-r-xr-xr-x 0 100 0 133 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/regex.js
+-r-xr-xr-x 0 100 0 323 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/rng.js
+-r-xr-xr-x 0 100 0 284 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/sha1.js
+-r-xr-xr-x 0 100 0 1393 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/stringify.js
+-r-xr-xr-x 0 100 0 3306 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v1.js
+-r-xr-xr-x 0 100 0 107 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v3.js
+-r-xr-xr-x 0 100 0 1663 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v35.js
+-r-xr-xr-x 0 100 0 546 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v4.js
+-r-xr-xr-x 0 100 0 110 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v5.js
+-r-xr-xr-x 0 100 0 141 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/validate.js
+-r-xr-xr-x 0 100 0 200 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/version.js
+-r-xr-xr-x 0 100 0 1765 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/index.js
+-r-xr-xr-x 0 100 0 7015 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5-browser.js
+-r-xr-xr-x 0 100 0 550 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5.js
+-r-xr-xr-x 0 100 0 188 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/nil.js
+-r-xr-xr-x 0 100 0 1380 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/parse.js
+-r-xr-xr-x 0 100 0 267 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/regex.js
+-r-xr-xr-x 0 100 0 1131 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng-browser.js
+-r-xr-xr-x 0 100 0 549 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng.js
+-r-xr-xr-x 0 100 0 2609 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1-browser.js
+-r-xr-xr-x 0 100 0 553 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1.js
+-r-xr-xr-x 0 100 0 1667 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/stringify.js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd
+-r-xr-xr-x 0 100 0 8160 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuid.min.js
+-r-xr-xr-x 0 100 0 280 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidNIL.min.js
+-r-xr-xr-x 0 100 0 883 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidParse.min.js
+-r-xr-xr-x 0 100 0 829 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidStringify.min.js
+-r-xr-xr-x 0 100 0 420 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidValidate.min.js
+-r-xr-xr-x 0 100 0 506 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidVersion.min.js
+-r-xr-xr-x 0 100 0 2020 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv1.min.js
+-r-xr-xr-x 0 100 0 5145 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv3.min.js
+-r-xr-xr-x 0 100 0 1366 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv4.min.js
+-r-xr-xr-x 0 100 0 3267 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv5.min.js
+-r-xr-xr-x 0 100 0 2030 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/uuid-bin.js
+-r-xr-xr-x 0 100 0 3618 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v1.js
+-r-xr-xr-x 0 100 0 414 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v3.js
+-r-xr-xr-x 0 100 0 2008 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v35.js
+-r-xr-xr-x 0 100 0 860 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v4.js
+-r-xr-xr-x 0 100 0 417 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v5.js
+-r-xr-xr-x 0 100 0 410 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/validate.js
+-r-xr-xr-x 0 100 0 474 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/version.js
+-r-xr-xr-x 0 100 0 4428 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/package.json
+-r-xr-xr-x 0 100 0 323 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/wrapper.mjs
diff --git a/js/private/test/image/default_app.listing b/js/private/test/image/default_app.listing
index f8fd113a6..ebc885a4d 100644
--- a/js/private/test/image/default_app.listing
+++ b/js/private/test/image/default_app.listing
@@ -1,17 +1,23 @@
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image
--r-xr-xr-x 0/0 136 1970-01-01 00:00 app/js/private/test/image/bin
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_
--r-xr-xr-x 0/0 23908 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_/bin
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_node_bin
--r-xr-xr-x 0/0 133 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_node_bin/node
--r-xr-xr-x 0/0 20 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/main.js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image
+-r-xr-xr-x 0 0 0 136 Jan 1 1970 app/js/private/test/image/bin
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d
+-r-xr-xr-x 0 0 0 387 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d/index.js
+-r-xr-xr-x 0 0 0 164 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d/package.json
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_
+-r-xr-xr-x 0 0 0 23908 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_/bin
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_node_bin
+-r-xr-xr-x 0 0 0 133 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/bin_node_bin/node
+-r-xr-xr-x 0 0 0 20 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/main.js
diff --git a/js/private/test/image/default_node.listing b/js/private/test/image/default_node.listing
new file mode 100644
index 000000000..b063f3798
--- /dev/null
+++ b/js/private/test/image/default_node.listing
@@ -0,0 +1,17 @@
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches
+-r-xr-xr-x 0 0 0 32555 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches/fs.js
+-r-xr-xr-x 0 0 0 1698 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches/register.js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs/bin
+-r-xr-xr-x 0 0 0 80316256 Jan 1 1970 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs/bin/node
diff --git a/js/private/test/image/default_node_modules.listing b/js/private/test/image/default_node_modules.listing
index f7ec7cb22..c016aa4f8 100644
--- a/js/private/test/image/default_node_modules.listing
+++ b/js/private/test/image/default_node_modules.listing
@@ -1,38 +1,22 @@
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches
--r-xr-xr-x 0/0 32555 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches/fs.js
--r-xr-xr-x 0/0 1698 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/node-patches/register.js
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules
-lrwxrwxr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn
--r-xr-xr-x 0/0 19838 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/CHANGELOG.md
--r-xr-xr-x 0/0 1099 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/LICENSE
--r-xr-xr-x 0/0 10364 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/README.md
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/bin
--r-xr-xr-x 0/0 60 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/bin/acorn
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist
--r-xr-xr-x 0/0 6212 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.d.ts
--r-xr-xr-x 0/0 218042 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.js
--r-xr-xr-x 0/0 207423 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.mjs
--r-xr-xr-x 0/0 49 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.mjs.d.ts
--r-xr-xr-x 0/0 3261 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/bin.js
--r-xr-xr-x 0/0 1058 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/package.json
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs
-drwxr-xr-x 0/0 0 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs/bin
--r-xr-xr-x 0/0 80316256 1970-01-01 00:00 app/js/private/test/image/bin.runfiles/nodejs_linux_amd64/bin/nodejs/bin/node
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d/node_modules
+lrwxrwxr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn
+lrwxrwxr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/examples/npm_package/packages/pkg_d/node_modules/uuid -> ../../../../../node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules/@mycorp
+lrwxrwxr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules/@mycorp/pkg-d -> ../../../../../../node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d
+lrwxrwxr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/js/private/test/image/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn
diff --git a/js/private/test/image/default_package_store_1p.listing b/js/private/test/image/default_package_store_1p.listing
new file mode 100644
index 000000000..14cdeb81c
--- /dev/null
+++ b/js/private/test/image/default_package_store_1p.listing
@@ -0,0 +1,13 @@
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp
+lrwxrwxr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d -> ../../../../../examples/npm_package/packages/pkg_d
diff --git a/js/private/test/image/default_package_store_3p.listing b/js/private/test/image/default_package_store_3p.listing
new file mode 100644
index 000000000..f73e709fb
--- /dev/null
+++ b/js/private/test/image/default_package_store_3p.listing
@@ -0,0 +1,113 @@
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn
+-r-xr-xr-x 0 0 0 19126 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/CHANGELOG.md
+-r-xr-xr-x 0 0 0 1099 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/LICENSE
+-r-xr-xr-x 0 0 0 10341 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/README.md
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin
+-r-xr-xr-x 0 0 0 60 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin/acorn
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist
+-r-xr-xr-x 0 0 0 6190 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.d.ts
+-r-xr-xr-x 0 0 0 217950 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.js
+-r-xr-xr-x 0 0 0 207263 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs
+-r-xr-xr-x 0 0 0 49 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs.d.ts
+-r-xr-xr-x 0 0 0 3285 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/bin.js
+-r-xr-xr-x 0 0 0 1058 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/package.json
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn
+-r-xr-xr-x 0 0 0 19838 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/CHANGELOG.md
+-r-xr-xr-x 0 0 0 1099 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/LICENSE
+-r-xr-xr-x 0 0 0 10364 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/README.md
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/bin
+-r-xr-xr-x 0 0 0 60 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/bin/acorn
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist
+-r-xr-xr-x 0 0 0 6212 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.d.ts
+-r-xr-xr-x 0 0 0 218042 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.js
+-r-xr-xr-x 0 0 0 207423 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.mjs
+-r-xr-xr-x 0 0 0 49 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/acorn.mjs.d.ts
+-r-xr-xr-x 0 0 0 3261 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/dist/bin.js
+-r-xr-xr-x 0 0 0 1058 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/acorn@8.8.2/node_modules/acorn/package.json
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid
+-r-xr-xr-x 0 0 0 12680 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CHANGELOG.md
+-r-xr-xr-x 0 0 0 513 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CONTRIBUTING.md
+-r-xr-xr-x 0 0 0 1109 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/LICENSE.md
+-r-xr-xr-x 0 0 0 16564 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/README.md
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin
+-r-xr-xr-x 0 0 0 44 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin/uuid
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser
+-r-xr-xr-x 0 0 0 412 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/index.js
+-r-xr-xr-x 0 0 0 6852 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/md5.js
+-r-xr-xr-x 0 0 0 54 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/nil.js
+-r-xr-xr-x 0 0 0 1104 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/parse.js
+-r-xr-xr-x 0 0 0 133 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/regex.js
+-r-xr-xr-x 0 0 0 1040 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/rng.js
+-r-xr-xr-x 0 0 0 2488 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/sha1.js
+-r-xr-xr-x 0 0 0 1463 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/stringify.js
+-r-xr-xr-x 0 0 0 3296 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v1.js
+-r-xr-xr-x 0 0 0 105 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v3.js
+-r-xr-xr-x 0 0 0 1657 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v35.js
+-r-xr-xr-x 0 0 0 544 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v4.js
+-r-xr-xr-x 0 0 0 108 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v5.js
+-r-xr-xr-x 0 0 0 141 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/validate.js
+-r-xr-xr-x 0 0 0 200 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/version.js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node
+-r-xr-xr-x 0 0 0 412 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/index.js
+-r-xr-xr-x 0 0 0 281 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/md5.js
+-r-xr-xr-x 0 0 0 54 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/nil.js
+-r-xr-xr-x 0 0 0 1106 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/parse.js
+-r-xr-xr-x 0 0 0 133 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/regex.js
+-r-xr-xr-x 0 0 0 323 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/rng.js
+-r-xr-xr-x 0 0 0 284 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/sha1.js
+-r-xr-xr-x 0 0 0 1393 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/stringify.js
+-r-xr-xr-x 0 0 0 3306 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v1.js
+-r-xr-xr-x 0 0 0 107 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v3.js
+-r-xr-xr-x 0 0 0 1663 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v35.js
+-r-xr-xr-x 0 0 0 546 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v4.js
+-r-xr-xr-x 0 0 0 110 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v5.js
+-r-xr-xr-x 0 0 0 141 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/validate.js
+-r-xr-xr-x 0 0 0 200 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/version.js
+-r-xr-xr-x 0 0 0 1765 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/index.js
+-r-xr-xr-x 0 0 0 7015 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5-browser.js
+-r-xr-xr-x 0 0 0 550 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5.js
+-r-xr-xr-x 0 0 0 188 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/nil.js
+-r-xr-xr-x 0 0 0 1380 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/parse.js
+-r-xr-xr-x 0 0 0 267 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/regex.js
+-r-xr-xr-x 0 0 0 1131 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng-browser.js
+-r-xr-xr-x 0 0 0 549 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng.js
+-r-xr-xr-x 0 0 0 2609 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1-browser.js
+-r-xr-xr-x 0 0 0 553 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1.js
+-r-xr-xr-x 0 0 0 1667 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/stringify.js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd
+-r-xr-xr-x 0 0 0 8160 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuid.min.js
+-r-xr-xr-x 0 0 0 280 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidNIL.min.js
+-r-xr-xr-x 0 0 0 883 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidParse.min.js
+-r-xr-xr-x 0 0 0 829 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidStringify.min.js
+-r-xr-xr-x 0 0 0 420 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidValidate.min.js
+-r-xr-xr-x 0 0 0 506 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidVersion.min.js
+-r-xr-xr-x 0 0 0 2020 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv1.min.js
+-r-xr-xr-x 0 0 0 5145 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv3.min.js
+-r-xr-xr-x 0 0 0 1366 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv4.min.js
+-r-xr-xr-x 0 0 0 3267 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv5.min.js
+-r-xr-xr-x 0 0 0 2030 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/uuid-bin.js
+-r-xr-xr-x 0 0 0 3618 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v1.js
+-r-xr-xr-x 0 0 0 414 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v3.js
+-r-xr-xr-x 0 0 0 2008 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v35.js
+-r-xr-xr-x 0 0 0 860 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v4.js
+-r-xr-xr-x 0 0 0 417 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v5.js
+-r-xr-xr-x 0 0 0 410 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/validate.js
+-r-xr-xr-x 0 0 0 474 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/version.js
+-r-xr-xr-x 0 0 0 4428 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/package.json
+-r-xr-xr-x 0 0 0 323 Jan 1 1970 app/js/private/test/image/bin.runfiles/aspect_rules_js/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/wrapper.mjs
diff --git a/js/private/test/image/package.json b/js/private/test/image/package.json
index f3479ad77..43f745941 100644
--- a/js/private/test/image/package.json
+++ b/js/private/test/image/package.json
@@ -1,5 +1,7 @@
{
"dependencies": {
+ "@mycorp/pkg-a": "workspace:*",
+ "@mycorp/pkg-d": "workspace:*",
"acorn": "8.8.2"
}
}
diff --git a/npm/private/test/snapshots/bzlmod/npm_defs.bzl b/npm/private/test/snapshots/bzlmod/npm_defs.bzl
index 0d0ec6319..c980f6283 100644
--- a/npm/private/test/snapshots/bzlmod/npm_defs.bzl
+++ b/npm/private/test/snapshots/bzlmod/npm_defs.bzl
@@ -2245,7 +2245,7 @@ def npm_link_all_packages(name = "node_modules", imported_links = []):
tags = ["manual"],
)
- for link_package in ["examples/js_binary", "examples/npm_deps"]:
+ for link_package in ["examples/js_binary", "examples/npm_deps", "js/private/test/image"]:
if link_package == native.package_name():
# terminal target for direct dependencies
_npm_link_package_store(
@@ -2279,7 +2279,7 @@ def npm_link_all_packages(name = "node_modules", imported_links = []):
tags = ["manual"],
)
- for link_package in ["examples/npm_deps"]:
+ for link_package in ["examples/npm_deps", "js/private/test/image"]:
if link_package == native.package_name():
# terminal target for direct dependencies
_npm_link_package_store(
@@ -2464,11 +2464,11 @@ def npm_link_targets(name = "node_modules", package = None):
link_targets.append("//{}:{}/mocha-multi-reporters".format(bazel_package, name))
link_targets.append("//{}:{}/mocha".format(bazel_package, name))
- for link_package in ["examples/js_binary", "examples/npm_deps"]:
+ for link_package in ["examples/js_binary", "examples/npm_deps", "js/private/test/image"]:
if link_package == bazel_package:
link_targets.append("//{}:{}/@mycorp/pkg-a".format(bazel_package, name))
- for link_package in ["examples/npm_deps"]:
+ for link_package in ["examples/npm_deps", "js/private/test/image"]:
if link_package == bazel_package:
link_targets.append("//{}:{}/@mycorp/pkg-d".format(bazel_package, name))
diff --git a/npm/private/test/snapshots/wksp/npm_defs.bzl b/npm/private/test/snapshots/wksp/npm_defs.bzl
index 8da4d72da..e4e2f12ca 100644
--- a/npm/private/test/snapshots/wksp/npm_defs.bzl
+++ b/npm/private/test/snapshots/wksp/npm_defs.bzl
@@ -2245,7 +2245,7 @@ def npm_link_all_packages(name = "node_modules", imported_links = []):
tags = ["manual"],
)
- for link_package in ["examples/js_binary", "examples/npm_deps"]:
+ for link_package in ["examples/js_binary", "examples/npm_deps", "js/private/test/image"]:
if link_package == native.package_name():
# terminal target for direct dependencies
_npm_link_package_store(
@@ -2279,7 +2279,7 @@ def npm_link_all_packages(name = "node_modules", imported_links = []):
tags = ["manual"],
)
- for link_package in ["examples/npm_deps"]:
+ for link_package in ["examples/npm_deps", "js/private/test/image"]:
if link_package == native.package_name():
# terminal target for direct dependencies
_npm_link_package_store(
@@ -2464,11 +2464,11 @@ def npm_link_targets(name = "node_modules", package = None):
link_targets.append("//{}:{}/mocha-multi-reporters".format(bazel_package, name))
link_targets.append("//{}:{}/mocha".format(bazel_package, name))
- for link_package in ["examples/js_binary", "examples/npm_deps"]:
+ for link_package in ["examples/js_binary", "examples/npm_deps", "js/private/test/image"]:
if link_package == bazel_package:
link_targets.append("//{}:{}/@mycorp/pkg-a".format(bazel_package, name))
- for link_package in ["examples/npm_deps"]:
+ for link_package in ["examples/npm_deps", "js/private/test/image"]:
if link_package == bazel_package:
link_targets.append("//{}:{}/@mycorp/pkg-d".format(bazel_package, name))
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4c1d4d3d0..050ec5b73 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -214,6 +214,12 @@ importers:
js/private/test/image:
dependencies:
+ '@mycorp/pkg-a':
+ specifier: workspace:*
+ version: link:../../../../examples/npm_package/packages/pkg_a
+ '@mycorp/pkg-d':
+ specifier: workspace:*
+ version: link:../../../../examples/npm_package/packages/pkg_d
acorn:
specifier: 8.8.2
version: 8.8.2