@curless/hotel-storefront 0.35.0 → 0.35.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 (44) hide show
  1. package/dist/card.generated.d.ts +1 -1
  2. package/dist/card.generated.js +2 -2
  3. package/dist/card.generated.js.map +1 -1
  4. package/dist/config.d.ts +11 -4
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js.map +1 -1
  7. package/dist/huazhu/backend.d.ts.map +1 -1
  8. package/dist/huazhu/backend.js +81 -9
  9. package/dist/huazhu/backend.js.map +1 -1
  10. package/dist/huazhu/bookings.d.ts +2 -0
  11. package/dist/huazhu/bookings.d.ts.map +1 -1
  12. package/dist/huazhu/bookings.js.map +1 -1
  13. package/dist/huazhu/catalog.d.ts +7 -1
  14. package/dist/huazhu/catalog.d.ts.map +1 -1
  15. package/dist/huazhu/catalog.js +8 -4
  16. package/dist/huazhu/catalog.js.map +1 -1
  17. package/dist/huazhu/make.d.ts.map +1 -1
  18. package/dist/huazhu/make.js +44 -13
  19. package/dist/huazhu/make.js.map +1 -1
  20. package/dist/legal.d.ts.map +1 -1
  21. package/dist/legal.js +18 -6
  22. package/dist/legal.js.map +1 -1
  23. package/dist/payments/checkout.d.ts +27 -2
  24. package/dist/payments/checkout.d.ts.map +1 -1
  25. package/dist/payments/checkout.js +9 -0
  26. package/dist/payments/checkout.js.map +1 -1
  27. package/dist/payments/fake-stripe.d.ts +6 -3
  28. package/dist/payments/fake-stripe.d.ts.map +1 -1
  29. package/dist/payments/fake-stripe.js +35 -5
  30. package/dist/payments/fake-stripe.js.map +1 -1
  31. package/dist/payments/stripe-checkout.d.ts +9 -1
  32. package/dist/payments/stripe-checkout.d.ts.map +1 -1
  33. package/dist/payments/stripe-checkout.js +45 -5
  34. package/dist/payments/stripe-checkout.js.map +1 -1
  35. package/dist/server.d.ts +2 -2
  36. package/dist/server.js +2 -2
  37. package/dist/tools.d.ts.map +1 -1
  38. package/dist/tools.js +4 -1
  39. package/dist/tools.js.map +1 -1
  40. package/dist/vocab.d.ts +8 -1
  41. package/dist/vocab.d.ts.map +1 -1
  42. package/dist/vocab.js +5 -2
  43. package/dist/vocab.js.map +1 -1
  44. package/package.json +1 -1
package/dist/vocab.d.ts CHANGED
@@ -32,6 +32,13 @@ export type Vocabulary = {
32
32
  * not made up, and a booking is a test booking that holds nothing.
33
33
  */
34
34
  test?: boolean;
35
+ /**
36
+ * Sells rates paid in advance (`data.api.prepaid`). On a test system that
37
+ * changes what is said of money: a rate paid in advance is paid with a TEST
38
+ * card, so "nothing is paid" is no longer true - no real money moves (华住,
39
+ * 2026-10-15).
40
+ */
41
+ prepaid?: boolean;
35
42
  /**
36
43
  * A market (`data.source: 'aggregate'`): many groups' hotels behind one
37
44
  * connector. `brand` is then the market's own name, and it owns none of
@@ -65,7 +72,7 @@ export declare const DEMO_NOTE = "Demonstration data: the rates, room counts, fe
65
72
  * The same, for the group's own test system (`Vocabulary.test`): its data is
66
73
  * real test data, not written for a demo - and still nothing anyone can book.
67
74
  */
68
- export declare const testNote: (brand: string) => string;
75
+ export declare const testNote: (brand: string, prepaid?: boolean) => string;
69
76
  /** What is said about this deployment's data, beside every price - see `DEMO_NOTE`, `testNote`. */
70
77
  export declare const noteFor: (v: Vocabulary) => string;
71
78
  //# sourceMappingURL=vocab.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vocab.d.ts","sourceRoot":"","sources":["../src/vocab.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAa,MAAM,aAAa,CAAC;AAE1E;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC;;;;;OAKG;IACH,IAAI,EAAE,OAAO,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAiBF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAQ,WAAW,KAAG,aAGlD,CAAC;AAiBF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,GAAG,UAAU,EAAE,aAAW,KAAG,MAGtD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,OAAO,GAAI,GAAG,UAAU,EAAE,MAAM,MAAM,KAAG,MACd,CAAC;AAEzC,qDAAqD;AACrD,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,MAAgD,CAAC;AAErF,qGAAqG;AACrG,eAAO,MAAM,SAAS,mJAC4H,CAAC;AAEnJ;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,MAC6J,CAAC;AAEvM,mGAAmG;AACnG,eAAO,MAAM,OAAO,GAAI,GAAG,UAAU,KAAG,MAAkD,CAAC"}
1
+ {"version":3,"file":"vocab.d.ts","sourceRoot":"","sources":["../src/vocab.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAa,MAAM,aAAa,CAAC;AAE1E;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC;;;;;OAKG;IACH,IAAI,EAAE,OAAO,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAiBF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAQ,WAAW,KAAG,aAGlD,CAAC;AAkBF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,GAAG,UAAU,EAAE,aAAW,KAAG,MAGtD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,OAAO,GAAI,GAAG,UAAU,EAAE,MAAM,MAAM,KAAG,MACd,CAAC;AAEzC,qDAAqD;AACrD,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,MAAgD,CAAC;AAErF,qGAAqG;AACrG,eAAO,MAAM,SAAS,mJAC4H,CAAC;AAEnJ;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,iBAAe,KAAG,MAKtD,CAAC;AAEL,mGAAmG;AACnG,eAAO,MAAM,OAAO,GAAI,GAAG,UAAU,KAAG,MACa,CAAC"}
package/dist/vocab.js CHANGED
@@ -26,6 +26,7 @@ const resolved = (config) => ({
26
26
  demo: demoData(config.data),
27
27
  sandbox: config.data.source === 'api' && !!config.data.api?.sandbox,
28
28
  ...(config.data.source === 'api' && config.data.api?.test ? { test: true } : {}),
29
+ ...(config.data.source === 'api' && config.data.api?.prepaid ? { prepaid: true } : {}),
29
30
  ...(config.data.source === 'aggregate' ? { market: true } : {}),
30
31
  },
31
32
  });
@@ -51,7 +52,9 @@ export const DEMO_NOTE = 'Demonstration data: the rates, room counts, fees, desc
51
52
  * The same, for the group's own test system (`Vocabulary.test`): its data is
52
53
  * real test data, not written for a demo - and still nothing anyone can book.
53
54
  */
54
- export const testNote = (brand) => `Test data: the hotels, rates, room counts and policies here come from ${brand}'s own test system, and a booking made here is a test booking in it - it holds no room for anyone and is never paid.`;
55
+ export const testNote = (brand, prepaid = false) => `Test data: the hotels, rates, room counts and policies here come from ${brand}'s own test system, and a booking made here is a test booking in it - it holds no room for anyone${prepaid
56
+ ? ', and a rate paid in advance is paid with a test card in test mode: no real money moves.'
57
+ : ' and is never paid.'}`;
55
58
  /** What is said about this deployment's data, beside every price - see `DEMO_NOTE`, `testNote`. */
56
- export const noteFor = (v) => (v.test ? testNote(v.brand) : DEMO_NOTE);
59
+ export const noteFor = (v) => v.test ? testNote(v.brand, !!v.prepaid) : DEMO_NOTE;
57
60
  //# sourceMappingURL=vocab.js.map
package/dist/vocab.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vocab.js","sourceRoot":"","sources":["../src/vocab.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vocab.js","sourceRoot":"","sources":["../src/vocab.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curless/hotel-storefront",
3
- "version": "0.35.0",
3
+ "version": "0.35.1",
4
4
  "type": "module",
5
5
  "description": "One hotel-booking MCP connector, driven by a config file. Brand, tool names, vocabulary and where the rooms come from live in a HotelConfig, so the second hotel group is a JSON file rather than a fork.",
6
6
  "keywords": [