|
8 | 8 | from pathlib import PurePath
|
9 | 9 | from typing import Iterable
|
10 | 10 |
|
11 |
| -import nodesemver |
12 |
| - |
13 | 11 | from pants.backend.javascript import package_json
|
14 | 12 | from pants.backend.javascript.package_json import (
|
15 | 13 | AllPackageJson,
|
16 | 14 | PackageJson,
|
17 | 15 | PnpmWorkspaceGlobs,
|
18 | 16 | PnpmWorkspaces,
|
19 | 17 | )
|
| 18 | +from pants.backend.javascript.package_manager import PackageManager |
20 | 19 | from pants.backend.javascript.subsystems import nodejs
|
21 | 20 | from pants.backend.javascript.subsystems.nodejs import NodeJS, UserChosenNodeJSResolveAliases
|
22 | 21 | from pants.core.util_rules import stripped_source_files
|
@@ -56,80 +55,38 @@ class NodeJSProject:
|
56 | 55 | root_dir: str
|
57 | 56 | workspaces: FrozenOrderedSet[PackageJson]
|
58 | 57 | default_resolve_name: str
|
59 |
| - package_manager: str |
60 |
| - package_manager_version: str | None = None |
| 58 | + package_manager: PackageManager |
61 | 59 | pnpm_workspace: PnpmWorkspaceGlobs | None = None
|
62 | 60 |
|
63 | 61 | @property
|
64 | 62 | def lockfile_name(self) -> str:
|
65 |
| - if self.package_manager == "pnpm": |
66 |
| - return "pnpm-lock.yaml" |
67 |
| - elif self.package_manager == "yarn": |
68 |
| - return "yarn.lock" |
69 |
| - return "package-lock.json" |
| 63 | + return self.package_manager.lockfile_name |
70 | 64 |
|
71 | 65 | @property
|
72 | 66 | def generate_lockfile_args(self) -> tuple[str, ...]:
|
73 |
| - if self.package_manager == "pnpm": |
74 |
| - return ("install", "--lockfile-only") |
75 |
| - elif self.package_manager == "yarn": |
76 |
| - return ("install",) # yarn does not provide a lockfile only mode. |
77 |
| - return ("install", "--package-lock-only") |
| 67 | + return self.package_manager.generate_lockfile_args |
78 | 68 |
|
79 | 69 | @property
|
80 | 70 | def immutable_install_args(self) -> tuple[str, ...]:
|
81 |
| - if self.package_manager == "npm": |
82 |
| - return ("clean-install",) |
83 |
| - if self.package_manager == "pnpm": |
84 |
| - return ("install", "--frozen-lockfile") |
85 |
| - if self.package_manager == "yarn": |
86 |
| - if nodesemver.satisfies(self.package_manager_version, "1.x"): |
87 |
| - return ("install", "--frozen-lockfile") |
88 |
| - return ("install", "--immutable") |
89 |
| - raise ValueError(f"Unsupported package manager: {self.package_manager}") |
| 71 | + return self.package_manager.immutable_install_args |
90 | 72 |
|
91 | 73 | @property
|
92 | 74 | def workspace_specifier_arg(self) -> str:
|
93 |
| - if self.package_manager == "pnpm": |
94 |
| - return "--filter" |
95 |
| - elif self.package_manager == "yarn": |
96 |
| - return "workspace" |
97 |
| - return "--workspace" |
| 75 | + return self.package_manager.workspace_specifier_arg |
98 | 76 |
|
99 | 77 | @property
|
100 | 78 | def args_separator(self) -> tuple[str, ...]:
|
101 |
| - # pnpm 7 changed the arguments to the `run` command - all other package managers |
102 |
| - # accept an args separator --, but pnpm does not in versions 7 and above. |
103 |
| - # > When using pnpm run <script>, all command line arguments after the script |
104 |
| - # > name are now passed to the script's argv, even --. |
105 |
| - if self.package_manager == "pnpm" and ( |
106 |
| - self.package_manager_version is None |
107 |
| - or nodesemver.satisfies(self.package_manager_version, ">=7") |
108 |
| - ): |
109 |
| - return () |
110 |
| - |
111 |
| - return ("--",) |
| 79 | + return self.package_manager.run_arg_separator |
112 | 80 |
|
113 | 81 | def extra_env(self) -> dict[str, str]:
|
114 |
| - if self.package_manager == "pnpm": |
115 |
| - return {"PNPM_HOME": "{chroot}/._pnpm_home"} |
116 |
| - elif self.package_manager == "yarn": |
117 |
| - return {"YARN_CACHE_FOLDER": "{chroot}/._yarn_cache"} |
118 |
| - return {} |
| 82 | + return dict(self.package_manager.extra_env) |
119 | 83 |
|
120 | 84 | @property
|
121 | 85 | def pack_archive_format(self) -> str:
|
122 |
| - if self.package_manager == "yarn": |
123 |
| - return "{}-v{}.tgz" |
124 |
| - else: |
125 |
| - return "{}-{}.tgz" |
| 86 | + return self.package_manager.pack_archive_format |
126 | 87 |
|
127 | 88 | def extra_caches(self) -> dict[str, str]:
|
128 |
| - if self.package_manager == "pnpm": |
129 |
| - return {"pnpm_home": "._pnpm_home"} |
130 |
| - elif self.package_manager == "yarn": |
131 |
| - return {"yarn_cache": "._yarn_cache"} |
132 |
| - return {} |
| 89 | + return dict(self.package_manager.extra_caches) |
133 | 90 |
|
134 | 91 | def get_project_digest(self) -> MergeDigests:
|
135 | 92 | return MergeDigests(
|
@@ -182,15 +139,12 @@ def from_tentative(
|
182 | 139 | """
|
183 | 140 | )
|
184 | 141 | )
|
185 |
| - package_manager_command, *maybe_version = package_manager.split("@") |
186 |
| - package_manager_version = maybe_version[0] if maybe_version else None |
187 | 142 |
|
188 | 143 | return NodeJSProject(
|
189 | 144 | root_dir=project.root_dir,
|
190 | 145 | workspaces=project.workspaces,
|
191 | 146 | default_resolve_name=project.default_resolve_name or "nodejs-default",
|
192 |
| - package_manager=package_manager_command, |
193 |
| - package_manager_version=package_manager_version, |
| 147 | + package_manager=PackageManager.from_string(package_manager), |
194 | 148 | pnpm_workspace=pnpm_workspaces.for_root(project.root_dir),
|
195 | 149 | )
|
196 | 150 |
|
@@ -239,9 +193,11 @@ async def find_node_js_projects(
|
239 | 193 | # Note: If pnpm_workspace.yaml is present for an npm-managed project, it will override the package.json["workspaces"] setting, which is not intuitive
|
240 | 194 | # pnpm_workspace.yaml should only be used for pnpm projects - see https://github.com/pantsbuild/pants/issues/21134
|
241 | 195 | project_paths = (
|
242 |
| - ProjectPaths(pkg.root_dir, ["", *pkg.workspaces]) |
243 |
| - if pkg not in pnpm_workspaces |
244 |
| - else ProjectPaths(pkg.root_dir, ["", *pnpm_workspaces[pkg].packages]) |
| 196 | + ( |
| 197 | + ProjectPaths(pkg.root_dir, ["", *pkg.workspaces]) |
| 198 | + if pkg not in pnpm_workspaces |
| 199 | + else ProjectPaths(pkg.root_dir, ["", *pnpm_workspaces[pkg].packages]) |
| 200 | + ) |
245 | 201 | for pkg in package_workspaces
|
246 | 202 | )
|
247 | 203 |
|
|
0 commit comments