fix: support generic npmrc registry config (#530)
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 66669ff..989319f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml
@@ -47,6 +47,7 @@ - 'e2e/npm_link_package-esm' - 'e2e/pnpm_workspace' - 'e2e/pnpm_workspace_rerooted' + - 'e2e/npm_translate_lock' - 'e2e/npm_translate_lock_auth' - 'e2e/npm_translate_package_lock' - 'e2e/npm_translate_yarn_lock'
diff --git a/e2e/npm_translate_lock/.bazelignore b/e2e/npm_translate_lock/.bazelignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/e2e/npm_translate_lock/.bazelignore
@@ -0,0 +1 @@ +node_modules/ \ No newline at end of file
diff --git a/e2e/npm_translate_lock/.bazelrc b/e2e/npm_translate_lock/.bazelrc new file mode 100644 index 0000000..5128b1b --- /dev/null +++ b/e2e/npm_translate_lock/.bazelrc
@@ -0,0 +1,2 @@ +# import common bazelrc shared with e2e workspaces +import %workspace%/../../.bazelrc.common
diff --git a/e2e/npm_translate_lock/.bazelversion b/e2e/npm_translate_lock/.bazelversion new file mode 120000 index 0000000..96cf949 --- /dev/null +++ b/e2e/npm_translate_lock/.bazelversion
@@ -0,0 +1 @@ +../../.bazelversion \ No newline at end of file
diff --git a/e2e/npm_translate_lock/.npmrc b/e2e/npm_translate_lock/.npmrc new file mode 100644 index 0000000..1ef14f3 --- /dev/null +++ b/e2e/npm_translate_lock/.npmrc
@@ -0,0 +1,7 @@ +hoist=false + +# Override the default registry to use yarn instead of npm +registry=https://registry.yarnpkg.com + +# Override the registry of a scope +@types:registry=https://registry.npmjs.org/ \ No newline at end of file
diff --git a/e2e/npm_translate_lock/BUILD.bazel b/e2e/npm_translate_lock/BUILD.bazel new file mode 100644 index 0000000..ce77dfb --- /dev/null +++ b/e2e/npm_translate_lock/BUILD.bazel
@@ -0,0 +1,20 @@ +load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files") +load("@bazel_skylib//rules:build_test.bzl", "build_test") +load("@npm//:defs.bzl", "npm_link_all_packages") + +npm_link_all_packages(name = "node_modules") + +build_test( + name = "test", + targets = [ + ":node_modules", + ], +) + +write_source_files( + name = "write_npm_translate_lock", + files = { + "repositories_checked.bzl": "@npm//:repositories.bzl", + "defs_checked.bzl": "@npm//:defs.bzl", + }, +)
diff --git a/e2e/npm_translate_lock/README.md b/e2e/npm_translate_lock/README.md new file mode 100644 index 0000000..cb7fc9a --- /dev/null +++ b/e2e/npm_translate_lock/README.md
@@ -0,0 +1,5 @@ +# Tests for npmrc params + +## Registry + +Test the generated rules respect the `.npmrc` `registry` and `@scope:registry` configuration.
diff --git a/e2e/npm_translate_lock/WORKSPACE b/e2e/npm_translate_lock/WORKSPACE new file mode 100644 index 0000000..367c12c --- /dev/null +++ b/e2e/npm_translate_lock/WORKSPACE
@@ -0,0 +1,29 @@ +local_repository( + name = "aspect_rules_js", + path = "../..", +) + +load("@aspect_rules_js//js:repositories.bzl", "rules_js_dependencies") + +rules_js_dependencies() + +load("@rules_nodejs//nodejs:repositories.bzl", "DEFAULT_NODE_VERSION", "nodejs_register_toolchains") + +nodejs_register_toolchains( + name = "nodejs", + node_version = DEFAULT_NODE_VERSION, +) + +load("@aspect_rules_js//npm:npm_import.bzl", "npm_translate_lock") + +# Validate that we can use a yarn.lock file in place of pnpm-lock.yaml +npm_translate_lock( + name = "npm", + npmrc = "//:.npmrc", + pnpm_lock = "//:pnpm-lock.yaml", + verify_node_modules_ignored = "//:.bazelignore", +) + +load("@npm//:repositories.bzl", "npm_repositories") + +npm_repositories()
diff --git a/e2e/npm_translate_lock/defs_checked.bzl b/e2e/npm_translate_lock/defs_checked.bzl new file mode 100755 index 0000000..4d62cb7 --- /dev/null +++ b/e2e/npm_translate_lock/defs_checked.bzl
@@ -0,0 +1,86 @@ +"@generated by @aspect_rules_js//npm/private:npm_translate_lock.bzl from //:pnpm-lock.yaml" + +# buildifier: disable=bzl-visibility +load("@aspect_rules_js//js:defs.bzl", _js_library = "js_library") +load("@npm__at_types_node__18.11.0__links//:defs.bzl", link_0 = "npm_link_imported_package_store", store_0 = "npm_imported_package_store") +load("@npm__at_types_semver__7.3.12__links//:defs.bzl", link_1 = "npm_link_imported_package_store", store_1 = "npm_imported_package_store") +load("@npm__debug__registry.npmjs.org_debug_4.3.4__links//:defs.bzl", link_2 = "npm_link_imported_package_store", store_2 = "npm_imported_package_store") +load("@npm__is-number__registry.npmjs.org_is-number_6.0.0__links//:defs.bzl", store_3 = "npm_imported_package_store") +load("@npm__is-odd__registry.npmjs.org_is-odd_3.0.1__links//:defs.bzl", link_4 = "npm_link_imported_package_store", store_4 = "npm_imported_package_store") +load("@npm__lru-cache__registry.npmjs.org_lru-cache_6.0.0__links//:defs.bzl", store_5 = "npm_imported_package_store") +load("@npm__ms__registry.npmjs.org_ms_2.1.2__links//:defs.bzl", store_6 = "npm_imported_package_store") +load("@npm__semver__registry.npmjs.org_semver_7.3.8__links//:defs.bzl", link_7 = "npm_link_imported_package_store", store_7 = "npm_imported_package_store") +load("@npm__yallist__registry.npmjs.org_yallist_4.0.0__links//:defs.bzl", store_8 = "npm_imported_package_store") + +def npm_link_all_packages(name = "node_modules", imported_links = []): + """Generated list of npm_link_package() target generators and first-party linked packages corresponding to the packages in //:pnpm-lock.yaml + + Args: + name: name of catch all target to generate for all packages linked + imported_links: optional list link functions from manually imported packages + that were fetched with npm_import rules, + + For example, + + ``` + load("@npm//:defs.bzl", "npm_link_all_packages") + load("@npm_meaning-of-life__links//:defs.bzl", npm_link_meaning_of_life = "npm_link_imported_package") + + npm_link_all_packages( + name = "node_modules", + imported_links = [ + npm_link_meaning_of_life, + ], + )``` + """ + + root_package = "" + link_packages = [""] + is_root = native.package_name() == root_package + link = native.package_name() in link_packages + if not is_root and not link: + msg = "The npm_link_all_packages() macro loaded from @npm//:defs.bzl and called in bazel package '%s' may only be called in the bazel package(s) corresponding to the root package '' and packages ['']" % native.package_name() + fail(msg) + link_targets = [] + scope_targets = {} + + for link_fn in imported_links: + new_link_targets, new_scope_targets = link_fn(name) + link_targets.extend(new_link_targets) + for _scope, _targets in new_scope_targets.items(): + scope_targets[_scope] = scope_targets[_scope] + _targets if _scope in scope_targets else _targets + + if is_root: + store_0(name = "{}/@types/node".format(name)) + store_1(name = "{}/@types/semver".format(name)) + store_2(name = "{}/debug".format(name)) + store_3(name = "{}/is-number".format(name)) + store_4(name = "{}/is-odd".format(name)) + store_5(name = "{}/lru-cache".format(name)) + store_6(name = "{}/ms".format(name)) + store_7(name = "{}/semver".format(name)) + store_8(name = "{}/yallist".format(name)) + if link: + if native.package_name() == "": + link_targets.append(link_0(name = "{}/@types/node".format(name))) + scope_targets["@types"] = scope_targets["@types"] + [link_targets[-1]] if "@types" in scope_targets else [link_targets[-1]] + link_targets.append(link_1(name = "{}/@types/semver".format(name))) + scope_targets["@types"] = scope_targets["@types"] + [link_targets[-1]] if "@types" in scope_targets else [link_targets[-1]] + link_targets.append(link_2(name = "{}/debug".format(name))) + link_targets.append(link_4(name = "{}/is-odd".format(name))) + link_targets.append(link_7(name = "{}/semver".format(name))) + + for scope, scoped_targets in scope_targets.items(): + _js_library( + name = "{}/{}".format(name, scope), + srcs = scoped_targets, + tags = ["manual"], + visibility = ["//visibility:public"], + ) + + _js_library( + name = name, + srcs = link_targets, + tags = ["manual"], + visibility = ["//visibility:public"], + )
diff --git a/e2e/npm_translate_lock/package.json b/e2e/npm_translate_lock/package.json new file mode 100644 index 0000000..52e4b3d --- /dev/null +++ b/e2e/npm_translate_lock/package.json
@@ -0,0 +1,12 @@ +{ + "private": true, + "dependencies": { + "debug": "^4.3.4", + "is-odd": "^3.0.1", + "semver": "^7.3.8" + }, + "devDependencies": { + "@types/node": "^18.11.0", + "@types/semver": "^7.3.12" + } +}
diff --git a/e2e/npm_translate_lock/pnpm-lock.yaml b/e2e/npm_translate_lock/pnpm-lock.yaml new file mode 100644 index 0000000..2cbcd7a --- /dev/null +++ b/e2e/npm_translate_lock/pnpm-lock.yaml
@@ -0,0 +1,89 @@ +lockfileVersion: 5.4 + +importers: + + .: + specifiers: + '@types/node': ^18.11.0 + '@types/semver': ^7.3.12 + debug: ^4.3.4 + is-odd: ^3.0.1 + semver: ^7.3.8 + dependencies: + debug: registry.npmjs.org/debug/4.3.4 + is-odd: registry.npmjs.org/is-odd/3.0.1 + semver: registry.npmjs.org/semver/7.3.8 + devDependencies: + '@types/node': 18.11.0 + '@types/semver': 7.3.12 + +packages: + + /@types/node/18.11.0: + resolution: {integrity: sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==} + dev: true + + /@types/semver/7.3.12: + resolution: {integrity: sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==} + dev: true + + registry.npmjs.org/debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/debug/-/debug-4.3.4.tgz} + name: debug + version: 4.3.4 + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: registry.npmjs.org/ms/2.1.2 + dev: false + + registry.npmjs.org/is-number/6.0.0: + resolution: {integrity: sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz} + name: is-number + version: 6.0.0 + engines: {node: '>=0.10.0'} + dev: false + + registry.npmjs.org/is-odd/3.0.1: + resolution: {integrity: sha512-CQpnWPrDwmP1+SMHXZhtLtJv90yiyVfluGsX5iNCVkrhQtU3TQHsUWPG9wkdk9Lgd5yNpAg9jQEo90CBaXgWMA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-odd/-/is-odd-3.0.1.tgz} + name: is-odd + version: 3.0.1 + engines: {node: '>=4'} + dependencies: + is-number: registry.npmjs.org/is-number/6.0.0 + dev: false + + registry.npmjs.org/lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz} + name: lru-cache + version: 6.0.0 + engines: {node: '>=10'} + dependencies: + yallist: registry.npmjs.org/yallist/4.0.0 + dev: false + + registry.npmjs.org/ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ms/-/ms-2.1.2.tgz} + name: ms + version: 2.1.2 + dev: false + + registry.npmjs.org/semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/semver/-/semver-7.3.8.tgz} + name: semver + version: 7.3.8 + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: registry.npmjs.org/lru-cache/6.0.0 + dev: false + + registry.npmjs.org/yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz} + name: yallist + version: 4.0.0 + dev: false
diff --git a/e2e/npm_translate_lock/pnpm-workspace.yaml b/e2e/npm_translate_lock/pnpm-workspace.yaml new file mode 100644 index 0000000..2cce0eb --- /dev/null +++ b/e2e/npm_translate_lock/pnpm-workspace.yaml
@@ -0,0 +1,2 @@ +packages: + - '.'
diff --git a/e2e/npm_translate_lock/repositories_checked.bzl b/e2e/npm_translate_lock/repositories_checked.bzl new file mode 100755 index 0000000..0ee705c --- /dev/null +++ b/e2e/npm_translate_lock/repositories_checked.bzl
@@ -0,0 +1,167 @@ +"@generated by @aspect_rules_js//npm/private:npm_translate_lock.bzl from //:pnpm-lock.yaml" + +load("@aspect_rules_js//npm:npm_import.bzl", "npm_import") + +def npm_repositories(): + "Generated npm_import repository rules corresponding to npm packages in //:pnpm-lock.yaml" + npm_import( + name = "npm__at_types_node__18.11.0", + root_package = "", + link_workspace = "", + link_packages = { + "": ["@types/node"], + }, + package = "@types/node", + version = "18.11.0", + url = "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz", + lifecycle_hooks_no_sandbox = True, + integrity = "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==", + transitive_closure = { + "@types/node": ["18.11.0"], + }, + ) + + npm_import( + name = "npm__at_types_semver__7.3.12", + root_package = "", + link_workspace = "", + link_packages = { + "": ["@types/semver"], + }, + package = "@types/semver", + version = "7.3.12", + url = "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", + lifecycle_hooks_no_sandbox = True, + integrity = "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", + transitive_closure = { + "@types/semver": ["7.3.12"], + }, + ) + + npm_import( + name = "npm__debug__registry.npmjs.org_debug_4.3.4", + root_package = "", + link_workspace = "", + link_packages = { + "": ["debug"], + }, + package = "debug", + version = "registry.npmjs.org/debug/4.3.4", + url = "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + lifecycle_hooks_no_sandbox = True, + integrity = "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + deps = { + "ms": "registry.npmjs.org/ms/2.1.2", + }, + transitive_closure = { + "debug": ["registry.npmjs.org/debug/4.3.4"], + "ms": ["registry.npmjs.org/ms/2.1.2"], + }, + ) + + npm_import( + name = "npm__is-number__registry.npmjs.org_is-number_6.0.0", + root_package = "", + link_workspace = "", + link_packages = {}, + package = "is-number", + version = "registry.npmjs.org/is-number/6.0.0", + url = "https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz", + lifecycle_hooks_no_sandbox = True, + integrity = "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg==", + transitive_closure = { + "is-number": ["registry.npmjs.org/is-number/6.0.0"], + }, + ) + + npm_import( + name = "npm__is-odd__registry.npmjs.org_is-odd_3.0.1", + root_package = "", + link_workspace = "", + link_packages = { + "": ["is-odd"], + }, + package = "is-odd", + version = "registry.npmjs.org/is-odd/3.0.1", + url = "https://registry.npmjs.org/is-odd/-/is-odd-3.0.1.tgz", + lifecycle_hooks_no_sandbox = True, + integrity = "sha512-CQpnWPrDwmP1+SMHXZhtLtJv90yiyVfluGsX5iNCVkrhQtU3TQHsUWPG9wkdk9Lgd5yNpAg9jQEo90CBaXgWMA==", + deps = { + "is-number": "registry.npmjs.org/is-number/6.0.0", + }, + transitive_closure = { + "is-odd": ["registry.npmjs.org/is-odd/3.0.1"], + "is-number": ["registry.npmjs.org/is-number/6.0.0"], + }, + ) + + npm_import( + name = "npm__lru-cache__registry.npmjs.org_lru-cache_6.0.0", + root_package = "", + link_workspace = "", + link_packages = {}, + package = "lru-cache", + version = "registry.npmjs.org/lru-cache/6.0.0", + url = "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + lifecycle_hooks_no_sandbox = True, + integrity = "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + deps = { + "yallist": "registry.npmjs.org/yallist/4.0.0", + }, + transitive_closure = { + "lru-cache": ["registry.npmjs.org/lru-cache/6.0.0"], + "yallist": ["registry.npmjs.org/yallist/4.0.0"], + }, + ) + + npm_import( + name = "npm__ms__registry.npmjs.org_ms_2.1.2", + root_package = "", + link_workspace = "", + link_packages = {}, + package = "ms", + version = "registry.npmjs.org/ms/2.1.2", + url = "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + lifecycle_hooks_no_sandbox = True, + integrity = "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + transitive_closure = { + "ms": ["registry.npmjs.org/ms/2.1.2"], + }, + ) + + npm_import( + name = "npm__semver__registry.npmjs.org_semver_7.3.8", + root_package = "", + link_workspace = "", + link_packages = { + "": ["semver"], + }, + package = "semver", + version = "registry.npmjs.org/semver/7.3.8", + url = "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + lifecycle_hooks_no_sandbox = True, + integrity = "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + deps = { + "lru-cache": "registry.npmjs.org/lru-cache/6.0.0", + }, + transitive_closure = { + "semver": ["registry.npmjs.org/semver/7.3.8"], + "lru-cache": ["registry.npmjs.org/lru-cache/6.0.0"], + "yallist": ["registry.npmjs.org/yallist/4.0.0"], + }, + ) + + npm_import( + name = "npm__yallist__registry.npmjs.org_yallist_4.0.0", + root_package = "", + link_workspace = "", + link_packages = {}, + package = "yallist", + version = "registry.npmjs.org/yallist/4.0.0", + url = "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + lifecycle_hooks_no_sandbox = True, + integrity = "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + transitive_closure = { + "yallist": ["registry.npmjs.org/yallist/4.0.0"], + }, + )
diff --git a/npm/extensions.bzl b/npm/extensions.bzl index 53b9cf7..7f2a7e4 100644 --- a/npm/extensions.bzl +++ b/npm/extensions.bzl
@@ -3,7 +3,7 @@ """ load("//npm/private:utils.bzl", "utils") -load("//npm/private:npm_translate_lock.bzl", npm_translate_lock_lib = "npm_translate_lock") +load("//npm/private:npm_translate_lock.bzl", "DEFAULT_REGISTRY", npm_translate_lock_lib = "npm_translate_lock") load("//npm/private:npm_import.bzl", npm_import_lib = "npm_import") load("//npm:npm_import.bzl", "npm_import", "npm_translate_lock") load("//npm/private:transitive_closure.bzl", "translate_to_transitive_closure") @@ -13,7 +13,7 @@ for attr in mod.tags.npm_translate_lock: lockfile = utils.parse_pnpm_lock(module_ctx.read(attr.pnpm_lock)) trans = translate_to_transitive_closure(lockfile, attr.prod, attr.dev, attr.no_optional) - imports = npm_translate_lock_lib.gen_npm_imports(trans, attr.pnpm_lock.package, attr) + imports = npm_translate_lock_lib.gen_npm_imports(trans, attr.pnpm_lock.package, attr, DEFAULT_REGISTRY) for i in imports: npm_import( name = i.name,
diff --git a/npm/private/npm_import.bzl b/npm/private/npm_import.bzl index fac8f83..05ae17b 100644 --- a/npm/private/npm_import.bzl +++ b/npm/private/npm_import.bzl
@@ -4,6 +4,7 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_skylib//lib:dicts.bzl", "dicts") load(":utils.bzl", "utils") +load(":npm_translate_lock.bzl", "DEFAULT_REGISTRY") load(":starlark_codegen_utils.bzl", "starlark_codegen_utils") _LINK_JS_PACKAGE_TMPL = """load("@aspect_rules_js//js:defs.bzl", _js_run_binary = "js_run_binary") @@ -346,7 +347,7 @@ def _impl(rctx): # scoped packages contain a slash in the name, which doesn't appear in the later part of the URL package_name_no_scope = rctx.attr.package.rsplit("/", 1)[-1] - download_url = rctx.attr.url if rctx.attr.url else utils.npm_registry_download_url(rctx.attr.package, rctx.attr.version) + download_url = rctx.attr.url if rctx.attr.url else utils.npm_registry_download_url(rctx.attr.package, rctx.attr.version, {}, DEFAULT_REGISTRY) auth = { download_url: {
diff --git a/npm/private/npm_translate_lock.bzl b/npm/private/npm_translate_lock.bzl index 8bbaac2..9b27e98 100644 --- a/npm/private/npm_translate_lock.bzl +++ b/npm/private/npm_translate_lock.bzl
@@ -7,6 +7,8 @@ load(":transitive_closure.bzl", "translate_to_transitive_closure") load(":starlark_codegen_utils.bzl", "starlark_codegen_utils") +DEFAULT_REGISTRY = "https://registry.npmjs.org/" + _ATTRS = { "pnpm_lock": attr.label(), "package_json": attr.label(), @@ -213,7 +215,7 @@ return (tokens, registries) -def _gen_npm_imports(lockfile, root_package, attr, registries = {}): +def _gen_npm_imports(lockfile, root_package, attr, registries, default_registry): "Converts packages from the lockfile to a struct of attributes for npm_import" if attr.prod and attr.dev: @@ -330,14 +332,14 @@ url = None if tarball: if _is_url(tarball): - if registry and tarball.startswith(utils.npm_registry_url): - url = registry + tarball[len(utils.npm_registry_url):] + if registry and tarball.startswith(default_registry): + url = registry + tarball[len(default_registry):] else: url = tarball else: if not registry: (scope, _) = utils.parse_package_name(name) - registry = "https://{}".format(registries[scope]) if scope in registries else utils.npm_registry_url + registry = "https://{}".format(registries[scope]) if scope in registries else default_registry url = "{0}/{1}".format(registry.removesuffix("/"), tarball) result.append(struct( @@ -470,6 +472,7 @@ lockfile_description = None npm_tokens = {} npm_registries = {} + default_registry = DEFAULT_REGISTRY # Read tokens from npmrc label if rctx.attr.npmrc: @@ -477,6 +480,9 @@ npmrc = parse_ini(rctx.read(npmrc_path)) (npm_tokens, npm_registries) = get_npm_auth(npmrc, npmrc_path, rctx.os.environ) + if "registry" in npmrc: + default_registry = npmrc["registry"] + _validate_attrs(rctx) if rctx.attr.pnpm_lock != None: @@ -599,7 +605,7 @@ defs_bzl_header = generated_by_lines + ["""# buildifier: disable=bzl-visibility load("@aspect_rules_js//js:defs.bzl", _js_library = "js_library")"""] - npm_imports = _gen_npm_imports(lockfile, root_package, rctx.attr, npm_registries) + npm_imports = _gen_npm_imports(lockfile, root_package, rctx.attr, npm_registries, default_registry) fp_links = {} rctx_files = { @@ -779,7 +785,7 @@ stores_bzl = [] links_bzl = {} for (i, _import) in enumerate(npm_imports): - url = _import.url if _import.url else utils.npm_registry_download_url(_import.package, _import.version, npm_registries) + url = _import.url if _import.url else utils.npm_registry_download_url(_import.package, _import.version, npm_registries, default_registry) maybe_integrity = """ integrity = "%s",""" % _import.integrity if _import.integrity else ""
diff --git a/npm/private/test/utils_tests.bzl b/npm/private/test/utils_tests.bzl index a809ba6..474ba65 100644 --- a/npm/private/test/utils_tests.bzl +++ b/npm/private/test/utils_tests.bzl
@@ -71,17 +71,22 @@ asserts.equals( env, "https://registry.npmjs.org/y/-/y-1.2.3.tgz", - utils.npm_registry_download_url("y", "1.2.3"), + utils.npm_registry_download_url("y", "1.2.3", {}, "https://registry.npmjs.org/"), ) asserts.equals( env, "https://registry.npmjs.org/@scope/y/-/y-1.2.3.tgz", - utils.npm_registry_download_url("@scope/y", "1.2.3"), + utils.npm_registry_download_url("@scope/y", "1.2.3", {}, "https://registry.npmjs.org/"), ) asserts.equals( env, "https://npm.pkg.github.com/@scope/y/-/y-1.2.3.tgz", - utils.npm_registry_download_url("@scope/y", "1.2.3", {"@scope": "npm.pkg.github.com/"}), + utils.npm_registry_download_url("@scope/y", "1.2.3", {"@scope": "npm.pkg.github.com/"}, "https://registry.npmjs.org/"), + ) + asserts.equals( + env, + "https://npm.pkg.github.com/@scope/y/-/y-1.2.3.tgz", + utils.npm_registry_download_url("@scope/y", "1.2.3", {}, "https://npm.pkg.github.com/"), ) return unittest.end(env)
diff --git a/npm/private/utils.bzl b/npm/private/utils.bzl index 09a1830..9ea51c3 100644 --- a/npm/private/utils.bzl +++ b/npm/private/utils.bzl
@@ -124,11 +124,11 @@ return (segments[0], segments[1]) return ("", segments[0]) -def _npm_registry_download_url(package, version, registries = {}): +def _npm_registry_download_url(package, version, registries, default_registry): "Make a registry download URL for a given package and version" (package_scope, package_name_no_scope) = _parse_package_name(package) - registry = "https://{}".format(registries[package_scope]) if package_scope in registries else utils.npm_registry_url + registry = "https://{}".format(registries[package_scope]) if package_scope in registries else default_registry return "{0}/{1}/-/{2}-{3}.tgz".format( registry.removesuffix("/"), @@ -153,8 +153,6 @@ links_repo_suffix = "__links", # Output group name for the package directory of a linked package package_directory_output_group = "package_directory", - # Default npm registry URL - npm_registry_url = "https://registry.npmjs.org/", npm_registry_download_url = _npm_registry_download_url, parse_package_name = _parse_package_name, )