diff options
| author | zaverden <[email protected]> | 2025-08-12 20:01:32 +0300 |
|---|---|---|
| committer | zaverden <[email protected]> | 2025-08-12 21:09:42 +0300 |
| commit | c72e97e9fc6fa23f0167dbe81e80e3484976bc5d (patch) | |
| tree | e3db041105fe8e14adf377210de2e010c8dee0c4 /build/plugins/lib | |
| parent | 6eaa7546be3bf7b9cbed2de5167fce47223839e1 (diff) | |
feat(TS_PROTO): TS_PROTO_AUTO, package generation
commit_hash:9960194d44a237d2a0a946d4c19be42e59164732
Diffstat (limited to 'build/plugins/lib')
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) |
