CLI to switch pnpm dependencies between local, GitHub / GitLab, and NPM sources.
npm install -g pnpm-dep-source
# or
pnpm add -g pnpm-dep-source# From local path - auto-detects GitHub/GitLab from package.json repository field
pds init ../../path/to/local/pkg
# From GitHub/GitLab URL
pds init https://github.com/user/repo
pds init https://gitlab.com/user/repo
# Override or specify repo explicitly
pds init ../../path/to/local/pkg -H github-user/repo
pds init ../../path/to/local/pkg -L gitlab-user/repo
# Global CLI tools (uses ~/.config/pnpm-dep-source/config.json)
pds init /path/to/local/cli -ginit adds the dependency to package.json if not present, then auto-activates:
- Local path → switches to
workspace:*mode - GitHub URL → switches to
github:user/repo#sha - GitLab URL → switches to GitLab tarball URL
Use -D to add as a devDependency, or -I to skip adding/activation entirely.
pds local [dep] # or pds l [dep]Note: [dep] is optional if only one dependency is configured.
This will:
- Set
package.jsondependency toworkspace:* - Create/update
pnpm-workspace.yamlwith the local path - Add to
vite.config.tsoptimizeDeps.exclude(if vite config exists) - Run
pnpm install
pds g [dep] # Auto-detects GitHub or GitLab (uses dist branch HEAD)
pds g [dep] -r v1.0.0 # Resolves ref to SHA
pds g [dep] -R dist # Uses ref as-is (pin to branch name)Errors if neither or both are configured; use pds gh or pds gl explicitly in that case.
pds github [dep] # Uses dist branch HEAD (resolved to SHA)
pds gh [dep] -r v1.0.0 # Resolves ref to SHA
pds gh [dep] -R dist # Uses ref as-is (pin to branch name)This will:
- Set
package.jsondependency togithub:user/repo#sha - Remove local path from
pnpm-workspace.yaml - Remove from
vite.config.tsoptimizeDeps.exclude - Run
pnpm install
pds gitlab [dep] # Uses dist branch HEAD (resolved to SHA)
pds gl [dep] -r v1.0.0 # Resolves ref to SHA
pds gl [dep] -R dist # Uses ref as-is (pin to branch name)This will:
- Set
package.jsondependency to GitLab tarball URL - Remove local path from
pnpm-workspace.yaml - Remove from
vite.config.tsoptimizeDeps.exclude - Run
pnpm install
Note: GitLab uses tarball URLs (e.g. https://gitlab.com/user/repo/-/archive/ref/repo-ref.tar.gz) since pnpm doesn't support gitlab: prefix.
pds npm [dep] # Latest version
pds npm [dep] [version] # Specific version
pds n 1.2.3 # With one dep, arg is treated as versionpds status # Show all configured deps
pds status [dep] # Show specific dep
pds s # Aliaspds list # or pds lspds set <dep> -H user/repo # Set GitHub repo
pds set <dep> -L user/repo # Set GitLab repo
pds set <dep> -l ../path # Set local path
pds set <dep> -n pkg-name # Set NPM name
pds set <dep> -H "" # Remove GitHub
pds set -g # Update global config (with single dep)pds deinit [dep] # or pds rm [dep]
pds rm -g # Remove from global configThis removes the dependency from .pnpm-dep-source.json but does not modify package.json.
The tool stores configuration in .pnpm-dep-source.json:
{
"dependencies": {
"@scope/package-name": {
"localPath": "../../path/to/local",
"github": "user/repo",
"gitlab": "user/repo",
"npm": "@scope/package-name",
"distBranch": "dist"
}
}
}-b, --dist-branch <branch>: Dist branch name (default: "dist")-D, --dev: Add as devDependency (forinitwhen adding to package.json)-f, --force: Suppress mismatch warnings ininit-g, --global: Use global config (~/.config/pnpm-dep-source/config.json) for CLI tools-H, --github <repo>: GitHub repo (auto-detected from package.json if not specified)-I, --no-install: Skip runningpnpm installafter changes-l, --local <path>: Local path (forinitwith URL, orsetcommand)-L, --gitlab <repo>: GitLab repo (auto-detected from package.json if not specified)-n, --npm <name>: NPM package name (defaults to package name)-r, --ref <ref>: Git ref, resolved to SHA (forgithub/gitlabcommands)-R, --raw-ref <ref>: Git ref, used as-is (pin to branch/tag name)
For managing globally-installed CLI tools, use -g with all commands:
# Initialize a global CLI tool
pds init /path/to/local/cli -g -H github-user/repo
# List global deps
pds ls -g
# Switch global install source
pds gh -g # Install from GitHub dist branch
pds l -g # Install from local directory
pds n -g # Install from NPMGlobal config is stored at ~/.config/pnpm-dep-source/config.json.
- Local development: Use
pds local <dep>to develop against a local copy - Integration testing: Push to GitHub/GitLab, build a dist branch, use
pds gh <dep>orpds gl <dep>to test - Release: Publish to NPM, switch consumers to
pds npm <dep>
Add a workflow to your library that builds and pushes to a dist branch:
# .github/workflows/build-dist.yml
name: Build dist branch
on:
workflow_dispatch:
inputs:
src:
description: 'Source ref to build from'
required: false
dst:
description: 'Dist branch name (default: dist)'
required: false
jobs:
build-dist:
uses: runsascoded/gh-pnpm-dist/.github/workflows/build-dist.yml@v1
with:
source_ref: ${{ inputs.src }}
dist_branch: ${{ inputs.dst }}See gh-pnpm-dist for more options.
pds can manage itself! Clone the repo and use the global (-g) commands to switch between local development, dist branch testing, and NPM releases:
# Clone and initialize
git clone https://github.com/runsascoded/pnpm-dep-source.git
cd pnpm-dep-source
pnpm install && pnpm build
# Register pds as its own global dependency
pds init . -g
# Develop locally
pds l -g # installs from local ./dist
# Test dist branch
pds gh -g # installs from GitHub dist branch
# Use NPM release
pds n -g # installs from NPMMIT