summaryrefslogtreecommitdiffstats
path: root/build/plugins/lib
diff options
context:
space:
mode:
authorzaverden <[email protected]>2025-08-12 20:01:32 +0300
committerzaverden <[email protected]>2025-08-12 21:09:42 +0300
commitc72e97e9fc6fa23f0167dbe81e80e3484976bc5d (patch)
treee3db041105fe8e14adf377210de2e010c8dee0c4 /build/plugins/lib
parent6eaa7546be3bf7b9cbed2de5167fce47223839e1 (diff)
feat(TS_PROTO): TS_PROTO_AUTO, package generation
commit_hash:9960194d44a237d2a0a946d4c19be42e59164732
Diffstat (limited to 'build/plugins/lib')
-rw-r--r--build/plugins/lib/nots/package_manager/__init__.py8
-rw-r--r--build/plugins/lib/nots/package_manager/base/package_json.py12
-rw-r--r--build/plugins/lib/nots/package_manager/base/package_manager.py23
-rw-r--r--build/plugins/lib/nots/package_manager/pnpm/constants.py1
-rw-r--r--build/plugins/lib/nots/package_manager/pnpm/package_manager.py32
-rw-r--r--build/plugins/lib/nots/package_manager/pnpm/utils.py11
6 files changed, 59 insertions, 28 deletions
diff --git a/build/plugins/lib/nots/package_manager/__init__.py b/build/plugins/lib/nots/package_manager/__init__.py
index 20f47fffa18..9827164bda7 100644
--- a/build/plugins/lib/nots/package_manager/__init__.py
+++ b/build/plugins/lib/nots/package_manager/__init__.py
@@ -12,10 +12,9 @@ from .base import (
)
from .base.package_json import PackageJsonWorkspaceError
from .pnpm import PnpmPackageManager
-from .npm import NpmPackageManager
-type PackageManagerType = Literal["pnpm", "npm"]
+type PackageManagerType = Literal["pnpm"]
manager = PnpmPackageManager
@@ -23,8 +22,8 @@ manager = PnpmPackageManager
def get_package_manager_type(key: PackageManagerType) -> type[BasePackageManager]:
if key == "pnpm":
return PnpmPackageManager
- if key == "npm":
- return NpmPackageManager
+ # if key == "npm":
+ # return NpmPackageManager
raise ValueError(f"Invalid package manager key: {key}")
@@ -32,7 +31,6 @@ __all__ = [
"BaseLockfile",
"BasePackageManager",
"PnpmPackageManager",
- "NpmPackageManager",
"PackageJson",
"PackageJsonWorkspaceError",
"PackageManagerCommandError",
diff --git a/build/plugins/lib/nots/package_manager/base/package_json.py b/build/plugins/lib/nots/package_manager/base/package_json.py
index 6789134656d..fd4240b8432 100644
--- a/build/plugins/lib/nots/package_manager/base/package_json.py
+++ b/build/plugins/lib/nots/package_manager/base/package_json.py
@@ -134,9 +134,7 @@ class PackageJson(object):
return None
- # TODO: FBP-1254
- # def get_workspace_dep_spec_paths(self) -> list[tuple[str, str]]:
- def get_workspace_dep_spec_paths(self):
+ def get_workspace_dep_spec_paths(self) -> list[tuple[str, str]]:
"""
Returns names and paths from specifiers of the defined workspace dependencies.
:rtype: list[tuple[str, str]]
@@ -182,7 +180,13 @@ class PackageJson(object):
for name, rel_path in self.get_workspace_dep_spec_paths():
dep_path = os.path.normpath(os.path.join(pj_dir, rel_path))
- dep_pj = PackageJson.load(build_pj_path(dep_path))
+ dep_pj_path = build_pj_path(dep_path)
+ try:
+ dep_pj = PackageJson.load(dep_pj_path)
+ except IOError as e:
+ logger.debug(f"{self.path}: cannot load {name}: {e}. Process dependency as empty package.")
+ dep_pj = PackageJson(dep_pj_path)
+ dep_pj.data = {"name": name}
if name != dep_pj.get_name():
raise PackageJsonWorkspaceError(
diff --git a/build/plugins/lib/nots/package_manager/base/package_manager.py b/build/plugins/lib/nots/package_manager/base/package_manager.py
index ae1a705e765..1ae27a1d242 100644
--- a/build/plugins/lib/nots/package_manager/base/package_manager.py
+++ b/build/plugins/lib/nots/package_manager/base/package_manager.py
@@ -53,13 +53,18 @@ class BasePackageManager(object, metaclass=ABCMeta):
return PackageJson.load(path)
@classmethod
- def load_package_json_from_dir(cls, dir_path):
+ def load_package_json_from_dir(cls, dir_path, empty_if_missing=False):
"""
:param dir_path: path to directory with package.json
:type dir_path: str
:rtype: PackageJson
"""
- return cls.load_package_json(build_pj_path(dir_path))
+ pj_path = build_pj_path(dir_path)
+ if empty_if_missing and not os.path.exists(pj_path):
+ pj = PackageJson(pj_path)
+ pj.data = {}
+ return pj
+ return cls.load_package_json(pj_path)
def _build_package_json(self):
"""
@@ -107,6 +112,10 @@ class BasePackageManager(object, metaclass=ABCMeta):
def build_workspace(self, tarballs_store: str):
pass
+ @abstractmethod
+ def build_ts_proto_auto_workspace(self, deps_mod: str):
+ pass
+
def get_local_peers_from_package_json(self):
"""
Returns paths of direct workspace dependencies (source root related).
@@ -114,16 +123,6 @@ class BasePackageManager(object, metaclass=ABCMeta):
"""
return self.load_package_json_from_dir(self.sources_path).get_workspace_dep_paths(base_path=self.module_path)
- def get_peers_from_package_json(self):
- """
- Returns paths of workspace dependencies (source root related).
- :rtype: list of str
- """
- pj = self.load_package_json_from_dir(self.sources_path)
- prefix_len = len(self.sources_root) + 1
-
- return [p[prefix_len:] for p in pj.get_workspace_map(ignore_self=True).keys()]
-
@timeit
def _exec_command(self, args, cwd: str, include_defaults=True, script_path=None, env={}):
if not self.nodejs_bin_path:
diff --git a/build/plugins/lib/nots/package_manager/pnpm/constants.py b/build/plugins/lib/nots/package_manager/pnpm/constants.py
index 55c05d97326..06afebc84ae 100644
--- a/build/plugins/lib/nots/package_manager/pnpm/constants.py
+++ b/build/plugins/lib/nots/package_manager/pnpm/constants.py
@@ -5,6 +5,7 @@ PNPM_LOCKFILE_FILENAME = "pnpm-lock.yaml"
# This file has a structure same to pnpm-lock.yaml, but all tarballs
# a set relative to the build root.
PNPM_PRE_LOCKFILE_FILENAME = "pre.pnpm-lock.yaml"
+PNPM_BUILD_BACKUP_LOCKFILE_FILENAME = "build.bkp.pnpm-lock.yaml"
# File is to store the last install status hash to avoid installing the same thing
LOCAL_PNPM_INSTALL_HASH_FILENAME = ".__install_hash__"
diff --git a/build/plugins/lib/nots/package_manager/pnpm/package_manager.py b/build/plugins/lib/nots/package_manager/pnpm/package_manager.py
index 84ae84722c2..d321d2adfb6 100644
--- a/build/plugins/lib/nots/package_manager/pnpm/package_manager.py
+++ b/build/plugins/lib/nots/package_manager/pnpm/package_manager.py
@@ -9,7 +9,7 @@ from .constants import (
LOCAL_PNPM_INSTALL_MUTEX_FILENAME,
)
from .lockfile import PnpmLockfile
-from .utils import build_lockfile_path, build_pre_lockfile_path, build_ws_config_path
+from .utils import build_lockfile_path, build_build_backup_lockfile_path, build_pre_lockfile_path, build_ws_config_path
from .workspace import PnpmWorkspace
from ..base import BasePackageManager, PackageManagerError
from ..base.constants import (
@@ -212,7 +212,7 @@ class PnpmPackageManager(BasePackageManager):
json.dump({PNPM_PRE_LOCKFILE_FILENAME: {"hash": pre_pnpm_lockfile_hash}}, f)
@timeit
- def create_node_modules(self, yatool_prebuilder_path=None, local_cli=False, nm_bundle=False):
+ def create_node_modules(self, yatool_prebuilder_path=None, local_cli=False, nm_bundle=False, original_lf_path=None):
"""
Creates node_modules directory according to the lockfile.
"""
@@ -238,7 +238,7 @@ class PnpmPackageManager(BasePackageManager):
self._run_pnpm_install(store_dir, virtual_store_dir, self.build_path, local_cli)
self._run_apply_addons_if_need(yatool_prebuilder_path, virtual_store_dir)
- self._replace_internal_lockfile_with_original(virtual_store_dir)
+ self._restore_original_lockfile(virtual_store_dir, original_lf_path)
if nm_bundle:
bundle_node_modules(
@@ -408,6 +408,22 @@ class PnpmPackageManager(BasePackageManager):
return ws
@timeit
+ def build_ts_proto_auto_workspace(self, deps_mod: str):
+ """
+ :rtype: PnpmWorkspace
+ """
+
+ ws = PnpmWorkspace(build_ws_config_path(self.build_path))
+ ws.packages.add(".")
+ ws.write()
+
+ deps_pre_lockfile_path = build_pre_lockfile_path(os.path.join(self.build_root, deps_mod))
+ pre_lockfile_path = build_pre_lockfile_path(self.build_path)
+ shutil.copyfile(deps_pre_lockfile_path, pre_lockfile_path)
+
+ return ws
+
+ @timeit
def _build_merged_pre_lockfile(self, tarballs_store, dep_paths, local_cli: bool):
"""
:type dep_paths: list of str
@@ -457,15 +473,19 @@ class PnpmPackageManager(BasePackageManager):
)
@timeit
- def _replace_internal_lockfile_with_original(self, virtual_store_dir):
- original_lf_path = build_lockfile_path(self.sources_path)
+ def _restore_original_lockfile(self, virtual_store_dir: str, original_lf_path: str = None):
+ original_lf_path = original_lf_path or build_lockfile_path(self.sources_path)
vs_lf_path = os.path.join(virtual_store_dir, "lock.yaml")
+ build_lf_path = build_lockfile_path(self.build_path)
+ build_bkp_lf_path = build_build_backup_lockfile_path(self.build_path)
shutil.copyfile(original_lf_path, vs_lf_path)
+ shutil.copyfile(build_lf_path, build_bkp_lf_path)
+ shutil.copyfile(original_lf_path, build_lf_path)
@timeit
def _copy_pnpm_patches(self):
- pj = self.load_package_json_from_dir(self.sources_path)
+ pj = self.load_package_json_from_dir(self.build_path)
patched_dependencies: dict[str, str] = pj.data.get("pnpm", {}).get("patchedDependencies", {})
for p in patched_dependencies.values():
diff --git a/build/plugins/lib/nots/package_manager/pnpm/utils.py b/build/plugins/lib/nots/package_manager/pnpm/utils.py
index 9b6b9d80db6..00f76d4e8df 100644
--- a/build/plugins/lib/nots/package_manager/pnpm/utils.py
+++ b/build/plugins/lib/nots/package_manager/pnpm/utils.py
@@ -1,12 +1,21 @@
import os
-from .constants import PNPM_PRE_LOCKFILE_FILENAME, PNPM_LOCKFILE_FILENAME, PNPM_WS_FILENAME
+from .constants import (
+ PNPM_BUILD_BACKUP_LOCKFILE_FILENAME,
+ PNPM_PRE_LOCKFILE_FILENAME,
+ PNPM_LOCKFILE_FILENAME,
+ PNPM_WS_FILENAME,
+)
def build_pre_lockfile_path(p):
return os.path.join(p, PNPM_PRE_LOCKFILE_FILENAME)
+def build_build_backup_lockfile_path(p):
+ return os.path.join(p, PNPM_BUILD_BACKUP_LOCKFILE_FILENAME)
+
+
def build_lockfile_path(p):
return os.path.join(p, PNPM_LOCKFILE_FILENAME)