1
Fork 0
mirror of https://github.com/RGBCube/nu_scripts synced 2025-07-31 14:17:45 +00:00
nu_scripts/custom-completions/yarn/yarn-v4-completions.nu
Tai Zeming bb1fa35baa
feat(yarn): complete runnables(bin & scripts) (#841)
Allow custom-completions/yarn to complete scripts and bins by explicitly
listing existing commands and scripts & bins that loads from the current
path.
2024-05-22 06:30:50 -05:00

632 lines
25 KiB
Text

# !! WARNING !!
# This is for yarn v2(berry) and higher, which is not installed by default. see https://yarnpkg.com/getting-started/migration for a migration guide
# Before running any command after this is installed, please run `refresh-cache` to update the NPM registry and yarn plugin cache
def "nu-complete yarn run" [] {
let userScripts = try {
open ./package.json
| get scripts
| transpose
| rename value description
} catch {[]}
let binaries = try {
yarn bin --json
| lines
| each { |it| $it | from json }
| select name source
| rename value description
} catch {[]}
$userScripts | append $binaries
}
def 'nu-complete yarn' [] {
let commands = [
{value:'add', description:'Add dependencies to the project'}
{value:'bin', description:'Get the path to a binary script'}
{value: 'cache clean', description: 'Remove the shared cache files'}
{value: 'config get', description: 'Read a configuration settings'}
{value: 'config set', description: 'Change a configuration settings'}
{value: 'config unset', description: 'Unset a configuration setting'}
{value: 'config', description: 'Display the current configuration'}
{value: 'constraints query', description: 'Query the constraints fact database'}
{value: 'constraints source', description: 'Print the source code for the constraints'}
{value: 'yarn constraints', description: 'Check that the project constraints are met'}
{value: 'dedupe', description: 'Deduplicate dependencies with overlapping ranges'}
{value: 'dlx', description: 'Run a package in a temporary environment'}
{value: 'exec', description: 'Execute a shell script'}
{value: 'explain peer-requirements', description: 'Explain a set of peer requirements'}
{value: 'explain', description: 'Explain an error code'}
{value: 'info', description: 'See information related to packages'}
{value: 'install', description: 'Install the project dependencies'}
{value: 'link', description: 'Connect the local project to another one'}
{value: 'node', description: 'Run node with the hook already setup'}
{value: 'npm audit', description: 'Perform a vulnerability audit against the installed packages'}
{value: 'npm info', description: 'Show information about a package'}
{value: 'npm login', description: 'Store new login info to access the npm registry'}
{value: 'npm logout', description: 'Logout of the npm registry'}
{value: 'npm publish', description: 'Publish the active workspace to the npm registry'}
{value: 'npm tag add', description: 'Add a tag for a specific version of a package'}
{value: 'npm tag list', description: 'List all dist-tags of a package'}
{value: 'npm tag remove', description: 'Remove a tag from a package'}
{value: 'npm whoami', description: 'Display the name of the authenticated user'}
{value: 'pack', description: 'Generate a tarball from the active workspace'}
{value: 'patch-commit', description: 'Generate a patch out of a directory'}
{value: 'patch', description: 'Prepare a package for patching'}
{value: 'plugin import from sources', description: 'Build a plugin from sources'}
{value: 'plugin import', description: 'Download a plugin'}
{value: 'plugin list', description: 'List the available official plugins'}
{value: 'plugin remove', description: 'Remove a plugin'}
{value: 'plugin runtime', description: 'List the active plugins'}
{value: 'rebuild', description: "Rebuild the project's native packages"}
{value: 'remove', description: 'Remove dependencies from the project'}
{value: 'run', description: 'Run a script defined in the package.json'}
{value: 'search', description: 'Open the search interface'}
{value: 'set resolution', description: 'Enforce a package resolution'}
{value: 'set version from sources', description: 'Build Yarn from master'}
{value: 'set version', description: 'Lock the Yarn version used by the project'}
{value: 'stage', description: 'Add all yarn files to your vcs'}
{value: 'unlink', description: 'Disconnect the local project from another one'}
{value: 'unplug', description: 'Force the unpacking of a list of packages'}
{value: 'up', description: 'Upgrade dependencies across the project'}
{value: 'upgrade-interactive', description: 'Open the upgrade interface'}
{value: 'version', description: 'Apply a new version to the current package'}
{value: 'version apply', description: 'Apply all the deferred version bumps at once'}
{value: 'version check', description: 'Check that all the relevant packages have been bumped'}
{value: 'why', description: 'Display the reason why a package is needed'}
{value: 'workspace', description: 'Run a command within the specified workspace'}
{value: 'workspaces focus', description: 'Install a single workspace and its dependencies'}
{value: 'workspaces foreach', description: 'Run a command on all workspaces'}
{value: 'workspaces list', description: 'List all available workspaces'}
]
let runnables = try {(nu-complete yarn run)} catch {[]}
$commands | append $runnables
}
export extern "yarn" [
command?: string@"nu-complete yarn"
]
def 'nu-complete yarn mode' [] {
["skip-build", "update-lockfile"]
}
export def "refresh-cache" [] {
npm i -g all-the-package-names
let npmCacheFilePath = ($nu.config-path | path dirname | path join "yarnCache" | path join $"npmCache.csv")
all-the-package-names | each { |i| $i | split column "\n" | transpose col0 package | reject col0 } | flatten | to csv | save $npmCacheFilePath
let yarnPluginCacheFilePath = ($nu.config-path | path dirname | path join "yarnCache" | path join $"yarnPluginCache.csv")
^yarn plugin list --json | lines | each { |it| from json } | to csv | save $yarnPluginCacheFilePath
}
def "nu-complete yarn add" [] {
let cacheFilePath = ($nu.config-path | path dirname | path join "yarnCache" | path join $"npmCache.csv")
# TODO switch to dataframes
open $cacheFilePath | $in.package
}
# Add dependencies to the project
export extern "yarn add" [
--json # Format the output as an NDJSON stream
--exact(-E) # Don't use any semver modifier on the resolved range
--tilde(-T) # Use the ~ semver modifier on the resolved range
--caret(-C) # Use the ^ semver modifier on the resolved range
--dev(-D) # Add a package as a dev dependency
--peer(-P) # Add a package as a peer dependency
--optional(-O) # Add / upgrade a package to an optional regular / peer dependency
--prefer-dev # Add / upgrade a package to a dev dependency
--interactive(-i) # Reuse the specified package from other workspaces in the project
--cached # Reuse the highest version already used somewhere within the project
--mode: string@"nu-complete yarn mode" # Change what artifacts installs generate
package: string@"nu-complete yarn add"
]
def 'nu-complete yarn bin' [] {
^yarn bin --json
|lines
|each { |it| $it | from json }
|$in.name
}
# Get the path to a binary script
export extern "yarn bin" [
--json # Format the output as an NDJSON stream
--verbose(-v) # Print both the binary name and the locator of the package that provides the binary
binary?: string@"nu-complete yarn bin"
]
# Remove the shared cache files
export extern "yarn cache clean" [
--mirror # Remove the global cache files instead of the local cache files
--all # Remove both the global cache files and the local cache files of the current project
]
def "nu-complete yarn config" [] {
^yarn config --json
|lines
|each { |it| $it | from json }
|$in.key
}
# Read a configuration settings
export extern "yarn config get" [
--json # Format the output as an NDJSON stream
--no-redacted # Don't redact secrets (such as tokens) from the output
name: string@"nu-complete yarn config"
]
# Change a configuration settings
export extern "yarn config set" [
--json # Set complex configuration settings to JSON values
--home(-H) # Update the home configuration instead of the project configuration
name: string@"nu-complete yarn config"
value: string
]
# Unset a configuration setting
export extern "yarn config unset" [
--home(-H) # Update the home configuration instead of the project configuration
name: string@"nu-complete yarn config"
]
# Display the current configuration
export extern "yarn config" [
--verbose(-v) # Print the setting description on top of the regular key/value information
--json # Format the output as an NDJSON stream
--why # Print the reason why a setting is set a particular way
]
# Query the constraints fact database
export extern "yarn constraints query" [
--json # Format the output as NDJSON stream
query: string
]
# Print the source code for the constraints
export extern "yarn constraints source" [
--verbose(-v) # Also print the fact database automatically compiled from the workspace manifests
]
# Check that the project constraints are met
export extern "yarn constraints" [
--fix # Attempt to automatically fix unambiguous issues, following a multi-pass process
]
def 'nu-complete yarn dedupe strategy' [] {
["highest"]
}
# Deduplicate dependencies with overlapping ranges
export extern "yarn dedupe" [
--strategy(-s): string@"nu-complete yarn dedupe strategy" # The strategy to use when deduping dependencies
--check(-c) # Exit with exit code 1 when duplicates are found, without persisting the dependency tree
--json # Format the output as an NDJSON stream
--mode: string@"nu-complete yarn mode" # Change what artifacts installs generate
package: string
]
def "nu-complete yarn dlx" [] {
let cacheFilePath = ($nu.config-path | path dirname | path join "yarnCache" | path join $"npmCache.csv")
# TODO switch to dataframes
open $cacheFilePath | $in.package
}
# Run a package in a temporary environment
export extern "yarn dlx" [
--package(-p) # The package(s) to install before running the command
--quiet(-q) # Only report critical errors instead of printing the full install logs
package: string@"nu-complete yarn dlx"
...args: string
]
# Execute a shell script
export extern "yarn exec" [
...command: string
]
def "nu-complete yarn explain peer-requirements" [] {
let cacheFilePath = ($nu.config-path | path dirname | path join "yarnCache" | path join $"(open ./package.json | get name)-peerReqs.json")
if ($cacheFilePath | path exists) {
let cache = (open $cacheFilePath)
let hash = ($cache | get hash)
let computedHash = (open yarn.lock | hash sha256)
if $hash == $computedHash {
$cache | get hashes
} else {
^yarn explain peer-requirements | lines | parse -r '.+: (?P<hash>\w+) → .*' | $in.hash
}
} else {
let hashes = (^yarn explain peer-requirements | lines | parse -r '.+: (?P<hash>\w+) → .*' | $in.hash)
let computedHash = (open yarn.lock | hash sha256)
let cache = {
hash: $computedHash,
hashes: $hashes
}
$cache | save $cacheFilePath
$hashes
}
}
# Explain a set of peer requirements
export extern "yarn explain peer-requirements" [
hash?: string@"nu-complete yarn explain peer-requirements"
]
# Explain an error code
export extern "yarn explain" [
--json # Format the output as an NDJSON stream
code: string
]
def "nu-complete yarn info" [] {
let packagejson = (open ./package.json)
let deps = ($packagejson | get dependencies | columns)
let devDeps = ($packagejson | get devDependencies | columns)
$deps | append $devDeps
}
# See information related to packages
export extern "yarn info" [
--all(-A) # Print versions of a package from the whole project
--recursive(-R) # Print information for all packages, including transitive dependencies
--extra(-X): string # An array of requests of extra data provided by plugins
--cache # Print information about the cache entry of a package (path, size, checksum)
--dependents # Print all dependents for each matching package
--manifest # Print data obtained by looking at the package archive (license, homepage, ...)
--name-only # Only print the name for the matching packages
--virtuals # Print each instance of the virtual packages
--json # Format the output as an NDJSON stream
package: string@"nu-complete yarn info"
]
# Install the project dependencies
export extern "yarn install" [
--json # Format the output as an NDJSON stream
--immutable # Abort with an error exit code if the lockfile was to be modified
--immutable-cache # Abort with an error exit code if the cache folder was to be modified
--check-cache # Always refetch the packages and ensure that their checksums are consistent
--inline-builds # Verbosely print the output of the build steps of dependencies
--mode: string@"nu-complete yarn mode" # Change what artifacts installs generate
]
# Connect the local project to another one
export extern "yarn link" [
--all(-A) # Link all workspaces belonging to the target project to the current one
--private(-p) # Also link private workspaces belonging to the target project to the current one
--relative(-r) # Link workspaces using relative paths instead of absolute paths
path: string
]
# Run node with the hook already setup
export extern "yarn node" [
...command: string
]
def "nu-complete yarn npm audit severity" [] {
["info", "low", "moderate", "high", "critical"]
}
# Perform a vulnerability audit against the installed packages.
export extern "yarn npm audit" [
--all(-A) # Audit dependencies from all workspaces
--recursive(-R) # Audit transitive dependencies as well
--environment: string # Which environments to cover
--json # Format the output as an NDJSON stream
--severity: string@"nu-complete yarn npm audit severity" # Minimal severity requested for packages to be displayed
]
# Show information about a package
export extern "yarn npm info" [
--json # Format the output as an NDJSON stream
--fields(-f): string # A comma-separated list of manifest fields that should be displayed
package: string
]
# Store new login info to access the npm registry
export extern "yarn npm login" [
--scope(-s) # Login to the registry configured for a given scope
--publish # Login to the publish registry
]
# Logout of the npm registry.
export extern "yarn npm logout" [
--scope(-s) # Logout of the registry configured for a given scope
--publish # Logout of the publish registry
--all(-A) # Logout of all registries
]
# Publish the active workspace to the npm registry
export extern "yarn npm publish" [
--access: string # The access level of the published package (public or restricted)
--tag: string # The tag on the registry that the package should be attached to
--tolerate-republish # Warn and exit when republishing an already existing version of a package
--opt: string # The OTP token to use with the command
]
# Add a tag for a specific version of a package
export extern "yarn npm tag add" [
package: string
tag: string
]
# List all dist-tags of a package
export extern "yarn npm tag list" [
--json # Format the output as an NDJSON stream
package: string
]
# Remove a tag from a package
export extern "yarn npm tag remove" [
package: string
tag: string
]
# Display the name of the authenticated user
export extern "yarn npm whoami" [
--scope(-s) # Print username for the registry configured for a given scope
--publish # Print username for the publish registry
]
# Generate a tarball from the active workspace
export extern "yarn pack" [
--install-if-needed # Run a priliminary yarn install if the package contains build scripts
--dry-run(-n) # Print the file paths without actually generating the package archive
--json # Format the output as an NDJSON stream
--out(-o): string # Create the archive at the specified path
]
# Generate a patch out of a directory
export extern "yarn patch-commit" [
--save(-s) # Add the patch to your resolution entries
]
def "nu-complete yarn patch" [] {
let packagejson = (open ./package.json)
let deps = ($packagejson | get dependencies | columns)
let devDeps = ($packagejson | get devDependencies | columns)
$deps | append $devDeps
}
# Prepare a package for patching
export extern "yarn patch" [
--json # Format the output as an NDJSON stream
package: string@"nu-complete yarn patch"
]
export extern "yarn plugin" []
# Build a plugin from sources
export extern "yarn plugin import from sources" [
--path: string # The path where the repository should be cloned to
--repository: string # The repository that should be cloned
--branch: string # The branch of the repository that should be cloned
--no-minify # Build a plugin for development (debugging) - non-minified and non-mangled
--force(-f) # Always clone the repository instead of trying to fetch the latest commits
plugin: string
]
def "nu-complete yarn plugin import" [] {
let yarnPluginCacheFilePath = ($nu.config-path | path dirname | path join "yarnCache" | path join $"yarnPluginCache.csv")
open $yarnPluginCacheFilePath | get name
}
# Download a plugin
export extern "yarn plugin import" [
plugin: string@"nu-complete yarn plugin import"
]
# List the available official plugins
export extern "yarn plugin list" [
--json # Format the output as an NDJSON stream
]
def "nu-complete yarn plugin remove" [] {
open ./.yarnrc.yml | get plugins | get spec
}
# Remove a plugin
export extern "yarn plugin remove" [
plugin: string@"nu-complete yarn plugin remove"
]
# List the active plugins
export extern "yarn plugin runtime" [
--json # Format the output as an NDJSON stream
]
def "nu-complete yarn rebuild" [] {
let packagejson = (open ./package.json)
let deps = ($packagejson | get dependencies | columns)
let devDeps = ($packagejson | get devDependencies | columns)
$deps | append $devDeps
}
# Rebuild the project's native packages
export extern "yarn rebuild" [
...packages: string@"nu-complete yarn rebuild"
]
# Remove a dependency from the project
export extern "yarn remove" [
--all(-A) # Apply the operation to all workspaces from the current project
--mode: string@"nu-complete yarn mode" # The mode to use when removing the dependency
]
# Run a script defined in the package.json
export extern "yarn run" [
--inspect # forwarded to the underlying node process
--inspect-brk # forwarded to the underlying node process
--top-level(-T) # Check the root workspace for scripts and/or binaries instead of the current one
--binaries-only(-B) # Ignore any user defined scripts and only check for binaries
script: string@"nu-complete yarn run"
]
# Open the search interface. NOTE: requires the interactive-tools plugin to be installed.
export extern "yarn search" []
export extern "yarn set" []
# Enforce a package resolution
export extern "yarn set resolution" [
--save(-s) # Persist the resolution inside the top-level manifest
descriptor: string
resolution: string
]
# Build yarn from master
export extern "yarn set version from sources" [
--path: string # The path where the repository should be cloned to
--repository: string # The repository that should be cloned
--branch: string # The branch of the repository that should be cloned
--no-minify # Build a plugin for development (debugging) - non-minified and non-mangled
--force(-f) # Always clone the repository instead of trying to fetch the latest commits
--skip-plugins # Skip updating the contrib plugins
]
# Lock the Yarn version used by the project
export extern "yarn set version" [
--only-if-needed # Only lock the yarn version if it isn't already locked
version: string
]
# Add all yarn files to your vcs. NOTE: requires the stage plugin to be installed.
export extern "yarn stage" [
--commit(-c) # Commit the staged files
--reset(-r) # Remove all files from the staging area
--dry-run(-n) # Print the commit message and the list of modified files without staging / committing
]
# Disconnect the local project from another one
export extern "yarn unlink" [
--all(-A) # Unlink all workspaces belonging to the target project from the current one
...packages: string
]
# Force the unpacking of a list of packages
export extern "yarn unplug" [
--all(-A) #Unplug direct dependencies from the entire project
--recursive(-R) #Unplug both direct and transitive dependencies
--json # Format the output as an NDJSON stream
...packages: string
]
# Upgrade dependencies across the project
export extern "yarn up" [
--interactive(-i) # Offer various choices, depending on the detected upgrade paths
--exact(-E) # Don't use any semver modifier on the resolved range
--tilde(-T) # Use the ~ semver modifier on the resolved range
--caret(-C) # Use the ^ semver modifier on the resolved range
--recursive(-R) # Resolve again ALL resolutions for those packages
--mode: string@"nu-complete yarn mode" # Change what artifacts installs generate
]
# Open the upgrade interface. NOTE: requires the interactive-tools plugin to be installed.
export extern "yarn upgrade-interactive" []
def "nu-complete yarn version strategy" [] {
let originalStrats = ["patch", "minor", "major"]
let preStrats = ($originalStrats | each { |it| $"pre($it)" } | append "prerelease")
let otherStrats = ["decline"]
$originalStrats | append $preStrats | append $otherStrats
}
# Apply a new version to the current package. NOTE: requires the version plugin to be installed.
export extern "yarn version" [
--deferred(-d) # Prepare the version to be bumped during the next release cycle
--immediate(-i) # Bump the version immediately
strategy: string@"nu-complete yarn version strategy"
]
# Apply all the deferred version bumps at once. NOTE: requires the version plugin to be installed.
export extern "yarn version apply" [
--all # Apply the deferred version changes on all workspaces
--dry-run # Print the versions without actually generating the package archive
--prerelease # Add a prerelease identifier to new versions
--recursive(-R) # Release the transitive workspaces as well
--json # Format the output as an NDJSON stream
]
# Check that all the relevant packages have been bumped. NOTE: requires the version plugin to be installed. WARNING: This command currently requires git.
export extern "yarn version check" [
--interactive(-i) # Open an interactive interface used to set version bumps
]
def "nu-complete yarn why" [] {
let packagejson = (open ./package.json)
let deps = ($packagejson | get dependencies | columns)
let devDeps = ($packagejson | get devDependencies | columns)
$deps | append $devDeps
}
# Display the reason why a package is needed
export extern "yarn why" [
--recursive(-R) # List, for each workspace, what are all the paths that lead to the dependency
--json # Format the output as an NDJSON stream
--peers # Also print the peer dependencies that match the specified name
package: string@"nu-complete yarn why"
]
def "nu-complete yarn workspace" [] {
^yarn workspaces list --json | lines | each {|it| from json} | get name
}
# Run a command within the specified workspace.
export extern "yarn workspace" [
workspaceName: string@"nu-complete yarn workspace"
...commandName: string
]
export extern "yarn workspaces" [
command: string
]
# Install a single workspace and its dependencies. NOTE: requires the workspace-tools plugin to be installed.
export extern "yarn workspaces focus" [
--json # Format the output as an NDJSON stream
--production # Only install regular dependencies by omitting dev dependencies
--all(-A) # Install the entire project
...packages: string
]
# Run a command on all workspaces. NOTE: requires the workspace-tools plugin to be installed.
export extern "yarn workspaces foreach" [
--recursive(-R) # Find packages via dependencies/devDependencies instead of using the workspaces field
--from: string #An array of glob pattern idents from which to base any recursion
--all(-A) #Run the command on all workspaces of a project
--verbose(-v) # Prefix each output line with the name of the originating workspace
--parallel(-p) # Run the commands in parallel
--interlaced(-i) # Print the output of commands in real-time instead of buffering it
--jobs(-j): string # The maximum number of parallel tasks that the execution will be limited to; or unlimited
--topological(-t) # Run the command after all workspaces it depends on (regular) have finished
--topological-dev # Run the command after all workspaces it depends on (regular + dev) have finished
--include: string # An array of glob pattern idents; only matching workspaces will be traversed
--exclude: string # An array of glob pattern idents; matching workspaces won't be traversed
--no-private # Avoid running the command on private workspaces
--since # Only include workspaces that have been changed since the specified ref.
...commandName: string
]
# List all available workspaces
export extern "yarn workspaces list" [
--since # Only include workspaces that have been changed since the specified ref.
--recursive(-R) # Find packages via dependencies/devDependencies instead of using the workspaces field
--verbose(-v) # Also return the cross-dependencies between workspaces
--json # Format the output as an NDJSON stream
]