@looker/sdk-rtl 21.3.0 → 21.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,40 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ### [21.3.3](https://www.github.com/looker-open-source/sdk-codegen/compare/sdk-rtl-v21.3.2...sdk-rtl-v21.3.3) (2022-04-07)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * encodeParam doc tweak to republish ([#1050](https://www.github.com/looker-open-source/sdk-codegen/issues/1050)) ([512bc81](https://www.github.com/looker-open-source/sdk-codegen/commit/512bc81865a9f5cbf8fafb83f41dfc2e8629ff3b))
14
+
15
+ ### [21.3.2](https://www.github.com/looker-open-source/sdk-codegen/compare/sdk-rtl-v21.3.1...sdk-rtl-v21.3.2) (2022-04-07)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * encodeParam returned [object Object] for object types ([#1047](https://www.github.com/looker-open-source/sdk-codegen/issues/1047)) ([eccc1db](https://www.github.com/looker-open-source/sdk-codegen/commit/eccc1dbb3d64f36e6a06d71a1c3da37d972abd3a))
21
+
22
+ ### [21.3.1](https://www.github.com/looker-open-source/sdk-codegen/compare/sdk-rtl-v21.2.0...sdk-rtl-v21.3.1) (2022-01-27)
23
+
24
+
25
+ ### Features
26
+
27
+ * add http method to IRawResponse ([#925](https://www.github.com/looker-open-source/sdk-codegen/issues/925)) ([25cef47](https://www.github.com/looker-open-source/sdk-codegen/commit/25cef47fa61a5f15565560b48f5e0c45a0cd9b44))
28
+
29
+
30
+ ### Bug Fixes
31
+
32
+ * rtl IError type ([#928](https://www.github.com/looker-open-source/sdk-codegen/issues/928)) ([7d8f906](https://www.github.com/looker-open-source/sdk-codegen/commit/7d8f906f4b10b5e915df292fcf30d1eb456c3463))
33
+ * **sdk-rtl/src/delimArray:** Fixed issue with single element number array ([#927](https://www.github.com/looker-open-source/sdk-codegen/issues/927)) ([6e94d73](https://www.github.com/looker-open-source/sdk-codegen/commit/6e94d73f88fb6c2f3138818967f4e8cb49ff89e6))
34
+
35
+ ### [21.3.1](https://www.github.com/looker-open-source/sdk-codegen/compare/sdk-rtl-v21.3.0...sdk-rtl-v21.3.1) (2021-12-20)
36
+
37
+
38
+ ### Bug Fixes
39
+
40
+ * rtl IError type ([#928](https://www.github.com/looker-open-source/sdk-codegen/issues/928)) ([7d8f906](https://www.github.com/looker-open-source/sdk-codegen/commit/7d8f906f4b10b5e915df292fcf30d1eb456c3463))
41
+
8
42
  ## [21.3.0](https://www.github.com/looker-open-source/sdk-codegen/compare/sdk-rtl-v21.2.0...sdk-rtl-v21.3.0) (2021-12-16)
9
43
 
10
44
 
@@ -1,6 +1,5 @@
1
1
  import type { IRequestProps, ITransport, SDKResponse } from './transport';
2
2
  import type { IApiSettings } from './apiSettings';
3
- import type { Url } from './constants';
4
3
  export interface IAccessToken {
5
4
  access_token?: string;
6
5
  token_type?: string;
@@ -8,8 +7,8 @@ export interface IAccessToken {
8
7
  refresh_token?: string;
9
8
  }
10
9
  export interface IError {
11
- message: string;
12
- documentation_url: Url;
10
+ message: string | null;
11
+ documentation_url: string | null;
13
12
  }
14
13
  export interface IAuthSession {
15
14
  settings: IApiSettings;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/authSession.ts"],"names":["AuthSession","constructor","settings","transport","login","_sudoId","Promise","reject","TBD","logout","resolve","isSudo","sudoId","isAuthenticated","reset","ok","promise","result","value","Buffer","message","toString"],"mappings":";;;;;;;AA2BA;;;;;;;;AA6GO,MAAeA,WAAf,CAAmD;AAM9CC,EAAAA,WAAW,CAACC,QAAD,EAAyBC,SAAzB,EAAgD;AAAA;;AAAA,oCAH5D,EAG4D;;AAAA;;AACnE,SAAKD,QAAL,GAAgBA,QAAhB;AACA,SAAKC,SAAL,GAAiBA,SAAjB;AACD;;AA0BDC,EAAAA,KAAK,CAACC,OAAD,EAA0C;AAC7C,WAAOC,OAAO,CAACC,MAAR,CAAeP,WAAW,CAACQ,GAA3B,CAAP;AACD;;AAODC,EAAAA,MAAM,GAAqB;AACzB,WAAOH,OAAO,CAACI,OAAR,CAAgB,KAAhB,CAAP;AACD;;AAKDC,EAAAA,MAAM,GAAY;AAChB,WAAO,KAAKC,MAAL,KAAgB,EAAhB,IAAsB,KAAKC,eAAL,EAA7B;AACD;;AAKDC,EAAAA,KAAK,GAAS;AACZ,SAAKF,MAAL,GAAc,EAAd;AACD;;AAEeG,EAAAA,EAAE,CAChBC,OADgB,EAEhB;AAAA;AACA,UAAMC,MAAM,SAASD,OAArB;;AACA,UAAIC,MAAM,CAACF,EAAX,EAAe;AACb,eAAOE,MAAM,CAACC,KAAd;AACD,OAFD,MAEO;AACL,YAAID,MAAM,YAAYE,MAAtB,EAA8B;AAC5B,gBAAM,yBAAS;AAAEC,YAAAA,OAAO,EAAEH,MAAM,CAACI,QAAP,CAAgB,MAAhB;AAAX,WAAT,CAAN;AACD,SAFD,MAEO;AACL,gBAAM,yBAASJ,MAAT,CAAN;AACD;AACF;AAVD;AAWD;;AA3EuD;;;;gBAApCjB,W,SACP,uC","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 { IRequestProps, ITransport, SDKResponse } from './transport'\nimport { sdkError } from './transport'\nimport type { IApiSettings } from './apiSettings'\nimport type { Url } from './constants'\n\n/**\n * Same as the Looker API access token object\n * Re-declared here to be independent of model generation\n */\nexport interface IAccessToken {\n /**\n * Access Token used for API calls (read-only)\n */\n access_token?: string\n /**\n * Type of Token (read-only)\n */\n token_type?: string\n /**\n * Number of seconds before the token expires (read-only)\n */\n expires_in?: number\n /**\n * Refresh token which can be used to obtain a new access token (read-only)\n */\n refresh_token?: string\n}\n\n/**\n * Same as the Looker API error object\n * Re-declared here to be independent of model generation\n */\nexport interface IError {\n /**\n * Error details (read-only)\n */\n message: string\n /**\n * Documentation link (read-only)\n */\n documentation_url: Url\n}\n\n/**\n * Basic authorization session interface for most API authentication scenarios\n */\nexport interface IAuthSession {\n settings: IApiSettings\n transport: ITransport\n /**\n * ID of sudo user\n */\n sudoId: string\n\n /**\n * is the current session authenticated?\n */\n isAuthenticated(): boolean\n\n /**\n * Decorate the request with authentication information\n * @param props Properties of request to use or update in callback\n * @returns the request properties with authentication information added\n */\n authenticate(props: IRequestProps): Promise<IRequestProps>\n\n /**\n * Log out the current user\n *\n * - if the current user is a sudo user, the API user becomes the active user\n * - if the current user is the API user, the API session is logged out\n * - any subsequent SDK method calls will automatically log the API user back in for this scenario\n * @returns {Promise<boolean>} `true` if a logout happened, `false` otherwise\n */\n logout(): Promise<boolean>\n\n /**\n * Typically returns an `IAccessToken` but could be any data used for auth.\n *\n * This method is not used in all session patterns, so it's not abstract in the base AuthSession\n *\n * @returns {Promise<any>} authentication information\n */\n getToken(): Promise<any>\n\n /**\n *\n * @returns `true` if the auth session is in sudo mode\n */\n isSudo(): boolean\n\n /**\n * Login to the auth session, optionally as a sudo user\n * @param {string | number} sudoId\n * @returns {Promise<any>} authentication data\n */\n login(sudoId?: string | number): Promise<any>\n\n /**\n * Clears all authentication tracking. Does **not** log the API user out in default implementations.\n */\n reset(): void\n}\n\n/**\n * Base implementation of automatically authenticated sessions for calling API endpoints\n *\n * All \"auth session\" components can descend from this class\n *\n */\nexport abstract class AuthSession implements IAuthSession {\n static TBD = 'Method not implemented in AuthSession'\n settings: IApiSettings\n sudoId = ''\n transport: ITransport\n\n protected constructor(settings: IApiSettings, transport: ITransport) {\n this.settings = settings\n this.transport = transport\n }\n\n /**\n * Decorate request properties with the required authentication information\n *\n * Properties could be additional headers, cookies, or some other request property\n *\n * @param props Request properties to use and/or modify in authentication method\n */\n abstract authenticate(props: IRequestProps): Promise<IRequestProps>\n\n /**\n * Does the session have active authentication information?\n */\n abstract isAuthenticated(): boolean\n\n /**\n * Override this method to implement a authentication retrieval from the server\n */\n abstract getToken(): Promise<any>\n\n /**\n * Override this method to implement API session login\n *\n * @param sudoId ID of sudo user. A missing sudoId means the API credentials are used to login\n */\n login(_sudoId?: string | number): Promise<any> {\n return Promise.reject(AuthSession.TBD)\n }\n\n /**\n * Override this method to implement logout\n *\n * The base implementation just returns a false promise.\n */\n logout(): Promise<boolean> {\n return Promise.resolve(false)\n }\n\n /**\n * Is a sudo user active for this session?\n */\n isSudo(): boolean {\n return this.sudoId !== '' && this.isAuthenticated()\n }\n\n /**\n * Resets all authentication status, but standard implementations do NOT log out an API session\n */\n reset(): void {\n this.sudoId = ''\n }\n\n protected async ok<TSuccess, TError>(\n promise: Promise<SDKResponse<TSuccess, TError>>\n ) {\n const result = await promise\n if (result.ok) {\n return result.value\n } else {\n if (result instanceof Buffer) {\n throw sdkError({ message: result.toString('utf8') })\n } else {\n throw sdkError(result)\n }\n }\n }\n}\n"],"file":"authSession.js"}
1
+ {"version":3,"sources":["../src/authSession.ts"],"names":["AuthSession","constructor","settings","transport","login","_sudoId","Promise","reject","TBD","logout","resolve","isSudo","sudoId","isAuthenticated","reset","ok","promise","result","value","Buffer","message","toString"],"mappings":";;;;;;;AA2BA;;;;;;;;AA4GO,MAAeA,WAAf,CAAmD;AAM9CC,EAAAA,WAAW,CAACC,QAAD,EAAyBC,SAAzB,EAAgD;AAAA;;AAAA,oCAH5D,EAG4D;;AAAA;;AACnE,SAAKD,QAAL,GAAgBA,QAAhB;AACA,SAAKC,SAAL,GAAiBA,SAAjB;AACD;;AA0BDC,EAAAA,KAAK,CAACC,OAAD,EAA0C;AAC7C,WAAOC,OAAO,CAACC,MAAR,CAAeP,WAAW,CAACQ,GAA3B,CAAP;AACD;;AAODC,EAAAA,MAAM,GAAqB;AACzB,WAAOH,OAAO,CAACI,OAAR,CAAgB,KAAhB,CAAP;AACD;;AAKDC,EAAAA,MAAM,GAAY;AAChB,WAAO,KAAKC,MAAL,KAAgB,EAAhB,IAAsB,KAAKC,eAAL,EAA7B;AACD;;AAKDC,EAAAA,KAAK,GAAS;AACZ,SAAKF,MAAL,GAAc,EAAd;AACD;;AAEeG,EAAAA,EAAE,CAChBC,OADgB,EAEhB;AAAA;AACA,UAAMC,MAAM,SAASD,OAArB;;AACA,UAAIC,MAAM,CAACF,EAAX,EAAe;AACb,eAAOE,MAAM,CAACC,KAAd;AACD,OAFD,MAEO;AACL,YAAID,MAAM,YAAYE,MAAtB,EAA8B;AAC5B,gBAAM,yBAAS;AAAEC,YAAAA,OAAO,EAAEH,MAAM,CAACI,QAAP,CAAgB,MAAhB;AAAX,WAAT,CAAN;AACD,SAFD,MAEO;AACL,gBAAM,yBAASJ,MAAT,CAAN;AACD;AACF;AAVD;AAWD;;AA3EuD;;;;gBAApCjB,W,SACP,uC","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 { IRequestProps, ITransport, SDKResponse } from './transport'\nimport { sdkError } from './transport'\nimport type { IApiSettings } from './apiSettings'\n\n/**\n * Same as the Looker API access token object\n * Re-declared here to be independent of model generation\n */\nexport interface IAccessToken {\n /**\n * Access Token used for API calls (read-only)\n */\n access_token?: string\n /**\n * Type of Token (read-only)\n */\n token_type?: string\n /**\n * Number of seconds before the token expires (read-only)\n */\n expires_in?: number\n /**\n * Refresh token which can be used to obtain a new access token (read-only)\n */\n refresh_token?: string\n}\n\n/**\n * Same as the Looker API error object\n * Re-declared here to be independent of model generation\n */\nexport interface IError {\n /**\n * Error details (read-only)\n */\n message: string | null\n /**\n * Documentation link (read-only)\n */\n documentation_url: string | null\n}\n\n/**\n * Basic authorization session interface for most API authentication scenarios\n */\nexport interface IAuthSession {\n settings: IApiSettings\n transport: ITransport\n /**\n * ID of sudo user\n */\n sudoId: string\n\n /**\n * is the current session authenticated?\n */\n isAuthenticated(): boolean\n\n /**\n * Decorate the request with authentication information\n * @param props Properties of request to use or update in callback\n * @returns the request properties with authentication information added\n */\n authenticate(props: IRequestProps): Promise<IRequestProps>\n\n /**\n * Log out the current user\n *\n * - if the current user is a sudo user, the API user becomes the active user\n * - if the current user is the API user, the API session is logged out\n * - any subsequent SDK method calls will automatically log the API user back in for this scenario\n * @returns {Promise<boolean>} `true` if a logout happened, `false` otherwise\n */\n logout(): Promise<boolean>\n\n /**\n * Typically returns an `IAccessToken` but could be any data used for auth.\n *\n * This method is not used in all session patterns, so it's not abstract in the base AuthSession\n *\n * @returns {Promise<any>} authentication information\n */\n getToken(): Promise<any>\n\n /**\n *\n * @returns `true` if the auth session is in sudo mode\n */\n isSudo(): boolean\n\n /**\n * Login to the auth session, optionally as a sudo user\n * @param {string | number} sudoId\n * @returns {Promise<any>} authentication data\n */\n login(sudoId?: string | number): Promise<any>\n\n /**\n * Clears all authentication tracking. Does **not** log the API user out in default implementations.\n */\n reset(): void\n}\n\n/**\n * Base implementation of automatically authenticated sessions for calling API endpoints\n *\n * All \"auth session\" components can descend from this class\n *\n */\nexport abstract class AuthSession implements IAuthSession {\n static TBD = 'Method not implemented in AuthSession'\n settings: IApiSettings\n sudoId = ''\n transport: ITransport\n\n protected constructor(settings: IApiSettings, transport: ITransport) {\n this.settings = settings\n this.transport = transport\n }\n\n /**\n * Decorate request properties with the required authentication information\n *\n * Properties could be additional headers, cookies, or some other request property\n *\n * @param props Request properties to use and/or modify in authentication method\n */\n abstract authenticate(props: IRequestProps): Promise<IRequestProps>\n\n /**\n * Does the session have active authentication information?\n */\n abstract isAuthenticated(): boolean\n\n /**\n * Override this method to implement a authentication retrieval from the server\n */\n abstract getToken(): Promise<any>\n\n /**\n * Override this method to implement API session login\n *\n * @param sudoId ID of sudo user. A missing sudoId means the API credentials are used to login\n */\n login(_sudoId?: string | number): Promise<any> {\n return Promise.reject(AuthSession.TBD)\n }\n\n /**\n * Override this method to implement logout\n *\n * The base implementation just returns a false promise.\n */\n logout(): Promise<boolean> {\n return Promise.resolve(false)\n }\n\n /**\n * Is a sudo user active for this session?\n */\n isSudo(): boolean {\n return this.sudoId !== '' && this.isAuthenticated()\n }\n\n /**\n * Resets all authentication status, but standard implementations do NOT log out an API session\n */\n reset(): void {\n this.sudoId = ''\n }\n\n protected async ok<TSuccess, TError>(\n promise: Promise<SDKResponse<TSuccess, TError>>\n ) {\n const result = await promise\n if (result.ok) {\n return result.value\n } else {\n if (result instanceof Buffer) {\n throw sdkError({ message: result.toString('utf8') })\n } else {\n throw sdkError(result)\n }\n }\n }\n}\n"],"file":"authSession.js"}
package/lib/delimArray.js CHANGED
@@ -12,7 +12,7 @@ class DelimArray extends Array {
12
12
  var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ',';
13
13
  var prefix = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
14
14
  var suffix = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';
15
- super(...(items || []));
15
+ super();
16
16
  this.separator = separator;
17
17
  this.prefix = prefix;
18
18
  this.suffix = suffix;
@@ -20,6 +20,8 @@ class DelimArray extends Array {
20
20
  _defineProperty(this, "toString", () => {
21
21
  return "".concat(this.prefix).concat(this.join(this.separator)).concat(this.suffix);
22
22
  });
23
+
24
+ this.push(...(items || []));
23
25
  }
24
26
 
25
27
  static create() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/delimArray.ts"],"names":["DelimArray","Array","constructor","items","separator","prefix","suffix","join","create","Object","prototype"],"mappings":";;;;;;;;;AA0BO,MAAMA,UAAN,SAA4BC,KAA5B,CAAqC;AAC1CC,EAAAA,WAAW,CACTC,KADS,EAKT;AAAA,QAHOC,SAGP,uEAH2B,GAG3B;AAAA,QAFOC,MAEP,uEAFwB,EAExB;AAAA,QADOC,MACP,uEADwB,EACxB;AACA,UAAM,IAAIH,KAAK,IAAI,EAAb,CAAN;AADA,SAHOC,SAGP,GAHOA,SAGP;AAAA,SAFOC,MAEP,GAFOA,MAEP;AAAA,SADOC,MACP,GADOA,MACP;;AAAA,sCAYgB,MAAc;AAC9B,uBAAU,KAAKD,MAAf,SAAwB,KAAKE,IAAL,CAAU,KAAKH,SAAf,CAAxB,SAAoD,KAAKE,MAAzD;AACD,KAdC;AAED;;AAEY,SAANE,MAAM,GAAqB;AAChC,WAAOC,MAAM,CAACD,MAAP,CAAcR,UAAU,CAACU,SAAzB,CAAP;AACD;;AAZyC","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 class DelimArray<T> extends Array<T> {\n constructor(\n items?: Array<T>,\n public separator: string = ',',\n public prefix: string = '',\n public suffix: string = ''\n ) {\n super(...(items || []))\n }\n\n static create<T>(): DelimArray<T> {\n return Object.create(DelimArray.prototype)\n }\n\n /**\n * Override of Array<T> toString so custom separators can be used\n * @returns {string} Delimited version of array\n */\n public toString = (): string => {\n return `${this.prefix}${this.join(this.separator)}${this.suffix}`\n }\n}\n"],"file":"delimArray.js"}
1
+ {"version":3,"sources":["../src/delimArray.ts"],"names":["DelimArray","Array","constructor","items","separator","prefix","suffix","join","push","create","Object","prototype"],"mappings":";;;;;;;;;AA0BO,MAAMA,UAAN,SAA4BC,KAA5B,CAAqC;AAC1CC,EAAAA,WAAW,CACTC,KADS,EAKT;AAAA,QAHOC,SAGP,uEAH2B,GAG3B;AAAA,QAFOC,MAEP,uEAFwB,EAExB;AAAA,QADOC,MACP,uEADwB,EACxB;AACA;AADA,SAHOF,SAGP,GAHOA,SAGP;AAAA,SAFOC,MAEP,GAFOA,MAEP;AAAA,SADOC,MACP,GADOA,MACP;;AAAA,sCAagB,MAAc;AAC9B,uBAAU,KAAKD,MAAf,SAAwB,KAAKE,IAAL,CAAU,KAAKH,SAAf,CAAxB,SAAoD,KAAKE,MAAzD;AACD,KAfC;;AAEA,SAAKE,IAAL,CAAU,IAAIL,KAAK,IAAI,EAAb,CAAV;AACD;;AAEY,SAANM,MAAM,GAAqB;AAChC,WAAOC,MAAM,CAACD,MAAP,CAAcT,UAAU,CAACW,SAAzB,CAAP;AACD;;AAbyC","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 class DelimArray<T> extends Array<T> {\n constructor(\n items?: Array<T>,\n public separator: string = ',',\n public prefix: string = '',\n public suffix: string = ''\n ) {\n super()\n this.push(...(items || []))\n }\n\n static create<T>(): DelimArray<T> {\n return Object.create(DelimArray.prototype)\n }\n\n /**\n * Override of Array<T> toString so custom separators can be used\n * @returns {string} Delimited version of array\n */\n public toString = (): string => {\n return `${this.prefix}${this.join(this.separator)}${this.suffix}`\n }\n}\n"],"file":"delimArray.js"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/authSession.ts"],"names":["sdkError","AuthSession","constructor","settings","transport","login","_sudoId","Promise","reject","TBD","logout","resolve","isSudo","sudoId","isAuthenticated","reset","ok","promise","result","value","Buffer","message","toString"],"mappings":";;;;;;AA2BA,SAASA,QAAT,QAAyB,aAAzB;AA6GA,OAAO,MAAeC,WAAf,CAAmD;AAM9CC,EAAAA,WAAW,CAACC,QAAD,EAAyBC,SAAzB,EAAgD;AAAA;;AAAA,oCAH5D,EAG4D;;AAAA;;AACnE,SAAKD,QAAL,GAAgBA,QAAhB;AACA,SAAKC,SAAL,GAAiBA,SAAjB;AACD;;AA0BDC,EAAAA,KAAK,CAACC,OAAD,EAA0C;AAC7C,WAAOC,OAAO,CAACC,MAAR,CAAeP,WAAW,CAACQ,GAA3B,CAAP;AACD;;AAODC,EAAAA,MAAM,GAAqB;AACzB,WAAOH,OAAO,CAACI,OAAR,CAAgB,KAAhB,CAAP;AACD;;AAKDC,EAAAA,MAAM,GAAY;AAChB,WAAO,KAAKC,MAAL,KAAgB,EAAhB,IAAsB,KAAKC,eAAL,EAA7B;AACD;;AAKDC,EAAAA,KAAK,GAAS;AACZ,SAAKF,MAAL,GAAc,EAAd;AACD;;AAEeG,EAAAA,EAAE,CAChBC,OADgB,EAEhB;AAAA;AACA,UAAMC,MAAM,SAASD,OAArB;;AACA,UAAIC,MAAM,CAACF,EAAX,EAAe;AACb,eAAOE,MAAM,CAACC,KAAd;AACD,OAFD,MAEO;AACL,YAAID,MAAM,YAAYE,MAAtB,EAA8B;AAC5B,gBAAMpB,QAAQ,CAAC;AAAEqB,YAAAA,OAAO,EAAEH,MAAM,CAACI,QAAP,CAAgB,MAAhB;AAAX,WAAD,CAAd;AACD,SAFD,MAEO;AACL,gBAAMtB,QAAQ,CAACkB,MAAD,CAAd;AACD;AACF;AAVD;AAWD;;AA3EuD;;gBAApCjB,W,SACP,uC","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 { IRequestProps, ITransport, SDKResponse } from './transport'\nimport { sdkError } from './transport'\nimport type { IApiSettings } from './apiSettings'\nimport type { Url } from './constants'\n\n/**\n * Same as the Looker API access token object\n * Re-declared here to be independent of model generation\n */\nexport interface IAccessToken {\n /**\n * Access Token used for API calls (read-only)\n */\n access_token?: string\n /**\n * Type of Token (read-only)\n */\n token_type?: string\n /**\n * Number of seconds before the token expires (read-only)\n */\n expires_in?: number\n /**\n * Refresh token which can be used to obtain a new access token (read-only)\n */\n refresh_token?: string\n}\n\n/**\n * Same as the Looker API error object\n * Re-declared here to be independent of model generation\n */\nexport interface IError {\n /**\n * Error details (read-only)\n */\n message: string\n /**\n * Documentation link (read-only)\n */\n documentation_url: Url\n}\n\n/**\n * Basic authorization session interface for most API authentication scenarios\n */\nexport interface IAuthSession {\n settings: IApiSettings\n transport: ITransport\n /**\n * ID of sudo user\n */\n sudoId: string\n\n /**\n * is the current session authenticated?\n */\n isAuthenticated(): boolean\n\n /**\n * Decorate the request with authentication information\n * @param props Properties of request to use or update in callback\n * @returns the request properties with authentication information added\n */\n authenticate(props: IRequestProps): Promise<IRequestProps>\n\n /**\n * Log out the current user\n *\n * - if the current user is a sudo user, the API user becomes the active user\n * - if the current user is the API user, the API session is logged out\n * - any subsequent SDK method calls will automatically log the API user back in for this scenario\n * @returns {Promise<boolean>} `true` if a logout happened, `false` otherwise\n */\n logout(): Promise<boolean>\n\n /**\n * Typically returns an `IAccessToken` but could be any data used for auth.\n *\n * This method is not used in all session patterns, so it's not abstract in the base AuthSession\n *\n * @returns {Promise<any>} authentication information\n */\n getToken(): Promise<any>\n\n /**\n *\n * @returns `true` if the auth session is in sudo mode\n */\n isSudo(): boolean\n\n /**\n * Login to the auth session, optionally as a sudo user\n * @param {string | number} sudoId\n * @returns {Promise<any>} authentication data\n */\n login(sudoId?: string | number): Promise<any>\n\n /**\n * Clears all authentication tracking. Does **not** log the API user out in default implementations.\n */\n reset(): void\n}\n\n/**\n * Base implementation of automatically authenticated sessions for calling API endpoints\n *\n * All \"auth session\" components can descend from this class\n *\n */\nexport abstract class AuthSession implements IAuthSession {\n static TBD = 'Method not implemented in AuthSession'\n settings: IApiSettings\n sudoId = ''\n transport: ITransport\n\n protected constructor(settings: IApiSettings, transport: ITransport) {\n this.settings = settings\n this.transport = transport\n }\n\n /**\n * Decorate request properties with the required authentication information\n *\n * Properties could be additional headers, cookies, or some other request property\n *\n * @param props Request properties to use and/or modify in authentication method\n */\n abstract authenticate(props: IRequestProps): Promise<IRequestProps>\n\n /**\n * Does the session have active authentication information?\n */\n abstract isAuthenticated(): boolean\n\n /**\n * Override this method to implement a authentication retrieval from the server\n */\n abstract getToken(): Promise<any>\n\n /**\n * Override this method to implement API session login\n *\n * @param sudoId ID of sudo user. A missing sudoId means the API credentials are used to login\n */\n login(_sudoId?: string | number): Promise<any> {\n return Promise.reject(AuthSession.TBD)\n }\n\n /**\n * Override this method to implement logout\n *\n * The base implementation just returns a false promise.\n */\n logout(): Promise<boolean> {\n return Promise.resolve(false)\n }\n\n /**\n * Is a sudo user active for this session?\n */\n isSudo(): boolean {\n return this.sudoId !== '' && this.isAuthenticated()\n }\n\n /**\n * Resets all authentication status, but standard implementations do NOT log out an API session\n */\n reset(): void {\n this.sudoId = ''\n }\n\n protected async ok<TSuccess, TError>(\n promise: Promise<SDKResponse<TSuccess, TError>>\n ) {\n const result = await promise\n if (result.ok) {\n return result.value\n } else {\n if (result instanceof Buffer) {\n throw sdkError({ message: result.toString('utf8') })\n } else {\n throw sdkError(result)\n }\n }\n }\n}\n"],"file":"authSession.js"}
1
+ {"version":3,"sources":["../../src/authSession.ts"],"names":["sdkError","AuthSession","constructor","settings","transport","login","_sudoId","Promise","reject","TBD","logout","resolve","isSudo","sudoId","isAuthenticated","reset","ok","promise","result","value","Buffer","message","toString"],"mappings":";;;;;;AA2BA,SAASA,QAAT,QAAyB,aAAzB;AA4GA,OAAO,MAAeC,WAAf,CAAmD;AAM9CC,EAAAA,WAAW,CAACC,QAAD,EAAyBC,SAAzB,EAAgD;AAAA;;AAAA,oCAH5D,EAG4D;;AAAA;;AACnE,SAAKD,QAAL,GAAgBA,QAAhB;AACA,SAAKC,SAAL,GAAiBA,SAAjB;AACD;;AA0BDC,EAAAA,KAAK,CAACC,OAAD,EAA0C;AAC7C,WAAOC,OAAO,CAACC,MAAR,CAAeP,WAAW,CAACQ,GAA3B,CAAP;AACD;;AAODC,EAAAA,MAAM,GAAqB;AACzB,WAAOH,OAAO,CAACI,OAAR,CAAgB,KAAhB,CAAP;AACD;;AAKDC,EAAAA,MAAM,GAAY;AAChB,WAAO,KAAKC,MAAL,KAAgB,EAAhB,IAAsB,KAAKC,eAAL,EAA7B;AACD;;AAKDC,EAAAA,KAAK,GAAS;AACZ,SAAKF,MAAL,GAAc,EAAd;AACD;;AAEeG,EAAAA,EAAE,CAChBC,OADgB,EAEhB;AAAA;AACA,UAAMC,MAAM,SAASD,OAArB;;AACA,UAAIC,MAAM,CAACF,EAAX,EAAe;AACb,eAAOE,MAAM,CAACC,KAAd;AACD,OAFD,MAEO;AACL,YAAID,MAAM,YAAYE,MAAtB,EAA8B;AAC5B,gBAAMpB,QAAQ,CAAC;AAAEqB,YAAAA,OAAO,EAAEH,MAAM,CAACI,QAAP,CAAgB,MAAhB;AAAX,WAAD,CAAd;AACD,SAFD,MAEO;AACL,gBAAMtB,QAAQ,CAACkB,MAAD,CAAd;AACD;AACF;AAVD;AAWD;;AA3EuD;;gBAApCjB,W,SACP,uC","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 { IRequestProps, ITransport, SDKResponse } from './transport'\nimport { sdkError } from './transport'\nimport type { IApiSettings } from './apiSettings'\n\n/**\n * Same as the Looker API access token object\n * Re-declared here to be independent of model generation\n */\nexport interface IAccessToken {\n /**\n * Access Token used for API calls (read-only)\n */\n access_token?: string\n /**\n * Type of Token (read-only)\n */\n token_type?: string\n /**\n * Number of seconds before the token expires (read-only)\n */\n expires_in?: number\n /**\n * Refresh token which can be used to obtain a new access token (read-only)\n */\n refresh_token?: string\n}\n\n/**\n * Same as the Looker API error object\n * Re-declared here to be independent of model generation\n */\nexport interface IError {\n /**\n * Error details (read-only)\n */\n message: string | null\n /**\n * Documentation link (read-only)\n */\n documentation_url: string | null\n}\n\n/**\n * Basic authorization session interface for most API authentication scenarios\n */\nexport interface IAuthSession {\n settings: IApiSettings\n transport: ITransport\n /**\n * ID of sudo user\n */\n sudoId: string\n\n /**\n * is the current session authenticated?\n */\n isAuthenticated(): boolean\n\n /**\n * Decorate the request with authentication information\n * @param props Properties of request to use or update in callback\n * @returns the request properties with authentication information added\n */\n authenticate(props: IRequestProps): Promise<IRequestProps>\n\n /**\n * Log out the current user\n *\n * - if the current user is a sudo user, the API user becomes the active user\n * - if the current user is the API user, the API session is logged out\n * - any subsequent SDK method calls will automatically log the API user back in for this scenario\n * @returns {Promise<boolean>} `true` if a logout happened, `false` otherwise\n */\n logout(): Promise<boolean>\n\n /**\n * Typically returns an `IAccessToken` but could be any data used for auth.\n *\n * This method is not used in all session patterns, so it's not abstract in the base AuthSession\n *\n * @returns {Promise<any>} authentication information\n */\n getToken(): Promise<any>\n\n /**\n *\n * @returns `true` if the auth session is in sudo mode\n */\n isSudo(): boolean\n\n /**\n * Login to the auth session, optionally as a sudo user\n * @param {string | number} sudoId\n * @returns {Promise<any>} authentication data\n */\n login(sudoId?: string | number): Promise<any>\n\n /**\n * Clears all authentication tracking. Does **not** log the API user out in default implementations.\n */\n reset(): void\n}\n\n/**\n * Base implementation of automatically authenticated sessions for calling API endpoints\n *\n * All \"auth session\" components can descend from this class\n *\n */\nexport abstract class AuthSession implements IAuthSession {\n static TBD = 'Method not implemented in AuthSession'\n settings: IApiSettings\n sudoId = ''\n transport: ITransport\n\n protected constructor(settings: IApiSettings, transport: ITransport) {\n this.settings = settings\n this.transport = transport\n }\n\n /**\n * Decorate request properties with the required authentication information\n *\n * Properties could be additional headers, cookies, or some other request property\n *\n * @param props Request properties to use and/or modify in authentication method\n */\n abstract authenticate(props: IRequestProps): Promise<IRequestProps>\n\n /**\n * Does the session have active authentication information?\n */\n abstract isAuthenticated(): boolean\n\n /**\n * Override this method to implement a authentication retrieval from the server\n */\n abstract getToken(): Promise<any>\n\n /**\n * Override this method to implement API session login\n *\n * @param sudoId ID of sudo user. A missing sudoId means the API credentials are used to login\n */\n login(_sudoId?: string | number): Promise<any> {\n return Promise.reject(AuthSession.TBD)\n }\n\n /**\n * Override this method to implement logout\n *\n * The base implementation just returns a false promise.\n */\n logout(): Promise<boolean> {\n return Promise.resolve(false)\n }\n\n /**\n * Is a sudo user active for this session?\n */\n isSudo(): boolean {\n return this.sudoId !== '' && this.isAuthenticated()\n }\n\n /**\n * Resets all authentication status, but standard implementations do NOT log out an API session\n */\n reset(): void {\n this.sudoId = ''\n }\n\n protected async ok<TSuccess, TError>(\n promise: Promise<SDKResponse<TSuccess, TError>>\n ) {\n const result = await promise\n if (result.ok) {\n return result.value\n } else {\n if (result instanceof Buffer) {\n throw sdkError({ message: result.toString('utf8') })\n } else {\n throw sdkError(result)\n }\n }\n }\n}\n"],"file":"authSession.js"}
@@ -5,7 +5,7 @@ export class DelimArray extends Array {
5
5
  var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ',';
6
6
  var prefix = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
7
7
  var suffix = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';
8
- super(...(items || []));
8
+ super();
9
9
  this.separator = separator;
10
10
  this.prefix = prefix;
11
11
  this.suffix = suffix;
@@ -13,6 +13,8 @@ export class DelimArray extends Array {
13
13
  _defineProperty(this, "toString", () => {
14
14
  return "".concat(this.prefix).concat(this.join(this.separator)).concat(this.suffix);
15
15
  });
16
+
17
+ this.push(...(items || []));
16
18
  }
17
19
 
18
20
  static create() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/delimArray.ts"],"names":["DelimArray","Array","constructor","items","separator","prefix","suffix","join","create","Object","prototype"],"mappings":";;AA0BA,OAAO,MAAMA,UAAN,SAA4BC,KAA5B,CAAqC;AAC1CC,EAAAA,WAAW,CACTC,KADS,EAKT;AAAA,QAHOC,SAGP,uEAH2B,GAG3B;AAAA,QAFOC,MAEP,uEAFwB,EAExB;AAAA,QADOC,MACP,uEADwB,EACxB;AACA,UAAM,IAAIH,KAAK,IAAI,EAAb,CAAN;AADA,SAHOC,SAGP,GAHOA,SAGP;AAAA,SAFOC,MAEP,GAFOA,MAEP;AAAA,SADOC,MACP,GADOA,MACP;;AAAA,sCAYgB,MAAc;AAC9B,uBAAU,KAAKD,MAAf,SAAwB,KAAKE,IAAL,CAAU,KAAKH,SAAf,CAAxB,SAAoD,KAAKE,MAAzD;AACD,KAdC;AAED;;AAEY,SAANE,MAAM,GAAqB;AAChC,WAAOC,MAAM,CAACD,MAAP,CAAcR,UAAU,CAACU,SAAzB,CAAP;AACD;;AAZyC","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 class DelimArray<T> extends Array<T> {\n constructor(\n items?: Array<T>,\n public separator: string = ',',\n public prefix: string = '',\n public suffix: string = ''\n ) {\n super(...(items || []))\n }\n\n static create<T>(): DelimArray<T> {\n return Object.create(DelimArray.prototype)\n }\n\n /**\n * Override of Array<T> toString so custom separators can be used\n * @returns {string} Delimited version of array\n */\n public toString = (): string => {\n return `${this.prefix}${this.join(this.separator)}${this.suffix}`\n }\n}\n"],"file":"delimArray.js"}
1
+ {"version":3,"sources":["../../src/delimArray.ts"],"names":["DelimArray","Array","constructor","items","separator","prefix","suffix","join","push","create","Object","prototype"],"mappings":";;AA0BA,OAAO,MAAMA,UAAN,SAA4BC,KAA5B,CAAqC;AAC1CC,EAAAA,WAAW,CACTC,KADS,EAKT;AAAA,QAHOC,SAGP,uEAH2B,GAG3B;AAAA,QAFOC,MAEP,uEAFwB,EAExB;AAAA,QADOC,MACP,uEADwB,EACxB;AACA;AADA,SAHOF,SAGP,GAHOA,SAGP;AAAA,SAFOC,MAEP,GAFOA,MAEP;AAAA,SADOC,MACP,GADOA,MACP;;AAAA,sCAagB,MAAc;AAC9B,uBAAU,KAAKD,MAAf,SAAwB,KAAKE,IAAL,CAAU,KAAKH,SAAf,CAAxB,SAAoD,KAAKE,MAAzD;AACD,KAfC;;AAEA,SAAKE,IAAL,CAAU,IAAIL,KAAK,IAAI,EAAb,CAAV;AACD;;AAEY,SAANM,MAAM,GAAqB;AAChC,WAAOC,MAAM,CAACD,MAAP,CAAcT,UAAU,CAACW,SAAzB,CAAP;AACD;;AAbyC","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 class DelimArray<T> extends Array<T> {\n constructor(\n items?: Array<T>,\n public separator: string = ',',\n public prefix: string = '',\n public suffix: string = ''\n ) {\n super()\n this.push(...(items || []))\n }\n\n static create<T>(): DelimArray<T> {\n return Object.create(DelimArray.prototype)\n }\n\n /**\n * Override of Array<T> toString so custom separators can be used\n * @returns {string} Delimited version of array\n */\n public toString = (): string => {\n return `${this.prefix}${this.join(this.separator)}${this.suffix}`\n }\n}\n"],"file":"delimArray.js"}
@@ -19,6 +19,8 @@ export class OAuthSession extends AuthSession {
19
19
 
20
20
  _defineProperty(this, "crypto", void 0);
21
21
 
22
+ _defineProperty(this, "reentry", false);
23
+
22
24
  this.crypto = services.crypto;
23
25
  var keys = ['client_id', 'redirect_uri', 'base_url', 'looker_url'];
24
26
 
@@ -87,12 +89,13 @@ export class OAuthSession extends AuthSession {
87
89
 
88
90
  return _asyncToGenerator(function* () {
89
91
  if (!_this2.isAuthenticated()) {
90
- if (!_this2.returnUrl) {
92
+ if (_this2.reentry) {} else if (!_this2.returnUrl) {
91
93
  var authUrl = yield _this2.createAuthCodeRequestUrl('cors_api', agentPrefix);
92
94
  var returnTo = window.location.pathname + window.location.search;
93
95
  _this2.returnUrl = returnTo;
94
96
  window.location.href = authUrl;
95
97
  } else {
98
+ _this2.reentry = true;
96
99
  _this2.returnUrl = null;
97
100
 
98
101
  if (!_this2.code_verifier) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/oauthSession.ts"],"names":["AuthSession","agentPrefix","sdkError","AuthToken","OAuthSession","constructor","services","settings","transport","crypto","keys","config","readConfig","forEach","key","value","message","authenticate","props","token","getToken","access_token","headers","Authorization","code_verifier","sessionStorage","getItem","codeVerifierKey","removeItem","setItem","returnUrl","returnUrlKey","clearStorage","login","_sudoId","isAuthenticated","authUrl","createAuthCodeRequestUrl","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","secureRandom","code_challenge","sha256Hash","client_id","code_challenge_method","redirect_uri","response_type","looker_url","redeemAuthCodeBody","authCode","codeVerifier","verifier","grant_type","refresh_token","isActive","logout","init"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { 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 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.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 // 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 this.code_verifier = this.crypto.secureRandom(33)\n const code_challenge = await this.crypto.sha256Hash(this.code_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"],"file":"oauthSession.js"}
1
+ {"version":3,"sources":["../../src/oauthSession.ts"],"names":["AuthSession","agentPrefix","sdkError","AuthToken","OAuthSession","constructor","services","settings","transport","crypto","keys","config","readConfig","forEach","key","value","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","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","secureRandom","code_challenge","sha256Hash","client_id","code_challenge_method","redirect_uri","response_type","looker_url","redeemAuthCodeBody","authCode","codeVerifier","verifier","grant_type","refresh_token","isActive","logout","init"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { 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 this.code_verifier = this.crypto.secureRandom(33)\n const code_challenge = await this.crypto.sha256Hash(this.code_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"],"file":"oauthSession.js"}
@@ -3,6 +3,7 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try
3
3
  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); }); }; }
4
4
 
5
5
  import { matchCharsetUtf8, matchModeBinary, matchModeString } from './constants';
6
+ import { DelimArray } from './delimArray';
6
7
  export var agentPrefix = 'TS-SDK';
7
8
  export var LookerAppId = 'x-looker-appid';
8
9
  var tracing = false;
@@ -110,9 +111,11 @@ export function isUtf8(contentType) {
110
111
  export function encodeParam(value) {
111
112
  if (value instanceof Date) {
112
113
  value = value.toISOString();
114
+ } else if (value instanceof DelimArray) {
115
+ value = value.toString();
113
116
  }
114
117
 
115
- var encoded = value.toString();
118
+ var encoded = typeof value === 'object' ? JSON.stringify(value) : value.toString();
116
119
 
117
120
  try {
118
121
  var decoded = decodeURIComponent(value);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/transport.ts"],"names":["matchCharsetUtf8","matchModeBinary","matchModeString","agentPrefix","LookerAppId","tracing","trace","message","info","console","debug","ResponseMode","contentPatternString","RegExp","contentPatternBinary","charsetUtf8Pattern","defaultTimeout","StatusCode","responseMode","contentType","match","string","binary","unknown","isUtf8","encodeParam","value","Date","toISOString","encoded","toString","decoded","decodeURIComponent","encodeURIComponent","e","URIError","encodeParams","values","keys","Object","filter","k","undefined","map","join","addQueryParams","path","obj","qp","utf8","bufferString","val","result","decoder","TextDecoder","decode","Buffer","from","JSON","stringify","err","sdkError","response","Error","error","statusMessage","sdkOk","promise","ok","safeBase64","u8","rawBase64","btoa","String","fromCharCode","replace","isErrorLike","prototype","hasOwnProperty","call"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { Agent } from 'https'\nimport type { Headers } from 'request'\nimport type { Readable } from 'readable-stream'\nimport { matchCharsetUtf8, matchModeBinary, matchModeString } from './constants'\n\nexport const agentPrefix = 'TS-SDK'\nexport const LookerAppId = 'x-looker-appid'\n\n/** Set to `true` to follow streaming process */\nconst tracing = false\n\n/**\n * trivial tracing function that should be replaced with a log plugin\n * @param message description for trace\n * @param info any additional information to produce for output\n */\nexport function trace(message: string, info?: any) {\n if (tracing) {\n // eslint-disable-next-line no-console\n console.debug(message)\n if (info) {\n // eslint-disable-next-line no-console\n console.debug({ info })\n }\n }\n}\n\n/** ResponseMode for an HTTP request */\nexport enum ResponseMode {\n 'binary', // this is a binary response\n 'string', // this is a \"string\" response\n 'unknown', // unrecognized response type\n}\n\n/**\n * MIME patterns for string content types\n * @type {RegExp}\n */\nexport const contentPatternString = new RegExp(matchModeString, 'i')\n\n/**\n * MIME patterns for \"binary\" content types\n * @type {RegExp}\n */\nexport const contentPatternBinary = new RegExp(matchModeBinary, 'i')\n\n/**\n * MIME pattern for UTF8 charset attribute\n * @type {RegExp}\n */\nexport const charsetUtf8Pattern = new RegExp(matchCharsetUtf8, 'i')\n\n/**\n * Default request timeout\n * @type {number} default request timeout is 120 seconds, or two minutes\n */\nexport const defaultTimeout = 120\n\n/** Recognized HTTP methods */\nexport type HttpMethod =\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'DELETE'\n | 'PATCH'\n | 'TRACE'\n | 'HEAD'\n\n/**\n * HTTP status codes\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status for reference\n * TODO is there a platform-agnostic list of these that can be used instead of this static declaration?\n */\nexport enum StatusCode {\n OK = 200,\n Created,\n Accepted,\n NonAuthoritative,\n NoContent,\n ResetContent,\n PartialContent,\n MultiStatus,\n MultiStatusDav,\n IMUsed = 226,\n MultipleChoice = 300,\n MovedPermanently,\n Found,\n SeeOther,\n NotModified,\n UseProxy,\n UnusedRedirect,\n TemporaryRedirect,\n PermanentRedirect,\n BadRequest = 400,\n Unauthorized,\n PaymentRequired,\n Forbidden,\n NotFound,\n MethodNotAllowed,\n NotAcceptable,\n ProxyAuthRequired,\n RequestTimeout,\n Conflict,\n Gone,\n LengthRequired,\n PreconditionFailed,\n PayloadTooLarge,\n UriTooLong,\n UnsupportedMediaType,\n RequestedRangeNotSatisfiable,\n ExpectationFailed,\n ImATeapot,\n MisdirectedRequest = 421,\n UnprocessableEntity,\n Locked,\n FailedDependency,\n TooEarly,\n UpgradeRequired,\n PreconditionRequired,\n TooManyRequests,\n RequestHeaderFieldsTooLarge,\n UnavailableForLegalReasons,\n InternalServerError = 500,\n NotImplemented,\n BadGateway,\n ServiceUnavailable,\n GatewayTimeout,\n HttpVersionNotSupported,\n VariantAlsoNegotiates,\n InsufficientStorage,\n LoopDetected,\n NotExtended = 510,\n NetworkAuthRequired,\n}\n\n/** Untyped basic HTTP response type for \"raw\" HTTP requests */\nexport interface IRawResponse {\n /** Http method of the request */\n method: HttpMethod\n /** ok is `true` if the response is successful, `false` otherwise */\n ok: boolean\n /** HTTP request url */\n url: string\n /** HTTP response code */\n statusCode: number\n /** HTTP response status message text */\n statusMessage: string\n /** MIME type of the response from the HTTP response header */\n contentType: string\n /** The body of the HTTP response, without any additional processing */\n body: any\n /** Optional performance tracking starting mark name */\n startMark?: string\n /** Response headers */\n headers: IRequestHeaders\n}\n\n/** IRawResponse observer function type */\nexport type RawObserver = (raw: IRawResponse) => IRawResponse\n\n/** Transport plug-in interface */\nexport interface ITransport {\n /** Observer lambda to process raw responses */\n observer: RawObserver | undefined\n\n /**\n * HTTP request function for atomic, fully downloaded raw HTTP responses\n *\n * Note: This method returns the result of the HTTP request without any error handling\n *\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse>\n\n /**\n * HTTP request function for atomic, fully downloaded responses\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n request<TSuccess, TError>(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * Processes the raw response, converting it into an SDKResponse\n * @param raw response result\n */\n parseResponse<TSuccess, TError>(\n raw: IRawResponse\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * HTTP request function for a streamable response\n * @param callback that receives the stream response and pipes it somewhere\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns `T` upon success\n * @throws `ISDKErrorResponse` on failure\n */\n stream<T>(\n callback: (readable: Readable) => Promise<T>,\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<T>\n}\n\n/** A successful SDK call. */\nexport interface ISDKSuccessResponse<T> {\n /** Whether the SDK call was successful. */\n ok: true\n /** The object returned by the SDK call. */\n value: T\n}\n\n/** An errant SDK call. */\nexport interface ISDKErrorResponse<T> {\n /** Whether the SDK call was successful. */\n ok: false\n /** The error object returned by the SDK call. */\n error: T\n}\n\n/** An error representing an issue in the SDK, like a network or parsing error. */\nexport interface ISDKError {\n type: 'sdk_error'\n message: string\n}\n\nexport type SDKResponse<TSuccess, TError> =\n | ISDKSuccessResponse<TSuccess>\n | ISDKErrorResponse<TError | ISDKError>\n\n/** Generic collection */\nexport interface IRequestHeaders {\n [key: string]: string\n}\n\n/**\n * Generic http request property collection\n * TODO: Trim this down to what is required\n */\nexport interface IRequestProps {\n [key: string]: any\n /** full url for request, including any query params */\n url: string\n\n /** body of request. optional */\n body?: any\n /** headers for request. optional */\n headers: IRequestHeaders\n /** Http method for request. required. */\n method: HttpMethod\n /** Redirect processing for request. optional */\n redirect?: any\n /** Credentials to use */\n credentials?: 'include' | 'omit' | 'same-origin' | undefined\n\n /** http.Agent instance, allows custom proxy, certificate etc. */\n agent?: Agent\n /** support gzip/deflate content encoding. false to disable */\n compress?: boolean\n /** maximum redirect count. 0 to not follow redirect */\n follow?: number\n /** maximum response body size in bytes */\n size?: number\n /** req/res timeout in ms, it resets on redirect. 0 to disable (OS limit applies) */\n timeout?: number\n}\n\n/** General purpose authentication callback */\nexport type Authenticator = (props: any) => any\n\n/** Interface for API transport values */\nexport interface ITransportSettings {\n [key: string]: any\n /** base URL of API REST web service */\n base_url: string\n /** standard headers to provide in all transport requests */\n headers?: Headers\n /** whether to verify ssl certs or not. Defaults to true */\n verify_ssl: boolean\n /** request timeout in seconds. Default to 30 */\n timeout: number\n /** encoding override */\n encoding?: string | null\n /** agent tag to use for the SDK requests */\n agentTag: string\n}\n\n/**\n * Is the content type binary or \"string\"?\n * @param {string} contentType\n * @returns {ResponseMode.binary | ResponseMode.string}\n */\nexport function responseMode(contentType: string) {\n if (contentType.match(contentPatternString)) {\n return ResponseMode.string\n }\n if (contentType.match(contentPatternBinary)) {\n return ResponseMode.binary\n }\n return ResponseMode.unknown\n}\n\n/**\n * Does this content type have a UTF-8 charset?\n * @param contentType\n * @returns match if it exists\n */\nexport function isUtf8(contentType: string) {\n return contentType.match(/;.*\\bcharset\\b=\\butf-8\\b/i)\n}\n\n/** Used for name/value pair collections like for QueryParams */\nexport type Values = { [key: string]: any } | null | undefined\n\n/**\n * Encode parameter if not already encoded\n * @param value value of parameter\n * @returns URI encoded value\n */\nexport function encodeParam(value: any) {\n if (value instanceof Date) {\n value = value.toISOString()\n }\n let encoded = value.toString()\n\n // decodeURIComponent throws URIError if there is a % character\n // without it being part of an encoded\n try {\n const decoded = decodeURIComponent(value)\n if (value === decoded) {\n encoded = encodeURIComponent(value)\n }\n } catch (e) {\n if (e instanceof URIError) {\n encoded = encodeURIComponent(value)\n } else {\n throw e\n }\n }\n return encoded\n}\n\n/**\n * Converts `Values` to query string parameter format\n * @param values Name/value collection to encode\n * @returns {string} query string parameter formatted values. Both `false` and `null` are included. Only `undefined` are omitted.\n */\nexport function encodeParams(values?: Values) {\n if (!values) return ''\n\n const keys = Object.keys(values)\n return keys\n .filter((k) => values[k] !== undefined) // `null` and `false` will both be passed\n .map((k) => k + '=' + encodeParam(values[k]))\n .join('&')\n}\n\n/**\n * constructs the path argument including any optional query parameters\n * @param path the base path of the request\n * @param obj optional collection of query parameters to encode and append to the path\n */\nexport function addQueryParams(path: string, obj?: Values) {\n if (!obj) {\n return path\n }\n const qp = encodeParams(obj)\n return `${path}${qp ? '?' + qp : ''}`\n}\n\nconst utf8 = 'utf-8'\n\n/**\n * Convert this value to a string representation however we can do it\n * @param val\n */\nfunction bufferString(val: any) {\n let result = 'Unknown error'\n try {\n const decoder = new TextDecoder(utf8)\n result = decoder.decode(val)\n } catch (e: any) {\n // Supremely ugly hack. If we get here, we must be in Node (or IE 11, but who cares about that?)\n // Node requires an import from `util` for TextDecoder to be found BUT it \"just has\" Buffer unless WebPack messes us up\n try {\n if (val instanceof Buffer) {\n result = Buffer.from(val).toString(utf8)\n } else {\n result = JSON.stringify(val)\n }\n } catch (err: any) {\n // The fallback logic here will at least give us some information about the error being thrown\n result = JSON.stringify(val)\n }\n }\n return result\n}\n\n/**\n * SDK error handler\n * @param response any kind of error\n * @returns a new `Error` object with the failure message\n */\nexport function sdkError(response: any) {\n if (typeof response === 'string') {\n return new Error(response)\n }\n if ('error' in response) {\n const error = response.error\n if (typeof error === 'string') {\n return new Error(error)\n }\n // Try to get most specific error first\n if ('error' in error) {\n const result = bufferString(error.error)\n return new Error(result)\n }\n if ('message' in error) {\n return new Error(response.error.message.toString())\n }\n if ('statusMessage' in error) {\n return new Error(error.statusMessage)\n }\n const result = bufferString(error)\n return new Error(result)\n }\n if ('message' in response) {\n return new Error(response.message)\n }\n const error = JSON.stringify(response)\n return new Error(`Unknown error with SDK method ${error}`)\n}\n\n/** A helper method for simplifying error handling of SDK responses.\n *\n * Pass in a promise returned by any SDK method, and it will return a promise\n * that rejects if the `SDKResponse` is not `ok`. This will swallow the type\n * information in the error case, but allows you to route all the error cases\n * into a single promise rejection.\n *\n * The promise will have an `Error` rejection reason with a string `message`.\n * If the server error contains a `message` field, it will be provided, otherwise a\n * generic message will occur.\n *\n * ```ts\n * const sdk = LookerSDK({...})\n * let look\n * try {\n * look = await sdkOk(sdk.create_look({...}))\n * // do something with look\n * }\n * catch(e) {\n * // handle error case\n * }\n * ```\n */\nexport async function sdkOk<TSuccess, TError>(\n promise: Promise<SDKResponse<TSuccess, TError>>\n) {\n const result = await promise\n if (result.ok) {\n return result.value\n } else {\n throw sdkError(result)\n }\n}\n\n/**\n * Converts a byte array to a \"URL safe\" base64 string\n * @param u8 byte array to convert\n */\nexport function safeBase64(u8: Uint8Array) {\n const rawBase64 = btoa(String.fromCharCode(...u8))\n return rawBase64.replace(/\\+/g, '-').replace(/\\//g, '_')\n}\n\n/**\n * Type predicate. Asserts that a given object is error-like.\n * @param error a value of unknown type\n * @return boolean true if the error has a `message` key of type string.\n */\nexport function isErrorLike<T extends unknown>(\n error: T\n): error is T & { message: string } {\n if (typeof error !== 'object') return false\n if (!error) return false\n if (!Object.prototype.hasOwnProperty.call(error, 'message')) return false\n if (typeof (error as { message: unknown }).message !== 'string') return false\n return true\n}\n"],"file":"transport.js"}
1
+ {"version":3,"sources":["../../src/transport.ts"],"names":["matchCharsetUtf8","matchModeBinary","matchModeString","DelimArray","agentPrefix","LookerAppId","tracing","trace","message","info","console","debug","ResponseMode","contentPatternString","RegExp","contentPatternBinary","charsetUtf8Pattern","defaultTimeout","StatusCode","responseMode","contentType","match","string","binary","unknown","isUtf8","encodeParam","value","Date","toISOString","toString","encoded","JSON","stringify","decoded","decodeURIComponent","encodeURIComponent","e","URIError","encodeParams","values","keys","Object","filter","k","undefined","map","join","addQueryParams","path","obj","qp","utf8","bufferString","val","result","decoder","TextDecoder","decode","Buffer","from","err","sdkError","response","Error","error","statusMessage","sdkOk","promise","ok","safeBase64","u8","rawBase64","btoa","String","fromCharCode","replace","isErrorLike","prototype","hasOwnProperty","call"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { Agent } from 'https'\nimport type { Headers } from 'request'\nimport type { Readable } from 'readable-stream'\nimport { matchCharsetUtf8, matchModeBinary, matchModeString } from './constants'\nimport { DelimArray } from './delimArray'\n\nexport const agentPrefix = 'TS-SDK'\nexport const LookerAppId = 'x-looker-appid'\n\n/** Set to `true` to follow streaming process */\nconst tracing = false\n\n/**\n * trivial tracing function that should be replaced with a log plugin\n * @param message description for trace\n * @param info any additional information to produce for output\n */\nexport function trace(message: string, info?: any) {\n if (tracing) {\n // eslint-disable-next-line no-console\n console.debug(message)\n if (info) {\n // eslint-disable-next-line no-console\n console.debug({ info })\n }\n }\n}\n\n/** ResponseMode for an HTTP request */\nexport enum ResponseMode {\n 'binary', // this is a binary response\n 'string', // this is a \"string\" response\n 'unknown', // unrecognized response type\n}\n\n/**\n * MIME patterns for string content types\n * @type {RegExp}\n */\nexport const contentPatternString = new RegExp(matchModeString, 'i')\n\n/**\n * MIME patterns for \"binary\" content types\n * @type {RegExp}\n */\nexport const contentPatternBinary = new RegExp(matchModeBinary, 'i')\n\n/**\n * MIME pattern for UTF8 charset attribute\n * @type {RegExp}\n */\nexport const charsetUtf8Pattern = new RegExp(matchCharsetUtf8, 'i')\n\n/**\n * Default request timeout\n * @type {number} default request timeout is 120 seconds, or two minutes\n */\nexport const defaultTimeout = 120\n\n/** Recognized HTTP methods */\nexport type HttpMethod =\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'DELETE'\n | 'PATCH'\n | 'TRACE'\n | 'HEAD'\n\n/**\n * HTTP status codes\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status for reference\n * TODO is there a platform-agnostic list of these that can be used instead of this static declaration?\n */\nexport enum StatusCode {\n OK = 200,\n Created,\n Accepted,\n NonAuthoritative,\n NoContent,\n ResetContent,\n PartialContent,\n MultiStatus,\n MultiStatusDav,\n IMUsed = 226,\n MultipleChoice = 300,\n MovedPermanently,\n Found,\n SeeOther,\n NotModified,\n UseProxy,\n UnusedRedirect,\n TemporaryRedirect,\n PermanentRedirect,\n BadRequest = 400,\n Unauthorized,\n PaymentRequired,\n Forbidden,\n NotFound,\n MethodNotAllowed,\n NotAcceptable,\n ProxyAuthRequired,\n RequestTimeout,\n Conflict,\n Gone,\n LengthRequired,\n PreconditionFailed,\n PayloadTooLarge,\n UriTooLong,\n UnsupportedMediaType,\n RequestedRangeNotSatisfiable,\n ExpectationFailed,\n ImATeapot,\n MisdirectedRequest = 421,\n UnprocessableEntity,\n Locked,\n FailedDependency,\n TooEarly,\n UpgradeRequired,\n PreconditionRequired,\n TooManyRequests,\n RequestHeaderFieldsTooLarge,\n UnavailableForLegalReasons,\n InternalServerError = 500,\n NotImplemented,\n BadGateway,\n ServiceUnavailable,\n GatewayTimeout,\n HttpVersionNotSupported,\n VariantAlsoNegotiates,\n InsufficientStorage,\n LoopDetected,\n NotExtended = 510,\n NetworkAuthRequired,\n}\n\n/** Untyped basic HTTP response type for \"raw\" HTTP requests */\nexport interface IRawResponse {\n /** Http method of the request */\n method: HttpMethod\n /** ok is `true` if the response is successful, `false` otherwise */\n ok: boolean\n /** HTTP request url */\n url: string\n /** HTTP response code */\n statusCode: number\n /** HTTP response status message text */\n statusMessage: string\n /** MIME type of the response from the HTTP response header */\n contentType: string\n /** The body of the HTTP response, without any additional processing */\n body: any\n /** Optional performance tracking starting mark name */\n startMark?: string\n /** Response headers */\n headers: IRequestHeaders\n}\n\n/** IRawResponse observer function type */\nexport type RawObserver = (raw: IRawResponse) => IRawResponse\n\n/** Transport plug-in interface */\nexport interface ITransport {\n /** Observer lambda to process raw responses */\n observer: RawObserver | undefined\n\n /**\n * HTTP request function for atomic, fully downloaded raw HTTP responses\n *\n * Note: This method returns the result of the HTTP request without any error handling\n *\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse>\n\n /**\n * HTTP request function for atomic, fully downloaded responses\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n request<TSuccess, TError>(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * Processes the raw response, converting it into an SDKResponse\n * @param raw response result\n */\n parseResponse<TSuccess, TError>(\n raw: IRawResponse\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * HTTP request function for a streamable response\n * @param callback that receives the stream response and pipes it somewhere\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns `T` upon success\n * @throws `ISDKErrorResponse` on failure\n */\n stream<T>(\n callback: (readable: Readable) => Promise<T>,\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<T>\n}\n\n/** A successful SDK call. */\nexport interface ISDKSuccessResponse<T> {\n /** Whether the SDK call was successful. */\n ok: true\n /** The object returned by the SDK call. */\n value: T\n}\n\n/** An errant SDK call. */\nexport interface ISDKErrorResponse<T> {\n /** Whether the SDK call was successful. */\n ok: false\n /** The error object returned by the SDK call. */\n error: T\n}\n\n/** An error representing an issue in the SDK, like a network or parsing error. */\nexport interface ISDKError {\n type: 'sdk_error'\n message: string\n}\n\nexport type SDKResponse<TSuccess, TError> =\n | ISDKSuccessResponse<TSuccess>\n | ISDKErrorResponse<TError | ISDKError>\n\n/** Generic collection */\nexport interface IRequestHeaders {\n [key: string]: string\n}\n\n/**\n * Generic http request property collection\n * TODO: Trim this down to what is required\n */\nexport interface IRequestProps {\n [key: string]: any\n /** full url for request, including any query params */\n url: string\n\n /** body of request. optional */\n body?: any\n /** headers for request. optional */\n headers: IRequestHeaders\n /** Http method for request. required. */\n method: HttpMethod\n /** Redirect processing for request. optional */\n redirect?: any\n /** Credentials to use */\n credentials?: 'include' | 'omit' | 'same-origin' | undefined\n\n /** http.Agent instance, allows custom proxy, certificate etc. */\n agent?: Agent\n /** support gzip/deflate content encoding. false to disable */\n compress?: boolean\n /** maximum redirect count. 0 to not follow redirect */\n follow?: number\n /** maximum response body size in bytes */\n size?: number\n /** req/res timeout in ms, it resets on redirect. 0 to disable (OS limit applies) */\n timeout?: number\n}\n\n/** General purpose authentication callback */\nexport type Authenticator = (props: any) => any\n\n/** Interface for API transport values */\nexport interface ITransportSettings {\n [key: string]: any\n /** base URL of API REST web service */\n base_url: string\n /** standard headers to provide in all transport requests */\n headers?: Headers\n /** whether to verify ssl certs or not. Defaults to true */\n verify_ssl: boolean\n /** request timeout in seconds. Default to 30 */\n timeout: number\n /** encoding override */\n encoding?: string | null\n /** agent tag to use for the SDK requests */\n agentTag: string\n}\n\n/**\n * Is the content type binary or \"string\"?\n * @param {string} contentType\n * @returns {ResponseMode.binary | ResponseMode.string}\n */\nexport function responseMode(contentType: string) {\n if (contentType.match(contentPatternString)) {\n return ResponseMode.string\n }\n if (contentType.match(contentPatternBinary)) {\n return ResponseMode.binary\n }\n return ResponseMode.unknown\n}\n\n/**\n * Does this content type have a UTF-8 charset?\n * @param contentType\n * @returns match if it exists\n */\nexport function isUtf8(contentType: string) {\n return contentType.match(/;.*\\bcharset\\b=\\butf-8\\b/i)\n}\n\n/** Used for name/value pair collections like for QueryParams */\nexport type Values = { [key: string]: any } | null | undefined\n\n/**\n * Encode parameter if not already encoded\n *\n * Note: this includes recognition of Date, DelimArray, and default objects for special handling\n *\n * @param value value of parameter\n * @returns URI encoded value\n */\nexport function encodeParam(value: any) {\n if (value instanceof Date) {\n value = value.toISOString()\n } else if (value instanceof DelimArray) {\n value = value.toString()\n }\n // check for object type to prevent \"[object Object]\" as the value.toString()\n let encoded =\n typeof value === 'object' ? JSON.stringify(value) : value.toString()\n\n // decodeURIComponent throws URIError if there is a % character\n // without it being part of an encoded\n try {\n const decoded = decodeURIComponent(value)\n if (value === decoded) {\n encoded = encodeURIComponent(value)\n }\n } catch (e) {\n if (e instanceof URIError) {\n encoded = encodeURIComponent(value)\n } else {\n throw e\n }\n }\n return encoded\n}\n\n/**\n * Converts `Values` to query string parameter format\n * @param values Name/value collection to encode\n * @returns {string} query string parameter formatted values. Both `false` and `null` are included. Only `undefined` are omitted.\n */\nexport function encodeParams(values?: Values) {\n if (!values) return ''\n\n const keys = Object.keys(values)\n return keys\n .filter((k) => values[k] !== undefined) // `null` and `false` will both be passed\n .map((k) => k + '=' + encodeParam(values[k]))\n .join('&')\n}\n\n/**\n * constructs the path argument including any optional query parameters\n * @param path the base path of the request\n * @param obj optional collection of query parameters to encode and append to the path\n */\nexport function addQueryParams(path: string, obj?: Values) {\n if (!obj) {\n return path\n }\n const qp = encodeParams(obj)\n return `${path}${qp ? '?' + qp : ''}`\n}\n\nconst utf8 = 'utf-8'\n\n/**\n * Convert this value to a string representation however we can do it\n * @param val\n */\nfunction bufferString(val: any) {\n let result = 'Unknown error'\n try {\n const decoder = new TextDecoder(utf8)\n result = decoder.decode(val)\n } catch (e: any) {\n // Supremely ugly hack. If we get here, we must be in Node (or IE 11, but who cares about that?)\n // Node requires an import from `util` for TextDecoder to be found BUT it \"just has\" Buffer unless WebPack messes us up\n try {\n if (val instanceof Buffer) {\n result = Buffer.from(val).toString(utf8)\n } else {\n result = JSON.stringify(val)\n }\n } catch (err: any) {\n // The fallback logic here will at least give us some information about the error being thrown\n result = JSON.stringify(val)\n }\n }\n return result\n}\n\n/**\n * SDK error handler\n * @param response any kind of error\n * @returns a new `Error` object with the failure message\n */\nexport function sdkError(response: any) {\n if (typeof response === 'string') {\n return new Error(response)\n }\n if ('error' in response) {\n const error = response.error\n if (typeof error === 'string') {\n return new Error(error)\n }\n // Try to get most specific error first\n if ('error' in error) {\n const result = bufferString(error.error)\n return new Error(result)\n }\n if ('message' in error) {\n return new Error(response.error.message.toString())\n }\n if ('statusMessage' in error) {\n return new Error(error.statusMessage)\n }\n const result = bufferString(error)\n return new Error(result)\n }\n if ('message' in response) {\n return new Error(response.message)\n }\n const error = JSON.stringify(response)\n return new Error(`Unknown error with SDK method ${error}`)\n}\n\n/** A helper method for simplifying error handling of SDK responses.\n *\n * Pass in a promise returned by any SDK method, and it will return a promise\n * that rejects if the `SDKResponse` is not `ok`. This will swallow the type\n * information in the error case, but allows you to route all the error cases\n * into a single promise rejection.\n *\n * The promise will have an `Error` rejection reason with a string `message`.\n * If the server error contains a `message` field, it will be provided, otherwise a\n * generic message will occur.\n *\n * ```ts\n * const sdk = LookerSDK({...})\n * let look\n * try {\n * look = await sdkOk(sdk.create_look({...}))\n * // do something with look\n * }\n * catch(e) {\n * // handle error case\n * }\n * ```\n */\nexport async function sdkOk<TSuccess, TError>(\n promise: Promise<SDKResponse<TSuccess, TError>>\n) {\n const result = await promise\n if (result.ok) {\n return result.value\n } else {\n throw sdkError(result)\n }\n}\n\n/**\n * Converts a byte array to a \"URL safe\" base64 string\n * @param u8 byte array to convert\n */\nexport function safeBase64(u8: Uint8Array) {\n const rawBase64 = btoa(String.fromCharCode(...u8))\n return rawBase64.replace(/\\+/g, '-').replace(/\\//g, '_')\n}\n\n/**\n * Type predicate. Asserts that a given object is error-like.\n * @param error a value of unknown type\n * @return boolean true if the error has a `message` key of type string.\n */\nexport function isErrorLike<T extends unknown>(\n error: T\n): error is T & { message: string } {\n if (typeof error !== 'object') return false\n if (!error) return false\n if (!Object.prototype.hasOwnProperty.call(error, 'message')) return false\n if (typeof (error as { message: unknown }).message !== 'string') return false\n return true\n}\n"],"file":"transport.js"}
@@ -14,6 +14,7 @@ interface IAuthCodeGrantTypeParams {
14
14
  export declare class OAuthSession extends AuthSession {
15
15
  activeToken: AuthToken;
16
16
  crypto: ICryptoHash;
17
+ reentry: boolean;
17
18
  private static readonly codeVerifierKey;
18
19
  static readonly returnUrlKey = "looker_oauth_return_url";
19
20
  constructor(services: IPlatformServices);
@@ -29,6 +29,8 @@ class OAuthSession extends _authSession.AuthSession {
29
29
 
30
30
  _defineProperty(this, "crypto", void 0);
31
31
 
32
+ _defineProperty(this, "reentry", false);
33
+
32
34
  this.crypto = services.crypto;
33
35
  var keys = ['client_id', 'redirect_uri', 'base_url', 'looker_url'];
34
36
 
@@ -97,12 +99,13 @@ class OAuthSession extends _authSession.AuthSession {
97
99
 
98
100
  return _asyncToGenerator(function* () {
99
101
  if (!_this2.isAuthenticated()) {
100
- if (!_this2.returnUrl) {
102
+ if (_this2.reentry) {} else if (!_this2.returnUrl) {
101
103
  var authUrl = yield _this2.createAuthCodeRequestUrl('cors_api', _transport.agentPrefix);
102
104
  var returnTo = window.location.pathname + window.location.search;
103
105
  _this2.returnUrl = returnTo;
104
106
  window.location.href = authUrl;
105
107
  } else {
108
+ _this2.reentry = true;
106
109
  _this2.returnUrl = null;
107
110
 
108
111
  if (!_this2.code_verifier) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/oauthSession.ts"],"names":["OAuthSession","AuthSession","constructor","services","settings","transport","AuthToken","crypto","keys","config","readConfig","forEach","key","value","message","authenticate","props","token","getToken","access_token","headers","Authorization","code_verifier","sessionStorage","getItem","codeVerifierKey","removeItem","setItem","returnUrl","returnUrlKey","clearStorage","login","_sudoId","isAuthenticated","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","secureRandom","code_challenge","sha256Hash","client_id","code_challenge_method","redirect_uri","response_type","looker_url","redeemAuthCodeBody","authCode","codeVerifier","verifier","grant_type","refresh_token","isActive","logout","init"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { 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 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.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 // 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 this.code_verifier = this.crypto.secureRandom(33)\n const code_challenge = await this.crypto.sha256Hash(this.code_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"],"file":"oauthSession.js"}
1
+ {"version":3,"sources":["../src/oauthSession.ts"],"names":["OAuthSession","AuthSession","constructor","services","settings","transport","AuthToken","crypto","keys","config","readConfig","forEach","key","value","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","secureRandom","code_challenge","sha256Hash","client_id","code_challenge_method","redirect_uri","response_type","looker_url","redeemAuthCodeBody","authCode","codeVerifier","verifier","grant_type","refresh_token","isActive","logout","init"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { 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 this.code_verifier = this.crypto.secureRandom(33)\n const code_challenge = await this.crypto.sha256Hash(this.code_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"],"file":"oauthSession.js"}
package/lib/transport.js CHANGED
@@ -17,6 +17,8 @@ exports.StatusCode = exports.defaultTimeout = exports.charsetUtf8Pattern = expor
17
17
 
18
18
  var _constants = require("./constants");
19
19
 
20
+ var _delimArray = require("./delimArray");
21
+
20
22
  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); } }
21
23
 
22
24
  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); }); }; }
@@ -140,9 +142,11 @@ function isUtf8(contentType) {
140
142
  function encodeParam(value) {
141
143
  if (value instanceof Date) {
142
144
  value = value.toISOString();
145
+ } else if (value instanceof _delimArray.DelimArray) {
146
+ value = value.toString();
143
147
  }
144
148
 
145
- var encoded = value.toString();
149
+ var encoded = typeof value === 'object' ? JSON.stringify(value) : value.toString();
146
150
 
147
151
  try {
148
152
  var decoded = decodeURIComponent(value);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transport.ts"],"names":["agentPrefix","LookerAppId","tracing","trace","message","info","console","debug","ResponseMode","contentPatternString","RegExp","matchModeString","contentPatternBinary","matchModeBinary","charsetUtf8Pattern","matchCharsetUtf8","defaultTimeout","StatusCode","responseMode","contentType","match","string","binary","unknown","isUtf8","encodeParam","value","Date","toISOString","encoded","toString","decoded","decodeURIComponent","encodeURIComponent","e","URIError","encodeParams","values","keys","Object","filter","k","undefined","map","join","addQueryParams","path","obj","qp","utf8","bufferString","val","result","decoder","TextDecoder","decode","Buffer","from","JSON","stringify","err","sdkError","response","Error","error","statusMessage","sdkOk","promise","ok","safeBase64","u8","rawBase64","btoa","String","fromCharCode","replace","isErrorLike","prototype","hasOwnProperty","call"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { Agent } from 'https'\nimport type { Headers } from 'request'\nimport type { Readable } from 'readable-stream'\nimport { matchCharsetUtf8, matchModeBinary, matchModeString } from './constants'\n\nexport const agentPrefix = 'TS-SDK'\nexport const LookerAppId = 'x-looker-appid'\n\n/** Set to `true` to follow streaming process */\nconst tracing = false\n\n/**\n * trivial tracing function that should be replaced with a log plugin\n * @param message description for trace\n * @param info any additional information to produce for output\n */\nexport function trace(message: string, info?: any) {\n if (tracing) {\n // eslint-disable-next-line no-console\n console.debug(message)\n if (info) {\n // eslint-disable-next-line no-console\n console.debug({ info })\n }\n }\n}\n\n/** ResponseMode for an HTTP request */\nexport enum ResponseMode {\n 'binary', // this is a binary response\n 'string', // this is a \"string\" response\n 'unknown', // unrecognized response type\n}\n\n/**\n * MIME patterns for string content types\n * @type {RegExp}\n */\nexport const contentPatternString = new RegExp(matchModeString, 'i')\n\n/**\n * MIME patterns for \"binary\" content types\n * @type {RegExp}\n */\nexport const contentPatternBinary = new RegExp(matchModeBinary, 'i')\n\n/**\n * MIME pattern for UTF8 charset attribute\n * @type {RegExp}\n */\nexport const charsetUtf8Pattern = new RegExp(matchCharsetUtf8, 'i')\n\n/**\n * Default request timeout\n * @type {number} default request timeout is 120 seconds, or two minutes\n */\nexport const defaultTimeout = 120\n\n/** Recognized HTTP methods */\nexport type HttpMethod =\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'DELETE'\n | 'PATCH'\n | 'TRACE'\n | 'HEAD'\n\n/**\n * HTTP status codes\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status for reference\n * TODO is there a platform-agnostic list of these that can be used instead of this static declaration?\n */\nexport enum StatusCode {\n OK = 200,\n Created,\n Accepted,\n NonAuthoritative,\n NoContent,\n ResetContent,\n PartialContent,\n MultiStatus,\n MultiStatusDav,\n IMUsed = 226,\n MultipleChoice = 300,\n MovedPermanently,\n Found,\n SeeOther,\n NotModified,\n UseProxy,\n UnusedRedirect,\n TemporaryRedirect,\n PermanentRedirect,\n BadRequest = 400,\n Unauthorized,\n PaymentRequired,\n Forbidden,\n NotFound,\n MethodNotAllowed,\n NotAcceptable,\n ProxyAuthRequired,\n RequestTimeout,\n Conflict,\n Gone,\n LengthRequired,\n PreconditionFailed,\n PayloadTooLarge,\n UriTooLong,\n UnsupportedMediaType,\n RequestedRangeNotSatisfiable,\n ExpectationFailed,\n ImATeapot,\n MisdirectedRequest = 421,\n UnprocessableEntity,\n Locked,\n FailedDependency,\n TooEarly,\n UpgradeRequired,\n PreconditionRequired,\n TooManyRequests,\n RequestHeaderFieldsTooLarge,\n UnavailableForLegalReasons,\n InternalServerError = 500,\n NotImplemented,\n BadGateway,\n ServiceUnavailable,\n GatewayTimeout,\n HttpVersionNotSupported,\n VariantAlsoNegotiates,\n InsufficientStorage,\n LoopDetected,\n NotExtended = 510,\n NetworkAuthRequired,\n}\n\n/** Untyped basic HTTP response type for \"raw\" HTTP requests */\nexport interface IRawResponse {\n /** Http method of the request */\n method: HttpMethod\n /** ok is `true` if the response is successful, `false` otherwise */\n ok: boolean\n /** HTTP request url */\n url: string\n /** HTTP response code */\n statusCode: number\n /** HTTP response status message text */\n statusMessage: string\n /** MIME type of the response from the HTTP response header */\n contentType: string\n /** The body of the HTTP response, without any additional processing */\n body: any\n /** Optional performance tracking starting mark name */\n startMark?: string\n /** Response headers */\n headers: IRequestHeaders\n}\n\n/** IRawResponse observer function type */\nexport type RawObserver = (raw: IRawResponse) => IRawResponse\n\n/** Transport plug-in interface */\nexport interface ITransport {\n /** Observer lambda to process raw responses */\n observer: RawObserver | undefined\n\n /**\n * HTTP request function for atomic, fully downloaded raw HTTP responses\n *\n * Note: This method returns the result of the HTTP request without any error handling\n *\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse>\n\n /**\n * HTTP request function for atomic, fully downloaded responses\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n request<TSuccess, TError>(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * Processes the raw response, converting it into an SDKResponse\n * @param raw response result\n */\n parseResponse<TSuccess, TError>(\n raw: IRawResponse\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * HTTP request function for a streamable response\n * @param callback that receives the stream response and pipes it somewhere\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns `T` upon success\n * @throws `ISDKErrorResponse` on failure\n */\n stream<T>(\n callback: (readable: Readable) => Promise<T>,\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<T>\n}\n\n/** A successful SDK call. */\nexport interface ISDKSuccessResponse<T> {\n /** Whether the SDK call was successful. */\n ok: true\n /** The object returned by the SDK call. */\n value: T\n}\n\n/** An errant SDK call. */\nexport interface ISDKErrorResponse<T> {\n /** Whether the SDK call was successful. */\n ok: false\n /** The error object returned by the SDK call. */\n error: T\n}\n\n/** An error representing an issue in the SDK, like a network or parsing error. */\nexport interface ISDKError {\n type: 'sdk_error'\n message: string\n}\n\nexport type SDKResponse<TSuccess, TError> =\n | ISDKSuccessResponse<TSuccess>\n | ISDKErrorResponse<TError | ISDKError>\n\n/** Generic collection */\nexport interface IRequestHeaders {\n [key: string]: string\n}\n\n/**\n * Generic http request property collection\n * TODO: Trim this down to what is required\n */\nexport interface IRequestProps {\n [key: string]: any\n /** full url for request, including any query params */\n url: string\n\n /** body of request. optional */\n body?: any\n /** headers for request. optional */\n headers: IRequestHeaders\n /** Http method for request. required. */\n method: HttpMethod\n /** Redirect processing for request. optional */\n redirect?: any\n /** Credentials to use */\n credentials?: 'include' | 'omit' | 'same-origin' | undefined\n\n /** http.Agent instance, allows custom proxy, certificate etc. */\n agent?: Agent\n /** support gzip/deflate content encoding. false to disable */\n compress?: boolean\n /** maximum redirect count. 0 to not follow redirect */\n follow?: number\n /** maximum response body size in bytes */\n size?: number\n /** req/res timeout in ms, it resets on redirect. 0 to disable (OS limit applies) */\n timeout?: number\n}\n\n/** General purpose authentication callback */\nexport type Authenticator = (props: any) => any\n\n/** Interface for API transport values */\nexport interface ITransportSettings {\n [key: string]: any\n /** base URL of API REST web service */\n base_url: string\n /** standard headers to provide in all transport requests */\n headers?: Headers\n /** whether to verify ssl certs or not. Defaults to true */\n verify_ssl: boolean\n /** request timeout in seconds. Default to 30 */\n timeout: number\n /** encoding override */\n encoding?: string | null\n /** agent tag to use for the SDK requests */\n agentTag: string\n}\n\n/**\n * Is the content type binary or \"string\"?\n * @param {string} contentType\n * @returns {ResponseMode.binary | ResponseMode.string}\n */\nexport function responseMode(contentType: string) {\n if (contentType.match(contentPatternString)) {\n return ResponseMode.string\n }\n if (contentType.match(contentPatternBinary)) {\n return ResponseMode.binary\n }\n return ResponseMode.unknown\n}\n\n/**\n * Does this content type have a UTF-8 charset?\n * @param contentType\n * @returns match if it exists\n */\nexport function isUtf8(contentType: string) {\n return contentType.match(/;.*\\bcharset\\b=\\butf-8\\b/i)\n}\n\n/** Used for name/value pair collections like for QueryParams */\nexport type Values = { [key: string]: any } | null | undefined\n\n/**\n * Encode parameter if not already encoded\n * @param value value of parameter\n * @returns URI encoded value\n */\nexport function encodeParam(value: any) {\n if (value instanceof Date) {\n value = value.toISOString()\n }\n let encoded = value.toString()\n\n // decodeURIComponent throws URIError if there is a % character\n // without it being part of an encoded\n try {\n const decoded = decodeURIComponent(value)\n if (value === decoded) {\n encoded = encodeURIComponent(value)\n }\n } catch (e) {\n if (e instanceof URIError) {\n encoded = encodeURIComponent(value)\n } else {\n throw e\n }\n }\n return encoded\n}\n\n/**\n * Converts `Values` to query string parameter format\n * @param values Name/value collection to encode\n * @returns {string} query string parameter formatted values. Both `false` and `null` are included. Only `undefined` are omitted.\n */\nexport function encodeParams(values?: Values) {\n if (!values) return ''\n\n const keys = Object.keys(values)\n return keys\n .filter((k) => values[k] !== undefined) // `null` and `false` will both be passed\n .map((k) => k + '=' + encodeParam(values[k]))\n .join('&')\n}\n\n/**\n * constructs the path argument including any optional query parameters\n * @param path the base path of the request\n * @param obj optional collection of query parameters to encode and append to the path\n */\nexport function addQueryParams(path: string, obj?: Values) {\n if (!obj) {\n return path\n }\n const qp = encodeParams(obj)\n return `${path}${qp ? '?' + qp : ''}`\n}\n\nconst utf8 = 'utf-8'\n\n/**\n * Convert this value to a string representation however we can do it\n * @param val\n */\nfunction bufferString(val: any) {\n let result = 'Unknown error'\n try {\n const decoder = new TextDecoder(utf8)\n result = decoder.decode(val)\n } catch (e: any) {\n // Supremely ugly hack. If we get here, we must be in Node (or IE 11, but who cares about that?)\n // Node requires an import from `util` for TextDecoder to be found BUT it \"just has\" Buffer unless WebPack messes us up\n try {\n if (val instanceof Buffer) {\n result = Buffer.from(val).toString(utf8)\n } else {\n result = JSON.stringify(val)\n }\n } catch (err: any) {\n // The fallback logic here will at least give us some information about the error being thrown\n result = JSON.stringify(val)\n }\n }\n return result\n}\n\n/**\n * SDK error handler\n * @param response any kind of error\n * @returns a new `Error` object with the failure message\n */\nexport function sdkError(response: any) {\n if (typeof response === 'string') {\n return new Error(response)\n }\n if ('error' in response) {\n const error = response.error\n if (typeof error === 'string') {\n return new Error(error)\n }\n // Try to get most specific error first\n if ('error' in error) {\n const result = bufferString(error.error)\n return new Error(result)\n }\n if ('message' in error) {\n return new Error(response.error.message.toString())\n }\n if ('statusMessage' in error) {\n return new Error(error.statusMessage)\n }\n const result = bufferString(error)\n return new Error(result)\n }\n if ('message' in response) {\n return new Error(response.message)\n }\n const error = JSON.stringify(response)\n return new Error(`Unknown error with SDK method ${error}`)\n}\n\n/** A helper method for simplifying error handling of SDK responses.\n *\n * Pass in a promise returned by any SDK method, and it will return a promise\n * that rejects if the `SDKResponse` is not `ok`. This will swallow the type\n * information in the error case, but allows you to route all the error cases\n * into a single promise rejection.\n *\n * The promise will have an `Error` rejection reason with a string `message`.\n * If the server error contains a `message` field, it will be provided, otherwise a\n * generic message will occur.\n *\n * ```ts\n * const sdk = LookerSDK({...})\n * let look\n * try {\n * look = await sdkOk(sdk.create_look({...}))\n * // do something with look\n * }\n * catch(e) {\n * // handle error case\n * }\n * ```\n */\nexport async function sdkOk<TSuccess, TError>(\n promise: Promise<SDKResponse<TSuccess, TError>>\n) {\n const result = await promise\n if (result.ok) {\n return result.value\n } else {\n throw sdkError(result)\n }\n}\n\n/**\n * Converts a byte array to a \"URL safe\" base64 string\n * @param u8 byte array to convert\n */\nexport function safeBase64(u8: Uint8Array) {\n const rawBase64 = btoa(String.fromCharCode(...u8))\n return rawBase64.replace(/\\+/g, '-').replace(/\\//g, '_')\n}\n\n/**\n * Type predicate. Asserts that a given object is error-like.\n * @param error a value of unknown type\n * @return boolean true if the error has a `message` key of type string.\n */\nexport function isErrorLike<T extends unknown>(\n error: T\n): error is T & { message: string } {\n if (typeof error !== 'object') return false\n if (!error) return false\n if (!Object.prototype.hasOwnProperty.call(error, 'message')) return false\n if (typeof (error as { message: unknown }).message !== 'string') return false\n return true\n}\n"],"file":"transport.js"}
1
+ {"version":3,"sources":["../src/transport.ts"],"names":["agentPrefix","LookerAppId","tracing","trace","message","info","console","debug","ResponseMode","contentPatternString","RegExp","matchModeString","contentPatternBinary","matchModeBinary","charsetUtf8Pattern","matchCharsetUtf8","defaultTimeout","StatusCode","responseMode","contentType","match","string","binary","unknown","isUtf8","encodeParam","value","Date","toISOString","DelimArray","toString","encoded","JSON","stringify","decoded","decodeURIComponent","encodeURIComponent","e","URIError","encodeParams","values","keys","Object","filter","k","undefined","map","join","addQueryParams","path","obj","qp","utf8","bufferString","val","result","decoder","TextDecoder","decode","Buffer","from","err","sdkError","response","Error","error","statusMessage","sdkOk","promise","ok","safeBase64","u8","rawBase64","btoa","String","fromCharCode","replace","isErrorLike","prototype","hasOwnProperty","call"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { Agent } from 'https'\nimport type { Headers } from 'request'\nimport type { Readable } from 'readable-stream'\nimport { matchCharsetUtf8, matchModeBinary, matchModeString } from './constants'\nimport { DelimArray } from './delimArray'\n\nexport const agentPrefix = 'TS-SDK'\nexport const LookerAppId = 'x-looker-appid'\n\n/** Set to `true` to follow streaming process */\nconst tracing = false\n\n/**\n * trivial tracing function that should be replaced with a log plugin\n * @param message description for trace\n * @param info any additional information to produce for output\n */\nexport function trace(message: string, info?: any) {\n if (tracing) {\n // eslint-disable-next-line no-console\n console.debug(message)\n if (info) {\n // eslint-disable-next-line no-console\n console.debug({ info })\n }\n }\n}\n\n/** ResponseMode for an HTTP request */\nexport enum ResponseMode {\n 'binary', // this is a binary response\n 'string', // this is a \"string\" response\n 'unknown', // unrecognized response type\n}\n\n/**\n * MIME patterns for string content types\n * @type {RegExp}\n */\nexport const contentPatternString = new RegExp(matchModeString, 'i')\n\n/**\n * MIME patterns for \"binary\" content types\n * @type {RegExp}\n */\nexport const contentPatternBinary = new RegExp(matchModeBinary, 'i')\n\n/**\n * MIME pattern for UTF8 charset attribute\n * @type {RegExp}\n */\nexport const charsetUtf8Pattern = new RegExp(matchCharsetUtf8, 'i')\n\n/**\n * Default request timeout\n * @type {number} default request timeout is 120 seconds, or two minutes\n */\nexport const defaultTimeout = 120\n\n/** Recognized HTTP methods */\nexport type HttpMethod =\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'DELETE'\n | 'PATCH'\n | 'TRACE'\n | 'HEAD'\n\n/**\n * HTTP status codes\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status for reference\n * TODO is there a platform-agnostic list of these that can be used instead of this static declaration?\n */\nexport enum StatusCode {\n OK = 200,\n Created,\n Accepted,\n NonAuthoritative,\n NoContent,\n ResetContent,\n PartialContent,\n MultiStatus,\n MultiStatusDav,\n IMUsed = 226,\n MultipleChoice = 300,\n MovedPermanently,\n Found,\n SeeOther,\n NotModified,\n UseProxy,\n UnusedRedirect,\n TemporaryRedirect,\n PermanentRedirect,\n BadRequest = 400,\n Unauthorized,\n PaymentRequired,\n Forbidden,\n NotFound,\n MethodNotAllowed,\n NotAcceptable,\n ProxyAuthRequired,\n RequestTimeout,\n Conflict,\n Gone,\n LengthRequired,\n PreconditionFailed,\n PayloadTooLarge,\n UriTooLong,\n UnsupportedMediaType,\n RequestedRangeNotSatisfiable,\n ExpectationFailed,\n ImATeapot,\n MisdirectedRequest = 421,\n UnprocessableEntity,\n Locked,\n FailedDependency,\n TooEarly,\n UpgradeRequired,\n PreconditionRequired,\n TooManyRequests,\n RequestHeaderFieldsTooLarge,\n UnavailableForLegalReasons,\n InternalServerError = 500,\n NotImplemented,\n BadGateway,\n ServiceUnavailable,\n GatewayTimeout,\n HttpVersionNotSupported,\n VariantAlsoNegotiates,\n InsufficientStorage,\n LoopDetected,\n NotExtended = 510,\n NetworkAuthRequired,\n}\n\n/** Untyped basic HTTP response type for \"raw\" HTTP requests */\nexport interface IRawResponse {\n /** Http method of the request */\n method: HttpMethod\n /** ok is `true` if the response is successful, `false` otherwise */\n ok: boolean\n /** HTTP request url */\n url: string\n /** HTTP response code */\n statusCode: number\n /** HTTP response status message text */\n statusMessage: string\n /** MIME type of the response from the HTTP response header */\n contentType: string\n /** The body of the HTTP response, without any additional processing */\n body: any\n /** Optional performance tracking starting mark name */\n startMark?: string\n /** Response headers */\n headers: IRequestHeaders\n}\n\n/** IRawResponse observer function type */\nexport type RawObserver = (raw: IRawResponse) => IRawResponse\n\n/** Transport plug-in interface */\nexport interface ITransport {\n /** Observer lambda to process raw responses */\n observer: RawObserver | undefined\n\n /**\n * HTTP request function for atomic, fully downloaded raw HTTP responses\n *\n * Note: This method returns the result of the HTTP request without any error handling\n *\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse>\n\n /**\n * HTTP request function for atomic, fully downloaded responses\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n request<TSuccess, TError>(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * Processes the raw response, converting it into an SDKResponse\n * @param raw response result\n */\n parseResponse<TSuccess, TError>(\n raw: IRawResponse\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * HTTP request function for a streamable response\n * @param callback that receives the stream response and pipes it somewhere\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns `T` upon success\n * @throws `ISDKErrorResponse` on failure\n */\n stream<T>(\n callback: (readable: Readable) => Promise<T>,\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<T>\n}\n\n/** A successful SDK call. */\nexport interface ISDKSuccessResponse<T> {\n /** Whether the SDK call was successful. */\n ok: true\n /** The object returned by the SDK call. */\n value: T\n}\n\n/** An errant SDK call. */\nexport interface ISDKErrorResponse<T> {\n /** Whether the SDK call was successful. */\n ok: false\n /** The error object returned by the SDK call. */\n error: T\n}\n\n/** An error representing an issue in the SDK, like a network or parsing error. */\nexport interface ISDKError {\n type: 'sdk_error'\n message: string\n}\n\nexport type SDKResponse<TSuccess, TError> =\n | ISDKSuccessResponse<TSuccess>\n | ISDKErrorResponse<TError | ISDKError>\n\n/** Generic collection */\nexport interface IRequestHeaders {\n [key: string]: string\n}\n\n/**\n * Generic http request property collection\n * TODO: Trim this down to what is required\n */\nexport interface IRequestProps {\n [key: string]: any\n /** full url for request, including any query params */\n url: string\n\n /** body of request. optional */\n body?: any\n /** headers for request. optional */\n headers: IRequestHeaders\n /** Http method for request. required. */\n method: HttpMethod\n /** Redirect processing for request. optional */\n redirect?: any\n /** Credentials to use */\n credentials?: 'include' | 'omit' | 'same-origin' | undefined\n\n /** http.Agent instance, allows custom proxy, certificate etc. */\n agent?: Agent\n /** support gzip/deflate content encoding. false to disable */\n compress?: boolean\n /** maximum redirect count. 0 to not follow redirect */\n follow?: number\n /** maximum response body size in bytes */\n size?: number\n /** req/res timeout in ms, it resets on redirect. 0 to disable (OS limit applies) */\n timeout?: number\n}\n\n/** General purpose authentication callback */\nexport type Authenticator = (props: any) => any\n\n/** Interface for API transport values */\nexport interface ITransportSettings {\n [key: string]: any\n /** base URL of API REST web service */\n base_url: string\n /** standard headers to provide in all transport requests */\n headers?: Headers\n /** whether to verify ssl certs or not. Defaults to true */\n verify_ssl: boolean\n /** request timeout in seconds. Default to 30 */\n timeout: number\n /** encoding override */\n encoding?: string | null\n /** agent tag to use for the SDK requests */\n agentTag: string\n}\n\n/**\n * Is the content type binary or \"string\"?\n * @param {string} contentType\n * @returns {ResponseMode.binary | ResponseMode.string}\n */\nexport function responseMode(contentType: string) {\n if (contentType.match(contentPatternString)) {\n return ResponseMode.string\n }\n if (contentType.match(contentPatternBinary)) {\n return ResponseMode.binary\n }\n return ResponseMode.unknown\n}\n\n/**\n * Does this content type have a UTF-8 charset?\n * @param contentType\n * @returns match if it exists\n */\nexport function isUtf8(contentType: string) {\n return contentType.match(/;.*\\bcharset\\b=\\butf-8\\b/i)\n}\n\n/** Used for name/value pair collections like for QueryParams */\nexport type Values = { [key: string]: any } | null | undefined\n\n/**\n * Encode parameter if not already encoded\n *\n * Note: this includes recognition of Date, DelimArray, and default objects for special handling\n *\n * @param value value of parameter\n * @returns URI encoded value\n */\nexport function encodeParam(value: any) {\n if (value instanceof Date) {\n value = value.toISOString()\n } else if (value instanceof DelimArray) {\n value = value.toString()\n }\n // check for object type to prevent \"[object Object]\" as the value.toString()\n let encoded =\n typeof value === 'object' ? JSON.stringify(value) : value.toString()\n\n // decodeURIComponent throws URIError if there is a % character\n // without it being part of an encoded\n try {\n const decoded = decodeURIComponent(value)\n if (value === decoded) {\n encoded = encodeURIComponent(value)\n }\n } catch (e) {\n if (e instanceof URIError) {\n encoded = encodeURIComponent(value)\n } else {\n throw e\n }\n }\n return encoded\n}\n\n/**\n * Converts `Values` to query string parameter format\n * @param values Name/value collection to encode\n * @returns {string} query string parameter formatted values. Both `false` and `null` are included. Only `undefined` are omitted.\n */\nexport function encodeParams(values?: Values) {\n if (!values) return ''\n\n const keys = Object.keys(values)\n return keys\n .filter((k) => values[k] !== undefined) // `null` and `false` will both be passed\n .map((k) => k + '=' + encodeParam(values[k]))\n .join('&')\n}\n\n/**\n * constructs the path argument including any optional query parameters\n * @param path the base path of the request\n * @param obj optional collection of query parameters to encode and append to the path\n */\nexport function addQueryParams(path: string, obj?: Values) {\n if (!obj) {\n return path\n }\n const qp = encodeParams(obj)\n return `${path}${qp ? '?' + qp : ''}`\n}\n\nconst utf8 = 'utf-8'\n\n/**\n * Convert this value to a string representation however we can do it\n * @param val\n */\nfunction bufferString(val: any) {\n let result = 'Unknown error'\n try {\n const decoder = new TextDecoder(utf8)\n result = decoder.decode(val)\n } catch (e: any) {\n // Supremely ugly hack. If we get here, we must be in Node (or IE 11, but who cares about that?)\n // Node requires an import from `util` for TextDecoder to be found BUT it \"just has\" Buffer unless WebPack messes us up\n try {\n if (val instanceof Buffer) {\n result = Buffer.from(val).toString(utf8)\n } else {\n result = JSON.stringify(val)\n }\n } catch (err: any) {\n // The fallback logic here will at least give us some information about the error being thrown\n result = JSON.stringify(val)\n }\n }\n return result\n}\n\n/**\n * SDK error handler\n * @param response any kind of error\n * @returns a new `Error` object with the failure message\n */\nexport function sdkError(response: any) {\n if (typeof response === 'string') {\n return new Error(response)\n }\n if ('error' in response) {\n const error = response.error\n if (typeof error === 'string') {\n return new Error(error)\n }\n // Try to get most specific error first\n if ('error' in error) {\n const result = bufferString(error.error)\n return new Error(result)\n }\n if ('message' in error) {\n return new Error(response.error.message.toString())\n }\n if ('statusMessage' in error) {\n return new Error(error.statusMessage)\n }\n const result = bufferString(error)\n return new Error(result)\n }\n if ('message' in response) {\n return new Error(response.message)\n }\n const error = JSON.stringify(response)\n return new Error(`Unknown error with SDK method ${error}`)\n}\n\n/** A helper method for simplifying error handling of SDK responses.\n *\n * Pass in a promise returned by any SDK method, and it will return a promise\n * that rejects if the `SDKResponse` is not `ok`. This will swallow the type\n * information in the error case, but allows you to route all the error cases\n * into a single promise rejection.\n *\n * The promise will have an `Error` rejection reason with a string `message`.\n * If the server error contains a `message` field, it will be provided, otherwise a\n * generic message will occur.\n *\n * ```ts\n * const sdk = LookerSDK({...})\n * let look\n * try {\n * look = await sdkOk(sdk.create_look({...}))\n * // do something with look\n * }\n * catch(e) {\n * // handle error case\n * }\n * ```\n */\nexport async function sdkOk<TSuccess, TError>(\n promise: Promise<SDKResponse<TSuccess, TError>>\n) {\n const result = await promise\n if (result.ok) {\n return result.value\n } else {\n throw sdkError(result)\n }\n}\n\n/**\n * Converts a byte array to a \"URL safe\" base64 string\n * @param u8 byte array to convert\n */\nexport function safeBase64(u8: Uint8Array) {\n const rawBase64 = btoa(String.fromCharCode(...u8))\n return rawBase64.replace(/\\+/g, '-').replace(/\\//g, '_')\n}\n\n/**\n * Type predicate. Asserts that a given object is error-like.\n * @param error a value of unknown type\n * @return boolean true if the error has a `message` key of type string.\n */\nexport function isErrorLike<T extends unknown>(\n error: T\n): error is T & { message: string } {\n if (typeof error !== 'object') return false\n if (!error) return false\n if (!Object.prototype.hasOwnProperty.call(error, 'message')) return false\n if (typeof (error as { message: unknown }).message !== 'string') return false\n return true\n}\n"],"file":"transport.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@looker/sdk-rtl",
3
- "version": "21.3.0",
3
+ "version": "21.3.3",
4
4
  "description": "Looker SDK Runtime Library",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/esm/index.js",
@@ -51,5 +51,5 @@
51
51
  "SDK",
52
52
  "RTL"
53
53
  ],
54
- "gitHead": "cde39cf1f69fd047f218670dc63daee2c1d32e92"
54
+ "gitHead": "79b245fdf08c08faf46e120f0961bc820199dccd"
55
55
  }