2121import tempfile
2222import shutil
2323from enum import Enum
24- from json import load , JSONDecodeError
24+ from json import load , JSONDecodeError , dump
2525from typing import Tuple
2626from zipfile import ZipFile , is_zipfile
27+ from charon .constants import NRRC_REGISTRY
28+ from charon .utils .files import digest , HashType
2729
2830logger = logging .getLogger (__name__ )
2931
@@ -54,7 +56,7 @@ def extract_npm_tarball(path: str, target_dir: str, is_for_upload: bool) -> Tupl
5456 tgz .extractall ()
5557 for f in tgz :
5658 if f .name .endswith ("package.json" ):
57- parse_paths = __parse_npm_package_version_paths (f .path )
59+ version_data , parse_paths = __parse_npm_package_version_paths (f .path )
5860 package_name_path = parse_paths [0 ]
5961 os .makedirs (os .path .join (target_dir , parse_paths [0 ]))
6062 tarball_parent_path = os .path .join (target_dir , parse_paths [0 ], "-" )
@@ -63,7 +65,11 @@ def extract_npm_tarball(path: str, target_dir: str, is_for_upload: bool) -> Tupl
6365 target_dir , parse_paths [0 ], parse_paths [1 ]
6466 )
6567 valid_paths .append (os .path .join (version_metadata_parent_path , "package.json" ))
68+
6669 if is_for_upload :
70+ tgz_relative_path = "/" .join ([parse_paths [0 ], "-" , _get_tgz_name (path )])
71+ __write_npm_version_dist (path , f .path , version_data , tgz_relative_path )
72+
6773 os .makedirs (tarball_parent_path )
6874 target = os .path .join (tarball_parent_path , os .path .basename (path ))
6975 shutil .copyfile (path , target )
@@ -81,12 +87,33 @@ def _get_tgz_name(path: str):
8187 return ""
8288
8389
84- def __parse_npm_package_version_paths (path : str ) -> list :
90+ def _del_none (d ):
91+ for key , value in list (d .items ()):
92+ if value is None :
93+ del d [key ]
94+ elif isinstance (value , dict ):
95+ _del_none (value )
96+ return d
97+
98+
99+ def __write_npm_version_dist (path : str , version_meta_extract_path : str , version_data : dict ,
100+ tgz_relative_path : str ):
101+ tarball_link = "" .join (["https://" , NRRC_REGISTRY , "/" , tgz_relative_path ])
102+ shasum = digest (path , HashType .SHA1 )
103+ dist = dict ()
104+ dist ["tarball" ] = tarball_link
105+ dist ["shasum" ] = shasum
106+ version_data ["dist" ] = dist
107+ with open (version_meta_extract_path , mode = 'w' , encoding = 'utf-8' ) as f :
108+ dump (_del_none (version_data ), f )
109+
110+
111+ def __parse_npm_package_version_paths (path : str ) -> Tuple [dict , list ]:
85112 try :
86113 with open (path , encoding = 'utf-8' ) as version_package :
87114 data = load (version_package )
88115 package_version_paths = [data ['name' ], data ['version' ]]
89- return package_version_paths
116+ return data , package_version_paths
90117 except JSONDecodeError :
91118 logger .error ('Error: Failed to parse json!' )
92119
0 commit comments