@voyantjs/storefront 0.3.0 → 0.4.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.
@@ -1,5 +1,10 @@
1
+ import { availabilitySlotStatusSchema } from "@voyantjs/availability/validation";
2
+ import { extraPricingModeSchema } from "@voyantjs/extras/validation";
1
3
  import { z } from "zod";
2
- const languageTagSchema = z.string().trim().regex(/^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$/);
4
+ const languageTagSchema = z
5
+ .string()
6
+ .trim()
7
+ .regex(/^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$/);
3
8
  const urlOrNullSchema = z.url().nullable();
4
9
  export const storefrontPaymentMethodCodeSchema = z.enum([
5
10
  "card",
@@ -122,3 +127,195 @@ export const storefrontSettingsSchema = z.object({
122
127
  methods: z.array(storefrontPaymentMethodSchema),
123
128
  }),
124
129
  });
130
+ export const storefrontDepartureStatusSchema = z.enum([
131
+ "open",
132
+ "closed",
133
+ "sold_out",
134
+ "cancelled",
135
+ "on_request",
136
+ ]);
137
+ export const storefrontDepartureRoomOccupancySchema = z.object({
138
+ adultsMin: z.number().int().min(0),
139
+ adultsMax: z.number().int().min(0),
140
+ childrenMax: z.number().int().min(0),
141
+ });
142
+ export const storefrontDepartureRoomPriceSchema = z.object({
143
+ amount: z.number(),
144
+ currencyCode: z.string(),
145
+ roomType: z.object({
146
+ id: z.string(),
147
+ name: z.string(),
148
+ occupancy: storefrontDepartureRoomOccupancySchema,
149
+ }),
150
+ });
151
+ export const storefrontDepartureRatePlanSchema = z.object({
152
+ id: z.string(),
153
+ active: z.boolean(),
154
+ name: z.string(),
155
+ pricingModel: z.string(),
156
+ basePrices: z.array(z.object({
157
+ amount: z.number(),
158
+ currencyCode: z.string(),
159
+ })),
160
+ roomPrices: z.array(storefrontDepartureRoomPriceSchema),
161
+ });
162
+ export const storefrontDepartureStartTimeSchema = z.object({
163
+ id: z.string(),
164
+ label: z.string().nullable(),
165
+ startTimeLocal: z.string(),
166
+ durationMinutes: z.number().int().nullable(),
167
+ });
168
+ export const storefrontDepartureSchema = z.object({
169
+ id: z.string(),
170
+ productId: z.string(),
171
+ itineraryId: z.string(),
172
+ optionId: z.string().nullable(),
173
+ dateLocal: z.string().nullable(),
174
+ startAt: z.string().nullable(),
175
+ endAt: z.string().nullable(),
176
+ timezone: z.string(),
177
+ startTime: storefrontDepartureStartTimeSchema.nullable(),
178
+ meetingPoint: z.string().nullable(),
179
+ capacity: z.number().int().nullable(),
180
+ remaining: z.number().int().nullable(),
181
+ departureStatus: storefrontDepartureStatusSchema,
182
+ nights: z.number().int().nullable(),
183
+ days: z.number().int().nullable(),
184
+ ratePlans: z.array(storefrontDepartureRatePlanSchema),
185
+ });
186
+ export const storefrontDepartureListQuerySchema = z.object({
187
+ optionId: z.string().optional(),
188
+ status: availabilitySlotStatusSchema.optional(),
189
+ dateFrom: z.string().date().optional(),
190
+ dateTo: z.string().date().optional(),
191
+ limit: z.coerce.number().int().min(1).max(250).default(100),
192
+ offset: z.coerce.number().int().min(0).default(0),
193
+ });
194
+ export const storefrontDepartureListResponseSchema = z.object({
195
+ data: z.array(storefrontDepartureSchema),
196
+ total: z.number().int(),
197
+ limit: z.number().int(),
198
+ offset: z.number().int(),
199
+ });
200
+ export const storefrontDeparturePricePreviewInputSchema = z.object({
201
+ pax: z
202
+ .object({
203
+ adults: z.coerce.number().int().min(0).default(1),
204
+ children: z.coerce.number().int().min(0).default(0),
205
+ infants: z.coerce.number().int().min(0).default(0),
206
+ })
207
+ .default({ adults: 1, children: 0, infants: 0 }),
208
+ currencyCode: z.string().trim().min(1).optional().nullable(),
209
+ rooms: z
210
+ .array(z.object({
211
+ unitId: z.string().trim().min(1),
212
+ occupancy: z.coerce.number().int().min(1).default(1),
213
+ quantity: z.coerce.number().int().min(1).default(1),
214
+ }))
215
+ .default([]),
216
+ extras: z
217
+ .array(z.object({
218
+ extraId: z.string().trim().min(1),
219
+ quantity: z.coerce.number().int().min(1).default(1),
220
+ }))
221
+ .default([]),
222
+ });
223
+ export const storefrontDeparturePriceLineItemSchema = z.object({
224
+ name: z.string(),
225
+ total: z.number(),
226
+ quantity: z.number().int().min(1),
227
+ unitPrice: z.number(),
228
+ });
229
+ export const storefrontDeparturePricePreviewSchema = z.object({
230
+ departureId: z.string(),
231
+ productId: z.string(),
232
+ optionId: z.string().nullable(),
233
+ currencyCode: z.string(),
234
+ basePrice: z.number(),
235
+ taxAmount: z.number(),
236
+ total: z.number(),
237
+ notes: z.string().nullable(),
238
+ lineItems: z.array(storefrontDeparturePriceLineItemSchema),
239
+ });
240
+ export const storefrontProductExtensionsQuerySchema = z.object({
241
+ optionId: z.string().optional(),
242
+ });
243
+ export const storefrontProductExtensionMediaSchema = z.object({
244
+ url: z.string().trim().min(1),
245
+ alt: z.string().trim().min(1).nullable(),
246
+ });
247
+ export const storefrontProductExtensionDetailSchema = z.object({
248
+ description: z.string().nullable(),
249
+ media: z.array(storefrontProductExtensionMediaSchema),
250
+ });
251
+ export const storefrontProductExtensionSchema = z.object({
252
+ id: z.string(),
253
+ name: z.string(),
254
+ label: z.string(),
255
+ required: z.boolean(),
256
+ selectable: z.boolean(),
257
+ hasOptions: z.boolean(),
258
+ refProductId: z.string().nullable(),
259
+ thumb: z.string().nullable(),
260
+ pricePerPerson: z.number().nullable(),
261
+ currencyCode: z.string(),
262
+ pricingMode: extraPricingModeSchema,
263
+ defaultQuantity: z.number().int().nullable(),
264
+ minQuantity: z.number().int().nullable(),
265
+ maxQuantity: z.number().int().nullable(),
266
+ });
267
+ export const storefrontProductExtensionsResponseSchema = z.object({
268
+ extensions: z.array(storefrontProductExtensionSchema),
269
+ items: z.array(storefrontProductExtensionSchema),
270
+ details: z.record(z.string(), storefrontProductExtensionDetailSchema),
271
+ currencyCode: z.string(),
272
+ });
273
+ export const storefrontDepartureItinerarySegmentSchema = z.object({
274
+ id: z.string(),
275
+ title: z.string(),
276
+ description: z.string().nullable(),
277
+ });
278
+ export const storefrontDepartureItineraryDaySchema = z.object({
279
+ id: z.string(),
280
+ title: z.string(),
281
+ description: z.string().nullable(),
282
+ thumbnail: z
283
+ .object({
284
+ url: z.string().trim().min(1),
285
+ })
286
+ .nullable(),
287
+ segments: z.array(storefrontDepartureItinerarySegmentSchema),
288
+ });
289
+ export const storefrontDepartureItinerarySchema = z.object({
290
+ id: z.string(),
291
+ days: z.array(storefrontDepartureItineraryDaySchema),
292
+ });
293
+ export const storefrontPromotionalOfferSchema = z.object({
294
+ id: z.string(),
295
+ name: z.string(),
296
+ slug: z.string().nullable(),
297
+ description: z.string().nullable(),
298
+ discountType: z.enum(["percentage", "fixed_amount"]),
299
+ discountValue: z.string(),
300
+ currency: z.string().nullable(),
301
+ applicableProductIds: z.array(z.string()),
302
+ applicableDepartureIds: z.array(z.string()),
303
+ validFrom: z.string().nullable(),
304
+ validTo: z.string().nullable(),
305
+ minPassengers: z.number().int().nullable(),
306
+ imageMobileUrl: z.string().nullable(),
307
+ imageDesktopUrl: z.string().nullable(),
308
+ stackable: z.boolean(),
309
+ createdAt: z.string(),
310
+ updatedAt: z.string(),
311
+ });
312
+ export const storefrontPromotionalOfferListQuerySchema = z.object({
313
+ departureId: z.string().optional(),
314
+ locale: z.string().trim().min(2).optional(),
315
+ });
316
+ export const storefrontPromotionalOfferListResponseSchema = z.object({
317
+ data: z.array(storefrontPromotionalOfferSchema),
318
+ });
319
+ export const storefrontPromotionalOfferResponseSchema = z.object({
320
+ data: storefrontPromotionalOfferSchema,
321
+ });
package/package.json CHANGED
@@ -1,62 +1,62 @@
1
1
  {
2
2
  "name": "@voyantjs/storefront",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "license": "FSL-1.1-Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
7
- ".": "./src/index.ts",
8
- "./public-routes": "./src/routes-public.ts",
9
- "./service": "./src/service.ts",
10
- "./validation": "./src/validation.ts"
11
- },
12
- "scripts": {
13
- "typecheck": "tsc --noEmit",
14
- "lint": "biome check src/",
15
- "test": "vitest run",
16
- "build": "pnpm run clean && tsc -p tsconfig.json",
17
- "clean": "rm -rf dist",
18
- "prepack": "pnpm run build"
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ },
11
+ "./public-routes": {
12
+ "types": "./dist/routes-public.d.ts",
13
+ "import": "./dist/routes-public.js"
14
+ },
15
+ "./service": {
16
+ "types": "./dist/service.d.ts",
17
+ "import": "./dist/service.js"
18
+ },
19
+ "./validation": {
20
+ "types": "./dist/validation.d.ts",
21
+ "import": "./dist/validation.js"
22
+ }
19
23
  },
20
24
  "dependencies": {
21
- "@voyantjs/core": "workspace:*",
22
- "@voyantjs/hono": "workspace:*",
25
+ "drizzle-orm": "^0.45.2",
23
26
  "hono": "^4.12.10",
24
- "zod": "^4.3.6"
27
+ "zod": "^4.3.6",
28
+ "@voyantjs/availability": "0.4.0",
29
+ "@voyantjs/core": "0.4.0",
30
+ "@voyantjs/pricing": "0.4.0",
31
+ "@voyantjs/hono": "0.4.0",
32
+ "@voyantjs/extras": "0.4.0",
33
+ "@voyantjs/products": "0.4.0",
34
+ "@voyantjs/sellability": "0.4.0"
25
35
  },
26
36
  "devDependencies": {
27
- "@voyantjs/voyant-typescript-config": "workspace:*",
28
37
  "typescript": "^6.0.2",
29
- "vitest": "^4.1.2"
38
+ "vitest": "^4.1.2",
39
+ "@voyantjs/db": "0.4.0",
40
+ "@voyantjs/voyant-typescript-config": "0.1.0"
30
41
  },
31
42
  "files": [
32
43
  "dist"
33
44
  ],
34
45
  "publishConfig": {
35
- "access": "public",
36
- "exports": {
37
- ".": {
38
- "types": "./dist/index.d.ts",
39
- "import": "./dist/index.js"
40
- },
41
- "./public-routes": {
42
- "types": "./dist/routes-public.d.ts",
43
- "import": "./dist/routes-public.js"
44
- },
45
- "./service": {
46
- "types": "./dist/service.d.ts",
47
- "import": "./dist/service.js"
48
- },
49
- "./validation": {
50
- "types": "./dist/validation.d.ts",
51
- "import": "./dist/validation.js"
52
- }
53
- },
54
- "main": "./dist/index.js",
55
- "types": "./dist/index.d.ts"
46
+ "access": "public"
56
47
  },
57
48
  "repository": {
58
49
  "type": "git",
59
50
  "url": "https://github.com/voyantjs/voyant.git",
60
51
  "directory": "packages/storefront"
61
- }
62
- }
52
+ },
53
+ "scripts": {
54
+ "typecheck": "tsc --noEmit",
55
+ "lint": "biome check src/",
56
+ "test": "vitest run",
57
+ "build": "pnpm run clean && tsc -p tsconfig.json",
58
+ "clean": "rm -rf dist"
59
+ },
60
+ "main": "./dist/index.js",
61
+ "types": "./dist/index.d.ts"
62
+ }