@looker/sdk-rtl 21.5.0 → 21.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/lib/CSRFSession.js +3 -17
- package/lib/CSRFSession.js.map +1 -1
- package/lib/apiMethods.js +6 -47
- package/lib/apiMethods.js.map +1 -1
- package/lib/apiSettings.js +4 -24
- package/lib/apiSettings.js.map +1 -1
- package/lib/authSession.js +3 -18
- package/lib/authSession.js.map +1 -1
- package/lib/authToken.js +3 -18
- package/lib/authToken.js.map +1 -1
- package/lib/baseTransport.js +3 -12
- package/lib/baseTransport.js.map +1 -1
- package/lib/browser.js +0 -34
- package/lib/browser.js.map +1 -1
- package/lib/browserServices.js +3 -11
- package/lib/browserServices.js.map +1 -1
- package/lib/browserSession.js +6 -21
- package/lib/browserSession.js.map +1 -1
- package/lib/browserTransport.js +5 -63
- package/lib/browserTransport.js.map +1 -1
- package/lib/constants.js +1 -11
- package/lib/constants.js.map +1 -1
- package/lib/cryptoHash.js +1 -1
- package/lib/cryptoHash.js.map +1 -1
- package/lib/delimArray.js +3 -8
- package/lib/delimArray.js.map +1 -1
- package/lib/errorDoc.d.ts +1 -1
- package/lib/errorDoc.js +9 -50
- package/lib/errorDoc.js.map +1 -1
- package/lib/esm/CSRFSession.js +14 -17
- package/lib/esm/CSRFSession.js.map +1 -1
- package/lib/esm/apiMethods.js +18 -46
- package/lib/esm/apiMethods.js.map +1 -1
- package/lib/esm/apiSettings.js +32 -28
- package/lib/esm/apiSettings.js.map +1 -1
- package/lib/esm/authSession.js +14 -19
- package/lib/esm/authSession.js.map +1 -1
- package/lib/esm/authToken.js +11 -17
- package/lib/esm/authToken.js.map +1 -1
- package/lib/esm/baseTransport.js +14 -13
- package/lib/esm/baseTransport.js.map +1 -1
- package/lib/esm/browser.js +192 -17
- package/lib/esm/browser.js.map +1 -1
- package/lib/esm/browserServices.js +15 -12
- package/lib/esm/browserServices.js.map +1 -1
- package/lib/esm/browserSession.js +21 -23
- package/lib/esm/browserSession.js.map +1 -1
- package/lib/esm/browserTransport.js +24 -68
- package/lib/esm/browserTransport.js.map +1 -1
- package/lib/esm/constants.js +22 -10
- package/lib/esm/constants.js.map +1 -1
- package/lib/esm/cryptoHash.js.map +1 -1
- package/lib/esm/delimArray.js +10 -6
- package/lib/esm/delimArray.js.map +1 -1
- package/lib/esm/errorDoc.js +23 -51
- package/lib/esm/errorDoc.js.map +1 -1
- package/lib/esm/extensionSession.js +11 -16
- package/lib/esm/extensionSession.js.map +1 -1
- package/lib/esm/extensionTransport.js +13 -19
- package/lib/esm/extensionTransport.js.map +1 -1
- package/lib/esm/index.js +236 -21
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/lookerSDKError.js +13 -12
- package/lib/esm/lookerSDKError.js.map +1 -1
- package/lib/esm/oauthSession.js +23 -66
- package/lib/esm/oauthSession.js.map +1 -1
- package/lib/esm/paging.js +24 -71
- package/lib/esm/paging.js.map +1 -1
- package/lib/esm/platformServices.js.map +1 -1
- package/lib/esm/proxySession.js +13 -13
- package/lib/esm/proxySession.js.map +1 -1
- package/lib/esm/testUtils/index.js +17 -0
- package/lib/esm/testUtils/index.js.map +1 -0
- package/lib/esm/testUtils/testUtils.js +46 -0
- package/lib/esm/testUtils/testUtils.js.map +1 -0
- package/lib/esm/transport.js +59 -64
- package/lib/esm/transport.js.map +1 -1
- package/lib/extensionSession.js +3 -17
- package/lib/extensionSession.js.map +1 -1
- package/lib/extensionTransport.js +5 -20
- package/lib/extensionTransport.js.map +1 -1
- package/lib/index.js +0 -42
- package/lib/index.js.map +1 -1
- package/lib/lookerSDKError.js +5 -13
- package/lib/lookerSDKError.js.map +1 -1
- package/lib/oauthSession.js +8 -63
- package/lib/oauthSession.js.map +1 -1
- package/lib/paging.js +5 -70
- package/lib/paging.js.map +1 -1
- package/lib/platformServices.js +1 -1
- package/lib/platformServices.js.map +1 -1
- package/lib/proxySession.js +0 -12
- package/lib/proxySession.js.map +1 -1
- package/lib/testUtils/index.js +0 -2
- package/lib/testUtils/index.js.map +1 -1
- package/lib/testUtils/testUtils.js +1 -16
- package/lib/testUtils/testUtils.js.map +1 -1
- package/lib/transport.js +16 -58
- package/lib/transport.js.map +1 -1
- package/package.json +3 -3
|
@@ -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","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"}
|
|
1
|
+
{"version":3,"file":"oauthSession.js","names":["_authSession","require","_transport","_authToken","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","_objectSpread","target","i","length","source","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","obj","_toPropertyKey","configurable","writable","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","res","call","TypeError","Number","OAuthSession","AuthSession","constructor","services","settings","transport","AuthToken","crypto","config","readConfig","sdkError","message","concat","authenticate","props","_this","token","getToken","access_token","headers","Authorization","code_verifier","sessionStorage","getItem","codeVerifierKey","removeItem","setItem","returnUrl","returnUrlKey","clearStorage","login","_sudoId","_this2","isAuthenticated","reentry","authUrl","createAuthCodeRequestUrl","agentPrefix","returnTo","window","location","pathname","search","href","Error","params","URLSearchParams","code","get","redeemAuthCode","activeToken","requestToken","body","_this3","url","URL","base_url","ok","request","toString","setToken","scope","state","_this4","verifier","secureRandom","code_challenge","sha256Hash","client_id","code_challenge_method","redirect_uri","response_type","looker_url","redeemAuthCodeBody","authCode","codeVerifier","grant_type","_this5","_this6","refresh_token","isActive","logout","_this7","init","exports"],"sources":["../../src/oauthSession.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IAccessToken, IError } from './authSession'\nimport { AuthSession } from './authSession'\nimport type { IRequestProps } from './transport'\nimport { agentPrefix, sdkError } from './transport'\nimport { AuthToken } from './authToken'\nimport type { ICryptoHash } from './cryptoHash'\nimport type { IPlatformServices } from './platformServices'\n\ninterface IAuthCodeGrantTypeParams {\n grant_type: 'authorization_code'\n code: string\n code_verifier: string\n client_id: string\n redirect_uri: string\n}\n\ninterface IRefreshTokenGrantTypeParams {\n grant_type: 'refresh_token'\n refresh_token: string\n client_id: string\n redirect_uri: string\n}\n\nexport class OAuthSession extends AuthSession {\n activeToken = new AuthToken()\n crypto: ICryptoHash\n reentry = false\n private static readonly codeVerifierKey = 'looker_oauth_code_verifier'\n public static readonly returnUrlKey = 'looker_oauth_return_url'\n\n constructor(services: IPlatformServices) {\n super(services.settings, services.transport)\n\n this.crypto = services.crypto\n\n const keys: string[] = [\n 'client_id',\n 'redirect_uri',\n 'base_url',\n 'looker_url',\n ]\n const config = { ...this.settings, ...this.settings.readConfig() }\n\n keys.forEach((key) => {\n const value = config[key]\n if (!value) {\n throw sdkError({\n message: `Missing required configuration setting: '${key}'`,\n })\n }\n })\n }\n\n /**\n * merge the dynamically defined configuration values with the initial settings\n */\n readConfig() {\n return { ...this.settings, ...this.settings.readConfig() }\n }\n\n /**\n * Apply current auth token credentials to an HTTP request\n * @param props request properties to update\n * @returns updated request properties with auth information added\n */\n async authenticate(props: IRequestProps): Promise<IRequestProps> {\n const token = await this.getToken()\n if (token.access_token) {\n props.headers.Authorization = `Bearer ${token.access_token}`\n }\n return props\n }\n\n /**\n * Gets session storage for OAuth code verification\n * @returns saved code verifier\n */\n get code_verifier() {\n return sessionStorage.getItem(OAuthSession.codeVerifierKey)\n }\n\n /**\n * Sets session storage for OAuth code verification\n */\n set code_verifier(value: string | null) {\n if (value === null) {\n // only clear code_verifier if it's `null`\n sessionStorage.removeItem(OAuthSession.codeVerifierKey)\n } else {\n sessionStorage.setItem(OAuthSession.codeVerifierKey, value)\n }\n }\n\n /**\n * URL to return to after login process completes\n * @returns the URL that started the OAuth login process\n */\n get returnUrl() {\n return sessionStorage.getItem(OAuthSession.returnUrlKey)\n }\n\n /**\n * Sets the return URL for successful OAuth login\n */\n set returnUrl(value: string | null) {\n if (!value) {\n sessionStorage.removeItem(OAuthSession.returnUrlKey)\n } else {\n sessionStorage.setItem(OAuthSession.returnUrlKey, value)\n }\n }\n\n /**\n * Clears all Looker SDK OAuth-related session storage\n */\n clearStorage() {\n sessionStorage.removeItem(OAuthSession.codeVerifierKey)\n sessionStorage.removeItem(OAuthSession.returnUrlKey)\n }\n\n async login(_sudoId?: string | number): Promise<any> {\n if (!this.isAuthenticated()) {\n if (this.reentry) {\n // do nothing\n } else if (!this.returnUrl) {\n // OAuth has not been initiated\n const authUrl = await this.createAuthCodeRequestUrl(\n 'cors_api',\n agentPrefix\n )\n const returnTo = window.location.pathname + window.location.search\n this.returnUrl = returnTo\n // Save the current URL so redirected successful OAuth login can restore it\n window.location.href = authUrl\n } else {\n this.reentry = true\n // If return URL is stored, we must be coming back from an OAuth request\n // so release the stored return url at the start of the redemption\n this.returnUrl = null\n if (!this.code_verifier) {\n return Promise.reject(\n new Error('OAuth failed: expected code_verifier to be stored')\n )\n }\n const params = new URLSearchParams(window.location.search)\n const code = params.get('code')\n if (!code) {\n return Promise.reject(\n new Error(\n `OAuth failed: no OAuth code parameter found in ${\n window.location.pathname + window.location.search\n }`\n )\n )\n }\n await this.redeemAuthCode(code)\n }\n return await this.getToken()\n }\n return this.activeToken\n }\n\n private async requestToken(\n body: IAuthCodeGrantTypeParams | IRefreshTokenGrantTypeParams\n ) {\n const config = this.readConfig()\n const url = new URL(config.base_url)\n // replace the entire path of the base_url because this\n // auth endpoint is independent of API version\n url.pathname = '/api/token'\n const token = await this.ok(\n this.transport.request<IAccessToken, IError>(\n 'POST',\n url.toString(),\n undefined,\n body\n )\n )\n\n return this.activeToken.setToken(token)\n }\n\n /*\n Generate an OAuth2 authCode request URL\n */\n async createAuthCodeRequestUrl(\n scope: string,\n state: string\n ): Promise<string> {\n // TODO: remove this comment when we remove hex backwards compatibility\n // in Looker API. For now it must not be 2^n so that Looker correctly\n // treats it as base64 encoded\n const verifier = this.crypto.secureRandom(33)\n this.code_verifier = verifier\n const code_challenge = await this.crypto.sha256Hash(verifier)\n const config = this.readConfig()\n const params: Record<string, string> = {\n client_id: config.client_id,\n code_challenge: code_challenge,\n code_challenge_method: 'S256',\n redirect_uri: config.redirect_uri,\n response_type: 'code',\n scope: scope,\n state: state,\n }\n const url = new URL(config.looker_url)\n url.pathname = '/auth'\n url.search = new URLSearchParams(params).toString()\n return url.toString()\n }\n\n redeemAuthCodeBody(authCode: string, codeVerifier?: string) {\n const verifier = codeVerifier || this.code_verifier || ''\n const config = this.readConfig()\n return {\n client_id: config.client_id,\n code: authCode,\n code_verifier: verifier,\n grant_type: 'authorization_code',\n redirect_uri: config.redirect_uri,\n } as IAuthCodeGrantTypeParams\n }\n\n /**\n * Convert an authCode received from server into an active auth token\n * The app is responsible for obtaining the authCode via interactive user login\n * via /auth front-end endpoint and URL redirect. When the authCode is received\n * by url redirect to an app route, pass the authCode into this function to\n * get an access_token and refresh_token.\n * @param {string} authCode\n * @param {string} codeVerifier\n * @returns {Promise<AuthToken>}\n */\n async redeemAuthCode(authCode: string, codeVerifier?: string) {\n return this.requestToken(this.redeemAuthCodeBody(authCode, codeVerifier))\n }\n\n async getToken() {\n if (!this.isAuthenticated()) {\n if (this.activeToken.refresh_token) {\n const config = this.readConfig()\n await this.requestToken({\n client_id: config.client_id,\n grant_type: 'refresh_token',\n redirect_uri: config.redirect_uri,\n refresh_token: this.activeToken.refresh_token,\n })\n }\n }\n return this.activeToken\n }\n\n isAuthenticated(): boolean {\n return this.activeToken.isActive()\n }\n\n async logout() {\n if (this.activeToken.access_token) {\n await this.ok(\n this.transport.request<IAccessToken, IError>(\n 'DELETE',\n `/api/logout`,\n undefined,\n undefined,\n (init: IRequestProps) => {\n init.headers.Authorization = `Bearer ${this.activeToken.access_token}`\n return init\n }\n )\n )\n\n // logout destroys the access_token AND the refresh_token\n this.activeToken = new AuthToken()\n this.clearStorage()\n return true\n }\n return false\n }\n}\n"],"mappings":"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"}
|
package/lib/esm/paging.js
CHANGED
|
@@ -1,20 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.linkHeaderParser = exports.TotalCountHeader = exports.Paging = exports.LinkHeader = void 0;
|
|
7
|
+
exports.pageAll = pageAll;
|
|
8
|
+
exports.pager = pager;
|
|
9
|
+
var _transport = require("./transport");
|
|
10
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
11
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
12
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
3
13
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
4
|
-
|
|
5
14
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
var LinkHeader = 'Link';
|
|
16
|
+
exports.LinkHeader = LinkHeader;
|
|
17
|
+
var TotalCountHeader = 'X-Total-Count';
|
|
18
|
+
exports.TotalCountHeader = TotalCountHeader;
|
|
19
|
+
var linkHeaderParser = linkHeader => {
|
|
11
20
|
var re = /<\s*(.*)\s*>;\s*rel="\s*(.*)\s*"\s*/gm;
|
|
12
21
|
var links = linkHeader.split(',');
|
|
13
22
|
var obj = {};
|
|
14
23
|
var arrRes;
|
|
15
24
|
links.forEach(link => {
|
|
16
25
|
link = link.trim();
|
|
17
|
-
|
|
18
26
|
while (arrRes = re.exec(link)) {
|
|
19
27
|
var key = arrRes[2].split(' ')[0].trim().toLocaleLowerCase();
|
|
20
28
|
obj[key] = {
|
|
@@ -26,28 +34,25 @@ export var linkHeaderParser = linkHeader => {
|
|
|
26
34
|
});
|
|
27
35
|
return obj;
|
|
28
36
|
};
|
|
29
|
-
|
|
37
|
+
exports.linkHeaderParser = linkHeaderParser;
|
|
38
|
+
function pager(_x, _x2, _x3) {
|
|
30
39
|
return _pager.apply(this, arguments);
|
|
31
40
|
}
|
|
32
|
-
|
|
33
41
|
function _pager() {
|
|
34
42
|
_pager = _asyncToGenerator(function* (sdk, pageFunc, options) {
|
|
35
43
|
return yield new Paging(sdk, pageFunc, options).init();
|
|
36
44
|
});
|
|
37
45
|
return _pager.apply(this, arguments);
|
|
38
46
|
}
|
|
39
|
-
|
|
40
|
-
export function pageAll(_x4, _x5) {
|
|
47
|
+
function pageAll(_x4, _x5) {
|
|
41
48
|
return _pageAll.apply(this, arguments);
|
|
42
49
|
}
|
|
43
|
-
|
|
44
50
|
function _pageAll() {
|
|
45
51
|
_pageAll = _asyncToGenerator(function* (sdk, pageFunc) {
|
|
46
52
|
var onPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : page => page;
|
|
47
53
|
var options = arguments.length > 3 ? arguments[3] : undefined;
|
|
48
54
|
var paged = yield pager(sdk, pageFunc, options);
|
|
49
55
|
onPage(paged.items);
|
|
50
|
-
|
|
51
56
|
try {
|
|
52
57
|
while (paged.more()) {
|
|
53
58
|
onPage(yield sdk.ok(paged.nextPage()));
|
|
@@ -55,112 +60,83 @@ function _pageAll() {
|
|
|
55
60
|
} catch (err) {
|
|
56
61
|
return Promise.reject(err);
|
|
57
62
|
}
|
|
58
|
-
|
|
59
63
|
return paged;
|
|
60
64
|
});
|
|
61
65
|
return _pageAll.apply(this, arguments);
|
|
62
66
|
}
|
|
63
|
-
|
|
64
|
-
export class Paging {
|
|
67
|
+
class Paging {
|
|
65
68
|
constructor(sdk, func, options) {
|
|
66
69
|
this.sdk = sdk;
|
|
67
70
|
this.func = func;
|
|
68
71
|
this.options = options;
|
|
69
|
-
|
|
70
72
|
_defineProperty(this, "items", []);
|
|
71
|
-
|
|
72
73
|
_defineProperty(this, "links", {});
|
|
73
|
-
|
|
74
74
|
_defineProperty(this, "total", -1);
|
|
75
|
-
|
|
76
75
|
_defineProperty(this, "offset", -1);
|
|
77
|
-
|
|
78
76
|
_defineProperty(this, "limit", -1);
|
|
79
|
-
|
|
80
77
|
_defineProperty(this, "transport", void 0);
|
|
81
|
-
|
|
82
78
|
this.transport = sdk.authSession.transport;
|
|
83
79
|
}
|
|
84
|
-
|
|
85
80
|
rawCatch(func) {
|
|
86
81
|
var _this = this;
|
|
87
|
-
|
|
88
82
|
return _asyncToGenerator(function* () {
|
|
89
83
|
var raw = {};
|
|
90
84
|
var saved = _this.transport.observer;
|
|
91
|
-
|
|
92
85
|
try {
|
|
93
86
|
_this.transport.observer = response => {
|
|
94
87
|
if (saved) {
|
|
95
88
|
response = saved(response);
|
|
96
89
|
}
|
|
97
|
-
|
|
98
90
|
raw = response;
|
|
99
91
|
return response;
|
|
100
92
|
};
|
|
101
|
-
|
|
102
|
-
_this.items = yield sdkOk(func());
|
|
93
|
+
_this.items = yield (0, _transport.sdkOk)(func());
|
|
103
94
|
} finally {
|
|
104
95
|
_this.transport.observer = saved;
|
|
105
96
|
}
|
|
106
|
-
|
|
107
97
|
if (Object.keys(raw).length === 0 || Object.keys(raw.headers).length === 0) return Promise.reject(new Error('No paging headers were found'));
|
|
108
|
-
|
|
109
98
|
_this.parse(raw);
|
|
110
|
-
|
|
111
99
|
return _this;
|
|
112
100
|
})();
|
|
113
101
|
}
|
|
114
|
-
|
|
115
102
|
get page() {
|
|
116
103
|
if (this.limit < 1 || this.offset < 0) return -1;
|
|
117
104
|
var x = this.offset / this.limit + 1;
|
|
118
105
|
return Math.ceil(x);
|
|
119
106
|
}
|
|
120
|
-
|
|
121
107
|
get pages() {
|
|
122
108
|
if (this.total < 1 || this.limit < 1) return -1;
|
|
123
109
|
var x = this.total / this.limit;
|
|
124
110
|
return Math.ceil(x);
|
|
125
111
|
}
|
|
126
|
-
|
|
127
112
|
init() {
|
|
128
113
|
var _this2 = this;
|
|
129
|
-
|
|
130
114
|
return _asyncToGenerator(function* () {
|
|
131
115
|
return yield _this2.rawCatch(_this2.func);
|
|
132
116
|
})();
|
|
133
117
|
}
|
|
134
|
-
|
|
135
118
|
hasRel(link) {
|
|
136
119
|
return !!this.links[link];
|
|
137
120
|
}
|
|
138
|
-
|
|
139
121
|
more() {
|
|
140
122
|
return this.hasRel('next');
|
|
141
123
|
}
|
|
142
|
-
|
|
143
124
|
static paramDefault(value, defaultValue) {
|
|
144
125
|
var convert = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : v => parseInt(v, 10);
|
|
145
126
|
if (value === null) return defaultValue;
|
|
146
127
|
return convert(value);
|
|
147
128
|
}
|
|
148
|
-
|
|
149
129
|
reset() {
|
|
150
130
|
this.links = {};
|
|
151
131
|
this.total = this.offset = this.limit = -1;
|
|
152
132
|
this.items = [];
|
|
153
133
|
}
|
|
154
|
-
|
|
155
134
|
getRel(name, limit, offset) {
|
|
156
135
|
var _this3 = this;
|
|
157
|
-
|
|
158
136
|
return _asyncToGenerator(function* () {
|
|
159
137
|
var rel = _this3.links[name];
|
|
160
138
|
var result;
|
|
161
|
-
|
|
162
139
|
_this3.reset();
|
|
163
|
-
|
|
164
140
|
if (!rel) {
|
|
165
141
|
result = {
|
|
166
142
|
ok: true,
|
|
@@ -168,18 +144,14 @@ export class Paging {
|
|
|
168
144
|
};
|
|
169
145
|
return result;
|
|
170
146
|
}
|
|
171
|
-
|
|
172
147
|
var authenticator = init => {
|
|
173
148
|
return _this3.sdk.authSession.authenticate(init);
|
|
174
149
|
};
|
|
175
|
-
|
|
176
150
|
var link = rel.url;
|
|
177
|
-
|
|
178
151
|
if (limit !== undefined) {
|
|
179
152
|
if (offset === undefined) {
|
|
180
153
|
offset = 0;
|
|
181
154
|
}
|
|
182
|
-
|
|
183
155
|
if (limit < 1 || offset < 0) {
|
|
184
156
|
result = {
|
|
185
157
|
ok: false,
|
|
@@ -187,20 +159,16 @@ export class Paging {
|
|
|
187
159
|
};
|
|
188
160
|
return result;
|
|
189
161
|
}
|
|
190
|
-
|
|
191
162
|
var url = new URL(link);
|
|
192
163
|
var params = url.searchParams;
|
|
193
164
|
params.set('limit', limit.toString());
|
|
194
165
|
params.set('offset', offset.toString());
|
|
195
166
|
link = url.toString();
|
|
196
167
|
}
|
|
197
|
-
|
|
198
168
|
var raw = yield _this3.transport.rawRequest('GET', link, undefined, undefined, authenticator, _this3.options);
|
|
199
|
-
|
|
200
169
|
try {
|
|
201
170
|
_this3.parse(raw);
|
|
202
|
-
|
|
203
|
-
_this3.items = yield sdkOk(_this3.transport.parseResponse(raw));
|
|
171
|
+
_this3.items = yield (0, _transport.sdkOk)(_this3.transport.parseResponse(raw));
|
|
204
172
|
result = {
|
|
205
173
|
ok: true,
|
|
206
174
|
value: _this3.items
|
|
@@ -211,69 +179,54 @@ export class Paging {
|
|
|
211
179
|
error: e
|
|
212
180
|
};
|
|
213
181
|
}
|
|
214
|
-
|
|
215
182
|
return result;
|
|
216
183
|
})();
|
|
217
184
|
}
|
|
218
|
-
|
|
219
185
|
static findHeader(raw, name) {
|
|
220
186
|
return raw.headers[name] || raw.headers[name.toLowerCase()] || raw.headers[name.toUpperCase()];
|
|
221
187
|
}
|
|
222
|
-
|
|
223
188
|
parse(raw) {
|
|
224
189
|
var params = new URL(raw.url, 'http://default').searchParams;
|
|
225
190
|
this.limit = Paging.paramDefault(params.get('limit'), -1);
|
|
226
191
|
this.offset = Paging.paramDefault(params.get('offset'), this.limit > 0 ? 0 : -1);
|
|
227
192
|
var linkHeader = Paging.findHeader(raw, LinkHeader);
|
|
228
|
-
|
|
229
193
|
if (linkHeader) {
|
|
230
194
|
this.links = linkHeaderParser(linkHeader);
|
|
231
195
|
} else {
|
|
232
196
|
this.links = {};
|
|
233
197
|
}
|
|
234
|
-
|
|
235
198
|
var totalHeader = Paging.findHeader(raw, TotalCountHeader);
|
|
236
|
-
|
|
237
199
|
if (totalHeader) {
|
|
238
200
|
this.total = parseInt(totalHeader.trim(), 10);
|
|
239
201
|
} else {
|
|
240
202
|
this.total = -1;
|
|
241
203
|
}
|
|
242
|
-
|
|
243
204
|
return this;
|
|
244
205
|
}
|
|
245
|
-
|
|
246
206
|
firstPage() {
|
|
247
207
|
var _this4 = this;
|
|
248
|
-
|
|
249
208
|
return _asyncToGenerator(function* () {
|
|
250
209
|
return yield _this4.getRel('first');
|
|
251
210
|
})();
|
|
252
211
|
}
|
|
253
|
-
|
|
254
212
|
lastPage() {
|
|
255
213
|
var _this5 = this;
|
|
256
|
-
|
|
257
214
|
return _asyncToGenerator(function* () {
|
|
258
215
|
return yield _this5.getRel('last');
|
|
259
216
|
})();
|
|
260
217
|
}
|
|
261
|
-
|
|
262
218
|
nextPage() {
|
|
263
219
|
var _this6 = this;
|
|
264
|
-
|
|
265
220
|
return _asyncToGenerator(function* () {
|
|
266
221
|
return yield _this6.getRel('next');
|
|
267
222
|
})();
|
|
268
223
|
}
|
|
269
|
-
|
|
270
224
|
prevPage() {
|
|
271
225
|
var _this7 = this;
|
|
272
|
-
|
|
273
226
|
return _asyncToGenerator(function* () {
|
|
274
227
|
return yield _this7.getRel('prev');
|
|
275
228
|
})();
|
|
276
229
|
}
|
|
277
|
-
|
|
278
230
|
}
|
|
231
|
+
exports.Paging = Paging;
|
|
279
232
|
//# sourceMappingURL=paging.js.map
|
package/lib/esm/paging.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/paging.ts"],"names":["sdkOk","LinkHeader","TotalCountHeader","linkHeaderParser","linkHeader","re","links","split","obj","arrRes","forEach","link","trim","exec","key","toLocaleLowerCase","url","rel","name","pager","sdk","pageFunc","options","Paging","init","pageAll","onPage","page","paged","items","more","ok","nextPage","err","Promise","reject","constructor","func","transport","authSession","rawCatch","raw","saved","observer","response","Object","keys","length","headers","Error","parse","limit","offset","x","Math","ceil","pages","total","hasRel","paramDefault","value","defaultValue","convert","v","parseInt","reset","getRel","result","authenticator","authenticate","undefined","error","URL","params","searchParams","set","toString","rawRequest","parseResponse","e","findHeader","toLowerCase","toUpperCase","get","totalHeader","firstPage","lastPage","prevPage"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IRawResponse, ITransportSettings, SDKResponse } from './transport'\nimport { sdkOk } from './transport'\nimport type { IAPIMethods } from './apiMethods'\nimport type { BaseTransport } from './baseTransport'\n\nexport const LinkHeader = 'Link'\nexport const TotalCountHeader = 'X-Total-Count'\n\n/**\n * Types of paging link relative URLs\n * based on https://docs.github.com/en/rest/overview/resources-in-the-rest-api#link-header\n */\nexport type PageLinkRel = 'first' | 'last' | 'next' | 'prev'\n\n/** Constraints for TSuccess type */\ninterface ILength {\n length: number\n}\n\n/** Result paging function call */\nexport type PagingFunc<TSuccess, TError> = () => Promise<\n SDKResponse<TSuccess, TError>\n>\n\n/** Page link structure */\nexport interface IPageLink {\n /** Name of link */\n name?: string\n /** Type of link */\n rel: PageLinkRel\n /** Media type for link */\n mediaType?: string\n /** URL for retrieving the link results */\n url: string\n}\n\n/**\n * Collection of page links\n *\n * TODO can this be Record<PageLinkRel, IPageLink> instead and still init to {}?\n */\nexport type PageLinks = Record<string, IPageLink>\n\nexport interface IPager<TSuccess, TError> {\n /** Total number of available items being paginated */\n total: number\n /** Offset extracted from pager request */\n offset: number\n /** Limit extracted from pager request */\n limit: number\n /** Paging links extracted from Link header */\n links: PageLinks\n /** Latest items returned from response */\n items: TSuccess\n /** Captured from the original paging request */\n options?: Partial<ITransportSettings>\n /** Total number of pages. -1 if not known. */\n pages: number\n /** Current page. -1 if not known. */\n page: number\n\n /**\n * Is the specified link rel defined in the Link header?\n * @param link to check\n */\n hasRel(link: PageLinkRel): boolean\n\n /**\n * GET the requested relative link\n *\n * if the requested link is not defined, all calculated values are reset to their defaults, including\n * `total`, `items`, `offset`, and `limit`\n *\n * @param name of Link Relationship\n * @param limit optional limit override to replace limit saved in `rel`\n * @param offset optional offset override to replace offset saved in `rel`\n */\n getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /** Get the first page of items. This is the same as offset=0 */\n firstPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the last page of items\n *\n * @remarks This link is only provided if `total` is known.\n */\n lastPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the next page of items\n *\n * @remarks This link is provided if `total` is known, or if the number of items returned == `limit`. In the latter case, this function may return an empty result set.\n */\n nextPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the previous page of items\n *\n * @remarks This link is provided if the last page was not the first page.\n */\n prevPage(): Promise<SDKResponse<TSuccess, TError>>\n\n /** `true` if the `next` link is defined */\n more(): boolean\n}\n\n/**\n * Parse a link header to extract rels\n * @param linkHeader to parse\n *\n * Several different approaches are discussed at https://stackoverflow.com/questions/8735792/how-to-parse-link-header-from-github-api\n *\n * Unfortunately, none of them are a good implementation\n *\n */\nexport const linkHeaderParser = (linkHeader: string): PageLinks => {\n const re = /<\\s*(.*)\\s*>;\\s*rel=\"\\s*(.*)\\s*\"\\s*/gm\n const links = linkHeader.split(',')\n const obj: PageLinks = {}\n let arrRes\n\n links.forEach((link) => {\n link = link.trim()\n while ((arrRes = re.exec(link))) {\n const key = arrRes[2].split(' ')[0].trim().toLocaleLowerCase()\n obj[key] = {\n url: arrRes[1].trim(),\n rel: key as PageLinkRel,\n name: arrRes[2].trim(),\n }\n }\n })\n return obj\n}\n\n/** Event to observe the paging call */\nexport type PageObserver<TSuccess> = (\n /** Current retrieved page of results */\n page: TSuccess\n) => TSuccess\n\n/**\n * Create an API response pager for an endpoint that returns a Link header\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pager<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n return await new Paging<TSuccess, TError>(sdk, pageFunc, options).init()\n}\n\n/**\n * Create an API response pager and iterate through all pages, calling a page event per page\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param onPage observer of the latest page of results. Defaults to noop.\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pageAll<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n onPage: PageObserver<TSuccess> = (page: TSuccess) => page,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n const paged = await pager(sdk, pageFunc, options)\n // Process the first page\n onPage(paged.items)\n try {\n while (paged.more()) {\n // Pass the page items to the event\n onPage(await sdk.ok(paged.nextPage()))\n }\n } catch (err) {\n return Promise.reject(err)\n }\n return paged\n}\n\n/**\n * Link header pages class\n */\nexport class Paging<TSuccess extends ILength, TError>\n implements IPager<TSuccess, TError>\n{\n items: TSuccess = [] as unknown as TSuccess\n links: PageLinks = {}\n total = -1\n offset = -1\n limit = -1\n\n private transport: BaseTransport\n\n /**\n * Create an API paginator\n * @param sdk functional AuthSession or full SDK implementation\n * @param func sdk function to call\n * @param options transport overrides to use for subsequent requests\n */\n constructor(\n public sdk: IAPIMethods,\n public func: PagingFunc<TSuccess, TError>,\n public options?: Partial<ITransportSettings>\n ) {\n this.transport = sdk.authSession.transport as BaseTransport\n }\n\n private async rawCatch(func: () => any) {\n let raw: IRawResponse = {} as IRawResponse\n const saved = this.transport.observer\n try {\n // Capture the raw request for header parsing\n this.transport.observer = (response: IRawResponse) => {\n if (saved) {\n // Chain the observer\n response = saved(response)\n }\n raw = response\n return response\n }\n this.items = await sdkOk(func())\n } finally {\n // Restore the previous observer (if any)\n this.transport.observer = saved\n }\n if (Object.keys(raw).length === 0 || Object.keys(raw.headers).length === 0)\n return Promise.reject(new Error('No paging headers were found'))\n this.parse(raw)\n return this\n }\n\n get page(): number {\n if (this.limit < 1 || this.offset < 0) return -1\n const x = this.offset / this.limit + 1\n return Math.ceil(x)\n }\n\n get pages(): number {\n if (this.total < 1 || this.limit < 1) return -1\n const x = this.total / this.limit\n return Math.ceil(x)\n }\n\n async init() {\n return await this.rawCatch(this.func)\n }\n\n hasRel(link: PageLinkRel): boolean {\n return !!this.links[link]\n }\n\n more() {\n return this.hasRel('next')\n }\n\n /**\n * Default string value\n * @param value to retrieve or default\n * @param defaultValue to apply if string is null\n * @param convert function to convert assigned string value\n * @private\n */\n private static paramDefault(\n value: string | null,\n defaultValue: any,\n convert = (v: string) => parseInt(v, 10)\n ) {\n if (value === null) return defaultValue\n return convert(value)\n }\n\n reset() {\n this.links = {}\n this.total = this.offset = this.limit = -1\n this.items = [] as unknown as TSuccess\n }\n\n async getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>> {\n const rel = this.links[name]\n let result: SDKResponse<TSuccess, TError>\n this.reset()\n if (!rel) {\n result = { ok: true, value: this.items }\n return result\n }\n const authenticator = (init: any) => {\n return this.sdk.authSession.authenticate(init)\n }\n\n let link = rel.url\n if (limit !== undefined) {\n if (offset === undefined) {\n offset = 0\n }\n if (limit < 1 || offset < 0) {\n result = {\n ok: false,\n error: new Error(\n 'limit must be > 0 and offset must be >= 0'\n ) as unknown as TError,\n }\n return result\n }\n const url = new URL(link)\n const params = url.searchParams\n params.set('limit', limit.toString())\n params.set('offset', offset.toString())\n link = url.toString()\n }\n const raw = await this.transport.rawRequest(\n 'GET',\n link,\n undefined,\n undefined,\n authenticator,\n this.options\n )\n try {\n this.parse(raw)\n this.items = await sdkOk(this.transport.parseResponse(raw))\n result = { ok: true, value: this.items }\n } catch (e: any) {\n result = { ok: false, error: e }\n }\n return result\n }\n\n static findHeader(raw: IRawResponse, name: string) {\n return (\n raw.headers[name] ||\n raw.headers[name.toLowerCase()] ||\n raw.headers[name.toUpperCase()]\n )\n }\n\n parse(raw: IRawResponse): IPager<TSuccess, TError> {\n const params = new URL(raw.url, 'http://default').searchParams\n this.limit = Paging.paramDefault(params.get('limit'), -1)\n this.offset = Paging.paramDefault(\n params.get('offset'),\n this.limit > 0 ? 0 : -1\n )\n const linkHeader = Paging.findHeader(raw, LinkHeader)\n if (linkHeader) {\n this.links = linkHeaderParser(linkHeader)\n } else {\n this.links = {}\n }\n const totalHeader = Paging.findHeader(raw, TotalCountHeader)\n if (totalHeader) {\n this.total = parseInt(totalHeader.trim(), 10)\n } else {\n this.total = -1\n }\n return this as unknown as IPager<TSuccess, TError>\n }\n\n async firstPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('first')\n }\n\n async lastPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('last')\n }\n\n async nextPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('next')\n }\n\n async prevPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('prev')\n }\n}\n"],"file":"paging.js"}
|
|
1
|
+
{"version":3,"file":"paging.js","names":["_transport","require","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","asyncGeneratorStep","gen","resolve","reject","_next","_throw","info","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","LinkHeader","exports","TotalCountHeader","linkHeaderParser","linkHeader","re","links","split","arrRes","forEach","link","trim","exec","toLocaleLowerCase","url","rel","name","pager","_x","_x2","_x3","_pager","sdk","pageFunc","options","Paging","init","pageAll","_x4","_x5","_pageAll","onPage","length","page","paged","items","more","ok","nextPage","constructor","func","transport","authSession","rawCatch","_this","raw","saved","observer","response","sdkOk","keys","headers","Error","parse","limit","offset","x","Math","ceil","pages","total","_this2","hasRel","paramDefault","defaultValue","convert","v","parseInt","reset","getRel","_this3","result","authenticator","authenticate","URL","params","searchParams","set","toString","rawRequest","parseResponse","e","findHeader","toLowerCase","toUpperCase","get","totalHeader","firstPage","_this4","lastPage","_this5","_this6","prevPage","_this7"],"sources":["../../src/paging.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IRawResponse, ITransportSettings, SDKResponse } from './transport'\nimport { sdkOk } from './transport'\nimport type { IAPIMethods } from './apiMethods'\nimport type { BaseTransport } from './baseTransport'\n\nexport const LinkHeader = 'Link'\nexport const TotalCountHeader = 'X-Total-Count'\n\n/**\n * Types of paging link relative URLs\n * based on https://docs.github.com/en/rest/overview/resources-in-the-rest-api#link-header\n */\nexport type PageLinkRel = 'first' | 'last' | 'next' | 'prev'\n\n/** Constraints for TSuccess type */\ninterface ILength {\n length: number\n}\n\n/** Result paging function call */\nexport type PagingFunc<TSuccess, TError> = () => Promise<\n SDKResponse<TSuccess, TError>\n>\n\n/** Page link structure */\nexport interface IPageLink {\n /** Name of link */\n name?: string\n /** Type of link */\n rel: PageLinkRel\n /** Media type for link */\n mediaType?: string\n /** URL for retrieving the link results */\n url: string\n}\n\n/**\n * Collection of page links\n *\n * TODO can this be Record<PageLinkRel, IPageLink> instead and still init to {}?\n */\nexport type PageLinks = Record<string, IPageLink>\n\nexport interface IPager<TSuccess, TError> {\n /** Total number of available items being paginated */\n total: number\n /** Offset extracted from pager request */\n offset: number\n /** Limit extracted from pager request */\n limit: number\n /** Paging links extracted from Link header */\n links: PageLinks\n /** Latest items returned from response */\n items: TSuccess\n /** Captured from the original paging request */\n options?: Partial<ITransportSettings>\n /** Total number of pages. -1 if not known. */\n pages: number\n /** Current page. -1 if not known. */\n page: number\n\n /**\n * Is the specified link rel defined in the Link header?\n * @param link to check\n */\n hasRel(link: PageLinkRel): boolean\n\n /**\n * GET the requested relative link\n *\n * if the requested link is not defined, all calculated values are reset to their defaults, including\n * `total`, `items`, `offset`, and `limit`\n *\n * @param name of Link Relationship\n * @param limit optional limit override to replace limit saved in `rel`\n * @param offset optional offset override to replace offset saved in `rel`\n */\n getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /** Get the first page of items. This is the same as offset=0 */\n firstPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the last page of items\n *\n * @remarks This link is only provided if `total` is known.\n */\n lastPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the next page of items\n *\n * @remarks This link is provided if `total` is known, or if the number of items returned == `limit`. In the latter case, this function may return an empty result set.\n */\n nextPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the previous page of items\n *\n * @remarks This link is provided if the last page was not the first page.\n */\n prevPage(): Promise<SDKResponse<TSuccess, TError>>\n\n /** `true` if the `next` link is defined */\n more(): boolean\n}\n\n/**\n * Parse a link header to extract rels\n * @param linkHeader to parse\n *\n * Several different approaches are discussed at https://stackoverflow.com/questions/8735792/how-to-parse-link-header-from-github-api\n *\n * Unfortunately, none of them are a good implementation\n *\n */\nexport const linkHeaderParser = (linkHeader: string): PageLinks => {\n const re = /<\\s*(.*)\\s*>;\\s*rel=\"\\s*(.*)\\s*\"\\s*/gm\n const links = linkHeader.split(',')\n const obj: PageLinks = {}\n let arrRes\n\n links.forEach((link) => {\n link = link.trim()\n while ((arrRes = re.exec(link))) {\n const key = arrRes[2].split(' ')[0].trim().toLocaleLowerCase()\n obj[key] = {\n url: arrRes[1].trim(),\n rel: key as PageLinkRel,\n name: arrRes[2].trim(),\n }\n }\n })\n return obj\n}\n\n/** Event to observe the paging call */\nexport type PageObserver<TSuccess> = (\n /** Current retrieved page of results */\n page: TSuccess\n) => TSuccess\n\n/**\n * Create an API response pager for an endpoint that returns a Link header\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pager<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n return await new Paging<TSuccess, TError>(sdk, pageFunc, options).init()\n}\n\n/**\n * Create an API response pager and iterate through all pages, calling a page event per page\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param onPage observer of the latest page of results. Defaults to noop.\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pageAll<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n onPage: PageObserver<TSuccess> = (page: TSuccess) => page,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n const paged = await pager(sdk, pageFunc, options)\n // Process the first page\n onPage(paged.items)\n try {\n while (paged.more()) {\n // Pass the page items to the event\n onPage(await sdk.ok(paged.nextPage()))\n }\n } catch (err) {\n return Promise.reject(err)\n }\n return paged\n}\n\n/**\n * Link header pages class\n */\nexport class Paging<TSuccess extends ILength, TError>\n implements IPager<TSuccess, TError>\n{\n items: TSuccess = [] as unknown as TSuccess\n links: PageLinks = {}\n total = -1\n offset = -1\n limit = -1\n\n private transport: BaseTransport\n\n /**\n * Create an API paginator\n * @param sdk functional AuthSession or full SDK implementation\n * @param func sdk function to call\n * @param options transport overrides to use for subsequent requests\n */\n constructor(\n public sdk: IAPIMethods,\n public func: PagingFunc<TSuccess, TError>,\n public options?: Partial<ITransportSettings>\n ) {\n this.transport = sdk.authSession.transport as BaseTransport\n }\n\n private async rawCatch(func: () => any) {\n let raw: IRawResponse = {} as IRawResponse\n const saved = this.transport.observer\n try {\n // Capture the raw request for header parsing\n this.transport.observer = (response: IRawResponse) => {\n if (saved) {\n // Chain the observer\n response = saved(response)\n }\n raw = response\n return response\n }\n this.items = await sdkOk(func())\n } finally {\n // Restore the previous observer (if any)\n this.transport.observer = saved\n }\n if (Object.keys(raw).length === 0 || Object.keys(raw.headers).length === 0)\n return Promise.reject(new Error('No paging headers were found'))\n this.parse(raw)\n return this\n }\n\n get page(): number {\n if (this.limit < 1 || this.offset < 0) return -1\n const x = this.offset / this.limit + 1\n return Math.ceil(x)\n }\n\n get pages(): number {\n if (this.total < 1 || this.limit < 1) return -1\n const x = this.total / this.limit\n return Math.ceil(x)\n }\n\n async init() {\n return await this.rawCatch(this.func)\n }\n\n hasRel(link: PageLinkRel): boolean {\n return !!this.links[link]\n }\n\n more() {\n return this.hasRel('next')\n }\n\n /**\n * Default string value\n * @param value to retrieve or default\n * @param defaultValue to apply if string is null\n * @param convert function to convert assigned string value\n * @private\n */\n private static paramDefault(\n value: string | null,\n defaultValue: any,\n convert = (v: string) => parseInt(v, 10)\n ) {\n if (value === null) return defaultValue\n return convert(value)\n }\n\n reset() {\n this.links = {}\n this.total = this.offset = this.limit = -1\n this.items = [] as unknown as TSuccess\n }\n\n async getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>> {\n const rel = this.links[name]\n let result: SDKResponse<TSuccess, TError>\n this.reset()\n if (!rel) {\n result = { ok: true, value: this.items }\n return result\n }\n const authenticator = (init: any) => {\n return this.sdk.authSession.authenticate(init)\n }\n\n let link = rel.url\n if (limit !== undefined) {\n if (offset === undefined) {\n offset = 0\n }\n if (limit < 1 || offset < 0) {\n result = {\n ok: false,\n error: new Error(\n 'limit must be > 0 and offset must be >= 0'\n ) as unknown as TError,\n }\n return result\n }\n const url = new URL(link)\n const params = url.searchParams\n params.set('limit', limit.toString())\n params.set('offset', offset.toString())\n link = url.toString()\n }\n const raw = await this.transport.rawRequest(\n 'GET',\n link,\n undefined,\n undefined,\n authenticator,\n this.options\n )\n try {\n this.parse(raw)\n this.items = await sdkOk(this.transport.parseResponse(raw))\n result = { ok: true, value: this.items }\n } catch (e: any) {\n result = { ok: false, error: e }\n }\n return result\n }\n\n static findHeader(raw: IRawResponse, name: string) {\n return (\n raw.headers[name] ||\n raw.headers[name.toLowerCase()] ||\n raw.headers[name.toUpperCase()]\n )\n }\n\n parse(raw: IRawResponse): IPager<TSuccess, TError> {\n const params = new URL(raw.url, 'http://default').searchParams\n this.limit = Paging.paramDefault(params.get('limit'), -1)\n this.offset = Paging.paramDefault(\n params.get('offset'),\n this.limit > 0 ? 0 : -1\n )\n const linkHeader = Paging.findHeader(raw, LinkHeader)\n if (linkHeader) {\n this.links = linkHeaderParser(linkHeader)\n } else {\n this.links = {}\n }\n const totalHeader = Paging.findHeader(raw, TotalCountHeader)\n if (totalHeader) {\n this.total = parseInt(totalHeader.trim(), 10)\n } else {\n this.total = -1\n }\n return this as unknown as IPager<TSuccess, TError>\n }\n\n async firstPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('first')\n }\n\n async lastPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('last')\n }\n\n async nextPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('next')\n }\n\n async prevPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('prev')\n }\n}\n"],"mappings":";;;;;;;;AA2BA,IAAAA,UAAA,GAAAC,OAAA;AAAmC,SAAAC,gBAAAC,GAAA,EAAAC,GAAA,EAAAC,KAAA,IAAAD,GAAA,GAAAE,cAAA,CAAAF,GAAA,OAAAA,GAAA,IAAAD,GAAA,IAAAI,MAAA,CAAAC,cAAA,CAAAL,GAAA,EAAAC,GAAA,IAAAC,KAAA,EAAAA,KAAA,EAAAI,UAAA,QAAAC,YAAA,QAAAC,QAAA,oBAAAR,GAAA,CAAAC,GAAA,IAAAC,KAAA,WAAAF,GAAA;AAAA,SAAAG,eAAAM,GAAA,QAAAR,GAAA,GAAAS,YAAA,CAAAD,GAAA,2BAAAR,GAAA,gBAAAA,GAAA,GAAAU,MAAA,CAAAV,GAAA;AAAA,SAAAS,aAAAE,KAAA,EAAAC,IAAA,eAAAD,KAAA,iBAAAA,KAAA,kBAAAA,KAAA,MAAAE,IAAA,GAAAF,KAAA,CAAAG,MAAA,CAAAC,WAAA,OAAAF,IAAA,KAAAG,SAAA,QAAAC,GAAA,GAAAJ,IAAA,CAAAK,IAAA,CAAAP,KAAA,EAAAC,IAAA,2BAAAK,GAAA,sBAAAA,GAAA,YAAAE,SAAA,4DAAAP,IAAA,gBAAAF,MAAA,GAAAU,MAAA,EAAAT,KAAA;AAAA,SAAAU,mBAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,EAAA1B,GAAA,EAAAQ,GAAA,cAAAmB,IAAA,GAAAL,GAAA,CAAAtB,GAAA,EAAAQ,GAAA,OAAAP,KAAA,GAAA0B,IAAA,CAAA1B,KAAA,WAAA2B,KAAA,IAAAJ,MAAA,CAAAI,KAAA,iBAAAD,IAAA,CAAAE,IAAA,IAAAN,OAAA,CAAAtB,KAAA,YAAA6B,OAAA,CAAAP,OAAA,CAAAtB,KAAA,EAAA8B,IAAA,CAAAN,KAAA,EAAAC,MAAA;AAAA,SAAAM,kBAAAC,EAAA,6BAAAC,IAAA,SAAAC,IAAA,GAAAC,SAAA,aAAAN,OAAA,WAAAP,OAAA,EAAAC,MAAA,QAAAF,GAAA,GAAAW,EAAA,CAAAI,KAAA,CAAAH,IAAA,EAAAC,IAAA,YAAAV,MAAAxB,KAAA,IAAAoB,kBAAA,CAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,UAAAzB,KAAA,cAAAyB,OAAAY,GAAA,IAAAjB,kBAAA,CAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,WAAAY,GAAA,KAAAb,KAAA,CAAAT,SAAA;AAI5B,IAAMuB,UAAU,GAAG,MAAM;AAAAC,OAAA,CAAAD,UAAA,GAAAA,UAAA;AACzB,IAAME,gBAAgB,GAAG,eAAe;AAAAD,OAAA,CAAAC,gBAAA,GAAAA,gBAAA;AA+GxC,IAAMC,gBAAgB,GAAIC,UAAkB,IAAgB;EACjE,IAAMC,EAAE,GAAG,uCAAuC;EAClD,IAAMC,KAAK,GAAGF,UAAU,CAACG,KAAK,CAAC,GAAG,CAAC;EACnC,IAAM/C,GAAc,GAAG,CAAC,CAAC;EACzB,IAAIgD,MAAM;EAEVF,KAAK,CAACG,OAAO,CAAEC,IAAI,IAAK;IACtBA,IAAI,GAAGA,IAAI,CAACC,IAAI,EAAE;IAClB,OAAQH,MAAM,GAAGH,EAAE,CAACO,IAAI,CAACF,IAAI,CAAC,EAAG;MAC/B,IAAMjD,GAAG,GAAG+C,MAAM,CAAC,CAAC,CAAC,CAACD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAACI,IAAI,EAAE,CAACE,iBAAiB,EAAE;MAC9DrD,GAAG,CAACC,GAAG,CAAC,GAAG;QACTqD,GAAG,EAAEN,MAAM,CAAC,CAAC,CAAC,CAACG,IAAI,EAAE;QACrBI,GAAG,EAAEtD,GAAkB;QACvBuD,IAAI,EAAER,MAAM,CAAC,CAAC,CAAC,CAACG,IAAI;MACtB,CAAC;IACH;EACF,CAAC,CAAC;EACF,OAAOnD,GAAG;AACZ,CAAC;AAAAyC,OAAA,CAAAE,gBAAA,GAAAA,gBAAA;AAAA,SAgBqBc,KAAKA,CAAAC,EAAA,EAAAC,GAAA,EAAAC,GAAA;EAAA,OAAAC,MAAA,CAAAvB,KAAA,OAAAD,SAAA;AAAA;AAAA,SAAAwB,OAAA;EAAAA,MAAA,GAAA5B,iBAAA,CAApB,WACL6B,GAAgB,EAChBC,QAAsC,EACtCC,OAAqC,EACF;IACnC,aAAa,IAAIC,MAAM,CAAmBH,GAAG,EAAEC,QAAQ,EAAEC,OAAO,CAAC,CAACE,IAAI,EAAE;EAC1E,CAAC;EAAA,OAAAL,MAAA,CAAAvB,KAAA,OAAAD,SAAA;AAAA;AAAA,SAWqB8B,OAAOA,CAAAC,GAAA,EAAAC,GAAA;EAAA,OAAAC,QAAA,CAAAhC,KAAA,OAAAD,SAAA;AAAA;AAAA,SAAAiC,SAAA;EAAAA,QAAA,GAAArC,iBAAA,CAAtB,WACL6B,GAAgB,EAChBC,QAAsC,EAGH;IAAA,IAFnCQ,MAA8B,GAAAlC,SAAA,CAAAmC,MAAA,QAAAnC,SAAA,QAAApB,SAAA,GAAAoB,SAAA,MAAIoC,IAAc,IAAKA,IAAI;IAAA,IACzDT,OAAqC,GAAA3B,SAAA,CAAAmC,MAAA,OAAAnC,SAAA,MAAApB,SAAA;IAErC,IAAMyD,KAAK,SAASjB,KAAK,CAACK,GAAG,EAAEC,QAAQ,EAAEC,OAAO,CAAC;IAEjDO,MAAM,CAACG,KAAK,CAACC,KAAK,CAAC;IACnB,IAAI;MACF,OAAOD,KAAK,CAACE,IAAI,EAAE,EAAE;QAEnBL,MAAM,OAAOT,GAAG,CAACe,EAAE,CAACH,KAAK,CAACI,QAAQ,EAAE,CAAC,CAAC;MACxC;IACF,CAAC,CAAC,OAAOvC,GAAG,EAAE;MACZ,OAAOR,OAAO,CAACN,MAAM,CAACc,GAAG,CAAC;IAC5B;IACA,OAAOmC,KAAK;EACd,CAAC;EAAA,OAAAJ,QAAA,CAAAhC,KAAA,OAAAD,SAAA;AAAA;AAKM,MAAM4B,MAAM,CAEnB;EAeEc,WAAWA,CACFjB,GAAgB,EAChBkB,IAAkC,EAClChB,OAAqC,EAC5C;IAAA,KAHOF,GAAgB,GAAhBA,GAAgB;IAAA,KAChBkB,IAAkC,GAAlCA,IAAkC;IAAA,KAClChB,OAAqC,GAArCA,OAAqC;IAAAjE,eAAA,gBAjB5B,EAAE;IAAAA,eAAA,gBACD,CAAC,CAAC;IAAAA,eAAA,gBACb,CAAC,CAAC;IAAAA,eAAA,iBACD,CAAC,CAAC;IAAAA,eAAA,gBACH,CAAC,CAAC;IAAAA,eAAA;IAeR,IAAI,CAACkF,SAAS,GAAGnB,GAAG,CAACoB,WAAW,CAACD,SAA0B;EAC7D;EAEcE,QAAQA,CAACH,IAAe,EAAE;IAAA,IAAAI,KAAA;IAAA,OAAAnD,iBAAA;MACtC,IAAIoD,GAAiB,GAAG,CAAC,CAAiB;MAC1C,IAAMC,KAAK,GAAGF,KAAI,CAACH,SAAS,CAACM,QAAQ;MACrC,IAAI;QAEFH,KAAI,CAACH,SAAS,CAACM,QAAQ,GAAIC,QAAsB,IAAK;UACpD,IAAIF,KAAK,EAAE;YAETE,QAAQ,GAAGF,KAAK,CAACE,QAAQ,CAAC;UAC5B;UACAH,GAAG,GAAGG,QAAQ;UACd,OAAOA,QAAQ;QACjB,CAAC;QACDJ,KAAI,CAACT,KAAK,SAAS,IAAAc,gBAAK,EAACT,IAAI,EAAE,CAAC;MAClC,CAAC,SAAS;QAERI,KAAI,CAACH,SAAS,CAACM,QAAQ,GAAGD,KAAK;MACjC;MACA,IAAIlF,MAAM,CAACsF,IAAI,CAACL,GAAG,CAAC,CAACb,MAAM,KAAK,CAAC,IAAIpE,MAAM,CAACsF,IAAI,CAACL,GAAG,CAACM,OAAO,CAAC,CAACnB,MAAM,KAAK,CAAC,EACxE,OAAOzC,OAAO,CAACN,MAAM,CAAC,IAAImE,KAAK,CAAC,8BAA8B,CAAC,CAAC;MAClER,KAAI,CAACS,KAAK,CAACR,GAAG,CAAC;MACf,OAAOD,KAAI;IAAA;EACb;EAEA,IAAIX,IAAIA,CAAA,EAAW;IACjB,IAAI,IAAI,CAACqB,KAAK,GAAG,CAAC,IAAI,IAAI,CAACC,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAChD,IAAMC,CAAC,GAAG,IAAI,CAACD,MAAM,GAAG,IAAI,CAACD,KAAK,GAAG,CAAC;IACtC,OAAOG,IAAI,CAACC,IAAI,CAACF,CAAC,CAAC;EACrB;EAEA,IAAIG,KAAKA,CAAA,EAAW;IAClB,IAAI,IAAI,CAACC,KAAK,GAAG,CAAC,IAAI,IAAI,CAACN,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAME,CAAC,GAAG,IAAI,CAACI,KAAK,GAAG,IAAI,CAACN,KAAK;IACjC,OAAOG,IAAI,CAACC,IAAI,CAACF,CAAC,CAAC;EACrB;EAEM9B,IAAIA,CAAA,EAAG;IAAA,IAAAmC,MAAA;IAAA,OAAApE,iBAAA;MACX,aAAaoE,MAAI,CAAClB,QAAQ,CAACkB,MAAI,CAACrB,IAAI,CAAC;IAAA;EACvC;EAEAsB,MAAMA,CAACpD,IAAiB,EAAW;IACjC,OAAO,CAAC,CAAC,IAAI,CAACJ,KAAK,CAACI,IAAI,CAAC;EAC3B;EAEA0B,IAAIA,CAAA,EAAG;IACL,OAAO,IAAI,CAAC0B,MAAM,CAAC,MAAM,CAAC;EAC5B;EASA,OAAeC,YAAYA,CACzBrG,KAAoB,EACpBsG,YAAiB,EAEjB;IAAA,IADAC,OAAO,GAAApE,SAAA,CAAAmC,MAAA,QAAAnC,SAAA,QAAApB,SAAA,GAAAoB,SAAA,MAAIqE,CAAS,IAAKC,QAAQ,CAACD,CAAC,EAAE,EAAE,CAAC;IAExC,IAAIxG,KAAK,KAAK,IAAI,EAAE,OAAOsG,YAAY;IACvC,OAAOC,OAAO,CAACvG,KAAK,CAAC;EACvB;EAEA0G,KAAKA,CAAA,EAAG;IACN,IAAI,CAAC9D,KAAK,GAAG,CAAC,CAAC;IACf,IAAI,CAACsD,KAAK,GAAG,IAAI,CAACL,MAAM,GAAG,IAAI,CAACD,KAAK,GAAG,CAAC,CAAC;IAC1C,IAAI,CAACnB,KAAK,GAAG,EAAyB;EACxC;EAEMkC,MAAMA,CACVrD,IAAiB,EACjBsC,KAAc,EACdC,MAAe,EACyB;IAAA,IAAAe,MAAA;IAAA,OAAA7E,iBAAA;MACxC,IAAMsB,GAAG,GAAGuD,MAAI,CAAChE,KAAK,CAACU,IAAI,CAAC;MAC5B,IAAIuD,MAAqC;MACzCD,MAAI,CAACF,KAAK,EAAE;MACZ,IAAI,CAACrD,GAAG,EAAE;QACRwD,MAAM,GAAG;UAAElC,EAAE,EAAE,IAAI;UAAE3E,KAAK,EAAE4G,MAAI,CAACnC;QAAM,CAAC;QACxC,OAAOoC,MAAM;MACf;MACA,IAAMC,aAAa,GAAI9C,IAAS,IAAK;QACnC,OAAO4C,MAAI,CAAChD,GAAG,CAACoB,WAAW,CAAC+B,YAAY,CAAC/C,IAAI,CAAC;MAChD,CAAC;MAED,IAAIhB,IAAI,GAAGK,GAAG,CAACD,GAAG;MAClB,IAAIwC,KAAK,KAAK7E,SAAS,EAAE;QACvB,IAAI8E,MAAM,KAAK9E,SAAS,EAAE;UACxB8E,MAAM,GAAG,CAAC;QACZ;QACA,IAAID,KAAK,GAAG,CAAC,IAAIC,MAAM,GAAG,CAAC,EAAE;UAC3BgB,MAAM,GAAG;YACPlC,EAAE,EAAE,KAAK;YACThD,KAAK,EAAE,IAAI+D,KAAK,CACd,2CAA2C;UAE/C,CAAC;UACD,OAAOmB,MAAM;QACf;QACA,IAAMzD,GAAG,GAAG,IAAI4D,GAAG,CAAChE,IAAI,CAAC;QACzB,IAAMiE,MAAM,GAAG7D,GAAG,CAAC8D,YAAY;QAC/BD,MAAM,CAACE,GAAG,CAAC,OAAO,EAAEvB,KAAK,CAACwB,QAAQ,EAAE,CAAC;QACrCH,MAAM,CAACE,GAAG,CAAC,QAAQ,EAAEtB,MAAM,CAACuB,QAAQ,EAAE,CAAC;QACvCpE,IAAI,GAAGI,GAAG,CAACgE,QAAQ,EAAE;MACvB;MACA,IAAMjC,GAAG,SAASyB,MAAI,CAAC7B,SAAS,CAACsC,UAAU,CACzC,KAAK,EACLrE,IAAI,EACJjC,SAAS,EACTA,SAAS,EACT+F,aAAa,EACbF,MAAI,CAAC9C,OAAO,CACb;MACD,IAAI;QACF8C,MAAI,CAACjB,KAAK,CAACR,GAAG,CAAC;QACfyB,MAAI,CAACnC,KAAK,SAAS,IAAAc,gBAAK,EAACqB,MAAI,CAAC7B,SAAS,CAACuC,aAAa,CAACnC,GAAG,CAAC,CAAC;QAC3D0B,MAAM,GAAG;UAAElC,EAAE,EAAE,IAAI;UAAE3E,KAAK,EAAE4G,MAAI,CAACnC;QAAM,CAAC;MAC1C,CAAC,CAAC,OAAO8C,CAAM,EAAE;QACfV,MAAM,GAAG;UAAElC,EAAE,EAAE,KAAK;UAAEhD,KAAK,EAAE4F;QAAE,CAAC;MAClC;MACA,OAAOV,MAAM;IAAA;EACf;EAEA,OAAOW,UAAUA,CAACrC,GAAiB,EAAE7B,IAAY,EAAE;IACjD,OACE6B,GAAG,CAACM,OAAO,CAACnC,IAAI,CAAC,IACjB6B,GAAG,CAACM,OAAO,CAACnC,IAAI,CAACmE,WAAW,EAAE,CAAC,IAC/BtC,GAAG,CAACM,OAAO,CAACnC,IAAI,CAACoE,WAAW,EAAE,CAAC;EAEnC;EAEA/B,KAAKA,CAACR,GAAiB,EAA4B;IACjD,IAAM8B,MAAM,GAAG,IAAID,GAAG,CAAC7B,GAAG,CAAC/B,GAAG,EAAE,gBAAgB,CAAC,CAAC8D,YAAY;IAC9D,IAAI,CAACtB,KAAK,GAAG7B,MAAM,CAACsC,YAAY,CAACY,MAAM,CAACU,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC9B,MAAM,GAAG9B,MAAM,CAACsC,YAAY,CAC/BY,MAAM,CAACU,GAAG,CAAC,QAAQ,CAAC,EACpB,IAAI,CAAC/B,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CACxB;IACD,IAAMlD,UAAU,GAAGqB,MAAM,CAACyD,UAAU,CAACrC,GAAG,EAAE7C,UAAU,CAAC;IACrD,IAAII,UAAU,EAAE;MACd,IAAI,CAACE,KAAK,GAAGH,gBAAgB,CAACC,UAAU,CAAC;IAC3C,CAAC,MAAM;MACL,IAAI,CAACE,KAAK,GAAG,CAAC,CAAC;IACjB;IACA,IAAMgF,WAAW,GAAG7D,MAAM,CAACyD,UAAU,CAACrC,GAAG,EAAE3C,gBAAgB,CAAC;IAC5D,IAAIoF,WAAW,EAAE;MACf,IAAI,CAAC1B,KAAK,GAAGO,QAAQ,CAACmB,WAAW,CAAC3E,IAAI,EAAE,EAAE,EAAE,CAAC;IAC/C,CAAC,MAAM;MACL,IAAI,CAACiD,KAAK,GAAG,CAAC,CAAC;IACjB;IACA,OAAO,IAAI;EACb;EAEM2B,SAASA,CAAA,EAA2C;IAAA,IAAAC,MAAA;IAAA,OAAA/F,iBAAA;MACxD,aAAa+F,MAAI,CAACnB,MAAM,CAAC,OAAO,CAAC;IAAA;EACnC;EAEMoB,QAAQA,CAAA,EAA2C;IAAA,IAAAC,MAAA;IAAA,OAAAjG,iBAAA;MACvD,aAAaiG,MAAI,CAACrB,MAAM,CAAC,MAAM,CAAC;IAAA;EAClC;EAEM/B,QAAQA,CAAA,EAA2C;IAAA,IAAAqD,MAAA;IAAA,OAAAlG,iBAAA;MACvD,aAAakG,MAAI,CAACtB,MAAM,CAAC,MAAM,CAAC;IAAA;EAClC;EAEMuB,QAAQA,CAAA,EAA2C;IAAA,IAAAC,MAAA;IAAA,OAAApG,iBAAA;MACvD,aAAaoG,MAAI,CAACxB,MAAM,CAAC,MAAM,CAAC;IAAA;EAClC;AACF;AAACpE,OAAA,CAAAwB,MAAA,GAAAA,MAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"platformServices.js","names":[],"sources":["../../src/platformServices.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IApiSettings } from './apiSettings'\nimport type { ITransport } from './transport'\nimport type { ICryptoHash } from './cryptoHash'\n\n/**\n * Contract for OAuth authentication services\n */\nexport interface IPlatformServices {\n settings: IApiSettings\n transport: ITransport\n crypto: ICryptoHash\n}\n"],"mappings":""}
|
package/lib/esm/proxySession.js
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ProxySession = void 0;
|
|
7
|
+
var _authSession = require("./authSession");
|
|
8
|
+
var _browserTransport = require("./browserTransport");
|
|
9
|
+
var _transport = require("./transport");
|
|
10
|
+
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); } }
|
|
3
11
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
4
|
-
|
|
5
|
-
import { AuthSession } from './authSession';
|
|
6
|
-
import { BrowserTransport } from './browserTransport';
|
|
7
|
-
import { LookerAppId, agentPrefix } from './transport';
|
|
8
|
-
export class ProxySession extends AuthSession {
|
|
12
|
+
class ProxySession extends _authSession.AuthSession {
|
|
9
13
|
constructor(settings, proxyUrl, transport) {
|
|
10
|
-
super(settings, transport || new BrowserTransport(settings));
|
|
14
|
+
super(settings, transport || new _browserTransport.BrowserTransport(settings));
|
|
11
15
|
this.settings = settings;
|
|
12
16
|
this.proxyUrl = proxyUrl;
|
|
13
17
|
}
|
|
14
|
-
|
|
15
18
|
isAuthenticated() {
|
|
16
19
|
return true;
|
|
17
20
|
}
|
|
18
|
-
|
|
19
21
|
authenticate(props) {
|
|
20
22
|
var _this = this;
|
|
21
|
-
|
|
22
23
|
return _asyncToGenerator(function* () {
|
|
23
24
|
if (!props.headers) {
|
|
24
25
|
props.headers = {};
|
|
25
26
|
}
|
|
26
|
-
|
|
27
27
|
props.headers['X-Forwarded-For'] = props.url;
|
|
28
|
-
props.headers[LookerAppId] = agentPrefix;
|
|
28
|
+
props.headers[_transport.LookerAppId] = _transport.agentPrefix;
|
|
29
29
|
props.url = _this.proxyUrl;
|
|
30
30
|
return props;
|
|
31
31
|
})();
|
|
32
32
|
}
|
|
33
|
-
|
|
34
33
|
}
|
|
34
|
+
exports.ProxySession = ProxySession;
|
|
35
35
|
//# sourceMappingURL=proxySession.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"proxySession.js","names":["_authSession","require","_browserTransport","_transport","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","ProxySession","AuthSession","constructor","settings","proxyUrl","transport","BrowserTransport","isAuthenticated","authenticate","props","_this","headers","url","LookerAppId","agentPrefix","exports"],"sources":["../../src/proxySession.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport { AuthSession } from './authSession'\nimport { BrowserTransport } from './browserTransport'\nimport type { ITransport, IRequestProps } from './transport'\nimport { LookerAppId, agentPrefix } from './transport'\nimport type { IApiSettings } from './apiSettings'\n\n/**\n * An AuthSession class intended for use with proxied requests\n *\n * This session uses `authenticate` to modify all requests to pass through a proxy server with\n * passing the request to the proxy server specified in the `proxyUrl` parameter, and sets\n * the original request path as an `X-Forwarded-For` header.\n *\n */\nexport abstract class ProxySession extends AuthSession {\n constructor(\n public settings: IApiSettings,\n public proxyUrl: string,\n transport?: ITransport\n ) {\n super(settings, transport || new BrowserTransport(settings))\n }\n\n /**\n * Proxy session is considered to be always authenticated since the proxy handles all auth\n *\n * @returns `true` since the proxy handles all authentication\n */\n isAuthenticated() {\n return true\n }\n\n /**\n * This implementation swaps the request's path with the proxy url, and puts the original\n * request path in the `X-Forwarded-For` header, presuming that the proxy server will add API authentication\n * information to the request that gets submitted to the Looker API, then forward the API response to the requestor\n *\n * @param props the properties of the request\n * @returns the same request properties with \"authentication\" data added\n *\n */\n async authenticate(props: IRequestProps) {\n if (!props.headers) {\n props.headers = {}\n }\n props.headers['X-Forwarded-For'] = props.url\n props.headers[LookerAppId] = agentPrefix\n props.url = this.proxyUrl\n return props\n }\n}\n"],"mappings":";;;;;;AA0BA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AAAsD,SAAAG,mBAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,EAAAC,GAAA,EAAAC,GAAA,cAAAC,IAAA,GAAAP,GAAA,CAAAK,GAAA,EAAAC,GAAA,OAAAE,KAAA,GAAAD,IAAA,CAAAC,KAAA,WAAAC,KAAA,IAAAP,MAAA,CAAAO,KAAA,iBAAAF,IAAA,CAAAG,IAAA,IAAAT,OAAA,CAAAO,KAAA,YAAAG,OAAA,CAAAV,OAAA,CAAAO,KAAA,EAAAI,IAAA,CAAAT,KAAA,EAAAC,MAAA;AAAA,SAAAS,kBAAAC,EAAA,6BAAAC,IAAA,SAAAC,IAAA,GAAAC,SAAA,aAAAN,OAAA,WAAAV,OAAA,EAAAC,MAAA,QAAAF,GAAA,GAAAc,EAAA,CAAAI,KAAA,CAAAH,IAAA,EAAAC,IAAA,YAAAb,MAAAK,KAAA,IAAAT,kBAAA,CAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,UAAAI,KAAA,cAAAJ,OAAAe,GAAA,IAAApB,kBAAA,CAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,WAAAe,GAAA,KAAAhB,KAAA,CAAAiB,SAAA;AAW/C,MAAeC,YAAY,SAASC,wBAAW,CAAC;EACrDC,WAAWA,CACFC,QAAsB,EACtBC,QAAgB,EACvBC,SAAsB,EACtB;IACA,KAAK,CAACF,QAAQ,EAAEE,SAAS,IAAI,IAAIC,kCAAgB,CAACH,QAAQ,CAAC,CAAC;IAAA,KAJrDA,QAAsB,GAAtBA,QAAsB;IAAA,KACtBC,QAAgB,GAAhBA,QAAgB;EAIzB;EAOAG,eAAeA,CAAA,EAAG;IAChB,OAAO,IAAI;EACb;EAWMC,YAAYA,CAACC,KAAoB,EAAE;IAAA,IAAAC,KAAA;IAAA,OAAAlB,iBAAA;MACvC,IAAI,CAACiB,KAAK,CAACE,OAAO,EAAE;QAClBF,KAAK,CAACE,OAAO,GAAG,CAAC,CAAC;MACpB;MACAF,KAAK,CAACE,OAAO,CAAC,iBAAiB,CAAC,GAAGF,KAAK,CAACG,GAAG;MAC5CH,KAAK,CAACE,OAAO,CAACE,sBAAW,CAAC,GAAGC,sBAAW;MACxCL,KAAK,CAACG,GAAG,GAAGF,KAAI,CAACN,QAAQ;MACzB,OAAOK,KAAK;IAAA;EACd;AACF;AAACM,OAAA,CAAAf,YAAA,GAAAA,YAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _testUtils = require("./testUtils");
|
|
7
|
+
Object.keys(_testUtils).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _testUtils[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function get() {
|
|
13
|
+
return _testUtils[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_testUtils","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get"],"sources":["../../../src/testUtils/index.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nexport * from './testUtils'\n"],"mappings":";;;;;AA0BA,IAAAA,UAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,UAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,UAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAT,UAAA,CAAAK,GAAA;IAAA;EAAA;AAAA"}
|