To expand on @Steve Roberts answer. 
My username is of the form "domain\username" - including the slash in
  the proxy configuration resulted in a forward slash appearing. So
  entering this:
npm config set proxy "http://domain\username:password@servername:port/"
I also had to URL encode my domain\user string, however, I have a space inside my username so I put a + to encode the space URL encoding, but it would get double encoded as %2B (which is the URL encoding for the plus sign, however the URL encoding for a space is %20), so I had to instead do the following:
npm command
// option one 
// it works for some packages
npm config set http_proxy "http://DOMAIN%5Cuser+name:password@x.x.x.x:port"
npm config set proxy "http://DOMAIN%5Cuser+name:password@x.x.x.x:port"
// option two
// it works best for me
// please notice that I actually used a space 
// instead of URL encode it with '+', '%20 ' OR %2B (plus url encoded)
npm config set http_proxy "http://DOMAIN%5Cuser name:password@x.x.x.x:port"
npm config set proxy "http://DOMAIN%5Cuser name:password@x.x.x.x:port"
// option two (B) as of 2019-06-01
// no DOMAIN
// instead of URL encode it with '+', '%20 ' OR %2B (plus url encoded)
npm config set http_proxy "http://user name:password@x.x.x.x:port"
npm config set proxy "http://user name:password@x.x.x.x:port"
troubleshooting npm config
I used the npm config list to get the parsed values that I  had set above, and that is how I found out about the double encoding. Weird.
Essentially you must figure out the following requirements:
- Is a DOMAINstring required for authentication
- Do you need to encode special characters?
- Spaces and at (@) signs are specially challenging 
 
Regards.
WINDOWS ENVIRONMENT VARIABLES (CMD Prompt)
Update
Turns out that even with the above configurations, I still had some issues with some packages/scripts that use Request - Simplified HTTP client internally to download stuff. So, as the above readme explained, we can specify environment variables to set the proxy on the command line, and Request will honor those values. 
Then, after (and I am reluctant to admit this) several tries (more like days), of trying to set the environment variables I finally succeeded with the following guidelines:
rem notice that the value after the = has no quotations
rem    - I believe that if quotations are placed after it, they become
rem    part of the value, you do not want that
rem notice that there is no space before or after the = sign
rem     - if you leave a space before it, you will be declaring a variable 
rem     name that includes such space, you do not want to do that
rem     - if you leave a space after it, you will be including the space
rem     as part of the value, you do not want that either
rem looks like there is no need to URL encode stuff in there
SET HTTP_PROXY=http://DOMAIN\user name:password@x.x.x.x:port
SET HTTPS_PROXY=http://DOMAIN\user name:password@x.x.x.x:port
cntlm
I used the above technique for a few weeks, untill I realized the overhead of updating my password across all the tools that needed the proxy setup.
Besides npm, I also use:
- bower
- vagrant
- virtual box (running linux)
- apt-get [linux]
 
- git
- vscode
- brackets
- atom
- tsd
cntlm Setup Steps
So, I installed cntlm. Setting cntlm is pretty stright forward, you look for the ini file @ C:\Program Files\Cntlm\cntlm.ini
- Open C:\Program Files\Cntlm\cntlm.ini(you may need admin rights)
- look for UsernameandDomainlines (line 8-9 I think)
- add your username
- add your domain
 
- On cmd prompt run:   - 
- cd C:\Program Files\Cntlm\
cntlm -M
cntlm -H  
 
 - 
- you will be asked for the password:
 - 
-  cygwin warning:
   MS-DOS style path detected: C:\Program Files\Cntlm\cntlm.ini
   Preferred POSIX equivalent is: /Cntlm/cntlm.ini
   CYGWIN environment variable option "nodosfilewarning" turns off this warning.
   Consult the user's guide for more details about POSIX paths:
     http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
 Password:
 
 
- The output you get from - cntlm -Hwill look something like:
 - 
- PassLM          561DF6AF15D5A5ADG  
PassNT          A1D651A5F15DFA5AD  
PassNTLMv2      A1D65F1A65D1ASD51  # Only for user 'user name', domain 'DOMAIN'
 
 - 
- It is recomended that you use PassNTLMv2 so add a #before linePassLMandPassNTor do not use them
 
- Paste the output from cntlm -Hon the ini file replacing the lines forPassLM,PassNTandPassNTMLv2, or comment the original lines and add yours.
- Add your Proxyservers. If you do not know what the proxy server is... Do what I did, I looked for my proxy auto-config file by looking for theAutoConfigURLRegistry key inHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings. Navigate to that url and look through the code which happens to be JavaScript.
- Optionaly you can change the port where cntlm listens to by changing the Listen    ####line, where####is the port number.
Setup NPM with cntlm
So, you point npm to your cntml proxy, you can use the ip, I used localhost and the default port for cntlm 3128 so my proxy url looks like this
http://localhost:3128
With the proper command:
npm config set proxy http://localhost:3128
Is a lot simpler. You setup all your tools with that same url, and you only update the password on one place. Life is so much simpler not.
Must Setup The npm CA certificate
From the npm documentation ca
If your corporate proxy is intercepting https connections with its own Self Signed Certificate, this is a must to avoid npm config set strict-ssl false
Basic steps
- Get the certificate from your browser (Chromes works well). Export it as Base-64 encoded X.509 (.CER)
- Replace new lines with \n
- Edit your .npmrcadd a lineca[]="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----"
Issues
I have noticed tha sometimes npm kind of hangs, so I stop (sometimes forcefully) cntlm and restart it.