@uengage.io/platform-sdk 0.15.0 → 2.0.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.
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpsellApiError = void 0;
4
+ exports.createUpsellClient = createUpsellClient;
5
+ const config_1 = require("../config");
6
+ const http_1 = require("../http");
7
+ class UpsellApiError extends Error {
8
+ status;
9
+ body;
10
+ constructor(status, body) {
11
+ super(`upsell API ${status}: ${body}`);
12
+ this.name = 'UpsellApiError';
13
+ this.status = status;
14
+ this.body = body;
15
+ }
16
+ }
17
+ exports.UpsellApiError = UpsellApiError;
18
+ function assertPositiveInt(label, value) {
19
+ if (!Number.isInteger(value) || value <= 0) {
20
+ throw new Error(`upsell.${label}: expected a positive integer (got ${JSON.stringify(value)})`);
21
+ }
22
+ }
23
+ function assertTenantIds(label, input) {
24
+ if (input.parentId !== undefined)
25
+ assertPositiveInt(`${label}.parentId`, input.parentId);
26
+ if (input.businessId !== undefined) {
27
+ assertPositiveInt(`${label}.businessId`, input.businessId);
28
+ if (input.parentId === undefined) {
29
+ throw new Error(`upsell.${label}: businessId requires parentId`);
30
+ }
31
+ }
32
+ }
33
+ /**
34
+ * Build the `upsell` namespace.
35
+ *
36
+ * Shape and contract mirror {@link createZonesClient} - lazy config
37
+ * resolution via {@link ConfigState}, shared 401-retry via
38
+ * {@link sendWithAuthRetry}, immutable per-call config; no globals.
39
+ *
40
+ * Reads (`placements`, `suggest`) accept user or service tokens —
41
+ * channel apps call them with customer session JWTs. Admin methods
42
+ * require a service-actor token; the server answers 403 otherwise and
43
+ * we surface it as {@link UpsellApiError}.
44
+ */
45
+ function createUpsellClient(input = {}) {
46
+ const state = new config_1.ConfigState();
47
+ state.apply(input);
48
+ async function send(method, path, query, body) {
49
+ const config = state.resolve();
50
+ const url = `${config.baseUrl}${path}${query ?? ''}`;
51
+ const payload = body === undefined ? undefined : JSON.stringify(body);
52
+ return (0, http_1.sendWithAuthRetry)(config, { method, path, url, body: payload });
53
+ }
54
+ async function expectJson(res) {
55
+ if (!res.ok)
56
+ throw new UpsellApiError(res.status, await res.text());
57
+ return (await res.json());
58
+ }
59
+ const client = {
60
+ config(opts) {
61
+ state.apply(opts);
62
+ return client;
63
+ },
64
+ auth(opts) {
65
+ state.setAuth(opts);
66
+ return client;
67
+ },
68
+ async placements(query) {
69
+ assertPositiveInt('placements.parentId', query.parentId);
70
+ assertPositiveInt('placements.businessId', query.businessId);
71
+ const params = new URLSearchParams({
72
+ channel: query.channel,
73
+ parentId: String(query.parentId),
74
+ businessId: String(query.businessId),
75
+ });
76
+ const res = await send('GET', '/v1/upsell/placements', `?${params.toString()}`);
77
+ const body = await expectJson(res);
78
+ return body.placements;
79
+ },
80
+ async suggest(input) {
81
+ if (!input || typeof input !== 'object' || !input.tenant) {
82
+ throw new Error('upsell.suggest: input must include `tenant` and `context.cart`');
83
+ }
84
+ assertPositiveInt('suggest.tenant.parentId', input.tenant.parentId);
85
+ assertPositiveInt('suggest.tenant.businessId', input.tenant.businessId);
86
+ if (!input.context?.cart || !Array.isArray(input.context.cart.items)) {
87
+ throw new Error('upsell.suggest: context.cart.items must be an array');
88
+ }
89
+ const res = await send('POST', '/v1/upsell/suggestions', undefined, input);
90
+ return expectJson(res);
91
+ },
92
+ async reportEvents(input) {
93
+ if (!input?.events?.length) {
94
+ throw new Error('upsell.reportEvents: events must be a non-empty array');
95
+ }
96
+ assertPositiveInt('reportEvents.tenant.parentId', input.tenant.parentId);
97
+ assertPositiveInt('reportEvents.tenant.businessId', input.tenant.businessId);
98
+ const res = await send('POST', '/v1/upsell/events', undefined, input);
99
+ return expectJson(res);
100
+ },
101
+ async adminListPlacements(opts = {}) {
102
+ if (opts.parentId !== undefined)
103
+ assertPositiveInt('adminListPlacements.parentId', opts.parentId);
104
+ const qs = opts.parentId !== undefined ? `?parentId=${opts.parentId}` : undefined;
105
+ const res = await send('GET', '/v1/upsell/admin/placements', qs);
106
+ const body = await expectJson(res);
107
+ return body.placements;
108
+ },
109
+ async adminUpsertPlacement(input) {
110
+ assertTenantIds('adminUpsertPlacement', input);
111
+ const res = await send('PUT', '/v1/upsell/admin/placements', undefined, input);
112
+ return expectJson(res);
113
+ },
114
+ async adminDeletePlacement(input) {
115
+ assertTenantIds('adminDeletePlacement', input);
116
+ const params = new URLSearchParams({ channel: input.channel, key: input.key });
117
+ if (input.parentId !== undefined)
118
+ params.set('parentId', String(input.parentId));
119
+ if (input.businessId !== undefined)
120
+ params.set('businessId', String(input.businessId));
121
+ // Omitting parentId targets the platform default row, which the
122
+ // server refuses to delete without an explicit confirmation. Send
123
+ // the flag through rather than inferring it, so a caller that meant
124
+ // to scope the delete still gets the 400 instead of silently
125
+ // wiping the default for every tenant.
126
+ if (input.confirmDeleteDefault)
127
+ params.set('confirmDeleteDefault', 'true');
128
+ const res = await send('DELETE', '/v1/upsell/admin/placements', `?${params.toString()}`);
129
+ if (res.status === 204)
130
+ return;
131
+ throw new UpsellApiError(res.status, await res.text());
132
+ },
133
+ };
134
+ return client;
135
+ }
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Vwc2VsbC9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaUZBLGdEQW9HQztBQXJMRCxzQ0FLbUI7QUFDbkIsa0NBQTRDO0FBbUM1QyxNQUFhLGNBQWUsU0FBUSxLQUFLO0lBQzlCLE1BQU0sQ0FBUztJQUNmLElBQUksQ0FBUztJQUV0QixZQUFZLE1BQWMsRUFBRSxJQUFZO1FBQ3RDLEtBQUssQ0FBQyxjQUFjLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBVkQsd0NBVUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxzQ0FBc0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakcsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxLQUFhLEVBQUUsS0FBaUQ7SUFDdkYsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVM7UUFBRSxpQkFBaUIsQ0FBQyxHQUFHLEtBQUssV0FBVyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6RixJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbkMsaUJBQWlCLENBQUMsR0FBRyxLQUFLLGFBQWEsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0QsSUFB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QUFDLENBQUM7WUFDdkYsZ0VBQWdFO1lBQ2hFLGtFQUFrRTtZQUNsRSxvRUFBb0U7WUFDcEUsNkRBQTZEO1lBQzdELHVDQUF1QztZQUN2QyxJQUFJLEtBQUssQ0FBQyxvQkFBb0I7Z0JBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMzRSxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsNkJBQTZCLEVBQUUsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHO2dCQUFFLE9BQU87WUFDL0IsTUFBTSxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZmlnU3RhdGUsXG4gIHR5cGUgUGxhdGZvcm1BdXRoLFxuICB0eXBlIFBsYXRmb3JtQXV0aElucHV0LFxuICB0eXBlIFBsYXRmb3JtQ29uZmlnSW5wdXQsXG59IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBzZW5kV2l0aEF1dGhSZXRyeSB9IGZyb20gJy4uL2h0dHAnO1xuaW1wb3J0IHR5cGUge1xuICBQbGFjZW1lbnQsXG4gIFBsYWNlbWVudERlbGV0ZUlucHV0LFxuICBQbGFjZW1lbnRSZWNvcmQsXG4gIFBsYWNlbWVudFVwc2VydElucHV0LFxuICBQbGFjZW1lbnRzUXVlcnksXG4gIFN1Z2dlc3Rpb25zSW5wdXQsXG4gIFN1Z2dlc3Rpb25zUmVzdWx0LFxuICBVcHNlbGxFdmVudHNJbnB1dCxcbn0gZnJvbSAnLi9zY2hlbWEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwc2VsbENsaWVudCB7XG4gIGNvbmZpZyhpbnB1dDogUGxhdGZvcm1Db25maWdJbnB1dCk6IFVwc2VsbENsaWVudDtcbiAgYXV0aChpbnB1dDogUGxhdGZvcm1BdXRoSW5wdXQgfCBQbGF0Zm9ybUF1dGgpOiBVcHNlbGxDbGllbnQ7XG5cbiAgLyoqIEdFVCAvdjEvdXBzZWxsL3BsYWNlbWVudHMgLSByZXNvbHZlZCBwbGFjZW1lbnRzIGZvciBhIGNoYW5uZWwgKyB0ZW5hbnQuICovXG4gIHBsYWNlbWVudHMocXVlcnk6IFBsYWNlbWVudHNRdWVyeSk6IFByb21pc2U8UGxhY2VtZW50W10+O1xuICAvKiogUE9TVCAvdjEvdXBzZWxsL3N1Z2dlc3Rpb25zIC0gaXRlbXMgZm9yIG9uZSBwbGFjZW1lbnQgZ2l2ZW4gdGhlIGxpdmUgY2FydC4gKi9cbiAgc3VnZ2VzdChpbnB1dDogU3VnZ2VzdGlvbnNJbnB1dCk6IFByb21pc2U8U3VnZ2VzdGlvbnNSZXN1bHQ+O1xuICAvKipcbiAgICogUE9TVCAvdjEvdXBzZWxsL2V2ZW50cyAtIHJlcG9ydCBzaG93biAvIGFkZGVkIC8gaWdub3JlZCBmb3IgYVxuICAgKiByZW5kZXJlZCBwbGFjZW1lbnQuIEZpcmUtYW5kLWZvcmdldDsgZmVlZHMgYXR0YWNoLXJhdGUgbWVhc3VyZW1lbnRcbiAgICogYW5kIHRoZSB3ZWlnaHQgdHVuaW5nIHRoYXQgZm9sbG93cyBpdC5cbiAgICovXG4gIHJlcG9ydEV2ZW50cyhpbnB1dDogVXBzZWxsRXZlbnRzSW5wdXQpOiBQcm9taXNlPHsgYWNjZXB0ZWQ6IG51bWJlciB9PjtcblxuICAvKiogR0VUIC92MS91cHNlbGwvYWRtaW4vcGxhY2VtZW50cyAtIHJhdyBjb25maWcgcm93cyAoc2VydmljZS1hY3RvciBvbmx5KS4gKi9cbiAgYWRtaW5MaXN0UGxhY2VtZW50cyhvcHRzPzogeyBwYXJlbnRJZD86IG51bWJlciB9KTogUHJvbWlzZTxQbGFjZW1lbnRSZWNvcmRbXT47XG4gIC8qKiBQVVQgL3YxL3Vwc2VsbC9hZG1pbi9wbGFjZW1lbnRzIC0gY3JlYXRlL3JlcGxhY2UgYSBjb25maWcgcm93IChzZXJ2aWNlLWFjdG9yIG9ubHkpLiAqL1xuICBhZG1pblVwc2VydFBsYWNlbWVudChpbnB1dDogUGxhY2VtZW50VXBzZXJ0SW5wdXQpOiBQcm9taXNlPFBsYWNlbWVudFJlY29yZD47XG4gIC8qKiBERUxFVEUgL3YxL3Vwc2VsbC9hZG1pbi9wbGFjZW1lbnRzIC0gdGhyb3dzIFVwc2VsbEFwaUVycm9yKDQwNCkgaWYgYWJzZW50LiAqL1xuICBhZG1pbkRlbGV0ZVBsYWNlbWVudChpbnB1dDogUGxhY2VtZW50RGVsZXRlSW5wdXQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgY2xhc3MgVXBzZWxsQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKGB1cHNlbGwgQVBJICR7c3RhdHVzfTogJHtib2R5fWApO1xuICAgIHRoaXMubmFtZSA9ICdVcHNlbGxBcGlFcnJvcic7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRQb3NpdGl2ZUludChsYWJlbDogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgfHwgdmFsdWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdXBzZWxsLiR7bGFiZWx9OiBleHBlY3RlZCBhIHBvc2l0aXZlIGludGVnZXIgKGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0pYCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0VGVuYW50SWRzKGxhYmVsOiBzdHJpbmcsIGlucHV0OiB7IHBhcmVudElkPzogbnVtYmVyOyBidXNpbmVzc0lkPzogbnVtYmVyIH0pOiB2b2lkIHtcbiAgaWYgKGlucHV0LnBhcmVudElkICE9PSB1bmRlZmluZWQpIGFzc2VydFBvc2l0aXZlSW50KGAke2xhYmVsfS5wYXJlbnRJZGAsIGlucHV0LnBhcmVudElkKTtcbiAgaWYgKGlucHV0LmJ1c2luZXNzSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBvc2l0aXZlSW50KGAke2xhYmVsfS5idXNpbmVzc0lkYCwgaW5wdXQuYnVzaW5lc3NJZCk7XG4gICAgaWYgKGlucHV0LnBhcmVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdXBzZWxsLiR7bGFiZWx9OiBidXNpbmVzc0lkIHJlcXVpcmVzIHBhcmVudElkYCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGB1cHNlbGxgIG5hbWVzcGFjZS5cbiAqXG4gKiBTaGFwZSBhbmQgY29udHJhY3QgbWlycm9yIHtAbGluayBjcmVhdGVab25lc0NsaWVudH0gLSBsYXp5IGNvbmZpZ1xuICogcmVzb2x1dGlvbiB2aWEge0BsaW5rIENvbmZpZ1N0YXRlfSwgc2hhcmVkIDQwMS1yZXRyeSB2aWFcbiAqIHtAbGluayBzZW5kV2l0aEF1dGhSZXRyeX0sIGltbXV0YWJsZSBwZXItY2FsbCBjb25maWc7IG5vIGdsb2JhbHMuXG4gKlxuICogUmVhZHMgKGBwbGFjZW1lbnRzYCwgYHN1Z2dlc3RgKSBhY2NlcHQgdXNlciBvciBzZXJ2aWNlIHRva2VucyDigJRcbiAqIGNoYW5uZWwgYXBwcyBjYWxsIHRoZW0gd2l0aCBjdXN0b21lciBzZXNzaW9uIEpXVHMuIEFkbWluIG1ldGhvZHNcbiAqIHJlcXVpcmUgYSBzZXJ2aWNlLWFjdG9yIHRva2VuOyB0aGUgc2VydmVyIGFuc3dlcnMgNDAzIG90aGVyd2lzZSBhbmRcbiAqIHdlIHN1cmZhY2UgaXQgYXMge0BsaW5rIFVwc2VsbEFwaUVycm9yfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVwc2VsbENsaWVudChpbnB1dDogUGxhdGZvcm1Db25maWdJbnB1dCA9IHt9KTogVXBzZWxsQ2xpZW50IHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgQ29uZmlnU3RhdGUoKTtcbiAgc3RhdGUuYXBwbHkoaW5wdXQpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHNlbmQoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHF1ZXJ5Pzogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgIGNvbnN0IHVybCA9IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0ke3F1ZXJ5ID8/ICcnfWA7XG4gICAgY29uc3QgcGF5bG9hZCA9IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuICAgIHJldHVybiBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHsgbWV0aG9kLCBwYXRoLCB1cmwsIGJvZHk6IHBheWxvYWQgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBleHBlY3RKc29uPFQ+KHJlczogUmVzcG9uc2UpOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IFVwc2VsbEFwaUVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgVDtcbiAgfVxuXG4gIGNvbnN0IGNsaWVudDogVXBzZWxsQ2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG5cbiAgICBhc3luYyBwbGFjZW1lbnRzKHF1ZXJ5KSB7XG4gICAgICBhc3NlcnRQb3NpdGl2ZUludCgncGxhY2VtZW50cy5wYXJlbnRJZCcsIHF1ZXJ5LnBhcmVudElkKTtcbiAgICAgIGFzc2VydFBvc2l0aXZlSW50KCdwbGFjZW1lbnRzLmJ1c2luZXNzSWQnLCBxdWVyeS5idXNpbmVzc0lkKTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICBjaGFubmVsOiBxdWVyeS5jaGFubmVsLFxuICAgICAgICBwYXJlbnRJZDogU3RyaW5nKHF1ZXJ5LnBhcmVudElkKSxcbiAgICAgICAgYnVzaW5lc3NJZDogU3RyaW5nKHF1ZXJ5LmJ1c2luZXNzSWQpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kKCdHRVQnLCAnL3YxL3Vwc2VsbC9wbGFjZW1lbnRzJywgYD8ke3BhcmFtcy50b1N0cmluZygpfWApO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGV4cGVjdEpzb248eyBwbGFjZW1lbnRzOiBQbGFjZW1lbnRbXSB9PihyZXMpO1xuICAgICAgcmV0dXJuIGJvZHkucGxhY2VtZW50cztcbiAgICB9LFxuXG4gICAgYXN5bmMgc3VnZ2VzdChpbnB1dCkge1xuICAgICAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdvYmplY3QnIHx8ICFpbnB1dC50ZW5hbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cHNlbGwuc3VnZ2VzdDogaW5wdXQgbXVzdCBpbmNsdWRlIGB0ZW5hbnRgIGFuZCBgY29udGV4dC5jYXJ0YCcpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0UG9zaXRpdmVJbnQoJ3N1Z2dlc3QudGVuYW50LnBhcmVudElkJywgaW5wdXQudGVuYW50LnBhcmVudElkKTtcbiAgICAgIGFzc2VydFBvc2l0aXZlSW50KCdzdWdnZXN0LnRlbmFudC5idXNpbmVzc0lkJywgaW5wdXQudGVuYW50LmJ1c2luZXNzSWQpO1xuICAgICAgaWYgKCFpbnB1dC5jb250ZXh0Py5jYXJ0IHx8ICFBcnJheS5pc0FycmF5KGlucHV0LmNvbnRleHQuY2FydC5pdGVtcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cHNlbGwuc3VnZ2VzdDogY29udGV4dC5jYXJ0Lml0ZW1zIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmQoJ1BPU1QnLCAnL3YxL3Vwc2VsbC9zdWdnZXN0aW9ucycsIHVuZGVmaW5lZCwgaW5wdXQpO1xuICAgICAgcmV0dXJuIGV4cGVjdEpzb248U3VnZ2VzdGlvbnNSZXN1bHQ+KHJlcyk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlcG9ydEV2ZW50cyhpbnB1dCkge1xuICAgICAgaWYgKCFpbnB1dD8uZXZlbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cHNlbGwucmVwb3J0RXZlbnRzOiBldmVudHMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheScpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0UG9zaXRpdmVJbnQoJ3JlcG9ydEV2ZW50cy50ZW5hbnQucGFyZW50SWQnLCBpbnB1dC50ZW5hbnQucGFyZW50SWQpO1xuICAgICAgYXNzZXJ0UG9zaXRpdmVJbnQoJ3JlcG9ydEV2ZW50cy50ZW5hbnQuYnVzaW5lc3NJZCcsIGlucHV0LnRlbmFudC5idXNpbmVzc0lkKTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmQoJ1BPU1QnLCAnL3YxL3Vwc2VsbC9ldmVudHMnLCB1bmRlZmluZWQsIGlucHV0KTtcbiAgICAgIHJldHVybiBleHBlY3RKc29uPHsgYWNjZXB0ZWQ6IG51bWJlciB9PihyZXMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBhZG1pbkxpc3RQbGFjZW1lbnRzKG9wdHMgPSB7fSkge1xuICAgICAgaWYgKG9wdHMucGFyZW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgYXNzZXJ0UG9zaXRpdmVJbnQoJ2FkbWluTGlzdFBsYWNlbWVudHMucGFyZW50SWQnLCBvcHRzLnBhcmVudElkKTtcbiAgICAgIGNvbnN0IHFzID0gb3B0cy5wYXJlbnRJZCAhPT0gdW5kZWZpbmVkID8gYD9wYXJlbnRJZD0ke29wdHMucGFyZW50SWR9YCA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmQoJ0dFVCcsICcvdjEvdXBzZWxsL2FkbWluL3BsYWNlbWVudHMnLCBxcyk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgZXhwZWN0SnNvbjx7IHBsYWNlbWVudHM6IFBsYWNlbWVudFJlY29yZFtdIH0+KHJlcyk7XG4gICAgICByZXR1cm4gYm9keS5wbGFjZW1lbnRzO1xuICAgIH0sXG5cbiAgICBhc3luYyBhZG1pblVwc2VydFBsYWNlbWVudChpbnB1dCkge1xuICAgICAgYXNzZXJ0VGVuYW50SWRzKCdhZG1pblVwc2VydFBsYWNlbWVudCcsIGlucHV0KTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmQoJ1BVVCcsICcvdjEvdXBzZWxsL2FkbWluL3BsYWNlbWVudHMnLCB1bmRlZmluZWQsIGlucHV0KTtcbiAgICAgIHJldHVybiBleHBlY3RKc29uPFBsYWNlbWVudFJlY29yZD4ocmVzKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRtaW5EZWxldGVQbGFjZW1lbnQoaW5wdXQpIHtcbiAgICAgIGFzc2VydFRlbmFudElkcygnYWRtaW5EZWxldGVQbGFjZW1lbnQnLCBpbnB1dCk7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgY2hhbm5lbDogaW5wdXQuY2hhbm5lbCwga2V5OiBpbnB1dC5rZXkgfSk7XG4gICAgICBpZiAoaW5wdXQucGFyZW50SWQgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgncGFyZW50SWQnLCBTdHJpbmcoaW5wdXQucGFyZW50SWQpKTtcbiAgICAgIGlmIChpbnB1dC5idXNpbmVzc0lkICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ2J1c2luZXNzSWQnLCBTdHJpbmcoaW5wdXQuYnVzaW5lc3NJZCkpO1xuICAgICAgLy8gT21pdHRpbmcgcGFyZW50SWQgdGFyZ2V0cyB0aGUgcGxhdGZvcm0gZGVmYXVsdCByb3csIHdoaWNoIHRoZVxuICAgICAgLy8gc2VydmVyIHJlZnVzZXMgdG8gZGVsZXRlIHdpdGhvdXQgYW4gZXhwbGljaXQgY29uZmlybWF0aW9uLiBTZW5kXG4gICAgICAvLyB0aGUgZmxhZyB0aHJvdWdoIHJhdGhlciB0aGFuIGluZmVycmluZyBpdCwgc28gYSBjYWxsZXIgdGhhdCBtZWFudFxuICAgICAgLy8gdG8gc2NvcGUgdGhlIGRlbGV0ZSBzdGlsbCBnZXRzIHRoZSA0MDAgaW5zdGVhZCBvZiBzaWxlbnRseVxuICAgICAgLy8gd2lwaW5nIHRoZSBkZWZhdWx0IGZvciBldmVyeSB0ZW5hbnQuXG4gICAgICBpZiAoaW5wdXQuY29uZmlybURlbGV0ZURlZmF1bHQpIHBhcmFtcy5zZXQoJ2NvbmZpcm1EZWxldGVEZWZhdWx0JywgJ3RydWUnKTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmQoJ0RFTEVURScsICcvdjEvdXBzZWxsL2FkbWluL3BsYWNlbWVudHMnLCBgPyR7cGFyYW1zLnRvU3RyaW5nKCl9YCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjA0KSByZXR1cm47XG4gICAgICB0aHJvdyBuZXcgVXBzZWxsQXBpRXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gY2xpZW50O1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export { createUpsellClient, UpsellApiError, type UpsellClient } from './client';
2
+ export type { Cart, CartItem, Channel, KnownLayout, LadderRung, Layout, Placement, PlacementDeleteInput, PlacementDisplay, PlacementRecord, PlacementScope, PlacementUpsertInput, PlacementsQuery, ReasonCode, StrategyParams, SuggestionsInput, SuggestionsResult, Tenant, Touchpoint, UpsellEvent, UpsellEventType, UpsellEventsInput, UpsellItem, UpsellStrategy, } from './schema';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpsellApiError = exports.createUpsellClient = void 0;
4
+ var client_1 = require("./client");
5
+ Object.defineProperty(exports, "createUpsellClient", { enumerable: true, get: function () { return client_1.createUpsellClient; } });
6
+ Object.defineProperty(exports, "UpsellApiError", { enumerable: true, get: function () { return client_1.UpsellApiError; } });
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXBzZWxsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFpRjtBQUF4RSw0R0FBQSxrQkFBa0IsT0FBQTtBQUFFLHdHQUFBLGNBQWMsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGNyZWF0ZVVwc2VsbENsaWVudCwgVXBzZWxsQXBpRXJyb3IsIHR5cGUgVXBzZWxsQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQnO1xuZXhwb3J0IHR5cGUge1xuICBDYXJ0LFxuICBDYXJ0SXRlbSxcbiAgQ2hhbm5lbCxcbiAgS25vd25MYXlvdXQsXG4gIExhZGRlclJ1bmcsXG4gIExheW91dCxcbiAgUGxhY2VtZW50LFxuICBQbGFjZW1lbnREZWxldGVJbnB1dCxcbiAgUGxhY2VtZW50RGlzcGxheSxcbiAgUGxhY2VtZW50UmVjb3JkLFxuICBQbGFjZW1lbnRTY29wZSxcbiAgUGxhY2VtZW50VXBzZXJ0SW5wdXQsXG4gIFBsYWNlbWVudHNRdWVyeSxcbiAgUmVhc29uQ29kZSxcbiAgU3RyYXRlZ3lQYXJhbXMsXG4gIFN1Z2dlc3Rpb25zSW5wdXQsXG4gIFN1Z2dlc3Rpb25zUmVzdWx0LFxuICBUZW5hbnQsXG4gIFRvdWNocG9pbnQsXG4gIFVwc2VsbEV2ZW50LFxuICBVcHNlbGxFdmVudFR5cGUsXG4gIFVwc2VsbEV2ZW50c0lucHV0LFxuICBVcHNlbGxJdGVtLFxuICBVcHNlbGxTdHJhdGVneSxcbn0gZnJvbSAnLi9zY2hlbWEnO1xuIl19
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Type surface for the platform Upsell API.
3
+ *
4
+ * Two consumer-facing calls: `placements(...)` (which upsell surfaces a
5
+ * channel should render for a tenant) and `suggest(...)` (items for one
6
+ * placement given the live cart). `reportEvents(...)` feeds attach-rate
7
+ * telemetry. Placement config is managed via the service-actor-only
8
+ * admin methods.
9
+ */
10
+ export type Channel = 'mobile_app' | 'kiosk' | 'whitelabel_web' | 'whatsapp' | 'voice';
11
+ /**
12
+ * A moment in the customer journey — the unit of platform policy
13
+ * (price band, max items, and later the signal weight profile). A
14
+ * placement is a channel's journey label pointing at one of these.
15
+ */
16
+ export type Touchpoint = 'home' | 'menu_browsing' | 'menu_composing' | 'search_no_result' | 'cart' | 'pre_checkout' | 'post_order';
17
+ /**
18
+ * Rendering hint, owned by the channel frontend — the platform never
19
+ * interprets it. Known values are listed for editor completion, but any
20
+ * lowercase identifier is valid so new layouts need no SDK release.
21
+ */
22
+ export type KnownLayout = 'carousel_2up' | 'horizontal_carousel' | 'grid_2xn_modal' | 'carousel_1up' | 'vertical_list' | 'grid_3xn' | 'compact_list' | 'hero_banner';
23
+ export type Layout = KnownLayout | (string & {});
24
+ /** Why an item was recommended. Channels render these in customer language. */
25
+ export type ReasonCode = 'popular_now' | 'completes_meal' | 'often_ordered_together' | 'your_usual' | 'chefs_pick';
26
+ /** Which rung of the resolution ladder answered the request. */
27
+ export type LadderRung = 'full_engine' | 'band_relaxation' | 'popularity_floor' | 'backup_suggestions' | 'empty_degraded';
28
+ export type UpsellStrategy = 'menu-order-popularity' | 'legacy-catalog-sample';
29
+ export interface PlacementDisplay {
30
+ title: string;
31
+ /** Requested count. Touchpoint policy may cap it lower — see `meta.maxItems`. */
32
+ maxItems: number;
33
+ layout: Layout;
34
+ }
35
+ /** Resolved public placement (business override > brand > platform default). */
36
+ export interface Placement {
37
+ key: string;
38
+ channel: Channel;
39
+ touchpoint: Touchpoint;
40
+ enabled: boolean;
41
+ display: PlacementDisplay;
42
+ configVersion: string;
43
+ }
44
+ export interface Tenant {
45
+ parentId: number;
46
+ businessId: number;
47
+ }
48
+ export interface CartItem {
49
+ itemId: number;
50
+ qty: number;
51
+ unitPrice: number;
52
+ /** Optional; lets the dietary gate and category no-repeat see cart contents. */
53
+ itemSlug?: string;
54
+ sectionName?: string;
55
+ /** Legacy vegNonvegBoth flag: 1 veg, 2 non-veg, 3 both/egg. */
56
+ veg?: number;
57
+ }
58
+ export interface Cart {
59
+ items: CartItem[];
60
+ subtotal: number;
61
+ }
62
+ export interface SuggestionsInput {
63
+ channel: Channel;
64
+ placement: string;
65
+ tenant: Tenant;
66
+ context: {
67
+ cart: Cart;
68
+ fulfilmentMode?: 'delivery' | 'pickup' | 'dine_in';
69
+ /**
70
+ * Optional; unused by the v1 scorers. In the contract from day one
71
+ * so personalization lands without a break. `id` MUST be the opaque
72
+ * platform customer id, never a mobile number.
73
+ */
74
+ customer?: {
75
+ id: string;
76
+ };
77
+ /**
78
+ * Optional; not yet acted on. Impression fatigue is session-scoped
79
+ * and shared across touchpoints — send it now so channels
80
+ * instrument once rather than twice.
81
+ */
82
+ sessionId?: string;
83
+ };
84
+ }
85
+ export interface UpsellItem {
86
+ itemId: number;
87
+ itemName: string;
88
+ itemSlug: string | null;
89
+ description: string | null;
90
+ sectionId: number | null;
91
+ sectionName: string | null;
92
+ /** Selling price (INR). */
93
+ price: number;
94
+ image: string | null;
95
+ /** Raw legacy `vegNonvegBoth` flag, passed through untranslated. */
96
+ veg: number | null;
97
+ brandId: number | null;
98
+ reasonCode: ReasonCode;
99
+ }
100
+ export interface SuggestionsResult {
101
+ placement: string;
102
+ touchpoint: Touchpoint;
103
+ items: UpsellItem[];
104
+ meta: {
105
+ enabled: boolean;
106
+ strategy: UpsellStrategy;
107
+ configVersion: string;
108
+ /** Which ladder rung produced these items. */
109
+ rung: LadderRung;
110
+ /** Effective cap applied: min(display.maxItems, touchpoint policy). */
111
+ maxItems: number;
112
+ /** How long the client may reuse this response, in seconds. */
113
+ ttlSeconds: number;
114
+ /** True when the candidate source failed and the service degraded to empty. */
115
+ degraded?: boolean;
116
+ };
117
+ }
118
+ /** Merchant-controlled selection inputs. */
119
+ export interface StrategyParams {
120
+ includedItemSlugs?: string[];
121
+ includedSections?: string[];
122
+ excludedSections?: string[];
123
+ /** "Never Suggest These" — absolute, overrides the priority list. */
124
+ neverSuggestItemSlugs?: string[];
125
+ /** "My Priority Items" — occupy reserved slots ahead of scored items. */
126
+ priorityItemSlugs?: string[];
127
+ /** "Backup Suggestions" — 2-6 items, served when everything else is empty. */
128
+ backupItemSlugs?: string[];
129
+ excludeCartItems?: boolean;
130
+ maxPrice?: number;
131
+ }
132
+ export type PlacementScope = 'default' | 'tenant' | 'business';
133
+ /** Raw admin-plane config row (no precedence merge applied). */
134
+ export interface PlacementRecord {
135
+ scope: PlacementScope;
136
+ parentId?: number;
137
+ businessId?: number;
138
+ channel: Channel;
139
+ key: string;
140
+ touchpoint: Touchpoint;
141
+ enabled: boolean;
142
+ display: PlacementDisplay;
143
+ strategy: UpsellStrategy;
144
+ strategyParams: StrategyParams;
145
+ configVersion: string;
146
+ updatedAt: string;
147
+ updatedBy: string;
148
+ }
149
+ /**
150
+ * Admin upsert. Scope is derived: no parentId → platform default;
151
+ * parentId only → brand row; parentId + businessId → business override.
152
+ */
153
+ export interface PlacementUpsertInput {
154
+ parentId?: number;
155
+ businessId?: number;
156
+ channel: Channel;
157
+ key: string;
158
+ touchpoint: Touchpoint;
159
+ enabled: boolean;
160
+ display: PlacementDisplay;
161
+ strategy?: UpsellStrategy;
162
+ strategyParams?: StrategyParams;
163
+ }
164
+ export interface PlacementDeleteInput {
165
+ parentId?: number;
166
+ businessId?: number;
167
+ channel: Channel;
168
+ key: string;
169
+ /**
170
+ * Required by the server when `parentId` is omitted, because that call
171
+ * targets the PLATFORM DEFAULT row and so removes the placement for
172
+ * every tenant that has not overridden it. Without this the server
173
+ * rejects the request with 400 rather than guessing that a missing
174
+ * parentId was deliberate.
175
+ *
176
+ * Deliberately not defaulted to `true` here: the whole point of the
177
+ * flag is that deleting a default must be stated, not inferred from
178
+ * the shape of the call.
179
+ */
180
+ confirmDeleteDefault?: boolean;
181
+ }
182
+ export interface PlacementsQuery {
183
+ channel: Channel;
184
+ parentId: number;
185
+ businessId: number;
186
+ }
187
+ export type UpsellEventType = 'shown' | 'added' | 'ignored';
188
+ export interface UpsellEvent {
189
+ type: UpsellEventType;
190
+ itemId: number;
191
+ reasonCode?: ReasonCode;
192
+ /** ISO-8601. Defaults to server receive time when omitted. */
193
+ occurredAt?: string;
194
+ }
195
+ export interface UpsellEventsInput {
196
+ channel: Channel;
197
+ placement: string;
198
+ tenant: Tenant;
199
+ sessionId?: string;
200
+ /** Echo `meta.configVersion` from the response being reported on. */
201
+ configVersion?: string;
202
+ events: UpsellEvent[];
203
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Type surface for the platform Upsell API.
4
+ *
5
+ * Two consumer-facing calls: `placements(...)` (which upsell surfaces a
6
+ * channel should render for a tenant) and `suggest(...)` (items for one
7
+ * placement given the live cart). `reportEvents(...)` feeds attach-rate
8
+ * telemetry. Placement config is managed via the service-actor-only
9
+ * admin methods.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Vwc2VsbC9zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUeXBlIHN1cmZhY2UgZm9yIHRoZSBwbGF0Zm9ybSBVcHNlbGwgQVBJLlxuICpcbiAqIFR3byBjb25zdW1lci1mYWNpbmcgY2FsbHM6IGBwbGFjZW1lbnRzKC4uLilgICh3aGljaCB1cHNlbGwgc3VyZmFjZXMgYVxuICogY2hhbm5lbCBzaG91bGQgcmVuZGVyIGZvciBhIHRlbmFudCkgYW5kIGBzdWdnZXN0KC4uLilgIChpdGVtcyBmb3Igb25lXG4gKiBwbGFjZW1lbnQgZ2l2ZW4gdGhlIGxpdmUgY2FydCkuIGByZXBvcnRFdmVudHMoLi4uKWAgZmVlZHMgYXR0YWNoLXJhdGVcbiAqIHRlbGVtZXRyeS4gUGxhY2VtZW50IGNvbmZpZyBpcyBtYW5hZ2VkIHZpYSB0aGUgc2VydmljZS1hY3Rvci1vbmx5XG4gKiBhZG1pbiBtZXRob2RzLlxuICovXG5cbmV4cG9ydCB0eXBlIENoYW5uZWwgPSAnbW9iaWxlX2FwcCcgfCAna2lvc2snIHwgJ3doaXRlbGFiZWxfd2ViJyB8ICd3aGF0c2FwcCcgfCAndm9pY2UnO1xuXG4vKipcbiAqIEEgbW9tZW50IGluIHRoZSBjdXN0b21lciBqb3VybmV5IOKAlCB0aGUgdW5pdCBvZiBwbGF0Zm9ybSBwb2xpY3lcbiAqIChwcmljZSBiYW5kLCBtYXggaXRlbXMsIGFuZCBsYXRlciB0aGUgc2lnbmFsIHdlaWdodCBwcm9maWxlKS4gQVxuICogcGxhY2VtZW50IGlzIGEgY2hhbm5lbCdzIGpvdXJuZXkgbGFiZWwgcG9pbnRpbmcgYXQgb25lIG9mIHRoZXNlLlxuICovXG5leHBvcnQgdHlwZSBUb3VjaHBvaW50ID1cbiAgfCAnaG9tZSdcbiAgfCAnbWVudV9icm93c2luZydcbiAgfCAnbWVudV9jb21wb3NpbmcnXG4gIHwgJ3NlYXJjaF9ub19yZXN1bHQnXG4gIHwgJ2NhcnQnXG4gIHwgJ3ByZV9jaGVja291dCdcbiAgfCAncG9zdF9vcmRlcic7XG5cbi8qKlxuICogUmVuZGVyaW5nIGhpbnQsIG93bmVkIGJ5IHRoZSBjaGFubmVsIGZyb250ZW5kIOKAlCB0aGUgcGxhdGZvcm0gbmV2ZXJcbiAqIGludGVycHJldHMgaXQuIEtub3duIHZhbHVlcyBhcmUgbGlzdGVkIGZvciBlZGl0b3IgY29tcGxldGlvbiwgYnV0IGFueVxuICogbG93ZXJjYXNlIGlkZW50aWZpZXIgaXMgdmFsaWQgc28gbmV3IGxheW91dHMgbmVlZCBubyBTREsgcmVsZWFzZS5cbiAqL1xuZXhwb3J0IHR5cGUgS25vd25MYXlvdXQgPVxuICB8ICdjYXJvdXNlbF8ydXAnXG4gIHwgJ2hvcml6b250YWxfY2Fyb3VzZWwnXG4gIHwgJ2dyaWRfMnhuX21vZGFsJ1xuICB8ICdjYXJvdXNlbF8xdXAnXG4gIHwgJ3ZlcnRpY2FsX2xpc3QnXG4gIHwgJ2dyaWRfM3huJ1xuICB8ICdjb21wYWN0X2xpc3QnXG4gIHwgJ2hlcm9fYmFubmVyJztcblxuZXhwb3J0IHR5cGUgTGF5b3V0ID0gS25vd25MYXlvdXQgfCAoc3RyaW5nICYge30pO1xuXG4vKiogV2h5IGFuIGl0ZW0gd2FzIHJlY29tbWVuZGVkLiBDaGFubmVscyByZW5kZXIgdGhlc2UgaW4gY3VzdG9tZXIgbGFuZ3VhZ2UuICovXG5leHBvcnQgdHlwZSBSZWFzb25Db2RlID1cbiAgfCAncG9wdWxhcl9ub3cnXG4gIHwgJ2NvbXBsZXRlc19tZWFsJ1xuICB8ICdvZnRlbl9vcmRlcmVkX3RvZ2V0aGVyJ1xuICB8ICd5b3VyX3VzdWFsJ1xuICB8ICdjaGVmc19waWNrJztcblxuLyoqIFdoaWNoIHJ1bmcgb2YgdGhlIHJlc29sdXRpb24gbGFkZGVyIGFuc3dlcmVkIHRoZSByZXF1ZXN0LiAqL1xuZXhwb3J0IHR5cGUgTGFkZGVyUnVuZyA9XG4gIHwgJ2Z1bGxfZW5naW5lJ1xuICB8ICdiYW5kX3JlbGF4YXRpb24nXG4gIHwgJ3BvcHVsYXJpdHlfZmxvb3InXG4gIHwgJ2JhY2t1cF9zdWdnZXN0aW9ucydcbiAgfCAnZW1wdHlfZGVncmFkZWQnO1xuXG5leHBvcnQgdHlwZSBVcHNlbGxTdHJhdGVneSA9ICdtZW51LW9yZGVyLXBvcHVsYXJpdHknIHwgJ2xlZ2FjeS1jYXRhbG9nLXNhbXBsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VtZW50RGlzcGxheSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKiBSZXF1ZXN0ZWQgY291bnQuIFRvdWNocG9pbnQgcG9saWN5IG1heSBjYXAgaXQgbG93ZXIg4oCUIHNlZSBgbWV0YS5tYXhJdGVtc2AuICovXG4gIG1heEl0ZW1zOiBudW1iZXI7XG4gIGxheW91dDogTGF5b3V0O1xufVxuXG4vKiogUmVzb2x2ZWQgcHVibGljIHBsYWNlbWVudCAoYnVzaW5lc3Mgb3ZlcnJpZGUgPiBicmFuZCA+IHBsYXRmb3JtIGRlZmF1bHQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZW1lbnQge1xuICBrZXk6IHN0cmluZztcbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAgdG91Y2hwb2ludDogVG91Y2hwb2ludDtcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgZGlzcGxheTogUGxhY2VtZW50RGlzcGxheTtcbiAgY29uZmlnVmVyc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbmFudCB7XG4gIHBhcmVudElkOiBudW1iZXI7XG4gIGJ1c2luZXNzSWQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXJ0SXRlbSB7XG4gIGl0ZW1JZDogbnVtYmVyO1xuICBxdHk6IG51bWJlcjtcbiAgdW5pdFByaWNlOiBudW1iZXI7XG4gIC8qKiBPcHRpb25hbDsgbGV0cyB0aGUgZGlldGFyeSBnYXRlIGFuZCBjYXRlZ29yeSBuby1yZXBlYXQgc2VlIGNhcnQgY29udGVudHMuICovXG4gIGl0ZW1TbHVnPzogc3RyaW5nO1xuICBzZWN0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqIExlZ2FjeSB2ZWdOb252ZWdCb3RoIGZsYWc6IDEgdmVnLCAyIG5vbi12ZWcsIDMgYm90aC9lZ2cuICovXG4gIHZlZz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXJ0IHtcbiAgaXRlbXM6IENhcnRJdGVtW107XG4gIHN1YnRvdGFsOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VnZ2VzdGlvbnNJbnB1dCB7XG4gIGNoYW5uZWw6IENoYW5uZWw7XG4gIHBsYWNlbWVudDogc3RyaW5nO1xuICB0ZW5hbnQ6IFRlbmFudDtcbiAgY29udGV4dDoge1xuICAgIGNhcnQ6IENhcnQ7XG4gICAgZnVsZmlsbWVudE1vZGU/OiAnZGVsaXZlcnknIHwgJ3BpY2t1cCcgfCAnZGluZV9pbic7XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWw7IHVudXNlZCBieSB0aGUgdjEgc2NvcmVycy4gSW4gdGhlIGNvbnRyYWN0IGZyb20gZGF5IG9uZVxuICAgICAqIHNvIHBlcnNvbmFsaXphdGlvbiBsYW5kcyB3aXRob3V0IGEgYnJlYWsuIGBpZGAgTVVTVCBiZSB0aGUgb3BhcXVlXG4gICAgICogcGxhdGZvcm0gY3VzdG9tZXIgaWQsIG5ldmVyIGEgbW9iaWxlIG51bWJlci5cbiAgICAgKi9cbiAgICBjdXN0b21lcj86IHsgaWQ6IHN0cmluZyB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsOyBub3QgeWV0IGFjdGVkIG9uLiBJbXByZXNzaW9uIGZhdGlndWUgaXMgc2Vzc2lvbi1zY29wZWRcbiAgICAgKiBhbmQgc2hhcmVkIGFjcm9zcyB0b3VjaHBvaW50cyDigJQgc2VuZCBpdCBub3cgc28gY2hhbm5lbHNcbiAgICAgKiBpbnN0cnVtZW50IG9uY2UgcmF0aGVyIHRoYW4gdHdpY2UuXG4gICAgICovXG4gICAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwc2VsbEl0ZW0ge1xuICBpdGVtSWQ6IG51bWJlcjtcbiAgaXRlbU5hbWU6IHN0cmluZztcbiAgaXRlbVNsdWc6IHN0cmluZyB8IG51bGw7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBzZWN0aW9uSWQ6IG51bWJlciB8IG51bGw7XG4gIHNlY3Rpb25OYW1lOiBzdHJpbmcgfCBudWxsO1xuICAvKiogU2VsbGluZyBwcmljZSAoSU5SKS4gKi9cbiAgcHJpY2U6IG51bWJlcjtcbiAgaW1hZ2U6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBSYXcgbGVnYWN5IGB2ZWdOb252ZWdCb3RoYCBmbGFnLCBwYXNzZWQgdGhyb3VnaCB1bnRyYW5zbGF0ZWQuICovXG4gIHZlZzogbnVtYmVyIHwgbnVsbDtcbiAgYnJhbmRJZDogbnVtYmVyIHwgbnVsbDtcbiAgcmVhc29uQ29kZTogUmVhc29uQ29kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWdnZXN0aW9uc1Jlc3VsdCB7XG4gIHBsYWNlbWVudDogc3RyaW5nO1xuICB0b3VjaHBvaW50OiBUb3VjaHBvaW50O1xuICBpdGVtczogVXBzZWxsSXRlbVtdO1xuICBtZXRhOiB7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBzdHJhdGVneTogVXBzZWxsU3RyYXRlZ3k7XG4gICAgY29uZmlnVmVyc2lvbjogc3RyaW5nO1xuICAgIC8qKiBXaGljaCBsYWRkZXIgcnVuZyBwcm9kdWNlZCB0aGVzZSBpdGVtcy4gKi9cbiAgICBydW5nOiBMYWRkZXJSdW5nO1xuICAgIC8qKiBFZmZlY3RpdmUgY2FwIGFwcGxpZWQ6IG1pbihkaXNwbGF5Lm1heEl0ZW1zLCB0b3VjaHBvaW50IHBvbGljeSkuICovXG4gICAgbWF4SXRlbXM6IG51bWJlcjtcbiAgICAvKiogSG93IGxvbmcgdGhlIGNsaWVudCBtYXkgcmV1c2UgdGhpcyByZXNwb25zZSwgaW4gc2Vjb25kcy4gKi9cbiAgICB0dGxTZWNvbmRzOiBudW1iZXI7XG4gICAgLyoqIFRydWUgd2hlbiB0aGUgY2FuZGlkYXRlIHNvdXJjZSBmYWlsZWQgYW5kIHRoZSBzZXJ2aWNlIGRlZ3JhZGVkIHRvIGVtcHR5LiAqL1xuICAgIGRlZ3JhZGVkPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuLyoqIE1lcmNoYW50LWNvbnRyb2xsZWQgc2VsZWN0aW9uIGlucHV0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyYXRlZ3lQYXJhbXMge1xuICBpbmNsdWRlZEl0ZW1TbHVncz86IHN0cmluZ1tdO1xuICBpbmNsdWRlZFNlY3Rpb25zPzogc3RyaW5nW107XG4gIGV4Y2x1ZGVkU2VjdGlvbnM/OiBzdHJpbmdbXTtcbiAgLyoqIFwiTmV2ZXIgU3VnZ2VzdCBUaGVzZVwiIOKAlCBhYnNvbHV0ZSwgb3ZlcnJpZGVzIHRoZSBwcmlvcml0eSBsaXN0LiAqL1xuICBuZXZlclN1Z2dlc3RJdGVtU2x1Z3M/OiBzdHJpbmdbXTtcbiAgLyoqIFwiTXkgUHJpb3JpdHkgSXRlbXNcIiDigJQgb2NjdXB5IHJlc2VydmVkIHNsb3RzIGFoZWFkIG9mIHNjb3JlZCBpdGVtcy4gKi9cbiAgcHJpb3JpdHlJdGVtU2x1Z3M/OiBzdHJpbmdbXTtcbiAgLyoqIFwiQmFja3VwIFN1Z2dlc3Rpb25zXCIg4oCUIDItNiBpdGVtcywgc2VydmVkIHdoZW4gZXZlcnl0aGluZyBlbHNlIGlzIGVtcHR5LiAqL1xuICBiYWNrdXBJdGVtU2x1Z3M/OiBzdHJpbmdbXTtcbiAgZXhjbHVkZUNhcnRJdGVtcz86IGJvb2xlYW47XG4gIG1heFByaWNlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBQbGFjZW1lbnRTY29wZSA9ICdkZWZhdWx0JyB8ICd0ZW5hbnQnIHwgJ2J1c2luZXNzJztcblxuLyoqIFJhdyBhZG1pbi1wbGFuZSBjb25maWcgcm93IChubyBwcmVjZWRlbmNlIG1lcmdlIGFwcGxpZWQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZW1lbnRSZWNvcmQge1xuICBzY29wZTogUGxhY2VtZW50U2NvcGU7XG4gIHBhcmVudElkPzogbnVtYmVyO1xuICBidXNpbmVzc0lkPzogbnVtYmVyO1xuICBjaGFubmVsOiBDaGFubmVsO1xuICBrZXk6IHN0cmluZztcbiAgdG91Y2hwb2ludDogVG91Y2hwb2ludDtcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgZGlzcGxheTogUGxhY2VtZW50RGlzcGxheTtcbiAgc3RyYXRlZ3k6IFVwc2VsbFN0cmF0ZWd5O1xuICBzdHJhdGVneVBhcmFtczogU3RyYXRlZ3lQYXJhbXM7XG4gIGNvbmZpZ1ZlcnNpb246IHN0cmluZztcbiAgdXBkYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRCeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFkbWluIHVwc2VydC4gU2NvcGUgaXMgZGVyaXZlZDogbm8gcGFyZW50SWQg4oaSIHBsYXRmb3JtIGRlZmF1bHQ7XG4gKiBwYXJlbnRJZCBvbmx5IOKGkiBicmFuZCByb3c7IHBhcmVudElkICsgYnVzaW5lc3NJZCDihpIgYnVzaW5lc3Mgb3ZlcnJpZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VtZW50VXBzZXJ0SW5wdXQge1xuICBwYXJlbnRJZD86IG51bWJlcjtcbiAgYnVzaW5lc3NJZD86IG51bWJlcjtcbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAga2V5OiBzdHJpbmc7XG4gIHRvdWNocG9pbnQ6IFRvdWNocG9pbnQ7XG4gIGVuYWJsZWQ6IGJvb2xlYW47XG4gIGRpc3BsYXk6IFBsYWNlbWVudERpc3BsYXk7XG4gIHN0cmF0ZWd5PzogVXBzZWxsU3RyYXRlZ3k7XG4gIHN0cmF0ZWd5UGFyYW1zPzogU3RyYXRlZ3lQYXJhbXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VtZW50RGVsZXRlSW5wdXQge1xuICBwYXJlbnRJZD86IG51bWJlcjtcbiAgYnVzaW5lc3NJZD86IG51bWJlcjtcbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAga2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXF1aXJlZCBieSB0aGUgc2VydmVyIHdoZW4gYHBhcmVudElkYCBpcyBvbWl0dGVkLCBiZWNhdXNlIHRoYXQgY2FsbFxuICAgKiB0YXJnZXRzIHRoZSBQTEFURk9STSBERUZBVUxUIHJvdyBhbmQgc28gcmVtb3ZlcyB0aGUgcGxhY2VtZW50IGZvclxuICAgKiBldmVyeSB0ZW5hbnQgdGhhdCBoYXMgbm90IG92ZXJyaWRkZW4gaXQuIFdpdGhvdXQgdGhpcyB0aGUgc2VydmVyXG4gICAqIHJlamVjdHMgdGhlIHJlcXVlc3Qgd2l0aCA0MDAgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgdGhhdCBhIG1pc3NpbmdcbiAgICogcGFyZW50SWQgd2FzIGRlbGliZXJhdGUuXG4gICAqXG4gICAqIERlbGliZXJhdGVseSBub3QgZGVmYXVsdGVkIHRvIGB0cnVlYCBoZXJlOiB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlXG4gICAqIGZsYWcgaXMgdGhhdCBkZWxldGluZyBhIGRlZmF1bHQgbXVzdCBiZSBzdGF0ZWQsIG5vdCBpbmZlcnJlZCBmcm9tXG4gICAqIHRoZSBzaGFwZSBvZiB0aGUgY2FsbC5cbiAgICovXG4gIGNvbmZpcm1EZWxldGVEZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFjZW1lbnRzUXVlcnkge1xuICBjaGFubmVsOiBDaGFubmVsO1xuICBwYXJlbnRJZDogbnVtYmVyO1xuICBidXNpbmVzc0lkOiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgOKUgCBBdHRhY2gtcmF0ZSB0ZWxlbWV0cnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCB0eXBlIFVwc2VsbEV2ZW50VHlwZSA9ICdzaG93bicgfCAnYWRkZWQnIHwgJ2lnbm9yZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwc2VsbEV2ZW50IHtcbiAgdHlwZTogVXBzZWxsRXZlbnRUeXBlO1xuICBpdGVtSWQ6IG51bWJlcjtcbiAgcmVhc29uQ29kZT86IFJlYXNvbkNvZGU7XG4gIC8qKiBJU08tODYwMS4gRGVmYXVsdHMgdG8gc2VydmVyIHJlY2VpdmUgdGltZSB3aGVuIG9taXR0ZWQuICovXG4gIG9jY3VycmVkQXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBzZWxsRXZlbnRzSW5wdXQge1xuICBjaGFubmVsOiBDaGFubmVsO1xuICBwbGFjZW1lbnQ6IHN0cmluZztcbiAgdGVuYW50OiBUZW5hbnQ7XG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgLyoqIEVjaG8gYG1ldGEuY29uZmlnVmVyc2lvbmAgZnJvbSB0aGUgcmVzcG9uc2UgYmVpbmcgcmVwb3J0ZWQgb24uICovXG4gIGNvbmZpZ1ZlcnNpb24/OiBzdHJpbmc7XG4gIGV2ZW50czogVXBzZWxsRXZlbnRbXTtcbn1cbiJdfQ==
package/dist/version.d.ts CHANGED
@@ -4,5 +4,11 @@
4
4
  * value from package.json at runtime would require either a JSON import
5
5
  * (TS lib settings dependent) or a build-time replacement, and the
6
6
  * cost of one bump-in-two-places per release is small.
7
+ *
8
+ * That cost was underestimated once: the publish job verifies
9
+ * package.json against the release tag but never reads this file, so the
10
+ * two drifted and 1.0.0 shipped reporting 0.9.1. A test now pins them
11
+ * together (`test/upsell/client.test.ts`), so forgetting this bump fails
12
+ * the build instead of the User-Agent.
7
13
  */
8
- export declare const SDK_VERSION = "0.9.1";
14
+ export declare const SDK_VERSION = "2.0.0";
package/dist/version.js CHANGED
@@ -7,6 +7,12 @@ exports.SDK_VERSION = void 0;
7
7
  * value from package.json at runtime would require either a JSON import
8
8
  * (TS lib settings dependent) or a build-time replacement, and the
9
9
  * cost of one bump-in-two-places per release is small.
10
+ *
11
+ * That cost was underestimated once: the publish job verifies
12
+ * package.json against the release tag but never reads this file, so the
13
+ * two drifted and 1.0.0 shipped reporting 0.9.1. A test now pins them
14
+ * together (`test/upsell/client.test.ts`), so forgetting this bump fails
15
+ * the build instead of the User-Agent.
10
16
  */
11
- exports.SDK_VERSION = '0.9.1';
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7Ozs7R0FNRztBQUNVLFFBQUEsV0FBVyxHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFudWFsbHktbWFpbnRhaW5lZCB2ZXJzaW9uIHN0cmluZyBzdXJmYWNlZCB2aWEgdGhlIGBVc2VyLUFnZW50YFxuICogaGVhZGVyLiBLZXB0IGluIHN5bmMgd2l0aCBgcGFja2FnZS5qc29uYCBieSBoYW5kIGJlY2F1c2UgcHVsbGluZyB0aGVcbiAqIHZhbHVlIGZyb20gcGFja2FnZS5qc29uIGF0IHJ1bnRpbWUgd291bGQgcmVxdWlyZSBlaXRoZXIgYSBKU09OIGltcG9ydFxuICogKFRTIGxpYiBzZXR0aW5ncyBkZXBlbmRlbnQpIG9yIGEgYnVpbGQtdGltZSByZXBsYWNlbWVudCwgYW5kIHRoZVxuICogY29zdCBvZiBvbmUgYnVtcC1pbi10d28tcGxhY2VzIHBlciByZWxlYXNlIGlzIHNtYWxsLlxuICovXG5leHBvcnQgY29uc3QgU0RLX1ZFUlNJT04gPSAnMC45LjEnO1xuIl19
17
+ exports.SDK_VERSION = '2.0.0';
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUNVLFFBQUEsV0FBVyxHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFudWFsbHktbWFpbnRhaW5lZCB2ZXJzaW9uIHN0cmluZyBzdXJmYWNlZCB2aWEgdGhlIGBVc2VyLUFnZW50YFxuICogaGVhZGVyLiBLZXB0IGluIHN5bmMgd2l0aCBgcGFja2FnZS5qc29uYCBieSBoYW5kIGJlY2F1c2UgcHVsbGluZyB0aGVcbiAqIHZhbHVlIGZyb20gcGFja2FnZS5qc29uIGF0IHJ1bnRpbWUgd291bGQgcmVxdWlyZSBlaXRoZXIgYSBKU09OIGltcG9ydFxuICogKFRTIGxpYiBzZXR0aW5ncyBkZXBlbmRlbnQpIG9yIGEgYnVpbGQtdGltZSByZXBsYWNlbWVudCwgYW5kIHRoZVxuICogY29zdCBvZiBvbmUgYnVtcC1pbi10d28tcGxhY2VzIHBlciByZWxlYXNlIGlzIHNtYWxsLlxuICpcbiAqIFRoYXQgY29zdCB3YXMgdW5kZXJlc3RpbWF0ZWQgb25jZTogdGhlIHB1Ymxpc2ggam9iIHZlcmlmaWVzXG4gKiBwYWNrYWdlLmpzb24gYWdhaW5zdCB0aGUgcmVsZWFzZSB0YWcgYnV0IG5ldmVyIHJlYWRzIHRoaXMgZmlsZSwgc28gdGhlXG4gKiB0d28gZHJpZnRlZCBhbmQgMS4wLjAgc2hpcHBlZCByZXBvcnRpbmcgMC45LjEuIEEgdGVzdCBub3cgcGlucyB0aGVtXG4gKiB0b2dldGhlciAoYHRlc3QvdXBzZWxsL2NsaWVudC50ZXN0LnRzYCksIHNvIGZvcmdldHRpbmcgdGhpcyBidW1wIGZhaWxzXG4gKiB0aGUgYnVpbGQgaW5zdGVhZCBvZiB0aGUgVXNlci1BZ2VudC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNES19WRVJTSU9OID0gJzIuMC4wJztcbiJdfQ==
package/package.json CHANGED
@@ -1,9 +1,34 @@
1
1
  {
2
2
  "name": "@uengage.io/platform-sdk",
3
- "version": "0.15.0",
4
- "description": "Client SDK for the uEngage platform API (audit, business, zones, wallet, auth). Single createClient(...) factory; OAuth2 client_credentials, static Bearer, or legacy session-token auth modes.",
3
+ "version": "2.0.0",
4
+ "description": "Client SDK for the uEngage platform API (audit, business, zones, wallet, upsell, auth, events). Single createClient(...) factory; OAuth2 client_credentials, static Bearer, or legacy session-token auth modes. Browser-safe realtime client at the /realtime subpath.",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./events": {
13
+ "types": "./dist/events/index.d.ts",
14
+ "default": "./dist/events/index.js"
15
+ },
16
+ "./realtime": {
17
+ "types": "./dist/realtime/index.d.ts",
18
+ "default": "./dist/realtime/index.js"
19
+ },
20
+ "./package.json": "./package.json"
21
+ },
22
+ "typesVersions": {
23
+ "*": {
24
+ "events": [
25
+ "./dist/events/index.d.ts"
26
+ ],
27
+ "realtime": [
28
+ "./dist/realtime/index.d.ts"
29
+ ]
30
+ }
31
+ },
7
32
  "files": [
8
33
  "dist/",
9
34
  "README.md"
@@ -18,6 +43,8 @@
18
43
  "sdk",
19
44
  "audit",
20
45
  "business",
46
+ "events",
47
+ "realtime",
21
48
  "hmac"
22
49
  ],
23
50
  "dependencies": {
@@ -27,12 +54,21 @@
27
54
  "@uengage.io/js-logger": "0.10.0"
28
55
  },
29
56
  "devDependencies": {
57
+ "@aws-sdk/client-sns": "^3.668.0",
30
58
  "@types/jest": "^29.5.14",
31
59
  "@types/node": "^20.14.10",
32
60
  "jest": "^29.7.0",
33
61
  "ts-jest": "^29.2.5",
34
62
  "typescript": "^5.5.4"
35
63
  },
64
+ "peerDependencies": {
65
+ "@aws-sdk/client-sns": "^3.0.0"
66
+ },
67
+ "peerDependenciesMeta": {
68
+ "@aws-sdk/client-sns": {
69
+ "optional": true
70
+ }
71
+ },
36
72
  "scripts": {
37
73
  "build": "tsc",
38
74
  "typecheck": "tsc --noEmit",