@fayz-ai/shop 0.7.0 → 0.8.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.
- package/README.md +2 -0
- package/dist/index.cjs +38 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +38 -27
- package/dist/index.js.map +1 -1
- package/dist/provider.d.ts +6 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/supabase-provider.d.ts.map +1 -1
- package/dist/tables.d.ts +10 -0
- package/dist/tables.d.ts.map +1 -0
- package/package.json +10 -4
- package/src/provider.ts +6 -0
- package/src/supabase-provider.ts +30 -29
- package/src/tables.ts +12 -0
package/dist/index.js
CHANGED
|
@@ -649,6 +649,17 @@ function getShopTenantId() {
|
|
|
649
649
|
}
|
|
650
650
|
}
|
|
651
651
|
|
|
652
|
+
// src/tables.ts
|
|
653
|
+
var T = {
|
|
654
|
+
products: "plg_shop_products",
|
|
655
|
+
productImages: "plg_shop_product_images",
|
|
656
|
+
categories: "plg_shop_categories",
|
|
657
|
+
orders: "plg_shop_orders",
|
|
658
|
+
orderItems: "plg_shop_order_items",
|
|
659
|
+
customers: "plg_shop_customers",
|
|
660
|
+
discounts: "plg_shop_discounts"
|
|
661
|
+
};
|
|
662
|
+
|
|
652
663
|
// src/supabase-provider.ts
|
|
653
664
|
function getDb() {
|
|
654
665
|
const supabase = getSupabaseClientOptional();
|
|
@@ -776,7 +787,7 @@ var SupabaseShopProvider = class {
|
|
|
776
787
|
async listProducts(options) {
|
|
777
788
|
const db = getDb();
|
|
778
789
|
const tenantId = getTenantId();
|
|
779
|
-
let q = db.from(
|
|
790
|
+
let q = db.from(T.products).select(`*, images:${T.productImages}(*)`);
|
|
780
791
|
if (tenantId) q = q.eq("tenant_id", tenantId);
|
|
781
792
|
if (options?.status) q = q.eq("status", options.status);
|
|
782
793
|
if (options?.categoryId) q = q.eq("category_id", options.categoryId);
|
|
@@ -791,14 +802,14 @@ var SupabaseShopProvider = class {
|
|
|
791
802
|
}
|
|
792
803
|
async getProduct(id) {
|
|
793
804
|
const db = getDb();
|
|
794
|
-
const { data, error } = await db.from(
|
|
805
|
+
const { data, error } = await db.from(T.products).select(`*, images:${T.productImages}(*)`).eq("id", id).maybeSingle();
|
|
795
806
|
if (error) throw error;
|
|
796
807
|
return data ? rowToProduct(data) : null;
|
|
797
808
|
}
|
|
798
809
|
async createProduct(input) {
|
|
799
810
|
const db = getDb();
|
|
800
811
|
const tenantId = getTenantId();
|
|
801
|
-
const { data, error } = await db.from(
|
|
812
|
+
const { data, error } = await db.from(T.products).insert({
|
|
802
813
|
tenant_id: tenantId,
|
|
803
814
|
name: input.name,
|
|
804
815
|
slug: input.slug ?? slugify(input.name),
|
|
@@ -815,7 +826,7 @@ var SupabaseShopProvider = class {
|
|
|
815
826
|
is_physical: input.isPhysical ?? true,
|
|
816
827
|
weight: input.weight ?? null,
|
|
817
828
|
weight_unit: input.weightUnit ?? "kg"
|
|
818
|
-
}).select(
|
|
829
|
+
}).select(`*, images:${T.productImages}(*)`).single();
|
|
819
830
|
if (error) throw error;
|
|
820
831
|
return rowToProduct(data);
|
|
821
832
|
}
|
|
@@ -837,12 +848,12 @@ var SupabaseShopProvider = class {
|
|
|
837
848
|
if (input.categoryId !== void 0) updates.category_id = input.categoryId;
|
|
838
849
|
if (input.isPhysical !== void 0) updates.is_physical = input.isPhysical;
|
|
839
850
|
if (input.weight !== void 0) updates.weight = input.weight;
|
|
840
|
-
const { data, error } = await db.from(
|
|
851
|
+
const { data, error } = await db.from(T.products).update(updates).eq("id", id).select(`*, images:${T.productImages}(*)`).single();
|
|
841
852
|
if (error) throw error;
|
|
842
853
|
return rowToProduct(data);
|
|
843
854
|
}
|
|
844
855
|
async deleteProduct(id) {
|
|
845
|
-
const { error } = await getDb().from(
|
|
856
|
+
const { error } = await getDb().from(T.products).delete().eq("id", id);
|
|
846
857
|
if (error) throw error;
|
|
847
858
|
}
|
|
848
859
|
async uploadProductImage(productId, file) {
|
|
@@ -852,12 +863,12 @@ var SupabaseShopProvider = class {
|
|
|
852
863
|
const { error: uploadErr } = await db.storage.from("shop-images").upload(path, file);
|
|
853
864
|
if (uploadErr) throw uploadErr;
|
|
854
865
|
const { data: { publicUrl } } = db.storage.from("shop-images").getPublicUrl(path);
|
|
855
|
-
const { data, error } = await db.from(
|
|
866
|
+
const { data, error } = await db.from(T.productImages).insert({ product_id: productId, tenant_id: tenantId, url: publicUrl, sort_order: 0, is_primary: false }).select().single();
|
|
856
867
|
if (error) throw error;
|
|
857
868
|
return rowToImage(data);
|
|
858
869
|
}
|
|
859
870
|
async deleteProductImage(imageId) {
|
|
860
|
-
const { error } = await getDb().from(
|
|
871
|
+
const { error } = await getDb().from(T.productImages).delete().eq("id", imageId);
|
|
861
872
|
if (error) throw error;
|
|
862
873
|
}
|
|
863
874
|
// ---------------------------------------------------------------------------
|
|
@@ -866,7 +877,7 @@ var SupabaseShopProvider = class {
|
|
|
866
877
|
async listCategories() {
|
|
867
878
|
const db = getDb();
|
|
868
879
|
const tenantId = getTenantId();
|
|
869
|
-
let q = db.from(
|
|
880
|
+
let q = db.from(T.categories).select("*").order("sort_order", { ascending: true });
|
|
870
881
|
if (tenantId) q = q.eq("tenant_id", tenantId);
|
|
871
882
|
const { data, error } = await q;
|
|
872
883
|
if (error) throw error;
|
|
@@ -874,7 +885,7 @@ var SupabaseShopProvider = class {
|
|
|
874
885
|
}
|
|
875
886
|
async createCategory(input) {
|
|
876
887
|
const db = getDb();
|
|
877
|
-
const { data, error } = await db.from(
|
|
888
|
+
const { data, error } = await db.from(T.categories).insert({ tenant_id: getTenantId(), name: input.name, slug: input.slug ?? slugify(input.name), description: input.description ?? null, parent_id: input.parentId ?? null, sort_order: input.sortOrder ?? 0 }).select().single();
|
|
878
889
|
if (error) throw error;
|
|
879
890
|
return rowToCategory(data);
|
|
880
891
|
}
|
|
@@ -886,12 +897,12 @@ var SupabaseShopProvider = class {
|
|
|
886
897
|
if (input.description !== void 0) updates.description = input.description;
|
|
887
898
|
if (input.parentId !== void 0) updates.parent_id = input.parentId;
|
|
888
899
|
if (input.sortOrder !== void 0) updates.sort_order = input.sortOrder;
|
|
889
|
-
const { data, error } = await db.from(
|
|
900
|
+
const { data, error } = await db.from(T.categories).update(updates).eq("id", id).select().single();
|
|
890
901
|
if (error) throw error;
|
|
891
902
|
return rowToCategory(data);
|
|
892
903
|
}
|
|
893
904
|
async deleteCategory(id) {
|
|
894
|
-
const { error } = await getDb().from(
|
|
905
|
+
const { error } = await getDb().from(T.categories).delete().eq("id", id);
|
|
895
906
|
if (error) throw error;
|
|
896
907
|
}
|
|
897
908
|
// ---------------------------------------------------------------------------
|
|
@@ -900,7 +911,7 @@ var SupabaseShopProvider = class {
|
|
|
900
911
|
async listOrders(options) {
|
|
901
912
|
const db = getDb();
|
|
902
913
|
const tenantId = getTenantId();
|
|
903
|
-
let q = db.from(
|
|
914
|
+
let q = db.from(T.orders).select(`*, items:${T.orderItems}(*)`);
|
|
904
915
|
if (tenantId) q = q.eq("tenant_id", tenantId);
|
|
905
916
|
if (options?.status) q = q.eq("status", options.status);
|
|
906
917
|
if (options?.financialStatus) q = q.eq("financial_status", options.financialStatus);
|
|
@@ -915,7 +926,7 @@ var SupabaseShopProvider = class {
|
|
|
915
926
|
return (data ?? []).map(rowToOrder);
|
|
916
927
|
}
|
|
917
928
|
async getOrder(id) {
|
|
918
|
-
const { data, error } = await getDb().from(
|
|
929
|
+
const { data, error } = await getDb().from(T.orders).select(`*, items:${T.orderItems}(*)`).eq("id", id).maybeSingle();
|
|
919
930
|
if (error) throw error;
|
|
920
931
|
return data ? rowToOrder(data) : null;
|
|
921
932
|
}
|
|
@@ -926,10 +937,10 @@ var SupabaseShopProvider = class {
|
|
|
926
937
|
const discountTotal = input.discountTotal ?? 0;
|
|
927
938
|
const shippingTotal = input.shippingTotal ?? 0;
|
|
928
939
|
const total = Math.round((subtotal - discountTotal + shippingTotal) * 100) / 100;
|
|
929
|
-
const { data: order, error: orderErr } = await db.from(
|
|
940
|
+
const { data: order, error: orderErr } = await db.from(T.orders).insert({ tenant_id: tenantId, customer_id: input.customerId ?? null, customer_name: input.customerName ?? null, customer_email: input.customerEmail ?? null, currency: input.currency ?? "BRL", notes: input.notes ?? null, subtotal, discount_total: discountTotal, shipping_total: shippingTotal, discount_code: input.discountCode ?? null, total, status: "open", financial_status: "pending", fulfillment_status: "unfulfilled" }).select().single();
|
|
930
941
|
if (orderErr) throw orderErr;
|
|
931
942
|
const items = input.items.map((i) => ({ order_id: order.id, product_id: asUuid(i.productId), name: i.name, sku: i.sku ?? null, quantity: i.quantity, unit_price: i.unitPrice, total: i.quantity * i.unitPrice, image_url: i.imageUrl ?? null }));
|
|
932
|
-
await db.from(
|
|
943
|
+
await db.from(T.orderItems).insert(items);
|
|
933
944
|
return this.getOrder(order.id);
|
|
934
945
|
}
|
|
935
946
|
async updateOrder(id, input) {
|
|
@@ -938,7 +949,7 @@ var SupabaseShopProvider = class {
|
|
|
938
949
|
if (input.financialStatus !== void 0) updates.financial_status = input.financialStatus;
|
|
939
950
|
if (input.fulfillmentStatus !== void 0) updates.fulfillment_status = input.fulfillmentStatus;
|
|
940
951
|
if (input.notes !== void 0) updates.notes = input.notes;
|
|
941
|
-
const { error } = await getDb().from(
|
|
952
|
+
const { error } = await getDb().from(T.orders).update(updates).eq("id", id);
|
|
942
953
|
if (error) throw error;
|
|
943
954
|
return this.getOrder(id);
|
|
944
955
|
}
|
|
@@ -971,7 +982,7 @@ var SupabaseShopProvider = class {
|
|
|
971
982
|
async listCustomers(options) {
|
|
972
983
|
const db = getDb();
|
|
973
984
|
const tenantId = getTenantId();
|
|
974
|
-
let q = db.from(
|
|
985
|
+
let q = db.from(T.customers).select("*").order("first_name", { ascending: true });
|
|
975
986
|
if (tenantId) q = q.eq("tenant_id", tenantId);
|
|
976
987
|
if (options?.search) q = q.or(`first_name.ilike.%${options.search}%,last_name.ilike.%${options.search}%,email.ilike.%${options.search}%`);
|
|
977
988
|
if (options?.limit) q = q.limit(options.limit);
|
|
@@ -980,12 +991,12 @@ var SupabaseShopProvider = class {
|
|
|
980
991
|
return (data ?? []).map(rowToCustomer);
|
|
981
992
|
}
|
|
982
993
|
async getCustomer(id) {
|
|
983
|
-
const { data, error } = await getDb().from(
|
|
994
|
+
const { data, error } = await getDb().from(T.customers).select("*").eq("id", id).maybeSingle();
|
|
984
995
|
if (error) throw error;
|
|
985
996
|
return data ? rowToCustomer(data) : null;
|
|
986
997
|
}
|
|
987
998
|
async createCustomer(input) {
|
|
988
|
-
const { data, error } = await getDb().from(
|
|
999
|
+
const { data, error } = await getDb().from(T.customers).insert({ tenant_id: getTenantId(), first_name: input.firstName, last_name: input.lastName ?? "", email: input.email ?? null, phone: input.phone ?? null, notes: input.notes ?? null }).select().single();
|
|
989
1000
|
if (error) throw error;
|
|
990
1001
|
return rowToCustomer(data);
|
|
991
1002
|
}
|
|
@@ -996,12 +1007,12 @@ var SupabaseShopProvider = class {
|
|
|
996
1007
|
if (input.email !== void 0) updates.email = input.email;
|
|
997
1008
|
if (input.phone !== void 0) updates.phone = input.phone;
|
|
998
1009
|
if (input.notes !== void 0) updates.notes = input.notes;
|
|
999
|
-
const { data, error } = await getDb().from(
|
|
1010
|
+
const { data, error } = await getDb().from(T.customers).update(updates).eq("id", id).select().single();
|
|
1000
1011
|
if (error) throw error;
|
|
1001
1012
|
return rowToCustomer(data);
|
|
1002
1013
|
}
|
|
1003
1014
|
async deleteCustomer(id) {
|
|
1004
|
-
const { error } = await getDb().from(
|
|
1015
|
+
const { error } = await getDb().from(T.customers).delete().eq("id", id);
|
|
1005
1016
|
if (error) throw error;
|
|
1006
1017
|
}
|
|
1007
1018
|
// Find-or-create + link to auth.uid server-side (SECURITY DEFINER RPC), so the
|
|
@@ -1026,7 +1037,7 @@ var SupabaseShopProvider = class {
|
|
|
1026
1037
|
async listDiscounts(options) {
|
|
1027
1038
|
const db = getDb();
|
|
1028
1039
|
const tenantId = getTenantId();
|
|
1029
|
-
let q = db.from(
|
|
1040
|
+
let q = db.from(T.discounts).select("*").order("created_at", { ascending: false });
|
|
1030
1041
|
if (tenantId) q = q.eq("tenant_id", tenantId);
|
|
1031
1042
|
if (options?.status) q = q.eq("status", options.status);
|
|
1032
1043
|
if (options?.type) q = q.eq("type", options.type);
|
|
@@ -1037,12 +1048,12 @@ var SupabaseShopProvider = class {
|
|
|
1037
1048
|
return (data ?? []).map(rowToDiscount);
|
|
1038
1049
|
}
|
|
1039
1050
|
async getDiscount(id) {
|
|
1040
|
-
const { data, error } = await getDb().from(
|
|
1051
|
+
const { data, error } = await getDb().from(T.discounts).select("*").eq("id", id).maybeSingle();
|
|
1041
1052
|
if (error) throw error;
|
|
1042
1053
|
return data ? rowToDiscount(data) : null;
|
|
1043
1054
|
}
|
|
1044
1055
|
async createDiscount(input) {
|
|
1045
|
-
const { data, error } = await getDb().from(
|
|
1056
|
+
const { data, error } = await getDb().from(T.discounts).insert({ tenant_id: getTenantId(), title: input.title, code: input.code ?? null, type: input.type, method: input.method ?? "code", value: input.value, usage_limit: input.usageLimit ?? null, once_per_customer: input.oncePerCustomer ?? false, starts_at: input.startsAt ?? (/* @__PURE__ */ new Date()).toISOString(), ends_at: input.endsAt ?? null, status: input.status ?? "active", times_used: 0 }).select().single();
|
|
1046
1057
|
if (error) throw error;
|
|
1047
1058
|
return rowToDiscount(data);
|
|
1048
1059
|
}
|
|
@@ -1055,12 +1066,12 @@ var SupabaseShopProvider = class {
|
|
|
1055
1066
|
if (input.usageLimit !== void 0) updates.usage_limit = input.usageLimit;
|
|
1056
1067
|
if (input.status !== void 0) updates.status = input.status;
|
|
1057
1068
|
if (input.endsAt !== void 0) updates.ends_at = input.endsAt;
|
|
1058
|
-
const { data, error } = await getDb().from(
|
|
1069
|
+
const { data, error } = await getDb().from(T.discounts).update(updates).eq("id", id).select().single();
|
|
1059
1070
|
if (error) throw error;
|
|
1060
1071
|
return rowToDiscount(data);
|
|
1061
1072
|
}
|
|
1062
1073
|
async deleteDiscount(id) {
|
|
1063
|
-
const { error } = await getDb().from(
|
|
1074
|
+
const { error } = await getDb().from(T.discounts).delete().eq("id", id);
|
|
1064
1075
|
if (error) throw error;
|
|
1065
1076
|
}
|
|
1066
1077
|
};
|