@voyantjs/bookings 0.52.4 → 0.53.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/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/route-runtime.d.ts +42 -0
- package/dist/route-runtime.d.ts.map +1 -1
- package/dist/route-runtime.js +2 -0
- package/dist/routes-public.d.ts.map +1 -1
- package/dist/routes-public.js +20 -3
- package/dist/service-public.d.ts +16 -3
- package/dist/service-public.d.ts.map +1 -1
- package/dist/service-public.js +77 -6
- package/package.json +7 -7
package/dist/index.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface BookingsHonoModuleOptions extends BookingRouteRuntimeOptions {
|
|
|
20
20
|
}
|
|
21
21
|
export declare function createBookingsHonoModule(options?: BookingsHonoModuleOptions): HonoModule;
|
|
22
22
|
export declare const bookingsHonoModule: HonoModule;
|
|
23
|
-
export type { BookingRouteRuntime, BookingRouteRuntimeOptions, ResolveBookingKmsProvider, } from "./route-runtime.js";
|
|
23
|
+
export type { BookingPersonResolverContact, BookingRouteRuntime, BookingRouteRuntimeOptions, ResolveBookingBillingPerson, ResolveBookingKmsProvider, ResolveBookingTravelerPerson, ResolveBookingTravelSnapshot, } from "./route-runtime.js";
|
|
24
24
|
export { BOOKING_ROUTE_RUNTIME_CONTAINER_KEY, buildBookingRouteRuntime, } from "./route-runtime.js";
|
|
25
25
|
export type { BookingActionLedgerListResponse, BookingRoutes } from "./routes.js";
|
|
26
26
|
export type { PublicBookingRoutes } from "./routes-public.js";
|
|
@@ -29,6 +29,6 @@ export type { BookingTravelerBedPreference, BookingTravelerDietary, BookingTrave
|
|
|
29
29
|
export { bookingTravelerBedPreferenceSchema, bookingTravelerDietarySchema, bookingTravelerIdentitySchema, bookingTravelerTravelDetailInsertSchema, bookingTravelerTravelDetailSelectSchema, bookingTravelerTravelDetails, bookingTravelerTravelDetailUpdateSchema, decryptedBookingTravelerTravelDetailSchema, travelerAllocationMapSchema, } from "./schema/travel-details.js";
|
|
30
30
|
export type { Booking, BookingActivity, BookingAllocation, BookingDocument, BookingFulfillment, BookingGroup, BookingGroupMember, BookingItem, BookingItemTraveler, BookingNote, BookingPiiAccessLog, BookingPriceOverride, BookingRedemptionEvent, BookingSessionState, BookingStaffAssignment, BookingSupplierStatus, BookingTraveler, NewBooking, NewBookingActivity, NewBookingAllocation, NewBookingDocument, NewBookingFulfillment, NewBookingGroup, NewBookingGroupMember, NewBookingItem, NewBookingItemTraveler, NewBookingNote, NewBookingPiiAccessLog, NewBookingRedemptionEvent, NewBookingSessionState, NewBookingStaffAssignment, NewBookingSupplierStatus, NewBookingTraveler, } from "./schema.js";
|
|
31
31
|
export { bookingActivityLog, bookingAllocations, bookingDocuments, bookingFulfillments, bookingGroupKindEnum, bookingGroupMemberRoleEnum, bookingGroupMembers, bookingGroups, bookingItems, bookingItemTravelers, bookingNotes, bookingPiiAccessLog, bookingRedemptionEvents, bookingSessionStates, bookingStaffAssignments, bookingSupplierStatuses, bookings, bookingTravelers, } from "./schema.js";
|
|
32
|
-
export { publicBookingsService, resolveSessionPricingSnapshot } from "./service-public.js";
|
|
32
|
+
export { type PublicBookingsServiceResolvers, publicBookingsService, resolveSessionPricingSnapshot, } from "./service-public.js";
|
|
33
33
|
export { addBookingGroupMemberSchema, bookingGroupKindSchema, bookingGroupListQuerySchema, bookingGroupMemberRoleSchema, bookingListQuerySchema, bookingPriceOverrideSchema, cancelBookingSchema, completeBookingSchema, confirmBookingSchema, convertProductSchema, createBookingSchema, createTravelerWithTravelDetailsSchema, expireBookingSchema, expireStaleBookingsSchema, extendBookingHoldSchema, insertBookingAllocationSchema, insertBookingDocumentSchema, insertBookingFulfillmentSchema, insertBookingGroupSchema, insertBookingItemSchema, insertBookingItemTravelerSchema, insertBookingNoteSchema, insertBookingSchema, insertBookingTravelerDocumentSchema, insertSupplierStatusSchema, insertTravelerSchema, internalBookingOverviewLookupQuerySchema, overrideBookingStatusSchema, pricingPreviewSchema, publicBookingOverviewLookupQuerySchema, publicBookingSessionMutationSchema, publicBookingSessionRepriceItemSchema, publicBookingSessionRepriceResultSchema, publicBookingSessionRepriceSummarySchema, publicBookingSessionStateSchema, publicCreateBookingSessionSchema, publicRepriceBookingSessionSchema, publicUpdateBookingSessionSchema, publicUpsertBookingSessionStateSchema, recordBookingRedemptionSchema, reserveBookingFromTransactionSchema, reserveBookingSchema, sharingGroupsForSlotQuerySchema, startBookingSchema, updateBookingAllocationSchema, updateBookingFulfillmentSchema, updateBookingGroupSchema, updateBookingItemSchema, updateBookingSchema, updateSupplierStatusSchema, updateTravelerSchema, updateTravelerWithTravelDetailsSchema, upsertTravelerTravelDetailsSchema, } from "./validation.js";
|
|
34
34
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAEL,KAAK,0BAA0B,EAEhC,MAAM,oBAAoB,CAAA;AAI3B,OAAO,EACL,kCAAkC,EAClC,2BAA2B,EAC3B,2BAA2B,EAC3B,qCAAqC,GACtC,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,uBAAuB,EACvB,KAAK,sCAAsC,GAC5C,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,KAAK,gBAAgB,EACrB,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,iCAAiC,EACjC,kCAAkC,EAClC,kBAAkB,EAClB,oCAAoC,EACpC,oCAAoC,GACrC,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EAClC,oBAAoB,EACpB,KAAK,uBAAuB,EAC5B,yBAAyB,EACzB,KAAK,uBAAuB,GAC7B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,KAAK,2BAA2B,EAChC,2BAA2B,GAC5B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,6BAA6B,EAClC,uBAAuB,GACxB,MAAM,kBAAkB,CAAA;AAEzB,eAAO,MAAM,eAAe,EAAE,kBAK7B,CAAA;AAED,eAAO,MAAM,gBAAgB;;CAE5B,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,MAG5B,CAAA;AAED,MAAM,WAAW,yBAA0B,SAAQ,0BAA0B;CAAG;AAEhF,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,yBAA8B,GAAG,UAAU,CAiB5F;AAED,eAAO,MAAM,kBAAkB,EAAE,UAAuC,CAAA;AAExE,YAAY,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -42,5 +42,5 @@ export { BOOKING_ROUTE_RUNTIME_CONTAINER_KEY, buildBookingRouteRuntime, } from "
|
|
|
42
42
|
export { publicBookingRoutes } from "./routes-public.js";
|
|
43
43
|
export { bookingTravelerBedPreferenceSchema, bookingTravelerDietarySchema, bookingTravelerIdentitySchema, bookingTravelerTravelDetailInsertSchema, bookingTravelerTravelDetailSelectSchema, bookingTravelerTravelDetails, bookingTravelerTravelDetailUpdateSchema, decryptedBookingTravelerTravelDetailSchema, travelerAllocationMapSchema, } from "./schema/travel-details.js";
|
|
44
44
|
export { bookingActivityLog, bookingAllocations, bookingDocuments, bookingFulfillments, bookingGroupKindEnum, bookingGroupMemberRoleEnum, bookingGroupMembers, bookingGroups, bookingItems, bookingItemTravelers, bookingNotes, bookingPiiAccessLog, bookingRedemptionEvents, bookingSessionStates, bookingStaffAssignments, bookingSupplierStatuses, bookings, bookingTravelers, } from "./schema.js";
|
|
45
|
-
export { publicBookingsService, resolveSessionPricingSnapshot } from "./service-public.js";
|
|
45
|
+
export { publicBookingsService, resolveSessionPricingSnapshot, } from "./service-public.js";
|
|
46
46
|
export { addBookingGroupMemberSchema, bookingGroupKindSchema, bookingGroupListQuerySchema, bookingGroupMemberRoleSchema, bookingListQuerySchema, bookingPriceOverrideSchema, cancelBookingSchema, completeBookingSchema, confirmBookingSchema, convertProductSchema, createBookingSchema, createTravelerWithTravelDetailsSchema, expireBookingSchema, expireStaleBookingsSchema, extendBookingHoldSchema, insertBookingAllocationSchema, insertBookingDocumentSchema, insertBookingFulfillmentSchema, insertBookingGroupSchema, insertBookingItemSchema, insertBookingItemTravelerSchema, insertBookingNoteSchema, insertBookingSchema, insertBookingTravelerDocumentSchema, insertSupplierStatusSchema, insertTravelerSchema, internalBookingOverviewLookupQuerySchema, overrideBookingStatusSchema, pricingPreviewSchema, publicBookingOverviewLookupQuerySchema, publicBookingSessionMutationSchema, publicBookingSessionRepriceItemSchema, publicBookingSessionRepriceResultSchema, publicBookingSessionRepriceSummarySchema, publicBookingSessionStateSchema, publicCreateBookingSessionSchema, publicRepriceBookingSessionSchema, publicUpdateBookingSessionSchema, publicUpsertBookingSessionStateSchema, recordBookingRedemptionSchema, reserveBookingFromTransactionSchema, reserveBookingSchema, sharingGroupsForSlotQuerySchema, startBookingSchema, updateBookingAllocationSchema, updateBookingFulfillmentSchema, updateBookingGroupSchema, updateBookingItemSchema, updateBookingSchema, updateSupplierStatusSchema, updateTravelerSchema, updateTravelerWithTravelDetailsSchema, upsertTravelerTravelDetailsSchema, } from "./validation.js";
|
package/dist/route-runtime.d.ts
CHANGED
|
@@ -15,9 +15,49 @@ export declare const BOOKING_ROUTE_RUNTIME_CONTAINER_KEY = "runtime.bookings.rou
|
|
|
15
15
|
export type ResolveBookingTravelSnapshot = (db: PostgresJsDatabase, personId: string, ctx: {
|
|
16
16
|
kms: KmsProvider;
|
|
17
17
|
}) => Promise<BookingTravelerSnapshot | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Best-effort contact snapshot the booking-session bootstrap + update
|
|
20
|
+
* flows hand to the caller's person resolver. Mirrors the storefront
|
|
21
|
+
* lead-intake `StorefrontLeadContact` shape so the same resolver can
|
|
22
|
+
* service both surfaces.
|
|
23
|
+
*/
|
|
24
|
+
export interface BookingPersonResolverContact {
|
|
25
|
+
firstName: string | null;
|
|
26
|
+
lastName: string | null;
|
|
27
|
+
email: string | null;
|
|
28
|
+
phone: string | null;
|
|
29
|
+
preferredLanguage: string | null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolves (or upserts) a CRM person from a booking's billing contact
|
|
33
|
+
* snapshot. Returns the resolved person id, or `null` to leave the
|
|
34
|
+
* booking's `person_id` unset. Templates wire this from
|
|
35
|
+
* `crmService.upsertPersonFromContact` so the bookings package stays
|
|
36
|
+
* free of any direct CRM dependency — see issue #961.
|
|
37
|
+
*/
|
|
38
|
+
export type ResolveBookingBillingPerson = (db: PostgresJsDatabase, contact: BookingPersonResolverContact, ctx: {
|
|
39
|
+
bookingId: string;
|
|
40
|
+
source: string;
|
|
41
|
+
sourceRef: string;
|
|
42
|
+
}) => Promise<string | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Resolves (or upserts) a CRM person from a booking traveler payload.
|
|
45
|
+
* Called from `publicBookingsService.createSession` /
|
|
46
|
+
* `updateSession` per-traveler so storefront-originated bookings
|
|
47
|
+
* produce CRM person links per traveler (not just for the billing
|
|
48
|
+
* contact). Returns the resolved person id, or `null` to keep
|
|
49
|
+
* `booking_travelers.person_id` unset.
|
|
50
|
+
*/
|
|
51
|
+
export type ResolveBookingTravelerPerson = (db: PostgresJsDatabase, contact: BookingPersonResolverContact, ctx: {
|
|
52
|
+
bookingId: string;
|
|
53
|
+
source: string;
|
|
54
|
+
sourceRef: string;
|
|
55
|
+
}) => Promise<string | null>;
|
|
18
56
|
export interface BookingRouteRuntime {
|
|
19
57
|
getKmsProvider(): Promise<KmsProvider>;
|
|
20
58
|
resolveTravelSnapshot?: ResolveBookingTravelSnapshot;
|
|
59
|
+
resolveBillingPerson?: ResolveBookingBillingPerson;
|
|
60
|
+
resolveTravelerPerson?: ResolveBookingTravelerPerson;
|
|
21
61
|
}
|
|
22
62
|
/**
|
|
23
63
|
* Hook for apps that source their KMS key material from somewhere other than
|
|
@@ -30,6 +70,8 @@ export type ResolveBookingKmsProvider = (env: Record<string, string | undefined>
|
|
|
30
70
|
export interface BookingRouteRuntimeOptions {
|
|
31
71
|
resolveKmsProvider?: ResolveBookingKmsProvider;
|
|
32
72
|
resolveTravelSnapshot?: ResolveBookingTravelSnapshot;
|
|
73
|
+
resolveBillingPerson?: ResolveBookingBillingPerson;
|
|
74
|
+
resolveTravelerPerson?: ResolveBookingTravelerPerson;
|
|
33
75
|
}
|
|
34
76
|
export declare function buildBookingRouteRuntime(bindings: KmsBindings, options?: BookingRouteRuntimeOptions): BookingRouteRuntime;
|
|
35
77
|
//# sourceMappingURL=route-runtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-runtime.d.ts","sourceRoot":"","sources":["../src/route-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,eAAO,MAAM,mCAAmC,4BAA4B,CAAA;AAE5E;;;;;;;;GAQG;AACH,MAAM,MAAM,4BAA4B,GAAG,CACzC,EAAE,EAAE,kBAAkB,EACtB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;IAAE,GAAG,EAAE,WAAW,CAAA;CAAE,KACtB,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAA;AAE5C,MAAM,WAAW,mBAAmB;IAClC,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;IACtC,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;CACrD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG,CACtC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KACpC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAEvC,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,yBAAyB,CAAA;IAC9C,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;CACrD;AAgBD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"route-runtime.d.ts","sourceRoot":"","sources":["../src/route-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,eAAO,MAAM,mCAAmC,4BAA4B,CAAA;AAE5E;;;;;;;;GAQG;AACH,MAAM,MAAM,4BAA4B,GAAG,CACzC,EAAE,EAAE,kBAAkB,EACtB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;IAAE,GAAG,EAAE,WAAW,CAAA;CAAE,KACtB,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,2BAA2B,GAAG,CACxC,EAAE,EAAE,kBAAkB,EACtB,OAAO,EAAE,4BAA4B,EACrC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,KAC1D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;AAE3B;;;;;;;GAOG;AACH,MAAM,MAAM,4BAA4B,GAAG,CACzC,EAAE,EAAE,kBAAkB,EACtB,OAAO,EAAE,4BAA4B,EACrC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,KAC1D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;AAE3B,MAAM,WAAW,mBAAmB;IAClC,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;IACtC,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;IACpD,oBAAoB,CAAC,EAAE,2BAA2B,CAAA;IAClD,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;CACrD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG,CACtC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KACpC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAEvC,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,yBAAyB,CAAA;IAC9C,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;IACpD,oBAAoB,CAAC,EAAE,2BAA2B,CAAA;IAClD,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;CACrD;AAgBD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CAcrB"}
|
package/dist/route-runtime.js
CHANGED
|
@@ -17,5 +17,7 @@ export function buildBookingRouteRuntime(bindings, options = {}) {
|
|
|
17
17
|
return createKmsProviderFromEnv(runtimeEnv);
|
|
18
18
|
},
|
|
19
19
|
resolveTravelSnapshot: options.resolveTravelSnapshot,
|
|
20
|
+
resolveBillingPerson: options.resolveBillingPerson,
|
|
21
|
+
resolveTravelerPerson: options.resolveTravelerPerson,
|
|
20
22
|
};
|
|
21
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes-public.d.ts","sourceRoot":"","sources":["../src/routes-public.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"routes-public.d.ts","sourceRoot":"","sources":["../src/routes-public.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,GAAG,EAA2B,MAAM,oBAAoB,CAAA;AAyFtE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;+BA0BsC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAoJxE,CAAA;AAEJ,MAAM,MAAM,mBAAmB,GAAG,OAAO,mBAAmB,CAAA"}
|
package/dist/routes-public.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { idempotencyKey, parseJsonBody, parseQuery, UnauthorizedApiError } from "@voyantjs/hono";
|
|
2
2
|
import { Hono } from "hono";
|
|
3
3
|
import { checkoutCapabilityActions, checkoutCapabilityCookie, issueCheckoutCapability, requireCheckoutCapability, } from "./checkout-capability.js";
|
|
4
|
+
import { BOOKING_ROUTE_RUNTIME_CONTAINER_KEY, buildBookingRouteRuntime, } from "./route-runtime.js";
|
|
4
5
|
import { getRuntimeEnv, notFound } from "./routes-shared.js";
|
|
5
6
|
import { publicBookingsService } from "./service-public.js";
|
|
6
7
|
import { publicBookingOverviewLookupQuerySchema, publicBookingSessionMutationSchema, publicCreateBookingSessionSchema, publicRepriceBookingSessionSchema, publicUpdateBookingSessionSchema, publicUpsertBookingSessionStateSchema, } from "./validation-public.js";
|
|
@@ -50,9 +51,25 @@ function sessionCapability(action) {
|
|
|
50
51
|
await next();
|
|
51
52
|
};
|
|
52
53
|
}
|
|
54
|
+
function getRouteRuntime(c) {
|
|
55
|
+
const container = c.var.container;
|
|
56
|
+
try {
|
|
57
|
+
return (container?.resolve(BOOKING_ROUTE_RUNTIME_CONTAINER_KEY) ?? buildBookingRouteRuntime(c.env));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return buildBookingRouteRuntime(c.env);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function publicResolvers(c) {
|
|
64
|
+
const runtime = getRouteRuntime(c);
|
|
65
|
+
return {
|
|
66
|
+
resolveBillingPerson: runtime.resolveBillingPerson,
|
|
67
|
+
resolveTravelerPerson: runtime.resolveTravelerPerson,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
53
70
|
export const publicBookingRoutes = new Hono()
|
|
54
71
|
.post("/sessions", idempotencyKey({ scope: "POST /v1/public/bookings/sessions" }), async (c) => {
|
|
55
|
-
const result = await publicBookingsService.createSession(c.get("db"), await parseJsonBody(c, publicCreateBookingSessionSchema), c.get("userId"));
|
|
72
|
+
const result = await publicBookingsService.createSession(c.get("db"), await parseJsonBody(c, publicCreateBookingSessionSchema), c.get("userId"), publicResolvers(c));
|
|
56
73
|
if (result.status === "slot_not_found") {
|
|
57
74
|
return notFound(c, "Availability slot not found");
|
|
58
75
|
}
|
|
@@ -71,7 +88,7 @@ export const publicBookingRoutes = new Hono()
|
|
|
71
88
|
return session ? c.json({ data: session }) : notFound(c, "Booking session not found");
|
|
72
89
|
})
|
|
73
90
|
.patch("/sessions/:sessionId", sessionCapability("session:update"), idempotencyKey(), async (c) => {
|
|
74
|
-
const result = await publicBookingsService.updateSession(c.get("db"), c.req.param("sessionId"), await parseJsonBody(c, publicUpdateBookingSessionSchema), c.get("userId"));
|
|
91
|
+
const result = await publicBookingsService.updateSession(c.get("db"), c.req.param("sessionId"), await parseJsonBody(c, publicUpdateBookingSessionSchema), c.get("userId"), publicResolvers(c));
|
|
75
92
|
if (result.status === "not_found") {
|
|
76
93
|
return notFound(c, "Booking session not found");
|
|
77
94
|
}
|
|
@@ -86,7 +103,7 @@ export const publicBookingRoutes = new Hono()
|
|
|
86
103
|
return state ? c.json({ data: state }) : notFound(c, "Booking session not found");
|
|
87
104
|
})
|
|
88
105
|
.put("/sessions/:sessionId/state", sessionCapability("session:update"), idempotencyKey(), async (c) => {
|
|
89
|
-
const result = await publicBookingsService.updateSessionState(c.get("db"), c.req.param("sessionId"), await parseJsonBody(c, publicUpsertBookingSessionStateSchema));
|
|
106
|
+
const result = await publicBookingsService.updateSessionState(c.get("db"), c.req.param("sessionId"), await parseJsonBody(c, publicUpsertBookingSessionStateSchema), publicResolvers(c));
|
|
90
107
|
if (result.status === "not_found") {
|
|
91
108
|
return notFound(c, "Booking session not found");
|
|
92
109
|
}
|
package/dist/service-public.d.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
|
|
2
|
+
import type { ResolveBookingBillingPerson, ResolveBookingTravelerPerson } from "./route-runtime.js";
|
|
2
3
|
import type { InternalBookingOverviewLookupQuery, PublicBookingOverviewLookupQuery, PublicBookingSessionMutationInput, PublicBookingSessionRepriceInput, PublicCreateBookingSessionInput, PublicUpdateBookingSessionInput, PublicUpsertBookingSessionStateInput } from "./validation-public.js";
|
|
4
|
+
/**
|
|
5
|
+
* Optional resolver bundle for storefront/public booking flows. When
|
|
6
|
+
* supplied, billing-contact + traveler payloads are run through the
|
|
7
|
+
* caller's resolver to look up (or create) the matching CRM person
|
|
8
|
+
* and the booking / traveler rows pick up the resulting `person_id`.
|
|
9
|
+
* Default (omitted) behaviour is the historic one: rows land with
|
|
10
|
+
* `person_id = NULL`. See issue #961.
|
|
11
|
+
*/
|
|
12
|
+
export interface PublicBookingsServiceResolvers {
|
|
13
|
+
resolveBillingPerson?: ResolveBookingBillingPerson;
|
|
14
|
+
resolveTravelerPerson?: ResolveBookingTravelerPerson;
|
|
15
|
+
}
|
|
3
16
|
/**
|
|
4
17
|
* Resolves the catalog-scoped pricing snapshot for a product (options → option
|
|
5
18
|
* price rules → per-unit price rules → tiers). The snapshot is the same data
|
|
@@ -56,7 +69,7 @@ export declare function resolveSessionPricingSnapshot(db: PostgresJsDatabase, pr
|
|
|
56
69
|
}[];
|
|
57
70
|
} | null>;
|
|
58
71
|
export declare const publicBookingsService: {
|
|
59
|
-
createSession(db: PostgresJsDatabase, input: PublicCreateBookingSessionInput, userId?: string): Promise<{
|
|
72
|
+
createSession(db: PostgresJsDatabase, input: PublicCreateBookingSessionInput, userId?: string, resolvers?: PublicBookingsServiceResolvers): Promise<{
|
|
60
73
|
status: Exclude<string, "ok">;
|
|
61
74
|
} | {
|
|
62
75
|
status: "ok";
|
|
@@ -251,7 +264,7 @@ export declare const publicBookingsService: {
|
|
|
251
264
|
createdAt: string;
|
|
252
265
|
updatedAt: string;
|
|
253
266
|
} | null>;
|
|
254
|
-
updateSessionState(db: PostgresJsDatabase, bookingId: string, input: PublicUpsertBookingSessionStateInput): Promise<{
|
|
267
|
+
updateSessionState(db: PostgresJsDatabase, bookingId: string, input: PublicUpsertBookingSessionStateInput, resolvers?: PublicBookingsServiceResolvers): Promise<{
|
|
255
268
|
status: "not_found";
|
|
256
269
|
state?: undefined;
|
|
257
270
|
} | {
|
|
@@ -267,7 +280,7 @@ export declare const publicBookingsService: {
|
|
|
267
280
|
updatedAt: string;
|
|
268
281
|
};
|
|
269
282
|
}>;
|
|
270
|
-
updateSession(db: PostgresJsDatabase, bookingId: string, input: PublicUpdateBookingSessionInput, userId?: string): Promise<{
|
|
283
|
+
updateSession(db: PostgresJsDatabase, bookingId: string, input: PublicUpdateBookingSessionInput, userId?: string, resolvers?: PublicBookingsServiceResolvers): Promise<{
|
|
271
284
|
status: Exclude<string, "ok">;
|
|
272
285
|
} | {
|
|
273
286
|
status: "ok";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-public.d.ts","sourceRoot":"","sources":["../src/service-public.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"service-public.d.ts","sourceRoot":"","sources":["../src/service-public.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AASjE,OAAO,KAAK,EAEV,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,oBAAoB,CAAA;AAY3B,OAAO,KAAK,EACV,kCAAkC,EAClC,gCAAgC,EAChC,iCAAiC,EACjC,gCAAgC,EAEhC,+BAA+B,EAC/B,+BAA+B,EAC/B,oCAAoC,EACrC,MAAM,wBAAwB,CAAA;AAE/B;;;;;;;GAOG;AACH,MAAM,WAAW,8BAA8B;IAC7C,oBAAoB,CAAC,EAAE,2BAA2B,CAAA;IAClD,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;CACrD;AAohBD;;;;;;;;;;;GAWG;AACH,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,kBAAkB,EACtB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IACL,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,mHAAmH;IACnH,oBAAoB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAsKF;AAuJD,eAAO,MAAM,qBAAqB;sBAE1B,kBAAkB,SACf,+BAA+B,WAC7B,MAAM,cACJ,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAjHnC,MAAM;gCACE,MAAM;0BACZ,MAAM;+BACD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAkMH,kBAAkB,aAAa,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBArMhD,MAAM;4BACE,MAAM;sBACZ,MAAM;2BACD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAsMI,kBAAkB,aAAa,MAAM;;;;;;;;;;2BAUzD,kBAAkB,aACX,MAAM,SACV,oCAAoC,cAChC,8BAA8B;;;;;;;;;;;;;;;;sBAyCrC,kBAAkB,aACX,MAAM,SACV,+BAA+B,WAC7B,MAAM,cACJ,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAnQnC,MAAM;gCACE,MAAM;0BACZ,MAAM;+BACD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAyXhB,kBAAkB,aACX,MAAM,SACV,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;wBAwC7B,MAAM;uBACP,MAAM;2BACF,MAAM,GAAG,IAAI;0BACd,MAAM,GAAG,IAAI;8BACT,MAAM,GAAG,IAAI;gCACX,MAAM,GAAG,IAAI;gCACb,MAAM,GAAG,IAAI;mCACV,MAAM,GAAG,IAAI;0BACtB,MAAM;6BACH,MAAM;qCACE,MAAM,GAAG,IAAI;sCACZ,MAAM,GAAG,IAAI;0BACzB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAlbd,MAAM;gCACE,MAAM;0BACZ,MAAM;+BACD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAqqBhB,kBAAkB,aACX,MAAM,SACV,iCAAiC,WAC/B,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA3qBT,MAAM;gCACE,MAAM;0BACZ,MAAM;+BACD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAorBhB,kBAAkB,aACX,MAAM,SACV,iCAAiC,WAC/B,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA1rBT,MAAM;gCACE,MAAM;0BACZ,MAAM;+BACD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAksBA,kBAAkB,SAAS,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAjiCzE,MAAM;4BACE,MAAM;sBACZ,MAAM;2BACD,OAAO;;;;;;;;;;;;;;;;;;;;4BAkiCQ,kBAAkB,SAAS,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAriCnF,MAAM;4BACE,MAAM;sBACZ,MAAM;2BACD,OAAO;;;;;;;;;;;;;;;;;;;;CAqiCvB,CAAA"}
|
package/dist/service-public.js
CHANGED
|
@@ -3,6 +3,47 @@ import { optionPriceRulesRef, optionUnitPriceRulesRef, optionUnitTiersRef, price
|
|
|
3
3
|
import { optionUnitsRef, productOptionsRef, productsRef } from "./products-ref.js";
|
|
4
4
|
import { bookingAllocations, bookingDocuments, bookingFulfillments, bookingItems, bookingItemTravelers, bookingSessionStates, bookings, bookingTravelers, } from "./schema.js";
|
|
5
5
|
import { bookingsService } from "./service.js";
|
|
6
|
+
const BOOKING_PERSON_SOURCE = "storefront-booking";
|
|
7
|
+
async function safeResolveTravelerPerson(db, resolver, participant, bookingId) {
|
|
8
|
+
if (!resolver)
|
|
9
|
+
return null;
|
|
10
|
+
const contact = {
|
|
11
|
+
firstName: participant.firstName,
|
|
12
|
+
lastName: participant.lastName,
|
|
13
|
+
email: participant.email,
|
|
14
|
+
phone: participant.phone,
|
|
15
|
+
preferredLanguage: participant.preferredLanguage,
|
|
16
|
+
};
|
|
17
|
+
try {
|
|
18
|
+
return await resolver(db, contact, {
|
|
19
|
+
bookingId,
|
|
20
|
+
source: BOOKING_PERSON_SOURCE,
|
|
21
|
+
sourceRef: bookingId,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
// Person resolution is best-effort — a CRM hiccup must not block
|
|
26
|
+
// the actual booking. Log and fall back to `null` so the traveler
|
|
27
|
+
// row still lands without a person link.
|
|
28
|
+
console.error("[bookings] resolveTravelerPerson failed for booking", bookingId, error);
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function safeResolveBillingPerson(db, resolver, contact, bookingId) {
|
|
33
|
+
if (!resolver)
|
|
34
|
+
return null;
|
|
35
|
+
try {
|
|
36
|
+
return await resolver(db, contact, {
|
|
37
|
+
bookingId,
|
|
38
|
+
source: BOOKING_PERSON_SOURCE,
|
|
39
|
+
sourceRef: bookingId,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error("[bookings] resolveBillingPerson failed for booking", bookingId, error);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
6
47
|
const travelerParticipantTypes = new Set(["traveler", "occupant"]);
|
|
7
48
|
const WIZARD_STATE_KEY = "wizard";
|
|
8
49
|
function normalizeDate(value) {
|
|
@@ -577,7 +618,7 @@ async function buildSessionSnapshot(db, bookingId) {
|
|
|
577
618
|
};
|
|
578
619
|
}
|
|
579
620
|
export const publicBookingsService = {
|
|
580
|
-
async createSession(db, input, userId) {
|
|
621
|
+
async createSession(db, input, userId, resolvers = {}) {
|
|
581
622
|
const travelers = input.travelers ?? [];
|
|
582
623
|
const travelerCount = countTravelerParticipants(travelers);
|
|
583
624
|
const bookingNumber = await generateBookingNumber(db);
|
|
@@ -618,6 +659,13 @@ export const publicBookingsService = {
|
|
|
618
659
|
return result;
|
|
619
660
|
}
|
|
620
661
|
for (const participant of travelers) {
|
|
662
|
+
const personId = await safeResolveTravelerPerson(db, resolvers.resolveTravelerPerson, {
|
|
663
|
+
firstName: participant.firstName,
|
|
664
|
+
lastName: participant.lastName,
|
|
665
|
+
email: participant.email ?? null,
|
|
666
|
+
phone: participant.phone ?? null,
|
|
667
|
+
preferredLanguage: participant.preferredLanguage ?? null,
|
|
668
|
+
}, result.booking.id);
|
|
621
669
|
await bookingsService.createTravelerRecord(db, result.booking.id, {
|
|
622
670
|
participantType: participant.participantType,
|
|
623
671
|
travelerCategory: participant.travelerCategory ?? null,
|
|
@@ -629,7 +677,7 @@ export const publicBookingsService = {
|
|
|
629
677
|
specialRequests: participant.specialRequests ?? null,
|
|
630
678
|
isPrimary: participant.isPrimary,
|
|
631
679
|
notes: participant.notes ?? null,
|
|
632
|
-
personId
|
|
680
|
+
personId,
|
|
633
681
|
}, userId);
|
|
634
682
|
}
|
|
635
683
|
const session = await buildSessionSnapshot(db, result.booking.id);
|
|
@@ -645,7 +693,7 @@ export const publicBookingsService = {
|
|
|
645
693
|
}
|
|
646
694
|
return getWizardSessionState(db, bookingId);
|
|
647
695
|
},
|
|
648
|
-
async updateSessionState(db, bookingId, input) {
|
|
696
|
+
async updateSessionState(db, bookingId, input, resolvers = {}) {
|
|
649
697
|
const booking = await bookingsService.getBookingById(db, bookingId);
|
|
650
698
|
if (!booking) {
|
|
651
699
|
return { status: "not_found" };
|
|
@@ -656,11 +704,27 @@ export const publicBookingsService = {
|
|
|
656
704
|
}
|
|
657
705
|
const bookingContact = extractBookingContactFromStatePayload(state.payload);
|
|
658
706
|
if (bookingContact) {
|
|
659
|
-
|
|
707
|
+
// Resolve a CRM person from the billing snapshot when a resolver
|
|
708
|
+
// is wired — issue #961 calls out that storefront bookings used
|
|
709
|
+
// to land with `person_id = NULL`, leaving every customer outside
|
|
710
|
+
// the CRM until each operator wired their own bridge.
|
|
711
|
+
const personId = booking.personId
|
|
712
|
+
? booking.personId
|
|
713
|
+
: await safeResolveBillingPerson(db, resolvers.resolveBillingPerson, {
|
|
714
|
+
firstName: bookingContact.contactFirstName,
|
|
715
|
+
lastName: bookingContact.contactLastName,
|
|
716
|
+
email: bookingContact.contactEmail,
|
|
717
|
+
phone: bookingContact.contactPhone,
|
|
718
|
+
preferredLanguage: null,
|
|
719
|
+
}, bookingId);
|
|
720
|
+
await bookingsService.updateBooking(db, bookingId, {
|
|
721
|
+
...bookingContact,
|
|
722
|
+
...(personId && booking.personId !== personId ? { personId } : {}),
|
|
723
|
+
});
|
|
660
724
|
}
|
|
661
725
|
return { status: "ok", state };
|
|
662
726
|
},
|
|
663
|
-
async updateSession(db, bookingId, input, userId) {
|
|
727
|
+
async updateSession(db, bookingId, input, userId, resolvers = {}) {
|
|
664
728
|
const booking = await bookingsService.getBookingById(db, bookingId);
|
|
665
729
|
if (!booking) {
|
|
666
730
|
return { status: "not_found" };
|
|
@@ -703,6 +767,13 @@ export const publicBookingsService = {
|
|
|
703
767
|
});
|
|
704
768
|
continue;
|
|
705
769
|
}
|
|
770
|
+
const personId = await safeResolveTravelerPerson(db, resolvers.resolveTravelerPerson, {
|
|
771
|
+
firstName: participant.firstName,
|
|
772
|
+
lastName: participant.lastName,
|
|
773
|
+
email: participant.email ?? null,
|
|
774
|
+
phone: participant.phone ?? null,
|
|
775
|
+
preferredLanguage: participant.preferredLanguage ?? null,
|
|
776
|
+
}, bookingId);
|
|
706
777
|
await bookingsService.createTravelerRecord(db, bookingId, {
|
|
707
778
|
participantType: participant.participantType,
|
|
708
779
|
travelerCategory: participant.travelerCategory ?? null,
|
|
@@ -714,7 +785,7 @@ export const publicBookingsService = {
|
|
|
714
785
|
specialRequests: participant.specialRequests ?? null,
|
|
715
786
|
isPrimary: participant.isPrimary,
|
|
716
787
|
notes: participant.notes ?? null,
|
|
717
|
-
personId
|
|
788
|
+
personId,
|
|
718
789
|
}, userId);
|
|
719
790
|
}
|
|
720
791
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyantjs/bookings",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.53.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -79,15 +79,15 @@
|
|
|
79
79
|
"drizzle-orm": "^0.45.2",
|
|
80
80
|
"hono": "^4.12.10",
|
|
81
81
|
"zod": "^4.3.6",
|
|
82
|
-
"@voyantjs/action-ledger": "0.
|
|
83
|
-
"@voyantjs/core": "0.
|
|
84
|
-
"@voyantjs/db": "0.
|
|
85
|
-
"@voyantjs/hono": "0.
|
|
86
|
-
"@voyantjs/utils": "0.
|
|
82
|
+
"@voyantjs/action-ledger": "0.53.0",
|
|
83
|
+
"@voyantjs/core": "0.53.0",
|
|
84
|
+
"@voyantjs/db": "0.53.0",
|
|
85
|
+
"@voyantjs/hono": "0.53.0",
|
|
86
|
+
"@voyantjs/utils": "0.53.0"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
89
|
"typescript": "^6.0.2",
|
|
90
|
-
"@voyantjs/products": "0.
|
|
90
|
+
"@voyantjs/products": "0.53.0",
|
|
91
91
|
"@voyantjs/voyant-typescript-config": "0.1.0"
|
|
92
92
|
},
|
|
93
93
|
"files": [
|