• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pantsbuild / pants / 20328535594

18 Dec 2025 06:46AM UTC coverage: 57.969% (-22.3%) from 80.295%
20328535594

Pull #22954

github

web-flow
Merge ccc9c5409 into 407284c67
Pull Request #22954: free up disk space in runner image

39083 of 67421 relevant lines covered (57.97%)

0.91 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/python/pants/backend/javascript/goals/export.py
1
# Copyright 2024 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3

4
from __future__ import annotations
×
5

6
from dataclasses import dataclass
×
7

8
from pants.backend.javascript.install_node_package import (
×
9
    InstalledNodePackageRequest,
10
    install_node_packages_for_address,
11
)
12
from pants.backend.javascript.resolve import FirstPartyNodePackageResolves
×
13
from pants.backend.javascript.subsystems.nodejs import NodeJS
×
14
from pants.core.goals.export import ExportRequest, ExportResult, ExportResults, ExportSubsystem
×
15
from pants.engine.engine_aware import EngineAwareParameter
×
16
from pants.engine.internals.native_engine import RemovePrefix
×
17
from pants.engine.internals.selectors import concurrently
×
18
from pants.engine.intrinsics import remove_prefix
×
19
from pants.engine.rules import collect_rules, implicitly, rule
×
20
from pants.engine.unions import UnionMembership, UnionRule
×
21

22

23
@dataclass(frozen=True)
×
24
class ExportNodeModulesRequest(ExportRequest):
×
25
    pass
×
26

27

28
@dataclass(frozen=True)
×
29
class _ExportNodeModulesForResolveRequest(EngineAwareParameter):
×
30
    resolve: str
×
31

32

33
@dataclass(frozen=True)
×
34
class MaybeExportResult:
×
35
    result: ExportResult | None
×
36

37

38
@rule
×
39
async def export_node_modules_for_resolve(
×
40
    request: _ExportNodeModulesForResolveRequest,
41
    nodejs: NodeJS,
42
    union_membership: UnionMembership,
43
    resolves: FirstPartyNodePackageResolves,
44
) -> MaybeExportResult:
45
    resolve = request.resolve
×
46

47
    requested_resolve = resolves.get(request.resolve)
×
48

49
    if not requested_resolve:
×
50
        return MaybeExportResult(None)
×
51

52
    installation = await install_node_packages_for_address(
×
53
        InstalledNodePackageRequest(requested_resolve.address), **implicitly()
54
    )
55

56
    return MaybeExportResult(
×
57
        ExportResult(
58
            description=f"generated node_modules for {resolve} (using NodeJS {nodejs.version})",
59
            reldir=f"nodejs/modules/{resolve}",
60
            digest=await remove_prefix(RemovePrefix(installation.digest, installation.project_dir)),
61
            resolve=resolve,
62
        )
63
    )
64

65

66
@rule
×
67
async def export_node_modules(
×
68
    request: ExportNodeModulesRequest,
69
    export_subsys: ExportSubsystem,
70
) -> ExportResults:
71
    maybe_packages = await concurrently(
×
72
        export_node_modules_for_resolve(
73
            _ExportNodeModulesForResolveRequest(resolve), **implicitly()
74
        )
75
        for resolve in export_subsys.options.resolve
76
    )
77
    return ExportResults(pkg.result for pkg in maybe_packages if pkg.result is not None)
×
78

79

80
def rules():
×
81
    return [
×
82
        *collect_rules(),
83
        UnionRule(ExportRequest, ExportNodeModulesRequest),
84
    ]
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc