@looker/sdk-node 23.20.0 → 24.2.0

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/README.md CHANGED
@@ -105,8 +105,8 @@ import { LookerNodeSDK } from '@looker/sdk-node'
105
105
 
106
106
  ```typescript
107
107
  // Ignore any SDK environment variables for the node runtime
108
- const settings = new NodeSettingsIniFile('')
109
- const sdk = LookerNodeSDK.init40(settings)
108
+ const settings = new NodeSettingsIniFile('');
109
+ const sdk = LookerNodeSDK.init40(settings);
110
110
  ```
111
111
 
112
112
  ### Developing with multiple API versions
@@ -134,58 +134,58 @@ describe('sudo', () => {
134
134
  it(
135
135
  'login/logout',
136
136
  async () => {
137
- const sdk = new LookerSDK(session)
138
- const apiUser = await sdk.ok(sdk.me())
137
+ const sdk = new LookerSDK(session);
138
+ const apiUser = await sdk.ok(sdk.me());
139
139
  let all = await sdk.ok(
140
140
  sdk.all_users({
141
141
  fields: 'id,is_disabled',
142
142
  })
143
- )
143
+ );
144
144
 
145
145
  // find users who are not the API user
146
146
  const others = all
147
147
  .filter((u) => u.id !== apiUser.id && !u.is_disabled)
148
- .slice(0, 2)
149
- expect(others.length).toEqual(2)
148
+ .slice(0, 2);
149
+ expect(others.length).toEqual(2);
150
150
  if (others.length > 1) {
151
151
  // pick two other active users for `sudo` tests
152
- const [sudoA, sudoB] = others
152
+ const [sudoA, sudoB] = others;
153
153
  // get auth support for login()
154
- const auth = sdk.authSession as IAuthSession
154
+ const auth = sdk.authSession as IAuthSession;
155
155
 
156
156
  // login as sudoA
157
- await auth.login(sudoA.id.toString())
158
- let sudo = await sdk.ok(sdk.me()) // `me` returns `sudoA` user
159
- expect(sudo.id).toEqual(sudoA.id)
157
+ await auth.login(sudoA.id.toString());
158
+ let sudo = await sdk.ok(sdk.me()); // `me` returns `sudoA` user
159
+ expect(sudo.id).toEqual(sudoA.id);
160
160
 
161
161
  // login as sudoB directly from sudoA
162
- await auth.login(sudoB.id)
163
- sudo = await sdk.ok(sdk.me()) // `me` returns `sudoB` user
164
- expect(sudo.id).toEqual(sudoB.id)
162
+ await auth.login(sudoB.id);
163
+ sudo = await sdk.ok(sdk.me()); // `me` returns `sudoB` user
164
+ expect(sudo.id).toEqual(sudoB.id);
165
165
 
166
166
  // logging out sudo resets to API user
167
- await auth.logout()
168
- let user = await sdk.ok(sdk.me()) // `me` returns `apiUser` user
169
- expect(sdk.authSession.isAuthenticated()).toEqual(true)
170
- expect(user).toEqual(apiUser)
167
+ await auth.logout();
168
+ let user = await sdk.ok(sdk.me()); // `me` returns `apiUser` user
169
+ expect(sdk.authSession.isAuthenticated()).toEqual(true);
170
+ expect(user).toEqual(apiUser);
171
171
 
172
172
  // login as sudoA again to test plain `login()` later
173
- await auth.login(sudoA.id)
174
- sudo = await sdk.ok(sdk.me())
175
- expect(sudo.id).toEqual(sudoA.id)
173
+ await auth.login(sudoA.id);
174
+ sudo = await sdk.ok(sdk.me());
175
+ expect(sudo.id).toEqual(sudoA.id);
176
176
 
177
177
  // login() without a sudo ID logs in the API user
178
- await auth.login()
179
- user = await sdk.ok(sdk.me()) // `me` returns `apiUser` user
180
- expect(sdk.authSession.isAuthenticated()).toEqual(true)
181
- expect(user.id).toEqual(apiUser.id)
178
+ await auth.login();
179
+ user = await sdk.ok(sdk.me()); // `me` returns `apiUser` user
180
+ expect(sdk.authSession.isAuthenticated()).toEqual(true);
181
+ expect(user.id).toEqual(apiUser.id);
182
182
  }
183
- await sdk.authSession.logout()
184
- expect(sdk.authSession.isAuthenticated()).toEqual(false)
183
+ await sdk.authSession.logout();
184
+ expect(sdk.authSession.isAuthenticated()).toEqual(false);
185
185
  },
186
186
  testTimeout
187
- )
188
- })
187
+ );
188
+ });
189
189
  ```
190
190
 
191
191
  ## Environment variable configuration
@@ -195,8 +195,8 @@ describe('sudo', () => {
195
195
  Once the desired environment variables are set, the following code is all that's required to initialize the Looker SDK and retrieve the API credential's `User` information.
196
196
 
197
197
  ```typescript
198
- const sdk = LookerNodeSDK.init40(new NodeSettings())
199
- const me = await sdk.ok(sdk.me())
198
+ const sdk = LookerNodeSDK.init40(new NodeSettings());
199
+ const me = await sdk.ok(sdk.me());
200
200
  ```
201
201
 
202
202
  ### Streaming API responses
@@ -218,31 +218,31 @@ const downloadTileAs = async (
218
218
  tile: IDashboardElement,
219
219
  format: string
220
220
  ) => {
221
- let fileName
222
- fileName = `${tile.title}.${format}`
221
+ let fileName;
222
+ fileName = `${tile.title}.${format}`;
223
223
 
224
- const writer = fs.createWriteStream(fileName)
224
+ const writer = fs.createWriteStream(fileName);
225
225
  const request: IRequestRunQuery = {
226
226
  result_format: format,
227
227
  query_id: tile.query_id!,
228
228
  // apply_formatting: true,
229
229
  // apply_vis: true
230
- }
231
- const sdkStream = new Looker40SDKStream(sdk.authSession)
230
+ };
231
+ const sdkStream = new Looker40SDKStream(sdk.authSession);
232
232
  await sdkStream.run_query(async (readable: Readable) => {
233
233
  return new Promise<any>((resolve, reject) => {
234
234
  readable
235
235
  .pipe(writer)
236
236
  .on('error', () => {
237
- fileName = undefined
238
- throw reject
237
+ fileName = undefined;
238
+ throw reject;
239
239
  })
240
- .on('finish', resolve)
241
- })
242
- }, request)
240
+ .on('finish', resolve);
241
+ });
242
+ }, request);
243
243
 
244
- return fileName
245
- }
244
+ return fileName;
245
+ };
246
246
  ```
247
247
 
248
248
  ### More examples
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/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\n// Version 21.0.4\nexport * from './nodeServices'\nexport * from './nodeSession'\nexport * from './nodeSettings'\nexport * from './nodeTransport'\nexport * from './nodeSdk'\n"],"mappings":"AA2BA,cAAc,gBAAgB;AAC9B,cAAc,eAAe;AAC7B,cAAc,gBAAgB;AAC9B,cAAc,iBAAiB;AAC/B,cAAc,WAAW"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/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\n// Version 21.0.4\nexport * from './nodeServices';\nexport * from './nodeSession';\nexport * from './nodeSettings';\nexport * from './nodeTransport';\nexport * from './nodeSdk';\n"],"mappings":"AA2BA,cAAc,gBAAgB;AAC9B,cAAc,eAAe;AAC7B,cAAc,gBAAgB;AAC9B,cAAc,iBAAiB;AAC/B,cAAc,WAAW"}
@@ -1,5 +1,5 @@
1
1
  import { Looker40SDK, environmentPrefix } from '@looker/sdk';
2
- import { NodeSettingsIniFile, NodeSession, NodeTransport } from '.';
2
+ import { NodeSession, NodeSettingsIniFile, NodeTransport } from '.';
3
3
  export class LookerNodeSDK {
4
4
  static init40(settings, transport, session) {
5
5
  var _session;
@@ -1 +1 @@
1
- {"version":3,"file":"nodeSdk.js","names":["Looker40SDK","environmentPrefix","NodeSettingsIniFile","NodeSession","NodeTransport","LookerNodeSDK","init40","settings","transport","session","_session"],"sources":["../../src/nodeSdk.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 { ITransport, IApiSettings, IAuthSession } from '@looker/sdk-rtl'\nimport { Looker40SDK, environmentPrefix } from '@looker/sdk'\nimport { NodeSettingsIniFile, NodeSession, NodeTransport } from '.'\n\n/**\n * @class LookerNodeSDK\n *\n * Simple factory for the Node version of the Looker SDK. Provides default connectivity for SDK methods\n *\n */\nexport class LookerNodeSDK {\n /**\n * Creates a [[Looker40SDK]] object.\n *\n * @param settings Defaults to the settings from LookerIni\n *\n * @param transport Defaults to a `NodeTransport` object\n *\n * @param session Defaults to `NodeSession` which logs in the user\n */\n static init40(\n settings?: IApiSettings,\n transport?: ITransport,\n session?: IAuthSession\n ) {\n settings = settings || new NodeSettingsIniFile(environmentPrefix)\n transport = transport || new NodeTransport(settings)\n session = session ?? new NodeSession(settings, transport)\n return new Looker40SDK(session)\n }\n}\n"],"mappings":"AA2BA,SAASA,WAAW,EAAEC,iBAAiB,QAAQ,aAAa;AAC5D,SAASC,mBAAmB,EAAEC,WAAW,EAAEC,aAAa,QAAQ,GAAG;AAQnE,OAAO,MAAMC,aAAa,CAAC;EAUzB,OAAOC,MAAMA,CACXC,QAAuB,EACvBC,SAAsB,EACtBC,OAAsB,EACtB;IAAA,IAAAC,QAAA;IACAH,QAAQ,GAAGA,QAAQ,IAAI,IAAIL,mBAAmB,CAACD,iBAAiB,CAAC;IACjEO,SAAS,GAAGA,SAAS,IAAI,IAAIJ,aAAa,CAACG,QAAQ,CAAC;IACpDE,OAAO,IAAAC,QAAA,GAAGD,OAAO,cAAAC,QAAA,cAAAA,QAAA,GAAI,IAAIP,WAAW,CAACI,QAAQ,EAAEC,SAAS,CAAC;IACzD,OAAO,IAAIR,WAAW,CAACS,OAAO,CAAC;EACjC;AACF"}
1
+ {"version":3,"file":"nodeSdk.js","names":["Looker40SDK","environmentPrefix","NodeSession","NodeSettingsIniFile","NodeTransport","LookerNodeSDK","init40","settings","transport","session","_session"],"sources":["../../src/nodeSdk.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, IAuthSession, ITransport } from '@looker/sdk-rtl';\nimport { Looker40SDK, environmentPrefix } from '@looker/sdk';\nimport { NodeSession, NodeSettingsIniFile, NodeTransport } from '.';\n\n/**\n * @class LookerNodeSDK\n *\n * Simple factory for the Node version of the Looker SDK. Provides default connectivity for SDK methods\n *\n */\nexport class LookerNodeSDK {\n /**\n * Creates a [[Looker40SDK]] object.\n *\n * @param settings Defaults to the settings from LookerIni\n *\n * @param transport Defaults to a `NodeTransport` object\n *\n * @param session Defaults to `NodeSession` which logs in the user\n */\n static init40(\n settings?: IApiSettings,\n transport?: ITransport,\n session?: IAuthSession\n ) {\n settings = settings || new NodeSettingsIniFile(environmentPrefix);\n transport = transport || new NodeTransport(settings);\n session = session ?? new NodeSession(settings, transport);\n return new Looker40SDK(session);\n }\n}\n"],"mappings":"AA2BA,SAASA,WAAW,EAAEC,iBAAiB,QAAQ,aAAa;AAC5D,SAASC,WAAW,EAAEC,mBAAmB,EAAEC,aAAa,QAAQ,GAAG;AAQnE,OAAO,MAAMC,aAAa,CAAC;EAUzB,OAAOC,MAAMA,CACXC,QAAuB,EACvBC,SAAsB,EACtBC,OAAsB,EACtB;IAAA,IAAAC,QAAA;IACAH,QAAQ,GAAGA,QAAQ,IAAI,IAAIJ,mBAAmB,CAACF,iBAAiB,CAAC;IACjEO,SAAS,GAAGA,SAAS,IAAI,IAAIJ,aAAa,CAACG,QAAQ,CAAC;IACpDE,OAAO,IAAAC,QAAA,GAAGD,OAAO,cAAAC,QAAA,cAAAA,QAAA,GAAI,IAAIR,WAAW,CAACK,QAAQ,EAAEC,SAAS,CAAC;IACzD,OAAO,IAAIR,WAAW,CAACS,OAAO,CAAC;EACjC;AACF"}
@@ -1,6 +1,6 @@
1
1
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
- function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
2
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
3
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
4
  import { sdkError } from '@looker/sdk-rtl';
5
5
  import { NodeCryptoHash, NodeTransport } from './nodeTransport';
6
6
  export class NodeServices {
@@ -1 +1 @@
1
- {"version":3,"file":"nodeServices.js","names":["sdkError","NodeCryptoHash","NodeTransport","NodeServices","constructor","services","_defineProperty","settings","message","transport","crypto"],"sources":["../../src/nodeServices.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type {\n ICryptoHash,\n IApiSettings,\n ITransport,\n IPlatformServices,\n} from '@looker/sdk-rtl'\nimport { sdkError } from '@looker/sdk-rtl'\nimport { NodeCryptoHash, NodeTransport } from './nodeTransport'\n\nexport class NodeServices implements IPlatformServices {\n /** Cryptography service interface */\n crypto: ICryptoHash\n /** SDK configuration interface */\n settings: IApiSettings\n transport: ITransport\n\n constructor(services: Partial<IPlatformServices>) {\n if (!services.settings) {\n throw sdkError({ message: 'Missing required IApiSettings' })\n }\n this.settings = services.settings\n this.transport = services.transport || new NodeTransport(this.settings)\n this.crypto = services.crypto || new NodeCryptoHash()\n }\n}\n"],"mappings":";;;AAgCA,SAASA,QAAQ,QAAQ,iBAAiB;AAC1C,SAASC,cAAc,EAAEC,aAAa,QAAQ,iBAAiB;AAE/D,OAAO,MAAMC,YAAY,CAA8B;EAOrDC,WAAWA,CAACC,QAAoC,EAAE;IAAAC,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAChD,IAAI,CAACD,QAAQ,CAACE,QAAQ,EAAE;MACtB,MAAMP,QAAQ,CAAC;QAAEQ,OAAO,EAAE;MAAgC,CAAC,CAAC;IAC9D;IACA,IAAI,CAACD,QAAQ,GAAGF,QAAQ,CAACE,QAAQ;IACjC,IAAI,CAACE,SAAS,GAAGJ,QAAQ,CAACI,SAAS,IAAI,IAAIP,aAAa,CAAC,IAAI,CAACK,QAAQ,CAAC;IACvE,IAAI,CAACG,MAAM,GAAGL,QAAQ,CAACK,MAAM,IAAI,IAAIT,cAAc,CAAC,CAAC;EACvD;AACF"}
1
+ {"version":3,"file":"nodeServices.js","names":["sdkError","NodeCryptoHash","NodeTransport","NodeServices","constructor","services","_defineProperty","settings","message","transport","crypto"],"sources":["../../src/nodeServices.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type {\n IApiSettings,\n ICryptoHash,\n IPlatformServices,\n ITransport,\n} from '@looker/sdk-rtl';\nimport { sdkError } from '@looker/sdk-rtl';\nimport { NodeCryptoHash, NodeTransport } from './nodeTransport';\n\nexport class NodeServices implements IPlatformServices {\n /** Cryptography service interface */\n crypto: ICryptoHash;\n /** SDK configuration interface */\n settings: IApiSettings;\n transport: ITransport;\n\n constructor(services: Partial<IPlatformServices>) {\n if (!services.settings) {\n throw sdkError({ message: 'Missing required IApiSettings' });\n }\n this.settings = services.settings;\n this.transport = services.transport || new NodeTransport(this.settings);\n this.crypto = services.crypto || new NodeCryptoHash();\n }\n}\n"],"mappings":";;;AAgCA,SAASA,QAAQ,QAAQ,iBAAiB;AAC1C,SAASC,cAAc,EAAEC,aAAa,QAAQ,iBAAiB;AAE/D,OAAO,MAAMC,YAAY,CAA8B;EAOrDC,WAAWA,CAACC,QAAoC,EAAE;IAAAC,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAChD,IAAI,CAACD,QAAQ,CAACE,QAAQ,EAAE;MACtB,MAAMP,QAAQ,CAAC;QAAEQ,OAAO,EAAE;MAAgC,CAAC,CAAC;IAC9D;IACA,IAAI,CAACD,QAAQ,GAAGF,QAAQ,CAACE,QAAQ;IACjC,IAAI,CAACE,SAAS,GAAGJ,QAAQ,CAACI,SAAS,IAAI,IAAIP,aAAa,CAAC,IAAI,CAACK,QAAQ,CAAC;IACvE,IAAI,CAACG,MAAM,GAAGL,QAAQ,CAACK,MAAM,IAAI,IAAIT,cAAc,CAAC,CAAC;EACvD;AACF"}
@@ -1,9 +1,9 @@
1
1
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
2
2
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
3
3
  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; }
4
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
5
- 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); }
6
- import { sdkError, encodeParams, AuthToken, AuthSession } from '@looker/sdk-rtl';
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
5
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
+ import { AuthSession, AuthToken, encodeParams, sdkError } from '@looker/sdk-rtl';
7
7
  import { NodeTransport } from './nodeTransport';
8
8
  var strPost = 'POST';
9
9
  var strDelete = 'DELETE';
@@ -1 +1 @@
1
- {"version":3,"file":"nodeSession.js","names":["sdkError","encodeParams","AuthToken","AuthSession","NodeTransport","strPost","strDelete","NodeSession","constructor","settings","transport","_defineProperty","activeToken","_sudoToken","access_token","_authToken","isAuthenticated","token","isActive","authenticate","props","_this","_asyncToGenerator","getToken","headers","Authorization","concat","isSudo","sudoId","_this2","login","reset","_this3","_login","toString","logout","_this4","result","_logout","sudoLogout","_this5","newId","_this6","section","readConfig","clientId","client_id","clientSecret","client_secret","message","body","ok","request","apiPath","undefined","setToken","promise","encodeURI","init","accessToken","_this7"],"sources":["../../src/nodeSession.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type {\n IRequestProps,\n ITransport,\n HttpMethod,\n IApiSettings,\n IAccessToken,\n IError,\n} from '@looker/sdk-rtl'\nimport { sdkError, encodeParams, AuthToken, AuthSession } from '@looker/sdk-rtl'\nimport { NodeTransport } from './nodeTransport'\n\nconst strPost: HttpMethod = 'POST'\nconst strDelete: HttpMethod = 'DELETE'\n\nexport class NodeSession extends AuthSession {\n private readonly apiPath: string = '/api/4.0'\n _authToken: AuthToken = new AuthToken()\n _sudoToken: AuthToken = new AuthToken()\n\n constructor(public settings: IApiSettings, transport?: ITransport) {\n super(settings, transport || new NodeTransport(settings))\n }\n\n /**\n * Abstraction of AuthToken retrieval to support sudo mode\n */\n get activeToken() {\n if (this._sudoToken.access_token) {\n return this._sudoToken\n }\n return this._authToken\n }\n\n /**\n * Is there an active authentication token?\n */\n isAuthenticated() {\n // TODO I think this can be simplified\n const token = this.activeToken\n if (!(token && token.access_token)) return false\n return token.isActive()\n }\n\n /**\n * Add authentication data to the pending API request\n * @param props initialized API request properties\n *\n * @returns the updated request properties\n */\n async authenticate(props: IRequestProps) {\n const token = await this.getToken()\n if (token && token.access_token) {\n props.headers.Authorization = `Bearer ${token.access_token}`\n }\n return props\n }\n\n isSudo() {\n return !!this.sudoId && this._sudoToken.isActive()\n }\n\n /**\n * retrieve the current authentication token. If there is no active token, performs default\n * login to retrieve the token\n */\n async getToken() {\n if (!this.isAuthenticated()) {\n await this.login()\n }\n return this.activeToken\n }\n\n /**\n * Reset the authentication session\n */\n reset() {\n this.sudoId = ''\n this._authToken.reset()\n this._sudoToken.reset()\n }\n\n /**\n * Activate the authentication token for the API3 or sudo user\n * @param sudoId {string | number}: optional. If provided, impersonates the user specified\n *\n */\n async login(sudoId?: string | number) {\n if (sudoId || sudoId !== this.sudoId || !this.isAuthenticated()) {\n if (sudoId) {\n await this._login(sudoId.toString())\n } else {\n await this._login()\n }\n }\n return this.activeToken\n }\n\n /**\n * Logout the active user. If the active user is sudo, the session reverts to the API3 user\n */\n async logout() {\n let result = false\n if (this.isAuthenticated()) {\n result = await this._logout()\n }\n return result\n }\n\n private async sudoLogout() {\n let result = false\n if (this.isSudo()) {\n result = await this.logout() // Logout the current sudo\n this._sudoToken.reset()\n }\n return result\n }\n\n // internal login method that manages default auth token and sudo workflow\n private async _login(newId?: string) {\n // for linty freshness, always logout sudo if set\n await this.sudoLogout()\n\n if (newId !== this.sudoId) {\n // Assign new requested sudo id\n this.sudoId = newId || ''\n }\n\n if (!this._authToken.isActive()) {\n this.reset()\n // only retain client API3 credentials for the lifetime of the login request\n const section = this.settings.readConfig()\n const clientId = section.client_id\n const clientSecret = section.client_secret\n if (!clientId || !clientSecret) {\n throw sdkError({\n message: 'API credentials client_id and/or client_secret are not set',\n })\n }\n const body = encodeParams({\n client_id: clientId,\n client_secret: clientSecret,\n })\n // authenticate client\n const token = await this.ok(\n this.transport.request<IAccessToken, IError>(\n strPost,\n `${this.apiPath}/login`,\n undefined,\n body\n )\n )\n this._authToken.setToken(token)\n }\n\n if (this.sudoId) {\n // Use the API user auth to sudo\n const token = this.activeToken\n const promise = this.transport.request<IAccessToken, IError>(\n strPost,\n encodeURI(`${this.apiPath}/login/${newId}`),\n null,\n null,\n // ensure the auth token is included in the sudo request\n (init: IRequestProps) => {\n if (token.access_token) {\n init.headers.Authorization = `Bearer ${token.access_token}`\n }\n return init\n },\n this.settings // TODO this may not be needed here\n )\n\n const accessToken = await this.ok(promise)\n\n this._sudoToken.setToken(accessToken)\n }\n\n return this.activeToken\n }\n\n private async _logout() {\n const token = this.activeToken\n const promise = this.transport.request<string, IError>(\n strDelete,\n `${this.apiPath}/logout`,\n null,\n null,\n // ensure the auth token is included in the logout promise\n (init: IRequestProps) => {\n if (token.access_token) {\n init.headers.Authorization = `Bearer ${token.access_token}`\n }\n return init\n },\n this.settings\n )\n\n await this.ok(promise)\n\n // If no error was thrown, logout was successful\n if (this.sudoId) {\n // User was logged out, so set auth back to default\n this.sudoId = ''\n this._sudoToken.reset()\n if (!this._authToken.isActive()) {\n await this.login()\n }\n } else {\n // completely logged out\n this.reset()\n }\n return true\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"nodeSession.js","names":["AuthSession","AuthToken","encodeParams","sdkError","NodeTransport","strPost","strDelete","NodeSession","constructor","settings","transport","_defineProperty","activeToken","_sudoToken","access_token","_authToken","isAuthenticated","token","isActive","authenticate","props","_this","_asyncToGenerator","getToken","headers","Authorization","concat","isSudo","sudoId","_this2","login","reset","_this3","_login","toString","logout","_this4","result","_logout","sudoLogout","_this5","newId","_this6","section","readConfig","clientId","client_id","clientSecret","client_secret","message","body","ok","request","apiPath","undefined","setToken","promise","encodeURI","init","accessToken","_this7"],"sources":["../../src/nodeSession.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type {\n HttpMethod,\n IAccessToken,\n IApiSettings,\n IError,\n IRequestProps,\n ITransport,\n} from '@looker/sdk-rtl';\nimport {\n AuthSession,\n AuthToken,\n encodeParams,\n sdkError,\n} from '@looker/sdk-rtl';\nimport { NodeTransport } from './nodeTransport';\n\nconst strPost: HttpMethod = 'POST';\nconst strDelete: HttpMethod = 'DELETE';\n\nexport class NodeSession extends AuthSession {\n private readonly apiPath: string = '/api/4.0';\n _authToken: AuthToken = new AuthToken();\n _sudoToken: AuthToken = new AuthToken();\n\n constructor(\n public settings: IApiSettings,\n transport?: ITransport\n ) {\n super(settings, transport || new NodeTransport(settings));\n }\n\n /**\n * Abstraction of AuthToken retrieval to support sudo mode\n */\n get activeToken() {\n if (this._sudoToken.access_token) {\n return this._sudoToken;\n }\n return this._authToken;\n }\n\n /**\n * Is there an active authentication token?\n */\n isAuthenticated() {\n // TODO I think this can be simplified\n const token = this.activeToken;\n if (!(token && token.access_token)) return false;\n return token.isActive();\n }\n\n /**\n * Add authentication data to the pending API request\n * @param props initialized API request properties\n *\n * @returns the updated request properties\n */\n async authenticate(props: IRequestProps) {\n const token = await this.getToken();\n if (token && token.access_token) {\n props.headers.Authorization = `Bearer ${token.access_token}`;\n }\n return props;\n }\n\n isSudo() {\n return !!this.sudoId && this._sudoToken.isActive();\n }\n\n /**\n * retrieve the current authentication token. If there is no active token, performs default\n * login to retrieve the token\n */\n async getToken() {\n if (!this.isAuthenticated()) {\n await this.login();\n }\n return this.activeToken;\n }\n\n /**\n * Reset the authentication session\n */\n reset() {\n this.sudoId = '';\n this._authToken.reset();\n this._sudoToken.reset();\n }\n\n /**\n * Activate the authentication token for the API3 or sudo user\n * @param sudoId {string | number}: optional. If provided, impersonates the user specified\n *\n */\n async login(sudoId?: string | number) {\n if (sudoId || sudoId !== this.sudoId || !this.isAuthenticated()) {\n if (sudoId) {\n await this._login(sudoId.toString());\n } else {\n await this._login();\n }\n }\n return this.activeToken;\n }\n\n /**\n * Logout the active user. If the active user is sudo, the session reverts to the API3 user\n */\n async logout() {\n let result = false;\n if (this.isAuthenticated()) {\n result = await this._logout();\n }\n return result;\n }\n\n private async sudoLogout() {\n let result = false;\n if (this.isSudo()) {\n result = await this.logout(); // Logout the current sudo\n this._sudoToken.reset();\n }\n return result;\n }\n\n // internal login method that manages default auth token and sudo workflow\n private async _login(newId?: string) {\n // for linty freshness, always logout sudo if set\n await this.sudoLogout();\n\n if (newId !== this.sudoId) {\n // Assign new requested sudo id\n this.sudoId = newId || '';\n }\n\n if (!this._authToken.isActive()) {\n this.reset();\n // only retain client API3 credentials for the lifetime of the login request\n const section = this.settings.readConfig();\n const clientId = section.client_id;\n const clientSecret = section.client_secret;\n if (!clientId || !clientSecret) {\n throw sdkError({\n message: 'API credentials client_id and/or client_secret are not set',\n });\n }\n const body = encodeParams({\n client_id: clientId,\n client_secret: clientSecret,\n });\n // authenticate client\n const token = await this.ok(\n this.transport.request<IAccessToken, IError>(\n strPost,\n `${this.apiPath}/login`,\n undefined,\n body\n )\n );\n this._authToken.setToken(token);\n }\n\n if (this.sudoId) {\n // Use the API user auth to sudo\n const token = this.activeToken;\n const promise = this.transport.request<IAccessToken, IError>(\n strPost,\n encodeURI(`${this.apiPath}/login/${newId}`),\n null,\n null,\n // ensure the auth token is included in the sudo request\n (init: IRequestProps) => {\n if (token.access_token) {\n init.headers.Authorization = `Bearer ${token.access_token}`;\n }\n return init;\n },\n this.settings // TODO this may not be needed here\n );\n\n const accessToken = await this.ok(promise);\n\n this._sudoToken.setToken(accessToken);\n }\n\n return this.activeToken;\n }\n\n private async _logout() {\n const token = this.activeToken;\n const promise = this.transport.request<string, IError>(\n strDelete,\n `${this.apiPath}/logout`,\n null,\n null,\n // ensure the auth token is included in the logout promise\n (init: IRequestProps) => {\n if (token.access_token) {\n init.headers.Authorization = `Bearer ${token.access_token}`;\n }\n return init;\n },\n this.settings\n );\n\n await this.ok(promise);\n\n // If no error was thrown, logout was successful\n if (this.sudoId) {\n // User was logged out, so set auth back to default\n this.sudoId = '';\n this._sudoToken.reset();\n if (!this._authToken.isActive()) {\n await this.login();\n }\n } else {\n // completely logged out\n this.reset();\n }\n return true;\n }\n}\n"],"mappings":";;;;;AAkCA,SACEA,WAAW,EACXC,SAAS,EACTC,YAAY,EACZC,QAAQ,QACH,iBAAiB;AACxB,SAASC,aAAa,QAAQ,iBAAiB;AAE/C,IAAMC,OAAmB,GAAG,MAAM;AAClC,IAAMC,SAAqB,GAAG,QAAQ;AAEtC,OAAO,MAAMC,WAAW,SAASP,WAAW,CAAC;EAK3CQ,WAAWA,CACFC,QAAsB,EAC7BC,SAAsB,EACtB;IACA,KAAK,CAACD,QAAQ,EAAEC,SAAS,IAAI,IAAIN,aAAa,CAACK,QAAQ,CAAC,CAAC;IAAC,KAHnDA,QAAsB,GAAtBA,QAAsB;IAAAE,eAAA,kBALI,UAAU;IAAAA,eAAA,qBACrB,IAAIV,SAAS,CAAC,CAAC;IAAAU,eAAA,qBACf,IAAIV,SAAS,CAAC,CAAC;EAOvC;EAKA,IAAIW,WAAWA,CAAA,EAAG;IAChB,IAAI,IAAI,CAACC,UAAU,CAACC,YAAY,EAAE;MAChC,OAAO,IAAI,CAACD,UAAU;IACxB;IACA,OAAO,IAAI,CAACE,UAAU;EACxB;EAKAC,eAAeA,CAAA,EAAG;IAEhB,IAAMC,KAAK,GAAG,IAAI,CAACL,WAAW;IAC9B,IAAI,EAAEK,KAAK,IAAIA,KAAK,CAACH,YAAY,CAAC,EAAE,OAAO,KAAK;IAChD,OAAOG,KAAK,CAACC,QAAQ,CAAC,CAAC;EACzB;EAQMC,YAAYA,CAACC,KAAoB,EAAE;IAAA,IAAAC,KAAA;IAAA,OAAAC,iBAAA;MACvC,IAAML,KAAK,SAASI,KAAI,CAACE,QAAQ,CAAC,CAAC;MACnC,IAAIN,KAAK,IAAIA,KAAK,CAACH,YAAY,EAAE;QAC/BM,KAAK,CAACI,OAAO,CAACC,aAAa,aAAAC,MAAA,CAAaT,KAAK,CAACH,YAAY,CAAE;MAC9D;MACA,OAAOM,KAAK;IAAC;EACf;EAEAO,MAAMA,CAAA,EAAG;IACP,OAAO,CAAC,CAAC,IAAI,CAACC,MAAM,IAAI,IAAI,CAACf,UAAU,CAACK,QAAQ,CAAC,CAAC;EACpD;EAMMK,QAAQA,CAAA,EAAG;IAAA,IAAAM,MAAA;IAAA,OAAAP,iBAAA;MACf,IAAI,CAACO,MAAI,CAACb,eAAe,CAAC,CAAC,EAAE;QAC3B,MAAMa,MAAI,CAACC,KAAK,CAAC,CAAC;MACpB;MACA,OAAOD,MAAI,CAACjB,WAAW;IAAC;EAC1B;EAKAmB,KAAKA,CAAA,EAAG;IACN,IAAI,CAACH,MAAM,GAAG,EAAE;IAChB,IAAI,CAACb,UAAU,CAACgB,KAAK,CAAC,CAAC;IACvB,IAAI,CAAClB,UAAU,CAACkB,KAAK,CAAC,CAAC;EACzB;EAOMD,KAAKA,CAACF,MAAwB,EAAE;IAAA,IAAAI,MAAA;IAAA,OAAAV,iBAAA;MACpC,IAAIM,MAAM,IAAIA,MAAM,KAAKI,MAAI,CAACJ,MAAM,IAAI,CAACI,MAAI,CAAChB,eAAe,CAAC,CAAC,EAAE;QAC/D,IAAIY,MAAM,EAAE;UACV,MAAMI,MAAI,CAACC,MAAM,CAACL,MAAM,CAACM,QAAQ,CAAC,CAAC,CAAC;QACtC,CAAC,MAAM;UACL,MAAMF,MAAI,CAACC,MAAM,CAAC,CAAC;QACrB;MACF;MACA,OAAOD,MAAI,CAACpB,WAAW;IAAC;EAC1B;EAKMuB,MAAMA,CAAA,EAAG;IAAA,IAAAC,MAAA;IAAA,OAAAd,iBAAA;MACb,IAAIe,MAAM,GAAG,KAAK;MAClB,IAAID,MAAI,CAACpB,eAAe,CAAC,CAAC,EAAE;QAC1BqB,MAAM,SAASD,MAAI,CAACE,OAAO,CAAC,CAAC;MAC/B;MACA,OAAOD,MAAM;IAAC;EAChB;EAEcE,UAAUA,CAAA,EAAG;IAAA,IAAAC,MAAA;IAAA,OAAAlB,iBAAA;MACzB,IAAIe,MAAM,GAAG,KAAK;MAClB,IAAIG,MAAI,CAACb,MAAM,CAAC,CAAC,EAAE;QACjBU,MAAM,SAASG,MAAI,CAACL,MAAM,CAAC,CAAC;QAC5BK,MAAI,CAAC3B,UAAU,CAACkB,KAAK,CAAC,CAAC;MACzB;MACA,OAAOM,MAAM;IAAC;EAChB;EAGcJ,MAAMA,CAACQ,KAAc,EAAE;IAAA,IAAAC,MAAA;IAAA,OAAApB,iBAAA;MAEnC,MAAMoB,MAAI,CAACH,UAAU,CAAC,CAAC;MAEvB,IAAIE,KAAK,KAAKC,MAAI,CAACd,MAAM,EAAE;QAEzBc,MAAI,CAACd,MAAM,GAAGa,KAAK,IAAI,EAAE;MAC3B;MAEA,IAAI,CAACC,MAAI,CAAC3B,UAAU,CAACG,QAAQ,CAAC,CAAC,EAAE;QAC/BwB,MAAI,CAACX,KAAK,CAAC,CAAC;QAEZ,IAAMY,OAAO,GAAGD,MAAI,CAACjC,QAAQ,CAACmC,UAAU,CAAC,CAAC;QAC1C,IAAMC,QAAQ,GAAGF,OAAO,CAACG,SAAS;QAClC,IAAMC,YAAY,GAAGJ,OAAO,CAACK,aAAa;QAC1C,IAAI,CAACH,QAAQ,IAAI,CAACE,YAAY,EAAE;UAC9B,MAAM5C,QAAQ,CAAC;YACb8C,OAAO,EAAE;UACX,CAAC,CAAC;QACJ;QACA,IAAMC,IAAI,GAAGhD,YAAY,CAAC;UACxB4C,SAAS,EAAED,QAAQ;UACnBG,aAAa,EAAED;QACjB,CAAC,CAAC;QAEF,IAAM9B,KAAK,SAASyB,MAAI,CAACS,EAAE,CACzBT,MAAI,CAAChC,SAAS,CAAC0C,OAAO,CACpB/C,OAAO,KAAAqB,MAAA,CACJgB,MAAI,CAACW,OAAO,aACfC,SAAS,EACTJ,IACF,CACF,CAAC;QACDR,MAAI,CAAC3B,UAAU,CAACwC,QAAQ,CAACtC,KAAK,CAAC;MACjC;MAEA,IAAIyB,MAAI,CAACd,MAAM,EAAE;QAEf,IAAMX,MAAK,GAAGyB,MAAI,CAAC9B,WAAW;QAC9B,IAAM4C,OAAO,GAAGd,MAAI,CAAChC,SAAS,CAAC0C,OAAO,CACpC/C,OAAO,EACPoD,SAAS,IAAA/B,MAAA,CAAIgB,MAAI,CAACW,OAAO,aAAA3B,MAAA,CAAUe,KAAK,CAAE,CAAC,EAC3C,IAAI,EACJ,IAAI,EAEHiB,IAAmB,IAAK;UACvB,IAAIzC,MAAK,CAACH,YAAY,EAAE;YACtB4C,IAAI,CAAClC,OAAO,CAACC,aAAa,aAAAC,MAAA,CAAaT,MAAK,CAACH,YAAY,CAAE;UAC7D;UACA,OAAO4C,IAAI;QACb,CAAC,EACDhB,MAAI,CAACjC,QACP,CAAC;QAED,IAAMkD,WAAW,SAASjB,MAAI,CAACS,EAAE,CAACK,OAAO,CAAC;QAE1Cd,MAAI,CAAC7B,UAAU,CAAC0C,QAAQ,CAACI,WAAW,CAAC;MACvC;MAEA,OAAOjB,MAAI,CAAC9B,WAAW;IAAC;EAC1B;EAEc0B,OAAOA,CAAA,EAAG;IAAA,IAAAsB,MAAA;IAAA,OAAAtC,iBAAA;MACtB,IAAML,KAAK,GAAG2C,MAAI,CAAChD,WAAW;MAC9B,IAAM4C,OAAO,GAAGI,MAAI,CAAClD,SAAS,CAAC0C,OAAO,CACpC9C,SAAS,KAAAoB,MAAA,CACNkC,MAAI,CAACP,OAAO,cACf,IAAI,EACJ,IAAI,EAEHK,IAAmB,IAAK;QACvB,IAAIzC,KAAK,CAACH,YAAY,EAAE;UACtB4C,IAAI,CAAClC,OAAO,CAACC,aAAa,aAAAC,MAAA,CAAaT,KAAK,CAACH,YAAY,CAAE;QAC7D;QACA,OAAO4C,IAAI;MACb,CAAC,EACDE,MAAI,CAACnD,QACP,CAAC;MAED,MAAMmD,MAAI,CAACT,EAAE,CAACK,OAAO,CAAC;MAGtB,IAAII,MAAI,CAAChC,MAAM,EAAE;QAEfgC,MAAI,CAAChC,MAAM,GAAG,EAAE;QAChBgC,MAAI,CAAC/C,UAAU,CAACkB,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC6B,MAAI,CAAC7C,UAAU,CAACG,QAAQ,CAAC,CAAC,EAAE;UAC/B,MAAM0C,MAAI,CAAC9B,KAAK,CAAC,CAAC;QACpB;MACF,CAAC,MAAM;QAEL8B,MAAI,CAAC7B,KAAK,CAAC,CAAC;MACd;MACA,OAAO,IAAI;IAAC;EACd;AACF"}
@@ -1,8 +1,8 @@
1
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3
3
  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; }
4
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
5
- 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); }
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
5
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
6
  import * as fs from 'fs';
7
7
  import * as ini from 'ini';
8
8
  import { ApiConfigMap, ApiSettings, DefaultSettings, ValueSettings, sdkError, unquote } from '@looker/sdk-rtl';
@@ -1 +1 @@
1
- {"version":3,"file":"nodeSettings.js","names":["fs","ini","ApiConfigMap","ApiSettings","DefaultSettings","ValueSettings","sdkError","unquote","getenv","name","defaultValue","arguments","length","undefined","val","process","env","ApiConfig","contents","parse","ApiConfigSection","section","config","Object","keys","settings","Error","concat","api_version","console","warn","readEnvConfig","envPrefix","values","configMap","forEach","key","envKey","readIniConfig","fileName","existsSync","_objectSpread","readFileSync","NodeSettings","constructor","_defineProperty","readConfig","_section","NodeSettingsIniFile","message"],"sources":["../../src/nodeSettings.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport * as fs from 'fs'\nimport * as ini from 'ini'\nimport type { IApiSettings, IApiSection } from '@looker/sdk-rtl'\nimport {\n ApiConfigMap,\n ApiSettings,\n DefaultSettings,\n ValueSettings,\n sdkError,\n unquote,\n} from '@looker/sdk-rtl'\n\n/**\n * Read an environment key. Use defaultValue if it doesn't exist\n * @param {string} name Environment variable name\n * @param {string | undefined} defaultValue\n * @returns {string | undefined} The value of the environment variable if it exists, or defaultValue\n */\nexport const getenv = (\n name: string,\n defaultValue: string | undefined = undefined\n) => {\n const val = process.env[name]\n return val === undefined ? defaultValue : val\n}\n\n/**\n * Complete .INI file parse results\n */\nexport interface IApiConfig {\n [key: string]: any\n}\n\n/**\n * Parses `.ini` formatted content\n * @param contents formatted as an `.ini` file\n * @constructor\n */\nexport const ApiConfig = (contents: string): IApiConfig => ini.parse(contents)\n\n/**\n * Extract named or (default) first section from INI file\n * @param contents {string} Parameters formatted as an INI file\n * @param section {[key: string]: any;} Contents of INI section\n * @constructor\n */\nexport const ApiConfigSection = (\n contents: string,\n section?: string\n): IApiSection => {\n const config = ApiConfig(contents)\n if (!section) {\n // default to the first section if not specified\n section = Object.keys(config)[0]\n }\n const settings = config[section]\n if (!settings) {\n throw new Error(`No section named \"${section}\" was found`)\n }\n if (settings.api_version) {\n console.warn(\n 'api_version is no longer read from a configuration file by the SDK'\n )\n }\n return settings\n}\n\n/**\n * A utility function that loads environment variables and maps them to the standard configuration values\n *\n * @returns the populated `IApiSection`, which may be empty\n */\nexport const readEnvConfig = (envPrefix: string) => {\n const values: IApiSection = {}\n const configMap = ApiConfigMap(envPrefix)\n Object.keys(configMap).forEach((key) => {\n const envKey = configMap[key]\n if (process.env[envKey] !== undefined) {\n // Value exists. Map environment variable keys to config variable keys\n const val = unquote(process.env[envKey])\n values[key] = val\n }\n })\n return values\n}\n\n/**\n * A utility function that loads the configuration values from the specified file name and overrides them\n * with environment variable values, if the environment variables exist\n *\n * @param {string} fileName Name of configuration file to read\n * @param envPrefix environment variable prefix. Pass an empty string to skip environment reading.\n * @param {string} section Optional. Name of section of configuration file to read\n * @returns {IApiSection} containing the configuration values\n */\nexport const readIniConfig = (\n fileName: string,\n envPrefix: string,\n section?: string\n) => {\n // get environment variables\n let config = readEnvConfig(envPrefix)\n if (fileName && fs.existsSync(fileName)) {\n // override any config file settings with environment values if the environment value is set\n config = {\n ...ApiConfigSection(fs.readFileSync(fileName, 'utf8'), section),\n ...config,\n }\n }\n // Unquote any quoted configuration values\n Object.keys(config).forEach((key) => {\n const val = config[key]\n if (typeof val === 'string') {\n config[key] = unquote(val)\n }\n })\n return config\n}\n\n/**\n * Read configuration settings from Node environment variables\n *\n * This class initializes SDK settings **only** from the values passed in to its constructor and\n * (potentially) configured environment variables, and does not read a configuration file at all\n *\n * Any environment variables that **are** set, will override the values passed in to the constructor\n * with the same key\n *\n */\nexport class NodeSettings extends ApiSettings {\n protected readonly envPrefix!: string\n public section: string\n\n /**\n * Initialize config settings for the node SDK runtime\n * @param envPrefix Environment variable name prefix. Use empty string to not read the environment\n * @param contents contents of the read config\n * @param section name of ini section to process\n */\n constructor(\n envPrefix: string,\n contents?: string | IApiSettings,\n section?: string\n ) {\n let settings: IApiSettings\n if (contents) {\n if (typeof contents === 'string') {\n settings = ApiConfigSection(contents, section) as IApiSettings\n } else {\n settings = contents\n }\n settings = { ...readEnvConfig(envPrefix), ...settings }\n } else {\n settings = readEnvConfig(envPrefix) as IApiSettings\n }\n super({ ...DefaultSettings(), ...settings })\n this.section = section ?? ''\n this.envPrefix = envPrefix\n }\n\n /**\n * **NOTE**: If `envPrefix` is defined in the constructor, environment variables will be read in this call.\n *\n * @param _section section name is ignored here.\n */\n readConfig(_section?: string): IApiSection {\n return readEnvConfig(this.envPrefix)\n }\n}\n\n/**\n * Example class that reads a configuration from a file in node\n *\n * If `fileName` is not specified in the constructor, the default file name is `./looker.ini`\n *\n * **Warning**: `.ini` files storing credentials should be secured in the run-time environment, and\n * ignored by version control systems so credentials never get checked in to source code repositories.\n * A recommended pattern is using Node environment variables to specify confidential API credentials\n * while using an `.ini` file for values like `base_url`.\n *\n * **Note**: If the configuration file is specified but does **not** exist, an error will be thrown.\n * No error is thrown if the fileName defaulted to `./looker.ini` inside the constructor and that\n * file does not exist. In that case, configuration from environment variables will be required.\n *\n */\nexport class NodeSettingsIniFile extends NodeSettings {\n private readonly fileName!: string\n\n constructor(envPrefix: string, fileName = '', section?: string) {\n if (fileName && !fs.existsSync(fileName)) {\n throw sdkError({ message: `File ${fileName} was not found` })\n }\n // default fileName to looker.ini\n fileName = fileName || './looker.ini'\n const config = readIniConfig(fileName, envPrefix, section)\n const settings = ValueSettings(config, envPrefix)\n super(envPrefix, settings, section)\n this.fileName = fileName\n }\n\n /**\n * Read a configuration section and return it as a generic keyed collection\n * If the configuration file doesn't exist, environment variables will be used for the values\n * Environment variables, if set, also override the configuration file values\n *\n * **NOTE**: If `envPrefix` is defined in the constructor, environment variables will be read in this call.\n *\n * @param section {string} Name of Ini section to read. Optional. Defaults to first section.\n *\n */\n readConfig(section?: string): IApiSection {\n section = section || this.section\n return readIniConfig(this.fileName, this.envPrefix, section)\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"nodeSettings.js","names":["fs","ini","ApiConfigMap","ApiSettings","DefaultSettings","ValueSettings","sdkError","unquote","getenv","name","defaultValue","arguments","length","undefined","val","process","env","ApiConfig","contents","parse","ApiConfigSection","section","config","Object","keys","settings","Error","concat","api_version","console","warn","readEnvConfig","envPrefix","values","configMap","forEach","key","envKey","readIniConfig","fileName","existsSync","_objectSpread","readFileSync","NodeSettings","constructor","_defineProperty","readConfig","_section","NodeSettingsIniFile","message"],"sources":["../../src/nodeSettings.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport * as fs from 'fs';\nimport * as ini from 'ini';\nimport type { IApiSection, IApiSettings } from '@looker/sdk-rtl';\nimport {\n ApiConfigMap,\n ApiSettings,\n DefaultSettings,\n ValueSettings,\n sdkError,\n unquote,\n} from '@looker/sdk-rtl';\n\n/**\n * Read an environment key. Use defaultValue if it doesn't exist\n * @param {string} name Environment variable name\n * @param {string | undefined} defaultValue\n * @returns {string | undefined} The value of the environment variable if it exists, or defaultValue\n */\nexport const getenv = (\n name: string,\n defaultValue: string | undefined = undefined\n) => {\n const val = process.env[name];\n return val === undefined ? defaultValue : val;\n};\n\n/**\n * Complete .INI file parse results\n */\nexport interface IApiConfig {\n [key: string]: any;\n}\n\n/**\n * Parses `.ini` formatted content\n * @param contents formatted as an `.ini` file\n * @constructor\n */\nexport const ApiConfig = (contents: string): IApiConfig => ini.parse(contents);\n\n/**\n * Extract named or (default) first section from INI file\n * @param contents {string} Parameters formatted as an INI file\n * @param section {[key: string]: any;} Contents of INI section\n * @constructor\n */\nexport const ApiConfigSection = (\n contents: string,\n section?: string\n): IApiSection => {\n const config = ApiConfig(contents);\n if (!section) {\n // default to the first section if not specified\n section = Object.keys(config)[0];\n }\n const settings = config[section];\n if (!settings) {\n throw new Error(`No section named \"${section}\" was found`);\n }\n if (settings.api_version) {\n console.warn(\n 'api_version is no longer read from a configuration file by the SDK'\n );\n }\n return settings;\n};\n\n/**\n * A utility function that loads environment variables and maps them to the standard configuration values\n *\n * @returns the populated `IApiSection`, which may be empty\n */\nexport const readEnvConfig = (envPrefix: string) => {\n const values: IApiSection = {};\n const configMap = ApiConfigMap(envPrefix);\n Object.keys(configMap).forEach((key) => {\n const envKey = configMap[key];\n if (process.env[envKey] !== undefined) {\n // Value exists. Map environment variable keys to config variable keys\n const val = unquote(process.env[envKey]);\n values[key] = val;\n }\n });\n return values;\n};\n\n/**\n * A utility function that loads the configuration values from the specified file name and overrides them\n * with environment variable values, if the environment variables exist\n *\n * @param {string} fileName Name of configuration file to read\n * @param envPrefix environment variable prefix. Pass an empty string to skip environment reading.\n * @param {string} section Optional. Name of section of configuration file to read\n * @returns {IApiSection} containing the configuration values\n */\nexport const readIniConfig = (\n fileName: string,\n envPrefix: string,\n section?: string\n) => {\n // get environment variables\n let config = readEnvConfig(envPrefix);\n if (fileName && fs.existsSync(fileName)) {\n // override any config file settings with environment values if the environment value is set\n config = {\n ...ApiConfigSection(fs.readFileSync(fileName, 'utf8'), section),\n ...config,\n };\n }\n // Unquote any quoted configuration values\n Object.keys(config).forEach((key) => {\n const val = config[key];\n if (typeof val === 'string') {\n config[key] = unquote(val);\n }\n });\n return config;\n};\n\n/**\n * Read configuration settings from Node environment variables\n *\n * This class initializes SDK settings **only** from the values passed in to its constructor and\n * (potentially) configured environment variables, and does not read a configuration file at all\n *\n * Any environment variables that **are** set, will override the values passed in to the constructor\n * with the same key\n *\n */\nexport class NodeSettings extends ApiSettings {\n protected readonly envPrefix!: string;\n public section: string;\n\n /**\n * Initialize config settings for the node SDK runtime\n * @param envPrefix Environment variable name prefix. Use empty string to not read the environment\n * @param contents contents of the read config\n * @param section name of ini section to process\n */\n constructor(\n envPrefix: string,\n contents?: string | IApiSettings,\n section?: string\n ) {\n let settings: IApiSettings;\n if (contents) {\n if (typeof contents === 'string') {\n settings = ApiConfigSection(contents, section) as IApiSettings;\n } else {\n settings = contents;\n }\n settings = { ...readEnvConfig(envPrefix), ...settings };\n } else {\n settings = readEnvConfig(envPrefix) as IApiSettings;\n }\n super({ ...DefaultSettings(), ...settings });\n this.section = section ?? '';\n this.envPrefix = envPrefix;\n }\n\n /**\n * **NOTE**: If `envPrefix` is defined in the constructor, environment variables will be read in this call.\n *\n * @param _section section name is ignored here.\n */\n readConfig(_section?: string): IApiSection {\n return readEnvConfig(this.envPrefix);\n }\n}\n\n/**\n * Example class that reads a configuration from a file in node\n *\n * If `fileName` is not specified in the constructor, the default file name is `./looker.ini`\n *\n * **Warning**: `.ini` files storing credentials should be secured in the run-time environment, and\n * ignored by version control systems so credentials never get checked in to source code repositories.\n * A recommended pattern is using Node environment variables to specify confidential API credentials\n * while using an `.ini` file for values like `base_url`.\n *\n * **Note**: If the configuration file is specified but does **not** exist, an error will be thrown.\n * No error is thrown if the fileName defaulted to `./looker.ini` inside the constructor and that\n * file does not exist. In that case, configuration from environment variables will be required.\n *\n */\nexport class NodeSettingsIniFile extends NodeSettings {\n private readonly fileName!: string;\n\n constructor(envPrefix: string, fileName = '', section?: string) {\n if (fileName && !fs.existsSync(fileName)) {\n throw sdkError({ message: `File ${fileName} was not found` });\n }\n // default fileName to looker.ini\n fileName = fileName || './looker.ini';\n const config = readIniConfig(fileName, envPrefix, section);\n const settings = ValueSettings(config, envPrefix);\n super(envPrefix, settings, section);\n this.fileName = fileName;\n }\n\n /**\n * Read a configuration section and return it as a generic keyed collection\n * If the configuration file doesn't exist, environment variables will be used for the values\n * Environment variables, if set, also override the configuration file values\n *\n * **NOTE**: If `envPrefix` is defined in the constructor, environment variables will be read in this call.\n *\n * @param section {string} Name of Ini section to read. Optional. Defaults to first section.\n *\n */\n readConfig(section?: string): IApiSection {\n section = section || this.section;\n return readIniConfig(this.fileName, this.envPrefix, section);\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3
3
  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; }
4
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
5
- 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); }
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
5
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
6
  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); } }
7
7
  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); }); }; }
8
8
  import nodeCrypto from 'crypto';
@@ -10,7 +10,7 @@ import rq from 'request';
10
10
  import rp from 'request-promise-native';
11
11
  import { PassThrough } from 'readable-stream';
12
12
  import { StatusCodeError } from 'request-promise-native/errors';
13
- import { BaseTransport, ResponseMode, defaultTimeout, responseMode, trace, LookerAppId, agentPrefix, safeBase64 } from '@looker/sdk-rtl';
13
+ import { BaseTransport, LookerAppId, ResponseMode, agentPrefix, defaultTimeout, responseMode, safeBase64, trace } from '@looker/sdk-rtl';
14
14
  var utf8 = 'utf8';
15
15
  var asString = value => {
16
16
  if (value instanceof Buffer) {
@@ -1 +1 @@
1
- {"version":3,"file":"nodeTransport.js","names":["nodeCrypto","rq","rp","PassThrough","StatusCodeError","BaseTransport","ResponseMode","defaultTimeout","responseMode","trace","LookerAppId","agentPrefix","safeBase64","utf8","asString","value","Buffer","from","toString","Object","JSON","stringify","NodeCryptoHash","secureRandom","byteCount","randomBytes","sha256Hash","message","_asyncToGenerator","hash","createHash","update","Uint8Array","digest","NodeTransport","constructor","options","rawRequest","method","path","queryParams","body","authenticator","_this","init","initRequest","req","promise","rawResponse","requestStarted","Date","now","responseCompleted","res","resTyped","url","contentType","String","headers","ok","statusCode","statusMessage","e","concat","error","observer","parseResponse","mode","response","parse","_unused","result","string","match","err","_result","request","_this2","type","requestor","props","_props$method","toUpperCase","get","put","post","patch","head","stream","callback","_this3","returnPromise","streamPromise","Promise","resolve","reject","hasResolved","on","code","socket","setKeepAlive","pipe","results","all","verifySsl","verify_ssl","timeout","_this4","_objectSpread","agentTag","requestPath","makeUrl","undefined","encoding","json","rejectUnauthorized","resolveWithFullResponse"],"sources":["../../src/nodeTransport.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 nodeCrypto from 'crypto'\nimport type { Request } from 'request'\nimport rq from 'request'\n\nimport rp from 'request-promise-native'\nimport type { Readable } from 'readable-stream'\nimport { PassThrough } from 'readable-stream'\nimport { StatusCodeError } from 'request-promise-native/errors'\nimport {\n BaseTransport,\n ResponseMode,\n defaultTimeout,\n responseMode,\n trace,\n LookerAppId,\n agentPrefix,\n safeBase64,\n} from '@looker/sdk-rtl'\nimport type {\n Authenticator,\n HttpMethod,\n ISDKError,\n ITransportSettings,\n SDKResponse,\n Values,\n IRequestHeaders,\n IRawResponse,\n ICryptoHash,\n} from '@looker/sdk-rtl'\n\nconst utf8 = 'utf8'\n\nconst asString = (value: any): string => {\n if (value instanceof Buffer) {\n return Buffer.from(value).toString(utf8)\n }\n if (value instanceof Object) {\n return JSON.stringify(value)\n }\n return value.toString()\n}\n\nexport class NodeCryptoHash implements ICryptoHash {\n secureRandom(byteCount: number): string {\n // TODO update this to Node 18\n return nodeCrypto.randomBytes(byteCount).toString('hex')\n }\n\n async sha256Hash(message: string): Promise<string> {\n const hash = nodeCrypto.createHash('sha256')\n hash.update(message)\n return safeBase64(new Uint8Array(hash.digest()))\n }\n}\n\nexport type RequestOptions = rq.RequiredUriUrl &\n rp.RequestPromiseOptions &\n rq.OptionsWithUrl\n\nexport class NodeTransport extends BaseTransport {\n constructor(protected readonly options: ITransportSettings) {\n super(options)\n }\n\n async rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse> {\n const init: RequestOptions = await this.initRequest(\n method,\n path,\n queryParams,\n body,\n authenticator,\n options\n )\n const req = rp(init).promise()\n let rawResponse: IRawResponse\n\n const requestStarted = Date.now()\n let responseCompleted\n try {\n const res = await req\n responseCompleted = Date.now()\n const resTyped = res as rq.Response\n rawResponse = {\n method,\n url: resTyped.url || init.url.toString() || '',\n body: await resTyped.body,\n contentType: String(resTyped.headers['content-type']),\n ok: true,\n statusCode: resTyped.statusCode,\n statusMessage: resTyped.statusMessage,\n headers: res.headers,\n requestStarted,\n responseCompleted,\n }\n // Update OK with response statusCode check\n rawResponse.ok = this.ok(rawResponse)\n } catch (e: any) {\n let statusMessage = `${method} ${path}`\n let statusCode = 404\n let contentType = 'text'\n let body\n responseCompleted = Date.now()\n if (e instanceof StatusCodeError) {\n statusCode = e.statusCode\n if (e.error instanceof Buffer) {\n body = asString(e.error)\n statusMessage += `: ${statusCode}`\n } else if (e.error instanceof Object) {\n // Capture error object as body\n body = e.error\n statusMessage += `: ${e.message}`\n // Clarify the error message\n body.message = statusMessage\n contentType = 'application/json'\n }\n } else if (e.error instanceof Buffer) {\n body = asString(e.error)\n } else {\n body = JSON.stringify(e)\n contentType = 'application/json'\n }\n rawResponse = {\n method,\n url: init.url.toString(),\n body,\n contentType,\n ok: false,\n statusCode,\n statusMessage,\n headers: {},\n requestStarted,\n responseCompleted,\n }\n }\n return this.observer ? this.observer(rawResponse) : rawResponse\n }\n\n async parseResponse<TSuccess, TError>(res: IRawResponse) {\n const mode = responseMode(res.contentType)\n let response: SDKResponse<TSuccess, TError>\n let error\n if (!res.ok) {\n // Raw request had an error. Make sure it's a string before parsing the result\n error = res.body\n if (typeof error === 'string') {\n try {\n error = JSON.parse(error)\n } catch {\n error = { message: `Request failed: ${error}` }\n }\n }\n response = { ok: false, error }\n return response\n }\n let result = await res.body\n if (mode === ResponseMode.string) {\n if (res.contentType.match(/^application\\/.*\\bjson\\b/g)) {\n try {\n if (result instanceof Buffer) {\n result = Buffer.from(result).toString(utf8)\n }\n if (!(result instanceof Object)) {\n result = JSON.parse(result.toString())\n }\n } catch (err) {\n error = err\n }\n } else if (!error) {\n // Convert to string otherwise\n result = asString(result)\n }\n } else {\n try {\n result = Buffer.from(result ?? '').toString('binary')\n } catch (err) {\n error = err\n }\n }\n if (!error) {\n response = { ok: true, value: result }\n } else {\n response = { ok: false, error: error as TError }\n }\n return response\n }\n\n async 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 try {\n const res = await this.rawRequest(\n method,\n path,\n queryParams,\n body,\n authenticator,\n options\n )\n return await this.parseResponse<TSuccess, TError>(res)\n } catch (e: any) {\n const error: ISDKError = {\n message:\n typeof e.message === 'string'\n ? e.message\n : `The SDK call was not successful. The error was '${e}'.`,\n type: 'sdk_error',\n }\n return { error, ok: false }\n }\n }\n\n /**\n * Http method dispatcher from general-purpose request properties\n * @param props\n * @returns {request.Request}\n */\n protected requestor(props: RequestOptions): Request {\n const method = props.method?.toString().toUpperCase() as HttpMethod\n switch (method) {\n case 'GET':\n return rq.get(props)\n case 'PUT':\n return rq.put(props)\n case 'POST':\n return rq.post(props)\n case 'PATCH':\n return rq.patch(props)\n case 'DELETE':\n return rq.put(props)\n case 'HEAD':\n return rq.head(props)\n default:\n return rq.get(props)\n }\n }\n\n async stream<TSuccess>(\n callback: (readable: Readable) => Promise<TSuccess>,\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<TSuccess> {\n const stream = new PassThrough()\n const returnPromise = callback(stream)\n const init = await this.initRequest(\n method,\n path,\n queryParams,\n body,\n authenticator,\n options\n )\n\n const streamPromise = new Promise<void>((resolve, reject) => {\n trace(`[stream] beginning stream via download url`, init)\n let hasResolved = false\n const req = this.requestor(init)\n\n req\n .on('error', (err) => {\n if (hasResolved && (err as any).code === 'ECONNRESET') {\n trace(\n 'ignoring ECONNRESET that occurred after streaming finished',\n init\n )\n } else {\n trace('streaming error', err)\n reject(err)\n }\n })\n .on('finish', () => {\n trace(`[stream] streaming via download url finished`, init)\n })\n .on('socket', (socket) => {\n trace(`[stream] setting keepalive on socket`, init)\n socket.setKeepAlive(true)\n })\n .on('abort', () => {\n trace(`[stream] streaming via download url aborted`, init)\n })\n .on('response', () => {\n trace(`[stream] got response from download url`, init)\n })\n .on('close', () => {\n trace(`[stream] request stream closed`, init)\n })\n .pipe(stream)\n .on('error', (err) => {\n trace(`[stream] PassThrough stream error`, err)\n reject(err)\n })\n .on('finish', () => {\n trace(`[stream] PassThrough stream finished`, init)\n resolve()\n hasResolved = true\n })\n .on('close', () => {\n trace(`[stream] PassThrough stream closed`, init)\n })\n })\n\n const results = await Promise.all([returnPromise, streamPromise])\n return results[0]\n }\n\n /**\n * should the request verify SSL?\n * @param {Partial<ITransportSettings>} options Defaults to the instance options values\n * @returns {boolean} true if the request should require full SSL verification\n */\n verifySsl(options?: Partial<ITransportSettings>) {\n if (!options) options = this.options\n return 'verify_ssl' in options ? options.verify_ssl : true\n }\n\n /**\n * Request timeout in seconds\n * @param {Partial<ITransportSettings>} options Defaults to the instance options values\n * @returns {number | undefined}\n */\n timeout(options?: Partial<ITransportSettings>): number {\n if (!options) options = this.options\n if ('timeout' in options && options.timeout) return options.timeout\n return defaultTimeout\n }\n\n private async initRequest(\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ) {\n options = options ? { ...this.options, ...options } : this.options\n if (!options.agentTag) {\n options.agentTag = agentPrefix\n }\n const headers: IRequestHeaders = {\n [LookerAppId]: options.agentTag,\n ...options.headers,\n }\n\n const requestPath = this.makeUrl(path, options, queryParams)\n let init: RequestOptions = {\n body: body || undefined,\n encoding: null,\n headers: headers,\n json: body && typeof body !== 'string',\n // null = requests are returned as binary so `Content-Type` dictates response format\n method,\n\n rejectUnauthorized: this.verifySsl(options),\n\n // If body is a string, pass as is\n resolveWithFullResponse: true,\n\n timeout: this.timeout(options) * 1000,\n url: requestPath,\n }\n if ('encoding' in options) init.encoding = options.encoding\n\n if (authenticator) {\n // Automatic authentication process for the request\n init = await authenticator(init)\n }\n return init\n }\n\n // /**\n // * A streaming helper for the \"json\" data format. It handles automatically parsing\n // * the JSON in a streaming fashion. You just need to implement a function that will\n // * be called for each row.\n // *\n // * ```ts\n // * await request.streamJson((row) => {\n // * // This will be called for each row of data\n // * })\n // * ```\n // *\n // * @returns A promise that will be resolved when streaming is complete.\n // * @param onRow A function that will be called for each streamed row, with the row as the first argument.\n // */\n // async streamJson(onRow: (row: { [fieldName: string]: any }) => void) {\n // return new Promise<void>((resolve, reject) => {\n // let rows = 0\n // this.stream(async (readable) => {\n // oboe(readable)\n // .node(\"![*]\", this.safeOboe(readable, reject, (row) => {\n // rows++\n // onRow(row)\n // }))\n // .done(() => {\n // winston.info(`[streamJson] oboe reports done`, {...this.logInfo, rows})\n // })\n // }).then(() => {\n // winston.info(`[streamJson] complete`, {...this.logInfo, rows})\n // resolve()\n // }).catch((error) => {\n // // This error should not be logged as it could come from an action\n // // which might decide to include user information in the error message\n // winston.info(`[streamJson] reported an error`, {...this.logInfo, rows})\n // reject(error)\n // })\n // })\n // }\n //\n // /**\n // * A streaming helper for the \"json_detail\" data format. It handles automatically parsing\n // * the JSON in a streaming fashion. You can implement an `onFields` callback to get\n // * the field metadata, and an `onRow` callback for each row of data.\n // *\n // * ```ts\n // * await request.streamJsonDetail({\n // * onFields: (fields) => {\n // * // This will be called when fields are available\n // * },\n // * onRow: (row) => {\n // * // This will be called for each row of data\n // * },\n // * })\n // * ```\n // *\n // * @returns A promise that will be resolved when streaming is complete.\n // * @param callbacks An object consisting of several callbacks that will be called\n // * when various parts of the data are parsed.\n // */\n // async streamJsonDetail(callbacks: {\n // onRow: (row: JsonDetailRow) => void,\n // onFields?: (fields: Fieldset) => void,\n // onRanAt?: (iso8601string: string) => void,\n // }) {\n // return new Promise<void>((resolve, reject) => {\n // let rows = 0\n // this.stream(async (readable) => {\n // oboe(readable)\n // .node(\"data.*\", this.safeOboe(readable, reject, (row) => {\n // rows++\n // callbacks.onRow(row)\n // }))\n // .node(\"!.fields\", this.safeOboe(readable, reject, (fields) => {\n // if (callbacks.onFields) {\n // callbacks.onFields(fields)\n // }\n // }))\n // .node(\"!.ran_at\", this.safeOboe(readable, reject, (ranAt) => {\n // if (callbacks.onRanAt) {\n // callbacks.onRanAt(ranAt)\n // }\n // }))\n // .done(() => {\n // winston.info(`[streamJsonDetail] oboe reports done`, {...this.logInfo, rows})\n // })\n // }).then(() => {\n // winston.info(`[streamJsonDetail] complete`, {...this.logInfo, rows})\n // resolve()\n // }).catch((error) => {\n // // This error should not be logged as it could come from an action\n // // which might decide to include user information in the error message\n // winston.info(`[streamJsonDetail] reported an error`, {...this.logInfo, rows})\n // reject(error)\n // })\n // })\n // }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"nodeTransport.js","names":["nodeCrypto","rq","rp","PassThrough","StatusCodeError","BaseTransport","LookerAppId","ResponseMode","agentPrefix","defaultTimeout","responseMode","safeBase64","trace","utf8","asString","value","Buffer","from","toString","Object","JSON","stringify","NodeCryptoHash","secureRandom","byteCount","randomBytes","sha256Hash","message","_asyncToGenerator","hash","createHash","update","Uint8Array","digest","NodeTransport","constructor","options","rawRequest","method","path","queryParams","body","authenticator","_this","init","initRequest","req","promise","rawResponse","requestStarted","Date","now","responseCompleted","res","resTyped","url","contentType","String","headers","ok","statusCode","statusMessage","e","concat","error","observer","parseResponse","mode","response","parse","_unused","result","string","match","err","_result","request","_this2","type","requestor","props","_props$method","toUpperCase","get","put","post","patch","head","stream","callback","_this3","returnPromise","streamPromise","Promise","resolve","reject","hasResolved","on","code","socket","setKeepAlive","pipe","results","all","verifySsl","verify_ssl","timeout","_this4","_objectSpread","agentTag","requestPath","makeUrl","undefined","encoding","json","rejectUnauthorized","resolveWithFullResponse"],"sources":["../../src/nodeTransport.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 nodeCrypto from 'crypto';\nimport type { Request } from 'request';\nimport rq from 'request';\n\nimport rp from 'request-promise-native';\nimport type { Readable } from 'readable-stream';\nimport { PassThrough } from 'readable-stream';\nimport { StatusCodeError } from 'request-promise-native/errors';\nimport {\n BaseTransport,\n LookerAppId,\n ResponseMode,\n agentPrefix,\n defaultTimeout,\n responseMode,\n safeBase64,\n trace,\n} from '@looker/sdk-rtl';\nimport type {\n Authenticator,\n HttpMethod,\n ICryptoHash,\n IRawResponse,\n IRequestHeaders,\n ISDKError,\n ITransportSettings,\n SDKResponse,\n Values,\n} from '@looker/sdk-rtl';\n\nconst utf8 = 'utf8';\n\nconst asString = (value: any): string => {\n if (value instanceof Buffer) {\n return Buffer.from(value).toString(utf8);\n }\n if (value instanceof Object) {\n return JSON.stringify(value);\n }\n return value.toString();\n};\n\nexport class NodeCryptoHash implements ICryptoHash {\n secureRandom(byteCount: number): string {\n // TODO update this to Node 18\n return nodeCrypto.randomBytes(byteCount).toString('hex');\n }\n\n async sha256Hash(message: string): Promise<string> {\n const hash = nodeCrypto.createHash('sha256');\n hash.update(message);\n return safeBase64(new Uint8Array(hash.digest()));\n }\n}\n\nexport type RequestOptions = rq.RequiredUriUrl &\n rp.RequestPromiseOptions &\n rq.OptionsWithUrl;\n\nexport class NodeTransport extends BaseTransport {\n constructor(protected readonly options: ITransportSettings) {\n super(options);\n }\n\n async rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse> {\n const init: RequestOptions = await this.initRequest(\n method,\n path,\n queryParams,\n body,\n authenticator,\n options\n );\n const req = rp(init).promise();\n let rawResponse: IRawResponse;\n\n const requestStarted = Date.now();\n let responseCompleted;\n try {\n const res = await req;\n responseCompleted = Date.now();\n const resTyped = res as rq.Response;\n rawResponse = {\n method,\n url: resTyped.url || init.url.toString() || '',\n body: await resTyped.body,\n contentType: String(resTyped.headers['content-type']),\n ok: true,\n statusCode: resTyped.statusCode,\n statusMessage: resTyped.statusMessage,\n headers: res.headers,\n requestStarted,\n responseCompleted,\n };\n // Update OK with response statusCode check\n rawResponse.ok = this.ok(rawResponse);\n } catch (e: any) {\n let statusMessage = `${method} ${path}`;\n let statusCode = 404;\n let contentType = 'text';\n let body;\n responseCompleted = Date.now();\n if (e instanceof StatusCodeError) {\n statusCode = e.statusCode;\n if (e.error instanceof Buffer) {\n body = asString(e.error);\n statusMessage += `: ${statusCode}`;\n } else if (e.error instanceof Object) {\n // Capture error object as body\n body = e.error;\n statusMessage += `: ${e.message}`;\n // Clarify the error message\n body.message = statusMessage;\n contentType = 'application/json';\n }\n } else if (e.error instanceof Buffer) {\n body = asString(e.error);\n } else {\n body = JSON.stringify(e);\n contentType = 'application/json';\n }\n rawResponse = {\n method,\n url: init.url.toString(),\n body,\n contentType,\n ok: false,\n statusCode,\n statusMessage,\n headers: {},\n requestStarted,\n responseCompleted,\n };\n }\n return this.observer ? this.observer(rawResponse) : rawResponse;\n }\n\n async parseResponse<TSuccess, TError>(res: IRawResponse) {\n const mode = responseMode(res.contentType);\n let response: SDKResponse<TSuccess, TError>;\n let error;\n if (!res.ok) {\n // Raw request had an error. Make sure it's a string before parsing the result\n error = res.body;\n if (typeof error === 'string') {\n try {\n error = JSON.parse(error);\n } catch {\n error = { message: `Request failed: ${error}` };\n }\n }\n response = { ok: false, error };\n return response;\n }\n let result = await res.body;\n if (mode === ResponseMode.string) {\n if (res.contentType.match(/^application\\/.*\\bjson\\b/g)) {\n try {\n if (result instanceof Buffer) {\n result = Buffer.from(result).toString(utf8);\n }\n if (!(result instanceof Object)) {\n result = JSON.parse(result.toString());\n }\n } catch (err) {\n error = err;\n }\n } else if (!error) {\n // Convert to string otherwise\n result = asString(result);\n }\n } else {\n try {\n result = Buffer.from(result ?? '').toString('binary');\n } catch (err) {\n error = err;\n }\n }\n if (!error) {\n response = { ok: true, value: result };\n } else {\n response = { ok: false, error: error as TError };\n }\n return response;\n }\n\n async 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 try {\n const res = await this.rawRequest(\n method,\n path,\n queryParams,\n body,\n authenticator,\n options\n );\n return await this.parseResponse<TSuccess, TError>(res);\n } catch (e: any) {\n const error: ISDKError = {\n message:\n typeof e.message === 'string'\n ? e.message\n : `The SDK call was not successful. The error was '${e}'.`,\n type: 'sdk_error',\n };\n return { error, ok: false };\n }\n }\n\n /**\n * Http method dispatcher from general-purpose request properties\n * @param props\n * @returns {request.Request}\n */\n protected requestor(props: RequestOptions): Request {\n const method = props.method?.toString().toUpperCase() as HttpMethod;\n switch (method) {\n case 'GET':\n return rq.get(props);\n case 'PUT':\n return rq.put(props);\n case 'POST':\n return rq.post(props);\n case 'PATCH':\n return rq.patch(props);\n case 'DELETE':\n return rq.put(props);\n case 'HEAD':\n return rq.head(props);\n default:\n return rq.get(props);\n }\n }\n\n async stream<TSuccess>(\n callback: (readable: Readable) => Promise<TSuccess>,\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<TSuccess> {\n const stream = new PassThrough();\n const returnPromise = callback(stream);\n const init = await this.initRequest(\n method,\n path,\n queryParams,\n body,\n authenticator,\n options\n );\n\n const streamPromise = new Promise<void>((resolve, reject) => {\n trace(`[stream] beginning stream via download url`, init);\n let hasResolved = false;\n const req = this.requestor(init);\n\n req\n .on('error', (err) => {\n if (hasResolved && (err as any).code === 'ECONNRESET') {\n trace(\n 'ignoring ECONNRESET that occurred after streaming finished',\n init\n );\n } else {\n trace('streaming error', err);\n reject(err);\n }\n })\n .on('finish', () => {\n trace(`[stream] streaming via download url finished`, init);\n })\n .on('socket', (socket) => {\n trace(`[stream] setting keepalive on socket`, init);\n socket.setKeepAlive(true);\n })\n .on('abort', () => {\n trace(`[stream] streaming via download url aborted`, init);\n })\n .on('response', () => {\n trace(`[stream] got response from download url`, init);\n })\n .on('close', () => {\n trace(`[stream] request stream closed`, init);\n })\n .pipe(stream)\n .on('error', (err) => {\n trace(`[stream] PassThrough stream error`, err);\n reject(err);\n })\n .on('finish', () => {\n trace(`[stream] PassThrough stream finished`, init);\n resolve();\n hasResolved = true;\n })\n .on('close', () => {\n trace(`[stream] PassThrough stream closed`, init);\n });\n });\n\n const results = await Promise.all([returnPromise, streamPromise]);\n return results[0];\n }\n\n /**\n * should the request verify SSL?\n * @param {Partial<ITransportSettings>} options Defaults to the instance options values\n * @returns {boolean} true if the request should require full SSL verification\n */\n verifySsl(options?: Partial<ITransportSettings>) {\n if (!options) options = this.options;\n return 'verify_ssl' in options ? options.verify_ssl : true;\n }\n\n /**\n * Request timeout in seconds\n * @param {Partial<ITransportSettings>} options Defaults to the instance options values\n * @returns {number | undefined}\n */\n timeout(options?: Partial<ITransportSettings>): number {\n if (!options) options = this.options;\n if ('timeout' in options && options.timeout) return options.timeout;\n return defaultTimeout;\n }\n\n private async initRequest(\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ) {\n options = options ? { ...this.options, ...options } : this.options;\n if (!options.agentTag) {\n options.agentTag = agentPrefix;\n }\n const headers: IRequestHeaders = {\n [LookerAppId]: options.agentTag,\n ...options.headers,\n };\n\n const requestPath = this.makeUrl(path, options, queryParams);\n let init: RequestOptions = {\n body: body || undefined,\n encoding: null,\n headers: headers,\n json: body && typeof body !== 'string',\n // null = requests are returned as binary so `Content-Type` dictates response format\n method,\n\n rejectUnauthorized: this.verifySsl(options),\n\n // If body is a string, pass as is\n resolveWithFullResponse: true,\n\n timeout: this.timeout(options) * 1000,\n url: requestPath,\n };\n if ('encoding' in options) init.encoding = options.encoding;\n\n if (authenticator) {\n // Automatic authentication process for the request\n init = await authenticator(init);\n }\n return init;\n }\n\n // /**\n // * A streaming helper for the \"json\" data format. It handles automatically parsing\n // * the JSON in a streaming fashion. You just need to implement a function that will\n // * be called for each row.\n // *\n // * ```ts\n // * await request.streamJson((row) => {\n // * // This will be called for each row of data\n // * })\n // * ```\n // *\n // * @returns A promise that will be resolved when streaming is complete.\n // * @param onRow A function that will be called for each streamed row, with the row as the first argument.\n // */\n // async streamJson(onRow: (row: { [fieldName: string]: any }) => void) {\n // return new Promise<void>((resolve, reject) => {\n // let rows = 0\n // this.stream(async (readable) => {\n // oboe(readable)\n // .node(\"![*]\", this.safeOboe(readable, reject, (row) => {\n // rows++\n // onRow(row)\n // }))\n // .done(() => {\n // winston.info(`[streamJson] oboe reports done`, {...this.logInfo, rows})\n // })\n // }).then(() => {\n // winston.info(`[streamJson] complete`, {...this.logInfo, rows})\n // resolve()\n // }).catch((error) => {\n // // This error should not be logged as it could come from an action\n // // which might decide to include user information in the error message\n // winston.info(`[streamJson] reported an error`, {...this.logInfo, rows})\n // reject(error)\n // })\n // })\n // }\n //\n // /**\n // * A streaming helper for the \"json_detail\" data format. It handles automatically parsing\n // * the JSON in a streaming fashion. You can implement an `onFields` callback to get\n // * the field metadata, and an `onRow` callback for each row of data.\n // *\n // * ```ts\n // * await request.streamJsonDetail({\n // * onFields: (fields) => {\n // * // This will be called when fields are available\n // * },\n // * onRow: (row) => {\n // * // This will be called for each row of data\n // * },\n // * })\n // * ```\n // *\n // * @returns A promise that will be resolved when streaming is complete.\n // * @param callbacks An object consisting of several callbacks that will be called\n // * when various parts of the data are parsed.\n // */\n // async streamJsonDetail(callbacks: {\n // onRow: (row: JsonDetailRow) => void,\n // onFields?: (fields: Fieldset) => void,\n // onRanAt?: (iso8601string: string) => void,\n // }) {\n // return new Promise<void>((resolve, reject) => {\n // let rows = 0\n // this.stream(async (readable) => {\n // oboe(readable)\n // .node(\"data.*\", this.safeOboe(readable, reject, (row) => {\n // rows++\n // callbacks.onRow(row)\n // }))\n // .node(\"!.fields\", this.safeOboe(readable, reject, (fields) => {\n // if (callbacks.onFields) {\n // callbacks.onFields(fields)\n // }\n // }))\n // .node(\"!.ran_at\", this.safeOboe(readable, reject, (ranAt) => {\n // if (callbacks.onRanAt) {\n // callbacks.onRanAt(ranAt)\n // }\n // }))\n // .done(() => {\n // winston.info(`[streamJsonDetail] oboe reports done`, {...this.logInfo, rows})\n // })\n // }).then(() => {\n // winston.info(`[streamJsonDetail] complete`, {...this.logInfo, rows})\n // resolve()\n // }).catch((error) => {\n // // This error should not be logged as it could come from an action\n // // which might decide to include user information in the error message\n // winston.info(`[streamJsonDetail] reported an error`, {...this.logInfo, rows})\n // reject(error)\n // })\n // })\n // }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/testUtils/index.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nexport * from './testUtils'\n"],"mappings":"AA0BA,cAAc,aAAa"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/testUtils/index.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nexport * from './testUtils';\n"],"mappings":"AA0BA,cAAc,aAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.js","names":["fs","path","config","readIniConfig","utf8","homeToRoost","getRootPath","join","__dirname","rootFile","fileName","arguments","length","undefined","TestConfig","rootPath","testFile","envPrefix","sectionName","localIni","process","env","LOOKERSDK_INI","testPath","dataFile","concat","testData","JSON","parse","readFileSync","testIni","iniFile","section","baseUrl","base_url","timeout","parseInt","testSection","existsSync"],"sources":["../../../src/testUtils/testUtils.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport * as fs from 'fs'\nimport path from 'path'\nimport { config } from 'dotenv'\nimport { readIniConfig } from '../nodeSettings'\n\ninterface IKeyAny {\n [key: string]: any\n}\n\nconst utf8 = 'utf-8'\n\n/**\n * Properties used for various typescript-based tests\n */\nexport interface ITestConfig {\n rootPath: string\n testPath: string\n dataFile: string\n localIni: string\n baseUrl: string\n timeout: number\n testData: any\n testIni: string\n section: IKeyAny\n testSection: IKeyAny\n}\n\nconst homeToRoost = '../../../../'\n\nexport const getRootPath = () => path.join(__dirname, homeToRoost)\nexport const rootFile = (fileName = '') => path.join(getRootPath(), fileName)\n\n/**\n * Reads configuration information, returning various test values\n * @param {string} rootPath\n * @returns {{testConfig: {[p: string]: any}; localIni: string; baseUrl: any; testData: any; apiVersion: any; testIni: string; configContents: string; rootPath: string; testSection: any; timeout: number}}\n * @constructor\n */\nexport const TestConfig = (rootPath = ''): ITestConfig => {\n config()\n const testFile = 'data.yml.json'\n const envPrefix = 'LOOKERSDK'\n const sectionName = 'Looker'\n rootPath = rootPath || getRootPath()\n let localIni = process.env.LOOKERSDK_INI || rootFile('looker.ini')\n const testPath = rootFile('test/')\n const dataFile = `${testPath}${testFile}`\n const testData = JSON.parse(fs.readFileSync(dataFile, utf8))\n let testIni = `${rootPath}${testData.iniFile}`\n const section = readIniConfig(localIni, envPrefix, sectionName)\n const baseUrl = section.base_url\n const timeout = parseInt(section.timeout, 10)\n const testSection = readIniConfig(localIni, envPrefix, sectionName)\n\n // If .ini files don't exist, don't try to read them downstream and expect environment variables to be set\n if (!fs.existsSync(localIni)) localIni = ''\n if (!fs.existsSync(testIni)) testIni = ''\n\n return {\n baseUrl,\n dataFile,\n localIni,\n rootPath,\n section,\n testData,\n testIni,\n testPath,\n testSection,\n timeout,\n }\n}\n"],"mappings":"AA0BA,OAAO,KAAKA,EAAE,MAAM,IAAI;AACxB,OAAOC,IAAI,MAAM,MAAM;AACvB,SAASC,MAAM,QAAQ,QAAQ;AAC/B,SAASC,aAAa,QAAQ,iBAAiB;AAM/C,IAAMC,IAAI,GAAG,OAAO;AAkBpB,IAAMC,WAAW,GAAG,cAAc;AAElC,OAAO,IAAMC,WAAW,GAAGA,CAAA,KAAML,IAAI,CAACM,IAAI,CAACC,SAAS,EAAEH,WAAW,CAAC;AAClE,OAAO,IAAMI,QAAQ,GAAG,SAAXA,QAAQA,CAAA;EAAA,IAAIC,QAAQ,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;EAAA,OAAKV,IAAI,CAACM,IAAI,CAACD,WAAW,CAAC,CAAC,EAAEI,QAAQ,CAAC;AAAA;AAQ7E,OAAO,IAAMI,UAAU,GAAG,SAAbA,UAAUA,CAAA,EAAmC;EAAA,IAA/BC,QAAQ,GAAAJ,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;EACtCT,MAAM,CAAC,CAAC;EACR,IAAMc,QAAQ,GAAG,eAAe;EAChC,IAAMC,SAAS,GAAG,WAAW;EAC7B,IAAMC,WAAW,GAAG,QAAQ;EAC5BH,QAAQ,GAAGA,QAAQ,IAAIT,WAAW,CAAC,CAAC;EACpC,IAAIa,QAAQ,GAAGC,OAAO,CAACC,GAAG,CAACC,aAAa,IAAIb,QAAQ,CAAC,YAAY,CAAC;EAClE,IAAMc,QAAQ,GAAGd,QAAQ,CAAC,OAAO,CAAC;EAClC,IAAMe,QAAQ,MAAAC,MAAA,CAAMF,QAAQ,EAAAE,MAAA,CAAGT,QAAQ,CAAE;EACzC,IAAMU,QAAQ,GAAGC,IAAI,CAACC,KAAK,CAAC5B,EAAE,CAAC6B,YAAY,CAACL,QAAQ,EAAEpB,IAAI,CAAC,CAAC;EAC5D,IAAI0B,OAAO,MAAAL,MAAA,CAAMV,QAAQ,EAAAU,MAAA,CAAGC,QAAQ,CAACK,OAAO,CAAE;EAC9C,IAAMC,OAAO,GAAG7B,aAAa,CAACgB,QAAQ,EAAEF,SAAS,EAAEC,WAAW,CAAC;EAC/D,IAAMe,OAAO,GAAGD,OAAO,CAACE,QAAQ;EAChC,IAAMC,OAAO,GAAGC,QAAQ,CAACJ,OAAO,CAACG,OAAO,EAAE,EAAE,CAAC;EAC7C,IAAME,WAAW,GAAGlC,aAAa,CAACgB,QAAQ,EAAEF,SAAS,EAAEC,WAAW,CAAC;EAGnE,IAAI,CAAClB,EAAE,CAACsC,UAAU,CAACnB,QAAQ,CAAC,EAAEA,QAAQ,GAAG,EAAE;EAC3C,IAAI,CAACnB,EAAE,CAACsC,UAAU,CAACR,OAAO,CAAC,EAAEA,OAAO,GAAG,EAAE;EAEzC,OAAO;IACLG,OAAO;IACPT,QAAQ;IACRL,QAAQ;IACRJ,QAAQ;IACRiB,OAAO;IACPN,QAAQ;IACRI,OAAO;IACPP,QAAQ;IACRc,WAAW;IACXF;EACF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"testUtils.js","names":["fs","path","config","readIniConfig","utf8","homeToRoost","getRootPath","join","__dirname","rootFile","fileName","arguments","length","undefined","TestConfig","rootPath","testFile","envPrefix","sectionName","localIni","process","env","LOOKERSDK_INI","testPath","dataFile","concat","testData","JSON","parse","readFileSync","testIni","iniFile","section","baseUrl","base_url","timeout","parseInt","testSection","existsSync"],"sources":["../../../src/testUtils/testUtils.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport * as fs from 'fs';\nimport path from 'path';\nimport { config } from 'dotenv';\nimport { readIniConfig } from '../nodeSettings';\n\ninterface IKeyAny {\n [key: string]: any;\n}\n\nconst utf8 = 'utf-8';\n\n/**\n * Properties used for various typescript-based tests\n */\nexport interface ITestConfig {\n rootPath: string;\n testPath: string;\n dataFile: string;\n localIni: string;\n baseUrl: string;\n timeout: number;\n testData: any;\n testIni: string;\n section: IKeyAny;\n testSection: IKeyAny;\n}\n\nconst homeToRoost = '../../../../';\n\nexport const getRootPath = () => path.join(__dirname, homeToRoost);\nexport const rootFile = (fileName = '') => path.join(getRootPath(), fileName);\n\n/**\n * Reads configuration information, returning various test values\n * @param {string} rootPath\n * @returns {{testConfig: {[p: string]: any}; localIni: string; baseUrl: any; testData: any; apiVersion: any; testIni: string; configContents: string; rootPath: string; testSection: any; timeout: number}}\n * @constructor\n */\nexport const TestConfig = (rootPath = ''): ITestConfig => {\n config();\n const testFile = 'data.yml.json';\n const envPrefix = 'LOOKERSDK';\n const sectionName = 'Looker';\n rootPath = rootPath || getRootPath();\n let localIni = process.env.LOOKERSDK_INI || rootFile('looker.ini');\n const testPath = rootFile('test/');\n const dataFile = `${testPath}${testFile}`;\n const testData = JSON.parse(fs.readFileSync(dataFile, utf8));\n let testIni = `${rootPath}${testData.iniFile}`;\n const section = readIniConfig(localIni, envPrefix, sectionName);\n const baseUrl = section.base_url;\n const timeout = parseInt(section.timeout, 10);\n const testSection = readIniConfig(localIni, envPrefix, sectionName);\n\n // If .ini files don't exist, don't try to read them downstream and expect environment variables to be set\n if (!fs.existsSync(localIni)) localIni = '';\n if (!fs.existsSync(testIni)) testIni = '';\n\n return {\n baseUrl,\n dataFile,\n localIni,\n rootPath,\n section,\n testData,\n testIni,\n testPath,\n testSection,\n timeout,\n };\n};\n"],"mappings":"AA0BA,OAAO,KAAKA,EAAE,MAAM,IAAI;AACxB,OAAOC,IAAI,MAAM,MAAM;AACvB,SAASC,MAAM,QAAQ,QAAQ;AAC/B,SAASC,aAAa,QAAQ,iBAAiB;AAM/C,IAAMC,IAAI,GAAG,OAAO;AAkBpB,IAAMC,WAAW,GAAG,cAAc;AAElC,OAAO,IAAMC,WAAW,GAAGA,CAAA,KAAML,IAAI,CAACM,IAAI,CAACC,SAAS,EAAEH,WAAW,CAAC;AAClE,OAAO,IAAMI,QAAQ,GAAG,SAAXA,QAAQA,CAAA;EAAA,IAAIC,QAAQ,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;EAAA,OAAKV,IAAI,CAACM,IAAI,CAACD,WAAW,CAAC,CAAC,EAAEI,QAAQ,CAAC;AAAA;AAQ7E,OAAO,IAAMI,UAAU,GAAG,SAAbA,UAAUA,CAAA,EAAmC;EAAA,IAA/BC,QAAQ,GAAAJ,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;EACtCT,MAAM,CAAC,CAAC;EACR,IAAMc,QAAQ,GAAG,eAAe;EAChC,IAAMC,SAAS,GAAG,WAAW;EAC7B,IAAMC,WAAW,GAAG,QAAQ;EAC5BH,QAAQ,GAAGA,QAAQ,IAAIT,WAAW,CAAC,CAAC;EACpC,IAAIa,QAAQ,GAAGC,OAAO,CAACC,GAAG,CAACC,aAAa,IAAIb,QAAQ,CAAC,YAAY,CAAC;EAClE,IAAMc,QAAQ,GAAGd,QAAQ,CAAC,OAAO,CAAC;EAClC,IAAMe,QAAQ,MAAAC,MAAA,CAAMF,QAAQ,EAAAE,MAAA,CAAGT,QAAQ,CAAE;EACzC,IAAMU,QAAQ,GAAGC,IAAI,CAACC,KAAK,CAAC5B,EAAE,CAAC6B,YAAY,CAACL,QAAQ,EAAEpB,IAAI,CAAC,CAAC;EAC5D,IAAI0B,OAAO,MAAAL,MAAA,CAAMV,QAAQ,EAAAU,MAAA,CAAGC,QAAQ,CAACK,OAAO,CAAE;EAC9C,IAAMC,OAAO,GAAG7B,aAAa,CAACgB,QAAQ,EAAEF,SAAS,EAAEC,WAAW,CAAC;EAC/D,IAAMe,OAAO,GAAGD,OAAO,CAACE,QAAQ;EAChC,IAAMC,OAAO,GAAGC,QAAQ,CAACJ,OAAO,CAACG,OAAO,EAAE,EAAE,CAAC;EAC7C,IAAME,WAAW,GAAGlC,aAAa,CAACgB,QAAQ,EAAEF,SAAS,EAAEC,WAAW,CAAC;EAGnE,IAAI,CAAClB,EAAE,CAACsC,UAAU,CAACnB,QAAQ,CAAC,EAAEA,QAAQ,GAAG,EAAE;EAC3C,IAAI,CAACnB,EAAE,CAACsC,UAAU,CAACR,OAAO,CAAC,EAAEA,OAAO,GAAG,EAAE;EAEzC,OAAO;IACLG,OAAO;IACPT,QAAQ;IACRL,QAAQ;IACRJ,QAAQ;IACRiB,OAAO;IACPN,QAAQ;IACRI,OAAO;IACPP,QAAQ;IACRc,WAAW;IACXF;EACF,CAAC;AACH,CAAC"}