@viu/emporix-sdk 4.3.1 → 4.5.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.
Files changed (55) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +2 -1
  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.cjs +3 -0
  8. package/dist/category.cjs.map +1 -1
  9. package/dist/category.d.cts +17 -11
  10. package/dist/category.d.ts +17 -11
  11. package/dist/category.js +1 -1
  12. package/dist/checkout.d.cts +1 -1
  13. package/dist/checkout.d.ts +1 -1
  14. package/dist/{chunk-2SHTDVOC.js → chunk-J2AN2FMK.js} +7 -2
  15. package/dist/chunk-J2AN2FMK.js.map +1 -0
  16. package/dist/{chunk-MSQ3GEIW.js → chunk-KJEBG7MP.js} +5 -2
  17. package/dist/chunk-KJEBG7MP.js.map +1 -0
  18. package/dist/companies.d.cts +1 -1
  19. package/dist/companies.d.ts +1 -1
  20. package/dist/contacts.d.cts +1 -1
  21. package/dist/contacts.d.ts +1 -1
  22. package/dist/{context-5lt8Q0MT.d.ts → context-BJeomwxV.d.cts} +24 -1
  23. package/dist/{context-5lt8Q0MT.d.cts → context-BJeomwxV.d.ts} +24 -1
  24. package/dist/{customer-groups-8cgS8S5d.d.cts → customer-groups-ByNcTPoL.d.cts} +1 -1
  25. package/dist/{customer-groups-DizW_a-w.d.ts → customer-groups-D7a8BvT2.d.ts} +1 -1
  26. package/dist/customer-groups.d.cts +2 -2
  27. package/dist/customer-groups.d.ts +2 -2
  28. package/dist/customer.d.cts +1 -1
  29. package/dist/customer.d.ts +1 -1
  30. package/dist/index.cjs +282 -90
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.cts +498 -5
  33. package/dist/index.d.ts +498 -5
  34. package/dist/index.js +278 -95
  35. package/dist/index.js.map +1 -1
  36. package/dist/locations.d.cts +1 -1
  37. package/dist/locations.d.ts +1 -1
  38. package/dist/media.d.cts +1 -1
  39. package/dist/media.d.ts +1 -1
  40. package/dist/orders.d.cts +1 -1
  41. package/dist/orders.d.ts +1 -1
  42. package/dist/payment.d.cts +1 -1
  43. package/dist/payment.d.ts +1 -1
  44. package/dist/price.d.cts +1 -1
  45. package/dist/price.d.ts +1 -1
  46. package/dist/product.cjs +5 -0
  47. package/dist/product.cjs.map +1 -1
  48. package/dist/product.d.cts +8 -2
  49. package/dist/product.d.ts +8 -2
  50. package/dist/product.js +1 -1
  51. package/dist/segment.d.cts +1 -1
  52. package/dist/segment.d.ts +1 -1
  53. package/package.json +1 -1
  54. package/dist/chunk-2SHTDVOC.js.map +0 -1
  55. package/dist/chunk-MSQ3GEIW.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # @viu/emporix-sdk
2
2
 
3
+ ## 4.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#398](https://github.com/viuteam/emporix-sdk/pull/398) [`0535c76`](https://github.com/viuteam/emporix-sdk/commit/0535c769219471e120b39eac47695ef8ea219ea8) Thanks [@amnael1](https://github.com/amnael1)! - feat(sdk): add the search service
8
+
9
+ New `client.search` (`SearchService`) over Emporix's Search Service, which is in preview and supports custom schema types only: `search` runs a direct or a saved search on one type, `listSavedSearches` / `getSavedSearch` / `upsertSavedSearch` / `deleteSavedSearch` manage saved searches, `listIndexes` / `getIndex` / `upsertIndex` / `deleteIndex` manage the indexes, and `listJobs` / `getJob` track the jobs that build them. Both lists span every type unless `type` is given. The upserts resolve to the created id (or the build job's id) and to `undefined` when nothing new was created. Server-side; defaults to the service token.
10
+
11
+ ## 4.4.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [#392](https://github.com/viuteam/emporix-sdk/pull/392) [`049afee`](https://github.com/viuteam/emporix-sdk/commit/049afee59ee6a3c582a3cc32f395e5bf447df935) Thanks [@amnael1](https://github.com/amnael1)! - feat(sdk): send Content-Language on writes
16
+
17
+ Localized fields sent as maps of translations (`name: { de: "Stuhl", en: "Chair" }`)
18
+ now reach Emporix without a `fetch` override. Without a `Content-Language` header,
19
+ most services read localized fields as plain strings in the tenant's default
20
+ language and answer a map with a 400 — «localized values must be of String type
21
+ when the Content-Language header is not set to all languages».
22
+
23
+ - **`contentLanguage` in `EmporixConfig`** — sent as `Content-Language` on every
24
+ request that carries a body, never on a `GET`: `"*"` for maps, a language code
25
+ such as `"de"` for plain strings. Unset, nothing changes and no header is sent.
26
+ - **Per call on product and category writes** — `contentLanguage` in
27
+ `ProductWriteOptions` (`create`, `update`, `replace`, `bulkCreate`, `bulkUpdate`)
28
+ and in the new `CategoryWriteOptions` (`create`, `update`, `patch`) overrides the
29
+ client default for that request.
30
+
31
+ The other writes with localized payloads — product templates, price models,
32
+ catalogs, brands, currencies and the rest — have no options argument and use the
33
+ client default. The template and price-model input types allow only maps, so those
34
+ writes need `contentLanguage: "*"`. `docs/products.md` shows how to send a single
35
+ call in another language through a second client that shares the token provider.
36
+
3
37
  ## 4.3.1
4
38
 
5
39
  ### Patch Changes
package/README.md CHANGED
@@ -65,7 +65,7 @@ property on the `EmporixClient` instance:
65
65
  | Cart & checkout | `carts`, `checkout`, `payments`, `coupons`, `taxes`, `shipping`, `fees` |
66
66
  | Orders & fulfilment | `orders`, `salesOrders`, `quotes`, `invoices`, `returns`, `availability`, `indexing` |
67
67
  | Customers & B2B | `customers`, `customerAdmin`, `companies`, `contacts`, `locations`, `customerGroups`, `approvals`, `rewardPoints`, `segments`, `iam` |
68
- | Platform & config | `sites`, `sessionContext`, `tenantConfig`, `clientConfig`, `media`, `schemas`, `webhooks`, `sequentialIds`, `units`, `countries`, `currencies`, `vendors`, `shoppingLists`, `cloudFunctions`, `ai`, `ragIndexer`, `imports`, `auditLogs` |
68
+ | Platform & config | `sites`, `sessionContext`, `tenantConfig`, `clientConfig`, `media`, `schemas`, `search`, `webhooks`, `sequentialIds`, `units`, `countries`, `currencies`, `vendors`, `shoppingLists`, `cloudFunctions`, `ai`, `ragIndexer`, `imports`, `auditLogs` |
69
69
 
70
70
  The sections below highlight the most-used services; per-service guides live in
71
71
  [`../../docs/`](../../docs).
@@ -107,6 +107,7 @@ See [`../../docs/mixin-search.md`](../../docs/mixin-search.md) for the capabilit
107
107
  | `logger` | console @ `warn` | `false`, a `Logger`, or `{ level, services, pretty, redact }` |
108
108
  | `tokenProvider` | built-in | inject for SSO/token-exchange |
109
109
  | `fetch` | global `fetch` | replaces `fetch` for API requests; token requests and SSE streams keep the global one |
110
+ | `contentLanguage` | — (no header) | `Content-Language` on every request with a body: `"*"` when localized fields are maps of translations, a language code when they are plain strings. Product and category writes override it per call — see [`../../docs/products.md`](../../docs/products.md#localized-writes) |
110
111
 
111
112
  `credentials: {}` is legal: a client that never mints its own token, for when the
112
113
  token comes from outside. The Managed Dashboard module in
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-5lt8Q0MT.cjs';
1
+ import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-BJeomwxV.cjs';
2
2
 
3
3
  type AvailabilityDto = {
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-5lt8Q0MT.js';
1
+ import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-BJeomwxV.js';
2
2
 
3
3
  type AvailabilityDto = {
4
4
  /**
package/dist/cart.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext } from './context-5lt8Q0MT.cjs';
1
+ import { C as ClientContext, b as AuthContext } from './context-BJeomwxV.cjs';
2
2
 
3
3
  /**
4
4
  * Access control identifier that determines who can view or manage the cart.
package/dist/cart.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext } from './context-5lt8Q0MT.js';
1
+ import { C as ClientContext, b as AuthContext } from './context-BJeomwxV.js';
2
2
 
3
3
  /**
4
4
  * Access control identifier that determines who can view or manage the cart.
package/dist/category.cjs CHANGED
@@ -274,6 +274,7 @@ var CategoryService = class {
274
274
  method: "POST",
275
275
  path: `/category/${this.ctx.tenant}/categories`,
276
276
  ...options.publish === void 0 ? {} : { query: { publish: String(options.publish) } },
277
+ ...options.contentLanguage === void 0 ? {} : { headers: { "Content-Language": options.contentLanguage } },
277
278
  body: input,
278
279
  auth
279
280
  });
@@ -288,6 +289,7 @@ var CategoryService = class {
288
289
  method: "PUT",
289
290
  path: `/category/${this.ctx.tenant}/categories/${categoryId}`,
290
291
  ...options.publish === void 0 ? {} : { query: { publish: String(options.publish) } },
292
+ ...options.contentLanguage === void 0 ? {} : { headers: { "Content-Language": options.contentLanguage } },
291
293
  body: input,
292
294
  auth
293
295
  });
@@ -301,6 +303,7 @@ var CategoryService = class {
301
303
  method: "PATCH",
302
304
  path: `/category/${this.ctx.tenant}/categories/${categoryId}`,
303
305
  ...options.publish === void 0 ? {} : { query: { publish: String(options.publish) } },
306
+ ...options.contentLanguage === void 0 ? {} : { headers: { "Content-Language": options.contentLanguage } },
304
307
  body: input,
305
308
  auth
306
309
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/context.ts","../src/core/paged.ts","../src/core/query.ts","../src/services/category.ts"],"names":[],"mappings":"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","file":"category.cjs","sourcesContent":["import type { HttpClient } from \"./http\";\nimport type { TokenProvider, AuthContext } from \"./auth\";\nimport type { Logger } from \"./logger\";\n\n/** Shared dependencies every service facade receives. */\nexport interface ClientContext {\n tenant: string;\n http: HttpClient;\n tokenProvider: TokenProvider;\n logger: Logger;\n}\n\n/**\n * A cursor-paged collection — `pageNumber`/`pageSize` indexing with a\n * `hasNextPage` signal driven by the source page being full. Used by all\n * paginated services and hooks across the SDK.\n */\nexport interface PaginatedItems<T> {\n items: T[];\n pageNumber: number;\n pageSize: number;\n hasNextPage: boolean;\n /**\n * Absolute number of matches, when the caller asked for it and the endpoint\n * answered. Opt-in per call (`totalCount: true`), because Emporix computes it\n * with a second query — see `core/paged.ts`.\n *\n * Always `undefined` in cursor mode: the server ignores the request header\n * and omits the response header there.\n */\n totalCount?: number;\n /**\n * Opaque cursor for the next page, on the endpoints that offer one (today:\n * the schema service's custom instances). Pass it back as the `next` query\n * parameter. Absence means \"this endpoint said nothing\", NOT \"last page\".\n */\n nextCursor?: string;\n /** Opaque cursor for the previous page. Same caveat as {@link nextCursor}. */\n prevCursor?: string;\n}\n\n/** Default `AuthContext` applied by a service when the caller passes none. */\nexport type DefaultAuth = AuthContext | undefined;\n\n/**\n * Async-iterates every item across pages of a `PaginatedItems<T>` source.\n * Stops when the source reports `hasNextPage: false`.\n *\n * @param fetchPage - given a 1-based page number, returns the page.\n * @param start - first page to fetch (default `1`).\n */\nexport async function* iterateAll<T>(\n fetchPage: (pageNumber: number) => Promise<PaginatedItems<T>>,\n start = 1,\n): AsyncIterable<T> {\n let p = start;\n for (;;) {\n const page = await fetchPage(p);\n for (const it of page.items) yield it;\n if (!page.hasNextPage) return;\n p += 1;\n }\n}\n\n","import type { PaginatedItems } from \"./context\";\nimport type { HttpClient, RequestOptions } from \"./http\";\n\n/** Pagination inputs for {@link requestPage}. */\nexport interface PageParams {\n /** 1-based, as Emporix counts. */\n pageNumber: number;\n pageSize: number;\n /**\n * Ask Emporix for the absolute match count via the `X-Total-Count: true`\n * request header.\n *\n * Off by default and opt-in per call, not a client-wide setting: the count\n * costs the server a second query, and defaulting it on would put that cost\n * on every list every storefront issues.\n */\n totalCount?: boolean;\n}\n\n/**\n * Reads a non-negative integer header, or `undefined` when it is missing or is\n * not one. A malformed value must not reach the `hasNextPage` arithmetic —\n * `Number(\"lots\")` is `NaN`, and every comparison against `NaN` is `false`,\n * which would silently report \"last page\" on every page.\n */\nfunction intHeader(headers: Headers, name: string): number | undefined {\n const raw = headers.get(name);\n if (raw === null || raw.trim() === \"\") return undefined;\n const n = Number(raw);\n return Number.isInteger(n) && n >= 0 ? n : undefined;\n}\n\n/**\n * Issues one page of a list endpoint and assembles {@link PaginatedItems} from\n * the body plus Emporix's pagination response headers.\n *\n * Cursors travel in opposite directions: the caller sends one as the `next` or\n * `prev` **query parameter** (so it belongs in `o.query`), and the server\n * returns the following one as the `X-Next-Cursor` **response header**. This\n * helper only ever reads them.\n */\nexport async function requestPage<T>(\n http: HttpClient,\n o: RequestOptions,\n page: PageParams,\n): Promise<PaginatedItems<T>> {\n const { data, headers } = await http.requestWithMeta<T[]>(\n page.totalCount === true\n ? { ...o, headers: { ...(o.headers ?? {}), \"X-Total-Count\": \"true\" } }\n : o,\n );\n\n // A 204 or empty body parses to `undefined`. Facades used to index straight\n // into the result and would throw; an empty page is the honest answer.\n const items = data ?? [];\n const totalCount = intHeader(headers, \"X-Total-Count\");\n const nextCursor = headers.get(\"X-Next-Cursor\") ?? undefined;\n const prevCursor = headers.get(\"X-Prev-Cursor\") ?? undefined;\n\n // Three tiers, most precise first. Tier 1 is ONE-DIRECTIONAL on purpose: only\n // two endpoints in the whole API emit a cursor header, so its absence says\n // nothing at all and has to fall through to the other two.\n const hasNextPage =\n nextCursor !== undefined\n ? true\n : totalCount !== undefined\n ? page.pageNumber * page.pageSize < totalCount\n : items.length === page.pageSize;\n\n // Spread conditionally — `exactOptionalPropertyTypes` rejects an explicit\n // `undefined` for an optional property.\n return {\n items,\n pageNumber: page.pageNumber,\n pageSize: page.pageSize,\n hasNextPage,\n ...(totalCount === undefined ? {} : { totalCount }),\n ...(nextCursor === undefined ? {} : { nextCursor }),\n ...(prevCursor === undefined ? {} : { prevCursor }),\n };\n}\n","/**\n * A built query filter — structurally matched, NOT imported, so the SDK stays\n * decoupled from `@viu/emporix-mixins` (which lists the SDK as an optional\n * peer; a real import would be circular). `@viu/emporix-mixins`' `MixinFilter<E>`\n * satisfies this shape.\n */\nexport interface BuiltQuery<E extends string = string> {\n toString(): string;\n readonly usesCompound?: boolean;\n /** Phantom entity tag — gates which service a filter may be passed to. */\n readonly __entity?: E;\n}\n\n/** A `q` value a service method accepts: a raw DSL string or a built filter for entity `E`. */\nexport type QueryFor<E extends string = string> = string | BuiltQuery<E>;\n\n/** Per-service capability flags consulted by {@link resolveQuery}. */\nexport interface QueryCapability {\n /** Whether the target service supports the `compoundLogicalQuery` (OR) operator. */\n compoundLogicalQuery: boolean;\n}\n\n/**\n * Normalizes a `string | BuiltQuery` into a `q` string and enforces the\n * `compoundLogicalQuery` capability gate: an `or()`-built filter passed to a\n * service that does not support it throws rather than silently producing a\n * query the backend cannot execute.\n */\nexport function resolveQuery(q: QueryFor, cap: QueryCapability): string {\n if (typeof q === \"string\") return q;\n if (q.usesCompound === true && !cap.compoundLogicalQuery) {\n throw new Error(\n \"This filter uses or()/compoundLogicalQuery, which the target service does not support. \" +\n \"Combine conditions with and() (space-separated AND) instead.\",\n );\n }\n return q.toString();\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { iterateAll } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery, type QueryFor } from \"../core/query\";\nimport type { Product } from \"./product\";\nimport type {\n Category as GeneratedCategory,\n CategoryTree,\n CategoryCreateRequest,\n CategoryUpdateRequest,\n CategoryPartialUpdateRequest,\n CategoryIdResponse,\n CategoryTreeSearchRequest,\n CategoryAssignment as GeneratedCategoryAssignment,\n AssignmentRequest,\n BulkAssignmentRequest,\n BulkAssignmentUpsertRequest,\n BulkAssignmentResponse,\n AssignmentIdResponse,\n} from \"../generated/category\";\n\nconst ANON: AuthContext = { kind: \"anonymous\" };\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** A category as returned by the Category service (all generated fields). */\nexport type Category = GeneratedCategory;\n\n/** The category tree as returned by the Category service. */\nexport type CategoryNode = CategoryTree;\n\n/** Body for creating a category (`POST /categories`). */\nexport type CategoryCreateInput = CategoryCreateRequest;\n\n/** Body for a full category replace (`PUT /categories/{id}`). */\nexport type CategoryUpdateInput = CategoryUpdateRequest;\n\n/** Body for a partial category update (`PATCH /categories/{id}`). */\nexport type CategoryPatchInput = CategoryPartialUpdateRequest;\n\n/** Id envelope returned when a category is created. */\nexport type CategoryCreated = CategoryIdResponse;\n\n/** Body for searching category trees (`POST /category-trees/search`). */\nexport type CategoryTreeSearchInput = CategoryTreeSearchRequest;\n\n/** A category assignment (a resource reference bound to a category). */\nexport type CategoryAssignment = GeneratedCategoryAssignment;\n\n/** Body for assigning a single resource to a category. */\nexport type CategoryAssignmentInput = AssignmentRequest;\n\n/** Body for bulk-assigning resources to a category. */\nexport type CategoryAssignmentBulkInput = BulkAssignmentRequest;\n\n/** Body for bulk-upserting assignment references (`ref.id` only). */\nexport type CategoryAssignmentRefBulkInput = BulkAssignmentUpsertRequest;\n\n/** Multi-status result of a bulk assignment operation. */\nexport type CategoryAssignmentBulkResult = BulkAssignmentResponse;\n\n/** Id envelope returned when an assignment is created. */\nexport type CategoryAssignmentCreated = AssignmentIdResponse;\n\n/** Category reads. Default auth: anonymous. */\nexport class CategoryService {\n static readonly channel = \"category\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Fetches one category by id. */\n async get(categoryId: string, auth: AuthContext = ANON): Promise<Category> {\n return this.ctx.http.request<Category>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}`,\n auth,\n });\n }\n\n /** One page of categories. */\n async list(\n params: { pageNumber?: number; pageSize?: number; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Category>> {\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Category>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories`,\n query: { pageNumber, pageSize },\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(params.totalCount === undefined ? {} : { totalCount: params.totalCount }),\n },\n );\n }\n\n /**\n * Searches categories by a `q` filter — a raw Emporix DSL string or a built\n * filter (e.g. `@viu/emporix-mixins`' `mixinQuery(...)`). Category does not\n * support `compoundLogicalQuery`, so `or()` filters are rejected.\n */\n async search(\n query: QueryFor<\"CATEGORY\">,\n params: { pageNumber?: number; pageSize?: number; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Category>> {\n const q = resolveQuery(query, { compoundLogicalQuery: false });\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Category>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories`,\n query: { q, pageNumber, pageSize },\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(params.totalCount === undefined ? {} : { totalCount: params.totalCount }),\n },\n );\n }\n\n /** Async-iterates every category across pages. */\n listAll(params: { pageSize?: number } = {}, auth: AuthContext = ANON): AsyncIterable<Category> {\n const pageSize = params.pageSize ?? 50;\n return iterateAll<Category>((pageNumber) => this.list({ pageNumber, pageSize }, auth));\n }\n\n /**\n * The catalogue's **root categories** — the published category trees\n * (`GET /category-trees`).\n *\n * Returns `CategoryNode[]` (the generated `CategoryTree`), not `Category[]`.\n * The two differ: `Category` carries `parentId` and no `subcategories`,\n * `CategoryTree` the reverse, and this endpoint answers with the latter.\n * Measured against a live tenant on 2026-08-04 — every node had\n * `subcategories` or nothing, none had `parentId`.\n *\n * **Children arrive inline in `subcategories`.** Do not reach for\n * {@link subcategories} to drill down: that method reads category-to-category\n * *assignments* (`/categories/{id}/assignments`, filtered to\n * `ref.type === \"CATEGORY\"`), which is a different feature — on the tenant this\n * was measured on, that filter answered empty for every category while the\n * `\"PRODUCT\"` filter behind {@link productsIn} worked fine.\n * {@link childCategories} hits `/categories/{id}/subcategories` and answers\n * **404** for a tree root. One call gives you the whole hierarchy.\n */\n async tree(auth: AuthContext = ANON): Promise<CategoryNode[]> {\n return this.ctx.http.request<CategoryNode[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/category-trees`,\n auth,\n });\n }\n\n /**\n * Rebuild a category tree from its root (`POST /category-trees/{rootCategoryId}/rebuild`).\n * Admin write — defaults to the service token. Returns the rebuilt tree.\n */\n async rebuildTree(rootCategoryId: string, auth: AuthContext = SERVICE): Promise<CategoryNode> {\n return this.ctx.http.request<CategoryNode>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/category-trees/${encodeURIComponent(rootCategoryId)}/rebuild`,\n auth,\n });\n }\n\n /**\n * Direct child categories of a category (for hierarchy drill-down). Mirrors\n * {@link productsIn}: reads the category's **assignments** and keeps the\n * `CATEGORY` references, resolving them to full categories. Returns an empty\n * array when the category has no child categories.\n */\n async subcategories(\n categoryId: string,\n params: { pageNumber?: number; pageSize?: number } = {},\n auth: AuthContext = ANON,\n ): Promise<Category[]> {\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n const assignments = await this.ctx.http.request<Array<{ ref?: { id?: string; type?: string } }>>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments`,\n query: { pageNumber, pageSize },\n auth,\n });\n const categoryIds = assignments\n .map((a) => (a.ref?.type?.toUpperCase() === \"CATEGORY\" ? a.ref.id : undefined))\n .filter((id): id is string => Boolean(id));\n if (categoryIds.length === 0) return [];\n return this.searchByIds(categoryIds, {}, auth);\n }\n\n /**\n * One page of products in a category. The category service exposes products\n * as **assignments** (`/categories/{id}/assignments`) — references, not full\n * products — so this fetches a page of assignments, keeps the `PRODUCT`\n * references, and resolves them to full products via `/products/search`.\n * `hasNextPage` reflects the assignments page (the source of truth for\n * pagination).\n *\n * No `totalCount` opt-in here, deliberately. `X-Total-Count` on the\n * assignments request would count **assignments** — including the `CATEGORY`\n * references filtered out below — not the products this returns. A number\n * that is wrong in the way that is hardest to notice. Same reason\n * `segments.listMyProducts` stays on the guess.\n */\n async productsIn(\n categoryId: string,\n params: { pageNumber?: number; pageSize?: number } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Product>> {\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n const assignments = await this.ctx.http.request<Array<{ ref?: { id?: string; type?: string } }>>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments`,\n query: { pageNumber, pageSize },\n auth,\n });\n const hasNextPage = assignments.length === pageSize;\n const productIds = assignments\n .map((a) => (a.ref?.type?.toUpperCase() === \"PRODUCT\" ? a.ref.id : undefined))\n .filter((id): id is string => Boolean(id));\n if (productIds.length === 0) {\n return { items: [], pageNumber, pageSize, hasNextPage };\n }\n const items = await this.ctx.http.request<Product[]>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products/search`,\n query: { pageSize: productIds.length },\n auth,\n body: { q: `id:(${productIds.join(\",\")})` },\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n return { items, pageNumber, pageSize, hasNextPage };\n }\n\n /**\n * Bulk fetch by id. POSTs `/categories/search` with `q=\"id:(id1,id2,…)\"`,\n * chunking when the list is larger than `options.chunkSize` (default\n * 100). An empty list short-circuits with no HTTP call. **Order is not\n * guaranteed** across chunks — re-index by `id` if order matters.\n */\n async searchByIds(\n ids: string[],\n options: { chunkSize?: number } = {},\n auth: AuthContext = ANON,\n ): Promise<Category[]> {\n if (ids.length === 0) return [];\n const chunkSize = options.chunkSize ?? 100;\n const chunks: string[][] = [];\n for (let i = 0; i < ids.length; i += chunkSize) {\n chunks.push(ids.slice(i, i + chunkSize));\n }\n const pages = await Promise.all(\n chunks.map((chunk) =>\n this.ctx.http.request<Category[]>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/categories/search`,\n query: { pageSize: chunk.length },\n auth,\n body: { q: `id:(${chunk.join(\",\")})` },\n }),\n ),\n );\n return pages.flat();\n }\n\n /** Lists a category's ancestor categories (breadcrumb-up). Default auth: anonymous. */\n async parents(categoryId: string, auth: AuthContext = ANON): Promise<Category[]> {\n return this.ctx.http.request<Category[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/parents`,\n auth,\n });\n }\n\n /**\n * Lists a category's direct child categories via the dedicated\n * `…/subcategories` endpoint. (The older `subcategories()` reads `/assignments`\n * and is kept for backward compatibility.) Default auth: anonymous.\n */\n async childCategories(categoryId: string, auth: AuthContext = ANON): Promise<Category[]> {\n return this.ctx.http.request<Category[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/subcategories`,\n auth,\n });\n }\n\n /** Retrieves one category tree by its root category id. Default auth: anonymous. */\n async getTree(categoryId: string, auth: AuthContext = ANON): Promise<CategoryNode> {\n return this.ctx.http.request<CategoryNode>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/category-trees/${encodeURIComponent(categoryId)}`,\n auth,\n });\n }\n\n // --- Admin write CRUD. Default auth: service. ---\n\n /**\n * Creates a category (`POST /categories`). Default auth: service.\n * `options.publish` sets the `publish` query flag (needs the\n * `category.category_publish` scope).\n */\n async create(\n input: CategoryCreateInput,\n options: { publish?: boolean } = {},\n auth: AuthContext = SERVICE,\n ): Promise<CategoryCreated> {\n return this.ctx.http.request<CategoryCreated>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/categories`,\n ...(options.publish === undefined ? {} : { query: { publish: String(options.publish) } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Full-replaces a category (`PUT /categories/{categoryId}`). This is an\n * upsert: with a caller-supplied id it may create (201, returns the id) or\n * update an existing one (204, returns nothing). Default auth: service.\n */\n async update(\n categoryId: string,\n input: CategoryUpdateInput,\n options: { publish?: boolean } = {},\n auth: AuthContext = SERVICE,\n ): Promise<CategoryCreated | void> {\n return this.ctx.http.request<CategoryCreated | void>({\n method: \"PUT\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}`,\n ...(options.publish === undefined ? {} : { query: { publish: String(options.publish) } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Partially updates a category (`PATCH /categories/{categoryId}`). Default\n * auth: service. `options.publish` sets the `publish` query flag.\n */\n async patch(\n categoryId: string,\n input: CategoryPatchInput,\n options: { publish?: boolean } = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}`,\n ...(options.publish === undefined ? {} : { query: { publish: String(options.publish) } }),\n body: input,\n auth,\n });\n }\n\n /** Deletes a category (`DELETE /categories/{categoryId}`). Default auth: service. */\n async delete(categoryId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}`,\n auth,\n });\n }\n\n /**\n * Searches categories via `POST /categories/search`. Same query capability\n * as {@link search} (`compoundLogicalQuery: false` — Category rejects `or()`\n * filters); the POST body avoids URL-length limits for large `q` filters.\n * `params.showRoots` / `params.showUnpublished` are POST-only flags. Default\n * auth: anonymous.\n */\n async searchByQuery(\n query: QueryFor<\"CATEGORY\">,\n params: { pageNumber?: number; pageSize?: number; sort?: string; showRoots?: boolean; showUnpublished?: boolean; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Category>> {\n const q = resolveQuery(query, { compoundLogicalQuery: false });\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Category>(\n this.ctx.http,\n {\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/categories/search`,\n query: {\n pageNumber,\n pageSize,\n ...(params.sort === undefined ? {} : { sort: params.sort }),\n ...(params.showRoots === undefined ? {} : { showRoots: String(params.showRoots) }),\n ...(params.showUnpublished === undefined ? {} : { showUnpublished: String(params.showUnpublished) }),\n },\n body: { q },\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(params.totalCount === undefined ? {} : { totalCount: params.totalCount }),\n },\n );\n }\n\n /**\n * Searches category trees via `POST /category-trees/search` — returns the\n * trees that include at least one of the given `categoryIds`. Default auth:\n * anonymous.\n */\n async searchTrees(\n input: CategoryTreeSearchInput,\n options: { showUnpublished?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<CategoryNode[]> {\n return this.ctx.http.request<CategoryNode[]>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/category-trees/search`,\n ...(options.showUnpublished === undefined ? {} : { query: { showUnpublished: String(options.showUnpublished) } }),\n body: input,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n auth,\n });\n }\n\n /**\n * Category ↔ resource assignments. Writes default to service auth. The\n * assignment `ref.type` is `'PRODUCT'` (per the API); category hierarchy is\n * managed via `parentId` on the category, not via assignments.\n */\n readonly assignments = {\n /** One page of a category's assignments. Default auth: anonymous. */\n list: async (\n categoryId: string,\n params: { pageNumber?: number; pageSize?: number; sort?: string; expandSupercategoriesIds?: boolean; showUnpublished?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<CategoryAssignment[]> =>\n this.ctx.http.request<CategoryAssignment[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments`,\n query: {\n ...(params.pageNumber === undefined ? {} : { pageNumber: params.pageNumber }),\n ...(params.pageSize === undefined ? {} : { pageSize: params.pageSize }),\n ...(params.sort === undefined ? {} : { sort: params.sort }),\n ...(params.expandSupercategoriesIds === undefined ? {} : { expandSupercategoriesIds: String(params.expandSupercategoriesIds) }),\n ...(params.showUnpublished === undefined ? {} : { showUnpublished: String(params.showUnpublished) }),\n },\n auth,\n }),\n\n /** Assigns a single resource to a category (`POST …/assignments`). Default auth: service. */\n create: async (categoryId: string, input: CategoryAssignmentInput, auth: AuthContext = SERVICE): Promise<CategoryAssignmentCreated> =>\n this.ctx.http.request<CategoryAssignmentCreated>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments`,\n body: input,\n auth,\n }),\n\n /** Bulk-assigns resources to a category (`POST …/assignments/bulk`). Default auth: service. */\n bulkCreate: async (categoryId: string, input: CategoryAssignmentBulkInput, auth: AuthContext = SERVICE): Promise<CategoryAssignmentBulkResult> =>\n this.ctx.http.request<CategoryAssignmentBulkResult>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments/bulk`,\n body: input,\n auth,\n }),\n\n /** Removes one assignment by id (`DELETE …/assignments/{assignmentId}`). Default auth: service. */\n remove: async (categoryId: string, assignmentId: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments/${assignmentId}`,\n auth,\n });\n },\n\n /** Removes all of a category's assignments (`DELETE …/assignments`). Default auth: service. */\n removeAll: async (categoryId: string, options: { assignmentType?: \"PRODUCT\" } = {}, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments`,\n ...(options.assignmentType === undefined ? {} : { query: { assignmentType: options.assignmentType } }),\n auth,\n });\n },\n\n /** Upserts an assignment by reference id — no body (`PUT …/assignments/references/{referenceId}`). Default auth: service. */\n upsertByReference: async (categoryId: string, referenceId: string, auth: AuthContext = SERVICE): Promise<CategoryAssignmentCreated> =>\n this.ctx.http.request<CategoryAssignmentCreated>({\n method: \"PUT\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments/references/${referenceId}`,\n auth,\n }),\n\n /** Removes an assignment by reference id (`DELETE …/assignments/references/{referenceId}`). Default auth: service. */\n removeByReference: async (categoryId: string, referenceId: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments/references/${referenceId}`,\n auth,\n });\n },\n\n /** Bulk-upserts assignment references (`PUT …/assignments/references/bulk`). Default auth: service. */\n bulkUpsertByReference: async (categoryId: string, input: CategoryAssignmentRefBulkInput, auth: AuthContext = SERVICE): Promise<CategoryAssignmentBulkResult> =>\n this.ctx.http.request<CategoryAssignmentBulkResult>({\n method: \"PUT\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments/references/bulk`,\n body: input,\n auth,\n }),\n\n /**\n * Lists every category assigned to the given reference id — tenant-wide\n * (`GET /assignments/references/{referenceId}`). Default auth: anonymous.\n */\n listCategoriesByReference: async (\n referenceId: string,\n params: { pageNumber?: number; pageSize?: number; sort?: string; showUnpublished?: boolean; expandSupercategoriesIds?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<Category[]> =>\n this.ctx.http.request<Category[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/assignments/references/${referenceId}`,\n query: {\n ...(params.pageNumber === undefined ? {} : { pageNumber: params.pageNumber }),\n ...(params.pageSize === undefined ? {} : { pageSize: params.pageSize }),\n ...(params.sort === undefined ? {} : { sort: params.sort }),\n ...(params.showUnpublished === undefined ? {} : { showUnpublished: String(params.showUnpublished) }),\n ...(params.expandSupercategoriesIds === undefined ? {} : { expandSupercategoriesIds: String(params.expandSupercategoriesIds) }),\n },\n auth,\n }),\n\n /** Removes all assignments to a given reference id — tenant-wide (`DELETE /assignments/references/{referenceId}`). Default auth: service. */\n removeAllByReference: async (referenceId: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/category/${this.ctx.tenant}/assignments/references/${referenceId}`,\n auth,\n });\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/context.ts","../src/core/paged.ts","../src/core/query.ts","../src/services/category.ts"],"names":[],"mappings":"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","file":"category.cjs","sourcesContent":["import type { HttpClient } from \"./http\";\nimport type { TokenProvider, AuthContext } from \"./auth\";\nimport type { Logger } from \"./logger\";\n\n/** Shared dependencies every service facade receives. */\nexport interface ClientContext {\n tenant: string;\n http: HttpClient;\n tokenProvider: TokenProvider;\n logger: Logger;\n}\n\n/**\n * A cursor-paged collection — `pageNumber`/`pageSize` indexing with a\n * `hasNextPage` signal driven by the source page being full. Used by all\n * paginated services and hooks across the SDK.\n */\nexport interface PaginatedItems<T> {\n items: T[];\n pageNumber: number;\n pageSize: number;\n hasNextPage: boolean;\n /**\n * Absolute number of matches, when the caller asked for it and the endpoint\n * answered. Opt-in per call (`totalCount: true`), because Emporix computes it\n * with a second query — see `core/paged.ts`.\n *\n * Always `undefined` in cursor mode: the server ignores the request header\n * and omits the response header there.\n */\n totalCount?: number;\n /**\n * Opaque cursor for the next page, on the endpoints that offer one (today:\n * the schema service's custom instances). Pass it back as the `next` query\n * parameter. Absence means \"this endpoint said nothing\", NOT \"last page\".\n */\n nextCursor?: string;\n /** Opaque cursor for the previous page. Same caveat as {@link nextCursor}. */\n prevCursor?: string;\n}\n\n/** Default `AuthContext` applied by a service when the caller passes none. */\nexport type DefaultAuth = AuthContext | undefined;\n\n/**\n * Async-iterates every item across pages of a `PaginatedItems<T>` source.\n * Stops when the source reports `hasNextPage: false`.\n *\n * @param fetchPage - given a 1-based page number, returns the page.\n * @param start - first page to fetch (default `1`).\n */\nexport async function* iterateAll<T>(\n fetchPage: (pageNumber: number) => Promise<PaginatedItems<T>>,\n start = 1,\n): AsyncIterable<T> {\n let p = start;\n for (;;) {\n const page = await fetchPage(p);\n for (const it of page.items) yield it;\n if (!page.hasNextPage) return;\n p += 1;\n }\n}\n\n","import type { PaginatedItems } from \"./context\";\nimport type { HttpClient, RequestOptions } from \"./http\";\n\n/** Pagination inputs for {@link requestPage}. */\nexport interface PageParams {\n /** 1-based, as Emporix counts. */\n pageNumber: number;\n pageSize: number;\n /**\n * Ask Emporix for the absolute match count via the `X-Total-Count: true`\n * request header.\n *\n * Off by default and opt-in per call, not a client-wide setting: the count\n * costs the server a second query, and defaulting it on would put that cost\n * on every list every storefront issues.\n */\n totalCount?: boolean;\n}\n\n/**\n * Reads a non-negative integer header, or `undefined` when it is missing or is\n * not one. A malformed value must not reach the `hasNextPage` arithmetic —\n * `Number(\"lots\")` is `NaN`, and every comparison against `NaN` is `false`,\n * which would silently report \"last page\" on every page.\n */\nfunction intHeader(headers: Headers, name: string): number | undefined {\n const raw = headers.get(name);\n if (raw === null || raw.trim() === \"\") return undefined;\n const n = Number(raw);\n return Number.isInteger(n) && n >= 0 ? n : undefined;\n}\n\n/**\n * Issues one page of a list endpoint and assembles {@link PaginatedItems} from\n * the body plus Emporix's pagination response headers.\n *\n * Cursors travel in opposite directions: the caller sends one as the `next` or\n * `prev` **query parameter** (so it belongs in `o.query`), and the server\n * returns the following one as the `X-Next-Cursor` **response header**. This\n * helper only ever reads them.\n */\nexport async function requestPage<T>(\n http: HttpClient,\n o: RequestOptions,\n page: PageParams,\n): Promise<PaginatedItems<T>> {\n const { data, headers } = await http.requestWithMeta<T[]>(\n page.totalCount === true\n ? { ...o, headers: { ...(o.headers ?? {}), \"X-Total-Count\": \"true\" } }\n : o,\n );\n\n // A 204 or empty body parses to `undefined`. Facades used to index straight\n // into the result and would throw; an empty page is the honest answer.\n const items = data ?? [];\n const totalCount = intHeader(headers, \"X-Total-Count\");\n const nextCursor = headers.get(\"X-Next-Cursor\") ?? undefined;\n const prevCursor = headers.get(\"X-Prev-Cursor\") ?? undefined;\n\n // Three tiers, most precise first. Tier 1 is ONE-DIRECTIONAL on purpose: only\n // two endpoints in the whole API emit a cursor header, so its absence says\n // nothing at all and has to fall through to the other two.\n const hasNextPage =\n nextCursor !== undefined\n ? true\n : totalCount !== undefined\n ? page.pageNumber * page.pageSize < totalCount\n : items.length === page.pageSize;\n\n // Spread conditionally — `exactOptionalPropertyTypes` rejects an explicit\n // `undefined` for an optional property.\n return {\n items,\n pageNumber: page.pageNumber,\n pageSize: page.pageSize,\n hasNextPage,\n ...(totalCount === undefined ? {} : { totalCount }),\n ...(nextCursor === undefined ? {} : { nextCursor }),\n ...(prevCursor === undefined ? {} : { prevCursor }),\n };\n}\n","/**\n * A built query filter — structurally matched, NOT imported, so the SDK stays\n * decoupled from `@viu/emporix-mixins` (which lists the SDK as an optional\n * peer; a real import would be circular). `@viu/emporix-mixins`' `MixinFilter<E>`\n * satisfies this shape.\n */\nexport interface BuiltQuery<E extends string = string> {\n toString(): string;\n readonly usesCompound?: boolean;\n /** Phantom entity tag — gates which service a filter may be passed to. */\n readonly __entity?: E;\n}\n\n/** A `q` value a service method accepts: a raw DSL string or a built filter for entity `E`. */\nexport type QueryFor<E extends string = string> = string | BuiltQuery<E>;\n\n/** Per-service capability flags consulted by {@link resolveQuery}. */\nexport interface QueryCapability {\n /** Whether the target service supports the `compoundLogicalQuery` (OR) operator. */\n compoundLogicalQuery: boolean;\n}\n\n/**\n * Normalizes a `string | BuiltQuery` into a `q` string and enforces the\n * `compoundLogicalQuery` capability gate: an `or()`-built filter passed to a\n * service that does not support it throws rather than silently producing a\n * query the backend cannot execute.\n */\nexport function resolveQuery(q: QueryFor, cap: QueryCapability): string {\n if (typeof q === \"string\") return q;\n if (q.usesCompound === true && !cap.compoundLogicalQuery) {\n throw new Error(\n \"This filter uses or()/compoundLogicalQuery, which the target service does not support. \" +\n \"Combine conditions with and() (space-separated AND) instead.\",\n );\n }\n return q.toString();\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { iterateAll } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery, type QueryFor } from \"../core/query\";\nimport type { Product } from \"./product\";\nimport type {\n Category as GeneratedCategory,\n CategoryTree,\n CategoryCreateRequest,\n CategoryUpdateRequest,\n CategoryPartialUpdateRequest,\n CategoryIdResponse,\n CategoryTreeSearchRequest,\n CategoryAssignment as GeneratedCategoryAssignment,\n AssignmentRequest,\n BulkAssignmentRequest,\n BulkAssignmentUpsertRequest,\n BulkAssignmentResponse,\n AssignmentIdResponse,\n} from \"../generated/category\";\n\nconst ANON: AuthContext = { kind: \"anonymous\" };\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** A category as returned by the Category service (all generated fields). */\nexport type Category = GeneratedCategory;\n\n/** The category tree as returned by the Category service. */\nexport type CategoryNode = CategoryTree;\n\n/** Body for creating a category (`POST /categories`). */\nexport type CategoryCreateInput = CategoryCreateRequest;\n\n/** Body for a full category replace (`PUT /categories/{id}`). */\nexport type CategoryUpdateInput = CategoryUpdateRequest;\n\n/** Body for a partial category update (`PATCH /categories/{id}`). */\nexport type CategoryPatchInput = CategoryPartialUpdateRequest;\n\n/** Id envelope returned when a category is created. */\nexport type CategoryCreated = CategoryIdResponse;\n\n/** Body for searching category trees (`POST /category-trees/search`). */\nexport type CategoryTreeSearchInput = CategoryTreeSearchRequest;\n\n/** A category assignment (a resource reference bound to a category). */\nexport type CategoryAssignment = GeneratedCategoryAssignment;\n\n/** Body for assigning a single resource to a category. */\nexport type CategoryAssignmentInput = AssignmentRequest;\n\n/** Body for bulk-assigning resources to a category. */\nexport type CategoryAssignmentBulkInput = BulkAssignmentRequest;\n\n/** Body for bulk-upserting assignment references (`ref.id` only). */\nexport type CategoryAssignmentRefBulkInput = BulkAssignmentUpsertRequest;\n\n/** Multi-status result of a bulk assignment operation. */\nexport type CategoryAssignmentBulkResult = BulkAssignmentResponse;\n\n/** Id envelope returned when an assignment is created. */\nexport type CategoryAssignmentCreated = AssignmentIdResponse;\n\n/** Options shared by the category write endpoints (create, update, patch). */\nexport interface CategoryWriteOptions {\n /** Sets the `publish` query flag (needs the `category.category_publish` scope). */\n publish?: boolean;\n /**\n * `Content-Language` for this call, overriding `EmporixConfig.contentLanguage`.\n * Category localized fields are maps whatever it says; the header limits the\n * languages they may contain (`\"de\"`, `\"en,de\"`), and without one the\n * service allows every tenant language.\n */\n contentLanguage?: string;\n}\n\n/** Category reads. Default auth: anonymous. */\nexport class CategoryService {\n static readonly channel = \"category\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Fetches one category by id. */\n async get(categoryId: string, auth: AuthContext = ANON): Promise<Category> {\n return this.ctx.http.request<Category>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}`,\n auth,\n });\n }\n\n /** One page of categories. */\n async list(\n params: { pageNumber?: number; pageSize?: number; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Category>> {\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Category>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories`,\n query: { pageNumber, pageSize },\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(params.totalCount === undefined ? {} : { totalCount: params.totalCount }),\n },\n );\n }\n\n /**\n * Searches categories by a `q` filter — a raw Emporix DSL string or a built\n * filter (e.g. `@viu/emporix-mixins`' `mixinQuery(...)`). Category does not\n * support `compoundLogicalQuery`, so `or()` filters are rejected.\n */\n async search(\n query: QueryFor<\"CATEGORY\">,\n params: { pageNumber?: number; pageSize?: number; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Category>> {\n const q = resolveQuery(query, { compoundLogicalQuery: false });\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Category>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories`,\n query: { q, pageNumber, pageSize },\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(params.totalCount === undefined ? {} : { totalCount: params.totalCount }),\n },\n );\n }\n\n /** Async-iterates every category across pages. */\n listAll(params: { pageSize?: number } = {}, auth: AuthContext = ANON): AsyncIterable<Category> {\n const pageSize = params.pageSize ?? 50;\n return iterateAll<Category>((pageNumber) => this.list({ pageNumber, pageSize }, auth));\n }\n\n /**\n * The catalogue's **root categories** — the published category trees\n * (`GET /category-trees`).\n *\n * Returns `CategoryNode[]` (the generated `CategoryTree`), not `Category[]`.\n * The two differ: `Category` carries `parentId` and no `subcategories`,\n * `CategoryTree` the reverse, and this endpoint answers with the latter.\n * Measured against a live tenant on 2026-08-04 — every node had\n * `subcategories` or nothing, none had `parentId`.\n *\n * **Children arrive inline in `subcategories`.** Do not reach for\n * {@link subcategories} to drill down: that method reads category-to-category\n * *assignments* (`/categories/{id}/assignments`, filtered to\n * `ref.type === \"CATEGORY\"`), which is a different feature — on the tenant this\n * was measured on, that filter answered empty for every category while the\n * `\"PRODUCT\"` filter behind {@link productsIn} worked fine.\n * {@link childCategories} hits `/categories/{id}/subcategories` and answers\n * **404** for a tree root. One call gives you the whole hierarchy.\n */\n async tree(auth: AuthContext = ANON): Promise<CategoryNode[]> {\n return this.ctx.http.request<CategoryNode[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/category-trees`,\n auth,\n });\n }\n\n /**\n * Rebuild a category tree from its root (`POST /category-trees/{rootCategoryId}/rebuild`).\n * Admin write — defaults to the service token. Returns the rebuilt tree.\n */\n async rebuildTree(rootCategoryId: string, auth: AuthContext = SERVICE): Promise<CategoryNode> {\n return this.ctx.http.request<CategoryNode>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/category-trees/${encodeURIComponent(rootCategoryId)}/rebuild`,\n auth,\n });\n }\n\n /**\n * Direct child categories of a category (for hierarchy drill-down). Mirrors\n * {@link productsIn}: reads the category's **assignments** and keeps the\n * `CATEGORY` references, resolving them to full categories. Returns an empty\n * array when the category has no child categories.\n */\n async subcategories(\n categoryId: string,\n params: { pageNumber?: number; pageSize?: number } = {},\n auth: AuthContext = ANON,\n ): Promise<Category[]> {\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n const assignments = await this.ctx.http.request<Array<{ ref?: { id?: string; type?: string } }>>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments`,\n query: { pageNumber, pageSize },\n auth,\n });\n const categoryIds = assignments\n .map((a) => (a.ref?.type?.toUpperCase() === \"CATEGORY\" ? a.ref.id : undefined))\n .filter((id): id is string => Boolean(id));\n if (categoryIds.length === 0) return [];\n return this.searchByIds(categoryIds, {}, auth);\n }\n\n /**\n * One page of products in a category. The category service exposes products\n * as **assignments** (`/categories/{id}/assignments`) — references, not full\n * products — so this fetches a page of assignments, keeps the `PRODUCT`\n * references, and resolves them to full products via `/products/search`.\n * `hasNextPage` reflects the assignments page (the source of truth for\n * pagination).\n *\n * No `totalCount` opt-in here, deliberately. `X-Total-Count` on the\n * assignments request would count **assignments** — including the `CATEGORY`\n * references filtered out below — not the products this returns. A number\n * that is wrong in the way that is hardest to notice. Same reason\n * `segments.listMyProducts` stays on the guess.\n */\n async productsIn(\n categoryId: string,\n params: { pageNumber?: number; pageSize?: number } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Product>> {\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n const assignments = await this.ctx.http.request<Array<{ ref?: { id?: string; type?: string } }>>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments`,\n query: { pageNumber, pageSize },\n auth,\n });\n const hasNextPage = assignments.length === pageSize;\n const productIds = assignments\n .map((a) => (a.ref?.type?.toUpperCase() === \"PRODUCT\" ? a.ref.id : undefined))\n .filter((id): id is string => Boolean(id));\n if (productIds.length === 0) {\n return { items: [], pageNumber, pageSize, hasNextPage };\n }\n const items = await this.ctx.http.request<Product[]>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products/search`,\n query: { pageSize: productIds.length },\n auth,\n body: { q: `id:(${productIds.join(\",\")})` },\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n return { items, pageNumber, pageSize, hasNextPage };\n }\n\n /**\n * Bulk fetch by id. POSTs `/categories/search` with `q=\"id:(id1,id2,…)\"`,\n * chunking when the list is larger than `options.chunkSize` (default\n * 100). An empty list short-circuits with no HTTP call. **Order is not\n * guaranteed** across chunks — re-index by `id` if order matters.\n */\n async searchByIds(\n ids: string[],\n options: { chunkSize?: number } = {},\n auth: AuthContext = ANON,\n ): Promise<Category[]> {\n if (ids.length === 0) return [];\n const chunkSize = options.chunkSize ?? 100;\n const chunks: string[][] = [];\n for (let i = 0; i < ids.length; i += chunkSize) {\n chunks.push(ids.slice(i, i + chunkSize));\n }\n const pages = await Promise.all(\n chunks.map((chunk) =>\n this.ctx.http.request<Category[]>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/categories/search`,\n query: { pageSize: chunk.length },\n auth,\n body: { q: `id:(${chunk.join(\",\")})` },\n }),\n ),\n );\n return pages.flat();\n }\n\n /** Lists a category's ancestor categories (breadcrumb-up). Default auth: anonymous. */\n async parents(categoryId: string, auth: AuthContext = ANON): Promise<Category[]> {\n return this.ctx.http.request<Category[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/parents`,\n auth,\n });\n }\n\n /**\n * Lists a category's direct child categories via the dedicated\n * `…/subcategories` endpoint. (The older `subcategories()` reads `/assignments`\n * and is kept for backward compatibility.) Default auth: anonymous.\n */\n async childCategories(categoryId: string, auth: AuthContext = ANON): Promise<Category[]> {\n return this.ctx.http.request<Category[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/subcategories`,\n auth,\n });\n }\n\n /** Retrieves one category tree by its root category id. Default auth: anonymous. */\n async getTree(categoryId: string, auth: AuthContext = ANON): Promise<CategoryNode> {\n return this.ctx.http.request<CategoryNode>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/category-trees/${encodeURIComponent(categoryId)}`,\n auth,\n });\n }\n\n // --- Admin write CRUD. Default auth: service. ---\n\n /**\n * Creates a category (`POST /categories`). Default auth: service.\n * `options.publish` sets the `publish` query flag (needs the\n * `category.category_publish` scope).\n */\n async create(\n input: CategoryCreateInput,\n options: CategoryWriteOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<CategoryCreated> {\n return this.ctx.http.request<CategoryCreated>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/categories`,\n ...(options.publish === undefined ? {} : { query: { publish: String(options.publish) } }),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Full-replaces a category (`PUT /categories/{categoryId}`). This is an\n * upsert: with a caller-supplied id it may create (201, returns the id) or\n * update an existing one (204, returns nothing). Default auth: service.\n */\n async update(\n categoryId: string,\n input: CategoryUpdateInput,\n options: CategoryWriteOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<CategoryCreated | void> {\n return this.ctx.http.request<CategoryCreated | void>({\n method: \"PUT\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}`,\n ...(options.publish === undefined ? {} : { query: { publish: String(options.publish) } }),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Partially updates a category (`PATCH /categories/{categoryId}`). Default\n * auth: service. `options.publish` sets the `publish` query flag.\n */\n async patch(\n categoryId: string,\n input: CategoryPatchInput,\n options: CategoryWriteOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}`,\n ...(options.publish === undefined ? {} : { query: { publish: String(options.publish) } }),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /** Deletes a category (`DELETE /categories/{categoryId}`). Default auth: service. */\n async delete(categoryId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}`,\n auth,\n });\n }\n\n /**\n * Searches categories via `POST /categories/search`. Same query capability\n * as {@link search} (`compoundLogicalQuery: false` — Category rejects `or()`\n * filters); the POST body avoids URL-length limits for large `q` filters.\n * `params.showRoots` / `params.showUnpublished` are POST-only flags. Default\n * auth: anonymous.\n */\n async searchByQuery(\n query: QueryFor<\"CATEGORY\">,\n params: { pageNumber?: number; pageSize?: number; sort?: string; showRoots?: boolean; showUnpublished?: boolean; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Category>> {\n const q = resolveQuery(query, { compoundLogicalQuery: false });\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Category>(\n this.ctx.http,\n {\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/categories/search`,\n query: {\n pageNumber,\n pageSize,\n ...(params.sort === undefined ? {} : { sort: params.sort }),\n ...(params.showRoots === undefined ? {} : { showRoots: String(params.showRoots) }),\n ...(params.showUnpublished === undefined ? {} : { showUnpublished: String(params.showUnpublished) }),\n },\n body: { q },\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(params.totalCount === undefined ? {} : { totalCount: params.totalCount }),\n },\n );\n }\n\n /**\n * Searches category trees via `POST /category-trees/search` — returns the\n * trees that include at least one of the given `categoryIds`. Default auth:\n * anonymous.\n */\n async searchTrees(\n input: CategoryTreeSearchInput,\n options: { showUnpublished?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<CategoryNode[]> {\n return this.ctx.http.request<CategoryNode[]>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/category-trees/search`,\n ...(options.showUnpublished === undefined ? {} : { query: { showUnpublished: String(options.showUnpublished) } }),\n body: input,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n auth,\n });\n }\n\n /**\n * Category ↔ resource assignments. Writes default to service auth. The\n * assignment `ref.type` is `'PRODUCT'` (per the API); category hierarchy is\n * managed via `parentId` on the category, not via assignments.\n */\n readonly assignments = {\n /** One page of a category's assignments. Default auth: anonymous. */\n list: async (\n categoryId: string,\n params: { pageNumber?: number; pageSize?: number; sort?: string; expandSupercategoriesIds?: boolean; showUnpublished?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<CategoryAssignment[]> =>\n this.ctx.http.request<CategoryAssignment[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments`,\n query: {\n ...(params.pageNumber === undefined ? {} : { pageNumber: params.pageNumber }),\n ...(params.pageSize === undefined ? {} : { pageSize: params.pageSize }),\n ...(params.sort === undefined ? {} : { sort: params.sort }),\n ...(params.expandSupercategoriesIds === undefined ? {} : { expandSupercategoriesIds: String(params.expandSupercategoriesIds) }),\n ...(params.showUnpublished === undefined ? {} : { showUnpublished: String(params.showUnpublished) }),\n },\n auth,\n }),\n\n /** Assigns a single resource to a category (`POST …/assignments`). Default auth: service. */\n create: async (categoryId: string, input: CategoryAssignmentInput, auth: AuthContext = SERVICE): Promise<CategoryAssignmentCreated> =>\n this.ctx.http.request<CategoryAssignmentCreated>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments`,\n body: input,\n auth,\n }),\n\n /** Bulk-assigns resources to a category (`POST …/assignments/bulk`). Default auth: service. */\n bulkCreate: async (categoryId: string, input: CategoryAssignmentBulkInput, auth: AuthContext = SERVICE): Promise<CategoryAssignmentBulkResult> =>\n this.ctx.http.request<CategoryAssignmentBulkResult>({\n method: \"POST\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments/bulk`,\n body: input,\n auth,\n }),\n\n /** Removes one assignment by id (`DELETE …/assignments/{assignmentId}`). Default auth: service. */\n remove: async (categoryId: string, assignmentId: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments/${assignmentId}`,\n auth,\n });\n },\n\n /** Removes all of a category's assignments (`DELETE …/assignments`). Default auth: service. */\n removeAll: async (categoryId: string, options: { assignmentType?: \"PRODUCT\" } = {}, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments`,\n ...(options.assignmentType === undefined ? {} : { query: { assignmentType: options.assignmentType } }),\n auth,\n });\n },\n\n /** Upserts an assignment by reference id — no body (`PUT …/assignments/references/{referenceId}`). Default auth: service. */\n upsertByReference: async (categoryId: string, referenceId: string, auth: AuthContext = SERVICE): Promise<CategoryAssignmentCreated> =>\n this.ctx.http.request<CategoryAssignmentCreated>({\n method: \"PUT\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments/references/${referenceId}`,\n auth,\n }),\n\n /** Removes an assignment by reference id (`DELETE …/assignments/references/{referenceId}`). Default auth: service. */\n removeByReference: async (categoryId: string, referenceId: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments/references/${referenceId}`,\n auth,\n });\n },\n\n /** Bulk-upserts assignment references (`PUT …/assignments/references/bulk`). Default auth: service. */\n bulkUpsertByReference: async (categoryId: string, input: CategoryAssignmentRefBulkInput, auth: AuthContext = SERVICE): Promise<CategoryAssignmentBulkResult> =>\n this.ctx.http.request<CategoryAssignmentBulkResult>({\n method: \"PUT\",\n path: `/category/${this.ctx.tenant}/categories/${categoryId}/assignments/references/bulk`,\n body: input,\n auth,\n }),\n\n /**\n * Lists every category assigned to the given reference id — tenant-wide\n * (`GET /assignments/references/{referenceId}`). Default auth: anonymous.\n */\n listCategoriesByReference: async (\n referenceId: string,\n params: { pageNumber?: number; pageSize?: number; sort?: string; showUnpublished?: boolean; expandSupercategoriesIds?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<Category[]> =>\n this.ctx.http.request<Category[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/assignments/references/${referenceId}`,\n query: {\n ...(params.pageNumber === undefined ? {} : { pageNumber: params.pageNumber }),\n ...(params.pageSize === undefined ? {} : { pageSize: params.pageSize }),\n ...(params.sort === undefined ? {} : { sort: params.sort }),\n ...(params.showUnpublished === undefined ? {} : { showUnpublished: String(params.showUnpublished) }),\n ...(params.expandSupercategoriesIds === undefined ? {} : { expandSupercategoriesIds: String(params.expandSupercategoriesIds) }),\n },\n auth,\n }),\n\n /** Removes all assignments to a given reference id — tenant-wide (`DELETE /assignments/references/{referenceId}`). Default auth: service. */\n removeAllByReference: async (referenceId: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/category/${this.ctx.tenant}/assignments/references/${referenceId}`,\n auth,\n });\n },\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-5lt8Q0MT.cjs';
1
+ import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-BJeomwxV.cjs';
2
2
  import { a as QueryFor } from './query-mLQs2WFr.cjs';
3
3
  import { Product } from './product.cjs';
4
4
 
@@ -593,6 +593,18 @@ type CategoryAssignmentRefBulkInput = BulkAssignmentUpsertRequest;
593
593
  type CategoryAssignmentBulkResult = BulkAssignmentResponse;
594
594
  /** Id envelope returned when an assignment is created. */
595
595
  type CategoryAssignmentCreated = AssignmentIdResponse;
596
+ /** Options shared by the category write endpoints (create, update, patch). */
597
+ interface CategoryWriteOptions {
598
+ /** Sets the `publish` query flag (needs the `category.category_publish` scope). */
599
+ publish?: boolean;
600
+ /**
601
+ * `Content-Language` for this call, overriding `EmporixConfig.contentLanguage`.
602
+ * Category localized fields are maps whatever it says; the header limits the
603
+ * languages they may contain (`"de"`, `"en,de"`), and without one the
604
+ * service allows every tenant language.
605
+ */
606
+ contentLanguage?: string;
607
+ }
596
608
  /** Category reads. Default auth: anonymous. */
597
609
  declare class CategoryService {
598
610
  private readonly ctx;
@@ -697,24 +709,18 @@ declare class CategoryService {
697
709
  * `options.publish` sets the `publish` query flag (needs the
698
710
  * `category.category_publish` scope).
699
711
  */
700
- create(input: CategoryCreateInput, options?: {
701
- publish?: boolean;
702
- }, auth?: AuthContext): Promise<CategoryCreated>;
712
+ create(input: CategoryCreateInput, options?: CategoryWriteOptions, auth?: AuthContext): Promise<CategoryCreated>;
703
713
  /**
704
714
  * Full-replaces a category (`PUT /categories/{categoryId}`). This is an
705
715
  * upsert: with a caller-supplied id it may create (201, returns the id) or
706
716
  * update an existing one (204, returns nothing). Default auth: service.
707
717
  */
708
- update(categoryId: string, input: CategoryUpdateInput, options?: {
709
- publish?: boolean;
710
- }, auth?: AuthContext): Promise<CategoryCreated | void>;
718
+ update(categoryId: string, input: CategoryUpdateInput, options?: CategoryWriteOptions, auth?: AuthContext): Promise<CategoryCreated | void>;
711
719
  /**
712
720
  * Partially updates a category (`PATCH /categories/{categoryId}`). Default
713
721
  * auth: service. `options.publish` sets the `publish` query flag.
714
722
  */
715
- patch(categoryId: string, input: CategoryPatchInput, options?: {
716
- publish?: boolean;
717
- }, auth?: AuthContext): Promise<void>;
723
+ patch(categoryId: string, input: CategoryPatchInput, options?: CategoryWriteOptions, auth?: AuthContext): Promise<void>;
718
724
  /** Deletes a category (`DELETE /categories/{categoryId}`). Default auth: service. */
719
725
  delete(categoryId: string, auth?: AuthContext): Promise<void>;
720
726
  /**
@@ -786,4 +792,4 @@ declare class CategoryService {
786
792
  };
787
793
  }
788
794
 
789
- export { type Category, type CategoryAssignment, type CategoryAssignmentBulkInput, type CategoryAssignmentBulkResult, type CategoryAssignmentCreated, type CategoryAssignmentInput, type CategoryAssignmentRefBulkInput, type CategoryCreateInput, type CategoryCreated, type CategoryNode, type CategoryPatchInput, CategoryService, type CategoryTreeSearchInput, type CategoryUpdateInput };
795
+ export { type Category, type CategoryAssignment, type CategoryAssignmentBulkInput, type CategoryAssignmentBulkResult, type CategoryAssignmentCreated, type CategoryAssignmentInput, type CategoryAssignmentRefBulkInput, type CategoryCreateInput, type CategoryCreated, type CategoryNode, type CategoryPatchInput, CategoryService, type CategoryTreeSearchInput, type CategoryUpdateInput, type CategoryWriteOptions };
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-5lt8Q0MT.js';
1
+ import { C as ClientContext, b as AuthContext, P as PaginatedItems } from './context-BJeomwxV.js';
2
2
  import { a as QueryFor } from './query-mLQs2WFr.js';
3
3
  import { Product } from './product.js';
4
4
 
@@ -593,6 +593,18 @@ type CategoryAssignmentRefBulkInput = BulkAssignmentUpsertRequest;
593
593
  type CategoryAssignmentBulkResult = BulkAssignmentResponse;
594
594
  /** Id envelope returned when an assignment is created. */
595
595
  type CategoryAssignmentCreated = AssignmentIdResponse;
596
+ /** Options shared by the category write endpoints (create, update, patch). */
597
+ interface CategoryWriteOptions {
598
+ /** Sets the `publish` query flag (needs the `category.category_publish` scope). */
599
+ publish?: boolean;
600
+ /**
601
+ * `Content-Language` for this call, overriding `EmporixConfig.contentLanguage`.
602
+ * Category localized fields are maps whatever it says; the header limits the
603
+ * languages they may contain (`"de"`, `"en,de"`), and without one the
604
+ * service allows every tenant language.
605
+ */
606
+ contentLanguage?: string;
607
+ }
596
608
  /** Category reads. Default auth: anonymous. */
597
609
  declare class CategoryService {
598
610
  private readonly ctx;
@@ -697,24 +709,18 @@ declare class CategoryService {
697
709
  * `options.publish` sets the `publish` query flag (needs the
698
710
  * `category.category_publish` scope).
699
711
  */
700
- create(input: CategoryCreateInput, options?: {
701
- publish?: boolean;
702
- }, auth?: AuthContext): Promise<CategoryCreated>;
712
+ create(input: CategoryCreateInput, options?: CategoryWriteOptions, auth?: AuthContext): Promise<CategoryCreated>;
703
713
  /**
704
714
  * Full-replaces a category (`PUT /categories/{categoryId}`). This is an
705
715
  * upsert: with a caller-supplied id it may create (201, returns the id) or
706
716
  * update an existing one (204, returns nothing). Default auth: service.
707
717
  */
708
- update(categoryId: string, input: CategoryUpdateInput, options?: {
709
- publish?: boolean;
710
- }, auth?: AuthContext): Promise<CategoryCreated | void>;
718
+ update(categoryId: string, input: CategoryUpdateInput, options?: CategoryWriteOptions, auth?: AuthContext): Promise<CategoryCreated | void>;
711
719
  /**
712
720
  * Partially updates a category (`PATCH /categories/{categoryId}`). Default
713
721
  * auth: service. `options.publish` sets the `publish` query flag.
714
722
  */
715
- patch(categoryId: string, input: CategoryPatchInput, options?: {
716
- publish?: boolean;
717
- }, auth?: AuthContext): Promise<void>;
723
+ patch(categoryId: string, input: CategoryPatchInput, options?: CategoryWriteOptions, auth?: AuthContext): Promise<void>;
718
724
  /** Deletes a category (`DELETE /categories/{categoryId}`). Default auth: service. */
719
725
  delete(categoryId: string, auth?: AuthContext): Promise<void>;
720
726
  /**
@@ -786,4 +792,4 @@ declare class CategoryService {
786
792
  };
787
793
  }
788
794
 
789
- export { type Category, type CategoryAssignment, type CategoryAssignmentBulkInput, type CategoryAssignmentBulkResult, type CategoryAssignmentCreated, type CategoryAssignmentInput, type CategoryAssignmentRefBulkInput, type CategoryCreateInput, type CategoryCreated, type CategoryNode, type CategoryPatchInput, CategoryService, type CategoryTreeSearchInput, type CategoryUpdateInput };
795
+ export { type Category, type CategoryAssignment, type CategoryAssignmentBulkInput, type CategoryAssignmentBulkResult, type CategoryAssignmentCreated, type CategoryAssignmentInput, type CategoryAssignmentRefBulkInput, type CategoryCreateInput, type CategoryCreated, type CategoryNode, type CategoryPatchInput, CategoryService, type CategoryTreeSearchInput, type CategoryUpdateInput, type CategoryWriteOptions };
package/dist/category.js CHANGED
@@ -1,4 +1,4 @@
1
- export { CategoryService } from './chunk-MSQ3GEIW.js';
1
+ export { CategoryService } from './chunk-KJEBG7MP.js';
2
2
  import './chunk-W6SLZNRX.js';
3
3
  import './chunk-S5HEIQDK.js';
4
4
  import './chunk-LKHKFF7B.js';
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext } from './context-5lt8Q0MT.cjs';
1
+ import { C as ClientContext, b as AuthContext } from './context-BJeomwxV.cjs';
2
2
 
3
3
  /**
4
4
  * Information about the customer's address.
@@ -1,4 +1,4 @@
1
- import { C as ClientContext, b as AuthContext } from './context-5lt8Q0MT.js';
1
+ import { C as ClientContext, b as AuthContext } from './context-BJeomwxV.js';
2
2
 
3
3
  /**
4
4
  * Information about the customer's address.
@@ -217,6 +217,7 @@ var ProductService = class {
217
217
  method: "POST",
218
218
  path: `/product/${this.ctx.tenant}/products`,
219
219
  ...Object.keys(query).length > 0 ? { query } : {},
220
+ ...options.contentLanguage === void 0 ? {} : { headers: { "Content-Language": options.contentLanguage } },
220
221
  body: input,
221
222
  auth
222
223
  });
@@ -249,6 +250,7 @@ var ProductService = class {
249
250
  method: "PATCH",
250
251
  path: `/product/${this.ctx.tenant}/products/${productId}`,
251
252
  ...Object.keys(query).length > 0 ? { query } : {},
253
+ ...options.contentLanguage === void 0 ? {} : { headers: { "Content-Language": options.contentLanguage } },
252
254
  body: input,
253
255
  auth
254
256
  });
@@ -275,6 +277,7 @@ var ProductService = class {
275
277
  method: "PUT",
276
278
  path: `/product/${this.ctx.tenant}/products/${productId}`,
277
279
  ...Object.keys(query).length > 0 ? { query } : {},
280
+ ...options.contentLanguage === void 0 ? {} : { headers: { "Content-Language": options.contentLanguage } },
278
281
  body: input,
279
282
  auth
280
283
  });
@@ -309,6 +312,7 @@ var ProductService = class {
309
312
  method: "POST",
310
313
  path: `/product/${this.ctx.tenant}/products/bulk`,
311
314
  ...Object.keys(query).length > 0 ? { query } : {},
315
+ ...options.contentLanguage === void 0 ? {} : { headers: { "Content-Language": options.contentLanguage } },
312
316
  body: input,
313
317
  auth
314
318
  });
@@ -327,6 +331,7 @@ var ProductService = class {
327
331
  method: "PUT",
328
332
  path: `/product/${this.ctx.tenant}/products/bulk`,
329
333
  ...Object.keys(query).length > 0 ? { query } : {},
334
+ ...options.contentLanguage === void 0 ? {} : { headers: { "Content-Language": options.contentLanguage } },
330
335
  body: input,
331
336
  auth
332
337
  });
@@ -413,5 +418,5 @@ var ProductService = class {
413
418
  };
414
419
 
415
420
  export { ProductService };
416
- //# sourceMappingURL=chunk-2SHTDVOC.js.map
417
- //# sourceMappingURL=chunk-2SHTDVOC.js.map
421
+ //# sourceMappingURL=chunk-J2AN2FMK.js.map
422
+ //# sourceMappingURL=chunk-J2AN2FMK.js.map