@voyantjs/flights 0.19.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 (41) hide show
  1. package/README.md +98 -0
  2. package/dist/contract/adapter.d.ts +121 -0
  3. package/dist/contract/adapter.d.ts.map +1 -0
  4. package/dist/contract/adapter.js +43 -0
  5. package/dist/contract/types.d.ts +222 -0
  6. package/dist/contract/types.d.ts.map +1 -0
  7. package/dist/contract/types.js +33 -0
  8. package/dist/index.d.ts +9 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +13 -0
  11. package/dist/orchestration/fan-out.d.ts +81 -0
  12. package/dist/orchestration/fan-out.d.ts.map +1 -0
  13. package/dist/orchestration/fan-out.js +132 -0
  14. package/dist/orchestration/fan-out.test.d.ts +2 -0
  15. package/dist/orchestration/fan-out.test.d.ts.map +1 -0
  16. package/dist/orchestration/fan-out.test.js +237 -0
  17. package/dist/orchestration/fingerprint.d.ts +20 -0
  18. package/dist/orchestration/fingerprint.d.ts.map +1 -0
  19. package/dist/orchestration/fingerprint.js +22 -0
  20. package/dist/orchestration/fingerprint.test.d.ts +2 -0
  21. package/dist/orchestration/fingerprint.test.d.ts.map +1 -0
  22. package/dist/orchestration/fingerprint.test.js +91 -0
  23. package/dist/reference/contract.d.ts +90 -0
  24. package/dist/reference/contract.d.ts.map +1 -0
  25. package/dist/reference/contract.js +26 -0
  26. package/dist/reference/local-postgres.d.ts +390 -0
  27. package/dist/reference/local-postgres.d.ts.map +1 -0
  28. package/dist/reference/local-postgres.js +194 -0
  29. package/dist/reference/static-bundle.d.ts +29 -0
  30. package/dist/reference/static-bundle.d.ts.map +1 -0
  31. package/dist/reference/static-bundle.js +83 -0
  32. package/dist/reference/static-bundle.test.d.ts +2 -0
  33. package/dist/reference/static-bundle.test.d.ts.map +1 -0
  34. package/dist/reference/static-bundle.test.js +75 -0
  35. package/dist/snapshot.d.ts +50 -0
  36. package/dist/snapshot.d.ts.map +1 -0
  37. package/dist/snapshot.js +65 -0
  38. package/dist/snapshot.test.d.ts +2 -0
  39. package/dist/snapshot.test.d.ts.map +1 -0
  40. package/dist/snapshot.test.js +96 -0
  41. package/package.json +95 -0
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Static-bundle `ReferenceDataProvider`.
3
+ *
4
+ * Even simpler than a local-Postgres provider — ship a JSON / CSV bundle
5
+ * with the deployment, load it into memory at startup, serve from a `Map`.
6
+ * Appropriate for small operators with stable, narrow geographic scope and
7
+ * no need for refresh.
8
+ *
9
+ * No DB, no external service, no network call.
10
+ *
11
+ * See `docs/architecture/catalog-flights-architecture.md` §6.2.
12
+ */
13
+ import { dedupeCodes } from "./contract.js";
14
+ /**
15
+ * Build a `ReferenceDataProvider` from in-memory bundles. Maps are built
16
+ * once at construction; lookups are O(1).
17
+ */
18
+ export function createStaticBundleReferenceProvider(options) {
19
+ const airlines = new Map();
20
+ const airports = new Map();
21
+ const aircraft = new Map();
22
+ for (const airline of options.data.airlines ?? []) {
23
+ airlines.set(airline.iataCode, airline);
24
+ }
25
+ for (const airport of options.data.airports ?? []) {
26
+ airports.set(airport.iataCode, airport);
27
+ }
28
+ for (const ac of options.data.aircraft ?? []) {
29
+ aircraft.set(ac.iataCode, ac);
30
+ }
31
+ const inferredCapabilities = {
32
+ coversAirlines: airlines.size > 0,
33
+ coversAirports: airports.size > 0,
34
+ coversAircraft: aircraft.size > 0,
35
+ coversCurrencies: false,
36
+ coversCountries: false,
37
+ isReadOnly: true,
38
+ refreshCadence: "static",
39
+ ...options.capabilities,
40
+ };
41
+ return {
42
+ capabilities: inferredCapabilities,
43
+ async getAirline(iataCode) {
44
+ return airlines.get(iataCode) ?? null;
45
+ },
46
+ async getAirport(iataCode) {
47
+ return airports.get(iataCode) ?? null;
48
+ },
49
+ async getAircraft(iataCode) {
50
+ return aircraft.get(iataCode) ?? null;
51
+ },
52
+ async getAirlines(iataCodes) {
53
+ const codes = dedupeCodes(iataCodes);
54
+ const result = new Map();
55
+ for (const code of codes) {
56
+ const value = airlines.get(code);
57
+ if (value)
58
+ result.set(code, value);
59
+ }
60
+ return result;
61
+ },
62
+ async getAirports(iataCodes) {
63
+ const codes = dedupeCodes(iataCodes);
64
+ const result = new Map();
65
+ for (const code of codes) {
66
+ const value = airports.get(code);
67
+ if (value)
68
+ result.set(code, value);
69
+ }
70
+ return result;
71
+ },
72
+ async getAircraftBatch(iataCodes) {
73
+ const codes = dedupeCodes(iataCodes);
74
+ const result = new Map();
75
+ for (const code of codes) {
76
+ const value = aircraft.get(code);
77
+ if (value)
78
+ result.set(code, value);
79
+ }
80
+ return result;
81
+ },
82
+ };
83
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=static-bundle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-bundle.test.d.ts","sourceRoot":"","sources":["../../src/reference/static-bundle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createStaticBundleReferenceProvider } from "./static-bundle.js";
3
+ const ba = { iataCode: "BA", icaoCode: "BAW", name: "British Airways", country: "GB" };
4
+ const aa = { iataCode: "AA", icaoCode: "AAL", name: "American Airlines", country: "US" };
5
+ const lhr = {
6
+ iataCode: "LHR",
7
+ name: "Heathrow",
8
+ city: "London",
9
+ country: "GB",
10
+ timezone: "Europe/London",
11
+ };
12
+ const jfk = {
13
+ iataCode: "JFK",
14
+ name: "John F. Kennedy",
15
+ city: "New York",
16
+ country: "US",
17
+ timezone: "America/New_York",
18
+ };
19
+ const b738 = {
20
+ iataCode: "738",
21
+ icaoCode: "B738",
22
+ name: "Boeing 737-800",
23
+ manufacturer: "Boeing",
24
+ };
25
+ describe("createStaticBundleReferenceProvider", () => {
26
+ it("infers capabilities from which arrays are populated", () => {
27
+ const provider = createStaticBundleReferenceProvider({
28
+ data: { airlines: [ba], airports: [lhr] },
29
+ });
30
+ expect(provider.capabilities.coversAirlines).toBe(true);
31
+ expect(provider.capabilities.coversAirports).toBe(true);
32
+ expect(provider.capabilities.coversAircraft).toBe(false);
33
+ expect(provider.capabilities.refreshCadence).toBe("static");
34
+ expect(provider.capabilities.isReadOnly).toBe(true);
35
+ });
36
+ it("getAirline returns the airline for a known code, null otherwise", async () => {
37
+ const provider = createStaticBundleReferenceProvider({ data: { airlines: [ba, aa] } });
38
+ expect(await provider.getAirline("BA")).toEqual(ba);
39
+ expect(await provider.getAirline("XX")).toBeNull();
40
+ });
41
+ it("getAirport / getAircraft work the same way", async () => {
42
+ const provider = createStaticBundleReferenceProvider({
43
+ data: { airports: [lhr, jfk], aircraft: [b738] },
44
+ });
45
+ expect(await provider.getAirport("LHR")).toEqual(lhr);
46
+ expect(await provider.getAircraft("738")).toEqual(b738);
47
+ expect(await provider.getAircraft("999")).toBeNull();
48
+ });
49
+ it("getAirlines (batch) returns a Map of found codes only", async () => {
50
+ const provider = createStaticBundleReferenceProvider({ data: { airlines: [ba, aa] } });
51
+ const result = await provider.getAirlines(["BA", "AA", "XX"]);
52
+ expect(result.size).toBe(2);
53
+ expect(result.get("BA")).toEqual(ba);
54
+ expect(result.get("AA")).toEqual(aa);
55
+ expect(result.has("XX")).toBe(false);
56
+ });
57
+ it("batch lookups deduplicate input codes", async () => {
58
+ const provider = createStaticBundleReferenceProvider({ data: { airlines: [ba] } });
59
+ const result = await provider.getAirlines(["BA", "BA", "BA"]);
60
+ expect(result.size).toBe(1);
61
+ });
62
+ it("empty input returns an empty Map", async () => {
63
+ const provider = createStaticBundleReferenceProvider({ data: {} });
64
+ expect((await provider.getAirlines([])).size).toBe(0);
65
+ expect((await provider.getAirports([])).size).toBe(0);
66
+ expect((await provider.getAircraftBatch([])).size).toBe(0);
67
+ });
68
+ it("capabilities can be overridden", () => {
69
+ const provider = createStaticBundleReferenceProvider({
70
+ data: { airlines: [ba] },
71
+ capabilities: { refreshCadence: "weekly" },
72
+ });
73
+ expect(provider.capabilities.refreshCadence).toBe("weekly");
74
+ });
75
+ });
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Booking-time snapshot capture for flight orders.
3
+ *
4
+ * Flights are a partial-adoption vertical: they participate in the catalog
5
+ * plane's snapshot graph but skip overlay / index / drift / RAG. This
6
+ * helper turns a `FlightOffer` + `FlightOrder` pair into a
7
+ * `CaptureSnapshotInput` ready for `captureSnapshot` /
8
+ * `captureSnapshotGraph`.
9
+ *
10
+ * Mirrors the per-vertical pattern (`buildProductSnapshotInput`,
11
+ * `buildCruiseSnapshotInput`, etc.) but skips the resolved-view step
12
+ * because flights have no overlay store.
13
+ *
14
+ * See `docs/architecture/catalog-flights-architecture.md` §5.1 for the
15
+ * full snapshot scope (frozen offer + order + segments + fare breakdown +
16
+ * pricing basis).
17
+ */
18
+ import type { CaptureSnapshotInput } from "@voyantjs/catalog";
19
+ import type { FlightOffer, FlightOrder } from "./contract/types.js";
20
+ export interface BuildFlightSnapshotInputOptions {
21
+ /** The booked flight offer at booking time (frozen view). */
22
+ offer: FlightOffer;
23
+ /** The flight order returned by the adapter (PNR, ticket numbers, status). */
24
+ order: FlightOrder;
25
+ /** The source kind — typically `"voyant-connect"` or a direct adapter slug. */
26
+ sourceKind: string;
27
+ /** Source provider sub-identifier — e.g. `"hisky"`, `"amadeus"`. */
28
+ sourceProvider?: string;
29
+ /** The connection identifier the booking was placed against. */
30
+ sourceConnectionId?: string;
31
+ /** Optional override for the entity id; defaults to the adapter's `orderId`. */
32
+ entityId?: string;
33
+ }
34
+ /**
35
+ * Build a `CaptureSnapshotInput` from a flight offer + order. Use the
36
+ * result with `captureSnapshot` (single-flight bookings) or
37
+ * `captureSnapshotGraph` (composite bookings — flight inside a tour
38
+ * package, etc.).
39
+ *
40
+ * The `frozen_payload` carries the full FlightOffer and FlightOrder,
41
+ * structured as `{ offer, order }`, so refunds and post-book operations
42
+ * eight months later can read exactly what the customer paid for.
43
+ *
44
+ * The `pricing_basis` structured columns are populated from the offer's
45
+ * `totalPrice`. Taxes / fees / surcharges decomposition is left to the
46
+ * adapter — `FlightOffer` exposes `fareBreakdowns[]` per passenger which
47
+ * the caller can aggregate as needed and pass via `pricingBasis`.
48
+ */
49
+ export declare function buildFlightSnapshotInput(options: BuildFlightSnapshotInputOptions): Omit<CaptureSnapshotInput, "bookingId">;
50
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAgB,MAAM,mBAAmB,CAAA;AAE3E,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEnE,MAAM,WAAW,+BAA+B;IAC9C,6DAA6D;IAC7D,KAAK,EAAE,WAAW,CAAA;IAClB,8EAA8E;IAC9E,KAAK,EAAE,WAAW,CAAA;IAClB,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAA;IAClB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gEAAgE;IAChE,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,+BAA+B,GACvC,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAiCzC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Booking-time snapshot capture for flight orders.
3
+ *
4
+ * Flights are a partial-adoption vertical: they participate in the catalog
5
+ * plane's snapshot graph but skip overlay / index / drift / RAG. This
6
+ * helper turns a `FlightOffer` + `FlightOrder` pair into a
7
+ * `CaptureSnapshotInput` ready for `captureSnapshot` /
8
+ * `captureSnapshotGraph`.
9
+ *
10
+ * Mirrors the per-vertical pattern (`buildProductSnapshotInput`,
11
+ * `buildCruiseSnapshotInput`, etc.) but skips the resolved-view step
12
+ * because flights have no overlay store.
13
+ *
14
+ * See `docs/architecture/catalog-flights-architecture.md` §5.1 for the
15
+ * full snapshot scope (frozen offer + order + segments + fare breakdown +
16
+ * pricing basis).
17
+ */
18
+ /**
19
+ * Build a `CaptureSnapshotInput` from a flight offer + order. Use the
20
+ * result with `captureSnapshot` (single-flight bookings) or
21
+ * `captureSnapshotGraph` (composite bookings — flight inside a tour
22
+ * package, etc.).
23
+ *
24
+ * The `frozen_payload` carries the full FlightOffer and FlightOrder,
25
+ * structured as `{ offer, order }`, so refunds and post-book operations
26
+ * eight months later can read exactly what the customer paid for.
27
+ *
28
+ * The `pricing_basis` structured columns are populated from the offer's
29
+ * `totalPrice`. Taxes / fees / surcharges decomposition is left to the
30
+ * adapter — `FlightOffer` exposes `fareBreakdowns[]` per passenger which
31
+ * the caller can aggregate as needed and pass via `pricingBasis`.
32
+ */
33
+ export function buildFlightSnapshotInput(options) {
34
+ const { offer, order, sourceKind, sourceProvider, sourceConnectionId, entityId } = options;
35
+ const frozenPayload = {
36
+ offer,
37
+ order,
38
+ };
39
+ const pricingBasis = (() => {
40
+ const total = offer.totalPrice ?? order.totalPrice;
41
+ if (!total)
42
+ return undefined;
43
+ const baseAmount = Number.parseFloat(total.amount);
44
+ if (!Number.isFinite(baseAmount))
45
+ return undefined;
46
+ return {
47
+ base_amount: baseAmount,
48
+ taxes: 0, // adapter decomposes if it tracks taxes separately
49
+ fees: 0,
50
+ surcharges: 0,
51
+ currency: total.currency,
52
+ breakdown: { fareBreakdowns: offer.fareBreakdowns },
53
+ };
54
+ })();
55
+ return {
56
+ entityModule: "flights",
57
+ entityId: entityId ?? order.orderId,
58
+ sourceKind,
59
+ sourceProvider,
60
+ sourceConnectionId,
61
+ sourceRef: order.pnr ?? order.orderId,
62
+ frozenPayload,
63
+ pricingBasis,
64
+ };
65
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=snapshot.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.test.d.ts","sourceRoot":"","sources":["../src/snapshot.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,96 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildFlightSnapshotInput } from "./snapshot.js";
3
+ const sampleOffer = {
4
+ offerId: "ofr_abc",
5
+ source: "amadeus",
6
+ itineraries: [
7
+ {
8
+ segments: [
9
+ {
10
+ segmentId: "s1",
11
+ carrierCode: "BA",
12
+ flightNumber: "177",
13
+ departure: { iataCode: "LHR", at: "2026-10-15T11:00:00+00:00" },
14
+ arrival: { iataCode: "JFK", at: "2026-10-15T14:00:00-04:00" },
15
+ cabin: "economy",
16
+ },
17
+ ],
18
+ },
19
+ ],
20
+ fareBreakdowns: [
21
+ {
22
+ passengerType: "adult",
23
+ passengerCount: 1,
24
+ baseFare: { amount: "500", currency: "USD" },
25
+ taxes: { amount: "100", currency: "USD" },
26
+ total: { amount: "600", currency: "USD" },
27
+ },
28
+ ],
29
+ totalPrice: { amount: "600", currency: "USD" },
30
+ };
31
+ const sampleOrder = {
32
+ orderId: "ord_xyz",
33
+ pnr: "ABCDEF",
34
+ status: "ticketed",
35
+ offer: sampleOffer,
36
+ passengers: [],
37
+ totalPrice: { amount: "600", currency: "USD" },
38
+ createdAt: "2026-09-01T12:00:00Z",
39
+ };
40
+ describe("buildFlightSnapshotInput", () => {
41
+ it("composes a CaptureSnapshotInput with frozen offer + order", () => {
42
+ const input = buildFlightSnapshotInput({
43
+ offer: sampleOffer,
44
+ order: sampleOrder,
45
+ sourceKind: "voyant-connect",
46
+ sourceProvider: "amadeus",
47
+ sourceConnectionId: "conn_xyz",
48
+ });
49
+ expect(input.entityModule).toBe("flights");
50
+ expect(input.entityId).toBe("ord_xyz");
51
+ expect(input.sourceKind).toBe("voyant-connect");
52
+ expect(input.sourceProvider).toBe("amadeus");
53
+ expect(input.sourceConnectionId).toBe("conn_xyz");
54
+ // sourceRef defaults to PNR when present
55
+ expect(input.sourceRef).toBe("ABCDEF");
56
+ });
57
+ it("falls back to orderId for sourceRef when PNR is missing", () => {
58
+ const orderNoPnr = { ...sampleOrder, pnr: undefined };
59
+ const input = buildFlightSnapshotInput({
60
+ offer: sampleOffer,
61
+ order: orderNoPnr,
62
+ sourceKind: "direct:hisky",
63
+ });
64
+ expect(input.sourceRef).toBe("ord_xyz");
65
+ });
66
+ it("populates structured pricing columns from offer.totalPrice", () => {
67
+ const input = buildFlightSnapshotInput({
68
+ offer: sampleOffer,
69
+ order: sampleOrder,
70
+ sourceKind: "owned",
71
+ });
72
+ expect(input.pricingBasis).toBeDefined();
73
+ expect(input.pricingBasis?.base_amount).toBe(600);
74
+ expect(input.pricingBasis?.currency).toBe("USD");
75
+ expect(input.pricingBasis?.breakdown).toEqual({
76
+ fareBreakdowns: sampleOffer.fareBreakdowns,
77
+ });
78
+ });
79
+ it("frozen_payload contains the full offer + order pair", () => {
80
+ const input = buildFlightSnapshotInput({
81
+ offer: sampleOffer,
82
+ order: sampleOrder,
83
+ sourceKind: "owned",
84
+ });
85
+ expect(input.frozenPayload).toEqual({ offer: sampleOffer, order: sampleOrder });
86
+ });
87
+ it("entityId can be overridden (e.g. for tour-package composite bookings)", () => {
88
+ const input = buildFlightSnapshotInput({
89
+ offer: sampleOffer,
90
+ order: sampleOrder,
91
+ sourceKind: "voyant-connect",
92
+ entityId: "custom_entity_xyz",
93
+ });
94
+ expect(input.entityId).toBe("custom_entity_xyz");
95
+ });
96
+ });
package/package.json ADDED
@@ -0,0 +1,95 @@
1
+ {
2
+ "name": "@voyantjs/flights",
3
+ "version": "0.19.0",
4
+ "license": "Apache-2.0",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": "./src/index.ts",
8
+ "./contract/types": "./src/contract/types.ts",
9
+ "./contract/adapter": "./src/contract/adapter.ts",
10
+ "./orchestration/fingerprint": "./src/orchestration/fingerprint.ts",
11
+ "./orchestration/fan-out": "./src/orchestration/fan-out.ts",
12
+ "./snapshot": "./src/snapshot.ts",
13
+ "./reference/contract": "./src/reference/contract.ts",
14
+ "./reference/local-postgres": "./src/reference/local-postgres.ts",
15
+ "./reference/static-bundle": "./src/reference/static-bundle.ts"
16
+ },
17
+ "scripts": {
18
+ "typecheck": "tsc --noEmit",
19
+ "lint": "biome check src/",
20
+ "test": "vitest run",
21
+ "build": "tsc -p tsconfig.json",
22
+ "clean": "rm -rf dist",
23
+ "prepack": "pnpm run build"
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "publishConfig": {
29
+ "access": "public",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.js",
34
+ "default": "./dist/index.js"
35
+ },
36
+ "./contract/types": {
37
+ "types": "./dist/contract/types.d.ts",
38
+ "import": "./dist/contract/types.js",
39
+ "default": "./dist/contract/types.js"
40
+ },
41
+ "./contract/adapter": {
42
+ "types": "./dist/contract/adapter.d.ts",
43
+ "import": "./dist/contract/adapter.js",
44
+ "default": "./dist/contract/adapter.js"
45
+ },
46
+ "./orchestration/fingerprint": {
47
+ "types": "./dist/orchestration/fingerprint.d.ts",
48
+ "import": "./dist/orchestration/fingerprint.js",
49
+ "default": "./dist/orchestration/fingerprint.js"
50
+ },
51
+ "./orchestration/fan-out": {
52
+ "types": "./dist/orchestration/fan-out.d.ts",
53
+ "import": "./dist/orchestration/fan-out.js",
54
+ "default": "./dist/orchestration/fan-out.js"
55
+ },
56
+ "./snapshot": {
57
+ "types": "./dist/snapshot.d.ts",
58
+ "import": "./dist/snapshot.js",
59
+ "default": "./dist/snapshot.js"
60
+ },
61
+ "./reference/contract": {
62
+ "types": "./dist/reference/contract.d.ts",
63
+ "import": "./dist/reference/contract.js",
64
+ "default": "./dist/reference/contract.js"
65
+ },
66
+ "./reference/local-postgres": {
67
+ "types": "./dist/reference/local-postgres.d.ts",
68
+ "import": "./dist/reference/local-postgres.js",
69
+ "default": "./dist/reference/local-postgres.js"
70
+ },
71
+ "./reference/static-bundle": {
72
+ "types": "./dist/reference/static-bundle.d.ts",
73
+ "import": "./dist/reference/static-bundle.js",
74
+ "default": "./dist/reference/static-bundle.js"
75
+ }
76
+ },
77
+ "main": "./dist/index.js",
78
+ "types": "./dist/index.d.ts"
79
+ },
80
+ "dependencies": {
81
+ "@voyantjs/db": "workspace:*",
82
+ "@voyantjs/catalog": "workspace:*",
83
+ "drizzle-orm": "^0.45.2"
84
+ },
85
+ "devDependencies": {
86
+ "@voyantjs/voyant-typescript-config": "workspace:*",
87
+ "typescript": "^6.0.2",
88
+ "vitest": "^4.1.2"
89
+ },
90
+ "repository": {
91
+ "type": "git",
92
+ "url": "https://github.com/voyantjs/voyant.git",
93
+ "directory": "packages/flights"
94
+ }
95
+ }