@levo-so/core 0.1.36 → 0.1.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.d.ts CHANGED
@@ -11,9 +11,18 @@ export declare const createLevoClient: (options: ILevoClientOptions) => {
11
11
  readonly workspace: `W${string}` | null;
12
12
  readonly audience: {
13
13
  readonly instance: import("analytics").AnalyticsInstance | null;
14
+ readonly is_identified: boolean;
15
+ storage_keys: {
16
+ identify: string;
17
+ open_tabs: string;
18
+ current_tab: string;
19
+ all_tabs: string;
20
+ };
14
21
  initiate: (properties: import("./types").ILevoAudience.Properties) => Promise<any>;
15
- identify: () => Promise<void>;
16
- track: <T extends import("./types").ILevoAudience.Properties>(event: string, properties: T & import("./types").ILevoAudience.Properties) => Promise<any>;
22
+ identify: (options?: {
23
+ withLock?: boolean;
24
+ }) => Promise<void>;
25
+ track: <T extends import("./types").ILevoAudience.Properties>(event: import("./types").AnalyticsEventType, properties: T & import("./types").ILevoAudience.Properties) => Promise<any>;
17
26
  bounce: (properties: import("./types").ILevoAudience.Properties) => Promise<void>;
18
27
  };
19
28
  readonly blog: {
@@ -1,12 +1,21 @@
1
1
  import { type AnalyticsInstance } from "analytics";
2
- import type { ILevoAudience } from "../types/audience";
2
+ import type { AnalyticsEventType, ILevoAudience } from "../types/audience";
3
3
  import { IHttpClient } from "../httpClient";
4
4
  import { ILevoControl } from ".";
5
5
  export declare const createLevoAudienceModule: (core: ILevoControl, httpClient: IHttpClient) => {
6
6
  readonly instance: AnalyticsInstance | null;
7
+ readonly is_identified: boolean;
8
+ storage_keys: {
9
+ identify: string;
10
+ open_tabs: string;
11
+ current_tab: string;
12
+ all_tabs: string;
13
+ };
7
14
  initiate: (properties: ILevoAudience.Properties) => Promise<any>;
8
- identify: () => Promise<void>;
9
- track: <T extends ILevoAudience.Properties>(event: string, properties: T & ILevoAudience.Properties) => Promise<any>;
15
+ identify: (options?: {
16
+ withLock?: boolean;
17
+ }) => Promise<void>;
18
+ track: <T extends ILevoAudience.Properties>(event: AnalyticsEventType, properties: T & ILevoAudience.Properties) => Promise<any>;
10
19
  bounce: (properties: ILevoAudience.Properties) => Promise<void>;
11
20
  };
12
21
  export type ILevoAudienceModule = ReturnType<typeof createLevoAudienceModule>;
@@ -1 +1 @@
1
- {"version":3,"file":"audience.d.ts","sourceRoot":"","sources":["../../src/control/audience.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAM9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,CAAC;AAEjC,eAAO,MAAM,wBAAwB,SAC7B,YAAY,cACN,WAAW;;2BA4Ka,aAAa,CAAC,UAAU;;YAwLvC,CAAC,SAAS,aAAa,CAAC,UAAU,SAC9C,MAAM,cACD,CAAC,GAAG,aAAa,CAAC,UAAU;yBAhBR,aAAa,CAAC,UAAU;CA8D3D,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"audience.d.ts","sourceRoot":"","sources":["../../src/control/audience.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAM9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,CAAC;AAEjC,eAAO,MAAM,wBAAwB,SAC7B,YAAY,cACN,WAAW;;;;;;;;;2BAgLa,aAAa,CAAC,UAAU;yBAtC1B;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE;YA0OnC,CAAC,SAAS,aAAa,CAAC,UAAU,SAC9C,kBAAkB,cACb,CAAC,GAAG,aAAa,CAAC,UAAU;yBAhBR,aAAa,CAAC,UAAU;CAkE3D,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
package/dist/index.js CHANGED
@@ -311,7 +311,7 @@ var getLevoError = (error) => {
311
311
  var LocalStorageLock = class {
312
312
  key;
313
313
  constructor(lockKey) {
314
- this.key = `lock_${lockKey}`;
314
+ this.key = lockKey;
315
315
  }
316
316
  acquireLock(expiryMs = 5e3) {
317
317
  const now = Date.now();
@@ -323,6 +323,11 @@ var LocalStorageLock = class {
323
323
  }
324
324
  }
325
325
  localStorage.setItem(this.key, now.toString());
326
+ setTimeout(() => {
327
+ if (this.isLocked(expiryMs)) {
328
+ this.releaseLock();
329
+ }
330
+ }, expiryMs);
326
331
  return true;
327
332
  }
328
333
  releaseLock() {
@@ -330,7 +335,9 @@ var LocalStorageLock = class {
330
335
  }
331
336
  isLocked(expiryMs = 5e3) {
332
337
  const lockValue = localStorage.getItem(this.key);
333
- if (!lockValue) return false;
338
+ if (!lockValue) {
339
+ return false;
340
+ }
334
341
  const timestamp = Number(lockValue);
335
342
  return Date.now() - timestamp < expiryMs;
336
343
  }
@@ -342,19 +349,16 @@ var createLevoAudienceModule = (core, httpClient) => {
342
349
  const _IDLE_TIMEOUT = 60 * 1e3;
343
350
  let instance = null;
344
351
  let idle_listener = null;
352
+ const storage_keys = {
353
+ identify: "lock:lv_aud_identify",
354
+ open_tabs: "lv_insights_ot",
355
+ current_tab: "lv_insights_ct",
356
+ all_tabs: "lv_insights_at"
357
+ };
345
358
  let _session = "";
346
359
  let _device = "";
347
- let _is_identified = false;
360
+ let is_identified = false;
348
361
  let _batch = [];
349
- const request = (url, data) => {
350
- const headers = {
351
- Accept: "application/json",
352
- "Content-Type": "application/json"
353
- };
354
- return httpClient.instance.url(core?.insightsUrl, true).url(url).options({
355
- keepAlive: true
356
- }).headers(headers).post(data).json();
357
- };
358
362
  const getReferrer = () => {
359
363
  if (typeof document === "undefined") {
360
364
  return {};
@@ -381,7 +385,7 @@ var createLevoAudienceModule = (core, httpClient) => {
381
385
  if (typeof window === "undefined" || !("sessionStorage" in window)) {
382
386
  return "";
383
387
  }
384
- const CURRENT_TAB_LOCAL_STORAGE_KEY = "lv_insights_ct";
388
+ const CURRENT_TAB_LOCAL_STORAGE_KEY = storage_keys.current_tab;
385
389
  return window.sessionStorage.getItem(CURRENT_TAB_LOCAL_STORAGE_KEY) || "";
386
390
  } catch (_) {
387
391
  return "";
@@ -392,31 +396,12 @@ var createLevoAudienceModule = (core, httpClient) => {
392
396
  if (typeof window === "undefined" || !("localStorage" in window)) {
393
397
  return 0;
394
398
  }
395
- const OT_LOCAL_STORAGE_KEY = "lv_insights_ot";
399
+ const OT_LOCAL_STORAGE_KEY = storage_keys.open_tabs;
396
400
  return Number(window.localStorage.getItem(OT_LOCAL_STORAGE_KEY)) || 0;
397
401
  } catch (_) {
398
402
  return 0;
399
403
  }
400
404
  };
401
- const startActivityListener = () => {
402
- if (typeof document !== "undefined" && !idle_listener) {
403
- idle_listener = onUserActivity({
404
- timeout: _IDLE_TIMEOUT,
405
- throttle: _IDLE_THROTTLE,
406
- onIdle: (activeForSeconds) => {
407
- track("user.idle", {
408
- seconds_active: activeForSeconds
409
- });
410
- },
411
- onWakeUp: (idleForSeconds) => {
412
- track("user.active", {
413
- seconds_idle: idleForSeconds
414
- });
415
- }
416
- });
417
- }
418
- return null;
419
- };
420
405
  const getActivityStatus = () => {
421
406
  const status = idle_listener?.getStatus();
422
407
  if (!status) {
@@ -427,6 +412,28 @@ var createLevoAudienceModule = (core, httpClient) => {
427
412
  seconds: status.isIdle ? status.idle : status.active
428
413
  };
429
414
  };
415
+ const identify = async (options) => {
416
+ if (!instance) {
417
+ return;
418
+ }
419
+ const withLock = options?.withLock ?? true;
420
+ const referrer = getReferrer();
421
+ const traits = await getUserProperties();
422
+ await instance.identify("", {
423
+ ...traits,
424
+ referrer,
425
+ withLock
426
+ });
427
+ };
428
+ const request = (url, data) => {
429
+ const headers = {
430
+ Accept: "application/json",
431
+ "Content-Type": "application/json"
432
+ };
433
+ return httpClient.instance.url(core?.insightsUrl, true).url(url).options({
434
+ keepAlive: true
435
+ }).headers(headers).post(data).json();
436
+ };
430
437
  const initiate = async (properties) => {
431
438
  if (core.NODE_ENV === "development") {
432
439
  return;
@@ -495,6 +502,7 @@ var createLevoAudienceModule = (core, httpClient) => {
495
502
  if (!core?.insightsUrl || !core.workspace) {
496
503
  return;
497
504
  }
505
+ const withLock = payload?.traits?.withLock ?? true;
498
506
  const welcomeInput = {
499
507
  private_mode: payload.traits.private_mode,
500
508
  dark_mode: payload.traits.dark_mode,
@@ -511,10 +519,13 @@ var createLevoAudienceModule = (core, httpClient) => {
511
519
  tab_id: getCurrentTabId(),
512
520
  tab_count: getTabCount()
513
521
  };
514
- const identifyLock = new LocalStorageLock("lv_aud_identify");
515
- if (identifyLock.acquireLock()) {
522
+ let identifyLock = null;
523
+ if (withLock) {
524
+ identifyLock = new LocalStorageLock(storage_keys.identify);
525
+ }
526
+ if (!identifyLock || identifyLock.acquireLock()) {
516
527
  request(`/v1/insights/event/welcome`, welcomeInput).then((data) => {
517
- _is_identified = true;
528
+ is_identified = true;
518
529
  _session = data.content.data.session;
519
530
  _device = data.content.data.device;
520
531
  let isQueued = false;
@@ -529,9 +540,9 @@ var createLevoAudienceModule = (core, httpClient) => {
529
540
  request("/v1/insights/event/bulk", _batch);
530
541
  }
531
542
  _batch = [];
532
- identifyLock.releaseLock();
543
+ identifyLock?.releaseLock();
533
544
  }).catch((e) => {
534
- identifyLock.releaseLock();
545
+ identifyLock?.releaseLock();
535
546
  return getLevoError(e);
536
547
  });
537
548
  }
@@ -548,16 +559,24 @@ var createLevoAudienceModule = (core, httpClient) => {
548
559
  identifier: properties.id
549
560
  });
550
561
  };
551
- const identify = async () => {
552
- if (!instance) {
553
- return;
562
+ const startActivityListener = () => {
563
+ if (typeof document !== "undefined" && !idle_listener) {
564
+ idle_listener = onUserActivity({
565
+ timeout: _IDLE_TIMEOUT,
566
+ throttle: _IDLE_THROTTLE,
567
+ onIdle: (activeForSeconds) => {
568
+ track("user.idle", {
569
+ seconds_active: activeForSeconds
570
+ });
571
+ },
572
+ onWakeUp: (idleForSeconds) => {
573
+ track("user.active", {
574
+ seconds_idle: idleForSeconds
575
+ });
576
+ }
577
+ });
554
578
  }
555
- const referrer = getReferrer();
556
- const traits = await getUserProperties();
557
- await instance.identify("", {
558
- ...traits,
559
- referrer
560
- });
579
+ return null;
561
580
  };
562
581
  const bounce = async (properties) => {
563
582
  const activity_status = getActivityStatus();
@@ -574,7 +593,7 @@ var createLevoAudienceModule = (core, httpClient) => {
574
593
  if (!core.workspace) {
575
594
  return;
576
595
  }
577
- if (instance && _is_identified) {
596
+ if (instance && is_identified) {
578
597
  return instance.track(event, properties);
579
598
  }
580
599
  return _batch.push({
@@ -607,6 +626,10 @@ var createLevoAudienceModule = (core, httpClient) => {
607
626
  get instance() {
608
627
  return instance;
609
628
  },
629
+ get is_identified() {
630
+ return is_identified;
631
+ },
632
+ storage_keys,
610
633
  initiate,
611
634
  identify,
612
635
  track,
@@ -1142,6 +1165,55 @@ var createLevoClient = (options) => {
1142
1165
  };
1143
1166
  };
1144
1167
 
1168
+ // src/utils/listToX.ts
1169
+ var listToRecord = (columns) => {
1170
+ return columns.reduce((prev, current) => {
1171
+ prev[current] = current;
1172
+ return prev;
1173
+ }, {});
1174
+ };
1175
+
1176
+ // src/types/audience.ts
1177
+ var AnalyticsEventsList = [
1178
+ // Bevy Events
1179
+ "bevy.collection.filled",
1180
+ "bevy.collection.submitted",
1181
+ "bevy.collection.view",
1182
+ // Block Events
1183
+ "block.view",
1184
+ // Blog Events
1185
+ "blog.post.view",
1186
+ // Event Events
1187
+ "event.booking.confirmed",
1188
+ "event.booking.initiated",
1189
+ "event.booking.pending",
1190
+ "event.coupon.applied",
1191
+ "event.event.view",
1192
+ // Form Events
1193
+ "form.change",
1194
+ "form.submit",
1195
+ // Membership Events
1196
+ "membership.account.signin",
1197
+ "membership.account.signout",
1198
+ "membership.account.signup",
1199
+ // UI Events
1200
+ "button.click",
1201
+ "page.bounce",
1202
+ "page.click",
1203
+ "page.copy",
1204
+ "page.impression",
1205
+ "page.scroll",
1206
+ "page.view",
1207
+ "page.metrics",
1208
+ "page.selection",
1209
+ "page.speedtest",
1210
+ // User Activity Events
1211
+ "user.active",
1212
+ "user.speedtest",
1213
+ "user.idle"
1214
+ ];
1215
+ var AnalyticsEvents = listToRecord(AnalyticsEventsList);
1216
+
1145
1217
  // src/constants/collection/fieldInterfaceFormat.ts
1146
1218
  var formatsByInterface = {
1147
1219
  ArrayWidget: [],
@@ -1351,4 +1423,4 @@ var formatImagePath = (string) => {
1351
1423
  return "";
1352
1424
  };
1353
1425
 
1354
- export { FieldInterfaces, FieldInterfacesList, FieldKind, FieldKindList, LevoError, LevoOAuthProviderList, LocalStorageLock, MediaKind, MediaKindList, createLevoClient, defaultByKinds, formatImagePath, formatsByInterface, getLevoError, interfaceKinds };
1426
+ export { AnalyticsEvents, AnalyticsEventsList, FieldInterfaces, FieldInterfacesList, FieldKind, FieldKindList, LevoError, LevoOAuthProviderList, LocalStorageLock, MediaKind, MediaKindList, createLevoClient, defaultByKinds, formatImagePath, formatsByInterface, getLevoError, interfaceKinds };
@@ -1,3 +1,35 @@
1
+ export declare const AnalyticsEventsList: readonly ["bevy.collection.filled", "bevy.collection.submitted", "bevy.collection.view", "block.view", "blog.post.view", "event.booking.confirmed", "event.booking.initiated", "event.booking.pending", "event.coupon.applied", "event.event.view", "form.change", "form.submit", "membership.account.signin", "membership.account.signout", "membership.account.signup", "button.click", "page.bounce", "page.click", "page.copy", "page.impression", "page.scroll", "page.view", "page.metrics", "page.selection", "page.speedtest", "user.active", "user.speedtest", "user.idle"];
2
+ export type AnalyticsEventType = (typeof AnalyticsEventsList)[number];
3
+ export declare const AnalyticsEvents: {
4
+ "bevy.collection.filled": "bevy.collection.filled";
5
+ "bevy.collection.submitted": "bevy.collection.submitted";
6
+ "bevy.collection.view": "bevy.collection.view";
7
+ "block.view": "block.view";
8
+ "blog.post.view": "blog.post.view";
9
+ "event.booking.confirmed": "event.booking.confirmed";
10
+ "event.booking.initiated": "event.booking.initiated";
11
+ "event.booking.pending": "event.booking.pending";
12
+ "event.coupon.applied": "event.coupon.applied";
13
+ "event.event.view": "event.event.view";
14
+ "form.change": "form.change";
15
+ "form.submit": "form.submit";
16
+ "membership.account.signin": "membership.account.signin";
17
+ "membership.account.signout": "membership.account.signout";
18
+ "membership.account.signup": "membership.account.signup";
19
+ "button.click": "button.click";
20
+ "page.bounce": "page.bounce";
21
+ "page.click": "page.click";
22
+ "page.copy": "page.copy";
23
+ "page.impression": "page.impression";
24
+ "page.scroll": "page.scroll";
25
+ "page.view": "page.view";
26
+ "page.metrics": "page.metrics";
27
+ "page.selection": "page.selection";
28
+ "page.speedtest": "page.speedtest";
29
+ "user.active": "user.active";
30
+ "user.speedtest": "user.speedtest";
31
+ "user.idle": "user.idle";
32
+ };
1
33
  export declare namespace ILevoAudience {
2
34
  interface Traits {
3
35
  private_mode: boolean;
@@ -10,6 +42,7 @@ export declare namespace ILevoAudience {
10
42
  data: Record<string, string>;
11
43
  };
12
44
  properties: Record<string, any>;
45
+ withLock?: boolean;
13
46
  }
14
47
  type BaseProperties = Traits & {
15
48
  resource: string;
@@ -29,7 +62,7 @@ export declare namespace ILevoAudience {
29
62
  type EventProperties = {
30
63
  properties: Properties;
31
64
  traits: Traits;
32
- event: string;
65
+ event: AnalyticsEventType;
33
66
  type: "track" | "page" | "identify";
34
67
  userId: string | null;
35
68
  };
@@ -51,7 +84,7 @@ export declare namespace ILevoAudience {
51
84
  type CollectInput = BaseInput & {
52
85
  session_id?: string;
53
86
  device_id?: string;
54
- event: string;
87
+ event: AnalyticsEventType;
55
88
  version?: number;
56
89
  properties: Properties;
57
90
  resource: string;
@@ -1 +1 @@
1
- {"version":3,"file":"audience.d.ts","sourceRoot":"","sources":["../../src/types/audience.ts"],"names":[],"mappings":"AACA,yBAAiB,aAAa,CAAC;IAC7B,UAAiB,MAAM;QACrB,YAAY,EAAE,OAAO,CAAC;QACtB,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SAC9B,CAAC;QACF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACjC;IAED,KAAY,cAAc,GAAG,MAAM,GAAG;QACpC,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,UAAiB,eAAe;QAC9B,EAAE,EAAE,MAAM,CAAC;KACZ;IAED,UAAiB,kBAAkB;QACjC,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB;IAED,UAAiB,gBAAgB;QAC/B,OAAO,EAAE,MAAM,CAAC;KACjB;IAED,KAAY,UAAU,GAAG,OAAO,CAC9B,cAAc,GAAG,eAAe,GAAG,kBAAkB,GAAG,gBAAgB,CACzE,GACC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,GAAG,WAAW,GAAG,QAAQ,CAAC,CAAC,GACjE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEtB,KAAY,eAAe,GAAG;QAC5B,UAAU,EAAE,UAAU,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;QACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;KACvB,CAAC;IAEF,KAAY,SAAS,GAAG;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,KAAY,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC;IAE9C,KAAY,eAAe,GAAG;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,KAAY,YAAY,GAAG,SAAS,GAAG;QACrC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,UAAU,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;KAChC,CAAC;IAEF,KAAY,cAAc,GAAG;QAC3B,MAAM,EAAE,OAAO,CAAC;QAChB,UAAU,EAAE,OAAO,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH"}
1
+ {"version":3,"file":"audience.d.ts","sourceRoot":"","sources":["../../src/types/audience.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,sjBA4CtB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAC2B,CAAC;AAGxD,yBAAiB,aAAa,CAAC;IAC7B,UAAiB,MAAM;QACrB,YAAY,EAAE,OAAO,CAAC;QACtB,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SAC9B,CAAC;QACF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAEhC,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB;IAED,KAAY,cAAc,GAAG,MAAM,GAAG;QACpC,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,UAAiB,eAAe;QAC9B,EAAE,EAAE,MAAM,CAAC;KACZ;IAED,UAAiB,kBAAkB;QACjC,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB;IAED,UAAiB,gBAAgB;QAC/B,OAAO,EAAE,MAAM,CAAC;KACjB;IAED,KAAY,UAAU,GAAG,OAAO,CAC9B,cAAc,GAAG,eAAe,GAAG,kBAAkB,GAAG,gBAAgB,CACzE,GACC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,GAAG,WAAW,GAAG,QAAQ,CAAC,CAAC,GACjE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEtB,KAAY,eAAe,GAAG;QAC5B,UAAU,EAAE,UAAU,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,kBAAkB,CAAC;QAC1B,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;QACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;KACvB,CAAC;IAEF,KAAY,SAAS,GAAG;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,KAAY,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC;IAE9C,KAAY,eAAe,GAAG;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,KAAY,YAAY,GAAG,SAAS,GAAG;QACrC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,kBAAkB,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,UAAU,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;KAChC,CAAC;IAEF,KAAY,cAAc,GAAG;QAC3B,MAAM,EAAE,OAAO,CAAC;QAChB,UAAU,EAAE,OAAO,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH"}
@@ -0,0 +1,3 @@
1
+ export declare const listToColumn: <T extends string>(columns: readonly string[]) => Record<T, string>;
2
+ export declare const listToRecord: <T extends string>(columns: readonly string[]) => { [K in T]: K; };
3
+ //# sourceMappingURL=listToX.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listToX.d.ts","sourceRoot":"","sources":["../../src/utils/listToX.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,MAAM,WAClC,SAAS,MAAM,EAAE,KACzB,MAAM,CAAC,CAAC,EAAE,MAAM,CAOlB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,MAAM,WAClC,SAAS,MAAM,EAAE,KACzB,GACA,CAAM,IAAD,CAAC,GAAG,CAAC,GAUZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/utils/lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAS;gBAER,OAAO,EAAE,MAAM;IAI3B,WAAW,CAAC,QAAQ,GAAE,MAAa,GAAG,OAAO;IAe7C,WAAW,IAAI,IAAI;IAInB,QAAQ,CAAC,QAAQ,GAAE,MAAa,GAAG,OAAO;CAO3C"}
1
+ {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/utils/lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAS;gBAER,OAAO,EAAE,MAAM;IAI3B,WAAW,CAAC,QAAQ,GAAE,MAAa,GAAG,OAAO;IAuB7C,WAAW;IAIX,QAAQ,CAAC,QAAQ,GAAE,MAAa,GAAG,OAAO;CAS3C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@levo-so/core",
3
- "version": "0.1.36",
3
+ "version": "0.1.37",
4
4
  "author": "Levo Engineering <devs@theinternetfolks.com>",
5
5
  "description": "Levo common utilities",
6
6
  "type": "module",
@@ -25,8 +25,8 @@
25
25
  "@types/lodash-es": "4.17.12",
26
26
  "tsup": "8.2.4",
27
27
  "typescript": "5.5.4",
28
- "@levo/eslint-config": "0.0.0",
29
- "@levo/ts-config": "0.0.0"
28
+ "@levo/ts-config": "0.0.0",
29
+ "@levo/eslint-config": "0.0.0"
30
30
  },
31
31
  "main": "./dist/index.js",
32
32
  "module": "./dist/index.js",