1 | 'use strict';
|
2 | const errors = require('./errors');
|
3 | const asStream = require('./as-stream');
|
4 | const asPromise = require('./as-promise');
|
5 | const normalizeArguments = require('./normalize-arguments');
|
6 | const merge = require('./merge');
|
7 | const deepFreeze = require('./deep-freeze');
|
8 | const mergeInstances = require('./merge-instances');
|
9 |
|
10 | const next = options => options.stream ? asStream(options) : asPromise(options);
|
11 | const mergeOptions = (defaults, options = {}) => merge({}, defaults, options);
|
12 |
|
13 | const aliases = [
|
14 | 'get',
|
15 | 'post',
|
16 | 'put',
|
17 | 'patch',
|
18 | 'head',
|
19 | 'delete'
|
20 | ];
|
21 |
|
22 | const 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 |
|
72 | module.exports = create;
|