@voyantjs/products 0.2.0 → 0.3.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.
Files changed (39) hide show
  1. package/dist/routes.d.ts +4 -4
  2. package/dist/schema-core.d.ts +897 -0
  3. package/dist/schema-core.d.ts.map +1 -0
  4. package/dist/schema-core.js +77 -0
  5. package/dist/schema-itinerary.d.ts +828 -0
  6. package/dist/schema-itinerary.d.ts.map +1 -0
  7. package/dist/schema-itinerary.js +77 -0
  8. package/dist/schema-relations.d.ts +99 -0
  9. package/dist/schema-relations.d.ts.map +1 -0
  10. package/dist/schema-relations.js +155 -0
  11. package/dist/schema-settings.d.ts +1749 -0
  12. package/dist/schema-settings.d.ts.map +1 -0
  13. package/dist/schema-settings.js +175 -0
  14. package/dist/schema-shared.d.ts +15 -0
  15. package/dist/schema-shared.d.ts.map +1 -0
  16. package/dist/schema-shared.js +91 -0
  17. package/dist/schema-taxonomy.d.ts +573 -0
  18. package/dist/schema-taxonomy.d.ts.map +1 -0
  19. package/dist/schema-taxonomy.js +65 -0
  20. package/dist/schema.d.ts +6 -4155
  21. package/dist/schema.d.ts.map +1 -1
  22. package/dist/schema.js +6 -653
  23. package/dist/service.d.ts +4 -4
  24. package/dist/validation-config.d.ts +233 -0
  25. package/dist/validation-config.d.ts.map +1 -0
  26. package/dist/validation-config.js +73 -0
  27. package/dist/validation-content.d.ts +358 -0
  28. package/dist/validation-content.d.ts.map +1 -0
  29. package/dist/validation-content.js +177 -0
  30. package/dist/validation-core.d.ts +268 -0
  31. package/dist/validation-core.d.ts.map +1 -0
  32. package/dist/validation-core.js +91 -0
  33. package/dist/validation-shared.d.ts +103 -0
  34. package/dist/validation-shared.d.ts.map +1 -0
  35. package/dist/validation-shared.js +86 -0
  36. package/dist/validation.d.ts +4 -854
  37. package/dist/validation.d.ts.map +1 -1
  38. package/dist/validation.js +4 -433
  39. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA;AACtC,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA"}
@@ -1,433 +1,4 @@
1
- import { booleanQueryParam } from "@voyantjs/db/helpers";
2
- import { typeIdSchema } from "@voyantjs/db/lib/typeid";
3
- import { z } from "zod";
4
- const productStatusSchema = z.enum(["draft", "active", "archived"]);
5
- const productOptionStatusSchema = z.enum(["draft", "active", "archived"]);
6
- const optionUnitTypeSchema = z.enum(["person", "group", "room", "vehicle", "service", "other"]);
7
- const productBookingModeSchema = z.enum([
8
- "date",
9
- "date_time",
10
- "open",
11
- "stay",
12
- "transfer",
13
- "itinerary",
14
- "other",
15
- ]);
16
- const productCapacityModeSchema = z.enum(["free_sale", "limited", "on_request"]);
17
- const productVisibilitySchema = z.enum(["public", "private", "hidden"]);
18
- const productActivationModeSchema = z.enum(["manual", "scheduled", "channel_controlled"]);
19
- const productTicketFulfillmentSchema = z.enum([
20
- "none",
21
- "per_booking",
22
- "per_participant",
23
- "per_item",
24
- ]);
25
- const productDeliveryFormatSchema = z.enum([
26
- "voucher",
27
- "ticket",
28
- "pdf",
29
- "qr_code",
30
- "barcode",
31
- "email",
32
- "mobile",
33
- "none",
34
- ]);
35
- const productCapabilitySchema = z.enum([
36
- "instant_confirmation",
37
- "on_request",
38
- "pickup_available",
39
- "dropoff_available",
40
- "guided",
41
- "private",
42
- "shared",
43
- "digital_ticket",
44
- "voucher_required",
45
- "external_inventory",
46
- "multi_day",
47
- "accommodation",
48
- "transport",
49
- ]);
50
- const productFeatureTypeSchema = z.enum([
51
- "inclusion",
52
- "exclusion",
53
- "highlight",
54
- "important_information",
55
- "other",
56
- ]);
57
- const productLocationTypeSchema = z.enum([
58
- "start",
59
- "end",
60
- "meeting_point",
61
- "pickup",
62
- "dropoff",
63
- "point_of_interest",
64
- "other",
65
- ]);
66
- const languageTagSchema = z
67
- .string()
68
- .min(2)
69
- .max(35)
70
- .regex(/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/);
71
- const serviceTypeSchema = z.enum([
72
- "accommodation",
73
- "transfer",
74
- "experience",
75
- "guide",
76
- "meal",
77
- "other",
78
- ]);
79
- // ---------- products ----------
80
- const productCoreSchema = z.object({
81
- name: z.string().min(1).max(255),
82
- status: productStatusSchema.default("draft"),
83
- description: z.string().optional().nullable(),
84
- bookingMode: productBookingModeSchema.default("date"),
85
- capacityMode: productCapacityModeSchema.default("limited"),
86
- timezone: z.string().max(100).optional().nullable(),
87
- visibility: productVisibilitySchema.default("private"),
88
- activated: z.boolean().default(false),
89
- reservationTimeoutMinutes: z.number().int().min(0).optional().nullable(),
90
- sellCurrency: z.string().min(3).max(3),
91
- facilityId: z.string().optional().nullable(),
92
- productTypeId: z.string().optional().nullable(),
93
- startDate: z.string().optional().nullable(),
94
- endDate: z.string().optional().nullable(),
95
- pax: z.number().int().positive().optional().nullable(),
96
- tags: z.array(z.string()).default([]),
97
- });
98
- const productPricingFields = {
99
- sellAmountCents: z.number().int().min(0).optional().nullable(),
100
- costAmountCents: z.number().int().min(0).optional().nullable(),
101
- marginPercent: z.number().int().optional().nullable(),
102
- };
103
- export const insertProductSchema = productCoreSchema.extend(productPricingFields);
104
- export const updateProductSchema = productCoreSchema.partial().extend(productPricingFields);
105
- export const selectProductSchema = productCoreSchema.extend({
106
- id: typeIdSchema("products"),
107
- sellAmountCents: z.number().int().nullable(),
108
- costAmountCents: z.number().int().nullable(),
109
- marginPercent: z.number().int().nullable(),
110
- createdAt: z.coerce.date(),
111
- updatedAt: z.coerce.date(),
112
- });
113
- export const productListQuerySchema = z.object({
114
- status: productStatusSchema.optional(),
115
- bookingMode: productBookingModeSchema.optional(),
116
- visibility: productVisibilitySchema.optional(),
117
- activated: booleanQueryParam.optional(),
118
- facilityId: z.string().optional(),
119
- search: z.string().optional(),
120
- limit: z.coerce.number().int().min(1).max(100).default(50),
121
- offset: z.coerce.number().int().min(0).default(0),
122
- });
123
- // ---------- product options ----------
124
- const productOptionCoreSchema = z.object({
125
- name: z.string().min(1).max(255),
126
- code: z.string().max(100).optional().nullable(),
127
- description: z.string().optional().nullable(),
128
- status: productOptionStatusSchema.default("draft"),
129
- isDefault: z.boolean().default(false),
130
- sortOrder: z.number().int().default(0),
131
- availableFrom: z.string().optional().nullable(),
132
- availableTo: z.string().optional().nullable(),
133
- });
134
- export const insertProductOptionSchema = productOptionCoreSchema;
135
- export const updateProductOptionSchema = productOptionCoreSchema.partial();
136
- export const productOptionListQuerySchema = z.object({
137
- productId: z.string().optional(),
138
- status: productOptionStatusSchema.optional(),
139
- limit: z.coerce.number().int().min(1).max(100).default(50),
140
- offset: z.coerce.number().int().min(0).default(0),
141
- });
142
- // ---------- option units ----------
143
- const optionUnitCoreSchema = z.object({
144
- name: z.string().min(1).max(255),
145
- code: z.string().max(100).optional().nullable(),
146
- description: z.string().optional().nullable(),
147
- unitType: optionUnitTypeSchema.default("person"),
148
- minQuantity: z.number().int().min(0).optional().nullable(),
149
- maxQuantity: z.number().int().min(0).optional().nullable(),
150
- minAge: z.number().int().min(0).optional().nullable(),
151
- maxAge: z.number().int().min(0).optional().nullable(),
152
- occupancyMin: z.number().int().min(0).optional().nullable(),
153
- occupancyMax: z.number().int().min(0).optional().nullable(),
154
- isRequired: z.boolean().default(false),
155
- isHidden: z.boolean().default(false),
156
- sortOrder: z.number().int().default(0),
157
- });
158
- export const insertOptionUnitSchema = optionUnitCoreSchema;
159
- export const updateOptionUnitSchema = optionUnitCoreSchema.partial();
160
- export const optionUnitListQuerySchema = z.object({
161
- optionId: z.string().optional(),
162
- unitType: optionUnitTypeSchema.optional(),
163
- limit: z.coerce.number().int().min(1).max(100).default(50),
164
- offset: z.coerce.number().int().min(0).default(0),
165
- });
166
- // ---------- product operating configuration ----------
167
- const activationSettingsCoreSchema = z.object({
168
- activationMode: productActivationModeSchema.default("manual"),
169
- activateAt: z.string().datetime().optional().nullable(),
170
- deactivateAt: z.string().datetime().optional().nullable(),
171
- sellAt: z.string().datetime().optional().nullable(),
172
- stopSellAt: z.string().datetime().optional().nullable(),
173
- });
174
- const ticketSettingsCoreSchema = z.object({
175
- fulfillmentMode: productTicketFulfillmentSchema.default("none"),
176
- defaultDeliveryFormat: productDeliveryFormatSchema.default("none"),
177
- ticketPerUnit: z.boolean().default(false),
178
- barcodeFormat: z.string().max(100).optional().nullable(),
179
- voucherMessage: z.string().optional().nullable(),
180
- ticketMessage: z.string().optional().nullable(),
181
- });
182
- const visibilitySettingsCoreSchema = z.object({
183
- isSearchable: z.boolean().default(false),
184
- isBookable: z.boolean().default(false),
185
- isFeatured: z.boolean().default(false),
186
- requiresAuthentication: z.boolean().default(false),
187
- });
188
- const capabilityCoreSchema = z.object({
189
- capability: productCapabilitySchema,
190
- enabled: z.boolean().default(true),
191
- notes: z.string().optional().nullable(),
192
- });
193
- const deliveryFormatCoreSchema = z.object({
194
- format: productDeliveryFormatSchema,
195
- isDefault: z.boolean().default(false),
196
- });
197
- export const insertProductActivationSettingSchema = activationSettingsCoreSchema;
198
- export const updateProductActivationSettingSchema = activationSettingsCoreSchema.partial();
199
- export const productActivationSettingListQuerySchema = z.object({
200
- productId: z.string().optional(),
201
- activationMode: productActivationModeSchema.optional(),
202
- limit: z.coerce.number().int().min(1).max(100).default(50),
203
- offset: z.coerce.number().int().min(0).default(0),
204
- });
205
- export const insertProductTicketSettingSchema = ticketSettingsCoreSchema;
206
- export const updateProductTicketSettingSchema = ticketSettingsCoreSchema.partial();
207
- export const productTicketSettingListQuerySchema = z.object({
208
- productId: z.string().optional(),
209
- fulfillmentMode: productTicketFulfillmentSchema.optional(),
210
- limit: z.coerce.number().int().min(1).max(100).default(50),
211
- offset: z.coerce.number().int().min(0).default(0),
212
- });
213
- export const insertProductVisibilitySettingSchema = visibilitySettingsCoreSchema;
214
- export const updateProductVisibilitySettingSchema = visibilitySettingsCoreSchema.partial();
215
- export const productVisibilitySettingListQuerySchema = z.object({
216
- productId: z.string().optional(),
217
- isSearchable: booleanQueryParam.optional(),
218
- isBookable: booleanQueryParam.optional(),
219
- limit: z.coerce.number().int().min(1).max(100).default(50),
220
- offset: z.coerce.number().int().min(0).default(0),
221
- });
222
- export const insertProductCapabilitySchema = capabilityCoreSchema;
223
- export const updateProductCapabilitySchema = capabilityCoreSchema.partial();
224
- export const productCapabilityListQuerySchema = z.object({
225
- productId: z.string().optional(),
226
- capability: productCapabilitySchema.optional(),
227
- enabled: booleanQueryParam.optional(),
228
- limit: z.coerce.number().int().min(1).max(100).default(50),
229
- offset: z.coerce.number().int().min(0).default(0),
230
- });
231
- export const insertProductDeliveryFormatSchema = deliveryFormatCoreSchema;
232
- export const updateProductDeliveryFormatSchema = deliveryFormatCoreSchema.partial();
233
- export const productDeliveryFormatListQuerySchema = z.object({
234
- productId: z.string().optional(),
235
- format: productDeliveryFormatSchema.optional(),
236
- limit: z.coerce.number().int().min(1).max(100).default(50),
237
- offset: z.coerce.number().int().min(0).default(0),
238
- });
239
- // ---------- structured content ----------
240
- const productFeatureCoreSchema = z.object({
241
- featureType: productFeatureTypeSchema.default("highlight"),
242
- title: z.string().min(1).max(255),
243
- description: z.string().optional().nullable(),
244
- sortOrder: z.number().int().default(0),
245
- });
246
- const productFaqCoreSchema = z.object({
247
- question: z.string().min(1).max(1000),
248
- answer: z.string().min(1).max(10000),
249
- sortOrder: z.number().int().default(0),
250
- });
251
- const productLocationCoreSchema = z.object({
252
- locationType: productLocationTypeSchema.default("point_of_interest"),
253
- title: z.string().min(1).max(255),
254
- address: z.string().max(1000).optional().nullable(),
255
- city: z.string().max(255).optional().nullable(),
256
- countryCode: z.string().min(2).max(2).optional().nullable(),
257
- latitude: z.number().min(-90).max(90).optional().nullable(),
258
- longitude: z.number().min(-180).max(180).optional().nullable(),
259
- googlePlaceId: z.string().max(255).optional().nullable(),
260
- applePlaceId: z.string().max(255).optional().nullable(),
261
- tripadvisorLocationId: z.string().max(255).optional().nullable(),
262
- sortOrder: z.number().int().default(0),
263
- });
264
- export const insertProductFeatureSchema = productFeatureCoreSchema;
265
- export const updateProductFeatureSchema = productFeatureCoreSchema.partial();
266
- export const productFeatureListQuerySchema = z.object({
267
- productId: z.string().optional(),
268
- featureType: productFeatureTypeSchema.optional(),
269
- limit: z.coerce.number().int().min(1).max(100).default(50),
270
- offset: z.coerce.number().int().min(0).default(0),
271
- });
272
- export const insertProductFaqSchema = productFaqCoreSchema;
273
- export const updateProductFaqSchema = productFaqCoreSchema.partial();
274
- export const productFaqListQuerySchema = z.object({
275
- productId: z.string().optional(),
276
- limit: z.coerce.number().int().min(1).max(100).default(50),
277
- offset: z.coerce.number().int().min(0).default(0),
278
- });
279
- export const insertProductLocationSchema = productLocationCoreSchema;
280
- export const updateProductLocationSchema = productLocationCoreSchema.partial();
281
- export const productLocationListQuerySchema = z.object({
282
- productId: z.string().optional(),
283
- locationType: productLocationTypeSchema.optional(),
284
- limit: z.coerce.number().int().min(1).max(100).default(50),
285
- offset: z.coerce.number().int().min(0).default(0),
286
- });
287
- // ---------- translations ----------
288
- const productTranslationCoreSchema = z.object({
289
- languageTag: languageTagSchema,
290
- slug: z.string().max(255).optional().nullable(),
291
- name: z.string().min(1).max(255),
292
- shortDescription: z.string().optional().nullable(),
293
- description: z.string().optional().nullable(),
294
- seoTitle: z.string().max(255).optional().nullable(),
295
- seoDescription: z.string().optional().nullable(),
296
- });
297
- const optionTranslationCoreSchema = z.object({
298
- languageTag: languageTagSchema,
299
- name: z.string().min(1).max(255),
300
- shortDescription: z.string().optional().nullable(),
301
- description: z.string().optional().nullable(),
302
- });
303
- export const insertProductTranslationSchema = productTranslationCoreSchema;
304
- export const updateProductTranslationSchema = productTranslationCoreSchema.partial();
305
- export const productTranslationListQuerySchema = z.object({
306
- productId: z.string().optional(),
307
- languageTag: languageTagSchema.optional(),
308
- limit: z.coerce.number().int().min(1).max(100).default(50),
309
- offset: z.coerce.number().int().min(0).default(0),
310
- });
311
- export const insertProductOptionTranslationSchema = optionTranslationCoreSchema;
312
- export const updateProductOptionTranslationSchema = optionTranslationCoreSchema.partial();
313
- export const productOptionTranslationListQuerySchema = z.object({
314
- optionId: z.string().optional(),
315
- languageTag: languageTagSchema.optional(),
316
- limit: z.coerce.number().int().min(1).max(100).default(50),
317
- offset: z.coerce.number().int().min(0).default(0),
318
- });
319
- export const insertOptionUnitTranslationSchema = optionTranslationCoreSchema;
320
- export const updateOptionUnitTranslationSchema = optionTranslationCoreSchema.partial();
321
- export const optionUnitTranslationListQuerySchema = z.object({
322
- unitId: z.string().optional(),
323
- languageTag: languageTagSchema.optional(),
324
- limit: z.coerce.number().int().min(1).max(100).default(50),
325
- offset: z.coerce.number().int().min(0).default(0),
326
- });
327
- // ---------- days ----------
328
- const dayCoreSchema = z.object({
329
- dayNumber: z.number().int().positive(),
330
- title: z.string().max(255).optional().nullable(),
331
- description: z.string().optional().nullable(),
332
- location: z.string().max(255).optional().nullable(),
333
- });
334
- export const insertDaySchema = dayCoreSchema;
335
- export const updateDaySchema = dayCoreSchema.partial();
336
- // ---------- day services ----------
337
- const dayServiceCoreSchema = z.object({
338
- serviceType: serviceTypeSchema,
339
- name: z.string().min(1).max(255),
340
- description: z.string().optional().nullable(),
341
- supplierServiceId: z.string().optional().nullable(),
342
- costCurrency: z.string().min(3).max(3),
343
- costAmountCents: z.number().int().min(0),
344
- quantity: z.number().int().positive().default(1),
345
- sortOrder: z.number().int().optional().nullable(),
346
- notes: z.string().optional().nullable(),
347
- });
348
- export const insertDayServiceSchema = dayServiceCoreSchema;
349
- export const updateDayServiceSchema = dayServiceCoreSchema.partial();
350
- // ---------- versions ----------
351
- export const insertVersionSchema = z.object({
352
- notes: z.string().max(10000).optional().nullable(),
353
- });
354
- // ---------- notes ----------
355
- export const insertProductNoteSchema = z.object({
356
- content: z.string().min(1).max(10000),
357
- });
358
- // ---------- product media ----------
359
- const productMediaTypeSchema = z.enum(["image", "video", "document"]);
360
- const productMediaCoreSchema = z.object({
361
- mediaType: productMediaTypeSchema,
362
- name: z.string().min(1).max(500),
363
- url: z.string().min(1).max(2048),
364
- storageKey: z.string().max(1024).optional().nullable(),
365
- mimeType: z.string().max(255).optional().nullable(),
366
- fileSize: z.number().int().min(0).optional().nullable(),
367
- altText: z.string().max(1000).optional().nullable(),
368
- sortOrder: z.number().int().default(0),
369
- isCover: z.boolean().default(false),
370
- });
371
- export const insertProductMediaSchema = productMediaCoreSchema.extend({
372
- dayId: z.string().optional().nullable(),
373
- });
374
- export const updateProductMediaSchema = productMediaCoreSchema.partial();
375
- export const productMediaListQuerySchema = z.object({
376
- dayId: z.string().optional(),
377
- mediaType: productMediaTypeSchema.optional(),
378
- limit: z.coerce.number().int().min(1).max(200).default(50),
379
- offset: z.coerce.number().int().min(0).default(0),
380
- });
381
- export const reorderProductMediaSchema = z.object({
382
- items: z.array(z.object({
383
- id: z.string(),
384
- sortOrder: z.number().int(),
385
- })),
386
- });
387
- // ---------- product types ----------
388
- const productTypeCoreSchema = z.object({
389
- name: z.string().min(1).max(255),
390
- code: z.string().min(1).max(100),
391
- description: z.string().optional().nullable(),
392
- sortOrder: z.number().int().default(0),
393
- active: z.boolean().default(true),
394
- metadata: z.record(z.string(), z.unknown()).optional().nullable(),
395
- });
396
- export const insertProductTypeSchema = productTypeCoreSchema;
397
- export const updateProductTypeSchema = productTypeCoreSchema.partial();
398
- export const productTypeListQuerySchema = z.object({
399
- active: booleanQueryParam.optional(),
400
- search: z.string().optional(),
401
- limit: z.coerce.number().int().min(1).max(200).default(50),
402
- offset: z.coerce.number().int().min(0).default(0),
403
- });
404
- // ---------- product categories ----------
405
- const productCategoryCoreSchema = z.object({
406
- name: z.string().min(1).max(255),
407
- slug: z.string().min(1).max(255),
408
- parentId: z.string().optional().nullable(),
409
- description: z.string().optional().nullable(),
410
- sortOrder: z.number().int().default(0),
411
- active: z.boolean().default(true),
412
- metadata: z.record(z.string(), z.unknown()).optional().nullable(),
413
- });
414
- export const insertProductCategorySchema = productCategoryCoreSchema;
415
- export const updateProductCategorySchema = productCategoryCoreSchema.partial();
416
- export const productCategoryListQuerySchema = z.object({
417
- parentId: z.string().optional(),
418
- active: booleanQueryParam.optional(),
419
- search: z.string().optional(),
420
- limit: z.coerce.number().int().min(1).max(200).default(50),
421
- offset: z.coerce.number().int().min(0).default(0),
422
- });
423
- // ---------- product tags ----------
424
- const productTagCoreSchema = z.object({
425
- name: z.string().min(1).max(255),
426
- });
427
- export const insertProductTagSchema = productTagCoreSchema;
428
- export const updateProductTagSchema = productTagCoreSchema.partial();
429
- export const productTagListQuerySchema = z.object({
430
- search: z.string().optional(),
431
- limit: z.coerce.number().int().min(1).max(200).default(50),
432
- offset: z.coerce.number().int().min(0).default(0),
433
- });
1
+ export * from "./validation-config.js";
2
+ export * from "./validation-content.js";
3
+ export * from "./validation-core.js";
4
+ export * from "./validation-shared.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/products",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "license": "FSL-1.1-Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -34,9 +34,9 @@
34
34
  "hono": "^4.12.10",
35
35
  "pdf-lib": "^1.17.1",
36
36
  "zod": "^4.3.6",
37
- "@voyantjs/core": "0.2.0",
38
- "@voyantjs/db": "0.2.0",
39
- "@voyantjs/hono": "0.2.0"
37
+ "@voyantjs/core": "0.3.0",
38
+ "@voyantjs/db": "0.3.0",
39
+ "@voyantjs/hono": "0.3.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "typescript": "^6.0.2",