NPMTabCompletion.psm1

Import-Module TabExpansionPlusPlus

function NPMCompletion {
    param($wordToComplete, $commandAst)

    Set-Alias -Name nct -Value New-CommandTree

    $commandTree = & {
        nct access 'Set access level on published packages' {
            nct public 'Set a package to be publicly accessible'
            nct restricted 'Set a package to be restricted'
            nct grant 'Grant the ability of users and teams to have read-only or read-write access to a package' {
                nct 'read-only' 'tt'
                nct 'read-write' 'tt'
                nct 'scope:' 'tt'
            }
            nct revoke "Revoke the ability of users and teams" {
                nct "scope:team" "the team"
            }
            nct ls-packages "Show all of the packages a user or a team is able to access, along with the access level, except for read-only public packages"
            nct ls-collaborators "Show all of the access privileges for a package. Will only show permissions for packages to which you have at least read access"
            nct edit 'Set the access privileges for a package at once using $EDITOR'
        }

        nct adduser 'Add a registry user account' {}
        nct bin 'Display npm bin folder' {}
        nct bugs 'Bugs for a package in a web browser maybe' {}
        nct build 'Build a package' {}
        nct cache 'Manipulates packages cache' {}
        nct config 'Manage the npm configuration files' {}
        nct dedupe 'Reduce duplication' {}
        nct deprecate 'Deprecate a version of a package' {}
        nct dist-tag 'Modify package distribution tags' {}
        nct docs 'Docs for a package in a web browser maybe' {}
        nct edit 'Edit an installed package' {}
        nct explore 'Browse an installed package' {}
        nct help 'Get help on npm' {}
        nct help-search 'Search npm help documentation' {}
        nct init 'Interactively create a package.json file' {}
        nct link 'Symlink a package folder' {}
        nct logout 'Log out of the registry' {}
        nct ls 'List installed packages' {}
        nct npm 'javascript package manager' {}
        nct outdated 'Check for outdated packages' {}
        nct owner 'Manage package owners' {}
        nct pack 'Create a tarball from a package' {}
        nct ping 'Ping npm registry' {}
        nct prefix 'Display prefix' {}
        nct prune 'Remove extraneous packages' {}
        nct publish 'Publish a package' {}
        nct rebuild 'Rebuild a package' {}
        nct repo 'Open package repository page in the browser' {}
        nct restart 'Restart a package' {}
        nct root 'Display npm root' {}
        nct search 'Search for packages' {}
        nct shrinkwrap 'Lock down dependency versions' {}
        nct star 'Mark your favorite packages' {}
        nct stars 'View packages marked as favorites' {}
        nct start 'Start a package' {}
        nct stop 'Stop a package' {}
        nct tag 'Tag a published version' {}
        nct team 'Manage organization teams and team memberships' {}
        nct test 'Test a package' {}
        nct uninstall 'Remove a package' {}
        nct unpublish 'Remove a package from the registry' {}
        nct update 'Update a package' {}
        nct version 'Bump a package version' {}
        nct view 'View registry info' {}
        nct whoami 'Display npm username' {}

        nct install 'install in package directory' {
            nct -Argument "--save" "Package will appear in your dependencies"
            nct -Argument "--save-dev" "Package will appear in your devDependencies"
            nct -Argument "--save-optional" "Package will appear in your optionalDependencies"
        }

        nct run 'Run arbitrary package scripts' {
            nct {
                param($wordToComplete, $commandAst)

                $scripts = (Get-Content .\package.json | ConvertFrom-Json).scripts
                $scripts | Get-Member -MemberType NoteProperty |
                    ForEach {
                        $target = $scripts.($_.Name)
                        New-CompletionResult $_.Name "$($target)"
                    }
            }
        }
    }

    Get-CommandTreeCompletion $wordToComplete $commandAst $commandTree
}

NPMCompletion

Register-ArgumentCompleter -Command 'npm' -Native -ScriptBlock $function:NPMCompletion -Description 'Complete parameters and arguments to npm.cmd'