@compassdigital/sdk.typescript 3.0.0-beta.21 → 3.0.0-beta.4
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 +5 -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 +264 -503
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +242 -534
- 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} +18 -23
- 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 -11
- 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} +4 -243
- 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/{interface/shoppingcart.d.ts → shoppingcart.d.ts} +1 -10
- 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 -19
- 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 +6 -18
- 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/email.ts +4 -0
- package/src/{interface/file.ts → file.ts} +0 -2
- package/src/index.ts +503 -2219
- package/src/{interface/kds.ts → kds.ts} +0 -4
- package/src/{interface/location.ts → location.ts} +33 -41
- 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 -21
- package/src/{interface/partner.ts → partner.ts} +5 -291
- 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} +1 -14
- package/src/{interface/task.ts → task.ts} +0 -2
- package/src/{interface/user.ts → user.ts} +1 -34
- 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 +0 -21
- 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/email.ts +0 -30
- 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/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/task.d.ts → task.d.ts} +0 -0
- /package/lib/{interface/vote.d.ts → vote.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -2,152 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
Compass Digital Labs TypeScript SDK
|
|
4
4
|
|
|
5
|
-
## Install
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
$ npm install --save @compassdigital/sdk.typescript@latest
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Example Server Usage
|
|
12
|
-
|
|
13
|
-
``` typescript
|
|
14
|
-
import Provider from "@compassdigital/provider";
|
|
15
|
-
import { GetTaskRequest, GetTaskResponse } from "@compassdigital/sdk.typescript/interface/task";
|
|
16
|
-
|
|
17
|
-
const provider = new Provider({ type: "payment" });
|
|
18
|
-
|
|
19
|
-
provider.on<GetTaskRequest, GetTaskResponse>("get_task", function (req, next): void {
|
|
20
|
-
// ...
|
|
21
|
-
})
|
|
22
|
-
```
|
|
23
|
-
|
|
24
5
|
## Example Client Usage
|
|
25
6
|
|
|
26
|
-
**Instanciate Client:**
|
|
27
7
|
|
|
28
8
|
``` typescript
|
|
29
9
|
import { ServiceClient } from "@compassdigital/sdk.typescript";
|
|
30
10
|
|
|
31
11
|
const api = new ServiceClient({ stage: "dev" });
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
**Basic Request:**
|
|
35
|
-
|
|
36
|
-
``` typescript
|
|
37
|
-
const task = await api.get_task(id);
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
**Request Options:**
|
|
41
|
-
|
|
42
|
-
* These options may be passed to any request.
|
|
43
12
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// environment to make requests to
|
|
47
|
-
stage?: string;
|
|
48
|
-
// authentication token
|
|
49
|
-
token?: string;
|
|
50
|
-
// additional headers
|
|
51
|
-
headers?: Record<string, string>;
|
|
52
|
-
// log all requests and responses
|
|
53
|
-
debug?: boolean;
|
|
54
|
-
// the number of times to retry a request
|
|
55
|
-
retry?: number;
|
|
56
|
-
// make requests against this base url
|
|
57
|
-
// note: the stage property is ignored if base_url is set
|
|
58
|
-
base_url?: string;
|
|
59
|
-
// intercept outgoing http requests
|
|
60
|
-
intercept?: InterceptFn;
|
|
13
|
+
async function main() {
|
|
14
|
+
const task = await api.get_task(task_id);
|
|
61
15
|
}
|
|
62
16
|
```
|
|
63
17
|
|
|
64
|
-
|
|
65
|
-
* The options provided at the call site will overide options passed to the constructor.
|
|
18
|
+
## Example Server Usage
|
|
66
19
|
|
|
67
20
|
``` typescript
|
|
21
|
+
import { PostPaymentTokenRequest, PostPaymentTokenResponse } from "@compassdigital/sdk.typescript/payment";
|
|
22
|
+
import { Provider } from "@compassdigital/provider";
|
|
23
|
+
import { NextFn } from "@compassdigital/provider/interface"
|
|
68
24
|
|
|
69
|
-
const
|
|
70
|
-
token: "<token>",
|
|
71
|
-
retry: 2,
|
|
72
|
-
})
|
|
25
|
+
const provider = new Provider({ type: "payment" });
|
|
73
26
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
retry: 2,
|
|
27
|
+
provider.on("post_payment_token", function (req: PostPaymentTokenRequest, next: NextFn<PostPaymentTokenResponse>): void {
|
|
28
|
+
// ...
|
|
77
29
|
})
|
|
78
30
|
```
|
|
79
31
|
|
|
80
|
-
**Error Handling:**
|
|
81
|
-
|
|
82
|
-
* non-200 responses are rejected with a `ServiceError`.
|
|
83
|
-
|
|
84
|
-
``` typescript
|
|
85
|
-
try {
|
|
86
|
-
const shoppingcart = await api.get_shoppingcart(id);
|
|
87
|
-
} catch (err) {
|
|
88
|
-
// Since the error type is `unknown` we must type assert before
|
|
89
|
-
// accessing the properties.
|
|
90
|
-
if (err instanceof ServiceError) {
|
|
91
|
-
console.log(err.status, err.code, err.message);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// There are helpers for accessing the status and code
|
|
95
|
-
if (ServiceError.code(err) === 400.31) {
|
|
96
|
-
console.log("Failed to get menu");
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
* There is a `ignore` convenience method for ignoring specific status & error codes.
|
|
102
|
-
|
|
103
|
-
``` typescript
|
|
104
|
-
const issue: OrderIssue = { items: [] };
|
|
105
|
-
await api.post_order_issue(id, issue).ignore(400.18, 400.21);
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
* There is a `combine` convenience method for returning an object which contains the response or error.
|
|
109
|
-
|
|
110
|
-
``` typescript
|
|
111
|
-
const res = await api.get_task(id).combine();
|
|
112
|
-
|
|
113
|
-
if (res.ok) {
|
|
114
|
-
console.log("task", res.data);
|
|
115
|
-
} else {
|
|
116
|
-
console.log("error", res.err);
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
**Testing:**
|
|
121
|
-
|
|
122
|
-
* You can register an `intercept` function which will recieve all request.
|
|
123
|
-
|
|
124
|
-
``` typescript
|
|
125
|
-
|
|
126
|
-
import {
|
|
127
|
-
ServiceClient,
|
|
128
|
-
RequestData,
|
|
129
|
-
ResponseData,
|
|
130
|
-
FetchFn,
|
|
131
|
-
} from "@compassdigital/sdk.typescript";
|
|
132
|
-
|
|
133
|
-
async function intercept(req: RequestData, fetch: FetchFn): Promise<ResponseData> {
|
|
134
|
-
expect(req.name).toBe("get_shoppingcart");
|
|
135
|
-
return { ok: true, status: 200, body: JSON.stringify({}) }
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const api = new ServiceClient({ intercept });
|
|
139
|
-
```
|
|
140
|
-
|
|
141
32
|
## Code Gen
|
|
142
33
|
|
|
143
34
|
1. Add new services to `manifest.json`.
|
|
144
35
|
2. Run `npm run gen`.
|
|
145
36
|
|
|
146
|
-
## Ad-Hoc Code Gen
|
|
147
|
-
|
|
148
|
-
If you need types for a service you're working on and the sdk hasn't been updated yet, then
|
|
149
|
-
you can generate local types from your swagger.
|
|
150
|
-
|
|
151
|
-
```
|
|
152
|
-
$ sdk.typescript --swagger ./swagger.json --service my_service > types/my_service.d.ts
|
|
153
|
-
```
|
package/gen.ts
CHANGED
|
@@ -12,8 +12,6 @@ import {
|
|
|
12
12
|
import prettier from "prettier";
|
|
13
13
|
import path from "path";
|
|
14
14
|
import ejs from "ejs";
|
|
15
|
-
import yargs from "yargs/yargs";
|
|
16
|
-
import { hideBin } from "yargs/helpers";
|
|
17
15
|
|
|
18
16
|
interface Manifest {
|
|
19
17
|
services: ManifestService[];
|
|
@@ -22,6 +20,7 @@ interface Manifest {
|
|
|
22
20
|
interface ManifestService {
|
|
23
21
|
name: string; // service name
|
|
24
22
|
swagger: string; // swagger url or file
|
|
23
|
+
output: string; // typescript output file
|
|
25
24
|
}
|
|
26
25
|
|
|
27
26
|
interface ClientImport {
|
|
@@ -62,35 +61,29 @@ const operationIDs : Record<string, string> = {
|
|
|
62
61
|
"get /promo": "get_promos",
|
|
63
62
|
"get /schedule": "get_schedules",
|
|
64
63
|
"get /brand": "get_brands",
|
|
65
|
-
"get /announcement/resource": "get_resources"
|
|
66
|
-
"get /order/location/brand/{id}": "get_order_location_brand",
|
|
64
|
+
"get /announcement/resource": "get_resources"
|
|
67
65
|
};
|
|
68
66
|
|
|
69
|
-
|
|
67
|
+
class CodeGenerator {
|
|
70
68
|
|
|
71
69
|
private imports: ClientImport[] = [];
|
|
72
70
|
private methods: ClientMethod[] = [];
|
|
73
71
|
|
|
74
|
-
async
|
|
72
|
+
async generate(manifest: Manifest): Promise<void> {
|
|
75
73
|
// generate service types
|
|
76
|
-
await fs.promises.mkdir(path.join("src", "interface"), { recursive: true });
|
|
77
74
|
for (const service of manifest.services) {
|
|
75
|
+
const print = new Printer();
|
|
78
76
|
console.log(`reading: ${service.swagger}`);
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
|
|
77
|
+
const doc = await load(service.swagger);
|
|
78
|
+
const details = analyse(doc);
|
|
79
|
+
this.transform(details, print, service);
|
|
80
|
+
const code = prettier.format(print.code(), { parser: "typescript", printWidth: 100 });
|
|
81
|
+
console.log(`writing: ${service.output}`);
|
|
82
|
+
fs.mkdirSync(path.dirname(service.output), { recursive: true });
|
|
83
|
+
fs.writeFileSync(service.output, code);
|
|
82
84
|
}
|
|
83
85
|
// generate client
|
|
84
|
-
const code = await this.client();
|
|
85
|
-
const filename = path.join("src", "index.ts");
|
|
86
|
-
await fs.promises.writeFile(filename, code);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async client(): Promise<string> {
|
|
90
86
|
const print = new Printer();
|
|
91
|
-
// "do not modify" warning
|
|
92
|
-
print.comment("THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY");
|
|
93
|
-
print.blank();
|
|
94
87
|
// client imports
|
|
95
88
|
const imports: Record<string, string[]> = {};
|
|
96
89
|
for (const _import of this.imports) {
|
|
@@ -104,15 +97,8 @@ export class CodeGenerator {
|
|
|
104
97
|
// client methods
|
|
105
98
|
const template = fs.readFileSync("template.ejs", "utf-8");
|
|
106
99
|
print.raw(ejs.render(template, { methods: this.methods }));
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
async service(service: ManifestService, ambient: boolean): Promise<string> {
|
|
111
|
-
const print = new Printer();
|
|
112
|
-
const doc = await load(service.swagger);
|
|
113
|
-
const details = analyse(doc);
|
|
114
|
-
this.transform(details, print, service, ambient);
|
|
115
|
-
return prettier.format(print.code(), { parser: "typescript", printWidth: 100 });
|
|
100
|
+
const code = prettier.format(print.code(), { parser: "typescript", printWidth: 100 });
|
|
101
|
+
fs.writeFileSync("src/index.ts", code);
|
|
116
102
|
}
|
|
117
103
|
|
|
118
104
|
/**
|
|
@@ -121,21 +107,14 @@ export class CodeGenerator {
|
|
|
121
107
|
private addImport(service: ManifestService, name: string): void {
|
|
122
108
|
this.imports.push({
|
|
123
109
|
name,
|
|
124
|
-
path:
|
|
110
|
+
path: `./${service.name}`,
|
|
125
111
|
});
|
|
126
112
|
}
|
|
127
113
|
|
|
128
114
|
/**
|
|
129
115
|
* Generate typescript code from the document details.
|
|
130
116
|
*/
|
|
131
|
-
private transform(doc: DocumentDetails, print: Printer, service: ManifestService
|
|
132
|
-
// "do not modify" warning
|
|
133
|
-
print.comment("THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY");
|
|
134
|
-
print.blank();
|
|
135
|
-
// declaration if it's ambient
|
|
136
|
-
if (ambient) {
|
|
137
|
-
print.raw(`declare module "@compassdigital/sdk.typescript/interface/${service.name}" {`);
|
|
138
|
-
}
|
|
117
|
+
private transform(doc: DocumentDetails, print: Printer, service: ManifestService): void {
|
|
139
118
|
// definitions
|
|
140
119
|
for (const [name, schema] of Object.entries(doc.definitions)) {
|
|
141
120
|
print.schema(schema, name);
|
|
@@ -216,7 +195,7 @@ export class CodeGenerator {
|
|
|
216
195
|
comment: comment,
|
|
217
196
|
name: name.snake,
|
|
218
197
|
params:[],
|
|
219
|
-
args: [`"${
|
|
198
|
+
args: [`"${op.method}"`],
|
|
220
199
|
response: responseT,
|
|
221
200
|
}
|
|
222
201
|
// turn the path into a template string and add the
|
|
@@ -265,17 +244,13 @@ export class CodeGenerator {
|
|
|
265
244
|
method.args.push("options");
|
|
266
245
|
this.methods.push(method);
|
|
267
246
|
}
|
|
268
|
-
// close declaration
|
|
269
|
-
if (ambient) {
|
|
270
|
-
print.raw(`}`);
|
|
271
|
-
}
|
|
272
247
|
}
|
|
273
248
|
|
|
274
249
|
/**
|
|
275
250
|
* Infer the operation name from the method and parameter.
|
|
276
251
|
* These are a bunch of dirty hacks to make the generated names consistent.
|
|
277
252
|
*/
|
|
278
|
-
inferName(op: OperationDetails, service: ManifestService): OperationName {
|
|
253
|
+
private inferName(op: OperationDetails, service: ManifestService): OperationName {
|
|
279
254
|
let { method, path } = op;
|
|
280
255
|
let path_segments: string[] = [];
|
|
281
256
|
// use the operationId from our collection if we have one.
|
|
@@ -363,6 +338,25 @@ export class CodeGenerator {
|
|
|
363
338
|
}
|
|
364
339
|
return request;
|
|
365
340
|
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Create the type for the client method parameter.
|
|
344
|
+
*/
|
|
345
|
+
private toOptionsSchema(name: OperationName, details: OperationDetails): Schema {
|
|
346
|
+
const options = new Schema("empty");
|
|
347
|
+
if (!details.params.query.isEmpty()) {
|
|
348
|
+
const query = new Schema(`${name.pascal}Query`);
|
|
349
|
+
if (details.params.query.hasRequired()) {
|
|
350
|
+
query.required = true;
|
|
351
|
+
}
|
|
352
|
+
options.setProperty("query", query);
|
|
353
|
+
}
|
|
354
|
+
if (options.hasRequired()) {
|
|
355
|
+
options.required = true;
|
|
356
|
+
}
|
|
357
|
+
options.merge(new Schema("RequestOptions"));
|
|
358
|
+
return options;
|
|
359
|
+
}
|
|
366
360
|
}
|
|
367
361
|
|
|
368
362
|
|
|
@@ -371,48 +365,9 @@ export class CodeGenerator {
|
|
|
371
365
|
* Main entry point.
|
|
372
366
|
*/
|
|
373
367
|
async function main() {
|
|
374
|
-
const
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
description: "manifest.json file to generate sdk from",
|
|
378
|
-
})
|
|
379
|
-
.options("swagger", {
|
|
380
|
-
type: "string",
|
|
381
|
-
description: "swagger.json file to generate interfaces from",
|
|
382
|
-
})
|
|
383
|
-
.options("service", {
|
|
384
|
-
type: "string",
|
|
385
|
-
description: "service name for generated interfaces",
|
|
386
|
-
})
|
|
387
|
-
.options("ambient", {
|
|
388
|
-
type: "boolean",
|
|
389
|
-
description: "wrap the types in a declare module directive",
|
|
390
|
-
default: true,
|
|
391
|
-
})
|
|
392
|
-
// generate sdk from manifest
|
|
393
|
-
if (argv.manifest) {
|
|
394
|
-
const data = await fs.promises.readFile(argv.manifest, "utf-8");
|
|
395
|
-
const manifest: Manifest = JSON.parse(data);
|
|
396
|
-
const gen = new CodeGenerator();
|
|
397
|
-
await gen.manifest(manifest);
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
// generate interfaces for a single swagger.json
|
|
401
|
-
if (argv.swagger || argv.service) {
|
|
402
|
-
if (!argv.swagger) {
|
|
403
|
-
throw new Error(`--swagger must be provided with --service`);
|
|
404
|
-
}
|
|
405
|
-
if (!argv.service) {
|
|
406
|
-
throw new Error(`--service must be provided with --swagger`);
|
|
407
|
-
}
|
|
408
|
-
const gen = new CodeGenerator();
|
|
409
|
-
const code = await gen.service({
|
|
410
|
-
name: argv.service,
|
|
411
|
-
swagger: argv.swagger,
|
|
412
|
-
}, argv.ambient);
|
|
413
|
-
console.log(code);
|
|
414
|
-
return;
|
|
415
|
-
}
|
|
368
|
+
const manifest: Manifest = JSON.parse(await fs.promises.readFile("manifest.json", "utf-8"));
|
|
369
|
+
const gen = new CodeGenerator();
|
|
370
|
+
await gen.generate(manifest);
|
|
416
371
|
}
|
|
417
372
|
|
|
418
|
-
main()
|
|
373
|
+
main();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announcement.d.ts","sourceRoot":"","sources":["../src/announcement.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAE3B,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,IAAI,CAAC,EAAE;QACL,EAAE,CAAC,EAAE,iBAAiB,CAAC;QACvB,EAAE,CAAC,EAAE,iBAAiB,CAAC;KACxB,CAAC;IACF,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,oBAAY,oBAAoB,GAAG,YAAY,CAAC;AAEhD,oBAAY,wBAAwB,GAAG,YAAY,CAAC;AAEpD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,oBAAoB,CAAC;CAC5B;AAID,MAAM,WAAW,2BAA2B;IAE1C,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,4BAA4B;IAE3C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,oBAAY,+BAA+B,GAAG,aAAa,CAAC;AAE5D,MAAM,WAAW,8BACf,SAAQ,4BAA4B,EAClC,2BAA2B;CAAG;AAIlC,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,oBAAY,gCAAgC,GAAG,aAAa,CAAC;AAE7D,MAAM,WAAW,+BAAgC,SAAQ,6BAA6B;CAAG;AAIzF,MAAM,WAAW,mBAAmB;IAElC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,oBAAY,uBAAuB,GAAG,YAAY,CAAC;AAEnD,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;CAAG;AAItE,MAAM,WAAW,mBAAmB;IAElC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,oBAAY,mBAAmB,GAAG,YAAY,CAAC;AAE/C,oBAAY,uBAAuB,GAAG,YAAY,CAAC;AAEnD,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,IAAI,EAAE,mBAAmB,CAAC;CAC3B;AAID,MAAM,WAAW,sBAAsB;IAErC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,oBAAY,0BAA0B,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,yBAA0B,SAAQ,sBAAsB;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announcement.js","sourceRoot":"","sources":["../src/announcement.ts"],"names":[],"mappings":""}
|
package/lib/base.d.ts
CHANGED
|
@@ -1,127 +1,11 @@
|
|
|
1
1
|
export interface RequestOptions {
|
|
2
2
|
stage?: string;
|
|
3
|
-
token?: string;
|
|
4
3
|
headers?: Record<string, string>;
|
|
4
|
+
token?: string;
|
|
5
5
|
debug?: boolean;
|
|
6
6
|
retry?: number;
|
|
7
7
|
base_url?: string;
|
|
8
|
-
intercept?: InterceptFn;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* The request data provided to intercept
|
|
12
|
-
* functions.
|
|
13
|
-
*/
|
|
14
|
-
export interface RequestData {
|
|
15
|
-
name: string;
|
|
16
|
-
service: string;
|
|
17
|
-
url: string;
|
|
18
|
-
method: string;
|
|
19
|
-
headers: Record<string, string>;
|
|
20
|
-
body?: string;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* The response data expected from
|
|
24
|
-
* intercept functions.
|
|
25
|
-
*/
|
|
26
|
-
export interface ResponseData {
|
|
27
|
-
ok: boolean;
|
|
28
|
-
status: number;
|
|
29
|
-
body: string;
|
|
30
|
-
err?: any;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* A function that performs an https request.
|
|
34
|
-
*/
|
|
35
|
-
export declare type FetchFn = (req: RequestData) => Promise<ResponseData>;
|
|
36
|
-
/**
|
|
37
|
-
* A function that intercepts an http request and returns a response.
|
|
38
|
-
*/
|
|
39
|
-
export declare type InterceptFn = (req: RequestData, fetch: FetchFn) => Promise<ResponseData>;
|
|
40
|
-
/**
|
|
41
|
-
* We have to re-implement the promise methods instead of just existing
|
|
42
|
-
* the existing Promise class due to: https://github.com/microsoft/TypeScript/issues/15202
|
|
43
|
-
*/
|
|
44
|
-
export declare class ResponsePromise<T> implements Promise<T> {
|
|
45
|
-
private promise;
|
|
46
|
-
/**
|
|
47
|
-
* Implements Promise interface.
|
|
48
|
-
*/
|
|
49
|
-
[Symbol.toStringTag]: string;
|
|
50
|
-
constructor(promise: Promise<T>);
|
|
51
|
-
/**
|
|
52
|
-
* Implements Promise interface.
|
|
53
|
-
*/
|
|
54
|
-
then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null): ResponsePromise<TResult1 | TResult2>;
|
|
55
|
-
/**
|
|
56
|
-
* Implements Promise interface.
|
|
57
|
-
*/
|
|
58
|
-
catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null): ResponsePromise<T | TResult>;
|
|
59
|
-
/**
|
|
60
|
-
* Implements Promise interface.
|
|
61
|
-
*/
|
|
62
|
-
finally(onfinally?: (() => void) | null): ResponsePromise<T>;
|
|
63
|
-
/**
|
|
64
|
-
* Returns a promise that resolves to null if http status code
|
|
65
|
-
* or service error code matches one of the provided codes.
|
|
66
|
-
* If no codes are specified, all codes are ignored.
|
|
67
|
-
*/
|
|
68
|
-
ignore(...codes: number[]): ResponsePromise<T | null>;
|
|
69
|
-
/**
|
|
70
|
-
* Returns a promise that resolves to either the response body
|
|
71
|
-
* or a ServiceError.
|
|
72
|
-
*/
|
|
73
|
-
combine(...codes: number[]): Promise<EitherResponse<T>>;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Either a response body or a service error.
|
|
77
|
-
*/
|
|
78
|
-
export declare type EitherResponse<T> = {
|
|
79
|
-
ok: true;
|
|
80
|
-
data: T;
|
|
81
|
-
err: null;
|
|
82
|
-
} | {
|
|
83
|
-
ok: false;
|
|
84
|
-
data: null;
|
|
85
|
-
err: ServiceError;
|
|
86
|
-
};
|
|
87
|
-
/**
|
|
88
|
-
* An error returned from an api service.
|
|
89
|
-
*/
|
|
90
|
-
export declare class ServiceError extends Error {
|
|
91
|
-
status: number;
|
|
92
|
-
code: number;
|
|
93
|
-
constructor(status: number, // http status
|
|
94
|
-
code: number, // service error code
|
|
95
|
-
message: string);
|
|
96
|
-
/**
|
|
97
|
-
* Returns the http status code from err.
|
|
98
|
-
* If err isn't an instance of ServiceError, -1 is returned.
|
|
99
|
-
*/
|
|
100
|
-
static status(err: any): number;
|
|
101
|
-
/**
|
|
102
|
-
* Returns the service error code from err.
|
|
103
|
-
* If err isn't an instance of ServiceError, -1 is returned.
|
|
104
|
-
*/
|
|
105
|
-
static code(err: any): number;
|
|
106
|
-
/**
|
|
107
|
-
* Returns a promise that resolves to null if http status code
|
|
108
|
-
* or service error code matches one of the provided codes.
|
|
109
|
-
* If no codes are specified, all codes are ignored.
|
|
110
|
-
*/
|
|
111
|
-
static ignore<T>(codes: number[], response: Promise<T>): Promise<T | null>;
|
|
112
|
-
/**
|
|
113
|
-
* Returns a promise that resolves to either T or a ServiceError.
|
|
114
|
-
*/
|
|
115
|
-
static combine<T>(codes: number[], response: Promise<T>): Promise<EitherResponse<T>>;
|
|
116
|
-
/**
|
|
117
|
-
* Constructs a ServiceError from the provided response data.
|
|
118
|
-
*/
|
|
119
|
-
static from_res(res: ResponseData): ServiceError;
|
|
120
8
|
}
|
|
121
|
-
/**
|
|
122
|
-
* BaseServiceClient contains the logic for executing http requests.
|
|
123
|
-
* This class is meant to be extended by the generated code.
|
|
124
|
-
*/
|
|
125
9
|
export declare abstract class BaseServiceClient {
|
|
126
10
|
private options;
|
|
127
11
|
constructor(options?: RequestOptions);
|
|
@@ -129,30 +13,9 @@ export declare abstract class BaseServiceClient {
|
|
|
129
13
|
* Combine the route and query parameters into a full url.
|
|
130
14
|
*/
|
|
131
15
|
private build_url;
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
* if one was configured.
|
|
135
|
-
*/
|
|
136
|
-
private fetch;
|
|
137
|
-
/**
|
|
138
|
-
* Returns true if the status code represents a transient error
|
|
139
|
-
* or it's a network error.
|
|
140
|
-
*/
|
|
141
|
-
private should_retry;
|
|
142
|
-
/**
|
|
143
|
-
* Returns the merged options.
|
|
144
|
-
*/
|
|
145
|
-
private get_options;
|
|
146
|
-
/**
|
|
147
|
-
* A delegate to _request that wraps the response in a ResponsePromise.
|
|
148
|
-
*/
|
|
149
|
-
protected request(service: string, name: string, method: string, route: string, body: any, options?: {
|
|
16
|
+
private is_4xx;
|
|
17
|
+
protected request(method: string, route: string, body: any, options?: {
|
|
150
18
|
query?: any;
|
|
151
|
-
} & RequestOptions):
|
|
152
|
-
/**
|
|
153
|
-
* The main logic for fulfilling a request as perscribed by
|
|
154
|
-
* the request options.
|
|
155
|
-
*/
|
|
156
|
-
private _request;
|
|
19
|
+
} & RequestOptions): Promise<any>;
|
|
157
20
|
}
|
|
158
21
|
//# sourceMappingURL=base.d.ts.map
|
package/lib/base.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,8BAAsB,iBAAiB;IACrC,OAAO,CAAC,OAAO,CAAiB;gBAEpB,OAAO,CAAC,EAAE,cAAc;IAIpC;;OAEG;IACH,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,MAAM;cAIE,OAAO,CACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,GAAG,EACT,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,GAAG,CAAA;KAAE,GAAG,cAAmB,GAC7C,OAAO,CAAC,GAAG,CAAC;CAmChB"}
|