Skip to content

Instantly share code, notes, and snippets.

@Siliconrob
Last active October 14, 2025 03:26
Show Gist options
  • Select an option

  • Save Siliconrob/c0c5c0fe52f2cac2f7a47af80e69e1b9 to your computer and use it in GitHub Desktop.

Select an option

Save Siliconrob/c0c5c0fe52f2cac2f7a47af80e69e1b9 to your computer and use it in GitHub Desktop.
from dataclasses import dataclass
from typing import Dict, List, Optional
@dataclass
class Repository:
type: str
url: str
@dataclass
class Author:
name: str
email: str
url: str
@dataclass
class Bugs:
url: str
@dataclass
class DistSignature:
keyid: str
sig: str
@dataclass
class Dist:
integrity: str
shasum: str
tarball: str
fileCount: int
unpackedSize: int
npm_signature: str
signatures: List[DistSignature]
@dataclass
class Maintainer:
name: str
email: str
@dataclass
class NpmUser:
name: str
email: str
@dataclass
class NpmOperationalInternal:
host: str
tmp: str
@dataclass
class NpmPackage:
name: str
version: str
description: str
license: str
repository: Repository
author: Author
engines: Dict[str, str]
scripts: Dict[str, str]
keywords: List[str]
dependencies: Dict[str, str]
devDependencies: Dict[str, str]
peerDependencies: Dict[str, str]
gitHead: str
bugs: Bugs
homepage: str
_id: str
_nodeVersion: str
_npmVersion: str
_npmUser: NpmUser
dist: Dist
maintainers: List[Maintainer]
directories: Dict
_npmOperationalInternal: NpmOperationalInternal
_hasShrinkwrap: bool
@staticmethod
def parse_dist_signatures(signatures: list) -> list:
return [DistSignature(**sig) for sig in signatures]
@staticmethod
def load_npm_package(json_path: str) -> NpmPackage:
with open(json_path, 'r', encoding='utf-8') as f:
data = json.load(f)
repository = Repository(**data['repository'])
author = Author(**data['author'])
bugs = Bugs(**data['bugs'])
dist = Dist(
integrity=data['dist']['integrity'],
shasum=data['dist']['shasum'],
tarball=data['dist']['tarball'],
fileCount=data['dist']['fileCount'],
unpackedSize=data['dist']['unpackedSize'],
npm_signature=data['dist']['npm-signature'],
signatures=NpmPackage.parse_dist_signatures(data['dist']['signatures'])
)
maintainers = [Maintainer(**m) for m in data['maintainers']]
npm_user = NpmUser(**data['_npmUser'])
npm_operational_internal = NpmOperationalInternal(**data['_npmOperationalInternal'])
package = NpmPackage(
name=data['name'],
version=data['version'],
description=data['description'],
license=data['license'],
repository=repository,
author=author,
engines=data['engines'],
scripts=data['scripts'],
keywords=data['keywords'],
dependencies=data['dependencies'],
devDependencies=data['devDependencies'],
peerDependencies=data['peerDependencies'],
gitHead=data['gitHead'],
bugs=bugs,
homepage=data['homepage'],
_id=data['_id'],
_nodeVersion=data['_nodeVersion'],
_npmVersion=data['_npmVersion'],
_npmUser=npm_user,
dist=dist,
maintainers=maintainers,
directories=data['directories'],
_npmOperationalInternal=npm_operational_internal,
_hasShrinkwrap=data['_hasShrinkwrap']
)
return package
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment