@ventori/contracts 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/dist/index.d.mts +1917 -0
- package/dist/index.mjs +305 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +29 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
// src/common/pagination.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var PaginationQuerySchema = z.object({
|
|
4
|
+
page: z.coerce.number().int().positive().default(1),
|
|
5
|
+
pageSize: z.coerce.number().int().positive().max(100).default(20),
|
|
6
|
+
sortBy: z.string().optional(),
|
|
7
|
+
sortOrder: z.enum(["asc", "desc"]).default("desc")
|
|
8
|
+
});
|
|
9
|
+
var PaginationSchema = z.object({
|
|
10
|
+
page: z.number(),
|
|
11
|
+
pageSize: z.number(),
|
|
12
|
+
total: z.number(),
|
|
13
|
+
totalPages: z.number(),
|
|
14
|
+
hasNext: z.boolean(),
|
|
15
|
+
hasPrev: z.boolean()
|
|
16
|
+
});
|
|
17
|
+
var DataResponseSchema = (itemSchema) => z.object({
|
|
18
|
+
data: z.array(itemSchema),
|
|
19
|
+
pagination: PaginationSchema
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// src/common/error.schema.ts
|
|
23
|
+
import { z as z2 } from "zod";
|
|
24
|
+
var ErrorResponseSchema = z2.object({
|
|
25
|
+
message: z2.string(),
|
|
26
|
+
statusCode: z2.number(),
|
|
27
|
+
error: z2.string().optional(),
|
|
28
|
+
details: z2.record(z2.unknown()).optional()
|
|
29
|
+
});
|
|
30
|
+
var NotFoundResponseSchema = z2.object({
|
|
31
|
+
message: z2.string()
|
|
32
|
+
});
|
|
33
|
+
var ValidationErrorSchema = z2.object({
|
|
34
|
+
message: z2.string(),
|
|
35
|
+
statusCode: z2.number().default(400),
|
|
36
|
+
error: z2.string().default("Bad Request"),
|
|
37
|
+
details: z2.array(
|
|
38
|
+
z2.object({
|
|
39
|
+
field: z2.string(),
|
|
40
|
+
message: z2.string()
|
|
41
|
+
})
|
|
42
|
+
)
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// src/common/api-response.ts
|
|
46
|
+
import { z as z3 } from "zod";
|
|
47
|
+
var ApiSuccessResponseSchema = (dataSchema) => z3.object({
|
|
48
|
+
success: z3.literal(true),
|
|
49
|
+
data: dataSchema
|
|
50
|
+
});
|
|
51
|
+
var ApiErrorResponseSchema = z3.object({
|
|
52
|
+
success: z3.literal(false),
|
|
53
|
+
message: z3.string(),
|
|
54
|
+
statusCode: z3.number(),
|
|
55
|
+
error: z3.string().optional()
|
|
56
|
+
});
|
|
57
|
+
var ApiPaginatedResponseSchema = (itemSchema) => z3.object({
|
|
58
|
+
success: z3.literal(true),
|
|
59
|
+
...DataResponseSchema(itemSchema).shape
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// src/common/contract-instance.ts
|
|
63
|
+
import { initContract } from "@ts-rest/core";
|
|
64
|
+
var c = initContract();
|
|
65
|
+
|
|
66
|
+
// src/common/http-methods.ts
|
|
67
|
+
var HttpMethod = {
|
|
68
|
+
GET: "GET",
|
|
69
|
+
POST: "POST",
|
|
70
|
+
PUT: "PUT",
|
|
71
|
+
PATCH: "PATCH",
|
|
72
|
+
DELETE: "DELETE"
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// src/common/crud-factory.ts
|
|
76
|
+
function createCrudEndpoints(c2, resource, schemas, plural) {
|
|
77
|
+
const base4 = plural ?? `${resource}s`;
|
|
78
|
+
return {
|
|
79
|
+
list: {
|
|
80
|
+
method: HttpMethod.GET,
|
|
81
|
+
path: `/${base4}`,
|
|
82
|
+
query: PaginationQuerySchema,
|
|
83
|
+
responses: { 200: DataResponseSchema(schemas.entity) },
|
|
84
|
+
summary: `List all ${base4}`
|
|
85
|
+
},
|
|
86
|
+
findById: {
|
|
87
|
+
method: HttpMethod.GET,
|
|
88
|
+
path: `/${base4}/:id`,
|
|
89
|
+
responses: { 200: schemas.entity, 404: NotFoundResponseSchema },
|
|
90
|
+
summary: `Find ${resource} by ID`
|
|
91
|
+
},
|
|
92
|
+
create: {
|
|
93
|
+
method: HttpMethod.POST,
|
|
94
|
+
path: `/${base4}`,
|
|
95
|
+
body: schemas.create,
|
|
96
|
+
responses: { 201: schemas.entity },
|
|
97
|
+
summary: `Create a new ${resource}`
|
|
98
|
+
},
|
|
99
|
+
update: {
|
|
100
|
+
method: HttpMethod.PUT,
|
|
101
|
+
path: `/${base4}/:id`,
|
|
102
|
+
body: schemas.update,
|
|
103
|
+
responses: { 200: schemas.entity, 404: NotFoundResponseSchema },
|
|
104
|
+
summary: `Update ${resource} by ID`
|
|
105
|
+
},
|
|
106
|
+
remove: {
|
|
107
|
+
method: HttpMethod.DELETE,
|
|
108
|
+
path: `/${base4}/:id`,
|
|
109
|
+
body: c2.noBody(),
|
|
110
|
+
responses: { 204: c2.noBody(), 404: NotFoundResponseSchema },
|
|
111
|
+
summary: `Delete ${resource} by ID`
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// src/common/crud-handler.ts
|
|
117
|
+
function createCrudHandlers(service) {
|
|
118
|
+
return {
|
|
119
|
+
list: async ({ query }) => {
|
|
120
|
+
const data = await service.list(query);
|
|
121
|
+
return { status: 200, body: data };
|
|
122
|
+
},
|
|
123
|
+
findById: async ({ params }) => {
|
|
124
|
+
const entity = await service.findById(params.id);
|
|
125
|
+
if (!entity)
|
|
126
|
+
return { status: 404, body: { message: "Not found" } };
|
|
127
|
+
return { status: 200, body: entity };
|
|
128
|
+
},
|
|
129
|
+
create: async ({ body }) => {
|
|
130
|
+
const entity = await service.create(body);
|
|
131
|
+
return { status: 201, body: entity };
|
|
132
|
+
},
|
|
133
|
+
update: async ({
|
|
134
|
+
params,
|
|
135
|
+
body
|
|
136
|
+
}) => {
|
|
137
|
+
const entity = await service.update(params.id, body);
|
|
138
|
+
if (!entity)
|
|
139
|
+
return { status: 404, body: { message: "Not found" } };
|
|
140
|
+
return { status: 200, body: entity };
|
|
141
|
+
},
|
|
142
|
+
remove: async ({ params }) => {
|
|
143
|
+
await service.remove(params.id);
|
|
144
|
+
return { status: 204, body: void 0 };
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// src/user/user.schema.ts
|
|
150
|
+
import { z as z4 } from "zod";
|
|
151
|
+
var UserSchema = z4.object({
|
|
152
|
+
id: z4.string().uuid(),
|
|
153
|
+
email: z4.string().email(),
|
|
154
|
+
firstName: z4.string().min(1),
|
|
155
|
+
lastName: z4.string().min(1),
|
|
156
|
+
isActive: z4.boolean().default(true),
|
|
157
|
+
createdAt: z4.string().datetime(),
|
|
158
|
+
updatedAt: z4.string().datetime()
|
|
159
|
+
});
|
|
160
|
+
var CreateUserSchema = z4.object({
|
|
161
|
+
email: z4.string().email(),
|
|
162
|
+
firstName: z4.string().min(1),
|
|
163
|
+
lastName: z4.string().min(1),
|
|
164
|
+
password: z4.string().min(8)
|
|
165
|
+
});
|
|
166
|
+
var UpdateUserSchema = CreateUserSchema.partial().omit({ password: true }).extend({
|
|
167
|
+
isActive: z4.boolean().optional()
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
// src/user/user.contract.ts
|
|
171
|
+
var base = createCrudEndpoints(c, "user", {
|
|
172
|
+
entity: UserSchema,
|
|
173
|
+
create: CreateUserSchema,
|
|
174
|
+
update: UpdateUserSchema
|
|
175
|
+
});
|
|
176
|
+
var userContract = c.router({
|
|
177
|
+
...base
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// src/product/product.schema.ts
|
|
181
|
+
import { z as z5 } from "zod";
|
|
182
|
+
var ProductSchema = z5.object({
|
|
183
|
+
id: z5.string().uuid(),
|
|
184
|
+
code: z5.string().min(1),
|
|
185
|
+
name: z5.string().min(1),
|
|
186
|
+
description: z5.string().optional(),
|
|
187
|
+
categoryId: z5.string().uuid(),
|
|
188
|
+
unitOfMeasureId: z5.string().uuid(),
|
|
189
|
+
taxId: z5.string().uuid(),
|
|
190
|
+
isActive: z5.boolean().default(true),
|
|
191
|
+
createdAt: z5.string().datetime(),
|
|
192
|
+
updatedAt: z5.string().datetime()
|
|
193
|
+
});
|
|
194
|
+
var CreateProductSchema = z5.object({
|
|
195
|
+
code: z5.string().min(1),
|
|
196
|
+
name: z5.string().min(1),
|
|
197
|
+
description: z5.string().optional(),
|
|
198
|
+
categoryId: z5.string().uuid(),
|
|
199
|
+
unitOfMeasureId: z5.string().uuid(),
|
|
200
|
+
taxId: z5.string().uuid()
|
|
201
|
+
});
|
|
202
|
+
var UpdateProductSchema = CreateProductSchema.partial().extend({
|
|
203
|
+
isActive: z5.boolean().optional()
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// src/product/product.contract.ts
|
|
207
|
+
var base2 = createCrudEndpoints(c, "product", {
|
|
208
|
+
entity: ProductSchema,
|
|
209
|
+
create: CreateProductSchema,
|
|
210
|
+
update: UpdateProductSchema
|
|
211
|
+
});
|
|
212
|
+
var productContract = c.router({
|
|
213
|
+
...base2
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
// src/order/order.schema.ts
|
|
217
|
+
import { z as z6 } from "zod";
|
|
218
|
+
var OrderItemSchema = z6.object({
|
|
219
|
+
id: z6.string().uuid(),
|
|
220
|
+
orderId: z6.string().uuid(),
|
|
221
|
+
productId: z6.string().uuid(),
|
|
222
|
+
quantity: z6.number().positive(),
|
|
223
|
+
unitPrice: z6.number().positive(),
|
|
224
|
+
subtotal: z6.number().nonnegative(),
|
|
225
|
+
taxAmount: z6.number().nonnegative(),
|
|
226
|
+
total: z6.number().nonnegative()
|
|
227
|
+
});
|
|
228
|
+
var CreateOrderItemSchema = z6.object({
|
|
229
|
+
productId: z6.string().uuid(),
|
|
230
|
+
quantity: z6.number().positive(),
|
|
231
|
+
unitPrice: z6.number().positive()
|
|
232
|
+
});
|
|
233
|
+
var OrderStatusSchema = z6.enum([
|
|
234
|
+
"pending",
|
|
235
|
+
"confirmed",
|
|
236
|
+
"processing",
|
|
237
|
+
"shipped",
|
|
238
|
+
"delivered",
|
|
239
|
+
"cancelled"
|
|
240
|
+
]);
|
|
241
|
+
var OrderSchema = z6.object({
|
|
242
|
+
id: z6.string().uuid(),
|
|
243
|
+
orderNumber: z6.string().min(1),
|
|
244
|
+
clientId: z6.string().uuid(),
|
|
245
|
+
sellerId: z6.string().uuid().optional(),
|
|
246
|
+
status: OrderStatusSchema,
|
|
247
|
+
subtotal: z6.number().nonnegative(),
|
|
248
|
+
taxAmount: z6.number().nonnegative(),
|
|
249
|
+
discountAmount: z6.number().nonnegative().default(0),
|
|
250
|
+
total: z6.number().nonnegative(),
|
|
251
|
+
notes: z6.string().optional(),
|
|
252
|
+
createdAt: z6.string().datetime(),
|
|
253
|
+
updatedAt: z6.string().datetime(),
|
|
254
|
+
items: z6.array(OrderItemSchema).optional()
|
|
255
|
+
});
|
|
256
|
+
var CreateOrderSchema = z6.object({
|
|
257
|
+
clientId: z6.string().uuid(),
|
|
258
|
+
sellerId: z6.string().uuid().optional(),
|
|
259
|
+
notes: z6.string().optional(),
|
|
260
|
+
items: z6.array(CreateOrderItemSchema).min(1)
|
|
261
|
+
});
|
|
262
|
+
var UpdateOrderStatusSchema = z6.object({
|
|
263
|
+
status: OrderStatusSchema
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
// src/order/order.contract.ts
|
|
267
|
+
var base3 = createCrudEndpoints(c, "order", {
|
|
268
|
+
entity: OrderSchema,
|
|
269
|
+
create: CreateOrderSchema,
|
|
270
|
+
update: UpdateOrderStatusSchema
|
|
271
|
+
});
|
|
272
|
+
var orderContract = c.router({
|
|
273
|
+
...base3
|
|
274
|
+
});
|
|
275
|
+
export {
|
|
276
|
+
ApiErrorResponseSchema,
|
|
277
|
+
ApiPaginatedResponseSchema,
|
|
278
|
+
ApiSuccessResponseSchema,
|
|
279
|
+
CreateOrderItemSchema,
|
|
280
|
+
CreateOrderSchema,
|
|
281
|
+
CreateProductSchema,
|
|
282
|
+
CreateUserSchema,
|
|
283
|
+
DataResponseSchema,
|
|
284
|
+
ErrorResponseSchema,
|
|
285
|
+
HttpMethod,
|
|
286
|
+
NotFoundResponseSchema,
|
|
287
|
+
OrderItemSchema,
|
|
288
|
+
OrderSchema,
|
|
289
|
+
OrderStatusSchema,
|
|
290
|
+
PaginationQuerySchema,
|
|
291
|
+
PaginationSchema,
|
|
292
|
+
ProductSchema,
|
|
293
|
+
UpdateOrderStatusSchema,
|
|
294
|
+
UpdateProductSchema,
|
|
295
|
+
UpdateUserSchema,
|
|
296
|
+
UserSchema,
|
|
297
|
+
ValidationErrorSchema,
|
|
298
|
+
c,
|
|
299
|
+
createCrudEndpoints,
|
|
300
|
+
createCrudHandlers,
|
|
301
|
+
orderContract,
|
|
302
|
+
productContract,
|
|
303
|
+
userContract
|
|
304
|
+
};
|
|
305
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/pagination.ts","../src/common/error.schema.ts","../src/common/api-response.ts","../src/common/contract-instance.ts","../src/common/http-methods.ts","../src/common/crud-factory.ts","../src/common/crud-handler.ts","../src/user/user.schema.ts","../src/user/user.contract.ts","../src/product/product.schema.ts","../src/product/product.contract.ts","../src/order/order.schema.ts","../src/order/order.contract.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const PaginationQuerySchema = z.object({\n page: z.coerce.number().int().positive().default(1),\n pageSize: z.coerce.number().int().positive().max(100).default(20),\n sortBy: z.string().optional(),\n sortOrder: z.enum([\"asc\", \"desc\"]).default(\"desc\"),\n});\n\nexport type PaginationQuery = z.infer<typeof PaginationQuerySchema>;\n\nexport const PaginationSchema = z.object({\n page: z.number(),\n pageSize: z.number(),\n total: z.number(),\n totalPages: z.number(),\n hasNext: z.boolean(),\n hasPrev: z.boolean(),\n});\n\nexport type Pagination = z.infer<typeof PaginationSchema>;\n\nexport const DataResponseSchema = <T extends z.ZodTypeAny>(itemSchema: T) =>\n z.object({\n data: z.array(itemSchema),\n pagination: PaginationSchema,\n });\n\nexport type DataResponse<T> = {\n data: T[];\n pagination: Pagination;\n};\n","import { z } from \"zod\";\n\nexport const ErrorResponseSchema = z.object({\n message: z.string(),\n statusCode: z.number(),\n error: z.string().optional(),\n details: z.record(z.unknown()).optional(),\n});\n\nexport type ErrorResponse = z.infer<typeof ErrorResponseSchema>;\n\nexport const NotFoundResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const ValidationErrorSchema = z.object({\n message: z.string(),\n statusCode: z.number().default(400),\n error: z.string().default(\"Bad Request\"),\n details: z.array(\n z.object({\n field: z.string(),\n message: z.string(),\n }),\n ),\n});\n\nexport type ValidationError = z.infer<typeof ValidationErrorSchema>;\n","import { z } from \"zod\";\nimport { DataResponseSchema } from \"./pagination\";\n\nexport const ApiSuccessResponseSchema = <T extends z.ZodTypeAny>(\n dataSchema: T,\n) =>\n z.object({\n success: z.literal(true),\n data: dataSchema,\n });\n\nexport const ApiErrorResponseSchema = z.object({\n success: z.literal(false),\n message: z.string(),\n statusCode: z.number(),\n error: z.string().optional(),\n});\n\nexport const ApiPaginatedResponseSchema = <T extends z.ZodTypeAny>(\n itemSchema: T,\n) =>\n z.object({\n success: z.literal(true),\n ...DataResponseSchema(itemSchema).shape,\n });\n","import { initContract } from \"@ts-rest/core\";\n\nexport type ContractInstance = ReturnType<typeof initContract>;\n\nexport const c: ContractInstance = initContract();\n","export const HttpMethod = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n PATCH: 'PATCH',\n DELETE: 'DELETE',\n} as const;\n","import { z } from \"zod\";\nimport type { ContractInstance } from \"./contract-instance\";\nimport { HttpMethod } from \"./http-methods\";\nimport { PaginationQuerySchema, DataResponseSchema } from \"./pagination\";\nimport { NotFoundResponseSchema } from \"./error.schema\";\n\nexport function createCrudEndpoints<\n TEntity extends z.ZodTypeAny,\n TCreate extends z.ZodTypeAny,\n TUpdate extends z.ZodTypeAny,\n>(\n c: ContractInstance,\n resource: string,\n schemas: { entity: TEntity; create: TCreate; update: TUpdate },\n plural?: string,\n) {\n const base = plural ?? `${resource}s`;\n\n return {\n list: {\n method: HttpMethod.GET,\n path: `/${base}` as const,\n query: PaginationQuerySchema,\n responses: { 200: DataResponseSchema(schemas.entity) },\n summary: `List all ${base}`,\n },\n findById: {\n method: HttpMethod.GET,\n path: `/${base}/:id` as const,\n responses: { 200: schemas.entity, 404: NotFoundResponseSchema },\n summary: `Find ${resource} by ID`,\n },\n create: {\n method: HttpMethod.POST,\n path: `/${base}` as const,\n body: schemas.create,\n responses: { 201: schemas.entity },\n summary: `Create a new ${resource}`,\n },\n update: {\n method: HttpMethod.PUT,\n path: `/${base}/:id` as const,\n body: schemas.update,\n responses: { 200: schemas.entity, 404: NotFoundResponseSchema },\n summary: `Update ${resource} by ID`,\n },\n remove: {\n method: HttpMethod.DELETE,\n path: `/${base}/:id` as const,\n body: c.noBody(),\n responses: { 204: c.noBody(), 404: NotFoundResponseSchema },\n summary: `Delete ${resource} by ID`,\n },\n } as const;\n}\n","import type { PaginationQuery } from \"./pagination\";\nimport type { ICrudService } from \"./crud-service.interface\";\n\nexport function createCrudHandlers<T>(service: ICrudService<T>) {\n return {\n list: async ({ query }: { query: PaginationQuery }) => {\n const data = await service.list(query);\n return { status: 200 as const, body: data };\n },\n findById: async ({ params }: { params: { id: string } }) => {\n const entity = await service.findById(params.id);\n if (!entity)\n return { status: 404 as const, body: { message: \"Not found\" } };\n return { status: 200 as const, body: entity };\n },\n create: async ({ body }: { body: unknown }) => {\n const entity = await service.create(body);\n return { status: 201 as const, body: entity };\n },\n update: async ({\n params,\n body,\n }: {\n params: { id: string };\n body: unknown;\n }) => {\n const entity = await service.update(params.id, body);\n if (!entity)\n return { status: 404 as const, body: { message: \"Not found\" } };\n return { status: 200 as const, body: entity };\n },\n remove: async ({ params }: { params: { id: string } }) => {\n await service.remove(params.id);\n return { status: 204 as const, body: undefined };\n },\n };\n}\n","import { z } from \"zod\";\n\nexport const UserSchema = z.object({\n id: z.string().uuid(),\n email: z.string().email(),\n firstName: z.string().min(1),\n lastName: z.string().min(1),\n isActive: z.boolean().default(true),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n});\n\nexport const CreateUserSchema = z.object({\n email: z.string().email(),\n firstName: z.string().min(1),\n lastName: z.string().min(1),\n password: z.string().min(8),\n});\n\nexport const UpdateUserSchema = CreateUserSchema.partial()\n .omit({ password: true })\n .extend({\n isActive: z.boolean().optional(),\n });\n\nexport type User = z.infer<typeof UserSchema>;\nexport type CreateUser = z.infer<typeof CreateUserSchema>;\nexport type UpdateUser = z.infer<typeof UpdateUserSchema>;\n","import { c, createCrudEndpoints } from \"../common\";\nimport { UserSchema, CreateUserSchema, UpdateUserSchema } from \"./user.schema\";\n\nconst base = createCrudEndpoints(c, \"user\", {\n entity: UserSchema,\n create: CreateUserSchema,\n update: UpdateUserSchema,\n});\n\nexport const userContract = c.router({\n ...base,\n});\n","import { z } from 'zod';\n\nexport const ProductSchema = z.object({\n id: z.string().uuid(),\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n categoryId: z.string().uuid(),\n unitOfMeasureId: z.string().uuid(),\n taxId: z.string().uuid(),\n isActive: z.boolean().default(true),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n});\n\nexport const CreateProductSchema = z.object({\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n categoryId: z.string().uuid(),\n unitOfMeasureId: z.string().uuid(),\n taxId: z.string().uuid(),\n});\n\nexport const UpdateProductSchema = CreateProductSchema.partial().extend({\n isActive: z.boolean().optional(),\n});\n\nexport type Product = z.infer<typeof ProductSchema>;\nexport type CreateProduct = z.infer<typeof CreateProductSchema>;\nexport type UpdateProduct = z.infer<typeof UpdateProductSchema>;\n","import { c, createCrudEndpoints } from \"../common\";\nimport {\n ProductSchema,\n CreateProductSchema,\n UpdateProductSchema,\n} from \"./product.schema\";\n\nconst base = createCrudEndpoints(c, \"product\", {\n entity: ProductSchema,\n create: CreateProductSchema,\n update: UpdateProductSchema,\n});\n\nexport const productContract = c.router({\n ...base,\n});\n","import { z } from 'zod';\n\nexport const OrderItemSchema = z.object({\n id: z.string().uuid(),\n orderId: z.string().uuid(),\n productId: z.string().uuid(),\n quantity: z.number().positive(),\n unitPrice: z.number().positive(),\n subtotal: z.number().nonnegative(),\n taxAmount: z.number().nonnegative(),\n total: z.number().nonnegative(),\n});\n\nexport const CreateOrderItemSchema = z.object({\n productId: z.string().uuid(),\n quantity: z.number().positive(),\n unitPrice: z.number().positive(),\n});\n\nexport const OrderStatusSchema = z.enum([\n 'pending',\n 'confirmed',\n 'processing',\n 'shipped',\n 'delivered',\n 'cancelled',\n]);\n\nexport const OrderSchema = z.object({\n id: z.string().uuid(),\n orderNumber: z.string().min(1),\n clientId: z.string().uuid(),\n sellerId: z.string().uuid().optional(),\n status: OrderStatusSchema,\n subtotal: z.number().nonnegative(),\n taxAmount: z.number().nonnegative(),\n discountAmount: z.number().nonnegative().default(0),\n total: z.number().nonnegative(),\n notes: z.string().optional(),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n items: z.array(OrderItemSchema).optional(),\n});\n\nexport const CreateOrderSchema = z.object({\n clientId: z.string().uuid(),\n sellerId: z.string().uuid().optional(),\n notes: z.string().optional(),\n items: z.array(CreateOrderItemSchema).min(1),\n});\n\nexport const UpdateOrderStatusSchema = z.object({\n status: OrderStatusSchema,\n});\n\nexport type OrderItem = z.infer<typeof OrderItemSchema>;\nexport type CreateOrderItem = z.infer<typeof CreateOrderItemSchema>;\nexport type Order = z.infer<typeof OrderSchema>;\nexport type CreateOrder = z.infer<typeof CreateOrderSchema>;\nexport type UpdateOrderStatus = z.infer<typeof UpdateOrderStatusSchema>;\nexport type OrderStatus = z.infer<typeof OrderStatusSchema>;\n","import { c, createCrudEndpoints } from \"../common\";\nimport {\n OrderSchema,\n CreateOrderSchema,\n UpdateOrderStatusSchema,\n} from \"./order.schema\";\n\nconst base = createCrudEndpoints(c, \"order\", {\n entity: OrderSchema,\n create: CreateOrderSchema,\n update: UpdateOrderStatusSchema,\n});\n\nexport const orderContract = c.router({\n ...base,\n});\n"],"mappings":"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","names":["z","z","z","c","base","z","z","base","z","base"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ventori/contracts",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "Shared contracts for Ventori ERP — ts-rest routers, Zod schemas, and inferred types",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"@ts-rest/core": "^3.52.0",
|
|
10
|
+
"zod": "^3.24.0"
|
|
11
|
+
},
|
|
12
|
+
"devDependencies": {
|
|
13
|
+
"tsup": "^8.5.1",
|
|
14
|
+
"turbo": "^2.9.0",
|
|
15
|
+
"typescript": "^5.7.0"
|
|
16
|
+
},
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"!dist/**/*.tsbuildinfo"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsup",
|
|
26
|
+
"lint": "tsc --noEmit",
|
|
27
|
+
"clean": "rm -rf dist .turbo"
|
|
28
|
+
}
|
|
29
|
+
}
|