@compassdigital/sdk.typescript 3.0.0-beta.20 → 3.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -126
- package/gen.ts +41 -86
- package/lib/announcement.d.ts.map +1 -0
- package/lib/announcement.js +3 -0
- package/lib/announcement.js.map +1 -0
- package/lib/base.d.ts +4 -141
- package/lib/base.d.ts.map +1 -1
- package/lib/base.js +35 -328
- package/lib/base.js.map +1 -1
- package/lib/brand.d.ts.map +1 -0
- package/lib/brand.js +3 -0
- package/lib/brand.js.map +1 -0
- package/lib/calendar.d.ts.map +1 -0
- package/lib/calendar.js +3 -0
- package/lib/calendar.js.map +1 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +3 -0
- package/lib/config.js.map +1 -0
- package/lib/datalake.d.ts.map +1 -0
- package/lib/datalake.js +3 -0
- package/lib/datalake.js.map +1 -0
- package/lib/delivery.d.ts.map +1 -0
- package/lib/delivery.js +3 -0
- package/lib/delivery.js.map +1 -0
- package/lib/dh.d.ts.map +1 -0
- package/lib/dh.js +3 -0
- package/lib/dh.js.map +1 -0
- package/lib/email.d.ts.map +1 -0
- package/lib/email.js +3 -0
- package/lib/email.js.map +1 -0
- package/lib/file.d.ts.map +1 -0
- package/lib/file.js +3 -0
- package/lib/file.js.map +1 -0
- package/lib/index.d.ts +259 -476
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +234 -499
- package/lib/index.js.map +1 -1
- package/lib/{interface/kds.d.ts → kds.d.ts} +0 -1
- package/lib/kds.d.ts.map +1 -0
- package/lib/kds.js +3 -0
- package/lib/kds.js.map +1 -0
- package/lib/{interface/location.d.ts → location.d.ts} +0 -1
- package/lib/location.d.ts.map +1 -0
- package/lib/location.js +3 -0
- package/lib/location.js.map +1 -0
- package/lib/logger.d.ts.map +1 -0
- package/lib/logger.js +3 -0
- package/lib/logger.js.map +1 -0
- package/lib/loyalty.d.ts.map +1 -0
- package/lib/loyalty.js +3 -0
- package/lib/loyalty.js.map +1 -0
- package/lib/mealplan.d.ts.map +1 -0
- package/lib/mealplan.js +3 -0
- package/lib/mealplan.js.map +1 -0
- package/lib/message.d.ts.map +1 -0
- package/lib/message.js +3 -0
- package/lib/message.js.map +1 -0
- package/lib/{interface/order.d.ts → order.d.ts} +4 -5
- package/lib/order.d.ts.map +1 -0
- package/lib/order.js +3 -0
- package/lib/order.js.map +1 -0
- package/lib/{interface/partner.d.ts → partner.d.ts} +3 -233
- package/lib/partner.d.ts.map +1 -0
- package/lib/partner.js +3 -0
- package/lib/partner.js.map +1 -0
- package/lib/{interface/payment.d.ts → payment.d.ts} +0 -1
- package/lib/payment.d.ts.map +1 -0
- package/lib/payment.js +3 -0
- package/lib/payment.js.map +1 -0
- package/lib/promo.d.ts.map +1 -0
- package/lib/promo.js +3 -0
- package/lib/promo.js.map +1 -0
- package/lib/report.d.ts.map +1 -0
- package/lib/report.js +3 -0
- package/lib/report.js.map +1 -0
- package/lib/schedule.d.ts.map +1 -0
- package/lib/schedule.js +3 -0
- package/lib/schedule.js.map +1 -0
- package/lib/shoppingcart.d.ts.map +1 -0
- package/lib/shoppingcart.js +3 -0
- package/lib/shoppingcart.js.map +1 -0
- package/lib/task.d.ts.map +1 -0
- package/lib/task.js +3 -0
- package/lib/task.js.map +1 -0
- package/lib/{interface/user.d.ts → user.d.ts} +0 -2
- package/lib/user.d.ts.map +1 -0
- package/lib/user.js +3 -0
- package/lib/user.js.map +1 -0
- package/lib/vote.d.ts.map +1 -0
- package/lib/vote.js +3 -0
- package/lib/vote.js.map +1 -0
- package/manifest.json +50 -29
- package/package.json +5 -19
- package/src/{interface/announcement.ts → announcement.ts} +0 -2
- package/src/base.ts +17 -330
- package/src/{interface/brand.ts → brand.ts} +0 -2
- package/src/{interface/calendar.ts → calendar.ts} +0 -2
- package/src/{interface/config.ts → config.ts} +0 -2
- package/src/{interface/datalake.ts → datalake.ts} +0 -2
- package/src/{interface/delivery.ts → delivery.ts} +0 -2
- package/src/{interface/dh.ts → dh.ts} +0 -2
- package/src/{interface/email.ts → email.ts} +0 -2
- package/src/{interface/file.ts → file.ts} +0 -2
- package/src/index.ts +485 -2145
- package/src/{interface/kds.ts → kds.ts} +0 -4
- package/src/{interface/location.ts → location.ts} +0 -4
- package/src/{interface/logger.ts → logger.ts} +0 -2
- package/src/{interface/loyalty.ts → loyalty.ts} +0 -2
- package/src/{interface/mealplan.ts → mealplan.ts} +0 -2
- package/src/{interface/message.ts → message.ts} +0 -2
- package/src/{interface/order.ts → order.ts} +6 -10
- package/src/{interface/partner.ts → partner.ts} +4 -279
- package/src/{interface/payment.ts → payment.ts} +0 -4
- package/src/{interface/promo.ts → promo.ts} +0 -2
- package/src/{interface/report.ts → report.ts} +0 -2
- package/src/{interface/schedule.ts → schedule.ts} +0 -2
- package/src/{interface/shoppingcart.ts → shoppingcart.ts} +0 -2
- package/src/{interface/task.ts → task.ts} +0 -2
- package/src/{interface/user.ts → user.ts} +1 -7
- package/src/{interface/vote.ts → vote.ts} +0 -2
- package/template.ejs +2 -3
- package/bin/gen.js +0 -472
- package/bin/index.js +0 -3
- package/lib/interface/announcement.d.ts.map +0 -1
- package/lib/interface/announcement.js +0 -4
- package/lib/interface/announcement.js.map +0 -1
- package/lib/interface/brand.d.ts.map +0 -1
- package/lib/interface/brand.js +0 -4
- package/lib/interface/brand.js.map +0 -1
- package/lib/interface/calendar.d.ts.map +0 -1
- package/lib/interface/calendar.js +0 -4
- package/lib/interface/calendar.js.map +0 -1
- package/lib/interface/config.d.ts.map +0 -1
- package/lib/interface/config.js +0 -4
- package/lib/interface/config.js.map +0 -1
- package/lib/interface/datalake.d.ts.map +0 -1
- package/lib/interface/datalake.js +0 -4
- package/lib/interface/datalake.js.map +0 -1
- package/lib/interface/delivery.d.ts.map +0 -1
- package/lib/interface/delivery.js +0 -4
- package/lib/interface/delivery.js.map +0 -1
- package/lib/interface/dh.d.ts.map +0 -1
- package/lib/interface/dh.js +0 -4
- package/lib/interface/dh.js.map +0 -1
- package/lib/interface/email.d.ts.map +0 -1
- package/lib/interface/email.js +0 -4
- package/lib/interface/email.js.map +0 -1
- package/lib/interface/file.d.ts.map +0 -1
- package/lib/interface/file.js +0 -4
- package/lib/interface/file.js.map +0 -1
- package/lib/interface/kds.d.ts.map +0 -1
- package/lib/interface/kds.js +0 -4
- package/lib/interface/kds.js.map +0 -1
- package/lib/interface/location.d.ts.map +0 -1
- package/lib/interface/location.js +0 -4
- package/lib/interface/location.js.map +0 -1
- package/lib/interface/logger.d.ts.map +0 -1
- package/lib/interface/logger.js +0 -4
- package/lib/interface/logger.js.map +0 -1
- package/lib/interface/loyalty.d.ts.map +0 -1
- package/lib/interface/loyalty.js +0 -4
- package/lib/interface/loyalty.js.map +0 -1
- package/lib/interface/mealplan.d.ts.map +0 -1
- package/lib/interface/mealplan.js +0 -4
- package/lib/interface/mealplan.js.map +0 -1
- package/lib/interface/menu.d.ts +0 -444
- package/lib/interface/menu.d.ts.map +0 -1
- package/lib/interface/menu.js +0 -4
- package/lib/interface/menu.js.map +0 -1
- package/lib/interface/message.d.ts.map +0 -1
- package/lib/interface/message.js +0 -4
- package/lib/interface/message.js.map +0 -1
- package/lib/interface/order.d.ts.map +0 -1
- package/lib/interface/order.js +0 -4
- package/lib/interface/order.js.map +0 -1
- package/lib/interface/partner.d.ts.map +0 -1
- package/lib/interface/partner.js +0 -4
- package/lib/interface/partner.js.map +0 -1
- package/lib/interface/payment.d.ts.map +0 -1
- package/lib/interface/payment.js +0 -4
- package/lib/interface/payment.js.map +0 -1
- package/lib/interface/promo.d.ts.map +0 -1
- package/lib/interface/promo.js +0 -4
- package/lib/interface/promo.js.map +0 -1
- package/lib/interface/report.d.ts.map +0 -1
- package/lib/interface/report.js +0 -4
- package/lib/interface/report.js.map +0 -1
- package/lib/interface/schedule.d.ts.map +0 -1
- package/lib/interface/schedule.js +0 -4
- package/lib/interface/schedule.js.map +0 -1
- package/lib/interface/shoppingcart.d.ts.map +0 -1
- package/lib/interface/shoppingcart.js +0 -4
- package/lib/interface/shoppingcart.js.map +0 -1
- package/lib/interface/task.d.ts.map +0 -1
- package/lib/interface/task.js +0 -4
- package/lib/interface/task.js.map +0 -1
- package/lib/interface/user.d.ts.map +0 -1
- package/lib/interface/user.js +0 -4
- package/lib/interface/user.js.map +0 -1
- package/lib/interface/vote.d.ts.map +0 -1
- package/lib/interface/vote.js +0 -4
- package/lib/interface/vote.js.map +0 -1
- package/src/interface/menu.ts +0 -644
- package/test/client.test.ts +0 -192
- package/test/gen.test.ts +0 -22
- /package/lib/{interface/announcement.d.ts → announcement.d.ts} +0 -0
- /package/lib/{interface/brand.d.ts → brand.d.ts} +0 -0
- /package/lib/{interface/calendar.d.ts → calendar.d.ts} +0 -0
- /package/lib/{interface/config.d.ts → config.d.ts} +0 -0
- /package/lib/{interface/datalake.d.ts → datalake.d.ts} +0 -0
- /package/lib/{interface/delivery.d.ts → delivery.d.ts} +0 -0
- /package/lib/{interface/dh.d.ts → dh.d.ts} +0 -0
- /package/lib/{interface/email.d.ts → email.d.ts} +0 -0
- /package/lib/{interface/file.d.ts → file.d.ts} +0 -0
- /package/lib/{interface/logger.d.ts → logger.d.ts} +0 -0
- /package/lib/{interface/loyalty.d.ts → loyalty.d.ts} +0 -0
- /package/lib/{interface/mealplan.d.ts → mealplan.d.ts} +0 -0
- /package/lib/{interface/message.d.ts → message.d.ts} +0 -0
- /package/lib/{interface/promo.d.ts → promo.d.ts} +0 -0
- /package/lib/{interface/report.d.ts → report.d.ts} +0 -0
- /package/lib/{interface/schedule.d.ts → schedule.d.ts} +0 -0
- /package/lib/{interface/shoppingcart.d.ts → shoppingcart.d.ts} +0 -0
- /package/lib/{interface/task.d.ts → task.d.ts} +0 -0
- /package/lib/{interface/vote.d.ts → vote.d.ts} +0 -0
package/manifest.json
CHANGED
|
@@ -2,107 +2,128 @@
|
|
|
2
2
|
"services": [
|
|
3
3
|
{
|
|
4
4
|
"name": "payment",
|
|
5
|
-
"swagger": "https://api.compassdigital.org/dev/payment/swagger.json"
|
|
5
|
+
"swagger": "https://api.compassdigital.org/dev/payment/swagger.json",
|
|
6
|
+
"output": "src/payment.ts"
|
|
6
7
|
},
|
|
7
8
|
{
|
|
8
9
|
"name": "order",
|
|
9
|
-
"swagger": "https://api.compassdigital.org/dev/order/swagger.json"
|
|
10
|
+
"swagger": "https://api.compassdigital.org/dev/order/swagger.json",
|
|
11
|
+
"output": "src/order.ts"
|
|
10
12
|
},
|
|
11
13
|
{
|
|
12
14
|
"name": "location",
|
|
13
|
-
"swagger": "https://api.compassdigital.org/dev/location/swagger.json"
|
|
15
|
+
"swagger": "https://api.compassdigital.org/dev/location/swagger.json",
|
|
16
|
+
"output": "src/location.ts"
|
|
14
17
|
},
|
|
15
18
|
{
|
|
16
19
|
"name": "shoppingcart",
|
|
17
|
-
"swagger": "https://api.compassdigital.org/dev/shoppingcart/swagger.json"
|
|
20
|
+
"swagger": "https://api.compassdigital.org/dev/shoppingcart/swagger.json",
|
|
21
|
+
"output": "src/shoppingcart.ts"
|
|
18
22
|
},
|
|
19
23
|
{
|
|
20
24
|
"name": "partner",
|
|
21
|
-
"swagger": "https://api.compassdigital.org/dev/partner/swagger.json"
|
|
25
|
+
"swagger": "https://api.compassdigital.org/dev/partner/swagger.json",
|
|
26
|
+
"output": "src/partner.ts"
|
|
22
27
|
},
|
|
23
28
|
{
|
|
24
29
|
"name": "email",
|
|
25
|
-
"swagger": "https://api.compassdigital.org/dev/email/swagger.json"
|
|
30
|
+
"swagger": "https://api.compassdigital.org/dev/email/swagger.json",
|
|
31
|
+
"output": "src/email.ts"
|
|
26
32
|
},
|
|
27
33
|
{
|
|
28
34
|
"name": "task",
|
|
29
|
-
"swagger": "https://api.compassdigital.org/dev/task/swagger.json"
|
|
35
|
+
"swagger": "https://api.compassdigital.org/dev/task/swagger.json",
|
|
36
|
+
"output": "src/task.ts"
|
|
30
37
|
},
|
|
31
38
|
{
|
|
32
39
|
"name": "kds",
|
|
33
|
-
"swagger": "https://api.compassdigital.org/dev/kds/swagger.json"
|
|
40
|
+
"swagger": "https://api.compassdigital.org/dev/kds/swagger.json",
|
|
41
|
+
"output": "src/kds.ts"
|
|
34
42
|
},
|
|
35
43
|
{
|
|
36
44
|
"name": "mealplan",
|
|
37
|
-
"swagger": "https://api.compassdigital.org/dev/mealplan/swagger.json"
|
|
45
|
+
"swagger": "https://api.compassdigital.org/dev/mealplan/swagger.json",
|
|
46
|
+
"output": "src/mealplan.ts"
|
|
38
47
|
},
|
|
39
48
|
{
|
|
40
49
|
"name": "datalake",
|
|
41
|
-
"swagger": "https://api.compassdigital.org/dev/datalake/swagger.json"
|
|
50
|
+
"swagger": "https://api.compassdigital.org/dev/datalake/swagger.json",
|
|
51
|
+
"output": "src/datalake.ts"
|
|
42
52
|
},
|
|
43
53
|
{
|
|
44
54
|
"name": "promo",
|
|
45
|
-
"swagger": "https://api.compassdigital.org/dev/promo/swagger.json"
|
|
55
|
+
"swagger": "https://api.compassdigital.org/dev/promo/swagger.json",
|
|
56
|
+
"output": "src/promo.ts"
|
|
46
57
|
},
|
|
47
58
|
{
|
|
48
59
|
"name": "dh",
|
|
49
|
-
"swagger": "https://api.compassdigital.org/dev/dh/swagger.json"
|
|
60
|
+
"swagger": "https://api.compassdigital.org/dev/dh/swagger.json",
|
|
61
|
+
"output": "src/dh.ts"
|
|
50
62
|
},
|
|
51
63
|
{
|
|
52
64
|
"name": "config",
|
|
53
|
-
"swagger": "https://api.compassdigital.org/dev/config/swagger.json"
|
|
65
|
+
"swagger": "https://api.compassdigital.org/dev/config/swagger.json",
|
|
66
|
+
"output": "src/config.ts"
|
|
54
67
|
},
|
|
55
68
|
{
|
|
56
69
|
"name": "announcement",
|
|
57
|
-
"swagger": "https://api.compassdigital.org/dev/announcement/swagger.json"
|
|
70
|
+
"swagger": "https://api.compassdigital.org/dev/announcement/swagger.json",
|
|
71
|
+
"output": "src/announcement.ts"
|
|
58
72
|
},
|
|
59
73
|
{
|
|
60
74
|
"name": "report",
|
|
61
|
-
"swagger": "https://api.compassdigital.org/dev/report/swagger.json"
|
|
75
|
+
"swagger": "https://api.compassdigital.org/dev/report/swagger.json",
|
|
76
|
+
"output": "src/report.ts"
|
|
62
77
|
},
|
|
63
78
|
{
|
|
64
79
|
"name": "user",
|
|
65
|
-
"swagger": "https://api.compassdigital.org/dev/user/swagger.json"
|
|
80
|
+
"swagger": "https://api.compassdigital.org/dev/user/swagger.json",
|
|
81
|
+
"output": "src/user.ts"
|
|
66
82
|
},
|
|
67
83
|
{
|
|
68
84
|
"name": "loyalty",
|
|
69
|
-
"swagger": "https://api.compassdigital.org/dev/loyalty/swagger.json"
|
|
85
|
+
"swagger": "https://api.compassdigital.org/dev/loyalty/swagger.json",
|
|
86
|
+
"output": "src/loyalty.ts"
|
|
70
87
|
},
|
|
71
88
|
{
|
|
72
89
|
"name": "brand",
|
|
73
|
-
"swagger": "https://api.compassdigital.org/dev/brand/swagger.json"
|
|
90
|
+
"swagger": "https://api.compassdigital.org/dev/brand/swagger.json",
|
|
91
|
+
"output": "src/brand.ts"
|
|
74
92
|
},
|
|
75
93
|
{
|
|
76
94
|
"name": "calendar",
|
|
77
|
-
"swagger": "https://api.compassdigital.org/dev/calendar/swagger.json"
|
|
95
|
+
"swagger": "https://api.compassdigital.org/dev/calendar/swagger.json",
|
|
96
|
+
"output": "src/calendar.ts"
|
|
78
97
|
},
|
|
79
98
|
{
|
|
80
99
|
"name": "delivery",
|
|
81
|
-
"swagger": "https://api.compassdigital.org/dev/delivery/swagger.json"
|
|
100
|
+
"swagger": "https://api.compassdigital.org/dev/delivery/swagger.json",
|
|
101
|
+
"output": "src/delivery.ts"
|
|
82
102
|
},
|
|
83
103
|
{
|
|
84
104
|
"name": "schedule",
|
|
85
|
-
"swagger": "https://api.compassdigital.org/dev/schedule/swagger.json"
|
|
105
|
+
"swagger": "https://api.compassdigital.org/dev/schedule/swagger.json",
|
|
106
|
+
"output": "src/schedule.ts"
|
|
86
107
|
},
|
|
87
108
|
{
|
|
88
109
|
"name": "vote",
|
|
89
|
-
"swagger": "https://api.compassdigital.org/dev/vote/swagger.json"
|
|
110
|
+
"swagger": "https://api.compassdigital.org/dev/vote/swagger.json",
|
|
111
|
+
"output": "src/vote.ts"
|
|
90
112
|
},
|
|
91
113
|
{
|
|
92
114
|
"name": "file",
|
|
93
|
-
"swagger": "https://api.compassdigital.org/dev/file/swagger.json"
|
|
115
|
+
"swagger": "https://api.compassdigital.org/dev/file/swagger.json",
|
|
116
|
+
"output": "src/file.ts"
|
|
94
117
|
},
|
|
95
118
|
{
|
|
96
119
|
"name": "message",
|
|
97
|
-
"swagger": "https://api.compassdigital.org/dev/message/swagger.json"
|
|
120
|
+
"swagger": "https://api.compassdigital.org/dev/message/swagger.json",
|
|
121
|
+
"output": "src/message.ts"
|
|
98
122
|
},
|
|
99
123
|
{
|
|
100
124
|
"name": "logger",
|
|
101
|
-
"swagger": "https://api.compassdigital.org/dev/logger/swagger.json"
|
|
102
|
-
|
|
103
|
-
{
|
|
104
|
-
"name": "menu",
|
|
105
|
-
"swagger": "https://api.compassdigital.org/dev/menu/swagger.json"
|
|
125
|
+
"swagger": "https://api.compassdigital.org/dev/logger/swagger.json",
|
|
126
|
+
"output": "src/logger.ts"
|
|
106
127
|
}
|
|
107
128
|
]
|
|
108
129
|
}
|
package/package.json
CHANGED
|
@@ -1,33 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@compassdigital/sdk.typescript",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.3",
|
|
4
4
|
"description": "Compass Digital Labs TypeScript SDK",
|
|
5
5
|
"type": "commonjs",
|
|
6
|
-
"bin": "./bin/index.js",
|
|
7
6
|
"main": "./lib/index.js",
|
|
8
|
-
"types": "./lib/index.d.ts",
|
|
9
7
|
"exports": {
|
|
10
8
|
".": "./lib/index.js",
|
|
11
9
|
"./*": "./lib/*"
|
|
12
10
|
},
|
|
13
11
|
"typesVersions": {
|
|
14
12
|
"*": {
|
|
15
|
-
"lib/index.js": [
|
|
16
|
-
"lib/index.d.ts"
|
|
17
|
-
],
|
|
18
13
|
"*": [
|
|
19
14
|
"lib/*"
|
|
20
15
|
]
|
|
21
16
|
}
|
|
22
17
|
},
|
|
23
|
-
"jest": {
|
|
24
|
-
"preset": "ts-jest",
|
|
25
|
-
"testEnvironment": "node"
|
|
26
|
-
},
|
|
27
18
|
"scripts": {
|
|
28
|
-
"test": "
|
|
29
|
-
"gen": "ts-node gen.ts
|
|
30
|
-
"prepare": "
|
|
19
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
20
|
+
"gen": "npx ts-node gen.ts && npx tsc",
|
|
21
|
+
"prepare": "npx tsc"
|
|
31
22
|
},
|
|
32
23
|
"author": "",
|
|
33
24
|
"license": "ISC",
|
|
@@ -37,15 +28,10 @@
|
|
|
37
28
|
"devDependencies": {
|
|
38
29
|
"@icholy/openapi-ts": "^2.5.1",
|
|
39
30
|
"@types/ejs": "^3.1.0",
|
|
40
|
-
"@types/jest": "^27.0.1",
|
|
41
31
|
"@types/node": "^16.7.2",
|
|
42
32
|
"@types/prettier": "^2.3.2",
|
|
43
33
|
"ejs": "^3.1.6",
|
|
44
|
-
"jest": "^27.1.0",
|
|
45
34
|
"prettier": "^2.3.2",
|
|
46
|
-
"
|
|
47
|
-
"ts-jest": "^27.0.5",
|
|
48
|
-
"ts-node": "^10.2.1",
|
|
49
|
-
"yargs": "^17.1.1"
|
|
35
|
+
"ts-node": "^10.2.1"
|
|
50
36
|
}
|
|
51
37
|
}
|
package/src/base.ts
CHANGED
|
@@ -2,245 +2,14 @@
|
|
|
2
2
|
import fetch from "cross-fetch";
|
|
3
3
|
|
|
4
4
|
export interface RequestOptions {
|
|
5
|
-
// environment to make requests to
|
|
6
5
|
stage?: string;
|
|
7
|
-
// authentication token
|
|
8
|
-
token?: string;
|
|
9
|
-
// additional headers
|
|
10
6
|
headers?: Record<string, string>;
|
|
11
|
-
|
|
7
|
+
token?: string;
|
|
12
8
|
debug?: boolean;
|
|
13
|
-
// the number of times to retry a request
|
|
14
9
|
retry?: number;
|
|
15
|
-
// make requests against this base url
|
|
16
|
-
// note: the stage property is ignored if base_url is set
|
|
17
10
|
base_url?: string;
|
|
18
|
-
// intercept outgoing http requests
|
|
19
|
-
intercept?: InterceptFn;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* The request data provided to intercept
|
|
24
|
-
* functions.
|
|
25
|
-
*/
|
|
26
|
-
export interface RequestData {
|
|
27
|
-
name: string;
|
|
28
|
-
service: string;
|
|
29
|
-
url: string;
|
|
30
|
-
method: string;
|
|
31
|
-
headers: Record<string, string>;
|
|
32
|
-
body?: string;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* The response data expected from
|
|
37
|
-
* intercept functions.
|
|
38
|
-
*/
|
|
39
|
-
export interface ResponseData {
|
|
40
|
-
ok: boolean;
|
|
41
|
-
status: number;
|
|
42
|
-
body: string;
|
|
43
|
-
err?: any; // network error
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* A function that performs an https request.
|
|
48
|
-
*/
|
|
49
|
-
export type FetchFn = (req: RequestData) => Promise<ResponseData>;
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* A function that intercepts an http request and returns a response.
|
|
53
|
-
*/
|
|
54
|
-
export type InterceptFn = (req: RequestData, fetch: FetchFn) => Promise<ResponseData>;
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* We have to re-implement the promise methods instead of just existing
|
|
58
|
-
* the existing Promise class due to: https://github.com/microsoft/TypeScript/issues/15202
|
|
59
|
-
*/
|
|
60
|
-
export class ResponsePromise<T> implements Promise<T> {
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Implements Promise interface.
|
|
64
|
-
*/
|
|
65
|
-
[Symbol.toStringTag] = "[object ResponsePromise]";
|
|
66
|
-
|
|
67
|
-
constructor(private promise: Promise<T>) {}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Implements Promise interface.
|
|
71
|
-
*/
|
|
72
|
-
then<TResult1 = T, TResult2 = never>(
|
|
73
|
-
onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
|
|
74
|
-
onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null
|
|
75
|
-
): ResponsePromise<TResult1 | TResult2> {
|
|
76
|
-
return new ResponsePromise(this.promise.then(onfulfilled, onrejected));
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Implements Promise interface.
|
|
81
|
-
*/
|
|
82
|
-
catch<TResult = never>(
|
|
83
|
-
onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null
|
|
84
|
-
): ResponsePromise<T | TResult> {
|
|
85
|
-
return new ResponsePromise(this.promise.catch(onrejected));
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Implements Promise interface.
|
|
90
|
-
*/
|
|
91
|
-
finally(onfinally?: (() => void) | null): ResponsePromise<T> {
|
|
92
|
-
return new ResponsePromise(this.promise.finally(onfinally));
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Returns a promise that resolves to null if http status code
|
|
97
|
-
* or service error code matches one of the provided codes.
|
|
98
|
-
* If no codes are specified, all codes are ignored.
|
|
99
|
-
*/
|
|
100
|
-
ignore(...codes: number[]): ResponsePromise<T | null> {
|
|
101
|
-
return new ResponsePromise(ServiceError.ignore(codes, this.promise));
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Returns a promise that resolves to either the response body
|
|
106
|
-
* or a ServiceError.
|
|
107
|
-
*/
|
|
108
|
-
combine(...codes: number[]): Promise<EitherResponse<T>> {
|
|
109
|
-
return new ResponsePromise(ServiceError.combine<T>(codes, this.promise));
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Either a response body or a service error.
|
|
115
|
-
*/
|
|
116
|
-
export type EitherResponse<T> = { ok: true; data: T; err: null } | { ok: false; data: null, err: ServiceError; };
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* This is a hack to make captureStackTrace visible.
|
|
120
|
-
*/
|
|
121
|
-
interface ErrorConstructor {
|
|
122
|
-
captureStackTrace?(target: object, constructorOpt?: Function): void;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* An error returned from an api service.
|
|
127
|
-
*/
|
|
128
|
-
export class ServiceError extends Error {
|
|
129
|
-
constructor(
|
|
130
|
-
public status: number, // http status
|
|
131
|
-
public code: number, // service error code
|
|
132
|
-
message: string // service error message
|
|
133
|
-
) {
|
|
134
|
-
super(message);
|
|
135
|
-
this.name = `ServiceError(${code})`;
|
|
136
|
-
|
|
137
|
-
// TODO: remove this if we change compilation target > es5
|
|
138
|
-
Object.setPrototypeOf(this, ServiceError.prototype);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Returns the http status code from err.
|
|
143
|
-
* If err isn't an instance of ServiceError, -1 is returned.
|
|
144
|
-
*/
|
|
145
|
-
static status(err: any): number {
|
|
146
|
-
if (err instanceof ServiceError) {
|
|
147
|
-
return err.status;
|
|
148
|
-
}
|
|
149
|
-
return -1;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Returns the service error code from err.
|
|
154
|
-
* If err isn't an instance of ServiceError, -1 is returned.
|
|
155
|
-
*/
|
|
156
|
-
static code(err: any): number {
|
|
157
|
-
if (err instanceof ServiceError) {
|
|
158
|
-
return err.code;
|
|
159
|
-
}
|
|
160
|
-
return -1;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Returns a promise that resolves to null if http status code
|
|
165
|
-
* or service error code matches one of the provided codes.
|
|
166
|
-
* If no codes are specified, all codes are ignored.
|
|
167
|
-
*/
|
|
168
|
-
static async ignore<T>(codes: number[], response: Promise<T>): Promise<T | null> {
|
|
169
|
-
try {
|
|
170
|
-
return await response;
|
|
171
|
-
} catch (err) {
|
|
172
|
-
if (err instanceof ServiceError) {
|
|
173
|
-
if (codes.length === 0) {
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
|
-
for (const code of codes) {
|
|
177
|
-
if (err.status === code || err.code === code) {
|
|
178
|
-
return null;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
throw err;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Returns a promise that resolves to either T or a ServiceError.
|
|
188
|
-
*/
|
|
189
|
-
static async combine<T>(codes: number[], response: Promise<T>): Promise<EitherResponse<T>> {
|
|
190
|
-
try {
|
|
191
|
-
const data = await response;
|
|
192
|
-
return { ok: true, data, err: null };
|
|
193
|
-
} catch (err) {
|
|
194
|
-
if (err instanceof ServiceError) {
|
|
195
|
-
if (codes.length === 0) {
|
|
196
|
-
return { ok: false, data: null, err }
|
|
197
|
-
}
|
|
198
|
-
for (const code of codes) {
|
|
199
|
-
if (err.status === code || err.code === code) {
|
|
200
|
-
return { ok: false, data: null, err };
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
throw err;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Constructs a ServiceError from the provided response data.
|
|
210
|
-
*/
|
|
211
|
-
static from_res(res: ResponseData): ServiceError {
|
|
212
|
-
let message = res.body;
|
|
213
|
-
let code = res.status;
|
|
214
|
-
if (res.err) {
|
|
215
|
-
// network error
|
|
216
|
-
if (res.err instanceof Error) {
|
|
217
|
-
message = res.err.message;
|
|
218
|
-
} else {
|
|
219
|
-
message = "Network Error";
|
|
220
|
-
}
|
|
221
|
-
code = 0;
|
|
222
|
-
} else {
|
|
223
|
-
try {
|
|
224
|
-
let data = JSON.parse(res.body);
|
|
225
|
-
if (data.code && (data.message || data.error)) {
|
|
226
|
-
code = data.code;
|
|
227
|
-
message = data.message || data.error;
|
|
228
|
-
}
|
|
229
|
-
} catch (_) {}
|
|
230
|
-
}
|
|
231
|
-
const err = new ServiceError(res.status, code, message);
|
|
232
|
-
// override the stack trace so that it doesn't include the from_res helper.
|
|
233
|
-
if (Error.captureStackTrace) {
|
|
234
|
-
Error.captureStackTrace(err, ServiceError.from_res);
|
|
235
|
-
}
|
|
236
|
-
return err;
|
|
237
|
-
}
|
|
238
11
|
}
|
|
239
12
|
|
|
240
|
-
/**
|
|
241
|
-
* BaseServiceClient contains the logic for executing http requests.
|
|
242
|
-
* This class is meant to be extended by the generated code.
|
|
243
|
-
*/
|
|
244
13
|
export abstract class BaseServiceClient {
|
|
245
14
|
private options: RequestOptions;
|
|
246
15
|
|
|
@@ -271,127 +40,45 @@ export abstract class BaseServiceClient {
|
|
|
271
40
|
return url;
|
|
272
41
|
}
|
|
273
42
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
* if one was configured.
|
|
277
|
-
*/
|
|
278
|
-
private async fetch(req: RequestData, options?: RequestOptions): Promise<ResponseData> {
|
|
279
|
-
if (options?.intercept) {
|
|
280
|
-
return options.intercept(req, this.fetch.bind(this));
|
|
281
|
-
}
|
|
282
|
-
try {
|
|
283
|
-
const res = await fetch(req.url, {
|
|
284
|
-
method: req.method,
|
|
285
|
-
body: req.body,
|
|
286
|
-
headers: req.headers,
|
|
287
|
-
});
|
|
288
|
-
return {
|
|
289
|
-
ok: res.ok,
|
|
290
|
-
status: res.status,
|
|
291
|
-
body: await res.text(),
|
|
292
|
-
};
|
|
293
|
-
} catch (err) {
|
|
294
|
-
return {
|
|
295
|
-
ok: false,
|
|
296
|
-
status: 0,
|
|
297
|
-
body: "",
|
|
298
|
-
err: err,
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Returns true if the status code represents a transient error
|
|
305
|
-
* or it's a network error.
|
|
306
|
-
*/
|
|
307
|
-
private should_retry(res: ResponseData): boolean {
|
|
308
|
-
if (res.err) {
|
|
309
|
-
return true;
|
|
310
|
-
}
|
|
311
|
-
switch (res.status) {
|
|
312
|
-
case 408: // timeout
|
|
313
|
-
case 413: // too large
|
|
314
|
-
case 429: // too many requests
|
|
315
|
-
case 500: // generic error response
|
|
316
|
-
case 502: // invalid upstream response
|
|
317
|
-
case 503: // service unavailable
|
|
318
|
-
case 504: // gateway timeout
|
|
319
|
-
case 522: // tcp connection timeout
|
|
320
|
-
return true;
|
|
321
|
-
default:
|
|
322
|
-
return false;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
/**
|
|
327
|
-
* Returns the merged options.
|
|
328
|
-
*/
|
|
329
|
-
private get_options(options: RequestOptions): RequestOptions {
|
|
330
|
-
return {
|
|
331
|
-
...this.options,
|
|
332
|
-
...options,
|
|
333
|
-
headers: {
|
|
334
|
-
...this.options.headers,
|
|
335
|
-
...options.headers,
|
|
336
|
-
}
|
|
337
|
-
};
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
/**
|
|
341
|
-
* A delegate to _request that wraps the response in a ResponsePromise.
|
|
342
|
-
*/
|
|
343
|
-
protected request(
|
|
344
|
-
service: string,
|
|
345
|
-
name: string,
|
|
346
|
-
method: string,
|
|
347
|
-
route: string,
|
|
348
|
-
body: any,
|
|
349
|
-
options: { query?: any } & RequestOptions = {}
|
|
350
|
-
): ResponsePromise<any> {
|
|
351
|
-
const promise = this._request(service, name, method, route, body, options);
|
|
352
|
-
return new ResponsePromise(promise);
|
|
43
|
+
private is_4xx(res: Response): boolean {
|
|
44
|
+
return 400 <= res.status && res.status < 500;
|
|
353
45
|
}
|
|
354
46
|
|
|
355
|
-
|
|
356
|
-
* The main logic for fulfilling a request as perscribed by
|
|
357
|
-
* the request options.
|
|
358
|
-
*/
|
|
359
|
-
private async _request(
|
|
360
|
-
service: string,
|
|
361
|
-
name: string,
|
|
47
|
+
protected async request(
|
|
362
48
|
method: string,
|
|
363
49
|
route: string,
|
|
364
50
|
body: any,
|
|
365
51
|
options: { query?: any } & RequestOptions = {}
|
|
366
52
|
): Promise<any> {
|
|
367
|
-
options = this.
|
|
53
|
+
options = { ...this.options, ...options };
|
|
368
54
|
const url = this.build_url(route, options, options.query ?? {});
|
|
369
|
-
const headers = Object.assign({
|
|
370
|
-
"User-Agent": "CDL/ServiceClient"
|
|
371
|
-
}, options.headers);
|
|
55
|
+
const headers = Object.assign({}, options.headers);
|
|
372
56
|
if (options.token) {
|
|
373
57
|
headers["Authorization"] = `Bearer ${options.token}`;
|
|
374
58
|
}
|
|
375
|
-
const req:
|
|
59
|
+
const req: RequestInit = {
|
|
60
|
+
method: method,
|
|
61
|
+
headers: headers,
|
|
62
|
+
};
|
|
376
63
|
if (body) {
|
|
377
64
|
req.body = JSON.stringify(body);
|
|
378
65
|
}
|
|
379
66
|
if (options.debug) {
|
|
380
67
|
console.log(`REQ(${method.toUpperCase()})`, url, JSON.stringify(req, null, 2));
|
|
381
68
|
}
|
|
382
|
-
const res = await
|
|
69
|
+
const res = await fetch(url, req);
|
|
383
70
|
if (!res.ok) {
|
|
384
|
-
const
|
|
71
|
+
const text = await res.text();
|
|
385
72
|
if (options.debug) {
|
|
386
|
-
console.log(`ERR(${res.status})`, url,
|
|
73
|
+
console.log(`ERR(${res.status})`, url, text);
|
|
387
74
|
}
|
|
388
|
-
if (typeof options.retry === "number" && options.retry > 0 && this.
|
|
75
|
+
if (typeof options.retry === "number" && options.retry > 0 && !this.is_4xx(res)) {
|
|
389
76
|
options.retry--;
|
|
390
|
-
return this.request(
|
|
77
|
+
return this.request(method, route, body, options);
|
|
391
78
|
}
|
|
392
|
-
throw
|
|
79
|
+
throw new Error(text);
|
|
393
80
|
}
|
|
394
|
-
const data = res.
|
|
81
|
+
const data = await res.json();
|
|
395
82
|
if (options.debug) {
|
|
396
83
|
console.log(`RES(${res.status})`, url, JSON.stringify(data, null, 2));
|
|
397
84
|
}
|