Skip to content

pnpm

repo_scaffold.workspace_member.providers.pnpm

pnpm workspace-member provider.

add_pnpm_member

add_pnpm_member(spec: WorkspaceMemberSpec) -> None

Create a pnpm member from a supported workspace-member template.

Source code in repo_scaffold/workspace_member/providers/pnpm.py
def add_pnpm_member(spec: WorkspaceMemberSpec) -> None:
    """Create a pnpm member from a supported workspace-member template."""
    if spec.member_type not in _SUPPORTED_TYPES:
        raise click.ClickException(
            f"Unsupported pnpm member type '{spec.member_type}'. "
            "Supported types: ts-lib, ts-cli, react-app, vue-app, react-lib, "
            "node-service, electron-app."
        )
    if spec.member_path.exists():
        raise click.ClickException(
            f"❌ {spec.member_path.relative_to(spec.project_path)} already exists"
        )

    workspace_file = spec.project_path / "pnpm-workspace.yaml"
    cog_file = spec.project_path / "cog.toml"
    tsconfig_base_file = spec.project_path / "tsconfig.base.json"
    workspace_backup = workspace_file.read_bytes()
    cog_backup = cog_file.read_bytes() if cog_file.exists() else None
    tsconfig_backup = tsconfig_base_file.read_bytes() if tsconfig_base_file.exists() else None
    _ensure_workspace_glob(spec)
    if spec.dry_run:
        click.echo(
            f"Would create pnpm {spec.member_type}: "
            f"{spec.member_path.relative_to(spec.project_path)}"
        )
        click.echo(f"Would register package: {spec.package_name}")
        return

    spec.member_path.parent.mkdir(parents=True, exist_ok=True)
    try:
        if not tsconfig_base_file.exists():
            tsconfig_base_file.write_text(_default_tsconfig_base(), encoding="utf-8")
        cookiecutter(
            template=str(_template_path(spec.member_type)),
            output_dir=str(spec.member_path.parent),
            no_input=True,
            extra_context=_template_context(spec),
        )
        _add_workspace_dependencies(spec)
        register_cog_member(spec)
        if not spec.no_install:
            subprocess.check_call(["pnpm", "install"], cwd=str(spec.project_path))
        if not spec.no_verify:
            _verify(spec)
    except Exception:
        if spec.member_path.exists():
            shutil.rmtree(spec.member_path)
        workspace_file.write_bytes(workspace_backup)
        if tsconfig_backup is None:
            if tsconfig_base_file.exists():
                tsconfig_base_file.unlink()
        else:
            tsconfig_base_file.write_bytes(tsconfig_backup)
        if cog_backup is None:
            if cog_file.exists():
                cog_file.unlink()
        else:
            cog_file.write_bytes(cog_backup)
        raise
    click.echo(f"✅ pnpm member '{spec.package_name}' added.")