@classytic/commerce-sdk 0.1.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.

Potentially problematic release.


This version of @classytic/commerce-sdk might be problematic. Click here for more details.

Files changed (131) hide show
  1. package/LICENSE +14 -0
  2. package/README.md +104 -0
  3. package/dist/adjustment-DTSLM7AN.js +5 -0
  4. package/dist/adjustment-DTSLM7AN.js.map +1 -0
  5. package/dist/analytics/index.d.ts +27 -0
  6. package/dist/analytics/index.js +6 -0
  7. package/dist/analytics/index.js.map +1 -0
  8. package/dist/analytics-DMcD-o8w.d.ts +76 -0
  9. package/dist/api-factory-B_h4RKBm.d.ts +280 -0
  10. package/dist/auth/index.d.ts +39 -0
  11. package/dist/auth/index.js +5 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/catalog/index.d.ts +479 -0
  14. package/dist/catalog/index.js +9 -0
  15. package/dist/catalog/index.js.map +1 -0
  16. package/dist/chunk-4ZQK3FFN.js +40 -0
  17. package/dist/chunk-4ZQK3FFN.js.map +1 -0
  18. package/dist/chunk-5L6EXDGH.js +465 -0
  19. package/dist/chunk-5L6EXDGH.js.map +1 -0
  20. package/dist/chunk-5ZFW3FEI.js +183 -0
  21. package/dist/chunk-5ZFW3FEI.js.map +1 -0
  22. package/dist/chunk-66OQAZSL.js +94 -0
  23. package/dist/chunk-66OQAZSL.js.map +1 -0
  24. package/dist/chunk-6RYGA6MF.js +123 -0
  25. package/dist/chunk-6RYGA6MF.js.map +1 -0
  26. package/dist/chunk-B6MPVOV7.js +328 -0
  27. package/dist/chunk-B6MPVOV7.js.map +1 -0
  28. package/dist/chunk-BDA2WSJA.js +148 -0
  29. package/dist/chunk-BDA2WSJA.js.map +1 -0
  30. package/dist/chunk-EIVYT3HM.js +126 -0
  31. package/dist/chunk-EIVYT3HM.js.map +1 -0
  32. package/dist/chunk-EPQN7ZKZ.js +27 -0
  33. package/dist/chunk-EPQN7ZKZ.js.map +1 -0
  34. package/dist/chunk-FA7QFJ2G.js +177 -0
  35. package/dist/chunk-FA7QFJ2G.js.map +1 -0
  36. package/dist/chunk-I5TIKUIQ.js +261 -0
  37. package/dist/chunk-I5TIKUIQ.js.map +1 -0
  38. package/dist/chunk-ILQUH444.js +135 -0
  39. package/dist/chunk-ILQUH444.js.map +1 -0
  40. package/dist/chunk-IXMWZJLV.js +616 -0
  41. package/dist/chunk-IXMWZJLV.js.map +1 -0
  42. package/dist/chunk-KZIGRIQG.js +75 -0
  43. package/dist/chunk-KZIGRIQG.js.map +1 -0
  44. package/dist/chunk-OF5M6R2S.js +769 -0
  45. package/dist/chunk-OF5M6R2S.js.map +1 -0
  46. package/dist/chunk-PYYLHUV6.js +3 -0
  47. package/dist/chunk-PYYLHUV6.js.map +1 -0
  48. package/dist/chunk-QO5AGZFP.js +159 -0
  49. package/dist/chunk-QO5AGZFP.js.map +1 -0
  50. package/dist/chunk-QUMTBLNE.js +76 -0
  51. package/dist/chunk-QUMTBLNE.js.map +1 -0
  52. package/dist/chunk-R5Z7NYLH.js +126 -0
  53. package/dist/chunk-R5Z7NYLH.js.map +1 -0
  54. package/dist/chunk-SZYWG5IB.js +75 -0
  55. package/dist/chunk-SZYWG5IB.js.map +1 -0
  56. package/dist/chunk-U3XT35GZ.js +202 -0
  57. package/dist/chunk-U3XT35GZ.js.map +1 -0
  58. package/dist/chunk-UGELTUIZ.js +830 -0
  59. package/dist/chunk-UGELTUIZ.js.map +1 -0
  60. package/dist/chunk-VR36QVX2.js +122 -0
  61. package/dist/chunk-VR36QVX2.js.map +1 -0
  62. package/dist/chunk-WUOQK7BO.js +13 -0
  63. package/dist/chunk-WUOQK7BO.js.map +1 -0
  64. package/dist/chunk-X6PV5MHG.js +582 -0
  65. package/dist/chunk-X6PV5MHG.js.map +1 -0
  66. package/dist/chunk-ZWLMFLLH.js +534 -0
  67. package/dist/chunk-ZWLMFLLH.js.map +1 -0
  68. package/dist/content/index.d.ts +309 -0
  69. package/dist/content/index.js +6 -0
  70. package/dist/content/index.js.map +1 -0
  71. package/dist/core/index.d.ts +107 -0
  72. package/dist/core/index.js +5 -0
  73. package/dist/core/index.js.map +1 -0
  74. package/dist/core/react.d.ts +107 -0
  75. package/dist/core/react.js +5 -0
  76. package/dist/core/react.js.map +1 -0
  77. package/dist/coupon-CHFcw7cd.d.ts +632 -0
  78. package/dist/coupon-zGkvO-Xx.d.ts +129 -0
  79. package/dist/crud.factory-DyKaPHcU.d.ts +181 -0
  80. package/dist/finance/index.d.ts +81 -0
  81. package/dist/finance/index.js +5 -0
  82. package/dist/finance/index.js.map +1 -0
  83. package/dist/finance-BJdfKRw0.d.ts +135 -0
  84. package/dist/index.d.ts +31 -0
  85. package/dist/index.js +29 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/inventory/index.d.ts +512 -0
  88. package/dist/inventory/index.js +16 -0
  89. package/dist/inventory/index.js.map +1 -0
  90. package/dist/inventory-DCiIZh8P.d.ts +742 -0
  91. package/dist/logistics/index.d.ts +226 -0
  92. package/dist/logistics/index.js +7 -0
  93. package/dist/logistics/index.js.map +1 -0
  94. package/dist/logistics-V8a9lUN3.d.ts +428 -0
  95. package/dist/media-CNLJK93J.d.ts +721 -0
  96. package/dist/movement-7MV3ADY5.js +5 -0
  97. package/dist/movement-7MV3ADY5.js.map +1 -0
  98. package/dist/payment-BRboLqvU.d.ts +127 -0
  99. package/dist/payments/index.d.ts +55 -0
  100. package/dist/payments/index.js +6 -0
  101. package/dist/payments/index.js.map +1 -0
  102. package/dist/platform/index.d.ts +645 -0
  103. package/dist/platform/index.js +8 -0
  104. package/dist/platform/index.js.map +1 -0
  105. package/dist/pos-D1jkkFl0.d.ts +885 -0
  106. package/dist/product-p09zXkXB.d.ts +260 -0
  107. package/dist/purchase-24BGT2HA.js +5 -0
  108. package/dist/purchase-24BGT2HA.js.map +1 -0
  109. package/dist/request-652PS6VR.js +5 -0
  110. package/dist/request-652PS6VR.js.map +1 -0
  111. package/dist/sales/index.d.ts +585 -0
  112. package/dist/sales/index.js +9 -0
  113. package/dist/sales/index.js.map +1 -0
  114. package/dist/server.d.ts +120 -0
  115. package/dist/server.js +27 -0
  116. package/dist/server.js.map +1 -0
  117. package/dist/size-guide-DgjzjM5P.d.ts +554 -0
  118. package/dist/stock-DEApGC-w.d.ts +632 -0
  119. package/dist/stock-OOUW57VQ.js +5 -0
  120. package/dist/stock-OOUW57VQ.js.map +1 -0
  121. package/dist/supplier-OC6JAWV6.js +5 -0
  122. package/dist/supplier-OC6JAWV6.js.map +1 -0
  123. package/dist/transaction/index.d.ts +104 -0
  124. package/dist/transaction/index.js +8 -0
  125. package/dist/transaction/index.js.map +1 -0
  126. package/dist/transaction-BTmoHpWh.d.ts +428 -0
  127. package/dist/transaction-u5oaNuav.d.ts +84 -0
  128. package/dist/transfer-7SYSH3RG.js +5 -0
  129. package/dist/transfer-7SYSH3RG.js.map +1 -0
  130. package/dist/user-data-DdLjAGwO.d.ts +132 -0
  131. package/package.json +146 -0
@@ -0,0 +1,126 @@
1
+ import { handleApiRequest } from './chunk-VR36QVX2.js';
2
+ import { useQuery } from '@tanstack/react-query';
3
+
4
+ // src/finance/api/finance.ts
5
+ var FinanceApi = class {
6
+ constructor() {
7
+ this.baseUrl = "/api/v1/finance";
8
+ }
9
+ /**
10
+ * Get finance statements (export)
11
+ * GET /finance/statements
12
+ *
13
+ * Query params:
14
+ * - startDate, endDate (ISO datetime) - required
15
+ * - branchId (optional)
16
+ * - source = web|pos|api (optional)
17
+ * - status (optional)
18
+ * - format = csv|json (default: csv)
19
+ * - page, limit (for JSON pagination)
20
+ */
21
+ async getStatements({
22
+ token,
23
+ params,
24
+ options = {}
25
+ }) {
26
+ if (!token) {
27
+ throw new Error("Authentication required");
28
+ }
29
+ const queryParams = new URLSearchParams();
30
+ if (params.startDate) queryParams.append("startDate", params.startDate);
31
+ if (params.endDate) queryParams.append("endDate", params.endDate);
32
+ if (params.branchId) queryParams.append("branchId", params.branchId);
33
+ if (params.source) queryParams.append("source", params.source);
34
+ if (params.status) queryParams.append("status", params.status);
35
+ if (params.format) queryParams.append("format", params.format);
36
+ if (params.page) queryParams.append("page", params.page.toString());
37
+ if (params.limit) queryParams.append("limit", params.limit.toString());
38
+ const url = `${this.baseUrl}/statements${queryParams.toString() ? `?${queryParams}` : ""}`;
39
+ return handleApiRequest("GET", url, {
40
+ token,
41
+ ...options
42
+ });
43
+ }
44
+ /**
45
+ * Get finance summary (dashboard)
46
+ * GET /finance/summary
47
+ *
48
+ * Query params:
49
+ * - startDate, endDate (ISO datetime) - required
50
+ * - branchId (optional)
51
+ * - source = web|pos|api (optional)
52
+ * - status (optional)
53
+ *
54
+ * Response:
55
+ * - data.totals: overall income/expense/net/count
56
+ * - data.byMethod: breakdown by payment method
57
+ * - data.byDay: per-day breakdown by branch
58
+ */
59
+ async getSummary({
60
+ token,
61
+ params,
62
+ options = {}
63
+ }) {
64
+ if (!token) {
65
+ throw new Error("Authentication required");
66
+ }
67
+ const queryParams = new URLSearchParams();
68
+ if (params.startDate) queryParams.append("startDate", params.startDate);
69
+ if (params.endDate) queryParams.append("endDate", params.endDate);
70
+ if (params.branchId) queryParams.append("branchId", params.branchId);
71
+ if (params.source) queryParams.append("source", params.source);
72
+ if (params.status) queryParams.append("status", params.status);
73
+ const url = `${this.baseUrl}/summary${queryParams.toString() ? `?${queryParams}` : ""}`;
74
+ return handleApiRequest("GET", url, {
75
+ token,
76
+ ...options
77
+ });
78
+ }
79
+ };
80
+ var financeApi = new FinanceApi();
81
+ var FINANCE_KEYS = {
82
+ all: ["finance"],
83
+ statements: () => [...FINANCE_KEYS.all, "statements"],
84
+ statementList: (params) => [...FINANCE_KEYS.statements(), params],
85
+ summary: () => [...FINANCE_KEYS.all, "summary"],
86
+ summaryData: (params) => [...FINANCE_KEYS.summary(), params]
87
+ };
88
+ function useFinanceStatements(token, params, options = {}) {
89
+ const { data, isLoading, isFetching, error, refetch } = useQuery({
90
+ queryKey: FINANCE_KEYS.statementList(params),
91
+ queryFn: () => financeApi.getStatements({ token, params }),
92
+ enabled: !!token && !!params.startDate && !!params.endDate && options.enabled !== false,
93
+ staleTime: options.staleTime ?? 2 * 60 * 1e3
94
+ // 2 minutes
95
+ });
96
+ return {
97
+ statements: data?.data || [],
98
+ isLoading,
99
+ isFetching,
100
+ error,
101
+ refetch
102
+ };
103
+ }
104
+ function useFinanceSummary(token, params, options = {}) {
105
+ const { data, isLoading, isFetching, error, refetch } = useQuery({
106
+ queryKey: FINANCE_KEYS.summaryData(params),
107
+ queryFn: () => financeApi.getSummary({ token, params }),
108
+ enabled: !!token && !!params.startDate && !!params.endDate && options.enabled !== false,
109
+ staleTime: options.staleTime ?? 2 * 60 * 1e3
110
+ // 2 minutes
111
+ });
112
+ return {
113
+ summary: data?.data || null,
114
+ totals: data?.data?.totals || null,
115
+ byMethod: data?.data?.byMethod || [],
116
+ byDay: data?.data?.byDay || [],
117
+ isLoading,
118
+ isFetching,
119
+ error,
120
+ refetch
121
+ };
122
+ }
123
+
124
+ export { FINANCE_KEYS, FinanceApi, financeApi, useFinanceStatements, useFinanceSummary };
125
+ //# sourceMappingURL=chunk-EIVYT3HM.js.map
126
+ //# sourceMappingURL=chunk-EIVYT3HM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/finance/api/finance.ts","../src/finance/hooks/finance.ts"],"names":[],"mappings":"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","file":"chunk-EIVYT3HM.js","sourcesContent":["// finance/api/finance.ts\r\nimport { handleApiRequest } from \"../../core/api-handler\";\r\nimport type { ApiResponse, RequestOptions } from \"../../core/api-factory\";\r\nimport type {\r\n FinanceStatement,\r\n FinanceStatementParams,\r\n FinanceSummary,\r\n FinanceSummaryParams,\r\n} from \"../types\";\r\n\r\ntype FetchOptions = Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n\r\n/**\r\n * Finance API - Statements and summaries for backoffice\r\n *\r\n * Endpoints:\r\n * - getStatements({ token, params }) - Export statements (CSV/JSON)\r\n * - getSummary({ token, params }) - Get summary with breakdowns\r\n *\r\n * Roles:\r\n * - admin, superadmin, finance-admin, finance-manager\r\n */\r\nclass FinanceApi {\r\n private baseUrl: string;\r\n\r\n constructor() {\r\n this.baseUrl = \"/api/v1/finance\";\r\n }\r\n\r\n /**\r\n * Get finance statements (export)\r\n * GET /finance/statements\r\n *\r\n * Query params:\r\n * - startDate, endDate (ISO datetime) - required\r\n * - branchId (optional)\r\n * - source = web|pos|api (optional)\r\n * - status (optional)\r\n * - format = csv|json (default: csv)\r\n * - page, limit (for JSON pagination)\r\n */\r\n async getStatements({\r\n token,\r\n params,\r\n options = {},\r\n }: {\r\n token: string;\r\n params: FinanceStatementParams;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<FinanceStatement[]>> {\r\n if (!token) {\r\n throw new Error(\"Authentication required\");\r\n }\r\n\r\n const queryParams = new URLSearchParams();\r\n\r\n if (params.startDate) queryParams.append(\"startDate\", params.startDate);\r\n if (params.endDate) queryParams.append(\"endDate\", params.endDate);\r\n if (params.branchId) queryParams.append(\"branchId\", params.branchId);\r\n if (params.source) queryParams.append(\"source\", params.source);\r\n if (params.status) queryParams.append(\"status\", params.status);\r\n if (params.format) queryParams.append(\"format\", params.format);\r\n if (params.page) queryParams.append(\"page\", params.page.toString());\r\n if (params.limit) queryParams.append(\"limit\", params.limit.toString());\r\n\r\n const url = `${this.baseUrl}/statements${queryParams.toString() ? `?${queryParams}` : \"\"}`;\r\n\r\n return handleApiRequest(\"GET\", url, {\r\n token,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Get finance summary (dashboard)\r\n * GET /finance/summary\r\n *\r\n * Query params:\r\n * - startDate, endDate (ISO datetime) - required\r\n * - branchId (optional)\r\n * - source = web|pos|api (optional)\r\n * - status (optional)\r\n *\r\n * Response:\r\n * - data.totals: overall income/expense/net/count\r\n * - data.byMethod: breakdown by payment method\r\n * - data.byDay: per-day breakdown by branch\r\n */\r\n async getSummary({\r\n token,\r\n params,\r\n options = {},\r\n }: {\r\n token: string;\r\n params: FinanceSummaryParams;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<FinanceSummary>> {\r\n if (!token) {\r\n throw new Error(\"Authentication required\");\r\n }\r\n\r\n const queryParams = new URLSearchParams();\r\n\r\n if (params.startDate) queryParams.append(\"startDate\", params.startDate);\r\n if (params.endDate) queryParams.append(\"endDate\", params.endDate);\r\n if (params.branchId) queryParams.append(\"branchId\", params.branchId);\r\n if (params.source) queryParams.append(\"source\", params.source);\r\n if (params.status) queryParams.append(\"status\", params.status);\r\n\r\n const url = `${this.baseUrl}/summary${queryParams.toString() ? `?${queryParams}` : \"\"}`;\r\n\r\n return handleApiRequest(\"GET\", url, {\r\n token,\r\n ...options,\r\n });\r\n }\r\n}\r\n\r\nexport const financeApi = new FinanceApi();\r\nexport { FinanceApi };\r\n","\"use client\";\r\n\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { financeApi } from \"../api\";\r\nimport type {\r\n FinanceStatement,\r\n FinanceStatementParams,\r\n FinanceSummary,\r\n FinanceSummaryParams,\r\n} from \"../types\";\r\nimport type { ApiResponse } from \"../../core/api-factory\";\r\n\r\n// ============================================\r\n// Query Keys\r\n// ============================================\r\n\r\nexport const FINANCE_KEYS = {\r\n all: [\"finance\"] as const,\r\n statements: () => [...FINANCE_KEYS.all, \"statements\"] as const,\r\n statementList: (params: FinanceStatementParams) =>\r\n [...FINANCE_KEYS.statements(), params] as const,\r\n summary: () => [...FINANCE_KEYS.all, \"summary\"] as const,\r\n summaryData: (params: FinanceSummaryParams) =>\r\n [...FINANCE_KEYS.summary(), params] as const,\r\n};\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\ninterface QueryOptions {\r\n enabled?: boolean;\r\n staleTime?: number;\r\n}\r\n\r\nexport interface UseFinanceStatementsReturn {\r\n statements: FinanceStatement[];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => void;\r\n}\r\n\r\nexport interface UseFinanceSummaryReturn {\r\n summary: FinanceSummary | null;\r\n totals: FinanceSummary[\"totals\"] | null;\r\n byMethod: FinanceSummary[\"byMethod\"];\r\n byDay: FinanceSummary[\"byDay\"];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => void;\r\n}\r\n\r\n// ============================================\r\n// Hooks\r\n// ============================================\r\n\r\n/**\r\n * Fetch finance statements for a date range\r\n *\r\n * @param token - Auth token (admin/finance roles)\r\n * @param params - Query parameters (startDate, endDate required)\r\n * @param options - Query options\r\n *\r\n * @example\r\n * ```tsx\r\n * function StatementTable() {\r\n * const { statements, isLoading } = useFinanceStatements(token, {\r\n * startDate: '2024-01-01T00:00:00Z',\r\n * endDate: '2024-01-31T23:59:59Z',\r\n * branchId: selectedBranch,\r\n * });\r\n *\r\n * return <DataTable data={statements} loading={isLoading} />;\r\n * }\r\n * ```\r\n */\r\nexport function useFinanceStatements(\r\n token: string,\r\n params: FinanceStatementParams,\r\n options: QueryOptions = {}\r\n): UseFinanceStatementsReturn {\r\n const { data, isLoading, isFetching, error, refetch } = useQuery<ApiResponse<FinanceStatement[]>>({\r\n queryKey: FINANCE_KEYS.statementList(params),\r\n queryFn: () => financeApi.getStatements({ token, params }),\r\n enabled: !!token && !!params.startDate && !!params.endDate && options.enabled !== false,\r\n staleTime: options.staleTime ?? 2 * 60 * 1000, // 2 minutes\r\n });\r\n\r\n return {\r\n statements: data?.data || [],\r\n isLoading,\r\n isFetching,\r\n error: error as Error | null,\r\n refetch,\r\n };\r\n}\r\n\r\n/**\r\n * Fetch finance summary with breakdowns\r\n *\r\n * @param token - Auth token (admin/finance roles)\r\n * @param params - Query parameters (startDate, endDate required)\r\n * @param options - Query options\r\n *\r\n * @example\r\n * ```tsx\r\n * function FinanceDashboard() {\r\n * const { totals, byMethod, byDay, isLoading } = useFinanceSummary(token, {\r\n * startDate: '2024-01-01T00:00:00Z',\r\n * endDate: '2024-01-31T23:59:59Z',\r\n * });\r\n *\r\n * return (\r\n * <>\r\n * <SummaryCards totals={totals} />\r\n * <MethodBreakdown data={byMethod} />\r\n * <DailyChart data={byDay} />\r\n * </>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useFinanceSummary(\r\n token: string,\r\n params: FinanceSummaryParams,\r\n options: QueryOptions = {}\r\n): UseFinanceSummaryReturn {\r\n const { data, isLoading, isFetching, error, refetch } = useQuery<ApiResponse<FinanceSummary>>({\r\n queryKey: FINANCE_KEYS.summaryData(params),\r\n queryFn: () => financeApi.getSummary({ token, params }),\r\n enabled: !!token && !!params.startDate && !!params.endDate && options.enabled !== false,\r\n staleTime: options.staleTime ?? 2 * 60 * 1000, // 2 minutes\r\n });\r\n\r\n return {\r\n summary: data?.data || null,\r\n totals: data?.data?.totals || null,\r\n byMethod: data?.data?.byMethod || [],\r\n byDay: data?.data?.byDay || [],\r\n isLoading,\r\n isFetching,\r\n error: error as Error | null,\r\n refetch,\r\n };\r\n}\r\n"]}
@@ -0,0 +1,27 @@
1
+ import { analyticsApi } from './chunk-4ZQK3FFN.js';
2
+ import { useQuery } from '@tanstack/react-query';
3
+
4
+ var ANALYTICS_KEYS = {
5
+ all: ["analytics"],
6
+ dashboard: (period) => ["analytics", "dashboard", period]
7
+ };
8
+ function useAnalyticsDashboard(token, params = {}, options = {}) {
9
+ const period = params.period || "30d";
10
+ return useQuery({
11
+ queryKey: ANALYTICS_KEYS.dashboard(period),
12
+ queryFn: () => analyticsApi.getDashboard({ token, params }),
13
+ enabled: !!token && options.enabled !== false,
14
+ staleTime: 2 * 60 * 1e3,
15
+ // 2 minutes (analytics data updates frequently)
16
+ gcTime: 10 * 60 * 1e3,
17
+ // 10 minutes
18
+ refetchOnWindowFocus: true,
19
+ // Refresh analytics on window focus
20
+ retry: 1,
21
+ select: (data) => data?.data
22
+ });
23
+ }
24
+
25
+ export { ANALYTICS_KEYS, useAnalyticsDashboard };
26
+ //# sourceMappingURL=chunk-EPQN7ZKZ.js.map
27
+ //# sourceMappingURL=chunk-EPQN7ZKZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/analytics/hooks/analytics.ts"],"names":[],"mappings":";;;AAWO,IAAM,cAAA,GAAiB;AAAA,EAC5B,GAAA,EAAK,CAAC,WAAW,CAAA;AAAA,EACjB,WAAW,CAAC,MAAA,KAAoB,CAAC,WAAA,EAAa,aAAa,MAAM;AACnE;AAeO,SAAS,sBACd,KAAA,EACA,MAAA,GAAmC,EAAC,EACpC,OAAA,GAAiC,EAAC,EAClC;AACA,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,KAAA;AAEhC,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,cAAA,CAAe,SAAA,CAAU,MAAM,CAAA;AAAA,IACzC,SAAS,MAAM,YAAA,CAAa,aAAa,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC1D,OAAA,EAAS,CAAC,CAAC,KAAA,IAAS,QAAQ,OAAA,KAAY,KAAA;AAAA,IACxC,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,IACpB,MAAA,EAAQ,KAAK,EAAA,GAAK,GAAA;AAAA;AAAA,IAClB,oBAAA,EAAsB,IAAA;AAAA;AAAA,IACtB,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAC,IAAA,KAAS,IAAA,EAAM;AAAA,GACzB,CAAA;AACH","file":"chunk-EPQN7ZKZ.js","sourcesContent":["/**\r\n * Analytics Hooks\r\n *\r\n * React Query hooks for analytics data\r\n */\r\n\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { analyticsApi } from \"../api\";\r\nimport type { AnalyticsDashboard, AnalyticsDashboardParams } from \"../types\";\r\n\r\n// Query keys for analytics\r\nexport const ANALYTICS_KEYS = {\r\n all: [\"analytics\"] as const,\r\n dashboard: (period?: string) => [\"analytics\", \"dashboard\", period] as const,\r\n};\r\n\r\n/**\r\n * Hook to fetch dashboard analytics data\r\n *\r\n * @param token - Auth token (required)\r\n * @param params.period - Time period: '7d' | '30d' | '90d' | '1y' (default: '30d')\r\n * @param params.branchId - Optional branch filter\r\n * @param options.enabled - Enable/disable query (default: true)\r\n *\r\n * @example\r\n * ```tsx\r\n * const { data, isLoading } = useAnalyticsDashboard(token, { period: '30d' });\r\n * ```\r\n */\r\nexport function useAnalyticsDashboard(\r\n token: string,\r\n params: AnalyticsDashboardParams = {},\r\n options: { enabled?: boolean } = {}\r\n) {\r\n const period = params.period || \"30d\";\r\n\r\n return useQuery({\r\n queryKey: ANALYTICS_KEYS.dashboard(period),\r\n queryFn: () => analyticsApi.getDashboard({ token, params }),\r\n enabled: !!token && options.enabled !== false,\r\n staleTime: 2 * 60 * 1000, // 2 minutes (analytics data updates frequently)\r\n gcTime: 10 * 60 * 1000, // 10 minutes\r\n refetchOnWindowFocus: true, // Refresh analytics on window focus\r\n retry: 1,\r\n select: (data) => data?.data as AnalyticsDashboard,\r\n });\r\n}\r\n"]}
@@ -0,0 +1,177 @@
1
+ import { BaseApi } from './chunk-I5TIKUIQ.js';
2
+ import { handleApiRequest } from './chunk-VR36QVX2.js';
3
+
4
+ // src/inventory/api/transfer.ts
5
+ var TransferApi = class extends BaseApi {
6
+ constructor(config = {}) {
7
+ super("inventory/transfers", config);
8
+ }
9
+ /**
10
+ * List transfers with filtering
11
+ * GET /inventory/transfers
12
+ */
13
+ async list({
14
+ token,
15
+ params = {},
16
+ options = {}
17
+ }) {
18
+ const processedParams = this.prepareParams(params);
19
+ const queryString = this.createQueryString(processedParams);
20
+ return handleApiRequest("GET", `${this.baseUrl}?${queryString}`, {
21
+ token,
22
+ cache: this.config.cache,
23
+ ...options
24
+ });
25
+ }
26
+ /**
27
+ * Get transfer by ID or challan number
28
+ * GET /inventory/transfers/:id
29
+ */
30
+ async getById({
31
+ token,
32
+ id,
33
+ options = {}
34
+ }) {
35
+ if (!id) {
36
+ throw new Error("Transfer ID or challan number is required");
37
+ }
38
+ return handleApiRequest("GET", `${this.baseUrl}/${id}`, {
39
+ token,
40
+ cache: this.config.cache,
41
+ ...options
42
+ });
43
+ }
44
+ /**
45
+ * Create a new transfer (draft)
46
+ * POST /inventory/transfers
47
+ */
48
+ async create({
49
+ token,
50
+ data,
51
+ options = {}
52
+ }) {
53
+ return handleApiRequest("POST", this.baseUrl, {
54
+ token,
55
+ body: data,
56
+ cache: this.config.cache,
57
+ ...options
58
+ });
59
+ }
60
+ /**
61
+ * Update a draft transfer
62
+ * PATCH /inventory/transfers/:id
63
+ */
64
+ async update({
65
+ token,
66
+ id,
67
+ data,
68
+ options = {}
69
+ }) {
70
+ if (!id) {
71
+ throw new Error("Transfer ID is required");
72
+ }
73
+ return handleApiRequest("PATCH", `${this.baseUrl}/${id}`, {
74
+ token,
75
+ body: data,
76
+ cache: this.config.cache,
77
+ ...options
78
+ });
79
+ }
80
+ /**
81
+ * Get transfer statistics
82
+ * GET /inventory/transfers/stats
83
+ */
84
+ async stats({
85
+ token,
86
+ params = {},
87
+ options = {}
88
+ }) {
89
+ const queryString = this.createQueryString(params);
90
+ const url = queryString ? `${this.baseUrl}/stats?${queryString}` : `${this.baseUrl}/stats`;
91
+ return handleApiRequest("GET", url, {
92
+ token,
93
+ cache: this.config.cache,
94
+ ...options
95
+ });
96
+ }
97
+ // ==================== Transfer Actions (Stripe Pattern) ====================
98
+ /**
99
+ * Generic action endpoint
100
+ * POST /inventory/transfers/:id/action
101
+ */
102
+ async action({
103
+ token,
104
+ id,
105
+ action,
106
+ data = {},
107
+ options = {}
108
+ }) {
109
+ if (!id) {
110
+ throw new Error("Transfer ID is required");
111
+ }
112
+ return handleApiRequest("POST", `${this.baseUrl}/${id}/action`, {
113
+ token,
114
+ body: { action, ...data },
115
+ cache: this.config.cache,
116
+ ...options
117
+ });
118
+ }
119
+ /**
120
+ * Approve a transfer (validates stock availability)
121
+ */
122
+ async approve({
123
+ token,
124
+ id,
125
+ options = {}
126
+ }) {
127
+ return this.action({ token, id, action: "approve", options });
128
+ }
129
+ /**
130
+ * Dispatch a transfer (decrements sender stock)
131
+ */
132
+ async dispatch({
133
+ token,
134
+ id,
135
+ data,
136
+ options = {}
137
+ }) {
138
+ return this.action({ token, id, action: "dispatch", data, options });
139
+ }
140
+ /**
141
+ * Mark transfer as in-transit
142
+ */
143
+ async markInTransit({
144
+ token,
145
+ id,
146
+ options = {}
147
+ }) {
148
+ return this.action({ token, id, action: "in-transit", options });
149
+ }
150
+ /**
151
+ * Receive a transfer (increments receiver stock)
152
+ */
153
+ async receive({
154
+ token,
155
+ id,
156
+ data,
157
+ options = {}
158
+ }) {
159
+ return this.action({ token, id, action: "receive", data, options });
160
+ }
161
+ /**
162
+ * Cancel a transfer
163
+ */
164
+ async cancel({
165
+ token,
166
+ id,
167
+ reason,
168
+ options = {}
169
+ }) {
170
+ return this.action({ token, id, action: "cancel", data: { reason }, options });
171
+ }
172
+ };
173
+ var transferApi = new TransferApi();
174
+
175
+ export { TransferApi, transferApi };
176
+ //# sourceMappingURL=chunk-FA7QFJ2G.js.map
177
+ //# sourceMappingURL=chunk-FA7QFJ2G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/inventory/api/transfer.ts"],"names":[],"mappings":"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","file":"chunk-FA7QFJ2G.js","sourcesContent":["/**\r\n * Transfer API - Inter-branch Stock Movement\r\n *\r\n * Handles challan/transfer documents following the Stripe action-based pattern.\r\n * Status flow: draft -> approved -> dispatched -> in_transit -> received\r\n */\r\n\r\nimport { BaseApi, type ApiResponse, type PaginatedResponse, type RequestOptions } from \"../../core/api-factory\";\r\nimport { handleApiRequest } from \"../../core/api-handler\";\r\nimport type {\r\n Transfer,\r\n CreateTransferPayload,\r\n UpdateTransferPayload,\r\n DispatchTransferPayload,\r\n ReceiveTransferPayload,\r\n TransferStats,\r\n} from \"../types\";\r\n\r\ntype FetchOptions = Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n\r\nclass TransferApi extends BaseApi<Transfer, CreateTransferPayload, UpdateTransferPayload> {\r\n constructor(config = {}) {\r\n super(\"inventory/transfers\", config);\r\n }\r\n\r\n /**\r\n * List transfers with filtering\r\n * GET /inventory/transfers\r\n */\r\n async list({\r\n token,\r\n params = {},\r\n options = {},\r\n }: {\r\n token: string;\r\n params?: Record<string, unknown>;\r\n options?: FetchOptions;\r\n }): Promise<PaginatedResponse<Transfer>> {\r\n const processedParams = this.prepareParams(params);\r\n const queryString = this.createQueryString(processedParams);\r\n\r\n return handleApiRequest(\"GET\", `${this.baseUrl}?${queryString}`, {\r\n token,\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Get transfer by ID or challan number\r\n * GET /inventory/transfers/:id\r\n */\r\n async getById({\r\n token,\r\n id,\r\n options = {},\r\n }: {\r\n token: string;\r\n id: string;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<Transfer>> {\r\n if (!id) {\r\n throw new Error(\"Transfer ID or challan number is required\");\r\n }\r\n\r\n return handleApiRequest(\"GET\", `${this.baseUrl}/${id}`, {\r\n token,\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Create a new transfer (draft)\r\n * POST /inventory/transfers\r\n */\r\n async create({\r\n token,\r\n data,\r\n options = {},\r\n }: {\r\n token: string;\r\n data: CreateTransferPayload;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<Transfer>> {\r\n return handleApiRequest(\"POST\", this.baseUrl, {\r\n token,\r\n body: data,\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Update a draft transfer\r\n * PATCH /inventory/transfers/:id\r\n */\r\n async update({\r\n token,\r\n id,\r\n data,\r\n options = {},\r\n }: {\r\n token: string;\r\n id: string;\r\n data: UpdateTransferPayload;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<Transfer>> {\r\n if (!id) {\r\n throw new Error(\"Transfer ID is required\");\r\n }\r\n\r\n return handleApiRequest(\"PATCH\", `${this.baseUrl}/${id}`, {\r\n token,\r\n body: data,\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Get transfer statistics\r\n * GET /inventory/transfers/stats\r\n */\r\n async stats({\r\n token,\r\n params = {},\r\n options = {},\r\n }: {\r\n token: string;\r\n params?: { branchId?: string };\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<TransferStats>> {\r\n const queryString = this.createQueryString(params);\r\n const url = queryString ? `${this.baseUrl}/stats?${queryString}` : `${this.baseUrl}/stats`;\r\n\r\n return handleApiRequest(\"GET\", url, {\r\n token,\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n\r\n // ==================== Transfer Actions (Stripe Pattern) ====================\r\n\r\n /**\r\n * Generic action endpoint\r\n * POST /inventory/transfers/:id/action\r\n */\r\n async action({\r\n token,\r\n id,\r\n action,\r\n data = {},\r\n options = {},\r\n }: {\r\n token: string;\r\n id: string;\r\n action: \"approve\" | \"dispatch\" | \"in-transit\" | \"receive\" | \"cancel\";\r\n data?: Record<string, unknown>;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<Transfer>> {\r\n if (!id) {\r\n throw new Error(\"Transfer ID is required\");\r\n }\r\n\r\n return handleApiRequest(\"POST\", `${this.baseUrl}/${id}/action`, {\r\n token,\r\n body: { action, ...data },\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Approve a transfer (validates stock availability)\r\n */\r\n async approve({\r\n token,\r\n id,\r\n options = {},\r\n }: {\r\n token: string;\r\n id: string;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<Transfer>> {\r\n return this.action({ token, id, action: \"approve\", options });\r\n }\r\n\r\n /**\r\n * Dispatch a transfer (decrements sender stock)\r\n */\r\n async dispatch({\r\n token,\r\n id,\r\n data,\r\n options = {},\r\n }: {\r\n token: string;\r\n id: string;\r\n data?: DispatchTransferPayload;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<Transfer>> {\r\n return this.action({ token, id, action: \"dispatch\", data: data as Record<string, unknown>, options });\r\n }\r\n\r\n /**\r\n * Mark transfer as in-transit\r\n */\r\n async markInTransit({\r\n token,\r\n id,\r\n options = {},\r\n }: {\r\n token: string;\r\n id: string;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<Transfer>> {\r\n return this.action({ token, id, action: \"in-transit\", options });\r\n }\r\n\r\n /**\r\n * Receive a transfer (increments receiver stock)\r\n */\r\n async receive({\r\n token,\r\n id,\r\n data,\r\n options = {},\r\n }: {\r\n token: string;\r\n id: string;\r\n data?: ReceiveTransferPayload;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<Transfer>> {\r\n return this.action({ token, id, action: \"receive\", data: data as Record<string, unknown>, options });\r\n }\r\n\r\n /**\r\n * Cancel a transfer\r\n */\r\n async cancel({\r\n token,\r\n id,\r\n reason,\r\n options = {},\r\n }: {\r\n token: string;\r\n id: string;\r\n reason?: string;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<Transfer>> {\r\n return this.action({ token, id, action: \"cancel\", data: { reason }, options });\r\n }\r\n}\r\n\r\nexport const transferApi = new TransferApi();\r\nexport { TransferApi };\r\n"]}
@@ -0,0 +1,261 @@
1
+ import { createQueryString, handleApiRequest } from './chunk-VR36QVX2.js';
2
+
3
+ // src/core/api-factory.ts
4
+ var BaseApi = class {
5
+ constructor(entity, config = {}) {
6
+ this.entity = entity;
7
+ this.config = {
8
+ basePath: config.basePath ?? "/api/v1",
9
+ defaultParams: {
10
+ limit: 10,
11
+ page: 1,
12
+ ...config.defaultParams || {}
13
+ },
14
+ cache: config.cache ?? "no-store",
15
+ headers: {
16
+ "Content-Type": "application/json",
17
+ ...config.headers || {}
18
+ }
19
+ };
20
+ this.baseUrl = `${this.config.basePath}/${this.entity}`;
21
+ }
22
+ /**
23
+ * Creates query string from parameters
24
+ * Delegates to shared utility from api-handler.ts
25
+ */
26
+ createQueryString(params = {}) {
27
+ return createQueryString(params);
28
+ }
29
+ /**
30
+ * Prepares parameters for API request
31
+ * Handles pagination, sorting, and filters
32
+ * Note: Critical security filters (organizationId, ownerId) are ALWAYS sent, even if null
33
+ */
34
+ prepareParams(params = {}) {
35
+ const result = {};
36
+ const CRITICAL_FILTERS = ["organizationId", "ownerId"];
37
+ Object.entries(params).forEach(([key, value]) => {
38
+ if (CRITICAL_FILTERS.includes(key)) {
39
+ result[key] = value || null;
40
+ return;
41
+ }
42
+ if (value !== void 0 && value !== "") {
43
+ if (["page", "limit"].includes(key)) {
44
+ result[key] = parseInt(String(value)) || (key === "page" ? 1 : 10);
45
+ } else if (Array.isArray(value)) {
46
+ if (value.length > 1) {
47
+ result[`${key}[in]`] = value.join(",");
48
+ } else if (value.length === 1) {
49
+ result[key] = value[0];
50
+ }
51
+ } else {
52
+ result[key] = value;
53
+ }
54
+ }
55
+ });
56
+ return result;
57
+ }
58
+ /**
59
+ * Get all records with pagination and filtering
60
+ * Returns offset or keyset pagination based on params
61
+ */
62
+ async getAll({
63
+ token = null,
64
+ organizationId = null,
65
+ params = {},
66
+ options = {}
67
+ } = {}) {
68
+ const processedParams = this.prepareParams(params);
69
+ const queryString = this.createQueryString(processedParams);
70
+ const requestOptions = {
71
+ cache: this.config.cache,
72
+ ...options
73
+ };
74
+ if (token) requestOptions.token = token;
75
+ if (organizationId) requestOptions.organizationId = organizationId;
76
+ return handleApiRequest(
77
+ "GET",
78
+ `${this.baseUrl}?${queryString}`,
79
+ requestOptions
80
+ );
81
+ }
82
+ /**
83
+ * Get a single record by ID
84
+ */
85
+ async getById({
86
+ token = null,
87
+ organizationId = null,
88
+ id,
89
+ params = {},
90
+ options = {}
91
+ }) {
92
+ if (!id) throw new Error("ID is required");
93
+ const queryString = this.createQueryString(params);
94
+ const url = queryString ? `${this.baseUrl}/${id}?${queryString}` : `${this.baseUrl}/${id}`;
95
+ const requestOptions = {
96
+ cache: this.config.cache,
97
+ ...options
98
+ };
99
+ if (token) requestOptions.token = token;
100
+ if (organizationId) requestOptions.organizationId = organizationId;
101
+ return handleApiRequest("GET", url, requestOptions);
102
+ }
103
+ /**
104
+ * Create a new record
105
+ */
106
+ async create({
107
+ token,
108
+ organizationId = null,
109
+ data,
110
+ options = {}
111
+ }) {
112
+ return handleApiRequest("POST", this.baseUrl, {
113
+ token,
114
+ organizationId,
115
+ body: data,
116
+ ...options
117
+ });
118
+ }
119
+ /**
120
+ * Update an existing record
121
+ */
122
+ async update({
123
+ token,
124
+ organizationId = null,
125
+ id,
126
+ data,
127
+ options = {}
128
+ }) {
129
+ if (!id) throw new Error("ID is required");
130
+ return handleApiRequest("PATCH", `${this.baseUrl}/${id}`, {
131
+ token,
132
+ organizationId,
133
+ body: data,
134
+ ...options
135
+ });
136
+ }
137
+ /**
138
+ * Delete a record
139
+ */
140
+ async delete({
141
+ token,
142
+ organizationId = null,
143
+ id,
144
+ options = {}
145
+ }) {
146
+ if (!id) throw new Error("ID is required");
147
+ return handleApiRequest("DELETE", `${this.baseUrl}/${id}`, {
148
+ token,
149
+ organizationId,
150
+ ...options
151
+ });
152
+ }
153
+ /**
154
+ * Search with custom parameters
155
+ * @example
156
+ * search({ searchParams: { 'brand[contains]': 'nike' } })
157
+ * search({ searchParams: { upc: '123456789' } })
158
+ */
159
+ async search({
160
+ token = null,
161
+ organizationId = null,
162
+ searchParams = {},
163
+ params = {},
164
+ options = {}
165
+ } = {}) {
166
+ const queryParams = { ...params, ...searchParams };
167
+ const processedParams = this.prepareParams(queryParams);
168
+ const queryString = this.createQueryString(processedParams);
169
+ const requestOptions = {
170
+ cache: this.config.cache,
171
+ ...options
172
+ };
173
+ if (token) requestOptions.token = token;
174
+ if (organizationId) requestOptions.organizationId = organizationId;
175
+ return handleApiRequest(
176
+ "GET",
177
+ `${this.baseUrl}?${queryString}`,
178
+ requestOptions
179
+ );
180
+ }
181
+ /**
182
+ * Find records by field with optional operator
183
+ * @example
184
+ * findBy({ field: 'brand', value: 'nike', operator: 'contains' })
185
+ * findBy({ field: 'status', value: ['active', 'pending'], operator: 'in' })
186
+ */
187
+ async findBy({
188
+ token = null,
189
+ organizationId = null,
190
+ field,
191
+ value,
192
+ operator,
193
+ params = {},
194
+ options = {}
195
+ }) {
196
+ if (!field || value === void 0) {
197
+ throw new Error("Field and value are required");
198
+ }
199
+ const queryParams = { ...params };
200
+ if (operator) {
201
+ queryParams[`${field}[${operator}]`] = Array.isArray(value) ? value.join(",") : value;
202
+ } else {
203
+ queryParams[field] = value;
204
+ }
205
+ const processedParams = this.prepareParams(queryParams);
206
+ const queryString = this.createQueryString(processedParams);
207
+ const requestOptions = {
208
+ cache: this.config.cache,
209
+ ...options
210
+ };
211
+ if (token) requestOptions.token = token;
212
+ if (organizationId) requestOptions.organizationId = organizationId;
213
+ return handleApiRequest(
214
+ "GET",
215
+ `${this.baseUrl}?${queryString}`,
216
+ requestOptions
217
+ );
218
+ }
219
+ /**
220
+ * Make a custom API request to a sub-endpoint
221
+ * @example
222
+ * request('POST', `${this.baseUrl}/${id}/action`, { token, data: { ... } })
223
+ */
224
+ async request(method, endpoint, {
225
+ token,
226
+ organizationId = null,
227
+ data,
228
+ params,
229
+ options = {}
230
+ } = {}) {
231
+ let url = endpoint;
232
+ if (params) {
233
+ const processedParams = this.prepareParams(params);
234
+ const queryString = this.createQueryString(processedParams);
235
+ url = `${endpoint}?${queryString}`;
236
+ }
237
+ return handleApiRequest(method, url, {
238
+ token,
239
+ organizationId,
240
+ body: data,
241
+ cache: this.config.cache,
242
+ ...options
243
+ });
244
+ }
245
+ };
246
+ function createCrudApi(entity, config = {}) {
247
+ return new BaseApi(entity, config);
248
+ }
249
+ function isOffsetPagination(response) {
250
+ return response.method === "offset";
251
+ }
252
+ function isKeysetPagination(response) {
253
+ return response.method === "keyset";
254
+ }
255
+ function isAggregatePagination(response) {
256
+ return response.method === "aggregate";
257
+ }
258
+
259
+ export { BaseApi, createCrudApi, isAggregatePagination, isKeysetPagination, isOffsetPagination };
260
+ //# sourceMappingURL=chunk-I5TIKUIQ.js.map
261
+ //# sourceMappingURL=chunk-I5TIKUIQ.js.map