@voyantjs/products 0.20.0 → 0.21.1

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 (70) hide show
  1. package/dist/booking-engine/handler.d.ts +203 -0
  2. package/dist/booking-engine/handler.d.ts.map +1 -0
  3. package/dist/booking-engine/handler.js +330 -0
  4. package/dist/booking-engine/index.d.ts +8 -0
  5. package/dist/booking-engine/index.d.ts.map +1 -0
  6. package/dist/booking-engine/index.js +7 -0
  7. package/dist/catalog-policy.d.ts.map +1 -1
  8. package/dist/catalog-policy.js +15 -1
  9. package/dist/content-shape.d.ts +217 -0
  10. package/dist/content-shape.d.ts.map +1 -0
  11. package/dist/content-shape.js +159 -0
  12. package/dist/draft-shape.d.ts +43 -0
  13. package/dist/draft-shape.d.ts.map +1 -0
  14. package/dist/draft-shape.js +46 -0
  15. package/dist/events.d.ts +37 -0
  16. package/dist/events.d.ts.map +1 -0
  17. package/dist/events.js +32 -0
  18. package/dist/index.d.ts +1 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -0
  21. package/dist/routes-content.d.ts +74 -0
  22. package/dist/routes-content.d.ts.map +1 -0
  23. package/dist/routes-content.js +117 -0
  24. package/dist/routes.d.ts +40 -20
  25. package/dist/routes.d.ts.map +1 -1
  26. package/dist/routes.js +83 -13
  27. package/dist/schema-core.d.ts +240 -1
  28. package/dist/schema-core.d.ts.map +1 -1
  29. package/dist/schema-core.js +49 -0
  30. package/dist/schema-itinerary.d.ts +18 -1
  31. package/dist/schema-itinerary.d.ts.map +1 -1
  32. package/dist/schema-itinerary.js +1 -0
  33. package/dist/schema-settings.d.ts +1 -1
  34. package/dist/schema-sourced-content.d.ts +262 -0
  35. package/dist/schema-sourced-content.d.ts.map +1 -0
  36. package/dist/schema-sourced-content.js +69 -0
  37. package/dist/schema-taxonomy.d.ts +17 -0
  38. package/dist/schema-taxonomy.d.ts.map +1 -1
  39. package/dist/schema-taxonomy.js +13 -0
  40. package/dist/schema.d.ts +1 -0
  41. package/dist/schema.d.ts.map +1 -1
  42. package/dist/schema.js +1 -0
  43. package/dist/service-catalog-plane.d.ts.map +1 -1
  44. package/dist/service-catalog-plane.js +1 -0
  45. package/dist/service-content-owned.d.ts +68 -0
  46. package/dist/service-content-owned.d.ts.map +1 -0
  47. package/dist/service-content-owned.js +224 -0
  48. package/dist/service-content-synthesizer.d.ts +90 -0
  49. package/dist/service-content-synthesizer.d.ts.map +1 -0
  50. package/dist/service-content-synthesizer.js +171 -0
  51. package/dist/service-content.d.ts +106 -0
  52. package/dist/service-content.d.ts.map +1 -0
  53. package/dist/service-content.js +365 -0
  54. package/dist/service.d.ts +76 -22
  55. package/dist/service.d.ts.map +1 -1
  56. package/dist/service.js +4 -0
  57. package/dist/tasks/brochures.d.ts +1 -0
  58. package/dist/tasks/brochures.d.ts.map +1 -1
  59. package/dist/tasks/brochures.js +3 -0
  60. package/dist/validation-catalog.d.ts +4 -4
  61. package/dist/validation-config.d.ts +3 -3
  62. package/dist/validation-content.d.ts +34 -4
  63. package/dist/validation-content.d.ts.map +1 -1
  64. package/dist/validation-content.js +13 -0
  65. package/dist/validation-core.d.ts +53 -3
  66. package/dist/validation-core.d.ts.map +1 -1
  67. package/dist/validation-core.js +16 -0
  68. package/dist/validation-public.d.ts +9 -9
  69. package/dist/validation-shared.d.ts +4 -4
  70. package/package.json +12 -7
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Product content routes — unified owned + sourced detail endpoint.
3
+ *
4
+ * GET /:id/content
5
+ *
6
+ * Returns the full `ProductContent` payload for ANY product:
7
+ * - **Sourced**: cache hit → cached row + overlay merge; cache miss
8
+ * with rich adapter → adapter fetch + write-through; cache miss
9
+ * with thin adapter → synthesizer fallback (sourced-content §3.3,
10
+ * §3.4, §3.6).
11
+ * - **Owned**: read from the products module's own tables and
12
+ * project to ProductContent. Overlay merge applies the same way.
13
+ * Marked `source: "owned"` in the response.
14
+ *
15
+ * 404 only when the entity doesn't exist (no sourced-entry row AND
16
+ * no owned product row). The catalog detail sheet calls this on
17
+ * click to enrich the indexed projection with itinerary, media,
18
+ * options, and policies.
19
+ *
20
+ * Templates mount this router under their preferred prefix; the
21
+ * factory takes a `resolveRegistry` callback so the catalog
22
+ * `SourceAdapterRegistry` stays template-owned (singleton lifetime,
23
+ * adapters carry HTTP clients).
24
+ *
25
+ * See `docs/architecture/catalog-sourced-content.md` §3.3.
26
+ */
27
+ import { Hono } from "hono";
28
+ import { getProductContent } from "./service-content.js";
29
+ /**
30
+ * Build the product content router. Returns a Hono instance that
31
+ * exposes a single `GET /:id/content` route. Templates mount it under
32
+ * `/v1/admin/products` or `/v1/public/products` as appropriate.
33
+ */
34
+ export function createProductContentRoutes(options) {
35
+ return new Hono().get("/:id/content", async (c) => {
36
+ const entityId = c.req.param("id");
37
+ const scope = parseScope(c);
38
+ const registry = options.resolveRegistry(c);
39
+ const result = await getProductContent(c.var.db, entityId, scope, {
40
+ registry,
41
+ onOverlayError: options.onOverlayError,
42
+ });
43
+ if (!result) {
44
+ return c.json({
45
+ error: "not_found",
46
+ detail: `Product ${entityId} not found (no owned row + no sourced-entry row).`,
47
+ }, 404);
48
+ }
49
+ return c.json({
50
+ data: {
51
+ content: result.content,
52
+ served_locale: result.resolution.served_locale,
53
+ match_kind: result.resolution.match_kind,
54
+ source: result.source,
55
+ served_stale: result.served_stale,
56
+ synthesized: result.synthesized,
57
+ machine_translated: result.machine_translated,
58
+ },
59
+ });
60
+ });
61
+ function parseScope(c) {
62
+ // Locale priority: explicit query param > Accept-Language header
63
+ // > en-GB fallback. Multiple `?locale=` query params are joined
64
+ // into the preference chain.
65
+ const localeParams = c.req.queries("locale") ?? c.req.queries("locales") ?? [];
66
+ const headerLocale = c.req.header("accept-language");
67
+ const acceptLanguageList = headerLocale ? parseAcceptLanguage(headerLocale) : [];
68
+ const preferredLocales = localeParams.length > 0
69
+ ? localeParams
70
+ : acceptLanguageList.length > 0
71
+ ? acceptLanguageList
72
+ : ["en-GB"];
73
+ const market = c.req.query("market") ?? undefined;
74
+ const currency = c.req.query("currency") ?? undefined;
75
+ const acceptMTQuery = c.req.query("accept_mt");
76
+ const acceptMachineTranslated = acceptMTQuery != null
77
+ ? acceptMTQuery !== "false" && acceptMTQuery !== "0"
78
+ : (options.defaultAcceptMachineTranslated ?? true);
79
+ return {
80
+ preferredLocales,
81
+ market,
82
+ currency,
83
+ acceptMachineTranslated,
84
+ };
85
+ }
86
+ }
87
+ /**
88
+ * Parse an `Accept-Language` header into an ordered list of BCP 47
89
+ * tags. Quality factors are honored — higher-q first; ties keep
90
+ * insertion order. Lifted out of the route handler so it's testable
91
+ * in isolation.
92
+ */
93
+ export function parseAcceptLanguage(header) {
94
+ const parts = header.split(",");
95
+ const ranked = [];
96
+ for (let i = 0; i < parts.length; i += 1) {
97
+ const part = parts[i].trim();
98
+ if (!part)
99
+ continue;
100
+ const [tagRaw, ...params] = part.split(";");
101
+ const tag = tagRaw.trim();
102
+ if (!tag || tag === "*")
103
+ continue;
104
+ let q = 1;
105
+ for (const p of params) {
106
+ const [k, v] = p.split("=").map((s) => s.trim());
107
+ if (k === "q" && v) {
108
+ const parsed = Number.parseFloat(v);
109
+ if (Number.isFinite(parsed))
110
+ q = parsed;
111
+ }
112
+ }
113
+ ranked.push({ tag, q, idx: i });
114
+ }
115
+ ranked.sort((a, b) => b.q - a.q || a.idx - b.idx);
116
+ return ranked.map((r) => r.tag);
117
+ }
package/dist/routes.d.ts CHANGED
@@ -50,10 +50,13 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
50
50
  costAmountCents: number | null;
51
51
  marginPercent: number | null;
52
52
  facilityId: string | null;
53
+ supplierId: string | null;
53
54
  startDate: string | null;
54
55
  endDate: string | null;
55
56
  pax: number | null;
56
57
  productTypeId: string | null;
58
+ taxClassId: string | null;
59
+ customerPaymentPolicy: import("hono/utils/types").JSONValue;
57
60
  tags: string[] | null;
58
61
  createdAt: string;
59
62
  updatedAt: string;
@@ -87,6 +90,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
87
90
  activated: boolean;
88
91
  productTypeId: string | null;
89
92
  facilityId: string | null;
93
+ supplierId: string | null;
90
94
  pax: number | null;
91
95
  reservationTimeoutMinutes: number | null;
92
96
  sellAmountCents: number | null;
@@ -94,6 +98,8 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
94
98
  costAmountCents: number | null;
95
99
  marginPercent: number | null;
96
100
  tags: string[] | null;
101
+ taxClassId: string | null;
102
+ customerPaymentPolicy: import("hono/utils/types").JSONValue;
97
103
  };
98
104
  };
99
105
  outputFormat: "json";
@@ -582,7 +588,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
582
588
  data: {
583
589
  id: string;
584
590
  productId: string;
585
- capability: "on_request" | "private" | "instant_confirmation" | "pickup_available" | "dropoff_available" | "guided" | "shared" | "digital_ticket" | "voucher_required" | "external_inventory" | "multi_day" | "accommodation" | "transport";
591
+ capability: "accommodation" | "on_request" | "private" | "instant_confirmation" | "pickup_available" | "dropoff_available" | "guided" | "shared" | "digital_ticket" | "voucher_required" | "external_inventory" | "multi_day" | "transport";
586
592
  enabled: boolean;
587
593
  notes: string | null;
588
594
  createdAt: string;
@@ -619,7 +625,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
619
625
  data: {
620
626
  id: string;
621
627
  productId: string;
622
- capability: "on_request" | "private" | "instant_confirmation" | "pickup_available" | "dropoff_available" | "guided" | "shared" | "digital_ticket" | "voucher_required" | "external_inventory" | "multi_day" | "accommodation" | "transport";
628
+ capability: "accommodation" | "on_request" | "private" | "instant_confirmation" | "pickup_available" | "dropoff_available" | "guided" | "shared" | "digital_ticket" | "voucher_required" | "external_inventory" | "multi_day" | "transport";
623
629
  enabled: boolean;
624
630
  notes: string | null;
625
631
  createdAt: string;
@@ -657,7 +663,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
657
663
  updatedAt: string;
658
664
  notes: string | null;
659
665
  productId: string;
660
- capability: "on_request" | "private" | "instant_confirmation" | "pickup_available" | "dropoff_available" | "guided" | "shared" | "digital_ticket" | "voucher_required" | "external_inventory" | "multi_day" | "accommodation" | "transport";
666
+ capability: "accommodation" | "on_request" | "private" | "instant_confirmation" | "pickup_available" | "dropoff_available" | "guided" | "shared" | "digital_ticket" | "voucher_required" | "external_inventory" | "multi_day" | "transport";
661
667
  };
662
668
  };
663
669
  outputFormat: "json";
@@ -687,7 +693,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
687
693
  data: {
688
694
  id: string;
689
695
  productId: string;
690
- capability: "on_request" | "private" | "instant_confirmation" | "pickup_available" | "dropoff_available" | "guided" | "shared" | "digital_ticket" | "voucher_required" | "external_inventory" | "multi_day" | "accommodation" | "transport";
696
+ capability: "accommodation" | "on_request" | "private" | "instant_confirmation" | "pickup_available" | "dropoff_available" | "guided" | "shared" | "digital_ticket" | "voucher_required" | "external_inventory" | "multi_day" | "transport";
691
697
  enabled: boolean;
692
698
  notes: string | null;
693
699
  createdAt: string;
@@ -1272,11 +1278,11 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
1272
1278
  updatedAt: string;
1273
1279
  productId: string;
1274
1280
  title: string;
1275
- sortOrder: number;
1276
- locationType: "start" | "other" | "end" | "meeting_point" | "pickup" | "dropoff" | "point_of_interest";
1277
- address: string | null;
1278
1281
  city: string | null;
1282
+ address: string | null;
1283
+ sortOrder: number;
1279
1284
  countryCode: string | null;
1285
+ locationType: "start" | "other" | "end" | "meeting_point" | "pickup" | "dropoff" | "point_of_interest";
1280
1286
  latitude: number | null;
1281
1287
  longitude: number | null;
1282
1288
  googlePlaceId: string | null;
@@ -1921,7 +1927,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
1921
1927
  name: string;
1922
1928
  code: string | null;
1923
1929
  description: string | null;
1924
- unitType: "service" | "other" | "person" | "group" | "room" | "vehicle";
1930
+ unitType: "service" | "other" | "group" | "person" | "room" | "vehicle";
1925
1931
  minQuantity: number | null;
1926
1932
  maxQuantity: number | null;
1927
1933
  minAge: number | null;
@@ -1968,7 +1974,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
1968
1974
  name: string;
1969
1975
  code: string | null;
1970
1976
  description: string | null;
1971
- unitType: "service" | "other" | "person" | "group" | "room" | "vehicle";
1977
+ unitType: "service" | "other" | "group" | "person" | "room" | "vehicle";
1972
1978
  minQuantity: number | null;
1973
1979
  maxQuantity: number | null;
1974
1980
  minAge: number | null;
@@ -2014,12 +2020,12 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
2014
2020
  description: string | null;
2015
2021
  code: string | null;
2016
2022
  optionId: string;
2023
+ maxAge: number | null;
2024
+ minAge: number | null;
2017
2025
  sortOrder: number;
2018
- unitType: "service" | "other" | "person" | "group" | "room" | "vehicle";
2026
+ unitType: "service" | "other" | "group" | "person" | "room" | "vehicle";
2019
2027
  minQuantity: number | null;
2020
2028
  maxQuantity: number | null;
2021
- minAge: number | null;
2022
- maxAge: number | null;
2023
2029
  occupancyMin: number | null;
2024
2030
  occupancyMax: number | null;
2025
2031
  isRequired: boolean;
@@ -2056,7 +2062,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
2056
2062
  name: string;
2057
2063
  code: string | null;
2058
2064
  description: string | null;
2059
- unitType: "service" | "other" | "person" | "group" | "room" | "vehicle";
2065
+ unitType: "service" | "other" | "group" | "person" | "room" | "vehicle";
2060
2066
  minQuantity: number | null;
2061
2067
  maxQuantity: number | null;
2062
2068
  minAge: number | null;
@@ -2738,6 +2744,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
2738
2744
  description: string | null;
2739
2745
  sortOrder: number;
2740
2746
  active: boolean;
2747
+ customerPaymentPolicy: import("hono/utils/types").JSONValue;
2741
2748
  metadata: {
2742
2749
  [x: string]: import("hono/utils/types").JSONValue;
2743
2750
  } | null;
@@ -2780,6 +2787,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
2780
2787
  description: string | null;
2781
2788
  sortOrder: number;
2782
2789
  active: boolean;
2790
+ customerPaymentPolicy: import("hono/utils/types").JSONValue;
2783
2791
  metadata: {
2784
2792
  [x: string]: import("hono/utils/types").JSONValue;
2785
2793
  } | null;
@@ -2807,6 +2815,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
2807
2815
  slug: string;
2808
2816
  description: string | null;
2809
2817
  active: boolean;
2818
+ customerPaymentPolicy: import("hono/utils/types").JSONValue;
2810
2819
  sortOrder: number;
2811
2820
  parentId: string | null;
2812
2821
  } | undefined;
@@ -2843,6 +2852,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
2843
2852
  description: string | null;
2844
2853
  sortOrder: number;
2845
2854
  active: boolean;
2855
+ customerPaymentPolicy: import("hono/utils/types").JSONValue;
2846
2856
  metadata: {
2847
2857
  [x: string]: import("hono/utils/types").JSONValue;
2848
2858
  } | null;
@@ -3487,10 +3497,13 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
3487
3497
  costAmountCents: number | null;
3488
3498
  marginPercent: number | null;
3489
3499
  facilityId: string | null;
3500
+ supplierId: string | null;
3490
3501
  startDate: string | null;
3491
3502
  endDate: string | null;
3492
3503
  pax: number | null;
3493
3504
  productTypeId: string | null;
3505
+ taxClassId: string | null;
3506
+ customerPaymentPolicy: import("hono/utils/types").JSONValue;
3494
3507
  tags: string[] | null;
3495
3508
  createdAt: string;
3496
3509
  updatedAt: string;
@@ -3536,10 +3549,13 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
3536
3549
  costAmountCents: number | null;
3537
3550
  marginPercent: number | null;
3538
3551
  facilityId: string | null;
3552
+ supplierId: string | null;
3539
3553
  startDate: string | null;
3540
3554
  endDate: string | null;
3541
3555
  pax: number | null;
3542
3556
  productTypeId: string | null;
3557
+ taxClassId: string | null;
3558
+ customerPaymentPolicy: import("hono/utils/types").JSONValue;
3543
3559
  tags: string[] | null;
3544
3560
  createdAt: string;
3545
3561
  updatedAt: string;
@@ -3782,9 +3798,9 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
3782
3798
  updatedAt: string;
3783
3799
  description: string | null;
3784
3800
  title: string | null;
3801
+ location: string | null;
3785
3802
  itineraryId: string;
3786
3803
  dayNumber: number;
3787
- location: string | null;
3788
3804
  };
3789
3805
  };
3790
3806
  outputFormat: "json";
@@ -3841,9 +3857,9 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
3841
3857
  updatedAt: string;
3842
3858
  description: string | null;
3843
3859
  title: string | null;
3860
+ location: string | null;
3844
3861
  itineraryId: string;
3845
3862
  dayNumber: number;
3846
- location: string | null;
3847
3863
  };
3848
3864
  };
3849
3865
  outputFormat: "json";
@@ -3934,9 +3950,10 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
3934
3950
  id: string;
3935
3951
  dayId: string;
3936
3952
  supplierServiceId: string | null;
3937
- serviceType: "other" | "transfer" | "accommodation" | "experience" | "guide" | "meal";
3953
+ serviceType: "other" | "accommodation" | "transfer" | "experience" | "guide" | "meal";
3938
3954
  name: string;
3939
3955
  description: string | null;
3956
+ countryCode: string | null;
3940
3957
  costCurrency: string;
3941
3958
  costAmountCents: number;
3942
3959
  quantity: number;
@@ -3981,11 +3998,12 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
3981
3998
  description: string | null;
3982
3999
  supplierServiceId: string | null;
3983
4000
  costAmountCents: number;
4001
+ quantity: number;
3984
4002
  sortOrder: number | null;
3985
4003
  dayId: string;
3986
- serviceType: "other" | "transfer" | "accommodation" | "experience" | "guide" | "meal";
4004
+ serviceType: "other" | "accommodation" | "transfer" | "experience" | "guide" | "meal";
4005
+ countryCode: string | null;
3987
4006
  costCurrency: string;
3988
- quantity: number;
3989
4007
  };
3990
4008
  };
3991
4009
  outputFormat: "json";
@@ -4024,9 +4042,10 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
4024
4042
  id: string;
4025
4043
  dayId: string;
4026
4044
  supplierServiceId: string | null;
4027
- serviceType: "other" | "transfer" | "accommodation" | "experience" | "guide" | "meal";
4045
+ serviceType: "other" | "accommodation" | "transfer" | "experience" | "guide" | "meal";
4028
4046
  name: string;
4029
4047
  description: string | null;
4048
+ countryCode: string | null;
4030
4049
  costCurrency: string;
4031
4050
  costAmountCents: number;
4032
4051
  quantity: number;
@@ -4175,8 +4194,8 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
4175
4194
  id: string;
4176
4195
  createdAt: string;
4177
4196
  productId: string;
4178
- authorId: string;
4179
4197
  content: string;
4198
+ authorId: string;
4180
4199
  };
4181
4200
  };
4182
4201
  outputFormat: "json";
@@ -4200,6 +4219,7 @@ export declare const productRoutes: import("hono/hono-base").HonoBase<Env, {
4200
4219
  description: string | null;
4201
4220
  sortOrder: number;
4202
4221
  active: boolean;
4222
+ customerPaymentPolicy: import("hono/utils/types").JSONValue;
4203
4223
  metadata: {
4204
4224
  [x: string]: import("hono/utils/types").JSONValue;
4205
4225
  } | null;
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAkFjE,KAAK,GAAG,GAAG;IACT,SAAS,EAAE;QACT,EAAE,EAAE,kBAAkB,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,OAAO,gBAAgB,EAAE,QAAQ,CAAA;KAC7C,CAAA;CACF,CAAA;AAMD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAkiDtB,CAAA;AAEJ,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAA"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAmFjE,KAAK,GAAG,GAAG;IACT,SAAS,EAAE;QACT,EAAE,EAAE,kBAAkB,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,OAAO,gBAAgB,EAAE,QAAQ,CAAA;KAC7C,CAAA;CACF,CAAA;AAMD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAumDtB,CAAA;AAEJ,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAA"}