@contractspec/example.marketplace 0.0.0-canary-20260113170453

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 (188) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +141 -0
  3. package/dist/docs/index.d.ts +1 -0
  4. package/dist/docs/index.js +1 -0
  5. package/dist/docs/marketplace.docblock.d.ts +1 -0
  6. package/dist/docs/marketplace.docblock.js +115 -0
  7. package/dist/docs/marketplace.docblock.js.map +1 -0
  8. package/dist/entities/index.d.ts +309 -0
  9. package/dist/entities/index.d.ts.map +1 -0
  10. package/dist/entities/index.js +46 -0
  11. package/dist/entities/index.js.map +1 -0
  12. package/dist/entities/order.d.ts +105 -0
  13. package/dist/entities/order.d.ts.map +1 -0
  14. package/dist/entities/order.js +173 -0
  15. package/dist/entities/order.js.map +1 -0
  16. package/dist/entities/payout.d.ts +92 -0
  17. package/dist/entities/payout.d.ts.map +1 -0
  18. package/dist/entities/payout.js +162 -0
  19. package/dist/entities/payout.js.map +1 -0
  20. package/dist/entities/product.d.ts +93 -0
  21. package/dist/entities/product.d.ts.map +1 -0
  22. package/dist/entities/product.js +161 -0
  23. package/dist/entities/product.js.map +1 -0
  24. package/dist/entities/review.d.ts +83 -0
  25. package/dist/entities/review.d.ts.map +1 -0
  26. package/dist/entities/review.js +152 -0
  27. package/dist/entities/review.js.map +1 -0
  28. package/dist/entities/store.d.ts +60 -0
  29. package/dist/entities/store.d.ts.map +1 -0
  30. package/dist/entities/store.js +110 -0
  31. package/dist/entities/store.js.map +1 -0
  32. package/dist/example.d.ts +7 -0
  33. package/dist/example.d.ts.map +1 -0
  34. package/dist/example.js +58 -0
  35. package/dist/example.js.map +1 -0
  36. package/dist/handlers/index.d.ts +2 -0
  37. package/dist/handlers/index.js +3 -0
  38. package/dist/handlers/marketplace.handlers.d.ts +155 -0
  39. package/dist/handlers/marketplace.handlers.d.ts.map +1 -0
  40. package/dist/handlers/marketplace.handlers.js +329 -0
  41. package/dist/handlers/marketplace.handlers.js.map +1 -0
  42. package/dist/index.d.ts +31 -0
  43. package/dist/index.js +32 -0
  44. package/dist/marketplace.capability.d.ts +9 -0
  45. package/dist/marketplace.capability.d.ts.map +1 -0
  46. package/dist/marketplace.capability.js +34 -0
  47. package/dist/marketplace.capability.js.map +1 -0
  48. package/dist/marketplace.feature.d.ts +12 -0
  49. package/dist/marketplace.feature.d.ts.map +1 -0
  50. package/dist/marketplace.feature.js +315 -0
  51. package/dist/marketplace.feature.js.map +1 -0
  52. package/dist/order/index.d.ts +5 -0
  53. package/dist/order/index.js +6 -0
  54. package/dist/order/order.enum.d.ts +10 -0
  55. package/dist/order/order.enum.d.ts.map +1 -0
  56. package/dist/order/order.enum.js +22 -0
  57. package/dist/order/order.enum.js.map +1 -0
  58. package/dist/order/order.event.d.ts +145 -0
  59. package/dist/order/order.event.d.ts.map +1 -0
  60. package/dist/order/order.event.js +216 -0
  61. package/dist/order/order.event.js.map +1 -0
  62. package/dist/order/order.operations.d.ts +368 -0
  63. package/dist/order/order.operations.d.ts.map +1 -0
  64. package/dist/order/order.operations.js +119 -0
  65. package/dist/order/order.operations.js.map +1 -0
  66. package/dist/order/order.presentation.d.ts +9 -0
  67. package/dist/order/order.presentation.d.ts.map +1 -0
  68. package/dist/order/order.presentation.js +86 -0
  69. package/dist/order/order.presentation.js.map +1 -0
  70. package/dist/order/order.schema.d.ts +165 -0
  71. package/dist/order/order.schema.d.ts.map +1 -0
  72. package/dist/order/order.schema.js +155 -0
  73. package/dist/order/order.schema.js.map +1 -0
  74. package/dist/payout/index.d.ts +5 -0
  75. package/dist/payout/index.js +6 -0
  76. package/dist/payout/payout.enum.d.ts +10 -0
  77. package/dist/payout/payout.enum.d.ts.map +1 -0
  78. package/dist/payout/payout.enum.js +17 -0
  79. package/dist/payout/payout.enum.js.map +1 -0
  80. package/dist/payout/payout.event.d.ts +63 -0
  81. package/dist/payout/payout.event.d.ts.map +1 -0
  82. package/dist/payout/payout.event.js +92 -0
  83. package/dist/payout/payout.event.js.map +1 -0
  84. package/dist/payout/payout.operations.d.ts +97 -0
  85. package/dist/payout/payout.operations.d.ts.map +1 -0
  86. package/dist/payout/payout.operations.js +53 -0
  87. package/dist/payout/payout.operations.js.map +1 -0
  88. package/dist/payout/payout.presentation.d.ts +8 -0
  89. package/dist/payout/payout.presentation.d.ts.map +1 -0
  90. package/dist/payout/payout.presentation.js +60 -0
  91. package/dist/payout/payout.presentation.js.map +1 -0
  92. package/dist/payout/payout.schema.d.ts +157 -0
  93. package/dist/payout/payout.schema.d.ts.map +1 -0
  94. package/dist/payout/payout.schema.js +116 -0
  95. package/dist/payout/payout.schema.js.map +1 -0
  96. package/dist/product/index.d.ts +5 -0
  97. package/dist/product/index.js +6 -0
  98. package/dist/product/product.enum.d.ts +10 -0
  99. package/dist/product/product.enum.d.ts.map +1 -0
  100. package/dist/product/product.enum.js +18 -0
  101. package/dist/product/product.enum.js.map +1 -0
  102. package/dist/product/product.event.d.ts +73 -0
  103. package/dist/product/product.event.d.ts.map +1 -0
  104. package/dist/product/product.event.js +120 -0
  105. package/dist/product/product.event.js.map +1 -0
  106. package/dist/product/product.operations.d.ts +273 -0
  107. package/dist/product/product.operations.d.ts.map +1 -0
  108. package/dist/product/product.operations.js +108 -0
  109. package/dist/product/product.operations.js.map +1 -0
  110. package/dist/product/product.presentation.d.ts +9 -0
  111. package/dist/product/product.presentation.d.ts.map +1 -0
  112. package/dist/product/product.presentation.js +86 -0
  113. package/dist/product/product.presentation.js.map +1 -0
  114. package/dist/product/product.schema.d.ts +218 -0
  115. package/dist/product/product.schema.d.ts.map +1 -0
  116. package/dist/product/product.schema.js +176 -0
  117. package/dist/product/product.schema.js.map +1 -0
  118. package/dist/review/index.d.ts +5 -0
  119. package/dist/review/index.js +6 -0
  120. package/dist/review/review.enum.d.ts +10 -0
  121. package/dist/review/review.enum.d.ts.map +1 -0
  122. package/dist/review/review.enum.js +16 -0
  123. package/dist/review/review.enum.js.map +1 -0
  124. package/dist/review/review.event.d.ts +55 -0
  125. package/dist/review/review.event.d.ts.map +1 -0
  126. package/dist/review/review.event.js +84 -0
  127. package/dist/review/review.event.js.map +1 -0
  128. package/dist/review/review.operations.d.ts +237 -0
  129. package/dist/review/review.operations.d.ts.map +1 -0
  130. package/dist/review/review.operations.js +106 -0
  131. package/dist/review/review.operations.js.map +1 -0
  132. package/dist/review/review.presentation.d.ts +8 -0
  133. package/dist/review/review.presentation.d.ts.map +1 -0
  134. package/dist/review/review.presentation.js +60 -0
  135. package/dist/review/review.presentation.js.map +1 -0
  136. package/dist/review/review.schema.d.ts +190 -0
  137. package/dist/review/review.schema.d.ts.map +1 -0
  138. package/dist/review/review.schema.js +156 -0
  139. package/dist/review/review.schema.js.map +1 -0
  140. package/dist/seeders/index.d.ts +10 -0
  141. package/dist/seeders/index.d.ts.map +1 -0
  142. package/dist/seeders/index.js +18 -0
  143. package/dist/seeders/index.js.map +1 -0
  144. package/dist/store/index.d.ts +5 -0
  145. package/dist/store/index.js +6 -0
  146. package/dist/store/store.enum.d.ts +10 -0
  147. package/dist/store/store.enum.d.ts.map +1 -0
  148. package/dist/store/store.enum.js +16 -0
  149. package/dist/store/store.enum.js.map +1 -0
  150. package/dist/store/store.event.d.ts +51 -0
  151. package/dist/store/store.event.d.ts.map +1 -0
  152. package/dist/store/store.event.js +80 -0
  153. package/dist/store/store.event.js.map +1 -0
  154. package/dist/store/store.operations.d.ts +131 -0
  155. package/dist/store/store.operations.d.ts.map +1 -0
  156. package/dist/store/store.operations.js +61 -0
  157. package/dist/store/store.operations.js.map +1 -0
  158. package/dist/store/store.presentation.d.ts +8 -0
  159. package/dist/store/store.presentation.d.ts.map +1 -0
  160. package/dist/store/store.presentation.js +60 -0
  161. package/dist/store/store.presentation.js.map +1 -0
  162. package/dist/store/store.schema.d.ts +84 -0
  163. package/dist/store/store.schema.d.ts.map +1 -0
  164. package/dist/store/store.schema.js +93 -0
  165. package/dist/store/store.schema.js.map +1 -0
  166. package/dist/tests/operations.test-spec.d.ts +11 -0
  167. package/dist/tests/operations.test-spec.d.ts.map +1 -0
  168. package/dist/tests/operations.test-spec.js +152 -0
  169. package/dist/tests/operations.test-spec.js.map +1 -0
  170. package/dist/ui/MarketplaceDashboard.d.ts +7 -0
  171. package/dist/ui/MarketplaceDashboard.d.ts.map +1 -0
  172. package/dist/ui/MarketplaceDashboard.js +319 -0
  173. package/dist/ui/MarketplaceDashboard.js.map +1 -0
  174. package/dist/ui/hooks/index.d.ts +2 -0
  175. package/dist/ui/hooks/index.js +5 -0
  176. package/dist/ui/hooks/useMarketplaceData.d.ts +23 -0
  177. package/dist/ui/hooks/useMarketplaceData.d.ts.map +1 -0
  178. package/dist/ui/hooks/useMarketplaceData.js +64 -0
  179. package/dist/ui/hooks/useMarketplaceData.js.map +1 -0
  180. package/dist/ui/index.d.ts +6 -0
  181. package/dist/ui/index.js +6 -0
  182. package/dist/ui/renderers/index.d.ts +2 -0
  183. package/dist/ui/renderers/index.js +3 -0
  184. package/dist/ui/renderers/marketplace.markdown.d.ts +28 -0
  185. package/dist/ui/renderers/marketplace.markdown.d.ts.map +1 -0
  186. package/dist/ui/renderers/marketplace.markdown.js +244 -0
  187. package/dist/ui/renderers/marketplace.markdown.js.map +1 -0
  188. package/package.json +149 -0
@@ -0,0 +1,93 @@
1
+ import * as _contractspec_lib_schema692 from "@contractspec/lib.schema";
2
+
3
+ //#region src/entities/product.d.ts
4
+ /**
5
+ * Product status enum.
6
+ */
7
+ declare const ProductStatusEnum: _contractspec_lib_schema692.EntityEnumDef;
8
+ /**
9
+ * Product type enum.
10
+ */
11
+ declare const ProductTypeEnum: _contractspec_lib_schema692.EntityEnumDef;
12
+ /**
13
+ * Product entity - an item for sale on the marketplace.
14
+ */
15
+ declare const ProductEntity: _contractspec_lib_schema692.EntitySpec<{
16
+ id: _contractspec_lib_schema692.EntityScalarField;
17
+ storeId: _contractspec_lib_schema692.EntityScalarField;
18
+ name: _contractspec_lib_schema692.EntityScalarField;
19
+ slug: _contractspec_lib_schema692.EntityScalarField;
20
+ description: _contractspec_lib_schema692.EntityScalarField;
21
+ shortDescription: _contractspec_lib_schema692.EntityScalarField;
22
+ status: _contractspec_lib_schema692.EntityEnumField;
23
+ type: _contractspec_lib_schema692.EntityEnumField;
24
+ price: _contractspec_lib_schema692.EntityScalarField;
25
+ compareAtPrice: _contractspec_lib_schema692.EntityScalarField;
26
+ currency: _contractspec_lib_schema692.EntityScalarField;
27
+ sku: _contractspec_lib_schema692.EntityScalarField;
28
+ barcode: _contractspec_lib_schema692.EntityScalarField;
29
+ quantity: _contractspec_lib_schema692.EntityScalarField;
30
+ trackInventory: _contractspec_lib_schema692.EntityScalarField;
31
+ allowBackorder: _contractspec_lib_schema692.EntityScalarField;
32
+ lowStockThreshold: _contractspec_lib_schema692.EntityScalarField;
33
+ weight: _contractspec_lib_schema692.EntityScalarField;
34
+ weightUnit: _contractspec_lib_schema692.EntityScalarField;
35
+ categoryId: _contractspec_lib_schema692.EntityScalarField;
36
+ tags: _contractspec_lib_schema692.EntityScalarField;
37
+ primaryImageId: _contractspec_lib_schema692.EntityScalarField;
38
+ seoTitle: _contractspec_lib_schema692.EntityScalarField;
39
+ seoDescription: _contractspec_lib_schema692.EntityScalarField;
40
+ attributes: _contractspec_lib_schema692.EntityScalarField;
41
+ reviewCount: _contractspec_lib_schema692.EntityScalarField;
42
+ averageRating: _contractspec_lib_schema692.EntityScalarField;
43
+ totalSold: _contractspec_lib_schema692.EntityScalarField;
44
+ createdAt: _contractspec_lib_schema692.EntityScalarField;
45
+ updatedAt: _contractspec_lib_schema692.EntityScalarField;
46
+ publishedAt: _contractspec_lib_schema692.EntityScalarField;
47
+ store: _contractspec_lib_schema692.EntityRelationField;
48
+ variants: _contractspec_lib_schema692.EntityRelationField;
49
+ orderItems: _contractspec_lib_schema692.EntityRelationField;
50
+ reviews: _contractspec_lib_schema692.EntityRelationField;
51
+ }>;
52
+ /**
53
+ * Product variant entity - variations of a product (size, color, etc.).
54
+ */
55
+ declare const ProductVariantEntity: _contractspec_lib_schema692.EntitySpec<{
56
+ id: _contractspec_lib_schema692.EntityScalarField;
57
+ productId: _contractspec_lib_schema692.EntityScalarField;
58
+ name: _contractspec_lib_schema692.EntityScalarField;
59
+ options: _contractspec_lib_schema692.EntityScalarField;
60
+ price: _contractspec_lib_schema692.EntityScalarField;
61
+ compareAtPrice: _contractspec_lib_schema692.EntityScalarField;
62
+ sku: _contractspec_lib_schema692.EntityScalarField;
63
+ barcode: _contractspec_lib_schema692.EntityScalarField;
64
+ quantity: _contractspec_lib_schema692.EntityScalarField;
65
+ imageId: _contractspec_lib_schema692.EntityScalarField;
66
+ isActive: _contractspec_lib_schema692.EntityScalarField;
67
+ position: _contractspec_lib_schema692.EntityScalarField;
68
+ createdAt: _contractspec_lib_schema692.EntityScalarField;
69
+ updatedAt: _contractspec_lib_schema692.EntityScalarField;
70
+ product: _contractspec_lib_schema692.EntityRelationField;
71
+ }>;
72
+ /**
73
+ * Category entity - product categorization.
74
+ */
75
+ declare const CategoryEntity: _contractspec_lib_schema692.EntitySpec<{
76
+ id: _contractspec_lib_schema692.EntityScalarField;
77
+ name: _contractspec_lib_schema692.EntityScalarField;
78
+ slug: _contractspec_lib_schema692.EntityScalarField;
79
+ description: _contractspec_lib_schema692.EntityScalarField;
80
+ parentId: _contractspec_lib_schema692.EntityScalarField;
81
+ path: _contractspec_lib_schema692.EntityScalarField;
82
+ level: _contractspec_lib_schema692.EntityScalarField;
83
+ position: _contractspec_lib_schema692.EntityScalarField;
84
+ imageId: _contractspec_lib_schema692.EntityScalarField;
85
+ isActive: _contractspec_lib_schema692.EntityScalarField;
86
+ createdAt: _contractspec_lib_schema692.EntityScalarField;
87
+ updatedAt: _contractspec_lib_schema692.EntityScalarField;
88
+ parent: _contractspec_lib_schema692.EntityRelationField;
89
+ children: _contractspec_lib_schema692.EntityRelationField;
90
+ }>;
91
+ //#endregion
92
+ export { CategoryEntity, ProductEntity, ProductStatusEnum, ProductTypeEnum, ProductVariantEntity };
93
+ //# sourceMappingURL=product.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product.d.ts","names":[],"sources":["../../src/entities/product.ts"],"sourcesContent":[],"mappings":";;;;;;AAUa,cAAA,iBAYX,EAAA,2BAAA,CAZ4B,aAY5B;AAKF;AAUA;;cAVa,iBAKX,2BAAA,CAL0B;;;;cAUf,2CAAa;MAsFxB,2BAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0DAtFwB;EAAA,WAAA,+CAAA;EA2Fb,KAAA,iDAiDX;EAAA,QAAA,iDAAA;;;;;;;cAjDW,kDAAoB;MAiD/B,2BAAA,CAAA;;;;;;;wDAjD+B;EAAA,QAAA,+CAAA;EAsDpB,OAAA,+CAsCX;EAAA,QAAA,+CAAA;;;;;;;;;cAtCW,4CAAc;MAsCzB,2BAAA,CAAA;;;;yDAtCyB;EAAA,IAAA,+CAAA"}
@@ -0,0 +1,161 @@
1
+ import { defineEntity, defineEntityEnum, field, index } from "@contractspec/lib.schema";
2
+
3
+ //#region src/entities/product.ts
4
+ /**
5
+ * Product status enum.
6
+ */
7
+ const ProductStatusEnum = defineEntityEnum({
8
+ name: "ProductStatus",
9
+ values: [
10
+ "DRAFT",
11
+ "PENDING_REVIEW",
12
+ "ACTIVE",
13
+ "OUT_OF_STOCK",
14
+ "DISCONTINUED",
15
+ "REJECTED"
16
+ ],
17
+ schema: "marketplace",
18
+ description: "Status of a product listing."
19
+ });
20
+ /**
21
+ * Product type enum.
22
+ */
23
+ const ProductTypeEnum = defineEntityEnum({
24
+ name: "ProductType",
25
+ values: [
26
+ "PHYSICAL",
27
+ "DIGITAL",
28
+ "SERVICE",
29
+ "SUBSCRIPTION"
30
+ ],
31
+ schema: "marketplace",
32
+ description: "Type of product."
33
+ });
34
+ /**
35
+ * Product entity - an item for sale on the marketplace.
36
+ */
37
+ const ProductEntity = defineEntity({
38
+ name: "Product",
39
+ description: "A product listing on the marketplace.",
40
+ schema: "marketplace",
41
+ map: "product",
42
+ fields: {
43
+ id: field.id({ description: "Unique product ID" }),
44
+ storeId: field.foreignKey(),
45
+ name: field.string({ description: "Product name" }),
46
+ slug: field.string({ description: "URL-friendly identifier" }),
47
+ description: field.string({ isOptional: true }),
48
+ shortDescription: field.string({ isOptional: true }),
49
+ status: field.enum("ProductStatus", { default: "DRAFT" }),
50
+ type: field.enum("ProductType", { default: "PHYSICAL" }),
51
+ price: field.decimal({ description: "Base price" }),
52
+ compareAtPrice: field.decimal({
53
+ isOptional: true,
54
+ description: "Original price for showing discounts"
55
+ }),
56
+ currency: field.string({ default: "\"USD\"" }),
57
+ sku: field.string({ isOptional: true }),
58
+ barcode: field.string({ isOptional: true }),
59
+ quantity: field.int({ default: 0 }),
60
+ trackInventory: field.boolean({ default: true }),
61
+ allowBackorder: field.boolean({ default: false }),
62
+ lowStockThreshold: field.int({ default: 5 }),
63
+ weight: field.decimal({ isOptional: true }),
64
+ weightUnit: field.string({ default: "\"kg\"" }),
65
+ categoryId: field.string({ isOptional: true }),
66
+ tags: field.string({ isArray: true }),
67
+ primaryImageId: field.string({ isOptional: true }),
68
+ seoTitle: field.string({ isOptional: true }),
69
+ seoDescription: field.string({ isOptional: true }),
70
+ attributes: field.json({
71
+ isOptional: true,
72
+ description: "Custom product attributes"
73
+ }),
74
+ reviewCount: field.int({ default: 0 }),
75
+ averageRating: field.decimal({ default: 0 }),
76
+ totalSold: field.int({ default: 0 }),
77
+ createdAt: field.createdAt(),
78
+ updatedAt: field.updatedAt(),
79
+ publishedAt: field.dateTime({ isOptional: true }),
80
+ store: field.belongsTo("Store", ["storeId"], ["id"]),
81
+ variants: field.hasMany("ProductVariant"),
82
+ orderItems: field.hasMany("OrderItem"),
83
+ reviews: field.hasMany("Review")
84
+ },
85
+ indexes: [
86
+ index.unique(["storeId", "slug"]),
87
+ index.on(["storeId", "status"]),
88
+ index.on(["status", "publishedAt"]),
89
+ index.on(["categoryId", "status"]),
90
+ index.on(["averageRating"]),
91
+ index.on(["totalSold"]),
92
+ index.on(["price"])
93
+ ],
94
+ enums: [ProductStatusEnum, ProductTypeEnum]
95
+ });
96
+ /**
97
+ * Product variant entity - variations of a product (size, color, etc.).
98
+ */
99
+ const ProductVariantEntity = defineEntity({
100
+ name: "ProductVariant",
101
+ description: "A variant of a product with specific options.",
102
+ schema: "marketplace",
103
+ map: "product_variant",
104
+ fields: {
105
+ id: field.id(),
106
+ productId: field.foreignKey(),
107
+ name: field.string({ description: "Variant name (e.g., \"Large / Blue\")" }),
108
+ options: field.json({ description: "Variant options (e.g., {size: \"L\", color: \"Blue\"})" }),
109
+ price: field.decimal({ description: "Variant-specific price" }),
110
+ compareAtPrice: field.decimal({ isOptional: true }),
111
+ sku: field.string({ isOptional: true }),
112
+ barcode: field.string({ isOptional: true }),
113
+ quantity: field.int({ default: 0 }),
114
+ imageId: field.string({ isOptional: true }),
115
+ isActive: field.boolean({ default: true }),
116
+ position: field.int({ default: 0 }),
117
+ createdAt: field.createdAt(),
118
+ updatedAt: field.updatedAt(),
119
+ product: field.belongsTo("Product", ["productId"], ["id"], { onDelete: "Cascade" })
120
+ },
121
+ indexes: [
122
+ index.on(["productId", "sku"]),
123
+ index.on(["productId", "position"]),
124
+ index.on(["barcode"])
125
+ ]
126
+ });
127
+ /**
128
+ * Category entity - product categorization.
129
+ */
130
+ const CategoryEntity = defineEntity({
131
+ name: "Category",
132
+ description: "Product category for organization.",
133
+ schema: "marketplace",
134
+ map: "category",
135
+ fields: {
136
+ id: field.id(),
137
+ name: field.string(),
138
+ slug: field.string(),
139
+ description: field.string({ isOptional: true }),
140
+ parentId: field.string({ isOptional: true }),
141
+ path: field.string({ description: "Full path for hierarchical queries" }),
142
+ level: field.int({ default: 0 }),
143
+ position: field.int({ default: 0 }),
144
+ imageId: field.string({ isOptional: true }),
145
+ isActive: field.boolean({ default: true }),
146
+ createdAt: field.createdAt(),
147
+ updatedAt: field.updatedAt(),
148
+ parent: field.belongsTo("Category", ["parentId"], ["id"]),
149
+ children: field.hasMany("Category")
150
+ },
151
+ indexes: [
152
+ index.unique(["slug"]),
153
+ index.on(["parentId", "position"]),
154
+ index.on(["path"]),
155
+ index.on(["isActive"])
156
+ ]
157
+ });
158
+
159
+ //#endregion
160
+ export { CategoryEntity, ProductEntity, ProductStatusEnum, ProductTypeEnum, ProductVariantEntity };
161
+ //# sourceMappingURL=product.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product.js","names":[],"sources":["../../src/entities/product.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\n\n/**\n * Product status enum.\n */\nexport const ProductStatusEnum = defineEntityEnum({\n name: 'ProductStatus',\n values: [\n 'DRAFT',\n 'PENDING_REVIEW',\n 'ACTIVE',\n 'OUT_OF_STOCK',\n 'DISCONTINUED',\n 'REJECTED',\n ] as const,\n schema: 'marketplace',\n description: 'Status of a product listing.',\n});\n\n/**\n * Product type enum.\n */\nexport const ProductTypeEnum = defineEntityEnum({\n name: 'ProductType',\n values: ['PHYSICAL', 'DIGITAL', 'SERVICE', 'SUBSCRIPTION'] as const,\n schema: 'marketplace',\n description: 'Type of product.',\n});\n\n/**\n * Product entity - an item for sale on the marketplace.\n */\nexport const ProductEntity = defineEntity({\n name: 'Product',\n description: 'A product listing on the marketplace.',\n schema: 'marketplace',\n map: 'product',\n fields: {\n id: field.id({ description: 'Unique product ID' }),\n\n // Store\n storeId: field.foreignKey(),\n\n // Identity\n name: field.string({ description: 'Product name' }),\n slug: field.string({ description: 'URL-friendly identifier' }),\n description: field.string({ isOptional: true }),\n shortDescription: field.string({ isOptional: true }),\n\n // Status\n status: field.enum('ProductStatus', { default: 'DRAFT' }),\n type: field.enum('ProductType', { default: 'PHYSICAL' }),\n\n // Pricing\n price: field.decimal({ description: 'Base price' }),\n compareAtPrice: field.decimal({\n isOptional: true,\n description: 'Original price for showing discounts',\n }),\n currency: field.string({ default: '\"USD\"' }),\n\n // Inventory\n sku: field.string({ isOptional: true }),\n barcode: field.string({ isOptional: true }),\n quantity: field.int({ default: 0 }),\n trackInventory: field.boolean({ default: true }),\n allowBackorder: field.boolean({ default: false }),\n lowStockThreshold: field.int({ default: 5 }),\n\n // Physical properties\n weight: field.decimal({ isOptional: true }),\n weightUnit: field.string({ default: '\"kg\"' }),\n\n // Categories\n categoryId: field.string({ isOptional: true }),\n tags: field.string({ isArray: true }),\n\n // Media (using file attachments)\n primaryImageId: field.string({ isOptional: true }),\n\n // SEO\n seoTitle: field.string({ isOptional: true }),\n seoDescription: field.string({ isOptional: true }),\n\n // Attributes\n attributes: field.json({\n isOptional: true,\n description: 'Custom product attributes',\n }),\n\n // Reviews\n reviewCount: field.int({ default: 0 }),\n averageRating: field.decimal({ default: 0 }),\n\n // Sales\n totalSold: field.int({ default: 0 }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n publishedAt: field.dateTime({ isOptional: true }),\n\n // Relations\n store: field.belongsTo('Store', ['storeId'], ['id']),\n variants: field.hasMany('ProductVariant'),\n orderItems: field.hasMany('OrderItem'),\n reviews: field.hasMany('Review'),\n },\n indexes: [\n index.unique(['storeId', 'slug']),\n index.on(['storeId', 'status']),\n index.on(['status', 'publishedAt']),\n index.on(['categoryId', 'status']),\n index.on(['averageRating']),\n index.on(['totalSold']),\n index.on(['price']),\n ],\n enums: [ProductStatusEnum, ProductTypeEnum],\n});\n\n/**\n * Product variant entity - variations of a product (size, color, etc.).\n */\nexport const ProductVariantEntity = defineEntity({\n name: 'ProductVariant',\n description: 'A variant of a product with specific options.',\n schema: 'marketplace',\n map: 'product_variant',\n fields: {\n id: field.id(),\n productId: field.foreignKey(),\n\n // Identity\n name: field.string({ description: 'Variant name (e.g., \"Large / Blue\")' }),\n\n // Options\n options: field.json({\n description: 'Variant options (e.g., {size: \"L\", color: \"Blue\"})',\n }),\n\n // Pricing\n price: field.decimal({ description: 'Variant-specific price' }),\n compareAtPrice: field.decimal({ isOptional: true }),\n\n // Inventory\n sku: field.string({ isOptional: true }),\n barcode: field.string({ isOptional: true }),\n quantity: field.int({ default: 0 }),\n\n // Media\n imageId: field.string({ isOptional: true }),\n\n // Status\n isActive: field.boolean({ default: true }),\n\n // Position\n position: field.int({ default: 0 }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n product: field.belongsTo('Product', ['productId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.on(['productId', 'sku']),\n index.on(['productId', 'position']),\n index.on(['barcode']),\n ],\n});\n\n/**\n * Category entity - product categorization.\n */\nexport const CategoryEntity = defineEntity({\n name: 'Category',\n description: 'Product category for organization.',\n schema: 'marketplace',\n map: 'category',\n fields: {\n id: field.id(),\n\n name: field.string(),\n slug: field.string(),\n description: field.string({ isOptional: true }),\n\n // Hierarchy\n parentId: field.string({ isOptional: true }),\n path: field.string({ description: 'Full path for hierarchical queries' }),\n level: field.int({ default: 0 }),\n\n // Display\n position: field.int({ default: 0 }),\n imageId: field.string({ isOptional: true }),\n\n // Status\n isActive: field.boolean({ default: true }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n parent: field.belongsTo('Category', ['parentId'], ['id']),\n children: field.hasMany('Category'),\n },\n indexes: [\n index.unique(['slug']),\n index.on(['parentId', 'position']),\n index.on(['path']),\n index.on(['isActive']),\n ],\n});\n"],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import * as _contractspec_lib_schema761 from "@contractspec/lib.schema";
2
+
3
+ //#region src/entities/review.d.ts
4
+ /**
5
+ * Review status enum.
6
+ */
7
+ declare const ReviewStatusEnum: _contractspec_lib_schema761.EntityEnumDef;
8
+ /**
9
+ * Review type enum.
10
+ */
11
+ declare const ReviewTypeEnum: _contractspec_lib_schema761.EntityEnumDef;
12
+ /**
13
+ * Review entity - customer reviews and ratings.
14
+ */
15
+ declare const ReviewEntity: _contractspec_lib_schema761.EntitySpec<{
16
+ id: _contractspec_lib_schema761.EntityScalarField;
17
+ type: _contractspec_lib_schema761.EntityEnumField;
18
+ productId: _contractspec_lib_schema761.EntityScalarField;
19
+ storeId: _contractspec_lib_schema761.EntityScalarField;
20
+ orderId: _contractspec_lib_schema761.EntityScalarField;
21
+ orderItemId: _contractspec_lib_schema761.EntityScalarField;
22
+ authorId: _contractspec_lib_schema761.EntityScalarField;
23
+ rating: _contractspec_lib_schema761.EntityScalarField;
24
+ title: _contractspec_lib_schema761.EntityScalarField;
25
+ content: _contractspec_lib_schema761.EntityScalarField;
26
+ isVerifiedPurchase: _contractspec_lib_schema761.EntityScalarField;
27
+ status: _contractspec_lib_schema761.EntityEnumField;
28
+ hasMedia: _contractspec_lib_schema761.EntityScalarField;
29
+ helpfulCount: _contractspec_lib_schema761.EntityScalarField;
30
+ notHelpfulCount: _contractspec_lib_schema761.EntityScalarField;
31
+ moderatedBy: _contractspec_lib_schema761.EntityScalarField;
32
+ moderatedAt: _contractspec_lib_schema761.EntityScalarField;
33
+ moderationNote: _contractspec_lib_schema761.EntityScalarField;
34
+ hasResponse: _contractspec_lib_schema761.EntityScalarField;
35
+ createdAt: _contractspec_lib_schema761.EntityScalarField;
36
+ updatedAt: _contractspec_lib_schema761.EntityScalarField;
37
+ product: _contractspec_lib_schema761.EntityRelationField;
38
+ store: _contractspec_lib_schema761.EntityRelationField;
39
+ responses: _contractspec_lib_schema761.EntityRelationField;
40
+ votes: _contractspec_lib_schema761.EntityRelationField;
41
+ }>;
42
+ /**
43
+ * Review response entity - seller responses to reviews.
44
+ */
45
+ declare const ReviewResponseEntity: _contractspec_lib_schema761.EntitySpec<{
46
+ id: _contractspec_lib_schema761.EntityScalarField;
47
+ reviewId: _contractspec_lib_schema761.EntityScalarField;
48
+ authorId: _contractspec_lib_schema761.EntityScalarField;
49
+ content: _contractspec_lib_schema761.EntityScalarField;
50
+ createdAt: _contractspec_lib_schema761.EntityScalarField;
51
+ updatedAt: _contractspec_lib_schema761.EntityScalarField;
52
+ review: _contractspec_lib_schema761.EntityRelationField;
53
+ }>;
54
+ /**
55
+ * Review vote entity - helpfulness votes.
56
+ */
57
+ declare const ReviewVoteEntity: _contractspec_lib_schema761.EntitySpec<{
58
+ id: _contractspec_lib_schema761.EntityScalarField;
59
+ reviewId: _contractspec_lib_schema761.EntityScalarField;
60
+ userId: _contractspec_lib_schema761.EntityScalarField;
61
+ isHelpful: _contractspec_lib_schema761.EntityScalarField;
62
+ createdAt: _contractspec_lib_schema761.EntityScalarField;
63
+ review: _contractspec_lib_schema761.EntityRelationField;
64
+ }>;
65
+ /**
66
+ * Review report entity - flagged reviews.
67
+ */
68
+ declare const ReviewReportEntity: _contractspec_lib_schema761.EntitySpec<{
69
+ id: _contractspec_lib_schema761.EntityScalarField;
70
+ reviewId: _contractspec_lib_schema761.EntityScalarField;
71
+ reporterId: _contractspec_lib_schema761.EntityScalarField;
72
+ reason: _contractspec_lib_schema761.EntityScalarField;
73
+ details: _contractspec_lib_schema761.EntityScalarField;
74
+ status: _contractspec_lib_schema761.EntityScalarField;
75
+ resolvedBy: _contractspec_lib_schema761.EntityScalarField;
76
+ resolvedAt: _contractspec_lib_schema761.EntityScalarField;
77
+ resolution: _contractspec_lib_schema761.EntityScalarField;
78
+ createdAt: _contractspec_lib_schema761.EntityScalarField;
79
+ review: _contractspec_lib_schema761.EntityRelationField;
80
+ }>;
81
+ //#endregion
82
+ export { ReviewEntity, ReviewReportEntity, ReviewResponseEntity, ReviewStatusEnum, ReviewTypeEnum, ReviewVoteEntity };
83
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","names":[],"sources":["../../src/entities/review.ts"],"sourcesContent":[],"mappings":";;;;;;AAUa,cAAA,gBAKX,EAAA,2BAAA,CAL2B,aAK3B;AAKF;AAUA;;cAVa,gBAKX,2BAAA,CALyB;;;;cAUd,0CAAY;MAgEvB,2BAAA,CAAA;;;;;;;;;;;;;;;;;;;0DAhEuB;EAAA,SAAA,+CAAA;EAqEZ,OAAA,iDAyBX;EAAA,KAAA,iDAAA;;;;;;;cAzBW,oBAAoB,8BAAA,UAAA,CAAA;EAAA,EAAA,EAyB/B,2BAAA,CAAA,iBAzB+B;EA8BpB,QAAA,+CAoBX;EAAA,QAAA,+CAAA;;;;;;;;AAKF;AA6BE,cAtDW,gBAsDX,8BAtD2B,UAsD3B,CAAA;MAlCA,2BAAA,CAAA;;;;;;;;;;cAKW,kBAAkB,8BAAA,UAAA,CAAA;EAAA,EAAA,EA6B7B,2BAAA,CAAA,iBA7B6B"}
@@ -0,0 +1,152 @@
1
+ import { defineEntity, defineEntityEnum, field, index } from "@contractspec/lib.schema";
2
+
3
+ //#region src/entities/review.ts
4
+ /**
5
+ * Review status enum.
6
+ */
7
+ const ReviewStatusEnum = defineEntityEnum({
8
+ name: "ReviewStatus",
9
+ values: [
10
+ "PENDING",
11
+ "APPROVED",
12
+ "REJECTED",
13
+ "FLAGGED"
14
+ ],
15
+ schema: "marketplace",
16
+ description: "Status of a review."
17
+ });
18
+ /**
19
+ * Review type enum.
20
+ */
21
+ const ReviewTypeEnum = defineEntityEnum({
22
+ name: "ReviewType",
23
+ values: [
24
+ "PRODUCT",
25
+ "STORE",
26
+ "ORDER"
27
+ ],
28
+ schema: "marketplace",
29
+ description: "Type of review."
30
+ });
31
+ /**
32
+ * Review entity - customer reviews and ratings.
33
+ */
34
+ const ReviewEntity = defineEntity({
35
+ name: "Review",
36
+ description: "A customer review on the marketplace.",
37
+ schema: "marketplace",
38
+ map: "review",
39
+ fields: {
40
+ id: field.id({ description: "Unique review ID" }),
41
+ type: field.enum("ReviewType", { default: "PRODUCT" }),
42
+ productId: field.string({ isOptional: true }),
43
+ storeId: field.string({ isOptional: true }),
44
+ orderId: field.string({ isOptional: true }),
45
+ orderItemId: field.string({ isOptional: true }),
46
+ authorId: field.foreignKey({ description: "Reviewer user ID" }),
47
+ rating: field.int({ description: "Rating 1-5" }),
48
+ title: field.string({ isOptional: true }),
49
+ content: field.string({ isOptional: true }),
50
+ isVerifiedPurchase: field.boolean({ default: false }),
51
+ status: field.enum("ReviewStatus", { default: "PENDING" }),
52
+ hasMedia: field.boolean({ default: false }),
53
+ helpfulCount: field.int({ default: 0 }),
54
+ notHelpfulCount: field.int({ default: 0 }),
55
+ moderatedBy: field.string({ isOptional: true }),
56
+ moderatedAt: field.dateTime({ isOptional: true }),
57
+ moderationNote: field.string({ isOptional: true }),
58
+ hasResponse: field.boolean({ default: false }),
59
+ createdAt: field.createdAt(),
60
+ updatedAt: field.updatedAt(),
61
+ product: field.belongsTo("Product", ["productId"], ["id"]),
62
+ store: field.belongsTo("Store", ["storeId"], ["id"]),
63
+ responses: field.hasMany("ReviewResponse"),
64
+ votes: field.hasMany("ReviewVote")
65
+ },
66
+ indexes: [
67
+ index.on([
68
+ "productId",
69
+ "status",
70
+ "createdAt"
71
+ ]),
72
+ index.on([
73
+ "storeId",
74
+ "status",
75
+ "createdAt"
76
+ ]),
77
+ index.on(["authorId"]),
78
+ index.on(["orderId"]),
79
+ index.on(["status"]),
80
+ index.on(["rating"]),
81
+ index.on(["isVerifiedPurchase", "status"])
82
+ ],
83
+ enums: [ReviewStatusEnum, ReviewTypeEnum]
84
+ });
85
+ /**
86
+ * Review response entity - seller responses to reviews.
87
+ */
88
+ const ReviewResponseEntity = defineEntity({
89
+ name: "ReviewResponse",
90
+ description: "A seller response to a review.",
91
+ schema: "marketplace",
92
+ map: "review_response",
93
+ fields: {
94
+ id: field.id(),
95
+ reviewId: field.foreignKey(),
96
+ authorId: field.foreignKey(),
97
+ content: field.string(),
98
+ createdAt: field.createdAt(),
99
+ updatedAt: field.updatedAt(),
100
+ review: field.belongsTo("Review", ["reviewId"], ["id"], { onDelete: "Cascade" })
101
+ },
102
+ indexes: [index.on(["reviewId"]), index.on(["authorId"])]
103
+ });
104
+ /**
105
+ * Review vote entity - helpfulness votes.
106
+ */
107
+ const ReviewVoteEntity = defineEntity({
108
+ name: "ReviewVote",
109
+ description: "A helpfulness vote on a review.",
110
+ schema: "marketplace",
111
+ map: "review_vote",
112
+ fields: {
113
+ id: field.id(),
114
+ reviewId: field.foreignKey(),
115
+ userId: field.foreignKey(),
116
+ isHelpful: field.boolean(),
117
+ createdAt: field.createdAt(),
118
+ review: field.belongsTo("Review", ["reviewId"], ["id"], { onDelete: "Cascade" })
119
+ },
120
+ indexes: [index.unique(["reviewId", "userId"]), index.on(["userId"])]
121
+ });
122
+ /**
123
+ * Review report entity - flagged reviews.
124
+ */
125
+ const ReviewReportEntity = defineEntity({
126
+ name: "ReviewReport",
127
+ description: "A report/flag on a review.",
128
+ schema: "marketplace",
129
+ map: "review_report",
130
+ fields: {
131
+ id: field.id(),
132
+ reviewId: field.foreignKey(),
133
+ reporterId: field.foreignKey(),
134
+ reason: field.string({ description: "Report reason category" }),
135
+ details: field.string({ isOptional: true }),
136
+ status: field.string({ default: "\"PENDING\"" }),
137
+ resolvedBy: field.string({ isOptional: true }),
138
+ resolvedAt: field.dateTime({ isOptional: true }),
139
+ resolution: field.string({ isOptional: true }),
140
+ createdAt: field.createdAt(),
141
+ review: field.belongsTo("Review", ["reviewId"], ["id"])
142
+ },
143
+ indexes: [
144
+ index.on(["reviewId"]),
145
+ index.on(["status"]),
146
+ index.on(["reporterId"])
147
+ ]
148
+ });
149
+
150
+ //#endregion
151
+ export { ReviewEntity, ReviewReportEntity, ReviewResponseEntity, ReviewStatusEnum, ReviewTypeEnum, ReviewVoteEntity };
152
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","names":[],"sources":["../../src/entities/review.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\n\n/**\n * Review status enum.\n */\nexport const ReviewStatusEnum = defineEntityEnum({\n name: 'ReviewStatus',\n values: ['PENDING', 'APPROVED', 'REJECTED', 'FLAGGED'] as const,\n schema: 'marketplace',\n description: 'Status of a review.',\n});\n\n/**\n * Review type enum.\n */\nexport const ReviewTypeEnum = defineEntityEnum({\n name: 'ReviewType',\n values: ['PRODUCT', 'STORE', 'ORDER'] as const,\n schema: 'marketplace',\n description: 'Type of review.',\n});\n\n/**\n * Review entity - customer reviews and ratings.\n */\nexport const ReviewEntity = defineEntity({\n name: 'Review',\n description: 'A customer review on the marketplace.',\n schema: 'marketplace',\n map: 'review',\n fields: {\n id: field.id({ description: 'Unique review ID' }),\n\n // Type and target\n type: field.enum('ReviewType', { default: 'PRODUCT' }),\n productId: field.string({ isOptional: true }),\n storeId: field.string({ isOptional: true }),\n orderId: field.string({ isOptional: true }),\n orderItemId: field.string({ isOptional: true }),\n\n // Author\n authorId: field.foreignKey({ description: 'Reviewer user ID' }),\n\n // Content\n rating: field.int({ description: 'Rating 1-5' }),\n title: field.string({ isOptional: true }),\n content: field.string({ isOptional: true }),\n\n // Verification\n isVerifiedPurchase: field.boolean({ default: false }),\n\n // Status\n status: field.enum('ReviewStatus', { default: 'PENDING' }),\n\n // Media (using file attachments)\n hasMedia: field.boolean({ default: false }),\n\n // Helpfulness\n helpfulCount: field.int({ default: 0 }),\n notHelpfulCount: field.int({ default: 0 }),\n\n // Moderation\n moderatedBy: field.string({ isOptional: true }),\n moderatedAt: field.dateTime({ isOptional: true }),\n moderationNote: field.string({ isOptional: true }),\n\n // Response\n hasResponse: field.boolean({ default: false }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n product: field.belongsTo('Product', ['productId'], ['id']),\n store: field.belongsTo('Store', ['storeId'], ['id']),\n responses: field.hasMany('ReviewResponse'),\n votes: field.hasMany('ReviewVote'),\n },\n indexes: [\n index.on(['productId', 'status', 'createdAt']),\n index.on(['storeId', 'status', 'createdAt']),\n index.on(['authorId']),\n index.on(['orderId']),\n index.on(['status']),\n index.on(['rating']),\n index.on(['isVerifiedPurchase', 'status']),\n ],\n enums: [ReviewStatusEnum, ReviewTypeEnum],\n});\n\n/**\n * Review response entity - seller responses to reviews.\n */\nexport const ReviewResponseEntity = defineEntity({\n name: 'ReviewResponse',\n description: 'A seller response to a review.',\n schema: 'marketplace',\n map: 'review_response',\n fields: {\n id: field.id(),\n reviewId: field.foreignKey(),\n\n // Author (usually store owner)\n authorId: field.foreignKey(),\n\n // Content\n content: field.string(),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n review: field.belongsTo('Review', ['reviewId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [index.on(['reviewId']), index.on(['authorId'])],\n});\n\n/**\n * Review vote entity - helpfulness votes.\n */\nexport const ReviewVoteEntity = defineEntity({\n name: 'ReviewVote',\n description: 'A helpfulness vote on a review.',\n schema: 'marketplace',\n map: 'review_vote',\n fields: {\n id: field.id(),\n reviewId: field.foreignKey(),\n userId: field.foreignKey(),\n\n isHelpful: field.boolean(),\n\n createdAt: field.createdAt(),\n\n // Relations\n review: field.belongsTo('Review', ['reviewId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [index.unique(['reviewId', 'userId']), index.on(['userId'])],\n});\n\n/**\n * Review report entity - flagged reviews.\n */\nexport const ReviewReportEntity = defineEntity({\n name: 'ReviewReport',\n description: 'A report/flag on a review.',\n schema: 'marketplace',\n map: 'review_report',\n fields: {\n id: field.id(),\n reviewId: field.foreignKey(),\n reporterId: field.foreignKey(),\n\n reason: field.string({ description: 'Report reason category' }),\n details: field.string({ isOptional: true }),\n\n // Status\n status: field.string({ default: '\"PENDING\"' }),\n resolvedBy: field.string({ isOptional: true }),\n resolvedAt: field.dateTime({ isOptional: true }),\n resolution: field.string({ isOptional: true }),\n\n createdAt: field.createdAt(),\n\n // Relations\n review: field.belongsTo('Review', ['reviewId'], ['id']),\n },\n indexes: [\n index.on(['reviewId']),\n index.on(['status']),\n index.on(['reporterId']),\n ],\n});\n"],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import * as _contractspec_lib_schema816 from "@contractspec/lib.schema";
2
+
3
+ //#region src/entities/store.d.ts
4
+ /**
5
+ * Store status enum.
6
+ */
7
+ declare const StoreStatusEnum: _contractspec_lib_schema816.EntityEnumDef;
8
+ /**
9
+ * Store type enum.
10
+ */
11
+ declare const StoreTypeEnum: _contractspec_lib_schema816.EntityEnumDef;
12
+ /**
13
+ * Store entity - a seller's storefront on the marketplace.
14
+ */
15
+ declare const StoreEntity: _contractspec_lib_schema816.EntitySpec<{
16
+ id: _contractspec_lib_schema816.EntityScalarField;
17
+ name: _contractspec_lib_schema816.EntityScalarField;
18
+ slug: _contractspec_lib_schema816.EntityScalarField;
19
+ description: _contractspec_lib_schema816.EntityScalarField;
20
+ status: _contractspec_lib_schema816.EntityEnumField;
21
+ type: _contractspec_lib_schema816.EntityEnumField;
22
+ ownerId: _contractspec_lib_schema816.EntityScalarField;
23
+ organizationId: _contractspec_lib_schema816.EntityScalarField;
24
+ logoFileId: _contractspec_lib_schema816.EntityScalarField;
25
+ bannerFileId: _contractspec_lib_schema816.EntityScalarField;
26
+ email: _contractspec_lib_schema816.EntityScalarField;
27
+ phone: _contractspec_lib_schema816.EntityScalarField;
28
+ website: _contractspec_lib_schema816.EntityScalarField;
29
+ country: _contractspec_lib_schema816.EntityScalarField;
30
+ currency: _contractspec_lib_schema816.EntityScalarField;
31
+ timezone: _contractspec_lib_schema816.EntityScalarField;
32
+ commissionRate: _contractspec_lib_schema816.EntityScalarField;
33
+ isVerified: _contractspec_lib_schema816.EntityScalarField;
34
+ verifiedAt: _contractspec_lib_schema816.EntityScalarField;
35
+ settings: _contractspec_lib_schema816.EntityScalarField;
36
+ metadata: _contractspec_lib_schema816.EntityScalarField;
37
+ totalProducts: _contractspec_lib_schema816.EntityScalarField;
38
+ totalOrders: _contractspec_lib_schema816.EntityScalarField;
39
+ totalRevenue: _contractspec_lib_schema816.EntityScalarField;
40
+ averageRating: _contractspec_lib_schema816.EntityScalarField;
41
+ createdAt: _contractspec_lib_schema816.EntityScalarField;
42
+ updatedAt: _contractspec_lib_schema816.EntityScalarField;
43
+ products: _contractspec_lib_schema816.EntityRelationField;
44
+ orders: _contractspec_lib_schema816.EntityRelationField;
45
+ payouts: _contractspec_lib_schema816.EntityRelationField;
46
+ }>;
47
+ /**
48
+ * Store category entity - categorization for stores.
49
+ */
50
+ declare const StoreCategoryEntity: _contractspec_lib_schema816.EntitySpec<{
51
+ id: _contractspec_lib_schema816.EntityScalarField;
52
+ storeId: _contractspec_lib_schema816.EntityScalarField;
53
+ categoryId: _contractspec_lib_schema816.EntityScalarField;
54
+ isPrimary: _contractspec_lib_schema816.EntityScalarField;
55
+ createdAt: _contractspec_lib_schema816.EntityScalarField;
56
+ store: _contractspec_lib_schema816.EntityRelationField;
57
+ }>;
58
+ //#endregion
59
+ export { StoreCategoryEntity, StoreEntity, StoreStatusEnum, StoreTypeEnum };
60
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","names":[],"sources":["../../src/entities/store.ts"],"sourcesContent":[],"mappings":";;;;;;AAUa,cAAA,eAKX,EAAA,2BAAA,CAL0B,aAK1B;AAKF;AAUA;;cAVa,eAKX,2BAAA,CALwB;;;;cAUb,yCAAW;MA8EtB,2BAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;8DA9EsB;EAAA,SAAA,+CAAA;EAmFX,SAAA,+CAkBX;EAAA,QAAA,iDAAA;;;;;;;AAlB8B,cAAnB,mBAAmB,8BAAA,UAAA,CAAA;MAkB9B,2BAAA,CAAA"}