@compassdigital/sdk.typescript 3.0.0-beta.8 → 3.0.0-rc.1

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.
Files changed (226) hide show
  1. package/README.md +121 -8
  2. package/bin/gen.js +484 -0
  3. package/bin/index.js +3 -0
  4. package/gen.ts +99 -41
  5. package/lib/base.d.ts +134 -9
  6. package/lib/base.d.ts.map +1 -1
  7. package/lib/base.js +293 -48
  8. package/lib/base.js.map +1 -1
  9. package/lib/index.d.ts +592 -337
  10. package/lib/index.d.ts.map +1 -1
  11. package/lib/index.js +544 -245
  12. package/lib/index.js.map +1 -1
  13. package/lib/interface/announcement.d.ts.map +1 -0
  14. package/lib/interface/announcement.js +4 -0
  15. package/lib/interface/announcement.js.map +1 -0
  16. package/lib/interface/brand.d.ts.map +1 -0
  17. package/lib/interface/brand.js +4 -0
  18. package/lib/interface/brand.js.map +1 -0
  19. package/lib/{calendar.d.ts → interface/calendar.d.ts} +4 -1
  20. package/lib/interface/calendar.d.ts.map +1 -0
  21. package/lib/interface/calendar.js +4 -0
  22. package/lib/interface/calendar.js.map +1 -0
  23. package/lib/interface/config.d.ts.map +1 -0
  24. package/lib/interface/config.js +4 -0
  25. package/lib/interface/config.js.map +1 -0
  26. package/lib/interface/datalake.d.ts.map +1 -0
  27. package/lib/interface/datalake.js +4 -0
  28. package/lib/interface/datalake.js.map +1 -0
  29. package/lib/interface/delivery.d.ts.map +1 -0
  30. package/lib/interface/delivery.js +4 -0
  31. package/lib/interface/delivery.js.map +1 -0
  32. package/lib/interface/dh.d.ts.map +1 -0
  33. package/lib/interface/dh.js +4 -0
  34. package/lib/interface/dh.js.map +1 -0
  35. package/lib/interface/email.d.ts +21 -0
  36. package/lib/interface/email.d.ts.map +1 -0
  37. package/lib/interface/email.js +4 -0
  38. package/lib/interface/email.js.map +1 -0
  39. package/lib/interface/file.d.ts.map +1 -0
  40. package/lib/interface/file.js +4 -0
  41. package/lib/interface/file.js.map +1 -0
  42. package/lib/{kds.d.ts → interface/kds.d.ts} +1 -0
  43. package/lib/interface/kds.d.ts.map +1 -0
  44. package/lib/interface/kds.js +4 -0
  45. package/lib/interface/kds.js.map +1 -0
  46. package/lib/{location.d.ts → interface/location.d.ts} +50 -20
  47. package/lib/interface/location.d.ts.map +1 -0
  48. package/lib/interface/location.js +4 -0
  49. package/lib/interface/location.js.map +1 -0
  50. package/lib/interface/logger.d.ts.map +1 -0
  51. package/lib/interface/logger.js +4 -0
  52. package/lib/interface/logger.js.map +1 -0
  53. package/lib/interface/loyalty.d.ts.map +1 -0
  54. package/lib/interface/loyalty.js +4 -0
  55. package/lib/interface/loyalty.js.map +1 -0
  56. package/lib/interface/mealplan.d.ts.map +1 -0
  57. package/lib/interface/mealplan.js +4 -0
  58. package/lib/interface/mealplan.js.map +1 -0
  59. package/lib/interface/menu.d.ts +448 -0
  60. package/lib/interface/menu.d.ts.map +1 -0
  61. package/lib/interface/menu.js +4 -0
  62. package/lib/interface/menu.js.map +1 -0
  63. package/lib/interface/message.d.ts.map +1 -0
  64. package/lib/interface/message.js +4 -0
  65. package/lib/interface/message.js.map +1 -0
  66. package/lib/{order.d.ts → interface/order.d.ts} +11 -4
  67. package/lib/interface/order.d.ts.map +1 -0
  68. package/lib/interface/order.js +4 -0
  69. package/lib/interface/order.js.map +1 -0
  70. package/lib/{partner.d.ts → interface/partner.d.ts} +243 -4
  71. package/lib/interface/partner.d.ts.map +1 -0
  72. package/lib/interface/partner.js +4 -0
  73. package/lib/interface/partner.js.map +1 -0
  74. package/lib/{payment.d.ts → interface/payment.d.ts} +1 -0
  75. package/lib/interface/payment.d.ts.map +1 -0
  76. package/lib/interface/payment.js +4 -0
  77. package/lib/interface/payment.js.map +1 -0
  78. package/lib/{promo.d.ts → interface/promo.d.ts} +1 -0
  79. package/lib/interface/promo.d.ts.map +1 -0
  80. package/lib/interface/promo.js +4 -0
  81. package/lib/interface/promo.js.map +1 -0
  82. package/lib/{report.d.ts → interface/report.d.ts} +2 -0
  83. package/lib/interface/report.d.ts.map +1 -0
  84. package/lib/interface/report.js +4 -0
  85. package/lib/interface/report.js.map +1 -0
  86. package/lib/interface/schedule.d.ts.map +1 -0
  87. package/lib/interface/schedule.js +4 -0
  88. package/lib/interface/schedule.js.map +1 -0
  89. package/lib/{shoppingcart.d.ts → interface/shoppingcart.d.ts} +10 -1
  90. package/lib/interface/shoppingcart.d.ts.map +1 -0
  91. package/lib/interface/shoppingcart.js +4 -0
  92. package/lib/interface/shoppingcart.js.map +1 -0
  93. package/lib/interface/task.d.ts.map +1 -0
  94. package/lib/interface/task.js +4 -0
  95. package/lib/interface/task.js.map +1 -0
  96. package/lib/{user.d.ts → interface/user.d.ts} +19 -0
  97. package/lib/interface/user.d.ts.map +1 -0
  98. package/lib/interface/user.js +4 -0
  99. package/lib/interface/user.js.map +1 -0
  100. package/lib/interface/vote.d.ts.map +1 -0
  101. package/lib/interface/vote.js +4 -0
  102. package/lib/interface/vote.js.map +1 -0
  103. package/manifest.json +4 -0
  104. package/package.json +15 -5
  105. package/src/base.ts +315 -35
  106. package/src/index.ts +2630 -988
  107. package/src/{announcement.ts → interface/announcement.ts} +2 -0
  108. package/src/{brand.ts → interface/brand.ts} +2 -0
  109. package/src/{calendar.ts → interface/calendar.ts} +7 -1
  110. package/src/{config.ts → interface/config.ts} +2 -0
  111. package/src/{datalake.ts → interface/datalake.ts} +2 -0
  112. package/src/{delivery.ts → interface/delivery.ts} +2 -0
  113. package/src/{dh.ts → interface/dh.ts} +2 -0
  114. package/src/interface/email.ts +30 -0
  115. package/src/{file.ts → interface/file.ts} +2 -0
  116. package/src/{kds.ts → interface/kds.ts} +4 -0
  117. package/src/{location.ts → interface/location.ts} +76 -35
  118. package/src/{logger.ts → interface/logger.ts} +2 -0
  119. package/src/{loyalty.ts → interface/loyalty.ts} +2 -0
  120. package/src/{mealplan.ts → interface/mealplan.ts} +2 -0
  121. package/src/interface/menu.ts +649 -0
  122. package/src/{message.ts → interface/message.ts} +2 -0
  123. package/src/{order.ts → interface/order.ts} +21 -6
  124. package/src/{partner.ts → interface/partner.ts} +291 -5
  125. package/src/{payment.ts → interface/payment.ts} +4 -0
  126. package/src/{promo.ts → interface/promo.ts} +3 -0
  127. package/src/{report.ts → interface/report.ts} +4 -0
  128. package/src/{schedule.ts → interface/schedule.ts} +2 -0
  129. package/src/{shoppingcart.ts → interface/shoppingcart.ts} +14 -1
  130. package/src/{task.ts → interface/task.ts} +2 -0
  131. package/src/{user.ts → interface/user.ts} +34 -1
  132. package/src/{vote.ts → interface/vote.ts} +2 -0
  133. package/template.ejs +3 -3
  134. package/test/client.test.ts +192 -0
  135. package/test/gen.test.ts +22 -0
  136. package/lib/announcement.d.ts.map +0 -1
  137. package/lib/announcement.js +0 -3
  138. package/lib/announcement.js.map +0 -1
  139. package/lib/brand.d.ts.map +0 -1
  140. package/lib/brand.js +0 -3
  141. package/lib/brand.js.map +0 -1
  142. package/lib/calendar.d.ts.map +0 -1
  143. package/lib/calendar.js +0 -3
  144. package/lib/calendar.js.map +0 -1
  145. package/lib/config.d.ts.map +0 -1
  146. package/lib/config.js +0 -3
  147. package/lib/config.js.map +0 -1
  148. package/lib/datalake.d.ts.map +0 -1
  149. package/lib/datalake.js +0 -3
  150. package/lib/datalake.js.map +0 -1
  151. package/lib/delivery.d.ts.map +0 -1
  152. package/lib/delivery.js +0 -3
  153. package/lib/delivery.js.map +0 -1
  154. package/lib/dh.d.ts.map +0 -1
  155. package/lib/dh.js +0 -3
  156. package/lib/dh.js.map +0 -1
  157. package/lib/email.d.ts +0 -5
  158. package/lib/email.d.ts.map +0 -1
  159. package/lib/email.js +0 -3
  160. package/lib/email.js.map +0 -1
  161. package/lib/file.d.ts.map +0 -1
  162. package/lib/file.js +0 -3
  163. package/lib/file.js.map +0 -1
  164. package/lib/kds.d.ts.map +0 -1
  165. package/lib/kds.js +0 -3
  166. package/lib/kds.js.map +0 -1
  167. package/lib/location.d.ts.map +0 -1
  168. package/lib/location.js +0 -3
  169. package/lib/location.js.map +0 -1
  170. package/lib/logger.d.ts.map +0 -1
  171. package/lib/logger.js +0 -3
  172. package/lib/logger.js.map +0 -1
  173. package/lib/loyalty.d.ts.map +0 -1
  174. package/lib/loyalty.js +0 -3
  175. package/lib/loyalty.js.map +0 -1
  176. package/lib/mealplan.d.ts.map +0 -1
  177. package/lib/mealplan.js +0 -3
  178. package/lib/mealplan.js.map +0 -1
  179. package/lib/message.d.ts.map +0 -1
  180. package/lib/message.js +0 -3
  181. package/lib/message.js.map +0 -1
  182. package/lib/order.d.ts.map +0 -1
  183. package/lib/order.js +0 -3
  184. package/lib/order.js.map +0 -1
  185. package/lib/partner.d.ts.map +0 -1
  186. package/lib/partner.js +0 -3
  187. package/lib/partner.js.map +0 -1
  188. package/lib/payment.d.ts.map +0 -1
  189. package/lib/payment.js +0 -3
  190. package/lib/payment.js.map +0 -1
  191. package/lib/promo.d.ts.map +0 -1
  192. package/lib/promo.js +0 -3
  193. package/lib/promo.js.map +0 -1
  194. package/lib/report.d.ts.map +0 -1
  195. package/lib/report.js +0 -3
  196. package/lib/report.js.map +0 -1
  197. package/lib/schedule.d.ts.map +0 -1
  198. package/lib/schedule.js +0 -3
  199. package/lib/schedule.js.map +0 -1
  200. package/lib/shoppingcart.d.ts.map +0 -1
  201. package/lib/shoppingcart.js +0 -3
  202. package/lib/shoppingcart.js.map +0 -1
  203. package/lib/task.d.ts.map +0 -1
  204. package/lib/task.js +0 -3
  205. package/lib/task.js.map +0 -1
  206. package/lib/user.d.ts.map +0 -1
  207. package/lib/user.js +0 -3
  208. package/lib/user.js.map +0 -1
  209. package/lib/vote.d.ts.map +0 -1
  210. package/lib/vote.js +0 -3
  211. package/lib/vote.js.map +0 -1
  212. package/src/email.ts +0 -4
  213. /package/lib/{announcement.d.ts → interface/announcement.d.ts} +0 -0
  214. /package/lib/{brand.d.ts → interface/brand.d.ts} +0 -0
  215. /package/lib/{config.d.ts → interface/config.d.ts} +0 -0
  216. /package/lib/{datalake.d.ts → interface/datalake.d.ts} +0 -0
  217. /package/lib/{delivery.d.ts → interface/delivery.d.ts} +0 -0
  218. /package/lib/{dh.d.ts → interface/dh.d.ts} +0 -0
  219. /package/lib/{file.d.ts → interface/file.d.ts} +0 -0
  220. /package/lib/{logger.d.ts → interface/logger.d.ts} +0 -0
  221. /package/lib/{loyalty.d.ts → interface/loyalty.d.ts} +0 -0
  222. /package/lib/{mealplan.d.ts → interface/mealplan.d.ts} +0 -0
  223. /package/lib/{message.d.ts → interface/message.d.ts} +0 -0
  224. /package/lib/{schedule.d.ts → interface/schedule.d.ts} +0 -0
  225. /package/lib/{task.d.ts → interface/task.d.ts} +0 -0
  226. /package/lib/{vote.d.ts → interface/vote.d.ts} +0 -0
package/gen.ts CHANGED
@@ -12,6 +12,8 @@ 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";
15
17
 
16
18
  interface Manifest {
17
19
  services: ManifestService[];
@@ -60,28 +62,35 @@ const operationIDs : Record<string, string> = {
60
62
  "get /promo": "get_promos",
61
63
  "get /schedule": "get_schedules",
62
64
  "get /brand": "get_brands",
63
- "get /announcement/resource": "get_resources"
65
+ "get /announcement/resource": "get_resources",
66
+ "get /order/location/brand/{id}": "get_order_location_brand",
64
67
  };
65
68
 
66
- class CodeGenerator {
69
+ export class CodeGenerator {
67
70
 
68
71
  private imports: ClientImport[] = [];
69
72
  private methods: ClientMethod[] = [];
70
73
 
71
- async generate(manifest: Manifest): Promise<void> {
74
+ async manifest(manifest: Manifest): Promise<void> {
72
75
  // generate service types
76
+ await fs.promises.mkdir(path.join("src", "interface"), { recursive: true });
73
77
  for (const service of manifest.services) {
74
- const print = new Printer();
75
78
  console.log(`reading: ${service.swagger}`);
76
- const doc = await load(service.swagger);
77
- const details = analyse(doc);
78
- this.transform(details, print, service);
79
- const code = prettier.format(print.code(), { parser: "typescript", printWidth: 100 });
80
- const filename = path.join("src", `${service.name}.ts`);
81
- fs.writeFileSync(filename, code);
79
+ const code = await this.service(service, false);
80
+ const filename = path.join("src", "interface", `${service.name}.ts`);
81
+ await fs.promises.writeFile(filename, code);
82
82
  }
83
83
  // 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> {
84
90
  const print = new Printer();
91
+ // "do not modify" warning
92
+ print.comment("THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY");
93
+ print.blank();
85
94
  // client imports
86
95
  const imports: Record<string, string[]> = {};
87
96
  for (const _import of this.imports) {
@@ -95,9 +104,15 @@ class CodeGenerator {
95
104
  // client methods
96
105
  const template = fs.readFileSync("template.ejs", "utf-8");
97
106
  print.raw(ejs.render(template, { methods: this.methods }));
98
- const code = prettier.format(print.code(), { parser: "typescript", printWidth: 100 });
99
- const filename = path.join("src", "index.ts");
100
- fs.writeFileSync(filename, code);
107
+ return prettier.format(print.code(), { parser: "typescript", printWidth: 100 });
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 });
101
116
  }
102
117
 
103
118
  /**
@@ -106,14 +121,21 @@ class CodeGenerator {
106
121
  private addImport(service: ManifestService, name: string): void {
107
122
  this.imports.push({
108
123
  name,
109
- path: `./${service.name}`,
124
+ path: `./interface/${service.name}`,
110
125
  });
111
126
  }
112
127
 
113
128
  /**
114
129
  * Generate typescript code from the document details.
115
130
  */
116
- private transform(doc: DocumentDetails, print: Printer, service: ManifestService): void {
131
+ private transform(doc: DocumentDetails, print: Printer, service: ManifestService, ambient: boolean): void {
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
139
  // definitions
118
140
  for (const [name, schema] of Object.entries(doc.definitions)) {
119
141
  print.schema(schema, name);
@@ -151,6 +173,10 @@ class CodeGenerator {
151
173
  param.type = "string";
152
174
  }
153
175
  }
176
+ // add nocache query parameter if x-cache-control is specified
177
+ if (this.hasCacheControl(op) && !params.query.properties["nocache"]) {
178
+ params.query.setProperty("nocache", new Schema("boolean"));
179
+ }
154
180
  const name = this.inferName(op, service);
155
181
  let comment = `${op.method.toUpperCase()} ${path}`;
156
182
  if (op.obj.summary) {
@@ -194,7 +220,7 @@ class CodeGenerator {
194
220
  comment: comment,
195
221
  name: name.snake,
196
222
  params:[],
197
- args: [`"${op.method}"`],
223
+ args: [`"${service.name}"`, `"${name.snake}"`, `"${op.method}"`],
198
224
  response: responseT,
199
225
  }
200
226
  // turn the path into a template string and add the
@@ -233,7 +259,7 @@ class CodeGenerator {
233
259
  }
234
260
  options.setProperty("query", query);
235
261
  }
236
- options.merge(new Schema("Options"));
262
+ options.merge(new Schema("RequestOptions"));
237
263
  method.params.push({
238
264
  name: "options",
239
265
  type: Printer.type(options),
@@ -243,13 +269,17 @@ class CodeGenerator {
243
269
  method.args.push("options");
244
270
  this.methods.push(method);
245
271
  }
272
+ // close declaration
273
+ if (ambient) {
274
+ print.raw(`}`);
275
+ }
246
276
  }
247
277
 
248
278
  /**
249
279
  * Infer the operation name from the method and parameter.
250
280
  * These are a bunch of dirty hacks to make the generated names consistent.
251
281
  */
252
- private inferName(op: OperationDetails, service: ManifestService): OperationName {
282
+ inferName(op: OperationDetails, service: ManifestService): OperationName {
253
283
  let { method, path } = op;
254
284
  let path_segments: string[] = [];
255
285
  // use the operationId from our collection if we have one.
@@ -309,6 +339,14 @@ class CodeGenerator {
309
339
  };
310
340
  }
311
341
 
342
+ /**
343
+ * Check if the any response has caching enabled.
344
+ */
345
+ private hasCacheControl(op: OperationDetails): boolean {
346
+ const responses = Object.values(op.obj.responses ?? {});
347
+ return responses.some(response => "x-cache-control" in response);
348
+ }
349
+
312
350
  /**
313
351
  * Find all the path parameter names.
314
352
  */
@@ -337,25 +375,6 @@ class CodeGenerator {
337
375
  }
338
376
  return request;
339
377
  }
340
-
341
- /**
342
- * Create the type for the client method parameter.
343
- */
344
- private toOptionsSchema(name: OperationName, details: OperationDetails): Schema {
345
- const options = new Schema("empty");
346
- if (!details.params.query.isEmpty()) {
347
- const query = new Schema(`${name.pascal}Query`);
348
- if (details.params.query.hasRequired()) {
349
- query.required = true;
350
- }
351
- options.setProperty("query", query);
352
- }
353
- if (options.hasRequired()) {
354
- options.required = true;
355
- }
356
- options.merge(new Schema("RequestOptions"));
357
- return options;
358
- }
359
378
  }
360
379
 
361
380
 
@@ -364,9 +383,48 @@ class CodeGenerator {
364
383
  * Main entry point.
365
384
  */
366
385
  async function main() {
367
- const manifest: Manifest = JSON.parse(await fs.promises.readFile("manifest.json", "utf-8"));
368
- const gen = new CodeGenerator();
369
- await gen.generate(manifest);
386
+ const { argv } = yargs(hideBin(process.argv))
387
+ .options("manifest", {
388
+ type: "string",
389
+ description: "manifest.json file to generate sdk from",
390
+ })
391
+ .options("swagger", {
392
+ type: "string",
393
+ description: "swagger.json file to generate interfaces from",
394
+ })
395
+ .options("service", {
396
+ type: "string",
397
+ description: "service name for generated interfaces",
398
+ })
399
+ .options("ambient", {
400
+ type: "boolean",
401
+ description: "wrap the types in a declare module directive",
402
+ default: true,
403
+ })
404
+ // generate sdk from manifest
405
+ if (argv.manifest) {
406
+ const data = await fs.promises.readFile(argv.manifest, "utf-8");
407
+ const manifest: Manifest = JSON.parse(data);
408
+ const gen = new CodeGenerator();
409
+ await gen.manifest(manifest);
410
+ return;
411
+ }
412
+ // generate interfaces for a single swagger.json
413
+ if (argv.swagger || argv.service) {
414
+ if (!argv.swagger) {
415
+ throw new Error(`--swagger must be provided with --service`);
416
+ }
417
+ if (!argv.service) {
418
+ throw new Error(`--service must be provided with --swagger`);
419
+ }
420
+ const gen = new CodeGenerator();
421
+ const code = await gen.service({
422
+ name: argv.service,
423
+ swagger: argv.swagger,
424
+ }, argv.ambient);
425
+ console.log(code);
426
+ return;
427
+ }
370
428
  }
371
429
 
372
- main();
430
+ main().catch(err => console.error(err.message));
package/lib/base.d.ts CHANGED
@@ -1,33 +1,158 @@
1
1
  export interface RequestOptions {
2
2
  stage?: string;
3
- headers?: Record<string, string>;
4
3
  token?: string;
4
+ headers?: Record<string, string>;
5
5
  debug?: boolean;
6
6
  retry?: number;
7
7
  base_url?: string;
8
- allow?: number[];
8
+ intercept?: InterceptFn;
9
9
  }
10
- export interface ServiceClientOptions extends Omit<RequestOptions, "allow"> {
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;
11
21
  }
12
- export declare type ResponseType<T, Options extends RequestOptions> = Promise<T | (Options["allow"] extends number[] ? null : never)>;
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
+ */
13
90
  export declare class ServiceError extends Error {
14
91
  status: number;
15
92
  code: number;
16
93
  constructor(status: number, // http status
17
94
  code: number, // service error code
18
95
  message: string);
19
- static from_res(res: Response, message: string): ServiceError;
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;
20
120
  }
121
+ /**
122
+ * BaseServiceClient contains the logic for executing http requests.
123
+ * This class is meant to be extended by the generated code.
124
+ */
21
125
  export declare abstract class BaseServiceClient {
22
126
  private options;
23
- constructor(options?: ServiceClientOptions);
127
+ constructor(options?: RequestOptions);
24
128
  /**
25
129
  * Combine the route and query parameters into a full url.
26
130
  */
27
131
  private build_url;
28
- private is_4xx;
29
- protected request(method: string, route: string, body: any, options?: {
132
+ /**
133
+ * Perform the http request or pass it to the intercept function
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?: {
30
150
  query?: any;
31
- } & RequestOptions): Promise<any>;
151
+ } & RequestOptions): ResponsePromise<any>;
152
+ /**
153
+ * The main logic for fulfilling a request as perscribed by
154
+ * the request options.
155
+ */
156
+ private _request;
32
157
  }
33
158
  //# 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;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;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;CAAG;AAE9E,oBAAY,YAAY,CAAC,CAAC,EAAE,OAAO,SAAS,cAAc,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AAE9H,qBAAa,YAAa,SAAQ,KAAK;IAE5B,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,MAAM;gBADZ,MAAM,EAAE,MAAM,EAAE,cAAc;IAC9B,IAAI,EAAE,MAAM,EAAI,qBAAqB;IAC5C,OAAO,EAAE,MAAM;IAMjB,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY;CAW9D;AAED,8BAAsB,iBAAiB;IACrC,OAAO,CAAC,OAAO,CAAuB;gBAE1B,OAAO,CAAC,EAAE,oBAAoB;IAI1C;;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;CAwChB"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}