lint+feat: add types + minor ws-ish refactor

This commit is contained in:
AJ ONeal 2022-09-01 00:06:19 -06:00
parent e397dcc9cb
commit 750751966e
Signed by: coolaj86
GPG Key ID: 585419CA6DB0AA23
5 changed files with 95 additions and 31 deletions

14
bin/localize-types Executable file
View File

@ -0,0 +1,14 @@
#!/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

View File

@ -7,6 +7,35 @@ var os = require('os');
var pkg = require('./package.json'); var pkg = require('./package.json');
var fs = require('fs'); // only for streams 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() { function debug() {
if (module.exports.debug) { if (module.exports.debug) {
console.log.apply(console, arguments); console.log.apply(console, arguments);
@ -165,10 +194,16 @@ function handleResponse(resp, opts, cb) {
}); });
} }
/**
* @param {any} defs - TODO enumerate defaults
* @returns {Request}
*/
function setDefaults(defs) { function setDefaults(defs) {
defs = defs || {}; defs = defs || {};
/** @type {Request} */
function urequestHelper(opts, cb) { function urequestHelper(opts, cb) {
//jshint maxcomplexity:42
debug('\n[urequest] processed options:'); debug('\n[urequest] processed options:');
debug(opts); debug(opts);
@ -522,7 +557,7 @@ function setDefaults(defs) {
opts = { url: opts }; opts = { url: opts };
} }
module.exports._keys.forEach(function (key) { _keys.forEach(function (key) {
if (key in opts && 'undefined' !== typeof opts[key]) { if (key in opts && 'undefined' !== typeof opts[key]) {
reqOpts[key] = opts[key]; reqOpts[key] = opts[key];
} else if (key in defs) { } else if (key in defs) {
@ -653,35 +688,12 @@ function getUserAgent(additional) {
return ua; return ua;
} }
var _defaults = { exports.request = setDefaults(_defaults);
sendImmediately: true, exports._keys = _keys;
method: '',
headers: {}, module.exports = exports.request;
useQuerystring: false, module.exports._keys = _keys;
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 = module.exports.debug =
-1 !== (process.env.NODE_DEBUG || '').split(/\s+/g).indexOf('urequest'); -1 !== (process.env.NODE_DEBUG || '').split(/\s+/g).indexOf('urequest');

4
local-types.js Normal file
View File

@ -0,0 +1,4 @@
/**
* @typedef {import('./types.js').Response} Response
* @typedef {import('./types.js').Headers} Headers
*/

View File

@ -7,13 +7,17 @@
"index.js": "browser.js" "index.js": "browser.js"
}, },
"files": [ "files": [
"lib" "browser.js",
"lib",
"local-types.js",
"types.js"
], ],
"directories": { "directories": {
"example": "examples" "example": "examples"
}, },
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1",
"prepublish": "./bin/localize-types"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

30
types.js Normal file
View File

@ -0,0 +1,30 @@
'use strict';
module.exports._typesOnly = true;
/**
* @callback Request
* @param {Object} opts
* @param {String} [opts.body]
* @param {Object.<String,any>} [opts.form]
* @param {Headers} opts.headers
* @param {Boolean | String} [opts.json]
* @param {String} [opts.method]
* @param {String} opts.url
* @returns {Response}
*/
/**
* @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
*/