@kwiz/node 1.0.48 → 1.0.50

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.
@@ -0,0 +1,5 @@
1
+ {
2
+ "npm.exclude": [
3
+ "**/.yalc/**"
4
+ ]
5
+ }
package/dist/axios.d.ts CHANGED
@@ -7,5 +7,7 @@ export declare function getAxiosConfig(token?: string, options?: axiosConfigOpti
7
7
  export declare function getAxiosErrorData(error: AxiosError): {
8
8
  code: string;
9
9
  message: string;
10
+ /** might contain sensitive information like tokens or connections */
11
+ data: string;
10
12
  };
11
13
  export {};
package/dist/axios.js CHANGED
@@ -29,14 +29,24 @@ function getAxiosConfig(token, options) {
29
29
  }
30
30
  function getAxiosErrorData(error) {
31
31
  let code = error.code || "Unknown";
32
- let errorMessage = error.message || "Unspecified error";
33
- if (error && error.response && error.response.data && error.response.data["odata.error"]) {
34
- let errorData = error.response.data["odata.error"];
35
- if (errorData.message && errorData.message.value)
36
- errorMessage = errorData.message.value;
37
- if (errorData && errorData.code)
38
- code = errorData.code;
32
+ let message = error.message || "Unspecified error";
33
+ let data;
34
+ if (error && error.response && error.response.data) {
35
+ if (error.response.data["odata.error"]) {
36
+ let errorData = error.response.data["odata.error"];
37
+ if (errorData.message && errorData.message.value)
38
+ message = errorData.message.value;
39
+ if (errorData && errorData.code)
40
+ code = errorData.code;
41
+ }
42
+ else if ((0, common_1.isNotEmptyString)(error.response.data)) {
43
+ data = error.response.data;
44
+ }
39
45
  }
40
- return { code: code, message: errorMessage };
46
+ return {
47
+ code, message,
48
+ /** might contain sensitive information like tokens or connections */
49
+ data
50
+ };
41
51
  }
42
52
  //# sourceMappingURL=axios.js.map
package/dist/axios.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"axios.js","sourceRoot":"","sources":["../src/axios.ts"],"names":[],"mappings":";;AAOA,oDAEC;AAED,wCAoBC;AAED,8CAWC;AA5CD,yCAAmD;AAEnD,iCAA2C;AAK3C,SAAgB,oBAAoB,CAAC,KAAa,EAAE,OAA4B;IAC5E,OAAO,cAAc,CAAC,UAAU,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,SAAgB,cAAc,CAAC,KAAc,EAAE,OAA4B;IACvE,kCAAkC;IAClC,mBAAW,CAAC,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAC/C,MAAM,MAAM,GAA4B;QACpC,SAAS,EAAE,IAAI,aAAK,CAAC;YACjB,kBAAkB,EAAE,KAAK;SAC5B,CAAC;QACF,OAAO,EAAE,EAAE;KACd,CAAC;IAEF,IAAI,CAAC,IAAA,4BAAmB,EAAC,KAAK,CAAC;QAC3B,MAAM,CAAC,OAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;IAE1C,IAAI,OAAO,EAAE,CAAC;QACV,IAAI,CAAC,IAAA,4BAAmB,EAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,OAAQ,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;YACtD,MAAM,CAAC,OAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QACpD,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAiB;IAC/C,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC;IACnC,IAAI,YAAY,GAAG,KAAK,CAAC,OAAO,IAAI,mBAAmB,CAAC;IACxD,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACvF,IAAI,SAAS,GAAmD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnG,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK;YAC5C,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3C,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI;YAC3B,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"axios.js","sourceRoot":"","sources":["../src/axios.ts"],"names":[],"mappings":";;AAOA,oDAEC;AAED,wCAoBC;AAED,8CAoBC;AArDD,yCAAqE;AAErE,iCAA2C;AAK3C,SAAgB,oBAAoB,CAAC,KAAa,EAAE,OAA4B;IAC5E,OAAO,cAAc,CAAC,UAAU,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,SAAgB,cAAc,CAAC,KAAc,EAAE,OAA4B;IACvE,kCAAkC;IAClC,mBAAW,CAAC,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAC/C,MAAM,MAAM,GAA4B;QACpC,SAAS,EAAE,IAAI,aAAK,CAAC;YACjB,kBAAkB,EAAE,KAAK;SAC5B,CAAC;QACF,OAAO,EAAE,EAAE;KACd,CAAC;IAEF,IAAI,CAAC,IAAA,4BAAmB,EAAC,KAAK,CAAC;QAC3B,MAAM,CAAC,OAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;IAE1C,IAAI,OAAO,EAAE,CAAC;QACV,IAAI,CAAC,IAAA,4BAAmB,EAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,OAAQ,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;YACtD,MAAM,CAAC,OAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QACpD,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAiB;IAC/C,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC;IACnC,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,mBAAmB,CAAC;IACnD,IAAI,IAAY,CAAC;IACjB,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACrC,IAAI,SAAS,GAAmD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACnG,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK;gBAC5C,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;YACtC,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI;gBAC3B,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAC9B,CAAC;aAAM,IAAI,IAAA,yBAAgB,EAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC/B,CAAC;IACL,CAAC;IACD,OAAO;QACH,IAAI,EAAE,OAAO;QACb,qEAAqE;QACrE,IAAI;KACP,CAAC;AACN,CAAC"}
@@ -2,6 +2,7 @@ export * from './SPO/exports-index';
2
2
  export * from './auth/exports-index';
3
3
  export * from './graph/exports-index';
4
4
  export * from './next-js/exports-index';
5
+ export * from './ns/exports-index';
5
6
  export * from './sf/exports-index';
6
7
  export * from './storage/exports-index';
7
8
  export * from './utilities/exports-index';
@@ -18,6 +18,7 @@ __exportStar(require("./SPO/exports-index"), exports);
18
18
  __exportStar(require("./auth/exports-index"), exports);
19
19
  __exportStar(require("./graph/exports-index"), exports);
20
20
  __exportStar(require("./next-js/exports-index"), exports);
21
+ __exportStar(require("./ns/exports-index"), exports);
21
22
  __exportStar(require("./sf/exports-index"), exports);
22
23
  __exportStar(require("./storage/exports-index"), exports);
23
24
  __exportStar(require("./utilities/exports-index"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"exports-index.js","sourceRoot":"","sources":["../src/exports-index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,uDAAqC;AACrC,wDAAsC;AACtC,0DAAwC;AACxC,qDAAmC;AACnC,0DAAwC;AACxC,4DAA0C;AAC1C,0CAAwB;AACxB,mDAAiC"}
1
+ {"version":3,"file":"exports-index.js","sourceRoot":"","sources":["../src/exports-index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,uDAAqC;AACrC,wDAAsC;AACtC,0DAAwC;AACxC,qDAAmC;AACnC,qDAAmC;AACnC,0DAAwC;AACxC,4DAA0C;AAC1C,0CAAwB;AACxB,mDAAiC"}
@@ -0,0 +1,6 @@
1
+ export * from './ns-rest';
2
+ export * from './ns-restlet';
3
+ export * from './ns-soap';
4
+ export * from './ns-suiteql';
5
+ export * from './ns';
6
+ export * from './oauth1';
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./ns-rest"), exports);
18
+ __exportStar(require("./ns-restlet"), exports);
19
+ __exportStar(require("./ns-soap"), exports);
20
+ __exportStar(require("./ns-suiteql"), exports);
21
+ __exportStar(require("./ns"), exports);
22
+ __exportStar(require("./oauth1"), exports);
23
+ //# sourceMappingURL=exports-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports-index.js","sourceRoot":"","sources":["../../src/ns/exports-index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,+CAA6B;AAC7B,4CAA0B;AAC1B,+CAA6B;AAC7B,uCAAqB;AACrB,2CAAyB"}
@@ -0,0 +1,12 @@
1
+ import { tnsContext } from "@kwiz/common";
2
+ import { insRestOptions } from "./ns";
3
+ /** pass in a type for a single result or type[] for a collection result */
4
+ export declare function callNSRest<T>(ctx: tnsContext,
5
+ /** API path after the services/rest/record/v1/ - or starts with / to call other non services-rest endpoints lie /services/rest/auth */
6
+ path: string, options?: insRestOptions<T> & {
7
+ queryString?: {
8
+ /** select fields - split by , */
9
+ fields?: string;
10
+ [param: string]: string;
11
+ };
12
+ }): Promise<T extends (infer SingleDataItem)[] ? import("@kwiz/common").insSuiteTalkRecordsResponseCollection<SingleDataItem> : T & import("@kwiz/common").insSuiteTalkRecordResponseBase>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.callNSRest = callNSRest;
13
+ const common_1 = require("@kwiz/common");
14
+ const ns_1 = require("./ns");
15
+ //Valid filters: https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_1545222128.html#Record-Collection-Filtering
16
+ //REST API documentation: https://system.netsuite.com/help/helpcenter/en_US/APIs/REST_API_Browser/record/v1/2023.1/index.html#/definitions/contact
17
+ //https://timdietrich.me/blog/netsuite-suitetalk-rest-overview-issues-advice/
18
+ /** pass in a type for a single result or type[] for a collection result */
19
+ function callNSRest(ctx,
20
+ /** API path after the services/rest/record/v1/ - or starts with / to call other non services-rest endpoints lie /services/rest/auth */
21
+ path, options) {
22
+ return __awaiter(this, void 0, void 0, function* () {
23
+ let query = Object.keys((options === null || options === void 0 ? void 0 : options.queryString) || {}).map((qs, index) => `${index === 0 ? '?' : '&'}${qs}=${encodeURIComponent(options.queryString[qs])}`).join('');
24
+ const url = `${(0, common_1.getNSSuitetalkApiHost)(ctx.accountId)}${path.startsWith('/') ? path : `/services/rest/record/v1/${path}`}${query}`;
25
+ return yield (0, ns_1.getNSRESTResponse)(ctx, url, options);
26
+ });
27
+ }
28
+ //# sourceMappingURL=ns-rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ns-rest.js","sourceRoot":"","sources":["../../src/ns/ns-rest.ts"],"names":[],"mappings":";;;;;;;;;;;AAQA,gCAeC;AAvBD,yCAAiE;AACjE,6BAAyD;AAEzD,kIAAkI;AAClI,kJAAkJ;AAClJ,6EAA6E;AAE7E,2EAA2E;AAC3E,SAAsB,UAAU,CAC5B,GAAe;AACf,uIAAuI;AACvI,IAAY,EAAE,OAMb;;QACD,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,KAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAElK,MAAM,GAAG,GAAG,GAAG,IAAA,8BAAqB,EAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;QAEjI,OAAO,MAAM,IAAA,sBAAiB,EAAI,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;CAAA"}
@@ -0,0 +1,10 @@
1
+ import { IDictionary, tnsContext } from "@kwiz/common";
2
+ import { insRestOptions } from "./ns";
3
+ interface insTenantInfoRestlet {
4
+ script: string;
5
+ deploy: string;
6
+ }
7
+ export declare function callNSRestlet<T>(ctx: tnsContext, restlet: insTenantInfoRestlet, options?: insRestOptions<T> & {
8
+ queryString?: IDictionary<string>;
9
+ }): Promise<T extends (infer SingleDataItem)[] ? import("@kwiz/common").insSuiteTalkRecordsResponseCollection<SingleDataItem> : T & import("@kwiz/common").insSuiteTalkRecordResponseBase>;
10
+ export {};
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.callNSRestlet = callNSRestlet;
13
+ const common_1 = require("@kwiz/common");
14
+ const ns_1 = require("./ns");
15
+ function callNSRestlet(ctx, restlet, options) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ const query = Object.keys((options === null || options === void 0 ? void 0 : options.queryString) || {}).map(qs => `&${qs}=${encodeURIComponent(options.queryString[qs])}`).join('');
18
+ //call custom script
19
+ const url = `${(0, common_1.getNSRestletsApiHost)(ctx.accountId)}/app/site/hosting/restlet.nl?script=${restlet.script}&deploy=${restlet.deploy}${query}`;
20
+ return (0, ns_1.getNSRESTResponse)(ctx, url, options);
21
+ });
22
+ }
23
+ //# sourceMappingURL=ns-restlet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ns-restlet.js","sourceRoot":"","sources":["../../src/ns/ns-restlet.ts"],"names":[],"mappings":";;;;;;;;;;;AAQA,sCASC;AAjBD,yCAA6E;AAC7E,6BAAyD;AAOzD,SAAsB,aAAa,CAAI,GAAe,EAAE,OAA6B,EACjF,OAEC;;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,KAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClI,oBAAoB;QACpB,MAAM,GAAG,GAAG,GAAG,IAAA,6BAAoB,EAAC,GAAG,CAAC,SAAS,CAAC,uCAAuC,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QAE3I,OAAO,IAAA,sBAAiB,EAAI,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;CAAA"}
@@ -0,0 +1,29 @@
1
+ import { insBaseResponse, insSoapResponseError, insTokenInfo, tnsSoapRequest } from "@kwiz/common";
2
+ import { AxiosError, AxiosResponse } from "axios";
3
+ export declare class NSSoapRequestTypes {
4
+ tagName: string;
5
+ requestName: string;
6
+ constructor(name: tnsSoapRequest);
7
+ static get: NSSoapRequestTypes;
8
+ /** getAll only allows for GetAllRecordType types.
9
+ * Payload should be: <record recordType="currency"/> for example */
10
+ static getAll: NSSoapRequestTypes;
11
+ static upsert: NSSoapRequestTypes;
12
+ static update: NSSoapRequestTypes;
13
+ static upsertList: NSSoapRequestTypes;
14
+ static search: NSSoapRequestTypes;
15
+ static add: NSSoapRequestTypes;
16
+ static delete: NSSoapRequestTypes;
17
+ }
18
+ export declare function callNSSoap<T extends insBaseResponse>(ctx: insTokenInfo, requestType: NSSoapRequestTypes, payload: string, options?: {
19
+ additionalHeaders?: string;
20
+ }): Promise<{
21
+ error?: false;
22
+ envelope: T;
23
+ axiosResponse?: AxiosResponse;
24
+ } | {
25
+ error: true;
26
+ errorMessage: string;
27
+ envelope?: insSoapResponseError;
28
+ axiosError?: AxiosError;
29
+ }>;
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ //https://github.com/minmyatoo/netsuite-record-fetcher-ts/blob/main/oauth1Utils.ts
3
+ //get WSDL: https://www.netsuite.com/portal/developers/resources/suitetalk-documentation.shtml
4
+ //https://www.npmjs.com/package/wsdl-tsclient
5
+ //https://www.npmjs.com/package/wsdl-to-ts
6
+ //https://system.netsuite.com/help/helpcenter/en_US/srbrowser/Browser2018_1/schema/record/address.html?mode=package
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.NSSoapRequestTypes = void 0;
18
+ exports.callNSSoap = callNSSoap;
19
+ const common_1 = require("@kwiz/common");
20
+ const axios_1 = require("axios");
21
+ const exports_index_1 = require("../exports-index");
22
+ const oauth1_1 = require("./oauth1");
23
+ class NSSoapRequestTypes {
24
+ constructor(name) {
25
+ this.tagName = name;
26
+ this.requestName = `${(0, common_1.capitalizeFirstLetter)(name)}Request`;
27
+ }
28
+ }
29
+ exports.NSSoapRequestTypes = NSSoapRequestTypes;
30
+ NSSoapRequestTypes.get = new NSSoapRequestTypes("get");
31
+ /** getAll only allows for GetAllRecordType types.
32
+ * Payload should be: <record recordType="currency"/> for example */
33
+ NSSoapRequestTypes.getAll = new NSSoapRequestTypes("getAll");
34
+ NSSoapRequestTypes.upsert = new NSSoapRequestTypes("upsert");
35
+ NSSoapRequestTypes.update = new NSSoapRequestTypes("update");
36
+ NSSoapRequestTypes.upsertList = new NSSoapRequestTypes("upsertList");
37
+ NSSoapRequestTypes.search = new NSSoapRequestTypes("search");
38
+ NSSoapRequestTypes.add = new NSSoapRequestTypes("add");
39
+ NSSoapRequestTypes.delete = new NSSoapRequestTypes("delete");
40
+ ;
41
+ function callNSSoap(ctx, requestType, payload, options) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ const NSSoapURL = `${(0, common_1.getNSSuitetalkApiHost)(ctx.accountId)}/services/NetSuitePort_2023_1`;
44
+ let oauth = new oauth1_1.nsOAuth1({
45
+ key: ctx.clientId,
46
+ secret: ctx.clientSecret
47
+ });
48
+ let soapAuthentication = oauth._getSoapAuthHeader({
49
+ account: ctx.accountId,
50
+ token: ctx.tokenId,
51
+ tokenSecret: ctx.tokenSecret
52
+ });
53
+ let body = `<soapenv:Envelope
54
+ xmlns:xsd='http://www.w3.org/2001/XMLSchema'
55
+ xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
56
+ xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
57
+ xmlns:platformCore='urn:core_2023_1.platform.webservices.netsuite.com'
58
+ xmlns:actSched='urn:scheduling_2023_1.activities.webservices.netsuite.com'
59
+ xmlns:listRel='urn:relationships_2023_1.lists.webservices.netsuite.com'
60
+ xmlns:platformCommon='urn:common_2023_1.platform.webservices.netsuite.com'
61
+ xmlns:generalComm='urn:communication_2023_1.general.webservices.netsuite.com'
62
+ xmlns:platformMsgs='urn:messages_2023_1.platform.webservices.netsuite.com'>
63
+ <soapenv:Header>
64
+ <tokenPassport xsi:type='platformCore:TokenPassport'>
65
+ <account xsi:type='xsd:string'>${soapAuthentication.account}</account>
66
+ <consumerKey xsi:type='xsd:string'>${soapAuthentication.consumerKey}</consumerKey>
67
+ <token xsi:type='xsd:string'>${soapAuthentication.token}</token>
68
+ <nonce xsi:type='xsd:string'>${soapAuthentication.nonce}</nonce>
69
+ <timestamp xsi:type='xsd:long'>${soapAuthentication.timestamp}</timestamp>
70
+ <signature algorithm='HMAC_SHA256' xsi:type='platformCore:TokenPassportSignature'>${soapAuthentication.signature}</signature>
71
+ </tokenPassport>
72
+ ${options && options.additionalHeaders || ""}
73
+ </soapenv:Header>
74
+ <soapenv:Body>
75
+ <${requestType.tagName} xsi:type='platformMsgs:${requestType.requestName}'>${payload}</${requestType.tagName}>
76
+ </soapenv:Body>
77
+ </soapenv:Envelope>`;
78
+ try {
79
+ const axiosResponse = yield axios_1.default.post(NSSoapURL, body, {
80
+ headers: {
81
+ "Content-Type": "text/xml",
82
+ "SOAPAction": requestType.tagName,
83
+ Accept: "application/xml"
84
+ }
85
+ });
86
+ const envelope = yield (0, exports_index_1.parseXml)(axiosResponse.data);
87
+ return { envelope, axiosResponse };
88
+ }
89
+ catch (e) {
90
+ if ((0, axios_1.isAxiosError)(e)) {
91
+ try {
92
+ const envelope = yield (0, exports_index_1.parseXml)(e.response.data);
93
+ return {
94
+ error: true,
95
+ errorMessage: envelope.Body.Fault.faultstring,
96
+ envelope,
97
+ axiosError: e
98
+ };
99
+ }
100
+ catch (e2) {
101
+ return {
102
+ error: true,
103
+ errorMessage: e.message,
104
+ axiosError: e
105
+ };
106
+ }
107
+ }
108
+ return { error: true, errorMessage: (0, common_1.GetError)(e) };
109
+ }
110
+ });
111
+ }
112
+ //# sourceMappingURL=ns-soap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ns-soap.js","sourceRoot":"","sources":["../../src/ns/ns-soap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { tnsContext } from "@kwiz/common";
2
+ import { insRestOptions } from "./ns";
3
+ export declare function callNSSuiteQL<T>(ctx: tnsContext, payload: {
4
+ q?: string;
5
+ [param: string]: string;
6
+ } | string, options?: Omit<insRestOptions<T>, "payload">): Promise<import("@kwiz/common").insSuiteTalkRecordsResponseCollection<T>>;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.callNSSuiteQL = callNSSuiteQL;
13
+ const common_1 = require("@kwiz/common");
14
+ const ns_1 = require("./ns");
15
+ function callNSSuiteQL(ctx,
16
+ /* SuiteQL Query, or {q:string} with query */
17
+ payload, options) {
18
+ return __awaiter(this, void 0, void 0, function* () {
19
+ const url = `${(0, common_1.getNSSuitetalkApiHost)(ctx.accountId)}/services/rest/query/v1/suiteql`;
20
+ return yield (0, ns_1.getNSRESTResponse)(ctx, url, {
21
+ method: "post",
22
+ payload: (0, common_1.isString)(payload) ? { q: payload } : payload,
23
+ headers: Object.assign({ Prefer: "transient" }, ((options === null || options === void 0 ? void 0 : options.headers) || {}))
24
+ });
25
+ });
26
+ }
27
+ //# sourceMappingURL=ns-suiteql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ns-suiteql.js","sourceRoot":"","sources":["../../src/ns/ns-suiteql.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,sCAmBC;AAtBD,yCAA2E;AAC3E,6BAAyD;AAEzD,SAAsB,aAAa,CAAI,GAAe;AAClD,6CAA6C;AAC7C,OAIU,EACV,OAA4C;;QAE5C,MAAM,GAAG,GAAG,GAAG,IAAA,8BAAqB,EAAC,GAAG,CAAC,SAAS,CAAC,iCAAiC,CAAC;QAErF,OAAO,MAAM,IAAA,sBAAiB,EAAM,GAAG,EAAE,GAAG,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAA,iBAAQ,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO;YACrD,OAAO,kBACH,MAAM,EAAE,WAAW,IAChB,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,KAAI,EAAE,CAAC,CAC9B;SACJ,CAAC,CAAC;IACP,CAAC;CAAA"}
@@ -0,0 +1,13 @@
1
+ import { IDictionary, insSuiteTalkRecordResponseBase, insSuiteTalkRecordsResponseCollection, tnsContext, tnsFieldValueTypes } from "@kwiz/common";
2
+ import { AxiosResponse } from "axios";
3
+ import { tnsOAuthRequestMethods } from "./oauth1";
4
+ type toResultType<DataType> = DataType extends (infer SingleDataItem)[] ? insSuiteTalkRecordsResponseCollection<SingleDataItem> : (DataType & insSuiteTalkRecordResponseBase);
5
+ export interface insRestOptions<DataType, ResultType = toResultType<DataType>> {
6
+ method?: tnsOAuthRequestMethods;
7
+ payload?: IDictionary<tnsFieldValueTypes>;
8
+ headers?: IDictionary<string>;
9
+ responseDigest?: (response: AxiosResponse) => ResultType;
10
+ }
11
+ /** url should start with . after the account id. */
12
+ export declare function getNSRESTResponse<DataType, ResultType = toResultType<DataType>>(ctx: tnsContext, url: string, options?: insRestOptions<DataType, ResultType>): Promise<ResultType>;
13
+ export {};
package/dist/ns/ns.js ADDED
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getNSRESTResponse = getNSRESTResponse;
13
+ const common_1 = require("@kwiz/common");
14
+ const axios_1 = require("axios");
15
+ const axios_2 = require("../axios");
16
+ const oauth1_1 = require("./oauth1");
17
+ /** url should start with . after the account id. */
18
+ function getNSRESTResponse(ctx, url, options) {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ let config;
21
+ let method = (0, common_1.isNotEmptyString)(options === null || options === void 0 ? void 0 : options.method)
22
+ ? options.method
23
+ : (0, common_1.isNullOrUndefined)(options === null || options === void 0 ? void 0 : options.payload)
24
+ ? "get"
25
+ : "post";
26
+ if ((0, common_1.isnsAccessToken)(ctx)) {
27
+ config = (0, axios_2.getAxiosConfigBearer)(ctx.accessToken, { contantType: "application/json" });
28
+ }
29
+ else if ((0, common_1.isnsTokenInfo)(ctx)) {
30
+ let oauth = new oauth1_1.nsOAuth1({
31
+ key: ctx.clientId,
32
+ secret: ctx.clientSecret
33
+ });
34
+ let restAuthentication = oauth._getRestAuthHeader({
35
+ url: url,
36
+ method: method
37
+ }, {
38
+ account: ctx.accountId,
39
+ token: ctx.tokenId,
40
+ tokenSecret: ctx.tokenSecret
41
+ });
42
+ config = (0, axios_2.getAxiosConfig)(restAuthentication, { contantType: "application/json" });
43
+ }
44
+ else
45
+ throw Error("Invalid context");
46
+ if (options === null || options === void 0 ? void 0 : options.headers) {
47
+ Object.keys(options.headers).forEach(h => {
48
+ config.headers[h] = options.headers[h];
49
+ });
50
+ }
51
+ let result = null;
52
+ switch (method) {
53
+ case "patch":
54
+ result = yield axios_1.default.patch(url, options.payload, config);
55
+ break;
56
+ case "post":
57
+ result = yield axios_1.default.post(url, options.payload, config);
58
+ break;
59
+ case "get":
60
+ result = yield axios_1.default.get(url, config);
61
+ break;
62
+ }
63
+ if (options === null || options === void 0 ? void 0 : options.responseDigest)
64
+ return options.responseDigest(result);
65
+ else if (typeof (result.data) === "string")
66
+ return (0, common_1.jsonParse)(result.data);
67
+ else
68
+ return result.data;
69
+ });
70
+ }
71
+ //# sourceMappingURL=ns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ns.js","sourceRoot":"","sources":["../../src/ns/ns.ts"],"names":[],"mappings":";;;;;;;;;;;AAcA,8CAuDC;AArED,yCAAkO;AAClO,iCAAiE;AACjE,oCAAgE;AAChE,qCAA4D;AAU5D,oDAAoD;AACpD,SAAsB,iBAAiB,CAClC,GAAe,EAAE,GAAW,EAAE,OAA8C;;QAE7E,IAAI,MAA0B,CAAC;QAC/B,IAAI,MAAM,GAA2B,IAAA,yBAAgB,EAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC;YAClE,CAAC,CAAC,OAAO,CAAC,MAAM;YAChB,CAAC,CAAC,IAAA,0BAAiB,EAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC;gBACjC,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,MAAM,CAAC;QAEjB,IAAI,IAAA,wBAAe,EAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,IAAA,4BAAoB,EAAC,GAAG,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACxF,CAAC;aACI,IAAI,IAAA,sBAAa,EAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,KAAK,GAAG,IAAI,iBAAQ,CAAC;gBAErB,GAAG,EAAE,GAAG,CAAC,QAAQ;gBACjB,MAAM,EAAE,GAAG,CAAC,YAAY;aAC3B,CAAC,CAAC;YACH,IAAI,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC;gBAC9C,GAAG,EAAE,GAAG;gBACR,MAAM,EAAE,MAAM;aACjB,EAAE;gBACC,OAAO,EAAE,GAAG,CAAC,SAAS;gBACtB,KAAK,EAAE,GAAG,CAAC,OAAO;gBAClB,WAAW,EAAE,GAAG,CAAC,WAAW;aAC/B,CAAC,CAAC;YACH,MAAM,GAAG,IAAA,sBAAc,EAAC,kBAAkB,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACrF,CAAC;;YACI,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAEpC,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACrC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACP,CAAC;QACD,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,QAAQ,MAAM,EAAE,CAAC;YACb,KAAK,OAAO;gBACR,MAAM,GAAG,MAAM,eAAK,CAAC,KAAK,CAAW,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACnE,MAAM;YACV,KAAK,MAAM;gBACP,MAAM,GAAG,MAAM,eAAK,CAAC,IAAI,CAAW,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAClE,MAAM;YACV,KAAK,KAAK;gBACN,MAAM,GAAG,MAAM,eAAK,CAAC,GAAG,CAAW,GAAG,EAAE,MAAM,CAAC,CAAC;gBAChD,MAAM;QACd,CAAC;QAED,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc;YACvB,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;aACrC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ;YACtC,OAAO,IAAA,kBAAS,EAAa,MAAM,CAAC,IAAI,CAAC,CAAC;;YAE1C,OAAO,MAAM,CAAC,IAAkB,CAAC;IACzC,CAAC;CAAA"}
@@ -0,0 +1,42 @@
1
+ export type tnsOAuthRequestMethods = "get" | "post" | "patch";
2
+ export interface insOAuth1RequestConfig {
3
+ key: string;
4
+ secret: string;
5
+ }
6
+ interface insOauthToken {
7
+ token: string;
8
+ tokenSecret: string;
9
+ account: string;
10
+ callback?: string;
11
+ verifier?: string;
12
+ }
13
+ export declare class nsOAuth1 {
14
+ private version;
15
+ private signatureMethod;
16
+ private consumer;
17
+ constructor(requestConfig: insOAuth1RequestConfig);
18
+ private _setConsumer;
19
+ private _getParameterString;
20
+ private _getSigningKey;
21
+ private _getSignature;
22
+ private _getRestSignature;
23
+ private _getSoapSignature;
24
+ private _encode;
25
+ private _sortObject;
26
+ private _getTimestamp;
27
+ private _getNonce;
28
+ _getSoapAuthHeader(authToken: insOauthToken): {
29
+ token: string;
30
+ signature: string;
31
+ nonce: string;
32
+ timestamp: number;
33
+ account: string;
34
+ consumerKey: string;
35
+ };
36
+ _getRestAuthHeader(request: {
37
+ method: tnsOAuthRequestMethods;
38
+ url: string;
39
+ }, token: insOauthToken): string;
40
+ private _initializeConfig;
41
+ }
42
+ export {};
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nsOAuth1 = void 0;
4
+ const common_1 = require("@kwiz/common");
5
+ const crypto_1 = require("crypto");
6
+ class nsOAuth1 {
7
+ constructor(requestConfig) {
8
+ this.version = '1.0';
9
+ this.signatureMethod = 'HMAC-SHA256';
10
+ this.consumer = null;
11
+ if ((0, common_1.isNullOrUndefined)(requestConfig))
12
+ throw new Error('Missing parameters --key or --secret when using -m or --vm.');
13
+ this._initializeConfig(requestConfig);
14
+ }
15
+ _setConsumer(key, secret) {
16
+ if (key && secret) {
17
+ this.consumer = { key: key, secret: secret };
18
+ }
19
+ }
20
+ _getParameterString(oauthHeaders, request) {
21
+ var url = request.url;
22
+ var searchParams = (0, common_1.parseQueryString)(url);
23
+ var params = this._sortObject(Object.assign(Object.assign({}, oauthHeaders), searchParams));
24
+ var paramsString = params
25
+ .map(function (param) {
26
+ return param.name + "=" + param.value;
27
+ })
28
+ .join('&');
29
+ return paramsString;
30
+ }
31
+ _getSigningKey(tokenSecret) {
32
+ if (tokenSecret === void 0) {
33
+ tokenSecret = '';
34
+ }
35
+ var signingKey = [this._encode(this.consumer.secret), this._encode(tokenSecret)].join('&');
36
+ return signingKey;
37
+ }
38
+ _getSignature(baseString, tokenSecret) {
39
+ var key = this._getSigningKey(tokenSecret);
40
+ var hmacsignature = (0, crypto_1.createHmac)('sha256', Buffer.from(key, 'utf8'))
41
+ .update(baseString)
42
+ .digest()
43
+ .toString('base64');
44
+ return hmacsignature;
45
+ }
46
+ _getRestSignature(oauthHeaders, request, tokenSecret) {
47
+ var method = request.method, url = request.url;
48
+ var baseUrl = url.split('?')[0];
49
+ var baseString = [
50
+ method.toUpperCase(),
51
+ this._encode(baseUrl.toLowerCase()),
52
+ this._encode(this._getParameterString(oauthHeaders, request))
53
+ ].join('&');
54
+ return this._getSignature(baseString, tokenSecret);
55
+ }
56
+ _getSoapSignature(account, token, nonce, timestamp) {
57
+ //https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_1534941088.html#subsect_1520523663
58
+ var baseString = [account, this.consumer.key, token.token, nonce, timestamp].join('&');
59
+ return this._getSignature(baseString, token.tokenSecret);
60
+ }
61
+ _encode(data) {
62
+ return encodeURIComponent(data)
63
+ .replace(/!/g, '%21')
64
+ .replace(/\*/g, '%2A')
65
+ .replace(/'/g, '%27')
66
+ .replace(/\(/g, '%28')
67
+ .replace(/\)/g, '%29');
68
+ }
69
+ _sortObject(headers) {
70
+ var _this = this;
71
+ var keys = Object.keys(headers).sort();
72
+ return keys.map(function (name) {
73
+ return { name: _this._encode(name), value: _this._encode(headers[name]) };
74
+ });
75
+ }
76
+ _getTimestamp() {
77
+ let now = new Date(new Date().toUTCString());
78
+ return Math.round(now.getTime() / 1000);
79
+ }
80
+ _getNonce() {
81
+ return (0, common_1.newGuid)().replace(/-/g, '');
82
+ }
83
+ _getSoapAuthHeader(authToken) {
84
+ var nonce = this._getNonce();
85
+ var timestamp = this._getTimestamp();
86
+ var account = authToken.account, token = authToken.token;
87
+ var signature = this._getSoapSignature(account, authToken, nonce, timestamp);
88
+ return {
89
+ token: token,
90
+ signature: signature,
91
+ nonce: nonce,
92
+ timestamp: timestamp,
93
+ account: account,
94
+ consumerKey: this.consumer.key
95
+ };
96
+ }
97
+ _getRestAuthHeader(request, token) {
98
+ var HEADER = 'OAuth';
99
+ var oauthHeaders = {
100
+ oauth_consumer_key: this.consumer.key,
101
+ oauth_timestamp: this._getTimestamp(),
102
+ oauth_nonce: this._getNonce(),
103
+ oauth_version: this.version,
104
+ oauth_signature_method: this.signatureMethod
105
+ };
106
+ if (token.token) {
107
+ oauthHeaders.oauth_token = token.token;
108
+ }
109
+ if (token.callback) {
110
+ oauthHeaders.oauth_callback = token.callback;
111
+ }
112
+ if (token.verifier) {
113
+ oauthHeaders.oauth_verifier = token.verifier;
114
+ }
115
+ oauthHeaders.oauth_signature = this._getRestSignature(oauthHeaders, request, token.tokenSecret);
116
+ var sortedHeaders = this._sortObject(oauthHeaders);
117
+ var account = token.account;
118
+ if (account) {
119
+ sortedHeaders.push({ name: 'realm', value: account.replace('-', '_') });
120
+ }
121
+ var headerString = sortedHeaders
122
+ .map(function (header) {
123
+ return header.name + "=\"" + header.value + "\"";
124
+ })
125
+ .join(', ');
126
+ return HEADER + " " + headerString;
127
+ }
128
+ _initializeConfig(requestConfig) {
129
+ this._setConsumer(requestConfig.key, requestConfig.secret);
130
+ }
131
+ }
132
+ exports.nsOAuth1 = nsOAuth1;
133
+ //# sourceMappingURL=oauth1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth1.js","sourceRoot":"","sources":["../../src/ns/oauth1.ts"],"names":[],"mappings":"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"}
@@ -1 +1,2 @@
1
1
  export * from './email';
2
+ export * from './xml';
@@ -15,4 +15,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./email"), exports);
18
+ __exportStar(require("./xml"), exports);
18
19
  //# sourceMappingURL=exports-index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exports-index.js","sourceRoot":"","sources":["../../src/utilities/exports-index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB"}
1
+ {"version":3,"file":"exports-index.js","sourceRoot":"","sources":["../../src/utilities/exports-index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,wCAAsB"}
@@ -0,0 +1,29 @@
1
+ interface iOptions {
2
+ attrkey?: string | undefined;
3
+ charkey?: string | undefined;
4
+ explicitCharkey?: boolean | undefined;
5
+ trim?: boolean | undefined;
6
+ normalizeTags?: boolean | undefined;
7
+ normalize?: boolean | undefined;
8
+ explicitRoot?: boolean | undefined;
9
+ emptyTag?: (() => any) | string;
10
+ explicitArray?: boolean | undefined;
11
+ ignoreAttrs?: boolean | undefined;
12
+ mergeAttrs?: boolean | undefined;
13
+ validator?: Function | undefined;
14
+ xmlns?: boolean | undefined;
15
+ explicitChildren?: boolean | undefined;
16
+ childkey?: string | undefined;
17
+ preserveChildrenOrder?: boolean | undefined;
18
+ charsAsChildren?: boolean | undefined;
19
+ includeWhiteChars?: boolean | undefined;
20
+ async?: boolean | undefined;
21
+ strict?: boolean | undefined;
22
+ attrNameProcessors?: Array<(name: string) => any> | undefined;
23
+ attrValueProcessors?: Array<(value: string, name: string) => any> | undefined;
24
+ tagNameProcessors?: Array<(name: string) => any> | undefined;
25
+ valueProcessors?: Array<(value: string, name: string) => any> | undefined;
26
+ chunkSize?: number | undefined;
27
+ }
28
+ export declare function parseXml<T>(xml: string, options?: iOptions): T;
29
+ export {};
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseXml = parseXml;
4
+ const xml2js_1 = require("xml2js");
5
+ const processors_1 = require("xml2js/lib/processors");
6
+ function parseXml(xml, options) {
7
+ xml = xml.replace(/\r/g, ''); //\r\n will be replaced with " " instead of \n
8
+ return (0, xml2js_1.parseStringPromise)(xml, Object.assign({ normalize: true, trim: true, explicitRoot: false, explicitArray: false, xmlns: false, tagNameProcessors: [processors_1.stripPrefix],
9
+ //breaking values in text that have :
10
+ //valueProcessors: [stripPrefix],
11
+ attrNameProcessors: [name => {
12
+ let names = name.split(":");
13
+ return names[names.length - 1];
14
+ }], attrValueProcessors: [processors_1.stripPrefix] }, (options || {})));
15
+ }
16
+ //# sourceMappingURL=xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/utilities/xml.ts"],"names":[],"mappings":";;AA8BA,4BAkBC;AAhDD,mCAA4C;AAC5C,sDAAoD;AA6BpD,SAAgB,QAAQ,CAAI,GAAW,EAAE,OAAkB;IACvD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAA,8CAA8C;IAC3E,OAAO,IAAA,2BAAkB,EAAC,GAAG,kBACzB,SAAS,EAAE,IAAI,EACf,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,KAAK,EACnB,aAAa,EAAE,KAAK,EACpB,KAAK,EAAE,KAAK,EACZ,iBAAiB,EAAE,CAAC,wBAAW,CAAC;QAChC,qCAAqC;QACrC,iCAAiC;QACjC,kBAAkB,EAAE,CAAC,IAAI,CAAC,EAAE;gBACxB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnC,CAAC,CAAC,EACF,mBAAmB,EAAE,CAAC,wBAAW,CAAC,IAC/B,CAAC,OAAO,IAAI,EAAE,CAAC,EACf,CAAC;AACZ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kwiz/node",
3
- "version": "1.0.48",
3
+ "version": "1.0.50",
4
4
  "description": "KWIZ utilities and helpers for node applications",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -18,14 +18,13 @@
18
18
  "build-explain": "tsc --explainFiles",
19
19
  "check-dependencies": "madge --circular ./src",
20
20
  "yalc-link": "yalc publish",
21
- "create-link": "npm link",
22
21
  "test": "node --import tsx --test src",
23
22
  "npm-v-patch": "npm version patch && git push origin main:main && git push --tags",
24
23
  "npm-v-major": "npm version major && git push origin main:main && git push --tags",
25
24
  "npm-publish": "npm publish --access public",
26
25
  "reset-repo": "git fetch origin && git reset --hard origin/main",
27
26
  "__update-kwiz-packages": "npm install @kwiz/common@latest",
28
- "link-local-common": "npm link @kwiz/common",
27
+ "link-local-common": "yalc add @kwiz/common",
29
28
  "reindex-project": "cti create ./src -i _dependencies -w -b -n -o exports-index.ts && node fix-folder-imports.js",
30
29
  "install-packages": "npm install azurite -g && npm ci",
31
30
  "startDevStorage": "azurite -s -l",
@@ -64,6 +63,7 @@
64
63
  "devDependencies": {
65
64
  "@types/node": "^18.19.21",
66
65
  "@types/nodemailer": "^7.0.9",
66
+ "@types/xml2js": "^0.4.14",
67
67
  "check-node-version": "^4.2.1",
68
68
  "create-ts-index": "^1.14.0",
69
69
  "fs-extra": "^11.2.0",
@@ -77,12 +77,13 @@
77
77
  "@azure/msal-node": "^2.6.4",
78
78
  "@azure/storage-blob": "^12.31.0",
79
79
  "@jsforce/jsforce-node": "^3.10.14",
80
- "@kwiz/common": "^1.0.207",
80
+ "@kwiz/common": "^1.0.211",
81
81
  "axios": "^1.6.7",
82
82
  "esbuild": "^0.19.12",
83
83
  "get-tsconfig": "^4.7.2",
84
84
  "nodemailer": "^8.0.1",
85
- "resolve-pkg-maps": "^1.0.0"
85
+ "resolve-pkg-maps": "^1.0.0",
86
+ "xml2js": "^0.6.2"
86
87
  },
87
88
  "peerDependencies": {
88
89
  "@jsforce/jsforce-node": "^3.10.14"