@looker/sdk-rtl 21.5.0 → 21.6.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 (101) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/lib/CSRFSession.js +3 -17
  3. package/lib/CSRFSession.js.map +1 -1
  4. package/lib/apiMethods.js +6 -47
  5. package/lib/apiMethods.js.map +1 -1
  6. package/lib/apiSettings.js +4 -24
  7. package/lib/apiSettings.js.map +1 -1
  8. package/lib/authSession.js +3 -18
  9. package/lib/authSession.js.map +1 -1
  10. package/lib/authToken.js +3 -18
  11. package/lib/authToken.js.map +1 -1
  12. package/lib/baseTransport.js +3 -12
  13. package/lib/baseTransport.js.map +1 -1
  14. package/lib/browser.js +0 -34
  15. package/lib/browser.js.map +1 -1
  16. package/lib/browserServices.js +3 -11
  17. package/lib/browserServices.js.map +1 -1
  18. package/lib/browserSession.js +6 -21
  19. package/lib/browserSession.js.map +1 -1
  20. package/lib/browserTransport.js +5 -63
  21. package/lib/browserTransport.js.map +1 -1
  22. package/lib/constants.js +1 -11
  23. package/lib/constants.js.map +1 -1
  24. package/lib/cryptoHash.js +1 -1
  25. package/lib/cryptoHash.js.map +1 -1
  26. package/lib/delimArray.js +3 -8
  27. package/lib/delimArray.js.map +1 -1
  28. package/lib/errorDoc.d.ts +1 -1
  29. package/lib/errorDoc.js +9 -50
  30. package/lib/errorDoc.js.map +1 -1
  31. package/lib/esm/CSRFSession.js +14 -17
  32. package/lib/esm/CSRFSession.js.map +1 -1
  33. package/lib/esm/apiMethods.js +18 -46
  34. package/lib/esm/apiMethods.js.map +1 -1
  35. package/lib/esm/apiSettings.js +32 -28
  36. package/lib/esm/apiSettings.js.map +1 -1
  37. package/lib/esm/authSession.js +14 -19
  38. package/lib/esm/authSession.js.map +1 -1
  39. package/lib/esm/authToken.js +11 -17
  40. package/lib/esm/authToken.js.map +1 -1
  41. package/lib/esm/baseTransport.js +14 -13
  42. package/lib/esm/baseTransport.js.map +1 -1
  43. package/lib/esm/browser.js +192 -17
  44. package/lib/esm/browser.js.map +1 -1
  45. package/lib/esm/browserServices.js +15 -12
  46. package/lib/esm/browserServices.js.map +1 -1
  47. package/lib/esm/browserSession.js +21 -23
  48. package/lib/esm/browserSession.js.map +1 -1
  49. package/lib/esm/browserTransport.js +24 -68
  50. package/lib/esm/browserTransport.js.map +1 -1
  51. package/lib/esm/constants.js +22 -10
  52. package/lib/esm/constants.js.map +1 -1
  53. package/lib/esm/cryptoHash.js.map +1 -1
  54. package/lib/esm/delimArray.js +10 -6
  55. package/lib/esm/delimArray.js.map +1 -1
  56. package/lib/esm/errorDoc.js +23 -51
  57. package/lib/esm/errorDoc.js.map +1 -1
  58. package/lib/esm/extensionSession.js +11 -16
  59. package/lib/esm/extensionSession.js.map +1 -1
  60. package/lib/esm/extensionTransport.js +13 -19
  61. package/lib/esm/extensionTransport.js.map +1 -1
  62. package/lib/esm/index.js +236 -21
  63. package/lib/esm/index.js.map +1 -1
  64. package/lib/esm/lookerSDKError.js +13 -12
  65. package/lib/esm/lookerSDKError.js.map +1 -1
  66. package/lib/esm/oauthSession.js +23 -66
  67. package/lib/esm/oauthSession.js.map +1 -1
  68. package/lib/esm/paging.js +24 -71
  69. package/lib/esm/paging.js.map +1 -1
  70. package/lib/esm/platformServices.js.map +1 -1
  71. package/lib/esm/proxySession.js +13 -13
  72. package/lib/esm/proxySession.js.map +1 -1
  73. package/lib/esm/testUtils/index.js +17 -0
  74. package/lib/esm/testUtils/index.js.map +1 -0
  75. package/lib/esm/testUtils/testUtils.js +46 -0
  76. package/lib/esm/testUtils/testUtils.js.map +1 -0
  77. package/lib/esm/transport.js +59 -64
  78. package/lib/esm/transport.js.map +1 -1
  79. package/lib/extensionSession.js +3 -17
  80. package/lib/extensionSession.js.map +1 -1
  81. package/lib/extensionTransport.js +5 -20
  82. package/lib/extensionTransport.js.map +1 -1
  83. package/lib/index.js +0 -42
  84. package/lib/index.js.map +1 -1
  85. package/lib/lookerSDKError.js +5 -13
  86. package/lib/lookerSDKError.js.map +1 -1
  87. package/lib/oauthSession.js +8 -63
  88. package/lib/oauthSession.js.map +1 -1
  89. package/lib/paging.js +5 -70
  90. package/lib/paging.js.map +1 -1
  91. package/lib/platformServices.js +1 -1
  92. package/lib/platformServices.js.map +1 -1
  93. package/lib/proxySession.js +0 -12
  94. package/lib/proxySession.js.map +1 -1
  95. package/lib/testUtils/index.js +0 -2
  96. package/lib/testUtils/index.js.map +1 -1
  97. package/lib/testUtils/testUtils.js +1 -16
  98. package/lib/testUtils/testUtils.js.map +1 -1
  99. package/lib/transport.js +16 -58
  100. package/lib/transport.js.map +1 -1
  101. package/package.json +3 -3
package/lib/paging.js CHANGED
@@ -3,23 +3,19 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.pager = pager;
6
+ exports.linkHeaderParser = exports.TotalCountHeader = exports.Paging = exports.LinkHeader = void 0;
7
7
  exports.pageAll = pageAll;
8
- exports.Paging = exports.linkHeaderParser = exports.TotalCountHeader = exports.LinkHeader = void 0;
9
-
8
+ exports.pager = pager;
10
9
  var _transport = require("./transport");
11
-
12
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
13
-
10
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
12
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
14
13
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
15
-
16
14
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
17
-
18
15
  var LinkHeader = 'Link';
19
16
  exports.LinkHeader = LinkHeader;
20
17
  var TotalCountHeader = 'X-Total-Count';
21
18
  exports.TotalCountHeader = TotalCountHeader;
22
-
23
19
  var linkHeaderParser = linkHeader => {
24
20
  var re = /<\s*(.*)\s*>;\s*rel="\s*(.*)\s*"\s*/gm;
25
21
  var links = linkHeader.split(',');
@@ -27,7 +23,6 @@ var linkHeaderParser = linkHeader => {
27
23
  var arrRes;
28
24
  links.forEach(link => {
29
25
  link = link.trim();
30
-
31
26
  while (arrRes = re.exec(link)) {
32
27
  var key = arrRes[2].split(' ')[0].trim().toLocaleLowerCase();
33
28
  obj[key] = {
@@ -39,31 +34,25 @@ var linkHeaderParser = linkHeader => {
39
34
  });
40
35
  return obj;
41
36
  };
42
-
43
37
  exports.linkHeaderParser = linkHeaderParser;
44
-
45
38
  function pager(_x, _x2, _x3) {
46
39
  return _pager.apply(this, arguments);
47
40
  }
48
-
49
41
  function _pager() {
50
42
  _pager = _asyncToGenerator(function* (sdk, pageFunc, options) {
51
43
  return yield new Paging(sdk, pageFunc, options).init();
52
44
  });
53
45
  return _pager.apply(this, arguments);
54
46
  }
55
-
56
47
  function pageAll(_x4, _x5) {
57
48
  return _pageAll.apply(this, arguments);
58
49
  }
59
-
60
50
  function _pageAll() {
61
51
  _pageAll = _asyncToGenerator(function* (sdk, pageFunc) {
62
52
  var onPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : page => page;
63
53
  var options = arguments.length > 3 ? arguments[3] : undefined;
64
54
  var paged = yield pager(sdk, pageFunc, options);
65
55
  onPage(paged.items);
66
-
67
56
  try {
68
57
  while (paged.more()) {
69
58
  onPage(yield sdk.ok(paged.nextPage()));
@@ -71,112 +60,83 @@ function _pageAll() {
71
60
  } catch (err) {
72
61
  return Promise.reject(err);
73
62
  }
74
-
75
63
  return paged;
76
64
  });
77
65
  return _pageAll.apply(this, arguments);
78
66
  }
79
-
80
67
  class Paging {
81
68
  constructor(sdk, func, options) {
82
69
  this.sdk = sdk;
83
70
  this.func = func;
84
71
  this.options = options;
85
-
86
72
  _defineProperty(this, "items", []);
87
-
88
73
  _defineProperty(this, "links", {});
89
-
90
74
  _defineProperty(this, "total", -1);
91
-
92
75
  _defineProperty(this, "offset", -1);
93
-
94
76
  _defineProperty(this, "limit", -1);
95
-
96
77
  _defineProperty(this, "transport", void 0);
97
-
98
78
  this.transport = sdk.authSession.transport;
99
79
  }
100
-
101
80
  rawCatch(func) {
102
81
  var _this = this;
103
-
104
82
  return _asyncToGenerator(function* () {
105
83
  var raw = {};
106
84
  var saved = _this.transport.observer;
107
-
108
85
  try {
109
86
  _this.transport.observer = response => {
110
87
  if (saved) {
111
88
  response = saved(response);
112
89
  }
113
-
114
90
  raw = response;
115
91
  return response;
116
92
  };
117
-
118
93
  _this.items = yield (0, _transport.sdkOk)(func());
119
94
  } finally {
120
95
  _this.transport.observer = saved;
121
96
  }
122
-
123
97
  if (Object.keys(raw).length === 0 || Object.keys(raw.headers).length === 0) return Promise.reject(new Error('No paging headers were found'));
124
-
125
98
  _this.parse(raw);
126
-
127
99
  return _this;
128
100
  })();
129
101
  }
130
-
131
102
  get page() {
132
103
  if (this.limit < 1 || this.offset < 0) return -1;
133
104
  var x = this.offset / this.limit + 1;
134
105
  return Math.ceil(x);
135
106
  }
136
-
137
107
  get pages() {
138
108
  if (this.total < 1 || this.limit < 1) return -1;
139
109
  var x = this.total / this.limit;
140
110
  return Math.ceil(x);
141
111
  }
142
-
143
112
  init() {
144
113
  var _this2 = this;
145
-
146
114
  return _asyncToGenerator(function* () {
147
115
  return yield _this2.rawCatch(_this2.func);
148
116
  })();
149
117
  }
150
-
151
118
  hasRel(link) {
152
119
  return !!this.links[link];
153
120
  }
154
-
155
121
  more() {
156
122
  return this.hasRel('next');
157
123
  }
158
-
159
124
  static paramDefault(value, defaultValue) {
160
125
  var convert = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : v => parseInt(v, 10);
161
126
  if (value === null) return defaultValue;
162
127
  return convert(value);
163
128
  }
164
-
165
129
  reset() {
166
130
  this.links = {};
167
131
  this.total = this.offset = this.limit = -1;
168
132
  this.items = [];
169
133
  }
170
-
171
134
  getRel(name, limit, offset) {
172
135
  var _this3 = this;
173
-
174
136
  return _asyncToGenerator(function* () {
175
137
  var rel = _this3.links[name];
176
138
  var result;
177
-
178
139
  _this3.reset();
179
-
180
140
  if (!rel) {
181
141
  result = {
182
142
  ok: true,
@@ -184,18 +144,14 @@ class Paging {
184
144
  };
185
145
  return result;
186
146
  }
187
-
188
147
  var authenticator = init => {
189
148
  return _this3.sdk.authSession.authenticate(init);
190
149
  };
191
-
192
150
  var link = rel.url;
193
-
194
151
  if (limit !== undefined) {
195
152
  if (offset === undefined) {
196
153
  offset = 0;
197
154
  }
198
-
199
155
  if (limit < 1 || offset < 0) {
200
156
  result = {
201
157
  ok: false,
@@ -203,19 +159,15 @@ class Paging {
203
159
  };
204
160
  return result;
205
161
  }
206
-
207
162
  var url = new URL(link);
208
163
  var params = url.searchParams;
209
164
  params.set('limit', limit.toString());
210
165
  params.set('offset', offset.toString());
211
166
  link = url.toString();
212
167
  }
213
-
214
168
  var raw = yield _this3.transport.rawRequest('GET', link, undefined, undefined, authenticator, _this3.options);
215
-
216
169
  try {
217
170
  _this3.parse(raw);
218
-
219
171
  _this3.items = yield (0, _transport.sdkOk)(_this3.transport.parseResponse(raw));
220
172
  result = {
221
173
  ok: true,
@@ -227,71 +179,54 @@ class Paging {
227
179
  error: e
228
180
  };
229
181
  }
230
-
231
182
  return result;
232
183
  })();
233
184
  }
234
-
235
185
  static findHeader(raw, name) {
236
186
  return raw.headers[name] || raw.headers[name.toLowerCase()] || raw.headers[name.toUpperCase()];
237
187
  }
238
-
239
188
  parse(raw) {
240
189
  var params = new URL(raw.url, 'http://default').searchParams;
241
190
  this.limit = Paging.paramDefault(params.get('limit'), -1);
242
191
  this.offset = Paging.paramDefault(params.get('offset'), this.limit > 0 ? 0 : -1);
243
192
  var linkHeader = Paging.findHeader(raw, LinkHeader);
244
-
245
193
  if (linkHeader) {
246
194
  this.links = linkHeaderParser(linkHeader);
247
195
  } else {
248
196
  this.links = {};
249
197
  }
250
-
251
198
  var totalHeader = Paging.findHeader(raw, TotalCountHeader);
252
-
253
199
  if (totalHeader) {
254
200
  this.total = parseInt(totalHeader.trim(), 10);
255
201
  } else {
256
202
  this.total = -1;
257
203
  }
258
-
259
204
  return this;
260
205
  }
261
-
262
206
  firstPage() {
263
207
  var _this4 = this;
264
-
265
208
  return _asyncToGenerator(function* () {
266
209
  return yield _this4.getRel('first');
267
210
  })();
268
211
  }
269
-
270
212
  lastPage() {
271
213
  var _this5 = this;
272
-
273
214
  return _asyncToGenerator(function* () {
274
215
  return yield _this5.getRel('last');
275
216
  })();
276
217
  }
277
-
278
218
  nextPage() {
279
219
  var _this6 = this;
280
-
281
220
  return _asyncToGenerator(function* () {
282
221
  return yield _this6.getRel('next');
283
222
  })();
284
223
  }
285
-
286
224
  prevPage() {
287
225
  var _this7 = this;
288
-
289
226
  return _asyncToGenerator(function* () {
290
227
  return yield _this7.getRel('prev');
291
228
  })();
292
229
  }
293
-
294
230
  }
295
-
296
231
  exports.Paging = Paging;
297
232
  //# sourceMappingURL=paging.js.map
package/lib/paging.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/paging.ts"],"names":["LinkHeader","TotalCountHeader","linkHeaderParser","linkHeader","re","links","split","obj","arrRes","forEach","link","trim","exec","key","toLocaleLowerCase","url","rel","name","pager","sdk","pageFunc","options","Paging","init","pageAll","onPage","page","paged","items","more","ok","nextPage","err","Promise","reject","constructor","func","transport","authSession","rawCatch","raw","saved","observer","response","Object","keys","length","headers","Error","parse","limit","offset","x","Math","ceil","pages","total","hasRel","paramDefault","value","defaultValue","convert","v","parseInt","reset","getRel","result","authenticator","authenticate","undefined","error","URL","params","searchParams","set","toString","rawRequest","parseResponse","e","findHeader","toLowerCase","toUpperCase","get","totalHeader","firstPage","lastPage","prevPage"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IRawResponse, ITransportSettings, SDKResponse } from './transport'\nimport { sdkOk } from './transport'\nimport type { IAPIMethods } from './apiMethods'\nimport type { BaseTransport } from './baseTransport'\n\nexport const LinkHeader = 'Link'\nexport const TotalCountHeader = 'X-Total-Count'\n\n/**\n * Types of paging link relative URLs\n * based on https://docs.github.com/en/rest/overview/resources-in-the-rest-api#link-header\n */\nexport type PageLinkRel = 'first' | 'last' | 'next' | 'prev'\n\n/** Constraints for TSuccess type */\ninterface ILength {\n length: number\n}\n\n/** Result paging function call */\nexport type PagingFunc<TSuccess, TError> = () => Promise<\n SDKResponse<TSuccess, TError>\n>\n\n/** Page link structure */\nexport interface IPageLink {\n /** Name of link */\n name?: string\n /** Type of link */\n rel: PageLinkRel\n /** Media type for link */\n mediaType?: string\n /** URL for retrieving the link results */\n url: string\n}\n\n/**\n * Collection of page links\n *\n * TODO can this be Record<PageLinkRel, IPageLink> instead and still init to {}?\n */\nexport type PageLinks = Record<string, IPageLink>\n\nexport interface IPager<TSuccess, TError> {\n /** Total number of available items being paginated */\n total: number\n /** Offset extracted from pager request */\n offset: number\n /** Limit extracted from pager request */\n limit: number\n /** Paging links extracted from Link header */\n links: PageLinks\n /** Latest items returned from response */\n items: TSuccess\n /** Captured from the original paging request */\n options?: Partial<ITransportSettings>\n /** Total number of pages. -1 if not known. */\n pages: number\n /** Current page. -1 if not known. */\n page: number\n\n /**\n * Is the specified link rel defined in the Link header?\n * @param link to check\n */\n hasRel(link: PageLinkRel): boolean\n\n /**\n * GET the requested relative link\n *\n * if the requested link is not defined, all calculated values are reset to their defaults, including\n * `total`, `items`, `offset`, and `limit`\n *\n * @param name of Link Relationship\n * @param limit optional limit override to replace limit saved in `rel`\n * @param offset optional offset override to replace offset saved in `rel`\n */\n getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /** Get the first page of items. This is the same as offset=0 */\n firstPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the last page of items\n *\n * @remarks This link is only provided if `total` is known.\n */\n lastPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the next page of items\n *\n * @remarks This link is provided if `total` is known, or if the number of items returned == `limit`. In the latter case, this function may return an empty result set.\n */\n nextPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the previous page of items\n *\n * @remarks This link is provided if the last page was not the first page.\n */\n prevPage(): Promise<SDKResponse<TSuccess, TError>>\n\n /** `true` if the `next` link is defined */\n more(): boolean\n}\n\n/**\n * Parse a link header to extract rels\n * @param linkHeader to parse\n *\n * Several different approaches are discussed at https://stackoverflow.com/questions/8735792/how-to-parse-link-header-from-github-api\n *\n * Unfortunately, none of them are a good implementation\n *\n */\nexport const linkHeaderParser = (linkHeader: string): PageLinks => {\n const re = /<\\s*(.*)\\s*>;\\s*rel=\"\\s*(.*)\\s*\"\\s*/gm\n const links = linkHeader.split(',')\n const obj: PageLinks = {}\n let arrRes\n\n links.forEach((link) => {\n link = link.trim()\n while ((arrRes = re.exec(link))) {\n const key = arrRes[2].split(' ')[0].trim().toLocaleLowerCase()\n obj[key] = {\n url: arrRes[1].trim(),\n rel: key as PageLinkRel,\n name: arrRes[2].trim(),\n }\n }\n })\n return obj\n}\n\n/** Event to observe the paging call */\nexport type PageObserver<TSuccess> = (\n /** Current retrieved page of results */\n page: TSuccess\n) => TSuccess\n\n/**\n * Create an API response pager for an endpoint that returns a Link header\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pager<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n return await new Paging<TSuccess, TError>(sdk, pageFunc, options).init()\n}\n\n/**\n * Create an API response pager and iterate through all pages, calling a page event per page\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param onPage observer of the latest page of results. Defaults to noop.\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pageAll<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n onPage: PageObserver<TSuccess> = (page: TSuccess) => page,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n const paged = await pager(sdk, pageFunc, options)\n // Process the first page\n onPage(paged.items)\n try {\n while (paged.more()) {\n // Pass the page items to the event\n onPage(await sdk.ok(paged.nextPage()))\n }\n } catch (err) {\n return Promise.reject(err)\n }\n return paged\n}\n\n/**\n * Link header pages class\n */\nexport class Paging<TSuccess extends ILength, TError>\n implements IPager<TSuccess, TError>\n{\n items: TSuccess = [] as unknown as TSuccess\n links: PageLinks = {}\n total = -1\n offset = -1\n limit = -1\n\n private transport: BaseTransport\n\n /**\n * Create an API paginator\n * @param sdk functional AuthSession or full SDK implementation\n * @param func sdk function to call\n * @param options transport overrides to use for subsequent requests\n */\n constructor(\n public sdk: IAPIMethods,\n public func: PagingFunc<TSuccess, TError>,\n public options?: Partial<ITransportSettings>\n ) {\n this.transport = sdk.authSession.transport as BaseTransport\n }\n\n private async rawCatch(func: () => any) {\n let raw: IRawResponse = {} as IRawResponse\n const saved = this.transport.observer\n try {\n // Capture the raw request for header parsing\n this.transport.observer = (response: IRawResponse) => {\n if (saved) {\n // Chain the observer\n response = saved(response)\n }\n raw = response\n return response\n }\n this.items = await sdkOk(func())\n } finally {\n // Restore the previous observer (if any)\n this.transport.observer = saved\n }\n if (Object.keys(raw).length === 0 || Object.keys(raw.headers).length === 0)\n return Promise.reject(new Error('No paging headers were found'))\n this.parse(raw)\n return this\n }\n\n get page(): number {\n if (this.limit < 1 || this.offset < 0) return -1\n const x = this.offset / this.limit + 1\n return Math.ceil(x)\n }\n\n get pages(): number {\n if (this.total < 1 || this.limit < 1) return -1\n const x = this.total / this.limit\n return Math.ceil(x)\n }\n\n async init() {\n return await this.rawCatch(this.func)\n }\n\n hasRel(link: PageLinkRel): boolean {\n return !!this.links[link]\n }\n\n more() {\n return this.hasRel('next')\n }\n\n /**\n * Default string value\n * @param value to retrieve or default\n * @param defaultValue to apply if string is null\n * @param convert function to convert assigned string value\n * @private\n */\n private static paramDefault(\n value: string | null,\n defaultValue: any,\n convert = (v: string) => parseInt(v, 10)\n ) {\n if (value === null) return defaultValue\n return convert(value)\n }\n\n reset() {\n this.links = {}\n this.total = this.offset = this.limit = -1\n this.items = [] as unknown as TSuccess\n }\n\n async getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>> {\n const rel = this.links[name]\n let result: SDKResponse<TSuccess, TError>\n this.reset()\n if (!rel) {\n result = { ok: true, value: this.items }\n return result\n }\n const authenticator = (init: any) => {\n return this.sdk.authSession.authenticate(init)\n }\n\n let link = rel.url\n if (limit !== undefined) {\n if (offset === undefined) {\n offset = 0\n }\n if (limit < 1 || offset < 0) {\n result = {\n ok: false,\n error: new Error(\n 'limit must be > 0 and offset must be >= 0'\n ) as unknown as TError,\n }\n return result\n }\n const url = new URL(link)\n const params = url.searchParams\n params.set('limit', limit.toString())\n params.set('offset', offset.toString())\n link = url.toString()\n }\n const raw = await this.transport.rawRequest(\n 'GET',\n link,\n undefined,\n undefined,\n authenticator,\n this.options\n )\n try {\n this.parse(raw)\n this.items = await sdkOk(this.transport.parseResponse(raw))\n result = { ok: true, value: this.items }\n } catch (e: any) {\n result = { ok: false, error: e }\n }\n return result\n }\n\n static findHeader(raw: IRawResponse, name: string) {\n return (\n raw.headers[name] ||\n raw.headers[name.toLowerCase()] ||\n raw.headers[name.toUpperCase()]\n )\n }\n\n parse(raw: IRawResponse): IPager<TSuccess, TError> {\n const params = new URL(raw.url, 'http://default').searchParams\n this.limit = Paging.paramDefault(params.get('limit'), -1)\n this.offset = Paging.paramDefault(\n params.get('offset'),\n this.limit > 0 ? 0 : -1\n )\n const linkHeader = Paging.findHeader(raw, LinkHeader)\n if (linkHeader) {\n this.links = linkHeaderParser(linkHeader)\n } else {\n this.links = {}\n }\n const totalHeader = Paging.findHeader(raw, TotalCountHeader)\n if (totalHeader) {\n this.total = parseInt(totalHeader.trim(), 10)\n } else {\n this.total = -1\n }\n return this as unknown as IPager<TSuccess, TError>\n }\n\n async firstPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('first')\n }\n\n async lastPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('last')\n }\n\n async nextPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('next')\n }\n\n async prevPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('prev')\n }\n}\n"],"file":"paging.js"}
1
+ {"version":3,"file":"paging.js","names":["_transport","require","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","asyncGeneratorStep","gen","resolve","reject","_next","_throw","info","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","LinkHeader","exports","TotalCountHeader","linkHeaderParser","linkHeader","re","links","split","arrRes","forEach","link","trim","exec","toLocaleLowerCase","url","rel","name","pager","_x","_x2","_x3","_pager","sdk","pageFunc","options","Paging","init","pageAll","_x4","_x5","_pageAll","onPage","length","page","paged","items","more","ok","nextPage","constructor","func","transport","authSession","rawCatch","_this","raw","saved","observer","response","sdkOk","keys","headers","Error","parse","limit","offset","x","Math","ceil","pages","total","_this2","hasRel","paramDefault","defaultValue","convert","v","parseInt","reset","getRel","_this3","result","authenticator","authenticate","URL","params","searchParams","set","toString","rawRequest","parseResponse","e","findHeader","toLowerCase","toUpperCase","get","totalHeader","firstPage","_this4","lastPage","_this5","_this6","prevPage","_this7"],"sources":["../src/paging.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IRawResponse, ITransportSettings, SDKResponse } from './transport'\nimport { sdkOk } from './transport'\nimport type { IAPIMethods } from './apiMethods'\nimport type { BaseTransport } from './baseTransport'\n\nexport const LinkHeader = 'Link'\nexport const TotalCountHeader = 'X-Total-Count'\n\n/**\n * Types of paging link relative URLs\n * based on https://docs.github.com/en/rest/overview/resources-in-the-rest-api#link-header\n */\nexport type PageLinkRel = 'first' | 'last' | 'next' | 'prev'\n\n/** Constraints for TSuccess type */\ninterface ILength {\n length: number\n}\n\n/** Result paging function call */\nexport type PagingFunc<TSuccess, TError> = () => Promise<\n SDKResponse<TSuccess, TError>\n>\n\n/** Page link structure */\nexport interface IPageLink {\n /** Name of link */\n name?: string\n /** Type of link */\n rel: PageLinkRel\n /** Media type for link */\n mediaType?: string\n /** URL for retrieving the link results */\n url: string\n}\n\n/**\n * Collection of page links\n *\n * TODO can this be Record<PageLinkRel, IPageLink> instead and still init to {}?\n */\nexport type PageLinks = Record<string, IPageLink>\n\nexport interface IPager<TSuccess, TError> {\n /** Total number of available items being paginated */\n total: number\n /** Offset extracted from pager request */\n offset: number\n /** Limit extracted from pager request */\n limit: number\n /** Paging links extracted from Link header */\n links: PageLinks\n /** Latest items returned from response */\n items: TSuccess\n /** Captured from the original paging request */\n options?: Partial<ITransportSettings>\n /** Total number of pages. -1 if not known. */\n pages: number\n /** Current page. -1 if not known. */\n page: number\n\n /**\n * Is the specified link rel defined in the Link header?\n * @param link to check\n */\n hasRel(link: PageLinkRel): boolean\n\n /**\n * GET the requested relative link\n *\n * if the requested link is not defined, all calculated values are reset to their defaults, including\n * `total`, `items`, `offset`, and `limit`\n *\n * @param name of Link Relationship\n * @param limit optional limit override to replace limit saved in `rel`\n * @param offset optional offset override to replace offset saved in `rel`\n */\n getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /** Get the first page of items. This is the same as offset=0 */\n firstPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the last page of items\n *\n * @remarks This link is only provided if `total` is known.\n */\n lastPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the next page of items\n *\n * @remarks This link is provided if `total` is known, or if the number of items returned == `limit`. In the latter case, this function may return an empty result set.\n */\n nextPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the previous page of items\n *\n * @remarks This link is provided if the last page was not the first page.\n */\n prevPage(): Promise<SDKResponse<TSuccess, TError>>\n\n /** `true` if the `next` link is defined */\n more(): boolean\n}\n\n/**\n * Parse a link header to extract rels\n * @param linkHeader to parse\n *\n * Several different approaches are discussed at https://stackoverflow.com/questions/8735792/how-to-parse-link-header-from-github-api\n *\n * Unfortunately, none of them are a good implementation\n *\n */\nexport const linkHeaderParser = (linkHeader: string): PageLinks => {\n const re = /<\\s*(.*)\\s*>;\\s*rel=\"\\s*(.*)\\s*\"\\s*/gm\n const links = linkHeader.split(',')\n const obj: PageLinks = {}\n let arrRes\n\n links.forEach((link) => {\n link = link.trim()\n while ((arrRes = re.exec(link))) {\n const key = arrRes[2].split(' ')[0].trim().toLocaleLowerCase()\n obj[key] = {\n url: arrRes[1].trim(),\n rel: key as PageLinkRel,\n name: arrRes[2].trim(),\n }\n }\n })\n return obj\n}\n\n/** Event to observe the paging call */\nexport type PageObserver<TSuccess> = (\n /** Current retrieved page of results */\n page: TSuccess\n) => TSuccess\n\n/**\n * Create an API response pager for an endpoint that returns a Link header\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pager<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n return await new Paging<TSuccess, TError>(sdk, pageFunc, options).init()\n}\n\n/**\n * Create an API response pager and iterate through all pages, calling a page event per page\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param onPage observer of the latest page of results. Defaults to noop.\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pageAll<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n onPage: PageObserver<TSuccess> = (page: TSuccess) => page,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n const paged = await pager(sdk, pageFunc, options)\n // Process the first page\n onPage(paged.items)\n try {\n while (paged.more()) {\n // Pass the page items to the event\n onPage(await sdk.ok(paged.nextPage()))\n }\n } catch (err) {\n return Promise.reject(err)\n }\n return paged\n}\n\n/**\n * Link header pages class\n */\nexport class Paging<TSuccess extends ILength, TError>\n implements IPager<TSuccess, TError>\n{\n items: TSuccess = [] as unknown as TSuccess\n links: PageLinks = {}\n total = -1\n offset = -1\n limit = -1\n\n private transport: BaseTransport\n\n /**\n * Create an API paginator\n * @param sdk functional AuthSession or full SDK implementation\n * @param func sdk function to call\n * @param options transport overrides to use for subsequent requests\n */\n constructor(\n public sdk: IAPIMethods,\n public func: PagingFunc<TSuccess, TError>,\n public options?: Partial<ITransportSettings>\n ) {\n this.transport = sdk.authSession.transport as BaseTransport\n }\n\n private async rawCatch(func: () => any) {\n let raw: IRawResponse = {} as IRawResponse\n const saved = this.transport.observer\n try {\n // Capture the raw request for header parsing\n this.transport.observer = (response: IRawResponse) => {\n if (saved) {\n // Chain the observer\n response = saved(response)\n }\n raw = response\n return response\n }\n this.items = await sdkOk(func())\n } finally {\n // Restore the previous observer (if any)\n this.transport.observer = saved\n }\n if (Object.keys(raw).length === 0 || Object.keys(raw.headers).length === 0)\n return Promise.reject(new Error('No paging headers were found'))\n this.parse(raw)\n return this\n }\n\n get page(): number {\n if (this.limit < 1 || this.offset < 0) return -1\n const x = this.offset / this.limit + 1\n return Math.ceil(x)\n }\n\n get pages(): number {\n if (this.total < 1 || this.limit < 1) return -1\n const x = this.total / this.limit\n return Math.ceil(x)\n }\n\n async init() {\n return await this.rawCatch(this.func)\n }\n\n hasRel(link: PageLinkRel): boolean {\n return !!this.links[link]\n }\n\n more() {\n return this.hasRel('next')\n }\n\n /**\n * Default string value\n * @param value to retrieve or default\n * @param defaultValue to apply if string is null\n * @param convert function to convert assigned string value\n * @private\n */\n private static paramDefault(\n value: string | null,\n defaultValue: any,\n convert = (v: string) => parseInt(v, 10)\n ) {\n if (value === null) return defaultValue\n return convert(value)\n }\n\n reset() {\n this.links = {}\n this.total = this.offset = this.limit = -1\n this.items = [] as unknown as TSuccess\n }\n\n async getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>> {\n const rel = this.links[name]\n let result: SDKResponse<TSuccess, TError>\n this.reset()\n if (!rel) {\n result = { ok: true, value: this.items }\n return result\n }\n const authenticator = (init: any) => {\n return this.sdk.authSession.authenticate(init)\n }\n\n let link = rel.url\n if (limit !== undefined) {\n if (offset === undefined) {\n offset = 0\n }\n if (limit < 1 || offset < 0) {\n result = {\n ok: false,\n error: new Error(\n 'limit must be > 0 and offset must be >= 0'\n ) as unknown as TError,\n }\n return result\n }\n const url = new URL(link)\n const params = url.searchParams\n params.set('limit', limit.toString())\n params.set('offset', offset.toString())\n link = url.toString()\n }\n const raw = await this.transport.rawRequest(\n 'GET',\n link,\n undefined,\n undefined,\n authenticator,\n this.options\n )\n try {\n this.parse(raw)\n this.items = await sdkOk(this.transport.parseResponse(raw))\n result = { ok: true, value: this.items }\n } catch (e: any) {\n result = { ok: false, error: e }\n }\n return result\n }\n\n static findHeader(raw: IRawResponse, name: string) {\n return (\n raw.headers[name] ||\n raw.headers[name.toLowerCase()] ||\n raw.headers[name.toUpperCase()]\n )\n }\n\n parse(raw: IRawResponse): IPager<TSuccess, TError> {\n const params = new URL(raw.url, 'http://default').searchParams\n this.limit = Paging.paramDefault(params.get('limit'), -1)\n this.offset = Paging.paramDefault(\n params.get('offset'),\n this.limit > 0 ? 0 : -1\n )\n const linkHeader = Paging.findHeader(raw, LinkHeader)\n if (linkHeader) {\n this.links = linkHeaderParser(linkHeader)\n } else {\n this.links = {}\n }\n const totalHeader = Paging.findHeader(raw, TotalCountHeader)\n if (totalHeader) {\n this.total = parseInt(totalHeader.trim(), 10)\n } else {\n this.total = -1\n }\n return this as unknown as IPager<TSuccess, TError>\n }\n\n async firstPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('first')\n }\n\n async lastPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('last')\n }\n\n async nextPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('next')\n }\n\n async prevPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('prev')\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";
1
+
2
2
  //# sourceMappingURL=platformServices.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"platformServices.js"}
1
+ {"version":3,"file":"platformServices.js","names":[],"sources":["../src/platformServices.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IApiSettings } from './apiSettings'\nimport type { ITransport } from './transport'\nimport type { ICryptoHash } from './cryptoHash'\n\n/**\n * Contract for OAuth authentication services\n */\nexport interface IPlatformServices {\n settings: IApiSettings\n transport: ITransport\n crypto: ICryptoHash\n}\n"],"mappings":""}
@@ -4,44 +4,32 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.ProxySession = void 0;
7
-
8
7
  var _authSession = require("./authSession");
9
-
10
8
  var _browserTransport = require("./browserTransport");
11
-
12
9
  var _transport = require("./transport");
13
-
14
10
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
15
-
16
11
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
17
-
18
12
  class ProxySession extends _authSession.AuthSession {
19
13
  constructor(settings, proxyUrl, transport) {
20
14
  super(settings, transport || new _browserTransport.BrowserTransport(settings));
21
15
  this.settings = settings;
22
16
  this.proxyUrl = proxyUrl;
23
17
  }
24
-
25
18
  isAuthenticated() {
26
19
  return true;
27
20
  }
28
-
29
21
  authenticate(props) {
30
22
  var _this = this;
31
-
32
23
  return _asyncToGenerator(function* () {
33
24
  if (!props.headers) {
34
25
  props.headers = {};
35
26
  }
36
-
37
27
  props.headers['X-Forwarded-For'] = props.url;
38
28
  props.headers[_transport.LookerAppId] = _transport.agentPrefix;
39
29
  props.url = _this.proxyUrl;
40
30
  return props;
41
31
  })();
42
32
  }
43
-
44
33
  }
45
-
46
34
  exports.ProxySession = ProxySession;
47
35
  //# sourceMappingURL=proxySession.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/proxySession.ts"],"names":["ProxySession","AuthSession","constructor","settings","proxyUrl","transport","BrowserTransport","isAuthenticated","authenticate","props","headers","url","LookerAppId","agentPrefix"],"mappings":";;;;;;;AA0BA;;AACA;;AAEA;;;;;;AAWO,MAAeA,YAAf,SAAoCC,wBAApC,CAAgD;AACrDC,EAAAA,WAAW,CACFC,QADE,EAEFC,QAFE,EAGTC,SAHS,EAIT;AACA,UAAMF,QAAN,EAAgBE,SAAS,IAAI,IAAIC,kCAAJ,CAAqBH,QAArB,CAA7B;AADA,SAHOA,QAGP,GAHOA,QAGP;AAAA,SAFOC,QAEP,GAFOA,QAEP;AAED;;AAODG,EAAAA,eAAe,GAAG;AAChB,WAAO,IAAP;AACD;;AAWKC,EAAAA,YAAY,CAACC,KAAD,EAAuB;AAAA;;AAAA;AACvC,UAAI,CAACA,KAAK,CAACC,OAAX,EAAoB;AAClBD,QAAAA,KAAK,CAACC,OAAN,GAAgB,EAAhB;AACD;;AACDD,MAAAA,KAAK,CAACC,OAAN,CAAc,iBAAd,IAAmCD,KAAK,CAACE,GAAzC;AACAF,MAAAA,KAAK,CAACC,OAAN,CAAcE,sBAAd,IAA6BC,sBAA7B;AACAJ,MAAAA,KAAK,CAACE,GAAN,GAAY,KAAI,CAACP,QAAjB;AACA,aAAOK,KAAP;AAPuC;AAQxC;;AAnCoD","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport { AuthSession } from './authSession'\nimport { BrowserTransport } from './browserTransport'\nimport type { ITransport, IRequestProps } from './transport'\nimport { LookerAppId, agentPrefix } from './transport'\nimport type { IApiSettings } from './apiSettings'\n\n/**\n * An AuthSession class intended for use with proxied requests\n *\n * This session uses `authenticate` to modify all requests to pass through a proxy server with\n * passing the request to the proxy server specified in the `proxyUrl` parameter, and sets\n * the original request path as an `X-Forwarded-For` header.\n *\n */\nexport abstract class ProxySession extends AuthSession {\n constructor(\n public settings: IApiSettings,\n public proxyUrl: string,\n transport?: ITransport\n ) {\n super(settings, transport || new BrowserTransport(settings))\n }\n\n /**\n * Proxy session is considered to be always authenticated since the proxy handles all auth\n *\n * @returns `true` since the proxy handles all authentication\n */\n isAuthenticated() {\n return true\n }\n\n /**\n * This implementation swaps the request's path with the proxy url, and puts the original\n * request path in the `X-Forwarded-For` header, presuming that the proxy server will add API authentication\n * information to the request that gets submitted to the Looker API, then forward the API response to the requestor\n *\n * @param props the properties of the request\n * @returns the same request properties with \"authentication\" data added\n *\n */\n async authenticate(props: IRequestProps) {\n if (!props.headers) {\n props.headers = {}\n }\n props.headers['X-Forwarded-For'] = props.url\n props.headers[LookerAppId] = agentPrefix\n props.url = this.proxyUrl\n return props\n }\n}\n"],"file":"proxySession.js"}
1
+ {"version":3,"file":"proxySession.js","names":["_authSession","require","_browserTransport","_transport","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","ProxySession","AuthSession","constructor","settings","proxyUrl","transport","BrowserTransport","isAuthenticated","authenticate","props","_this","headers","url","LookerAppId","agentPrefix","exports"],"sources":["../src/proxySession.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport { AuthSession } from './authSession'\nimport { BrowserTransport } from './browserTransport'\nimport type { ITransport, IRequestProps } from './transport'\nimport { LookerAppId, agentPrefix } from './transport'\nimport type { IApiSettings } from './apiSettings'\n\n/**\n * An AuthSession class intended for use with proxied requests\n *\n * This session uses `authenticate` to modify all requests to pass through a proxy server with\n * passing the request to the proxy server specified in the `proxyUrl` parameter, and sets\n * the original request path as an `X-Forwarded-For` header.\n *\n */\nexport abstract class ProxySession extends AuthSession {\n constructor(\n public settings: IApiSettings,\n public proxyUrl: string,\n transport?: ITransport\n ) {\n super(settings, transport || new BrowserTransport(settings))\n }\n\n /**\n * Proxy session is considered to be always authenticated since the proxy handles all auth\n *\n * @returns `true` since the proxy handles all authentication\n */\n isAuthenticated() {\n return true\n }\n\n /**\n * This implementation swaps the request's path with the proxy url, and puts the original\n * request path in the `X-Forwarded-For` header, presuming that the proxy server will add API authentication\n * information to the request that gets submitted to the Looker API, then forward the API response to the requestor\n *\n * @param props the properties of the request\n * @returns the same request properties with \"authentication\" data added\n *\n */\n async authenticate(props: IRequestProps) {\n if (!props.headers) {\n props.headers = {}\n }\n props.headers['X-Forwarded-For'] = props.url\n props.headers[LookerAppId] = agentPrefix\n props.url = this.proxyUrl\n return props\n }\n}\n"],"mappings":";;;;;;AA0BA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AAAsD,SAAAG,mBAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,EAAAC,GAAA,EAAAC,GAAA,cAAAC,IAAA,GAAAP,GAAA,CAAAK,GAAA,EAAAC,GAAA,OAAAE,KAAA,GAAAD,IAAA,CAAAC,KAAA,WAAAC,KAAA,IAAAP,MAAA,CAAAO,KAAA,iBAAAF,IAAA,CAAAG,IAAA,IAAAT,OAAA,CAAAO,KAAA,YAAAG,OAAA,CAAAV,OAAA,CAAAO,KAAA,EAAAI,IAAA,CAAAT,KAAA,EAAAC,MAAA;AAAA,SAAAS,kBAAAC,EAAA,6BAAAC,IAAA,SAAAC,IAAA,GAAAC,SAAA,aAAAN,OAAA,WAAAV,OAAA,EAAAC,MAAA,QAAAF,GAAA,GAAAc,EAAA,CAAAI,KAAA,CAAAH,IAAA,EAAAC,IAAA,YAAAb,MAAAK,KAAA,IAAAT,kBAAA,CAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,UAAAI,KAAA,cAAAJ,OAAAe,GAAA,IAAApB,kBAAA,CAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,WAAAe,GAAA,KAAAhB,KAAA,CAAAiB,SAAA;AAW/C,MAAeC,YAAY,SAASC,wBAAW,CAAC;EACrDC,WAAWA,CACFC,QAAsB,EACtBC,QAAgB,EACvBC,SAAsB,EACtB;IACA,KAAK,CAACF,QAAQ,EAAEE,SAAS,IAAI,IAAIC,kCAAgB,CAACH,QAAQ,CAAC,CAAC;IAAA,KAJrDA,QAAsB,GAAtBA,QAAsB;IAAA,KACtBC,QAAgB,GAAhBA,QAAgB;EAIzB;EAOAG,eAAeA,CAAA,EAAG;IAChB,OAAO,IAAI;EACb;EAWMC,YAAYA,CAACC,KAAoB,EAAE;IAAA,IAAAC,KAAA;IAAA,OAAAlB,iBAAA;MACvC,IAAI,CAACiB,KAAK,CAACE,OAAO,EAAE;QAClBF,KAAK,CAACE,OAAO,GAAG,CAAC,CAAC;MACpB;MACAF,KAAK,CAACE,OAAO,CAAC,iBAAiB,CAAC,GAAGF,KAAK,CAACG,GAAG;MAC5CH,KAAK,CAACE,OAAO,CAACE,sBAAW,CAAC,GAAGC,sBAAW;MACxCL,KAAK,CAACG,GAAG,GAAGF,KAAI,CAACN,QAAQ;MACzB,OAAOK,KAAK;IAAA;EACd;AACF;AAACM,OAAA,CAAAf,YAAA,GAAAA,YAAA"}
@@ -3,9 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
-
7
6
  var _testUtils = require("./testUtils");
8
-
9
7
  Object.keys(_testUtils).forEach(function (key) {
10
8
  if (key === "default" || key === "__esModule") return;
11
9
  if (key in exports && exports[key] === _testUtils[key]) return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/testUtils/index.ts"],"names":[],"mappings":";;;;;;AA0BA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nexport * from './testUtils'\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["_testUtils","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get"],"sources":["../../src/testUtils/index.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nexport * from './testUtils'\n"],"mappings":";;;;;AA0BA,IAAAA,UAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,UAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,UAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAT,UAAA,CAAAK,GAAA;IAAA;EAAA;AAAA"}
@@ -3,38 +3,24 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.TestConfig = exports.readFile = exports.rootFile = exports.getRootPath = void 0;
7
-
6
+ exports.rootFile = exports.readFile = exports.getRootPath = exports.TestConfig = void 0;
8
7
  var fs = _interopRequireWildcard(require("fs"));
9
-
10
8
  var _path = _interopRequireDefault(require("path"));
11
-
12
9
  var _dotenv = require("dotenv");
13
-
14
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
11
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
-
18
12
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
-
20
13
  var utf8 = 'utf-8';
21
14
  var homeToRoost = '../../../../';
22
-
23
15
  var getRootPath = () => _path.default.join(__dirname, homeToRoost);
24
-
25
16
  exports.getRootPath = getRootPath;
26
-
27
17
  var rootFile = function rootFile() {
28
18
  var fileName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
29
19
  return _path.default.join(getRootPath(), fileName);
30
20
  };
31
-
32
21
  exports.rootFile = rootFile;
33
-
34
22
  var readFile = fileName => fs.readFileSync(fileName, utf8);
35
-
36
23
  exports.readFile = readFile;
37
-
38
24
  var TestConfig = function TestConfig() {
39
25
  var rootPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
40
26
  (0, _dotenv.config)();
@@ -56,6 +42,5 @@ var TestConfig = function TestConfig() {
56
42
  testPath
57
43
  };
58
44
  };
59
-
60
45
  exports.TestConfig = TestConfig;
61
46
  //# sourceMappingURL=testUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/testUtils/testUtils.ts"],"names":["utf8","homeToRoost","getRootPath","path","join","__dirname","rootFile","fileName","readFile","fs","readFileSync","TestConfig","rootPath","testFile","localIni","process","env","LOOKERSDK_INI","testPath","dataFile","testData","JSON","parse","testIni","iniFile","existsSync"],"mappings":";;;;;;;AA0BA;;AACA;;AACA;;;;;;;;AAEA,IAAMA,IAAI,GAAG,OAAb;AAcA,IAAMC,WAAW,GAAG,cAApB;;AAEO,IAAMC,WAAW,GAAG,MAAMC,cAAKC,IAAL,CAAUC,SAAV,EAAqBJ,WAArB,CAA1B;;;;AACA,IAAMK,QAAQ,GAAG,SAAXA,QAAW;AAAA,MAACC,QAAD,uEAAY,EAAZ;AAAA,SAAmBJ,cAAKC,IAAL,CAAUF,WAAW,EAArB,EAAyBK,QAAzB,CAAnB;AAAA,CAAjB;;;;AACA,IAAMC,QAAQ,GAAID,QAAD,IAAsBE,EAAE,CAACC,YAAH,CAAgBH,QAAhB,EAA0BP,IAA1B,CAAvC;;;;AAQA,IAAMW,UAAU,GAAG,SAAbA,UAAa,GAAgC;AAAA,MAA/BC,QAA+B,uEAApB,EAAoB;AACxD;AACA,MAAMC,QAAQ,GAAG,eAAjB;AACAD,EAAAA,QAAQ,GAAGA,QAAQ,IAAIV,WAAW,EAAlC;AACA,MAAIY,QAAQ,GAAGC,OAAO,CAACC,GAAR,CAAYC,aAAZ,IAA6BX,QAAQ,CAAC,YAAD,CAApD;AACA,MAAMY,QAAQ,GAAGZ,QAAQ,CAAC,OAAD,CAAzB;AACA,MAAMa,QAAQ,aAAMD,QAAN,SAAiBL,QAAjB,CAAd;AACA,MAAMO,QAAQ,GAAGC,IAAI,CAACC,KAAL,CAAWb,EAAE,CAACC,YAAH,CAAgBS,QAAhB,EAA0BnB,IAA1B,CAAX,CAAjB;AACA,MAAIuB,OAAO,aAAMX,QAAN,SAAiBQ,QAAQ,CAACI,OAA1B,CAAX;AAGA,MAAI,CAACf,EAAE,CAACgB,UAAH,CAAcX,QAAd,CAAL,EAA8BA,QAAQ,GAAG,EAAX;AAC9B,MAAI,CAACL,EAAE,CAACgB,UAAH,CAAcF,OAAd,CAAL,EAA6BA,OAAO,GAAG,EAAV;AAE7B,SAAO;AACLJ,IAAAA,QADK;AAELL,IAAAA,QAFK;AAGLF,IAAAA,QAHK;AAILQ,IAAAA,QAJK;AAKLG,IAAAA,OALK;AAMLL,IAAAA;AANK,GAAP;AAQD,CAtBM","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport * as fs from 'fs'\nimport path from 'path'\nimport { config } from 'dotenv'\n\nconst utf8 = 'utf-8'\n\n/**\n * Properties used for various typescript-based tests\n */\nexport interface ITestConfig {\n rootPath: string\n testPath: string\n dataFile: string\n localIni: string\n testData: any\n testIni: string\n}\n\nconst homeToRoost = '../../../../'\n\nexport const getRootPath = () => path.join(__dirname, homeToRoost)\nexport const rootFile = (fileName = '') => path.join(getRootPath(), fileName)\nexport const readFile = (fileName: string) => fs.readFileSync(fileName, utf8)\n\n/**\n * Reads configuration information, returning various test values\n * @param {string} rootPath\n * @returns {{testConfig: {[p: string]: any}; localIni: string; baseUrl: any; testData: any; apiVersion: any; testIni: string; configContents: string; rootPath: string; testSection: any; timeout: number}}\n * @constructor\n */\nexport const TestConfig = (rootPath = ''): ITestConfig => {\n config()\n const testFile = 'data.yml.json'\n rootPath = rootPath || getRootPath()\n let localIni = process.env.LOOKERSDK_INI || rootFile('looker.ini')\n const testPath = rootFile('test/')\n const dataFile = `${testPath}${testFile}`\n const testData = JSON.parse(fs.readFileSync(dataFile, utf8))\n let testIni = `${rootPath}${testData.iniFile}`\n\n // If .ini files don't exist, don't try to read them downstream and expect environment variables to be set\n if (!fs.existsSync(localIni)) localIni = ''\n if (!fs.existsSync(testIni)) testIni = ''\n\n return {\n dataFile,\n localIni,\n rootPath,\n testData,\n testIni,\n testPath,\n }\n}\n"],"file":"testUtils.js"}
1
+ {"version":3,"file":"testUtils.js","names":["fs","_interopRequireWildcard","require","_path","_interopRequireDefault","_dotenv","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","utf8","homeToRoost","getRootPath","path","join","__dirname","exports","rootFile","fileName","arguments","length","undefined","readFile","readFileSync","TestConfig","rootPath","config","testFile","localIni","process","env","LOOKERSDK_INI","testPath","dataFile","concat","testData","JSON","parse","testIni","iniFile","existsSync"],"sources":["../../src/testUtils/testUtils.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport * as fs from 'fs'\nimport path from 'path'\nimport { config } from 'dotenv'\n\nconst utf8 = 'utf-8'\n\n/**\n * Properties used for various typescript-based tests\n */\nexport interface ITestConfig {\n rootPath: string\n testPath: string\n dataFile: string\n localIni: string\n testData: any\n testIni: string\n}\n\nconst homeToRoost = '../../../../'\n\nexport const getRootPath = () => path.join(__dirname, homeToRoost)\nexport const rootFile = (fileName = '') => path.join(getRootPath(), fileName)\nexport const readFile = (fileName: string) => fs.readFileSync(fileName, utf8)\n\n/**\n * Reads configuration information, returning various test values\n * @param {string} rootPath\n * @returns {{testConfig: {[p: string]: any}; localIni: string; baseUrl: any; testData: any; apiVersion: any; testIni: string; configContents: string; rootPath: string; testSection: any; timeout: number}}\n * @constructor\n */\nexport const TestConfig = (rootPath = ''): ITestConfig => {\n config()\n const testFile = 'data.yml.json'\n rootPath = rootPath || getRootPath()\n let localIni = process.env.LOOKERSDK_INI || rootFile('looker.ini')\n const testPath = rootFile('test/')\n const dataFile = `${testPath}${testFile}`\n const testData = JSON.parse(fs.readFileSync(dataFile, utf8))\n let testIni = `${rootPath}${testData.iniFile}`\n\n // If .ini files don't exist, don't try to read them downstream and expect environment variables to be set\n if (!fs.existsSync(localIni)) localIni = ''\n if (!fs.existsSync(testIni)) testIni = ''\n\n return {\n dataFile,\n localIni,\n rootPath,\n testData,\n testIni,\n testPath,\n }\n}\n"],"mappings":"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"}