UNPKG

1.87 kBJavaScriptView Raw
1'use strict';
2const errors = require('./errors');
3const asStream = require('./as-stream');
4const asPromise = require('./as-promise');
5const normalizeArguments = require('./normalize-arguments');
6const merge = require('./merge');
7const deepFreeze = require('./deep-freeze');
8const mergeInstances = require('./merge-instances');
9
10const next = options => options.stream ? asStream(options) : asPromise(options);
11const mergeOptions = (defaults, options = {}) => merge({}, defaults, options);
12
13const aliases = [
14 'get',
15 'post',
16 'put',
17 'patch',
18 'head',
19 'delete'
20];
21
22const create = defaults => {
23 defaults = merge({}, defaults);
24 defaults.options = normalizeArguments.preNormalize(defaults.options);
25 if (!defaults.handler) {
26 defaults.handler = next;
27 }
28
29 function got(url, options) {
30 try {
31 options = mergeOptions(defaults.options, options);
32 return defaults.handler(normalizeArguments(url, options, defaults), next);
33 } catch (error) {
34 if (options.stream) {
35 throw error;
36 } else {
37 return Promise.reject(error);
38 }
39 }
40 }
41
42 got.create = create;
43 got.extend = (options = {}) => create({
44 options: mergeOptions(defaults.options, options),
45 handler: defaults.handler
46 });
47
48 got.mergeInstances = (...args) => create(mergeInstances(args));
49
50 got.stream = (url, options) => {
51 options = mergeOptions(defaults.options, options);
52 options.stream = true;
53 return defaults.handler(normalizeArguments(url, options, defaults), next);
54 };
55
56 for (const method of aliases) {
57 got[method] = (url, options) => got(url, {...options, method});
58 got.stream[method] = (url, options) => got.stream(url, {...options, method});
59 }
60
61 Object.assign(got, {...errors, mergeOptions});
62 Object.defineProperty(got, 'defaults', {
63 value: deepFreeze(defaults),
64 writable: false,
65 enumerable: true,
66 configurable: true
67 });
68
69 return got;
70};
71
72module.exports = create;