@viu/emporix-sdk 3.6.0 → 4.0.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 (49) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/README.md +2 -2
  3. package/dist/availability.d.cts +1 -1
  4. package/dist/availability.d.ts +1 -1
  5. package/dist/cart.d.cts +1 -1
  6. package/dist/cart.d.ts +1 -1
  7. package/dist/category.d.cts +1 -1
  8. package/dist/category.d.ts +1 -1
  9. package/dist/checkout.d.cts +1 -1
  10. package/dist/checkout.d.ts +1 -1
  11. package/dist/{chunk-3G5KROEC.js → chunk-XJJDCK2Z.js} +80 -3
  12. package/dist/chunk-XJJDCK2Z.js.map +1 -0
  13. package/dist/companies.d.cts +1 -1
  14. package/dist/companies.d.ts +1 -1
  15. package/dist/contacts.d.cts +1 -1
  16. package/dist/contacts.d.ts +1 -1
  17. package/dist/{context-CZdtWgQO.d.cts → context-5lt8Q0MT.d.cts} +1 -1
  18. package/dist/{context-CZdtWgQO.d.ts → context-5lt8Q0MT.d.ts} +1 -1
  19. package/dist/{customer-groups-OEnqHFsX.d.cts → customer-groups-8cgS8S5d.d.cts} +1 -1
  20. package/dist/{customer-groups-DhrOoC8M.d.ts → customer-groups-DizW_a-w.d.ts} +1 -1
  21. package/dist/customer-groups.d.cts +2 -2
  22. package/dist/customer-groups.d.ts +2 -2
  23. package/dist/customer.d.cts +1 -1
  24. package/dist/customer.d.ts +1 -1
  25. package/dist/index.cjs +201 -139
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +315 -601
  28. package/dist/index.d.ts +315 -601
  29. package/dist/index.js +126 -140
  30. package/dist/index.js.map +1 -1
  31. package/dist/locations.d.cts +1 -1
  32. package/dist/locations.d.ts +1 -1
  33. package/dist/media.d.cts +11 -11
  34. package/dist/media.d.ts +11 -11
  35. package/dist/orders.d.cts +1 -1
  36. package/dist/orders.d.ts +1 -1
  37. package/dist/payment.d.cts +1 -1
  38. package/dist/payment.d.ts +1 -1
  39. package/dist/price.d.cts +1 -1
  40. package/dist/price.d.ts +1 -1
  41. package/dist/product.d.cts +1 -1
  42. package/dist/product.d.ts +1 -1
  43. package/dist/segment.cjs +78 -1
  44. package/dist/segment.cjs.map +1 -1
  45. package/dist/segment.d.cts +90 -3
  46. package/dist/segment.d.ts +90 -3
  47. package/dist/segment.js +1 -1
  48. package/package.json +1 -1
  49. package/dist/chunk-3G5KROEC.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext } from './context-CZdtWgQO.cjs';
1
+ import { C as ClientContext, b as AuthContext } from './context-5lt8Q0MT.cjs';
2
2
  import { h as Location, i as LocationCreate, j as LocationUpdate } from './types.gen-fWB4nrso.cjs';
3
3
  export { c as ContactDetails } from './types.gen-fWB4nrso.cjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext } from './context-CZdtWgQO.js';
1
+ import { C as ClientContext, b as AuthContext } from './context-5lt8Q0MT.js';
2
2
  import { h as Location, i as LocationCreate, j as LocationUpdate } from './types.gen-fWB4nrso.js';
3
3
  export { c as ContactDetails } from './types.gen-fWB4nrso.js';
4
4
 
package/dist/media.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-CZdtWgQO.cjs';
1
+ import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-5lt8Q0MT.cjs';
2
2
 
3
3
  type MetadataCreate = {
4
4
  /**
@@ -59,8 +59,8 @@ type PatchOperation = {
59
59
  type Asset$1 = {
60
60
  /**
61
61
  * Access type of the asset. This property is immutable.
62
- * - PUBLIC: Assets will be stored by a public storage provider and will be accessible at an external link.
63
- * - PRIVATE: Assets will be stored by a private storage provider and will not be accessible at an external url. Assets of the `PRIVATE` type can only be accessed by calling the `media/{tenant}/assets/{assetId}/download` endpoint in the Media Service.
62
+ * - `PUBLIC`: Blob assets are stored in Cloudinary and are accessible through a permanent external URL.
63
+ * - `PRIVATE`: Blob assets are stored in Google Cloud Storage. Retrieve their content through `/media/{tenant}/assets/{assetId}/download` or request a temporary signed URL through `/media/{tenant}/assets/{assetId}/download-url`.
64
64
  *
65
65
  */
66
66
  access?: 'PUBLIC' | 'PRIVATE';
@@ -120,8 +120,8 @@ type AssetCreateLink = Asset$1 & {
120
120
  url: string;
121
121
  /**
122
122
  * Access type of the asset. This property is immutable.
123
- * - PUBLIC: Assets will be stored by a public storage provider and will be accessible at an external link.
124
- * - PRIVATE: Assets will be stored by a private storage provider and will not be accessible at an external url. Assets of the `PRIVATE` type can only be accessed by calling the `media/{tenant}/assets/{assetId}/download` endpoint in the Media Service.
123
+ * - `PUBLIC`: Blob assets are stored in Cloudinary and are accessible through a permanent external URL.
124
+ * - `PRIVATE`: Blob assets are stored in Google Cloud Storage. Retrieve their content through `/media/{tenant}/assets/{assetId}/download` or request a temporary signed URL through `/media/{tenant}/assets/{assetId}/download-url`.
125
125
  *
126
126
  */
127
127
  access: 'PUBLIC' | 'PRIVATE';
@@ -141,8 +141,8 @@ type AssetCreateBlob = Asset$1 & {
141
141
  details?: AssetDetailsCreate;
142
142
  /**
143
143
  * Access type of the asset. This property is immutable.
144
- * - PUBLIC: Assets will be stored by a public storage provider and will be accessible at an external link.
145
- * - PRIVATE: Assets will be stored by a private storage provider and will not be accessible at an external url. Assets of the `PRIVATE` type can only be accessed by calling the `media/{tenant}/assets/{assetId}/download` endpoint in the Media Service.
144
+ * - `PUBLIC`: Blob assets are stored in Cloudinary and are accessible through a permanent external URL.
145
+ * - `PRIVATE`: Blob assets are stored in Google Cloud Storage. Retrieve their content through `/media/{tenant}/assets/{assetId}/download` or request a temporary signed URL through `/media/{tenant}/assets/{assetId}/download-url`.
146
146
  *
147
147
  */
148
148
  access: 'PUBLIC' | 'PRIVATE';
@@ -185,8 +185,8 @@ type AssetUpdateLink = Asset$1 & {
185
185
  metadata?: MetadataUpdate;
186
186
  /**
187
187
  * Access type of the asset. This property is immutable.
188
- * - PUBLIC: Assets will be stored by a public storage provider and will be accessible at an external link.
189
- * - PRIVATE: Assets will be stored by a private storage provider and will not be accessible at an external url. Assets of the `PRIVATE` type can only be accessed by calling the `media/{tenant}/assets/{assetId}/download` endpoint in the Media Service.
188
+ * - `PUBLIC`: Blob assets are stored in Cloudinary and are accessible through a permanent external URL.
189
+ * - `PRIVATE`: Blob assets are stored in Google Cloud Storage. Retrieve their content through `/media/{tenant}/assets/{assetId}/download` or request a temporary signed URL through `/media/{tenant}/assets/{assetId}/download-url`.
190
190
  *
191
191
  */
192
192
  access: 'PUBLIC' | 'PRIVATE';
@@ -203,8 +203,8 @@ type AssetUpdateBlob = Asset$1 & {
203
203
  metadata?: MetadataUpdate;
204
204
  /**
205
205
  * Access type of the asset. This property is immutable.
206
- * - PUBLIC: Assets will be stored by a public storage provider and will be accessible at an external link.
207
- * - PRIVATE: Assets will be stored by a private storage provider and will not be accessible at an external url. Assets of the `PRIVATE` type can only be accessed by calling the `media/{tenant}/assets/{assetId}/download` endpoint in the Media Service.
206
+ * - `PUBLIC`: Blob assets are stored in Cloudinary and are accessible through a permanent external URL.
207
+ * - `PRIVATE`: Blob assets are stored in Google Cloud Storage. Retrieve their content through `/media/{tenant}/assets/{assetId}/download` or request a temporary signed URL through `/media/{tenant}/assets/{assetId}/download-url`.
208
208
  *
209
209
  */
210
210
  access: 'PUBLIC' | 'PRIVATE';
package/dist/media.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-CZdtWgQO.js';
1
+ import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-5lt8Q0MT.js';
2
2
 
3
3
  type MetadataCreate = {
4
4
  /**
@@ -59,8 +59,8 @@ type PatchOperation = {
59
59
  type Asset$1 = {
60
60
  /**
61
61
  * Access type of the asset. This property is immutable.
62
- * - PUBLIC: Assets will be stored by a public storage provider and will be accessible at an external link.
63
- * - PRIVATE: Assets will be stored by a private storage provider and will not be accessible at an external url. Assets of the `PRIVATE` type can only be accessed by calling the `media/{tenant}/assets/{assetId}/download` endpoint in the Media Service.
62
+ * - `PUBLIC`: Blob assets are stored in Cloudinary and are accessible through a permanent external URL.
63
+ * - `PRIVATE`: Blob assets are stored in Google Cloud Storage. Retrieve their content through `/media/{tenant}/assets/{assetId}/download` or request a temporary signed URL through `/media/{tenant}/assets/{assetId}/download-url`.
64
64
  *
65
65
  */
66
66
  access?: 'PUBLIC' | 'PRIVATE';
@@ -120,8 +120,8 @@ type AssetCreateLink = Asset$1 & {
120
120
  url: string;
121
121
  /**
122
122
  * Access type of the asset. This property is immutable.
123
- * - PUBLIC: Assets will be stored by a public storage provider and will be accessible at an external link.
124
- * - PRIVATE: Assets will be stored by a private storage provider and will not be accessible at an external url. Assets of the `PRIVATE` type can only be accessed by calling the `media/{tenant}/assets/{assetId}/download` endpoint in the Media Service.
123
+ * - `PUBLIC`: Blob assets are stored in Cloudinary and are accessible through a permanent external URL.
124
+ * - `PRIVATE`: Blob assets are stored in Google Cloud Storage. Retrieve their content through `/media/{tenant}/assets/{assetId}/download` or request a temporary signed URL through `/media/{tenant}/assets/{assetId}/download-url`.
125
125
  *
126
126
  */
127
127
  access: 'PUBLIC' | 'PRIVATE';
@@ -141,8 +141,8 @@ type AssetCreateBlob = Asset$1 & {
141
141
  details?: AssetDetailsCreate;
142
142
  /**
143
143
  * Access type of the asset. This property is immutable.
144
- * - PUBLIC: Assets will be stored by a public storage provider and will be accessible at an external link.
145
- * - PRIVATE: Assets will be stored by a private storage provider and will not be accessible at an external url. Assets of the `PRIVATE` type can only be accessed by calling the `media/{tenant}/assets/{assetId}/download` endpoint in the Media Service.
144
+ * - `PUBLIC`: Blob assets are stored in Cloudinary and are accessible through a permanent external URL.
145
+ * - `PRIVATE`: Blob assets are stored in Google Cloud Storage. Retrieve their content through `/media/{tenant}/assets/{assetId}/download` or request a temporary signed URL through `/media/{tenant}/assets/{assetId}/download-url`.
146
146
  *
147
147
  */
148
148
  access: 'PUBLIC' | 'PRIVATE';
@@ -185,8 +185,8 @@ type AssetUpdateLink = Asset$1 & {
185
185
  metadata?: MetadataUpdate;
186
186
  /**
187
187
  * Access type of the asset. This property is immutable.
188
- * - PUBLIC: Assets will be stored by a public storage provider and will be accessible at an external link.
189
- * - PRIVATE: Assets will be stored by a private storage provider and will not be accessible at an external url. Assets of the `PRIVATE` type can only be accessed by calling the `media/{tenant}/assets/{assetId}/download` endpoint in the Media Service.
188
+ * - `PUBLIC`: Blob assets are stored in Cloudinary and are accessible through a permanent external URL.
189
+ * - `PRIVATE`: Blob assets are stored in Google Cloud Storage. Retrieve their content through `/media/{tenant}/assets/{assetId}/download` or request a temporary signed URL through `/media/{tenant}/assets/{assetId}/download-url`.
190
190
  *
191
191
  */
192
192
  access: 'PUBLIC' | 'PRIVATE';
@@ -203,8 +203,8 @@ type AssetUpdateBlob = Asset$1 & {
203
203
  metadata?: MetadataUpdate;
204
204
  /**
205
205
  * Access type of the asset. This property is immutable.
206
- * - PUBLIC: Assets will be stored by a public storage provider and will be accessible at an external link.
207
- * - PRIVATE: Assets will be stored by a private storage provider and will not be accessible at an external url. Assets of the `PRIVATE` type can only be accessed by calling the `media/{tenant}/assets/{assetId}/download` endpoint in the Media Service.
206
+ * - `PUBLIC`: Blob assets are stored in Cloudinary and are accessible through a permanent external URL.
207
+ * - `PRIVATE`: Blob assets are stored in Google Cloud Storage. Retrieve their content through `/media/{tenant}/assets/{assetId}/download` or request a temporary signed URL through `/media/{tenant}/assets/{assetId}/download-url`.
208
208
  *
209
209
  */
210
210
  access: 'PUBLIC' | 'PRIVATE';
package/dist/orders.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-CZdtWgQO.cjs';
1
+ import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-5lt8Q0MT.cjs';
2
2
  import { a as QueryFor } from './query-mLQs2WFr.cjs';
3
3
 
4
4
  /**
package/dist/orders.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-CZdtWgQO.js';
1
+ import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-5lt8Q0MT.js';
2
2
  import { a as QueryFor } from './query-mLQs2WFr.js';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext } from './context-CZdtWgQO.cjs';
1
+ import { C as ClientContext, b as AuthContext } from './context-5lt8Q0MT.cjs';
2
2
 
3
3
  /**
4
4
  * paymentModeRequest
package/dist/payment.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext } from './context-CZdtWgQO.js';
1
+ import { C as ClientContext, b as AuthContext } from './context-5lt8Q0MT.js';
2
2
 
3
3
  /**
4
4
  * paymentModeRequest
package/dist/price.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext } from './context-CZdtWgQO.cjs';
1
+ import { C as ClientContext, b as AuthContext } from './context-5lt8Q0MT.cjs';
2
2
 
3
3
  /**
4
4
  * Price
package/dist/price.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext } from './context-CZdtWgQO.js';
1
+ import { C as ClientContext, b as AuthContext } from './context-5lt8Q0MT.js';
2
2
 
3
3
  /**
4
4
  * Price
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-CZdtWgQO.cjs';
1
+ import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-5lt8Q0MT.cjs';
2
2
  import { a as QueryFor } from './query-mLQs2WFr.cjs';
3
3
 
4
4
  /**
package/dist/product.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-CZdtWgQO.js';
1
+ import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-5lt8Q0MT.js';
2
2
  import { a as QueryFor } from './query-mLQs2WFr.js';
3
3
 
4
4
  /**
package/dist/segment.cjs CHANGED
@@ -66,7 +66,12 @@ var SegmentService = class {
66
66
  base() {
67
67
  return `/customer-segment/${this.ctx.tenant}/segments`;
68
68
  }
69
- /** Lists segments the caller belongs to (with `segment_read_own`). */
69
+ /**
70
+ * Lists segments via the generic `GET /segments` (with `segment_read_own`).
71
+ * Its documentation does not say whether segments inherited through IAM
72
+ * groups are included — for "which segments is this customer in", use
73
+ * {@link listMine}, which is documented to include them.
74
+ */
70
75
  async list(query = {}, auth) {
71
76
  const q = {};
72
77
  setIfDefined(q, "q", query.q);
@@ -79,6 +84,26 @@ var SegmentService = class {
79
84
  ...Object.keys(q).length ? { query: q } : {}
80
85
  });
81
86
  }
87
+ /**
88
+ * The authenticated customer's **active** segments (`GET /segments/me`,
89
+ * `segment_read_own`): assigned directly, and inherited through the
90
+ * customer's IAM groups — groups not bound to a legal entity, plus groups
91
+ * bound to the customer's *current* legal entity. Switching the active company
92
+ * can therefore change the result.
93
+ */
94
+ async listMine(query = {}, auth) {
95
+ const q = {};
96
+ setIfDefined(q, "q", query.q);
97
+ setIfDefined(q, "pageNumber", query.pageNumber);
98
+ setIfDefined(q, "pageSize", query.pageSize);
99
+ setIfDefined(q, "sort", query.sort);
100
+ return this.ctx.http.request({
101
+ method: "GET",
102
+ path: `${this.base()}/me`,
103
+ auth: requireCustomer(auth),
104
+ ...Object.keys(q).length ? { query: q } : {}
105
+ });
106
+ }
82
107
  /** Fetches a single segment by id. */
83
108
  async get(segmentId, auth) {
84
109
  return this.ctx.http.request({
@@ -330,6 +355,58 @@ var SegmentService = class {
330
355
  body
331
356
  })
332
357
  };
358
+ /**
359
+ * IAM group→segment assignments (`segment_read` / `segment_manage`). Customers
360
+ * inherit a segment through their groups, on top of direct assignment — see
361
+ * {@link listMine}. Only groups with `userType: "CUSTOMER"` can be assigned;
362
+ * anything else is a `400`. Default auth: service.
363
+ */
364
+ groups = {
365
+ list: async (segmentId, query = {}, authCtx = SERVICE) => {
366
+ const q = {};
367
+ setIfDefined(q, "q", query.q);
368
+ setIfDefined(q, "pageNumber", query.pageNumber);
369
+ setIfDefined(q, "pageSize", query.pageSize);
370
+ setIfDefined(q, "sort", query.sort);
371
+ return this.ctx.http.request({
372
+ method: "GET",
373
+ path: `${this.base()}/${encodeURIComponent(segmentId)}/groups`,
374
+ auth: authCtx,
375
+ ...Object.keys(q).length ? { query: q } : {}
376
+ });
377
+ },
378
+ search: async (segmentId, query, authCtx = SERVICE) => this.ctx.http.request({
379
+ method: "POST",
380
+ path: `${this.base()}/${encodeURIComponent(segmentId)}/groups/search`,
381
+ auth: authCtx,
382
+ body: query
383
+ }),
384
+ get: async (segmentId, groupId, authCtx = SERVICE) => this.ctx.http.request({
385
+ method: "GET",
386
+ path: `${this.base()}/${encodeURIComponent(segmentId)}/groups/${encodeURIComponent(groupId)}`,
387
+ auth: authCtx
388
+ }),
389
+ /**
390
+ * Upsert: `201` when the assignment is created, `204` when it is updated —
391
+ * **neither returns a body**, so this resolves to nothing. Fetch it with
392
+ * {@link get} if you need the stored assignment.
393
+ */
394
+ assign: async (segmentId, groupId, input = {}, authCtx = SERVICE) => {
395
+ await this.ctx.http.request({
396
+ method: "PUT",
397
+ path: `${this.base()}/${encodeURIComponent(segmentId)}/groups/${encodeURIComponent(groupId)}`,
398
+ auth: authCtx,
399
+ body: input
400
+ });
401
+ },
402
+ remove: async (segmentId, groupId, authCtx = SERVICE) => {
403
+ await this.ctx.http.request({
404
+ method: "DELETE",
405
+ path: `${this.base()}/${encodeURIComponent(segmentId)}/groups/${encodeURIComponent(groupId)}`,
406
+ auth: authCtx
407
+ });
408
+ }
409
+ };
333
410
  /** Item→segment assignments (`type` = PRODUCT | CATEGORY). Default auth: service. */
334
411
  items = {
335
412
  search: async (segmentId, query, authCtx = SERVICE) => this.ctx.http.request({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/errors.ts","../src/core/require-customer.ts","../src/services/segment.ts"],"names":[],"mappings":";;;AACA,IAAM,kBAAA,uBAAyB,GAAA,CAAI;AAAA,EACjC,cAAA;AAAA,EAAgB,eAAA;AAAA,EAAiB,OAAA;AAAA,EAAS,eAAA;AAAA,EAAiB,WAAA;AAAA,EAC3D,QAAA;AAAA,EAAU,eAAA;AAAA,EAAiB,eAAA;AAAA,EAAiB;AAC9C,CAAC,CAAA;AAED,SAAS,MAAM,IAAA,EAAwB;AACrC,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,GAAG,OAAO,IAAA,CAAK,IAAI,KAAK,CAAA;AAC9C,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAA+B,CAAA,EAAG;AACpE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,kBAAA,CAAmB,GAAA,CAAI,CAAA,CAAE,aAAa,CAAA,GAAI,gBAAA,GAAmB,KAAA,CAAM,CAAC,CAAA;AAAA,IAC/E;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAGO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EAC7B,MAAA;AAAA,EACA,IAAA;AAAA,EACT,WAAA,CAAY,OAAA,EAAiB,MAAA,EAAiB,IAAA,EAAgB;AAC5D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,OAAO,GAAA,CAAA,MAAA,CAAW,IAAA;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AAAA;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,SAAS,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,EAC/F;AACF,CAAA;AAGO,IAAM,gBAAA,GAAN,cAA+B,YAAA,CAAa;AAAC,CAAA;;;AC3B7C,SAAS,gBAAgB,IAAA,EAA4C;AAC1E,EAAA,IAAI,SAAS,IAAA,CAAK,IAAA,KAAS,cAAc,IAAA,CAAK,IAAA,KAAS,QAAQ,OAAO,IAAA;AACtE,EAAA,MAAM,IAAI,iBAAiB,uDAAuD,CAAA;AACpF;;;ACkDA,SAAS,YAAA,CACP,CAAA,EACA,GAAA,EACA,KAAA,EACM;AACN,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA,EAAI;AACvC,IAAA,CAAA,CAAE,GAAG,CAAA,GAAI,KAAA;AAAA,EACX;AACF;AAGA,IAAM,OAAA,GAAuB,EAAE,IAAA,EAAM,SAAA,EAAU;AAQxC,IAAM,iBAAN,MAAqB;AAAA,EAG1B,WAAA,CACmB,KACA,IAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAChB;AAAA,EAFgB,GAAA;AAAA,EACA,IAAA;AAAA,EAJnB,OAAgB,OAAA,GAAU,SAAA;AAAA,EAC1B,OAAgB,IAAA,GAAO,CAAC,UAAA,EAAY,YAAY,CAAA;AAAA,EAMxC,IAAA,GAAe;AACrB,IAAA,OAAO,CAAA,kBAAA,EAAqB,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,SAAA,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,IAAA,CACJ,KAAA,GAAgE,IAChE,IAAA,EACoB;AACpB,IAAA,MAAM,IAAiD,EAAC;AACxD,IAAA,YAAA,CAAa,CAAA,EAAG,GAAA,EAAK,KAAA,CAAM,CAAC,CAAA;AAC5B,IAAA,YAAA,CAAa,CAAA,EAAG,YAAA,EAAc,KAAA,CAAM,UAAU,CAAA;AAC9C,IAAA,YAAA,CAAa,CAAA,EAAG,UAAA,EAAY,KAAA,CAAM,QAAQ,CAAA;AAC1C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAmB;AAAA,MACtC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,IAAA,EAAM,gBAAgB,IAAI,CAAA;AAAA,MAC1B,GAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,EAAE,KAAA,EAAO,CAAA,EAAE,GAAI;AAAC,KAC7C,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,GAAA,CAAI,SAAA,EAAmB,IAAA,EAAsC;AACjE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAiB;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,CAAA;AAAA,MACjC,IAAA,EAAM,gBAAgB,IAAI;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,SAAA,CACJ,KAAA,GAOI,IACJ,IAAA,EACwB;AACxB,IAAA,MAAM,IAAiD,EAAC;AACxD,IAAA,YAAA,CAAa,CAAA,EAAG,GAAA,EAAK,KAAA,CAAM,CAAC,CAAA;AAC5B,IAAA,YAAA,CAAa,CAAA,EAAG,UAAA,EAAY,KAAA,CAAM,QAAQ,CAAA;AAC1C,IAAA,YAAA,CAAa,CAAA,EAAG,eAAA,EAAiB,KAAA,CAAM,aAAa,CAAA;AACpD,IAAA,YAAA,CAAa,CAAA,EAAG,YAAA,EAAc,KAAA,CAAM,UAAU,CAAA;AAC9C,IAAA,YAAA,CAAa,CAAA,EAAG,UAAA,EAAY,KAAA,CAAM,QAAQ,CAAA;AAC1C,IAAA,IAAI,MAAM,UAAA,KAAe,MAAA,IAAa,UAAA,GAAa,MAAA,CAAO,MAAM,UAAU,CAAA;AAC1E,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAuB;AAAA,MAC1C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,CAAA,MAAA,CAAA;AAAA,MACpB,IAAA,EAAM,gBAAgB,IAAI,CAAA;AAAA,MAC1B,GAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,EAAE,KAAA,EAAO,CAAA,EAAE,GAAI;AAAC,KAC7C,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,gBAAA,CACJ,SAAA,EACA,KAAA,GAKI,IACJ,IAAA,EACwB;AACxB,IAAA,MAAM,IAAiD,EAAC;AACxD,IAAA,YAAA,CAAa,CAAA,EAAG,GAAA,EAAK,KAAA,CAAM,CAAC,CAAA;AAC5B,IAAA,YAAA,CAAa,CAAA,EAAG,eAAA,EAAiB,KAAA,CAAM,aAAa,CAAA;AACpD,IAAA,YAAA,CAAa,CAAA,EAAG,YAAA,EAAc,KAAA,CAAM,UAAU,CAAA;AAC9C,IAAA,YAAA,CAAa,CAAA,EAAG,UAAA,EAAY,KAAA,CAAM,QAAQ,CAAA;AAC1C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAuB;AAAA,MAC1C,MAAA,EAAQ,KAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,MAAA,CAAA;AAAA,MACjC,IAAA,EAAM,gBAAgB,IAAI,CAAA;AAAA,MAC1B,GAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,EAAE,KAAA,EAAO,CAAA,EAAE,GAAI;AAAC,KAC7C,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,eAAA,CACJ,KAAA,GAAuD,IACvD,IAAA,EAC8B;AAC9B,IAAA,MAAM,IAAiD,EAAC;AACxD,IAAA,YAAA,CAAa,CAAA,EAAG,UAAA,EAAY,KAAA,CAAM,QAAQ,CAAA;AAC1C,IAAA,YAAA,CAAa,CAAA,EAAG,eAAA,EAAiB,KAAA,CAAM,aAAa,CAAA;AACpD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAA6B;AAAA,MAChD,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,CAAA,qBAAA,CAAA;AAAA,MACpB,IAAA,EAAM,gBAAgB,IAAI,CAAA;AAAA,MAC1B,GAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,EAAE,KAAA,EAAO,CAAA,EAAE,GAAI;AAAC,KAC7C,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,WAAA,CACZ,IAAA,EACA,KAAA,EACA,IAAA,EACmB;AACnB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,IAAI,CAAA;AAC7C,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,MAAM,EAAA,GAAK,EAAE,IAAA,EAAM,EAAA;AACnB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,IAAQ,OAAO,OAAO,QAAA,EAAU,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,gBAAA,CACJ,KAAA,EACA,IAAA,EACmB;AACnB,IAAA,OAAO,KAAK,WAAA,CAAY,SAAA,EAAW,KAAA,IAAS,IAAI,IAAI,CAAA;AAAA,EACtD;AAAA;AAAA,EAGA,MAAM,iBAAA,CACJ,KAAA,EACA,IAAA,EACmB;AACnB,IAAA,OAAO,KAAK,WAAA,CAAY,UAAA,EAAY,KAAA,IAAS,IAAI,IAAI,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,cAAA,CACJ,KAAA,EACA,IAAA,EACqE;AACrE,IAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,EAAA;AACpC,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,SAAA;AAAA,MAC7B,EAAE,GAAI,KAAA,IAAS,EAAC,EAAI,YAAY,QAAA,EAAS;AAAA,MACzC;AAAA,KACF;AACA,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,OAAO,CAAA,CAAE,IAAA,EAAM,EAAA,KAAO,QAAA,EAAU,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,IAChF;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,SAAS,WAAA,CAAY,GAAA,EAAK,QAAW,IAAI,CAAA;AACvE,IAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,UAAU,WAAA,EAAa,WAAA,CAAY,WAAW,QAAA,EAAS;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAA,CACJ,KAAA,EACA,IAAA,EACsE;AACtE,IAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,EAAA;AACpC,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,SAAA;AAAA,MAC7B,EAAE,GAAI,KAAA,IAAS,EAAC,EAAI,YAAY,QAAA,EAAS;AAAA,MACzC;AAAA,KACF;AACA,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,OAAO,CAAA,CAAE,IAAA,EAAM,EAAA,KAAO,QAAA,EAAU,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,IACjF;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,WAAW,WAAA,CAAY,GAAA,EAAK,QAAW,IAAI,CAAA;AACzE,IAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,UAAU,WAAA,EAAa,WAAA,CAAY,WAAW,QAAA,EAAS;AAAA,EACrF;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,KAAA,EAAqB,OAAA,GAAuB,OAAA,EAA2B;AAClF,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAiB,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,MAAK,EAAG,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,OAAO,CAAA;AAAA,EACzG;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,KAAA,EAA2B,OAAA,GAAuB,OAAA,EAA6B;AAC1F,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAmB;AAAA,MACtC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,CAAA,OAAA,CAAA;AAAA,MACpB,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,SAAA,EAAmB,KAAA,EAA2B,UAAuB,OAAA,EAA2B;AAC3G,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAiB;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,CAAA;AAAA,MACjC,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAA,CAAM,SAAA,EAAmB,KAAA,EAA0B,UAAuB,OAAA,EAA2B;AACzG,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAiB;AAAA,MACpC,MAAA,EAAQ,OAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,CAAA;AAAA,MACjC,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,SAAA,EAAmB,OAAA,GAAuB,OAAA,EAAwB;AAC7E,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAc;AAAA,MAChC,MAAA,EAAQ,QAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,CAAA;AAAA,MACjC,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAA,CAAM,KAAA,EAA0B,OAAA,GAAuB,OAAA,EAA6B;AACxF,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAmB;AAAA,MACtC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,CAAA,MAAA,CAAA;AAAA,MACpB,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,UAAA,CAAW,MAAA,EAA2B,OAAA,GAAuB,OAAA,EAAuC;AACxG,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAA6B;AAAA,MAChD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,CAAA,KAAA,CAAA;AAAA,MACpB,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,UAAA,CAAW,MAAA,EAA2B,OAAA,GAAuB,OAAA,EAAuC;AACxG,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAA6B;AAAA,MAChD,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,CAAA,KAAA,CAAA;AAAA,MACpB,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,UAAA,CAAW,IAAA,EAA+B,OAAA,GAAuB,OAAA,EAAuC;AAC5G,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAA6B;AAAA,MAChD,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,CAAA,KAAA,CAAA;AAAA,MACpB,IAAA,EAAM,OAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGS,SAAA,GAAY;AAAA,IACnB,IAAA,EAAM,OAAO,SAAA,EAAmB,KAAA,EAAyC,UAAuB,OAAA,KAC9F,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAA2B;AAAA,MACvC,MAAA,EAAQ,KAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,UAAA,CAAA;AAAA,MACjC,IAAA,EAAM,OAAA;AAAA,MACN,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC,KAC1B,CAAA;AAAA,IACH,MAAA,EAAQ,OAAO,SAAA,EAAmB,KAAA,EAAgC,UAAuB,OAAA,KACvF,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAA2B;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,iBAAA,CAAA;AAAA,MACjC,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACH,GAAA,EAAK,OAAO,SAAA,EAAmB,UAAA,EAAoB,UAAuB,OAAA,KACxE,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAyB;AAAA,MACrC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,GAAG,IAAA,CAAK,IAAA,EAAM,CAAA,CAAA,EAAI,SAAS,cAAc,UAAU,CAAA,CAAA;AAAA,MACzD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACH,MAAA,EAAQ,OAAO,SAAA,EAAmB,UAAA,EAAoB,KAAA,EAA6B,UAAuB,OAAA,KACxG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAyB;AAAA,MACrC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,GAAG,IAAA,CAAK,IAAA,EAAM,CAAA,CAAA,EAAI,SAAS,cAAc,UAAU,CAAA,CAAA;AAAA,MACzD,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACH,MAAA,EAAQ,OAAO,SAAA,EAAmB,UAAA,EAAoB,UAAuB,OAAA,KAA2B;AACtG,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAc;AAAA,QAChC,MAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAM,GAAG,IAAA,CAAK,IAAA,EAAM,CAAA,CAAA,EAAI,SAAS,cAAc,UAAU,CAAA,CAAA;AAAA,QACzD,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IACA,YAAA,EAAc,OAAO,SAAA,EAAmB,UAAA,EAAoB,aAAA,EAAuB,UAAuB,OAAA,KACxG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAyB;AAAA,MACrC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAAA,MAC1E,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACH,eAAA,EAAiB,OAAO,SAAA,EAAmB,UAAA,EAAoB,aAAA,EAAuB,KAAA,EAA6B,OAAA,GAAuB,OAAA,KACxI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAyB;AAAA,MACrC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAAA,MAC1E,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACH,iBAAiB,OAAO,SAAA,EAAmB,UAAA,EAAoB,aAAA,EAAuB,UAAuB,OAAA,KAA2B;AACtI,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAc;AAAA,QAChC,MAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAAA,QAC1E,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IACA,UAAA,EAAY,OAAO,SAAA,EAAmB,MAAA,EAAoC,UAAuB,OAAA,KAC/F,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAuC;AAAA,MACnD,MAAA,EAAQ,KAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,eAAA,CAAA;AAAA,MACjC,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACH,UAAA,EAAY,OAAO,SAAA,EAAmB,IAAA,EAA+B,UAAuB,OAAA,KAC1F,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAuC;AAAA,MACnD,MAAA,EAAQ,QAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,eAAA,CAAA;AAAA,MACjC,IAAA,EAAM,OAAA;AAAA,MACN;AAAA,KACD;AAAA,GACL;AAAA;AAAA,EAGS,KAAA,GAAQ;AAAA,IACf,MAAA,EAAQ,OAAO,SAAA,EAAmB,KAAA,EAAgC,UAAuB,OAAA,KACvF,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAuB;AAAA,MACnC,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,aAAA,CAAA;AAAA,MACjC,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACH,GAAA,EAAK,OAAO,SAAA,EAAmB,IAAA,EAAc,MAAA,EAAgB,UAAuB,OAAA,KAClF,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAqB;AAAA,MACjC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,MACzD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACH,MAAA,EAAQ,OAAO,SAAA,EAAmB,IAAA,EAAc,MAAA,EAAgB,KAAA,EAAyB,OAAA,GAAuB,OAAA,KAC9G,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAqB;AAAA,MACjC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,MACzD,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACH,QAAQ,OAAO,SAAA,EAAmB,IAAA,EAAc,MAAA,EAAgB,UAAuB,OAAA,KAA2B;AAChH,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAc;AAAA,QAChC,MAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,IAAI,SAAS,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,QACzD,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IACA,UAAA,EAAY,OAAO,SAAA,EAAmB,IAAA,EAAc,MAAA,EAAgC,UAAuB,OAAA,KACzG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAuC;AAAA,MACnD,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,GAAG,IAAA,CAAK,IAAA,EAAM,CAAA,CAAA,EAAI,SAAS,UAAU,IAAI,CAAA,KAAA,CAAA;AAAA,MAC/C,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACH,UAAA,EAAY,OAAO,SAAA,EAAmB,IAAA,EAAc,IAAA,EAA+B,UAAuB,OAAA,KACxG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAuC;AAAA,MACnD,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,GAAG,IAAA,CAAK,IAAA,EAAM,CAAA,CAAA,EAAI,SAAS,UAAU,IAAI,CAAA,KAAA,CAAA;AAAA,MAC/C,IAAA,EAAM,OAAA;AAAA,MACN;AAAA,KACD;AAAA,GACL;AACF","file":"segment.cjs","sourcesContent":["/** Keys whose values are stripped from any serialised error body. */\nconst REDACTED_BODY_KEYS = new Set([\n \"access_token\", \"refresh_token\", \"token\", \"customertoken\", \"saastoken\",\n \"secret\", \"client_secret\", \"authorization\", \"password\",\n]);\n\nfunction scrub(body: unknown): unknown {\n if (Array.isArray(body)) return body.map(scrub);\n if (body && typeof body === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(body as Record<string, unknown>)) {\n out[k] = REDACTED_BODY_KEYS.has(k.toLowerCase()) ? \"***redacted***\" : scrub(v);\n }\n return out;\n }\n return body;\n}\n\n/** Base class for every error thrown by the SDK. */\nexport class EmporixError extends Error {\n readonly status: number | undefined;\n readonly body: unknown;\n constructor(message: string, status?: number, body?: unknown) {\n super(message);\n this.name = new.target.name;\n this.status = status;\n this.body = body;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n /** Safe serialisation — token-like body fields are redacted. */\n toJSON(): Record<string, unknown> {\n return { name: this.name, message: this.message, status: this.status, body: scrub(this.body) };\n }\n}\n\n/** 401 — authentication failed or token expired. */\nexport class EmporixAuthError extends EmporixError {}\n/** 403 — authenticated but not permitted. */\nexport class EmporixForbiddenError extends EmporixError {}\n/** 404 — resource not found. */\nexport class EmporixNotFoundError extends EmporixError {}\n/** 400/422 — request validation failed. */\nexport class EmporixValidationError extends EmporixError {}\n/** 5xx — server-side failure. */\nexport class EmporixServerError extends EmporixError {}\n/** Request aborted by the configured connect/read timeout. No HTTP status. */\nexport class EmporixTimeoutError extends EmporixError {}\n/** DNS/TLS/connection-level failure before or during the exchange. No HTTP status. */\nexport class EmporixNetworkError extends EmporixError {}\n\n/**\n * 403 with a `missing scope: <name>` hint in the body's `details` array.\n * Subclasses {@link EmporixForbiddenError} so existing 403 catches still work.\n */\nexport class EmporixInsufficientScopeError extends EmporixForbiddenError {\n readonly requiredScope: string | undefined;\n constructor(message: string, status: number, body: unknown, requiredScope?: string) {\n super(message, status, body);\n this.requiredScope = requiredScope;\n }\n}\n\nconst SCOPE_HINT_RE = /missing scope[: ]+([a-z0-9._-]+)/i;\n\nfunction extractRequiredScope(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"details\" in body) {\n const details = (body as { details?: unknown }).details;\n if (Array.isArray(details)) {\n for (const d of details) {\n if (typeof d === \"string\") {\n const m = d.match(SCOPE_HINT_RE);\n if (m) return m[1];\n }\n }\n }\n }\n return undefined;\n}\n\n/** Maps an HTTP status to the matching {@link EmporixError} subclass. */\nexport function errorFromResponse(status: number, message: string, body: unknown): EmporixError {\n if (status === 401) return new EmporixAuthError(message, status, body);\n if (status === 403) {\n const scope = extractRequiredScope(body);\n if (scope) return new EmporixInsufficientScopeError(message, status, body, scope);\n return new EmporixForbiddenError(message, status, body);\n }\n if (status === 404) return new EmporixNotFoundError(message, status, body);\n if (status === 400 || status === 422) return new EmporixValidationError(message, status, body);\n if (status >= 500) return new EmporixServerError(message, status, body);\n return new EmporixError(message, status, body);\n}\n","import type { AuthContext } from \"./auth\";\nimport { EmporixAuthError } from \"./errors\";\n\n/**\n * Enforces a caller-owned customer or raw token. Throws `EmporixAuthError`\n * for any other `AuthContext` kind (or when `auth` is missing). Shared by\n * services whose endpoints require a customer scope (`/me`, payments,\n * customer-segments…).\n */\nexport function requireCustomer(auth: AuthContext | undefined): AuthContext {\n if (auth && (auth.kind === \"customer\" || auth.kind === \"raw\")) return auth;\n throw new EmporixAuthError(\"This operation requires a customer or raw AuthContext\");\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { requireCustomer } from \"../core/require-customer\";\nimport type { ProductService } from \"./product\";\nimport type { CategoryService } from \"./category\";\nimport type {\n SegmentResponse,\n ItemAssignmentResponse,\n CategoryTreeResponse,\n SegmentCreation,\n SegmentUpdate,\n SegmentsSearch,\n SegmentUpdateBulk,\n Match,\n CustomerAssignmentUpsert,\n CustomerAssignmentUpsertBulk,\n CustomerAssignmentResponse,\n ItemAssignmentUpsert,\n ItemAssignmentUpsertBulk,\n BulkResponse,\n BulkAssignmentResponse,\n} from \"../generated/customer-segment\";\n\n/** Generated segment types (read shapes — storefront `segment_read_own`). */\nexport type Segment = SegmentResponse;\nexport type SegmentItem = ItemAssignmentResponse;\nexport type SegmentCategoryTree = CategoryTreeResponse;\nexport type SegmentCategoryTreeNode = CategoryTreeResponse[number];\n\n/** Create body for a segment (generated). */\nexport type SegmentInput = SegmentCreation;\n/** Full-replace (PUT) body for a segment (generated). */\nexport type SegmentUpdateInput = SegmentUpdate;\n/** Partial (PATCH) body for a segment. */\nexport type SegmentPatchInput = Partial<SegmentUpdate>;\n/** Search body for segments (generated). */\nexport type SegmentSearchQuery = SegmentsSearch;\n/** Body for a segment match check (generated). */\nexport type SegmentMatchInput = Match;\n/** One entry of a segment bulk request (generated). */\nexport type SegmentBulkItem = SegmentUpdateBulk;\n/** Per-entry result of a segment bulk operation (generated). */\nexport type SegmentBulkResult = BulkResponse;\n/** Customer→segment assignment body (generated). */\nexport type SegmentCustomerInput = CustomerAssignmentUpsert;\n/** One entry of a customer-assignment bulk request (generated). */\nexport type SegmentCustomerBulkInput = CustomerAssignmentUpsertBulk;\n/** A customer→segment assignment (read). */\nexport type SegmentCustomer = CustomerAssignmentResponse;\n/** Item→segment assignment body (generated). */\nexport type SegmentItemInput = ItemAssignmentUpsert;\n/** One entry of an item-assignment bulk request (generated). */\nexport type SegmentItemBulkInput = ItemAssignmentUpsertBulk;\n/** Per-entry result of an assignment bulk operation (generated). */\nexport type SegmentAssignmentBulkResult = BulkAssignmentResponse;\n\n/** Cross-service hydrate dependencies, injected from `EmporixClient`. */\nexport interface SegmentServiceDeps {\n products: ProductService;\n categories: CategoryService;\n}\n\nfunction setIfDefined<V>(\n q: Record<string, string | number | undefined>,\n key: string,\n value: V | undefined,\n): void {\n if (value !== undefined && value !== \"\") {\n q[key] = value as unknown as string | number;\n }\n}\n\n/** Admin default: segment-manage operations use a service token. */\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Customer-segment reads. Every method requires a customer/raw\n * `AuthContext` — the `segment_read_own` scope is on the customer token.\n * The standard product/category endpoints do **not** auto-filter by\n * segment; the storefront uses these reads to discover what to fetch.\n */\nexport class SegmentService {\n static readonly channel = \"segment\" as const;\n static readonly deps = [\"products\", \"categories\"] as const;\n constructor(\n private readonly ctx: ClientContext,\n private readonly deps: SegmentServiceDeps,\n ) {}\n\n private base(): string {\n return `/customer-segment/${this.ctx.tenant}/segments`;\n }\n\n /** Lists segments the caller belongs to (with `segment_read_own`). */\n async list(\n query: { q?: string; pageNumber?: number; pageSize?: number } = {},\n auth?: AuthContext,\n ): Promise<Segment[]> {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"q\", query.q);\n setIfDefined(q, \"pageNumber\", query.pageNumber);\n setIfDefined(q, \"pageSize\", query.pageSize);\n return this.ctx.http.request<Segment[]>({\n method: \"GET\",\n path: this.base(),\n auth: requireCustomer(auth),\n ...(Object.keys(q).length ? { query: q } : {}),\n });\n }\n\n /** Fetches a single segment by id. */\n async get(segmentId: string, auth?: AuthContext): Promise<Segment> {\n return this.ctx.http.request<Segment>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}`,\n auth: requireCustomer(auth),\n });\n }\n\n /** Item assignments (PRODUCT + CATEGORY) across all the caller's active segments. */\n async listItems(\n query: {\n q?: string;\n siteCode?: string;\n legalEntityId?: string;\n onlyActive?: boolean;\n pageNumber?: number;\n pageSize?: number;\n } = {},\n auth?: AuthContext,\n ): Promise<SegmentItem[]> {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"q\", query.q);\n setIfDefined(q, \"siteCode\", query.siteCode);\n setIfDefined(q, \"legalEntityId\", query.legalEntityId);\n setIfDefined(q, \"pageNumber\", query.pageNumber);\n setIfDefined(q, \"pageSize\", query.pageSize);\n if (query.onlyActive !== undefined) q.onlyActive = String(query.onlyActive);\n return this.ctx.http.request<SegmentItem[]>({\n method: \"GET\",\n path: `${this.base()}/items`,\n auth: requireCustomer(auth),\n ...(Object.keys(q).length ? { query: q } : {}),\n });\n }\n\n /** Item assignments of one specific segment. */\n async listSegmentItems(\n segmentId: string,\n query: {\n q?: string;\n legalEntityId?: string;\n pageNumber?: number;\n pageSize?: number;\n } = {},\n auth?: AuthContext,\n ): Promise<SegmentItem[]> {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"q\", query.q);\n setIfDefined(q, \"legalEntityId\", query.legalEntityId);\n setIfDefined(q, \"pageNumber\", query.pageNumber);\n setIfDefined(q, \"pageSize\", query.pageSize);\n return this.ctx.http.request<SegmentItem[]>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}/items`,\n auth: requireCustomer(auth),\n ...(Object.keys(q).length ? { query: q } : {}),\n });\n }\n\n /** Category tree built only from the caller's active segments. */\n async getCategoryTree(\n query: { siteCode?: string; legalEntityId?: string } = {},\n auth?: AuthContext,\n ): Promise<SegmentCategoryTree> {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"siteCode\", query.siteCode);\n setIfDefined(q, \"legalEntityId\", query.legalEntityId);\n return this.ctx.http.request<SegmentCategoryTree>({\n method: \"GET\",\n path: `${this.base()}/items/category-trees`,\n auth: requireCustomer(auth),\n ...(Object.keys(q).length ? { query: q } : {}),\n });\n }\n\n private async pickItemIds(\n kind: \"PRODUCT\" | \"CATEGORY\",\n query: Parameters<SegmentService[\"listItems\"]>[0],\n auth: AuthContext | undefined,\n ): Promise<string[]> {\n const rows = await this.listItems(query, auth);\n const ids: string[] = [];\n for (const r of rows) {\n const id = r.item?.id;\n if (r.type === kind && typeof id === \"string\") ids.push(id);\n }\n return ids;\n }\n\n /** Product ids assigned to the caller's active segments. */\n async listMyProductIds(\n query?: Parameters<SegmentService[\"listItems\"]>[0],\n auth?: AuthContext,\n ): Promise<string[]> {\n return this.pickItemIds(\"PRODUCT\", query ?? {}, auth);\n }\n\n /** Category ids assigned to the caller's active segments. */\n async listMyCategoryIds(\n query?: Parameters<SegmentService[\"listItems\"]>[0],\n auth?: AuthContext,\n ): Promise<string[]> {\n return this.pickItemIds(\"CATEGORY\", query ?? {}, auth);\n }\n\n /**\n * Hydrates `listMyProductIds` via `ProductService.get` in parallel.\n * Resolves in the same order as the id list. Any single failure rejects\n * the whole batch (`Promise.all`); use the id-list method + your own\n * tolerance strategy if partial success matters.\n */\n // No `totalCount` opt-in, deliberately. This pages over the segment's\n // ASSIGNMENTS and hydrates the hits in a second call, so `X-Total-Count` would\n // count assignments — including the CATEGORY entries filtered out below — not\n // the products returned. A number that is wrong in the way that is hardest to\n // notice. Same reason `categories.productsIn` stays on the guess.\n async listMyProducts(\n query?: Parameters<SegmentService[\"listItems\"]>[0],\n auth?: AuthContext,\n ): Promise<PaginatedItems<Awaited<ReturnType<ProductService[\"get\"]>>>> {\n const pageNumber = query?.pageNumber ?? 1;\n const pageSize = query?.pageSize ?? 20;\n const sourceItems = await this.listItems(\n { ...(query ?? {}), pageNumber, pageSize },\n auth,\n );\n const ids: string[] = [];\n for (const r of sourceItems) {\n if (r.type === \"PRODUCT\" && typeof r.item?.id === \"string\") ids.push(r.item.id);\n }\n const items = await this.deps.products.searchByIds(ids, undefined, auth);\n return { items, pageNumber, pageSize, hasNextPage: sourceItems.length === pageSize };\n }\n\n /**\n * Hydrates a page of the caller's segment CATEGORY assignments into\n * real categories via one bulk `categories.searchByIds` call. Same\n * `hasNextPage` semantic as `listMyProducts`.\n */\n // No `totalCount` opt-in — see the note on {@link listMyProducts}.\n async listMyCategories(\n query?: Parameters<SegmentService[\"listItems\"]>[0],\n auth?: AuthContext,\n ): Promise<PaginatedItems<Awaited<ReturnType<CategoryService[\"get\"]>>>> {\n const pageNumber = query?.pageNumber ?? 1;\n const pageSize = query?.pageSize ?? 20;\n const sourceItems = await this.listItems(\n { ...(query ?? {}), pageNumber, pageSize },\n auth,\n );\n const ids: string[] = [];\n for (const r of sourceItems) {\n if (r.type === \"CATEGORY\" && typeof r.item?.id === \"string\") ids.push(r.item.id);\n }\n const items = await this.deps.categories.searchByIds(ids, undefined, auth);\n return { items, pageNumber, pageSize, hasNextPage: sourceItems.length === pageSize };\n }\n\n // --- Admin CRUD (segment_manage). Default auth: service. ---\n\n /** Creates a segment. Default auth: service. */\n async create(input: SegmentInput, authCtx: AuthContext = SERVICE): Promise<Segment> {\n return this.ctx.http.request<Segment>({ method: \"POST\", path: this.base(), auth: authCtx, body: input });\n }\n\n /** Searches segments (POST body). Default auth: service. */\n async search(query: SegmentSearchQuery, authCtx: AuthContext = SERVICE): Promise<Segment[]> {\n return this.ctx.http.request<Segment[]>({\n method: \"POST\",\n path: `${this.base()}/search`,\n auth: authCtx,\n body: query,\n });\n }\n\n /** Full-replaces a segment (PUT). Default auth: service. */\n async update(segmentId: string, input: SegmentUpdateInput, authCtx: AuthContext = SERVICE): Promise<Segment> {\n return this.ctx.http.request<Segment>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}`,\n auth: authCtx,\n body: input,\n });\n }\n\n /** Partially updates a segment (PATCH). Default auth: service. */\n async patch(segmentId: string, input: SegmentPatchInput, authCtx: AuthContext = SERVICE): Promise<Segment> {\n return this.ctx.http.request<Segment>({\n method: \"PATCH\",\n path: `${this.base()}/${segmentId}`,\n auth: authCtx,\n body: input,\n });\n }\n\n /** Deletes a segment. Default auth: service. */\n async delete(segmentId: string, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}`,\n auth: authCtx,\n });\n }\n\n /** Checks which segments the given items/customers match. Default auth: service. */\n async match(input: SegmentMatchInput, authCtx: AuthContext = SERVICE): Promise<Segment[]> {\n return this.ctx.http.request<Segment[]>({\n method: \"POST\",\n path: `${this.base()}/match`,\n auth: authCtx,\n body: input,\n });\n }\n\n /** Creates multiple segments. Default auth: service. */\n async bulkCreate(inputs: SegmentBulkItem[], authCtx: AuthContext = SERVICE): Promise<SegmentBulkResult[]> {\n return this.ctx.http.request<SegmentBulkResult[]>({\n method: \"POST\",\n path: `${this.base()}/bulk`,\n auth: authCtx,\n body: inputs,\n });\n }\n\n /** Upserts multiple segments (PUT). Default auth: service. */\n async bulkUpdate(inputs: SegmentBulkItem[], authCtx: AuthContext = SERVICE): Promise<SegmentBulkResult[]> {\n return this.ctx.http.request<SegmentBulkResult[]>({\n method: \"PUT\",\n path: `${this.base()}/bulk`,\n auth: authCtx,\n body: inputs,\n });\n }\n\n /** Deletes multiple segments (DELETE with a body of ids). Default auth: service. */\n async bulkDelete(body: Record<string, unknown>, authCtx: AuthContext = SERVICE): Promise<SegmentBulkResult[]> {\n return this.ctx.http.request<SegmentBulkResult[]>({\n method: \"DELETE\",\n path: `${this.base()}/bulk`,\n auth: authCtx,\n body,\n });\n }\n\n /** Customer→segment assignments (`segment_manage`). Default auth: service. */\n readonly customers = {\n list: async (segmentId: string, query?: Record<string, string | number>, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer[]> =>\n this.ctx.http.request<SegmentCustomer[]>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}/customers`,\n auth: authCtx,\n ...(query ? { query } : {}),\n }),\n search: async (segmentId: string, query: Record<string, unknown>, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer[]> =>\n this.ctx.http.request<SegmentCustomer[]>({\n method: \"POST\",\n path: `${this.base()}/${segmentId}/customers/search`,\n auth: authCtx,\n body: query,\n }),\n get: async (segmentId: string, customerId: string, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer> =>\n this.ctx.http.request<SegmentCustomer>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}/customers/${customerId}`,\n auth: authCtx,\n }),\n assign: async (segmentId: string, customerId: string, input: SegmentCustomerInput, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer> =>\n this.ctx.http.request<SegmentCustomer>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}/customers/${customerId}`,\n auth: authCtx,\n body: input,\n }),\n remove: async (segmentId: string, customerId: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}/customers/${customerId}`,\n auth: authCtx,\n });\n },\n getForEntity: async (segmentId: string, customerId: string, legalEntityId: string, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer> =>\n this.ctx.http.request<SegmentCustomer>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}/customers/${customerId}/${legalEntityId}`,\n auth: authCtx,\n }),\n assignForEntity: async (segmentId: string, customerId: string, legalEntityId: string, input: SegmentCustomerInput, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer> =>\n this.ctx.http.request<SegmentCustomer>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}/customers/${customerId}/${legalEntityId}`,\n auth: authCtx,\n body: input,\n }),\n removeForEntity: async (segmentId: string, customerId: string, legalEntityId: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}/customers/${customerId}/${legalEntityId}`,\n auth: authCtx,\n });\n },\n bulkAssign: async (segmentId: string, inputs: SegmentCustomerBulkInput[], authCtx: AuthContext = SERVICE): Promise<SegmentAssignmentBulkResult[]> =>\n this.ctx.http.request<SegmentAssignmentBulkResult[]>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}/customers/bulk`,\n auth: authCtx,\n body: inputs,\n }),\n bulkRemove: async (segmentId: string, body: Record<string, unknown>, authCtx: AuthContext = SERVICE): Promise<SegmentAssignmentBulkResult[]> =>\n this.ctx.http.request<SegmentAssignmentBulkResult[]>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}/customers/bulk`,\n auth: authCtx,\n body,\n }),\n };\n\n /** Item→segment assignments (`type` = PRODUCT | CATEGORY). Default auth: service. */\n readonly items = {\n search: async (segmentId: string, query: Record<string, unknown>, authCtx: AuthContext = SERVICE): Promise<SegmentItem[]> =>\n this.ctx.http.request<SegmentItem[]>({\n method: \"POST\",\n path: `${this.base()}/${segmentId}/items/search`,\n auth: authCtx,\n body: query,\n }),\n get: async (segmentId: string, type: string, itemId: string, authCtx: AuthContext = SERVICE): Promise<SegmentItem> =>\n this.ctx.http.request<SegmentItem>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}/items/${type}/${itemId}`,\n auth: authCtx,\n }),\n assign: async (segmentId: string, type: string, itemId: string, input: SegmentItemInput, authCtx: AuthContext = SERVICE): Promise<SegmentItem> =>\n this.ctx.http.request<SegmentItem>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}/items/${type}/${itemId}`,\n auth: authCtx,\n body: input,\n }),\n remove: async (segmentId: string, type: string, itemId: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}/items/${type}/${itemId}`,\n auth: authCtx,\n });\n },\n bulkAssign: async (segmentId: string, type: string, inputs: SegmentItemBulkInput[], authCtx: AuthContext = SERVICE): Promise<SegmentAssignmentBulkResult[]> =>\n this.ctx.http.request<SegmentAssignmentBulkResult[]>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}/items/${type}/bulk`,\n auth: authCtx,\n body: inputs,\n }),\n bulkRemove: async (segmentId: string, type: string, body: Record<string, unknown>, authCtx: AuthContext = SERVICE): Promise<SegmentAssignmentBulkResult[]> =>\n this.ctx.http.request<SegmentAssignmentBulkResult[]>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}/items/${type}/bulk`,\n auth: authCtx,\n body,\n }),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/errors.ts","../src/core/require-customer.ts","../src/services/segment.ts"],"names":[],"mappings":"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","file":"segment.cjs","sourcesContent":["/** Keys whose values are stripped from any serialised error body. */\nconst REDACTED_BODY_KEYS = new Set([\n \"access_token\", \"refresh_token\", \"token\", \"customertoken\", \"saastoken\",\n \"secret\", \"client_secret\", \"authorization\", \"password\",\n]);\n\nfunction scrub(body: unknown): unknown {\n if (Array.isArray(body)) return body.map(scrub);\n if (body && typeof body === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(body as Record<string, unknown>)) {\n out[k] = REDACTED_BODY_KEYS.has(k.toLowerCase()) ? \"***redacted***\" : scrub(v);\n }\n return out;\n }\n return body;\n}\n\n/** Base class for every error thrown by the SDK. */\nexport class EmporixError extends Error {\n readonly status: number | undefined;\n readonly body: unknown;\n constructor(message: string, status?: number, body?: unknown) {\n super(message);\n this.name = new.target.name;\n this.status = status;\n this.body = body;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n /** Safe serialisation — token-like body fields are redacted. */\n toJSON(): Record<string, unknown> {\n return { name: this.name, message: this.message, status: this.status, body: scrub(this.body) };\n }\n}\n\n/** 401 — authentication failed or token expired. */\nexport class EmporixAuthError extends EmporixError {}\n/** 403 — authenticated but not permitted. */\nexport class EmporixForbiddenError extends EmporixError {}\n/** 404 — resource not found. */\nexport class EmporixNotFoundError extends EmporixError {}\n/** 400/422 — request validation failed. */\nexport class EmporixValidationError extends EmporixError {}\n/** 5xx — server-side failure. */\nexport class EmporixServerError extends EmporixError {}\n/** Request aborted by the configured connect/read timeout. No HTTP status. */\nexport class EmporixTimeoutError extends EmporixError {}\n/** DNS/TLS/connection-level failure before or during the exchange. No HTTP status. */\nexport class EmporixNetworkError extends EmporixError {}\n\n/**\n * 403 with a `missing scope: <name>` hint in the body's `details` array.\n * Subclasses {@link EmporixForbiddenError} so existing 403 catches still work.\n */\nexport class EmporixInsufficientScopeError extends EmporixForbiddenError {\n readonly requiredScope: string | undefined;\n constructor(message: string, status: number, body: unknown, requiredScope?: string) {\n super(message, status, body);\n this.requiredScope = requiredScope;\n }\n}\n\nconst SCOPE_HINT_RE = /missing scope[: ]+([a-z0-9._-]+)/i;\n\nfunction extractRequiredScope(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"details\" in body) {\n const details = (body as { details?: unknown }).details;\n if (Array.isArray(details)) {\n for (const d of details) {\n if (typeof d === \"string\") {\n const m = d.match(SCOPE_HINT_RE);\n if (m) return m[1];\n }\n }\n }\n }\n return undefined;\n}\n\n/** Maps an HTTP status to the matching {@link EmporixError} subclass. */\nexport function errorFromResponse(status: number, message: string, body: unknown): EmporixError {\n if (status === 401) return new EmporixAuthError(message, status, body);\n if (status === 403) {\n const scope = extractRequiredScope(body);\n if (scope) return new EmporixInsufficientScopeError(message, status, body, scope);\n return new EmporixForbiddenError(message, status, body);\n }\n if (status === 404) return new EmporixNotFoundError(message, status, body);\n if (status === 400 || status === 422) return new EmporixValidationError(message, status, body);\n if (status >= 500) return new EmporixServerError(message, status, body);\n return new EmporixError(message, status, body);\n}\n","import type { AuthContext } from \"./auth\";\nimport { EmporixAuthError } from \"./errors\";\n\n/**\n * Enforces a caller-owned customer or raw token. Throws `EmporixAuthError`\n * for any other `AuthContext` kind (or when `auth` is missing). Shared by\n * services whose endpoints require a customer scope (`/me`, payments,\n * customer-segments…).\n */\nexport function requireCustomer(auth: AuthContext | undefined): AuthContext {\n if (auth && (auth.kind === \"customer\" || auth.kind === \"raw\")) return auth;\n throw new EmporixAuthError(\"This operation requires a customer or raw AuthContext\");\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { requireCustomer } from \"../core/require-customer\";\nimport type { ProductService } from \"./product\";\nimport type { CategoryService } from \"./category\";\nimport type {\n SegmentResponse,\n ItemAssignmentResponse,\n CategoryTreeResponse,\n SegmentCreation,\n SegmentUpdate,\n SegmentsSearch,\n SegmentUpdateBulk,\n Match,\n CustomerAssignmentUpsert,\n CustomerAssignmentUpsertBulk,\n CustomerAssignmentResponse,\n GroupAssignmentUpsert,\n GroupAssignmentResponse,\n ItemAssignmentUpsert,\n ItemAssignmentUpsertBulk,\n BulkResponse,\n BulkAssignmentResponse,\n} from \"../generated/customer-segment\";\n\n/** Generated segment types (read shapes — storefront `segment_read_own`). */\nexport type Segment = SegmentResponse;\nexport type SegmentItem = ItemAssignmentResponse;\nexport type SegmentCategoryTree = CategoryTreeResponse;\nexport type SegmentCategoryTreeNode = CategoryTreeResponse[number];\n\n/** Create body for a segment (generated). */\nexport type SegmentInput = SegmentCreation;\n/** Full-replace (PUT) body for a segment (generated). */\nexport type SegmentUpdateInput = SegmentUpdate;\n/** Partial (PATCH) body for a segment. */\nexport type SegmentPatchInput = Partial<SegmentUpdate>;\n/** Search body for segments (generated). */\nexport type SegmentSearchQuery = SegmentsSearch;\n/** Body for a segment match check (generated). */\nexport type SegmentMatchInput = Match;\n/** One entry of a segment bulk request (generated). */\nexport type SegmentBulkItem = SegmentUpdateBulk;\n/** Per-entry result of a segment bulk operation (generated). */\nexport type SegmentBulkResult = BulkResponse;\n/** Customer→segment assignment body (generated). */\nexport type SegmentCustomerInput = CustomerAssignmentUpsert;\n/** One entry of a customer-assignment bulk request (generated). */\nexport type SegmentCustomerBulkInput = CustomerAssignmentUpsertBulk;\n/** A customer→segment assignment (read). */\nexport type SegmentCustomer = CustomerAssignmentResponse;\n/** IAM group→segment assignment body (generated). The group id is in the path. */\nexport type SegmentGroupInput = GroupAssignmentUpsert;\n/** An IAM group→segment assignment (read). */\nexport type SegmentGroup = GroupAssignmentResponse;\n/** Item→segment assignment body (generated). */\nexport type SegmentItemInput = ItemAssignmentUpsert;\n/** One entry of an item-assignment bulk request (generated). */\nexport type SegmentItemBulkInput = ItemAssignmentUpsertBulk;\n/** Per-entry result of an assignment bulk operation (generated). */\nexport type SegmentAssignmentBulkResult = BulkAssignmentResponse;\n\n/** Cross-service hydrate dependencies, injected from `EmporixClient`. */\nexport interface SegmentServiceDeps {\n products: ProductService;\n categories: CategoryService;\n}\n\nfunction setIfDefined<V>(\n q: Record<string, string | number | undefined>,\n key: string,\n value: V | undefined,\n): void {\n if (value !== undefined && value !== \"\") {\n q[key] = value as unknown as string | number;\n }\n}\n\n/** Admin default: segment-manage operations use a service token. */\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Customer-segment reads. Every method requires a customer/raw\n * `AuthContext` — the `segment_read_own` scope is on the customer token.\n * The standard product/category endpoints do **not** auto-filter by\n * segment; the storefront uses these reads to discover what to fetch.\n */\nexport class SegmentService {\n static readonly channel = \"segment\" as const;\n static readonly deps = [\"products\", \"categories\"] as const;\n constructor(\n private readonly ctx: ClientContext,\n private readonly deps: SegmentServiceDeps,\n ) {}\n\n private base(): string {\n return `/customer-segment/${this.ctx.tenant}/segments`;\n }\n\n /**\n * Lists segments via the generic `GET /segments` (with `segment_read_own`).\n * Its documentation does not say whether segments inherited through IAM\n * groups are included — for \"which segments is this customer in\", use\n * {@link listMine}, which is documented to include them.\n */\n async list(\n query: { q?: string; pageNumber?: number; pageSize?: number } = {},\n auth?: AuthContext,\n ): Promise<Segment[]> {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"q\", query.q);\n setIfDefined(q, \"pageNumber\", query.pageNumber);\n setIfDefined(q, \"pageSize\", query.pageSize);\n return this.ctx.http.request<Segment[]>({\n method: \"GET\",\n path: this.base(),\n auth: requireCustomer(auth),\n ...(Object.keys(q).length ? { query: q } : {}),\n });\n }\n\n /**\n * The authenticated customer's **active** segments (`GET /segments/me`,\n * `segment_read_own`): assigned directly, and inherited through the\n * customer's IAM groups — groups not bound to a legal entity, plus groups\n * bound to the customer's *current* legal entity. Switching the active company\n * can therefore change the result.\n */\n async listMine(\n query: { q?: string; pageNumber?: number; pageSize?: number; sort?: string } = {},\n auth?: AuthContext,\n ): Promise<Segment[]> {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"q\", query.q);\n setIfDefined(q, \"pageNumber\", query.pageNumber);\n setIfDefined(q, \"pageSize\", query.pageSize);\n setIfDefined(q, \"sort\", query.sort);\n return this.ctx.http.request<Segment[]>({\n method: \"GET\",\n path: `${this.base()}/me`,\n auth: requireCustomer(auth),\n ...(Object.keys(q).length ? { query: q } : {}),\n });\n }\n\n /** Fetches a single segment by id. */\n async get(segmentId: string, auth?: AuthContext): Promise<Segment> {\n return this.ctx.http.request<Segment>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}`,\n auth: requireCustomer(auth),\n });\n }\n\n /** Item assignments (PRODUCT + CATEGORY) across all the caller's active segments. */\n async listItems(\n query: {\n q?: string;\n siteCode?: string;\n legalEntityId?: string;\n onlyActive?: boolean;\n pageNumber?: number;\n pageSize?: number;\n } = {},\n auth?: AuthContext,\n ): Promise<SegmentItem[]> {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"q\", query.q);\n setIfDefined(q, \"siteCode\", query.siteCode);\n setIfDefined(q, \"legalEntityId\", query.legalEntityId);\n setIfDefined(q, \"pageNumber\", query.pageNumber);\n setIfDefined(q, \"pageSize\", query.pageSize);\n if (query.onlyActive !== undefined) q.onlyActive = String(query.onlyActive);\n return this.ctx.http.request<SegmentItem[]>({\n method: \"GET\",\n path: `${this.base()}/items`,\n auth: requireCustomer(auth),\n ...(Object.keys(q).length ? { query: q } : {}),\n });\n }\n\n /** Item assignments of one specific segment. */\n async listSegmentItems(\n segmentId: string,\n query: {\n q?: string;\n legalEntityId?: string;\n pageNumber?: number;\n pageSize?: number;\n } = {},\n auth?: AuthContext,\n ): Promise<SegmentItem[]> {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"q\", query.q);\n setIfDefined(q, \"legalEntityId\", query.legalEntityId);\n setIfDefined(q, \"pageNumber\", query.pageNumber);\n setIfDefined(q, \"pageSize\", query.pageSize);\n return this.ctx.http.request<SegmentItem[]>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}/items`,\n auth: requireCustomer(auth),\n ...(Object.keys(q).length ? { query: q } : {}),\n });\n }\n\n /** Category tree built only from the caller's active segments. */\n async getCategoryTree(\n query: { siteCode?: string; legalEntityId?: string } = {},\n auth?: AuthContext,\n ): Promise<SegmentCategoryTree> {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"siteCode\", query.siteCode);\n setIfDefined(q, \"legalEntityId\", query.legalEntityId);\n return this.ctx.http.request<SegmentCategoryTree>({\n method: \"GET\",\n path: `${this.base()}/items/category-trees`,\n auth: requireCustomer(auth),\n ...(Object.keys(q).length ? { query: q } : {}),\n });\n }\n\n private async pickItemIds(\n kind: \"PRODUCT\" | \"CATEGORY\",\n query: Parameters<SegmentService[\"listItems\"]>[0],\n auth: AuthContext | undefined,\n ): Promise<string[]> {\n const rows = await this.listItems(query, auth);\n const ids: string[] = [];\n for (const r of rows) {\n const id = r.item?.id;\n if (r.type === kind && typeof id === \"string\") ids.push(id);\n }\n return ids;\n }\n\n /** Product ids assigned to the caller's active segments. */\n async listMyProductIds(\n query?: Parameters<SegmentService[\"listItems\"]>[0],\n auth?: AuthContext,\n ): Promise<string[]> {\n return this.pickItemIds(\"PRODUCT\", query ?? {}, auth);\n }\n\n /** Category ids assigned to the caller's active segments. */\n async listMyCategoryIds(\n query?: Parameters<SegmentService[\"listItems\"]>[0],\n auth?: AuthContext,\n ): Promise<string[]> {\n return this.pickItemIds(\"CATEGORY\", query ?? {}, auth);\n }\n\n /**\n * Hydrates `listMyProductIds` via `ProductService.get` in parallel.\n * Resolves in the same order as the id list. Any single failure rejects\n * the whole batch (`Promise.all`); use the id-list method + your own\n * tolerance strategy if partial success matters.\n */\n // No `totalCount` opt-in, deliberately. This pages over the segment's\n // ASSIGNMENTS and hydrates the hits in a second call, so `X-Total-Count` would\n // count assignments — including the CATEGORY entries filtered out below — not\n // the products returned. A number that is wrong in the way that is hardest to\n // notice. Same reason `categories.productsIn` stays on the guess.\n async listMyProducts(\n query?: Parameters<SegmentService[\"listItems\"]>[0],\n auth?: AuthContext,\n ): Promise<PaginatedItems<Awaited<ReturnType<ProductService[\"get\"]>>>> {\n const pageNumber = query?.pageNumber ?? 1;\n const pageSize = query?.pageSize ?? 20;\n const sourceItems = await this.listItems(\n { ...(query ?? {}), pageNumber, pageSize },\n auth,\n );\n const ids: string[] = [];\n for (const r of sourceItems) {\n if (r.type === \"PRODUCT\" && typeof r.item?.id === \"string\") ids.push(r.item.id);\n }\n const items = await this.deps.products.searchByIds(ids, undefined, auth);\n return { items, pageNumber, pageSize, hasNextPage: sourceItems.length === pageSize };\n }\n\n /**\n * Hydrates a page of the caller's segment CATEGORY assignments into\n * real categories via one bulk `categories.searchByIds` call. Same\n * `hasNextPage` semantic as `listMyProducts`.\n */\n // No `totalCount` opt-in — see the note on {@link listMyProducts}.\n async listMyCategories(\n query?: Parameters<SegmentService[\"listItems\"]>[0],\n auth?: AuthContext,\n ): Promise<PaginatedItems<Awaited<ReturnType<CategoryService[\"get\"]>>>> {\n const pageNumber = query?.pageNumber ?? 1;\n const pageSize = query?.pageSize ?? 20;\n const sourceItems = await this.listItems(\n { ...(query ?? {}), pageNumber, pageSize },\n auth,\n );\n const ids: string[] = [];\n for (const r of sourceItems) {\n if (r.type === \"CATEGORY\" && typeof r.item?.id === \"string\") ids.push(r.item.id);\n }\n const items = await this.deps.categories.searchByIds(ids, undefined, auth);\n return { items, pageNumber, pageSize, hasNextPage: sourceItems.length === pageSize };\n }\n\n // --- Admin CRUD (segment_manage). Default auth: service. ---\n\n /** Creates a segment. Default auth: service. */\n async create(input: SegmentInput, authCtx: AuthContext = SERVICE): Promise<Segment> {\n return this.ctx.http.request<Segment>({ method: \"POST\", path: this.base(), auth: authCtx, body: input });\n }\n\n /** Searches segments (POST body). Default auth: service. */\n async search(query: SegmentSearchQuery, authCtx: AuthContext = SERVICE): Promise<Segment[]> {\n return this.ctx.http.request<Segment[]>({\n method: \"POST\",\n path: `${this.base()}/search`,\n auth: authCtx,\n body: query,\n });\n }\n\n /** Full-replaces a segment (PUT). Default auth: service. */\n async update(segmentId: string, input: SegmentUpdateInput, authCtx: AuthContext = SERVICE): Promise<Segment> {\n return this.ctx.http.request<Segment>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}`,\n auth: authCtx,\n body: input,\n });\n }\n\n /** Partially updates a segment (PATCH). Default auth: service. */\n async patch(segmentId: string, input: SegmentPatchInput, authCtx: AuthContext = SERVICE): Promise<Segment> {\n return this.ctx.http.request<Segment>({\n method: \"PATCH\",\n path: `${this.base()}/${segmentId}`,\n auth: authCtx,\n body: input,\n });\n }\n\n /** Deletes a segment. Default auth: service. */\n async delete(segmentId: string, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}`,\n auth: authCtx,\n });\n }\n\n /** Checks which segments the given items/customers match. Default auth: service. */\n async match(input: SegmentMatchInput, authCtx: AuthContext = SERVICE): Promise<Segment[]> {\n return this.ctx.http.request<Segment[]>({\n method: \"POST\",\n path: `${this.base()}/match`,\n auth: authCtx,\n body: input,\n });\n }\n\n /** Creates multiple segments. Default auth: service. */\n async bulkCreate(inputs: SegmentBulkItem[], authCtx: AuthContext = SERVICE): Promise<SegmentBulkResult[]> {\n return this.ctx.http.request<SegmentBulkResult[]>({\n method: \"POST\",\n path: `${this.base()}/bulk`,\n auth: authCtx,\n body: inputs,\n });\n }\n\n /** Upserts multiple segments (PUT). Default auth: service. */\n async bulkUpdate(inputs: SegmentBulkItem[], authCtx: AuthContext = SERVICE): Promise<SegmentBulkResult[]> {\n return this.ctx.http.request<SegmentBulkResult[]>({\n method: \"PUT\",\n path: `${this.base()}/bulk`,\n auth: authCtx,\n body: inputs,\n });\n }\n\n /** Deletes multiple segments (DELETE with a body of ids). Default auth: service. */\n async bulkDelete(body: Record<string, unknown>, authCtx: AuthContext = SERVICE): Promise<SegmentBulkResult[]> {\n return this.ctx.http.request<SegmentBulkResult[]>({\n method: \"DELETE\",\n path: `${this.base()}/bulk`,\n auth: authCtx,\n body,\n });\n }\n\n /** Customer→segment assignments (`segment_manage`). Default auth: service. */\n readonly customers = {\n list: async (segmentId: string, query?: Record<string, string | number>, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer[]> =>\n this.ctx.http.request<SegmentCustomer[]>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}/customers`,\n auth: authCtx,\n ...(query ? { query } : {}),\n }),\n search: async (segmentId: string, query: Record<string, unknown>, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer[]> =>\n this.ctx.http.request<SegmentCustomer[]>({\n method: \"POST\",\n path: `${this.base()}/${segmentId}/customers/search`,\n auth: authCtx,\n body: query,\n }),\n get: async (segmentId: string, customerId: string, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer> =>\n this.ctx.http.request<SegmentCustomer>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}/customers/${customerId}`,\n auth: authCtx,\n }),\n assign: async (segmentId: string, customerId: string, input: SegmentCustomerInput, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer> =>\n this.ctx.http.request<SegmentCustomer>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}/customers/${customerId}`,\n auth: authCtx,\n body: input,\n }),\n remove: async (segmentId: string, customerId: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}/customers/${customerId}`,\n auth: authCtx,\n });\n },\n getForEntity: async (segmentId: string, customerId: string, legalEntityId: string, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer> =>\n this.ctx.http.request<SegmentCustomer>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}/customers/${customerId}/${legalEntityId}`,\n auth: authCtx,\n }),\n assignForEntity: async (segmentId: string, customerId: string, legalEntityId: string, input: SegmentCustomerInput, authCtx: AuthContext = SERVICE): Promise<SegmentCustomer> =>\n this.ctx.http.request<SegmentCustomer>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}/customers/${customerId}/${legalEntityId}`,\n auth: authCtx,\n body: input,\n }),\n removeForEntity: async (segmentId: string, customerId: string, legalEntityId: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}/customers/${customerId}/${legalEntityId}`,\n auth: authCtx,\n });\n },\n bulkAssign: async (segmentId: string, inputs: SegmentCustomerBulkInput[], authCtx: AuthContext = SERVICE): Promise<SegmentAssignmentBulkResult[]> =>\n this.ctx.http.request<SegmentAssignmentBulkResult[]>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}/customers/bulk`,\n auth: authCtx,\n body: inputs,\n }),\n bulkRemove: async (segmentId: string, body: Record<string, unknown>, authCtx: AuthContext = SERVICE): Promise<SegmentAssignmentBulkResult[]> =>\n this.ctx.http.request<SegmentAssignmentBulkResult[]>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}/customers/bulk`,\n auth: authCtx,\n body,\n }),\n };\n\n /**\n * IAM group→segment assignments (`segment_read` / `segment_manage`). Customers\n * inherit a segment through their groups, on top of direct assignment — see\n * {@link listMine}. Only groups with `userType: \"CUSTOMER\"` can be assigned;\n * anything else is a `400`. Default auth: service.\n */\n readonly groups = {\n list: async (\n segmentId: string,\n query: { q?: string; pageNumber?: number; pageSize?: number; sort?: string } = {},\n authCtx: AuthContext = SERVICE,\n ): Promise<SegmentGroup[]> => {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"q\", query.q);\n setIfDefined(q, \"pageNumber\", query.pageNumber);\n setIfDefined(q, \"pageSize\", query.pageSize);\n setIfDefined(q, \"sort\", query.sort);\n return this.ctx.http.request<SegmentGroup[]>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(segmentId)}/groups`,\n auth: authCtx,\n ...(Object.keys(q).length ? { query: q } : {}),\n });\n },\n search: async (\n segmentId: string,\n query: SegmentSearchQuery,\n authCtx: AuthContext = SERVICE,\n ): Promise<SegmentGroup[]> =>\n this.ctx.http.request<SegmentGroup[]>({\n method: \"POST\",\n path: `${this.base()}/${encodeURIComponent(segmentId)}/groups/search`,\n auth: authCtx,\n body: query,\n }),\n get: async (segmentId: string, groupId: string, authCtx: AuthContext = SERVICE): Promise<SegmentGroup> =>\n this.ctx.http.request<SegmentGroup>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(segmentId)}/groups/${encodeURIComponent(groupId)}`,\n auth: authCtx,\n }),\n /**\n * Upsert: `201` when the assignment is created, `204` when it is updated —\n * **neither returns a body**, so this resolves to nothing. Fetch it with\n * {@link get} if you need the stored assignment.\n */\n assign: async (\n segmentId: string,\n groupId: string,\n input: SegmentGroupInput = {},\n authCtx: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(segmentId)}/groups/${encodeURIComponent(groupId)}`,\n auth: authCtx,\n body: input,\n });\n },\n remove: async (segmentId: string, groupId: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(segmentId)}/groups/${encodeURIComponent(groupId)}`,\n auth: authCtx,\n });\n },\n };\n\n /** Item→segment assignments (`type` = PRODUCT | CATEGORY). Default auth: service. */\n readonly items = {\n search: async (segmentId: string, query: Record<string, unknown>, authCtx: AuthContext = SERVICE): Promise<SegmentItem[]> =>\n this.ctx.http.request<SegmentItem[]>({\n method: \"POST\",\n path: `${this.base()}/${segmentId}/items/search`,\n auth: authCtx,\n body: query,\n }),\n get: async (segmentId: string, type: string, itemId: string, authCtx: AuthContext = SERVICE): Promise<SegmentItem> =>\n this.ctx.http.request<SegmentItem>({\n method: \"GET\",\n path: `${this.base()}/${segmentId}/items/${type}/${itemId}`,\n auth: authCtx,\n }),\n assign: async (segmentId: string, type: string, itemId: string, input: SegmentItemInput, authCtx: AuthContext = SERVICE): Promise<SegmentItem> =>\n this.ctx.http.request<SegmentItem>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}/items/${type}/${itemId}`,\n auth: authCtx,\n body: input,\n }),\n remove: async (segmentId: string, type: string, itemId: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}/items/${type}/${itemId}`,\n auth: authCtx,\n });\n },\n bulkAssign: async (segmentId: string, type: string, inputs: SegmentItemBulkInput[], authCtx: AuthContext = SERVICE): Promise<SegmentAssignmentBulkResult[]> =>\n this.ctx.http.request<SegmentAssignmentBulkResult[]>({\n method: \"PUT\",\n path: `${this.base()}/${segmentId}/items/${type}/bulk`,\n auth: authCtx,\n body: inputs,\n }),\n bulkRemove: async (segmentId: string, type: string, body: Record<string, unknown>, authCtx: AuthContext = SERVICE): Promise<SegmentAssignmentBulkResult[]> =>\n this.ctx.http.request<SegmentAssignmentBulkResult[]>({\n method: \"DELETE\",\n path: `${this.base()}/${segmentId}/items/${type}/bulk`,\n auth: authCtx,\n body,\n }),\n };\n}\n"]}