mirror of
				https://github.com/therootcompany/request.js.git
				synced 2024-11-16 17:28:58 +00:00 
			
		
		
		
	Compare commits
	
		
			No commits in common. "v1.9.0-6" and "master" have entirely different histories.
		
	
	
		
	
		
| @ -1,14 +0,0 @@ | ||||
| #!/bin/sh | ||||
| 
 | ||||
| my_typedefs="$( | ||||
|     grep typedef ./types.js | cut -d ' ' -f5 | ||||
| )" | ||||
| 
 | ||||
| rm -f ./local-types.js | ||||
| { | ||||
|     echo '/**' | ||||
|     for my_type in $my_typedefs; do | ||||
|         echo " * @typedef {import('./types.js').${my_type}} ${my_type}" | ||||
|     done | ||||
|     echo ' */' | ||||
| } >> ./local-types.js | ||||
							
								
								
									
										201
									
								
								browser.js
									
									
									
									
									
								
							
							
						
						
									
										201
									
								
								browser.js
									
									
									
									
									
								
							| @ -1,201 +0,0 @@ | ||||
| 'use strict'; | ||||
| 
 | ||||
| // `fetch` will be available for node and browsers as a global
 | ||||
| //var fetch = window.fetch;
 | ||||
| 
 | ||||
| // https://developer.mozilla.org/en-US/docs/Web/API/fetch
 | ||||
| // https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
 | ||||
| let _fetchDefaults = { | ||||
|     method: 'GET', // *GET, POST, PATCH, PUT, DELETE, etc
 | ||||
|     headers: {}, | ||||
|     body: undefined, // String, ArrayBuffer, FormData, etc
 | ||||
|     mode: 'cors', // no-cors, *cors, same-origin
 | ||||
|     credentials: 'same-origin', // omit, *same-origin, include
 | ||||
|     cache: 'default', // *default, no-store, reload, no-cache, force-cache, only-if-cached
 | ||||
|     redirect: 'follow', // *follow, error, manual,
 | ||||
|     referrer: undefined, | ||||
|     referrerPolicy: 'no-referrer-when-downgrade', // no-referrer, *no-referrer-when-downgrade, same-origin, origin, strict-origin, origin-when-cross-origin, strict-origin-when-cross-origin, unsafe-url
 | ||||
|     integrity: '', | ||||
|     keepalive: false, | ||||
|     signal: null //
 | ||||
| }; | ||||
| 
 | ||||
| let _optionKeys = Object.keys(_fetchDefaults).concat([ | ||||
|     //'encoding', // N/A
 | ||||
|     //'stream', // TODO via getReader
 | ||||
|     //'json' // handled manually
 | ||||
|     //'form', // TODO
 | ||||
|     //'auth' // handled manually
 | ||||
|     //'formData', // TODO
 | ||||
|     //'FormData', // TODO
 | ||||
|     //'userAgent' // not allowed, non-standard for request.js
 | ||||
| ]); | ||||
| 
 | ||||
| function setDefaults(_defs) { | ||||
|     return async function request(opts) { | ||||
|         if ('string' === typeof opts) { | ||||
|             opts = { url: opts }; | ||||
|         } | ||||
|         let reqOpts = { headers: {} }; | ||||
| 
 | ||||
|         if ( | ||||
|             opts.body || | ||||
|             (opts.json && true !== opts.json) || | ||||
|             opts.form || | ||||
|             opts.formData | ||||
|         ) { | ||||
|             // TODO this is probably a deviation from request's API
 | ||||
|             // need to check and probably eliminate it
 | ||||
|             reqOpts.method = (reqOpts.method || 'POST').toUpperCase(); | ||||
|         } else { | ||||
|             reqOpts.method = (reqOpts.method || 'GET').toUpperCase(); | ||||
|         } | ||||
| 
 | ||||
|         _optionKeys.forEach(function (key) { | ||||
|             if (key in opts) { | ||||
|                 if ('undefined' !== typeof opts[key]) { | ||||
|                     reqOpts[key] = opts[key]; | ||||
|                 } | ||||
|             } else if (key in _defs) { | ||||
|                 reqOpts[key] = _defs[key]; | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         if (opts.auth) { | ||||
|             // if opts.uri specifies auth it will be parsed by url.parse and passed directly to the http module
 | ||||
|             if ('string' !== typeof opts.auth) { | ||||
|                 let u = opts.auth.user || opts.auth.username || ''; | ||||
|                 let p = opts.auth.pass || opts.auth.password || ''; | ||||
|                 reqOpts.headers.Authorization = encodeBasicAuth(`${u}:${p}`); | ||||
|             } else if ('string' === typeof opts.auth) { | ||||
|                 reqOpts.headers.Authorization = encodeBasicAuth(`${opts.auth}`); | ||||
|             } | ||||
| 
 | ||||
|             // [request-compat]
 | ||||
|             if (opts.auth.bearer) { | ||||
|                 // having a shortcut for base64 encoding makes sense,
 | ||||
|                 // but this? Eh, whatevs...
 | ||||
|                 reqOpts.header.Authorization = `Bearer ${opts.auth.bearer}`; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         let body; | ||||
|         if (opts.json && true !== opts.json) { | ||||
|             if (!opts.headers['content-type']) { | ||||
|                 opts.headers['content-type'] = 'application/json'; | ||||
|             } | ||||
|             body = JSON.stringify(opts.json); | ||||
|             if (!opts.method) { | ||||
|                 opts.method = 'POST'; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // The node version will send HTTP Auth by default, but not Cookies.
 | ||||
|         // We don't have an equivalent option for `fetch`. Furthermore,
 | ||||
|         // `fetch` caches HTTP Auth Basic across browser refreshes,
 | ||||
|         // which is not analogous to the node behavior.
 | ||||
|         //
 | ||||
|         // "In the face of ambiguity, refuse the temptation to guess"
 | ||||
|         //
 | ||||
|         //if (!('credentials' in opts)) {
 | ||||
|         //    opts.credentials = 'include';
 | ||||
|         //}
 | ||||
| 
 | ||||
|         if (!('mode' in opts)) { | ||||
|             reqOpts.mode = 'cors'; | ||||
|         } | ||||
|         if (!('body' in opts)) { | ||||
|             if (body) { | ||||
|                 reqOpts.body = body; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         let resp = await fetch(opts.url, reqOpts); | ||||
| 
 | ||||
|         let result = { | ||||
|             ok: resp.ok, | ||||
|             headers: headersToObj(resp.headers), | ||||
|             body: undefined, | ||||
|             // swapped to match request.js
 | ||||
|             statusCode: resp.status, | ||||
|             status: resp.statusText, | ||||
|             request: reqOpts, | ||||
|             response: resp | ||||
|         }; | ||||
|         result.toJSON = function () { | ||||
|             return { | ||||
|                 ok: result.ok, | ||||
|                 headers: result.headers, | ||||
|                 body: result.body, | ||||
|                 statusCode: result.statusCode, | ||||
|                 status: result.status | ||||
|             }; | ||||
|         }; | ||||
| 
 | ||||
|         // return early if there's no body
 | ||||
|         if (!result.headers['content-type']) { | ||||
|             return result; | ||||
|         } | ||||
| 
 | ||||
|         // TODO blob, formData ?
 | ||||
|         if (null === opts.encoding) { | ||||
|             return await resp.arrayBuffer(); | ||||
|         } | ||||
| 
 | ||||
|         if (!opts.json) { | ||||
|             result.body = await resp.text(); | ||||
|         } else { | ||||
|             result.body = await resp.json().catch(async function () { | ||||
|                 return await resp.text(); | ||||
|             }); | ||||
|         } | ||||
|         return result; | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param {Iterable.<*>} rheaders | ||||
|  * @returns {Object.<String, String>} | ||||
|  */ | ||||
| function headersToObj(rheaders) { | ||||
|     /* | ||||
|     Array.from(resp.headers.entries()).forEach(function (h) { | ||||
|         headers[h[0]] = h[1]; | ||||
|     }); | ||||
|     */ | ||||
|     let headerNames = Array.from(rheaders.keys()); | ||||
|     let resHeaders = {}; | ||||
|     headerNames.forEach(function (k) { | ||||
|         resHeaders[k] = rheaders.get(k); | ||||
|     }); | ||||
|     return resHeaders; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param {String} utf8 | ||||
|  * @returns {String} | ||||
|  */ | ||||
| function encodeBasicAuth(utf8) { | ||||
|     let b64 = unicodeToBase64(utf8); | ||||
|     return `Basic ${b64}`; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param {String} utf8 | ||||
|  * @returns {String} | ||||
|  */ | ||||
| function unicodeToBase64(utf8) { | ||||
|     let str = ''; | ||||
|     let uint8 = new TextEncoder().encode(utf8); | ||||
|     uint8.forEach(function (b) { | ||||
|         str += String.fromCharCode(b); | ||||
|     }); | ||||
|     let b64 = btoa(str); | ||||
|     return b64; | ||||
| } | ||||
| 
 | ||||
| let defaultRequest = setDefaults({ mode: 'cors' }); | ||||
| exports.request = defaultRequest; | ||||
| exports.defaults = setDefaults; | ||||
| module.exports = defaultRequest; | ||||
| module.exports.defaults = setDefaults; | ||||
							
								
								
									
										73
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								index.js
									
									
									
									
									
								
							| @ -7,35 +7,6 @@ var os = require('os'); | ||||
| var pkg = require('./package.json'); | ||||
| var fs = require('fs'); // only for streams
 | ||||
| 
 | ||||
| var _defaults = { | ||||
|     sendImmediately: true, | ||||
|     method: '', | ||||
|     headers: {}, | ||||
|     useQuerystring: false, | ||||
|     followRedirect: true, | ||||
|     followAllRedirects: false, | ||||
|     followOriginalHttpMethod: false, | ||||
|     maxRedirects: 10, | ||||
|     removeRefererHeader: false, | ||||
|     // encoding: undefined,
 | ||||
|     // stream: false, // TODO allow a stream?
 | ||||
|     gzip: false | ||||
|     //, body: undefined
 | ||||
|     //, json: undefined
 | ||||
| }; | ||||
| 
 | ||||
| var _keys = Object.keys(_defaults).concat([ | ||||
|     'encoding', | ||||
|     'stream', | ||||
|     'body', | ||||
|     'json', | ||||
|     'form', | ||||
|     'auth', | ||||
|     'formData', | ||||
|     'FormData', | ||||
|     'userAgent' // non-standard for request.js
 | ||||
| ]); | ||||
| 
 | ||||
| function debug() { | ||||
|     if (module.exports.debug) { | ||||
|         console.log.apply(console, arguments); | ||||
| @ -149,9 +120,6 @@ function handleResponse(resp, opts, cb) { | ||||
|         resp.body = ''; | ||||
|     } | ||||
|     resp._bodyLength = 0; | ||||
|     resp.once('error', function (err) { | ||||
|         cb(err, resp, resp.body); | ||||
|     }); | ||||
|     resp.on('readable', function () { | ||||
|         var chunk; | ||||
|         while ((chunk = resp.read())) { | ||||
| @ -194,16 +162,10 @@ function handleResponse(resp, opts, cb) { | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param {any} defs - TODO enumerate defaults | ||||
|  * @returns {Request} | ||||
|  */ | ||||
| function setDefaults(defs) { | ||||
|     defs = defs || {}; | ||||
| 
 | ||||
|     /** @type {Request} */ | ||||
|     function urequestHelper(opts, cb) { | ||||
|         //jshint maxcomplexity:42
 | ||||
|         debug('\n[urequest] processed options:'); | ||||
|         debug(opts); | ||||
| 
 | ||||
| @ -557,7 +519,7 @@ function setDefaults(defs) { | ||||
|             opts = { url: opts }; | ||||
|         } | ||||
| 
 | ||||
|         _keys.forEach(function (key) { | ||||
|         module.exports._keys.forEach(function (key) { | ||||
|             if (key in opts && 'undefined' !== typeof opts[key]) { | ||||
|                 reqOpts[key] = opts[key]; | ||||
|             } else if (key in defs) { | ||||
| @ -688,12 +650,35 @@ function getUserAgent(additional) { | ||||
|     return ua; | ||||
| } | ||||
| 
 | ||||
| exports.request = setDefaults(_defaults); | ||||
| exports._keys = _keys; | ||||
| 
 | ||||
| module.exports = exports.request; | ||||
| module.exports._keys = _keys; | ||||
| var _defaults = { | ||||
|     sendImmediately: true, | ||||
|     method: '', | ||||
|     headers: {}, | ||||
|     useQuerystring: false, | ||||
|     followRedirect: true, | ||||
|     followAllRedirects: false, | ||||
|     followOriginalHttpMethod: false, | ||||
|     maxRedirects: 10, | ||||
|     removeRefererHeader: false, | ||||
|     // encoding: undefined,
 | ||||
|     // stream: false, // TODO allow a stream?
 | ||||
|     gzip: false | ||||
|     //, body: undefined
 | ||||
|     //, json: undefined
 | ||||
| }; | ||||
| module.exports = setDefaults(_defaults); | ||||
| 
 | ||||
| module.exports._keys = Object.keys(_defaults).concat([ | ||||
|     'encoding', | ||||
|     'stream', | ||||
|     'body', | ||||
|     'json', | ||||
|     'form', | ||||
|     'auth', | ||||
|     'formData', | ||||
|     'FormData', | ||||
|     'userAgent' // non-standard for request.js
 | ||||
| ]); | ||||
| module.exports.debug = | ||||
|     -1 !== (process.env.NODE_DEBUG || '').split(/\s+/g).indexOf('urequest'); | ||||
| 
 | ||||
|  | ||||
| @ -1,76 +0,0 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     /* Visit https://aka.ms/tsconfig.json to read more about this file */ | ||||
| 
 | ||||
|     "target": "es2021" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */, | ||||
|     "module": "commonjs", | ||||
|     // "lib": [],                                   /* Specify library files to be included in the compilation. */ | ||||
|     "allowJs": true /* Allow javascript files to be compiled. */, | ||||
|     "checkJs": true /* Report errors in .js files. */, | ||||
|     // "jsx": "preserve",                           /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ | ||||
|     // "declaration": true,                         /* Generates corresponding '.d.ts' file. */ | ||||
|     // "declarationMap": true,                      /* Generates a sourcemap for each corresponding '.d.ts' file. */ | ||||
|     // "sourceMap": true,                           /* Generates corresponding '.map' file. */ | ||||
|     // "outFile": "./",                             /* Concatenate and emit output to single file. */ | ||||
|     // "outDir": "./",                              /* Redirect output structure to the directory. */ | ||||
|     // "rootDir": "./",                             /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ | ||||
|     // "composite": true,                           /* Enable project compilation */ | ||||
|     // "tsBuildInfoFile": "./",                     /* Specify file to store incremental compilation information */ | ||||
|     // "removeComments": true,                      /* Do not emit comments to output. */ | ||||
|     "noEmit": true /* Do not emit outputs. */, | ||||
|     // "importHelpers": true,                       /* Import emit helpers from 'tslib'. */ | ||||
|     // "downlevelIteration": true,                  /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ | ||||
|     // "isolatedModules": true,                     /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ | ||||
| 
 | ||||
|     /* Strict Type-Checking Options */ | ||||
|     "strict": true /* Enable all strict type-checking options. */, | ||||
|     "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, | ||||
|     // "strictNullChecks": true,                    /* Enable strict null checks. */ | ||||
|     // "strictFunctionTypes": true,                 /* Enable strict checking of function types. */ | ||||
|     // "strictBindCallApply": true,                 /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ | ||||
|     // "strictPropertyInitialization": true,        /* Enable strict checking of property initialization in classes. */ | ||||
|     // "noImplicitThis": true,                      /* Raise error on 'this' expressions with an implied 'any' type. */ | ||||
|     "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, | ||||
| 
 | ||||
|     /* Additional Checks */ | ||||
|     "noUnusedLocals": true /* Report errors on unused locals. */, | ||||
|     // "noUnusedParameters": true,                  /* Report errors on unused parameters. */ | ||||
|     // "noImplicitReturns": true,                   /* Report error when not all code paths in function return a value. */ | ||||
|     // "noFallthroughCasesInSwitch": true,          /* Report errors for fallthrough cases in switch statement. */ | ||||
|     // "noUncheckedIndexedAccess": true,            /* Include 'undefined' in index signature results */ | ||||
|     // "noImplicitOverride": true,                  /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ | ||||
|     // "noPropertyAccessFromIndexSignature": true,  /* Require undeclared properties from index signatures to use element accesses. */ | ||||
| 
 | ||||
|     /* Module Resolution Options */ | ||||
|     "moduleResolution": "node",                     /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ | ||||
|     // "baseUrl": "./",                             /* Base directory to resolve non-absolute module names. */ | ||||
|     // "paths": {},                                 /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ | ||||
|     // "rootDirs": [],                              /* List of root folders whose combined content represents the structure of the project at runtime. */ | ||||
|     "typeRoots": [ | ||||
|       "./typings", | ||||
|       "./node_modules/@types" | ||||
|     ] /* List of folders to include type definitions from. */, | ||||
|     // "types": [],                                 /* Type declaration files to be included in compilation. */ | ||||
|     // "allowSyntheticDefaultImports": true,        /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ | ||||
|     "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, | ||||
|     "preserveSymlinks": false /* Do not resolve the real path of symlinks. */, | ||||
|     "maxNodeModuleJsDepth": 20, | ||||
|     // "allowUmdGlobalAccess": true,                /* Allow accessing UMD globals from modules. */ | ||||
| 
 | ||||
|     /* Source Map Options */ | ||||
|     // "sourceRoot": "",                            /* Specify the location where debugger should locate TypeScript files instead of source locations. */ | ||||
|     // "mapRoot": "",                               /* Specify the location where debugger should locate map files instead of generated locations. */ | ||||
|     // "inlineSourceMap": true,                     /* Emit a single file with source maps instead of having a separate file. */ | ||||
|     // "inlineSources": true,                       /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ | ||||
| 
 | ||||
|     /* Experimental Options */ | ||||
|     // "experimentalDecorators": true,              /* Enables experimental support for ES7 decorators. */ | ||||
|     // "emitDecoratorMetadata": true,               /* Enables experimental support for emitting type metadata for decorators. */ | ||||
| 
 | ||||
|     /* Advanced Options */ | ||||
|     "skipLibCheck": true /* Skip type checking of declaration files. */, | ||||
|     "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ | ||||
|   }, | ||||
|   "include": ["index.js", "browser.js", "./types.js", "./local-types.js", "lib/**/*.js", "bin/**/*.js"], | ||||
|   "exclude": ["node_modules"] | ||||
| } | ||||
| @ -1,5 +0,0 @@ | ||||
| /** | ||||
|  * @typedef {import('./types.js').RequestOptions} RequestOptions | ||||
|  * @typedef {import('./types.js').Response} Response | ||||
|  * @typedef {import('./types.js').Headers} Headers | ||||
|  */ | ||||
							
								
								
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -1,5 +1,5 @@ | ||||
| { | ||||
|     "name": "@root/request", | ||||
|     "version": "1.9.0-6", | ||||
|     "version": "1.8.2", | ||||
|     "lockfileVersion": 1 | ||||
| } | ||||
|  | ||||
							
								
								
									
										14
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								package.json
									
									
									
									
									
								
							| @ -1,24 +1,16 @@ | ||||
| { | ||||
|     "name": "@root/request", | ||||
|     "version": "1.9.0-6", | ||||
|     "version": "1.8.2", | ||||
|     "description": "A lightweight, zero-dependency drop-in replacement for request", | ||||
|     "main": "index.js", | ||||
|     "browser": { | ||||
|         "index.js": "browser.js" | ||||
|     }, | ||||
|     "files": [ | ||||
|         "browser.js", | ||||
|         "jsconfig.json", | ||||
|         "lib", | ||||
|         "local-types.js", | ||||
|         "types.js" | ||||
|         "lib" | ||||
|     ], | ||||
|     "directories": { | ||||
|         "example": "examples" | ||||
|     }, | ||||
|     "scripts": { | ||||
|         "test": "echo \"Error: no test specified\" && exit 1", | ||||
|         "prepublish": "./bin/localize-types" | ||||
|         "test": "echo \"Error: no test specified\" && exit 1" | ||||
|     }, | ||||
|     "repository": { | ||||
|         "type": "git", | ||||
|  | ||||
							
								
								
									
										34
									
								
								types.js
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								types.js
									
									
									
									
									
								
							| @ -1,34 +0,0 @@ | ||||
| 'use strict'; | ||||
| 
 | ||||
| module.exports._typesOnly = true; | ||||
| 
 | ||||
| /** | ||||
|  * @callback Request | ||||
|  * @param {RequestOptions} opts | ||||
|  * @returns {Response} | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} RequestOptions | ||||
|  * @prop {any} [opts.body] | ||||
|  * @prop {Object.<String,any>} [opts.form] | ||||
|  * @prop {Headers} [opts.headers] | ||||
|  * @prop {String} [opts.method] | ||||
|  * @prop {Boolean | any} [opts.json] | ||||
|  * @prop {String} opts.url | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} Response | ||||
|  * @prop {any} body | ||||
|  * @prop {Headers} headers | ||||
|  * @prop {Boolean} ok | ||||
|  * @prop {any} [response] - TODO (browser only) | ||||
|  * @prop {any} [request] - TODO | ||||
|  * @prop {String} status | ||||
|  * @prop {Number} statusCode | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object.<String,String|Array<String>>} Headers | ||||
|  */ | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user