@levi-gemcommerce/analytics 1.0.0-dev.13 → 1.0.0-dev.14

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.
@@ -1,63 +1,10 @@
1
- import { useQuery } from '@tanstack/react-query';
2
1
  import dayjs from 'dayjs';
3
2
  import quarterOfYear from 'dayjs/plugin/quarterOfYear.js';
4
3
  import timezone from 'dayjs/plugin/timezone.js';
5
4
  import utc from 'dayjs/plugin/utc.js';
5
+ import { useQuery } from '@tanstack/react-query';
6
6
  import { useState, useRef, useCallback, useEffect } from 'react';
7
7
 
8
- const ColumnSelectFragmentDoc = `
9
- fragment ColumnSelect on Column {
10
- dataType
11
- displayName
12
- name
13
- }
14
- `;
15
- const TableDataSelectFragmentDoc = `
16
- fragment TableDataSelect on TableData {
17
- columns {
18
- ...ColumnSelect
19
- }
20
- rows
21
- }
22
- `;
23
- const GemXqlResultSelectFragmentDoc = `
24
- fragment GemXQLResultSelect on GemxQLResult {
25
- tableData {
26
- ...TableDataSelect
27
- }
28
- }
29
- `;
30
-
31
- const GemxQlDocument = `
32
- query GemxQL($input: String!) {
33
- gemxQLQuery(query: $input) {
34
- ...GemXQLResultSelect
35
- }
36
- }
37
- ${GemXqlResultSelectFragmentDoc}
38
- ${TableDataSelectFragmentDoc}
39
- ${ColumnSelectFragmentDoc}`;
40
-
41
- const useCustomGemXQlQuery = (variables, fetcher, options) => {
42
- return useQuery({
43
- queryKey: ['GemXQlCustom', variables],
44
- queryFn: fetcher(GemxQlDocument, variables),
45
- ...options,
46
- });
47
- };
48
- useCustomGemXQlQuery.getKey = (variables) => ['GemXQlCustom', variables];
49
-
50
- const useGemxQlNamedQuery = ({ name, variables, fetcher }, options) => {
51
- const document = GemxQlDocument.replace(/query\s+GemxQL\b/, `query ${name}`);
52
- return useQuery({
53
- queryKey: [name, variables],
54
- queryFn: fetcher(document, variables),
55
- retry: 0,
56
- ...options,
57
- });
58
- };
59
- useGemxQlNamedQuery.getKey = (name, variables) => [name, variables];
60
-
61
8
  const NONE_VALUE = 'None';
62
9
  const PLACEHOLDER_VALUE = '-';
63
10
 
@@ -94,42 +41,12 @@ var EAnalyticColumnKey;
94
41
  EAnalyticColumnKey["TRAFFIC_SOURCE_ITEMS"] = "traffic_source_items";
95
42
  })(EAnalyticColumnKey || (EAnalyticColumnKey = {}));
96
43
 
97
- var EAnalyticMode;
98
- (function (EAnalyticMode) {
99
- EAnalyticMode["ALL_SESSION"] = "ALL_SESSION";
100
- EAnalyticMode["FIRST_SESSION"] = "FIRST_SESSION";
101
- EAnalyticMode["PAGE_ONLY"] = "PAGE_ONLY";
102
- })(EAnalyticMode || (EAnalyticMode = {}));
103
-
104
44
  var EAnalyticSource;
105
45
  (function (EAnalyticSource) {
106
46
  EAnalyticSource["SESSIONS"] = "sessions";
107
47
  EAnalyticSource["SALES"] = "sales";
108
48
  })(EAnalyticSource || (EAnalyticSource = {}));
109
49
 
110
- var EVisitorType;
111
- (function (EVisitorType) {
112
- EVisitorType["NEW"] = "new";
113
- EVisitorType["RETURNING"] = "returning";
114
- })(EVisitorType || (EVisitorType = {}));
115
- var EDeviceType;
116
- (function (EDeviceType) {
117
- EDeviceType["DESKTOP"] = "desktop";
118
- EDeviceType["MOBILE"] = "mobile";
119
- EDeviceType["TABLET"] = "tablet";
120
- })(EDeviceType || (EDeviceType = {}));
121
- var ETrafficSourceType;
122
- (function (ETrafficSourceType) {
123
- ETrafficSourceType["DIRECT"] = "direct";
124
- ETrafficSourceType["EMAIL"] = "email";
125
- ETrafficSourceType["REFERRAL"] = "referral";
126
- ETrafficSourceType["ORGANIC_SOCIAL"] = "organic-social";
127
- ETrafficSourceType["ORGANIC_SEARCH"] = "organic-search";
128
- ETrafficSourceType["PAID_SOCIAL"] = "paid-social";
129
- ETrafficSourceType["PAID_SEARCH"] = "paid-search";
130
- ETrafficSourceType["SMS"] = "sms";
131
- })(ETrafficSourceType || (ETrafficSourceType = {}));
132
-
133
50
  var EComparisonOperator;
134
51
  (function (EComparisonOperator) {
135
52
  EComparisonOperator["EQ"] = "=";
@@ -569,6 +486,9 @@ const trimDecimalZeros = (number) => {
569
486
  const cleanDecimal = (number, decimals = DEFAULT_DECIMALS) => {
570
487
  return trimDecimalZeros(number.toFixed(decimals));
571
488
  };
489
+ const numberWithCommas = (x) => {
490
+ return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
491
+ };
572
492
 
573
493
  /**
574
494
  * Utility function to calculate percentage and format it.
@@ -611,6 +531,72 @@ const dayjsTz = (date) => {
611
531
  return dayjs(date).tz(tz);
612
532
  };
613
533
 
534
+ var AnalyticInterval;
535
+ (function (AnalyticInterval) {
536
+ AnalyticInterval["DAY"] = "DAY";
537
+ AnalyticInterval["HOUR"] = "HOUR";
538
+ AnalyticInterval["MONTH"] = "MONTH";
539
+ AnalyticInterval["QUARTER"] = "QUARTER";
540
+ AnalyticInterval["WEEK"] = "WEEK";
541
+ AnalyticInterval["YEAR"] = "YEAR";
542
+ })(AnalyticInterval || (AnalyticInterval = {}));
543
+ const SECONDS_IN_MINUTE = 60;
544
+ const SECONDS_IN_HOUR = SECONDS_IN_MINUTE * SECONDS_IN_MINUTE;
545
+ const getTimeDurationLabel = (valueInSeconds) => {
546
+ let data = valueInSeconds;
547
+ if (!Number.isFinite(valueInSeconds) || valueInSeconds == null) {
548
+ data = 0;
549
+ }
550
+ const fixedValue = cleanDecimal(data);
551
+ if (data >= SECONDS_IN_HOUR) {
552
+ const hours = Math.floor(data / SECONDS_IN_HOUR);
553
+ const minutes = Math.floor((data % SECONDS_IN_HOUR) / SECONDS_IN_MINUTE);
554
+ const seconds = Math.floor(data % SECONDS_IN_MINUTE);
555
+ return `${hours}h ${minutes}m ${seconds}s`;
556
+ }
557
+ else if (data >= SECONDS_IN_MINUTE) {
558
+ const minutes = Math.floor(data / SECONDS_IN_MINUTE);
559
+ const seconds = Math.floor(data % SECONDS_IN_MINUTE);
560
+ return `${minutes}m ${seconds}s`;
561
+ }
562
+ else {
563
+ return `${fixedValue}s`;
564
+ }
565
+ };
566
+ const getFormattedByInterval = (value, interval, options) => {
567
+ if (!value)
568
+ return '';
569
+ const optionFormat = options?.isExpandDetail
570
+ ? {
571
+ formatHouse: 'MMM D, h:mm A',
572
+ formatDay: 'MMM D, YYYY',
573
+ formatMonth: 'MMM YYYY',
574
+ formatYear: 'MMM YYYY',
575
+ }
576
+ : {
577
+ formatHouse: 'h A',
578
+ formatDay: 'MMM D',
579
+ formatMonth: 'MMM YYYY',
580
+ formatYear: 'YYYY',
581
+ };
582
+ switch (interval) {
583
+ case AnalyticInterval.HOUR:
584
+ return dayjsTz(value).format(optionFormat.formatHouse);
585
+ case AnalyticInterval.DAY:
586
+ case AnalyticInterval.WEEK:
587
+ return dayjsTz(value).format(optionFormat.formatDay);
588
+ case AnalyticInterval.MONTH:
589
+ return dayjsTz(value).format(optionFormat.formatMonth);
590
+ case AnalyticInterval.QUARTER: {
591
+ const d = dayjsTz(value);
592
+ return `Q${d.quarter()} ${d.format('YYYY')}`;
593
+ }
594
+ case AnalyticInterval.YEAR:
595
+ return dayjsTz(value).format(optionFormat.formatYear);
596
+ }
597
+ return dayjsTz(value).format(optionFormat.formatMonth);
598
+ };
599
+
614
600
  const toDate = (value) => (typeof value === 'string' ? dayjsTz(value) : value);
615
601
  const isMidnight = (date) => date.hour() === 0 && date.minute() === 0;
616
602
  const formatDateForQuery = (date, isEndDay = false) => {
@@ -768,75 +754,6 @@ const extractColumnTypes = (response) => {
768
754
  return columnTypes;
769
755
  };
770
756
 
771
- var AnalyticInterval;
772
- (function (AnalyticInterval) {
773
- AnalyticInterval["DAY"] = "DAY";
774
- AnalyticInterval["HOUR"] = "HOUR";
775
- AnalyticInterval["MONTH"] = "MONTH";
776
- AnalyticInterval["QUARTER"] = "QUARTER";
777
- AnalyticInterval["WEEK"] = "WEEK";
778
- AnalyticInterval["YEAR"] = "YEAR";
779
- })(AnalyticInterval || (AnalyticInterval = {}));
780
- function numberWithCommas(x) {
781
- return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
782
- }
783
- const SECONDS_IN_MINUTE = 60;
784
- const SECONDS_IN_HOUR = SECONDS_IN_MINUTE * SECONDS_IN_MINUTE;
785
- const getTimeDurationLabel = (valueInSeconds) => {
786
- let data = valueInSeconds;
787
- if (!Number.isFinite(valueInSeconds) || valueInSeconds == null) {
788
- data = 0;
789
- }
790
- const fixedValue = cleanDecimal(data);
791
- if (data >= SECONDS_IN_HOUR) {
792
- const hours = Math.floor(data / SECONDS_IN_HOUR);
793
- const minutes = Math.floor((data % SECONDS_IN_HOUR) / SECONDS_IN_MINUTE);
794
- const seconds = Math.floor(data % SECONDS_IN_MINUTE);
795
- return `${hours}h ${minutes}m ${seconds}s`;
796
- }
797
- else if (data >= SECONDS_IN_MINUTE) {
798
- const minutes = Math.floor(data / SECONDS_IN_MINUTE);
799
- const seconds = Math.floor(data % SECONDS_IN_MINUTE);
800
- return `${minutes}m ${seconds}s`;
801
- }
802
- else {
803
- return `${fixedValue}s`;
804
- }
805
- };
806
- const getFormattedByInterval = (value, interval, options) => {
807
- if (!value)
808
- return '';
809
- const optionFormat = options?.isExpandDetail
810
- ? {
811
- formatHouse: 'MMM D, h:mm A',
812
- formatDay: 'MMM D, YYYY',
813
- formatMonth: 'MMM YYYY',
814
- formatYear: 'MMM YYYY',
815
- }
816
- : {
817
- formatHouse: 'h A',
818
- formatDay: 'MMM D',
819
- formatMonth: 'MMM YYYY',
820
- formatYear: 'YYYY',
821
- };
822
- switch (interval) {
823
- case AnalyticInterval.HOUR:
824
- return dayjsTz(value).format(optionFormat.formatHouse);
825
- case AnalyticInterval.DAY:
826
- case AnalyticInterval.WEEK:
827
- return dayjsTz(value).format(optionFormat.formatDay);
828
- case AnalyticInterval.MONTH:
829
- return dayjsTz(value).format(optionFormat.formatMonth);
830
- case AnalyticInterval.QUARTER: {
831
- const d = dayjsTz(value);
832
- return `Q${d.quarter()} ${d.format('YYYY')}`;
833
- }
834
- case AnalyticInterval.YEAR:
835
- return dayjsTz(value).format(optionFormat.formatYear);
836
- }
837
- return dayjsTz(value).format(optionFormat.formatMonth);
838
- };
839
-
840
757
  const formatAnalyticDate = (dateString) => {
841
758
  if (!dateString)
842
759
  return 'None';
@@ -977,6 +894,59 @@ const createNumericRowReader = (row, mode = ERowReaderMode.DEFAULT) => (key) =>
977
894
  return 0;
978
895
  };
979
896
 
897
+ const ColumnSelectFragmentDoc = `
898
+ fragment ColumnSelect on Column {
899
+ dataType
900
+ displayName
901
+ name
902
+ }
903
+ `;
904
+ const TableDataSelectFragmentDoc = `
905
+ fragment TableDataSelect on TableData {
906
+ columns {
907
+ ...ColumnSelect
908
+ }
909
+ rows
910
+ }
911
+ `;
912
+ const GemXqlResultSelectFragmentDoc = `
913
+ fragment GemXQLResultSelect on GemxQLResult {
914
+ tableData {
915
+ ...TableDataSelect
916
+ }
917
+ }
918
+ `;
919
+
920
+ const GemxQlDocument = `
921
+ query GemxQL($input: String!) {
922
+ gemxQLQuery(query: $input) {
923
+ ...GemXQLResultSelect
924
+ }
925
+ }
926
+ ${GemXqlResultSelectFragmentDoc}
927
+ ${TableDataSelectFragmentDoc}
928
+ ${ColumnSelectFragmentDoc}`;
929
+
930
+ const useCustomGemXQlQuery = (variables, fetcher, options) => {
931
+ return useQuery({
932
+ queryKey: ['GemXQlCustom', variables],
933
+ queryFn: fetcher(GemxQlDocument, variables),
934
+ ...options,
935
+ });
936
+ };
937
+ useCustomGemXQlQuery.getKey = (variables) => ['GemXQlCustom', variables];
938
+
939
+ const useGemxQlNamedQuery = ({ name, variables, fetcher }, options) => {
940
+ const document = GemxQlDocument.replace(/query\s+GemxQL\b/, `query ${name}`);
941
+ return useQuery({
942
+ queryKey: [name, variables],
943
+ queryFn: fetcher(document, variables),
944
+ retry: 0,
945
+ ...options,
946
+ });
947
+ };
948
+ useGemxQlNamedQuery.getKey = (name, variables) => [name, variables];
949
+
980
950
  const useAnalyticData = (getTextPrice) => {
981
951
  const formatData = ({ value, formatter, name }) => {
982
952
  return formatAnalyticData({ value, formatter, getTextPrice, name });
@@ -1033,4 +1003,4 @@ const useGemXQlPagination = ({ resetKey, itemsPerPage, }) => {
1033
1003
  return { currentPage: effectivePage, offset, buildPagination };
1034
1004
  };
1035
1005
 
1036
- export { AnalyticInterval, CLAUSE_KEYWORDS, CLAUSE_KEYWORD_BOUNDARY, COMPARE_PREFIX, COMPARE_SUFFIX, COMPARE_TOTALS_SUFFIX, ColumnSelectFragmentDoc, DATE_QUERY_FORMAT, DEFAULT_QUERY_LIMIT, EAnalyticColumnKey, EAnalyticDataType, EAnalyticMode, EAnalyticSource, EComparisonOperator, EDeviceType, EFilterField, EGroupOperator, EGroupWithClause, EOperatorField, EOrderDirectionType, EPageDimension, EPageField, EPageMetric, ERowReaderMode, ETimeDimension, ETrafficSourceType, EVisitorType, GPaginationDirection, GemXqlResultSelectFragmentDoc, GemxQlDocument, NONE_VALUE, OPERATOR_IS, OPERATOR_IS_ONE_OF, PLACEHOLDER_VALUE, ROW_READER_MODE_CONFIG, TOTALS_SUFFIX, TableDataSelectFragmentDoc, build$a as buildConditionQuery, buildExtraCondition, buildExtraConditions, build$9 as buildFromQuery, buildGemXQlQuery, build$8 as buildGroupQuery, build$7 as buildLimitQuery, build$6 as buildModeQuery, build$5 as buildOffsetQuery, build$4 as buildOrderByQuery, build$3 as buildShowQuery, build$2 as buildTimeQuery, build$1 as buildTimeSeriesQuery, build as buildTimezoneQuery, buildVersionIdCondition, createNumericRowReader, extractColumnTypes, extractQueryColumns, extractQueryRows, filterConfigs, formatAnalyticData, formatAnalyticDate, generateFilterConditions, getComparisonKey, getComparisonTotalsKey, getFirstMetricInOrderBy, getFormattedByInterval, getTimeDimensionByDate, getTimeDurationLabel, getTotalsKey, hasMetricData, isValidQueryInput, numberWithCommas, parseBreakdownItems, parse$b as parseConditionQuery, parse$a as parseFromQuery, parse as parseGemXQlQuery, parse$9 as parseGroupQuery, parseJsonArray, parseJsonObject, parse$8 as parseLimitQuery, parse$7 as parseModeQuery, parse$6 as parseOffsetQuery, parse$5 as parseOrderByQuery, parsePageItems, parse$4 as parseShowQuery, parse$3 as parseTimeQuery, parse$2 as parseTimeSeriesQuery, parse$1 as parseTimezoneQuery, readNumeric, useAnalyticData, useCustomGemXQlQuery, useGemXQlPagination, useGemxQlNamedQuery };
1006
+ export { CLAUSE_KEYWORDS, CLAUSE_KEYWORD_BOUNDARY, COMPARE_PREFIX, COMPARE_SUFFIX, COMPARE_TOTALS_SUFFIX, ColumnSelectFragmentDoc, DATE_QUERY_FORMAT, DEFAULT_QUERY_LIMIT, EAnalyticColumnKey, EAnalyticDataType, EAnalyticSource, EComparisonOperator, EFilterField, EGroupOperator, EGroupWithClause, EOperatorField, EOrderDirectionType, EPageDimension, EPageField, EPageMetric, ERowReaderMode, ETimeDimension, GPaginationDirection, GemXqlResultSelectFragmentDoc, GemxQlDocument, NONE_VALUE, OPERATOR_IS, OPERATOR_IS_ONE_OF, PLACEHOLDER_VALUE, ROW_READER_MODE_CONFIG, TOTALS_SUFFIX, TableDataSelectFragmentDoc, build$a as buildConditionQuery, buildExtraCondition, buildExtraConditions, build$9 as buildFromQuery, buildGemXQlQuery, build$8 as buildGroupQuery, build$7 as buildLimitQuery, build$6 as buildModeQuery, build$5 as buildOffsetQuery, build$4 as buildOrderByQuery, build$3 as buildShowQuery, build$2 as buildTimeQuery, build$1 as buildTimeSeriesQuery, build as buildTimezoneQuery, buildVersionIdCondition, createNumericRowReader, extractColumnTypes, extractQueryColumns, extractQueryRows, filterConfigs, formatAnalyticData, formatAnalyticDate, generateFilterConditions, getComparisonKey, getComparisonTotalsKey, getFirstMetricInOrderBy, getTimeDimensionByDate, getTotalsKey, hasMetricData, isValidQueryInput, parseBreakdownItems, parse$b as parseConditionQuery, parse$a as parseFromQuery, parse as parseGemXQlQuery, parse$9 as parseGroupQuery, parseJsonArray, parseJsonObject, parse$8 as parseLimitQuery, parse$7 as parseModeQuery, parse$6 as parseOffsetQuery, parse$5 as parseOrderByQuery, parsePageItems, parse$4 as parseShowQuery, parse$3 as parseTimeQuery, parse$2 as parseTimeSeriesQuery, parse$1 as parseTimezoneQuery, readNumeric, useAnalyticData, useCustomGemXQlQuery, useGemXQlPagination, useGemxQlNamedQuery };
@@ -1,2 +1,3 @@
1
1
  export * from './components';
2
+ export * from './constants';
2
3
  export * from './utils/dayjs';