@selfcommunity/utils 0.1.18 → 0.1.19-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,10 +3,11 @@ import { isValidUrl, isValidUrls, urlReplacer, getDomain, appendURLSearchParams,
3
3
  import { getHighestSafeWindowContext, getWindowWidth, getWindowHeight, isClientSideRendering } from './utils/window';
4
4
  import { mergeDeep, isObject } from './utils/object';
5
5
  import { loadVersionBrowser } from './utils/browser';
6
+ import LRUCache, { LruCache, LruCacheType, CacheStrategies } from './utils/cache';
6
7
  import { Logger } from './utils/logger';
7
8
  import WSClient, { WSClientType, WSClientPropTypes } from './utils/websocket';
8
9
  /**
9
10
  * Export all utilities
10
11
  */
11
- export { capitalize, isString, stripHtml, camelCase, copyTextToClipboard, fallbackCopyTextToClipboard, random, isValidUrl, isValidUrls, urlReplacer, getDomain, appendURLSearchParams, urlB64ToUint8Array, getHighestSafeWindowContext, getWindowWidth, getWindowHeight, isClientSideRendering, Logger, mergeDeep, isObject, WSClient, WSClientType, WSClientPropTypes, loadVersionBrowser };
12
+ export { capitalize, isString, stripHtml, camelCase, copyTextToClipboard, fallbackCopyTextToClipboard, random, isValidUrl, isValidUrls, urlReplacer, getDomain, appendURLSearchParams, urlB64ToUint8Array, getHighestSafeWindowContext, getWindowWidth, getWindowHeight, isClientSideRendering, Logger, mergeDeep, isObject, WSClient, WSClientType, WSClientPropTypes, loadVersionBrowser, LRUCache, LruCache, LruCacheType, CacheStrategies };
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACpI,OAAO,EAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AACvH,OAAO,EAAC,2BAA2B,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAC,MAAM,gBAAgB,CAAC;AACnH,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACtC,OAAO,QAAQ,EAAE,EAAC,YAAY,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAE5E;;GAEG;AACH,OAAO,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,2BAA2B,EAC3B,MAAM,EACN,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EACnB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACpI,OAAO,EAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AACvH,OAAO,EAAC,2BAA2B,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAC,MAAM,gBAAgB,CAAC;AACnH,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AACnD,OAAO,QAAQ,EAAE,EAAC,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAC,MAAM,eAAe,CAAC;AAChF,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACtC,OAAO,QAAQ,EAAE,EAAC,YAAY,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAE5E;;GAEG;AACH,OAAO,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,2BAA2B,EAC3B,MAAM,EACN,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,eAAe,EAChB,CAAC"}
package/lib/cjs/index.js CHANGED
@@ -1,9 +1,32 @@
1
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.loadVersionBrowser = exports.WSClient = exports.isObject = exports.mergeDeep = exports.Logger = exports.isClientSideRendering = exports.getWindowHeight = exports.getWindowWidth = exports.getHighestSafeWindowContext = exports.urlB64ToUint8Array = exports.appendURLSearchParams = exports.getDomain = exports.urlReplacer = exports.isValidUrls = exports.isValidUrl = exports.random = exports.fallbackCopyTextToClipboard = exports.copyTextToClipboard = exports.camelCase = exports.stripHtml = exports.isString = exports.capitalize = void 0;
29
+ exports.CacheStrategies = exports.LruCache = exports.LRUCache = exports.loadVersionBrowser = exports.WSClient = exports.isObject = exports.mergeDeep = exports.Logger = exports.isClientSideRendering = exports.getWindowHeight = exports.getWindowWidth = exports.getHighestSafeWindowContext = exports.urlB64ToUint8Array = exports.appendURLSearchParams = exports.getDomain = exports.urlReplacer = exports.isValidUrls = exports.isValidUrl = exports.random = exports.fallbackCopyTextToClipboard = exports.copyTextToClipboard = exports.camelCase = exports.stripHtml = exports.isString = exports.capitalize = void 0;
7
30
  const string_1 = require("./utils/string");
8
31
  Object.defineProperty(exports, "capitalize", { enumerable: true, get: function () { return string_1.capitalize; } });
9
32
  Object.defineProperty(exports, "isString", { enumerable: true, get: function () { return string_1.isString; } });
@@ -29,6 +52,10 @@ Object.defineProperty(exports, "mergeDeep", { enumerable: true, get: function ()
29
52
  Object.defineProperty(exports, "isObject", { enumerable: true, get: function () { return object_1.isObject; } });
30
53
  const browser_1 = require("./utils/browser");
31
54
  Object.defineProperty(exports, "loadVersionBrowser", { enumerable: true, get: function () { return browser_1.loadVersionBrowser; } });
55
+ const cache_1 = __importStar(require("./utils/cache"));
56
+ exports.LRUCache = cache_1.default;
57
+ Object.defineProperty(exports, "LruCache", { enumerable: true, get: function () { return cache_1.LruCache; } });
58
+ Object.defineProperty(exports, "CacheStrategies", { enumerable: true, get: function () { return cache_1.CacheStrategies; } });
32
59
  const logger_1 = require("./utils/logger");
33
60
  Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return logger_1.Logger; } });
34
61
  const websocket_1 = __importDefault(require("./utils/websocket"));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,2CAAoI;AAYlI,2FAZM,mBAAU,OAYN;AACV,yFAbkB,iBAAQ,OAalB;AACR,0FAd4B,kBAAS,OAc5B;AACT,0FAfuC,kBAAS,OAevC;AACT,oGAhBkD,4BAAmB,OAgBlD;AACnB,4GAjBuE,oCAA2B,OAiBvE;AAC3B,uFAlBoG,eAAM,OAkBpG;AAjBR,qCAAuH;AAkBrH,2FAlBM,gBAAU,OAkBN;AACV,4FAnBkB,iBAAW,OAmBlB;AACX,4FApB+B,iBAAW,OAoB/B;AACX,0FArB4C,eAAS,OAqB5C;AACT,sGAtBuD,2BAAqB,OAsBvD;AACrB,mGAvB8E,wBAAkB,OAuB9E;AAtBpB,2CAAmH;AAuBjH,4GAvBM,oCAA2B,OAuBN;AAC3B,+FAxBmC,uBAAc,OAwBnC;AACd,gGAzBmD,wBAAe,OAyBnD;AACf,sGA1BoE,8BAAqB,OA0BpE;AAzBvB,2CAAmD;AA2BjD,0FA3BM,kBAAS,OA2BN;AACT,yFA5BiB,iBAAQ,OA4BjB;AA3BV,6CAAmD;AA+BjD,mGA/BM,4BAAkB,OA+BN;AA9BpB,2CAAsC;AAwBpC,uFAxBM,eAAM,OAwBN;AAvBR,kEAA4E;AA0B1E,mBA1BK,mBAAQ,CA0BL"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAoI;AAalI,2FAbM,mBAAU,OAaN;AACV,yFAdkB,iBAAQ,OAclB;AACR,0FAf4B,kBAAS,OAe5B;AACT,0FAhBuC,kBAAS,OAgBvC;AACT,oGAjBkD,4BAAmB,OAiBlD;AACnB,4GAlBuE,oCAA2B,OAkBvE;AAC3B,uFAnBoG,eAAM,OAmBpG;AAlBR,qCAAuH;AAmBrH,2FAnBM,gBAAU,OAmBN;AACV,4FApBkB,iBAAW,OAoBlB;AACX,4FArB+B,iBAAW,OAqB/B;AACX,0FAtB4C,eAAS,OAsB5C;AACT,sGAvBuD,2BAAqB,OAuBvD;AACrB,mGAxB8E,wBAAkB,OAwB9E;AAvBpB,2CAAmH;AAwBjH,4GAxBM,oCAA2B,OAwBN;AAC3B,+FAzBmC,uBAAc,OAyBnC;AACd,gGA1BmD,wBAAe,OA0BnD;AACf,sGA3BoE,8BAAqB,OA2BpE;AA1BvB,2CAAmD;AA4BjD,0FA5BM,kBAAS,OA4BN;AACT,yFA7BiB,iBAAQ,OA6BjB;AA5BV,6CAAmD;AAgCjD,mGAhCM,4BAAkB,OAgCN;AA/BpB,uDAAgF;AAgC9E,mBAhCK,eAAQ,CAgCL;AACR,yFAjCgB,gBAAQ,OAiChB;AAER,gGAnCwC,uBAAe,OAmCxC;AAlCjB,2CAAsC;AAwBpC,uFAxBM,eAAM,OAwBN;AAvBR,kEAA4E;AA0B1E,mBA1BK,mBAAQ,CA0BL"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * LruCache interface
3
+ */
4
+ export interface LruCacheType<T> {
5
+ get: (key: string, value?: T) => T;
6
+ set: (key: string, value: T) => void;
7
+ hasKey: (key: string) => boolean;
8
+ delete: (key: string) => void;
9
+ deleteKeys: (keys: string[]) => void;
10
+ deleteKeysWithPrefix: (prefix: string) => void;
11
+ clean: () => void;
12
+ evaluate: () => void;
13
+ }
14
+ /**
15
+ * LruCache
16
+ */
17
+ export declare class LruCache<T> {
18
+ private values;
19
+ private maxEntries;
20
+ /**
21
+ * Initialize Cache
22
+ * @param maxEntries
23
+ */
24
+ constructor(maxEntries?: number);
25
+ /**
26
+ * Get a key from the map store
27
+ * @param key
28
+ * @param value
29
+ */
30
+ get(key: string, value?: T): T;
31
+ /**
32
+ * Set a key in the store
33
+ * @param key
34
+ * @param value
35
+ */
36
+ set(key: string, value: T): void;
37
+ /**
38
+ * Check if key is in cache
39
+ * @param key
40
+ */
41
+ hasKey(key: string): boolean;
42
+ /**
43
+ * Delete a key in the store
44
+ * @param key
45
+ */
46
+ delete(key: string): void;
47
+ /**
48
+ * Delete all entry with prefix keys
49
+ * @param keys
50
+ */
51
+ deleteKeys(keys: string[]): void;
52
+ /**
53
+ * Delete all entry with prefix keys
54
+ * @param prefix
55
+ */
56
+ deleteKeysWithPrefix(prefix: string): void;
57
+ /**
58
+ * Clean the store
59
+ */
60
+ clean(): void;
61
+ /**
62
+ * Print the store in the console
63
+ * Only for debug
64
+ */
65
+ evaluate(): void;
66
+ }
67
+ /**
68
+ * Define the various types of caching strategies
69
+ */
70
+ export declare enum CacheStrategies {
71
+ CACHE_FIRST = "Cache-first",
72
+ NETWORK_ONLY = "Network-only",
73
+ STALE_WHILE_REVALIDATE = "Stale-While-Revalidate"
74
+ }
75
+ /**
76
+ * Export global cache
77
+ */
78
+ declare const cache: LruCacheType<any>;
79
+ export default cache;
80
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/utils/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACnC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACrC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACjC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,UAAU,CAAC;IAEnB;;;OAGG;gBACS,UAAU,SAAQ;IAO9B;;;;OAIG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC;IAgBrC;;;;OAIG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IASvC;;;OAGG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAInC;;;OAGG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOhC;;;OAGG;IACI,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IASvC;;;OAGG;IACI,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQjD;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB;;;OAGG;IACI,QAAQ,IAAI,IAAI;CAGxB;AAED;;GAEG;AACH,oBAAY,eAAe;IACzB,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;IAC7B,sBAAsB,2BAA2B;CAClD;AAED;;GAEG;AACH,QAAA,MAAM,KAAK,EAAE,YAAY,CAAC,GAAG,CAAuB,CAAC;AACrD,eAAe,KAAK,CAAC"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CacheStrategies = exports.LruCache = void 0;
4
+ /**
5
+ * LruCache
6
+ */
7
+ class LruCache {
8
+ /**
9
+ * Initialize Cache
10
+ * @param maxEntries
11
+ */
12
+ constructor(maxEntries = 10000) {
13
+ this.values = new Map();
14
+ this.maxEntries = maxEntries;
15
+ if (typeof window !== 'undefined') {
16
+ window['__viewSCCache'] = this.values;
17
+ }
18
+ }
19
+ /**
20
+ * Get a key from the map store
21
+ * @param key
22
+ * @param value
23
+ */
24
+ get(key, value) {
25
+ const hasKey = this.values.has(key);
26
+ let entry;
27
+ if (hasKey) {
28
+ // peek the entry, re-insert(updated if value) for LRU strategy
29
+ entry = this.values.get(key);
30
+ this.values.delete(key);
31
+ this.values.set(key, entry);
32
+ }
33
+ else if (value) {
34
+ // insert value if passed
35
+ entry = value;
36
+ this.values.set(key, entry);
37
+ }
38
+ return entry;
39
+ }
40
+ /**
41
+ * Set a key in the store
42
+ * @param key
43
+ * @param value
44
+ */
45
+ set(key, value) {
46
+ if (this.values.size >= this.maxEntries) {
47
+ // least-recently used cache eviction strategy
48
+ const keyToDelete = this.values.keys().next().value;
49
+ this.values.delete(keyToDelete);
50
+ }
51
+ this.values.set(key, value);
52
+ }
53
+ /**
54
+ * Check if key is in cache
55
+ * @param key
56
+ */
57
+ hasKey(key) {
58
+ return this.values.has(key);
59
+ }
60
+ /**
61
+ * Delete a key in the store
62
+ * @param key
63
+ */
64
+ delete(key) {
65
+ const hasKey = this.values.has(key);
66
+ if (hasKey) {
67
+ this.values.delete(key);
68
+ }
69
+ }
70
+ /**
71
+ * Delete all entry with prefix keys
72
+ * @param keys
73
+ */
74
+ deleteKeys(keys) {
75
+ keys.forEach((k) => {
76
+ const hasKey = this.values.has(k);
77
+ if (hasKey) {
78
+ this.values.delete(k);
79
+ }
80
+ });
81
+ }
82
+ /**
83
+ * Delete all entry with prefix keys
84
+ * @param prefix
85
+ */
86
+ deleteKeysWithPrefix(prefix) {
87
+ this.values.forEach((v, k) => {
88
+ if (k.startsWith(prefix)) {
89
+ this.values.delete(k);
90
+ }
91
+ });
92
+ }
93
+ /**
94
+ * Clean the store
95
+ */
96
+ clean() {
97
+ this.values = new Map();
98
+ }
99
+ /**
100
+ * Print the store in the console
101
+ * Only for debug
102
+ */
103
+ evaluate() {
104
+ console.log(this.values);
105
+ }
106
+ }
107
+ exports.LruCache = LruCache;
108
+ /**
109
+ * Define the various types of caching strategies
110
+ */
111
+ var CacheStrategies;
112
+ (function (CacheStrategies) {
113
+ CacheStrategies["CACHE_FIRST"] = "Cache-first";
114
+ CacheStrategies["NETWORK_ONLY"] = "Network-only";
115
+ CacheStrategies["STALE_WHILE_REVALIDATE"] = "Stale-While-Revalidate";
116
+ })(CacheStrategies = exports.CacheStrategies || (exports.CacheStrategies = {}));
117
+ /**
118
+ * Export global cache
119
+ */
120
+ const cache = new LruCache();
121
+ exports.default = cache;
122
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/utils/cache.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,11 @@ import { isValidUrl, isValidUrls, urlReplacer, getDomain, appendURLSearchParams,
3
3
  import { getHighestSafeWindowContext, getWindowWidth, getWindowHeight, isClientSideRendering } from './utils/window';
4
4
  import { mergeDeep, isObject } from './utils/object';
5
5
  import { loadVersionBrowser } from './utils/browser';
6
+ import LRUCache, { LruCache, LruCacheType, CacheStrategies } from './utils/cache';
6
7
  import { Logger } from './utils/logger';
7
8
  import WSClient, { WSClientType, WSClientPropTypes } from './utils/websocket';
8
9
  /**
9
10
  * Export all utilities
10
11
  */
11
- export { capitalize, isString, stripHtml, camelCase, copyTextToClipboard, fallbackCopyTextToClipboard, random, isValidUrl, isValidUrls, urlReplacer, getDomain, appendURLSearchParams, urlB64ToUint8Array, getHighestSafeWindowContext, getWindowWidth, getWindowHeight, isClientSideRendering, Logger, mergeDeep, isObject, WSClient, WSClientType, WSClientPropTypes, loadVersionBrowser };
12
+ export { capitalize, isString, stripHtml, camelCase, copyTextToClipboard, fallbackCopyTextToClipboard, random, isValidUrl, isValidUrls, urlReplacer, getDomain, appendURLSearchParams, urlB64ToUint8Array, getHighestSafeWindowContext, getWindowWidth, getWindowHeight, isClientSideRendering, Logger, mergeDeep, isObject, WSClient, WSClientType, WSClientPropTypes, loadVersionBrowser, LRUCache, LruCache, LruCacheType, CacheStrategies };
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACpI,OAAO,EAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AACvH,OAAO,EAAC,2BAA2B,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAC,MAAM,gBAAgB,CAAC;AACnH,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACtC,OAAO,QAAQ,EAAE,EAAC,YAAY,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAE5E;;GAEG;AACH,OAAO,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,2BAA2B,EAC3B,MAAM,EACN,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EACnB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACpI,OAAO,EAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AACvH,OAAO,EAAC,2BAA2B,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAC,MAAM,gBAAgB,CAAC;AACnH,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AACnD,OAAO,QAAQ,EAAE,EAAC,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAC,MAAM,eAAe,CAAC;AAChF,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACtC,OAAO,QAAQ,EAAE,EAAC,YAAY,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAE5E;;GAEG;AACH,OAAO,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,2BAA2B,EAC3B,MAAM,EACN,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,eAAe,EAChB,CAAC"}
package/lib/esm/index.js CHANGED
@@ -3,10 +3,11 @@ import { isValidUrl, isValidUrls, urlReplacer, getDomain, appendURLSearchParams,
3
3
  import { getHighestSafeWindowContext, getWindowWidth, getWindowHeight, isClientSideRendering } from './utils/window';
4
4
  import { mergeDeep, isObject } from './utils/object';
5
5
  import { loadVersionBrowser } from './utils/browser';
6
+ import LRUCache, { LruCache, CacheStrategies } from './utils/cache';
6
7
  import { Logger } from './utils/logger';
7
8
  import WSClient from './utils/websocket';
8
9
  /**
9
10
  * Export all utilities
10
11
  */
11
- export { capitalize, isString, stripHtml, camelCase, copyTextToClipboard, fallbackCopyTextToClipboard, random, isValidUrl, isValidUrls, urlReplacer, getDomain, appendURLSearchParams, urlB64ToUint8Array, getHighestSafeWindowContext, getWindowWidth, getWindowHeight, isClientSideRendering, Logger, mergeDeep, isObject, WSClient, loadVersionBrowser };
12
+ export { capitalize, isString, stripHtml, camelCase, copyTextToClipboard, fallbackCopyTextToClipboard, random, isValidUrl, isValidUrls, urlReplacer, getDomain, appendURLSearchParams, urlB64ToUint8Array, getHighestSafeWindowContext, getWindowWidth, getWindowHeight, isClientSideRendering, Logger, mergeDeep, isObject, WSClient, loadVersionBrowser, LRUCache, LruCache, CacheStrategies };
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACpI,OAAO,EAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AACvH,OAAO,EAAC,2BAA2B,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAC,MAAM,gBAAgB,CAAC;AACnH,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACtC,OAAO,QAA2C,MAAM,mBAAmB,CAAC;AAE5E;;GAEG;AACH,OAAO,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,2BAA2B,EAC3B,MAAM,EACN,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,QAAQ,EAGR,kBAAkB,EACnB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACpI,OAAO,EAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AACvH,OAAO,EAAC,2BAA2B,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAC,MAAM,gBAAgB,CAAC;AACnH,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AACnD,OAAO,QAAQ,EAAE,EAAC,QAAQ,EAAgB,eAAe,EAAC,MAAM,eAAe,CAAC;AAChF,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AACtC,OAAO,QAA2C,MAAM,mBAAmB,CAAC;AAE5E;;GAEG;AACH,OAAO,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,2BAA2B,EAC3B,MAAM,EACN,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,QAAQ,EAGR,kBAAkB,EAClB,QAAQ,EACR,QAAQ,EAER,eAAe,EAChB,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * LruCache interface
3
+ */
4
+ export interface LruCacheType<T> {
5
+ get: (key: string, value?: T) => T;
6
+ set: (key: string, value: T) => void;
7
+ hasKey: (key: string) => boolean;
8
+ delete: (key: string) => void;
9
+ deleteKeys: (keys: string[]) => void;
10
+ deleteKeysWithPrefix: (prefix: string) => void;
11
+ clean: () => void;
12
+ evaluate: () => void;
13
+ }
14
+ /**
15
+ * LruCache
16
+ */
17
+ export declare class LruCache<T> {
18
+ private values;
19
+ private maxEntries;
20
+ /**
21
+ * Initialize Cache
22
+ * @param maxEntries
23
+ */
24
+ constructor(maxEntries?: number);
25
+ /**
26
+ * Get a key from the map store
27
+ * @param key
28
+ * @param value
29
+ */
30
+ get(key: string, value?: T): T;
31
+ /**
32
+ * Set a key in the store
33
+ * @param key
34
+ * @param value
35
+ */
36
+ set(key: string, value: T): void;
37
+ /**
38
+ * Check if key is in cache
39
+ * @param key
40
+ */
41
+ hasKey(key: string): boolean;
42
+ /**
43
+ * Delete a key in the store
44
+ * @param key
45
+ */
46
+ delete(key: string): void;
47
+ /**
48
+ * Delete all entry with prefix keys
49
+ * @param keys
50
+ */
51
+ deleteKeys(keys: string[]): void;
52
+ /**
53
+ * Delete all entry with prefix keys
54
+ * @param prefix
55
+ */
56
+ deleteKeysWithPrefix(prefix: string): void;
57
+ /**
58
+ * Clean the store
59
+ */
60
+ clean(): void;
61
+ /**
62
+ * Print the store in the console
63
+ * Only for debug
64
+ */
65
+ evaluate(): void;
66
+ }
67
+ /**
68
+ * Define the various types of caching strategies
69
+ */
70
+ export declare enum CacheStrategies {
71
+ CACHE_FIRST = "Cache-first",
72
+ NETWORK_ONLY = "Network-only",
73
+ STALE_WHILE_REVALIDATE = "Stale-While-Revalidate"
74
+ }
75
+ /**
76
+ * Export global cache
77
+ */
78
+ declare const cache: LruCacheType<any>;
79
+ export default cache;
80
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/utils/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACnC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACrC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACjC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,UAAU,CAAC;IAEnB;;;OAGG;gBACS,UAAU,SAAQ;IAO9B;;;;OAIG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC;IAgBrC;;;;OAIG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IASvC;;;OAGG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAInC;;;OAGG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOhC;;;OAGG;IACI,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IASvC;;;OAGG;IACI,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQjD;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB;;;OAGG;IACI,QAAQ,IAAI,IAAI;CAGxB;AAED;;GAEG;AACH,oBAAY,eAAe;IACzB,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;IAC7B,sBAAsB,2BAA2B;CAClD;AAED;;GAEG;AACH,QAAA,MAAM,KAAK,EAAE,YAAY,CAAC,GAAG,CAAuB,CAAC;AACrD,eAAe,KAAK,CAAC"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * LruCache
3
+ */
4
+ export class LruCache {
5
+ /**
6
+ * Initialize Cache
7
+ * @param maxEntries
8
+ */
9
+ constructor(maxEntries = 10000) {
10
+ this.values = new Map();
11
+ this.maxEntries = maxEntries;
12
+ if (typeof window !== 'undefined') {
13
+ window['__viewSCCache'] = this.values;
14
+ }
15
+ }
16
+ /**
17
+ * Get a key from the map store
18
+ * @param key
19
+ * @param value
20
+ */
21
+ get(key, value) {
22
+ const hasKey = this.values.has(key);
23
+ let entry;
24
+ if (hasKey) {
25
+ // peek the entry, re-insert(updated if value) for LRU strategy
26
+ entry = this.values.get(key);
27
+ this.values.delete(key);
28
+ this.values.set(key, entry);
29
+ }
30
+ else if (value) {
31
+ // insert value if passed
32
+ entry = value;
33
+ this.values.set(key, entry);
34
+ }
35
+ return entry;
36
+ }
37
+ /**
38
+ * Set a key in the store
39
+ * @param key
40
+ * @param value
41
+ */
42
+ set(key, value) {
43
+ if (this.values.size >= this.maxEntries) {
44
+ // least-recently used cache eviction strategy
45
+ const keyToDelete = this.values.keys().next().value;
46
+ this.values.delete(keyToDelete);
47
+ }
48
+ this.values.set(key, value);
49
+ }
50
+ /**
51
+ * Check if key is in cache
52
+ * @param key
53
+ */
54
+ hasKey(key) {
55
+ return this.values.has(key);
56
+ }
57
+ /**
58
+ * Delete a key in the store
59
+ * @param key
60
+ */
61
+ delete(key) {
62
+ const hasKey = this.values.has(key);
63
+ if (hasKey) {
64
+ this.values.delete(key);
65
+ }
66
+ }
67
+ /**
68
+ * Delete all entry with prefix keys
69
+ * @param keys
70
+ */
71
+ deleteKeys(keys) {
72
+ keys.forEach((k) => {
73
+ const hasKey = this.values.has(k);
74
+ if (hasKey) {
75
+ this.values.delete(k);
76
+ }
77
+ });
78
+ }
79
+ /**
80
+ * Delete all entry with prefix keys
81
+ * @param prefix
82
+ */
83
+ deleteKeysWithPrefix(prefix) {
84
+ this.values.forEach((v, k) => {
85
+ if (k.startsWith(prefix)) {
86
+ this.values.delete(k);
87
+ }
88
+ });
89
+ }
90
+ /**
91
+ * Clean the store
92
+ */
93
+ clean() {
94
+ this.values = new Map();
95
+ }
96
+ /**
97
+ * Print the store in the console
98
+ * Only for debug
99
+ */
100
+ evaluate() {
101
+ console.log(this.values);
102
+ }
103
+ }
104
+ /**
105
+ * Define the various types of caching strategies
106
+ */
107
+ export var CacheStrategies;
108
+ (function (CacheStrategies) {
109
+ CacheStrategies["CACHE_FIRST"] = "Cache-first";
110
+ CacheStrategies["NETWORK_ONLY"] = "Network-only";
111
+ CacheStrategies["STALE_WHILE_REVALIDATE"] = "Stale-While-Revalidate";
112
+ })(CacheStrategies || (CacheStrategies = {}));
113
+ /**
114
+ * Export global cache
115
+ */
116
+ const cache = new LruCache();
117
+ export default cache;
118
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/utils/cache.ts"],"names":[],"mappings":"AAcA;;GAEG;AACH,MAAM,OAAO,QAAQ;IAInB;;;OAGG;IACH,YAAY,UAAU,GAAG,KAAK;QAPtB,WAAM,GAAmB,IAAI,GAAG,EAAa,CAAC;QAQpD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;YACjC,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;SACvC;IACH,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAC,GAAW,EAAE,KAAS;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAQ,CAAC;QACb,IAAI,MAAM,EAAE;YACV,+DAA+D;YAC/D,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAC7B;aAAM,IAAI,KAAK,EAAE;YAChB,yBAAyB;YACzB,KAAK,GAAG,KAAK,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAC7B;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAC,GAAW,EAAE,KAAQ;QAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;YACvC,8CAA8C;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;SACjC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,GAAW;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SACzB;IACH,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,IAAc;QAC9B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,MAAM,EAAE;gBACV,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;aACvB;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,oBAAoB,CAAC,MAAc;QACxC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3B,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;gBACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;aACvB;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK;QACV,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAa,CAAC;IACrC,CAAC;IAED;;;OAGG;IACI,QAAQ;QACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,8CAA2B,CAAA;IAC3B,gDAA6B,CAAA;IAC7B,oEAAiD,CAAA;AACnD,CAAC,EAJW,eAAe,KAAf,eAAe,QAI1B;AAED;;GAEG;AACH,MAAM,KAAK,GAAsB,IAAI,QAAQ,EAAO,CAAC;AACrD,eAAe,KAAK,CAAC"}
package/lib/umd/utils.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /*! For license information please see utils.js.LICENSE.txt */
2
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SelfCommunityUtils=t():e.SelfCommunityUtils=t()}(self,(()=>(()=>{"use strict";var e={285:(e,t)=>{t.__esModule=!0,t.loadVersionBrowser=void 0,t.loadVersionBrowser=()=>{if("userAgentData"in navigator){const e=navigator.userAgentData;let t,n,i=null;for(let o=0;o<e.brands.length;o++){const r=e.brands[o].brand;if(n=e.brands[o].version,null!==r.match(/opera|chrome|edge|safari|firefox|msie|trident/i)){if(null===r.match(/chrome/i))return t=r.substr(r.indexOf(" ")+1),{name:t,version:n};i=n}}if(null!==i)return{name:"chrome",version:i}}let e,t=navigator.userAgent,n=t.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];return/trident/i.test(n[1])?(e=/\brv[ :]+(\d+)/g.exec(t)||[],{name:"IE",version:e[1]||""}):"Chrome"===n[1]&&(e=t.match(/\bOPR\/(\d+)/),null!=e)?{name:"Opera",version:e[1]}:(n=n[2]?[n[1],n[2]]:[navigator.appName,navigator.appVersion,"-?"],null!=(e=t.match(/version\/(\d+)/i))&&n.splice(1,1,e[1]),{name:n[0],version:n[1]})}},502:(e,t)=>{t.__esModule=!0,t.Logger=void 0,t.Logger=class{static info(e,t){console.info(`%c[${e}]`,"color:#008080",` ${t}`)}static warn(e,t){console.warn(`%c[${e}]`,"color:#008080",` ${t}`)}static error(e,t){console.error(`%c[${e}]`,"color:#008080",` ${t}`)}static log(e,t){console.log(`%c[${e}]`,"color:#008080",` ${t}`)}static debug(e,t){console.debug(`%c[${e}]`,"color:#008080",` ${t}`)}}},297:(e,t)=>{function n(e){return"object"==typeof e&&!Array.isArray(e)&&null!==e}t.__esModule=!0,t.isObject=n,t.mergeDeep=function e(t,i){let o=Object.assign({},t);return n(t)&&n(i)&&Object.keys(i).forEach((r=>{n(i[r])?r in t?o[r]=e(t[r],i[r]):Object.assign(o,{[r]:i[r]}):Object.assign(o,{[r]:i[r]})})),o}},884:(e,t)=>{function n(e){let t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{return document.execCommand("copy"),document.body.removeChild(t),Promise.resolve()}catch(e){return document.body.removeChild(t),Promise.reject(e)}}t.__esModule=!0,t.camelCase=function(e){return e.toLowerCase().replace(/[-_]+/g," ").replace(/[^\w\s]/g,"").replace(/ (.)/g,(e=>e.toUpperCase())).replace(/ /g,"")},t.capitalize=function(e){let t="",n=e.split(" ");for(let e=0;e<n.length;e++)t+=n[e].substring(0,1).toUpperCase()+n[e].substring(1,n[e].length);return t},t.copyTextToClipboard=function(e){return navigator.clipboard?navigator.clipboard.writeText(e):n(e)},t.fallbackCopyTextToClipboard=n,t.isString=function(e){return"string"==typeof e||e instanceof String},t.random=function(){return(Math.random()+1).toString(36).substring(7)},t.stripHtml=function(e){return e.replace(/<[^>]*>?/gm,"").trim()}},735:(e,t)=>{t.__esModule=!0,t.appendURLSearchParams=function(e,t){let n=e;if(t.length&&n){const e=Object.keys(t[0])[0];n+=(n.split("?")[1]?"&":"?")+`${e}=${t[0][e]}`,t.slice(1).map((e=>{const t=Object.keys(e)[0];n+=`&${t}=${e[t]}`}))}return n},t.urlReplacer=t.urlB64ToUint8Array=t.isValidUrls=t.isValidUrl=t.getDomain=void 0,t.urlReplacer=e=>t=>function(e,t){const n=/\$\(([^)]+)?\)/g;let i=n.exec(e);for(;i;)e=e.replace(i[0],t[i[1]]),n.lastIndex=0,i=n.exec(e);return e}(e,t),t.getDomain=e=>{const t=e.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);return t&&t[1]?t[1]:""};const n=e=>/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(e);t.isValidUrl=n,t.isValidUrls=(e,t)=>e.trim().split(t).every(n),t.urlB64ToUint8Array=e=>{const t=(e+"=".repeat((4-e.length%4)%4)).replace(/-/g,"+").replace(/_/g,"/"),n=window.atob(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;++e)i[e]=n.charCodeAt(e);return i}},507:(e,t)=>{t.__esModule=!0,t.default=void 0;class n{constructor(e){this._attempts=1,this._heartbeatInterval=null,this._missedHeartbeats=0,this.isValidOptions(e)&&(this._cfg=Object.assign({},{heartbeatMsg:null,debug:!1,mustReconnect:!0},e),this.connect())}static getInstance(e){return this._instance=this._instance||new n(e),this._instance}connect(){try{if(this._ws&&(this.isConnecting()||this.isConnected()))return void(this._cfg.debug&&console.info("Websocket is connecting or already connected."));"function"==typeof this._cfg.connecting&&this._cfg.connecting(),this._cfg.debug&&console.info(`Connecting to ${this._cfg.uri} ...`),this._ws=new WebSocket(this._cfg.uri,this._cfg.protocols),this._ws.onopen=this.onOpen.bind(this),this._ws.onmessage=this.onMessage.bind(this),this._ws.onerror=this.onError.bind(this),this._ws.onclose=this.onClose.bind(this),this._timer=null}catch(e){console.error(e),this.tryToReconnect()}}isValidOptions(e){let t=!1;return e?(e.uri||(console.error("Invalid WSClient Uri options."),t=!0),e&&e.connecting&&"function"!=typeof e.connecting&&(console.error("Invalid WSClient connecting options."),t=!0),e&&e.connected&&"function"!=typeof e.connected&&(console.error("Invalid WSClient connected options."),t=!0),e&&e.receiveMessage&&"function"!=typeof e.receiveMessage&&(console.error("Invalid WSClient receiveMessage options."),t=!0),e&&e.disconnected&&"function"!=typeof e.disconnected&&(console.error("Invalid WSClient connecting options."),t=!0),e&&e.heartbeatMsg&&"string"!=typeof e.heartbeatMsg&&(console.error("Invalid WSClient heartbeatMsg options."),t=!0),e&&e.debug&&"boolean"!=typeof e.debug&&(console.error("Invalid WSClient debug options."),t=!0),!t):(console.error("Invalid WSClient options."),t)}tryToReconnect(){if(this._cfg.mustReconnect&&!this._timer){this._cfg.debug&&console.info("Reconnecting...");let e=this.generateInteval(this._attempts);this._timer=setTimeout(this.reconnect.bind(this),e)}}reconnect(){this._attempts++,this.connect()}sendHeartbeat(){try{if(this._missedHeartbeats++,this._missedHeartbeats>3)throw new Error("Too many missed heartbeats.");this._ws.send(this._cfg.heartbeatMsg)}catch(e){clearInterval(this._heartbeatInterval),this._heartbeatInterval=null,this._cfg.debug&&console.warn(`Closing connection. Reason: ${e.message}`),this.isClosing()||this.isClosed()||this.close()}}onOpen(){this._cfg.debug&&console.info("Connected!"),this._attempts=1,this._cfg.heartbeatMsg&&null===this._heartbeatInterval&&(this._missedHeartbeats=0,this._heartbeatInterval=setInterval(this.sendHeartbeat.bind(this),5e3)),"function"==typeof this._cfg.connected&&this._cfg.connected()}onClose(e){this._cfg.debug&&console.info("Connection closed!"),"function"==typeof this._cfg.disconnected&&this._cfg.disconnected(e),this.tryToReconnect()}onError(e){this._cfg.debug&&console.error("Websocket connection is broken!"),this._cfg.debug&&console.error(e)}onMessage(e){if(this._cfg.heartbeatMsg&&e.data===this._cfg.heartbeatMsg)this._missedHeartbeats=0;else if("function"==typeof this._cfg.receiveMessage)return this._cfg.receiveMessage(e.data)}generateInteval(e){let t=1e3*(Math.pow(2,e)-1);return t>3e4&&(t=3e4),Math.random()*t}sendMessage(e){this._ws&&this._ws.send(e)}getState(){return this._ws&&this._ws.readyState}isConnecting(){return this._ws&&0===this._ws.readyState}isConnected(){return this._ws&&1===this._ws.readyState}isClosing(){return this._ws&&2===this._ws.readyState}isClosed(){return this._ws&&3===this._ws.readyState}close(){clearInterval(this._heartbeatInterval),this._cfg.mustReconnect=!1,this.isClosing()&&this.isClosed()||(this._ws.close(),this._cfg.debug&&console.error("Websocket closed."))}}t.default=n},474:(e,t,n)=>{t.__esModule=!0,t.getHighestSafeWindowContext=function e(t=n.g.window.self){return t===n.g.window.top||(()=>{try{return n.g.window.location.hostname!==n.g.window.parent.location.hostname}catch(e){return!0}})()?t:e(t.parent)},t.getWindowHeight=function(){return void 0!==n.g.window?n.g.window.innerHeight:0},t.getWindowWidth=function(){return void 0!==n.g.window?n.g.window.innerWidth:0},t.isClientSideRendering=function(){return"undefined"!=typeof window}}},t={};function n(i){var o=t[i];if(void 0!==o)return o.exports;var r=t[i]={exports:{}};return e[i](r,r.exports,n),r.exports}n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var i={};return(()=>{var e=i;e.__esModule=!0;var t=n(884);e.capitalize=t.capitalize,e.isString=t.isString,e.stripHtml=t.stripHtml,e.camelCase=t.camelCase,e.copyTextToClipboard=t.copyTextToClipboard,e.fallbackCopyTextToClipboard=t.fallbackCopyTextToClipboard,e.random=t.random;var o=n(735);e.isValidUrl=o.isValidUrl,e.isValidUrls=o.isValidUrls,e.urlReplacer=o.urlReplacer,e.getDomain=o.getDomain,e.appendURLSearchParams=o.appendURLSearchParams,e.urlB64ToUint8Array=o.urlB64ToUint8Array;var r=n(474);e.getHighestSafeWindowContext=r.getHighestSafeWindowContext,e.getWindowWidth=r.getWindowWidth,e.getWindowHeight=r.getWindowHeight,e.isClientSideRendering=r.isClientSideRendering;var s=n(297);e.mergeDeep=s.mergeDeep,e.isObject=s.isObject;var a=n(285);e.loadVersionBrowser=a.loadVersionBrowser;var c=n(502);e.Logger=c.Logger;var l=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=d(t);if(n&&n.has(e))return n.get(e);var i={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if("default"!==r&&Object.prototype.hasOwnProperty.call(e,r)){var s=o?Object.getOwnPropertyDescriptor(e,r):null;s&&(s.get||s.set)?Object.defineProperty(i,r,s):i[r]=e[r]}return i.default=e,n&&n.set(e,i),i}(n(507));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(d=function(e){return e?n:t})(e)}e.WSClient=l.default,e.WSClientType=l.WSClientType,e.WSClientPropTypes=l.WSClientPropTypes})(),i})()));
2
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SelfCommunityUtils=t():e.SelfCommunityUtils=t()}(self,(()=>(()=>{"use strict";var e={285:(e,t)=>{t.__esModule=!0,t.loadVersionBrowser=void 0,t.loadVersionBrowser=()=>{if("userAgentData"in navigator){const e=navigator.userAgentData;let t,n,i=null;for(let s=0;s<e.brands.length;s++){const o=e.brands[s].brand;if(n=e.brands[s].version,null!==o.match(/opera|chrome|edge|safari|firefox|msie|trident/i)){if(null===o.match(/chrome/i))return t=o.substr(o.indexOf(" ")+1),{name:t,version:n};i=n}}if(null!==i)return{name:"chrome",version:i}}let e,t=navigator.userAgent,n=t.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];return/trident/i.test(n[1])?(e=/\brv[ :]+(\d+)/g.exec(t)||[],{name:"IE",version:e[1]||""}):"Chrome"===n[1]&&(e=t.match(/\bOPR\/(\d+)/),null!=e)?{name:"Opera",version:e[1]}:(n=n[2]?[n[1],n[2]]:[navigator.appName,navigator.appVersion,"-?"],null!=(e=t.match(/version\/(\d+)/i))&&n.splice(1,1,e[1]),{name:n[0],version:n[1]})}},466:(e,t)=>{t.__esModule=!0,t.default=t.LruCache=t.CacheStrategies=void 0;class n{constructor(e=1e4){this.values=new Map,this.maxEntries=e,"undefined"!=typeof window&&(window.__viewSCCache=this.values)}get(e,t){let n;return this.values.has(e)?(n=this.values.get(e),this.values.delete(e),this.values.set(e,n)):t&&(n=t,this.values.set(e,n)),n}set(e,t){if(this.values.size>=this.maxEntries){const e=this.values.keys().next().value;this.values.delete(e)}this.values.set(e,t)}hasKey(e){return this.values.has(e)}delete(e){this.values.has(e)&&this.values.delete(e)}deleteKeys(e){e.forEach((e=>{this.values.has(e)&&this.values.delete(e)}))}deleteKeysWithPrefix(e){this.values.forEach(((t,n)=>{n.startsWith(e)&&this.values.delete(n)}))}clean(){this.values=new Map}evaluate(){console.log(this.values)}}let i;t.LruCache=n,t.CacheStrategies=i,function(e){e.CACHE_FIRST="Cache-first",e.NETWORK_ONLY="Network-only",e.STALE_WHILE_REVALIDATE="Stale-While-Revalidate"}(i||(t.CacheStrategies=i={}));var s=new n;t.default=s},502:(e,t)=>{t.__esModule=!0,t.Logger=void 0,t.Logger=class{static info(e,t){console.info(`%c[${e}]`,"color:#008080",` ${t}`)}static warn(e,t){console.warn(`%c[${e}]`,"color:#008080",` ${t}`)}static error(e,t){console.error(`%c[${e}]`,"color:#008080",` ${t}`)}static log(e,t){console.log(`%c[${e}]`,"color:#008080",` ${t}`)}static debug(e,t){console.debug(`%c[${e}]`,"color:#008080",` ${t}`)}}},297:(e,t)=>{function n(e){return"object"==typeof e&&!Array.isArray(e)&&null!==e}t.__esModule=!0,t.isObject=n,t.mergeDeep=function e(t,i){let s=Object.assign({},t);return n(t)&&n(i)&&Object.keys(i).forEach((o=>{n(i[o])?o in t?s[o]=e(t[o],i[o]):Object.assign(s,{[o]:i[o]}):Object.assign(s,{[o]:i[o]})})),s}},884:(e,t)=>{function n(e){let t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{return document.execCommand("copy"),document.body.removeChild(t),Promise.resolve()}catch(e){return document.body.removeChild(t),Promise.reject(e)}}t.__esModule=!0,t.camelCase=function(e){return e.toLowerCase().replace(/[-_]+/g," ").replace(/[^\w\s]/g,"").replace(/ (.)/g,(e=>e.toUpperCase())).replace(/ /g,"")},t.capitalize=function(e){let t="",n=e.split(" ");for(let e=0;e<n.length;e++)t+=n[e].substring(0,1).toUpperCase()+n[e].substring(1,n[e].length);return t},t.copyTextToClipboard=function(e){return navigator.clipboard?navigator.clipboard.writeText(e):n(e)},t.fallbackCopyTextToClipboard=n,t.isString=function(e){return"string"==typeof e||e instanceof String},t.random=function(){return(Math.random()+1).toString(36).substring(7)},t.stripHtml=function(e){return e.replace(/<[^>]*>?/gm,"").trim()}},735:(e,t)=>{t.__esModule=!0,t.appendURLSearchParams=function(e,t){let n=e;if(t.length&&n){const e=Object.keys(t[0])[0];n+=(n.split("?")[1]?"&":"?")+`${e}=${t[0][e]}`,t.slice(1).map((e=>{const t=Object.keys(e)[0];n+=`&${t}=${e[t]}`}))}return n},t.urlReplacer=t.urlB64ToUint8Array=t.isValidUrls=t.isValidUrl=t.getDomain=void 0,t.urlReplacer=e=>t=>function(e,t){const n=/\$\(([^)]+)?\)/g;let i=n.exec(e);for(;i;)e=e.replace(i[0],t[i[1]]),n.lastIndex=0,i=n.exec(e);return e}(e,t),t.getDomain=e=>{const t=e.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);return t&&t[1]?t[1]:""};const n=e=>/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(e);t.isValidUrl=n,t.isValidUrls=(e,t)=>e.trim().split(t).every(n),t.urlB64ToUint8Array=e=>{const t=(e+"=".repeat((4-e.length%4)%4)).replace(/-/g,"+").replace(/_/g,"/"),n=window.atob(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;++e)i[e]=n.charCodeAt(e);return i}},507:(e,t)=>{t.__esModule=!0,t.default=void 0;class n{constructor(e){this._attempts=1,this._heartbeatInterval=null,this._missedHeartbeats=0,this.isValidOptions(e)&&(this._cfg=Object.assign({},{heartbeatMsg:null,debug:!1,mustReconnect:!0},e),this.connect())}static getInstance(e){return this._instance=this._instance||new n(e),this._instance}connect(){try{if(this._ws&&(this.isConnecting()||this.isConnected()))return void(this._cfg.debug&&console.info("Websocket is connecting or already connected."));"function"==typeof this._cfg.connecting&&this._cfg.connecting(),this._cfg.debug&&console.info(`Connecting to ${this._cfg.uri} ...`),this._ws=new WebSocket(this._cfg.uri,this._cfg.protocols),this._ws.onopen=this.onOpen.bind(this),this._ws.onmessage=this.onMessage.bind(this),this._ws.onerror=this.onError.bind(this),this._ws.onclose=this.onClose.bind(this),this._timer=null}catch(e){console.error(e),this.tryToReconnect()}}isValidOptions(e){let t=!1;return e?(e.uri||(console.error("Invalid WSClient Uri options."),t=!0),e&&e.connecting&&"function"!=typeof e.connecting&&(console.error("Invalid WSClient connecting options."),t=!0),e&&e.connected&&"function"!=typeof e.connected&&(console.error("Invalid WSClient connected options."),t=!0),e&&e.receiveMessage&&"function"!=typeof e.receiveMessage&&(console.error("Invalid WSClient receiveMessage options."),t=!0),e&&e.disconnected&&"function"!=typeof e.disconnected&&(console.error("Invalid WSClient connecting options."),t=!0),e&&e.heartbeatMsg&&"string"!=typeof e.heartbeatMsg&&(console.error("Invalid WSClient heartbeatMsg options."),t=!0),e&&e.debug&&"boolean"!=typeof e.debug&&(console.error("Invalid WSClient debug options."),t=!0),!t):(console.error("Invalid WSClient options."),t)}tryToReconnect(){if(this._cfg.mustReconnect&&!this._timer){this._cfg.debug&&console.info("Reconnecting...");let e=this.generateInteval(this._attempts);this._timer=setTimeout(this.reconnect.bind(this),e)}}reconnect(){this._attempts++,this.connect()}sendHeartbeat(){try{if(this._missedHeartbeats++,this._missedHeartbeats>3)throw new Error("Too many missed heartbeats.");this._ws.send(this._cfg.heartbeatMsg)}catch(e){clearInterval(this._heartbeatInterval),this._heartbeatInterval=null,this._cfg.debug&&console.warn(`Closing connection. Reason: ${e.message}`),this.isClosing()||this.isClosed()||this.close()}}onOpen(){this._cfg.debug&&console.info("Connected!"),this._attempts=1,this._cfg.heartbeatMsg&&null===this._heartbeatInterval&&(this._missedHeartbeats=0,this._heartbeatInterval=setInterval(this.sendHeartbeat.bind(this),5e3)),"function"==typeof this._cfg.connected&&this._cfg.connected()}onClose(e){this._cfg.debug&&console.info("Connection closed!"),"function"==typeof this._cfg.disconnected&&this._cfg.disconnected(e),this.tryToReconnect()}onError(e){this._cfg.debug&&console.error("Websocket connection is broken!"),this._cfg.debug&&console.error(e)}onMessage(e){if(this._cfg.heartbeatMsg&&e.data===this._cfg.heartbeatMsg)this._missedHeartbeats=0;else if("function"==typeof this._cfg.receiveMessage)return this._cfg.receiveMessage(e.data)}generateInteval(e){let t=1e3*(Math.pow(2,e)-1);return t>3e4&&(t=3e4),Math.random()*t}sendMessage(e){this._ws&&this._ws.send(e)}getState(){return this._ws&&this._ws.readyState}isConnecting(){return this._ws&&0===this._ws.readyState}isConnected(){return this._ws&&1===this._ws.readyState}isClosing(){return this._ws&&2===this._ws.readyState}isClosed(){return this._ws&&3===this._ws.readyState}close(){clearInterval(this._heartbeatInterval),this._cfg.mustReconnect=!1,this.isClosing()&&this.isClosed()||(this._ws.close(),this._cfg.debug&&console.error("Websocket closed."))}}t.default=n},474:(e,t,n)=>{t.__esModule=!0,t.getHighestSafeWindowContext=function e(t=n.g.window.self){return t===n.g.window.top||(()=>{try{return n.g.window.location.hostname!==n.g.window.parent.location.hostname}catch(e){return!0}})()?t:e(t.parent)},t.getWindowHeight=function(){return void 0!==n.g.window?n.g.window.innerHeight:0},t.getWindowWidth=function(){return void 0!==n.g.window?n.g.window.innerWidth:0},t.isClientSideRendering=function(){return"undefined"!=typeof window}}},t={};function n(i){var s=t[i];if(void 0!==s)return s.exports;var o=t[i]={exports:{}};return e[i](o,o.exports,n),o.exports}n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var i={};return(()=>{var e=i;e.__esModule=!0;var t=n(884);e.capitalize=t.capitalize,e.isString=t.isString,e.stripHtml=t.stripHtml,e.camelCase=t.camelCase,e.copyTextToClipboard=t.copyTextToClipboard,e.fallbackCopyTextToClipboard=t.fallbackCopyTextToClipboard,e.random=t.random;var s=n(735);e.isValidUrl=s.isValidUrl,e.isValidUrls=s.isValidUrls,e.urlReplacer=s.urlReplacer,e.getDomain=s.getDomain,e.appendURLSearchParams=s.appendURLSearchParams,e.urlB64ToUint8Array=s.urlB64ToUint8Array;var o=n(474);e.getHighestSafeWindowContext=o.getHighestSafeWindowContext,e.getWindowWidth=o.getWindowWidth,e.getWindowHeight=o.getWindowHeight,e.isClientSideRendering=o.isClientSideRendering;var r=n(297);e.mergeDeep=r.mergeDeep,e.isObject=r.isObject;var a=n(285);e.loadVersionBrowser=a.loadVersionBrowser;var c=u(n(466));e.LRUCache=c.default,e.LruCache=c.LruCache,e.LruCacheType=c.LruCacheType,e.CacheStrategies=c.CacheStrategies;var l=n(502);e.Logger=l.Logger;var d=u(n(507));function h(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(h=function(e){return e?n:t})(e)}function u(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=h(t);if(n&&n.has(e))return n.get(e);var i={},s=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var r=s?Object.getOwnPropertyDescriptor(e,o):null;r&&(r.get||r.set)?Object.defineProperty(i,o,r):i[o]=e[o]}return i.default=e,n&&n.set(e,i),i}e.WSClient=d.default,e.WSClientType=d.WSClientType,e.WSClientPropTypes=d.WSClientPropTypes})(),i})()));
3
3
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","mappings":"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","sources":["webpack://SelfCommunityUtils/webpack/universalModuleDefinition","webpack://SelfCommunityUtils/./src/utils/browser.ts","webpack://SelfCommunityUtils/./src/utils/logger.ts","webpack://SelfCommunityUtils/./src/utils/object.ts","webpack://SelfCommunityUtils/./src/utils/string.ts","webpack://SelfCommunityUtils/./src/utils/url.ts","webpack://SelfCommunityUtils/./src/utils/websocket.ts","webpack://SelfCommunityUtils/./src/utils/window.ts","webpack://SelfCommunityUtils/webpack/bootstrap","webpack://SelfCommunityUtils/webpack/runtime/global","webpack://SelfCommunityUtils/./src/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SelfCommunityUtils\"] = factory();\n\telse\n\t\troot[\"SelfCommunityUtils\"] = factory();\n})(self, () => {\nreturn ","/**\n * Get browser version to track on backend\n * @return {{name: string, version: null}|{name: string, version: string}|{name: *, version: *}|{name: string, version}}\n */\nexport const loadVersionBrowser = () => {\n if ('userAgentData' in navigator) {\n // navigator.userAgentData is not available in\n // Firefox and Safari\n const uaData: Array<any> = navigator['userAgentData'];\n // Outputs of navigator.userAgentData.brands[n].brand are e.g.\n // Chrome: 'Google Chrome'\n // Edge: 'Microsoft Edge'\n // Opera: 'Opera'\n let browsername;\n let browserversion;\n let chromeVersion = null;\n for (let i = 0; i < uaData['brands'].length; i++) {\n const brand = uaData['brands'][i].brand;\n browserversion = uaData['brands'][i].version;\n if (brand.match(/opera|chrome|edge|safari|firefox|msie|trident/i) !== null) {\n // If we have a chrome match, save the match, but try to find another match\n // E.g. Edge can also produce a false Chrome match.\n if (brand.match(/chrome/i) !== null) {\n chromeVersion = browserversion;\n }\n // If this is not a chrome match return immediately\n else {\n browsername = brand.substr(brand.indexOf(' ') + 1);\n return {\n name: browsername,\n version: browserversion,\n };\n }\n }\n }\n // No non-Chrome match was found. If we have a chrome match, return it.\n if (chromeVersion !== null) {\n return {\n name: 'chrome',\n version: chromeVersion,\n };\n }\n }\n // If no userAgentData is not present, or if no match via userAgentData was found,\n // try to extract the browser name and version from userAgent\n const userAgent = navigator.userAgent;\n let ua = userAgent;\n let tem;\n let M: any = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n if (/trident/i.test(M[1])) {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n return {name: 'IE', version: tem[1] || ''};\n }\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\bOPR\\/(\\d+)/);\n if (tem != null) {\n return {name: 'Opera', version: tem[1]};\n }\n }\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n // eslint-disable-next-line @typescript-eslint/prefer-regexp-exec\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) {\n M.splice(1, 1, tem[1]);\n }\n return {\n name: M[0],\n version: M[1],\n };\n};\n","/**\n * Emit styled message\n */\nexport class Logger {\n static info(scope, message) {\n console.info(`%c[${scope}]`, 'color:#008080', ` ${message}`);\n }\n\n static warn(scope, message) {\n console.warn(`%c[${scope}]`, 'color:#008080', ` ${message}`);\n }\n\n static error(scope, message) {\n console.error(`%c[${scope}]`, 'color:#008080', ` ${message}`);\n }\n\n static log(scope, message) {\n console.log(`%c[${scope}]`, 'color:#008080', ` ${message}`);\n }\n\n static debug(scope, message) {\n console.debug(`%c[${scope}]`, 'color:#008080', ` ${message}`);\n }\n}\n","/**\n * Check if v is an object\n * @param v\n */\nexport function isObject(v) {\n return typeof v === 'object' && !Array.isArray(v) && v !== null;\n}\n\n/**\n * Perfrom deep merge of two objects (not a shallow merge)\n * @param target\n * @param source\n * @return {*}\n */\nexport function mergeDeep(target: object, source: object): object {\n let output = Object.assign({}, target);\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach((key) => {\n if (isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, {[key]: source[key]});\n } else {\n output[key] = mergeDeep(target[key], source[key]);\n }\n } else {\n Object.assign(output, {[key]: source[key]});\n }\n });\n }\n return output;\n}\n","/**\n * Check if v is a string\n * @param v\n */\nexport function isString(v) {\n return typeof v === 'string' || v instanceof String;\n}\n\n/**\n * Capitalize a string\n * @param str\n */\nexport function capitalize(str: string): string {\n let strVal = '';\n let strArr: string[] = str.split(' ');\n for (let chr = 0; chr < strArr.length; chr++) {\n strVal += strArr[chr].substring(0, 1).toUpperCase() + strArr[chr].substring(1, strArr[chr].length);\n }\n return strVal;\n}\n\n/**\n * CamelCase a string\n * @param str\n */\nexport function camelCase(str: string): string {\n // Lower cases the string\n return (\n str\n .toLowerCase()\n // Replaces any - or _ characters with a space\n .replace(/[-_]+/g, ' ')\n // Removes any non alphanumeric characters\n .replace(/[^\\w\\s]/g, '')\n // Uppercases the first character in each group immediately following a space\n // (delimited by spaces)\n .replace(/ (.)/g, ($1) => {\n return $1.toUpperCase();\n })\n // Removes spaces\n .replace(/ /g, '')\n );\n}\n\n/**\n * Stripe html tags from a string\n * @param str\n */\nexport function stripHtml(str: string): string {\n return str.replace(/<[^>]*>?/gm, '').trim();\n}\n\nexport function random() {\n return (Math.random() + 1).toString(36).substring(7);\n}\n\n/**\n * Fallback if navigator.clipboard doensn't exist\n * @param text\n * @returns {Promise<void>}\n */\nexport function fallbackCopyTextToClipboard(text) {\n let textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n document.execCommand('copy');\n document.body.removeChild(textArea);\n return Promise.resolve();\n } catch (err) {\n document.body.removeChild(textArea);\n return Promise.reject(err);\n }\n}\n\n/**\n * Copy text to clipboard\n * @param text\n * @returns {Promise<void>}\n *\n * Ex.\n * copyTextToClipboard(text).then(\n * function () {\n * console.log('Async: Copying to clipboard was successful!');\n * },\n * function (err) {\n * console.error('Async: Could not copy text: ', err);\n * });\n */\nexport function copyTextToClipboard(text) {\n if (!navigator.clipboard) {\n return fallbackCopyTextToClipboard(text);\n }\n return navigator.clipboard.writeText(text);\n}\n","/**\n * Utility Url Replacer\n * @param path\n */\nexport const urlReplacer = (path: string) => {\n const replacer = function (tpl, data) {\n const re = /\\$\\(([^)]+)?\\)/g;\n let match = re.exec(tpl);\n while (match) {\n tpl = tpl.replace(match[0], data[match[1]]);\n re.lastIndex = 0;\n match = re.exec(tpl);\n }\n return tpl;\n };\n return (params: object) => replacer(path, params);\n};\n\n/**\n * Get domain\n * @param url\n */\nexport const getDomain = (url: string): string => {\n // eslint-disable-next-line no-useless-escape,@typescript-eslint/prefer-regexp-exec\n const matches = url.match(/^https?\\:\\/\\/([^\\/?#]+)(?:[\\/?#]|$)/i);\n if (matches && matches[1]) {\n return matches[1];\n }\n return '';\n};\n\n/**\n * Check a str is a valid url pattern\n * @param url\n */\nexport const isValidUrl = (url: string): boolean => {\n const regexp = /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/;\n return regexp.test(url);\n};\n\n/**\n * Check a str is a valid list of urls separated by delimiter\n * @param value\n * @param delimiter\n */\nexport const isValidUrls = (value: string, delimiter: string): boolean => {\n const urls = value.trim().split(delimiter);\n return urls.every(isValidUrl);\n};\n\n/**\n * Append params\n * @param baseUrl\n * @param queryParams\n */\nexport function appendURLSearchParams(baseUrl: string, queryParams: Record<string, string | number>[]) {\n let _url = baseUrl;\n if (queryParams.length && _url) {\n const key = Object.keys(queryParams[0])[0];\n _url += (_url.split('?')[1] ? '&' : '?') + `${key}=${queryParams[0][key]}`;\n queryParams.slice(1).map((p) => {\n const key = Object.keys(p)[0];\n _url += `&${key}=${p[key]}`;\n });\n }\n return _url;\n}\n\n/**\n * Take the application server's public key, which is Base64 URL-safe encoded,\n * and convert it to a UInt8Array, because this is the expected input of the subscribe()\n */\nexport const urlB64ToUint8Array = (base64String) => {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n};\n","/**\n * WSClientPropTypes interface\n */\nexport interface WSClientPropTypes {\n /**\n * The Websocket URI\n */\n uri: string;\n\n /**\n * The Websocket Protocols\n */\n protocols: string | string[];\n\n /**\n * String to identify the heartbeat message.\n */\n heartbeatMsg?: string;\n\n /**\n * Reconnect the websocket if close\n */\n mustReconnect?: boolean;\n\n /**\n * Callback called after the websocket is connected.\n */\n connected?: () => any;\n\n /**\n * Callback called when the websocket is connecting.\n */\n connecting?: () => any;\n\n /**\n * Callback called after the websocket is disconnected.\n */\n disconnected?: (evt) => any;\n\n /**\n * Callback called when a message is received from the websocket.\n */\n receiveMessage?: (data) => any;\n\n /**\n * Enable/disable debug\n */\n debug?: boolean;\n}\n\nexport interface WSClientType {\n /**\n * Send message\n * @param message\n */\n sendMessage: (message) => void;\n\n /**\n * Get current state\n */\n getState: () => string;\n\n /**\n * Get current connection state\n */\n isConnecting: () => boolean;\n\n /**\n * Check if ws is connected\n */\n isConnected: () => boolean;\n\n /**\n * Check if ws is closing connection\n */\n isClosing: () => boolean;\n\n /**\n * Return if ws is closed\n */\n isClosed: () => boolean;\n\n /**\n * Close the connection\n */\n close: () => void;\n}\n\n/**\n * WSClient: manage socket connection\n * @param options\n * @constructor\n */\nexport default class WSClient implements WSClientType {\n private static _instance;\n private _cfg;\n private _ws;\n private _timer;\n private _attempts = 1;\n private _heartbeatInterval = null;\n private _missedHeartbeats = 0;\n\n /**\n * Constructor\n * @param cfg\n */\n constructor(cfg: WSClientPropTypes) {\n if (!this.isValidOptions(cfg)) {\n return;\n }\n this._cfg = Object.assign({}, {heartbeatMsg: null, debug: false, mustReconnect: true}, cfg);\n this.connect();\n }\n\n /**\n * Get instance\n */\n public static getInstance(cfg): WSClient {\n this._instance = this._instance || new WSClient(cfg);\n return this._instance;\n }\n\n /**\n * Connect\n */\n connect() {\n try {\n if (this._ws && (this.isConnecting() || this.isConnected())) {\n // There is already a connection\n this._cfg.debug && console.info('Websocket is connecting or already connected.');\n return;\n }\n\n // Callback 'connecting' if exist\n typeof this._cfg.connecting === 'function' && this._cfg.connecting();\n this._cfg.debug && console.info(`Connecting to ${this._cfg.uri} ...`);\n\n // Open the connection\n this._ws = new WebSocket(this._cfg.uri, this._cfg.protocols);\n this._ws.onopen = this.onOpen.bind(this);\n this._ws.onmessage = this.onMessage.bind(this);\n this._ws.onerror = this.onError.bind(this);\n this._ws.onclose = this.onClose.bind(this);\n this._timer = null;\n } catch (err) {\n console.error(err);\n this.tryToReconnect();\n }\n }\n\n /**\n * Validate options\n * @param cfg\n */\n isValidOptions(cfg: WSClientPropTypes) {\n let _error = false;\n if (!cfg) {\n console.error('Invalid WSClient options.');\n return _error;\n }\n if (!cfg.uri) {\n console.error('Invalid WSClient Uri options.');\n _error = true;\n }\n if (cfg && cfg.connecting && !(typeof cfg.connecting === 'function')) {\n console.error('Invalid WSClient connecting options.');\n _error = true;\n }\n if (cfg && cfg.connected && !(typeof cfg.connected === 'function')) {\n console.error('Invalid WSClient connected options.');\n _error = true;\n }\n if (cfg && cfg.receiveMessage && !(typeof cfg.receiveMessage === 'function')) {\n console.error('Invalid WSClient receiveMessage options.');\n _error = true;\n }\n if (cfg && cfg.disconnected && !(typeof cfg.disconnected === 'function')) {\n console.error('Invalid WSClient connecting options.');\n _error = true;\n }\n if (cfg && cfg.heartbeatMsg && !(typeof cfg.heartbeatMsg === 'string')) {\n console.error('Invalid WSClient heartbeatMsg options.');\n _error = true;\n }\n if (cfg && cfg.debug && !(typeof cfg.debug === 'boolean')) {\n console.error('Invalid WSClient debug options.');\n _error = true;\n }\n return !_error;\n }\n\n /**\n * Try to reconnect if previous connection failed\n * Generate an interval, after that try to reconnect\n */\n tryToReconnect() {\n if (this._cfg.mustReconnect && !this._timer) {\n this._cfg.debug && console.info(`Reconnecting...`);\n let interval = this.generateInteval(this._attempts);\n this._timer = setTimeout(this.reconnect.bind(this), interval);\n }\n }\n\n /**\n * Reestablish the connection\n * Increase the number of attempts\n */\n reconnect() {\n this._attempts++;\n this.connect();\n }\n\n /**\n * Send heartbeat every 5 seconds\n * If missing more than 3 heartbeats close connection\n */\n sendHeartbeat() {\n try {\n this._missedHeartbeats++;\n if (this._missedHeartbeats > 3) throw new Error('Too many missed heartbeats.');\n this._ws.send(this._cfg.heartbeatMsg);\n } catch (e) {\n clearInterval(this._heartbeatInterval);\n this._heartbeatInterval = null;\n this._cfg.debug && console.warn(`Closing connection. Reason: ${e.message}`);\n if (!this.isClosing() && !this.isClosed()) {\n this.close();\n }\n }\n }\n\n /**\n * Established the new connection\n * Reset this._attempts counter\n */\n onOpen() {\n this._cfg.debug && console.info('Connected!');\n this._attempts = 1;\n if (this._cfg.heartbeatMsg && this._heartbeatInterval === null) {\n this._missedHeartbeats = 0;\n this._heartbeatInterval = setInterval(this.sendHeartbeat.bind(this), 5000);\n }\n typeof this._cfg.connected === 'function' && this._cfg.connected();\n }\n\n /**\n * Connection closed. Try to reconnect.\n * @param evt\n */\n onClose(evt) {\n this._cfg.debug && console.info('Connection closed!');\n typeof this._cfg.disconnected === 'function' && this._cfg.disconnected(evt);\n this.tryToReconnect();\n }\n\n /**\n * An error occured\n * @param evt\n */\n onError(evt) {\n this._cfg.debug && console.error('Websocket connection is broken!');\n this._cfg.debug && console.error(evt);\n }\n\n /**\n * A message has arrived.\n * If it is the heartbeat -> reset this._missedHeartbeats\n * If it is data pass data to the callback\n * @param evt\n */\n onMessage(evt) {\n if (this._cfg.heartbeatMsg && evt.data === this._cfg.heartbeatMsg) {\n // reset the counter for missed heartbeats\n this._missedHeartbeats = 0;\n } else if (typeof this._cfg.receiveMessage === 'function') {\n return this._cfg.receiveMessage(evt.data);\n }\n }\n\n /**\n * Generate an interval that is randomly between 0 and 2^k - 1, where k is\n * the number of connection attmpts, with a maximum interval of 30 seconds,\n * so it starts at 0 - 1 seconds and maxes out at 0 - 30 seconds\n */\n generateInteval(k) {\n let maxInterval = (Math.pow(2, k) - 1) * 1000;\n // If the generated interval is more than 30 seconds, truncate it down to 30 seconds.\n if (maxInterval > 30 * 1000) {\n maxInterval = 30 * 1000;\n }\n // generate the interval to a random number between 0 and the maxInterval determined from above\n return Math.random() * maxInterval;\n }\n\n /**\n * Send message\n * @param message\n */\n public sendMessage(message) {\n this._ws && this._ws.send(message);\n }\n\n /**\n * Get the ws state\n */\n public getState() {\n return this._ws && this._ws.readyState;\n }\n\n /**\n * Check if ws is in connecting state\n */\n public isConnecting() {\n return this._ws && this._ws.readyState === 0;\n }\n\n /**\n * Check if ws is connected\n */\n public isConnected() {\n return this._ws && this._ws.readyState === 1;\n }\n\n /**\n * Check if ws is in closing state\n */\n public isClosing() {\n return this._ws && this._ws.readyState === 2;\n }\n\n /**\n * Check if ws is closed\n */\n public isClosed() {\n return this._ws && this._ws.readyState === 3;\n }\n\n /**\n * Close the connection\n */\n public close() {\n clearInterval(this._heartbeatInterval);\n this._cfg.mustReconnect = false;\n if (!this.isClosing() || !this.isClosed()) {\n this._ws.close();\n this._cfg.debug && console.error('Websocket closed.');\n }\n }\n}\n","export function getWindowWidth() {\n return typeof global.window !== 'undefined' ? global.window.innerWidth : 0;\n}\n\nexport function getWindowHeight() {\n return typeof global.window !== 'undefined' ? global.window.innerHeight : 0;\n}\n\nconst isCrossOriginFrame = () => {\n try {\n return global.window.location.hostname !== global.window.parent.location.hostname;\n } catch (e) {\n return true;\n }\n};\n\n// Get the highest window context that isn't cross-origin\n// (When in an iframe)\nexport function getHighestSafeWindowContext(self = global.window.self) {\n // If we reached the top level, return self\n if (self === global.window.top) {\n return self;\n }\n\n // If parent is the same origin, we can move up one context\n // Reference: https://stackoverflow.com/a/21965342/1601953\n if (!isCrossOriginFrame()) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n return getHighestSafeWindowContext(self.parent);\n }\n\n // If a different origin, we consider the current level\n // as the top reachable one\n return self;\n}\n\nexport function isClientSideRendering() {\n return typeof window !== 'undefined';\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","import {capitalize, isString, stripHtml, camelCase, copyTextToClipboard, fallbackCopyTextToClipboard, random} from './utils/string';\nimport {isValidUrl, isValidUrls, urlReplacer, getDomain, appendURLSearchParams, urlB64ToUint8Array} from './utils/url';\nimport {getHighestSafeWindowContext, getWindowWidth, getWindowHeight, isClientSideRendering} from './utils/window';\nimport {mergeDeep, isObject} from './utils/object';\nimport {loadVersionBrowser} from './utils/browser';\nimport {Logger} from './utils/logger';\nimport WSClient, {WSClientType, WSClientPropTypes} from './utils/websocket';\n\n/**\n * Export all utilities\n */\nexport {\n capitalize,\n isString,\n stripHtml,\n camelCase,\n copyTextToClipboard,\n fallbackCopyTextToClipboard,\n random,\n isValidUrl,\n isValidUrls,\n urlReplacer,\n getDomain,\n appendURLSearchParams,\n urlB64ToUint8Array,\n getHighestSafeWindowContext,\n getWindowWidth,\n getWindowHeight,\n isClientSideRendering,\n Logger,\n mergeDeep,\n isObject,\n WSClient,\n WSClientType,\n WSClientPropTypes,\n loadVersionBrowser\n};\n"],"names":["root","factory","exports","module","define","amd","self","navigator","uaData","browsername","browserversion","chromeVersion","i","length","brand","version","match","substr","indexOf","name","tem","ua","userAgent","M","test","exec","appName","appVersion","splice","scope","message","console","info","warn","error","log","debug","isObject","v","Array","isArray","mergeDeep","target","source","output","Object","assign","keys","forEach","key","fallbackCopyTextToClipboard","text","textArea","document","createElement","value","style","top","left","position","body","appendChild","focus","select","execCommand","removeChild","Promise","resolve","err","reject","str","toLowerCase","replace","$1","toUpperCase","strVal","strArr","split","chr","substring","clipboard","writeText","String","Math","random","toString","trim","baseUrl","queryParams","_url","slice","map","p","path","params","tpl","data","re","lastIndex","replacer","url","matches","isValidUrl","delimiter","every","base64String","base64","repeat","rawData","window","atob","outputArray","Uint8Array","charCodeAt","WSClient","constructor","cfg","_attempts","_heartbeatInterval","_missedHeartbeats","this","isValidOptions","_cfg","heartbeatMsg","mustReconnect","connect","_instance","_ws","isConnecting","isConnected","connecting","uri","WebSocket","protocols","onopen","onOpen","bind","onmessage","onMessage","onerror","onError","onclose","onClose","_timer","tryToReconnect","_error","connected","receiveMessage","disconnected","interval","generateInteval","setTimeout","reconnect","sendHeartbeat","Error","send","e","clearInterval","isClosing","isClosed","close","setInterval","evt","k","maxInterval","pow","sendMessage","getState","readyState","getHighestSafeWindowContext","global","location","hostname","parent","isCrossOriginFrame","innerHeight","innerWidth","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","g","globalThis","Function"],"sourceRoot":""}
1
+ {"version":3,"file":"utils.js","mappings":"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","sources":["webpack://SelfCommunityUtils/webpack/universalModuleDefinition","webpack://SelfCommunityUtils/./src/utils/browser.ts","webpack://SelfCommunityUtils/./src/utils/cache.ts","webpack://SelfCommunityUtils/./src/utils/logger.ts","webpack://SelfCommunityUtils/./src/utils/object.ts","webpack://SelfCommunityUtils/./src/utils/string.ts","webpack://SelfCommunityUtils/./src/utils/url.ts","webpack://SelfCommunityUtils/./src/utils/websocket.ts","webpack://SelfCommunityUtils/./src/utils/window.ts","webpack://SelfCommunityUtils/webpack/bootstrap","webpack://SelfCommunityUtils/webpack/runtime/global","webpack://SelfCommunityUtils/./src/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SelfCommunityUtils\"] = factory();\n\telse\n\t\troot[\"SelfCommunityUtils\"] = factory();\n})(self, () => {\nreturn ","/**\n * Get browser version to track on backend\n * @return {{name: string, version: null}|{name: string, version: string}|{name: *, version: *}|{name: string, version}}\n */\nexport const loadVersionBrowser = () => {\n if ('userAgentData' in navigator) {\n // navigator.userAgentData is not available in\n // Firefox and Safari\n const uaData: Array<any> = navigator['userAgentData'];\n // Outputs of navigator.userAgentData.brands[n].brand are e.g.\n // Chrome: 'Google Chrome'\n // Edge: 'Microsoft Edge'\n // Opera: 'Opera'\n let browsername;\n let browserversion;\n let chromeVersion = null;\n for (let i = 0; i < uaData['brands'].length; i++) {\n const brand = uaData['brands'][i].brand;\n browserversion = uaData['brands'][i].version;\n if (brand.match(/opera|chrome|edge|safari|firefox|msie|trident/i) !== null) {\n // If we have a chrome match, save the match, but try to find another match\n // E.g. Edge can also produce a false Chrome match.\n if (brand.match(/chrome/i) !== null) {\n chromeVersion = browserversion;\n }\n // If this is not a chrome match return immediately\n else {\n browsername = brand.substr(brand.indexOf(' ') + 1);\n return {\n name: browsername,\n version: browserversion,\n };\n }\n }\n }\n // No non-Chrome match was found. If we have a chrome match, return it.\n if (chromeVersion !== null) {\n return {\n name: 'chrome',\n version: chromeVersion,\n };\n }\n }\n // If no userAgentData is not present, or if no match via userAgentData was found,\n // try to extract the browser name and version from userAgent\n const userAgent = navigator.userAgent;\n let ua = userAgent;\n let tem;\n let M: any = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n if (/trident/i.test(M[1])) {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n return {name: 'IE', version: tem[1] || ''};\n }\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\bOPR\\/(\\d+)/);\n if (tem != null) {\n return {name: 'Opera', version: tem[1]};\n }\n }\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n // eslint-disable-next-line @typescript-eslint/prefer-regexp-exec\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) {\n M.splice(1, 1, tem[1]);\n }\n return {\n name: M[0],\n version: M[1],\n };\n};\n","/**\n * LruCache interface\n */\nexport interface LruCacheType<T> {\n get: (key: string, value?: T) => T;\n set: (key: string, value: T) => void;\n hasKey: (key: string) => boolean;\n delete: (key: string) => void;\n deleteKeys: (keys: string[]) => void;\n deleteKeysWithPrefix: (prefix: string) => void;\n clean: () => void;\n evaluate: () => void;\n}\n\n/**\n * LruCache\n */\nexport class LruCache<T> {\n private values: Map<string, T> = new Map<string, T>();\n private maxEntries;\n\n /**\n * Initialize Cache\n * @param maxEntries\n */\n constructor(maxEntries = 10000) {\n this.maxEntries = maxEntries;\n if (typeof window !== 'undefined') {\n window['__viewSCCache'] = this.values;\n }\n }\n\n /**\n * Get a key from the map store\n * @param key\n * @param value\n */\n public get(key: string, value?: T): T {\n const hasKey = this.values.has(key);\n let entry: T;\n if (hasKey) {\n // peek the entry, re-insert(updated if value) for LRU strategy\n entry = this.values.get(key);\n this.values.delete(key);\n this.values.set(key, entry);\n } else if (value) {\n // insert value if passed\n entry = value;\n this.values.set(key, entry);\n }\n return entry;\n }\n\n /**\n * Set a key in the store\n * @param key\n * @param value\n */\n public set(key: string, value: T): void {\n if (this.values.size >= this.maxEntries) {\n // least-recently used cache eviction strategy\n const keyToDelete = this.values.keys().next().value;\n this.values.delete(keyToDelete);\n }\n this.values.set(key, value);\n }\n\n /**\n * Check if key is in cache\n * @param key\n */\n public hasKey(key: string): boolean {\n return this.values.has(key);\n }\n\n /**\n * Delete a key in the store\n * @param key\n */\n public delete(key: string): void {\n const hasKey = this.values.has(key);\n if (hasKey) {\n this.values.delete(key);\n }\n }\n\n /**\n * Delete all entry with prefix keys\n * @param keys\n */\n public deleteKeys(keys: string[]): void {\n keys.forEach((k) => {\n const hasKey = this.values.has(k);\n if (hasKey) {\n this.values.delete(k);\n }\n });\n }\n\n /**\n * Delete all entry with prefix keys\n * @param prefix\n */\n public deleteKeysWithPrefix(prefix: string): void {\n this.values.forEach((v, k) => {\n if (k.startsWith(prefix)) {\n this.values.delete(k);\n }\n });\n }\n\n /**\n * Clean the store\n */\n public clean(): void {\n this.values = new Map<string, T>();\n }\n\n /**\n * Print the store in the console\n * Only for debug\n */\n public evaluate(): void {\n console.log(this.values);\n }\n}\n\n/**\n * Define the various types of caching strategies\n */\nexport enum CacheStrategies {\n CACHE_FIRST = 'Cache-first',\n NETWORK_ONLY = 'Network-only',\n STALE_WHILE_REVALIDATE = 'Stale-While-Revalidate'\n}\n\n/**\n * Export global cache\n */\nconst cache: LruCacheType<any> = new LruCache<any>();\nexport default cache;\n","/**\n * Emit styled message\n */\nexport class Logger {\n static info(scope, message) {\n console.info(`%c[${scope}]`, 'color:#008080', ` ${message}`);\n }\n\n static warn(scope, message) {\n console.warn(`%c[${scope}]`, 'color:#008080', ` ${message}`);\n }\n\n static error(scope, message) {\n console.error(`%c[${scope}]`, 'color:#008080', ` ${message}`);\n }\n\n static log(scope, message) {\n console.log(`%c[${scope}]`, 'color:#008080', ` ${message}`);\n }\n\n static debug(scope, message) {\n console.debug(`%c[${scope}]`, 'color:#008080', ` ${message}`);\n }\n}\n","/**\n * Check if v is an object\n * @param v\n */\nexport function isObject(v) {\n return typeof v === 'object' && !Array.isArray(v) && v !== null;\n}\n\n/**\n * Perfrom deep merge of two objects (not a shallow merge)\n * @param target\n * @param source\n * @return {*}\n */\nexport function mergeDeep(target: object, source: object): object {\n let output = Object.assign({}, target);\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach((key) => {\n if (isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, {[key]: source[key]});\n } else {\n output[key] = mergeDeep(target[key], source[key]);\n }\n } else {\n Object.assign(output, {[key]: source[key]});\n }\n });\n }\n return output;\n}\n","/**\n * Check if v is a string\n * @param v\n */\nexport function isString(v) {\n return typeof v === 'string' || v instanceof String;\n}\n\n/**\n * Capitalize a string\n * @param str\n */\nexport function capitalize(str: string): string {\n let strVal = '';\n let strArr: string[] = str.split(' ');\n for (let chr = 0; chr < strArr.length; chr++) {\n strVal += strArr[chr].substring(0, 1).toUpperCase() + strArr[chr].substring(1, strArr[chr].length);\n }\n return strVal;\n}\n\n/**\n * CamelCase a string\n * @param str\n */\nexport function camelCase(str: string): string {\n // Lower cases the string\n return (\n str\n .toLowerCase()\n // Replaces any - or _ characters with a space\n .replace(/[-_]+/g, ' ')\n // Removes any non alphanumeric characters\n .replace(/[^\\w\\s]/g, '')\n // Uppercases the first character in each group immediately following a space\n // (delimited by spaces)\n .replace(/ (.)/g, ($1) => {\n return $1.toUpperCase();\n })\n // Removes spaces\n .replace(/ /g, '')\n );\n}\n\n/**\n * Stripe html tags from a string\n * @param str\n */\nexport function stripHtml(str: string): string {\n return str.replace(/<[^>]*>?/gm, '').trim();\n}\n\nexport function random() {\n return (Math.random() + 1).toString(36).substring(7);\n}\n\n/**\n * Fallback if navigator.clipboard doensn't exist\n * @param text\n * @returns {Promise<void>}\n */\nexport function fallbackCopyTextToClipboard(text) {\n let textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n document.execCommand('copy');\n document.body.removeChild(textArea);\n return Promise.resolve();\n } catch (err) {\n document.body.removeChild(textArea);\n return Promise.reject(err);\n }\n}\n\n/**\n * Copy text to clipboard\n * @param text\n * @returns {Promise<void>}\n *\n * Ex.\n * copyTextToClipboard(text).then(\n * function () {\n * console.log('Async: Copying to clipboard was successful!');\n * },\n * function (err) {\n * console.error('Async: Could not copy text: ', err);\n * });\n */\nexport function copyTextToClipboard(text) {\n if (!navigator.clipboard) {\n return fallbackCopyTextToClipboard(text);\n }\n return navigator.clipboard.writeText(text);\n}\n","/**\n * Utility Url Replacer\n * @param path\n */\nexport const urlReplacer = (path: string) => {\n const replacer = function (tpl, data) {\n const re = /\\$\\(([^)]+)?\\)/g;\n let match = re.exec(tpl);\n while (match) {\n tpl = tpl.replace(match[0], data[match[1]]);\n re.lastIndex = 0;\n match = re.exec(tpl);\n }\n return tpl;\n };\n return (params: object) => replacer(path, params);\n};\n\n/**\n * Get domain\n * @param url\n */\nexport const getDomain = (url: string): string => {\n // eslint-disable-next-line no-useless-escape,@typescript-eslint/prefer-regexp-exec\n const matches = url.match(/^https?\\:\\/\\/([^\\/?#]+)(?:[\\/?#]|$)/i);\n if (matches && matches[1]) {\n return matches[1];\n }\n return '';\n};\n\n/**\n * Check a str is a valid url pattern\n * @param url\n */\nexport const isValidUrl = (url: string): boolean => {\n const regexp = /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/;\n return regexp.test(url);\n};\n\n/**\n * Check a str is a valid list of urls separated by delimiter\n * @param value\n * @param delimiter\n */\nexport const isValidUrls = (value: string, delimiter: string): boolean => {\n const urls = value.trim().split(delimiter);\n return urls.every(isValidUrl);\n};\n\n/**\n * Append params\n * @param baseUrl\n * @param queryParams\n */\nexport function appendURLSearchParams(baseUrl: string, queryParams: Record<string, string | number>[]) {\n let _url = baseUrl;\n if (queryParams.length && _url) {\n const key = Object.keys(queryParams[0])[0];\n _url += (_url.split('?')[1] ? '&' : '?') + `${key}=${queryParams[0][key]}`;\n queryParams.slice(1).map((p) => {\n const key = Object.keys(p)[0];\n _url += `&${key}=${p[key]}`;\n });\n }\n return _url;\n}\n\n/**\n * Take the application server's public key, which is Base64 URL-safe encoded,\n * and convert it to a UInt8Array, because this is the expected input of the subscribe()\n */\nexport const urlB64ToUint8Array = (base64String) => {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n};\n","/**\n * WSClientPropTypes interface\n */\nexport interface WSClientPropTypes {\n /**\n * The Websocket URI\n */\n uri: string;\n\n /**\n * The Websocket Protocols\n */\n protocols: string | string[];\n\n /**\n * String to identify the heartbeat message.\n */\n heartbeatMsg?: string;\n\n /**\n * Reconnect the websocket if close\n */\n mustReconnect?: boolean;\n\n /**\n * Callback called after the websocket is connected.\n */\n connected?: () => any;\n\n /**\n * Callback called when the websocket is connecting.\n */\n connecting?: () => any;\n\n /**\n * Callback called after the websocket is disconnected.\n */\n disconnected?: (evt) => any;\n\n /**\n * Callback called when a message is received from the websocket.\n */\n receiveMessage?: (data) => any;\n\n /**\n * Enable/disable debug\n */\n debug?: boolean;\n}\n\nexport interface WSClientType {\n /**\n * Send message\n * @param message\n */\n sendMessage: (message) => void;\n\n /**\n * Get current state\n */\n getState: () => string;\n\n /**\n * Get current connection state\n */\n isConnecting: () => boolean;\n\n /**\n * Check if ws is connected\n */\n isConnected: () => boolean;\n\n /**\n * Check if ws is closing connection\n */\n isClosing: () => boolean;\n\n /**\n * Return if ws is closed\n */\n isClosed: () => boolean;\n\n /**\n * Close the connection\n */\n close: () => void;\n}\n\n/**\n * WSClient: manage socket connection\n * @param options\n * @constructor\n */\nexport default class WSClient implements WSClientType {\n private static _instance;\n private _cfg;\n private _ws;\n private _timer;\n private _attempts = 1;\n private _heartbeatInterval = null;\n private _missedHeartbeats = 0;\n\n /**\n * Constructor\n * @param cfg\n */\n constructor(cfg: WSClientPropTypes) {\n if (!this.isValidOptions(cfg)) {\n return;\n }\n this._cfg = Object.assign({}, {heartbeatMsg: null, debug: false, mustReconnect: true}, cfg);\n this.connect();\n }\n\n /**\n * Get instance\n */\n public static getInstance(cfg): WSClient {\n this._instance = this._instance || new WSClient(cfg);\n return this._instance;\n }\n\n /**\n * Connect\n */\n connect() {\n try {\n if (this._ws && (this.isConnecting() || this.isConnected())) {\n // There is already a connection\n this._cfg.debug && console.info('Websocket is connecting or already connected.');\n return;\n }\n\n // Callback 'connecting' if exist\n typeof this._cfg.connecting === 'function' && this._cfg.connecting();\n this._cfg.debug && console.info(`Connecting to ${this._cfg.uri} ...`);\n\n // Open the connection\n this._ws = new WebSocket(this._cfg.uri, this._cfg.protocols);\n this._ws.onopen = this.onOpen.bind(this);\n this._ws.onmessage = this.onMessage.bind(this);\n this._ws.onerror = this.onError.bind(this);\n this._ws.onclose = this.onClose.bind(this);\n this._timer = null;\n } catch (err) {\n console.error(err);\n this.tryToReconnect();\n }\n }\n\n /**\n * Validate options\n * @param cfg\n */\n isValidOptions(cfg: WSClientPropTypes) {\n let _error = false;\n if (!cfg) {\n console.error('Invalid WSClient options.');\n return _error;\n }\n if (!cfg.uri) {\n console.error('Invalid WSClient Uri options.');\n _error = true;\n }\n if (cfg && cfg.connecting && !(typeof cfg.connecting === 'function')) {\n console.error('Invalid WSClient connecting options.');\n _error = true;\n }\n if (cfg && cfg.connected && !(typeof cfg.connected === 'function')) {\n console.error('Invalid WSClient connected options.');\n _error = true;\n }\n if (cfg && cfg.receiveMessage && !(typeof cfg.receiveMessage === 'function')) {\n console.error('Invalid WSClient receiveMessage options.');\n _error = true;\n }\n if (cfg && cfg.disconnected && !(typeof cfg.disconnected === 'function')) {\n console.error('Invalid WSClient connecting options.');\n _error = true;\n }\n if (cfg && cfg.heartbeatMsg && !(typeof cfg.heartbeatMsg === 'string')) {\n console.error('Invalid WSClient heartbeatMsg options.');\n _error = true;\n }\n if (cfg && cfg.debug && !(typeof cfg.debug === 'boolean')) {\n console.error('Invalid WSClient debug options.');\n _error = true;\n }\n return !_error;\n }\n\n /**\n * Try to reconnect if previous connection failed\n * Generate an interval, after that try to reconnect\n */\n tryToReconnect() {\n if (this._cfg.mustReconnect && !this._timer) {\n this._cfg.debug && console.info(`Reconnecting...`);\n let interval = this.generateInteval(this._attempts);\n this._timer = setTimeout(this.reconnect.bind(this), interval);\n }\n }\n\n /**\n * Reestablish the connection\n * Increase the number of attempts\n */\n reconnect() {\n this._attempts++;\n this.connect();\n }\n\n /**\n * Send heartbeat every 5 seconds\n * If missing more than 3 heartbeats close connection\n */\n sendHeartbeat() {\n try {\n this._missedHeartbeats++;\n if (this._missedHeartbeats > 3) throw new Error('Too many missed heartbeats.');\n this._ws.send(this._cfg.heartbeatMsg);\n } catch (e) {\n clearInterval(this._heartbeatInterval);\n this._heartbeatInterval = null;\n this._cfg.debug && console.warn(`Closing connection. Reason: ${e.message}`);\n if (!this.isClosing() && !this.isClosed()) {\n this.close();\n }\n }\n }\n\n /**\n * Established the new connection\n * Reset this._attempts counter\n */\n onOpen() {\n this._cfg.debug && console.info('Connected!');\n this._attempts = 1;\n if (this._cfg.heartbeatMsg && this._heartbeatInterval === null) {\n this._missedHeartbeats = 0;\n this._heartbeatInterval = setInterval(this.sendHeartbeat.bind(this), 5000);\n }\n typeof this._cfg.connected === 'function' && this._cfg.connected();\n }\n\n /**\n * Connection closed. Try to reconnect.\n * @param evt\n */\n onClose(evt) {\n this._cfg.debug && console.info('Connection closed!');\n typeof this._cfg.disconnected === 'function' && this._cfg.disconnected(evt);\n this.tryToReconnect();\n }\n\n /**\n * An error occured\n * @param evt\n */\n onError(evt) {\n this._cfg.debug && console.error('Websocket connection is broken!');\n this._cfg.debug && console.error(evt);\n }\n\n /**\n * A message has arrived.\n * If it is the heartbeat -> reset this._missedHeartbeats\n * If it is data pass data to the callback\n * @param evt\n */\n onMessage(evt) {\n if (this._cfg.heartbeatMsg && evt.data === this._cfg.heartbeatMsg) {\n // reset the counter for missed heartbeats\n this._missedHeartbeats = 0;\n } else if (typeof this._cfg.receiveMessage === 'function') {\n return this._cfg.receiveMessage(evt.data);\n }\n }\n\n /**\n * Generate an interval that is randomly between 0 and 2^k - 1, where k is\n * the number of connection attmpts, with a maximum interval of 30 seconds,\n * so it starts at 0 - 1 seconds and maxes out at 0 - 30 seconds\n */\n generateInteval(k) {\n let maxInterval = (Math.pow(2, k) - 1) * 1000;\n // If the generated interval is more than 30 seconds, truncate it down to 30 seconds.\n if (maxInterval > 30 * 1000) {\n maxInterval = 30 * 1000;\n }\n // generate the interval to a random number between 0 and the maxInterval determined from above\n return Math.random() * maxInterval;\n }\n\n /**\n * Send message\n * @param message\n */\n public sendMessage(message) {\n this._ws && this._ws.send(message);\n }\n\n /**\n * Get the ws state\n */\n public getState() {\n return this._ws && this._ws.readyState;\n }\n\n /**\n * Check if ws is in connecting state\n */\n public isConnecting() {\n return this._ws && this._ws.readyState === 0;\n }\n\n /**\n * Check if ws is connected\n */\n public isConnected() {\n return this._ws && this._ws.readyState === 1;\n }\n\n /**\n * Check if ws is in closing state\n */\n public isClosing() {\n return this._ws && this._ws.readyState === 2;\n }\n\n /**\n * Check if ws is closed\n */\n public isClosed() {\n return this._ws && this._ws.readyState === 3;\n }\n\n /**\n * Close the connection\n */\n public close() {\n clearInterval(this._heartbeatInterval);\n this._cfg.mustReconnect = false;\n if (!this.isClosing() || !this.isClosed()) {\n this._ws.close();\n this._cfg.debug && console.error('Websocket closed.');\n }\n }\n}\n","export function getWindowWidth() {\n return typeof global.window !== 'undefined' ? global.window.innerWidth : 0;\n}\n\nexport function getWindowHeight() {\n return typeof global.window !== 'undefined' ? global.window.innerHeight : 0;\n}\n\nconst isCrossOriginFrame = () => {\n try {\n return global.window.location.hostname !== global.window.parent.location.hostname;\n } catch (e) {\n return true;\n }\n};\n\n// Get the highest window context that isn't cross-origin\n// (When in an iframe)\nexport function getHighestSafeWindowContext(self = global.window.self) {\n // If we reached the top level, return self\n if (self === global.window.top) {\n return self;\n }\n\n // If parent is the same origin, we can move up one context\n // Reference: https://stackoverflow.com/a/21965342/1601953\n if (!isCrossOriginFrame()) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n return getHighestSafeWindowContext(self.parent);\n }\n\n // If a different origin, we consider the current level\n // as the top reachable one\n return self;\n}\n\nexport function isClientSideRendering() {\n return typeof window !== 'undefined';\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","import {capitalize, isString, stripHtml, camelCase, copyTextToClipboard, fallbackCopyTextToClipboard, random} from './utils/string';\nimport {isValidUrl, isValidUrls, urlReplacer, getDomain, appendURLSearchParams, urlB64ToUint8Array} from './utils/url';\nimport {getHighestSafeWindowContext, getWindowWidth, getWindowHeight, isClientSideRendering} from './utils/window';\nimport {mergeDeep, isObject} from './utils/object';\nimport {loadVersionBrowser} from './utils/browser';\nimport LRUCache, {LruCache, LruCacheType, CacheStrategies} from './utils/cache';\nimport {Logger} from './utils/logger';\nimport WSClient, {WSClientType, WSClientPropTypes} from './utils/websocket';\n\n/**\n * Export all utilities\n */\nexport {\n capitalize,\n isString,\n stripHtml,\n camelCase,\n copyTextToClipboard,\n fallbackCopyTextToClipboard,\n random,\n isValidUrl,\n isValidUrls,\n urlReplacer,\n getDomain,\n appendURLSearchParams,\n urlB64ToUint8Array,\n getHighestSafeWindowContext,\n getWindowWidth,\n getWindowHeight,\n isClientSideRendering,\n Logger,\n mergeDeep,\n isObject,\n WSClient,\n WSClientType,\n WSClientPropTypes,\n loadVersionBrowser,\n LRUCache,\n LruCache,\n LruCacheType,\n CacheStrategies\n};\n"],"names":["root","factory","exports","module","define","amd","self","navigator","uaData","browsername","browserversion","chromeVersion","i","length","brand","version","match","substr","indexOf","name","tem","ua","userAgent","M","test","exec","appName","appVersion","splice","LruCache","constructor","maxEntries","values","Map","this","window","get","key","value","entry","has","delete","set","size","keyToDelete","keys","next","hasKey","deleteKeys","forEach","k","deleteKeysWithPrefix","prefix","v","startsWith","clean","evaluate","console","log","CacheStrategies","scope","message","info","warn","error","debug","isObject","Array","isArray","mergeDeep","target","source","output","Object","assign","fallbackCopyTextToClipboard","text","textArea","document","createElement","style","top","left","position","body","appendChild","focus","select","execCommand","removeChild","Promise","resolve","err","reject","str","toLowerCase","replace","$1","toUpperCase","strVal","strArr","split","chr","substring","clipboard","writeText","String","Math","random","toString","trim","baseUrl","queryParams","_url","slice","map","p","path","params","tpl","data","re","lastIndex","replacer","url","matches","isValidUrl","delimiter","every","base64String","base64","repeat","rawData","atob","outputArray","Uint8Array","charCodeAt","WSClient","cfg","_attempts","_heartbeatInterval","_missedHeartbeats","isValidOptions","_cfg","heartbeatMsg","mustReconnect","connect","_instance","_ws","isConnecting","isConnected","connecting","uri","WebSocket","protocols","onopen","onOpen","bind","onmessage","onMessage","onerror","onError","onclose","onClose","_timer","tryToReconnect","_error","connected","receiveMessage","disconnected","interval","generateInteval","setTimeout","reconnect","sendHeartbeat","Error","send","e","clearInterval","isClosing","isClosed","close","setInterval","evt","maxInterval","pow","sendMessage","getState","readyState","getHighestSafeWindowContext","global","location","hostname","parent","isCrossOriginFrame","innerHeight","innerWidth","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","g","globalThis","Function"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@selfcommunity/utils",
3
- "version": "0.1.18",
3
+ "version": "0.1.19-alpha.0",
4
4
  "license": "MIT",
5
5
  "private": false,
6
6
  "main": "./lib/cjs/index.js",
@@ -100,5 +100,5 @@
100
100
  "bugs": {
101
101
  "url": "https://github.com/selfcommunity/community-js/issues"
102
102
  },
103
- "gitHead": "72bf2057ee4f764d65a19f472e16612ff9b3cf18"
103
+ "gitHead": "987ebb0465cfee81640777a90a9719e31b62aca8"
104
104
  }