@looker/sdk-rtl 21.6.0 → 21.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/CHANGELOG.md +53 -60
  2. package/README.md +101 -1
  3. package/lib/CSRFSession.js +2 -2
  4. package/lib/CSRFSession.js.map +1 -1
  5. package/lib/apiMethods.d.ts +2 -19
  6. package/lib/apiMethods.js +4 -4
  7. package/lib/apiMethods.js.map +1 -1
  8. package/lib/apiSettings.d.ts +1 -1
  9. package/lib/apiSettings.js +3 -4
  10. package/lib/apiSettings.js.map +1 -1
  11. package/lib/authSession.js +2 -2
  12. package/lib/authSession.js.map +1 -1
  13. package/lib/authToken.js +2 -2
  14. package/lib/authToken.js.map +1 -1
  15. package/lib/baseTransport.d.ts +4 -3
  16. package/lib/baseTransport.js +51 -2
  17. package/lib/baseTransport.js.map +1 -1
  18. package/lib/browser.js.map +1 -1
  19. package/lib/browserServices.js +2 -2
  20. package/lib/browserServices.js.map +1 -1
  21. package/lib/browserSession.d.ts +1 -1
  22. package/lib/browserSession.js +4 -4
  23. package/lib/browserSession.js.map +1 -1
  24. package/lib/browserTransport.d.ts +3 -4
  25. package/lib/browserTransport.js +98 -80
  26. package/lib/browserTransport.js.map +1 -1
  27. package/lib/constants.d.ts +4 -4
  28. package/lib/constants.js +5 -10
  29. package/lib/constants.js.map +1 -1
  30. package/lib/cryptoHash.js.map +1 -1
  31. package/lib/delimArray.d.ts +1 -1
  32. package/lib/delimArray.js +2 -2
  33. package/lib/delimArray.js.map +1 -1
  34. package/lib/errorDoc.d.ts +4 -4
  35. package/lib/errorDoc.js +7 -10
  36. package/lib/errorDoc.js.map +1 -1
  37. package/lib/esm/CSRFSession.js +6 -13
  38. package/lib/esm/CSRFSession.js.map +1 -1
  39. package/lib/esm/apiMethods.js +9 -17
  40. package/lib/esm/apiMethods.js.map +1 -1
  41. package/lib/esm/apiSettings.js +20 -32
  42. package/lib/esm/apiSettings.js.map +1 -1
  43. package/lib/esm/authSession.js +6 -13
  44. package/lib/esm/authSession.js.map +1 -1
  45. package/lib/esm/authToken.js +3 -10
  46. package/lib/esm/authToken.js.map +1 -1
  47. package/lib/esm/baseTransport.js +55 -13
  48. package/lib/esm/baseTransport.js.map +1 -1
  49. package/lib/esm/browser.js +17 -192
  50. package/lib/esm/browser.js.map +1 -1
  51. package/lib/esm/browserServices.js +8 -15
  52. package/lib/esm/browserServices.js.map +1 -1
  53. package/lib/esm/browserSession.js +12 -19
  54. package/lib/esm/browserSession.js.map +1 -1
  55. package/lib/esm/browserTransport.js +104 -94
  56. package/lib/esm/browserTransport.js.map +1 -1
  57. package/lib/esm/constants.js +8 -22
  58. package/lib/esm/constants.js.map +1 -1
  59. package/lib/esm/cryptoHash.js.map +1 -1
  60. package/lib/esm/delimArray.js +3 -10
  61. package/lib/esm/delimArray.js.map +1 -1
  62. package/lib/esm/errorDoc.js +10 -20
  63. package/lib/esm/errorDoc.js.map +1 -1
  64. package/lib/esm/extensionSession.js +3 -10
  65. package/lib/esm/extensionSession.js.map +1 -1
  66. package/lib/esm/extensionTransport.js +8 -12
  67. package/lib/esm/extensionTransport.js.map +1 -1
  68. package/lib/esm/index.js +22 -236
  69. package/lib/esm/index.js.map +1 -1
  70. package/lib/esm/lookerSDKError.js +9 -19
  71. package/lib/esm/lookerSDKError.js.map +1 -1
  72. package/lib/esm/oauthSession.js +15 -22
  73. package/lib/esm/oauthSession.js.map +1 -1
  74. package/lib/esm/paging.js +11 -23
  75. package/lib/esm/paging.js.map +1 -1
  76. package/lib/esm/platformServices.js.map +1 -1
  77. package/lib/esm/proxySession.js +6 -13
  78. package/lib/esm/proxySession.js.map +1 -1
  79. package/lib/esm/sleep.js +14 -0
  80. package/lib/esm/sleep.js.map +1 -0
  81. package/lib/esm/testUtils/index.js +1 -16
  82. package/lib/esm/testUtils/index.js.map +1 -1
  83. package/lib/esm/testUtils/testUtils.js +20 -26
  84. package/lib/esm/testUtils/testUtils.js.map +1 -1
  85. package/lib/esm/transport.js +126 -61
  86. package/lib/esm/transport.js.map +1 -1
  87. package/lib/extensionSession.d.ts +1 -1
  88. package/lib/extensionSession.js +2 -2
  89. package/lib/extensionSession.js.map +1 -1
  90. package/lib/extensionTransport.d.ts +3 -3
  91. package/lib/extensionTransport.js +7 -4
  92. package/lib/extensionTransport.js.map +1 -1
  93. package/lib/index.d.ts +1 -0
  94. package/lib/index.js +11 -0
  95. package/lib/index.js.map +1 -1
  96. package/lib/lookerSDKError.d.ts +1 -1
  97. package/lib/lookerSDKError.js +9 -13
  98. package/lib/lookerSDKError.js.map +1 -1
  99. package/lib/oauthSession.d.ts +6 -4
  100. package/lib/oauthSession.js +7 -7
  101. package/lib/oauthSession.js.map +1 -1
  102. package/lib/paging.d.ts +5 -6
  103. package/lib/paging.js +4 -6
  104. package/lib/paging.js.map +1 -1
  105. package/lib/platformServices.js.map +1 -1
  106. package/lib/proxySession.d.ts +1 -1
  107. package/lib/proxySession.js.map +1 -1
  108. package/lib/sleep.d.ts +1 -0
  109. package/lib/sleep.js +20 -0
  110. package/lib/sleep.js.map +1 -0
  111. package/lib/testUtils/index.js.map +1 -1
  112. package/lib/testUtils/testUtils.js +16 -11
  113. package/lib/testUtils/testUtils.js.map +1 -1
  114. package/lib/transport.d.ts +64 -17
  115. package/lib/transport.js +117 -24
  116. package/lib/transport.js.map +1 -1
  117. package/package.json +5 -13
@@ -1,23 +1,17 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.OAuthSession = void 0;
7
- var _authSession = require("./authSession");
8
- var _transport = require("./transport");
9
- var _authToken = require("./authToken");
10
1
  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); } }
11
2
  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); }); }; }
12
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
3
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
5
  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; }
15
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
16
- 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); }
17
- class OAuthSession extends _authSession.AuthSession {
6
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
7
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
8
+ import { AuthSession } from './authSession';
9
+ import { agentPrefix, sdkError } from './transport';
10
+ import { AuthToken } from './authToken';
11
+ export class OAuthSession extends AuthSession {
18
12
  constructor(services) {
19
13
  super(services.settings, services.transport);
20
- _defineProperty(this, "activeToken", new _authToken.AuthToken());
14
+ _defineProperty(this, "activeToken", new AuthToken());
21
15
  _defineProperty(this, "crypto", void 0);
22
16
  _defineProperty(this, "reentry", false);
23
17
  this.crypto = services.crypto;
@@ -26,7 +20,7 @@ class OAuthSession extends _authSession.AuthSession {
26
20
  keys.forEach(key => {
27
21
  var value = config[key];
28
22
  if (!value) {
29
- throw (0, _transport.sdkError)({
23
+ throw sdkError({
30
24
  message: "Missing required configuration setting: '".concat(key, "'")
31
25
  });
32
26
  }
@@ -74,7 +68,7 @@ class OAuthSession extends _authSession.AuthSession {
74
68
  return _asyncToGenerator(function* () {
75
69
  if (!_this2.isAuthenticated()) {
76
70
  if (_this2.reentry) {} else if (!_this2.returnUrl) {
77
- var authUrl = yield _this2.createAuthCodeRequestUrl('cors_api', _transport.agentPrefix);
71
+ var authUrl = yield _this2.createAuthCodeRequestUrl('cors_api', agentPrefix);
78
72
  var returnTo = window.location.pathname + window.location.search;
79
73
  _this2.returnUrl = returnTo;
80
74
  window.location.href = authUrl;
@@ -115,12 +109,12 @@ class OAuthSession extends _authSession.AuthSession {
115
109
  var config = _this4.readConfig();
116
110
  var params = {
117
111
  client_id: config.client_id,
118
- code_challenge: code_challenge,
112
+ code_challenge,
119
113
  code_challenge_method: 'S256',
120
114
  redirect_uri: config.redirect_uri,
121
115
  response_type: 'code',
122
- scope: scope,
123
- state: state
116
+ scope,
117
+ state
124
118
  };
125
119
  var url = new URL(config.looker_url);
126
120
  url.pathname = '/auth';
@@ -173,7 +167,7 @@ class OAuthSession extends _authSession.AuthSession {
173
167
  init.headers.Authorization = "Bearer ".concat(_this7.activeToken.access_token);
174
168
  return init;
175
169
  }));
176
- _this7.activeToken = new _authToken.AuthToken();
170
+ _this7.activeToken = new AuthToken();
177
171
  _this7.clearStorage();
178
172
  return true;
179
173
  }
@@ -181,7 +175,6 @@ class OAuthSession extends _authSession.AuthSession {
181
175
  })();
182
176
  }
183
177
  }
184
- exports.OAuthSession = OAuthSession;
185
178
  _defineProperty(OAuthSession, "codeVerifierKey", 'looker_oauth_code_verifier');
186
179
  _defineProperty(OAuthSession, "returnUrlKey", 'looker_oauth_return_url');
187
180
  //# sourceMappingURL=oauthSession.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauthSession.js","names":["OAuthSession","AuthSession","constructor","services","settings","transport","AuthToken","crypto","keys","config","readConfig","forEach","key","value","sdkError","message","authenticate","props","token","getToken","access_token","headers","Authorization","code_verifier","sessionStorage","getItem","codeVerifierKey","removeItem","setItem","returnUrl","returnUrlKey","clearStorage","login","_sudoId","isAuthenticated","reentry","authUrl","createAuthCodeRequestUrl","agentPrefix","returnTo","window","location","pathname","search","href","Promise","reject","Error","params","URLSearchParams","code","get","redeemAuthCode","activeToken","requestToken","body","url","URL","base_url","ok","request","toString","undefined","setToken","scope","state","verifier","secureRandom","code_challenge","sha256Hash","client_id","code_challenge_method","redirect_uri","response_type","looker_url","redeemAuthCodeBody","authCode","codeVerifier","grant_type","refresh_token","isActive","logout","init"],"sources":["../../src/oauthSession.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 { IAccessToken, IError } from './authSession'\nimport { AuthSession } from './authSession'\nimport type { IRequestProps } from './transport'\nimport { agentPrefix, sdkError } from './transport'\nimport { AuthToken } from './authToken'\nimport type { ICryptoHash } from './cryptoHash'\nimport type { IPlatformServices } from './platformServices'\n\ninterface IAuthCodeGrantTypeParams {\n grant_type: 'authorization_code'\n code: string\n code_verifier: string\n client_id: string\n redirect_uri: string\n}\n\ninterface IRefreshTokenGrantTypeParams {\n grant_type: 'refresh_token'\n refresh_token: string\n client_id: string\n redirect_uri: string\n}\n\nexport class OAuthSession extends AuthSession {\n activeToken = new AuthToken()\n crypto: ICryptoHash\n reentry = false\n private static readonly codeVerifierKey = 'looker_oauth_code_verifier'\n public static readonly returnUrlKey = 'looker_oauth_return_url'\n\n constructor(services: IPlatformServices) {\n super(services.settings, services.transport)\n\n this.crypto = services.crypto\n\n const keys: string[] = [\n 'client_id',\n 'redirect_uri',\n 'base_url',\n 'looker_url',\n ]\n const config = { ...this.settings, ...this.settings.readConfig() }\n\n keys.forEach((key) => {\n const value = config[key]\n if (!value) {\n throw sdkError({\n message: `Missing required configuration setting: '${key}'`,\n })\n }\n })\n }\n\n /**\n * merge the dynamically defined configuration values with the initial settings\n */\n readConfig() {\n return { ...this.settings, ...this.settings.readConfig() }\n }\n\n /**\n * Apply current auth token credentials to an HTTP request\n * @param props request properties to update\n * @returns updated request properties with auth information added\n */\n async authenticate(props: IRequestProps): Promise<IRequestProps> {\n const token = await this.getToken()\n if (token.access_token) {\n props.headers.Authorization = `Bearer ${token.access_token}`\n }\n return props\n }\n\n /**\n * Gets session storage for OAuth code verification\n * @returns saved code verifier\n */\n get code_verifier() {\n return sessionStorage.getItem(OAuthSession.codeVerifierKey)\n }\n\n /**\n * Sets session storage for OAuth code verification\n */\n set code_verifier(value: string | null) {\n if (value === null) {\n // only clear code_verifier if it's `null`\n sessionStorage.removeItem(OAuthSession.codeVerifierKey)\n } else {\n sessionStorage.setItem(OAuthSession.codeVerifierKey, value)\n }\n }\n\n /**\n * URL to return to after login process completes\n * @returns the URL that started the OAuth login process\n */\n get returnUrl() {\n return sessionStorage.getItem(OAuthSession.returnUrlKey)\n }\n\n /**\n * Sets the return URL for successful OAuth login\n */\n set returnUrl(value: string | null) {\n if (!value) {\n sessionStorage.removeItem(OAuthSession.returnUrlKey)\n } else {\n sessionStorage.setItem(OAuthSession.returnUrlKey, value)\n }\n }\n\n /**\n * Clears all Looker SDK OAuth-related session storage\n */\n clearStorage() {\n sessionStorage.removeItem(OAuthSession.codeVerifierKey)\n sessionStorage.removeItem(OAuthSession.returnUrlKey)\n }\n\n async login(_sudoId?: string | number): Promise<any> {\n if (!this.isAuthenticated()) {\n if (this.reentry) {\n // do nothing\n } else if (!this.returnUrl) {\n // OAuth has not been initiated\n const authUrl = await this.createAuthCodeRequestUrl(\n 'cors_api',\n agentPrefix\n )\n const returnTo = window.location.pathname + window.location.search\n this.returnUrl = returnTo\n // Save the current URL so redirected successful OAuth login can restore it\n window.location.href = authUrl\n } else {\n this.reentry = true\n // If return URL is stored, we must be coming back from an OAuth request\n // so release the stored return url at the start of the redemption\n this.returnUrl = null\n if (!this.code_verifier) {\n return Promise.reject(\n new Error('OAuth failed: expected code_verifier to be stored')\n )\n }\n const params = new URLSearchParams(window.location.search)\n const code = params.get('code')\n if (!code) {\n return Promise.reject(\n new Error(\n `OAuth failed: no OAuth code parameter found in ${\n window.location.pathname + window.location.search\n }`\n )\n )\n }\n await this.redeemAuthCode(code)\n }\n return await this.getToken()\n }\n return this.activeToken\n }\n\n private async requestToken(\n body: IAuthCodeGrantTypeParams | IRefreshTokenGrantTypeParams\n ) {\n const config = this.readConfig()\n const url = new URL(config.base_url)\n // replace the entire path of the base_url because this\n // auth endpoint is independent of API version\n url.pathname = '/api/token'\n const token = await this.ok(\n this.transport.request<IAccessToken, IError>(\n 'POST',\n url.toString(),\n undefined,\n body\n )\n )\n\n return this.activeToken.setToken(token)\n }\n\n /*\n Generate an OAuth2 authCode request URL\n */\n async createAuthCodeRequestUrl(\n scope: string,\n state: string\n ): Promise<string> {\n // TODO: remove this comment when we remove hex backwards compatibility\n // in Looker API. For now it must not be 2^n so that Looker correctly\n // treats it as base64 encoded\n const verifier = this.crypto.secureRandom(33)\n this.code_verifier = verifier\n const code_challenge = await this.crypto.sha256Hash(verifier)\n const config = this.readConfig()\n const params: Record<string, string> = {\n client_id: config.client_id,\n code_challenge: code_challenge,\n code_challenge_method: 'S256',\n redirect_uri: config.redirect_uri,\n response_type: 'code',\n scope: scope,\n state: state,\n }\n const url = new URL(config.looker_url)\n url.pathname = '/auth'\n url.search = new URLSearchParams(params).toString()\n return url.toString()\n }\n\n redeemAuthCodeBody(authCode: string, codeVerifier?: string) {\n const verifier = codeVerifier || this.code_verifier || ''\n const config = this.readConfig()\n return {\n client_id: config.client_id,\n code: authCode,\n code_verifier: verifier,\n grant_type: 'authorization_code',\n redirect_uri: config.redirect_uri,\n } as IAuthCodeGrantTypeParams\n }\n\n /**\n * Convert an authCode received from server into an active auth token\n * The app is responsible for obtaining the authCode via interactive user login\n * via /auth front-end endpoint and URL redirect. When the authCode is received\n * by url redirect to an app route, pass the authCode into this function to\n * get an access_token and refresh_token.\n * @param {string} authCode\n * @param {string} codeVerifier\n * @returns {Promise<AuthToken>}\n */\n async redeemAuthCode(authCode: string, codeVerifier?: string) {\n return this.requestToken(this.redeemAuthCodeBody(authCode, codeVerifier))\n }\n\n async getToken() {\n if (!this.isAuthenticated()) {\n if (this.activeToken.refresh_token) {\n const config = this.readConfig()\n await this.requestToken({\n client_id: config.client_id,\n grant_type: 'refresh_token',\n redirect_uri: config.redirect_uri,\n refresh_token: this.activeToken.refresh_token,\n })\n }\n }\n return this.activeToken\n }\n\n isAuthenticated(): boolean {\n return this.activeToken.isActive()\n }\n\n async logout() {\n if (this.activeToken.access_token) {\n await this.ok(\n this.transport.request<IAccessToken, IError>(\n 'DELETE',\n `/api/logout`,\n undefined,\n undefined,\n (init: IRequestProps) => {\n init.headers.Authorization = `Bearer ${this.activeToken.access_token}`\n return init\n }\n )\n )\n\n // logout destroys the access_token AND the refresh_token\n this.activeToken = new AuthToken()\n this.clearStorage()\n return true\n }\n return false\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"oauthSession.js","names":["AuthSession","agentPrefix","sdkError","AuthToken","OAuthSession","constructor","services","settings","transport","_defineProperty","crypto","keys","config","_objectSpread","readConfig","forEach","key","value","message","concat","authenticate","props","_this","_asyncToGenerator","token","getToken","access_token","headers","Authorization","code_verifier","sessionStorage","getItem","codeVerifierKey","removeItem","setItem","returnUrl","returnUrlKey","clearStorage","login","_sudoId","_this2","isAuthenticated","reentry","authUrl","createAuthCodeRequestUrl","returnTo","window","location","pathname","search","href","Promise","reject","Error","params","URLSearchParams","code","get","redeemAuthCode","activeToken","requestToken","body","_this3","url","URL","base_url","ok","request","toString","undefined","setToken","scope","state","_this4","verifier","secureRandom","code_challenge","sha256Hash","client_id","code_challenge_method","redirect_uri","response_type","looker_url","redeemAuthCodeBody","authCode","codeVerifier","grant_type","_this5","_this6","refresh_token","isActive","logout","_this7","init"],"sources":["../../src/oauthSession.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 { IAccessToken, IError } from './authSession';\nimport { AuthSession } from './authSession';\nimport type { IRequestProps } from './transport';\nimport { agentPrefix, sdkError } from './transport';\nimport { AuthToken } from './authToken';\nimport type { ICryptoHash } from './cryptoHash';\nimport type { IPlatformServices } from './platformServices';\n\ninterface IAuthCodeGrantTypeParams {\n grant_type: 'authorization_code';\n code: string;\n code_verifier: string;\n client_id: string;\n redirect_uri: string;\n}\n\ninterface IRefreshTokenGrantTypeParams {\n grant_type: 'refresh_token';\n refresh_token: string;\n client_id: string;\n redirect_uri: string;\n}\n\nexport class OAuthSession extends AuthSession {\n activeToken = new AuthToken();\n crypto: ICryptoHash;\n reentry = false;\n private static readonly codeVerifierKey = 'looker_oauth_code_verifier';\n public static readonly returnUrlKey = 'looker_oauth_return_url';\n\n constructor(services: IPlatformServices) {\n super(services.settings, services.transport);\n\n this.crypto = services.crypto;\n\n const keys: string[] = [\n 'client_id',\n 'redirect_uri',\n 'base_url',\n 'looker_url',\n ];\n const config = { ...this.settings, ...this.settings.readConfig() };\n\n keys.forEach(key => {\n const value = config[key];\n if (!value) {\n throw sdkError({\n message: `Missing required configuration setting: '${key}'`,\n });\n }\n });\n }\n\n /**\n * merge the dynamically defined configuration values with the initial settings\n */\n readConfig() {\n return { ...this.settings, ...this.settings.readConfig() };\n }\n\n /**\n * Apply current auth token credentials to an HTTP request\n * @param props request properties to update\n * @returns updated request properties with auth information added\n */\n async authenticate(props: IRequestProps): Promise<IRequestProps> {\n const token = await this.getToken();\n if (token.access_token) {\n props.headers.Authorization = `Bearer ${token.access_token}`;\n }\n return props;\n }\n\n /**\n * Gets session storage for OAuth code verification\n * @returns saved code verifier\n */\n get code_verifier() {\n return sessionStorage.getItem(OAuthSession.codeVerifierKey);\n }\n\n /**\n * Sets session storage for OAuth code verification\n */\n set code_verifier(value: string | null) {\n if (value === null) {\n // only clear code_verifier if it's `null`\n sessionStorage.removeItem(OAuthSession.codeVerifierKey);\n } else {\n sessionStorage.setItem(OAuthSession.codeVerifierKey, value);\n }\n }\n\n /**\n * URL to return to after login process completes\n * @returns the URL that started the OAuth login process\n */\n get returnUrl() {\n return sessionStorage.getItem(OAuthSession.returnUrlKey);\n }\n\n /**\n * Sets the return URL for successful OAuth login\n */\n set returnUrl(value: string | null) {\n if (!value) {\n sessionStorage.removeItem(OAuthSession.returnUrlKey);\n } else {\n sessionStorage.setItem(OAuthSession.returnUrlKey, value);\n }\n }\n\n /**\n * Clears all Looker SDK OAuth-related session storage\n */\n clearStorage() {\n sessionStorage.removeItem(OAuthSession.codeVerifierKey);\n sessionStorage.removeItem(OAuthSession.returnUrlKey);\n }\n\n async login(_sudoId?: string | number): Promise<any> {\n if (!this.isAuthenticated()) {\n if (this.reentry) {\n // do nothing\n } else if (!this.returnUrl) {\n // OAuth has not been initiated\n const authUrl = await this.createAuthCodeRequestUrl(\n 'cors_api',\n agentPrefix\n );\n const returnTo = window.location.pathname + window.location.search;\n this.returnUrl = returnTo;\n // Save the current URL so redirected successful OAuth login can restore it\n window.location.href = authUrl;\n } else {\n this.reentry = true;\n // If return URL is stored, we must be coming back from an OAuth request\n // so release the stored return url at the start of the redemption\n this.returnUrl = null;\n if (!this.code_verifier) {\n return Promise.reject(\n new Error('OAuth failed: expected code_verifier to be stored')\n );\n }\n const params = new URLSearchParams(window.location.search);\n const code = params.get('code');\n if (!code) {\n return Promise.reject(\n new Error(\n `OAuth failed: no OAuth code parameter found in ${\n window.location.pathname + window.location.search\n }`\n )\n );\n }\n await this.redeemAuthCode(code);\n }\n return await this.getToken();\n }\n return this.activeToken;\n }\n\n private async requestToken(\n body: IAuthCodeGrantTypeParams | IRefreshTokenGrantTypeParams\n ) {\n const config = this.readConfig();\n const url = new URL(config.base_url);\n // replace the entire path of the base_url because this\n // auth endpoint is independent of API version\n url.pathname = '/api/token';\n const token = await this.ok(\n this.transport.request<IAccessToken, IError>(\n 'POST',\n url.toString(),\n undefined,\n body\n )\n );\n\n return this.activeToken.setToken(token);\n }\n\n /*\n Generate an OAuth2 authCode request URL\n */\n async createAuthCodeRequestUrl(\n scope: string,\n state: string\n ): Promise<string> {\n // TODO: remove this comment when we remove hex backwards compatibility\n // in Looker API. For now it must not be 2^n so that Looker correctly\n // treats it as base64 encoded\n const verifier = this.crypto.secureRandom(33);\n this.code_verifier = verifier;\n const code_challenge = await this.crypto.sha256Hash(verifier);\n const config = this.readConfig();\n const params: Record<string, string> = {\n client_id: config.client_id,\n code_challenge,\n code_challenge_method: 'S256',\n redirect_uri: config.redirect_uri,\n response_type: 'code',\n scope,\n state,\n };\n const url = new URL(config.looker_url);\n url.pathname = '/auth';\n url.search = new URLSearchParams(params).toString();\n return url.toString();\n }\n\n redeemAuthCodeBody(authCode: string, codeVerifier?: string) {\n const verifier = codeVerifier || this.code_verifier || '';\n const config = this.readConfig();\n return {\n client_id: config.client_id,\n code: authCode,\n code_verifier: verifier,\n grant_type: 'authorization_code',\n redirect_uri: config.redirect_uri,\n } as IAuthCodeGrantTypeParams;\n }\n\n /**\n * Convert an authCode received from server into an active auth token\n * The app is responsible for obtaining the authCode via interactive user login\n * via /auth front-end endpoint and URL redirect. When the authCode is received\n * by url redirect to an app route, pass the authCode into this function to\n * get an access_token and refresh_token.\n * @param {string} authCode\n * @param {string} codeVerifier\n * @returns {Promise<AuthToken>}\n */\n async redeemAuthCode(authCode: string, codeVerifier?: string) {\n return this.requestToken(this.redeemAuthCodeBody(authCode, codeVerifier));\n }\n\n async getToken() {\n if (!this.isAuthenticated()) {\n if (this.activeToken.refresh_token) {\n const config = this.readConfig();\n await this.requestToken({\n client_id: config.client_id,\n grant_type: 'refresh_token',\n redirect_uri: config.redirect_uri,\n refresh_token: this.activeToken.refresh_token,\n });\n }\n }\n return this.activeToken;\n }\n\n isAuthenticated(): boolean {\n return this.activeToken.isActive();\n }\n\n async logout() {\n if (this.activeToken.access_token) {\n await this.ok(\n this.transport.request<IAccessToken, IError>(\n 'DELETE',\n `/api/logout`,\n undefined,\n undefined,\n (init: IRequestProps) => {\n init.headers.Authorization = `Bearer ${this.activeToken.access_token}`;\n return init;\n }\n )\n );\n\n // logout destroys the access_token AND the refresh_token\n this.activeToken = new AuthToken();\n this.clearStorage();\n return true;\n }\n return false;\n }\n}\n"],"mappings":"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"}
package/lib/esm/paging.js CHANGED
@@ -1,22 +1,12 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.linkHeaderParser = exports.TotalCountHeader = exports.Paging = exports.LinkHeader = void 0;
7
- exports.pageAll = pageAll;
8
- exports.pager = pager;
9
- var _transport = require("./transport");
10
1
  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); }
2
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
3
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
13
4
  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); } }
14
5
  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); }); }; }
15
- var LinkHeader = 'Link';
16
- exports.LinkHeader = LinkHeader;
17
- var TotalCountHeader = 'X-Total-Count';
18
- exports.TotalCountHeader = TotalCountHeader;
19
- var linkHeaderParser = linkHeader => {
6
+ import { sdkOk } from './transport';
7
+ export var LinkHeader = 'Link';
8
+ export var TotalCountHeader = 'X-Total-Count';
9
+ export var linkHeaderParser = linkHeader => {
20
10
  var re = /<\s*(.*)\s*>;\s*rel="\s*(.*)\s*"\s*/gm;
21
11
  var links = linkHeader.split(',');
22
12
  var obj = {};
@@ -34,8 +24,7 @@ var linkHeaderParser = linkHeader => {
34
24
  });
35
25
  return obj;
36
26
  };
37
- exports.linkHeaderParser = linkHeaderParser;
38
- function pager(_x, _x2, _x3) {
27
+ export function pager(_x, _x2, _x3) {
39
28
  return _pager.apply(this, arguments);
40
29
  }
41
30
  function _pager() {
@@ -44,7 +33,7 @@ function _pager() {
44
33
  });
45
34
  return _pager.apply(this, arguments);
46
35
  }
47
- function pageAll(_x4, _x5) {
36
+ export function pageAll(_x4, _x5) {
48
37
  return _pageAll.apply(this, arguments);
49
38
  }
50
39
  function _pageAll() {
@@ -64,7 +53,7 @@ function _pageAll() {
64
53
  });
65
54
  return _pageAll.apply(this, arguments);
66
55
  }
67
- class Paging {
56
+ export class Paging {
68
57
  constructor(sdk, func, options) {
69
58
  this.sdk = sdk;
70
59
  this.func = func;
@@ -90,7 +79,7 @@ class Paging {
90
79
  raw = response;
91
80
  return response;
92
81
  };
93
- _this.items = yield (0, _transport.sdkOk)(func());
82
+ _this.items = yield sdkOk(func());
94
83
  } finally {
95
84
  _this.transport.observer = saved;
96
85
  }
@@ -168,7 +157,7 @@ class Paging {
168
157
  var raw = yield _this3.transport.rawRequest('GET', link, undefined, undefined, authenticator, _this3.options);
169
158
  try {
170
159
  _this3.parse(raw);
171
- _this3.items = yield (0, _transport.sdkOk)(_this3.transport.parseResponse(raw));
160
+ _this3.items = yield sdkOk(_this3.transport.parseResponse(raw));
172
161
  result = {
173
162
  ok: true,
174
163
  value: _this3.items
@@ -228,5 +217,4 @@ class Paging {
228
217
  })();
229
218
  }
230
219
  }
231
- exports.Paging = Paging;
232
220
  //# sourceMappingURL=paging.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paging.js","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","sdkOk","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"],"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
+ {"version":3,"file":"paging.js","names":["sdkOk","LinkHeader","TotalCountHeader","linkHeaderParser","linkHeader","re","links","split","obj","arrRes","forEach","link","trim","exec","key","toLocaleLowerCase","url","rel","name","pager","_x","_x2","_x3","_pager","apply","arguments","_asyncToGenerator","sdk","pageFunc","options","Paging","init","pageAll","_x4","_x5","_pageAll","onPage","length","undefined","page","paged","items","more","ok","nextPage","err","Promise","reject","constructor","func","_defineProperty","transport","authSession","rawCatch","_this","raw","saved","observer","response","Object","keys","headers","Error","parse","limit","offset","x","Math","ceil","pages","total","_this2","hasRel","paramDefault","value","defaultValue","convert","v","parseInt","reset","getRel","_this3","result","authenticator","authenticate","error","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 {\n IAPIMethods,\n IRawResponse,\n ITransportSettings,\n SDKResponse,\n} from './transport';\nimport { sdkOk } from './transport';\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 +1 @@
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":""}
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":""}
@@ -1,17 +1,11 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.ProxySession = void 0;
7
- var _authSession = require("./authSession");
8
- var _browserTransport = require("./browserTransport");
9
- var _transport = require("./transport");
10
1
  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); } }
11
2
  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); }); }; }
12
- class ProxySession extends _authSession.AuthSession {
3
+ import { AuthSession } from './authSession';
4
+ import { BrowserTransport } from './browserTransport';
5
+ import { LookerAppId, agentPrefix } from './transport';
6
+ export class ProxySession extends AuthSession {
13
7
  constructor(settings, proxyUrl, transport) {
14
- super(settings, transport || new _browserTransport.BrowserTransport(settings));
8
+ super(settings, transport || new BrowserTransport(settings));
15
9
  this.settings = settings;
16
10
  this.proxyUrl = proxyUrl;
17
11
  }
@@ -25,11 +19,10 @@ class ProxySession extends _authSession.AuthSession {
25
19
  props.headers = {};
26
20
  }
27
21
  props.headers['X-Forwarded-For'] = props.url;
28
- props.headers[_transport.LookerAppId] = _transport.agentPrefix;
22
+ props.headers[LookerAppId] = agentPrefix;
29
23
  props.url = _this.proxyUrl;
30
24
  return props;
31
25
  })();
32
26
  }
33
27
  }
34
- exports.ProxySession = ProxySession;
35
28
  //# sourceMappingURL=proxySession.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxySession.js","names":["ProxySession","AuthSession","constructor","settings","proxyUrl","transport","BrowserTransport","isAuthenticated","authenticate","props","headers","url","LookerAppId","agentPrefix"],"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;AACA;AAEA;AAAsD;AAAA;AAW/C,MAAeA,YAAY,SAASC,wBAAW,CAAC;EACrDC,WAAW,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,eAAe,GAAG;IAChB,OAAO,IAAI;EACb;EAWMC,YAAY,CAACC,KAAoB,EAAE;IAAA;IAAA;MACvC,IAAI,CAACA,KAAK,CAACC,OAAO,EAAE;QAClBD,KAAK,CAACC,OAAO,GAAG,CAAC,CAAC;MACpB;MACAD,KAAK,CAACC,OAAO,CAAC,iBAAiB,CAAC,GAAGD,KAAK,CAACE,GAAG;MAC5CF,KAAK,CAACC,OAAO,CAACE,sBAAW,CAAC,GAAGC,sBAAW;MACxCJ,KAAK,CAACE,GAAG,GAAG,KAAI,CAACP,QAAQ;MACzB,OAAOK,KAAK;IAAA;EACd;AACF;AAAC"}
1
+ {"version":3,"file":"proxySession.js","names":["AuthSession","BrowserTransport","LookerAppId","agentPrefix","ProxySession","constructor","settings","proxyUrl","transport","isAuthenticated","authenticate","props","_this","_asyncToGenerator","headers","url"],"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 { IRequestProps, ITransport } 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,SAASA,WAAW,QAAQ,eAAe;AAC3C,SAASC,gBAAgB,QAAQ,oBAAoB;AAErD,SAASC,WAAW,EAAEC,WAAW,QAAQ,aAAa;AAWtD,OAAO,MAAeC,YAAY,SAASJ,WAAW,CAAC;EACrDK,WAAWA,CACFC,QAAsB,EACtBC,QAAgB,EACvBC,SAAsB,EACtB;IACA,KAAK,CAACF,QAAQ,EAAEE,SAAS,IAAI,IAAIP,gBAAgB,CAACK,QAAQ,CAAC,CAAC;IAAC,KAJtDA,QAAsB,GAAtBA,QAAsB;IAAA,KACtBC,QAAgB,GAAhBA,QAAgB;EAIzB;EAOAE,eAAeA,CAAA,EAAG;IAChB,OAAO,IAAI;EACb;EAWMC,YAAYA,CAACC,KAAoB,EAAE;IAAA,IAAAC,KAAA;IAAA,OAAAC,iBAAA;MACvC,IAAI,CAACF,KAAK,CAACG,OAAO,EAAE;QAClBH,KAAK,CAACG,OAAO,GAAG,CAAC,CAAC;MACpB;MACAH,KAAK,CAACG,OAAO,CAAC,iBAAiB,CAAC,GAAGH,KAAK,CAACI,GAAG;MAC5CJ,KAAK,CAACG,OAAO,CAACZ,WAAW,CAAC,GAAGC,WAAW;MACxCQ,KAAK,CAACI,GAAG,GAAGH,KAAI,CAACL,QAAQ;MACzB,OAAOI,KAAK;IAAC;EACf;AACF"}
@@ -0,0 +1,14 @@
1
+ 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); } }
2
+ 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); }); }; }
3
+ export function sleep(_x) {
4
+ return _sleep.apply(this, arguments);
5
+ }
6
+ function _sleep() {
7
+ _sleep = _asyncToGenerator(function* (timeMs) {
8
+ return new Promise(resolve => {
9
+ setTimeout(resolve, timeMs);
10
+ });
11
+ });
12
+ return _sleep.apply(this, arguments);
13
+ }
14
+ //# sourceMappingURL=sleep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.js","names":["sleep","_x","_sleep","apply","arguments","_asyncToGenerator","timeMs","Promise","resolve","setTimeout"],"sources":["../../src/sleep.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2023 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\n/**\n * Simple async sleep function using setTimeout\n * @param timeMs milliseconds to sleep\n */\nexport async function sleep(timeMs: number) {\n return new Promise(resolve => {\n setTimeout(resolve, timeMs);\n });\n}\n"],"mappings":";;AA8BA,gBAAsBA,KAAKA,CAAAC,EAAA;EAAA,OAAAC,MAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAI1B,SAAAF,OAAA;EAAAA,MAAA,GAAAG,iBAAA,CAJM,WAAqBC,MAAc,EAAE;IAC1C,OAAO,IAAIC,OAAO,CAACC,OAAO,IAAI;MAC5BC,UAAU,CAACD,OAAO,EAAEF,MAAM,CAAC;IAC7B,CAAC,CAAC;EACJ,CAAC;EAAA,OAAAJ,MAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA"}
@@ -1,17 +1,2 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- var _testUtils = require("./testUtils");
7
- Object.keys(_testUtils).forEach(function (key) {
8
- if (key === "default" || key === "__esModule") return;
9
- if (key in exports && exports[key] === _testUtils[key]) return;
10
- Object.defineProperty(exports, key, {
11
- enumerable: true,
12
- get: function get() {
13
- return _testUtils[key];
14
- }
15
- });
16
- });
1
+ export * from './testUtils';
17
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"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;AAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"index.js","names":[],"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,cAAc,aAAa"}
@@ -1,35 +1,30 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.rootFile = exports.readFile = exports.getRootPath = exports.TestConfig = void 0;
7
- var fs = _interopRequireWildcard(require("fs"));
8
- var _path = _interopRequireDefault(require("path"));
9
- var _dotenv = require("dotenv");
10
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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); }
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; }
1
+ import * as fs from 'fs';
2
+ import path from 'path';
3
+ import * as yaml from 'js-yaml';
4
+ import { findRootSync } from '@manypkg/find-root';
5
+ import { config } from 'dotenv';
13
6
  var utf8 = 'utf-8';
14
- var homeToRoost = '../../../../';
15
- var getRootPath = () => _path.default.join(__dirname, homeToRoost);
16
- exports.getRootPath = getRootPath;
17
- var rootFile = function rootFile() {
7
+ var rootPath = '';
8
+ export var getRootPath = () => {
9
+ if (!rootPath) {
10
+ rootPath = findRootSync(__dirname).rootDir;
11
+ }
12
+ return rootPath;
13
+ };
14
+ export var rootFile = function rootFile() {
18
15
  var fileName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
19
- return _path.default.join(getRootPath(), fileName);
16
+ return path.join(getRootPath(), fileName);
20
17
  };
21
- exports.rootFile = rootFile;
22
- var readFile = fileName => fs.readFileSync(fileName, utf8);
23
- exports.readFile = readFile;
24
- var TestConfig = function TestConfig() {
18
+ export var readFile = fileName => fs.readFileSync(fileName, utf8);
19
+ export var TestConfig = function TestConfig() {
25
20
  var rootPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
26
- (0, _dotenv.config)();
27
- var testFile = 'data.yml.json';
21
+ config();
22
+ var testFile = 'data.yml';
28
23
  rootPath = rootPath || getRootPath();
29
24
  var localIni = process.env.LOOKERSDK_INI || rootFile('looker.ini');
30
- var testPath = rootFile('test/');
25
+ var testPath = "".concat(rootPath, "/packages/sdk-codegen-utils/data/");
31
26
  var dataFile = "".concat(testPath).concat(testFile);
32
- var testData = JSON.parse(fs.readFileSync(dataFile, utf8));
27
+ var testData = fs.existsSync(dataFile) ? yaml.load(fs.readFileSync(dataFile, utf8)) : {};
33
28
  var testIni = "".concat(rootPath).concat(testData.iniFile);
34
29
  if (!fs.existsSync(localIni)) localIni = '';
35
30
  if (!fs.existsSync(testIni)) testIni = '';
@@ -42,5 +37,4 @@ var TestConfig = function TestConfig() {
42
37
  testPath
43
38
  };
44
39
  };
45
- exports.TestConfig = TestConfig;
46
40
  //# sourceMappingURL=testUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.js","names":["utf8","homeToRoost","getRootPath","path","join","__dirname","rootFile","fileName","readFile","fs","readFileSync","TestConfig","rootPath","config","testFile","localIni","process","env","LOOKERSDK_INI","testPath","dataFile","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":";;;;;;AA0BA;AACA;AACA;AAA+B;AAAA;AAAA;AAE/B,IAAMA,IAAI,GAAG,OAAO;AAcpB,IAAMC,WAAW,GAAG,cAAc;AAE3B,IAAMC,WAAW,GAAG,MAAMC,aAAI,CAACC,IAAI,CAACC,SAAS,EAAEJ,WAAW,CAAC;AAAA;AAC3D,IAAMK,QAAQ,GAAG,SAAXA,QAAQ;EAAA,IAAIC,QAAQ,uEAAG,EAAE;EAAA,OAAKJ,aAAI,CAACC,IAAI,CAACF,WAAW,EAAE,EAAEK,QAAQ,CAAC;AAAA;AAAA;AACtE,IAAMC,QAAQ,GAAID,QAAgB,IAAKE,EAAE,CAACC,YAAY,CAACH,QAAQ,EAAEP,IAAI,CAAC;AAAA;AAQtE,IAAMW,UAAU,GAAG,SAAbA,UAAU,GAAmC;EAAA,IAA/BC,QAAQ,uEAAG,EAAE;EACtC,IAAAC,cAAM,GAAE;EACR,IAAMC,QAAQ,GAAG,eAAe;EAChCF,QAAQ,GAAGA,QAAQ,IAAIV,WAAW,EAAE;EACpC,IAAIa,QAAQ,GAAGC,OAAO,CAACC,GAAG,CAACC,aAAa,IAAIZ,QAAQ,CAAC,YAAY,CAAC;EAClE,IAAMa,QAAQ,GAAGb,QAAQ,CAAC,OAAO,CAAC;EAClC,IAAMc,QAAQ,aAAMD,QAAQ,SAAGL,QAAQ,CAAE;EACzC,IAAMO,QAAQ,GAAGC,IAAI,CAACC,KAAK,CAACd,EAAE,CAACC,YAAY,CAACU,QAAQ,EAAEpB,IAAI,CAAC,CAAC;EAC5D,IAAIwB,OAAO,aAAMZ,QAAQ,SAAGS,QAAQ,CAACI,OAAO,CAAE;EAG9C,IAAI,CAAChB,EAAE,CAACiB,UAAU,CAACX,QAAQ,CAAC,EAAEA,QAAQ,GAAG,EAAE;EAC3C,IAAI,CAACN,EAAE,CAACiB,UAAU,CAACF,OAAO,CAAC,EAAEA,OAAO,GAAG,EAAE;EAEzC,OAAO;IACLJ,QAAQ;IACRL,QAAQ;IACRH,QAAQ;IACRS,QAAQ;IACRG,OAAO;IACPL;EACF,CAAC;AACH,CAAC;AAAA"}
1
+ {"version":3,"file":"testUtils.js","names":["fs","path","yaml","findRootSync","config","utf8","rootPath","getRootPath","__dirname","rootDir","rootFile","fileName","arguments","length","undefined","join","readFile","readFileSync","TestConfig","testFile","localIni","process","env","LOOKERSDK_INI","testPath","concat","dataFile","testData","existsSync","load","testIni","iniFile"],"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 * as yaml from 'js-yaml';\nimport { findRootSync } from '@manypkg/find-root';\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\nlet rootPath = '';\n/** fully resolved root dir of the repository */\nexport const getRootPath = (): string => {\n if (!rootPath) {\n rootPath = findRootSync(__dirname).rootDir;\n }\n return rootPath;\n};\n\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';\n rootPath = rootPath || getRootPath();\n let localIni = process.env.LOOKERSDK_INI || rootFile('looker.ini');\n const testPath = `${rootPath}/packages/sdk-codegen-utils/data/`;\n const dataFile = `${testPath}${testFile}`;\n const testData: any = fs.existsSync(dataFile)\n ? yaml.load(fs.readFileSync(dataFile, utf8))\n : {};\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":"AA0BA,OAAO,KAAKA,EAAE,MAAM,IAAI;AACxB,OAAOC,IAAI,MAAM,MAAM;AACvB,OAAO,KAAKC,IAAI,MAAM,SAAS;AAC/B,SAASC,YAAY,QAAQ,oBAAoB;AACjD,SAASC,MAAM,QAAQ,QAAQ;AAE/B,IAAMC,IAAI,GAAG,OAAO;AAcpB,IAAIC,QAAQ,GAAG,EAAE;AAEjB,OAAO,IAAMC,WAAW,GAAGA,CAAA,KAAc;EACvC,IAAI,CAACD,QAAQ,EAAE;IACbA,QAAQ,GAAGH,YAAY,CAACK,SAAS,CAAC,CAACC,OAAO;EAC5C;EACA,OAAOH,QAAQ;AACjB,CAAC;AAED,OAAO,IAAMI,QAAQ,GAAG,SAAXA,QAAQA,CAAA;EAAA,IAAIC,QAAQ,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;EAAA,OAAKX,IAAI,CAACc,IAAI,CAACR,WAAW,CAAC,CAAC,EAAEI,QAAQ,CAAC;AAAA;AAC7E,OAAO,IAAMK,QAAQ,GAAIL,QAAgB,IAAKX,EAAE,CAACiB,YAAY,CAACN,QAAQ,EAAEN,IAAI,CAAC;AAQ7E,OAAO,IAAMa,UAAU,GAAG,SAAbA,UAAUA,CAAA,EAAmC;EAAA,IAA/BZ,QAAQ,GAAAM,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;EACtCR,MAAM,CAAC,CAAC;EACR,IAAMe,QAAQ,GAAG,UAAU;EAC3Bb,QAAQ,GAAGA,QAAQ,IAAIC,WAAW,CAAC,CAAC;EACpC,IAAIa,QAAQ,GAAGC,OAAO,CAACC,GAAG,CAACC,aAAa,IAAIb,QAAQ,CAAC,YAAY,CAAC;EAClE,IAAMc,QAAQ,MAAAC,MAAA,CAAMnB,QAAQ,sCAAmC;EAC/D,IAAMoB,QAAQ,MAAAD,MAAA,CAAMD,QAAQ,EAAAC,MAAA,CAAGN,QAAQ,CAAE;EACzC,IAAMQ,QAAa,GAAG3B,EAAE,CAAC4B,UAAU,CAACF,QAAQ,CAAC,GACzCxB,IAAI,CAAC2B,IAAI,CAAC7B,EAAE,CAACiB,YAAY,CAACS,QAAQ,EAAErB,IAAI,CAAC,CAAC,GAC1C,CAAC,CAAC;EACN,IAAIyB,OAAO,MAAAL,MAAA,CAAMnB,QAAQ,EAAAmB,MAAA,CAAGE,QAAQ,CAACI,OAAO,CAAE;EAG9C,IAAI,CAAC/B,EAAE,CAAC4B,UAAU,CAACR,QAAQ,CAAC,EAAEA,QAAQ,GAAG,EAAE;EAC3C,IAAI,CAACpB,EAAE,CAAC4B,UAAU,CAACE,OAAO,CAAC,EAAEA,OAAO,GAAG,EAAE;EAEzC,OAAO;IACLJ,QAAQ;IACRN,QAAQ;IACRd,QAAQ;IACRqB,QAAQ;IACRG,OAAO;IACPN;EACF,CAAC;AACH,CAAC"}