@uengage.io/platform-sdk 0.8.0 → 0.12.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.
@@ -2,14 +2,154 @@
2
2
  * Group names recognised by the business read API. Mirrors the GROUPS
3
3
  * registry in services/business; if the server adds a group, add it here.
4
4
  */
5
- export declare const BUSINESS_GROUPS: readonly ["profile", "gst", "payment_gateway"];
5
+ export declare const BUSINESS_GROUPS: readonly ["profile", "branding", "compliance", "address", "contact", "hours", "slots", "order_types", "delivery", "charges", "attributes", "app_config", "payment_gateway", "bank"];
6
6
  export type BusinessGroupName = (typeof BUSINESS_GROUPS)[number];
7
7
  export interface BusinessProfile {
8
8
  name: string | null;
9
+ slug: string | null;
10
+ /** Numeric flag; 1 = active, 0 = inactive (legacy convention). */
11
+ status: number | null;
12
+ legal_entity_name: string | null;
9
13
  }
10
- export interface BusinessGst {
14
+ export interface BusinessBranding {
15
+ /** Logo image URL or relative path served by the legacy CDN. */
16
+ logo: string | null;
17
+ /** Header/banner image URL. */
18
+ header_image: string | null;
19
+ /** Hex color string, e.g. "#01522B". */
20
+ brand_color: string | null;
21
+ social: {
22
+ facebook: string | null;
23
+ instagram: string | null;
24
+ };
25
+ }
26
+ export interface BusinessCompliance {
27
+ gstin: string | null;
28
+ fssai_no: string | null;
29
+ /** State of GST registration; same column as `address.state` in the DB. */
11
30
  state: string | null;
12
- gst_no: string | null;
31
+ legal_entity_name: string | null;
32
+ }
33
+ export interface BusinessAddress {
34
+ city: string | null;
35
+ state: string | null;
36
+ address: string | null;
37
+ locality: string | null;
38
+ postal_code: number | null;
39
+ latitude: string | null;
40
+ longitude: string | null;
41
+ }
42
+ export interface BusinessContact {
43
+ outlet_phone: string | null;
44
+ owner_phone: string | null;
45
+ alternative_phone: string | null;
46
+ /** Phone number that receives order-failure / SLA-breach SMS alerts. */
47
+ alert_phone: string | null;
48
+ /** Comma-separated email list for daily reports + alerts. */
49
+ alert_emails: string | null;
50
+ }
51
+ export interface TimeOfDay {
52
+ hour: number | null;
53
+ minute: number;
54
+ }
55
+ export interface BusinessHours {
56
+ /** Window during which the storefront accepts online orders. */
57
+ online_orders: {
58
+ start: TimeOfDay;
59
+ end: TimeOfDay;
60
+ };
61
+ /** Real-world open/close times (may differ from order-window for prep buffers). */
62
+ actual: {
63
+ open: TimeOfDay;
64
+ close: TimeOfDay;
65
+ };
66
+ /** Hours of the day (0-23) when ordering is blocked. */
67
+ blocked_hours: number[];
68
+ /** Legacy off-hours config; same shape as blocked_hours. */
69
+ off_hours: number[];
70
+ /** Minutes between order placement and outlet handoff. String for legacy compat. */
71
+ preparation_time_minutes: string | null;
72
+ }
73
+ export interface BusinessSlots {
74
+ /** 1 = slots enabled, 0 = disabled. */
75
+ enabled: number | null;
76
+ /** 1 = slot-based ordering, 0 = continuous. */
77
+ slot_based_ordering: number | null;
78
+ /** "1" = show today's slots, "0" = hide. */
79
+ show_current_day: string | null;
80
+ /** Number of days into the future the user can pick slots for. */
81
+ day_limit: string | null;
82
+ }
83
+ export interface BusinessOrderTypes {
84
+ self_pickup: number | null;
85
+ delivery: number | null;
86
+ in_car: number | null;
87
+ dine_in: number | null;
88
+ /** "1" / "0" — legacy storage uses string. */
89
+ uengage_pay: string | null;
90
+ /**
91
+ * Inverted from intuition: "1" = delivery is fully disabled, "0" = enabled.
92
+ * Same string-typed legacy column.
93
+ */
94
+ delivery_disabled: string | null;
95
+ }
96
+ export interface BusinessDelivery {
97
+ /** Service radius in kilometers. String in legacy. */
98
+ radius_km: string | null;
99
+ /** Estimated delivery time, minutes. String in legacy. */
100
+ time_minutes: string | null;
101
+ tax_percent: number | null;
102
+ /** Min order value above which delivery is free. */
103
+ free_delivery_min_order_value: number | null;
104
+ /** Charge applied below the free-delivery threshold. */
105
+ delivery_charges: number | null;
106
+ /** Lower bound on order value the outlet accepts at all. */
107
+ eligible_order_value: number | null;
108
+ /** 0 → applied on Gross Value; 1 → applied on SubTotal. */
109
+ charges_applied_on: number;
110
+ }
111
+ export interface BusinessCharges {
112
+ packing: {
113
+ /** "1" = fixed, "2" = percentage. */
114
+ type: string | null;
115
+ /** Amount or percentage depending on `type`. */
116
+ amount: number | null;
117
+ tax_percent: number | null;
118
+ };
119
+ service: {
120
+ /** Percentage applied as service charge for dine-in orders. */
121
+ amount: number | null;
122
+ tax_percent: number | null;
123
+ };
124
+ }
125
+ export interface BusinessAttributes {
126
+ pure_veg: number | null;
127
+ serves_cuisine: string | null;
128
+ manages_riders: number | null;
129
+ /** "1" = grocery flow enabled in the consumer app. */
130
+ grocery_flow: string | null;
131
+ /** "1" = cloud kitchen (no in-person dining). */
132
+ cloud_kitchen: string | null;
133
+ /** Numeric campus identifier for B2B tenants; null for non-campus businesses. */
134
+ campus_id: string | null;
135
+ }
136
+ export interface BusinessAppConfig {
137
+ /** "1" = display menu prices inclusive of GST in the consumer app. */
138
+ menu_price_inclusive_of_gst: string | null;
139
+ new_launch: string | null;
140
+ share_link: string | null;
141
+ launch_date: string | null;
142
+ /** "0" = paid plan, "1" = free (legacy inverted). */
143
+ paid: string | null;
144
+ firebase_key: string | null;
145
+ /** Online listing visibility toggle; 1 = visible, 0 = hidden. */
146
+ online_visibility: number | null;
147
+ wallet: {
148
+ /** "1" = activated, "2" = inactive. */
149
+ activated: string | null;
150
+ /** "0" = show wallet tab, "1" = hide. */
151
+ hidden: string | null;
152
+ };
13
153
  }
14
154
  export interface BusinessPaymentGateway {
15
155
  razorpay: {
@@ -17,6 +157,12 @@ export interface BusinessPaymentGateway {
17
157
  secret: string | null;
18
158
  };
19
159
  }
160
+ export interface BusinessBank {
161
+ account_holder: string | null;
162
+ account_number: string | null;
163
+ bank_name: string | null;
164
+ ifsc: string | null;
165
+ }
20
166
  /**
21
167
  * Public summary of a parent business. Same shape as a top-level record
22
168
  * with the `profile` group included, but the parent's own parent is NOT
@@ -37,6 +183,17 @@ export interface BusinessRecord {
37
183
  /** Direct parent business (single level), or null if root. */
38
184
  parent: BusinessParent | null;
39
185
  profile?: BusinessProfile;
40
- gst?: BusinessGst;
186
+ branding?: BusinessBranding;
187
+ compliance?: BusinessCompliance;
188
+ address?: BusinessAddress;
189
+ contact?: BusinessContact;
190
+ hours?: BusinessHours;
191
+ slots?: BusinessSlots;
192
+ order_types?: BusinessOrderTypes;
193
+ delivery?: BusinessDelivery;
194
+ charges?: BusinessCharges;
195
+ attributes?: BusinessAttributes;
196
+ app_config?: BusinessAppConfig;
41
197
  payment_gateway?: BusinessPaymentGateway;
198
+ bank?: BusinessBank;
42
199
  }
@@ -5,5 +5,20 @@ exports.BUSINESS_GROUPS = void 0;
5
5
  * Group names recognised by the business read API. Mirrors the GROUPS
6
6
  * registry in services/business; if the server adds a group, add it here.
7
7
  */
8
- exports.BUSINESS_GROUPS = ['profile', 'gst', 'payment_gateway'];
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1c2luZXNzL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7O0dBR0c7QUFDVSxRQUFBLGVBQWUsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR3JvdXAgbmFtZXMgcmVjb2duaXNlZCBieSB0aGUgYnVzaW5lc3MgcmVhZCBBUEkuIE1pcnJvcnMgdGhlIEdST1VQU1xuICogcmVnaXN0cnkgaW4gc2VydmljZXMvYnVzaW5lc3M7IGlmIHRoZSBzZXJ2ZXIgYWRkcyBhIGdyb3VwLCBhZGQgaXQgaGVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEJVU0lORVNTX0dST1VQUyA9IFsncHJvZmlsZScsICdnc3QnLCAncGF5bWVudF9nYXRld2F5J10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBCdXNpbmVzc0dyb3VwTmFtZSA9ICh0eXBlb2YgQlVTSU5FU1NfR1JPVVBTKVtudW1iZXJdO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzUHJvZmlsZSB7XG4gIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NHc3Qge1xuICBzdGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgZ3N0X25vOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzUGF5bWVudEdhdGV3YXkge1xuICByYXpvcnBheToge1xuICAgIGtleTogc3RyaW5nIHwgbnVsbDtcbiAgICBzZWNyZXQ6IHN0cmluZyB8IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogUHVibGljIHN1bW1hcnkgb2YgYSBwYXJlbnQgYnVzaW5lc3MuIFNhbWUgc2hhcGUgYXMgYSB0b3AtbGV2ZWwgcmVjb3JkXG4gKiB3aXRoIHRoZSBgcHJvZmlsZWAgZ3JvdXAgaW5jbHVkZWQsIGJ1dCB0aGUgcGFyZW50J3Mgb3duIHBhcmVudCBpcyBOT1RcbiAqIHJlY3Vyc2l2ZWx5IHJlc29sdmVkIChjYXBwZWQgYXQgZGVwdGggMSkuIENhbGxcbiAqIGBidXNpbmVzcy5nZXQocGFyZW50LmlkKWAgZm9yIHRoZSBncmFuZC1wYXJlbnQgaWYgbmVlZGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzUGFyZW50IHtcbiAgaWQ6IG51bWJlcjtcbiAgcHJvZmlsZTogQnVzaW5lc3NQcm9maWxlO1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIHNoYXBlIGZyb20gR0VUIC92MS9idXNpbmVzc2VzLzppZCBhbmQgdGhlIGVudHJpZXMgcmV0dXJuZWQgYnlcbiAqIEdFVCAvdjEvYnVzaW5lc3Nlcy4gR3JvdXAga2V5cyBhcmUgb3B0aW9uYWwgLSB0aGUgc2VydmVyIGluY2x1ZGVzXG4gKiBvbmx5IHRoZSBncm91cHMgdGhhdCB3ZXJlIGJvdGggcmVxdWVzdGVkIGFuZCBhdXRob3JpemVkIGZvciB0aGUgY2FsbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzUmVjb3JkIHtcbiAgaWQ6IG51bWJlcjtcbiAgLyoqIERpcmVjdCBwYXJlbnQgYnVzaW5lc3MgKHNpbmdsZSBsZXZlbCksIG9yIG51bGwgaWYgcm9vdC4gKi9cbiAgcGFyZW50OiBCdXNpbmVzc1BhcmVudCB8IG51bGw7XG4gIHByb2ZpbGU/OiBCdXNpbmVzc1Byb2ZpbGU7XG4gIGdzdD86IEJ1c2luZXNzR3N0O1xuICBwYXltZW50X2dhdGV3YXk/OiBCdXNpbmVzc1BheW1lbnRHYXRld2F5O1xufVxuIl19
8
+ exports.BUSINESS_GROUPS = [
9
+ 'profile',
10
+ 'branding',
11
+ 'compliance',
12
+ 'address',
13
+ 'contact',
14
+ 'hours',
15
+ 'slots',
16
+ 'order_types',
17
+ 'delivery',
18
+ 'charges',
19
+ 'attributes',
20
+ 'app_config',
21
+ 'payment_gateway',
22
+ 'bank',
23
+ ];
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1c2luZXNzL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7O0dBR0c7QUFDVSxRQUFBLGVBQWUsR0FBRztJQUM3QixTQUFTO0lBQ1QsVUFBVTtJQUNWLFlBQVk7SUFDWixTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsYUFBYTtJQUNiLFVBQVU7SUFDVixTQUFTO0lBQ1QsWUFBWTtJQUNaLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsTUFBTTtDQUNFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdyb3VwIG5hbWVzIHJlY29nbmlzZWQgYnkgdGhlIGJ1c2luZXNzIHJlYWQgQVBJLiBNaXJyb3JzIHRoZSBHUk9VUFNcbiAqIHJlZ2lzdHJ5IGluIHNlcnZpY2VzL2J1c2luZXNzOyBpZiB0aGUgc2VydmVyIGFkZHMgYSBncm91cCwgYWRkIGl0IGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBCVVNJTkVTU19HUk9VUFMgPSBbXG4gICdwcm9maWxlJyxcbiAgJ2JyYW5kaW5nJyxcbiAgJ2NvbXBsaWFuY2UnLFxuICAnYWRkcmVzcycsXG4gICdjb250YWN0JyxcbiAgJ2hvdXJzJyxcbiAgJ3Nsb3RzJyxcbiAgJ29yZGVyX3R5cGVzJyxcbiAgJ2RlbGl2ZXJ5JyxcbiAgJ2NoYXJnZXMnLFxuICAnYXR0cmlidXRlcycsXG4gICdhcHBfY29uZmlnJyxcbiAgJ3BheW1lbnRfZ2F0ZXdheScsXG4gICdiYW5rJyxcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBCdXNpbmVzc0dyb3VwTmFtZSA9ICh0eXBlb2YgQlVTSU5FU1NfR1JPVVBTKVtudW1iZXJdO1xuXG4vLyDilIDilIDilIAgSWRlbnRpdHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzUHJvZmlsZSB7XG4gIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHNsdWc6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBOdW1lcmljIGZsYWc7IDEgPSBhY3RpdmUsIDAgPSBpbmFjdGl2ZSAobGVnYWN5IGNvbnZlbnRpb24pLiAqL1xuICBzdGF0dXM6IG51bWJlciB8IG51bGw7XG4gIGxlZ2FsX2VudGl0eV9uYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzQnJhbmRpbmcge1xuICAvKiogTG9nbyBpbWFnZSBVUkwgb3IgcmVsYXRpdmUgcGF0aCBzZXJ2ZWQgYnkgdGhlIGxlZ2FjeSBDRE4uICovXG4gIGxvZ286IHN0cmluZyB8IG51bGw7XG4gIC8qKiBIZWFkZXIvYmFubmVyIGltYWdlIFVSTC4gKi9cbiAgaGVhZGVyX2ltYWdlOiBzdHJpbmcgfCBudWxsO1xuICAvKiogSGV4IGNvbG9yIHN0cmluZywgZS5nLiBcIiMwMTUyMkJcIi4gKi9cbiAgYnJhbmRfY29sb3I6IHN0cmluZyB8IG51bGw7XG4gIHNvY2lhbDoge1xuICAgIGZhY2Vib29rOiBzdHJpbmcgfCBudWxsO1xuICAgIGluc3RhZ3JhbTogc3RyaW5nIHwgbnVsbDtcbiAgfTtcbn1cblxuLy8g4pSA4pSA4pSAIFN0YXR1dG9yeSAvIHJlZ3VsYXRvcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzQ29tcGxpYW5jZSB7XG4gIGdzdGluOiBzdHJpbmcgfCBudWxsO1xuICBmc3NhaV9ubzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFN0YXRlIG9mIEdTVCByZWdpc3RyYXRpb247IHNhbWUgY29sdW1uIGFzIGBhZGRyZXNzLnN0YXRlYCBpbiB0aGUgREIuICovXG4gIHN0YXRlOiBzdHJpbmcgfCBudWxsO1xuICBsZWdhbF9lbnRpdHlfbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuLy8g4pSA4pSA4pSAIFdoZXJlIHRoZSBvdXRsZXQgbGl2ZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzQWRkcmVzcyB7XG4gIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gIHN0YXRlOiBzdHJpbmcgfCBudWxsO1xuICBhZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICBsb2NhbGl0eTogc3RyaW5nIHwgbnVsbDtcbiAgcG9zdGFsX2NvZGU6IG51bWJlciB8IG51bGw7XG4gIGxhdGl0dWRlOiBzdHJpbmcgfCBudWxsO1xuICBsb25naXR1ZGU6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NDb250YWN0IHtcbiAgb3V0bGV0X3Bob25lOiBzdHJpbmcgfCBudWxsO1xuICBvd25lcl9waG9uZTogc3RyaW5nIHwgbnVsbDtcbiAgYWx0ZXJuYXRpdmVfcGhvbmU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBQaG9uZSBudW1iZXIgdGhhdCByZWNlaXZlcyBvcmRlci1mYWlsdXJlIC8gU0xBLWJyZWFjaCBTTVMgYWxlcnRzLiAqL1xuICBhbGVydF9waG9uZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIENvbW1hLXNlcGFyYXRlZCBlbWFpbCBsaXN0IGZvciBkYWlseSByZXBvcnRzICsgYWxlcnRzLiAqL1xuICBhbGVydF9lbWFpbHM6IHN0cmluZyB8IG51bGw7XG59XG5cbi8vIOKUgOKUgOKUgCBPcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuZXhwb3J0IGludGVyZmFjZSBUaW1lT2ZEYXkge1xuICBob3VyOiBudW1iZXIgfCBudWxsO1xuICBtaW51dGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc0hvdXJzIHtcbiAgLyoqIFdpbmRvdyBkdXJpbmcgd2hpY2ggdGhlIHN0b3JlZnJvbnQgYWNjZXB0cyBvbmxpbmUgb3JkZXJzLiAqL1xuICBvbmxpbmVfb3JkZXJzOiB7IHN0YXJ0OiBUaW1lT2ZEYXk7IGVuZDogVGltZU9mRGF5IH07XG4gIC8qKiBSZWFsLXdvcmxkIG9wZW4vY2xvc2UgdGltZXMgKG1heSBkaWZmZXIgZnJvbSBvcmRlci13aW5kb3cgZm9yIHByZXAgYnVmZmVycykuICovXG4gIGFjdHVhbDogeyBvcGVuOiBUaW1lT2ZEYXk7IGNsb3NlOiBUaW1lT2ZEYXkgfTtcbiAgLyoqIEhvdXJzIG9mIHRoZSBkYXkgKDAtMjMpIHdoZW4gb3JkZXJpbmcgaXMgYmxvY2tlZC4gKi9cbiAgYmxvY2tlZF9ob3VyczogbnVtYmVyW107XG4gIC8qKiBMZWdhY3kgb2ZmLWhvdXJzIGNvbmZpZzsgc2FtZSBzaGFwZSBhcyBibG9ja2VkX2hvdXJzLiAqL1xuICBvZmZfaG91cnM6IG51bWJlcltdO1xuICAvKiogTWludXRlcyBiZXR3ZWVuIG9yZGVyIHBsYWNlbWVudCBhbmQgb3V0bGV0IGhhbmRvZmYuIFN0cmluZyBmb3IgbGVnYWN5IGNvbXBhdC4gKi9cbiAgcHJlcGFyYXRpb25fdGltZV9taW51dGVzOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzU2xvdHMge1xuICAvKiogMSA9IHNsb3RzIGVuYWJsZWQsIDAgPSBkaXNhYmxlZC4gKi9cbiAgZW5hYmxlZDogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIDEgPSBzbG90LWJhc2VkIG9yZGVyaW5nLCAwID0gY29udGludW91cy4gKi9cbiAgc2xvdF9iYXNlZF9vcmRlcmluZzogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFwiMVwiID0gc2hvdyB0b2RheSdzIHNsb3RzLCBcIjBcIiA9IGhpZGUuICovXG4gIHNob3dfY3VycmVudF9kYXk6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBOdW1iZXIgb2YgZGF5cyBpbnRvIHRoZSBmdXR1cmUgdGhlIHVzZXIgY2FuIHBpY2sgc2xvdHMgZm9yLiAqL1xuICBkYXlfbGltaXQ6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NPcmRlclR5cGVzIHtcbiAgc2VsZl9waWNrdXA6IG51bWJlciB8IG51bGw7XG4gIGRlbGl2ZXJ5OiBudW1iZXIgfCBudWxsO1xuICBpbl9jYXI6IG51bWJlciB8IG51bGw7XG4gIGRpbmVfaW46IG51bWJlciB8IG51bGw7XG4gIC8qKiBcIjFcIiAvIFwiMFwiIOKAlCBsZWdhY3kgc3RvcmFnZSB1c2VzIHN0cmluZy4gKi9cbiAgdWVuZ2FnZV9wYXk6IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiBJbnZlcnRlZCBmcm9tIGludHVpdGlvbjogXCIxXCIgPSBkZWxpdmVyeSBpcyBmdWxseSBkaXNhYmxlZCwgXCIwXCIgPSBlbmFibGVkLlxuICAgKiBTYW1lIHN0cmluZy10eXBlZCBsZWdhY3kgY29sdW1uLlxuICAgKi9cbiAgZGVsaXZlcnlfZGlzYWJsZWQ6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NEZWxpdmVyeSB7XG4gIC8qKiBTZXJ2aWNlIHJhZGl1cyBpbiBraWxvbWV0ZXJzLiBTdHJpbmcgaW4gbGVnYWN5LiAqL1xuICByYWRpdXNfa206IHN0cmluZyB8IG51bGw7XG4gIC8qKiBFc3RpbWF0ZWQgZGVsaXZlcnkgdGltZSwgbWludXRlcy4gU3RyaW5nIGluIGxlZ2FjeS4gKi9cbiAgdGltZV9taW51dGVzOiBzdHJpbmcgfCBudWxsO1xuICB0YXhfcGVyY2VudDogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIE1pbiBvcmRlciB2YWx1ZSBhYm92ZSB3aGljaCBkZWxpdmVyeSBpcyBmcmVlLiAqL1xuICBmcmVlX2RlbGl2ZXJ5X21pbl9vcmRlcl92YWx1ZTogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIENoYXJnZSBhcHBsaWVkIGJlbG93IHRoZSBmcmVlLWRlbGl2ZXJ5IHRocmVzaG9sZC4gKi9cbiAgZGVsaXZlcnlfY2hhcmdlczogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIExvd2VyIGJvdW5kIG9uIG9yZGVyIHZhbHVlIHRoZSBvdXRsZXQgYWNjZXB0cyBhdCBhbGwuICovXG4gIGVsaWdpYmxlX29yZGVyX3ZhbHVlOiBudW1iZXIgfCBudWxsO1xuICAvKiogMCDihpIgYXBwbGllZCBvbiBHcm9zcyBWYWx1ZTsgMSDihpIgYXBwbGllZCBvbiBTdWJUb3RhbC4gKi9cbiAgY2hhcmdlc19hcHBsaWVkX29uOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NDaGFyZ2VzIHtcbiAgcGFja2luZzoge1xuICAgIC8qKiBcIjFcIiA9IGZpeGVkLCBcIjJcIiA9IHBlcmNlbnRhZ2UuICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogQW1vdW50IG9yIHBlcmNlbnRhZ2UgZGVwZW5kaW5nIG9uIGB0eXBlYC4gKi9cbiAgICBhbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgdGF4X3BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIH07XG4gIHNlcnZpY2U6IHtcbiAgICAvKiogUGVyY2VudGFnZSBhcHBsaWVkIGFzIHNlcnZpY2UgY2hhcmdlIGZvciBkaW5lLWluIG9yZGVycy4gKi9cbiAgICBhbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgdGF4X3BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIH07XG59XG5cbi8vIOKUgOKUgOKUgCBCdXNpbmVzcyBhdHRyaWJ1dGVzIC8gdHlwZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NBdHRyaWJ1dGVzIHtcbiAgcHVyZV92ZWc6IG51bWJlciB8IG51bGw7XG4gIHNlcnZlc19jdWlzaW5lOiBzdHJpbmcgfCBudWxsO1xuICBtYW5hZ2VzX3JpZGVyczogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFwiMVwiID0gZ3JvY2VyeSBmbG93IGVuYWJsZWQgaW4gdGhlIGNvbnN1bWVyIGFwcC4gKi9cbiAgZ3JvY2VyeV9mbG93OiBzdHJpbmcgfCBudWxsO1xuICAvKiogXCIxXCIgPSBjbG91ZCBraXRjaGVuIChubyBpbi1wZXJzb24gZGluaW5nKS4gKi9cbiAgY2xvdWRfa2l0Y2hlbjogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIE51bWVyaWMgY2FtcHVzIGlkZW50aWZpZXIgZm9yIEIyQiB0ZW5hbnRzOyBudWxsIGZvciBub24tY2FtcHVzIGJ1c2luZXNzZXMuICovXG4gIGNhbXB1c19pZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLy8g4pSA4pSA4pSAIEFwcC1sZXZlbCBjb25maWcgKyB2aXNpYmlsaXR5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc0FwcENvbmZpZyB7XG4gIC8qKiBcIjFcIiA9IGRpc3BsYXkgbWVudSBwcmljZXMgaW5jbHVzaXZlIG9mIEdTVCBpbiB0aGUgY29uc3VtZXIgYXBwLiAqL1xuICBtZW51X3ByaWNlX2luY2x1c2l2ZV9vZl9nc3Q6IHN0cmluZyB8IG51bGw7XG4gIG5ld19sYXVuY2g6IHN0cmluZyB8IG51bGw7XG4gIHNoYXJlX2xpbms6IHN0cmluZyB8IG51bGw7XG4gIGxhdW5jaF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAvKiogXCIwXCIgPSBwYWlkIHBsYW4sIFwiMVwiID0gZnJlZSAobGVnYWN5IGludmVydGVkKS4gKi9cbiAgcGFpZDogc3RyaW5nIHwgbnVsbDtcbiAgZmlyZWJhc2Vfa2V5OiBzdHJpbmcgfCBudWxsO1xuICAvKiogT25saW5lIGxpc3RpbmcgdmlzaWJpbGl0eSB0b2dnbGU7IDEgPSB2aXNpYmxlLCAwID0gaGlkZGVuLiAqL1xuICBvbmxpbmVfdmlzaWJpbGl0eTogbnVtYmVyIHwgbnVsbDtcbiAgd2FsbGV0OiB7XG4gICAgLyoqIFwiMVwiID0gYWN0aXZhdGVkLCBcIjJcIiA9IGluYWN0aXZlLiAqL1xuICAgIGFjdGl2YXRlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogXCIwXCIgPSBzaG93IHdhbGxldCB0YWIsIFwiMVwiID0gaGlkZS4gKi9cbiAgICBoaWRkZW46IHN0cmluZyB8IG51bGw7XG4gIH07XG59XG5cbi8vIOKUgOKUgOKUgCBNb25leSBpbiAvIG91dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NQYXltZW50R2F0ZXdheSB7XG4gIHJhem9ycGF5OiB7XG4gICAga2V5OiBzdHJpbmcgfCBudWxsO1xuICAgIHNlY3JldDogc3RyaW5nIHwgbnVsbDtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc0Jhbmsge1xuICBhY2NvdW50X2hvbGRlcjogc3RyaW5nIHwgbnVsbDtcbiAgYWNjb3VudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gIGJhbmtfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgaWZzYzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBQdWJsaWMgc3VtbWFyeSBvZiBhIHBhcmVudCBidXNpbmVzcy4gU2FtZSBzaGFwZSBhcyBhIHRvcC1sZXZlbCByZWNvcmRcbiAqIHdpdGggdGhlIGBwcm9maWxlYCBncm91cCBpbmNsdWRlZCwgYnV0IHRoZSBwYXJlbnQncyBvd24gcGFyZW50IGlzIE5PVFxuICogcmVjdXJzaXZlbHkgcmVzb2x2ZWQgKGNhcHBlZCBhdCBkZXB0aCAxKS4gQ2FsbFxuICogYGJ1c2luZXNzLmdldChwYXJlbnQuaWQpYCBmb3IgdGhlIGdyYW5kLXBhcmVudCBpZiBuZWVkZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NQYXJlbnQge1xuICBpZDogbnVtYmVyO1xuICBwcm9maWxlOiBCdXNpbmVzc1Byb2ZpbGU7XG59XG5cbi8qKlxuICogUmVzcG9uc2Ugc2hhcGUgZnJvbSBHRVQgL3YxL2J1c2luZXNzZXMvOmlkIGFuZCB0aGUgZW50cmllcyByZXR1cm5lZCBieVxuICogR0VUIC92MS9idXNpbmVzc2VzLiBHcm91cCBrZXlzIGFyZSBvcHRpb25hbCAtIHRoZSBzZXJ2ZXIgaW5jbHVkZXNcbiAqIG9ubHkgdGhlIGdyb3VwcyB0aGF0IHdlcmUgYm90aCByZXF1ZXN0ZWQgYW5kIGF1dGhvcml6ZWQgZm9yIHRoZSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NSZWNvcmQge1xuICBpZDogbnVtYmVyO1xuICAvKiogRGlyZWN0IHBhcmVudCBidXNpbmVzcyAoc2luZ2xlIGxldmVsKSwgb3IgbnVsbCBpZiByb290LiAqL1xuICBwYXJlbnQ6IEJ1c2luZXNzUGFyZW50IHwgbnVsbDtcbiAgcHJvZmlsZT86IEJ1c2luZXNzUHJvZmlsZTtcbiAgYnJhbmRpbmc/OiBCdXNpbmVzc0JyYW5kaW5nO1xuICBjb21wbGlhbmNlPzogQnVzaW5lc3NDb21wbGlhbmNlO1xuICBhZGRyZXNzPzogQnVzaW5lc3NBZGRyZXNzO1xuICBjb250YWN0PzogQnVzaW5lc3NDb250YWN0O1xuICBob3Vycz86IEJ1c2luZXNzSG91cnM7XG4gIHNsb3RzPzogQnVzaW5lc3NTbG90cztcbiAgb3JkZXJfdHlwZXM/OiBCdXNpbmVzc09yZGVyVHlwZXM7XG4gIGRlbGl2ZXJ5PzogQnVzaW5lc3NEZWxpdmVyeTtcbiAgY2hhcmdlcz86IEJ1c2luZXNzQ2hhcmdlcztcbiAgYXR0cmlidXRlcz86IEJ1c2luZXNzQXR0cmlidXRlcztcbiAgYXBwX2NvbmZpZz86IEJ1c2luZXNzQXBwQ29uZmlnO1xuICBwYXltZW50X2dhdGV3YXk/OiBCdXNpbmVzc1BheW1lbnRHYXRld2F5O1xuICBiYW5rPzogQnVzaW5lc3NCYW5rO1xufVxuIl19
package/dist/client.d.ts CHANGED
@@ -1,34 +1,86 @@
1
1
  import { type AuditClient } from './audit/client';
2
2
  import { type BusinessClient } from './business/client';
3
- import { auth } from './auth';
3
+ import { type ZonesClient } from './zones/client';
4
+ import { auth as authNamespace } from './auth';
4
5
  /**
5
- * Caller-facing config for the unified `createClient(...)` factory and
6
- * the `platform` singleton.
6
+ * Caller-facing config for `createClient(...)`.
7
7
  *
8
- * Pick exactly one of:
9
- * - `accessToken` (string or callback) for the static Bearer flow
10
- * - `serviceId` + `serviceSecret` for OAuth2 client_credentials
8
+ * `createClient()` (no args) reads everything from the standard
9
+ * `UENGAGE_*` environment variables convenient for Lambdas that
10
+ * already have their config injected by the deploy stack. Any field
11
+ * passed explicitly overrides the matching env default for that one
12
+ * call only (no shared mutable state, no singleton).
11
13
  *
12
- * Without either, calls throw `ConfigError` on the first request.
14
+ * Auth-mode fields are mutually exclusive. Pick one:
15
+ * - `serviceId` + `serviceSecret` OAuth2 client_credentials.
16
+ * - `authToken` static Bearer token, or async
17
+ * callback that returns one.
18
+ * - `session: {id, token}` legacy uEngage (id, apiToken) /
19
+ * (id, addo_contacts_mapping.token)
20
+ * pair. The SDK probes the business
21
+ * surface (users) first, falls back
22
+ * to the customer surface
23
+ * (addo_contacts_mapping) if the
24
+ * business probe returns
25
+ * `invalid_grant`, and caches the
26
+ * resulting JWT.
27
+ *
28
+ * Passing more than one explicitly is a `ConfigError`. Passing any one
29
+ * of them suppresses every env-derived auth default, so a caller's
30
+ * explicit override is never silently merged with env credentials of
31
+ * a different mode.
13
32
  */
14
33
  export interface ClientConfig {
15
34
  baseUrl?: string;
16
35
  /**
17
36
  * Auth surface base used to bootstrap the first client_credentials
18
- * mint. Defaults to `${baseUrl}/auth/business`. Once a token exists,
19
- * future auth calls follow the token's `iss` claim.
37
+ * mint. Defaults to `${baseUrl}/auth/business`.
20
38
  */
21
39
  authBaseUrl?: string;
22
40
  /**
23
- * Customer auth surface base used by `withSessionToken`. Defaults
24
- * to `${baseUrl}/auth/customer`.
41
+ * Customer auth surface base used by `session` exchanges. Defaults to
42
+ * `${baseUrl}/auth/customer`.
25
43
  */
26
44
  customerAuthBaseUrl?: string;
27
- accessToken?: string | (() => string | Promise<string>);
45
+ /** OAuth2 `client_credentials` clientId. Pair with `serviceSecret`. */
28
46
  serviceId?: string;
47
+ /** OAuth2 `client_credentials` clientSecret. Pair with `serviceId`. */
29
48
  serviceSecret?: string;
30
49
  /** Space-separated scope list to request when minting via client_credentials. */
31
50
  scope?: string;
51
+ /** Static Bearer JWT, or async callback that returns one. */
52
+ authToken?: string | (() => string | Promise<string>);
53
+ /**
54
+ * Legacy uEngage (id, token) pair. `id` is `users.userId` for staff
55
+ * users (matched via the business surface) or
56
+ * `addo_contacts_mapping.id`/`contactId` for customers (matched via
57
+ * the customer surface). The SDK probes the business surface first
58
+ * and falls back to customer on `invalid_grant`.
59
+ */
60
+ session?: {
61
+ id: string | number;
62
+ token: string;
63
+ };
64
+ /**
65
+ * `(accessToken, refreshToken)` pair from a finished login flow
66
+ * (`auth.loginWithPassword(...)`, `auth.verifyOtp(...)`, etc). The
67
+ * SDK uses the access token until it expires, then rotates via
68
+ * `auth.refresh(...)` transparently. `onRotate` fires after every
69
+ * rotation so callers can persist the new pair.
70
+ */
71
+ tokens?: {
72
+ accessToken: string;
73
+ refreshToken: string;
74
+ /** Access token TTL (seconds), as returned by the auth surface. */
75
+ expiresIn: number;
76
+ /** OAuth client id used during the original login (required by the refresh handler). */
77
+ clientId: string;
78
+ onRotate?: (pair: {
79
+ accessToken: string;
80
+ refreshToken: string;
81
+ expiresAt: number;
82
+ }) => void | Promise<void>;
83
+ };
32
84
  /**
33
85
  * Service identifier the audit client should stamp into `actor.via`
34
86
  * on emitted events. Defaults to `serviceId` when set; otherwise
@@ -41,48 +93,22 @@ export interface ClientConfig {
41
93
  export interface PlatformClient {
42
94
  business: BusinessClient;
43
95
  audit: AuditClient;
44
- auth: typeof auth;
45
- /**
46
- * Return a derived client bound to the supplied access token.
47
- * Inherits `baseUrl` and `fetchFn`; replaces the token source with
48
- * the new one. Use case: BFF handlers that want to call the
49
- * platform API as the end user instead of as the service.
50
- */
51
- withToken(token: string | (() => string | Promise<string>)): PlatformClient;
96
+ zones: ZonesClient;
97
+ auth: typeof authNamespace;
52
98
  /**
53
- * Return a derived client that exchanges a legacy customer session
54
- * token (from `addo_contacts_mapping.token`) for a Bearer JWT
55
- * transparently on each call. The session token is the persistent
56
- * credential exchanges happen lazily on token-cache miss and on
57
- * 401 retries. When the legacy session is revoked, the next
58
- * exchange returns 401 and surfaces as `AuthenticationError`.
99
+ * Resolve the current access token, minting via the configured auth
100
+ * mode if the cache is cold. Useful for `auth.verifyAccessToken(...)`
101
+ * round-trips and for callers that want to log / forward the bearer
102
+ * to a downstream service.
103
+ *
104
+ * Throws `ConfigError` when the client was built with no auth mode.
59
105
  */
60
- withSessionToken(sessionToken: string): PlatformClient;
106
+ getAccessToken(): Promise<string>;
61
107
  }
62
108
  /**
63
- * Build a fresh, isolated client from explicit config. Each call
64
- * gets its own TokenSource state concurrent `createClient(...)` use
65
- * does not stampede the cache.
109
+ * Build a fresh, isolated client. With no args, reads `UENGAGE_*`
110
+ * env vars; explicit fields override per call. Each call gets its own
111
+ * TokenSource state concurrent `createClient(...)` use does not
112
+ * stampede the cache.
66
113
  */
67
114
  export declare function createClient(input?: ClientConfig): PlatformClient;
68
- /**
69
- * Default client. Reads config from environment variables on first
70
- * property access (so test setups that mutate `process.env` after
71
- * import work). Use `createClient(...)` when you need an isolated
72
- * instance with explicit config.
73
- *
74
- * UENGAGE_BASE_URL defaults to https://api.platform.uengage.io
75
- * UENGAGE_AUTH_BASE_URL auth surface override (default ${baseUrl}/auth/business)
76
- * UENGAGE_AUTH_TOKEN static Bearer token (overrides client_credentials)
77
- * UENGAGE_SERVICE_ID OAuth2 client_credentials clientId
78
- * UENGAGE_SERVICE_SECRET OAuth2 client_credentials clientSecret
79
- * UENGAGE_SERVICE_SCOPE optional space-separated scope list
80
- */
81
- export declare const platform: PlatformClient;
82
- /** Test-only: drop the singleton cache between cases. */
83
- export declare function _resetPlatformSingleton(): void;
84
- /**
85
- * Convenience: shorthand for `platform.withToken(token)`.
86
- * BFF handlers commonly call this once per request.
87
- */
88
- export declare function withToken(token: string | (() => string | Promise<string>)): PlatformClient;