@rovela-ai/sdk 0.1.19 → 0.1.21

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.
Files changed (82) hide show
  1. package/dist/admin/components/AdminNav.d.ts +10 -3
  2. package/dist/admin/components/AdminNav.d.ts.map +1 -1
  3. package/dist/admin/components/AdminNav.js +80 -28
  4. package/dist/admin/components/AdminNav.js.map +1 -1
  5. package/dist/admin/components/CategoryForm.d.ts +30 -0
  6. package/dist/admin/components/CategoryForm.d.ts.map +1 -0
  7. package/dist/admin/components/CategoryForm.js +153 -0
  8. package/dist/admin/components/CategoryForm.js.map +1 -0
  9. package/dist/admin/components/CategorySelect.d.ts +32 -0
  10. package/dist/admin/components/CategorySelect.d.ts.map +1 -0
  11. package/dist/admin/components/CategorySelect.js +148 -0
  12. package/dist/admin/components/CategorySelect.js.map +1 -0
  13. package/dist/admin/components/LowStockAlert.d.ts +2 -2
  14. package/dist/admin/components/LowStockAlert.d.ts.map +1 -1
  15. package/dist/admin/components/LowStockAlert.js +16 -9
  16. package/dist/admin/components/LowStockAlert.js.map +1 -1
  17. package/dist/admin/components/OrderStatusChart.d.ts +21 -0
  18. package/dist/admin/components/OrderStatusChart.d.ts.map +1 -0
  19. package/dist/admin/components/OrderStatusChart.js +54 -0
  20. package/dist/admin/components/OrderStatusChart.js.map +1 -0
  21. package/dist/admin/components/ProductForm.d.ts +2 -2
  22. package/dist/admin/components/ProductForm.d.ts.map +1 -1
  23. package/dist/admin/components/ProductForm.js +125 -9
  24. package/dist/admin/components/ProductForm.js.map +1 -1
  25. package/dist/admin/components/RecentOrders.d.ts +1 -1
  26. package/dist/admin/components/RecentOrders.d.ts.map +1 -1
  27. package/dist/admin/components/RecentOrders.js +11 -10
  28. package/dist/admin/components/RecentOrders.js.map +1 -1
  29. package/dist/admin/components/RevenueChart.d.ts +23 -0
  30. package/dist/admin/components/RevenueChart.d.ts.map +1 -0
  31. package/dist/admin/components/RevenueChart.js +70 -0
  32. package/dist/admin/components/RevenueChart.js.map +1 -0
  33. package/dist/admin/components/SEOPreview.d.ts +32 -0
  34. package/dist/admin/components/SEOPreview.d.ts.map +1 -0
  35. package/dist/admin/components/SEOPreview.js +30 -0
  36. package/dist/admin/components/SEOPreview.js.map +1 -0
  37. package/dist/admin/components/StatsCards.d.ts +2 -2
  38. package/dist/admin/components/StatsCards.d.ts.map +1 -1
  39. package/dist/admin/components/StatsCards.js +18 -20
  40. package/dist/admin/components/StatsCards.js.map +1 -1
  41. package/dist/admin/components/TagInput.d.ts +29 -0
  42. package/dist/admin/components/TagInput.d.ts.map +1 -0
  43. package/dist/admin/components/TagInput.js +73 -0
  44. package/dist/admin/components/TagInput.js.map +1 -0
  45. package/dist/admin/components/VariantManager.d.ts +42 -0
  46. package/dist/admin/components/VariantManager.d.ts.map +1 -0
  47. package/dist/admin/components/VariantManager.js +175 -0
  48. package/dist/admin/components/VariantManager.js.map +1 -0
  49. package/dist/admin/components/index.d.ts +9 -0
  50. package/dist/admin/components/index.d.ts.map +1 -1
  51. package/dist/admin/components/index.js +13 -0
  52. package/dist/admin/components/index.js.map +1 -1
  53. package/dist/admin/hooks/index.d.ts +2 -0
  54. package/dist/admin/hooks/index.d.ts.map +1 -1
  55. package/dist/admin/hooks/index.js +1 -0
  56. package/dist/admin/hooks/index.js.map +1 -1
  57. package/dist/admin/hooks/useAdminCategories.d.ts +36 -0
  58. package/dist/admin/hooks/useAdminCategories.d.ts.map +1 -0
  59. package/dist/admin/hooks/useAdminCategories.js +217 -0
  60. package/dist/admin/hooks/useAdminCategories.js.map +1 -0
  61. package/dist/admin/index.d.ts +4 -3
  62. package/dist/admin/index.d.ts.map +1 -1
  63. package/dist/admin/index.js +6 -2
  64. package/dist/admin/index.js.map +1 -1
  65. package/dist/core/StoreSettingsProvider.d.ts +104 -0
  66. package/dist/core/StoreSettingsProvider.d.ts.map +1 -0
  67. package/dist/core/StoreSettingsProvider.js +195 -0
  68. package/dist/core/StoreSettingsProvider.js.map +1 -0
  69. package/dist/core/api/index.d.ts +7 -0
  70. package/dist/core/api/index.d.ts.map +1 -0
  71. package/dist/core/api/index.js +7 -0
  72. package/dist/core/api/index.js.map +1 -0
  73. package/dist/core/api/settings.d.ts +42 -0
  74. package/dist/core/api/settings.d.ts.map +1 -0
  75. package/dist/core/api/settings.js +74 -0
  76. package/dist/core/api/settings.js.map +1 -0
  77. package/dist/core/db/queries.d.ts +6 -6
  78. package/dist/core/index.d.ts +2 -0
  79. package/dist/core/index.d.ts.map +1 -1
  80. package/dist/core/index.js +2 -0
  81. package/dist/core/index.js.map +1 -1
  82. package/package.json +6 -1
@@ -0,0 +1,36 @@
1
+ import type { UseAdminCategoriesReturn, AdminCategoryListItem } from '../types';
2
+ export interface CategoryTreeItem extends AdminCategoryListItem {
3
+ children: CategoryTreeItem[];
4
+ }
5
+ /**
6
+ * Category management hook for admin panel.
7
+ *
8
+ * @returns Categories data and CRUD methods
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * function CategoriesPage() {
13
+ * const {
14
+ * categories,
15
+ * flatCategories,
16
+ * isLoading,
17
+ * error,
18
+ * fetchCategories,
19
+ * createCategory,
20
+ * updateCategory,
21
+ * deleteCategory,
22
+ * } = useAdminCategories()
23
+ *
24
+ * useEffect(() => {
25
+ * fetchCategories()
26
+ * }, [fetchCategories])
27
+ *
28
+ * return <CategoryTable categories={categories} />
29
+ * }
30
+ * ```
31
+ */
32
+ export declare function useAdminCategories(): UseAdminCategoriesReturn & {
33
+ flatCategories: AdminCategoryListItem[];
34
+ categoryTree: CategoryTreeItem[];
35
+ };
36
+ //# sourceMappingURL=useAdminCategories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAdminCategories.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminCategories.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAGV,wBAAwB,EACxB,qBAAqB,EACtB,MAAM,UAAU,CAAA;AAMjB,MAAM,WAAW,gBAAiB,SAAQ,qBAAqB;IAC7D,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,kBAAkB,IAAI,wBAAwB,GAAG;IAC/D,cAAc,EAAE,qBAAqB,EAAE,CAAA;IACvC,YAAY,EAAE,gBAAgB,EAAE,CAAA;CACjC,CA2MA"}
@@ -0,0 +1,217 @@
1
+ 'use client';
2
+ /**
3
+ * @rovela/sdk/admin/hooks/useAdminCategories
4
+ *
5
+ * Category management hook for admin panel.
6
+ */
7
+ import { useState, useCallback, useEffect } from 'react';
8
+ // =============================================================================
9
+ // Hook Implementation
10
+ // =============================================================================
11
+ /**
12
+ * Category management hook for admin panel.
13
+ *
14
+ * @returns Categories data and CRUD methods
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * function CategoriesPage() {
19
+ * const {
20
+ * categories,
21
+ * flatCategories,
22
+ * isLoading,
23
+ * error,
24
+ * fetchCategories,
25
+ * createCategory,
26
+ * updateCategory,
27
+ * deleteCategory,
28
+ * } = useAdminCategories()
29
+ *
30
+ * useEffect(() => {
31
+ * fetchCategories()
32
+ * }, [fetchCategories])
33
+ *
34
+ * return <CategoryTable categories={categories} />
35
+ * }
36
+ * ```
37
+ */
38
+ export function useAdminCategories() {
39
+ const [categories, setCategories] = useState([]);
40
+ const [categoryTree, setCategoryTree] = useState([]);
41
+ const [isLoading, setIsLoading] = useState(false);
42
+ const [error, setError] = useState(null);
43
+ /**
44
+ * Build tree structure from flat list
45
+ */
46
+ const buildTree = useCallback((flatList) => {
47
+ const map = new Map();
48
+ const roots = [];
49
+ // First pass: create nodes
50
+ for (const cat of flatList) {
51
+ map.set(cat.id, { ...cat, children: [] });
52
+ }
53
+ // Second pass: build tree
54
+ for (const cat of flatList) {
55
+ const node = map.get(cat.id);
56
+ if (cat.parentId && map.has(cat.parentId)) {
57
+ map.get(cat.parentId).children.push(node);
58
+ }
59
+ else {
60
+ roots.push(node);
61
+ }
62
+ }
63
+ // Sort by order
64
+ const sortByOrder = (a, b) => a.order - b.order;
65
+ roots.sort(sortByOrder);
66
+ for (const node of map.values()) {
67
+ node.children.sort(sortByOrder);
68
+ }
69
+ return roots;
70
+ }, []);
71
+ /**
72
+ * Fetch all categories.
73
+ */
74
+ const fetchCategories = useCallback(async () => {
75
+ setIsLoading(true);
76
+ setError(null);
77
+ try {
78
+ const response = await fetch('/api/admin/categories?flat=true');
79
+ if (!response.ok) {
80
+ const data = await response.json();
81
+ throw new Error(data.error || 'Failed to fetch categories');
82
+ }
83
+ const data = await response.json();
84
+ const flatList = (data.data || []);
85
+ setCategories(flatList);
86
+ setCategoryTree(buildTree(flatList));
87
+ }
88
+ catch (err) {
89
+ console.error('[useAdminCategories] Fetch error:', err);
90
+ setError(err instanceof Error ? err.message : 'Failed to fetch categories');
91
+ }
92
+ finally {
93
+ setIsLoading(false);
94
+ }
95
+ }, [buildTree]);
96
+ /**
97
+ * Get a single category by ID.
98
+ */
99
+ const getCategory = useCallback(async (id) => {
100
+ try {
101
+ const response = await fetch(`/api/admin/categories/${id}`);
102
+ if (!response.ok) {
103
+ const data = await response.json();
104
+ throw new Error(data.error || 'Failed to fetch category');
105
+ }
106
+ const data = await response.json();
107
+ return data.data;
108
+ }
109
+ catch (err) {
110
+ console.error('[useAdminCategories] Get category error:', err);
111
+ setError(err instanceof Error ? err.message : 'Failed to fetch category');
112
+ return null;
113
+ }
114
+ }, []);
115
+ /**
116
+ * Create a new category.
117
+ */
118
+ const createCategory = useCallback(async (data) => {
119
+ try {
120
+ const response = await fetch('/api/admin/categories', {
121
+ method: 'POST',
122
+ headers: { 'Content-Type': 'application/json' },
123
+ body: JSON.stringify(data),
124
+ });
125
+ const result = await response.json();
126
+ if (!response.ok) {
127
+ return {
128
+ success: false,
129
+ error: result.error || 'Failed to create category',
130
+ };
131
+ }
132
+ // Refresh categories list
133
+ await fetchCategories();
134
+ return {
135
+ success: true,
136
+ data: result.data,
137
+ };
138
+ }
139
+ catch (err) {
140
+ console.error('[useAdminCategories] Create error:', err);
141
+ return {
142
+ success: false,
143
+ error: err instanceof Error ? err.message : 'Failed to create category',
144
+ };
145
+ }
146
+ }, [fetchCategories]);
147
+ /**
148
+ * Update an existing category.
149
+ */
150
+ const updateCategory = useCallback(async (id, data) => {
151
+ try {
152
+ const response = await fetch(`/api/admin/categories/${id}`, {
153
+ method: 'PUT',
154
+ headers: { 'Content-Type': 'application/json' },
155
+ body: JSON.stringify(data),
156
+ });
157
+ const result = await response.json();
158
+ if (!response.ok) {
159
+ return {
160
+ success: false,
161
+ error: result.error || 'Failed to update category',
162
+ };
163
+ }
164
+ // Refresh categories list
165
+ await fetchCategories();
166
+ return {
167
+ success: true,
168
+ data: result.data,
169
+ };
170
+ }
171
+ catch (err) {
172
+ console.error('[useAdminCategories] Update error:', err);
173
+ return {
174
+ success: false,
175
+ error: err instanceof Error ? err.message : 'Failed to update category',
176
+ };
177
+ }
178
+ }, [fetchCategories]);
179
+ /**
180
+ * Delete a category.
181
+ */
182
+ const deleteCategory = useCallback(async (id) => {
183
+ try {
184
+ const response = await fetch(`/api/admin/categories/${id}`, {
185
+ method: 'DELETE',
186
+ });
187
+ if (!response.ok) {
188
+ const data = await response.json();
189
+ throw new Error(data.error || 'Failed to delete category');
190
+ }
191
+ // Refresh categories list
192
+ await fetchCategories();
193
+ return true;
194
+ }
195
+ catch (err) {
196
+ console.error('[useAdminCategories] Delete error:', err);
197
+ setError(err instanceof Error ? err.message : 'Failed to delete category');
198
+ return false;
199
+ }
200
+ }, [fetchCategories]);
201
+ // Load categories on mount
202
+ useEffect(() => {
203
+ fetchCategories();
204
+ }, [fetchCategories]);
205
+ return {
206
+ categories,
207
+ flatCategories: categories,
208
+ categoryTree,
209
+ isLoading,
210
+ error,
211
+ fetchCategories,
212
+ createCategory,
213
+ updateCategory,
214
+ deleteCategory,
215
+ };
216
+ }
217
+ //# sourceMappingURL=useAdminCategories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAdminCategories.js","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminCategories.ts"],"names":[],"mappings":"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"}
@@ -58,7 +58,8 @@ export type { OrderStatus, ProductStatus, AdminRole, Order, OrderItem, Product,
58
58
  export { createAdminAuthOptions, adminAuthConfig, adminAuthHandlers, createAdminNextAuthHandler, getAdminSession, } from './config';
59
59
  export { authenticateAdmin, createAdmin, updateAdminPassword, findAdminForSession, findAdminByEmail, findAdminById, updateAdmin, adminEmailExists, countAdmins, } from './server';
60
60
  export { createAdminAuthHandlers, getProducts, createProduct, getProduct, updateProduct, deleteProduct, addVariant, updateVariantHandler, deleteVariantHandler, getOrders, getOrder, updateOrder, processRefund, getStats, getCategories, createCategory, getCategory, updateCategory, deleteCategory, getCustomers, getCustomer, setupAdmin, checkAdminExists, } from './api';
61
- export { useAdminAuth, useAdminStats, useAdminProducts, useAdminOrders, } from './hooks';
62
- export { AdminGuard, AdminLoginForm, AdminSetupForm, AdminLayout, AdminNav, AdminHeader, StatsCards, RecentOrders, LowStockAlert, ProductTable, ProductForm, InventoryEditor, OrderTable, OrderDetails, RefundDialog, StoreSettings, } from './components';
63
- export type { AdminSetupFormProps } from './components';
61
+ export { useAdminAuth, useAdminStats, useAdminProducts, useAdminOrders, useAdminCategories, } from './hooks';
62
+ export type { CategoryTreeItem } from './hooks/useAdminCategories';
63
+ export { AdminGuard, AdminLoginForm, AdminSetupForm, AdminLayout, AdminNav, AdminHeader, StatsCards, RecentOrders, LowStockAlert, RevenueChart, OrderStatusChart, ProductTable, ProductForm, InventoryEditor, CategorySelect, CategoryForm, SEOPreview, TagInput, VariantManager, OrderTable, OrderDetails, RefundDialog, StoreSettings, } from './components';
64
+ export type { AdminSetupFormProps, RevenueChartProps, OrderStatusChartProps, } from './components';
64
65
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAMH,YAAY,EAEV,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,EACL,SAAS,EACT,OAAO,EACP,cAAc,EACd,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACR,OAAO,EAGP,aAAa,EAGb,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,YAAY,EACZ,iBAAiB,EAGjB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EAGrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAGlB,sBAAsB,EAGtB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,SAAS,CAAA;AAMhB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,UAAU,CAAA;AAMjB,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,GACZ,MAAM,UAAU,CAAA;AAOjB,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,aAAa,EACb,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,QAAQ,EACR,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,cAAc,EACd,WAAW,EACX,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EAEX,UAAU,EAEV,gBAAgB,GACjB,MAAM,OAAO,CAAA;AAMd,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,MAAM,SAAS,CAAA;AAMhB,OAAO,EAEL,UAAU,EACV,cAAc,EACd,cAAc,EAEd,WAAW,EACX,QAAQ,EACR,WAAW,EAEX,UAAU,EACV,YAAY,EACZ,aAAa,EAEb,YAAY,EACZ,WAAW,EACX,eAAe,EAEf,UAAU,EACV,YAAY,EACZ,YAAY,EAEZ,aAAa,GACd,MAAM,cAAc,CAAA;AAGrB,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAMH,YAAY,EAEV,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,EACL,SAAS,EACT,OAAO,EACP,cAAc,EACd,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACR,OAAO,EAGP,aAAa,EAGb,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,YAAY,EACZ,iBAAiB,EAGjB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EAGrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAGlB,sBAAsB,EAGtB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,SAAS,CAAA;AAMhB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,UAAU,CAAA;AAMjB,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,GACZ,MAAM,UAAU,CAAA;AAOjB,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,aAAa,EACb,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,QAAQ,EACR,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,cAAc,EACd,WAAW,EACX,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EAEX,UAAU,EAEV,gBAAgB,GACjB,MAAM,OAAO,CAAA;AAMd,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,SAAS,CAAA;AAEhB,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAMlE,OAAO,EAEL,UAAU,EACV,cAAc,EACd,cAAc,EAEd,WAAW,EACX,QAAQ,EACR,WAAW,EAEX,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB,EAEhB,YAAY,EACZ,WAAW,EACX,eAAe,EAEf,cAAc,EACd,YAAY,EAEZ,UAAU,EACV,QAAQ,EACR,cAAc,EAEd,UAAU,EACV,YAAY,EACZ,YAAY,EAEZ,aAAa,GACd,MAAM,cAAc,CAAA;AAGrB,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,cAAc,CAAA"}
@@ -74,7 +74,7 @@ checkAdminExists, } from './api';
74
74
  // =============================================================================
75
75
  // React Hooks
76
76
  // =============================================================================
77
- export { useAdminAuth, useAdminStats, useAdminProducts, useAdminOrders, } from './hooks';
77
+ export { useAdminAuth, useAdminStats, useAdminProducts, useAdminOrders, useAdminCategories, } from './hooks';
78
78
  // =============================================================================
79
79
  // React Components
80
80
  // =============================================================================
@@ -84,9 +84,13 @@ AdminGuard, AdminLoginForm, AdminSetupForm,
84
84
  // Layout
85
85
  AdminLayout, AdminNav, AdminHeader,
86
86
  // Dashboard
87
- StatsCards, RecentOrders, LowStockAlert,
87
+ StatsCards, RecentOrders, LowStockAlert, RevenueChart, OrderStatusChart,
88
88
  // Products
89
89
  ProductTable, ProductForm, InventoryEditor,
90
+ // Categories
91
+ CategorySelect, CategoryForm,
92
+ // Utility (used by ProductForm)
93
+ SEOPreview, TagInput, VariantManager,
90
94
  // Orders
91
95
  OrderTable, OrderDetails, RefundDialog,
92
96
  // Settings
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAqFH,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,UAAU,CAAA;AAEjB,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,GACZ,MAAM,UAAU,CAAA;AAEjB,gFAAgF;AAChF,mDAAmD;AACnD,0EAA0E;AAC1E,gFAAgF;AAEhF,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,aAAa,EACb,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,QAAQ,EACR,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,cAAc,EACd,WAAW,EACX,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW;AACX,oCAAoC;AACpC,UAAU;AACV,gCAAgC;AAChC,gBAAgB,GACjB,MAAM,OAAO,CAAA;AAEd,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,MAAM,SAAS,CAAA;AAEhB,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF,OAAO;AACL,OAAO;AACP,UAAU,EACV,cAAc,EACd,cAAc;AACd,SAAS;AACT,WAAW,EACX,QAAQ,EACR,WAAW;AACX,YAAY;AACZ,UAAU,EACV,YAAY,EACZ,aAAa;AACb,WAAW;AACX,YAAY,EACZ,WAAW,EACX,eAAe;AACf,SAAS;AACT,UAAU,EACV,YAAY,EACZ,YAAY;AACZ,WAAW;AACX,aAAa,GACd,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAqFH,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,UAAU,CAAA;AAEjB,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,GACZ,MAAM,UAAU,CAAA;AAEjB,gFAAgF;AAChF,mDAAmD;AACnD,0EAA0E;AAC1E,gFAAgF;AAEhF,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,aAAa,EACb,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,QAAQ,EACR,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,cAAc,EACd,WAAW,EACX,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW;AACX,oCAAoC;AACpC,UAAU;AACV,gCAAgC;AAChC,gBAAgB,GACjB,MAAM,OAAO,CAAA;AAEd,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,SAAS,CAAA;AAIhB,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF,OAAO;AACL,OAAO;AACP,UAAU,EACV,cAAc,EACd,cAAc;AACd,SAAS;AACT,WAAW,EACX,QAAQ,EACR,WAAW;AACX,YAAY;AACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB;AAChB,WAAW;AACX,YAAY,EACZ,WAAW,EACX,eAAe;AACf,aAAa;AACb,cAAc,EACd,YAAY;AACZ,gCAAgC;AAChC,UAAU,EACV,QAAQ,EACR,cAAc;AACd,SAAS;AACT,UAAU,EACV,YAAY,EACZ,YAAY;AACZ,WAAW;AACX,aAAa,GACd,MAAM,cAAc,CAAA"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @rovela/sdk/core/StoreSettingsProvider
3
+ *
4
+ * React context provider for dynamic store settings.
5
+ * Fetches settings from the database and provides them to all components.
6
+ *
7
+ * Usage:
8
+ * ```tsx
9
+ * // app/layout.tsx
10
+ * import { StoreSettingsProvider } from '@rovela-ai/sdk/core'
11
+ *
12
+ * export default function RootLayout({ children }) {
13
+ * return (
14
+ * <html>
15
+ * <body>
16
+ * <StoreSettingsProvider>
17
+ * {children}
18
+ * </StoreSettingsProvider>
19
+ * </body>
20
+ * </html>
21
+ * )
22
+ * }
23
+ *
24
+ * // In any component
25
+ * import { useStoreSettings } from '@rovela-ai/sdk/core'
26
+ *
27
+ * function MyComponent() {
28
+ * const { storeName, currency, formatPrice, isLoading } = useStoreSettings()
29
+ * return <h1>{storeName}</h1>
30
+ * }
31
+ * ```
32
+ */
33
+ import { type ReactNode } from 'react';
34
+ export interface StoreSettings {
35
+ storeName: string;
36
+ storeEmail: string;
37
+ storeCurrency: string;
38
+ storeTimezone: string;
39
+ taxEnabled: boolean;
40
+ taxRate: number;
41
+ shippingEnabled: boolean;
42
+ freeShippingThreshold: number;
43
+ }
44
+ export interface StoreSettingsContextValue {
45
+ /** Store display name */
46
+ storeName: string;
47
+ /** Store currency code (USD, EUR, etc.) */
48
+ currency: string;
49
+ /** Store locale for formatting */
50
+ locale: string;
51
+ /** Support email */
52
+ supportEmail: string;
53
+ /** Whether settings are still loading */
54
+ isLoading: boolean;
55
+ /** Error message if fetch failed */
56
+ error: string | null;
57
+ /** Full settings object */
58
+ settings: StoreSettings | null;
59
+ /** Format a price with the store's currency */
60
+ formatPrice: (price: number | string) => string;
61
+ /** Format a date with the store's timezone and locale */
62
+ formatDate: (date: Date | string, options?: Intl.DateTimeFormatOptions) => string;
63
+ /** Refetch settings from server */
64
+ refetch: () => Promise<void>;
65
+ }
66
+ export interface StoreSettingsProviderProps {
67
+ children: ReactNode;
68
+ /** Initial settings for SSR (optional) */
69
+ initialSettings?: Partial<StoreSettings>;
70
+ /** Fallback values when settings not available */
71
+ fallback?: {
72
+ storeName?: string;
73
+ currency?: string;
74
+ locale?: string;
75
+ supportEmail?: string;
76
+ };
77
+ }
78
+ export declare function StoreSettingsProvider({ children, initialSettings, fallback, }: StoreSettingsProviderProps): import("react/jsx-runtime").JSX.Element;
79
+ /**
80
+ * Hook to access store settings from context.
81
+ *
82
+ * @throws Error if used outside of StoreSettingsProvider
83
+ *
84
+ * @example
85
+ * ```tsx
86
+ * function PriceDisplay({ price }: { price: number }) {
87
+ * const { formatPrice } = useStoreSettings()
88
+ * return <span>{formatPrice(price)}</span>
89
+ * }
90
+ *
91
+ * function Header() {
92
+ * const { storeName, isLoading } = useStoreSettings()
93
+ * if (isLoading) return <Skeleton />
94
+ * return <h1>{storeName}</h1>
95
+ * }
96
+ * ```
97
+ */
98
+ export declare function useStoreSettings(): StoreSettingsContextValue;
99
+ /**
100
+ * Optional hook that returns null instead of throwing if used outside provider.
101
+ * Useful for components that can work with or without settings.
102
+ */
103
+ export declare function useStoreSettingsOptional(): StoreSettingsContextValue | null;
104
+ //# sourceMappingURL=StoreSettingsProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoreSettingsProvider.d.ts","sourceRoot":"","sources":["../../src/core/StoreSettingsProvider.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAMd,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,OAAO,CAAA;IACxB,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAA;IAClB,oCAAoC;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,2BAA2B;IAC3B,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAA;IAC9B,+CAA+C;IAC/C,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAA;IAC/C,yDAAyD;IACzD,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,qBAAqB,KAAK,MAAM,CAAA;IACjF,mCAAmC;IACnC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,SAAS,CAAA;IACnB,0CAA0C;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IACxC,kDAAkD;IAClD,QAAQ,CAAC,EAAE;QACT,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,CAAA;CACF;AAuCD,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,eAAe,EACf,QAAQ,GACT,EAAE,0BAA0B,2CAwH5B;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,IAAI,yBAAyB,CAW5D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,yBAAyB,GAAG,IAAI,CAE3E"}
@@ -0,0 +1,195 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ /**
4
+ * @rovela/sdk/core/StoreSettingsProvider
5
+ *
6
+ * React context provider for dynamic store settings.
7
+ * Fetches settings from the database and provides them to all components.
8
+ *
9
+ * Usage:
10
+ * ```tsx
11
+ * // app/layout.tsx
12
+ * import { StoreSettingsProvider } from '@rovela-ai/sdk/core'
13
+ *
14
+ * export default function RootLayout({ children }) {
15
+ * return (
16
+ * <html>
17
+ * <body>
18
+ * <StoreSettingsProvider>
19
+ * {children}
20
+ * </StoreSettingsProvider>
21
+ * </body>
22
+ * </html>
23
+ * )
24
+ * }
25
+ *
26
+ * // In any component
27
+ * import { useStoreSettings } from '@rovela-ai/sdk/core'
28
+ *
29
+ * function MyComponent() {
30
+ * const { storeName, currency, formatPrice, isLoading } = useStoreSettings()
31
+ * return <h1>{storeName}</h1>
32
+ * }
33
+ * ```
34
+ */
35
+ import { createContext, useContext, useState, useEffect, useCallback, useMemo, } from 'react';
36
+ // =============================================================================
37
+ // Defaults
38
+ // =============================================================================
39
+ const DEFAULT_SETTINGS = {
40
+ storeName: 'Store',
41
+ storeEmail: '',
42
+ storeCurrency: 'USD',
43
+ storeTimezone: 'America/New_York',
44
+ taxEnabled: false,
45
+ taxRate: 0,
46
+ shippingEnabled: true,
47
+ freeShippingThreshold: 0,
48
+ };
49
+ const DEFAULT_LOCALE = 'en-US';
50
+ // Currency to locale mapping for proper formatting
51
+ const CURRENCY_LOCALES = {
52
+ USD: 'en-US',
53
+ EUR: 'de-DE',
54
+ GBP: 'en-GB',
55
+ CAD: 'en-CA',
56
+ AUD: 'en-AU',
57
+ JPY: 'ja-JP',
58
+ };
59
+ // =============================================================================
60
+ // Context
61
+ // =============================================================================
62
+ const StoreSettingsContext = createContext(null);
63
+ // =============================================================================
64
+ // Provider Component
65
+ // =============================================================================
66
+ export function StoreSettingsProvider({ children, initialSettings, fallback, }) {
67
+ const [settings, setSettings] = useState(initialSettings ? { ...DEFAULT_SETTINGS, ...initialSettings } : null);
68
+ const [isLoading, setIsLoading] = useState(!initialSettings);
69
+ const [error, setError] = useState(null);
70
+ // Fetch settings from API
71
+ const fetchSettings = useCallback(async () => {
72
+ try {
73
+ setIsLoading(true);
74
+ setError(null);
75
+ const response = await fetch('/api/store/settings');
76
+ if (!response.ok) {
77
+ throw new Error('Failed to fetch store settings');
78
+ }
79
+ const data = await response.json();
80
+ setSettings({
81
+ storeName: data.settings?.storeName || DEFAULT_SETTINGS.storeName,
82
+ storeEmail: data.settings?.storeEmail || DEFAULT_SETTINGS.storeEmail,
83
+ storeCurrency: data.settings?.storeCurrency || DEFAULT_SETTINGS.storeCurrency,
84
+ storeTimezone: data.settings?.storeTimezone || DEFAULT_SETTINGS.storeTimezone,
85
+ taxEnabled: data.settings?.taxEnabled ?? DEFAULT_SETTINGS.taxEnabled,
86
+ taxRate: data.settings?.taxRate ?? DEFAULT_SETTINGS.taxRate,
87
+ shippingEnabled: data.settings?.shippingEnabled ?? DEFAULT_SETTINGS.shippingEnabled,
88
+ freeShippingThreshold: data.settings?.freeShippingThreshold ?? DEFAULT_SETTINGS.freeShippingThreshold,
89
+ });
90
+ }
91
+ catch (err) {
92
+ console.error('[StoreSettingsProvider] Failed to fetch settings:', err);
93
+ setError(err instanceof Error ? err.message : 'Failed to load settings');
94
+ // Use fallback or defaults on error
95
+ setSettings({
96
+ ...DEFAULT_SETTINGS,
97
+ storeName: fallback?.storeName || DEFAULT_SETTINGS.storeName,
98
+ storeCurrency: fallback?.currency || DEFAULT_SETTINGS.storeCurrency,
99
+ storeEmail: fallback?.supportEmail || DEFAULT_SETTINGS.storeEmail,
100
+ });
101
+ }
102
+ finally {
103
+ setIsLoading(false);
104
+ }
105
+ }, [fallback]);
106
+ // Fetch on mount
107
+ useEffect(() => {
108
+ if (!initialSettings) {
109
+ fetchSettings();
110
+ }
111
+ }, [fetchSettings, initialSettings]);
112
+ // Memoized formatPrice function
113
+ const formatPrice = useCallback((price) => {
114
+ const currency = settings?.storeCurrency || fallback?.currency || 'USD';
115
+ const locale = CURRENCY_LOCALES[currency] || fallback?.locale || DEFAULT_LOCALE;
116
+ // Convert to number
117
+ let numPrice = typeof price === 'string' ? parseFloat(price) : price;
118
+ // Assume cents if price is a large integer (> 100 and whole number)
119
+ if (Number.isInteger(numPrice) && numPrice > 100) {
120
+ numPrice = numPrice / 100;
121
+ }
122
+ return new Intl.NumberFormat(locale, {
123
+ style: 'currency',
124
+ currency,
125
+ minimumFractionDigits: 2,
126
+ maximumFractionDigits: 2,
127
+ }).format(numPrice);
128
+ }, [settings?.storeCurrency, fallback?.currency, fallback?.locale]);
129
+ // Memoized formatDate function with timezone support
130
+ const formatDate = useCallback((date, options = {
131
+ year: 'numeric',
132
+ month: 'short',
133
+ day: 'numeric',
134
+ }) => {
135
+ const d = typeof date === 'string' ? new Date(date) : date;
136
+ const timezone = settings?.storeTimezone || DEFAULT_SETTINGS.storeTimezone;
137
+ const locale = CURRENCY_LOCALES[settings?.storeCurrency || ''] || fallback?.locale || DEFAULT_LOCALE;
138
+ return new Intl.DateTimeFormat(locale, {
139
+ ...options,
140
+ timeZone: timezone,
141
+ }).format(d);
142
+ }, [settings?.storeTimezone, settings?.storeCurrency, fallback?.locale]);
143
+ // Memoized context value
144
+ const value = useMemo(() => ({
145
+ storeName: settings?.storeName || fallback?.storeName || DEFAULT_SETTINGS.storeName,
146
+ currency: settings?.storeCurrency || fallback?.currency || DEFAULT_SETTINGS.storeCurrency,
147
+ locale: CURRENCY_LOCALES[settings?.storeCurrency || ''] || fallback?.locale || DEFAULT_LOCALE,
148
+ supportEmail: settings?.storeEmail || fallback?.supportEmail || '',
149
+ isLoading,
150
+ error,
151
+ settings,
152
+ formatPrice,
153
+ formatDate,
154
+ refetch: fetchSettings,
155
+ }), [settings, fallback, isLoading, error, formatPrice, formatDate, fetchSettings]);
156
+ return (_jsx(StoreSettingsContext.Provider, { value: value, children: children }));
157
+ }
158
+ // =============================================================================
159
+ // Hook
160
+ // =============================================================================
161
+ /**
162
+ * Hook to access store settings from context.
163
+ *
164
+ * @throws Error if used outside of StoreSettingsProvider
165
+ *
166
+ * @example
167
+ * ```tsx
168
+ * function PriceDisplay({ price }: { price: number }) {
169
+ * const { formatPrice } = useStoreSettings()
170
+ * return <span>{formatPrice(price)}</span>
171
+ * }
172
+ *
173
+ * function Header() {
174
+ * const { storeName, isLoading } = useStoreSettings()
175
+ * if (isLoading) return <Skeleton />
176
+ * return <h1>{storeName}</h1>
177
+ * }
178
+ * ```
179
+ */
180
+ export function useStoreSettings() {
181
+ const context = useContext(StoreSettingsContext);
182
+ if (!context) {
183
+ throw new Error('useStoreSettings must be used within a StoreSettingsProvider. ' +
184
+ 'Make sure to wrap your app with <StoreSettingsProvider> in layout.tsx');
185
+ }
186
+ return context;
187
+ }
188
+ /**
189
+ * Optional hook that returns null instead of throwing if used outside provider.
190
+ * Useful for components that can work with or without settings.
191
+ */
192
+ export function useStoreSettingsOptional() {
193
+ return useContext(StoreSettingsContext);
194
+ }
195
+ //# sourceMappingURL=StoreSettingsProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoreSettingsProvider.js","sourceRoot":"","sources":["../../src/core/StoreSettingsProvider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @rovela/sdk/core/api
3
+ *
4
+ * Public API route handlers for core functionality.
5
+ */
6
+ export { getPublicSettings } from './settings';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/api/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @rovela/sdk/core/api
3
+ *
4
+ * Public API route handlers for core functionality.
5
+ */
6
+ export { getPublicSettings } from './settings';
7
+ //# sourceMappingURL=index.js.map