@nlxai/core 1.2.3-alpha.1 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.esm.js CHANGED
@@ -4,7 +4,7 @@ import ReconnectingWebSocket from 'reconnecting-websocket';
4
4
  import { v4 } from 'uuid';
5
5
 
6
6
  var name = "@nlxai/core";
7
- var version$1 = "1.2.3-alpha.1";
7
+ var version$1 = "1.2.3";
8
8
  var description = "Low-level SDK for building NLX experiences";
9
9
  var type = "module";
10
10
  var main = "lib/index.cjs";
@@ -20,40 +20,40 @@ var exports = {
20
20
  };
21
21
  var scripts = {
22
22
  build: "rm -rf lib && rollup -c --configPlugin typescript --configImportAttributesKey with",
23
- docs: "rm -rf docs/ && typedoc && concat-md --decrease-title-levels --dir-name-as-title docs/ > docs/index.md",
24
23
  "lint:check": "eslint src/ --ext .ts,.tsx,.js,.jsx --max-warnings 0",
25
24
  lint: "eslint src/ --ext .ts,.tsx,.js,.jsx --fix",
26
25
  prepublish: "npm run build",
27
- "preview-docs": "npm run docs && comrak --unsafe --gfm -o docs/index.html docs/index.md && open docs/index.html",
28
- "publish-docs": "npm run docs && mv docs/index.md ../website/src/content/headless-api-reference.md",
29
26
  test: "typedoc --emit none",
30
- tsc: "tsc"
27
+ tsc: "tsc",
28
+ "update-readme:docs": "rm -rf docs/ && typedoc",
29
+ "update-readme:merge": "../../scripts/transclude-markdown.js",
30
+ "update-readme": "npm run update-readme:docs && npm run update-readme:merge"
31
31
  };
32
32
  var author = "Peter Szerzo <peter@nlx.ai>";
33
33
  var license = "MIT";
34
34
  var devDependencies = {
35
- "@types/isomorphic-fetch": "^0.0.36",
36
- "@types/node": "^22.10.1",
37
- "@types/ramda": "0.29.1",
35
+ "@types/isomorphic-fetch": "^0.0.39",
36
+ "@types/node": "^24.10.1",
37
+ "@types/ramda": "0.31.1",
38
38
  "@types/uuid": "^9.0.7",
39
39
  "concat-md": "^0.5.1",
40
40
  "eslint-config-nlx": "*",
41
41
  prettier: "^3.1.0",
42
42
  "rollup-config-nlx": "*",
43
- typedoc: "^0.25.13",
44
- "typedoc-plugin-markdown": "^3.17.1",
43
+ typedoc: "^0.28.14",
44
+ "typedoc-plugin-markdown": "^4.9.0",
45
45
  typescript: "^5.5.4"
46
46
  };
47
47
  var dependencies = {
48
48
  "isomorphic-fetch": "^3.0.0",
49
- ramda: "^0.29.1",
49
+ ramda: "^0.32.0",
50
50
  "reconnecting-websocket": "^4.4.0",
51
51
  uuid: "^9.0.1"
52
52
  };
53
53
  var publishConfig = {
54
54
  access: "public"
55
55
  };
56
- var gitHead = "13e26a6c67af7aa6c8dc100ad83d9c33e1112a08";
56
+ var gitHead = "3902161e95745dd4a9cfb68bb469755a62b421f5";
57
57
  var packageJson = {
58
58
  name: name,
59
59
  version: version$1,
@@ -125,18 +125,6 @@ const safeJsonParse = (val) => {
125
125
  return null;
126
126
  }
127
127
  };
128
- /**
129
- * Helper method to decide when a new {@link Config} requires creating a new {@link ConversationHandler} or whether the old `Config`'s
130
- * `ConversationHandler` can be used.
131
- *
132
- * The order of configs doesn't matter.
133
- * @param config1 -
134
- * @param config2 -
135
- * @returns true if `createConversation` should be called again
136
- */
137
- const shouldReinitialize = (config1, config2) => {
138
- return !equals(config1, config2);
139
- };
140
128
  const getBaseDomain = (url) => url.match(/(bots\.dev\.studio\.nlx\.ai|bots\.studio\.nlx\.ai|apps\.nlx\.ai|dev\.apps\.nlx\.ai)/g)?.[0] ?? "apps.nlx.ai";
141
129
  /**
142
130
  * When a HTTP URL is provided, deduce the websocket URL. Otherwise, return the argument.
@@ -173,41 +161,45 @@ const normalizeToHttp = (applicationUrl) => {
173
161
  const isWebsocketUrl = (url) => {
174
162
  return url.indexOf("wss://") === 0;
175
163
  };
176
- /**
177
- * Check whether a configuration is value.
178
- * @param config - Chat configuration
179
- * @returns isValid - Whether the configuration is valid
180
- */
181
- const isConfigValid = (config) => {
182
- const applicationUrl = config.applicationUrl ?? "";
183
- return applicationUrl.length > 0;
184
- };
185
164
  /**
186
165
  * Call this to create a conversation handler.
187
- * @param config -
166
+ * @param configuration - The necessary configuration to create the conversation.
188
167
  * @returns The {@link ConversationHandler} is a bundle of functions to interact with the conversation.
168
+ * @example
169
+ * ```typescript
170
+ * import { createConversation } from "@nlx/core";
171
+ *
172
+ * const conversation = createConversation({
173
+ * applicationUrl: "https://apps.nlx.ai/c/cfab3-243ad-232dc",
174
+ * headers: {
175
+ * "nlx-api-key": "4393029032-dwsd",
176
+ * },
177
+ * userId: "abcd-1234",
178
+ * languageCode: "en-US",
179
+ * });
180
+ * ```
189
181
  */
190
- function createConversation(config) {
182
+ function createConversation(configuration) {
191
183
  let socket;
192
184
  let socketMessageQueue = [];
193
185
  let socketMessageQueueCheckInterval = null;
194
186
  let voicePlusSocket;
195
187
  let voicePlusSocketMessageQueue = [];
196
188
  let voicePlusSocketMessageQueueCheckInterval = null;
197
- const applicationUrl = config.applicationUrl ?? "";
189
+ const applicationUrl = configuration.applicationUrl ?? "";
198
190
  // Check if the application URL has a language code appended to it
199
191
  if (/[-|_][a-z]{2,}[-|_][A-Z]{2,}$/.test(applicationUrl)) {
200
192
  Console.warn("Since v1.0.0, the language code is no longer added at the end of the application URL. Please remove the modifier (e.g. '-en-US') from the URL, and specify it in the `languageCode` parameter instead.");
201
193
  }
202
194
  const eventListeners = { voicePlusCommand: [] };
203
- const initialConversationId = config.conversationId ?? v4();
195
+ const initialConversationId = configuration.conversationId ?? v4();
204
196
  let state = {
205
- responses: config.responses ?? [],
206
- languageCode: config.languageCode,
207
- userId: config.userId,
197
+ responses: configuration.responses ?? [],
198
+ languageCode: configuration.languageCode,
199
+ userId: configuration.userId,
208
200
  conversationId: initialConversationId,
209
201
  };
210
- const fullApplicationHttpUrl = () => `${normalizeToHttp(applicationUrl)}${config.experimental?.completeApplicationUrl === true
202
+ const fullApplicationHttpUrl = () => `${normalizeToHttp(applicationUrl)}${configuration.experimental?.completeApplicationUrl === true
211
203
  ? ""
212
204
  : `-${state.languageCode}`}`;
213
205
  const setState = (change,
@@ -226,7 +218,7 @@ function createConversation(config) {
226
218
  type: ResponseType.Failure,
227
219
  receivedAt: new Date().getTime(),
228
220
  payload: {
229
- text: config.failureMessage ?? defaultFailureMessage,
221
+ text: configuration.failureMessage ?? defaultFailureMessage,
230
222
  },
231
223
  };
232
224
  setState({
@@ -281,6 +273,7 @@ function createConversation(config) {
281
273
  const sendToApplication = async (body) => {
282
274
  if (requestOverride != null) {
283
275
  requestOverride(body, (payload) => {
276
+ Console.warn("Using the second argument in `setRequestOverride` is deprecated. Use `conversationHandler.appendMessageToTranscript` instead.");
284
277
  const newResponse = {
285
278
  type: ResponseType.Application,
286
279
  receivedAt: new Date().getTime(),
@@ -297,8 +290,8 @@ function createConversation(config) {
297
290
  conversationId: state.conversationId,
298
291
  ...body,
299
292
  languageCode: state.languageCode,
300
- channelType: config.experimental?.channelType,
301
- environment: config.environment,
293
+ channelType: configuration.experimental?.channelType,
294
+ environment: configuration.environment,
302
295
  };
303
296
  if (isWebsocketUrl(applicationUrl)) {
304
297
  if (socket?.readyState === 1) {
@@ -313,7 +306,7 @@ function createConversation(config) {
313
306
  const res = await fetch(fullApplicationHttpUrl(), {
314
307
  method: "POST",
315
308
  headers: {
316
- ...(config.headers ?? {}),
309
+ ...(configuration.headers ?? {}),
317
310
  Accept: "application/json",
318
311
  "Content-Type": "application/json",
319
312
  "nlx-sdk-version": packageJson.version,
@@ -350,7 +343,7 @@ function createConversation(config) {
350
343
  // If the socket is already set up, tear it down first
351
344
  teardownWebsocket();
352
345
  const url = new URL(applicationUrl);
353
- if (config.experimental?.completeApplicationUrl !== true) {
346
+ if (configuration.experimental?.completeApplicationUrl !== true) {
354
347
  url.searchParams.set("languageCode", state.languageCode);
355
348
  url.searchParams.set("channelKey", `${url.searchParams.get("channelKey") ?? ""}-${state.languageCode}`);
356
349
  }
@@ -383,17 +376,17 @@ function createConversation(config) {
383
376
  const setupCommandWebsocket = () => {
384
377
  // If the socket is already set up, tear it down first
385
378
  teardownCommandWebsocket();
386
- if (config.bidirectional !== true) {
379
+ if (configuration.bidirectional !== true) {
387
380
  return;
388
381
  }
389
382
  const url = new URL(normalizeToWebsocket(applicationUrl));
390
- if (config.experimental?.completeApplicationUrl !== true) {
383
+ if (configuration.experimental?.completeApplicationUrl !== true) {
391
384
  url.searchParams.set("languageCode", state.languageCode);
392
385
  url.searchParams.set("channelKey", `${url.searchParams.get("channelKey") ?? ""}-${state.languageCode}`);
393
386
  }
394
387
  url.searchParams.set("conversationId", state.conversationId);
395
388
  url.searchParams.set("type", "voice-plus");
396
- const apiKey = config.headers["nlx-api-key"];
389
+ const apiKey = configuration.headers["nlx-api-key"];
397
390
  if (!isWebsocketUrl(applicationUrl) && apiKey != null) {
398
391
  url.searchParams.set("apiKey", apiKey);
399
392
  }
@@ -537,7 +530,7 @@ function createConversation(config) {
537
530
  const res = await fetch(`${fullApplicationHttpUrl()}/context`, {
538
531
  method: "POST",
539
532
  headers: {
540
- ...(config.headers ?? {}),
533
+ ...(configuration.headers ?? {}),
541
534
  Accept: "application/json",
542
535
  "Content-Type": "application/json",
543
536
  "nlx-conversation-id": state.conversationId,
@@ -554,6 +547,15 @@ function createConversation(config) {
554
547
  throw new Error(`Responded with ${res.status}`);
555
548
  }
556
549
  },
550
+ appendMessageToTranscript: (newResponse) => {
551
+ const newResponseWithTimestamp = {
552
+ ...newResponse,
553
+ receivedAt: newResponse.receivedAt ?? new Date().getTime(),
554
+ };
555
+ setState({
556
+ responses: [...state.responses, newResponseWithTimestamp],
557
+ }, newResponseWithTimestamp);
558
+ },
557
559
  sendStructured: (structured, context) => {
558
560
  appendStructuredUserResponse(structured, context);
559
561
  void sendToApplication({
@@ -609,7 +611,7 @@ function createConversation(config) {
609
611
  const res = await fetch(`${url}-${state.languageCode}/requestToken`, {
610
612
  method: "POST",
611
613
  headers: {
612
- ...(config.headers ?? {}),
614
+ ...(configuration.headers ?? {}),
613
615
  Accept: "application/json",
614
616
  "Content-Type": "application/json",
615
617
  "nlx-conversation-id": state.conversationId,
@@ -670,9 +672,52 @@ function createConversation(config) {
670
672
  };
671
673
  }
672
674
  /**
673
- * Get current expiration timestamp from the current list of reponses
674
- * @param responses - the current list of user and application responses (first argument in the subscribe callback)
675
- * @returns an expiration timestamp in Unix Epoch (`new Date().getTime()`), or `null` if this is not known (typically occurs if the application has not responded yet)
675
+ * Check whether a configuration is valid.
676
+ * @param configuration - Conversation configuration
677
+ * @returns Whether the configuration is valid?
678
+ */
679
+ const isConfigValid = (configuration) => {
680
+ const applicationUrl = configuration.applicationUrl ?? "";
681
+ return applicationUrl.length > 0;
682
+ };
683
+ /**
684
+ * Helper method to decide when a new {@link Config} requires creating a new {@link ConversationHandler} or whether the old `Config`'s
685
+ * `ConversationHandler` can be used.
686
+ *
687
+ * The order of configs doesn't matter.
688
+ * @param config1 -
689
+ * @param config2 -
690
+ * @returns true if `createConversation` should be called again
691
+ */
692
+ const shouldReinitialize = (config1, config2) => {
693
+ return !equals(config1, config2);
694
+ };
695
+ /**
696
+ * Get current expiration timestamp from a list of responses. Can be used to determine if a conversation has timed out.
697
+ * @example
698
+ * ```typescript
699
+ * import { useState } from "react";
700
+ * import { getCurrentExpirationTimestamp } from "@nlxai/core";
701
+ *
702
+ * const [isTimedOut, setIsTimedOut] = useState(false);
703
+ *
704
+ * conversation.subscribe((responses) => {
705
+ * const expirationTimestamp = getCurrentExpirationTimestamp(responses);
706
+ * if (expirationTimestamp != null && expirationTimestamp < new Date().getTime()) {
707
+ * setIsTimedOut(true);
708
+ * }
709
+ * });
710
+ *
711
+ * return (<div>
712
+ * {isTimedOut ? (
713
+ * <p>Your session has timed out. Please start a new conversation.</p>
714
+ * ) : (
715
+ * <p>Your session is active.</p>
716
+ * )}
717
+ * </div>
718
+ * ```
719
+ * @param responses - The current list of user and application responses (first argument in the subscribe callback)
720
+ * @returns An expiration timestamp in Unix Epoch (`new Date().getTime()`), or `null` if this is not known (typically occurs if the application has not responded yet)
676
721
  */
677
722
  const getCurrentExpirationTimestamp = (responses) => {
678
723
  let expirationTimestamp = null;
@@ -700,7 +745,7 @@ const getCurrentExpirationTimestamp = (responses) => {
700
745
  * console.log(response);
701
746
  * });
702
747
  * ```
703
- * @typeParam T - the type of the function's params, e.g. for `sendText` it's `text: string, context?: Context`
748
+ * @typeParam Params - the type of the function's params, e.g. for `sendText` it's `text: string, context?: Context`
704
749
  * @param fn - the function to wrap (e.g. `convo.sendText`, `convo.sendChoice`, etc.)
705
750
  * @param convo - the `ConversationHandler` (from {@link createConversation})
706
751
  * @param timeout - the timeout in milliseconds
package/lib/index.umd.js CHANGED
@@ -1,4 +1,4 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).nlx={})}(this,(function(e){"use strict";function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var n="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||"undefined"!=typeof global&&global||{},r="URLSearchParams"in n,o="Symbol"in n&&"iterator"in Symbol,s="FileReader"in n&&"Blob"in n&&function(){try{return new Blob,!0}catch(e){return!1}}(),i="FormData"in n,a="ArrayBuffer"in n;if(a)var u=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],c=ArrayBuffer.isView||function(e){return e&&u.indexOf(Object.prototype.toString.call(e))>-1};function l(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(e)||""===e)throw new TypeError('Invalid character in header field name: "'+e+'"');return e.toLowerCase()}function d(e){return"string"!=typeof e&&(e=String(e)),e}function f(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return o&&(t[Symbol.iterator]=function(){return t}),t}function h(e){this.map={},e instanceof h?e.forEach((function(e,t){this.append(t,e)}),this):Array.isArray(e)?e.forEach((function(e){if(2!=e.length)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+e.length);this.append(e[0],e[1])}),this):e&&Object.getOwnPropertyNames(e).forEach((function(t){this.append(t,e[t])}),this)}function p(e){if(!e._noBody)return e.bodyUsed?Promise.reject(new TypeError("Already read")):void(e.bodyUsed=!0)}function y(e){return new Promise((function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}}))}function m(e){var t=new FileReader,n=y(t);return t.readAsArrayBuffer(e),n}function g(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(e){var t;this.bodyUsed=this.bodyUsed,this._bodyInit=e,e?"string"==typeof e?this._bodyText=e:s&&Blob.prototype.isPrototypeOf(e)?this._bodyBlob=e:i&&FormData.prototype.isPrototypeOf(e)?this._bodyFormData=e:r&&URLSearchParams.prototype.isPrototypeOf(e)?this._bodyText=e.toString():a&&s&&((t=e)&&DataView.prototype.isPrototypeOf(t))?(this._bodyArrayBuffer=g(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):a&&(ArrayBuffer.prototype.isPrototypeOf(e)||c(e))?this._bodyArrayBuffer=g(e):this._bodyText=e=Object.prototype.toString.call(e):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||("string"==typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):r&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},s&&(this.blob=function(){var e=p(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer){var e=p(this);return e||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer))}if(s)return this.blob().then(m);throw new Error("could not read as ArrayBuffer")},this.text=function(){var e,t,n,r,o,s=p(this);if(s)return s;if(this._bodyBlob)return e=this._bodyBlob,t=new FileReader,n=y(t),r=/charset=([A-Za-z0-9_-]+)/.exec(e.type),o=r?r[1]:"utf-8",t.readAsText(e,o),n;if(this._bodyArrayBuffer)return Promise.resolve(function(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},i&&(this.formData=function(){return this.text().then(w)}),this.json=function(){return this.text().then(JSON.parse)},this}h.prototype.append=function(e,t){e=l(e),t=d(t);var n=this.map[e];this.map[e]=n?n+", "+t:t},h.prototype.delete=function(e){delete this.map[l(e)]},h.prototype.get=function(e){return e=l(e),this.has(e)?this.map[e]:null},h.prototype.has=function(e){return this.map.hasOwnProperty(l(e))},h.prototype.set=function(e,t){this.map[l(e)]=d(t)},h.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},h.prototype.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),f(e)},h.prototype.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),f(e)},h.prototype.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),f(e)},o&&(h.prototype[Symbol.iterator]=h.prototype.entries);var _=["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"];function v(e,t){if(!(this instanceof v))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');var r,o,s=(t=t||{}).body;if(e instanceof v){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new h(e.headers)),this.method=e.method,this.mode=e.mode,this.signal=e.signal,s||null==e._bodyInit||(s=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"same-origin",!t.headers&&this.headers||(this.headers=new h(t.headers)),this.method=(r=t.method||this.method||"GET",o=r.toUpperCase(),_.indexOf(o)>-1?o:r),this.mode=t.mode||this.mode||null,this.signal=t.signal||this.signal||function(){if("AbortController"in n)return(new AbortController).signal}(),this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&s)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(s),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==t.cache&&"no-cache"!==t.cache)){var i=/([?&])_=[^&]*/;if(i.test(this.url))this.url=this.url.replace(i,"$1_="+(new Date).getTime());else{this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}}function w(e){var t=new FormData;return e.trim().split("&").forEach((function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(o))}})),t}function T(e,t){if(!(this instanceof T))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(t||(t={}),this.type="default",this.status=void 0===t.status?200:t.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=void 0===t.statusText?"":""+t.statusText,this.headers=new h(t.headers),this.url=t.url||"",this._initBody(e)}v.prototype.clone=function(){return new v(this,{body:this._bodyInit})},b.call(v.prototype),b.call(T.prototype),T.prototype.clone=function(){return new T(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new h(this.headers),url:this.url})},T.error=function(){var e=new T(null,{status:200,statusText:""});return e.ok=!1,e.status=0,e.type="error",e};var E=[301,302,303,307,308];T.redirect=function(e,t){if(-1===E.indexOf(t))throw new RangeError("Invalid status code");return new T(null,{status:t,headers:{location:e}})};var O=n.DOMException;try{new O}catch(e){O=function(e,t){this.message=e,this.name=t;var n=Error(e);this.stack=n.stack},O.prototype=Object.create(Error.prototype),O.prototype.constructor=O}function x(e,t){return new Promise((function(r,o){var i=new v(e,t);if(i.signal&&i.signal.aborted)return o(new O("Aborted","AbortError"));var u=new XMLHttpRequest;function c(){u.abort()}if(u.onload=function(){var e,t,n={statusText:u.statusText,headers:(e=u.getAllResponseHeaders()||"",t=new h,e.replace(/\r?\n[\t ]+/g," ").split("\r").map((function(e){return 0===e.indexOf("\n")?e.substr(1,e.length):e})).forEach((function(e){var n=e.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();try{t.append(r,o)}catch(e){console.warn("Response "+e.message)}}})),t)};0===i.url.indexOf("file://")&&(u.status<200||u.status>599)?n.status=200:n.status=u.status,n.url="responseURL"in u?u.responseURL:n.headers.get("X-Request-URL");var o="response"in u?u.response:u.responseText;setTimeout((function(){r(new T(o,n))}),0)},u.onerror=function(){setTimeout((function(){o(new TypeError("Network request failed"))}),0)},u.ontimeout=function(){setTimeout((function(){o(new TypeError("Network request timed out"))}),0)},u.onabort=function(){setTimeout((function(){o(new O("Aborted","AbortError"))}),0)},u.open(i.method,function(e){try{return""===e&&n.location.href?n.location.href:e}catch(t){return e}}(i.url),!0),"include"===i.credentials?u.withCredentials=!0:"omit"===i.credentials&&(u.withCredentials=!1),"responseType"in u&&(s?u.responseType="blob":a&&(u.responseType="arraybuffer")),t&&"object"==typeof t.headers&&!(t.headers instanceof h||n.Headers&&t.headers instanceof n.Headers)){var f=[];Object.getOwnPropertyNames(t.headers).forEach((function(e){f.push(l(e)),u.setRequestHeader(e,d(t.headers[e]))})),i.headers.forEach((function(e,t){-1===f.indexOf(t)&&u.setRequestHeader(t,e)}))}else i.headers.forEach((function(e,t){u.setRequestHeader(t,e)}));i.signal&&(i.signal.addEventListener("abort",c),u.onreadystatechange=function(){4===u.readyState&&i.signal.removeEventListener("abort",c)}),u.send(void 0===i._bodyInit?null:i._bodyInit)}))}x.polyfill=!0,n.fetch||(n.fetch=x,n.Headers=h,n.Request=v,n.Response=T);var C=t(self.fetch.bind(self));function A(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function I(e){return function t(n){return 0===arguments.length||A(n)?t:e.apply(this,arguments)}}function P(e){return function t(n,r){switch(arguments.length){case 0:return t;case 1:return A(n)?t:I((function(t){return e(n,t)}));default:return A(n)&&A(r)?t:A(n)?I((function(t){return e(t,r)})):A(r)?I((function(t){return e(n,t)})):e(n,r)}}}function S(e){return function t(n,r,o){switch(arguments.length){case 0:return t;case 1:return A(n)?t:P((function(t,r){return e(n,t,r)}));case 2:return A(n)&&A(r)?t:A(n)?P((function(t,n){return e(t,r,n)})):A(r)?P((function(t,r){return e(n,t,r)})):I((function(t){return e(n,r,t)}));default:return A(n)&&A(r)&&A(o)?t:A(n)&&A(r)?P((function(t,n){return e(t,n,o)})):A(n)&&A(o)?P((function(t,n){return e(t,r,n)})):A(r)&&A(o)?P((function(t,r){return e(n,t,r)})):A(n)?I((function(t){return e(t,r,o)})):A(r)?I((function(t){return e(n,t,o)})):A(o)?I((function(t){return e(n,r,t)})):e(n,r,o)}}}var R=S((function(e,t,n){var r=n.length;if(e>=r||e<-r)return n;var o=(r+e)%r,s=function(e,t){var n;t=t||[];var r=(e=e||[]).length,o=t.length,s=[];for(n=0;n<r;)s[s.length]=e[n],n+=1;for(n=0;n<o;)s[s.length]=t[n],n+=1;return s}(n);return s[o]=t(n[o]),s}));function U(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}function j(e,t,n){for(var r=0,o=n.length;r<o;){if(e(t,n[r]))return!0;r+=1}return!1}function L(e,t){return Object.prototype.hasOwnProperty.call(t,e)}var D="function"==typeof Object.is?Object.is:function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t},B=Object.prototype.toString,N=function(){return"[object Arguments]"===B.call(arguments)?function(e){return"[object Arguments]"===B.call(e)}:function(e){return L("callee",e)}}(),q=!{toString:null}.propertyIsEnumerable("toString"),F=["constructor","valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],k=function(){return arguments.propertyIsEnumerable("length")}(),$=function(e,t){for(var n=0;n<e.length;){if(e[n]===t)return!0;n+=1}return!1},M="function"!=typeof Object.keys||k?I((function(e){if(Object(e)!==e)return[];var t,n,r=[],o=k&&N(e);for(t in e)!L(t,e)||o&&"length"===t||(r[r.length]=t);if(q)for(n=F.length-1;n>=0;)L(t=F[n],e)&&!$(r,t)&&(r[r.length]=t),n-=1;return r})):I((function(e){return Object(e)!==e?[]:Object.keys(e)})),G=I((function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)}));function H(e,t,n,r){var o=U(e);function s(e,t){return W(e,t,n.slice(),r.slice())}return!j((function(e,t){return!j(s,t,e)}),U(t),o)}function W(e,t,n,r){if(D(e,t))return!0;var o,s,i=G(e);if(i!==G(t))return!1;if("function"==typeof e["fantasy-land/equals"]||"function"==typeof t["fantasy-land/equals"])return"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t)&&"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e);if("function"==typeof e.equals||"function"==typeof t.equals)return"function"==typeof e.equals&&e.equals(t)&&"function"==typeof t.equals&&t.equals(e);switch(i){case"Arguments":case"Array":case"Object":if("function"==typeof e.constructor&&"Promise"===(o=e.constructor,null==(s=String(o).match(/^function (\w*)/))?"":s[1]))return e===t;break;case"Boolean":case"Number":case"String":if(typeof e!=typeof t||!D(e.valueOf(),t.valueOf()))return!1;break;case"Date":if(!D(e.valueOf(),t.valueOf()))return!1;break;case"Error":return e.name===t.name&&e.message===t.message;case"RegExp":if(e.source!==t.source||e.global!==t.global||e.ignoreCase!==t.ignoreCase||e.multiline!==t.multiline||e.sticky!==t.sticky||e.unicode!==t.unicode)return!1}for(var a=n.length-1;a>=0;){if(n[a]===e)return r[a]===t;a-=1}switch(i){case"Map":return e.size===t.size&&H(e.entries(),t.entries(),n.concat([e]),r.concat([t]));case"Set":return e.size===t.size&&H(e.values(),t.values(),n.concat([e]),r.concat([t]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var u=M(e);if(u.length!==M(t).length)return!1;var c=n.concat([e]),l=r.concat([t]);for(a=u.length-1;a>=0;){var d=u[a];if(!L(d,t)||!W(t[d],e[d],c,l))return!1;a-=1}return!0}var K=P((function(e,t){return W(e,t,[],[])})),z=function(e,t){return z=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},z(e,t)};
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).nlx={})}(this,(function(e){"use strict";function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var n="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||"undefined"!=typeof global&&global||{},r="URLSearchParams"in n,o="Symbol"in n&&"iterator"in Symbol,s="FileReader"in n&&"Blob"in n&&function(){try{return new Blob,!0}catch(e){return!1}}(),i="FormData"in n,a="ArrayBuffer"in n;if(a)var c=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],u=ArrayBuffer.isView||function(e){return e&&c.indexOf(Object.prototype.toString.call(e))>-1};function l(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(e)||""===e)throw new TypeError('Invalid character in header field name: "'+e+'"');return e.toLowerCase()}function d(e){return"string"!=typeof e&&(e=String(e)),e}function f(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return o&&(t[Symbol.iterator]=function(){return t}),t}function p(e){this.map={},e instanceof p?e.forEach((function(e,t){this.append(t,e)}),this):Array.isArray(e)?e.forEach((function(e){if(2!=e.length)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+e.length);this.append(e[0],e[1])}),this):e&&Object.getOwnPropertyNames(e).forEach((function(t){this.append(t,e[t])}),this)}function h(e){if(!e._noBody)return e.bodyUsed?Promise.reject(new TypeError("Already read")):void(e.bodyUsed=!0)}function y(e){return new Promise((function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}}))}function g(e){var t=new FileReader,n=y(t);return t.readAsArrayBuffer(e),n}function m(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(e){var t;this.bodyUsed=this.bodyUsed,this._bodyInit=e,e?"string"==typeof e?this._bodyText=e:s&&Blob.prototype.isPrototypeOf(e)?this._bodyBlob=e:i&&FormData.prototype.isPrototypeOf(e)?this._bodyFormData=e:r&&URLSearchParams.prototype.isPrototypeOf(e)?this._bodyText=e.toString():a&&s&&((t=e)&&DataView.prototype.isPrototypeOf(t))?(this._bodyArrayBuffer=m(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):a&&(ArrayBuffer.prototype.isPrototypeOf(e)||u(e))?this._bodyArrayBuffer=m(e):this._bodyText=e=Object.prototype.toString.call(e):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||("string"==typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):r&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},s&&(this.blob=function(){var e=h(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer){var e=h(this);return e||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer))}if(s)return this.blob().then(g);throw new Error("could not read as ArrayBuffer")},this.text=function(){var e,t,n,r,o,s=h(this);if(s)return s;if(this._bodyBlob)return e=this._bodyBlob,t=new FileReader,n=y(t),r=/charset=([A-Za-z0-9_-]+)/.exec(e.type),o=r?r[1]:"utf-8",t.readAsText(e,o),n;if(this._bodyArrayBuffer)return Promise.resolve(function(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},i&&(this.formData=function(){return this.text().then(w)}),this.json=function(){return this.text().then(JSON.parse)},this}p.prototype.append=function(e,t){e=l(e),t=d(t);var n=this.map[e];this.map[e]=n?n+", "+t:t},p.prototype.delete=function(e){delete this.map[l(e)]},p.prototype.get=function(e){return e=l(e),this.has(e)?this.map[e]:null},p.prototype.has=function(e){return this.map.hasOwnProperty(l(e))},p.prototype.set=function(e,t){this.map[l(e)]=d(t)},p.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},p.prototype.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),f(e)},p.prototype.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),f(e)},p.prototype.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),f(e)},o&&(p.prototype[Symbol.iterator]=p.prototype.entries);var v=["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"];function _(e,t){if(!(this instanceof _))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');var r,o,s=(t=t||{}).body;if(e instanceof _){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new p(e.headers)),this.method=e.method,this.mode=e.mode,this.signal=e.signal,s||null==e._bodyInit||(s=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"same-origin",!t.headers&&this.headers||(this.headers=new p(t.headers)),this.method=(r=t.method||this.method||"GET",o=r.toUpperCase(),v.indexOf(o)>-1?o:r),this.mode=t.mode||this.mode||null,this.signal=t.signal||this.signal||function(){if("AbortController"in n)return(new AbortController).signal}(),this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&s)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(s),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==t.cache&&"no-cache"!==t.cache)){var i=/([?&])_=[^&]*/;if(i.test(this.url))this.url=this.url.replace(i,"$1_="+(new Date).getTime());else{this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}}function w(e){var t=new FormData;return e.trim().split("&").forEach((function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(o))}})),t}function T(e,t){if(!(this instanceof T))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(t||(t={}),this.type="default",this.status=void 0===t.status?200:t.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=void 0===t.statusText?"":""+t.statusText,this.headers=new p(t.headers),this.url=t.url||"",this._initBody(e)}_.prototype.clone=function(){return new _(this,{body:this._bodyInit})},b.call(_.prototype),b.call(T.prototype),T.prototype.clone=function(){return new T(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},T.error=function(){var e=new T(null,{status:200,statusText:""});return e.ok=!1,e.status=0,e.type="error",e};var E=[301,302,303,307,308];T.redirect=function(e,t){if(-1===E.indexOf(t))throw new RangeError("Invalid status code");return new T(null,{status:t,headers:{location:e}})};var O=n.DOMException;try{new O}catch(e){O=function(e,t){this.message=e,this.name=t;var n=Error(e);this.stack=n.stack},O.prototype=Object.create(Error.prototype),O.prototype.constructor=O}function x(e,t){return new Promise((function(r,o){var i=new _(e,t);if(i.signal&&i.signal.aborted)return o(new O("Aborted","AbortError"));var c=new XMLHttpRequest;function u(){c.abort()}if(c.onload=function(){var e,t,n={statusText:c.statusText,headers:(e=c.getAllResponseHeaders()||"",t=new p,e.replace(/\r?\n[\t ]+/g," ").split("\r").map((function(e){return 0===e.indexOf("\n")?e.substr(1,e.length):e})).forEach((function(e){var n=e.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();try{t.append(r,o)}catch(e){console.warn("Response "+e.message)}}})),t)};0===i.url.indexOf("file://")&&(c.status<200||c.status>599)?n.status=200:n.status=c.status,n.url="responseURL"in c?c.responseURL:n.headers.get("X-Request-URL");var o="response"in c?c.response:c.responseText;setTimeout((function(){r(new T(o,n))}),0)},c.onerror=function(){setTimeout((function(){o(new TypeError("Network request failed"))}),0)},c.ontimeout=function(){setTimeout((function(){o(new TypeError("Network request timed out"))}),0)},c.onabort=function(){setTimeout((function(){o(new O("Aborted","AbortError"))}),0)},c.open(i.method,function(e){try{return""===e&&n.location.href?n.location.href:e}catch(t){return e}}(i.url),!0),"include"===i.credentials?c.withCredentials=!0:"omit"===i.credentials&&(c.withCredentials=!1),"responseType"in c&&(s?c.responseType="blob":a&&(c.responseType="arraybuffer")),t&&"object"==typeof t.headers&&!(t.headers instanceof p||n.Headers&&t.headers instanceof n.Headers)){var f=[];Object.getOwnPropertyNames(t.headers).forEach((function(e){f.push(l(e)),c.setRequestHeader(e,d(t.headers[e]))})),i.headers.forEach((function(e,t){-1===f.indexOf(t)&&c.setRequestHeader(t,e)}))}else i.headers.forEach((function(e,t){c.setRequestHeader(t,e)}));i.signal&&(i.signal.addEventListener("abort",u),c.onreadystatechange=function(){4===c.readyState&&i.signal.removeEventListener("abort",u)}),c.send(void 0===i._bodyInit?null:i._bodyInit)}))}x.polyfill=!0,n.fetch||(n.fetch=x,n.Headers=p,n.Request=_,n.Response=T);var A=t(self.fetch.bind(self));function C(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function I(e){return function t(n){return 0===arguments.length||C(n)?t:e.apply(this,arguments)}}function P(e){return function t(n,r){switch(arguments.length){case 0:return t;case 1:return C(n)?t:I((function(t){return e(n,t)}));default:return C(n)&&C(r)?t:C(n)?I((function(t){return e(t,r)})):C(r)?I((function(t){return e(n,t)})):e(n,r)}}}function R(e){return function t(n,r,o){switch(arguments.length){case 0:return t;case 1:return C(n)?t:P((function(t,r){return e(n,t,r)}));case 2:return C(n)&&C(r)?t:C(n)?P((function(t,n){return e(t,r,n)})):C(r)?P((function(t,r){return e(n,t,r)})):I((function(t){return e(n,r,t)}));default:return C(n)&&C(r)&&C(o)?t:C(n)&&C(r)?P((function(t,n){return e(t,n,o)})):C(n)&&C(o)?P((function(t,n){return e(t,r,n)})):C(r)&&C(o)?P((function(t,r){return e(n,t,r)})):C(n)?I((function(t){return e(t,r,o)})):C(r)?I((function(t){return e(n,t,o)})):C(o)?I((function(t){return e(n,r,t)})):e(n,r,o)}}}var S=R((function(e,t,n){var r=n.length;if(e>=r||e<-r)return n;var o=(r+e)%r,s=function(e,t){var n;t=t||[];var r=(e=e||[]).length,o=t.length,s=[];for(n=0;n<r;)s[s.length]=e[n],n+=1;for(n=0;n<o;)s[s.length]=t[n],n+=1;return s}(n);return s[o]=t(n[o]),s}));function U(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}function j(e,t,n){for(var r=0,o=n.length;r<o;){if(e(t,n[r]))return!0;r+=1}return!1}function L(e,t){return Object.prototype.hasOwnProperty.call(t,e)}var D="function"==typeof Object.is?Object.is:function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t},B=Object.prototype.toString,N=function(){return"[object Arguments]"===B.call(arguments)?function(e){return"[object Arguments]"===B.call(e)}:function(e){return L("callee",e)}}(),q=!{toString:null}.propertyIsEnumerable("toString"),F=["constructor","valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],k=function(){return arguments.propertyIsEnumerable("length")}(),$=function(e,t){for(var n=0;n<e.length;){if(e[n]===t)return!0;n+=1}return!1},M="function"!=typeof Object.keys||k?I((function(e){if(Object(e)!==e)return[];var t,n,r=[],o=k&&N(e);for(t in e)!L(t,e)||o&&"length"===t||(r[r.length]=t);if(q)for(n=F.length-1;n>=0;)L(t=F[n],e)&&!$(r,t)&&(r[r.length]=t),n-=1;return r})):I((function(e){return Object(e)!==e?[]:Object.keys(e)})),G=I((function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)}));function H(e,t,n,r){var o=U(e);function s(e,t){return W(e,t,n.slice(),r.slice())}return!j((function(e,t){return!j(s,t,e)}),U(t),o)}function W(e,t,n,r){if(D(e,t))return!0;var o,s,i=G(e);if(i!==G(t))return!1;if("function"==typeof e["fantasy-land/equals"]||"function"==typeof t["fantasy-land/equals"])return"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t)&&"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e);if("function"==typeof e.equals||"function"==typeof t.equals)return"function"==typeof e.equals&&e.equals(t)&&"function"==typeof t.equals&&t.equals(e);switch(i){case"Arguments":case"Array":case"Object":if("function"==typeof e.constructor&&"Promise"===(o=e.constructor,null==(s=String(o).match(/^function (\w*)/))?"":s[1]))return e===t;break;case"Boolean":case"Number":case"String":if(typeof e!=typeof t||!D(e.valueOf(),t.valueOf()))return!1;break;case"Date":if(!D(e.valueOf(),t.valueOf()))return!1;break;case"Error":return e.name===t.name&&e.message===t.message;case"RegExp":if(e.source!==t.source||e.global!==t.global||e.ignoreCase!==t.ignoreCase||e.multiline!==t.multiline||e.sticky!==t.sticky||e.unicode!==t.unicode)return!1}for(var a=n.length-1;a>=0;){if(n[a]===e)return r[a]===t;a-=1}switch(i){case"Map":return e.size===t.size&&H(e.entries(),t.entries(),n.concat([e]),r.concat([t]));case"Set":return e.size===t.size&&H(e.values(),t.values(),n.concat([e]),r.concat([t]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var c=M(e);if(c.length!==M(t).length)return!1;var u=n.concat([e]),l=r.concat([t]);for(a=c.length-1;a>=0;){var d=c[a];if(!L(d,t)||!W(t[d],e[d],u,l))return!1;a-=1}return!0}var K=P((function(e,t){return W(e,t,[],[])})),z=function(e,t){return z=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},z(e,t)};
2
2
  /*! *****************************************************************************
3
3
  Copyright (c) Microsoft Corporation. All rights reserved.
4
4
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use
@@ -12,4 +12,4 @@
12
12
 
13
13
  See the Apache Version 2.0 License for specific language governing permissions
14
14
  and limitations under the License.
15
- ***************************************************************************** */function V(e,t){function n(){this.constructor=e}z(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function J(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,s=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=s.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=s.return)&&n.call(s)}finally{if(o)throw o.error}}return i}var Q=function(e,t){this.target=t,this.type=e},X=function(e){function t(t,n){var r=e.call(this,"error",n)||this;return r.message=t.message,r.error=t,r}return V(t,e),t}(Q),Z=function(e){function t(t,n,r){void 0===t&&(t=1e3),void 0===n&&(n="");var o=e.call(this,"close",r)||this;return o.wasClean=!0,o.code=t,o.reason=n,o}return V(t,e),t}(Q),Y=function(){if("undefined"!=typeof WebSocket)return WebSocket},ee={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+4e3*Math.random(),minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0},te=function(){function e(e,t,n){var r=this;void 0===n&&(n={}),this._listeners={error:[],message:[],open:[],close:[]},this._retryCount=-1,this._shouldReconnect=!0,this._connectLock=!1,this._binaryType="blob",this._closeCalled=!1,this._messageQueue=[],this.onclose=null,this.onerror=null,this.onmessage=null,this.onopen=null,this._handleOpen=function(e){r._debug("open event");var t=r._options.minUptime,n=void 0===t?ee.minUptime:t;clearTimeout(r._connectTimeout),r._uptimeTimeout=setTimeout((function(){return r._acceptOpen()}),n),r._ws.binaryType=r._binaryType,r._messageQueue.forEach((function(e){return r._ws.send(e)})),r._messageQueue=[],r.onopen&&r.onopen(e),r._listeners.open.forEach((function(t){return r._callEventListener(e,t)}))},this._handleMessage=function(e){r._debug("message event"),r.onmessage&&r.onmessage(e),r._listeners.message.forEach((function(t){return r._callEventListener(e,t)}))},this._handleError=function(e){r._debug("error event",e.message),r._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),r.onerror&&r.onerror(e),r._debug("exec error listeners"),r._listeners.error.forEach((function(t){return r._callEventListener(e,t)})),r._connect()},this._handleClose=function(e){r._debug("close event"),r._clearTimeouts(),r._shouldReconnect&&r._connect(),r.onclose&&r.onclose(e),r._listeners.close.forEach((function(t){return r._callEventListener(e,t)}))},this._url=e,this._protocols=t,this._options=n,this._options.startClosed&&(this._shouldReconnect=!1),this._connect()}return Object.defineProperty(e,"CONNECTING",{get:function(){return 0},enumerable:!0,configurable:!0}),Object.defineProperty(e,"OPEN",{get:function(){return 1},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSING",{get:function(){return 2},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSED",{get:function(){return 3},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CONNECTING",{get:function(){return e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"OPEN",{get:function(){return e.OPEN},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSING",{get:function(){return e.CLOSING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSED",{get:function(){return e.CLOSED},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"binaryType",{get:function(){return this._ws?this._ws.binaryType:this._binaryType},set:function(e){this._binaryType=e,this._ws&&(this._ws.binaryType=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"retryCount",{get:function(){return Math.max(this._retryCount,0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"bufferedAmount",{get:function(){return this._messageQueue.reduce((function(e,t){return"string"==typeof t?e+=t.length:t instanceof Blob?e+=t.size:e+=t.byteLength,e}),0)+(this._ws?this._ws.bufferedAmount:0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extensions",{get:function(){return this._ws?this._ws.extensions:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"protocol",{get:function(){return this._ws?this._ws.protocol:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"readyState",{get:function(){return this._ws?this._ws.readyState:this._options.startClosed?e.CLOSED:e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._ws?this._ws.url:""},enumerable:!0,configurable:!0}),e.prototype.close=function(e,t){void 0===e&&(e=1e3),this._closeCalled=!0,this._shouldReconnect=!1,this._clearTimeouts(),this._ws?this._ws.readyState!==this.CLOSED?this._ws.close(e,t):this._debug("close: already closed"):this._debug("close enqueued: no ws instance")},e.prototype.reconnect=function(e,t){this._shouldReconnect=!0,this._closeCalled=!1,this._retryCount=-1,this._ws&&this._ws.readyState!==this.CLOSED?(this._disconnect(e,t),this._connect()):this._connect()},e.prototype.send=function(e){if(this._ws&&this._ws.readyState===this.OPEN)this._debug("send",e),this._ws.send(e);else{var t=this._options.maxEnqueuedMessages,n=void 0===t?ee.maxEnqueuedMessages:t;this._messageQueue.length<n&&(this._debug("enqueue",e),this._messageQueue.push(e))}},e.prototype.addEventListener=function(e,t){this._listeners[e]&&this._listeners[e].push(t)},e.prototype.dispatchEvent=function(e){var t,n,r=this._listeners[e.type];if(r)try{for(var o=function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;return t?t.call(e):{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}(r),s=o.next();!s.done;s=o.next()){var i=s.value;this._callEventListener(e,i)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return!0},e.prototype.removeEventListener=function(e,t){this._listeners[e]&&(this._listeners[e]=this._listeners[e].filter((function(e){return e!==t})))},e.prototype._debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._options.debug&&console.log.apply(console,function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(J(arguments[t]));return e}(["RWS>"],e))},e.prototype._getNextDelay=function(){var e=this._options,t=e.reconnectionDelayGrowFactor,n=void 0===t?ee.reconnectionDelayGrowFactor:t,r=e.minReconnectionDelay,o=void 0===r?ee.minReconnectionDelay:r,s=e.maxReconnectionDelay,i=void 0===s?ee.maxReconnectionDelay:s,a=0;return this._retryCount>0&&(a=o*Math.pow(n,this._retryCount-1))>i&&(a=i),this._debug("next delay",a),a},e.prototype._wait=function(){var e=this;return new Promise((function(t){setTimeout(t,e._getNextDelay())}))},e.prototype._getNextUrl=function(e){if("string"==typeof e)return Promise.resolve(e);if("function"==typeof e){var t=e();if("string"==typeof t)return Promise.resolve(t);if(t.then)return t}throw Error("Invalid URL")},e.prototype._connect=function(){var e=this;if(!this._connectLock&&this._shouldReconnect){this._connectLock=!0;var t=this._options,n=t.maxRetries,r=void 0===n?ee.maxRetries:n,o=t.connectionTimeout,s=void 0===o?ee.connectionTimeout:o,i=t.WebSocket,a=void 0===i?Y():i;if(this._retryCount>=r)this._debug("max retries reached",this._retryCount,">=",r);else{if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),void 0===(u=a)||!u||2!==u.CLOSING)throw Error("No valid WebSocket class provided");var u;this._wait().then((function(){return e._getNextUrl(e._url)})).then((function(t){e._closeCalled||(e._debug("connect",{url:t,protocols:e._protocols}),e._ws=e._protocols?new a(t,e._protocols):new a(t),e._ws.binaryType=e._binaryType,e._connectLock=!1,e._addListeners(),e._connectTimeout=setTimeout((function(){return e._handleTimeout()}),s))}))}}},e.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new X(Error("TIMEOUT"),this))},e.prototype._disconnect=function(e,t){if(void 0===e&&(e=1e3),this._clearTimeouts(),this._ws){this._removeListeners();try{this._ws.close(e,t),this._handleClose(new Z(e,t,this))}catch(e){}}},e.prototype._acceptOpen=function(){this._debug("accept open"),this._retryCount=0},e.prototype._callEventListener=function(e,t){"handleEvent"in t?t.handleEvent(e):t(e)},e.prototype._removeListeners=function(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))},e.prototype._addListeners=function(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))},e.prototype._clearTimeouts=function(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)},e}();let ne;const re=new Uint8Array(16);function oe(){if(!ne&&(ne="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!ne))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return ne(re)}const se=[];for(let e=0;e<256;++e)se.push((e+256).toString(16).slice(1));var ie={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function ae(e,t,n){if(ie.randomUUID&&!e)return ie.randomUUID();const r=(e=e||{}).random||(e.rng||oe)();return r[6]=15&r[6]|64,r[8]=63&r[8]|128,function(e,t=0){return se[e[t+0]]+se[e[t+1]]+se[e[t+2]]+se[e[t+3]]+"-"+se[e[t+4]]+se[e[t+5]]+"-"+se[e[t+6]]+se[e[t+7]]+"-"+se[e[t+8]]+se[e[t+9]]+"-"+se[e[t+10]]+se[e[t+11]]+se[e[t+12]]+se[e[t+13]]+se[e[t+14]]+se[e[t+15]]}(r)}var ue="1.2.3-alpha.1";const ce=ue,le=console;var de;e.ResponseType=void 0,(de=e.ResponseType||(e.ResponseType={})).Application="bot",de.User="user",de.Failure="failure";const fe="NLX.Welcome",he=e=>Array.isArray(e)?e:Object.entries(e).map((([e,t])=>({slotId:e,value:t}))),pe=e=>({...e,intentId:e.flowId??e.intentId,slots:null!=e.slots?he(e.slots):e.slots}),ye=e=>e.responses,me=e=>{try{return JSON.parse(e)}catch(e){return null}},ge=e=>e.match(/(bots\.dev\.studio\.nlx\.ai|bots\.studio\.nlx\.ai|apps\.nlx\.ai|dev\.apps\.nlx\.ai)/g)?.[0]??"apps.nlx.ai",be=e=>{if(!_e(e))return e;const t=ge(e),n=new URL(e),r=new URLSearchParams(n.search),o=r.get("channelKey");return`https://${t}/c/${r.get("deploymentKey")}/${o}`},_e=e=>0===e.indexOf("wss://");e.createConversation=function(t){let n,r,o=[],s=null,i=[],a=null;const u=t.applicationUrl??"";/[-|_][a-z]{2,}[-|_][A-Z]{2,}$/.test(u)&&le.warn("Since v1.0.0, the language code is no longer added at the end of the application URL. Please remove the modifier (e.g. '-en-US') from the URL, and specify it in the `languageCode` parameter instead.");const c={voicePlusCommand:[]},l=t.conversationId??ae();let d={responses:t.responses??[],languageCode:t.languageCode,userId:t.userId,conversationId:l};const f=()=>`${be(u)}${!0===t.experimental?.completeApplicationUrl?"":`-${d.languageCode}`}`,h=(e,t)=>{d={...d,...e},_.forEach((e=>{e(ye(d),t)}))},p=()=>{const n={type:e.ResponseType.Failure,receivedAt:(new Date).getTime(),payload:{text:t.failureMessage??"We encountered an issue. Please try again soon."}};h({responses:[...d.responses,n]},n)},y=t=>{if(t?.messages.length>0){const n={type:e.ResponseType.Application,receivedAt:(new Date).getTime(),payload:{...t,messages:t.messages.map((e=>({nodeId:e.nodeId,messageId:e.messageId,text:e.text,choices:e.choices??[]})))}};h({responses:[...d.responses,n]},n),t.metadata.hasPendingDataRequest&&(x({poll:!0}),setTimeout((()=>{b({request:{structured:{poll:!0}}})}),1500))}else le.warn("Invalid message structure, expected object with field 'messages'."),p()};let m;const g=e=>{1===r?.readyState?r.send(JSON.stringify(e)):i=[...i,e]},b=async r=>{if(null!=m)return void m(r,(t=>{const n={type:e.ResponseType.Application,receivedAt:(new Date).getTime(),payload:t};h({responses:[...d.responses,n]},n)}));const s={userId:d.userId,conversationId:d.conversationId,...r,languageCode:d.languageCode,channelType:t.experimental?.channelType,environment:t.environment};if(_e(u))1===n?.readyState?n.send(JSON.stringify(s)):o=[...o,s];else try{const e=await C(f(),{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-sdk-version":ue},body:JSON.stringify(s)});if(e.status>=400)throw new Error(`Responded with ${e.status}`);const n=await e.json();y(n)}catch(e){le.warn(e),p()}};let _=[];const v=()=>{1===r?.readyState&&null!=i[0]&&(g(i[0]),i=i.slice(1))},w=()=>{E();const e=new URL(u);!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",d.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${d.languageCode}`)),e.searchParams.set("conversationId",d.conversationId),n=new te(e.href),s=setInterval((()=>{(async()=>{1===n?.readyState&&null!=o[0]&&(await b(o[0]),o=o.slice(1))})()}),500),n.onmessage=function(e){"string"==typeof e?.data&&y(me(e.data))},e.searchParams.set("voice-plus","true"),r=new te(e.href),a=setInterval((()=>{v()}),500),r.onmessage=e=>{if("string"==typeof e?.data){const t=me(e.data);null!=t&&c.voicePlusCommand.forEach((e=>{e(t)}))}}},T=()=>{if(O(),!0!==t.bidirectional)return;const e=new URL((e=>{if(_e(e))return e;const t=ge(e),n=new URL(e).pathname.split("/");return`wss://us-east-1-ws.${t}?deploymentKey=${n[2]}&channelKey=${n[3]}`})(u));!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",d.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${d.languageCode}`)),e.searchParams.set("conversationId",d.conversationId),e.searchParams.set("type","voice-plus");const n=t.headers["nlx-api-key"];_e(u)||null==n||e.searchParams.set("apiKey",n),r=new te(e.href),a=setInterval((()=>{v()}),500),r.onmessage=e=>{if("string"==typeof e?.data){const t=me(e.data);null!=t&&c.voicePlusCommand.forEach((e=>{e(t)}))}}},E=()=>{null!=s&&clearInterval(s),null!=n&&(n.onmessage=null,n.close(),n=void 0)},O=()=>{null!=a&&clearInterval(a),null!=r&&(r.onmessage=null,r.close(),r=void 0)};_e(u)&&w(),T();const x=(t,n)=>{const r={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"structured",...pe(t),context:n}};h({responses:[...d.responses,r]},r)},A=(e,t)=>{x({intentId:e},t),b({context:t,request:{structured:{intentId:e}}})},I=e=>{_=_.filter((t=>t!==e))};return{sendText:(t,n)=>{const r={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"text",text:t,context:n}};h({responses:[...d.responses,r]},r),b({context:n,request:{unstructured:{text:t}}})},sendContext:async e=>{const n=await C(`${f()}/context`,{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":d.conversationId,"nlx-sdk-version":ue},body:JSON.stringify({languageCode:d.languageCode,conversationId:d.conversationId,userId:d.userId,context:e})});if(n.status>=400)throw new Error(`Responded with ${n.status}`)},sendStructured:(e,t)=>{x(e,t),b({context:t,request:{structured:pe(e)}})},sendSlots:(e,t)=>{x({slots:e},t),b({context:t,request:{structured:{slots:he(e)}}})},sendFlow:A,sendIntent:(e,t)=>{le.warn("Calling `sendIntent` is deprecated and will be removed in a future version of the SDK. Use `sendFlow` instead."),A(e,t)},sendWelcomeFlow:e=>{A(fe,e)},sendWelcomeIntent:e=>{le.warn("Calling `sendWelcomeIntent` is deprecated and will be removed in a future version of the SDK. Use `sendWelcomeFlow` instead."),A(fe,e)},sendChoice:(t,n,r)=>{let o=[...d.responses];const s={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"choice",choiceId:t}},i=r?.responseIndex??-1,a=r?.messageIndex??-1;i>-1&&a>-1&&(o=R(i,(n=>n.type===e.ResponseType.Application?{...n,payload:{...n.payload,messages:R(a,(e=>({...e,selectedChoiceId:t})),n.payload.messages)}}:n),o)),o=[...o,s],h({responses:o},s),b({context:n,request:{structured:{nodeId:r?.nodeId,intentId:r?.intentId,choiceId:t}}})},currentConversationId:()=>d.conversationId,setLanguageCode:e=>{e!==d.languageCode?(_e(u)&&w(),T(),h({languageCode:e})):le.warn("Attempted to set language code to the one already active.")},currentLanguageCode:()=>d.languageCode,getVoiceCredentials:async(e,n)=>{const r=be(u),o=await C(`${r}-${d.languageCode}/requestToken`,{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":d.conversationId,"nlx-sdk-version":ue},body:JSON.stringify({languageCode:d.languageCode,conversationId:d.conversationId,userId:d.userId,requestToken:!0,context:e,autoTriggerWelcomeFlow:n?.autoTriggerWelcomeFlow??!0})});if(o.status>=400)throw new Error(`Responded with ${o.status}`);const s=await o.json();if(null==s?.url)throw new Error("Invalid response");return s},subscribe:e=>(_=[..._,e],e(ye(d)),()=>{I(e)}),unsubscribe:I,unsubscribeAll:()=>{_=[]},reset:e=>{h({conversationId:ae(),responses:!0===e?.clearResponses?[]:d.responses}),_e(u)&&w(),T()},destroy:()=>{_=[],_e(u)&&E(),O()},setRequestOverride:e=>{m=e},addEventListener:(e,t)=>{c[e]=[...c[e],t]},removeEventListener:(e,t)=>{c[e]=c[e].filter((e=>e!==t))},sendVoicePlusContext:e=>{g({context:e})}}},e.getCurrentExpirationTimestamp=t=>{let n=null;return t.forEach((t=>{t.type===e.ResponseType.Application&&null!=t.payload.expirationTimestamp&&(n=t.payload.expirationTimestamp)})),n},e.isConfigValid=e=>(e.applicationUrl??"").length>0,e.promisify=function(t,n,r=1e4){return async o=>await new Promise(((s,i)=>{const a=setTimeout((()=>{i(new Error("The request timed out.")),n.unsubscribe(u)}),r),u=(t,r)=>{r?.type!==e.ResponseType.Application&&r?.type!==e.ResponseType.Failure||(clearTimeout(a),n.unsubscribe(u),s(r))};n.subscribe(u),t(o)}))},e.shouldReinitialize=(e,t)=>!K(e,t),e.version=ce}));
15
+ ***************************************************************************** */function V(e,t){function n(){this.constructor=e}z(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function J(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,s=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=s.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=s.return)&&n.call(s)}finally{if(o)throw o.error}}return i}var Q=function(e,t){this.target=t,this.type=e},X=function(e){function t(t,n){var r=e.call(this,"error",n)||this;return r.message=t.message,r.error=t,r}return V(t,e),t}(Q),Z=function(e){function t(t,n,r){void 0===t&&(t=1e3),void 0===n&&(n="");var o=e.call(this,"close",r)||this;return o.wasClean=!0,o.code=t,o.reason=n,o}return V(t,e),t}(Q),Y=function(){if("undefined"!=typeof WebSocket)return WebSocket},ee={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+4e3*Math.random(),minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0},te=function(){function e(e,t,n){var r=this;void 0===n&&(n={}),this._listeners={error:[],message:[],open:[],close:[]},this._retryCount=-1,this._shouldReconnect=!0,this._connectLock=!1,this._binaryType="blob",this._closeCalled=!1,this._messageQueue=[],this.onclose=null,this.onerror=null,this.onmessage=null,this.onopen=null,this._handleOpen=function(e){r._debug("open event");var t=r._options.minUptime,n=void 0===t?ee.minUptime:t;clearTimeout(r._connectTimeout),r._uptimeTimeout=setTimeout((function(){return r._acceptOpen()}),n),r._ws.binaryType=r._binaryType,r._messageQueue.forEach((function(e){return r._ws.send(e)})),r._messageQueue=[],r.onopen&&r.onopen(e),r._listeners.open.forEach((function(t){return r._callEventListener(e,t)}))},this._handleMessage=function(e){r._debug("message event"),r.onmessage&&r.onmessage(e),r._listeners.message.forEach((function(t){return r._callEventListener(e,t)}))},this._handleError=function(e){r._debug("error event",e.message),r._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),r.onerror&&r.onerror(e),r._debug("exec error listeners"),r._listeners.error.forEach((function(t){return r._callEventListener(e,t)})),r._connect()},this._handleClose=function(e){r._debug("close event"),r._clearTimeouts(),r._shouldReconnect&&r._connect(),r.onclose&&r.onclose(e),r._listeners.close.forEach((function(t){return r._callEventListener(e,t)}))},this._url=e,this._protocols=t,this._options=n,this._options.startClosed&&(this._shouldReconnect=!1),this._connect()}return Object.defineProperty(e,"CONNECTING",{get:function(){return 0},enumerable:!0,configurable:!0}),Object.defineProperty(e,"OPEN",{get:function(){return 1},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSING",{get:function(){return 2},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSED",{get:function(){return 3},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CONNECTING",{get:function(){return e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"OPEN",{get:function(){return e.OPEN},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSING",{get:function(){return e.CLOSING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSED",{get:function(){return e.CLOSED},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"binaryType",{get:function(){return this._ws?this._ws.binaryType:this._binaryType},set:function(e){this._binaryType=e,this._ws&&(this._ws.binaryType=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"retryCount",{get:function(){return Math.max(this._retryCount,0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"bufferedAmount",{get:function(){return this._messageQueue.reduce((function(e,t){return"string"==typeof t?e+=t.length:t instanceof Blob?e+=t.size:e+=t.byteLength,e}),0)+(this._ws?this._ws.bufferedAmount:0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extensions",{get:function(){return this._ws?this._ws.extensions:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"protocol",{get:function(){return this._ws?this._ws.protocol:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"readyState",{get:function(){return this._ws?this._ws.readyState:this._options.startClosed?e.CLOSED:e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._ws?this._ws.url:""},enumerable:!0,configurable:!0}),e.prototype.close=function(e,t){void 0===e&&(e=1e3),this._closeCalled=!0,this._shouldReconnect=!1,this._clearTimeouts(),this._ws?this._ws.readyState!==this.CLOSED?this._ws.close(e,t):this._debug("close: already closed"):this._debug("close enqueued: no ws instance")},e.prototype.reconnect=function(e,t){this._shouldReconnect=!0,this._closeCalled=!1,this._retryCount=-1,this._ws&&this._ws.readyState!==this.CLOSED?(this._disconnect(e,t),this._connect()):this._connect()},e.prototype.send=function(e){if(this._ws&&this._ws.readyState===this.OPEN)this._debug("send",e),this._ws.send(e);else{var t=this._options.maxEnqueuedMessages,n=void 0===t?ee.maxEnqueuedMessages:t;this._messageQueue.length<n&&(this._debug("enqueue",e),this._messageQueue.push(e))}},e.prototype.addEventListener=function(e,t){this._listeners[e]&&this._listeners[e].push(t)},e.prototype.dispatchEvent=function(e){var t,n,r=this._listeners[e.type];if(r)try{for(var o=function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;return t?t.call(e):{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}(r),s=o.next();!s.done;s=o.next()){var i=s.value;this._callEventListener(e,i)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return!0},e.prototype.removeEventListener=function(e,t){this._listeners[e]&&(this._listeners[e]=this._listeners[e].filter((function(e){return e!==t})))},e.prototype._debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._options.debug&&console.log.apply(console,function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(J(arguments[t]));return e}(["RWS>"],e))},e.prototype._getNextDelay=function(){var e=this._options,t=e.reconnectionDelayGrowFactor,n=void 0===t?ee.reconnectionDelayGrowFactor:t,r=e.minReconnectionDelay,o=void 0===r?ee.minReconnectionDelay:r,s=e.maxReconnectionDelay,i=void 0===s?ee.maxReconnectionDelay:s,a=0;return this._retryCount>0&&(a=o*Math.pow(n,this._retryCount-1))>i&&(a=i),this._debug("next delay",a),a},e.prototype._wait=function(){var e=this;return new Promise((function(t){setTimeout(t,e._getNextDelay())}))},e.prototype._getNextUrl=function(e){if("string"==typeof e)return Promise.resolve(e);if("function"==typeof e){var t=e();if("string"==typeof t)return Promise.resolve(t);if(t.then)return t}throw Error("Invalid URL")},e.prototype._connect=function(){var e=this;if(!this._connectLock&&this._shouldReconnect){this._connectLock=!0;var t=this._options,n=t.maxRetries,r=void 0===n?ee.maxRetries:n,o=t.connectionTimeout,s=void 0===o?ee.connectionTimeout:o,i=t.WebSocket,a=void 0===i?Y():i;if(this._retryCount>=r)this._debug("max retries reached",this._retryCount,">=",r);else{if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),void 0===(c=a)||!c||2!==c.CLOSING)throw Error("No valid WebSocket class provided");var c;this._wait().then((function(){return e._getNextUrl(e._url)})).then((function(t){e._closeCalled||(e._debug("connect",{url:t,protocols:e._protocols}),e._ws=e._protocols?new a(t,e._protocols):new a(t),e._ws.binaryType=e._binaryType,e._connectLock=!1,e._addListeners(),e._connectTimeout=setTimeout((function(){return e._handleTimeout()}),s))}))}}},e.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new X(Error("TIMEOUT"),this))},e.prototype._disconnect=function(e,t){if(void 0===e&&(e=1e3),this._clearTimeouts(),this._ws){this._removeListeners();try{this._ws.close(e,t),this._handleClose(new Z(e,t,this))}catch(e){}}},e.prototype._acceptOpen=function(){this._debug("accept open"),this._retryCount=0},e.prototype._callEventListener=function(e,t){"handleEvent"in t?t.handleEvent(e):t(e)},e.prototype._removeListeners=function(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))},e.prototype._addListeners=function(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))},e.prototype._clearTimeouts=function(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)},e}();let ne;const re=new Uint8Array(16);function oe(){if(!ne&&(ne="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!ne))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return ne(re)}const se=[];for(let e=0;e<256;++e)se.push((e+256).toString(16).slice(1));var ie={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function ae(e,t,n){if(ie.randomUUID&&!e)return ie.randomUUID();const r=(e=e||{}).random||(e.rng||oe)();return r[6]=15&r[6]|64,r[8]=63&r[8]|128,function(e,t=0){return se[e[t+0]]+se[e[t+1]]+se[e[t+2]]+se[e[t+3]]+"-"+se[e[t+4]]+se[e[t+5]]+"-"+se[e[t+6]]+se[e[t+7]]+"-"+se[e[t+8]]+se[e[t+9]]+"-"+se[e[t+10]]+se[e[t+11]]+se[e[t+12]]+se[e[t+13]]+se[e[t+14]]+se[e[t+15]]}(r)}var ce="1.2.3";const ue=ce,le=console;var de;e.ResponseType=void 0,(de=e.ResponseType||(e.ResponseType={})).Application="bot",de.User="user",de.Failure="failure";const fe="NLX.Welcome",pe=e=>Array.isArray(e)?e:Object.entries(e).map((([e,t])=>({slotId:e,value:t}))),he=e=>({...e,intentId:e.flowId??e.intentId,slots:null!=e.slots?pe(e.slots):e.slots}),ye=e=>e.responses,ge=e=>{try{return JSON.parse(e)}catch(e){return null}},me=e=>e.match(/(bots\.dev\.studio\.nlx\.ai|bots\.studio\.nlx\.ai|apps\.nlx\.ai|dev\.apps\.nlx\.ai)/g)?.[0]??"apps.nlx.ai",be=e=>{if(!ve(e))return e;const t=me(e),n=new URL(e),r=new URLSearchParams(n.search),o=r.get("channelKey");return`https://${t}/c/${r.get("deploymentKey")}/${o}`},ve=e=>0===e.indexOf("wss://");e.createConversation=function(t){let n,r,o=[],s=null,i=[],a=null;const c=t.applicationUrl??"";/[-|_][a-z]{2,}[-|_][A-Z]{2,}$/.test(c)&&le.warn("Since v1.0.0, the language code is no longer added at the end of the application URL. Please remove the modifier (e.g. '-en-US') from the URL, and specify it in the `languageCode` parameter instead.");const u={voicePlusCommand:[]},l=t.conversationId??ae();let d={responses:t.responses??[],languageCode:t.languageCode,userId:t.userId,conversationId:l};const f=()=>`${be(c)}${!0===t.experimental?.completeApplicationUrl?"":`-${d.languageCode}`}`,p=(e,t)=>{d={...d,...e},v.forEach((e=>{e(ye(d),t)}))},h=()=>{const n={type:e.ResponseType.Failure,receivedAt:(new Date).getTime(),payload:{text:t.failureMessage??"We encountered an issue. Please try again soon."}};p({responses:[...d.responses,n]},n)},y=t=>{if(t?.messages.length>0){const n={type:e.ResponseType.Application,receivedAt:(new Date).getTime(),payload:{...t,messages:t.messages.map((e=>({nodeId:e.nodeId,messageId:e.messageId,text:e.text,choices:e.choices??[]})))}};p({responses:[...d.responses,n]},n),t.metadata.hasPendingDataRequest&&(x({poll:!0}),setTimeout((()=>{b({request:{structured:{poll:!0}}})}),1500))}else le.warn("Invalid message structure, expected object with field 'messages'."),h()};let g;const m=e=>{1===r?.readyState?r.send(JSON.stringify(e)):i=[...i,e]},b=async r=>{if(null!=g)return void g(r,(t=>{le.warn("Using the second argument in `setRequestOverride` is deprecated. Use `conversationHandler.appendMessageToTranscript` instead.");const n={type:e.ResponseType.Application,receivedAt:(new Date).getTime(),payload:t};p({responses:[...d.responses,n]},n)}));const s={userId:d.userId,conversationId:d.conversationId,...r,languageCode:d.languageCode,channelType:t.experimental?.channelType,environment:t.environment};if(ve(c))1===n?.readyState?n.send(JSON.stringify(s)):o=[...o,s];else try{const e=await A(f(),{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-sdk-version":ce},body:JSON.stringify(s)});if(e.status>=400)throw new Error(`Responded with ${e.status}`);const n=await e.json();y(n)}catch(e){le.warn(e),h()}};let v=[];const _=()=>{1===r?.readyState&&null!=i[0]&&(m(i[0]),i=i.slice(1))},w=()=>{E();const e=new URL(c);!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",d.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${d.languageCode}`)),e.searchParams.set("conversationId",d.conversationId),n=new te(e.href),s=setInterval((()=>{(async()=>{1===n?.readyState&&null!=o[0]&&(await b(o[0]),o=o.slice(1))})()}),500),n.onmessage=function(e){"string"==typeof e?.data&&y(ge(e.data))},e.searchParams.set("voice-plus","true"),r=new te(e.href),a=setInterval((()=>{_()}),500),r.onmessage=e=>{if("string"==typeof e?.data){const t=ge(e.data);null!=t&&u.voicePlusCommand.forEach((e=>{e(t)}))}}},T=()=>{if(O(),!0!==t.bidirectional)return;const e=new URL((e=>{if(ve(e))return e;const t=me(e),n=new URL(e).pathname.split("/");return`wss://us-east-1-ws.${t}?deploymentKey=${n[2]}&channelKey=${n[3]}`})(c));!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",d.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${d.languageCode}`)),e.searchParams.set("conversationId",d.conversationId),e.searchParams.set("type","voice-plus");const n=t.headers["nlx-api-key"];ve(c)||null==n||e.searchParams.set("apiKey",n),r=new te(e.href),a=setInterval((()=>{_()}),500),r.onmessage=e=>{if("string"==typeof e?.data){const t=ge(e.data);null!=t&&u.voicePlusCommand.forEach((e=>{e(t)}))}}},E=()=>{null!=s&&clearInterval(s),null!=n&&(n.onmessage=null,n.close(),n=void 0)},O=()=>{null!=a&&clearInterval(a),null!=r&&(r.onmessage=null,r.close(),r=void 0)};ve(c)&&w(),T();const x=(t,n)=>{const r={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"structured",...he(t),context:n}};p({responses:[...d.responses,r]},r)},C=(e,t)=>{x({intentId:e},t),b({context:t,request:{structured:{intentId:e}}})},I=e=>{v=v.filter((t=>t!==e))};return{sendText:(t,n)=>{const r={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"text",text:t,context:n}};p({responses:[...d.responses,r]},r),b({context:n,request:{unstructured:{text:t}}})},sendContext:async e=>{const n=await A(`${f()}/context`,{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":d.conversationId,"nlx-sdk-version":ce},body:JSON.stringify({languageCode:d.languageCode,conversationId:d.conversationId,userId:d.userId,context:e})});if(n.status>=400)throw new Error(`Responded with ${n.status}`)},appendMessageToTranscript:e=>{const t={...e,receivedAt:e.receivedAt??(new Date).getTime()};p({responses:[...d.responses,t]},t)},sendStructured:(e,t)=>{x(e,t),b({context:t,request:{structured:he(e)}})},sendSlots:(e,t)=>{x({slots:e},t),b({context:t,request:{structured:{slots:pe(e)}}})},sendFlow:C,sendIntent:(e,t)=>{le.warn("Calling `sendIntent` is deprecated and will be removed in a future version of the SDK. Use `sendFlow` instead."),C(e,t)},sendWelcomeFlow:e=>{C(fe,e)},sendWelcomeIntent:e=>{le.warn("Calling `sendWelcomeIntent` is deprecated and will be removed in a future version of the SDK. Use `sendWelcomeFlow` instead."),C(fe,e)},sendChoice:(t,n,r)=>{let o=[...d.responses];const s={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"choice",choiceId:t}},i=r?.responseIndex??-1,a=r?.messageIndex??-1;i>-1&&a>-1&&(o=S(i,(n=>n.type===e.ResponseType.Application?{...n,payload:{...n.payload,messages:S(a,(e=>({...e,selectedChoiceId:t})),n.payload.messages)}}:n),o)),o=[...o,s],p({responses:o},s),b({context:n,request:{structured:{nodeId:r?.nodeId,intentId:r?.intentId,choiceId:t}}})},currentConversationId:()=>d.conversationId,setLanguageCode:e=>{e!==d.languageCode?(ve(c)&&w(),T(),p({languageCode:e})):le.warn("Attempted to set language code to the one already active.")},currentLanguageCode:()=>d.languageCode,getVoiceCredentials:async(e,n)=>{const r=be(c),o=await A(`${r}-${d.languageCode}/requestToken`,{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":d.conversationId,"nlx-sdk-version":ce},body:JSON.stringify({languageCode:d.languageCode,conversationId:d.conversationId,userId:d.userId,requestToken:!0,context:e,autoTriggerWelcomeFlow:n?.autoTriggerWelcomeFlow??!0})});if(o.status>=400)throw new Error(`Responded with ${o.status}`);const s=await o.json();if(null==s?.url)throw new Error("Invalid response");return s},subscribe:e=>(v=[...v,e],e(ye(d)),()=>{I(e)}),unsubscribe:I,unsubscribeAll:()=>{v=[]},reset:e=>{p({conversationId:ae(),responses:!0===e?.clearResponses?[]:d.responses}),ve(c)&&w(),T()},destroy:()=>{v=[],ve(c)&&E(),O()},setRequestOverride:e=>{g=e},addEventListener:(e,t)=>{u[e]=[...u[e],t]},removeEventListener:(e,t)=>{u[e]=u[e].filter((e=>e!==t))},sendVoicePlusContext:e=>{m({context:e})}}},e.getCurrentExpirationTimestamp=t=>{let n=null;return t.forEach((t=>{t.type===e.ResponseType.Application&&null!=t.payload.expirationTimestamp&&(n=t.payload.expirationTimestamp)})),n},e.isConfigValid=e=>(e.applicationUrl??"").length>0,e.promisify=function(t,n,r=1e4){return async o=>await new Promise(((s,i)=>{const a=setTimeout((()=>{i(new Error("The request timed out.")),n.unsubscribe(c)}),r),c=(t,r)=>{r?.type!==e.ResponseType.Application&&r?.type!==e.ResponseType.Failure||(clearTimeout(a),n.unsubscribe(c),s(r))};n.subscribe(c),t(o)}))},e.shouldReinitialize=(e,t)=>!K(e,t),e.version=ue}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nlxai/core",
3
- "version": "1.2.3-alpha.1",
3
+ "version": "1.2.3",
4
4
  "description": "Low-level SDK for building NLX experiences",
5
5
  "type": "module",
6
6
  "main": "lib/index.cjs",
@@ -16,38 +16,38 @@
16
16
  },
17
17
  "scripts": {
18
18
  "build": "rm -rf lib && rollup -c --configPlugin typescript --configImportAttributesKey with",
19
- "docs": "rm -rf docs/ && typedoc && concat-md --decrease-title-levels --dir-name-as-title docs/ > docs/index.md",
20
19
  "lint:check": "eslint src/ --ext .ts,.tsx,.js,.jsx --max-warnings 0",
21
20
  "lint": "eslint src/ --ext .ts,.tsx,.js,.jsx --fix",
22
21
  "prepublish": "npm run build",
23
- "preview-docs": "npm run docs && comrak --unsafe --gfm -o docs/index.html docs/index.md && open docs/index.html",
24
- "publish-docs": "npm run docs && mv docs/index.md ../website/src/content/headless-api-reference.md",
25
22
  "test": "typedoc --emit none",
26
- "tsc": "tsc"
23
+ "tsc": "tsc",
24
+ "update-readme:docs": "rm -rf docs/ && typedoc",
25
+ "update-readme:merge": "../../scripts/transclude-markdown.js",
26
+ "update-readme": "npm run update-readme:docs && npm run update-readme:merge"
27
27
  },
28
28
  "author": "Peter Szerzo <peter@nlx.ai>",
29
29
  "license": "MIT",
30
30
  "devDependencies": {
31
- "@types/isomorphic-fetch": "^0.0.36",
32
- "@types/node": "^22.10.1",
33
- "@types/ramda": "0.29.1",
31
+ "@types/isomorphic-fetch": "^0.0.39",
32
+ "@types/node": "^24.10.1",
33
+ "@types/ramda": "0.31.1",
34
34
  "@types/uuid": "^9.0.7",
35
35
  "concat-md": "^0.5.1",
36
36
  "eslint-config-nlx": "*",
37
37
  "prettier": "^3.1.0",
38
38
  "rollup-config-nlx": "*",
39
- "typedoc": "^0.25.13",
40
- "typedoc-plugin-markdown": "^3.17.1",
39
+ "typedoc": "^0.28.14",
40
+ "typedoc-plugin-markdown": "^4.9.0",
41
41
  "typescript": "^5.5.4"
42
42
  },
43
43
  "dependencies": {
44
44
  "isomorphic-fetch": "^3.0.0",
45
- "ramda": "^0.29.1",
45
+ "ramda": "^0.32.0",
46
46
  "reconnecting-websocket": "^4.4.0",
47
47
  "uuid": "^9.0.1"
48
48
  },
49
49
  "publishConfig": {
50
50
  "access": "public"
51
51
  },
52
- "gitHead": "13e26a6c67af7aa6c8dc100ad83d9c33e1112a08"
52
+ "gitHead": "3902161e95745dd4a9cfb68bb469755a62b421f5"
53
53
  }
package/typedoc.cjs CHANGED
@@ -1,11 +1,18 @@
1
1
  /** @type { import('typedoc').TypeDocOptions & { hideInPageTOC?: boolean, hideBreadcrumbs?: boolean} } */
2
2
  module.exports = {
3
3
  entryPoints: ["./src/index.ts"],
4
+ hidePageHeader: true,
5
+ hidePageTitle: true,
4
6
  hideBreadcrumbs: true,
5
- hideInPageTOC: true,
7
+ formatWithPrettier: true,
8
+ readme: "none",
6
9
  out: "docs",
10
+ useCodeBlocks: true,
7
11
  plugin: ["typedoc-plugin-markdown"],
8
- readme: "none",
12
+ router: "module",
13
+ excludeInternal: true,
14
+ disableSources: true,
15
+ groupOrder: ["Functions", "Variables", "Interfaces", "*"],
9
16
  sort: ["source-order", "kind", "instance-first", "alphabetical"],
10
17
  treatValidationWarningsAsErrors: true,
11
18
  treatWarningsAsErrors: true,