@viu/emporix-sdk 4.10.0 → 4.11.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.
- package/CHANGELOG.md +19 -0
- package/README.md +2 -1
- package/dist/availability.d.cts +1 -1
- package/dist/availability.d.ts +1 -1
- package/dist/cart.d.cts +1 -1
- package/dist/cart.d.ts +1 -1
- package/dist/category.d.cts +1 -1
- package/dist/category.d.ts +1 -1
- package/dist/checkout.d.cts +1 -1
- package/dist/checkout.d.ts +1 -1
- package/dist/companies.d.cts +1 -1
- package/dist/companies.d.ts +1 -1
- package/dist/contacts.d.cts +1 -1
- package/dist/contacts.d.ts +1 -1
- package/dist/{context-BJeomwxV.d.cts → context-BqSLYN2q.d.cts} +68 -1
- package/dist/{context-BJeomwxV.d.ts → context-BqSLYN2q.d.ts} +68 -1
- package/dist/{customer-groups-ZlnnZrX_.d.cts → customer-groups-B3jlWR4O.d.cts} +1 -1
- package/dist/{customer-groups-ByyBHCBH.d.ts → customer-groups-oJ9YcjDe.d.ts} +1 -1
- package/dist/customer-groups.d.cts +2 -2
- package/dist/customer-groups.d.ts +2 -2
- package/dist/customer.d.cts +1 -1
- package/dist/customer.d.ts +1 -1
- package/dist/index.cjs +458 -291
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +56 -4
- package/dist/index.d.ts +56 -4
- package/dist/index.js +457 -293
- package/dist/index.js.map +1 -1
- package/dist/locations.d.cts +1 -1
- package/dist/locations.d.ts +1 -1
- package/dist/media.d.cts +1 -1
- package/dist/media.d.ts +1 -1
- package/dist/orders.d.cts +1 -1
- package/dist/orders.d.ts +1 -1
- package/dist/payment.d.cts +1 -1
- package/dist/payment.d.ts +1 -1
- package/dist/price.d.cts +1 -1
- package/dist/price.d.ts +1 -1
- package/dist/product.d.cts +1 -1
- package/dist/product.d.ts +1 -1
- package/dist/segment.d.cts +1 -1
- package/dist/segment.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/errors.ts","../src/core/config.ts","../src/core/logger.ts","../src/core/auth.ts","../src/core/session-keys.ts","../src/core/session-storage.ts","../src/core/browser-storage.ts","../src/core/query-keys.ts","../src/core/customer-session-store.ts","../src/core/sse.ts","../src/core/http.ts","../package.json","../src/version.ts","../src/core/create-core.ts","../src/core/require-customer.ts","../src/services/customer.ts","../src/core/context.ts","../src/core/paged.ts","../src/core/query.ts","../src/services/product.ts","../src/services/category.ts","../src/services/cart.ts","../src/services/checkout.ts","../src/services/payment.ts","../src/core/search.ts","../src/services/price.ts","../src/services/media.ts","../src/services/segment.ts","../src/services/site.ts","../src/services/session-context.ts","../src/services/companies.ts","../src/services/contacts.ts","../src/services/locations.ts","../src/services/iam.ts","../src/services/customer-groups.ts","../src/services/orders.ts","../src/services/availability.ts","../src/services/tenant-config.ts","../src/services/client-config.ts","../src/services/shopping-list.ts","../src/services/ai-rag-indexer.ts","../src/services/sequential-id.ts","../src/services/fee.ts","../src/services/cloud-functions.ts","../src/services/webhook.ts","../src/services/schema.ts","../src/services/ai-resources.ts","../src/services/ai.ts","../src/services/tax.ts","../src/services/coupon.ts","../src/services/reward-points.ts","../src/services/brand.ts","../src/services/label.ts","../src/services/country.ts","../src/services/currency.ts","../src/services/shipping.ts","../src/services/invoice.ts","../src/services/quote.ts","../src/services/returns.ts","../src/services/indexing.ts","../src/services/search.ts","../src/services/imports.ts","../src/services/audit-log.ts","../src/services/unit-handling.ts","../src/services/catalog.ts","../src/services/vendor.ts","../src/services/customer-admin.ts","../src/services/approval.ts","../src/client.ts","../src/create-emporix-client.ts","../src/core/yrn.ts"],"names":["auth","ANON","SERVICE","text","version","setIfDefined","toPage"],"mappings":"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","file":"index.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/** 409 — conflict: a stale `metadata.version`, or an id that already exists. */\nexport class EmporixConflictError 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 === 409) return new EmporixConflictError(message, status, body);\n if (status >= 500) return new EmporixServerError(message, status, body);\n return new EmporixError(message, status, body);\n}\n","import type { Logger, LoggerConfig } from \"./logger\";\nimport type { TokenProvider } from \"./auth\";\n\n/** Default Emporix API host. */\nexport const DEFAULT_HOST = \"https://api.emporix.io\";\n\n/**\n * Tenant guard. Emporix docs only state \"always lowercase\"; the 3–16 char\n * `^[a-z][a-z0-9]+$` rule is an SDK-side guard, not a documented constraint.\n */\nconst TENANT_RE = /^[a-z][a-z0-9]{2,15}$/;\n\n/** A client-credentials credential set (service / custom). */\nexport interface ServiceCredentials {\n clientId: string;\n secret: string;\n scope?: string;\n}\n\n/** Storefront credential — anonymous token needs the client id only, no secret. */\nexport interface StorefrontCredentials {\n clientId: string;\n /**\n * Session context bound at anonymous-login time. Required for\n * `prices.matchByContext` to resolve currency/site/country server-side.\n * `targetLocation` is an ISO country code.\n */\n context?: { currency?: string; siteCode?: string; targetLocation?: string; language?: string };\n}\n\n/** User-supplied SDK configuration. */\nexport interface EmporixConfig {\n tenant: string;\n host?: string;\n credentials: {\n /**\n * Service (client-credentials) credentials. Optional: storefront/SPA apps\n * use only `storefront` (anonymous) + caller-supplied customer tokens and\n * must never ship a backend secret. Required only when a `service`\n * AuthContext is actually used — enforced lazily by the TokenProvider.\n */\n backend?: ServiceCredentials;\n storefront?: StorefrontCredentials;\n custom?: Record<string, ServiceCredentials>;\n };\n tokenProvider?: TokenProvider;\n timeouts?: { connectMs?: number; readMs?: number };\n retry?: { maxAttempts?: number };\n cache?: { expirationBufferSeconds?: number; maxLifetimeSeconds?: number };\n logger?: LoggerConfig;\n /**\n * Replaces the global `fetch` for API requests. Receives the same arguments.\n *\n * Deliberately NOT used for token requests (`core/auth.ts`) or SSE\n * (`HttpClient.stream`): a cached token response would be a security defect,\n * and caching an event stream is meaningless. Those keep the global `fetch`,\n * which makes them structurally uncacheable rather than uncached by\n * convention.\n */\n fetch?: typeof globalThis.fetch;\n /**\n * Sent as `Content-Language` on every request that carries a body: the\n * language of the localized fields in it. Unset (the default) sends no header.\n *\n * - `\"*\"` — localized fields are maps of translations, `{ de: \"…\", en: \"…\" }`;\n * - a language code such as `\"de\"` — they are plain strings in that language.\n *\n * Without the header, most services read localized fields as plain strings in\n * the tenant's default language and answer a map with a 400 («localized values\n * must be of String type when the Content-Language header is not set to all\n * languages»). Categories and catalogs are the exception: they always take maps.\n *\n * It applies to every write the client makes, so set it on the client that does\n * back-office writes, not on a storefront client. Product and category writes\n * can override it per call with `contentLanguage` in their write options.\n */\n contentLanguage?: string;\n}\n\n/** Fully-resolved configuration with defaults applied. */\nexport interface ResolvedConfig {\n tenant: string;\n host: string;\n credentials: EmporixConfig[\"credentials\"];\n tokenProvider: TokenProvider | undefined;\n timeouts: { connectMs: number; readMs: number };\n retry: { maxAttempts: number };\n cache: { expirationBufferSeconds: number; maxLifetimeSeconds: number };\n logger: LoggerConfig | undefined;\n fetch: typeof globalThis.fetch | undefined;\n contentLanguage: string | undefined;\n}\n\n/**\n * `context` belongs inside `credentials.storefront`, and at the top level it is\n * silently lost.\n *\n * `EmporixConfig` has no top-level `context`, so such an object is dropped without a\n * word — and then `matchByContext` answers `[]` with no error, because the anonymous\n * token was minted without site, currency and country. Measured on tenant `viu`\n * (2026-08-18): 0 matches when misplaced, 1 when placed correctly. The expensive part\n * is the silence: it reads exactly like «no prices configured».\n *\n * A warning rather than a throw — configs that misplace it work today (badly), and a\n * throw would stop them on upgrade. `logger: false` is honoured as an explicit\n * request for silence; the object form of `LoggerConfig` carries no `warn` method, so\n * anything that is not a `Logger` instance falls back to the console.\n */\nfunction warnOnMisplacedContext(input: EmporixConfig): void {\n if (!(\"context\" in input)) return;\n const logger = input.logger;\n if (logger === false) return;\n const message =\n \"EmporixConfig has no top-level `context` — it is being ignored. Move it into \" +\n \"`credentials.storefront.context`, otherwise the anonymous token carries no \" +\n \"site/currency/country and price matching returns an empty list without erroring.\";\n if (logger && typeof (logger as Logger).warn === \"function\") {\n (logger as Logger).warn(message);\n return;\n }\n // Same escape hatch as the read-only-storage warning in `session-storage.ts`: this\n // has to reach a developer who configured no logger at all, which is exactly the\n // situation the mistake happens in.\n // eslint-disable-next-line no-console\n console.warn(`[emporix] ${message}`);\n}\n\n/** Validates user config and applies defaults. Throws on invalid tenant/credentials. */\nexport function validateConfig(input: EmporixConfig): ResolvedConfig {\n if (!TENANT_RE.test(input.tenant)) {\n throw new Error(\n `Invalid tenant \"${input.tenant}\": must be lowercase, 3–16 chars, match ^[a-z][a-z0-9]+$`,\n );\n }\n if (!input.credentials) {\n throw new Error(\"credentials is required (provide at least one of backend/storefront/custom)\");\n }\n warnOnMisplacedContext(input);\n return {\n tenant: input.tenant,\n host: input.host ?? DEFAULT_HOST,\n credentials: input.credentials,\n tokenProvider: input.tokenProvider,\n timeouts: {\n connectMs: input.timeouts?.connectMs ?? 10_000,\n readMs: input.timeouts?.readMs ?? 60_000,\n },\n retry: { maxAttempts: input.retry?.maxAttempts ?? 3 },\n cache: {\n expirationBufferSeconds: input.cache?.expirationBufferSeconds ?? 60,\n maxLifetimeSeconds: input.cache?.maxLifetimeSeconds ?? 3600,\n },\n logger: input.logger,\n fetch: input.fetch,\n contentLanguage: input.contentLanguage,\n };\n}\n","/** Log severity, low → high. */\nexport type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\n/** Numeric ordering used for fast comparison. */\nexport const LEVEL: Record<LogLevel, number> = {\n trace: 10, debug: 20, info: 30, warn: 40, error: 50, silent: 60,\n};\n\n/** Services that bind their own logger and are independently level-controllable. */\nexport type ServiceName =\n | \"customer\"\n | \"product\"\n | \"category\"\n | \"cart\"\n | \"checkout\"\n | \"payment\"\n | \"price\"\n | \"media\"\n | \"segment\"\n | \"site\"\n | \"session-context\"\n | \"customer-management\"\n | \"iam\"\n | \"orders\"\n | \"sales-orders\"\n | \"availability\"\n | \"configuration\"\n | \"shopping-list\"\n | \"ai-rag-indexer\"\n | \"sequential-id\"\n | \"fee\"\n | \"webhook\"\n | \"schema\"\n | \"ai\"\n | \"tax\"\n | \"coupon\"\n | \"reward-points\"\n | \"brand\"\n | \"label\"\n | \"country\"\n | \"currency\"\n | \"shipping\"\n | \"returns\"\n | \"indexing\"\n | \"search\"\n | \"import\"\n | \"audit-log\"\n | \"unit-handling\"\n | \"catalog\"\n | \"vendor\"\n | \"customer-admin\"\n | \"approval\"\n | \"invoice\"\n | \"quote\"\n | \"cloud-functions\"\n | \"http\"\n | \"auth\";\n\n/** Arbitrary structured fields attached to a log line. */\nexport interface LogFields { [key: string]: unknown; }\n\n/** The logger contract consumers may implement or swap. */\nexport interface Logger {\n level: LogLevel;\n isLevelEnabled(level: LogLevel): boolean;\n trace(msg: string, fields?: LogFields): void;\n debug(msg: string, fields?: LogFields): void;\n info(msg: string, fields?: LogFields): void;\n warn(msg: string, fields?: LogFields): void;\n error(msg: string, fields?: LogFields): void;\n child(bindings: LogFields): Logger;\n}\n\n/** Object form of logger configuration. */\nexport interface LoggerObjectConfig {\n level?: LogLevel;\n services?: Partial<Record<ServiceName, LogLevel>>;\n pretty?: boolean;\n redact?: string[];\n}\n\n/** `false` → noop logger; `Logger` → user-supplied; object → built-in console logger. */\nexport type LoggerConfig = false | Logger | LoggerObjectConfig;\n\nfunction isValidLevel(v: string | undefined): v is LogLevel {\n return v !== undefined && v in LEVEL;\n}\n\n/** Browser-safe env read — `process` is undefined in browsers/edge runtimes. */\nfunction readEnv(name: string): string | undefined {\n try {\n return typeof process !== \"undefined\" && process.env ? process.env[name] : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves the effective level per service following:\n * env per-service > env global > config.services[svc] > config.level > \"warn\".\n * Runtime `set()` mutates programmatic levels but never overrides env-set ones\n * unless `force` is passed.\n */\nexport class LevelResolver {\n private cfgLevel: LogLevel;\n private cfgServices: Partial<Record<ServiceName, LogLevel>>;\n private forcedServices: Partial<Record<ServiceName, LogLevel>> = {};\n private forcedGlobal: LogLevel | undefined;\n private warned = false;\n\n constructor(\n cfg: LoggerObjectConfig,\n private readonly warn: (msg: string) => void = () => {},\n ) {\n this.cfgLevel = cfg.level ?? \"warn\";\n this.cfgServices = { ...cfg.services };\n }\n\n private envFor(svc: ServiceName): LogLevel | undefined {\n const raw = readEnv(`EMPORIX_LOG_LEVEL_${svc.toUpperCase()}`);\n if (raw === undefined) return undefined;\n if (isValidLevel(raw)) return raw;\n if (!this.warned) {\n this.warned = true;\n this.warn(`Invalid EMPORIX_LOG_LEVEL_${svc.toUpperCase()}=\"${raw}\" ignored`);\n }\n return undefined;\n }\n\n private envGlobal(): LogLevel | undefined {\n const raw = readEnv(\"EMPORIX_LOG_LEVEL\");\n if (raw === undefined) return undefined;\n if (isValidLevel(raw)) return raw;\n if (!this.warned) {\n this.warned = true;\n this.warn(`Invalid EMPORIX_LOG_LEVEL=\"${raw}\" ignored`);\n }\n return undefined;\n }\n\n /**\n * Effective level for a service. Forced overrides (from `set(..., force)`)\n * take precedence over env vars; otherwise env > programmatic config.\n */\n get(svc: ServiceName): LogLevel {\n return (\n this.forcedServices[svc] ??\n this.envFor(svc) ??\n this.forcedGlobal ??\n this.envGlobal() ??\n this.cfgServices[svc] ??\n this.cfgLevel ??\n \"warn\"\n );\n }\n\n /** Numeric effective level for a service. */\n numericLevel(svc: ServiceName): number {\n return LEVEL[this.get(svc)];\n }\n\n /** True if `svc`'s effective level allows emitting at `at`. */\n isAtLeast(svc: ServiceName, at: LogLevel): boolean {\n return this.numericLevel(svc) <= LEVEL[at];\n }\n\n /** Mutates programmatic level (global or one service). Env-set levels are sticky unless `force`. */\n set(level: LogLevel, svc?: ServiceName, force = false): void {\n if (svc) {\n const envBound = readEnv(`EMPORIX_LOG_LEVEL_${svc.toUpperCase()}`) !== undefined;\n if (envBound && !force) {\n this.warn(`Level for \"${svc}\" is env-controlled; pass force to override`);\n return;\n }\n if (force) this.forcedServices[svc] = level;\n else this.cfgServices[svc] = level;\n } else {\n const envBound = readEnv(\"EMPORIX_LOG_LEVEL\") !== undefined;\n if (envBound && !force) {\n this.warn(\"Global level is env-controlled; pass force to override\");\n return;\n }\n if (force) this.forcedGlobal = level;\n else this.cfgLevel = level;\n }\n }\n}\n\n/** Default redaction floor — never reducible. */\nconst DEFAULT_REDACT = new Set([\n \"authorization\", \"password\", \"oldpassword\", \"newpassword\", \"clientsecret\",\n \"secret\", \"access_token\", \"refresh_token\", \"customertoken\", \"saastoken\",\n \"saas-token\", \"bearertoken\", \"apikey\", \"token\",\n]);\n\n/** Deep-clones `value`, replacing redacted keys with a mask. AuthContext token is stripped. */\nexport function redact(value: unknown, extra: string[] = []): unknown {\n const keys = new Set(DEFAULT_REDACT);\n for (const k of extra) keys.add(k.toLowerCase());\n const walk = (v: unknown): unknown => {\n if (Array.isArray(v)) return v.map(walk);\n if (v && typeof v === \"object\") {\n const src = v as Record<string, unknown>;\n // AuthContext: keep only `kind`.\n if (typeof src.kind === \"string\" && \"token\" in src) return { kind: src.kind };\n const out: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(src)) {\n if (keys.has(k.toLowerCase())) {\n out[k] =\n k.toLowerCase() === \"authorization\" && typeof val === \"string\"\n ? \"Bearer ***redacted***\"\n : \"***redacted***\";\n } else {\n out[k] = walk(val);\n }\n }\n return out;\n }\n return v;\n };\n return walk(value);\n}\n\ninterface Sink {\n log: (...a: unknown[]) => void;\n info: (...a: unknown[]) => void;\n warn: (...a: unknown[]) => void;\n error: (...a: unknown[]) => void;\n}\n\nconst EMIT: Record<Exclude<LogLevel, \"silent\">, number> = {\n trace: LEVEL.trace, debug: LEVEL.debug, info: LEVEL.info, warn: LEVEL.warn, error: LEVEL.error,\n};\n\nabstract class BaseLogger implements Logger {\n constructor(\n protected readonly resolver: LevelResolver,\n protected readonly bindings: LogFields,\n protected readonly extraRedact: string[],\n ) {}\n private svc(): ServiceName {\n return (this.bindings.service as ServiceName) ?? \"http\";\n }\n get level(): LogLevel {\n return this.resolver.get(this.svc());\n }\n isLevelEnabled(level: LogLevel): boolean {\n return this.resolver.isAtLeast(this.svc(), level);\n }\n protected abstract emit(\n level: Exclude<LogLevel, \"silent\">,\n msg: string,\n fields: LogFields,\n ): void;\n private at(level: Exclude<LogLevel, \"silent\">, msg: string, fields?: LogFields): void {\n if (this.resolver.numericLevel(this.svc()) > EMIT[level]) return;\n const merged = { ...this.bindings, ...(fields ?? {}) };\n this.emit(level, msg, redact(merged, this.extraRedact) as LogFields);\n }\n trace(m: string, f?: LogFields): void { this.at(\"trace\", m, f); }\n debug(m: string, f?: LogFields): void { this.at(\"debug\", m, f); }\n info(m: string, f?: LogFields): void { this.at(\"info\", m, f); }\n warn(m: string, f?: LogFields): void { this.at(\"warn\", m, f); }\n error(m: string, f?: LogFields): void { this.at(\"error\", m, f); }\n abstract child(bindings: LogFields): Logger;\n}\n\nclass ConsoleLogger extends BaseLogger {\n constructor(\n resolver: LevelResolver,\n bindings: LogFields,\n extra: string[],\n private readonly sink: Sink,\n private readonly pretty: boolean,\n ) {\n super(resolver, bindings, extra);\n }\n protected emit(level: Exclude<LogLevel, \"silent\">, msg: string, fields: LogFields): void {\n if (this.pretty) {\n const fn =\n level === \"error\" ? this.sink.error\n : level === \"warn\" ? this.sink.warn\n : level === \"info\" ? this.sink.info\n : this.sink.log;\n fn(`[${level}] ${msg}`, fields);\n } else {\n this.sink.log(JSON.stringify({ ts: new Date().toISOString(), level, msg, ...fields }));\n }\n }\n child(bindings: LogFields): Logger {\n return new ConsoleLogger(\n this.resolver,\n { ...this.bindings, ...bindings },\n this.extraRedact,\n this.sink,\n this.pretty,\n );\n }\n}\n\nclass NoopLogger implements Logger {\n level: LogLevel = \"silent\";\n isLevelEnabled(): boolean { return false; }\n trace(): void {}\n debug(): void {}\n info(): void {}\n warn(): void {}\n error(): void {}\n child(): Logger { return this; }\n}\n\n/** Creates the built-in console logger. `opts.sink` overrides `console` (used in tests). */\nexport function createConsoleLogger(\n resolver: LevelResolver,\n bindings: LogFields = {},\n opts: { pretty?: boolean; redact?: string[]; sink?: Sink } = {},\n): Logger {\n const pretty = opts.pretty ?? readEnv(\"NODE_ENV\") !== \"production\";\n const sink: Sink = opts.sink ?? {\n log: console.log,\n info: console.info,\n warn: console.warn,\n error: console.error,\n };\n return new ConsoleLogger(resolver, bindings, opts.redact ?? [], sink, pretty);\n}\n\n/** Creates a logger that discards everything. */\nexport function createNoopLogger(): Logger {\n return new NoopLogger();\n}\n","import type { ResolvedConfig, ServiceCredentials } from \"./config\";\nimport { EmporixAuthError, EmporixTimeoutError, EmporixNetworkError } from \"./errors\";\n\n/** Which token a call should use. */\nexport type AuthKind = \"service\" | \"customer\" | \"anonymous\" | \"raw\";\n\n/** Caller-supplied, per-call auth selector. Never stored on the client. */\nexport type AuthContext =\n | { kind: \"service\"; credentials?: string }\n | { kind: \"anonymous\" }\n | { kind: \"customer\"; token: string }\n | { kind: \"raw\"; token: string };\n\n/**\n * Supplies a fresh customer token when a `customer`-kind request 401s. The host\n * (e.g. EmporixProvider) implements this; the SDK never refreshes the\n * caller-owned customer token unless a refresher is registered.\n */\nexport interface CustomerTokenRefresher {\n /**\n * Called on a `customer`-kind 401. Receives the token that just failed;\n * returns a fresh customer token to retry with, or `null` to give up (the\n * 401 then propagates as EmporixAuthError).\n */\n refresh(expiredToken: string): Promise<string | null>;\n}\n\n/** An obtained anonymous storefront session. */\nexport interface AnonymousSession {\n accessToken: string;\n refreshToken: string;\n sessionId: string;\n expiresIn: number;\n}\n\n/**\n * An anonymous session as it survives outside the client instance.\n *\n * `accessToken` and `expiresAt` are optional, and a store is free to drop them:\n * they turn a *server* round trip into zero token calls, because a server client\n * lives for one request and would otherwise refresh on every single one. A\n * long-lived browser client keeps the token in memory anyway, so the React\n * storage adapters deliberately persist only the two required fields — a token\n * readable by JavaScript buys nothing there.\n *\n * A store that returns `accessToken` without a future `expiresAt` gets treated as\n * having no token at all; see {@link DefaultTokenProvider.attachAnonymousStore}.\n */\nexport interface StoredAnonymousSession {\n refreshToken: string;\n sessionId: string;\n /** The access token itself, so a fresh client need not spend a refresh call for it. */\n accessToken?: string;\n /** Epoch ms after which `accessToken` is stale. The expiry buffer is already applied. */\n expiresAt?: number;\n}\n\n/**\n * Persistence callback for anonymous sessions. `read` is called once on the\n * first need for an anonymous token to bootstrap a possibly-existing session;\n * `write` is called after every successful login or refresh. `write(null)`\n * means the SDK is invalidating the stored session.\n */\nexport interface AnonymousSessionStore {\n read(): StoredAnonymousSession | null;\n write(session: StoredAnonymousSession | null): void;\n}\n\n/** Supplies SDK-managed tokens (service/custom + anonymous). May be user-injected. */\nexport interface TokenProvider {\n /** Service/custom client-credentials token for the named credential set. */\n getToken(credentialSet: string): Promise<string>;\n /** Cached anonymous storefront session (preserves sessionId across refreshes). */\n getAnonymousToken(): Promise<AnonymousSession>;\n /** Refresh the anonymous session, preserving sessionId. */\n refreshAnonymous?(): Promise<AnonymousSession>;\n /** Invalidate a cached SDK-managed token so the next call re-auths. */\n invalidate?(credentialSet: string): void;\n /** Invalidate the cached anonymous session entirely (next call re-logs in). */\n invalidateAnonymous?(): void;\n /**\n * Mark the anonymous access token stale but keep the refresh token, so the\n * next {@link getAnonymousToken} refreshes (preserving sessionId) rather\n * than starting a brand-new session.\n */\n expireAnonymous?(): void;\n /**\n * Install a persistence adapter for the anonymous session. The host (e.g.\n * `EmporixProvider`) calls this at construction so the SDK can bootstrap\n * an existing session and persist refreshes. Idempotent: a later call\n * replaces the previous adapter.\n */\n attachAnonymousStore?(store: AnonymousSessionStore): void;\n /**\n * Override the storefront context (currency/site/country) used for the next\n * anonymous login, then invalidate the current anonymous session so it\n * re-mints with the new context. No-op for providers without anon support.\n */\n setAnonymousContext?(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n }): void;\n /**\n * Subscribe to token-refresh events. Optional — implementations may no-op.\n * Returns an unsubscribe function. `DefaultTokenProvider` emits for the\n * anonymous-login / anonymous-refresh paths.\n */\n onRefresh?(\n listener: (event: { kind: \"anonymous\" | \"customer\"; success: boolean }) => void,\n ): () => void;\n}\n\n/** Tiny constructors for {@link AuthContext}. */\nexport const auth = {\n /** Service/custom credential set (default `backend`). */\n service: (credentials?: string): AuthContext =>\n credentials === undefined ? { kind: \"service\" } : { kind: \"service\", credentials },\n /** Cached anonymous storefront token. */\n anonymous: (): AuthContext => ({ kind: \"anonymous\" }),\n /** Caller-owned customer bearer token. */\n customer: (token: string): AuthContext => ({ kind: \"customer\", token }),\n /** Exact token, no transformation (SSO / token-exchange). */\n raw: (token: string): AuthContext => ({ kind: \"raw\", token }),\n};\n\n/** Resolves an {@link AuthContext} to a concrete bearer token. */\nexport async function resolveToken(ctx: AuthContext, provider: TokenProvider): Promise<string> {\n switch (ctx.kind) {\n case \"service\":\n return provider.getToken(ctx.credentials ?? \"backend\");\n case \"anonymous\":\n return (await provider.getAnonymousToken()).accessToken;\n case \"customer\":\n case \"raw\":\n return ctx.token;\n }\n}\n\n/**\n * Late-bindable, single-flight holder for an optional\n * {@link CustomerTokenRefresher}. Single-flight is required because Emporix\n * rotates the refresh token on each refresh — concurrent refreshes would\n * invalidate each other. Off (returns `null`) until a refresher is set.\n */\nexport class CustomerRefreshRegistry {\n private refresher: CustomerTokenRefresher | null = null;\n private inflight: Promise<string | null> | null = null;\n\n set(refresher: CustomerTokenRefresher | null): void {\n this.refresher = refresher;\n }\n\n get enabled(): boolean {\n return this.refresher !== null;\n }\n\n /** Concurrent callers share one in-flight refresh. */\n refresh(expiredToken: string): Promise<string | null> {\n if (!this.refresher) return Promise.resolve(null);\n if (this.inflight) return this.inflight;\n const p = Promise.resolve(this.refresher.refresh(expiredToken)).finally(() => {\n this.inflight = null;\n });\n this.inflight = p;\n return p;\n }\n}\n\ninterface CacheEntry {\n token: string;\n expiresAt: number;\n obtainedAt: number;\n}\n\n/** SDK-owned token provider: client-credentials service tokens + anonymous session. */\nexport class DefaultTokenProvider implements TokenProvider {\n private readonly serviceCache = new Map<string, CacheEntry>();\n private readonly serviceLocks = new Map<string, Promise<string>>();\n private anon: (AnonymousSession & { expiresAt: number }) | undefined;\n private anonLock: Promise<AnonymousSession> | undefined;\n private anonStore?: AnonymousSessionStore;\n private contextOverride:\n | { currency?: string; siteCode?: string; targetLocation?: string }\n | undefined;\n private readonly refreshListeners = new Set<\n (event: { kind: \"anonymous\" | \"customer\"; success: boolean }) => void\n >();\n\n constructor(private readonly cfg: ResolvedConfig) {}\n\n onRefresh(\n listener: (event: { kind: \"anonymous\" | \"customer\"; success: boolean }) => void,\n ): () => void {\n this.refreshListeners.add(listener);\n return () => {\n this.refreshListeners.delete(listener);\n };\n }\n\n private notifyRefresh(kind: \"anonymous\" | \"customer\", success: boolean): void {\n for (const l of this.refreshListeners) {\n try {\n l({ kind, success });\n } catch {\n // Never let a telemetry listener break the auth path.\n }\n }\n }\n\n attachAnonymousStore(store: AnonymousSessionStore): void {\n this.anonStore = store;\n // Bootstrap `this.anon` from the store if we don't have it yet.\n //\n // A persisted access token that is still inside its lifetime is adopted as\n // is, and that is the point on a server: a client that lives for one request\n // would otherwise spend one `/anonymous/refresh` per request for a token it\n // already holds. Without a token — or past its expiry — `expiresAt` stays 0\n // and the next getAnonymousToken refreshes, which preserves the sessionId,\n // so the guest's cart survives either way.\n //\n // `expiresAt` counts only when there is a token to go with it. A store that\n // returns one without the other would otherwise make `anonFresh()` true and\n // hand out an empty bearer token.\n //\n // Trusting a stored expiry means trusting the writer's clock. A token\n // revoked early, or an expiry that a skewed clock made look valid, comes\n // back as a 401 — which `HttpClient` answers with `expireAnonymous()` plus\n // one retry, so the failure mode is a refresh, not an error.\n if (!this.anon) {\n const persisted = store.read();\n if (persisted) {\n const token = persisted.accessToken ?? \"\";\n this.anon = {\n accessToken: token,\n refreshToken: persisted.refreshToken,\n sessionId: persisted.sessionId,\n expiresIn: 0,\n expiresAt: token === \"\" ? 0 : (persisted.expiresAt ?? 0),\n };\n }\n }\n }\n\n private creds(set: string): ServiceCredentials {\n if (set === \"backend\") {\n const b = this.cfg.credentials.backend;\n if (!b?.clientId || !b.secret) {\n throw new EmporixAuthError(\n \"A 'service' AuthContext was used but credentials.backend is not configured\",\n );\n }\n return b;\n }\n const c = this.cfg.credentials.custom?.[set];\n if (!c) throw new Error(`Unknown credential set \"${set}\"`);\n return c;\n }\n\n private fresh(e: CacheEntry | undefined): boolean {\n if (!e) return false;\n const now = Date.now();\n if (now - e.obtainedAt >= this.cfg.cache.maxLifetimeSeconds * 1000) return false;\n return now < e.expiresAt;\n }\n\n async getToken(set: string): Promise<string> {\n // Surface an unknown credential set before entering the cache/lock path.\n this.creds(set);\n const cached = this.serviceCache.get(set);\n if (this.fresh(cached)) return cached!.token;\n const inflight = this.serviceLocks.get(set);\n if (inflight) return inflight;\n const p = this.requestServiceToken(set).finally(() => this.serviceLocks.delete(set));\n this.serviceLocks.set(set, p);\n return p;\n }\n\n /**\n * fetch with the configured read timeout. Token endpoints sit in front of\n * single-flight locks — one hung call would otherwise block every request\n * on this credential set forever.\n */\n private async boundedFetch(url: string | URL, init: RequestInit = {}): Promise<Response> {\n const ms = this.cfg.timeouts?.readMs ?? 60_000;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), ms);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(`token request timed out after ${ms}ms`);\n }\n throw new EmporixNetworkError(`token request network failure: ${(err as Error).message}`);\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async requestServiceToken(set: string): Promise<string> {\n const c = this.creds(set);\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: c.clientId,\n client_secret: c.secret,\n });\n if (c.scope) body.set(\"scope\", c.scope);\n const res = await this.boundedFetch(`${this.cfg.host}/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n const json = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) {\n throw new EmporixAuthError(`Token request failed for \"${set}\"`, res.status, json);\n }\n const obtainedAt = Date.now();\n const ttl = Number((json.expires_in as number | undefined) ?? 3600);\n this.serviceCache.set(set, {\n token: json.access_token as string,\n obtainedAt,\n expiresAt: obtainedAt + (ttl - this.cfg.cache.expirationBufferSeconds) * 1000,\n });\n return this.serviceCache.get(set)!.token;\n }\n\n invalidate(set: string): void {\n this.serviceCache.delete(set);\n }\n\n private anonFresh(): boolean {\n return !!this.anon && Date.now() < this.anon.expiresAt;\n }\n\n async getAnonymousToken(): Promise<AnonymousSession> {\n if (this.anonFresh()) return this.stripExpiry(this.anon!);\n if (this.anonLock) return this.anonLock;\n // Token expired but a refresh token survives → refresh to keep the same\n // sessionId; only fall back to a brand-new login if the refresh fails.\n const canRefresh = !!this.anon?.refreshToken;\n const obtain = canRefresh\n ? this.fetchAnonymous(\"refresh\").catch(() => this.fetchAnonymous(\"login\"))\n : this.fetchAnonymous(\"login\");\n const p = obtain.finally(() => {\n this.anonLock = undefined;\n });\n this.anonLock = p;\n return p;\n }\n\n /** Refreshes the anonymous session, preserving its sessionId. */\n async refreshAnonymous(): Promise<AnonymousSession> {\n if (!this.anon) return this.getAnonymousToken();\n return this.fetchAnonymous(\"refresh\");\n }\n\n invalidateAnonymous(): void {\n this.anon = undefined;\n this.anonStore?.write(null);\n }\n\n setAnonymousContext(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n }): void {\n const base = this.contextOverride ?? this.cfg.credentials.storefront?.context ?? {};\n this.contextOverride = { ...base, ...ctx };\n this.invalidateAnonymous();\n }\n\n /** Force a stale access token while keeping the refresh token + sessionId. */\n expireAnonymous(): void {\n if (this.anon) this.anon = { ...this.anon, expiresAt: 0 };\n }\n\n private stripExpiry(s: AnonymousSession & { expiresAt: number }): AnonymousSession {\n const { expiresAt: _expiresAt, ...rest } = s;\n return rest;\n }\n\n private async fetchAnonymous(mode: \"login\" | \"refresh\"): Promise<AnonymousSession> {\n const sf = this.cfg.credentials.storefront;\n if (!sf?.clientId) {\n throw new Error(\"credentials.storefront.clientId is required for anonymous tokens\");\n }\n const url = new URL(`${this.cfg.host}/customerlogin/auth/anonymous/${mode}`);\n url.searchParams.set(\"tenant\", this.cfg.tenant);\n url.searchParams.set(\"client_id\", sf.clientId);\n // Context is the runtime override (set via setAnonymousContext) if present,\n // else the config-fixed context.\n const c = this.contextOverride ?? sf.context;\n if (c?.currency) url.searchParams.set(\"currency\", c.currency);\n if (c?.siteCode) url.searchParams.set(\"siteCode\", c.siteCode);\n if (c?.targetLocation) url.searchParams.set(\"targetLocation\", c.targetLocation);\n if (mode === \"refresh\" && this.anon) {\n url.searchParams.set(\"refresh_token\", this.anon.refreshToken);\n }\n try {\n const res = await this.boundedFetch(url, { method: \"GET\" });\n const json = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) {\n this.notifyRefresh(\"anonymous\", false);\n throw new EmporixAuthError(`Anonymous token ${mode} failed`, res.status, json);\n }\n const obtainedAt = Date.now();\n this.anon = {\n accessToken: json.access_token as string,\n refreshToken: json.refresh_token as string,\n sessionId: json.sessionId as string,\n expiresIn: json.expires_in as number,\n expiresAt:\n obtainedAt +\n ((json.expires_in as number) - this.cfg.cache.expirationBufferSeconds) * 1000,\n };\n // The access token and its expiry go out too, so a store that keeps them\n // (a server one) can hand the next request a usable token instead of\n // another refresh. A store that only wants the refresh token drops them.\n this.anonStore?.write({\n refreshToken: this.anon.refreshToken,\n sessionId: this.anon.sessionId,\n accessToken: this.anon.accessToken,\n expiresAt: this.anon.expiresAt,\n });\n this.notifyRefresh(\"anonymous\", true);\n return this.stripExpiry(this.anon);\n } catch (err) {\n // Re-throw EmporixAuthError as-is; for non-Emporix errors (network), also notify.\n if (!(err instanceof EmporixAuthError)) {\n this.notifyRefresh(\"anonymous\", false);\n }\n throw err;\n }\n }\n}\n// Customer-token refreshes happen via client.customers.refresh() and don't\n// route through this TokenProvider — only the anonymous flow notifies.\n// React-side useCustomerSession.refresh emits its own telemetry event in a\n// follow-up if needed.\n","/**\n * The persisted session-state contract, shared by every host.\n *\n * It lives in the core SDK rather than in `@viu/emporix-sdk-react` because it is\n * not a React concern: the same eight keys are cookie names in a Next\n * `proxy.ts`, Web Storage keys in a browser adapter, and record fields in a\n * server-side session store. Keeping it here is what let\n * `@viu/emporix-sdk-next` drop its dependency on the React package — it needed\n * these strings, not React.\n *\n * `@viu/emporix-sdk-react` re-exports both from `./storage` and `/ssr`, so\n * existing imports keep working.\n */\n\n/** Keys that participate in {@link EmporixStorage.subscribeAll}. */\nexport type EmporixStorageKey =\n | \"customerToken\"\n | \"cartId\"\n | \"siteCode\"\n | \"language\"\n | \"anonymousSession\"\n | \"activeLegalEntityId\"\n | \"refreshToken\"\n | \"saasToken\";\n\n/**\n * The eight persisted session keys, as the strings each backend actually uses.\n * Same strings on purpose — a value written by one backend must be readable by\n * the next, and the cookie set by a Next `proxy.ts` has to be the one\n * `createCookieStorage` looks for.\n *\n * The `satisfies` is the point, not the deduplication: a ninth\n * {@link EmporixStorageKey} without an entry here is a compile error, and an\n * entry here without a union member is too. `as const` stays in front of it so\n * the literal types survive for consumers.\n */\nexport const STORAGE_KEYS = {\n customerToken: \"emporix.customerToken\",\n cartId: \"emporix.cartId\",\n anonymousSession: \"emporix.anonymousSession\",\n siteCode: \"emporix.siteCode\",\n language: \"emporix.language\",\n activeLegalEntityId: \"emporix.activeLegalEntityId\",\n refreshToken: \"emporix.refreshToken\",\n saasToken: \"emporix.saasToken\",\n} as const satisfies Record<EmporixStorageKey, string>;\n","/**\n * The persisted-session layer: the {@link EmporixStorage} contract and the two\n * framework-free implementations of it that are not browser-specific.\n *\n * It lives in the core SDK for the same reason {@link STORAGE_KEYS} does — none\n * of it is a React concern. A cookie-backed storage fits Next, Remix, SvelteKit,\n * Nitro or a plain Node handler equally, and `@viu/emporix-sdk-next` needed\n * exactly this and nothing else from `@viu/emporix-sdk-react`.\n *\n * `@viu/emporix-sdk-react` re-exports all of it and keeps the browser backends\n * (memory, localStorage, sessionStorage, document.cookie), which genuinely belong\n * there.\n */\nimport { auth, type AuthContext, type StoredAnonymousSession } from \"./auth\";\nimport { STORAGE_KEYS, type EmporixStorageKey } from \"./session-keys\";\n\n/**\n * The subset of an anonymous session a browser storage keeps.\n *\n * Derived from {@link StoredAnonymousSession} rather than re-declared: a server\n * store may additionally persist the access token and its expiry, a browser one\n * deliberately does not (the client is long-lived and holds the token in memory,\n * so writing it would only expose a bearer token to JavaScript).\n */\nexport type PersistedAnonymousSession = Pick<\n StoredAnonymousSession,\n \"refreshToken\" | \"sessionId\"\n>;\n\n/** Pluggable persistence for SDK session state. SSR-safe by default (memory). */\nexport interface EmporixStorage {\n // Customer token (unchanged).\n getCustomerToken(): string | null;\n setCustomerToken(token: string | null): void;\n subscribe?(listener: (token: string | null) => void): () => void;\n\n // Active guest / customer cart id.\n getCartId(): string | null;\n setCartId(id: string | null): void;\n\n // Anonymous session — used by DefaultTokenProvider (via EmporixProvider\n // wiring) to preserve sessionId across page reloads.\n getAnonymousSession(): PersistedAnonymousSession | null;\n setAnonymousSession(session: PersistedAnonymousSession | null): void;\n\n // Active site code (MS-2). `null` = no site bound yet.\n getSiteCode(): string | null;\n setSiteCode(code: string | null): void;\n\n // Active language (Accept-Language). `null` = use the site/tenant default.\n getLanguage(): string | null;\n setLanguage(language: string | null): void;\n\n // Active legal entity id (B2B). `null` = B2C mode.\n getActiveLegalEntityId(): string | null;\n setActiveLegalEntityId(id: string | null): void;\n\n // Refresh token — optional persistence. When absent, B2B company-switch\n // falls back to a local-state-only update (no server-side token rescope).\n getRefreshToken(): string | null;\n setRefreshToken(token: string | null): void;\n\n // SaaS token (the checkout `saas-token` header). Persisted so a logged-in\n // customer can still complete checkout after a page reload — the refresh\n // endpoint does not re-mint it. Optional: a custom adapter may omit these,\n // in which case the saasToken stays in-memory only.\n getSaasToken?(): string | null;\n setSaasToken?(token: string | null): void;\n\n /**\n * Subscribe to any storage write. The listener receives the key that\n * changed. Returns an unsubscribe function. Optional — backends may no-op.\n * Used by the telemetry layer to emit `storage.write` events.\n */\n subscribeAll?(listener: (key: EmporixStorageKey) => void): () => void;\n}\n\n/** Backward-compat alias. New code should prefer {@link EmporixStorage}. */\nexport type TokenStorage = EmporixStorage;\n\n/**\n * Parses a stored anonymous session (from Web Storage or a cookie) into a\n * {@link PersistedAnonymousSession}. Returns `null` for absent, malformed or\n * incomplete values — a half-written session must not become a half-valid one.\n */\nexport function parseAnonymousSession(raw: string | null): PersistedAnonymousSession | null {\n if (raw === null) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedAnonymousSession>;\n return typeof parsed.refreshToken === \"string\" && typeof parsed.sessionId === \"string\"\n ? { refreshToken: parsed.refreshToken, sessionId: parsed.sessionId }\n : null;\n } catch {\n return null;\n }\n}\n\n/** Backend-agnostic cookie accessor. `set` absent means the storage is read-only. */\nexport interface CookieIo {\n get(name: string): string | null;\n /** `null` deletes the cookie. */\n set?(name: string, value: string | null): void;\n}\n\n/**\n * Builds an {@link EmporixStorage} over a cookie accessor. Contains the whole\n * name-to-accessor mapping so no backend repeats it.\n *\n * `opts.notify` is a callback rather than a flag so this module stays free of\n * listener-set lifetime: the browser backend owns a `createListenerSet`, passes\n * its `notify` here, and attaches `subscribeAll` to the result itself. This\n * function never sets `subscribeAll` — the server backend therefore has none,\n * which is correct: a server render has no lifetime to observe.\n */\nexport function createCookieBackedStorage(\n io: CookieIo,\n opts: { tokenName?: string; notify?: (key: EmporixStorageKey) => void } = {},\n): EmporixStorage {\n const tokenName = opts.tokenName ?? STORAGE_KEYS.customerToken;\n const notify = opts.notify;\n\n // Read-only mode: warn once per key so a genuine bug surfaces, but a render\n // loop cannot flood the log.\n const warned = new Set<EmporixStorageKey>();\n const write = (name: string, value: string | null, key: EmporixStorageKey): void => {\n if (io.set === undefined) {\n if (!warned.has(key)) {\n warned.add(key);\n // eslint-disable-next-line no-console\n console.warn(\n `[emporix] storage is read-only; ignoring write to \"${key}\". ` +\n \"Provide a `set` accessor to enable writes (e.g. from a Server Action).\",\n );\n }\n return;\n }\n io.set(name, value);\n notify?.(key);\n };\n\n return {\n getCustomerToken: () => io.get(tokenName),\n setCustomerToken: (t) => write(tokenName, t, \"customerToken\"),\n\n getCartId: () => io.get(STORAGE_KEYS.cartId),\n setCartId: (id) => write(STORAGE_KEYS.cartId, id, \"cartId\"),\n\n getAnonymousSession: () => parseAnonymousSession(io.get(STORAGE_KEYS.anonymousSession)),\n setAnonymousSession: (s) =>\n write(\n STORAGE_KEYS.anonymousSession,\n s === null\n ? null\n : JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n \"anonymousSession\",\n ),\n\n getSiteCode: () => io.get(STORAGE_KEYS.siteCode),\n setSiteCode: (code) => write(STORAGE_KEYS.siteCode, code, \"siteCode\"),\n\n getLanguage: () => io.get(STORAGE_KEYS.language),\n setLanguage: (l) => write(STORAGE_KEYS.language, l, \"language\"),\n\n getActiveLegalEntityId: () => io.get(STORAGE_KEYS.activeLegalEntityId),\n setActiveLegalEntityId: (id) =>\n write(STORAGE_KEYS.activeLegalEntityId, id, \"activeLegalEntityId\"),\n\n getRefreshToken: () => io.get(STORAGE_KEYS.refreshToken),\n setRefreshToken: (t) => write(STORAGE_KEYS.refreshToken, t, \"refreshToken\"),\n\n getSaasToken: () => io.get(STORAGE_KEYS.saasToken),\n setSaasToken: (t) => write(STORAGE_KEYS.saasToken, t, \"saasToken\"),\n };\n}\n\n/**\n * A synchronous cookie accessor supplied by the caller. Deliberately\n * synchronous: {@link EmporixStorage} is synchronous throughout, so any\n * `await` (e.g. Next's `await cookies()`) belongs to the caller.\n *\n * Omit `set` for a read-only storage. Next.js forbids cookie writes during a\n * Server Component render — only Server Actions and Route Handlers may write.\n */\nexport interface ServerCookieJar {\n get(name: string): string | null;\n /** `null` deletes the cookie. */\n set?(name: string, value: string | null): void;\n}\n\n/**\n * An {@link EmporixStorage} reading (and optionally writing) through a\n * caller-supplied cookie jar — for RSC, Server Actions, Route Handlers, or any\n * other server runtime. No framework import: the jar shape fits Next, Remix,\n * SvelteKit, Nitro or a plain Node handler.\n *\n * `subscribe` / `subscribeAll` are absent: a server render has no lifetime over\n * which to observe changes.\n *\n * ```ts\n * // Next.js Server Component (read-only)\n * const jar = await cookies();\n * const storage = createServerStorage({ get: (n) => jar.get(n)?.value ?? null });\n *\n * // Next.js Server Action (read-write)\n * const jar = await cookies();\n * const storage = createServerStorage({\n * get: (n) => jar.get(n)?.value ?? null,\n * set: (n, v) =>\n * v === null\n * ? jar.delete(n)\n * : jar.set(n, v, { httpOnly: true, sameSite: \"lax\", secure: true, path: \"/\" }),\n * });\n * ```\n */\nexport function createServerStorage(jar: ServerCookieJar): EmporixStorage {\n return createCookieBackedStorage(\n jar.set !== undefined ? { get: jar.get, set: jar.set } : { get: jar.get },\n );\n}\n\n/**\n * Resolves the {@link AuthContext} a server-side read should use, mirroring\n * exactly what the React `useEmporixQuery` resolves on the client: the customer\n * context when a token is stored, anonymous otherwise.\n *\n * Use this rather than hand-rolling it — `authKind` is part of every React-Query\n * key, so a mismatch here produces a silent cache miss (a second fetch after\n * hydration, no error).\n */\nexport function serverAuth(storage: EmporixStorage): AuthContext {\n const token = storage.getCustomerToken();\n return token !== null ? auth.customer(token) : auth.anonymous();\n}\n","/**\n * The browser session-storage backends: memory, localStorage, sessionStorage,\n * document.cookie.\n *\n * The contract and the framework-free backends live in `./session-storage`;\n * these are the ones that need browser globals. They were in\n * `@viu/emporix-sdk-react` until `@viu/emporix-sdk-angular` needed them too —\n * `localStorage` is not a React API, and duplicating a storage backend per\n * binding means two of them writing subtly different values under the same key.\n *\n * Every export is a named factory and the package sets `sideEffects: false`, so\n * a Node consumer that imports none of them bundles none of them. That is\n * asserted by `scripts/check-treeshake.mjs`.\n */\nimport {\n createCookieBackedStorage,\n parseAnonymousSession,\n type EmporixStorage,\n type PersistedAnonymousSession,\n} from \"./session-storage\";\nimport { STORAGE_KEYS, type EmporixStorageKey } from \"./session-keys\";\n\n/**\n * The three methods these backends use from a Web `Storage`.\n *\n * Declared locally on purpose. This package compiles with `lib: [\"ES2022\"]` and\n * no `\"DOM\"` — that is the invariant which keeps the SDK runnable on Node, edge\n * runtimes and workers, and adding DOM to the lib to satisfy this one file would\n * switch that compile-time guard off for all ~60 services. So every browser\n * global below is reached through a narrowed `globalThis` instead of an ambient\n * declaration, which is also the pattern the localStorage and sessionStorage\n * availability checks already used before this code moved here.\n */\nexport interface WebStorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\n/** Narrowed view of the browser globals these backends touch. */\ninterface BrowserGlobals {\n localStorage?: WebStorageLike;\n sessionStorage?: WebStorageLike;\n document?: { cookie: string };\n location?: { protocol: string };\n}\n\nconst browser = globalThis as unknown as BrowserGlobals;\n\n/**\n * Internal: create a swallow-on-throw listener set used by all the storage\n * backends for `subscribeAll`. Centralizes the try/catch wrapper so a buggy\n * telemetry handler never breaks a storage write.\n */\nexport function createListenerSet<T>(): {\n add(l: (value: T) => void): () => void;\n notify(value: T): void;\n} {\n const listeners = new Set<(v: T) => void>();\n return {\n add(l) {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n notify(value) {\n for (const l of listeners) {\n try {\n l(value);\n } catch {\n // Swallow handler errors; telemetry must never break writes.\n }\n }\n },\n };\n}\n\n/** In-memory token store. Default, SSR-safe, no persistence. */\nexport function createMemoryStorage(opts: { initial?: string } = {}): EmporixStorage {\n let token: string | null = opts.initial ?? null;\n let cartId: string | null = null;\n let anon: PersistedAnonymousSession | null = null;\n let siteCode: string | null = null;\n let language: string | null = null;\n let activeLegalEntityId: string | null = null;\n let refreshToken: string | null = null;\n let saasToken: string | null = null;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => token,\n setCustomerToken: (t) => {\n token = t;\n for (const l of tokenListeners) l(token);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => cartId,\n setCartId: (id) => {\n cartId = id;\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => anon,\n setAnonymousSession: (s) => {\n anon = s;\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => siteCode,\n setSiteCode: (code) => {\n siteCode = code;\n all.notify(\"siteCode\");\n },\n getLanguage: () => language,\n setLanguage: (l) => {\n language = l;\n all.notify(\"language\");\n },\n getActiveLegalEntityId: () => activeLegalEntityId,\n setActiveLegalEntityId: (id) => {\n activeLegalEntityId = id;\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => refreshToken,\n setRefreshToken: (t) => {\n refreshToken = t;\n all.notify(\"refreshToken\");\n },\n getSaasToken: () => saasToken,\n setSaasToken: (t) => {\n saasToken = t;\n all.notify(\"saasToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n\n/**\n * Internal: build an {@link EmporixStorage} backed by any Web `Storage`\n * instance (`localStorage` or `sessionStorage`). Both share the identical\n * `getItem`/`setItem`/`removeItem` surface, so the 8-key wiring lives here once.\n * Callers own the availability check + memory fallback before delegating.\n */\nexport function fromWebStorage(\n storage: WebStorageLike,\n opts: { key?: string } = {},\n): EmporixStorage {\n const tokenKey = opts.key ?? STORAGE_KEYS.customerToken;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => storage.getItem(tokenKey),\n setCustomerToken: (t) => {\n if (t === null) storage.removeItem(tokenKey);\n else storage.setItem(tokenKey, t);\n for (const l of tokenListeners) l(t);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => storage.getItem(STORAGE_KEYS.cartId),\n setCartId: (id) => {\n if (id === null) storage.removeItem(STORAGE_KEYS.cartId);\n else storage.setItem(STORAGE_KEYS.cartId, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () =>\n parseAnonymousSession(storage.getItem(STORAGE_KEYS.anonymousSession)),\n setAnonymousSession: (s) => {\n if (s === null) storage.removeItem(STORAGE_KEYS.anonymousSession);\n else\n storage.setItem(\n STORAGE_KEYS.anonymousSession,\n JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n );\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => storage.getItem(STORAGE_KEYS.siteCode),\n setSiteCode: (code) => {\n if (code === null) storage.removeItem(STORAGE_KEYS.siteCode);\n else storage.setItem(STORAGE_KEYS.siteCode, code);\n all.notify(\"siteCode\");\n },\n getLanguage: () => storage.getItem(STORAGE_KEYS.language),\n setLanguage: (l) => {\n if (l === null) storage.removeItem(STORAGE_KEYS.language);\n else storage.setItem(STORAGE_KEYS.language, l);\n all.notify(\"language\");\n },\n getActiveLegalEntityId: () => storage.getItem(STORAGE_KEYS.activeLegalEntityId),\n setActiveLegalEntityId: (id) => {\n if (id === null) storage.removeItem(STORAGE_KEYS.activeLegalEntityId);\n else storage.setItem(STORAGE_KEYS.activeLegalEntityId, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => storage.getItem(STORAGE_KEYS.refreshToken),\n setRefreshToken: (t) => {\n if (t === null) storage.removeItem(STORAGE_KEYS.refreshToken);\n else storage.setItem(STORAGE_KEYS.refreshToken, t);\n all.notify(\"refreshToken\");\n },\n getSaasToken: () => storage.getItem(STORAGE_KEYS.saasToken),\n setSaasToken: (t) => {\n if (t === null) storage.removeItem(STORAGE_KEYS.saasToken);\n else storage.setItem(STORAGE_KEYS.saasToken, t);\n all.notify(\"saasToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n\n/**\n * Browser `localStorage`-backed store: persistent and shared across tabs.\n * Falls back to memory on the server (or when localStorage is unavailable).\n */\nexport function createLocalStorage(opts: { key?: string } = {}): EmporixStorage {\n const store = browser.localStorage;\n if (store === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] localStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n return fromWebStorage(store, opts);\n}\n\n/** @deprecated Use {@link createLocalStorage}. Kept for backward compatibility. */\nexport const createLocalStorageStorage = createLocalStorage;\n\n/**\n * Browser `sessionStorage`-backed store: per-tab persistence that survives a\n * reload but is cleared when the tab closes and is not shared across tabs.\n * Falls back to memory on the server (or when sessionStorage is unavailable).\n */\nexport function createSessionStorage(opts: { key?: string } = {}): EmporixStorage {\n const store = browser.sessionStorage;\n if (store === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] sessionStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n return fromWebStorage(store, opts);\n}\n\n/**\n * Cookie-backed store. `Secure` defaults to on for https origins; override\n * with `secure: false` only for non-https dev setups. Consumer must still pick\n * an appropriate `sameSite` for CSRF safety.\n */\nexport function createCookieStorage(\n opts: { name?: string; secure?: boolean; sameSite?: \"lax\" | \"strict\" | \"none\" } = {},\n): EmporixStorage {\n const sameSite = opts.sameSite ?? \"lax\";\n // Default: Secure on https origins. Tokens must not ride plain-http\n // cookies in production; localhost/http dev keeps working without opts.\n const secure = opts.secure ?? browser.location?.protocol === \"https:\";\n const doc = browser.document;\n if (doc === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] document unavailable; cookie storage falling back to in-memory\");\n return createMemoryStorage();\n }\n const attrs = `path=/; SameSite=${sameSite}${secure ? \"; Secure\" : \"\"}`;\n const all = createListenerSet<EmporixStorageKey>();\n const storage = createCookieBackedStorage(\n {\n get: (name) => {\n for (const part of doc.cookie.split(\"; \")) {\n const [k, ...v] = part.split(\"=\");\n if (k === name) return decodeURIComponent(v.join(\"=\")) || null;\n }\n return null;\n },\n set: (name, value) => {\n doc.cookie =\n value === null\n ? `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attrs}`\n : `${name}=${encodeURIComponent(value)}; ${attrs}`;\n },\n },\n {\n ...(opts.name !== undefined ? { tokenName: opts.name } : {}),\n notify: (key) => all.notify(key),\n },\n );\n return { ...storage, subscribeAll: (l) => all.add(l) };\n}\n","/**\n * The cache-key shape every framework binding shares.\n *\n * Shape: `[\"emporix\", resource, ...args, { tenant, authKind, siteCode?, language? }]`\n *\n * It lives in the core SDK for the same reason {@link STORAGE_KEYS} does: it is\n * not a React concern. `@viu/emporix-sdk-react` and `@viu/emporix-sdk-angular`\n * must produce byte-identical keys or the two bindings, the docs and the\n * devtools all describe different caches. One definition is the only way that\n * holds — a copy per binding would agree on the day it was written and nowhere\n * after.\n *\n * The trailing meta object groups the discriminators that differentiate cache\n * entries across tenants, auth-kinds and (where applicable) active sites.\n * `siteCode` is included only when explicitly passed — non-site-aware reads\n * pass `undefined` and the field is dropped.\n */\nexport function emporixKey<TArgs extends readonly unknown[]>(\n resource: string,\n args: TArgs,\n context: {\n tenant: string;\n authKind: string;\n siteCode?: string | null;\n language?: string | null;\n },\n): readonly [\"emporix\", string, ...TArgs, Record<string, unknown>] {\n const meta: Record<string, unknown> = {\n tenant: context.tenant,\n authKind: context.authKind,\n };\n if (context.siteCode !== undefined) {\n meta.siteCode = context.siteCode;\n }\n if (context.language !== undefined) {\n meta.language = context.language;\n }\n return [\"emporix\", resource, ...args, meta] as const;\n}\n\n/** Which site discriminators go into the query key's meta object. */\nexport type SiteFields = \"full\" | \"language\" | \"none\";\n\n/**\n * Builds the site portion of a query key's meta object. Shared by every read\n * path — React's `useEmporixQuery`, its `prefetchEmporix`, and Angular's\n * `emporixQueryOptions` — so none of them can disagree about which\n * discriminators a resource carries. Key parity is structural, not tested.\n *\n * Note `null` is preserved rather than dropped: an unbound site is a distinct\n * cache identity from a bound one, and {@link emporixKey} only omits a field\n * when it is `undefined`.\n */\nexport function siteMeta(\n site: SiteFields,\n siteCode: string | null,\n language: string | null,\n): { siteCode?: string | null; language?: string | null } {\n return site === \"full\"\n ? { siteCode, language }\n : site === \"language\"\n ? { language }\n : {};\n}\n","/**\n * In-memory customer-session store, keyed by storage instance.\n *\n * Moved out of the React bindings: it is a subscribe/snapshot store over\n * {@link EmporixStorage} with no framework API in it. React consumes it through\n * `useSyncExternalStore`, Angular through a `signal` — the store itself does not\n * know or care, which is exactly why it does not belong in either binding.\n */\nimport type { EmporixStorage } from \"./session-storage\";\n\n/**\n * The three session tokens the customer session tracks. `token` is mirrored\n * from persistent storage; `refreshToken` and `saasToken` are in-memory only\n * (deliberately never persisted).\n */\nexport interface CustomerSessionState {\n token: string | null;\n refreshToken: string | null;\n saasToken: string | null;\n}\n\nexport interface CustomerSessionStore {\n getSnapshot: () => CustomerSessionState;\n setState: (\n next: CustomerSessionState | ((prev: CustomerSessionState) => CustomerSessionState),\n ) => void;\n subscribe: (listener: () => void) => () => void;\n}\n\n// One store per storage instance. The storage object is the stable per-app\n// identity (a WeakMap lets it be GC'd with the app; each test gets a fresh\n// storage → a fresh isolated store).\nconst stores = new WeakMap<EmporixStorage, CustomerSessionStore>();\n\n/**\n * Shared in-memory store for the customer session, keyed by the storage\n * instance. Every consumer reads and writes the same store, so a login in one\n * place (the auth form) is visible in another (the checkout page) — without\n * this, the in-memory `saasToken` lived in a single component's local state and\n * customer checkout would 401 elsewhere.\n */\nexport function getCustomerSessionStore(storage: EmporixStorage): CustomerSessionStore {\n const existing = stores.get(storage);\n if (existing) return existing;\n\n // Re-hydrate from storage so a page reload keeps the full session: `token`\n // and `refreshToken` are persisted by the storage adapter; `saasToken` is\n // too (when the adapter supports it) — the checkout `saas-token` header is\n // needed after a reload and the refresh endpoint cannot re-mint it.\n let state: CustomerSessionState = {\n token: storage.getCustomerToken(),\n refreshToken: storage.getRefreshToken(),\n saasToken: storage.getSaasToken?.() ?? null,\n };\n const listeners = new Set<() => void>();\n const store: CustomerSessionStore = {\n getSnapshot: () => state,\n setState: (next) => {\n const resolved =\n typeof next === \"function\"\n ? (next as (prev: CustomerSessionState) => CustomerSessionState)(state)\n : next;\n if (resolved === state) return;\n state = resolved;\n for (const listener of listeners) listener();\n },\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n // Mirror external token writes (login/logout from any consumer, telemetry-\n // driven flows) into the store, so EVERY subscriber observes token changes.\n // Lifetime: the subscription lives exactly as long as the storage instance\n // that owns this store.\n storage.subscribe?.((t) => {\n store.setState((s) => (s.token === t ? s : { ...s, token: t }));\n });\n stores.set(storage, store);\n return store;\n}\n","/** One Server-Sent Events frame. `data` is the concatenated data lines. */\nexport interface SseEvent {\n event?: string;\n data: string;\n id?: string;\n}\n\n/** Parse one frame (fields separated by \"\\n\"); returns undefined if it has no fields. */\nfunction parseFrame(frame: string): SseEvent | undefined {\n const ev: SseEvent = { data: \"\" };\n const dataLines: string[] = [];\n let saw = false;\n for (const line of frame.split(\"\\n\")) {\n if (line === \"\" || line.startsWith(\":\")) continue; // blank / comment\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) value = value.slice(1); // strip one leading space\n if (field === \"data\") {\n dataLines.push(value);\n saw = true;\n } else if (field === \"event\") {\n ev.event = value;\n saw = true;\n } else if (field === \"id\") {\n ev.id = value;\n saw = true;\n }\n }\n if (!saw) return undefined;\n ev.data = dataLines.join(\"\\n\");\n return ev;\n}\n\n/**\n * Parse an SSE byte stream (already decoded to text chunks) into events.\n * Buffers across chunk boundaries; frames are separated by a blank line.\n */\nexport async function* parseSseStream(\n chunks: AsyncIterable<string>,\n): AsyncIterable<SseEvent> {\n let buf = \"\";\n for await (const chunk of chunks) {\n buf += chunk.replace(/\\r\\n/g, \"\\n\");\n let idx: number;\n while ((idx = buf.indexOf(\"\\n\\n\")) !== -1) {\n const ev = parseFrame(buf.slice(0, idx));\n buf = buf.slice(idx + 2);\n if (ev) yield ev;\n }\n }\n const tail = parseFrame(buf);\n if (tail) yield tail;\n}\n","import {\n type AuthContext,\n type TokenProvider,\n type CustomerRefreshRegistry,\n resolveToken,\n} from \"./auth\";\nimport { errorFromResponse, EmporixTimeoutError, EmporixNetworkError } from \"./errors\";\nimport type { Logger } from \"./logger\";\nimport { parseSseStream, type SseEvent } from \"./sse\";\n\n/** A single HTTP request through the SDK. */\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n path: string;\n auth: AuthContext;\n /**\n * Query parameters. Booleans are serialized with `String(v)`, so a facade can\n * pass one straight through instead of stringifying it at the call site.\n */\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Extra request headers (merged before auth; cannot override Authorization). */\n headers?: Record<string, string>;\n /** Per-request abort timeout override (ms). */\n timeoutMs?: number;\n /**\n * Marks this request as safe to retry on 5xx/429 despite a non-idempotent\n * method. GET/PUT/DELETE retry by default; POST/PATCH only with this flag\n * (a 5xx can arrive after the server already committed — retrying e.g.\n * placeOrder would duplicate the order/charge).\n */\n idempotent?: boolean;\n}\n\n/**\n * A successful response: the parsed body plus its headers.\n *\n * `Headers` rather than the whole `Response` on purpose — by the time this\n * returns, the body has been consumed, and a `Response` whose body cannot be\n * read again is a trap in a caller's hands.\n */\nexport interface HttpResult<T> {\n data: T;\n headers: Headers;\n}\n\n/** Construction options for {@link HttpClient}. */\nexport interface HttpClientOptions {\n host: string;\n /**\n * Tenant, emitted as `Emporix-Tenant` on every request.\n *\n * The tenant is already in the path of nearly every endpoint, so this looks\n * redundant — it is not. Emporix validates dashboard/IAM user tokens against\n * this header and answers 401 without it, even when `Authorization` is\n * correct. `@emporix/api-calls`, the client library the Management Dashboard\n * itself uses, sets it whenever a tenant is known.\n *\n * Optional so a bare `new HttpClient(...)` stays constructible; every client\n * built through `createCore` passes it.\n */\n tenant?: string;\n provider: TokenProvider;\n logger: Logger;\n retry: { maxAttempts: number };\n timeouts: { connectMs: number; readMs: number };\n /** Override the retry backoff delay (ms → Promise). Defaults to a real timer. */\n sleep?: (ms: number) => Promise<void>;\n /** Opt-in customer-token refresher registry (off unless a refresher is set). */\n customerRefresh?: CustomerRefreshRegistry;\n /**\n * Shared storefront request context. When `language` is set, every request\n * carries `Accept-Language: <language>`. Mutated at runtime via\n * `EmporixClient.setStorefrontContext({ language })`.\n */\n requestContext?: { language?: string | undefined };\n /**\n * Sent as `Content-Language` on every request that carries a body — see\n * `EmporixConfig.contentLanguage`. Reads and bodiless requests never get it.\n */\n contentLanguage?: string;\n /**\n * Replaces the global `fetch` for API requests. Not used by token requests\n * (`core/auth.ts`) or by {@link HttpClient.stream} — see `EmporixConfig.fetch`.\n */\n fetch?: typeof globalThis.fetch;\n}\n\nlet requestSeq = 0;\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n/** Fetch wrapper: auth resolution, JSON parsing, typed error mapping, logging. */\nexport class HttpClient {\n private readonly sleep: (ms: number) => Promise<void>;\n /** Resolved request fetch. The arrow keeps `globalThis.fetch` correctly bound. */\n private readonly doFetch: typeof globalThis.fetch;\n constructor(private readonly opts: HttpClientOptions) {\n this.sleep =\n opts.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)));\n this.doFetch = opts.fetch ?? ((...args) => globalThis.fetch(...args));\n }\n\n private buildHeaders(\n o: RequestOptions,\n token: string,\n isFormData: boolean,\n ): Record<string, string> {\n return {\n // Before `o.headers` on purpose: a caller may override the tenant for a\n // single request, the way `Accept-Language` and `Content-Language` can be\n // overridden. Only `Authorization` is non-negotiable.\n ...(this.opts.tenant !== undefined ? { \"Emporix-Tenant\": this.opts.tenant } : {}),\n ...(this.opts.requestContext?.language\n ? { \"Accept-Language\": this.opts.requestContext.language }\n : {}),\n ...(this.opts.contentLanguage && o.body !== undefined\n ? { \"Content-Language\": this.opts.contentLanguage }\n : {}),\n ...(o.headers ?? {}),\n Authorization: `Bearer ${token}`,\n // JSON bodies: set Content-Type. FormData bodies: let `fetch`\n // emit `multipart/form-data; boundary=...` itself.\n ...(o.body !== undefined && !isFormData\n ? { \"Content-Type\": \"application/json\" }\n : {}),\n };\n }\n\n /**\n * Issues a request and returns the parsed body. Retries 5xx/429 on idempotent\n * methods and re-auths once on a 401 — see {@link send}.\n */\n async request<T = unknown>(o: RequestOptions): Promise<T> {\n return (await this.send<T>(o)).data;\n }\n\n /**\n * Like {@link request}, but also hands back the response headers.\n *\n * Emporix puts pagination metadata there — `X-Total-Count` and, on the schema\n * service's custom instances, `X-Next-Cursor` / `X-Prev-Cursor`. Facades\n * should reach for `core/paged.ts`'s `requestPage` rather than calling this\n * directly; it exists for metadata that does not fit the paginated shape.\n */\n async requestWithMeta<T = unknown>(o: RequestOptions): Promise<HttpResult<T>> {\n return this.send<T>(o);\n }\n\n private async send<T>(o: RequestOptions): Promise<HttpResult<T>> {\n const requestId = `req-${++requestSeq}`;\n const log = this.opts.logger.child({ requestId });\n const url = new URL(this.opts.host + o.path);\n for (const [k, v] of Object.entries(o.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n const sdkManaged = o.auth.kind === \"service\" || o.auth.kind === \"anonymous\";\n const maxAttempts = this.opts.retry.maxAttempts;\n let reauthed = false;\n let customerToken = o.auth.kind === \"customer\" ? o.auth.token : undefined;\n let customerReauthed = false;\n\n for (let attempt = 1; ; attempt++) {\n const token = customerToken ?? (await resolveToken(o.auth, this.opts.provider));\n log.debug(\"http request\", {\n authKind: o.auth.kind,\n method: o.method,\n url: url.pathname,\n attempt,\n });\n\n const controller = new AbortController();\n const overallMs = o.timeoutMs ?? this.opts.timeouts.readMs;\n // connectMs bounds time-to-headers (fetch resolving); the overall budget\n // bounds headers + body. timeoutMs overrides the overall budget only.\n const connectMs = Math.min(this.opts.timeouts.connectMs, overallMs);\n const timeoutMsg = `${o.method} ${o.path} timed out after ${overallMs}ms (connect budget ${connectMs}ms)`;\n let connectTimer: ReturnType<typeof setTimeout> | undefined;\n let overallTimer: ReturnType<typeof setTimeout> | undefined;\n // The overall budget is a rejecting promise raced against fetch + the\n // body read, not just an abort. An abort interrupts the connection but\n // does NOT reliably unblock an already-streaming body that stalls\n // mid-read — racing the timer guarantees the read is bounded regardless.\n const overallBudget = new Promise<never>((_, reject) => {\n overallTimer = setTimeout(() => {\n controller.abort();\n reject(new EmporixTimeoutError(timeoutMsg));\n }, overallMs);\n });\n connectTimer = setTimeout(() => controller.abort(), connectMs);\n const isFormData =\n typeof FormData !== \"undefined\" && o.body instanceof FormData;\n const init: RequestInit = {\n method: o.method,\n headers: this.buildHeaders(o, token, isFormData),\n signal: controller.signal,\n };\n if (o.body !== undefined) {\n init.body = isFormData ? (o.body as FormData) : JSON.stringify(o.body);\n }\n let res: Response;\n let text: string;\n try {\n res = await Promise.race([this.doFetch(url, init), overallBudget]);\n // Headers are in — the connect budget no longer applies; the body\n // read stays bounded by the overall budget timer.\n clearTimeout(connectTimer);\n connectTimer = undefined;\n const body = res.text();\n // Swallow a late body rejection if the budget timer wins the race,\n // so it doesn't surface as an unhandled rejection.\n body.catch(() => {});\n text = await Promise.race([body, overallBudget]);\n } catch (err) {\n if (err instanceof EmporixTimeoutError) throw err;\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(timeoutMsg);\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n } finally {\n if (connectTimer !== undefined) clearTimeout(connectTimer);\n if (overallTimer !== undefined) clearTimeout(overallTimer);\n }\n const parsed = text ? safeJson(text) : undefined;\n if (res.ok) {\n log.debug(\"http ok\", { status: res.status });\n return { data: parsed as T, headers: res.headers };\n }\n\n // 401 asymmetry.\n if (res.status === 401) {\n if (sdkManaged && !reauthed) {\n reauthed = true;\n if (o.auth.kind === \"service\") {\n this.opts.provider.invalidate?.(o.auth.credentials ?? \"backend\");\n } else if (this.opts.provider.expireAnonymous) {\n // Keep the refresh token so the retry refreshes (same sessionId)\n // instead of starting a new anonymous session.\n this.opts.provider.expireAnonymous();\n } else {\n this.opts.provider.invalidateAnonymous?.();\n }\n log.warn(\"sdk-managed 401, re-authing once\", { authKind: o.auth.kind });\n continue;\n }\n if (\n o.auth.kind === \"customer\" &&\n !customerReauthed &&\n this.opts.customerRefresh?.enabled\n ) {\n customerReauthed = true;\n const fresh = await this.opts.customerRefresh.refresh(customerToken!);\n if (fresh) {\n customerToken = fresh;\n log.warn(\"customer 401, refreshed once\", { authKind: o.auth.kind });\n continue;\n }\n }\n throw errorFromResponse(res.status, `${o.method} ${o.path} → 401`, parsed);\n }\n\n // Retry 5xx / 429 — gated on idempotency: a 5xx can arrive AFTER the\n // server committed the write (e.g. placeOrder), so replaying a POST\n // could duplicate orders/charges. GET/PUT/DELETE are idempotent by\n // spec; POST/PATCH retry only when the caller opts in.\n const idempotent =\n o.method === \"GET\" ||\n o.method === \"PUT\" ||\n o.method === \"DELETE\" ||\n o.idempotent === true;\n const retryable = idempotent && (res.status >= 500 || res.status === 429);\n if (retryable && attempt < maxAttempts) {\n // headers.get() yields null when absent — Number(null) is 0, which\n // would short-circuit the exponential branch into a 0ms instant\n // retry. Only a non-empty header value counts.\n const retryAfterHeader = res.headers.get(\"Retry-After\");\n const retryAfter = retryAfterHeader ? Number(retryAfterHeader) : Number.NaN;\n const backoff =\n Number.isFinite(retryAfter) && retryAfter >= 0\n ? Math.min(retryAfter * 1000, 8000) // cap rogue Retry-After (e.g. 86400)\n : Math.min(1000 * 2 ** (attempt - 1), 8000) + Math.random() * 100;\n log.warn(\"retryable failure\", { status: res.status, attempt, backoffMs: backoff });\n await this.sleep(backoff);\n continue;\n }\n\n log.error(\"http error (final)\", { status: res.status, attempt });\n throw errorFromResponse(res.status, `${o.method} ${o.path} → ${res.status}`, parsed);\n }\n }\n\n /**\n * Single-shot fetch that returns the raw {@link Response} unparsed. Used by\n * endpoints whose responses are not JSON (binary downloads, redirect-only\n * endpoints). Skips the retry-on-5xx and 401-reauth-once paths intentionally\n * — those depend on parsing the JSON error body, which a raw consumer must\n * handle itself if needed. Auth resolution + timeout + logging are still\n * applied.\n *\n * `extra.redirect` is forwarded to `fetch` so callers can use `'manual'` to\n * capture 30x responses with their `Location` header (Node fetch exposes\n * the header in this mode; browser fetch returns an opaque response).\n */\n async requestRaw(\n o: RequestOptions,\n extra?: { redirect?: \"follow\" | \"manual\" | \"error\" },\n ): Promise<Response> {\n const requestId = `req-${++requestSeq}`;\n const log = this.opts.logger.child({ requestId });\n const url = new URL(this.opts.host + o.path);\n for (const [k, v] of Object.entries(o.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n const token = await resolveToken(o.auth, this.opts.provider);\n log.debug(\"http requestRaw\", {\n authKind: o.auth.kind,\n method: o.method,\n url: url.pathname,\n redirect: extra?.redirect ?? \"follow\",\n });\n const controller = new AbortController();\n const timer = setTimeout(\n () => controller.abort(),\n o.timeoutMs ?? this.opts.timeouts.readMs,\n );\n const isFormData =\n typeof FormData !== \"undefined\" && o.body instanceof FormData;\n const init: RequestInit = {\n method: o.method,\n headers: this.buildHeaders(o, token, isFormData),\n signal: controller.signal,\n ...(extra?.redirect ? { redirect: extra.redirect } : {}),\n };\n if (o.body !== undefined) {\n init.body = isFormData ? (o.body as FormData) : JSON.stringify(o.body);\n }\n try {\n return await this.doFetch(url, init);\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(\n `${o.method} ${o.path} timed out after ${o.timeoutMs ?? this.opts.timeouts.readMs}ms`,\n );\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n } finally {\n clearTimeout(timer);\n }\n }\n\n /**\n * Open a Server-Sent Events stream (`text/event-stream`) and yield parsed\n * events. Unlike {@link request}, no overall read budget applies (streams are\n * long-lived) — only `connectMs` bounds time-to-headers, and the consumer\n * breaking the iterator aborts the fetch. Like {@link requestRaw}, it does\n * NOT retry or re-auth on 401; a non-2xx maps to a typed error before the\n * stream begins.\n */\n async *requestStream(o: RequestOptions): AsyncIterable<SseEvent> {\n const log = this.opts.logger.child({ requestId: `req-${++requestSeq}` });\n const url = new URL(this.opts.host + o.path);\n for (const [k, v] of Object.entries(o.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n const token = await resolveToken(o.auth, this.opts.provider);\n const controller = new AbortController();\n const connectTimer = setTimeout(() => controller.abort(), this.opts.timeouts.connectMs);\n const headers = this.buildHeaders(o, token, false);\n headers[\"Accept\"] = \"text/event-stream\";\n let res: Response;\n try {\n res = await fetch(url, {\n method: o.method,\n headers,\n signal: controller.signal,\n ...(o.body !== undefined ? { body: JSON.stringify(o.body) } : {}),\n });\n } catch (err) {\n clearTimeout(connectTimer);\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(`${o.method} ${o.path} timed out opening stream`);\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n }\n clearTimeout(connectTimer);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw errorFromResponse(\n res.status,\n `${o.method} ${o.path} → ${res.status}`,\n text ? safeJson(text) : undefined,\n );\n }\n log.debug(\"http stream open\", { status: res.status });\n if (!res.body) return;\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n async function* readChunks(): AsyncIterable<string> {\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n yield decoder.decode(value, { stream: true });\n }\n } finally {\n controller.abort(); // cancel the fetch if the consumer breaks early\n }\n }\n yield* parseSseStream(readChunks());\n }\n}\n","{\n \"name\": \"@viu/emporix-sdk\",\n \"version\": \"4.10.0\",\n \"description\": \"TypeScript SDK for the Emporix Commerce Engine\",\n \"license\": \"MIT\",\n \"author\": {\n \"name\": \"viu\",\n \"url\": \"https://github.com/viuteam\"\n },\n \"homepage\": \"https://github.com/viuteam/emporix-sdk#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/viuteam/emporix-sdk.git\",\n \"directory\": \"packages/sdk\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/viuteam/emporix-sdk/issues\"\n },\n \"keywords\": [\n \"emporix\",\n \"ecommerce\",\n \"commerce\",\n \"sdk\",\n \"typescript\",\n \"storefront\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./customer\": {\n \"types\": \"./dist/customer.d.ts\",\n \"import\": \"./dist/customer.js\",\n \"require\": \"./dist/customer.cjs\"\n },\n \"./product\": {\n \"types\": \"./dist/product.d.ts\",\n \"import\": \"./dist/product.js\",\n \"require\": \"./dist/product.cjs\"\n },\n \"./category\": {\n \"types\": \"./dist/category.d.ts\",\n \"import\": \"./dist/category.js\",\n \"require\": \"./dist/category.cjs\"\n },\n \"./cart\": {\n \"types\": \"./dist/cart.d.ts\",\n \"import\": \"./dist/cart.js\",\n \"require\": \"./dist/cart.cjs\"\n },\n \"./checkout\": {\n \"types\": \"./dist/checkout.d.ts\",\n \"import\": \"./dist/checkout.js\",\n \"require\": \"./dist/checkout.cjs\"\n },\n \"./payment\": {\n \"types\": \"./dist/payment.d.ts\",\n \"import\": \"./dist/payment.js\",\n \"require\": \"./dist/payment.cjs\"\n },\n \"./price\": {\n \"types\": \"./dist/price.d.ts\",\n \"import\": \"./dist/price.js\",\n \"require\": \"./dist/price.cjs\"\n },\n \"./media\": {\n \"types\": \"./dist/media.d.ts\",\n \"import\": \"./dist/media.js\",\n \"require\": \"./dist/media.cjs\"\n },\n \"./segment\": {\n \"types\": \"./dist/segment.d.ts\",\n \"import\": \"./dist/segment.js\",\n \"require\": \"./dist/segment.cjs\"\n },\n \"./companies\": {\n \"types\": \"./dist/companies.d.ts\",\n \"import\": \"./dist/companies.js\",\n \"require\": \"./dist/companies.cjs\"\n },\n \"./contacts\": {\n \"types\": \"./dist/contacts.d.ts\",\n \"import\": \"./dist/contacts.js\",\n \"require\": \"./dist/contacts.cjs\"\n },\n \"./locations\": {\n \"types\": \"./dist/locations.d.ts\",\n \"import\": \"./dist/locations.js\",\n \"require\": \"./dist/locations.cjs\"\n },\n \"./customer-groups\": {\n \"types\": \"./dist/customer-groups.d.ts\",\n \"import\": \"./dist/customer-groups.js\",\n \"require\": \"./dist/customer-groups.cjs\"\n },\n \"./orders\": {\n \"types\": \"./dist/orders.d.ts\",\n \"import\": \"./dist/orders.js\",\n \"require\": \"./dist/orders.cjs\"\n },\n \"./availability\": {\n \"types\": \"./dist/availability.d.ts\",\n \"import\": \"./dist/availability.js\",\n \"require\": \"./dist/availability.cjs\"\n }\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run --coverage\",\n \"lint\": \"eslint src\",\n \"typecheck\": \"tsc --noEmit\",\n \"check:treeshake\": \"node scripts/check-treeshake.mjs\",\n \"fetch:specs\": \"tsx scripts/fetch-specs.ts\",\n \"generate\": \"tsx scripts/generate.ts\"\n },\n \"devDependencies\": {\n \"@hey-api/openapi-ts\": \"^0.97.3\",\n \"@types/node\": \"^24.0.0\",\n \"@typescript-eslint/eslint-plugin\": \"^8.0.0\",\n \"@typescript-eslint/parser\": \"^8.0.0\",\n \"@vitest/coverage-v8\": \"^4.1.12\",\n \"eslint\": \"^9.0.0\",\n \"msw\": \"^2.4.0\",\n \"prettier\": \"^3.3.0\",\n \"tsup\": \"^8.2.0\",\n \"tsx\": \"^4.19.0\",\n \"typescript\": \"^5.6.0\",\n \"vitest\": \"^4.1.12\"\n }\n}\n","import { version } from \"../package.json\";\n\n/**\n * The published `@viu/emporix-sdk` version, surfaced on every log line as\n * `sdkVersion`. Read from `package.json` so it always matches the released\n * package; esbuild inlines the literal at build time (browser-safe — no\n * runtime filesystem access).\n */\nexport const SDK_VERSION: string = version;\n","import { validateConfig, type EmporixConfig, type ResolvedConfig } from \"./config\";\nimport {\n DefaultTokenProvider,\n CustomerRefreshRegistry,\n type TokenProvider,\n type CustomerTokenRefresher,\n} from \"./auth\";\nimport { HttpClient } from \"./http\";\nimport {\n LevelResolver,\n createConsoleLogger,\n createNoopLogger,\n type Logger,\n type LogLevel,\n type ServiceName,\n type LoggerObjectConfig,\n} from \"./logger\";\nimport type { ClientContext } from \"./context\";\nimport { SDK_VERSION } from \"../version\";\n\n/** The service-agnostic core shared by `EmporixClient` and `createEmporixClient`. */\nexport interface EmporixCore {\n readonly tenant: string;\n readonly config: ResolvedConfig;\n readonly tokenProvider: TokenProvider;\n setStorefrontContext(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n language?: string;\n }): void;\n setLogLevel(level: LogLevel, opts?: { service?: ServiceName; force?: boolean }): void;\n getLogLevel(service: ServiceName): LogLevel;\n setCustomerTokenRefresher(refresher: CustomerTokenRefresher | null): void;\n /** Internal: builds a per-service ClientContext (logger child + HttpClient). */\n mk(service: ServiceName): ClientContext;\n}\n\n/** Validates config and assembles the shared infrastructure (no services). */\nexport function createCore(config: EmporixConfig): EmporixCore {\n const cfg = validateConfig(config);\n\n let loggerObj: LoggerObjectConfig = {};\n let baseLogger: Logger | undefined;\n if (cfg.logger === false) {\n baseLogger = createNoopLogger();\n } else if (cfg.logger && typeof (cfg.logger as Logger).child === \"function\") {\n baseLogger = cfg.logger as Logger;\n } else if (cfg.logger) {\n loggerObj = cfg.logger as LoggerObjectConfig;\n }\n const resolver = new LevelResolver(loggerObj);\n const root =\n baseLogger ??\n createConsoleLogger(resolver, {\n sdk: \"emporix\",\n sdkVersion: SDK_VERSION,\n tenant: cfg.tenant,\n });\n\n const tokenProvider: TokenProvider = cfg.tokenProvider ?? new DefaultTokenProvider(cfg);\n const customerRefresh = new CustomerRefreshRegistry();\n const requestContext: { language?: string | undefined } = {\n language: cfg.credentials.storefront?.context?.language,\n };\n\n const mk = (service: ServiceName): ClientContext => ({\n tenant: cfg.tenant,\n tokenProvider,\n logger: root.child({ service }),\n http: new HttpClient({\n host: cfg.host,\n tenant: cfg.tenant,\n provider: tokenProvider,\n logger: root.child({ service: \"http\" }),\n retry: cfg.retry,\n timeouts: cfg.timeouts,\n customerRefresh,\n requestContext,\n // exactOptionalPropertyTypes: `{ fetch: undefined }` is a type error\n // against `fetch?: typeof globalThis.fetch`, so spread conditionally.\n ...(cfg.fetch !== undefined ? { fetch: cfg.fetch } : {}),\n ...(cfg.contentLanguage !== undefined ? { contentLanguage: cfg.contentLanguage } : {}),\n }),\n });\n\n return {\n tenant: cfg.tenant,\n config: cfg,\n tokenProvider,\n mk,\n setStorefrontContext(ctx) {\n if (ctx.language !== undefined) {\n requestContext.language = ctx.language || undefined;\n }\n const { language: _language, ...priceContext } = ctx;\n if (Object.keys(priceContext).length > 0) {\n tokenProvider.setAnonymousContext?.(priceContext);\n }\n },\n setLogLevel(level, opts = {}) {\n resolver.set(level, opts.service, opts.force ?? false);\n },\n getLogLevel(service) {\n return resolver.get(service);\n },\n setCustomerTokenRefresher(refresher) {\n customerRefresh.set(refresher);\n },\n };\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 } from \"../core/context\";\nimport type { AuthContext, AnonymousSession } from \"../core/auth\";\nimport { EmporixAuthError } from \"../core/errors\";\nimport { requireCustomer } from \"../core/require-customer\";\nimport type {\n Customer as GeneratedCustomer,\n Address as GeneratedAddress,\n CustomerSignup,\n CustomerUpdateDto,\n PasswordChangeDto,\n PasswordResetRequestDto,\n PasswordUpdate,\n AddressCreateDto,\n AddressUpdateDto,\n ChangeEmailRequestDto,\n UpdateEmail,\n RefreshToken,\n ValidateTokenResponse,\n} from \"../generated/customer\";\n\n/**\n * Caller-owned customer session. Maps the Emporix `CustomerToken` wire shape to\n * idiomatic names: `access_token` → `customerToken`, `saas_token` →\n * `saasToken`. `saasToken` is a JWT required for the checkout (`saas-token`\n * header). The wire's `*_token` (snake_case) fields are canonical; the\n * camelCase variants are deprecated in the Emporix spec.\n */\nexport interface CustomerSession {\n customerToken: string;\n /** JWT required for completing checkout (sent as the `saas-token` header). */\n saasToken: string;\n refreshToken: string;\n /** Same session as the anonymous token — preserves the cart across login. */\n sessionId: string | undefined;\n /** Customer access-token lifetime in seconds. */\n expiresIn: number | undefined;\n /** Only set by `socialLogin`: the IdP access token echoed by Emporix. */\n socialAccessToken?: string;\n /** Only set by `socialLogin`: the IdP ID token echoed by Emporix. */\n socialIdToken?: string;\n}\n\n/** Customer profile as returned by the Customer service (all generated fields). */\nexport type Customer = GeneratedCustomer;\n\n/** A customer address as returned by the Customer service (all generated fields). */\nexport type Address = GeneratedAddress;\n\n/** Generated request bodies (caller sends the exact wire shape). */\nexport type CustomerSignupInput = CustomerSignup;\nexport type CustomerUpdateInput = CustomerUpdateDto;\nexport type PasswordChangeInput = PasswordChangeDto;\nexport type PasswordResetRequestInput = PasswordResetRequestDto;\nexport type PasswordResetConfirmInput = PasswordUpdate;\nexport type AddressCreateInput = AddressCreateDto;\nexport type AddressUpdateInput = AddressUpdateDto;\nexport type ChangeEmailInput = ChangeEmailRequestDto;\nexport type ConfirmEmailChangeInput = UpdateEmail;\nexport type ResendActivationInput = RefreshToken;\n/**\n * What `validateToken` reports about a customer token: `scope` is the\n * space-separated scope list, plus `sessionId`, `email`, `legalEntityId` and\n * `expires_in`. Every field is optional upstream.\n */\nexport type CustomerTokenValidation = ValidateTokenResponse;\n\n/** Union of the wire shapes the four session endpoints return. snake_case is\n * canonical; camelCase is the deprecated fallback (vendored spec, design §2). */\ninterface WireSession {\n access_token?: string;\n saas_token?: string;\n refresh_token?: string;\n session_id?: string;\n expires_in?: string | number;\n accessToken?: string;\n saasToken?: string;\n refreshToken?: string;\n social_access_token?: string;\n social_id_token?: string;\n}\n\n/** Wire→facade mapping shared by login/refresh/socialLogin/exchangeToken.\n * Throws instead of fabricating an empty session: `customerToken: \"\"` would\n * read as authenticated downstream and 401-loop every subsequent call. */\nfunction toSession(\n endpoint: string,\n wire: WireSession,\n opts: { carrySaasToken?: string } = {},\n): CustomerSession {\n const customerToken = wire.access_token ?? wire.accessToken;\n if (!customerToken) {\n throw new EmporixAuthError(`${endpoint}: response missing access_token`, undefined, wire);\n }\n return {\n customerToken,\n saasToken: wire.saas_token ?? wire.saasToken ?? opts.carrySaasToken ?? \"\",\n refreshToken: wire.refresh_token ?? wire.refreshToken ?? \"\",\n sessionId: wire.session_id,\n expiresIn: wire.expires_in != null ? Number(wire.expires_in) : undefined,\n ...(wire.social_access_token ? { socialAccessToken: wire.social_access_token } : {}),\n ...(wire.social_id_token ? { socialIdToken: wire.social_id_token } : {}),\n };\n}\n\n/** Customer signup, session, profile and addresses. */\nexport class CustomerService {\n static readonly channel = \"customer\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Obtains an anonymous storefront session (accessToken + sessionId + refreshToken). */\n async anonymous(): Promise<AnonymousSession> {\n return this.ctx.tokenProvider.getAnonymousToken();\n }\n\n /** Registers a customer. Default auth: anonymous. */\n async signup(\n input: CustomerSignupInput,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<Customer> {\n return this.ctx.http.request<Customer>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/signup`,\n auth,\n body: input,\n });\n }\n\n /**\n * Logs a customer in. Threads the anonymous token so the session (and its\n * cart) survives — losing it silently creates a new session per Emporix docs.\n * Wire `accessToken` is mapped to `customerToken`.\n */\n async login(\n creds: { email: string; password: string },\n opts: { anonymousToken?: string } = {},\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<CustomerSession> {\n const effective: AuthContext = opts.anonymousToken\n ? { kind: \"raw\", token: opts.anonymousToken }\n : auth;\n const wire = await this.ctx.http.request<WireSession>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/login`,\n auth: effective,\n body: creds,\n });\n return toSession(\"login\", wire);\n }\n\n /**\n * Refreshes an authenticated customer session via its refresh token,\n * preserving the same `sessionId`. Calls\n * `GET /customer/{tenant}/refreshauthtoken?refreshToken=…`, which **must be\n * authorized with an anonymous token** (default auth: anonymous) — not the\n * expired customer token. The refresh response does **not** include a\n * `saas_token`; pass the original `saasToken` to carry it forward (it has\n * its own, independent lifetime).\n */\n async refresh(\n input: { refreshToken: string; saasToken?: string; legalEntityId?: string },\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<CustomerSession> {\n const query: Record<string, string> = { refreshToken: input.refreshToken };\n if (input.legalEntityId) query.legalEntityId = input.legalEntityId;\n const wire = await this.ctx.http.request<WireSession>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/refreshauthtoken`,\n query,\n auth,\n });\n // Refresh does not return a saas_token — carry the original forward.\n return toSession(\n \"refresh\",\n wire,\n input.saasToken !== undefined ? { carrySaasToken: input.saasToken } : {},\n );\n }\n\n /**\n * Logs the customer out server-side: `GET /customer/{tenant}/logout?\n * accessToken=…` authorized with the customer token. Invalidates the\n * access token (204 No Content). Requires customer/raw auth — the token is\n * sent both as the bearer and the `accessToken` query param (per Emporix).\n */\n async logout(auth?: AuthContext): Promise<void> {\n const ctx = requireCustomer(auth);\n const token = (ctx as { token: string }).token;\n await this.ctx.http.request<void>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/logout`,\n query: { accessToken: token },\n auth: ctx,\n });\n }\n\n /**\n * Authorization-Code SSO: exchanges the IdP `code` for an Emporix customer\n * session via `POST /customer/{tenant}/socialLogin`. The browser performs\n * the IdP redirect itself; the SDK only does this Emporix exchange.\n * Default auth: anonymous (Emporix requires an anonymous Bearer). The\n * response has no `session_id` and returns `expires_in` as a string —\n * normalized to a number here.\n */\n async socialLogin(\n input: { code: string; redirectUri: string; codeVerifier?: string; sessionId?: string },\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<CustomerSession> {\n const query: Record<string, string> = {\n code: input.code,\n redirect_uri: input.redirectUri,\n };\n if (input.codeVerifier) query.code_verifier = input.codeVerifier;\n const wire = await this.ctx.http.request<WireSession>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/socialLogin`,\n query,\n auth,\n ...(input.sessionId ? { headers: { \"session-id\": input.sessionId } } : {}),\n });\n return toSession(\"socialLogin\", wire);\n }\n\n /**\n * RFC 8693 token exchange: exchanges an external IdP JWT for an Emporix\n * customer session via `POST /customer/{tenant}/exchangeauthtoken`.\n * Emporix uses a proprietary query-param wire (not the RFC form body).\n * Default auth: anonymous. `config` selects a site-specific IdP config\n * (multi-site); omit for the tenant default. Returns `session_id` and a\n * fresh `saas_token`; `expires_in` is an integer (normalized anyway).\n */\n async exchangeToken(\n input: { subjectToken: string; config?: string },\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<CustomerSession> {\n const query: Record<string, string> = { subjectAccessToken: input.subjectToken };\n if (input.config) query.config = input.config;\n const wire = await this.ctx.http.request<WireSession>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/exchangeauthtoken`,\n query,\n auth,\n });\n return toSession(\"exchangeToken\", wire);\n }\n\n /** Returns the authenticated customer. Requires customer/raw auth. */\n async me(auth?: AuthContext): Promise<Customer> {\n return this.ctx.http.request<Customer>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/me`,\n auth: requireCustomer(auth),\n });\n }\n\n /**\n * Validates a customer token and returns what the tenant knows about it —\n * `scope`, `sessionId`, `email`, `legalEntityId`, `expires_in`\n * (`GET /validateauthtoken`). Requires customer/raw auth.\n *\n * An invalid or expired token answers `401`, which surfaces as\n * {@link EmporixAuthError} rather than a falsy result: this is a check, not a\n * predicate. Reach for it when you hold a token from elsewhere — an SSO\n * exchange, a Managed Dashboard host — and need its scopes before deciding\n * what to render, instead of discovering them from a failed call.\n */\n async validateToken(auth?: AuthContext): Promise<CustomerTokenValidation> {\n return this.ctx.http.request<CustomerTokenValidation>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/validateauthtoken`,\n auth: requireCustomer(auth),\n });\n }\n\n /** Updates the authenticated customer. Requires customer/raw auth. */\n async update(patch: CustomerUpdateInput, auth?: AuthContext): Promise<Customer> {\n return this.ctx.http.request<Customer>({\n method: \"PUT\",\n path: `/customer/${this.ctx.tenant}/me`,\n auth: requireCustomer(auth),\n body: patch,\n });\n }\n\n /** Changes the password. Requires customer/raw auth. */\n async changePassword(input: PasswordChangeInput, auth?: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/password/change`,\n auth: requireCustomer(auth),\n body: input,\n });\n }\n\n /** Requests a password reset email. Default auth: anonymous. */\n async requestPasswordReset(\n input: PasswordResetRequestInput,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/password/reset`,\n auth,\n body: input,\n });\n }\n\n /** Confirms a password reset. Default auth: anonymous. */\n async confirmPasswordReset(\n input: PasswordResetConfirmInput,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/password/reset/update`,\n auth,\n body: input,\n });\n }\n\n /**\n * Completes double opt-in signup with the emailed token, creating the account\n * and returning a logged-in {@link CustomerSession}. Default auth: anonymous.\n */\n async confirmSignup(\n token: string,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<CustomerSession> {\n const wire = await this.ctx.http.request<WireSession>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/signup/optin/${encodeURIComponent(token)}`,\n auth,\n });\n return toSession(\"confirmSignup\", wire);\n }\n\n /** Resends the double opt-in activation link. Default auth: anonymous. */\n async resendActivation(\n input: ResendActivationInput,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/signup/optin/refresh_token`,\n auth,\n body: input,\n });\n }\n\n /** Requests a login-email change (emails a confirmation token). Requires customer/raw auth. */\n async changeEmail(input: ChangeEmailInput, auth?: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/me/accounts/internal/email/change`,\n auth: requireCustomer(auth),\n body: input,\n });\n }\n\n /** Confirms a login-email change with the emailed token. Default auth: anonymous. */\n async confirmEmailChange(\n input: ConfirmEmailChangeInput,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/me/accounts/internal/email/change/confirm`,\n auth,\n body: input,\n });\n }\n\n /** Address sub-resource. All operations require customer/raw auth. */\n readonly addresses = {\n list: async (auth?: AuthContext): Promise<Address[]> =>\n this.ctx.http.request<Address[]>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/me/addresses`,\n auth: requireCustomer(auth),\n }),\n add: async (address: AddressCreateInput, auth?: AuthContext): Promise<Address> =>\n this.ctx.http.request<Address>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/me/addresses`,\n auth: requireCustomer(auth),\n body: address,\n }),\n update: async (id: string, patch: AddressUpdateInput, auth?: AuthContext): Promise<Address> =>\n this.ctx.http.request<Address>({\n method: \"PUT\",\n path: `/customer/${this.ctx.tenant}/me/addresses/${id}`,\n auth: requireCustomer(auth),\n body: patch,\n }),\n remove: async (id: string, auth?: AuthContext): Promise<void> =>\n this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/customer/${this.ctx.tenant}/me/addresses/${id}`,\n auth: requireCustomer(auth),\n }),\n get: async (id: string, auth?: AuthContext): Promise<Address> =>\n this.ctx.http.request<Address>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/me/addresses/${id}`,\n auth: requireCustomer(auth),\n }),\n addTags: async (id: string, tags: string[], auth?: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/me/addresses/${id}/tags`,\n query: { tags: tags.join(\",\") },\n auth: requireCustomer(auth),\n });\n },\n removeTags: async (id: string, tags: string[], auth?: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/customer/${this.ctx.tenant}/me/addresses/${id}/tags`,\n query: { tags: tags.join(\",\") },\n auth: requireCustomer(auth),\n });\n },\n };\n}\n","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 {\n BasicProductWithId,\n BundleProductWithId,\n ParentVariantProductWithId,\n VariantProductWithId,\n DynamicVariantProductWithId,\n ProductMedia,\n ProductCreateBody,\n ProductUpdateBody,\n ProductPartialUpdateBody,\n ProductBulkCreateBody,\n ProductBulkUpdateBody,\n BulkResponse,\n ResourceLocation,\n DynamicVariantRecalculationRequest,\n DynamicVariantRecalculationResponse,\n DynamicVariantRecalculationJobResponse,\n DynamicVariantRecalculationJobStatus,\n ProductTemplateResponse,\n ProductTemplateCreation,\n ProductTemplateUpdate,\n} from \"../generated/product\";\n\nconst ANON: AuthContext = { kind: \"anonymous\" };\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** A product as returned by the Product service (all generated fields). */\nexport type Product =\n | BasicProductWithId\n | BundleProductWithId\n | ParentVariantProductWithId\n | ProductVariant;\n\n/**\n * A product below a parent: a `VARIANT` of a `PARENT_VARIANT` (`parentVariantId`),\n * or a `DYNAMIC_VARIANT` of any level (`parentVariantId` is the direct parent,\n * `parentVariantPath` lists every ancestor up to the root).\n */\nexport type ProductVariant = VariantProductWithId | DynamicVariantProductWithId;\n\n/** A single product media entry (generated; `ProductMedia` is the list type). */\nexport type Media = ProductMedia[number];\n\n/** Body for creating a product (`POST /products`) — any of the 5 product shapes. */\nexport type ProductCreateInput = ProductCreateBody;\n\n/** Body for a full product replace (`PUT /products/{id}`). */\nexport type ProductUpdateInput = ProductUpdateBody;\n\n/** Body for a partial product update (`PATCH /products/{id}`). */\nexport type ProductPatchInput = ProductPartialUpdateBody;\n\n/** Id/location envelope returned when a product is created. */\nexport type ProductCreated = ResourceLocation;\n\n/** Body for bulk-creating products (`POST /products/bulk`). */\nexport type ProductBulkCreateInput = ProductBulkCreateBody;\n\n/** Body for bulk-updating products (`PUT /products/bulk`). */\nexport type ProductBulkUpdateInput = ProductBulkUpdateBody;\n\n/** Per-entry result of a bulk product operation (207 Multi-Status). */\nexport type ProductBulkResult = BulkResponse;\n\n/** Body for triggering a dynamic-variant recalculation. */\nexport type ProductRecalculationInput = DynamicVariantRecalculationRequest;\n\n/** Result of triggering a recalculation — created jobs plus skipped product ids. */\nexport type ProductRecalculationResult = DynamicVariantRecalculationResponse;\n\n/** A dynamic-variant recalculation job. */\nexport type ProductRecalculationJob = DynamicVariantRecalculationJobResponse;\n\n/** Status of a recalculation job. */\nexport type ProductRecalculationJobStatus = DynamicVariantRecalculationJobStatus;\n\n/** A product template as returned by the Product service. */\nexport type ProductTemplate = ProductTemplateResponse;\n\n/** Body for creating a product template. */\nexport type ProductTemplateCreateInput = ProductTemplateCreation;\n\n/** Body for updating a product template (`PUT`, full replace). */\nexport type ProductTemplateUpdateInput = ProductTemplateUpdate;\n\n/** Id envelope returned when a product template is created. */\nexport type ProductTemplateCreated = { id?: string };\n\n/** Options shared by the product write endpoints. */\nexport interface ProductWriteOptions {\n skipVariantGeneration?: boolean;\n doIndex?: boolean;\n skipRelatedItemsValidation?: boolean;\n /**\n * `Content-Language` for this call, overriding `EmporixConfig.contentLanguage`:\n * `\"*\"` when `name`, `description` and the other localized fields are maps of\n * translations, a language code such as `\"de\"` when they are plain strings.\n */\n contentLanguage?: string;\n}\n\n/** Catalog reads. Default auth: anonymous; pass customer for personalized pricing. */\nexport class ProductService {\n static readonly channel = \"product\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Fetches one product by id. */\n async get(productId: string, auth?: AuthContext): Promise<Product>;\n /** @deprecated The second parameter is unused — pass the auth context second: `get(id, auth)`. */\n async get(productId: string, opts: Record<string, never> | undefined, auth?: AuthContext): Promise<Product>;\n async get(\n productId: string,\n authOrOpts?: AuthContext | Record<string, never>,\n legacyAuth?: AuthContext,\n ): Promise<Product> {\n // The legacy options slot is `{}` or `undefined`; an auth context always has a `kind`.\n const auth =\n legacyAuth ?? (authOrOpts !== undefined && \"kind\" in authOrOpts ? (authOrOpts as AuthContext) : ANON);\n return this.ctx.http.request<Product>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products/${productId}`,\n auth,\n });\n }\n\n /** Fetches one product by its code. */\n async getByCode(code: string, auth: AuthContext = ANON): Promise<Product> {\n const rows = await this.ctx.http.request<Product[]>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products`,\n query: { q: `code:${code}` },\n auth,\n });\n const first = rows[0];\n if (!first) throw new Error(`No product with code \"${code}\"`);\n return first;\n }\n\n /** One page of products. */\n async list(\n params: { pageNumber?: number; pageSize?: number; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Product>> {\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Product>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products`,\n query: { 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 product across pages. */\n listAll(params: { pageSize?: number } = {}, auth: AuthContext = ANON): AsyncIterable<Product> {\n const pageSize = params.pageSize ?? 50;\n return iterateAll<Product>((pageNumber) => this.list({ pageNumber, pageSize }, auth));\n }\n\n /**\n * Searches products by a `q` filter — a raw Emporix DSL string or a built\n * filter (e.g. `@viu/emporix-mixins`' `mixinQuery(...)`). Product supports\n * `compoundLogicalQuery`, so `or()` filters are allowed.\n */\n async search(\n query: QueryFor<\"PRODUCT\">,\n params: { pageNumber?: number; pageSize?: number; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Product>> {\n const q = resolveQuery(query, { compoundLogicalQuery: true });\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Product>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products`,\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 /**\n * Free-text product search by name. The product `q` is a `field:value` DSL,\n * so a bare term (e.g. \"in time\") 400s with \"No value for key …\". This builds\n * a `name:(~<term>)` regex filter (regex metacharacters escaped) and delegates\n * to {@link search}.\n *\n * Safe for text a shopper typed: `( ) \"` are **removed** rather than escaped,\n * because Emporix parses the filter's own structure before it looks at the\n * regex. `name:(~a \\()` is rejected with «Missing closing parenthesis in value»\n * even though the paren is escaped, so a search box would 400 on an opening\n * bracket. Measured against a live tenant on 2026-08-03: of every regex\n * metacharacter only those three break; the rest survive escaping.\n *\n * A query consisting solely of those characters leaves nothing to search for and\n * returns an empty page without a request — `name:(~)` is a 400.\n */\n async searchByName(\n query: string,\n // Makes no request of its own — `totalCount` is here purely so it can be\n // forwarded to `search`, which is where the header actually gets sent.\n params: { pageNumber?: number; pageSize?: number; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Product>> {\n // Replaced by a space rather than dropped, so «Access(JIT)» does not become\n // one run-together word — and then collapsed, because a leftover double space\n // is two LITERAL spaces in the regex and would match nothing.\n const term = query\n .replace(/[()\"]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (term === \"\") {\n // Defaults mirror `search`, so the shape matches a real answer.\n return {\n items: [],\n pageNumber: params.pageNumber ?? 1,\n pageSize: params.pageSize ?? 50,\n hasNextPage: false,\n };\n }\n const escaped = term.replace(/[.*+?^${}|[\\]\\\\]/g, \"\\\\$&\");\n return this.search(`name:(~${escaped})`, params, auth);\n }\n\n /**\n * Bulk fetch by id. POSTs `/products/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<Product[]> {\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<Product[]>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products/search`,\n query: { pageSize: chunk.length },\n auth,\n body: { q: `id:(${chunk.join(\",\")})` },\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n }),\n ),\n );\n return pages.flat();\n }\n\n /**\n * Bulk fetch by code. POSTs `/products/search` with `q=\"code:(c1,c2,…)\"`,\n * chunking when the list is larger than `options.chunkSize` (default 100).\n * Duplicate codes are de-duplicated. Codes containing query-delimiter\n * characters (`(`, `)`, `,`, whitespace, `\"`) are dropped with a logged\n * warning, because the Emporix `q` syntax uses them as delimiters and does\n * not support escaping them in a plain IN-list. An empty list — or one with\n * no safe codes — short-circuits with no HTTP call. **Order is not\n * guaranteed** across chunks — re-index by `code` if order matters.\n */\n async searchByCodes(\n codes: string[],\n options: { chunkSize?: number } = {},\n auth: AuthContext = ANON,\n ): Promise<Product[]> {\n const unique = [...new Set(codes)];\n const unsafe = /[(),\"\\s]/;\n const safe = unique.filter((c) => !unsafe.test(c));\n const dropped = unique.filter((c) => unsafe.test(c));\n if (dropped.length > 0) {\n this.ctx.logger.warn(\n \"products.searchByCodes: dropped codes containing query-delimiter characters\",\n { dropped },\n );\n }\n if (safe.length === 0) return [];\n const chunkSize = options.chunkSize ?? 100;\n const chunks: string[][] = [];\n for (let i = 0; i < safe.length; i += chunkSize) {\n chunks.push(safe.slice(i, i + chunkSize));\n }\n const pages = await Promise.all(\n chunks.map((chunk) =>\n this.ctx.http.request<Product[]>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products/search`,\n query: { pageSize: chunk.length },\n auth,\n body: { q: `code:(${chunk.join(\",\")})` },\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n }),\n ),\n );\n return pages.flat();\n }\n\n /**\n * Streams the variants below a product, page by page, in two searches: the\n * VARIANT children of a PARENT_VARIANT (`productType:VARIANT\n * parentVariantId:<id>`), then the DYNAMIC_VARIANT descendants of every level\n * (`parentVariantPath:<id>` — every ancestor is in the path). Only one of the\n * two finds anything for a given product. Default pageSize 200. The query\n * syntax (space-separated fields = implicit AND) is encapsulated here so\n * consumers don't build it themselves.\n */\n async *listVariantChildrenAll(\n parentVariantId: string,\n params: { pageSize?: number } = {},\n auth: AuthContext = ANON,\n ): AsyncIterable<ProductVariant> {\n const pageSize = params.pageSize ?? 200;\n for (const q of [\n `productType:VARIANT parentVariantId:${parentVariantId}`,\n `parentVariantPath:${parentVariantId}`,\n ]) {\n // Both queries can only match variants.\n yield* iterateAll((pageNumber) =>\n this.search(q, { pageNumber, pageSize }, auth) as Promise<PaginatedItems<ProductVariant>>,\n );\n }\n }\n\n /**\n * Resolves every variant below a product into a flat array (loads every\n * page): the VARIANT children of a PARENT_VARIANT, or the DYNAMIC_VARIANT\n * descendants of all levels — tell them apart by `parentVariantId` (the\n * direct parent) or pick the purchasable ones by `sellable`. Default pageSize\n * 200. Returns `[]` when there are none — never throws.\n */\n async listVariantChildren(\n parentVariantId: string,\n params: { pageSize?: number } = {},\n auth: AuthContext = ANON,\n ): Promise<ProductVariant[]> {\n const out: ProductVariant[] = [];\n for await (const child of this.listVariantChildrenAll(parentVariantId, params, auth)) {\n out.push(child);\n }\n return out;\n }\n\n // --- Admin writes. Default auth: service. ---\n\n /**\n * Creates a product (`POST /products`). Default auth: service. Accepts any of\n * the five product shapes (basic, bundle, parent-variant, variant,\n * dynamic-variant).\n */\n async create(\n input: ProductCreateInput,\n options: ProductWriteOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ProductCreated> {\n const query = {\n ...(options.skipVariantGeneration === undefined ? {} : { skipVariantGeneration: String(options.skipVariantGeneration) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n ...(options.skipRelatedItemsValidation === undefined ? {} : { skipRelatedItemsValidation: String(options.skipRelatedItemsValidation) }),\n };\n return this.ctx.http.request<ProductCreated>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Partially updates a product (`PATCH /products/{productId}`). Default auth:\n * service. Use {@link replace} for a full replace (PUT).\n *\n * Omitted fields stay as they are. **Mixins merge rather than replace**, and\n * the corollary catches people out: there is no way to delete a mixin here.\n * - a mixin name you omit stays on the product;\n * - fields you send inside a mixin are merged recursively, and fields you\n * omit inside that mixin keep their values;\n * - `null` does **not** delete a mixin — it stores `null` as its value.\n *\n * To actually remove one, read the product and send it back through\n * {@link replace} with `partial: false`, leaving the mixin out of both\n * `mixins` and `metadata.mixins`.\n *\n * Despite the HTTP verb this is **not** a JSON-Patch endpoint: an op-array of\n * `{ op, path, value }` is rejected. Send a partial product document.\n */\n async update(\n productId: string,\n input: ProductPatchInput,\n options: ProductWriteOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n const query = {\n ...(options.skipVariantGeneration === undefined ? {} : { skipVariantGeneration: String(options.skipVariantGeneration) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n ...(options.skipRelatedItemsValidation === undefined ? {} : { skipRelatedItemsValidation: String(options.skipRelatedItemsValidation) }),\n };\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/product/${this.ctx.tenant}/products/${productId}`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Full-replaces a product (`PUT /products/{productId}`). Returns the created\n * resource on 201 (upsert) and nothing on 204. `options.partial` sends\n * `?partial=true` for a merge-style replace. Default auth: service.\n *\n * With `partial: false` (the default) the body must be the **complete**\n * product document, and any mixin name missing from it is removed — which is\n * what makes this the only way to delete a mixin, since {@link update} merges\n * them. The flip side is that a body you did not build from a fresh read will\n * silently drop mixins.\n */\n async replace(\n productId: string,\n input: ProductUpdateInput,\n options: ProductWriteOptions & { partial?: boolean } = {},\n auth: AuthContext = SERVICE,\n ): Promise<ProductCreated | void> {\n const query = {\n ...(options.partial === undefined ? {} : { partial: String(options.partial) }),\n ...(options.skipVariantGeneration === undefined ? {} : { skipVariantGeneration: String(options.skipVariantGeneration) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n ...(options.skipRelatedItemsValidation === undefined ? {} : { skipRelatedItemsValidation: String(options.skipRelatedItemsValidation) }),\n };\n return this.ctx.http.request<ProductCreated | void>({\n method: \"PUT\",\n path: `/product/${this.ctx.tenant}/products/${productId}`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Deletes a product (`DELETE /products/{productId}`). `options.force` deletes\n * even when the product is referenced. Default auth: service.\n */\n async delete(\n productId: string,\n options: { force?: boolean; doIndex?: boolean } = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n const query = {\n ...(options.force === undefined ? {} : { force: String(options.force) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n };\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/product/${this.ctx.tenant}/products/${productId}`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n auth,\n });\n }\n\n /**\n * Bulk-creates products (`POST /products/bulk`). Responds 207 Multi-Status:\n * partial failures do **not** throw — inspect each entry. Default auth: service.\n */\n async bulkCreate(\n input: ProductBulkCreateInput,\n options: ProductWriteOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ProductBulkResult[]> {\n const query = {\n ...(options.skipVariantGeneration === undefined ? {} : { skipVariantGeneration: String(options.skipVariantGeneration) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n ...(options.skipRelatedItemsValidation === undefined ? {} : { skipRelatedItemsValidation: String(options.skipRelatedItemsValidation) }),\n };\n return this.ctx.http.request<ProductBulkResult[]>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products/bulk`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Bulk-updates products (`PUT /products/bulk`). Responds 207 Multi-Status:\n * partial failures do **not** throw — inspect each entry. Default auth: service.\n */\n async bulkUpdate(\n input: ProductBulkUpdateInput,\n options: ProductWriteOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ProductBulkResult[]> {\n const query = {\n ...(options.skipVariantGeneration === undefined ? {} : { skipVariantGeneration: String(options.skipVariantGeneration) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n ...(options.skipRelatedItemsValidation === undefined ? {} : { skipRelatedItemsValidation: String(options.skipRelatedItemsValidation) }),\n };\n return this.ctx.http.request<ProductBulkResult[]>({\n method: \"PUT\",\n path: `/product/${this.ctx.tenant}/products/bulk`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Triggers a dynamic-variant recalculation for the given product ids\n * (`POST /products/recalculate`, 202). The result carries the created or\n * already-referenced `jobs` plus `skippedProductIds` — products whose root\n * already has a PENDING/PROCESSING job. Default auth: service.\n */\n async recalculate(\n input: ProductRecalculationInput,\n auth: AuthContext = SERVICE,\n ): Promise<ProductRecalculationResult> {\n return this.ctx.http.request<ProductRecalculationResult>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products/recalculate`,\n body: input,\n auth,\n });\n }\n\n /** Lists dynamic-variant recalculation jobs, optionally filtered by status. Default auth: anonymous. */\n async listRecalculationJobs(\n params: { status?: ProductRecalculationJobStatus } = {},\n auth: AuthContext = ANON,\n ): Promise<ProductRecalculationJob[]> {\n return this.ctx.http.request<ProductRecalculationJob[]>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products/recalculate/jobs`,\n ...(params.status === undefined ? {} : { query: { status: params.status } }),\n auth,\n });\n }\n\n /** Fetches one dynamic-variant recalculation job by id. Default auth: anonymous. */\n async getRecalculationJob(jobId: string, auth: AuthContext = ANON): Promise<ProductRecalculationJob> {\n return this.ctx.http.request<ProductRecalculationJob>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products/recalculate/jobs/${jobId}`,\n auth,\n });\n }\n\n /**\n * Product templates (`/product-templates`). Reads default to anonymous,\n * writes to service auth.\n */\n readonly templates = {\n /** One page of product templates. Default auth: anonymous. */\n list: async (\n params: { pageNumber?: number; pageSize?: number; sort?: string; q?: string } = {},\n auth: AuthContext = ANON,\n ): Promise<ProductTemplate[]> =>\n this.ctx.http.request<ProductTemplate[]>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/product-templates`,\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.q === undefined ? {} : { q: params.q }),\n },\n auth,\n }),\n\n /** Fetches one product template by id. Default auth: anonymous. */\n get: async (templateId: string, auth: AuthContext = ANON): Promise<ProductTemplate> =>\n this.ctx.http.request<ProductTemplate>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/product-templates/${templateId}`,\n auth,\n }),\n\n /** Creates a product template. Default auth: service. */\n create: async (\n input: ProductTemplateCreateInput,\n auth: AuthContext = SERVICE,\n ): Promise<ProductTemplateCreated> =>\n this.ctx.http.request<ProductTemplateCreated>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/product-templates`,\n body: input,\n auth,\n }),\n\n /** Full-replaces a product template (`PUT`). Default auth: service. */\n update: async (\n templateId: string,\n input: ProductTemplateUpdateInput,\n auth: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `/product/${this.ctx.tenant}/product-templates/${templateId}`,\n body: input,\n auth,\n });\n },\n\n /** Deletes a product template. Default auth: service. */\n delete: async (templateId: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/product/${this.ctx.tenant}/product-templates/${templateId}`,\n auth,\n });\n },\n };\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 GetCategoryTreeRetrieveCategoryTreeData,\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/** Filters for listing category trees (`GET /category-trees`). */\nexport type CategoryTreeListParams = NonNullable<GetCategoryTreeRetrieveCategoryTreeData[\"query\"]>;\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 * To filter by category type, category ids or publication, use {@link listTrees}.\n */\n async tree(auth: AuthContext = ANON): Promise<CategoryNode[]> {\n return this.listTrees({}, auth);\n }\n\n /**\n * The category trees, filtered (`GET /category-trees`). Default auth: anonymous.\n * {@link tree} is this call without filters.\n *\n * - `categoryIds` goes out comma-joined, because the HTTP layer sends one value\n * per key. Emporix reads `a,b` like the repeated `categoryIds=a&categoryIds=b`;\n * both were probed on `viu` on 2026-10-27. An empty list matches nothing and\n * sends no request.\n * - `showUnpublished` needs `category.category_read_unpublished`. An anonymous\n * token does not carry it, and Emporix answers **403**.\n * - Filter by `type` with care. On `viu` on 2026-10-27, 27 trees built from\n * categories that all read `STANDARD` came back for neither `STANDARD` nor\n * `CLASSIFICATION`, only unfiltered.\n */\n async listTrees(\n params: CategoryTreeListParams = {},\n auth: AuthContext = ANON,\n ): Promise<CategoryNode[]> {\n if (params.categoryIds?.length === 0) return [];\n return this.ctx.http.request<CategoryNode[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/category-trees`,\n query: {\n type: params.type,\n categoryIds: params.categoryIds?.join(\",\"),\n showUnpublished: params.showUnpublished,\n },\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","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError, EmporixValidationError, errorFromResponse } from \"../core/errors\";\nimport type {\n Cart as GeneratedCart,\n CreateCart,\n CreatedCart,\n CartItemRequest,\n UpdateCartItem,\n AddressRequest,\n AppliedDiscount,\n BatchResponse as GeneratedBatchResponse,\n SingleBatchResponse as GeneratedSingleBatchResponse,\n CartValidationResult as GeneratedCartValidationResult,\n CartItemResponse,\n CartItemsBatchUpdateRequest,\n CartItemsBatchUpdateResponse,\n Search,\n CartGetAll,\n UpdateCart,\n DiscountResponse,\n CartDtRestrictions,\n Discount,\n ExecuteCommand,\n ExecuteCommandResult,\n ExecuteResponse,\n PostCartExecuteData,\n} from \"../generated/cart\";\n\n/** A cart as returned by the Cart service (all generated fields). */\nexport type Cart = GeneratedCart;\n\n/** The cart-create response (`{ cartId, yrn }`, generated). */\nexport type CartCreated = CreatedCart;\n\n/** Generated request bodies (caller sends the exact wire shape). */\nexport type CreateCartInput = CreateCart;\nexport type CartItemInput = CartItemRequest;\nexport type CartItemUpdate = UpdateCartItem;\n\n/** Per-entry result of `addItemsBatch`. `status` is HTTP-style per entry (e.g. 201 = added, 4xx = failed). */\nexport type CartItemBatchEntry = GeneratedSingleBatchResponse;\n/** Response shape of `addItemsBatch` — one entry per input item, matching by `index`. */\nexport type CartItemsBatchResponse = GeneratedBatchResponse;\n\n/** An address payload for cart shipping/billing (generated). */\nexport type CartAddress = AddressRequest;\n\n/** Result of validating a cart's items (generated). */\nexport type CartValidationResult = GeneratedCartValidationResult;\n\n/** A single cart item as returned by the Cart service (generated). */\nexport type CartItem = CartItemResponse;\n\n/** Request body for updating multiple cart items (generated). */\nexport type CartItemsBatchUpdateInput = CartItemsBatchUpdateRequest;\n\n/** Per-entry response for a multi-item update (generated). */\nexport type CartItemsBatchUpdateResult = CartItemsBatchUpdateResponse;\n\n/** Body for searching carts (`POST /carts/search`) — a `q` filter. */\nexport type CartSearchInput = Search;\n\n/** A cart summary as returned by `POST /carts/search`. */\nexport type CartSummary = CartGetAll;\n\n/** Body for a full cart update (`PUT /carts/{id}`). */\nexport type CartUpdateInput = UpdateCart;\n\n/** A discount entry as returned by `GET /carts/{id}/discounts`. */\nexport type CartDiscount = DiscountResponse;\n\n/** Lead-time and non-delivery-time restrictions for a cart (`GET …/dtRestrictions`). */\nexport type CartDeliveryRestrictions = CartDtRestrictions;\n\n/** Body for applying a discount (`POST /carts/{id}/discounts`, generated). */\nexport type CartDiscountInput = Discount;\n\n/**\n * Request body per command type of {@link CartService.execute}. The spec states\n * this only in prose — its `data` is an untyped object — so it is the one\n * hand-written piece. A command type missing here (one Emporix adds after this\n * was written) keeps the spec's untyped `data` and still works.\n */\nexport interface CartCommandBodies {\n AddCartItem: CartItemInput;\n UpdateCartItem: CartItemUpdate;\n AddCartItemsBatch: CartItemInput[];\n UpdateCartItemsBatch: CartItemsBatchUpdateInput;\n UpdateCart: CartUpdateInput;\n ApplyCartDiscount: CartDiscountInput;\n}\n\n/**\n * One command of a {@link CartService.execute} chain: `type` picks the REST\n * operation, `data` is that operation's request body, `options` holds its\n * remaining path and query parameters (`itemId`, `partial`, `expandCalculation`,\n * `zipCode`, `countryCode`, `resourceVersion`, `codes`, `discountIndex`). The\n * cart id is the `execute` path parameter, never a command field.\n *\n * `options` is the generated type, where every field is optional: `itemId`\n * (`UpdateCartItem`, `DeleteCartItem`) and `discountIndex` (`DeleteCartDiscount`)\n * are required by the server, which reports a missing one on that command.\n */\nexport type CartCommand = {\n [T in ExecuteCommand[\"type\"]]: Omit<ExecuteCommand, \"type\" | \"data\"> & { type: T } &\n (T extends keyof CartCommandBodies ? { data: CartCommandBodies[T] } : Pick<ExecuteCommand, \"data\">);\n}[ExecuteCommand[\"type\"]];\n\n/** `onError` and `versioning` of {@link CartService.execute} — both query parameters (generated). */\nexport type CartExecuteOptions = NonNullable<PostCartExecuteData[\"query\"]>;\n\n/** The `207` body of {@link CartService.execute}: one result per command that ran, in order (generated). */\nexport type CartExecuteResult = ExecuteResponse;\n\n/**\n * One entry of {@link CartExecuteResult}`.results`: `code`/`status` of the\n * equivalent REST call, and as `data` its response body — or its error body\n * when `code` is not 2xx; absent for a 204 (generated).\n */\nexport type CartCommandResult = ExecuteCommandResult;\n\nfunction requireCartAuth(auth: AuthContext | undefined): AuthContext {\n if (auth && (auth.kind === \"customer\" || auth.kind === \"anonymous\")) return auth;\n throw new EmporixValidationError(\n \"CartService requires an explicit { kind: 'customer' } or { kind: 'anonymous' } AuthContext\",\n );\n}\n\nfunction requireCustomerAuth(auth: AuthContext | undefined): AuthContext {\n if (auth && auth.kind === \"customer\") return auth;\n throw new EmporixValidationError(\"cart.merge requires a { kind: 'customer' } AuthContext\");\n}\n\n/** Cart operations. Every method requires an explicit customer/anonymous context. */\nexport class CartService {\n static readonly channel = \"cart\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/cart/${this.ctx.tenant}/carts`;\n }\n\n /** Creates a cart. */\n async create(\n input: CreateCartInput | undefined,\n auth: AuthContext,\n ): Promise<CartCreated> {\n return this.ctx.http.request<CartCreated>({\n method: \"POST\",\n path: this.base(),\n auth: requireCartAuth(auth),\n body: input ?? {},\n });\n }\n\n /** Fetches a cart by id. */\n async get(cartId: string, auth: AuthContext): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"GET\",\n path: `${this.base()}/${cartId}`,\n auth: requireCartAuth(auth),\n });\n }\n\n /** Returns the current cart for the session, or null if none. */\n /**\n * Get the customer / anonymous cart matching the given criteria. Per Emporix:\n * uniqueness is defined by `siteCode` + `type` + `legalEntityId` +\n * (`customerId` derived from a customer token, or `sessionId` derived from an\n * anonymous token). With `create: true`, Emporix creates a new cart if none\n * matches.\n *\n * Returns `null` on 404 (no cart found and `create` was not set). All other\n * errors are propagated.\n */\n async getCurrent(\n auth: AuthContext,\n opts: { siteCode: string; type?: string; legalEntityId?: string; create?: boolean },\n ): Promise<Cart | null> {\n const query: Record<string, string | number> = { siteCode: opts.siteCode };\n if (opts.type !== undefined) query.type = opts.type;\n if (opts.legalEntityId !== undefined) query.legalEntityId = opts.legalEntityId;\n if (opts.create) query.create = \"true\";\n try {\n return await this.ctx.http.request<Cart>({\n method: \"GET\",\n path: this.base(),\n query,\n auth: requireCartAuth(auth),\n });\n } catch (e) {\n if (e instanceof EmporixNotFoundError) return null;\n throw e;\n }\n }\n\n /** Adds an item. */\n async addItem(\n cartId: string,\n item: CartItemInput,\n auth: AuthContext,\n ): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"POST\",\n path: `${this.base()}/${cartId}/items`,\n auth: requireCartAuth(auth),\n body: item,\n });\n }\n\n /**\n * Adds multiple items in a single request via `POST /carts/{id}/itemsBatch`.\n * Server-side limit is 200 entries per call — callers handling larger sets\n * must chunk. The response carries a per-entry `status` (HTTP-style: 201\n * for added, 4xx/5xx for failed) and `index` matching the input position;\n * partial failures do **not** throw — inspect `status` per entry.\n */\n async addItemsBatch(\n cartId: string,\n items: CartItemInput[],\n auth: AuthContext,\n ): Promise<CartItemsBatchResponse> {\n return this.ctx.http.request<CartItemsBatchResponse>({\n method: \"POST\",\n path: `${this.base()}/${cartId}/itemsBatch`,\n auth: requireCartAuth(auth),\n body: items,\n });\n }\n\n /**\n * Updates an item. By default this is a **full replace** — the server expects\n * the complete item (e.g. `itemYrn` + the `price` row). Pass\n * `{ partial: true }` to send a **partial update** (`?partial=true`), e.g. a\n * quantity-only change with just `{ quantity }`.\n */\n async updateItem(\n cartId: string,\n itemId: string,\n patch: CartItemUpdate,\n auth: AuthContext,\n opts: { partial?: boolean } = {},\n ): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}/items/${itemId}`,\n auth: requireCartAuth(auth),\n body: patch,\n ...(opts.partial ? { query: { partial: \"true\" } } : {}),\n });\n }\n\n /** Removes an item. */\n async removeItem(cartId: string, itemId: string, auth: AuthContext): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}/items/${itemId}`,\n auth: requireCartAuth(auth),\n });\n }\n\n /** Empties the cart. */\n async clear(cartId: string, auth: AuthContext): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}/items`,\n auth: requireCartAuth(auth),\n });\n }\n\n /**\n * Applies a coupon by code. Coupon application goes through the cart's\n * `discounts` endpoint (`POST …/discounts` with a coupon-code-only payload) —\n * the live API has no `…/coupons` path. The apply response only carries the\n * applied-discount reference (`{ discountId, discountIndex }`), so the updated\n * cart is re-fetched and returned to preserve the `Cart` contract.\n */\n async applyCoupon(cartId: string, code: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<AppliedDiscount>({\n method: \"POST\",\n path: `${this.base()}/${cartId}/discounts`,\n auth: cartAuth,\n body: { code },\n });\n return this.get(cartId, cartAuth);\n }\n\n /**\n * Removes a coupon by code via `DELETE …/discounts?codes=<code>` — the live\n * API has no `…/coupons/<code>` path. The delete responds 204 No Content, so\n * the updated cart is re-fetched and returned.\n */\n async removeCoupon(cartId: string, code: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}/discounts`,\n query: { codes: code },\n auth: cartAuth,\n });\n return this.get(cartId, cartAuth);\n }\n\n /** Validates the cart's items (pricing/consistency checks). */\n async validate(cartId: string, auth: AuthContext): Promise<CartValidationResult> {\n return this.ctx.http.request<CartValidationResult>({\n method: \"GET\",\n path: `${this.base()}/${cartId}/validate`,\n auth: requireCartAuth(auth),\n });\n }\n\n /** Lists the items in a cart with calculated prices. */\n async listItems(cartId: string, auth: AuthContext): Promise<CartItem[]> {\n return this.ctx.http.request<CartItem[]>({\n method: \"GET\",\n path: `${this.base()}/${cartId}/items`,\n auth: requireCartAuth(auth),\n });\n }\n\n /** Refreshes a cart and its items (re-prices), then returns the updated cart. */\n async refresh(cartId: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}/refresh`,\n auth: cartAuth,\n });\n return this.get(cartId, cartAuth);\n }\n\n /** Changes the cart's site (re-prices to the new site's currency), then returns the updated cart. */\n async changeSite(cartId: string, siteCode: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${cartId}/changeSite`,\n auth: cartAuth,\n body: { siteCode },\n });\n return this.get(cartId, cartAuth);\n }\n\n /** Changes the cart's currency (re-prices), then returns the updated cart. */\n async changeCurrency(cartId: string, currency: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${cartId}/changeCurrency`,\n auth: cartAuth,\n body: { currency },\n });\n return this.get(cartId, cartAuth);\n }\n\n /**\n * Updates multiple cart items in one request (`PUT …/itemsBatch`). Like\n * `addItemsBatch`, the response carries a per-entry `status`; partial failures\n * do not throw — inspect each entry.\n */\n async updateItemsBatch(\n cartId: string,\n items: CartItemsBatchUpdateInput,\n auth: AuthContext,\n ): Promise<CartItemsBatchUpdateResult> {\n return this.ctx.http.request<CartItemsBatchUpdateResult>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}/itemsBatch`,\n auth: requireCartAuth(auth),\n body: items,\n });\n }\n\n /**\n * Sets the cart's shipping address, preserving the billing address.\n *\n * The API has no per-type address endpoint: addresses live in the cart's\n * `addresses` array, written via `PUT /carts/{cartId}`. That array is a **full\n * replace** — sending only one type leaves the other as an empty stub — so\n * this method reads the cart, merges, writes, and re-fetches. Use\n * {@link setAddresses} to set both in a single request.\n */\n async setShippingAddress(\n cartId: string,\n address: CartAddress,\n auth: AuthContext,\n ): Promise<Cart> {\n return this.mergeAddress(cartId, address, \"SHIPPING\", requireCartAuth(auth));\n }\n\n /**\n * Sets the cart's billing address, preserving the shipping address. See\n * {@link setShippingAddress} for why this reads before writing.\n */\n async setBillingAddress(\n cartId: string,\n address: CartAddress,\n auth: AuthContext,\n ): Promise<Cart> {\n return this.mergeAddress(cartId, address, \"BILLING\", requireCartAuth(auth));\n }\n\n /**\n * Sets both cart addresses in one request (`PUT /carts/{cartId}`), skipping\n * the read that {@link setShippingAddress} needs.\n *\n * **This replaces the cart's address set**: a type you omit is cleared, and\n * `{}` clears both. Use it when you already hold both addresses (a checkout\n * form submitting them together); use the per-type setters to change one and\n * keep the other.\n */\n async setAddresses(\n cartId: string,\n addresses: { shipping?: CartAddress; billing?: CartAddress },\n auth: AuthContext,\n ): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n const next: CartAddress[] = [];\n if (addresses.shipping) next.push({ ...addresses.shipping, type: \"SHIPPING\" });\n if (addresses.billing) next.push({ ...addresses.billing, type: \"BILLING\" });\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}`,\n auth: cartAuth,\n body: { addresses: next },\n });\n return this.get(cartId, cartAuth);\n }\n\n /**\n * Reads the cart, replaces the entry of `type` with `address` (keeping every\n * other type verbatim — resending it unchanged is what stops the server from\n * wiping it), writes, and returns the re-fetched cart.\n */\n private async mergeAddress(\n cartId: string,\n address: CartAddress,\n type: \"SHIPPING\" | \"BILLING\",\n cartAuth: AuthContext,\n ): Promise<Cart> {\n const current = await this.get(cartId, cartAuth);\n const others = (current.addresses ?? []).filter((a) => a.type !== type);\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}`,\n auth: cartAuth,\n body: { addresses: [...others, { ...address, type }] },\n });\n return this.get(cartId, cartAuth);\n }\n\n /**\n * Merges one or more anonymous carts into the specified customer cart.\n * Per Emporix: the target cart in the path **must belong to the logged-in\n * customer**, and each id in `anonymousCartIds` must belong to an anonymous\n * customer. Anonymous carts go `CLOSED` on success.\n *\n * Requires a customer `AuthContext`.\n */\n async merge(\n customerCartId: string,\n anonymousCartIds: string[],\n auth: AuthContext,\n ): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"POST\",\n path: `${this.base()}/${customerCartId}/merge`,\n auth: requireCustomerAuth(auth),\n body: { carts: anonymousCartIds },\n });\n }\n\n /**\n * Searches carts tenant-wide (`POST /carts/search`, body `{ q }`). This is a\n * backend/admin operation — a customer token cannot scan other customers'\n * carts, so `auth` is forwarded unguarded (pass a service token for admin\n * use). The server enforces scope (403 on insufficient).\n */\n async search(\n query: CartSearchInput,\n auth: AuthContext,\n params: { pageNumber?: number; pageSize?: number; sort?: string; fields?: string } = {},\n ): Promise<CartSummary[]> {\n return this.ctx.http.request<CartSummary[]>({\n method: \"POST\",\n path: `${this.base()}/search`,\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.fields === undefined ? {} : { fields: params.fields }),\n },\n body: query,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n auth,\n });\n }\n\n /**\n * Deletes a cart (`DELETE /carts/{cartId}`). Backend/admin or owner\n * operation — `auth` is forwarded unguarded (service or customer). Returns\n * nothing; the cart no longer exists.\n */\n async delete(cartId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}`,\n auth,\n });\n }\n\n /**\n * Full-updates a cart (`PUT /carts/{cartId}`, body `UpdateCart`). Backend or\n * owner operation — `auth` is forwarded unguarded. The endpoint returns 204,\n * so the cart is re-fetched with the same `auth` (via a direct GET, not\n * `get()`, so a service token is not rejected by the cart-auth guard) and\n * returned.\n */\n async update(cartId: string, input: CartUpdateInput, auth: AuthContext): Promise<Cart> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}`,\n auth,\n body: input,\n });\n return this.ctx.http.request<Cart>({\n method: \"GET\",\n path: `${this.base()}/${cartId}`,\n auth,\n });\n }\n\n /** Fetches a single cart item's details (`GET /carts/{cartId}/items/{itemId}`). */\n async getItem(cartId: string, itemId: string, auth: AuthContext): Promise<CartItem> {\n return this.ctx.http.request<CartItem>({\n method: \"GET\",\n path: `${this.base()}/${cartId}/items/${itemId}`,\n auth: requireCartAuth(auth),\n });\n }\n\n /** Lists the discounts applied to a cart (`GET /carts/{cartId}/discounts`). */\n async listDiscounts(cartId: string, auth: AuthContext): Promise<CartDiscount[]> {\n return this.ctx.http.request<CartDiscount[]>({\n method: \"GET\",\n path: `${this.base()}/${cartId}/discounts`,\n auth: requireCartAuth(auth),\n });\n }\n\n /**\n * Removes all discounts from a cart (`DELETE /carts/{cartId}/discounts` with\n * no `codes` filter), then re-fetches and returns the updated cart. Use\n * `removeCoupon(code)` to remove a specific coupon by code.\n */\n async removeAllDiscounts(cartId: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}/discounts`,\n auth: cartAuth,\n });\n return this.get(cartId, cartAuth);\n }\n\n /**\n * Removes a single discount by its index (`DELETE\n * /carts/{cartId}/discounts/{discountIndex}`), then re-fetches and returns\n * the updated cart.\n */\n async removeDiscountByIndex(cartId: string, discountIndex: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}/discounts/${discountIndex}`,\n auth: cartAuth,\n });\n return this.get(cartId, cartAuth);\n }\n\n /** Retrieves the cart's lead-time and non-delivery-time restrictions (`GET /carts/{cartId}/dtRestrictions`). */\n async getDeliveryRestrictions(cartId: string, auth: AuthContext): Promise<CartDeliveryRestrictions> {\n return this.ctx.http.request<CartDeliveryRestrictions>({\n method: \"GET\",\n path: `${this.base()}/${cartId}/dtRestrictions`,\n auth: requireCartAuth(auth),\n });\n }\n\n /**\n * Runs up to 10 cart commands on this cart in one request, in order\n * (`POST /carts/{cartId}/execute`). The typical chain is `AddCartItem` then\n * `GetCart`: the calculated cart comes back without a second round trip.\n *\n * - `onError: \"fail\"` (default) stops at the first command that does not\n * answer 2xx and **throws the error that command's REST call would have\n * thrown** — an `EmporixNotFoundError` for a 404, … — with the command's\n * error body. The commands before it **have already been applied**.\n * - `onError: \"resume\"` runs every command and resolves with all results;\n * check each `code`.\n * - A `400` for the whole request (no commands or more than 10, an unknown\n * type, `versioning: \"explicit\"` without a `resourceVersion`) means no\n * command ran.\n *\n * The request takes about as long as its commands together — size the\n * client's `timeouts.readMs` for long chains. It is never retried: a replay\n * would apply the writes twice.\n *\n * `auth` is forwarded unguarded: a customer or anonymous token works on the\n * shopper's own cart; a service token needs `cart.cart_manage`, plus\n * `cart.cart_manage_external_prices` when a command carries an external\n * price, product, fee or discount.\n */\n async execute(\n cartId: string,\n commands: CartCommand[],\n auth: AuthContext,\n opts: CartExecuteOptions = {},\n ): Promise<CartExecuteResult> {\n const path = `${this.base()}/${encodeURIComponent(cartId)}/execute`;\n const res = await this.ctx.http.request<CartExecuteResult>({\n method: \"POST\",\n path,\n auth,\n query: { ...opts },\n body: { commands },\n });\n if (opts.onError !== \"resume\") {\n const failed = res.results.find((r) => r.code < 200 || r.code > 299);\n if (failed) {\n throw errorFromResponse(\n failed.code,\n `POST ${path} → command ${failed.index} (${failed.type}) → ${failed.code}`,\n failed.data,\n );\n }\n }\n return res;\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixAuthError } from \"../core/errors\";\nimport type {\n ResponseCheckout,\n RequestCheckout,\n RequestFromQuoteCheckout,\n CustomerJson,\n} from \"../generated/checkout\";\n\n/** `requestCheckout` body (cart-based, generated). */\nexport type CheckoutInput = RequestCheckout;\n\n/** `requestFromQuoteCheckout` body (quote-based, generated). */\nexport type QuoteCheckoutInput = RequestFromQuoteCheckout;\n\n/** `responseCheckout` — the full generated checkout response. */\nexport type CheckoutResult = ResponseCheckout;\n\n/** Options for a checkout call. */\nexport interface CheckoutOptions {\n /** Customer `saasToken` from `customers.login()` — required for logged-in checkout. */\n saasToken?: string;\n /** Site code (`?siteCode=`). */\n siteCode?: string;\n}\n\nfunction isGuest(customer: CustomerJson | undefined): boolean {\n return customer?.guest === true;\n}\n\nfunction resolveAuth(auth: AuthContext | undefined, guest: boolean): AuthContext {\n if (auth && (auth.kind === \"customer\" || auth.kind === \"raw\")) return auth;\n if (guest && auth && auth.kind === \"anonymous\") return auth;\n throw new EmporixAuthError(\n \"checkout requires a customer/raw AuthContext (or anonymous for a guest checkout)\",\n );\n}\n\n/** Triggers Emporix checkout (atomic: validate → order → payment → close cart). */\nexport class CheckoutService {\n static readonly channel = \"checkout\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private headers(opts: CheckoutOptions, guest: boolean): Record<string, string> | undefined {\n if (guest || !opts.saasToken) return undefined;\n return { \"saas-token\": opts.saasToken };\n }\n\n private query(opts: CheckoutOptions): Record<string, string> | undefined {\n return opts.siteCode ? { siteCode: opts.siteCode } : undefined;\n }\n\n /** Checkout from a cart. Requires customer/raw auth (or anonymous for guest). */\n async placeOrder(\n input: CheckoutInput,\n auth?: AuthContext,\n opts: CheckoutOptions = {},\n ): Promise<CheckoutResult> {\n const guest = isGuest(input.customer);\n const headers = this.headers(opts, guest);\n const query = this.query(opts);\n return this.ctx.http.request<CheckoutResult>({\n method: \"POST\",\n path: `/checkout/${this.ctx.tenant}/checkouts/order`,\n auth: resolveAuth(auth, guest),\n ...(query ? { query } : {}),\n ...(headers ? { headers } : {}),\n body: input,\n });\n }\n\n /** Checkout from a quote. */\n async placeOrderFromQuote(\n input: QuoteCheckoutInput,\n auth?: AuthContext,\n opts: CheckoutOptions = {},\n ): Promise<CheckoutResult> {\n const headers = this.headers(opts, false);\n const query = this.query(opts);\n return this.ctx.http.request<CheckoutResult>({\n method: \"POST\",\n path: `/checkout/${this.ctx.tenant}/checkouts/order`,\n auth: resolveAuth(auth, false),\n ...(query ? { query } : {}),\n ...(headers ? { headers } : {}),\n body: input,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\nimport { requireCustomer } from \"../core/require-customer\";\nimport type {\n PaymentModeFrontendResponse,\n AuthorizePaymentRequest,\n InitializePaymentRequest,\n InitializePaymentResponse,\n PaymentModeResponse,\n PaymentModeRequest,\n PaymentMethodUpdateRequest,\n PaymentTransactionResponse,\n AuthorizePaymentResponse,\n CaptureRequest,\n RefundRequest,\n CommonPaymentResponse,\n} from \"../generated/payment\";\n\nconst ANON: AuthContext = auth.anonymous();\nconst SERVICE: AuthContext = auth.service();\n\n/** A frontend payment mode (generated). */\nexport type PaymentMode = PaymentModeFrontendResponse;\n\n/** Post-checkout authorize request (generated; caller sends the exact wire shape). */\nexport type AuthorizePaymentInput = AuthorizePaymentRequest;\n\n/** Frontend payment-initialize request (generated). */\nexport type InitializePaymentInput = InitializePaymentRequest;\n\n/** Frontend payment-initialize response (generated). */\nexport type InitializePaymentResult = InitializePaymentResponse;\n\n/** Post-checkout authorize result. */\nexport interface AuthorizePaymentResult {\n successful: boolean;\n paymentTransactionId?: string;\n authorizationToken?: string;\n requiresExternalPayment?: boolean;\n externalPaymentRedirectURL?: string;\n externalPaymentHttpMethod?: string;\n [k: string]: unknown;\n}\n\n/** A configured payment mode (admin view, `/paymentmodes/config`). */\nexport type PaymentModeConfig = PaymentModeResponse;\n\n/** Body for creating a payment-mode configuration. */\nexport type PaymentModeCreateInput = PaymentModeRequest;\n\n/** Body for updating a payment-mode configuration. */\nexport type PaymentModeUpdateInput = PaymentMethodUpdateRequest;\n\n/** A payment transaction (generated). */\nexport type PaymentTransaction = PaymentTransactionResponse;\n\n/** Result of a backend payment authorization. */\nexport type PaymentAuthorizeResult = AuthorizePaymentResponse;\n\n/** Body for capturing an authorized payment. */\nexport type PaymentCaptureInput = CaptureRequest;\n\n/** Body for refunding a captured payment. */\nexport type PaymentRefundInput = RefundRequest;\n\n/**\n * Result of a refund/cancel operation. Business failures are reported in the\n * body (`successful: false` + `message`), not via HTTP status.\n */\nexport type PaymentActionResult = CommonPaymentResponse;\n\n/** Result of a capture — like {@link PaymentActionResult} plus the provider's capture id. */\nexport type PaymentCaptureResult = {\n successful?: boolean;\n message?: string;\n captureId?: string;\n};\n\n/** Payment-Gateway: list frontend payment modes, authorize deferred payments. */\nexport class PaymentGatewayService {\n static readonly channel = \"payment\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /**\n * Lists configured frontend payment modes. The endpoint requires a bearer\n * token but no customer scope (\"No scope required\"), so it defaults to an\n * anonymous context and works for guests and logged-in customers alike.\n */\n async listPaymentModes(authCtx: AuthContext = ANON): Promise<PaymentMode[]> {\n return this.ctx.http.request<PaymentMode[]>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/frontend`,\n auth: authCtx,\n });\n }\n\n /** Authorizes a post-checkout (deferred) payment for an existing order. */\n async authorize(\n input: AuthorizePaymentInput,\n authCtx?: AuthContext,\n ): Promise<AuthorizePaymentResult> {\n return this.ctx.http.request<AuthorizePaymentResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/frontend/authorize`,\n auth: requireCustomer(authCtx),\n body: input,\n });\n }\n\n /** Retrieves a single frontend payment mode by id. Defaults to anonymous (no scope required). */\n async getMode(id: string, authCtx: AuthContext = ANON): Promise<PaymentMode> {\n return this.ctx.http.request<PaymentMode>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/frontend/${id}`,\n auth: authCtx,\n });\n }\n\n /** Initializes a payment from the frontend. Defaults to anonymous (no scope required). */\n async initialize(\n input: InitializePaymentInput,\n authCtx: AuthContext = ANON,\n ): Promise<InitializePaymentResult> {\n return this.ctx.http.request<InitializePaymentResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/frontend/initialize`,\n auth: authCtx,\n body: input,\n });\n }\n\n /**\n * Payment-mode **configuration** (`/paymentmodes/config`) — the admin view.\n * For the storefront view use {@link listPaymentModes} / {@link getMode}.\n * Defaults to service auth.\n */\n readonly modes = {\n /** Lists all configured payment modes. The endpoint takes no query parameters. */\n list: async (authCtx: AuthContext = SERVICE): Promise<PaymentModeConfig[]> =>\n this.ctx.http.request<PaymentModeConfig[]>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/config`,\n auth: authCtx,\n }),\n\n /** Retrieves one payment-mode configuration by id. */\n get: async (id: string, authCtx: AuthContext = SERVICE): Promise<PaymentModeConfig> =>\n this.ctx.http.request<PaymentModeConfig>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/config/${id}`,\n auth: authCtx,\n }),\n\n /** Creates a payment-mode configuration. Responds 200 with the created mode. */\n create: async (\n input: PaymentModeCreateInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentModeConfig> =>\n this.ctx.http.request<PaymentModeConfig>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/config`,\n body: input,\n auth: authCtx,\n }),\n\n /** Updates a payment-mode configuration (PUT). Responds 200 with the updated mode. */\n update: async (\n id: string,\n input: PaymentModeUpdateInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentModeConfig> =>\n this.ctx.http.request<PaymentModeConfig>({\n method: \"PUT\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/config/${id}`,\n body: input,\n auth: authCtx,\n }),\n\n /** Deletes a payment-mode configuration. */\n delete: async (id: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/config/${id}`,\n auth: authCtx,\n });\n },\n };\n\n /**\n * Backend transaction lifecycle and reads. `authorize` creates the transaction\n * that `capture`/`refund`/`cancel` then act on. Business failures are reported\n * in the response body (`successful: false`), not as HTTP errors — always check\n * `successful`. Defaults to service auth.\n */\n readonly transactions = {\n /** One page of payment transactions. */\n list: async (\n params: { pageNumber?: number; pageSize?: number; sort?: string } = {},\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentTransaction[]> => {\n const query = {\n ...(params.pageNumber === undefined ? {} : { pageNumber: params.pageNumber }),\n ...(params.pageSize === undefined ? {} : { pageSize: params.pageSize }),\n ...(params.sort === undefined ? {} : { sort: params.sort }),\n };\n return this.ctx.http.request<PaymentTransaction[]>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/transactions`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n auth: authCtx,\n });\n },\n\n /** Retrieves one payment transaction by id. */\n get: async (transactionId: string, authCtx: AuthContext = SERVICE): Promise<PaymentTransaction> =>\n this.ctx.http.request<PaymentTransaction>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/transactions/${transactionId}`,\n auth: authCtx,\n }),\n\n /**\n * Authorizes a payment as a backend caller (`POST /payment/authorize`). The\n * storefront equivalent is {@link PaymentGatewayService.authorize}, which\n * targets `/payment/frontend/authorize` with a customer token.\n */\n authorize: async (\n input: AuthorizePaymentInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentAuthorizeResult> =>\n this.ctx.http.request<PaymentAuthorizeResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/authorize`,\n body: input,\n auth: authCtx,\n }),\n\n /**\n * Captures an authorized payment. Omit `input` to capture the full\n * authorized amount. Returns the provider's `captureId` on success.\n */\n capture: async (\n transactionId: string,\n input?: PaymentCaptureInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentCaptureResult> =>\n this.ctx.http.request<PaymentCaptureResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/${transactionId}/capture`,\n ...(input === undefined ? {} : { body: input }),\n auth: authCtx,\n }),\n\n /**\n * Refunds a captured payment. Omit `input` to refund the full captured\n * amount; pass `captureId` when several captures exist for the payment.\n */\n refund: async (\n transactionId: string,\n input?: PaymentRefundInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentActionResult> =>\n this.ctx.http.request<PaymentActionResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/${transactionId}/refund`,\n ...(input === undefined ? {} : { body: input }),\n auth: authCtx,\n }),\n\n /** Cancels an authorized payment. Takes no body. */\n cancel: async (transactionId: string, authCtx: AuthContext = SERVICE): Promise<PaymentActionResult> =>\n this.ctx.http.request<PaymentActionResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/${transactionId}/cancel`,\n auth: authCtx,\n }),\n };\n}\n","/**\n * Paging, sort and field selection for a `POST …/search` endpoint. Emporix reads\n * them from the query string, not the body, so the SDK sends them there. Without\n * them a search returns only the server's first page.\n */\nexport interface SearchPaging {\n pageNumber?: number;\n pageSize?: number;\n /** Properties to sort by, in Emporix sort syntax. */\n sort?: string;\n /** Comma-separated fields to return. */\n fields?: string;\n}\n\n/** The {@link SearchPaging} keys, for {@link splitQuery}. */\nexport const SEARCH_PAGING = [\"pageNumber\", \"pageSize\", \"sort\", \"fields\"] as const;\n\n/**\n * Splits a request input: the named keys go to the query string, everything\n * else stays in the body. A `POST …/search` declares its paging, sort and similar\n * parameters in the query and ignores them in the body — sent there, the search\n * silently returns the first page.\n */\nexport function splitQuery(\n input: object,\n queryKeys: readonly string[],\n): { body: Record<string, unknown>; query: Record<string, string | number | boolean | undefined> } {\n const body: Record<string, unknown> = {};\n const query: Record<string, string | number | boolean | undefined> = {};\n for (const [key, value] of Object.entries(input)) {\n if (queryKeys.includes(key)) query[key] = value as string | number | boolean | undefined;\n else body[key] = value;\n }\n return { body, query };\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixAuthError } from \"../core/errors\";\nimport { splitQuery, type SearchPaging } from \"../core/search\";\nimport type {\n Match,\n MatchByContext,\n MatchResponse,\n CreatePrice,\n GetPrice,\n PriceModelDefinitionCreation,\n PriceModelRetrieval,\n PriceListCreation,\n PriceListUpdate,\n PriceList as GenPriceList,\n PriceListPriceCreation,\n PriceListPriceUpdate,\n PriceListPrice as GenPriceListPrice,\n PriceBulkResponseEntry,\n} from \"../generated/price\";\n\n/** Session-context match request body (generated). */\nexport type PriceMatchByContextInput = MatchByContext;\n\n/** Explicit-context match request body (generated). */\nexport type PriceMatchInput = Match;\n\n/** Item (product or price) a price was matched for. */\nexport interface PriceMatchItemRef {\n itemType?: string;\n id?: string;\n /** Localized (or plain) product name — present on the live API, absent from the OpenAPI doc. */\n name?: Record<string, string> | string;\n}\n\n/**\n * A resolved price. Superset of the generated match-response schema: the\n * deployed API returns the matched item under `itemId` (with a localized\n * `name`), while the OpenAPI doc/codegen call it `itemRef`.\n */\nexport type PriceMatch = Omit<MatchResponse, \"itemRef\"> & {\n /** Item the price was matched for, as returned by the API. */\n itemId?: PriceMatchItemRef;\n /**\n * @deprecated The OpenAPI doc names this `itemRef`, but the deployed API\n * returns `itemId`. Mirrored from `itemId` for back-compat — prefer `itemId`.\n */\n itemRef?: PriceMatchItemRef;\n};\n\n/**\n * Normalizes a raw match row: the deployed API returns `itemId`, while the\n * codegen type calls it `itemRef`. Expose `itemId` canonically and mirror it\n * to the deprecated `itemRef` so existing consumers keep working.\n */\nfunction normalizeMatch(raw: MatchResponse): PriceMatch {\n const itemId = (raw as MatchResponse & { itemId?: PriceMatchItemRef }).itemId ?? raw.itemRef;\n const base = raw as PriceMatch;\n if (!itemId) return base;\n // Mirror only id/type into the deprecated itemRef (drop name); build without\n // explicit `undefined` for exactOptionalPropertyTypes.\n const itemRef: PriceMatchItemRef = {\n ...(itemId.itemType !== undefined ? { itemType: itemId.itemType } : {}),\n ...(itemId.id !== undefined ? { id: itemId.id } : {}),\n };\n return { ...base, itemId, itemRef };\n}\n\n/** Options for {@link PriceService.matchByContextChunked}. */\nexport interface MatchByContextChunkedOptions {\n /** Items per request. Default 50. Must be >= 1. */\n chunkSize?: number;\n /** Maximum number of requests in flight at once. Default 4. Must be >= 1. */\n concurrency?: number;\n /** Invoked once per failed chunk (default mode only — not when throwing). */\n onChunkError?: (err: unknown, chunkIndex: number) => void;\n /** When true, the first failing chunk rejects the whole call. Default false. */\n throwOnAnyChunkError?: boolean;\n}\n\n/** A resolved/stored price (generated read shape). */\nexport type Price = GetPrice;\n/** Create/upsert body for a flat price (generated). */\nexport type PriceCreateInput = CreatePrice;\n/** A price model (read). */\nexport type PriceModel = PriceModelRetrieval;\n/** Create/upsert body for a price model (generated). */\nexport type PriceModelInput = PriceModelDefinitionCreation;\n/** A price list (read). */\nexport type PriceList = GenPriceList;\n/** Create body for a price list (generated). */\nexport type PriceListInput = PriceListCreation;\n/** Upsert body for a price list (generated). */\nexport type PriceListUpdateInput = PriceListUpdate;\n/** A price inside a price list (read). */\nexport type PriceListPrice = GenPriceListPrice;\n/** Add body for a price-list price (generated). */\nexport type PriceListPriceInput = PriceListPriceCreation;\n/** Upsert body for a price-list price (generated). */\nexport type PriceListPriceUpdateInput = PriceListPriceUpdate;\n/** Per-entry result of a bulk price operation (generated). */\nexport type PriceBulkResult = PriceBulkResponseEntry;\n\nconst ANON: AuthContext = { kind: \"anonymous\" };\nconst SERVICE: AuthContext = { kind: \"service\" };\n\nfunction requireContextAuth(auth: AuthContext | undefined): AuthContext {\n const a = auth ?? ANON;\n if (a.kind === \"anonymous\" || a.kind === \"customer\" || a.kind === \"raw\") return a;\n throw new EmporixAuthError(\n \"match-prices-by-context requires an anonymous, customer, or raw AuthContext\",\n );\n}\n\n/**\n * Price matching. The Cart service does not resolve prices — call this\n * explicitly before rendering money and again right before placing an order.\n * The SDK is stateless: it never caches or revalidates prices.\n */\nexport class PriceService {\n static readonly channel = \"price\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /**\n * Resolves prices using the session context bound to the bearer token\n * (currency/site/country were set at anonymous-login time). Default auth:\n * anonymous; pass a customer/raw context for personalized pricing.\n */\n async matchByContext(\n input: PriceMatchByContextInput,\n auth?: AuthContext,\n ): Promise<PriceMatch[]> {\n const rows = await this.ctx.http.request<MatchResponse[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/match-prices-by-context`,\n auth: requireContextAuth(auth),\n body: input,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n return rows.map(normalizeMatch);\n }\n\n /**\n * Resolves prices from an explicit context. Default auth: service\n * (requires `price.price_read` / `price.price_manage`).\n */\n async match(input: PriceMatchInput, auth: AuthContext = SERVICE): Promise<PriceMatch[]> {\n const rows = await this.ctx.http.request<MatchResponse[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/match-prices`,\n auth,\n body: input,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n return rows.map(normalizeMatch);\n }\n\n /**\n * Chunked variant of {@link matchByContext} for large `items` arrays. The\n * Emporix backend handles only a limited number of items per request\n * (production limit ~50), so this splits `input.items` into chunks and runs\n * `matchByContext` with bounded concurrency.\n *\n * By default a failing chunk is skipped (its items are absent from the\n * result) and `opts.onChunkError` is called once for it; pass\n * `throwOnAnyChunkError: true` to reject on the first failure instead.\n *\n * **Result order is not guaranteed** — match entries back to your items by\n * `priceId` / `itemId.id`.\n */\n async matchByContextChunked(\n input: PriceMatchByContextInput,\n opts: MatchByContextChunkedOptions = {},\n auth?: AuthContext,\n ): Promise<PriceMatch[]> {\n const chunkSize = opts.chunkSize ?? 50;\n const concurrency = opts.concurrency ?? 4;\n if (chunkSize < 1) throw new Error(\"chunkSize must be >= 1\");\n if (concurrency < 1) throw new Error(\"concurrency must be >= 1\");\n\n const items = input.items ?? [];\n if (items.length === 0) return [];\n\n const chunks: PriceMatchByContextInput[] = [];\n for (let i = 0; i < items.length; i += chunkSize) {\n chunks.push({ ...input, items: items.slice(i, i + chunkSize) });\n }\n\n const results: PriceMatch[][] = new Array(chunks.length);\n let cursor = 0;\n\n const worker = async (): Promise<void> => {\n for (;;) {\n const idx = cursor++;\n const chunk = chunks[idx];\n if (chunk === undefined) return; // past the end\n try {\n results[idx] = await this.matchByContext(chunk, auth);\n } catch (err) {\n if (opts.throwOnAnyChunkError) throw err;\n results[idx] = [];\n opts.onChunkError?.(err, idx);\n }\n }\n };\n\n const workerCount = Math.min(concurrency, chunks.length);\n await Promise.all(Array.from({ length: workerCount }, () => worker()));\n\n return results.flat();\n }\n\n // --- Admin CRUD (flat prices). Default auth: service. ---\n\n /** Creates a flat price. Default auth: service. */\n async create(input: PriceCreateInput, authCtx: AuthContext = SERVICE): Promise<Price> {\n return this.ctx.http.request<Price>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/prices`,\n auth: authCtx,\n body: input,\n });\n }\n\n /** Lists flat prices. Default auth: service. */\n async list(\n query?: Record<string, string | number>,\n authCtx: AuthContext = SERVICE,\n ): Promise<Price[]> {\n return this.ctx.http.request<Price[]>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/prices`,\n auth: authCtx,\n ...(query ? { query } : {}),\n });\n }\n\n /** Retrieves one flat price by id. Default auth: service. */\n async get(priceId: string, authCtx: AuthContext = SERVICE): Promise<Price> {\n return this.ctx.http.request<Price>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/prices/${priceId}`,\n auth: authCtx,\n });\n }\n\n /** Upserts a flat price by id (PUT). Default auth: service. */\n async upsert(priceId: string, input: PriceCreateInput, authCtx: AuthContext = SERVICE): Promise<Price> {\n return this.ctx.http.request<Price>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/prices/${priceId}`,\n auth: authCtx,\n body: input,\n });\n }\n\n /** Deletes a flat price by id. Default auth: service. */\n async delete(priceId: string, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/price/${this.ctx.tenant}/prices/${priceId}`,\n auth: authCtx,\n });\n }\n\n /**\n * Searches flat prices: the criteria go in the body, `expand` in the query\n * string. Default auth: service.\n */\n async search(query: Record<string, unknown> & { expand?: string }, authCtx: AuthContext = SERVICE): Promise<Price[]> {\n return this.ctx.http.request<Price[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/prices/search`,\n auth: authCtx,\n ...splitQuery(query, [\"expand\"]),\n });\n }\n\n /** Creates multiple flat prices in one request. Default auth: service. */\n async bulkCreate(inputs: PriceCreateInput[], authCtx: AuthContext = SERVICE): Promise<PriceBulkResult[]> {\n return this.ctx.http.request<PriceBulkResult[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/prices/bulk`,\n auth: authCtx,\n body: inputs,\n });\n }\n\n /** Upserts multiple flat prices in one request (PUT). Default auth: service. */\n async bulkUpsert(inputs: PriceCreateInput[], authCtx: AuthContext = SERVICE): Promise<PriceBulkResult[]> {\n return this.ctx.http.request<PriceBulkResult[]>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/prices/bulk`,\n auth: authCtx,\n body: inputs,\n });\n }\n\n /** Price-model admin CRUD (`/priceModels`). Default auth: service. */\n readonly models = {\n list: async (\n query?: Record<string, string | number>,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceModel[]> =>\n this.ctx.http.request<PriceModel[]>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/priceModels`,\n auth: authCtx,\n ...(query ? { query } : {}),\n }),\n create: async (input: PriceModelInput, authCtx: AuthContext = SERVICE): Promise<PriceModel> =>\n this.ctx.http.request<PriceModel>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/priceModels`,\n auth: authCtx,\n body: input,\n }),\n get: async (modelId: string, authCtx: AuthContext = SERVICE): Promise<PriceModel> =>\n this.ctx.http.request<PriceModel>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/priceModels/${modelId}`,\n auth: authCtx,\n }),\n upsert: async (\n modelId: string,\n input: PriceModelInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceModel> =>\n this.ctx.http.request<PriceModel>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/priceModels/${modelId}`,\n auth: authCtx,\n body: input,\n }),\n delete: async (modelId: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/price/${this.ctx.tenant}/priceModels/${modelId}`,\n auth: authCtx,\n });\n },\n };\n\n /** Price-list admin CRUD (`/price-lists`) + nested price management. Default auth: service. */\n readonly lists = {\n list: async (\n query?: Record<string, string | number>,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceList[]> =>\n this.ctx.http.request<PriceList[]>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/price-lists`,\n auth: authCtx,\n ...(query ? { query } : {}),\n }),\n create: async (input: PriceListInput, authCtx: AuthContext = SERVICE): Promise<PriceList> =>\n this.ctx.http.request<PriceList>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/price-lists`,\n auth: authCtx,\n body: input,\n }),\n /** `q` in the body; `pageNumber`, `pageSize` and `sort` in the query string. */\n search: async (\n query: Record<string, unknown> & Omit<SearchPaging, \"fields\">,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceList[]> =>\n this.ctx.http.request<PriceList[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/price-lists/search`,\n auth: authCtx,\n ...splitQuery(query, [\"pageNumber\", \"pageSize\", \"sort\"]),\n }),\n get: async (listId: string, authCtx: AuthContext = SERVICE): Promise<PriceList> =>\n this.ctx.http.request<PriceList>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}`,\n auth: authCtx,\n }),\n upsert: async (\n listId: string,\n input: PriceListUpdateInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceList> =>\n this.ctx.http.request<PriceList>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}`,\n auth: authCtx,\n body: input,\n }),\n delete: async (listId: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}`,\n auth: authCtx,\n });\n },\n listPrices: async (\n listId: string,\n query?: Record<string, string | number>,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceListPrice[]> =>\n this.ctx.http.request<PriceListPrice[]>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices`,\n auth: authCtx,\n ...(query ? { query } : {}),\n }),\n addPrice: async (\n listId: string,\n input: PriceListPriceInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceListPrice> =>\n this.ctx.http.request<PriceListPrice>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices`,\n auth: authCtx,\n body: input,\n }),\n getPrice: async (\n listId: string,\n priceId: string,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceListPrice> =>\n this.ctx.http.request<PriceListPrice>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/${priceId}`,\n auth: authCtx,\n }),\n upsertPrice: async (\n listId: string,\n priceId: string,\n input: PriceListPriceUpdateInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceListPrice> =>\n this.ctx.http.request<PriceListPrice>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/${priceId}`,\n auth: authCtx,\n body: input,\n }),\n deletePrice: async (\n listId: string,\n priceId: string,\n authCtx: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/${priceId}`,\n auth: authCtx,\n });\n },\n /** `q` in the body; `pageNumber`, `pageSize` and `sort` in the query string. */\n searchPrices: async (\n listId: string,\n query: Record<string, unknown> & Omit<SearchPaging, \"fields\">,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceListPrice[]> =>\n this.ctx.http.request<PriceListPrice[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/search`,\n auth: authCtx,\n ...splitQuery(query, [\"pageNumber\", \"pageSize\", \"sort\"]),\n }),\n bulkCreatePrices: async (\n listId: string,\n inputs: PriceListPriceInput[],\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceBulkResult[]> =>\n this.ctx.http.request<PriceBulkResult[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/bulk`,\n auth: authCtx,\n body: inputs,\n }),\n bulkUpsertPrices: async (\n listId: string,\n inputs: PriceListPriceInput[],\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceBulkResult[]> =>\n this.ctx.http.request<PriceBulkResult[]>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/bulk`,\n auth: authCtx,\n body: inputs,\n }),\n bulkDeletePrices: async (\n listId: string,\n body: Record<string, unknown>,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceBulkResult[]> =>\n this.ctx.http.request<PriceBulkResult[]>({\n method: \"DELETE\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/bulk`,\n auth: authCtx,\n body,\n }),\n };\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixError, errorFromResponse } from \"../core/errors\";\nimport type {\n AssetCreateBlob,\n AssetCreateLink,\n AssetUpdateBlob,\n AssetUpdateLink,\n DownloadUrl,\n GetAsset,\n GetMediaRetrieveDownloadUrlData,\n MetadataUpdate,\n PatchOperation,\n RefId,\n UploadSession,\n UploadSessionRequest,\n} from \"../generated/media\";\n\n/**\n * The spec marks `metadata` optional on both update bodies; the live API rejects\n * an update without it — «`metadata.version` is required for update» (measured\n * 2026-10-06 on BLOB and LINK assets). Required here, so leaving it out is a\n * compile error rather than a 400.\n */\ntype Versioned<T> = Omit<T, \"metadata\"> & { metadata: MetadataUpdate };\n\n/** Generated media types (caller sends the exact wire shape). */\nexport type AssetCreateBlobInput = AssetCreateBlob;\nexport type AssetCreateLinkInput = AssetCreateLink;\nexport type AssetUpdateBlobInput = Versioned<AssetUpdateBlob>;\nexport type AssetUpdateLinkInput = Versioned<AssetUpdateLink>;\n/**\n * @deprecated `update()` takes {@link AssetUpdateLinkInput} as its JSON body and\n * {@link AssetUpdateBlobInput} next to a file; a BLOB is never sent as JSON.\n */\nexport type AssetUpdateInput = AssetUpdateBlob | AssetUpdateLink;\nexport type Asset = GetAsset;\nexport type AssetRefId = RefId;\n/** Partial-update body (`PATCH /assets/{id}`) — an RFC-6902 JSON-Patch op-array. */\nexport type AssetPatch = PatchOperation[];\n/** Result of {@link MediaService.getDownloadUrl} — `{ provider, url, expiresAt? }`. */\nexport type AssetDownloadUrl = DownloadUrl;\n/** Query for {@link MediaService.getDownloadUrl} — `{ disposition? }`. */\nexport type AssetDownloadUrlQuery = NonNullable<GetMediaRetrieveDownloadUrlData[\"query\"]>;\n/** Body for {@link MediaService.startUploadSession}: a BLOB create payload plus `uploadType`. */\nexport type AssetUploadSessionInput = UploadSessionRequest;\n/** The storage instruction {@link MediaService.startUploadSession} returns. */\nexport type AssetUploadSession = UploadSession;\n\n/**\n * Filter / pagination options for {@link MediaService.list}. The explicit\n * fields are typed for autocomplete; the index signature stays open so\n * Emporix `q`-syntax filters like `\"refIds.id\"` can be passed verbatim.\n */\nexport interface ListAssetsQuery {\n pageNumber?: number;\n pageSize?: number;\n /** Emporix sort syntax, e.g. `\"name,metadata.createdAt:desc\"`. */\n sort?: string;\n /** Emporix `q`-syntax filter, e.g. `\"name:hero\"`. */\n q?: string;\n /**\n * Ask for `X-Total-Count`. An SDK-side flag, not an Emporix query parameter:\n * it becomes a request header.\n */\n totalCount?: boolean;\n [key: string]: string | number | boolean | undefined;\n}\n\n/**\n * Result of {@link MediaService.download}. The endpoint's behaviour depends\n * on the asset's `access`:\n * - `PUBLIC` assets respond with a 30x redirect whose `Location` header\n * carries the externally-cacheable storage URL — useful when the\n * storefront wants to send the user there directly.\n * - `PRIVATE` assets respond with the raw bytes (plus an `ETag` header\n * for caching). The file lives in Google Cloud Storage and is reachable\n * without the service token only through a signed URL from\n * {@link MediaService.getDownloadUrl}.\n */\nexport type DownloadResult =\n | { kind: \"redirect\"; url: string }\n | {\n kind: \"bytes\";\n data: ArrayBuffer;\n etag?: string;\n contentType?: string;\n };\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\nfunction isProductRef(r: AssetRefId, productId: string): boolean {\n return r.type === \"PRODUCT\" && r.id === productId;\n}\n\n/**\n * Media assets (BLOB/LINK). All endpoints require a backend-only scope\n * (`media.asset_manage` / `media.asset_read`) — default auth: service.\n */\nexport class MediaService {\n static readonly channel = \"media\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/media/${this.ctx.tenant}/assets`;\n }\n\n /**\n * Create an asset. BLOB uploads via multipart (max 30 MB); LINK via JSON.\n * {@link startUploadSession} sends the file straight to storage instead.\n */\n async create(\n input:\n | { kind: \"blob\"; file: Blob; body: AssetCreateBlobInput }\n | { kind: \"link\"; body: AssetCreateLinkInput },\n auth: AuthContext = SERVICE,\n ): Promise<{ id: string }> {\n if (input.kind === \"blob\") {\n const fd = new FormData();\n fd.set(\"file\", input.file);\n fd.set(\"body\", JSON.stringify(input.body));\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: fd,\n });\n }\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input.body,\n });\n }\n\n /**\n * List assets, wrapped in the shared {@link PaginatedItems} envelope so\n * callers can iterate over pages consistently with the rest of the SDK.\n * `hasNextPage` is the standard SDK heuristic: `true` when the returned\n * page is full (`items.length === requested pageSize`). Pagination\n * defaults match Emporix's server defaults (`pageNumber: 1`,\n * `pageSize: 60`) so an empty `query` produces stable expectations.\n */\n async list(\n query: ListAssetsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<Asset>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n // Destructured out because the rest of `query` is spread into the query\n // string: `totalCount` is an SDK-side flag that becomes a request header,\n // and would otherwise ride along as a stray `?totalCount=true`.\n const { totalCount, ...rest } = query;\n return requestPage<Asset>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.base(),\n auth,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n /** Fetch an asset by id. */\n async get(assetId: string, auth: AuthContext = SERVICE): Promise<Asset> {\n return this.ctx.http.request<Asset>({\n method: \"GET\",\n path: `${this.base()}/${assetId}`,\n auth,\n });\n }\n\n /**\n * Replace an asset (`PUT`, HTTP 204 — nothing is returned). The spec takes one\n * body per asset type, mirrored by the discriminated input:\n * - `{ kind: \"json\", body }` — a LINK asset, sent as `application/json`. The\n * body is the whole asset: `type: \"LINK\"`, `access` and `url` are required.\n * - `{ kind: \"blob\", file, body }` — a BLOB asset, sent as\n * `multipart/form-data`: the file (max 30 MB) and the asset body, both\n * required, so this always replaces the bytes.\n *\n * A BLOB's metadata alone — `refIds`, `details`, mixins — goes through\n * {@link patch}. Earlier versions also took a BLOB as the JSON body and\n * promised the updated asset in return; the spec allows neither.\n *\n * `type` and `access` are immutable. Optimistic locking is via\n * `body.metadata.version`; a stale one gets a 409.\n */\n async update(\n assetId: string,\n input:\n | { kind: \"json\"; body: AssetUpdateLinkInput }\n | { kind: \"blob\"; file: Blob; body: AssetUpdateBlobInput },\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n const path = `${this.base()}/${encodeURIComponent(assetId)}`;\n if (input.kind === \"blob\") {\n const fd = new FormData();\n fd.set(\"file\", input.file);\n fd.set(\"body\", JSON.stringify(input.body));\n await this.ctx.http.request<void>({ method: \"PUT\", path, auth, body: fd });\n return;\n }\n await this.ctx.http.request<void>({ method: \"PUT\", path, auth, body: input.body });\n }\n\n /**\n * Partially update an asset with an RFC-6902 JSON-Patch op-array\n * (`PATCH /assets/{id}`, HTTP 204 — nothing is returned).\n *\n * This is the way to change one field without resending the whole asset, and\n * the only way to touch a `BLOB` asset's metadata **without re-uploading the\n * file** — {@link update} in `blob` mode always replaces the bytes.\n *\n * Append to an array with a path ending in `/-`, which preserves the existing\n * entries:\n *\n * ```ts\n * await client.media.patch(assetId, [\n * { op: \"add\", path: \"/refIds/-\", value: { id: \"product1\", type: \"PRODUCT\" } },\n * ]);\n * ```\n *\n * `type` and `access` are immutable here too, as with {@link update}. Only\n * `add`, `remove` and `replace` are accepted, and optimistic locking still\n * applies — a stale `metadata.version` gets a 409.\n */\n async patch(assetId: string, ops: AssetPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(assetId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Remove an asset. */\n async remove(assetId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${assetId}`,\n auth,\n });\n }\n\n /**\n * Download an asset by id. Returns a discriminated union:\n * - `{ kind: \"redirect\", url }` for `PUBLIC` assets (server-side 30x with\n * the storage URL in `Location`).\n * - `{ kind: \"bytes\", data }` for `PRIVATE` assets (server-side 200 with\n * the asset bytes; `etag` + `contentType` headers are exposed for\n * caching). When the server reports `text/plain` Content-Type (the\n * OpenAPI-documented format), the SDK decodes the base64 stream into\n * an `ArrayBuffer` transparently; binary Content-Types are passed\n * through verbatim.\n *\n * Emporix recommends {@link getDownloadUrl} for every download: here the file\n * passes through the Media API. A `413` means the asset's known size exceeds\n * the streaming limit (30 MB by default) — only {@link getDownloadUrl} can\n * serve it. A `409` means the asset is still `PENDING` from a direct upload\n * whose file has not reached storage.\n *\n * Implementation note: uses `redirect: \"manual\"` so the redirect-location\n * is observable. In Node.js this works; in a browser the redirect Location\n * is intentionally hidden by fetch — there, `PUBLIC` downloads will\n * surface as an opaque-redirect and the SDK throws. Browser code should\n * use the asset's `url` field from `get()` for `LINK` assets, or the\n * direct storage URL for `PUBLIC` `BLOB` assets (typically delivered via\n * an `<img>` tag rather than `download()`).\n */\n async download(\n assetId: string,\n auth: AuthContext = SERVICE,\n ): Promise<DownloadResult> {\n const path = `${this.base()}/${assetId}/download`;\n const res = await this.ctx.http.requestRaw(\n { method: \"GET\", path, auth },\n { redirect: \"manual\" },\n );\n\n // PUBLIC: server-side redirect — capture Location.\n if (res.status >= 300 && res.status < 400) {\n const url = res.headers.get(\"location\");\n if (!url) {\n throw new EmporixError(\n `media.download: ${res.status} response without a Location header`,\n res.status,\n );\n }\n return { kind: \"redirect\", url };\n }\n\n // PRIVATE: bytes.\n if (res.ok) {\n const etag = res.headers.get(\"etag\") ?? undefined;\n const contentType = res.headers.get(\"content-type\") ?? undefined;\n let data: ArrayBuffer;\n if (contentType?.startsWith(\"text/plain\")) {\n // Per OpenAPI spec the server returns the byte stream as a\n // base64-encoded text/plain body. Decode once into raw bytes\n // so callers always see an ArrayBuffer.\n const text = await res.text();\n const bin = atob(text);\n const arr = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i);\n data = arr.buffer;\n } else {\n data = await res.arrayBuffer();\n }\n return {\n kind: \"bytes\",\n data,\n ...(etag !== undefined ? { etag } : {}),\n ...(contentType !== undefined ? { contentType } : {}),\n };\n }\n\n // Error: surface via the standard EmporixError hierarchy.\n const text = await res.text();\n let parsed: unknown = undefined;\n if (text) {\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = text;\n }\n }\n throw errorFromResponse(res.status, `GET ${path} → ${res.status}`, parsed);\n }\n\n /**\n * Get a URL that serves the stored file straight from storage\n * (`GET /assets/{assetId}/download-url`). Emporix recommends it for every\n * download: the file never passes through the Media API, there is no size\n * limit, and the URL can be handed to a browser as it is.\n *\n * - `PRIVATE` BLOB → `provider: \"GCS\"`, a signed Google Cloud Storage URL that\n * works without an Emporix token until `expiresAt` (15 minutes by default).\n * - `PUBLIC` BLOB → `provider: \"CLOUDINARY\"`, the permanent URL.\n * - `LINK` → `provider: \"LINK\"`, the stored URL.\n *\n * `disposition` (`attachment` by default, or `inline`) affects private URLs\n * only. Unlike {@link startUploadSession}, this works whether or not direct\n * upload is enabled for the tenant. A `409` means a direct upload is still\n * `PENDING` and its file has not reached storage; once it has, this call\n * completes the asset before answering.\n */\n async getDownloadUrl(\n assetId: string,\n query: AssetDownloadUrlQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<AssetDownloadUrl> {\n return this.ctx.http.request<AssetDownloadUrl>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(assetId)}/download-url`,\n auth,\n query: { ...query },\n });\n }\n\n /**\n * Start a direct upload of a `BLOB` asset (`POST /assets/upload-session`,\n * `201`). Emporix creates the asset as `PENDING` — `id` is its id — and\n * returns where to send the file. **This method does not send it**:\n *\n * - `upload.method === \"PUT\"` (a `PRIVATE` asset, `uploadType: \"put\"` or\n * omitted): `PUT` the file to `upload.url` with every `upload.headers` entry.\n * - `upload.method === \"POST\"` (every `PUBLIC` asset, or `uploadType: \"form\"`):\n * a multipart `POST` to `upload.url` with every `upload.fields` entry\n * unchanged and the file part last.\n *\n * That request goes to Google Cloud Storage or Cloudinary, not to Emporix, so\n * it must not carry the Emporix token — which is also why a browser can make\n * it. The asset turns `READY` once storage confirms; until then, calls that\n * need the file answer `409`. The instruction is valid for 15 minutes (GCS) or\n * an hour (Cloudinary), and an unused session expires at `expiresAt`.\n *\n * Direct upload is enabled per tenant by Emporix Support. Without it the call\n * throws an `EmporixForbiddenError` whose `body.message` is `direct upload is\n * not enabled for this tenant`, and nothing is created — the same status as a\n * missing scope, so read the message.\n */\n async startUploadSession(\n input: AssetUploadSessionInput,\n auth: AuthContext = SERVICE,\n ): Promise<AssetUploadSession> {\n return this.ctx.http.request<AssetUploadSession>({\n method: \"POST\",\n path: `${this.base()}/upload-session`,\n auth,\n body: input,\n });\n }\n\n /** Multipart upload sugar: builds `AssetCreateBlob` from input. */\n async uploadFile(\n input: {\n file: Blob;\n productId?: string;\n filename?: string;\n mimeType?: string;\n access?: \"PUBLIC\" | \"PRIVATE\";\n },\n auth: AuthContext = SERVICE,\n ): Promise<{ id: string }> {\n const body: AssetCreateBlobInput = {\n type: \"BLOB\",\n access: input.access ?? \"PUBLIC\",\n ...(input.productId\n ? { refIds: [{ type: \"PRODUCT\", id: input.productId }] }\n : {}),\n ...(input.filename || input.mimeType\n ? {\n details: {\n ...(input.filename ? { filename: input.filename } : {}),\n ...(input.mimeType ? { mimeType: input.mimeType } : {}),\n },\n }\n : {}),\n };\n return this.create({ kind: \"blob\", file: input.file, body }, auth);\n }\n\n /**\n * Replace the file content of an existing BLOB asset. Sugar over\n * {@link update} with `kind: \"blob\"`, and like it resolves to nothing — the\n * PUT answers 204. `access` is required because the field is immutable and\n * the server validates that the body matches.\n *\n * Pass `version` from `asset.metadata.version` for optimistic locking\n * (recommended when concurrent writers are possible) — a stale one gets a 409.\n * Without it the current version is read first, because the live API rejects\n * an update that carries none; the write then wins over any in between.\n */\n async replaceFile(\n assetId: string,\n input: {\n file: Blob;\n access: \"PUBLIC\" | \"PRIVATE\";\n filename?: string;\n mimeType?: string;\n version?: number;\n },\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n const version =\n input.version ?? (await this.get(assetId, auth)).metadata?.version ?? 1;\n const body: AssetUpdateBlobInput = {\n type: \"BLOB\",\n access: input.access,\n ...(input.filename || input.mimeType\n ? {\n details: {\n ...(input.filename ? { filename: input.filename } : {}),\n ...(input.mimeType ? { mimeType: input.mimeType } : {}),\n },\n }\n : {}),\n metadata: { version },\n };\n return this.update(assetId, { kind: \"blob\", file: input.file, body }, auth);\n }\n\n /** External-URL sugar: builds `AssetCreateLink`. */\n async link(\n input: { url: string; productId?: string; access?: \"PUBLIC\" | \"PRIVATE\" },\n auth: AuthContext = SERVICE,\n ): Promise<{ id: string }> {\n const body: AssetCreateLinkInput = {\n type: \"LINK\",\n access: input.access ?? \"PUBLIC\",\n url: input.url,\n ...(input.productId\n ? { refIds: [{ type: \"PRODUCT\", id: input.productId }] }\n : {}),\n };\n return this.create({ kind: \"link\", body }, auth);\n }\n\n /**\n * Idempotently add a PRODUCT refId to an asset, through a JSON Patch that\n * appends the one reference, so it works for BLOB and LINK alike and leaves\n * the rest of the asset alone.\n *\n * Resolves to the asset as read back after the patch, because Emporix answers\n * 204 to a reference to a product that does not exist and drops it — check\n * `refIds` rather than trusting the call. Only a PUBLIC asset takes a product\n * reference; a PRIVATE one answers 400.\n *\n * Earlier versions sent a JSON PUT of `{ type, refIds }`, which the spec\n * rejects for both types: a BLOB takes no JSON PUT, and a LINK's requires\n * `access` and `url`.\n */\n async attachToProduct(\n assetId: string,\n productId: string,\n auth: AuthContext = SERVICE,\n ): Promise<Asset> {\n const a = await this.get(assetId, auth);\n const refIds: AssetRefId[] = a.refIds ?? [];\n if (refIds.some((r) => isProductRef(r, productId))) return a;\n const ref: AssetRefId = { type: \"PRODUCT\", id: productId };\n // `/refIds/-` appends to an existing array only (RFC 6902).\n const op =\n a.refIds === undefined\n ? { op: \"add\" as const, path: \"/refIds\", value: [ref] }\n : { op: \"add\" as const, path: \"/refIds/-\", value: ref };\n await this.patch(assetId, [op], auth);\n return this.get(assetId, auth);\n }\n\n /**\n * Remove a PRODUCT refId from an asset (no-op if absent), through a JSON Patch\n * that replaces the references and nothing else. Resolves to the asset as\n * read back after the patch, like {@link attachToProduct}. Earlier versions\n * sent a spec-invalid JSON PUT, as that one did.\n */\n async detachFromProduct(\n assetId: string,\n productId: string,\n auth: AuthContext = SERVICE,\n ): Promise<Asset> {\n const a = await this.get(assetId, auth);\n const refIds: AssetRefId[] = a.refIds ?? [];\n const next = refIds.filter((r) => !isProductRef(r, productId));\n if (next.length === refIds.length) return a;\n await this.patch(assetId, [{ op: \"replace\", path: \"/refIds\", value: next }], auth);\n return this.get(assetId, auth);\n }\n\n /** Convenience: list assets attached to a product (server-side filter). */\n async listForProduct(\n productId: string,\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<Asset>> {\n return this.list({ \"refIds.id\": productId }, auth);\n }\n}\n\n// Re-export so consumers can `import { isProductRef } from \"@viu/emporix-sdk/media\"`?\n// Internal helper — kept module-private; convenience methods in Task 4 use it.\nexport const _internalMedia = { isProductRef };\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { requireCustomer } from \"../core/require-customer\";\nimport { SEARCH_PAGING, splitQuery, type SearchPaging } from \"../core/search\";\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/** Input for a segment search: the generated body (`{ q? }`) plus {@link SearchPaging} (query). */\nexport type SegmentSearchQuery = SegmentsSearch & SearchPaging;\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 /**\n * Searches segments: `q` in the body; paging, sort, fields, `legalEntityId`\n * and `customerId` in the query string. `customerId` returns that customer's\n * segments and needs `customersegment.segment_read`. Default auth: service.\n */\n async search(\n query: SegmentSearchQuery & { legalEntityId?: string; customerId?: string },\n authCtx: AuthContext = SERVICE,\n ): Promise<Segment[]> {\n return this.ctx.http.request<Segment[]>({\n method: \"POST\",\n path: `${this.base()}/search`,\n auth: authCtx,\n ...splitQuery(query, [...SEARCH_PAGING, \"legalEntityId\", \"customerId\"]),\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 (\n segmentId: string,\n query: Record<string, unknown> & SearchPaging,\n authCtx: AuthContext = SERVICE,\n ): Promise<SegmentCustomer[]> =>\n this.ctx.http.request<SegmentCustomer[]>({\n method: \"POST\",\n path: `${this.base()}/${segmentId}/customers/search`,\n auth: authCtx,\n ...splitQuery(query, SEARCH_PAGING),\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 ...splitQuery(query, SEARCH_PAGING),\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 (\n segmentId: string,\n query: Record<string, unknown> & SearchPaging & { legalEntityId?: string },\n authCtx: AuthContext = SERVICE,\n ): Promise<SegmentItem[]> =>\n this.ctx.http.request<SegmentItem[]>({\n method: \"POST\",\n path: `${this.base()}/${segmentId}/items/search`,\n auth: authCtx,\n ...splitQuery(query, [...SEARCH_PAGING, \"legalEntityId\"]),\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","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\nimport type {\n Site,\n SiteInput,\n SiteCreated,\n SiteMixin,\n SiteMixins,\n SiteMixinCreated,\n} from \"./site-types\";\n\nexport type {\n Site,\n SiteAddress,\n SiteHomeBase,\n SiteInput,\n SiteCreated,\n SiteMixin,\n SiteMixins,\n SiteMixinCreated,\n} from \"./site-types\";\n\nconst ANON: AuthContext = auth.anonymous();\nconst SERVICE: AuthContext = auth.service();\n\n/**\n * Read-only access to the tenant's site catalog. List returns active sites\n * visible to the storefront context (the `site_manage` scope is only needed\n * to read inactive sites).\n */\nexport class SiteService {\n static readonly channel = \"site\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Lists active sites. */\n async list(authCtx: AuthContext = ANON): Promise<Site[]> {\n return this.ctx.http.request<Site[]>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites`,\n auth: authCtx,\n });\n }\n\n /** Retrieves one site by code. */\n async get(code: string, authCtx: AuthContext = ANON): Promise<Site> {\n return this.ctx.http.request<Site>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${code}`,\n auth: authCtx,\n });\n }\n\n /**\n * Returns the tenant's default site (the one with `default: true`).\n * Throws if no default is configured — a tenant should always have one.\n */\n async current(authCtx: AuthContext = ANON): Promise<Site> {\n const sites = await this.list(authCtx);\n const def = sites.find((s) => s.default);\n if (!def) {\n throw new Error(\n `SiteService.current: no default site for tenant \"${this.ctx.tenant}\"`,\n );\n }\n return def;\n }\n\n /** Lists just the tenant's site codes (`GET /siteslist`). Default auth: anonymous. */\n async listCodes(authCtx: AuthContext = ANON): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/siteslist`,\n auth: authCtx,\n });\n }\n\n // --- Admin writes. Default auth: service. ---\n\n /** Creates a site (`POST /sites`). Default auth: service. */\n async create(input: SiteInput, authCtx: AuthContext = SERVICE): Promise<SiteCreated> {\n return this.ctx.http.request<SiteCreated>({\n method: \"POST\",\n path: `/site/${this.ctx.tenant}/sites`,\n body: input,\n auth: authCtx,\n });\n }\n\n /**\n * Partially updates a site (`PATCH /sites/{siteCode}`). The endpoint responds\n * 200 without a defined body, so nothing is returned — re-read with\n * {@link get} when the updated site is needed. Default auth: service.\n */\n async update(siteCode: string, input: SiteInput, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n body: input,\n auth: authCtx,\n });\n }\n\n /**\n * Full-replaces a site (`PUT /sites/{siteCode}`). Like {@link update} it\n * returns nothing (200 with no defined body). `options.expand` is forwarded as\n * a query parameter. Default auth: service.\n */\n async replace(\n siteCode: string,\n input: SiteInput,\n options: { expand?: string } = {},\n authCtx: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n ...(options.expand === undefined ? {} : { query: { expand: options.expand } }),\n body: input,\n auth: authCtx,\n });\n }\n\n /** Deletes a site (`DELETE /sites/{siteCode}`). Default auth: service. */\n async delete(siteCode: string, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n auth: authCtx,\n });\n }\n\n /**\n * Site mixins (`/sites/{siteCode}/mixins`). Mixin content is an open map —\n * the spec defines no structure. Reads default to anonymous, writes to\n * service auth.\n */\n readonly mixins = {\n /** All mixin groups of a site, as a map of group name to content. */\n list: async (siteCode: string, authCtx: AuthContext = ANON): Promise<SiteMixins> =>\n this.ctx.http.request<SiteMixins>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins`,\n auth: authCtx,\n }),\n\n /** One mixin group's content by name. */\n get: async (siteCode: string, mixinName: string, authCtx: AuthContext = ANON): Promise<SiteMixin> =>\n this.ctx.http.request<SiteMixin>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n auth: authCtx,\n }),\n\n /** Adds a mixin to a site. Default auth: service. */\n create: async (\n siteCode: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<SiteMixinCreated> =>\n this.ctx.http.request<SiteMixinCreated>({\n method: \"POST\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins`,\n body: input,\n auth: authCtx,\n }),\n\n /**\n * Partially updates a mixin (PATCH). Responds 200 without a defined body,\n * so nothing is returned. Default auth: service.\n */\n update: async (\n siteCode: string,\n mixinName: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n body: input,\n auth: authCtx,\n });\n },\n\n /** Full-replaces a mixin (PUT). Returns nothing, like {@link update}. Default auth: service. */\n replace: async (\n siteCode: string,\n mixinName: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n body: input,\n auth: authCtx,\n });\n },\n\n /** Removes a mixin from a site. Default auth: service. */\n delete: async (siteCode: string, mixinName: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n auth: authCtx,\n });\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\nimport type {\n SessionContext,\n SessionContextPatch,\n SessionAttributeInput,\n} from \"./session-context-types\";\n\nexport type {\n SessionContext,\n SessionContextPatch,\n SessionContextData,\n SessionAttributeInput,\n} from \"./session-context-types\";\n\nconst ANON: AuthContext = auth.anonymous();\n\n/**\n * Session-context binding for the current storefront session. Every method here\n * hits a `/me/context` path, so the session-id comes from the `Authorization`\n * token — no path or query parameter required.\n *\n * **The service's other half is intentionally not wrapped.** Emporix also exposes\n * the same four operations addressed by an explicit session id —\n * `GET`/`PUT /{sessionId}/context`, `POST`/`DELETE` on its attributes. Those are\n * administrative: they let a caller read and rewrite *someone else's* session,\n * which is not a storefront capability and needs a service token. Wrapping them\n * here would put an admin surface on the object a storefront holds. If you need\n * them, build the request directly — the generated types are in\n * `../generated/session-context`.\n */\nexport class SessionContextService {\n static readonly channel = \"session-context\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /**\n * Retrieves the current session context, or `null` when the server returns\n * 404 (no session exists yet — the session-context is created server-side\n * only after the user creates a cart).\n */\n async get(authCtx: AuthContext = ANON): Promise<SessionContext | null> {\n try {\n return await this.ctx.http.request<SessionContext>({\n method: \"GET\",\n path: `/session-context/${this.ctx.tenant}/me/context`,\n auth: authCtx,\n });\n } catch (err) {\n if (isNotFound(err)) return null;\n throw err;\n }\n }\n\n /**\n * Partially updates the current session context. Returns `true` when the\n * PATCH was applied, `false` when there is no session context yet (the\n * server returned 404 on the version-lookup GET, so there is nothing to\n * update). Non-404 errors propagate.\n */\n async patch(input: SessionContextPatch, authCtx: AuthContext = ANON): Promise<boolean> {\n let version = input.version;\n if (version === undefined) {\n const current = await this.get(authCtx);\n if (current === null) return false;\n version = current.metadata?.version;\n if (version === undefined) {\n throw new Error(\n \"SessionContextService.patch: no metadata.version in server response\",\n );\n }\n }\n const { version: _v, ...fields } = input;\n void _v;\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/session-context/${this.ctx.tenant}/me/context`,\n body: {\n ...fields,\n metadata: { version },\n },\n auth: authCtx,\n });\n return true;\n }\n\n /** Adds an attribute to the current session context. Default auth: anonymous. */\n async addAttribute(\n attribute: SessionAttributeInput,\n authCtx: AuthContext = ANON,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/session-context/${this.ctx.tenant}/me/context/attributes`,\n body: attribute,\n auth: authCtx,\n });\n }\n\n /** Removes a named attribute from the current session context. Default auth: anonymous. */\n async removeAttribute(name: string, authCtx: AuthContext = ANON): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/session-context/${this.ctx.tenant}/me/context/attributes/${encodeURIComponent(name)}`,\n auth: authCtx,\n });\n }\n}\n\nfunction isNotFound(err: unknown): boolean {\n if (err && typeof err === \"object\") {\n const status = (err as { status?: unknown }).status;\n if (typeof status === \"number\" && status === 404) return true;\n }\n return false;\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { SEARCH_PAGING, splitQuery, type SearchPaging } from \"../core/search\";\nimport type {\n LegalEntity,\n LegalEntityCreate,\n LegalEntityUpdate,\n} from \"../generated/customer-management\";\n\n/** Input for `companies.search`: an Emporix `q`-syntax filter (body) plus {@link SearchPaging} (query). */\nexport type LegalEntitySearchInput = { q?: string } & SearchPaging;\n\n/**\n * Storefront-customer access to Legal Entities.\n *\n * `listMine`/`get` require `customermanagement.legalentity_read_own` on the\n * customer token. `create`/`update`/`delete` require the corresponding\n * `_manage` scopes — typically only granted to Admin-group customers; a 403\n * surfaces as `EmporixInsufficientScopeError`.\n */\nexport class CompaniesService {\n static readonly channel = \"customer-management\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/customer-management/${this.ctx.tenant}/legal-entities`;\n }\n\n /** Lists the legal entities the calling customer is assigned to. */\n async listMine(auth: AuthContext): Promise<LegalEntity[]> {\n return this.ctx.http.request<LegalEntity[]>({\n method: \"GET\",\n path: this.base(),\n auth,\n });\n }\n\n /** Fetches a single legal entity by id. */\n async get(legalEntityId: string, auth: AuthContext): Promise<LegalEntity> {\n return this.ctx.http.request<LegalEntity>({\n method: \"GET\",\n path: `${this.base()}/${legalEntityId}`,\n auth,\n });\n }\n\n /** Creates a legal entity. Requires `customermanagement.legalentity_manage`. */\n async create(input: LegalEntityCreate, auth: AuthContext): Promise<{ id: string }> {\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /**\n * Updates a legal entity via `PUT …/legal-entities/{id}` (upsert / full\n * replace). The live API rejects `PATCH` on this path with 405; send the\n * complete entity, as the server replaces the resource. The body stays typed\n * as a partial of `LegalEntityUpdate` for backward compatibility.\n */\n async update(\n legalEntityId: string,\n patch: Partial<LegalEntityUpdate>,\n auth: AuthContext,\n ): Promise<LegalEntity> {\n return this.ctx.http.request<LegalEntity>({\n method: \"PUT\",\n path: `${this.base()}/${legalEntityId}`,\n auth,\n body: patch,\n });\n }\n\n /** Deletes a legal entity (async cascade on the server). */\n async delete(legalEntityId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${legalEntityId}`,\n auth,\n });\n }\n\n /**\n * Searches legal entities via `POST /legal-entities/search` with an Emporix\n * `q`-syntax filter body; paging, sort and fields go in the query string.\n * Requires the same read scope as {@link listMine}.\n */\n async search(query: LegalEntitySearchInput, auth: AuthContext): Promise<LegalEntity[]> {\n return this.ctx.http.request<LegalEntity[]>({\n method: \"POST\",\n path: `${this.base()}/search`,\n auth,\n ...splitQuery(query, SEARCH_PAGING),\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n\n /**\n * Retrieves a legal entity's chain of parent entities\n * (`GET /legal-entities/{id}/parent-hierarchy`).\n */\n async parentHierarchy(legalEntityId: string, auth: AuthContext): Promise<LegalEntity[]> {\n return this.ctx.http.request<LegalEntity[]>({\n method: \"GET\",\n path: `${this.base()}/${legalEntityId}/parent-hierarchy`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n ContactAssignment,\n ContactAssignmentCreate,\n ContactAssignmentUpdate,\n} from \"../generated/customer-management\";\n\n/**\n * Manages contact assignments linking customers to legal entities.\n *\n * `listForCompany` requires `customermanagement.contactassignment_read`;\n * `assign`/`update`/`unassign` require `_manage`. The query param\n * `legalEntityId` scopes the list to one company.\n */\nexport class ContactsService {\n static readonly channel = \"customer-management\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/customer-management/${this.ctx.tenant}/contact-assignments`;\n }\n\n /** Lists contact assignments for one legal entity. */\n async listForCompany(legalEntityId: string, auth: AuthContext): Promise<ContactAssignment[]> {\n return this.ctx.http.request<ContactAssignment[]>({\n method: \"GET\",\n path: this.base(),\n query: { legalEntityId },\n auth,\n });\n }\n\n /** Creates a contact assignment. */\n async assign(input: ContactAssignmentCreate, auth: AuthContext): Promise<{ id: string }> {\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /**\n * Updates a contact assignment via `PUT …/contact-assignments/{id}` (upsert /\n * full replace). The live API rejects `PATCH` on this path with 405; send the\n * complete entity, as the server replaces the resource. The body stays typed\n * as a partial of `ContactAssignmentUpdate` for backward compatibility.\n */\n async update(\n contactAssignmentId: string,\n patch: Partial<ContactAssignmentUpdate>,\n auth: AuthContext,\n ): Promise<ContactAssignment> {\n return this.ctx.http.request<ContactAssignment>({\n method: \"PUT\",\n path: `${this.base()}/${contactAssignmentId}`,\n auth,\n body: patch,\n });\n }\n\n /** Deletes a contact assignment. */\n async unassign(contactAssignmentId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${contactAssignmentId}`,\n auth,\n });\n }\n\n /** Fetches a single contact assignment by id. */\n async get(contactAssignmentId: string, auth: AuthContext): Promise<ContactAssignment> {\n return this.ctx.http.request<ContactAssignment>({\n method: \"GET\",\n path: `${this.base()}/${contactAssignmentId}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Location,\n LocationCreate,\n LocationUpdate,\n} from \"../generated/customer-management\";\n\n/**\n * Manages locations owned by a legal entity. Three types are supported:\n * HEADQUARTER, WAREHOUSE, OFFICE.\n *\n * Reads require `customermanagement.location_read`; mutations require\n * `_manage`.\n */\nexport class LocationsService {\n static readonly channel = \"customer-management\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/customer-management/${this.ctx.tenant}/locations`;\n }\n\n /** Lists locations owned by one legal entity. */\n async listForCompany(legalEntityId: string, auth: AuthContext): Promise<Location[]> {\n return this.ctx.http.request<Location[]>({\n method: \"GET\",\n path: this.base(),\n query: { legalEntityId },\n auth,\n });\n }\n\n /** Fetches one location by id. */\n async get(locationId: string, auth: AuthContext): Promise<Location> {\n return this.ctx.http.request<Location>({\n method: \"GET\",\n path: `${this.base()}/${locationId}`,\n auth,\n });\n }\n\n /** Creates a location for a legal entity. */\n async create(input: LocationCreate, auth: AuthContext): Promise<{ id: string }> {\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /**\n * Updates a location via `PUT …/locations/{id}` (upsert / full replace). The\n * live API rejects `PATCH` on this path with 405; send the complete entity,\n * as the server replaces the resource. The body stays typed as a partial of\n * `LocationUpdate` for backward compatibility.\n */\n async update(\n locationId: string,\n patch: Partial<LocationUpdate>,\n auth: AuthContext,\n ): Promise<Location> {\n return this.ctx.http.request<Location>({\n method: \"PUT\",\n path: `${this.base()}/${locationId}`,\n auth,\n body: patch,\n });\n }\n\n /** Deletes a location. */\n async delete(locationId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${locationId}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n IamUser,\n IamUserDetail,\n IamUserCreate,\n IamUserUpdate,\n IamUserScopes,\n IamUserCreated,\n IamGroup,\n IamGroupCreate,\n IamGroupUpdate,\n IamGroupCreated,\n IamGroupMemberInput,\n IamGroupMemberCreated,\n IamAccessControl,\n IamAccessControlUpsert,\n IamAccessControlCreated,\n IamScope,\n IamScopeUpsert,\n IamScopeCreated,\n} from \"./iam-types\";\n\nexport type * from \"./iam-types\";\n\n/**\n * IAM admin CRUD: users, user-groups, access-controls, scopes. Every method\n * requires an explicit `auth` (admin/service token; `getMe*` take the caller's\n * customer token). The deprecated legacy-RBAC model (roles/permissions/\n * resources/templates) is intentionally not wrapped.\n */\nexport class IamService {\n static readonly channel = \"iam\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/iam/${this.ctx.tenant}`;\n }\n\n readonly users = {\n list: async (auth: AuthContext, query?: Record<string, string | number>): Promise<IamUser[]> =>\n this.ctx.http.request<IamUser[]>({\n method: \"GET\",\n path: `${this.base()}/users`,\n auth,\n ...(query ? { query } : {}),\n }),\n create: async (input: IamUserCreate, auth: AuthContext): Promise<IamUserCreated> =>\n this.ctx.http.request<IamUserCreated>({\n method: \"POST\",\n path: `${this.base()}/users`,\n auth,\n body: input,\n }),\n get: async (userId: string, auth: AuthContext): Promise<IamUserDetail> =>\n this.ctx.http.request<IamUserDetail>({\n method: \"GET\",\n path: `${this.base()}/users/${userId}`,\n auth,\n }),\n getMe: async (auth: AuthContext): Promise<IamUserDetail> =>\n this.ctx.http.request<IamUserDetail>({\n method: \"GET\",\n path: `${this.base()}/users/me`,\n auth,\n }),\n update: async (userId: string, input: IamUserUpdate, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/users/${userId}`,\n auth,\n body: input,\n });\n },\n delete: async (userId: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/users/${userId}`,\n auth,\n });\n },\n /**\n * Lists one vendor's Management Dashboard users, with their groups\n * (`GET /users/vendors/{vendorId}`).\n */\n listForVendor: async (vendorId: string, auth: AuthContext): Promise<IamUser[]> =>\n this.ctx.http.request<IamUser[]>({\n method: \"GET\",\n path: `${this.base()}/users/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n }),\n getGroups: async (userId: string, auth: AuthContext): Promise<IamGroup[]> =>\n this.ctx.http.request<IamGroup[]>({\n method: \"GET\",\n path: `${this.base()}/users/${userId}/groups`,\n auth,\n }),\n /** Removes a user from every group at once (`DELETE /users/{userId}/groups`, `204`). */\n removeFromAllGroups: async (userId: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/users/${encodeURIComponent(userId)}/groups`,\n auth,\n });\n },\n /**\n * Reads one of a user's groups (`GET /users/{userId}/groups/{groupId}`).\n * The collection read above returns the same shape per entry; this exists\n * because Emporix exposes the item separately and a caller holding both ids\n * should not have to page the collection to resolve one group.\n */\n getGroup: async (userId: string, groupId: string, auth: AuthContext): Promise<IamGroup> =>\n this.ctx.http.request<IamGroup>({\n method: \"GET\",\n path: `${this.base()}/users/${encodeURIComponent(userId)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n }),\n getScopes: async (userId: string, auth: AuthContext): Promise<IamUserScopes> =>\n this.ctx.http.request<IamUserScopes>({\n method: \"GET\",\n path: `${this.base()}/users/${userId}/scopes`,\n auth,\n }),\n getMyScopes: async (auth: AuthContext): Promise<IamUserScopes> =>\n this.ctx.http.request<IamUserScopes>({\n method: \"GET\",\n path: `${this.base()}/users/me/scopes`,\n auth,\n }),\n getAccessControls: async (userId: string, auth: AuthContext): Promise<IamAccessControl[]> =>\n this.ctx.http.request<IamAccessControl[]>({\n method: \"GET\",\n path: `${this.base()}/users/${userId}/access-controls`,\n auth,\n }),\n getMyAccessControls: async (auth: AuthContext): Promise<IamAccessControl[]> =>\n this.ctx.http.request<IamAccessControl[]>({\n method: \"GET\",\n path: `${this.base()}/users/me/access-controls`,\n auth,\n }),\n };\n\n readonly groups = {\n list: async (auth: AuthContext, query?: Record<string, string | number>): Promise<IamGroup[]> =>\n this.ctx.http.request<IamGroup[]>({\n method: \"GET\",\n path: `${this.base()}/groups`,\n auth,\n ...(query ? { query } : {}),\n }),\n create: async (input: IamGroupCreate, auth: AuthContext): Promise<IamGroupCreated> =>\n this.ctx.http.request<IamGroupCreated>({\n method: \"POST\",\n path: `${this.base()}/groups`,\n auth,\n body: input,\n }),\n get: async (groupId: string, auth: AuthContext): Promise<IamGroup> =>\n this.ctx.http.request<IamGroup>({\n method: \"GET\",\n path: `${this.base()}/groups/${groupId}`,\n auth,\n }),\n update: async (groupId: string, input: IamGroupUpdate, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/groups/${groupId}`,\n auth,\n body: input,\n });\n },\n delete: async (groupId: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/groups/${groupId}`,\n auth,\n });\n },\n listUsers: async (groupId: string, auth: AuthContext): Promise<IamUser[]> =>\n this.ctx.http.request<IamUser[]>({\n method: \"GET\",\n path: `${this.base()}/groups/${groupId}/users`,\n auth,\n }),\n addUser: async (\n groupId: string,\n input: IamGroupMemberInput,\n auth: AuthContext,\n ): Promise<IamGroupMemberCreated> =>\n this.ctx.http.request<IamGroupMemberCreated>({\n method: \"POST\",\n path: `${this.base()}/groups/${groupId}/users`,\n auth,\n body: input,\n }),\n updateUser: async (\n groupId: string,\n userType: string,\n userId: string,\n input: IamGroupMemberInput,\n auth: AuthContext,\n ): Promise<IamGroupMemberCreated> =>\n this.ctx.http.request<IamGroupMemberCreated>({\n method: \"PUT\",\n path: `${this.base()}/groups/${groupId}/users/${userType}/${userId}`,\n auth,\n body: input,\n }),\n removeAllUsers: async (groupId: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/groups/${groupId}/users`,\n auth,\n });\n },\n listAccessControls: async (groupId: string, auth: AuthContext): Promise<IamAccessControl[]> =>\n this.ctx.http.request<IamAccessControl[]>({\n method: \"GET\",\n path: `${this.base()}/groups/${groupId}/access-controls`,\n auth,\n }),\n };\n\n readonly accessControls = {\n list: async (auth: AuthContext): Promise<IamAccessControl[]> =>\n this.ctx.http.request<IamAccessControl[]>({\n method: \"GET\",\n path: `${this.base()}/access-controls`,\n auth,\n }),\n get: async (id: string, auth: AuthContext): Promise<IamAccessControl> =>\n this.ctx.http.request<IamAccessControl>({\n method: \"GET\",\n path: `${this.base()}/access-controls/${id}`,\n auth,\n }),\n upsert: async (\n id: string,\n input: IamAccessControlUpsert,\n auth: AuthContext,\n ): Promise<IamAccessControlCreated> =>\n this.ctx.http.request<IamAccessControlCreated>({\n method: \"PUT\",\n path: `${this.base()}/access-controls/${id}`,\n auth,\n body: input,\n }),\n delete: async (id: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/access-controls/${id}`,\n auth,\n });\n },\n };\n\n readonly scopes = {\n list: async (auth: AuthContext): Promise<IamScope[]> =>\n this.ctx.http.request<IamScope[]>({\n method: \"GET\",\n path: `${this.base()}/scopes`,\n auth,\n }),\n get: async (scopeId: string, auth: AuthContext): Promise<IamScope> =>\n this.ctx.http.request<IamScope>({\n method: \"GET\",\n path: `${this.base()}/scopes/${scopeId}`,\n auth,\n }),\n upsertCustom: async (\n scopeId: string,\n input: IamScopeUpsert,\n auth: AuthContext,\n ): Promise<IamScopeCreated> =>\n this.ctx.http.request<IamScopeCreated>({\n method: \"PUT\",\n path: `${this.base()}/scopes/${scopeId}`,\n auth,\n body: input,\n }),\n deleteCustom: async (scopeId: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/scopes/${scopeId}`,\n auth,\n });\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { GroupsQueryDocument, AssignmentCreateRequest } from \"../generated/iam\";\nimport { IamService } from \"./iam\";\n\n/**\n * Access to IAM customer groups for a legal entity. Thin B2B-friendly wrapper\n * over {@link IamService.groups}; kept for backward compatibility.\n *\n * `listForCompany` requires `iam.group_read`; the member mutations\n * (`addMember`/`removeMember`) require `iam.group_manage` — typically only\n * granted to Admin-group customers; a 403 surfaces as\n * `EmporixInsufficientScopeError`.\n */\nexport class CustomerGroupsService {\n static readonly channel = \"iam\" as const;\n private readonly iam: IamService;\n constructor(private readonly ctx: ClientContext) {\n this.iam = new IamService(ctx);\n }\n\n /** Lists customer groups belonging to one legal entity. */\n async listForCompany(legalEntityId: string, auth: AuthContext): Promise<GroupsQueryDocument[]> {\n return this.iam.groups.list(auth, { \"b2b.legalEntityId\": legalEntityId });\n }\n\n /** Adds a user (customer or employee) to a group. */\n async addMember(\n groupId: string,\n member: AssignmentCreateRequest,\n auth: AuthContext,\n ): Promise<{ id: string }> {\n // `addUser` returns `AssignmentIdResponse` (id optional); the original public\n // contract is `{ id: string }` (the old `request<{id:string}>` asserted the\n // same). Cast to preserve that contract — the wire body is identical.\n return (await this.iam.groups.addUser(groupId, member, auth)) as { id: string };\n }\n\n /**\n * Removes a user from a group. Uses `DELETE …/groups/{groupId}/users/{userId}`\n * directly — this endpoint is deprecated upstream and intentionally not\n * exposed on {@link IamService}, so it is not delegated. No non-deprecated\n * single-user removal exists.\n */\n async removeMember(groupId: string, userId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/iam/${this.ctx.tenant}/groups/${groupId}/users/${userId}`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery, type QueryFor } from \"../core/query\";\nimport type {\n Order,\n OrderStatus,\n OrderUpdateDto,\n SalesOrder,\n Transition,\n SalesOrderCreationDto,\n ResourceLocation,\n SearchRequest,\n HistoricalTransitionsResponse,\n OrderCalculationDto,\n OrderEntriesDto,\n OrderSplitRequest,\n OrderSplitResponse,\n} from \"../generated/order-v2\";\n\n/**\n * Salesorder PATCH body. The generated `orderUpdateDto` models a full order\n * (it requires `entries`/`customer`), but `PATCH /salesorders/{id}` accepts a\n * subset — so the SDK exposes a partial of it.\n */\nexport type SalesOrderPatch = Partial<OrderUpdateDto>;\n\n/** Body for creating a sales-order as an employee (`POST /salesorders`). */\nexport type SalesOrderCreateInput = SalesOrderCreationDto;\n\n/** Id/location envelope returned when a sales-order is created. */\nexport type SalesOrderCreated = ResourceLocation;\n\n/** Body for a full sales-order replace (`PUT /salesorders/{id}`). */\nexport type SalesOrderReplaceInput = OrderUpdateDto;\n\n/** Body for `salesOrders.search` (`POST /salesorders/search`). */\nexport type SalesOrderSearchInput = SearchRequest;\n\n/** Response of `salesOrders.listHistoricalTransitions`. */\nexport type SalesOrderHistoricalTransitions = HistoricalTransitionsResponse;\n\n/** Body for `salesOrders.calculate` (`POST /salesorders/{id}/calculations`). */\nexport type SalesOrderCalculationInput = OrderCalculationDto;\n\n/** Body for `salesOrders.updateEntries` (`POST /salesorders/{id}/entries`). */\nexport type SalesOrderEntriesInput = OrderEntriesDto;\n\n/** Body for `salesOrders.split` (`POST /salesorders/{id}/split`). */\nexport type SalesOrderSplitInput = OrderSplitRequest;\n\n/** Response of `salesOrders.split`. */\nexport type SalesOrderSplitResult = OrderSplitResponse;\n\n/** Options for `salesOrders.list`. */\nexport interface ListSalesOrdersOptions {\n pageNumber?: number;\n pageSize?: number;\n sort?: string;\n fields?: string;\n /** A `q` filter — raw DSL string or a built filter for entity \"ORDER\". */\n q?: QueryFor<\"ORDER\">;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/** Options for `orders.listForLegalEntity`. */\nexport interface ListLegalEntityOrdersOptions {\n pageNumber?: number;\n pageSize?: number;\n sort?: string;\n saasToken?: string;\n /** A `q` filter — raw DSL string or a built filter for entity \"ORDER\". */\n q?: QueryFor<\"ORDER\">;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/** Optional fields supported by the order-v2 list endpoint. */\nexport interface ListMyOrdersOptions {\n pageNumber?: number;\n pageSize?: number;\n status?: OrderStatus;\n legalEntityId?: string;\n siteCode?: string;\n saasToken?: string;\n /** A `q` filter — raw DSL string or a built filter (e.g. mixinQuery for entity \"ORDER\"). */\n q?: QueryFor<\"ORDER\">;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/** Options for single-order reads (saas-token only). */\nexport interface GetOrderOptions {\n saasToken?: string;\n}\n\n/** Options for status transitions. */\nexport interface OrderTransitionOptions {\n saasToken?: string;\n comment?: string;\n}\n\n/** Options for `salesOrders.update`. */\nexport interface UpdateSalesOrderOptions {\n /** Forwarded as `?recalculate=`. Omit to use the server default (true). */\n recalculate?: boolean;\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/**\n * Storefront-customer access to Order-v2's customer endpoints.\n *\n * `listMine`/`get` require `order.order_read_own`; transitions require\n * `order.order_manage_own`. All methods accept an optional `saasToken` that\n * is passed as the `saas-token` header (mirrors `checkout.placeOrder`).\n */\nexport class OrdersService {\n static readonly channel = \"orders\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/order-v2/${this.ctx.tenant}/orders`;\n }\n\n private saasHeader(saasToken: string | undefined): Record<string, string> | undefined {\n return saasToken ? { \"saas-token\": saasToken } : undefined;\n }\n\n /** Lists the calling customer's orders. */\n async listMine(\n auth: AuthContext,\n opts: ListMyOrdersOptions = {},\n ): Promise<PaginatedItems<Order>> {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 50;\n const query: Record<string, string | number | undefined> = {\n pageNumber,\n pageSize,\n };\n setIfDefined(query, \"status\", opts.status);\n setIfDefined(query, \"legalEntityId\", opts.legalEntityId);\n setIfDefined(query, \"siteCode\", opts.siteCode);\n if (opts.q !== undefined) {\n setIfDefined(query, \"q\", resolveQuery(opts.q, { compoundLogicalQuery: false }));\n }\n const headers = this.saasHeader(opts.saasToken);\n // order-v2 returns a bare JSON array, not a {items,...} envelope — the total\n // lives in the X-Total-Count header, which `requestPage` reads when the\n // caller opts in with `totalCount: true`.\n return requestPage<Order>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.base(),\n query,\n auth,\n ...(headers ? { headers } : {}),\n },\n {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n },\n );\n }\n\n /** Fetches one of the calling customer's orders by id. */\n async get(\n orderId: string,\n auth: AuthContext,\n opts: GetOrderOptions = {},\n ): Promise<Order> {\n const headers = this.saasHeader(opts.saasToken);\n return this.ctx.http.request<Order>({\n method: \"GET\",\n path: `${this.base()}/${orderId}`,\n auth,\n ...(headers ? { headers } : {}),\n });\n }\n\n /**\n * The status transitions the customer may trigger on one of their orders\n * (`GET /orders/{orderId}/transitions`) — for example whether it can still be\n * cancelled, before offering {@link cancel}.\n */\n async listTransitions(\n orderId: string,\n auth: AuthContext,\n opts: GetOrderOptions = {},\n ): Promise<Transition[]> {\n const headers = this.saasHeader(opts.saasToken);\n return this.ctx.http.request<Transition[]>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(orderId)}/transitions`,\n auth,\n ...(headers ? { headers } : {}),\n });\n }\n\n /** Transitions an order to a new status. Server enforces legal transitions. */\n async transition(\n orderId: string,\n status: OrderStatus,\n auth: AuthContext,\n opts: OrderTransitionOptions = {},\n ): Promise<void> {\n const body: { status: OrderStatus; comment?: string } = { status };\n if (opts.comment !== undefined) body.comment = opts.comment;\n const headers = this.saasHeader(opts.saasToken);\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${orderId}/transitions`,\n auth,\n body,\n ...(headers ? { headers } : {}),\n });\n }\n\n /** Convenience: transitions to `DECLINED` (customer cancel). */\n async cancel(\n orderId: string,\n auth: AuthContext,\n opts: { saasToken?: string } = {},\n ): Promise<void> {\n await this.transition(orderId, \"DECLINED\", auth, opts);\n }\n\n /**\n * Lists a legal entity's orders (`GET /legal-entity-orders/{legalEntityId}`),\n * wrapped into `PaginatedItems`. B2B storefront view — requires a customer\n * token with access to the legal entity.\n */\n async listForLegalEntity(\n legalEntityId: string,\n auth: AuthContext,\n opts: ListLegalEntityOrdersOptions = {},\n ): Promise<PaginatedItems<SalesOrder>> {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 50;\n const query: Record<string, string | number | undefined> = { pageNumber, pageSize };\n setIfDefined(query, \"sort\", opts.sort);\n if (opts.q !== undefined) {\n setIfDefined(query, \"q\", resolveQuery(opts.q, { compoundLogicalQuery: false }));\n }\n const headers = this.saasHeader(opts.saasToken);\n return requestPage<SalesOrder>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/order-v2/${this.ctx.tenant}/legal-entity-orders/${legalEntityId}`,\n query,\n auth,\n ...(headers ? { headers } : {}),\n },\n {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n },\n );\n }\n\n /**\n * Fetches one order within a legal entity\n * (`GET /legal-entity-orders/{legalEntityId}/{orderId}`).\n */\n async getForLegalEntity(\n legalEntityId: string,\n orderId: string,\n auth: AuthContext,\n opts: { saasToken?: string } = {},\n ): Promise<SalesOrder> {\n const headers = this.saasHeader(opts.saasToken);\n return this.ctx.http.request<SalesOrder>({\n method: \"GET\",\n path: `/order-v2/${this.ctx.tenant}/legal-entity-orders/${legalEntityId}/${orderId}`,\n auth,\n ...(headers ? { headers } : {}),\n });\n }\n}\n\n/**\n * Backend / service-account access to the merchant-facing\n * `/salesorders/{id}` resource. Requires `order.order_read` (read) /\n * `order.order_manage` (update) scopes on a service token.\n *\n * The full admin list + filter surface is deferred to a follow-up\n * sub-spec. This service ships only single-resource read + patch — the\n * common backend use case (e.g. mixin updates after fulfilment).\n */\nexport class SalesOrdersService {\n static readonly channel = \"sales-orders\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/order-v2/${this.ctx.tenant}/salesorders`;\n }\n\n /** Fetches a single sales-order by id. */\n async get(orderId: string, auth: AuthContext): Promise<Order> {\n return this.ctx.http.request<Order>({\n method: \"GET\",\n path: `${this.base()}/${orderId}`,\n auth,\n });\n }\n\n /**\n * Patches an existing order (status, mixins, customAttributes, metadata).\n * Resolves on the `204`, which carries no body — read the order back with\n * {@link get} for its new state.\n */\n async update(\n orderId: string,\n patch: SalesOrderPatch,\n auth: AuthContext,\n opts: UpdateSalesOrderOptions = {},\n ): Promise<void> {\n const query: Record<string, string> = {};\n if (opts.recalculate === false) query.recalculate = \"false\";\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${orderId}`,\n auth,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n body: patch,\n });\n }\n\n /** Lists tenant sales-orders (`GET /salesorders`), wrapped into `PaginatedItems`. */\n async list(auth: AuthContext, opts: ListSalesOrdersOptions = {}): Promise<PaginatedItems<SalesOrder>> {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 50;\n const query: Record<string, string | number | undefined> = { pageNumber, pageSize };\n setIfDefined(query, \"sort\", opts.sort);\n setIfDefined(query, \"fields\", opts.fields);\n if (opts.q !== undefined) {\n setIfDefined(query, \"q\", resolveQuery(opts.q, { compoundLogicalQuery: false }));\n }\n return requestPage<SalesOrder>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.base(),\n query,\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n },\n );\n }\n\n /** Searches tenant sales-orders (`POST /salesorders/search`, body carries the `q` filter). */\n async search(\n query: SalesOrderSearchInput,\n auth: AuthContext,\n opts: { pageNumber?: number; pageSize?: number; sort?: string; fields?: string } = {},\n ): Promise<SalesOrder[]> {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"pageNumber\", opts.pageNumber);\n setIfDefined(q, \"pageSize\", opts.pageSize);\n setIfDefined(q, \"sort\", opts.sort);\n setIfDefined(q, \"fields\", opts.fields);\n return this.ctx.http.request<SalesOrder[]>({\n method: \"POST\",\n path: `${this.base()}/search`,\n ...(Object.keys(q).length > 0 ? { query: q } : {}),\n body: query,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n auth,\n });\n }\n\n /** Creates a sales-order as an employee (`POST /salesorders`). Returns the created resource location. */\n async create(input: SalesOrderCreateInput, auth: AuthContext): Promise<SalesOrderCreated> {\n return this.ctx.http.request<SalesOrderCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /**\n * Full-replaces a sales-order (`PUT /salesorders/{orderId}`, body `OrderUpdateDto`).\n * The endpoint returns 204, so the order is re-fetched (direct GET) and returned.\n * Note: `update` on this class is the PATCH (partial); `replace` is the PUT (full).\n */\n async replace(orderId: string, input: SalesOrderReplaceInput, auth: AuthContext): Promise<SalesOrder> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${orderId}`,\n auth,\n body: input,\n });\n return this.ctx.http.request<SalesOrder>({\n method: \"GET\",\n path: `${this.base()}/${orderId}`,\n auth,\n });\n }\n\n /** Deletes a sales-order (`DELETE /salesorders/{orderId}`). */\n async delete(orderId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${orderId}`,\n auth,\n });\n }\n\n /** Lists the available transitions for a sales-order (`GET /salesorders/{orderId}/transitions`). */\n async listTransitions(orderId: string, auth: AuthContext): Promise<Transition[]> {\n return this.ctx.http.request<Transition[]>({\n method: \"GET\",\n path: `${this.base()}/${orderId}/transitions`,\n auth,\n });\n }\n\n /** Transitions a sales-order to a new status (`POST /salesorders/{orderId}/transitions`). */\n async transition(orderId: string, input: Transition, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${orderId}/transitions`,\n auth,\n body: input,\n });\n }\n\n /** Lists the historical transitions of a sales-order (`GET /salesorders/{orderId}/historical-transitions`). */\n async listHistoricalTransitions(orderId: string, auth: AuthContext): Promise<SalesOrderHistoricalTransitions> {\n return this.ctx.http.request<SalesOrderHistoricalTransitions>({\n method: \"GET\",\n path: `${this.base()}/${orderId}/historical-transitions`,\n auth,\n });\n }\n\n /** Calculates order-entry totals for a sales-order (`POST /salesorders/{orderId}/calculations`). */\n async calculate(orderId: string, input: SalesOrderCalculationInput, auth: AuthContext): Promise<unknown> {\n return this.ctx.http.request<unknown>({\n method: \"POST\",\n path: `${this.base()}/${orderId}/calculations`,\n auth,\n body: input,\n });\n }\n\n /** Updates a sales-order's entries (`POST /salesorders/{orderId}/entries`). Returns the updated order. */\n async updateEntries(orderId: string, input: SalesOrderEntriesInput, auth: AuthContext): Promise<SalesOrder> {\n return this.ctx.http.request<SalesOrder>({\n method: \"POST\",\n path: `${this.base()}/${orderId}/entries`,\n auth,\n body: input,\n });\n }\n\n /** Splits a sales-order (`POST /salesorders/{orderId}/split`). */\n async split(orderId: string, input: SalesOrderSplitInput, auth: AuthContext): Promise<SalesOrderSplitResult> {\n return this.ctx.http.request<SalesOrderSplitResult>({\n method: \"POST\",\n path: `${this.base()}/${orderId}/split`,\n auth,\n body: input,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError } from \"../core/errors\";\nimport type {\n Availability,\n AvailabilityInput,\n AvailabilityCreated,\n AvailabilityBulkInput,\n AvailabilityBulkDeleteInput,\n AvailabilityBulkResult,\n} from \"./availability-types\";\n\nexport type {\n Availability,\n AvailabilityInput,\n AvailabilityCreated,\n AvailabilityBulkInput,\n AvailabilityBulkDeleteInput,\n AvailabilityBulkResult,\n} from \"./availability-types\";\n\n/** Shared options for {@link AvailabilityService} reads. */\nexport interface AvailabilityOptions {\n /**\n * When `true`, a product with no availability record resolves to a default\n * `{ available: true }` instead of throwing (single `get`) / being marked\n * unavailable (`getMany`). Off by default — opt in for tenants that sell\n * without stock management.\n */\n defaultAvailableOnNotFound?: boolean;\n}\n\nconst ANON: AuthContext = { kind: \"anonymous\" };\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Reads product availability per site. Default auth is anonymous (like\n * `PriceService.matchByContext`); pass a customer/raw/service context to use a\n * different token. Requires the `availability.availability_view` scope on\n * whichever token is used.\n */\nexport class AvailabilityService {\n static readonly channel = \"availability\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /**\n * Single product. Resolves the availability record, or — when\n * `opts.defaultAvailableOnNotFound` is set — a default available record on 404.\n */\n async get(\n productId: string,\n siteCode: string,\n auth: AuthContext = ANON,\n opts: AvailabilityOptions = {},\n ): Promise<Availability> {\n try {\n return await this.ctx.http.request<Availability>({\n method: \"GET\",\n path: `/availability/${this.ctx.tenant}/availability/${encodeURIComponent(\n productId,\n )}/${encodeURIComponent(siteCode)}`,\n auth,\n });\n } catch (err) {\n if (err instanceof EmporixNotFoundError && opts.defaultAvailableOnNotFound) {\n return { productId, site: siteCode, available: true };\n }\n throw err;\n }\n }\n\n /**\n * Batch read via `POST .../availability/search` (one request). Products with\n * no availability record are absent from the response; each is synthesized as\n * `{ available: false }` (or `{ available: true }` when\n * `opts.defaultAvailableOnNotFound` is set). The result preserves input order\n * and length. An empty `productIds` resolves to `[]` without a request.\n */\n async getMany(\n productIds: string[],\n siteCode: string,\n auth: AuthContext = ANON,\n opts: AvailabilityOptions = {},\n ): Promise<Availability[]> {\n if (productIds.length === 0) return [];\n const found = await this.ctx.http.request<Availability[]>({\n method: \"POST\",\n path: `/availability/${this.ctx.tenant}/availability/search`,\n auth,\n query: { site: siteCode, pageSize: productIds.length },\n body: productIds,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n const byId = new Map<string, Availability>();\n for (const a of found) if (a.productId) byId.set(a.productId, a);\n return productIds.map(\n (id) =>\n byId.get(id) ?? {\n productId: id,\n site: siteCode,\n available: Boolean(opts.defaultAvailableOnNotFound),\n },\n );\n }\n\n /**\n * Lists every availability record for a site (`GET /availability/site/{site}`),\n * wrapped into `PaginatedItems`. Default auth: anonymous.\n */\n async listForSite(\n siteCode: string,\n params: { pageNumber?: number; pageSize?: number; q?: string; sort?: string; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Availability>> {\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Availability>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/availability/${this.ctx.tenant}/availability/site/${encodeURIComponent(siteCode)}`,\n query: {\n pageNumber,\n pageSize,\n ...(params.q === undefined ? {} : { q: params.q }),\n ...(params.sort === undefined ? {} : { sort: params.sort }),\n },\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(params.totalCount === undefined ? {} : { totalCount: params.totalCount }),\n },\n );\n }\n\n // --- Admin writes. Default auth: service. ---\n\n /**\n * Creates an availability record for a product on a site\n * (`POST /availability/{productId}/{site}`). Responds 409 when the record\n * already exists — use {@link update} to upsert. Default auth: service.\n */\n async create(\n productId: string,\n siteCode: string,\n input: AvailabilityInput,\n auth: AuthContext = SERVICE,\n ): Promise<AvailabilityCreated> {\n return this.ctx.http.request<AvailabilityCreated>({\n method: \"POST\",\n path: `/availability/${this.ctx.tenant}/availability/${encodeURIComponent(\n productId,\n )}/${encodeURIComponent(siteCode)}`,\n body: input,\n auth,\n });\n }\n\n /**\n * Upserts a product's availability on a site\n * (`PUT /availability/{productId}/{site}`). Returns the created record's id\n * on 201 and nothing on 204. This endpoint has no PATCH counterpart.\n * Default auth: service.\n */\n async update(\n productId: string,\n siteCode: string,\n input: AvailabilityInput,\n auth: AuthContext = SERVICE,\n ): Promise<AvailabilityCreated | void> {\n return this.ctx.http.request<AvailabilityCreated | void>({\n method: \"PUT\",\n path: `/availability/${this.ctx.tenant}/availability/${encodeURIComponent(\n productId,\n )}/${encodeURIComponent(siteCode)}`,\n body: input,\n auth,\n });\n }\n\n /**\n * Deletes a product's availability on a site\n * (`DELETE /availability/{productId}/{site}`). Default auth: service.\n */\n async delete(productId: string, siteCode: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/availability/${this.ctx.tenant}/availability/${encodeURIComponent(\n productId,\n )}/${encodeURIComponent(siteCode)}`,\n auth,\n });\n }\n\n /**\n * Bulk-creates availability records (`POST /availability/bulk`). Responds 207\n * Multi-Status: partial failures do **not** throw — inspect each entry.\n *\n * `options.vendorId` limits the operation to a vendor's products. It is sent\n * as the `vendor-id` header. **Note:** the OpenAPI schema spells this header\n * `venodr-id`, which is an evident upstream typo (the body field is\n * `vendorId`); the SDK sends the corrected name. Unverified against the live\n * API — if the service really expects the misspelling, the filter silently\n * has no effect.\n *\n * Default auth: service.\n */\n async bulkCreate(\n input: AvailabilityBulkInput[],\n options: { vendorId?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<AvailabilityBulkResult[]> {\n return this.ctx.http.request<AvailabilityBulkResult[]>({\n method: \"POST\",\n path: `/availability/${this.ctx.tenant}/availability/bulk`,\n ...(options.vendorId === undefined ? {} : { headers: { \"vendor-id\": options.vendorId } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Bulk-updates availability records (`PUT /availability/bulk`). Responds 207\n * Multi-Status: partial failures do **not** throw — inspect each entry. See\n * {@link bulkCreate} for the `vendorId` header caveat. Default auth: service.\n */\n async bulkUpdate(\n input: AvailabilityBulkInput[],\n options: { vendorId?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<AvailabilityBulkResult[]> {\n return this.ctx.http.request<AvailabilityBulkResult[]>({\n method: \"PUT\",\n path: `/availability/${this.ctx.tenant}/availability/bulk`,\n ...(options.vendorId === undefined ? {} : { headers: { \"vendor-id\": options.vendorId } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Bulk-deletes availability records (`DELETE /availability/bulk`). Unusually\n * for a DELETE, this endpoint takes a body listing the records to remove.\n * Responds 207 Multi-Status: partial failures do **not** throw — inspect each\n * entry. See {@link bulkCreate} for the `vendorId` header caveat. Default\n * auth: service.\n */\n async bulkDelete(\n input: AvailabilityBulkDeleteInput[],\n options: { vendorId?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<AvailabilityBulkResult[]> {\n return this.ctx.http.request<AvailabilityBulkResult[]>({\n method: \"DELETE\",\n path: `/availability/${this.ctx.tenant}/availability/bulk`,\n ...(options.vendorId === undefined ? {} : { headers: { \"vendor-id\": options.vendorId } }),\n body: input,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Configuration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nexport type { Configuration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Tenant-wide configuration (`/configuration/{tenant}/configurations`).\n * Requires the backend-only `configuration.configuration_view` /\n * `configuration.configuration_manage` scopes — default auth: service.\n * Server-side use only; the service token must never reach a browser.\n */\nexport class TenantConfigService {\n static readonly channel = \"configuration\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/configuration/${this.ctx.tenant}/configurations`;\n }\n\n /** List tenant configurations, optionally filtered by `keys`. */\n async list(opts: ListConfigOptions = {}, auth: AuthContext = SERVICE): Promise<Configuration[]> {\n const query = opts.keys && opts.keys.length > 0 ? { keys: opts.keys.join(\",\") } : undefined;\n return this.ctx.http.request<Configuration[]>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(query ? { query } : {}),\n });\n }\n\n /** Retrieve one tenant configuration by key. */\n async get<T = unknown>(key: string, auth: AuthContext = SERVICE): Promise<Configuration<T>> {\n return this.ctx.http.request<Configuration<T>>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /** Create one or more tenant configurations (array in, array out). */\n async create(drafts: ConfigurationDraft[], auth: AuthContext = SERVICE): Promise<Configuration[]> {\n return this.ctx.http.request<Configuration[]>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: drafts,\n });\n }\n\n /** Update one tenant configuration by key. */\n async update<T = unknown>(\n key: string,\n draft: ConfigurationDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<Configuration<T>> {\n return this.ctx.http.request<Configuration<T>>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete one tenant configuration by key. */\n async delete(key: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /**\n * List the platform-wide global configurations\n * (`GET /global-configurations`) — a separate resource from the tenant's own\n * `/configurations`.\n */\n async listGlobal<T = unknown>(auth: AuthContext = SERVICE): Promise<Configuration<T>[]> {\n return this.ctx.http.request<Configuration<T>[]>({\n method: \"GET\",\n path: `/configuration/${this.ctx.tenant}/global-configurations`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { ClientConfiguration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nexport type { ClientConfiguration } from \"./configuration-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Per-client configuration (`/configuration/{tenant}/clients/{client}/configurations`).\n * Requires the backend-only `configuration.configuration_view` /\n * `configuration.configuration_manage` scopes — default auth: service.\n * Server-side use only; the service token must never reach a browser.\n * The `client` arg is injected into each write body so callers don't repeat it.\n */\nexport class ClientConfigService {\n static readonly channel = \"configuration\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(client: string): string {\n return `/configuration/${this.ctx.tenant}/clients/${encodeURIComponent(client)}/configurations`;\n }\n\n /** List a client's configurations, optionally filtered by `keys`. */\n async list(\n client: string,\n opts: ListConfigOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration[]> {\n const query = opts.keys && opts.keys.length > 0 ? { keys: opts.keys.join(\",\") } : undefined;\n return this.ctx.http.request<ClientConfiguration[]>({\n method: \"GET\",\n path: this.base(client),\n auth,\n ...(query ? { query } : {}),\n });\n }\n\n /** Retrieve one client configuration by key. */\n async get<T = unknown>(\n client: string,\n key: string,\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration<T>> {\n return this.ctx.http.request<ClientConfiguration<T>>({\n method: \"GET\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /** Create one or more client configurations. Injects `client` into each item. */\n async create(\n client: string,\n drafts: ConfigurationDraft[],\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration[]> {\n const body = drafts.map((d) => ({ ...d, client }));\n return this.ctx.http.request<ClientConfiguration[]>({\n method: \"POST\",\n path: this.base(client),\n auth,\n body,\n });\n }\n\n /** Update one client configuration by key. Injects `client` into the body. */\n async update<T = unknown>(\n client: string,\n key: string,\n draft: ConfigurationDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration<T>> {\n return this.ctx.http.request<ClientConfiguration<T>>({\n method: \"PUT\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n body: { ...draft, client },\n });\n }\n\n /** Delete one client configuration by key. */\n async delete(client: string, key: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /**\n * List the client ids that have configurations (`GET /clients`). Note this\n * targets `/configuration/{tenant}/clients` directly — the private `base`\n * helper appends `/configurations` for a specific client.\n */\n async listClients(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `/configuration/${this.ctx.tenant}/clients`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError } from \"../core/errors\";\n\n/** A single shopping-list line item. */\nexport interface ShoppingListItem {\n id?: number;\n productId: string;\n quantity: number;\n cuttingOption?: string;\n servicePackagingOption?: string;\n comment?: string;\n mixins?: Record<string, unknown>;\n}\n\n/** A shopping list, normalized from the per-customer wire envelope. */\nexport interface ShoppingList {\n key: string;\n name: string;\n items: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\n/** Input for create / replace. */\nexport interface ShoppingListDraft {\n name: string;\n items?: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n}\n\ninterface WireList {\n name?: string;\n items?: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nconst RESERVED = new Set([\"customerId\", \"metadata\"]);\n\n/** One per-customer wire envelope (`{ customerId, <listKey>: {…} }`) as a list array. */\nfunction toLists(env: Record<string, unknown>): ShoppingList[] {\n const out: ShoppingList[] = [];\n for (const [key, value] of Object.entries(env)) {\n if (RESERVED.has(key) || value === null || typeof value !== \"object\") continue;\n const v = value as WireList;\n out.push({\n key,\n name: v.name ?? key,\n items: v.items ?? [],\n ...(v.mixins ? { mixins: v.mixins } : {}),\n ...(v.metadata ? { metadata: v.metadata } : {}),\n });\n }\n return out;\n}\n\n/**\n * Per-customer shopping lists (`/shoppinglist/{tenant}/shopping-lists`).\n * `auth` is required: a customer token manages the caller's own lists;\n * a service token (employee scope) can act on any `customerId`. The Emporix\n * API has no item-level CRUD, so `addItem`/`removeItem`/`setItemQuantity`\n * read the list and `PUT` the full body — **last-write-wins**.\n */\nexport class ShoppingListService {\n static readonly channel = \"shopping-list\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/shoppinglist/${this.ctx.tenant}/shopping-lists`;\n }\n\n /**\n * The caller's lists, normalized to an array. With employee scope Emporix\n * returns **every customer's** lists and ignores `name` — read one customer's\n * with {@link getForCustomer} instead.\n */\n async list(auth: AuthContext, opts: { name?: string } = {}): Promise<ShoppingList[]> {\n const envelopes = await this.ctx.http.request<Array<Record<string, unknown>>>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n return (envelopes ?? []).flatMap(toLists);\n }\n\n /**\n * One customer's lists (`GET /shopping-lists/{customerId}`), normalized to an\n * array — the employee read; `name` narrows it to one list.\n */\n async getForCustomer(customerId: string, auth: AuthContext, opts: { name?: string } = {}): Promise<ShoppingList[]> {\n const envelope = await this.ctx.http.request<Record<string, unknown>>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n return envelope ? toLists(envelope) : [];\n }\n\n /** Create a list; returns the new list id. */\n async create(draft: ShoppingListDraft, auth: AuthContext): Promise<{ id: string }> {\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /** Replace the named list (low-level PUT). */\n async replace(customerId: string, draft: ShoppingListDraft, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete the named list, or all the customer's lists when `name` is omitted. */\n async delete(customerId: string, auth: AuthContext, opts: { name?: string } = {}): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n }\n\n private async loadList(customerId: string, listName: string, auth: AuthContext): Promise<ShoppingList> {\n // A service token reads the target customer's lists: through `list()` it\n // would get every customer's, with `name` ignored, and the first match\n // could belong to someone else — whose items would then be written here.\n const lists =\n auth.kind === \"service\"\n ? await this.getForCustomer(customerId, auth, { name: listName })\n : await this.list(auth, { name: listName });\n const found = lists.find((l) => l.name === listName);\n if (!found) throw new EmporixNotFoundError(`Shopping list \"${listName}\" not found`, 404);\n return found;\n }\n\n private async put(customerId: string, list: ShoppingList, items: ShoppingListItem[], auth: AuthContext): Promise<void> {\n await this.replace(\n customerId,\n { name: list.name, items, ...(list.mixins ? { mixins: list.mixins } : {}) },\n auth,\n );\n }\n\n /** Add/replace an item by `productId` (read-modify-write, last-write-wins). */\n async addItem(customerId: string, listName: string, item: ShoppingListItem, auth: AuthContext): Promise<void> {\n const list = await this.loadList(customerId, listName, auth);\n const items = [...list.items.filter((i) => i.productId !== item.productId), item];\n await this.put(customerId, list, items, auth);\n }\n\n /** Remove an item by `productId` (no-op if absent). */\n async removeItem(customerId: string, listName: string, productId: string, auth: AuthContext): Promise<void> {\n const list = await this.loadList(customerId, listName, auth);\n const items = list.items.filter((i) => i.productId !== productId);\n await this.put(customerId, list, items, auth);\n }\n\n /** Set an item's quantity; `quantity <= 0` removes it. Adds the item if absent. */\n async setItemQuantity(customerId: string, listName: string, productId: string, quantity: number, auth: AuthContext): Promise<void> {\n if (quantity <= 0) return this.removeItem(customerId, listName, productId, auth);\n const list = await this.loadList(customerId, listName, auth);\n let items = list.items.map((i) => (i.productId === productId ? { ...i, quantity } : i));\n if (!items.some((i) => i.productId === productId)) items = [...items, { productId, quantity }];\n await this.put(customerId, list, items, auth);\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { MetadataFilter, RagType } from \"./ai-rag-indexer-types\";\n\nexport type { MetadataFilter, RagType } from \"./ai-rag-indexer-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * AI RAG Indexer (`/ai-rag-indexer/{tenant}/{type}`). Read which fields the RAG\n * index embeds / can filter on, and trigger a full asynchronous rebuild.\n *\n * Requires the backend-only `ai.agent_read` (reads) / `ai.agent_manage`\n * (`reindex`) scopes — default auth: service. **Server-side use only**; the\n * service token must never reach a browser.\n *\n * Quirks: only `PRODUCT` exists today (the `type` arg defaults to it);\n * `reindex` is a **full** rebuild (no delta), runs **asynchronously**, returns\n * `204` once *scheduled* (not on completion), has **no status endpoint** to\n * poll, and is costly — call it sparingly. The set of embedded fields is\n * configured in the AI Service, not here.\n */\nexport class RagIndexerService {\n static readonly channel = \"ai-rag-indexer\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(type: RagType): string {\n return `/ai-rag-indexer/${this.ctx.tenant}/${encodeURIComponent(type)}`;\n }\n\n /** The indexable embedding field names for `type` (default `\"PRODUCT\"`). */\n async ragMetadata(type: RagType = \"PRODUCT\", auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `${this.base(type)}/rag-metadata`,\n auth,\n });\n }\n\n /** The filterable metadata fields for `type` (default `\"PRODUCT\"`). */\n async filterMetadata(\n type: RagType = \"PRODUCT\",\n auth: AuthContext = SERVICE,\n ): Promise<MetadataFilter[]> {\n return this.ctx.http.request<MetadataFilter[]>({\n method: \"GET\",\n path: `${this.base(type)}/filter-metadata`,\n auth,\n });\n }\n\n /**\n * Schedule a full asynchronous re-index for `type` (default `\"PRODUCT\"`).\n * Resolves once the rebuild is *scheduled* (HTTP 204); there is no progress\n * to await or poll. Costly — avoid calling on a hot path.\n * @deprecated since 2026-06-18, removal 2026-12-01 — use the indexing service:\n * `client.indexing.createReindexJob({ entityType: \"PRODUCT\", rag: true })`.\n */\n async reindex(type: RagType = \"PRODUCT\", auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base(type)}/reindex`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n SequenceSchema,\n SequenceSchemaCreate,\n NextIdCommandRequest,\n NextIdResponse,\n NextIdOptions,\n NextIdsBatchRequest,\n NextIdsBatchResponse,\n} from \"./sequential-id-types\";\n\nexport type {\n SequenceSchema,\n SequenceSchemaCreate,\n NextIdCommandRequest,\n NextIdResponse,\n NextIdOptions,\n BatchNextIdEntry,\n NextIdsBatchRequest,\n NextIdsBatchResponse,\n} from \"./sequential-id-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Sequential ID Service (`/sequential-id/{tenant}/…`): server-managed,\n * gap-free sequential identifiers (order/invoice numbers, etc.) driven by\n * tenant-defined sequence schemas.\n *\n * Requires the backend-only `sequentialid.schema_view` (read + next-id) /\n * `sequentialid.schema_manage` (CRUD + set-active) scopes — default auth:\n * service. Server-side use only; the service token must never reach a browser.\n *\n * Schemas are immutable upstream (no PATCH/PUT): to change one, `deleteSchema`\n * then `createSchema`. The `maxValue` is a hard cap with no auto-reset, and\n * only one schema may be active per type.\n */\nexport class SequentialIdService {\n static readonly channel = \"sequential-id\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/sequential-id/${this.ctx.tenant}/schemas`;\n }\n\n /** List all sequence schemas for the tenant. */\n async listSchemas(auth: AuthContext = SERVICE): Promise<SequenceSchema[]> {\n return this.ctx.http.request<SequenceSchema[]>({\n method: \"GET\",\n path: this.base(),\n auth,\n });\n }\n\n /** Retrieve one sequence schema by id. */\n async getSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}`,\n auth,\n });\n }\n\n /** Create a sequence schema. Schemas are immutable — there is no update. */\n async createSchema(\n schema: SequenceSchemaCreate,\n auth: AuthContext = SERVICE,\n ): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: schema,\n });\n }\n\n /** Delete a sequence schema by id. */\n async deleteSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}`,\n auth,\n });\n }\n\n /** Mark a schema active for its type (only one schema may be active per type). */\n async setActiveSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}/setActive`,\n auth,\n });\n }\n\n /** Get the active schema for a given schema type. */\n async listSchemasByType(schemaType: string, auth: AuthContext = SERVICE): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"GET\",\n path: `${this.base()}/types/${encodeURIComponent(schemaType)}`,\n auth,\n });\n }\n\n /**\n * Generate the next id for a schema type. `body` carries an optional\n * `sequenceKey` (independent sub-pool counter) and `placeholders`.\n * `opts.siteCode` derives time/country placeholders from the site's settings.\n */\n async nextId(\n schemaType: string,\n body: NextIdCommandRequest = {},\n opts: NextIdOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<NextIdResponse> {\n const query = opts.siteCode ? { siteCode: opts.siteCode } : undefined;\n return this.ctx.http.request<NextIdResponse>({\n method: \"POST\",\n path: `${this.base()}/types/${encodeURIComponent(schemaType)}/nextId`,\n auth,\n body,\n ...(query ? { query } : {}),\n });\n }\n\n /**\n * Generate next ids for multiple schema types in one call. NOTE: the batch\n * endpoint path omits the `{tenant}` segment — the service derives the\n * tenant from the token.\n */\n async nextIdsBatch(\n req: NextIdsBatchRequest,\n auth: AuthContext = SERVICE,\n ): Promise<NextIdsBatchResponse> {\n return this.ctx.http.request<NextIdsBatchResponse>({\n method: \"POST\",\n path: `/sequential-id/sequenceSchemaBatch/nextIds`,\n auth,\n body: req,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { splitQuery } from \"../core/search\";\nimport type {\n Fee,\n ItemFee,\n FeeDraft,\n ItemFeeDraft,\n ItemFeeSearch,\n ItemFeeSearchByProductId,\n ItemFeeSearchByProductIds,\n ListFeesQuery,\n SetItemFeesOptions,\n} from \"./fee-types\";\n\nexport type {\n Fee,\n ItemFee,\n FeeDraft,\n ItemFeeDraft,\n ItemFeeSearch,\n ItemFeeSearchByProductId,\n ItemFeeSearchByProductIds,\n ListFeesQuery,\n SetItemFeesOptions,\n} from \"./fee-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Fee Service (`/fee/{tenant}/…`): fee definitions plus the\n * item/product mappings that attach them. Writes require a backend-only scope\n * (`fee.fee_*` / `fee.item_*`); GETs need a token but no scope. Default auth:\n * service. Server-side use only — the service token must never reach a browser.\n *\n * Quirks (server behavior, not handled here): a payment-type fee's `code` must\n * equal the payment-mode code or the fee is silently ignored; a wrong/missing\n * `siteCode` filters to an empty array rather than erroring; an expired\n * `activeTimespan` silently disables the fee; `setItemFees`/`setProductFees`\n * replace the whole mapping unless `partial` is set.\n */\nexport class FeeService {\n static readonly channel = \"fee\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private feesBase(): string {\n return `/fee/${this.ctx.tenant}/fees`;\n }\n\n private itemFeesBase(): string {\n return `/fee/${this.ctx.tenant}/itemFees`;\n }\n\n private productFeesBase(): string {\n return `/fee/${this.ctx.tenant}/productFees`;\n }\n\n // --- Fee definitions ---\n\n /**\n * List fee definitions, wrapped in the shared {@link PaginatedItems}\n * envelope (same heuristic as `media.list`: `hasNextPage` is true when the\n * returned page is full). Defaults match Emporix server defaults\n * (`pageNumber: 1`, `pageSize: 60`).\n */\n async list(query: ListFeesQuery = {}, auth: AuthContext = SERVICE): Promise<PaginatedItems<Fee>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n // Destructured out because the rest is spread into the query string — see\n // `media.list` for the same note.\n const { totalCount, ...rest } = query;\n return requestPage<Fee>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.feesBase(),\n auth,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n /** Retrieve one fee definition by id. */\n async get(id: string, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"GET\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a fee definition. */\n async create(draft: FeeDraft, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"POST\",\n path: this.feesBase(),\n auth,\n body: draft,\n });\n }\n\n /** Update a fee definition by id. */\n async update(id: string, draft: FeeDraft, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"PUT\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a fee definition by id. */\n async delete(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n // --- Item-fee mappings ---\n\n /** List all item-fee mappings. */\n async listItemFees(auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: this.itemFeesBase(),\n auth,\n });\n }\n\n /** Fee mappings for one item YRN. */\n async getItemFees(itemYrn: string, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`,\n auth,\n });\n }\n\n /** Create an item-fee mapping. */\n async createItemFee(draft: ItemFeeDraft, auth: AuthContext = SERVICE): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"POST\",\n path: this.itemFeesBase(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Set the fee list for an item YRN. Destructive replace by default; pass\n * `{ partial: true }` to merge (`?partial=true`).\n */\n async setItemFees(\n itemYrn: string,\n feeIds: string[],\n opts: SetItemFeesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"PUT\",\n path: `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`,\n auth,\n body: { feeIds },\n ...(opts.partial ? { query: { partial: \"true\" } } : {}),\n });\n }\n\n /**\n * Delete item-fee mappings for a YRN. Without `feeId`, removes all mappings\n * for the YRN; with `feeId`, removes that single fee from the mapping.\n */\n async deleteItemFees(itemYrn: string, feeId?: string, auth: AuthContext = SERVICE): Promise<void> {\n const base = `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`;\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: feeId ? `${base}/${encodeURIComponent(feeId)}` : base,\n auth,\n });\n }\n\n /** Search item-fee mappings by item YRNs + site. */\n async searchItemFees(search: ItemFeeSearch, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/search`,\n auth,\n body: search,\n });\n }\n\n // --- Product-fee mappings ---\n\n /** Fee mappings for a product id. */\n async getProductFees(productId: string, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n });\n }\n\n /**\n * Set the fee list for a product id. Destructive replace by default; pass\n * `{ partial: true }` to merge (`?partial=true`).\n */\n async setProductFees(\n productId: string,\n feeIds: string[],\n opts: SetItemFeesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"PUT\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n body: { feeIds },\n ...(opts.partial ? { query: { partial: \"true\" } } : {}),\n });\n }\n\n /** Delete all fee mappings for a product id. */\n async deleteProductFees(productId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n });\n }\n\n /**\n * Removes **one** fee from a product\n * (`DELETE /productFees/{productId}/fees/{feeId}`). Use\n * {@link deleteProductFees} to clear every fee of a product.\n */\n async deleteProductFee(\n productId: string,\n feeId: string,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees/${encodeURIComponent(feeId)}`,\n auth,\n });\n }\n\n /**\n * Finds item fees for one product across several sites\n * (`POST /itemFees/searchByProductId`).\n */\n async searchItemFeesByProductId(\n search: ItemFeeSearchByProductId,\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/searchByProductId`,\n auth,\n body: search,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n\n /**\n * Finds item fees for several products on one site\n * (`POST /itemFees/searchByProductIds`). Note the upstream asymmetry:\n * `productIds` is a comma-separated **string** and `siteCode` is singular.\n * `siteFallback` goes in the query string, everything else in the body.\n */\n async searchItemFeesByProductIds(\n search: ItemFeeSearchByProductIds,\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/searchByProductIds`,\n auth,\n ...splitQuery(search, [\"siteFallback\"]),\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\n\n/** Options for {@link CloudFunctionsService.invoke}. */\nexport interface InvokeCloudFunctionOptions<TReq = unknown> {\n /** HTTP method. Default: \"POST\" (the canonical invoke). */\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n /** Optional sub-path the function exposes (leading slash optional). */\n path?: string;\n /** Request body (arbitrary JSON). */\n body?: TReq;\n /** Query-string params. */\n query?: Record<string, string | number | undefined>;\n /** Extra request headers (Content-Type: application/json is the default). */\n headers?: Record<string, string>;\n}\n\n/**\n * Invokes Emporix-hosted cloud functions. Request/response shapes are\n * caller-defined (generic) — there is no schema. Auth may be service,\n * customer, anonymous, or raw; the default is anonymous.\n */\nexport class CloudFunctionsService {\n static readonly channel = \"cloud-functions\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/cloud-functions/${this.ctx.tenant}/functions`;\n }\n\n async invoke<TRes = unknown, TReq = unknown>(\n functionId: string,\n options: InvokeCloudFunctionOptions<TReq> = {},\n authCtx: AuthContext = auth.anonymous(),\n ): Promise<TRes> {\n const sub = options.path ? `/${options.path.replace(/^\\//, \"\")}` : \"\";\n return this.ctx.http.request<TRes>({\n method: options.method ?? \"POST\",\n path: `${this.base()}/${functionId}${sub}`,\n auth: authCtx,\n ...(options.body !== undefined ? { body: options.body } : {}),\n ...(options.query ? { query: options.query } : {}),\n ...(options.headers ? { headers: options.headers } : {}),\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n WebhookSubscription,\n WebhookSubscriptionUpdateItem,\n WebhookSubscriptionUpdateResultItem,\n WebhookConfig,\n WebhookConfigDraft,\n WebhookConfigPatch,\n WebhookConfigCreated,\n WebhookStatistics,\n WebhookDashboardAccess,\n WebhookStatisticsQuery,\n DeleteConfigOptions,\n} from \"./webhook-types\";\n\nexport type {\n WebhookSubscription,\n WebhookSubscriptionUpdateItem,\n WebhookSubscriptionUpdateResultItem,\n WebhookConfig,\n WebhookConfigDraft,\n WebhookConfigPatch,\n WebhookConfigCreated,\n WebhookStatistics,\n WebhookDashboardAccess,\n WebhookStatisticsQuery,\n DeleteConfigOptions,\n} from \"./webhook-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Webhook administration (`/webhook/{tenant}/…`): the event-subscription\n * catalog and batch toggle, delivery-config CRUD, statistics, and Svix\n * dashboard access. Requires the backend-only `webhook.subscription_read` /\n * `webhook.subscription_manage` scopes — default auth: service. Server-side\n * use only; the service token must never reach a browser.\n */\nexport class WebhookService {\n static readonly channel = \"webhook\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/webhook/${this.ctx.tenant}`;\n }\n\n /** List the event-subscription catalog with each event's on/off state. */\n async listEventSubscriptions(auth: AuthContext = SERVICE): Promise<WebhookSubscription[]> {\n return this.ctx.http.request<WebhookSubscription[]>({\n method: \"GET\",\n path: `${this.base()}/event-subscriptions`,\n auth,\n });\n }\n\n /**\n * Batch subscribe/unsubscribe events. Returns the **207** per-item result\n * array verbatim — the batch can partially fail, so inspect each element's\n * `code`/`status` (e.g. `results.filter(r => (r.code ?? 0) >= 400)`). Does\n * NOT throw on a 207 with failed items; only a non-2xx HTTP status throws.\n */\n async updateEventSubscriptions(\n items: WebhookSubscriptionUpdateItem[],\n auth: AuthContext = SERVICE,\n ): Promise<WebhookSubscriptionUpdateResultItem[]> {\n return this.ctx.http.request<WebhookSubscriptionUpdateResultItem[]>({\n method: \"PATCH\",\n path: `${this.base()}/event-subscriptions`,\n auth,\n body: items,\n });\n }\n\n /** List delivery configurations. */\n async listConfigs(auth: AuthContext = SERVICE): Promise<WebhookConfig[]> {\n return this.ctx.http.request<WebhookConfig[]>({\n method: \"GET\",\n path: `${this.base()}/config`,\n auth,\n });\n }\n\n /** Retrieve one delivery configuration by code. */\n async getConfig(code: string, auth: AuthContext = SERVICE): Promise<WebhookConfig> {\n return this.ctx.http.request<WebhookConfig>({\n method: \"GET\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a delivery configuration. Returns the server-assigned `{ code }`. */\n async createConfig(\n draft: WebhookConfigDraft,\n auth: AuthContext = SERVICE,\n ): Promise<WebhookConfigCreated> {\n return this.ctx.http.request<WebhookConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/config`,\n auth,\n body: draft,\n });\n }\n\n /** Replace a delivery configuration by code (204). */\n async replaceConfig(\n code: string,\n draft: WebhookConfigDraft,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n body: draft,\n });\n }\n\n /**\n * Partially update a delivery configuration by code (204). The body is an\n * **array** of `{ op, path, value }` operations (UPSERT / REMOVE).\n */\n async patchConfig(\n code: string,\n patches: WebhookConfigPatch[],\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n body: patches,\n });\n }\n\n /**\n * Delete a delivery configuration by code. Pass `{ force: true }` to delete\n * the currently-active config (the server otherwise rejects it).\n */\n async deleteConfig(\n code: string,\n opts: DeleteConfigOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n ...(opts.force === true ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /** Read delivery statistics over an optional `YYYY-MM` range. */\n async getStatistics(\n query: WebhookStatisticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<WebhookStatistics> {\n const q: Record<string, string> = {};\n if (query.fromYearMonth) q.fromYearMonth = query.fromYearMonth;\n if (query.toYearMonth) q.toYearMonth = query.toYearMonth;\n return this.ctx.http.request<WebhookStatistics>({\n method: \"GET\",\n path: `${this.base()}/statistics`,\n auth,\n ...(Object.keys(q).length > 0 ? { query: q } : {}),\n });\n }\n\n /** Obtain Svix dashboard access (URL / token). */\n async getDashboardAccess(auth: AuthContext = SERVICE): Promise<WebhookDashboardAccess> {\n return this.ctx.http.request<WebhookDashboardAccess>({\n method: \"GET\",\n path: `${this.base()}/dashboard-access`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Schema,\n SchemaDraft,\n SchemaUpdate,\n SchemaTypeName,\n SchemaTargetType,\n SchemaCreated,\n ListSchemasQuery,\n CustomEntity,\n CustomEntityDraft,\n CustomEntityUpdate,\n CustomEntityCreated,\n CustomInstance,\n CustomInstanceDraft,\n CustomInstanceReplace,\n CustomInstancePatch,\n CustomInstanceCreated,\n ListInstancesQuery,\n ListCustomEntitiesOptions,\n InstanceSearchBody,\n SearchInstancesQuery,\n BulkPatchInstanceItem,\n BulkInstanceResult,\n SchemaReference,\n SchemaReferenceInput,\n SchemaReferenceUpdateInput,\n SchemaReferenceCreated,\n SchemaInstanceBulkCreateItem,\n SchemaInstanceBulkUpsertItem,\n SchemaExport,\n SchemaImportInput,\n ListSchemaReferencesQuery,\n} from \"./schema-types\";\n\nexport type {\n Schema,\n SchemaAttribute,\n SchemaTypeName,\n SchemaTargetType,\n SchemaDraft,\n SchemaUpdate,\n SchemaCreated,\n CustomEntity,\n CustomInstance,\n CustomEntityDraft,\n CustomEntityUpdate,\n CustomEntityCreated,\n CustomInstanceDraft,\n CustomInstanceReplace,\n CustomInstancePatch,\n CustomInstanceCreated,\n ListSchemasQuery,\n ListInstancesQuery,\n ListCustomEntitiesOptions,\n InstanceSearchBody,\n SearchInstancesQuery,\n BulkPatchInstanceItem,\n BulkInstanceResult,\n SchemaReference,\n SchemaReferenceInput,\n SchemaReferenceUpdateInput,\n SchemaReferenceCreated,\n SchemaInstanceBulkCreateItem,\n SchemaInstanceBulkUpsertItem,\n SchemaExport,\n SchemaImportInput,\n ListSchemaReferencesQuery,\n} from \"./schema-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** Passes a `Blob` through; serializes a plain object into a JSON blob. */\nfunction toJsonBlob(file: Blob | Record<string, unknown>): Blob {\n return file instanceof Blob\n ? file\n : new Blob([JSON.stringify(file)], { type: \"application/json\" });\n}\n\n/**\n * Schema Service (`/schema/{tenant}/…`): schemas, entity types, custom\n * entities and their instances. Requires the backend-only `schema.schema_*`\n * / `schema.custominstance_*` scopes — default auth: service. Server-side use\n * only; the service token must never reach a browser.\n */\nexport class SchemaService {\n static readonly channel = \"schema\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private schemasBase(): string {\n return `/schema/${this.ctx.tenant}/schemas`;\n }\n\n private entitiesBase(): string {\n return `/schema/${this.ctx.tenant}/custom-entities`;\n }\n\n private instancesBase(type: string): string {\n return `${this.entitiesBase()}/${encodeURIComponent(type)}/instances`;\n }\n\n private referencesBase(): string {\n return `/schema/${this.ctx.tenant}/references`;\n }\n\n // --- (A) Schemas ---------------------------------------------------------\n\n /**\n * List schemas, wrapped in the shared {@link PaginatedItems} envelope.\n * `hasNextPage` is the standard SDK heuristic (`items.length === pageSize`).\n * Pagination defaults match the rest of the SDK (`pageNumber: 1`,\n * `pageSize: 60`).\n */\n async listSchemas(\n query: ListSchemasQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<Schema>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.q) q.q = query.q;\n if (query.type) q.type = query.type;\n return requestPage<Schema>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.schemasBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Retrieve one schema by id. */\n async getSchema(id: string, auth: AuthContext = SERVICE): Promise<Schema> {\n return this.ctx.http.request<Schema>({\n method: \"GET\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a schema. Resolves to the `201`'s id envelope — read the schema back for the rest. */\n async createSchema(draft: SchemaDraft, auth: AuthContext = SERVICE): Promise<SchemaCreated> {\n return this.ctx.http.request<SchemaCreated>({\n method: \"POST\",\n path: this.schemasBase(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Update a schema; resolves on the `204`. The upstream API requires\n * `draft.metadata.version`; a stale version yields a 409\n * (`EmporixConflictError`).\n */\n async updateSchema(\n id: string,\n draft: SchemaUpdate,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a schema by id. */\n async deleteSchema(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Validate a schema document without persisting it (`POST /schemas/file`).\n * Returns the server's validation result verbatim.\n */\n async validateSchemaFile<R = unknown>(\n body: SchemaDraft,\n auth: AuthContext = SERVICE,\n ): Promise<R> {\n return this.ctx.http.request<R>({\n method: \"POST\",\n path: `${this.schemasBase()}/file`,\n auth,\n body,\n });\n }\n\n // --- (B) Types -----------------------------------------------------------\n\n /** List entity types that currently have at least one schema. */\n async listTypes(auth: AuthContext = SERVICE): Promise<SchemaTypeName[]> {\n return this.ctx.http.request<SchemaTypeName[]>({\n method: \"GET\",\n path: `/schema/${this.ctx.tenant}/types`,\n auth,\n });\n }\n\n /** Set the entity types a schema applies to (`PUT /schemas/{id}/types`). */\n async setSchemaTypes(\n id: string,\n types: SchemaTargetType[],\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}/types`,\n auth,\n body: { types },\n });\n }\n\n // --- (C) Custom entities -------------------------------------------------\n\n /** List custom-entity definitions. `expandSchemas` inlines each schema body. */\n async listCustomEntities(\n opts: ListCustomEntitiesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntity[]> {\n return this.ctx.http.request<CustomEntity[]>({\n method: \"GET\",\n path: this.entitiesBase(),\n auth,\n ...(opts.expandSchemas ? { query: { expandSchemas: \"true\" } } : {}),\n });\n }\n\n /** Retrieve one custom-entity definition by id. */\n async getCustomEntity(id: string, auth: AuthContext = SERVICE): Promise<CustomEntity> {\n return this.ctx.http.request<CustomEntity>({\n method: \"GET\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a custom-entity definition. Resolves to the `201`'s id envelope. */\n async createCustomEntity(\n draft: CustomEntityDraft,\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntityCreated> {\n return this.ctx.http.request<CustomEntityCreated>({\n method: \"POST\",\n path: this.entitiesBase(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Update a custom-entity definition — an upsert: resolves to the id envelope\n * when the `PUT` created the type (`201`), to `undefined` when it updated it\n * (`204`).\n */\n async updateCustomEntity(\n id: string,\n draft: CustomEntityUpdate,\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntityCreated | undefined> {\n return this.ctx.http.request<CustomEntityCreated | undefined>({\n method: \"PUT\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /**\n * Delete a custom-entity definition. The server rejects with 409 if\n * instances or schemas still reference it (`EmporixConflictError`).\n */\n async deleteCustomEntity(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n // --- (D) Custom instances ------------------------------------------------\n\n /**\n * List a custom entity's instances, wrapped in {@link PaginatedItems}.\n * `type` is the custom-entity type and is always the first argument.\n */\n async listInstances<T = Record<string, unknown>>(\n type: string,\n query: ListInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<CustomInstance<T>>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n // `totalCount` is an SDK-side flag, not an Emporix query parameter — it\n // becomes a request header in requestPage. Sending it in the query too\n // would be a stray `?totalCount=true` on every call.\n const { totalCount, ...rest } = query;\n return requestPage<CustomInstance<T>>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.instancesBase(type),\n auth,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n /**\n * Async-iterates every instance of a type.\n *\n * Not built on `iterateAll`: that helper drives pagination by page number, and\n * the server ignores `pageNumber` the moment a cursor is in play. This follows\n * `nextCursor` while the server offers one and falls back to `pageNumber + 1`\n * when it does not — so it is correct whether or not the tenant's deployment\n * emits cursor headers on a request that carries no cursor.\n */\n async *listAllInstances<T = Record<string, unknown>>(\n type: string,\n // Takes the full query type rather than an `Omit<…>`: `ListInstancesQuery`\n // has an index signature, so `Omit` would not actually forbid `next` — it\n // would only look like it did. The overrides below win regardless.\n query: ListInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): AsyncIterable<CustomInstance<T>> {\n let cursor: string | undefined;\n let pageNumber = 1;\n for (;;) {\n const page = await this.listInstances<T>(\n type,\n { ...query, pageNumber, ...(cursor === undefined ? {} : { next: cursor }) },\n auth,\n );\n for (const item of page.items) yield item;\n if (!page.hasNextPage) return;\n cursor = page.nextCursor;\n // Only advances while there is no cursor. Once cursor mode takes over the\n // server ignores pageNumber anyway, so leaving it pinned keeps the two\n // modes from interfering.\n if (cursor === undefined) pageNumber += 1;\n }\n }\n\n /** Retrieve one instance by id. */\n async getInstance<T = Record<string, unknown>>(\n type: string,\n id: string,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstance<T>> {\n return this.ctx.http.request<CustomInstance<T>>({\n method: \"GET\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Create an instance of a custom entity. Resolves to the `201`'s id envelope;\n * an id that already exists is answered with a 409 (`EmporixConflictError`).\n */\n async createInstance<T = Record<string, unknown>>(\n type: string,\n draft: CustomInstanceDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstanceCreated> {\n return this.ctx.http.request<CustomInstanceCreated>({\n method: \"POST\",\n path: this.instancesBase(type),\n auth,\n body: draft,\n });\n }\n\n /**\n * Replace an instance (full `PUT`, an upsert). Resolves to the id envelope\n * when it created the instance (`201`), to `undefined` when it replaced one\n * (`204`). A stale `metadata.version` is answered with a 409.\n */\n async replaceInstance<T = Record<string, unknown>>(\n type: string,\n id: string,\n draft: CustomInstanceReplace<T>,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstanceCreated | undefined> {\n return this.ctx.http.request<CustomInstanceCreated | undefined>({\n method: \"PUT\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /**\n * Partially update an instance (`PATCH`) with RFC-6902 operations, e.g.\n * `[{ op: \"replace\", path: \"/mixins/shoe/size\", value: 44 }]`. Resolves on\n * the `204`.\n */\n async patchInstance(\n type: string,\n id: string,\n patch: CustomInstancePatch,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n body: patch,\n });\n }\n\n /**\n * Patch up to 200 custom instances of `type` in one call\n * (`PATCH /custom-entities/{type}/instances/bulk`). Returns a 207 envelope:\n * a per-item result array — a 207 is success, individual failures live in\n * each item's `code`/`status`.\n */\n async bulkPatchInstances(\n type: string,\n items: BulkPatchInstanceItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"PATCH\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Create multiple instances in one request\n * (`POST /custom-entities/{type}/instances/bulk`). Returns a 207 envelope:\n * a per-item result array — a 207 is success, individual failures live in\n * each item's `code`/`status`.\n */\n async bulkCreateInstances(\n type: string,\n items: SchemaInstanceBulkCreateItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"POST\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Upsert multiple instances in one request\n * (`PUT /custom-entities/{type}/instances/bulk`). Each item carries its `id`.\n * Returns the same 207 per-item envelope as {@link bulkCreateInstances}.\n */\n async bulkUpsertInstances(\n type: string,\n items: SchemaInstanceBulkUpsertItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"PUT\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Delete multiple instances by id\n * (`DELETE /custom-entities/{type}/instances/bulk`). Returns the same 207\n * per-item envelope as {@link bulkCreateInstances}.\n *\n * **Note:** the OpenAPI schema declares no request body for this operation,\n * but its description mandates one — \"The IDs of items should be defined in\n * the request body as an array of strings\" (example\n * `[\"firstId\", \"secondId\"]`). The SDK follows the description and sends the\n * id array. Unverified against the live API.\n */\n async bulkDeleteInstances(\n type: string,\n ids: string[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"DELETE\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: ids,\n });\n }\n\n /**\n * Export custom entities and their schemas\n * (`POST /custom-entities/export`). Pass the entity types to include; the\n * result carries a base64 `data` payload plus `exportedAt`.\n */\n async exportCustomEntities(types: string[], auth: AuthContext = SERVICE): Promise<SchemaExport> {\n return this.ctx.http.request<SchemaExport>({\n method: \"POST\",\n path: `${this.entitiesBase()}/export`,\n auth,\n body: types,\n });\n }\n\n /**\n * Import custom entities and their schemas\n * (`POST /custom-entities/import`) from the base64 `data` produced by\n * {@link exportCustomEntities}.\n */\n async importCustomEntities(input: SchemaImportInput, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.entitiesBase()}/import`,\n auth,\n body: input,\n });\n }\n\n /** Delete an instance by id. */\n async deleteInstance(type: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Structured search over a custom entity's instances\n * (`POST /instances/search`), wrapped in {@link PaginatedItems}.\n *\n * The `query` parameter is third and `auth` fourth. This used to forward no\n * query parameters at all and report a hard-coded `hasNextPage: false`, so a\n * search could only ever return the server's default first page.\n */\n async searchInstances<T = Record<string, unknown>>(\n type: string,\n body: InstanceSearchBody,\n query: SearchInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<CustomInstance<T>>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const { totalCount, ...rest } = query;\n return requestPage<CustomInstance<T>>(\n this.ctx.http,\n {\n method: \"POST\",\n path: `${this.instancesBase(type)}/search`,\n auth,\n body,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n // --- (E) References ------------------------------------------------------\n\n /**\n * Reference entities (`/references`) — a schema plus an uploaded JSON file.\n * Create/update are `multipart/form-data` (parts `file` and `body`), like\n * the media service's blob upload. Default auth: service.\n */\n readonly references = {\n /**\n * List references, wrapped in {@link PaginatedItems}. Pagination defaults\n * match the rest of this service (`pageNumber: 1`, `pageSize: 60`).\n */\n list: async (\n query: ListSchemaReferencesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SchemaReference>> => {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.sort) q.sort = query.sort;\n if (query.q) q.q = query.q;\n if (query.fields) q.fields = query.fields;\n if (query.type) q.type = query.type;\n return requestPage<SchemaReference>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.referencesBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n },\n\n /** Retrieve one reference by id. */\n get: async (id: string, auth: AuthContext = SERVICE): Promise<SchemaReference> =>\n this.ctx.http.request<SchemaReference>({\n method: \"GET\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n auth,\n }),\n\n /**\n * Create a reference. `file` is the reference's JSON content — pass a\n * `Blob` to upload as-is, or a plain object to have it serialized into a\n * JSON blob. `body` carries the metadata.\n */\n create: async (\n input: { file: Blob | Record<string, unknown>; body: SchemaReferenceInput },\n auth: AuthContext = SERVICE,\n ): Promise<SchemaReferenceCreated> => {\n const fd = new FormData();\n fd.set(\"file\", toJsonBlob(input.file));\n fd.set(\"body\", JSON.stringify(input.body));\n return this.ctx.http.request<SchemaReferenceCreated>({\n method: \"POST\",\n path: this.referencesBase(),\n auth,\n body: fd,\n });\n },\n\n /**\n * Update a reference (multipart, like {@link create}). `options.version`\n * enables optimistic locking — the server answers 409 on a stale version.\n */\n update: async (\n id: string,\n input: { file: Blob | Record<string, unknown>; body: SchemaReferenceUpdateInput },\n options: { version?: number } = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> => {\n const fd = new FormData();\n fd.set(\"file\", toJsonBlob(input.file));\n fd.set(\"body\", JSON.stringify(input.body));\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n ...(options.version === undefined ? {} : { query: { version: options.version } }),\n auth,\n body: fd,\n });\n },\n\n /** Delete a reference by id. */\n delete: async (id: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchQuery,\n Created,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n} from \"./ai-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * A symmetric CRUD resource over an agentic sub-collection (`tools`,\n * `mcp-servers`, `tokens`, `oauths`). All six operations share the upstream\n * shape; only the base path and the Read/Write types differ. Server-side only\n * — every call defaults to the SERVICE (backend) token.\n */\nexport class AgenticCrudResource<Read, Write> {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string,\n ) {}\n\n private item(id: string): string {\n return `${this.path}/${encodeURIComponent(id)}`;\n }\n\n /** List the collection (`GET {path}`). Optional `q`/paging/sort/fields/expand. */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<Read[]> {\n return this.ctx.http.request<Read[]>({ method: \"GET\", path: this.path, auth, query: { ...query } });\n }\n\n /** Structured search (`POST {path}/search`): `q` in the body, paging/sort/fields in the query. */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<Read[]> {\n return this.ctx.http.request<Read[]>({ method: \"POST\", path: `${this.path}/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n\n /** Retrieve one entry by id (`GET {path}/{id}`). */\n get(id: string, opts: GetOptions = {}, auth: AuthContext = SERVICE): Promise<Read> {\n return this.ctx.http.request<Read>({ method: \"GET\", path: this.item(id), auth, query: { ...opts } });\n }\n\n /**\n * Create-or-replace by id (`PUT {path}/{id}`). Resolves to `{ id }` on create\n * (HTTP 201) and `undefined` on update (HTTP 204). `{ force: true }`\n * cascade-disables dependents.\n */\n upsert(\n id: string,\n body: Write,\n opts: MutateOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Created | undefined> {\n return this.ctx.http.request<Created | undefined>({\n method: \"PUT\",\n path: this.item(id),\n auth,\n body,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /**\n * Partial update with an op array (`PATCH {path}/{id}`, 204). `ops` use the\n * upstream UPPERCASE enum (`ADD | REMOVE | REPLACE`), sent verbatim.\n */\n async patch(id: string, ops: AgenticPatchOp[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.item(id), auth, body: ops });\n }\n\n /** Delete by id (`DELETE {path}/{id}`). `{ force: true }` removes even if referenced. */\n async delete(id: string, opts: MutateOptions = {}, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: this.item(id),\n auth,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n}\n\n/**\n * AI async jobs (`/ai-service/{tenant}/jobs`). NOTE: not under `/agentic`.\n * `chatAsync` returns a `jobId`; poll/list/delete it here.\n */\nexport class JobsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly base: string,\n ) {}\n\n /** List jobs (`GET /jobs`). */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<Job[]> {\n return this.ctx.http.request<Job[]>({ method: \"GET\", path: `${this.base}/jobs`, auth, query: { ...query } });\n }\n /** Structured job search (`POST /jobs/search`). */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<Job[]> {\n return this.ctx.http.request<Job[]>({ method: \"POST\", path: `${this.base}/jobs/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /** Retrieve one job (`GET /jobs/{jobId}`). */\n get(jobId: string, auth: AuthContext = SERVICE): Promise<Job> {\n return this.ctx.http.request<Job>({ method: \"GET\", path: `${this.base}/jobs/${encodeURIComponent(jobId)}`, auth });\n }\n /** Delete one job (`DELETE /jobs/{jobId}`). */\n async delete(jobId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: `${this.base}/jobs/${encodeURIComponent(jobId)}`, auth });\n }\n}\n\n/** Agent templates (`/agentic/templates`). `list · search · clone`. */\nexport class TemplatesResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/templates`\n ) {}\n\n /** List available templates (`GET /agentic/templates`). */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentTemplate[]> {\n return this.ctx.http.request<AgentTemplate[]>({ method: \"GET\", path: this.path, auth, query: { ...query } });\n }\n /** Structured template search (`POST /agentic/templates/search`). */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentTemplate[]> {\n return this.ctx.http.request<AgentTemplate[]>({ method: \"POST\", path: `${this.path}/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /**\n * Instantiate a new agent from a template\n * (`POST /agentic/templates/{templateId}/agents`, HTTP 201). Returns the\n * created agent's id.\n */\n clone(templateId: string, body: AgentFromTemplate, auth: AuthContext = SERVICE): Promise<Created> {\n return this.ctx.http.request<Created>({\n method: \"POST\",\n path: `${this.path}/${encodeURIComponent(templateId)}/agents`,\n auth,\n body,\n });\n }\n}\n\n/** Agent logs (`/agentic/logs`): request logs and session logs. */\nexport class LogsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/logs`\n ) {}\n\n /** List request logs (`GET /agentic/logs/requests`). */\n listRequests(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentRequestLog[]> {\n return this.ctx.http.request<AgentRequestLog[]>({ method: \"GET\", path: `${this.path}/requests`, auth, query: { ...query } });\n }\n /** Retrieve one request log (`GET /agentic/logs/requests/{requestId}`). */\n getRequest(requestId: string, auth: AuthContext = SERVICE): Promise<AgentRequestLog> {\n return this.ctx.http.request<AgentRequestLog>({ method: \"GET\", path: `${this.path}/requests/${encodeURIComponent(requestId)}`, auth });\n }\n /** Structured request-log search (`POST /agentic/logs/requests/search`). */\n searchRequests(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentRequestLog[]> {\n return this.ctx.http.request<AgentRequestLog[]>({ method: \"POST\", path: `${this.path}/requests/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /** List session logs (`GET /agentic/logs/sessions`). */\n listSessions(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentSessionLog[]> {\n return this.ctx.http.request<AgentSessionLog[]>({ method: \"GET\", path: `${this.path}/sessions`, auth, query: { ...query } });\n }\n /** Retrieve one session log (`GET /agentic/logs/sessions/{sessionId}`). */\n getSession(sessionId: string, auth: AuthContext = SERVICE): Promise<AgentSessionLog> {\n return this.ctx.http.request<AgentSessionLog>({ method: \"GET\", path: `${this.path}/sessions/${encodeURIComponent(sessionId)}`, auth });\n }\n /** Structured session-log search (`POST /agentic/logs/sessions/search`). */\n searchSessions(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentSessionLog[]> {\n return this.ctx.http.request<AgentSessionLog[]>({ method: \"POST\", path: `${this.path}/sessions/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n}\n\n/** Agent analytics (`/agentic/analytics`). */\nexport class AnalyticsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/analytics`\n ) {}\n\n /** Aggregated metrics (`GET /agentic/analytics`); scope with `agentId`. */\n get(opts: AnalyticsQuery = {}, auth: AuthContext = SERVICE): Promise<AgentAnalytics> {\n return this.ctx.http.request<AgentAnalytics>({ method: \"GET\", path: this.path, auth, query: { ...opts } });\n }\n /** Per-agent execution counts (`GET /agentic/analytics/executions`). `agentIds` required. */\n executions(query: ExecutionsQuery, auth: AuthContext = SERVICE): Promise<AgentExecutions> {\n return this.ctx.http.request<AgentExecutions>({ method: \"GET\", path: `${this.path}/executions`, auth, query: { ...query } });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport {\n AgenticCrudResource,\n JobsResource,\n TemplatesResource,\n LogsResource,\n AnalyticsResource,\n} from \"./ai-resources\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n TextRequest,\n TextResponse,\n CompletionRequest,\n CompletionResponse,\n Agent,\n AgentInput,\n AgentPatchOp,\n AgentSearchQuery,\n ChatRequest,\n ChatResponse,\n JobIdResponse,\n DeleteAgentOptions,\n ChatOptions,\n Conversation,\n ConversationSearchQuery,\n Created,\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchQuery,\n OAuthConfig,\n OAuthInput,\n Tool,\n ToolInput,\n Token,\n TokenInput,\n McpServer,\n McpServerInput,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n ProviderModels,\n CommerceEvents,\n Attachment,\n AttachmentOptions,\n AttachmentReuseOptions,\n AgentsExport,\n AgentsExportRequest,\n AgentsImport,\n AgentsImportRequest,\n} from \"./ai-types\";\n\nexport type {\n TextRequest,\n TextResponse,\n CompletionMessage,\n CompletionRequest,\n CompletionResponse,\n Agent,\n AgentInput,\n AgentPatchOp,\n AgentSearchQuery,\n ChatRequest,\n ChatResponse,\n JobIdResponse,\n DeleteAgentOptions,\n ChatOptions,\n ChatStreamOptions,\n Conversation,\n ConversationSearchQuery,\n Created,\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchPaging,\n SearchQuery,\n OAuthConfig,\n OAuthInput,\n Tool,\n ToolInput,\n Token,\n TokenInput,\n McpServer,\n McpServerInput,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n ProviderModels,\n CommerceEvents,\n Attachment,\n AttachmentOptions,\n AttachmentReuseOptions,\n AgentsExport,\n AgentsExportRequest,\n AgentsImport,\n AgentsImportRequest,\n} from \"./ai-types\";\n\nexport type {\n AgenticCrudResource,\n AnalyticsResource,\n JobsResource,\n LogsResource,\n TemplatesResource,\n} from \"./ai-resources\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * `chat` and `chatAsync` took `auth` second until 4.0.0; now options come\n * second and `auth` third, as on `chatStream`. An old call would otherwise have\n * its auth context read as options and run on the default service token —\n * silently, in plain JavaScript — so it throws instead.\n */\nfunction assertChatOptions(opts: ChatOptions, method: string): void {\n if (typeof opts === \"object\" && opts !== null && \"kind\" in opts) {\n throw new Error(\n `ai.${method}: the second argument is { sessionId? } since 4.0.0 — pass the auth context third`,\n );\n }\n}\n\nfunction sessionHeader(opts: ChatOptions): { headers?: Record<string, string> } {\n return opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {};\n}\n\nconst AUTH_KINDS = new Set([\"service\", \"anonymous\", \"customer\", \"raw\"]);\n\n/**\n * `listAgents` and `listConversations` took only `auth` before they could page.\n * Tells that original call apart from `(query, auth)`, so an auth context is\n * never sent as query parameters — which would put a customer token in the URL.\n */\nfunction isAuthContext(value: ListQuery | AuthContext): value is AuthContext {\n return AUTH_KINDS.has(String((value as { kind?: unknown }).kind));\n}\n\n/**\n * Emporix AI Service (`/ai-service/{tenant}/…`): text generation, chat\n * completions, and the agentic layer (agent CRUD + synchronous/asynchronous\n * chat). Every endpoint requires a backend-only `ai.*` scope and the\n * **service (clientCredentials) token** — default auth: service.\n *\n * Server-side use only; the service token must never reach a browser. A\n * storefront chat (scope `ai.agentexecution_manage_own`) would require a\n * BFF / token-proxy — out of scope for this SDK.\n *\n * The model is server-fixed per tenant; there is no `model` parameter.\n */\nexport class AiService {\n static readonly channel = \"ai\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/ai-service/${this.ctx.tenant}`;\n }\n\n // --- Agentic building blocks (CRUD sub-resources) ----------------------\n\n private _oauths?: AgenticCrudResource<OAuthConfig, OAuthInput>;\n /** OAuth 2.0 client-credentials configs (`/agentic/oauths`). CRUD sub-resource. */\n get oauths(): AgenticCrudResource<OAuthConfig, OAuthInput> {\n return (this._oauths ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/oauths`));\n }\n\n private _tools?: AgenticCrudResource<Tool, ToolInput>;\n /** Agentic tools (`/agentic/tools`). CRUD sub-resource. */\n get tools(): AgenticCrudResource<Tool, ToolInput> {\n return (this._tools ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/tools`));\n }\n\n private _tokens?: AgenticCrudResource<Token, TokenInput>;\n /** Stored tokens (`/agentic/tokens`) — an OAuth config's client secret. CRUD sub-resource. */\n get tokens(): AgenticCrudResource<Token, TokenInput> {\n return (this._tokens ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/tokens`));\n }\n\n private _mcpServers?: AgenticCrudResource<McpServer, McpServerInput>;\n /** MCP-server configs (`/agentic/mcp-servers`). CRUD sub-resource. */\n get mcpServers(): AgenticCrudResource<McpServer, McpServerInput> {\n return (this._mcpServers ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/mcp-servers`));\n }\n\n private _jobs?: JobsResource;\n /** AI async jobs (`/jobs`). `list · search · get · delete`. */\n get jobs(): JobsResource {\n return (this._jobs ??= new JobsResource(this.ctx, this.base()));\n }\n\n private _templates?: TemplatesResource;\n /** Agent templates (`/agentic/templates`). `list · search · clone`. */\n get templates(): TemplatesResource {\n return (this._templates ??= new TemplatesResource(this.ctx, `${this.base()}/agentic/templates`));\n }\n\n private _logs?: LogsResource;\n /** Agent logs (`/agentic/logs`): request + session logs. */\n get logs(): LogsResource {\n return (this._logs ??= new LogsResource(this.ctx, `${this.base()}/agentic/logs`));\n }\n\n private _analytics?: AnalyticsResource;\n /** Agent analytics (`/agentic/analytics`). `get · executions`. */\n get analytics(): AnalyticsResource {\n return (this._analytics ??= new AnalyticsResource(this.ctx, `${this.base()}/agentic/analytics`));\n }\n\n /** Generate text from a single prompt (`POST /texts`). Honors `maxTokens`. */\n async generateText(input: TextRequest, auth: AuthContext = SERVICE): Promise<TextResponse> {\n return this.ctx.http.request<TextResponse>({\n method: \"POST\",\n path: `${this.base()}/texts`,\n auth,\n body: input,\n });\n }\n\n /** Run a chat completion over a message list (`POST /completions`). No `maxTokens`. */\n async complete(\n input: CompletionRequest,\n auth: AuthContext = SERVICE,\n ): Promise<CompletionResponse> {\n return this.ctx.http.request<CompletionResponse>({\n method: \"POST\",\n path: `${this.base()}/completions`,\n auth,\n body: input,\n });\n }\n\n /**\n * List agents (`GET /agentic/agents`). `q`, `pageNumber`, `pageSize`, `sort`,\n * `fields` and `expand` go in the query string; without paging keys the\n * server returns its first page. The original `listAgents(auth)` still works.\n */\n listAgents(auth?: AuthContext): Promise<Agent[]>;\n listAgents(query: ListQuery, auth?: AuthContext): Promise<Agent[]>;\n async listAgents(queryOrAuth: ListQuery | AuthContext = {}, auth: AuthContext = SERVICE): Promise<Agent[]> {\n const [query, ctx]: [ListQuery, AuthContext] = isAuthContext(queryOrAuth)\n ? [{}, queryOrAuth]\n : [queryOrAuth, auth];\n return this.ctx.http.request<Agent[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/agents`,\n auth: ctx,\n query: { ...query },\n });\n }\n\n /** Retrieve one agent by id. */\n async getAgent(id: string, auth: AuthContext = SERVICE): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"GET\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create-or-replace an agent by id (`PUT`). Takes the agent write shape. */\n async upsertAgent(id: string, agent: AgentInput, auth: AuthContext = SERVICE): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"PUT\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n body: agent,\n });\n }\n\n /**\n * Patch an agent with an op array (`PATCH`). `ops` use the upstream\n * UPPERCASE enum (`ADD | REMOVE | REPLACE`) and are sent verbatim — this is\n * NOT RFC-6902 JSON-Patch.\n */\n async patchAgent(\n id: string,\n ops: AgentPatchOp[],\n auth: AuthContext = SERVICE,\n ): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"PATCH\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n body: ops,\n });\n }\n\n /**\n * Delete an agent by id. Pass `{ force: true }` to delete an agent that is\n * still referenced elsewhere (`?force=true`).\n */\n async deleteAgent(\n id: string,\n auth: AuthContext = SERVICE,\n opts: DeleteAgentOptions = {},\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /**\n * Server-side agent search (`POST /agentic/agents/search`). `q` goes in the\n * body; `pageNumber`, `pageSize`, `sort` and `fields` in the query string.\n */\n async searchAgents(query: AgentSearchQuery, auth: AuthContext = SERVICE): Promise<Agent[]> {\n return this.ctx.http.request<Agent[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/search`,\n auth,\n ...splitQuery(query, SEARCH_PAGING),\n });\n }\n\n /**\n * Synchronous agent chat (`POST /agentic/chat`). Returns the response\n * ARRAY verbatim (the upstream contract is an array, not a single object).\n *\n * `opts.sessionId` is sent as the `session-id` header. It carries the\n * conversation — continuity needs it plus `enabledMemory` on the agent — and\n * it is how a chat reaches an attachment: pass the `sessionId` the upload or\n * reuse returned, and list the file under `input.attachments`.\n */\n async chat(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ChatResponse[]> {\n assertChatOptions(opts, \"chat\");\n return this.ctx.http.request<ChatResponse[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/chat`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n }\n\n /**\n * Fire-and-forget agent chat (`POST /agentic/chat-async`, HTTP 201).\n * Returns the job-id ARRAY verbatim. `opts` as for {@link chat}.\n */\n async chatAsync(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<JobIdResponse[]> {\n assertChatOptions(opts, \"chatAsync\");\n return this.ctx.http.request<JobIdResponse[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/chat-async`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n }\n\n /**\n * Streaming agent chat (`POST /agentic/chat-stream`, `text/event-stream`).\n * Yields each SSE `data` payload verbatim — the upstream contract types the\n * stream body as an opaque string, so chunks are raw strings, not parsed\n * objects. Consume with `for await`. `opts` as for {@link chat}.\n */\n async *chatStream(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): AsyncIterable<string> {\n assertChatOptions(opts, \"chatStream\");\n const events = this.ctx.http.requestStream({\n method: \"POST\",\n path: `${this.base()}/agentic/chat-stream`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n for await (const ev of events) yield ev.data;\n }\n\n /**\n * List stored agentic conversations (`GET /agentic/conversations`), paged\n * like {@link listAgents}. The original `listConversations(auth)` still works.\n */\n listConversations(auth?: AuthContext): Promise<Conversation[]>;\n listConversations(query: ListQuery, auth?: AuthContext): Promise<Conversation[]>;\n async listConversations(\n queryOrAuth: ListQuery | AuthContext = {},\n auth: AuthContext = SERVICE,\n ): Promise<Conversation[]> {\n const [query, ctx]: [ListQuery, AuthContext] = isAuthContext(queryOrAuth)\n ? [{}, queryOrAuth]\n : [queryOrAuth, auth];\n return this.ctx.http.request<Conversation[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/conversations`,\n auth: ctx,\n query: { ...query },\n });\n }\n\n /** Server-side conversation search (`POST /agentic/conversations/search`), paged like {@link searchAgents}. */\n async searchConversations(\n query: ConversationSearchQuery,\n auth: AuthContext = SERVICE,\n ): Promise<Conversation[]> {\n return this.ctx.http.request<Conversation[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/conversations/search`,\n auth,\n ...splitQuery(query, SEARCH_PAGING),\n });\n }\n\n // --- Standalone agentic reads / bulk operations ------------------------\n\n /** List models available to the tenant, grouped by provider (`GET /agentic/models`). */\n async listModels(auth: AuthContext = SERVICE): Promise<ProviderModels[]> {\n return this.ctx.http.request<ProviderModels[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/models`,\n auth,\n });\n }\n\n /** List commerce events available to agent triggers (`GET /agentic/commerce-events`). */\n async listCommerceEvents(auth: AuthContext = SERVICE): Promise<CommerceEvents> {\n return this.ctx.http.request<CommerceEvents>({\n method: \"GET\",\n path: `${this.base()}/agentic/commerce-events`,\n auth,\n });\n }\n\n /**\n * Upload a chat attachment for an agent\n * (`POST /agentic/{agentId}/attachments`, multipart, HTTP 201). The response\n * `sessionId` must be threaded into subsequent chat calls to bind the file.\n * Pass `opts.sessionId` to attach to an existing session.\n *\n * The endpoint takes exactly one of `attachment` or `attachmentId` — both or\n * neither is a `400`. This method always sends the file; to point a second\n * agent at a file already in the session, use {@link reuseAttachment}.\n */\n async uploadAttachment(\n agentId: string,\n attachment: Blob | File,\n opts: AttachmentOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Attachment> {\n const form = new FormData();\n form.append(\"attachment\", attachment);\n return this.ctx.http.request<Attachment>({\n method: \"POST\",\n path: `${this.base()}/agentic/${encodeURIComponent(agentId)}/attachments`,\n auth,\n body: form,\n ...(opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {}),\n });\n }\n\n /**\n * Assign an existing media asset to an agent as a chat attachment\n * (`POST /agentic/{agentId}/attachments` with the `attachmentId` form field,\n * HTTP 200). Resolves to the attachment `id` and the `sessionId` to send on\n * the following chat calls.\n *\n * Use it to hand a second agent the same file instead of uploading it twice.\n * Pass `opts.sessionId` to attach to an existing chat session; without it the\n * service opens a new one and returns its id — thread that into the chat, or\n * the agent never sees the file. With `ai.agentexecution_manage` the asset may\n * be any media asset, not only one uploaded to this session.\n *\n * ```ts\n * const { id, sessionId } = await client.ai.uploadAttachment(\"agent-a\", file);\n * await client.ai.reuseAttachment(\"agent-b\", id!, { sessionId: sessionId! });\n * ```\n */\n async reuseAttachment(\n agentId: string,\n attachmentId: string,\n opts: AttachmentReuseOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Attachment> {\n const form = new FormData();\n form.append(\"attachmentId\", attachmentId);\n return this.ctx.http.request<Attachment>({\n method: \"POST\",\n path: `${this.base()}/agentic/${encodeURIComponent(agentId)}/attachments`,\n auth,\n body: form,\n ...(opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {}),\n });\n }\n\n /** Export agents + components as a base64/checksum blob (`POST /agentic/agents/export`). */\n async exportAgents(body: AgentsExportRequest, auth: AuthContext = SERVICE): Promise<AgentsExport> {\n return this.ctx.http.request<AgentsExport>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/export`,\n auth,\n body,\n });\n }\n\n /** Import previously-exported agents (`POST /agentic/agents/import`). */\n async importAgents(body: AgentsImportRequest, auth: AuthContext = SERVICE): Promise<AgentsImport> {\n return this.ctx.http.request<AgentsImport>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/import`,\n auth,\n body,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n TaxConfig,\n TaxConfigInput,\n TaxConfigUpdate,\n TaxConfigCreated,\n TaxCalculationRequest,\n TaxCalculationResult,\n} from \"./tax-types\";\n\nexport type {\n TaxClass,\n TaxLocation,\n TaxConfig,\n TaxConfigInput,\n TaxConfigUpdate,\n TaxConfigCreated,\n TaxCalculationInput,\n TaxCalculationRequest,\n TaxCalculationResult,\n} from \"./tax-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Tax Service (`/tax/{tenant}/…`): CRUD over per-location tax\n * configurations and the net/gross tax-calculation command. Every endpoint\n * requires a backend `tax.tax_read` / `tax.tax_manage` scope and the\n * **service (clientCredentials) token** — default auth: service.\n *\n * Server-side use only; the service token must never reach a browser.\n */\nexport class TaxService {\n static readonly channel = \"tax\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/tax/${this.ctx.tenant}`;\n }\n\n /** List all per-location tax configurations. */\n async listTaxConfigs(auth: AuthContext = SERVICE): Promise<TaxConfig[]> {\n return this.ctx.http.request<TaxConfig[]>({\n method: \"GET\",\n path: `${this.base()}/taxes`,\n auth,\n });\n }\n\n /** Retrieve one tax configuration by its location (country) code. */\n async getTaxConfig(locationCode: string, auth: AuthContext = SERVICE): Promise<TaxConfig> {\n return this.ctx.http.request<TaxConfig>({\n method: \"GET\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n });\n }\n\n /** Create a tax configuration (`POST`). Returns the created `{ locationCode }`. */\n async createTaxConfig(\n input: TaxConfigInput,\n auth: AuthContext = SERVICE,\n ): Promise<TaxConfigCreated> {\n return this.ctx.http.request<TaxConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/taxes`,\n auth,\n body: input,\n });\n }\n\n /**\n * Update a tax configuration by location code (`PUT`). `metadata.version` is\n * required (optimistic locking — a stale version yields 409).\n */\n async updateTaxConfig(\n locationCode: string,\n input: TaxConfigUpdate,\n auth: AuthContext = SERVICE,\n ): Promise<TaxConfig> {\n return this.ctx.http.request<TaxConfig>({\n method: \"PUT\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a tax configuration by location code. */\n async deleteTaxConfig(locationCode: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n });\n }\n\n /**\n * Calculate net/gross values for a price (`PUT /taxes/calculation-commands`).\n * Single command in, single result out.\n */\n async calculateTax(\n request: TaxCalculationRequest,\n auth: AuthContext = SERVICE,\n ): Promise<TaxCalculationResult> {\n return this.ctx.http.request<TaxCalculationResult>({\n method: \"PUT\",\n path: `${this.base()}/taxes/calculation-commands`,\n auth,\n body: request,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n CouponList,\n Coupon,\n CouponInput,\n CouponUpdate,\n CouponCreated,\n Redemption,\n RedemptionInput,\n RedemptionCreated,\n ReferralCoupon,\n} from \"./coupon-types\";\n\nexport type {\n Coupon,\n CouponList,\n CouponInput,\n CouponUpdate,\n CouponCreated,\n Redemption,\n RedemptionInput,\n RedemptionCreated,\n ReferralCoupon,\n} from \"./coupon-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Coupon Service (`/coupon/{tenant}/…`): coupon CRUD, validation,\n * redemptions, and referral coupons.\n *\n * Every method defaults to the **service (clientCredentials) token**. For\n * customer-driven validation/redemption, pass `auth.customer(token)` as the\n * trailing argument (the React hooks do this with the browser context). The\n * service token must never reach a browser.\n */\nexport class CouponService {\n static readonly channel = \"coupon\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/coupon/${this.ctx.tenant}`;\n }\n\n /** List coupons by criteria. Returns a plain array. */\n async listCoupons(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CouponList> {\n return this.ctx.http.request<CouponList>({\n method: \"GET\",\n path: `${this.base()}/coupons`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one coupon by code. */\n async getCoupon(code: string, auth: AuthContext = SERVICE): Promise<Coupon> {\n return this.ctx.http.request<Coupon>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a coupon (`POST`, HTTP 201). Returns the created resource's `{ id?, yrn? }`. */\n async createCoupon(input: CouponInput, auth: AuthContext = SERVICE): Promise<CouponCreated> {\n return this.ctx.http.request<CouponCreated>({\n method: \"POST\",\n path: `${this.base()}/coupons`,\n auth,\n body: input,\n });\n }\n\n /** Replace a coupon by code (`PUT`). Resolves once the update is accepted. */\n async updateCoupon(code: string, input: CouponUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a coupon by code (`PATCH` merge body). */\n async patchCoupon(code: string, patch: CouponUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a coupon by code. */\n async deleteCoupon(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /**\n * Check whether a coupon can be redeemed (`POST /validation`). Resolves when\n * redeemable; throws an `EmporixError` otherwise (no response body).\n */\n async validateCoupon(\n code: string,\n redemption: RedemptionInput,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/validation`,\n auth,\n body: redemption,\n });\n }\n\n /** List a coupon's redemptions by criteria. */\n async listRedemptions(\n code: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<Redemption[]> {\n return this.ctx.http.request<Redemption[]>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Redeem a coupon by creating a redemption (`POST`, HTTP 201). Returns the resource location. */\n async redeemCoupon(\n code: string,\n redemption: RedemptionInput,\n auth: AuthContext = SERVICE,\n ): Promise<RedemptionCreated> {\n return this.ctx.http.request<RedemptionCreated>({\n method: \"POST\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions`,\n auth,\n body: redemption,\n });\n }\n\n /** Retrieve one redemption by id. */\n async getRedemption(code: string, id: string, auth: AuthContext = SERVICE): Promise<Redemption> {\n return this.ctx.http.request<Redemption>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Delete a redemption by id. */\n async deleteRedemption(code: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Retrieve a customer's referral coupon (resolves to an empty body when none exists). */\n async getReferralCoupon(customerNumber: string, auth: AuthContext = SERVICE): Promise<ReferralCoupon> {\n return this.ctx.http.request<ReferralCoupon>({\n method: \"GET\",\n path: `${this.base()}/referral-coupons/${encodeURIComponent(customerNumber)}`,\n auth,\n });\n }\n\n /** Create a referral coupon code for a customer (no request body). */\n async createReferralCoupon(\n customerNumber: string,\n auth: AuthContext = SERVICE,\n ): Promise<ReferralCoupon> {\n return this.ctx.http.request<ReferralCoupon>({\n method: \"POST\",\n path: `${this.base()}/referral-coupons/${encodeURIComponent(customerNumber)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError } from \"../core/errors\";\nimport type {\n CustomerSummaryBatch,\n PointsSummary,\n NewPointsEntry,\n AddedPoints,\n RedeemedPoints,\n RedeemOption,\n RedeemOptionList,\n RedeemMyPointsInput,\n RedeemCouponResult,\n} from \"./reward-points-types\";\n\nexport type {\n CustomerSummaryBatch,\n PointsSummary,\n NewPointsEntry,\n AddedPoints,\n RedeemedPoints,\n RedeemOption,\n RedeemOptionList,\n RedeemMyPointsInput,\n RedeemCouponResult,\n} from \"./reward-points-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Reward Points Service (`/reward-points/…`): admin customer-points\n * management, the signed-in customer's own points, and redeem options.\n *\n * Auth differs per group: admin and redeem-option management default to the\n * **service token**; the `/public/*` methods require a **customer token** (they\n * accept only `CustomerAccessToken`). Note the mixed base paths — customer/\n * public/batch endpoints omit `{tenant}`, redeem options include it. A point\n * balance (`getCustomerPoints` / `getMyPoints`) is returned as a bare `number`.\n */\nexport class RewardPointsService {\n static readonly channel = \"reward-points\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Base without tenant (customer / public / batch endpoints). */\n private base(): string {\n return `/reward-points`;\n }\n\n /** Tenant-scoped base (redeem options only). */\n private tenantBase(): string {\n return `/reward-points/${this.ctx.tenant}`;\n }\n\n // --- Admin: customer points management (service token) ---\n\n /** Batch summary across all customers. */\n async listAllSummaries(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CustomerSummaryBatch> {\n return this.ctx.http.request<CustomerSummaryBatch>({\n method: \"GET\",\n path: `${this.base()}/summaryBatch`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one customer's reward-points balance. */\n async getCustomerPoints(customerId: string, auth: AuthContext = SERVICE): Promise<number> {\n return this.ctx.http.request<number>({\n method: \"GET\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Create a reward-points entry for a customer. */\n async createCustomerPoints(\n customerId: string,\n input: NewPointsEntry,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a customer's reward points. */\n async deleteCustomerPoints(customerId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Retrieve a reward-points summary for one customer. */\n async getCustomerSummary(customerId: string, auth: AuthContext = SERVICE): Promise<PointsSummary> {\n return this.ctx.http.request<PointsSummary>({\n method: \"GET\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/summary`,\n auth,\n });\n }\n\n /** Add reward points for a customer. */\n async addPoints(customerId: string, input: AddedPoints, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/addPoints`,\n auth,\n body: input,\n });\n }\n\n /** Redeem a customer's reward points (on behalf). */\n async redeemPoints(customerId: string, input: RedeemedPoints, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/redeemPoints`,\n auth,\n body: input,\n });\n }\n\n // --- Storefront: the signed-in customer's own points (customer token required) ---\n\n /** The signed-in customer's reward-points balance. Requires a customer `auth`. */\n async getMyPoints(auth: AuthContext): Promise<number> {\n // A customer who has never earned points has no entry, and Emporix answers\n // 404 \"No reward points found\" — for the signed-in customer that simply\n // means zero points, so map it to 0 rather than surfacing an error.\n try {\n return await this.ctx.http.request<number>({\n method: \"GET\",\n path: `${this.base()}/public/customer`,\n auth,\n });\n } catch (err) {\n if (err instanceof EmporixNotFoundError) return 0;\n throw err;\n }\n }\n\n /** The signed-in customer's reward-points summary. Requires a customer `auth`. */\n async getMySummary(auth: AuthContext): Promise<PointsSummary> {\n // Same as getMyPoints: a 404 means the signed-in customer has no entry yet,\n // i.e. an empty summary (zero active points, no history), not an error.\n try {\n return await this.ctx.http.request<PointsSummary>({\n method: \"GET\",\n path: `${this.base()}/public/customer/summary`,\n auth,\n });\n } catch (err) {\n if (err instanceof EmporixNotFoundError) {\n return { activePoints: 0, summary: { addedPointsList: [] } };\n }\n throw err;\n }\n }\n\n /**\n * Redeem the signed-in customer's points for a coupon code. Requires a\n * customer `auth`. Returns the issued coupon `{ code }`.\n */\n async redeemMyPoints(input: RedeemMyPointsInput, auth: AuthContext): Promise<RedeemCouponResult> {\n return this.ctx.http.request<RedeemCouponResult>({\n method: \"POST\",\n path: `${this.base()}/public/customer/redeem`,\n auth,\n body: input,\n });\n }\n\n // --- Redeem options (tenant-scoped; read open to customer, management service-only) ---\n\n /** List redeem options. Defaults to the service token; pass a customer `auth` for storefront reads. */\n async listRedeemOptions(auth: AuthContext = SERVICE): Promise<RedeemOptionList> {\n return this.ctx.http.request<RedeemOptionList>({\n method: \"GET\",\n path: `${this.tenantBase()}/redeemOptions`,\n auth,\n });\n }\n\n /** Create a redeem option. Returns the updated options list. */\n async createRedeemOption(input: RedeemOption, auth: AuthContext = SERVICE): Promise<RedeemOptionList> {\n return this.ctx.http.request<RedeemOptionList>({\n method: \"POST\",\n path: `${this.tenantBase()}/redeemOptions`,\n auth,\n body: input,\n });\n }\n\n /** Update a redeem option by id. Resolves once accepted (no response body). */\n async updateRedeemOption(\n redeemOptionId: string,\n input: RedeemOption,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.tenantBase()}/redeemOptions/${encodeURIComponent(redeemOptionId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a redeem option by id. */\n async deleteRedeemOption(redeemOptionId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.tenantBase()}/redeemOptions/${encodeURIComponent(redeemOptionId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Brand, BrandList, BrandInput, BrandUpdate } from \"./brand-types\";\n\nexport type { Brand, BrandList, BrandInput, BrandUpdate } from \"./brand-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Brand Service (`/brand/brands`): CRUD over brands. Server-side;\n * defaults to the service token (reads also work with an anonymous token).\n * The path carries no `{tenant}` segment — the tenant comes from the token.\n */\nexport class BrandService {\n static readonly channel = \"brand\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/brand/brands`;\n }\n\n /** List all brands. */\n async listBrands(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<BrandList> {\n return this.ctx.http.request<BrandList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one brand by id. */\n async getBrand(brandId: string, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n });\n }\n\n /** Create a brand. */\n async createBrand(input: BrandInput, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a brand by id. */\n async updateBrand(brandId: string, input: BrandUpdate, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a brand by id. */\n async patchBrand(brandId: string, patch: BrandUpdate, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a brand by id. */\n async deleteBrand(brandId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Label, LabelList, LabelInput, LabelUpdate } from \"./label-types\";\n\nexport type { Label, LabelList, LabelInput, LabelUpdate } from \"./label-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Label Service (`/label/labels`): CRUD over product labels (e.g.\n * \"Sale\", \"New\"). Server-side; defaults to the service token. The path carries\n * no `{tenant}` segment — the tenant comes from the token.\n */\nexport class LabelService {\n static readonly channel = \"label\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/label/labels`;\n }\n\n /** List all labels. */\n async listLabels(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<LabelList> {\n return this.ctx.http.request<LabelList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one label by id. */\n async getLabel(labelId: string, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n });\n }\n\n /** Create a label. */\n async createLabel(input: LabelInput, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a label by id. */\n async updateLabel(labelId: string, input: LabelUpdate, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a label by id. */\n async patchLabel(labelId: string, patch: LabelUpdate, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a label by id. */\n async deleteLabel(labelId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Country, CountryList, CountryUpdate, Region, RegionList } from \"./country-types\";\n\nexport type { Country, CountryList, CountryUpdate, Region, RegionList } from \"./country-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Country Service (`/country/{tenant}/…`): countries and regions\n * master data. Server-side; defaults to the service token (reads also work\n * with an anonymous token). Countries are predefined — list/get/patch only\n * (no create/delete).\n */\nexport class CountryService {\n static readonly channel = \"country\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/country/${this.ctx.tenant}`;\n }\n\n /** List all countries. */\n async listCountries(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CountryList> {\n return this.ctx.http.request<CountryList>({\n method: \"GET\",\n path: `${this.base()}/countries`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one country by code. */\n async getCountry(countryCode: string, auth: AuthContext = SERVICE): Promise<Country> {\n return this.ctx.http.request<Country>({\n method: \"GET\",\n path: `${this.base()}/countries/${encodeURIComponent(countryCode)}`,\n auth,\n });\n }\n\n /** Partially update a country by code. Resolves once accepted (no response body). */\n async patchCountry(countryCode: string, patch: CountryUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/countries/${encodeURIComponent(countryCode)}`,\n auth,\n body: patch,\n });\n }\n\n /** List all regions. */\n async listRegions(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<RegionList> {\n return this.ctx.http.request<RegionList>({\n method: \"GET\",\n path: `${this.base()}/regions`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one region by code. */\n async getRegion(regionCode: string, auth: AuthContext = SERVICE): Promise<Region> {\n return this.ctx.http.request<Region>({\n method: \"GET\",\n path: `${this.base()}/regions/${encodeURIComponent(regionCode)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Currency,\n CurrencyList,\n CurrencyInput,\n CurrencyUpdate,\n CurrencyCreated,\n ExchangeRate,\n ExchangeRateList,\n ExchangeRateInput,\n ExchangeRateUpdate,\n ExchangeRateCreated,\n} from \"./currency-types\";\n\nexport type {\n Currency,\n CurrencyList,\n CurrencyInput,\n CurrencyUpdate,\n CurrencyCreated,\n ExchangeRate,\n ExchangeRateList,\n ExchangeRateInput,\n ExchangeRateUpdate,\n ExchangeRateCreated,\n} from \"./currency-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Currency Service (`/currency/{tenant}/…`): currencies and exchange\n * rates. Server-side; defaults to the service token.\n */\nexport class CurrencyService {\n static readonly channel = \"currency\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/currency/${this.ctx.tenant}`;\n }\n\n // --- Currencies ---\n\n /** List all currencies. */\n async listCurrencies(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CurrencyList> {\n return this.ctx.http.request<CurrencyList>({\n method: \"GET\",\n path: `${this.base()}/currencies`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one currency by code. */\n async getCurrency(code: string, auth: AuthContext = SERVICE): Promise<Currency> {\n return this.ctx.http.request<Currency>({\n method: \"GET\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a currency. */\n async createCurrency(input: CurrencyInput, auth: AuthContext = SERVICE): Promise<CurrencyCreated> {\n return this.ctx.http.request<CurrencyCreated>({\n method: \"POST\",\n path: `${this.base()}/currencies`,\n auth,\n body: input,\n });\n }\n\n /** Update a currency by code. */\n async updateCurrency(code: string, input: CurrencyUpdate, auth: AuthContext = SERVICE): Promise<Currency> {\n return this.ctx.http.request<Currency>({\n method: \"PUT\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a currency by code. */\n async deleteCurrency(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n // --- Exchange rates ---\n\n /** List all exchange rates. */\n async listExchangeRates(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ExchangeRateList> {\n return this.ctx.http.request<ExchangeRateList>({\n method: \"GET\",\n path: `${this.base()}/exchanges`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one exchange rate by code. */\n async getExchangeRate(code: string, auth: AuthContext = SERVICE): Promise<ExchangeRate> {\n return this.ctx.http.request<ExchangeRate>({\n method: \"GET\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create an exchange rate. */\n async createExchangeRate(input: ExchangeRateInput, auth: AuthContext = SERVICE): Promise<ExchangeRateCreated> {\n return this.ctx.http.request<ExchangeRateCreated>({\n method: \"POST\",\n path: `${this.base()}/exchanges`,\n auth,\n body: input,\n });\n }\n\n /** Update an exchange rate by code. */\n async updateExchangeRate(code: string, input: ExchangeRateUpdate, auth: AuthContext = SERVICE): Promise<ExchangeRate> {\n return this.ctx.http.request<ExchangeRate>({\n method: \"PUT\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete an exchange rate by code. */\n async deleteExchangeRate(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Site,\n SiteList,\n FindSiteInput,\n Zone,\n ZoneList,\n ShippingMethod,\n ShippingMethodList,\n ShippingGroup,\n ShippingGroupList,\n CgRelation,\n CgRelationList,\n QuoteInput,\n QuoteResult,\n QuoteSlotInput,\n ShippingFee,\n MinimumFee,\n ResourceCreated,\n DeliveryWindowList,\n DeliveryWindowValidation,\n DeliveryTime,\n DeliveryTimeList,\n DeliveryTimeInput,\n DeliveryTimeUpdate,\n DeliverySlot,\n DeliverySlotList,\n DeliveryCycleInput,\n ShippingPatch,\n DeliveryCreated,\n} from \"./shipping-types\";\n\nexport type {\n Site,\n SiteList,\n FindSiteInput,\n Zone,\n ZoneList,\n ShippingMethod,\n ShippingMethodList,\n ShippingGroup,\n ShippingGroupList,\n CgRelation,\n CgRelationList,\n QuoteInput,\n QuoteResult,\n QuoteSlotInput,\n ShippingFee,\n MinimumFee,\n ResourceCreated,\n DeliveryWindow,\n DeliveryWindowList,\n DeliveryWindowValidation,\n DeliveryTime,\n DeliveryTimeList,\n DeliveryTimeInput,\n DeliveryTimeUpdate,\n DeliverySlot,\n DeliverySlotList,\n DeliveryCycleInput,\n ShippingPatch,\n DeliveryCreated,\n} from \"./shipping-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * The zone whose `shipTo` covers `country`, else the default zone, else the first.\n *\n * Pure — no client, no request. Pair it with `listZones(site, { expand:\n * \"methods,fees\" })` to turn a zone list into the one zone a checkout should\n * offer.\n *\n * The `?? []` guards a field the generated schema marks required. Emporix'\n * schema has been wrong about optionality before, and a storefront that throws\n * on an unexpected shape is worse than one that finds no zone.\n */\nexport function resolveZone(zones: ZoneList | undefined, country: string): Zone | undefined {\n if (!zones || zones.length === 0) return undefined;\n const c = country.trim().toUpperCase();\n const byCountry = c\n ? zones.find((z) => (z.shipTo ?? []).some((s) => s.country?.toUpperCase() === c))\n : undefined;\n return byCountry ?? zones.find((z) => z.default) ?? zones[0];\n}\n\n/**\n * The applicable fee: the highest `minOrderValue` at or below `cartTotal`, else\n * the first fee.\n *\n * `<=`, not `<`: a total that exactly meets a free-shipping threshold gets free\n * shipping.\n */\nexport function pickFee(fees: ShippingFee[] | undefined, cartTotal: number): ShippingFee | undefined {\n if (!fees || fees.length === 0) return undefined;\n const eligible = fees\n .filter((f) => (f.minOrderValue?.amount ?? 0) <= cartTotal)\n .sort((a, b) => (b.minOrderValue?.amount ?? 0) - (a.minOrderValue?.amount ?? 0));\n return eligible[0] ?? fees[0];\n}\n\n/**\n * Emporix Shipping Service (`/shipping/{tenant}/…`), Phase 1 — config: sites,\n * zones, methods, cost/quote, groups, customer-group relations. Server-side;\n * defaults to the service token. Most methods are site-scoped and take `site`\n * first; `findSites` is tenant-level. Delivery scheduling is Phase 2.\n */\nexport class ShippingService {\n static readonly channel = \"shipping\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/shipping/${this.ctx.tenant}`;\n }\n\n private siteBase(site: string): string {\n return `${this.base()}/${encodeURIComponent(site)}`;\n }\n\n // --- Sites ---\n\n /** Find shipping-related sites by postal code (`POST /findSite`). */\n async findSites(input: FindSiteInput, auth: AuthContext = SERVICE): Promise<SiteList> {\n return this.ctx.http.request<SiteList>({\n method: \"POST\",\n path: `${this.base()}/findSite`,\n auth,\n body: input,\n });\n }\n\n // --- Zones ---\n\n /** List shipping zones for a site. */\n async listZones(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ZoneList> {\n return this.ctx.http.request<ZoneList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping zone. */\n async getZone(site: string, zoneId: string, auth: AuthContext = SERVICE): Promise<Zone> {\n return this.ctx.http.request<Zone>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n });\n }\n\n /** Create a shipping zone. */\n async createZone(site: string, zone: Zone, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/zones`,\n auth,\n body: zone,\n });\n }\n\n /** Replace a shipping zone. */\n async updateZone(site: string, zoneId: string, zone: Zone, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n body: zone,\n });\n }\n\n /** Partially update a shipping zone. */\n async patchZone(site: string, zoneId: string, patch: Zone, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a shipping zone. */\n async deleteZone(site: string, zoneId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n });\n }\n\n // --- Methods (per zone) ---\n\n /** List shipping methods of a zone. */\n async listMethods(\n site: string,\n zoneId: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ShippingMethodList> {\n return this.ctx.http.request<ShippingMethodList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping method. */\n async getMethod(site: string, zoneId: string, methodId: string, auth: AuthContext = SERVICE): Promise<ShippingMethod> {\n return this.ctx.http.request<ShippingMethod>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n });\n }\n\n /** Create a shipping method in a zone. */\n async createMethod(site: string, zoneId: string, method: ShippingMethod, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods`,\n auth,\n body: method,\n });\n }\n\n /** Replace a shipping method. */\n async updateMethod(site: string, zoneId: string, methodId: string, method: ShippingMethod, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n body: method,\n });\n }\n\n /** Partially update a shipping method. */\n async patchMethod(site: string, zoneId: string, methodId: string, patch: ShippingMethod, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a shipping method. */\n async deleteMethod(site: string, zoneId: string, methodId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n });\n }\n\n // --- Cost / quote ---\n\n /** Calculate the final shipping cost (`POST /quote`). */\n async quote(site: string, input: QuoteInput, auth: AuthContext = SERVICE): Promise<QuoteResult> {\n return this.ctx.http.request<QuoteResult>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote`,\n auth,\n body: input,\n });\n }\n\n /** Calculate the minimum shipping cost (`POST /quote/minimum`). */\n async quoteMinimum(site: string, input: QuoteInput, auth: AuthContext = SERVICE): Promise<MinimumFee> {\n return this.ctx.http.request<MinimumFee>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote/minimum`,\n auth,\n body: input,\n });\n }\n\n /** Calculate the shipping cost for a given slot (`POST /quote/slot`). */\n async quoteSlot(site: string, input: QuoteSlotInput, auth: AuthContext = SERVICE): Promise<MinimumFee> {\n return this.ctx.http.request<MinimumFee>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote/slot`,\n auth,\n body: input,\n });\n }\n\n // --- Groups ---\n\n /** List shipping groups for a site. */\n async listGroups(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ShippingGroupList> {\n return this.ctx.http.request<ShippingGroupList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/groups`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping group. */\n async getGroup(site: string, groupId: string, auth: AuthContext = SERVICE): Promise<ShippingGroup> {\n return this.ctx.http.request<ShippingGroup>({\n method: \"GET\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n });\n }\n\n /** Create a shipping group. */\n async createGroup(site: string, group: ShippingGroup, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/groups`,\n auth,\n body: group,\n });\n }\n\n /** Replace a shipping group. */\n async updateGroup(site: string, groupId: string, group: ShippingGroup, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n body: group,\n });\n }\n\n /** Delete a shipping group. */\n async deleteGroup(site: string, groupId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n });\n }\n\n // --- Customer-group relations ---\n\n /** List customer-group relations for a site. */\n async listCgRelations(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CgRelationList> {\n return this.ctx.http.request<CgRelationList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/cgrelations`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a customer's customer-group relations. */\n async getCgRelations(site: string, customerId: string, auth: AuthContext = SERVICE): Promise<CgRelation> {\n return this.ctx.http.request<CgRelation>({\n method: \"GET\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Create a customer-group relation. */\n async createCgRelation(site: string, relation: CgRelation, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/cgrelations`,\n auth,\n body: relation,\n });\n }\n\n /** Update a customer's customer-group relations. */\n async updateCgRelations(site: string, customerId: string, relation: CgRelation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n body: relation,\n });\n }\n\n /** Delete a customer's customer-group relation. */\n async deleteCgRelation(site: string, customerId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n // --- Phase 2: delivery windows ---\n\n /** Retrieve delivery windows for a delivery area + cart. */\n async getAreaDeliveryWindows(deliveryAreaId: string, cartId: string, auth: AuthContext = SERVICE): Promise<DeliveryWindowList> {\n return this.ctx.http.request<DeliveryWindowList>({\n method: \"GET\",\n path: `${this.base()}/areaDeliveryTimes/${encodeURIComponent(deliveryAreaId)}/${encodeURIComponent(cartId)}`,\n auth,\n });\n }\n\n /** Retrieve delivery windows for a cart. */\n async getCartDeliveryWindows(cartId: string, auth: AuthContext = SERVICE): Promise<DeliveryWindowList> {\n return this.ctx.http.request<DeliveryWindowList>({\n method: \"GET\",\n path: `${this.base()}/actualDeliveryWindows/${encodeURIComponent(cartId)}`,\n auth,\n });\n }\n\n /** Increment the delivery-window counter. */\n async incrementDeliveryWindowCounter(input: DeliveryWindowValidation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/actualDeliveryWindows/incrementCounter`,\n auth,\n body: input,\n });\n }\n\n /** Validate a delivery window. Resolves when valid; throws otherwise. */\n async validateDeliveryWindow(input: DeliveryWindowValidation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/deliveryWindowValidation`,\n auth,\n body: input,\n });\n }\n\n // --- Phase 2: delivery times ---\n\n /** List all delivery times. */\n async listDeliveryTimes(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<DeliveryTimeList> {\n return this.ctx.http.request<DeliveryTimeList>({\n method: \"GET\",\n path: `${this.base()}/delivery-times`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one delivery time. */\n async getDeliveryTime(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<DeliveryTime> {\n return this.ctx.http.request<DeliveryTime>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n });\n }\n\n /** Create a delivery time. */\n async createDeliveryTime(input: DeliveryTimeInput, auth: AuthContext = SERVICE): Promise<DeliveryCreated> {\n return this.ctx.http.request<DeliveryCreated>({\n method: \"POST\",\n path: `${this.base()}/delivery-times`,\n auth,\n body: input,\n });\n }\n\n /** Create multiple delivery times (`POST /delivery-times/bulk`). */\n async createDeliveryTimesBulk(inputs: DeliveryTimeInput[], auth: AuthContext = SERVICE): Promise<DeliveryCreated[]> {\n return this.ctx.http.request<DeliveryCreated[]>({\n method: \"POST\",\n path: `${this.base()}/delivery-times/bulk`,\n auth,\n body: inputs,\n });\n }\n\n /** Replace a delivery time. */\n async updateDeliveryTime(deliveryTimeId: string, input: DeliveryTimeUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a delivery time (JSON-Patch op array). */\n async patchDeliveryTime(deliveryTimeId: string, ops: ShippingPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a delivery time. */\n async deleteDeliveryTime(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n });\n }\n\n // --- Phase 2: delivery time slots ---\n\n /** List slots of a delivery time. */\n async listSlots(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<DeliverySlotList> {\n return this.ctx.http.request<DeliverySlotList>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n });\n }\n\n /** Retrieve one slot. */\n async getSlot(deliveryTimeId: string, slotId: string, auth: AuthContext = SERVICE): Promise<DeliverySlot> {\n return this.ctx.http.request<DeliverySlot>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n });\n }\n\n /** Create a slot in a delivery time. */\n async createSlot(deliveryTimeId: string, input: DeliverySlot, auth: AuthContext = SERVICE): Promise<DeliveryCreated> {\n return this.ctx.http.request<DeliveryCreated>({\n method: \"POST\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n body: input,\n });\n }\n\n /** Replace a slot. */\n async updateSlot(deliveryTimeId: string, slotId: string, input: DeliverySlot, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a slot (JSON-Patch op array). */\n async patchSlot(deliveryTimeId: string, slotId: string, ops: ShippingPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a slot. */\n async deleteSlot(deliveryTimeId: string, slotId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n });\n }\n\n /** Delete all slots of a delivery time. */\n async deleteAllSlots(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n });\n }\n\n // --- Phase 2: delivery cycles ---\n\n /** Generate a delivery cycle (`POST /delivery-cycles/generate`). Returns the cycle id. */\n async generateDeliveryCycle(input: DeliveryCycleInput, auth: AuthContext = SERVICE): Promise<string> {\n return this.ctx.http.request<string>({\n method: \"POST\",\n path: `${this.base()}/delivery-cycles/generate`,\n auth,\n body: input,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { InvoiceJobDraft, InvoiceJobCreated, InvoiceJob } from \"./invoice-types\";\n\nexport type { InvoiceJobDraft, InvoiceJobCreated, InvoiceJob } from \"./invoice-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Invoice Service (`/invoice/{tenant}/…`): create invoice-generation jobs and\n * poll their status. Backend-only — default auth: service.\n */\nexport class InvoiceService {\n static readonly channel = \"invoice\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/invoice/${this.ctx.tenant}/jobs/invoices`;\n }\n\n /** Create an invoice-generation job (`POST …/jobs/invoices`, 201). */\n async createJob(draft: InvoiceJobDraft, auth: AuthContext = SERVICE): Promise<InvoiceJobCreated> {\n return this.ctx.http.request<InvoiceJobCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /** Retrieve a job and its per-order results (`GET …/jobs/invoices/{jobId}`). */\n async getJob(jobId: string, auth: AuthContext = SERVICE): Promise<InvoiceJob> {\n return this.ctx.http.request<InvoiceJob>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(jobId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { errorFromResponse } from \"../core/errors\";\nimport type {\n Quote,\n QuoteDraft,\n QuoteCreated,\n QuoteUpdate,\n QuoteHistory,\n ListQuotesQuery,\n QuoteReason,\n QuoteReasonDraft,\n QuoteReasonUpdate,\n QuoteReasonCreated,\n ListQuoteReasonsQuery,\n} from \"./quote-types\";\n\nexport type {\n Quote,\n QuoteDraft,\n QuoteCreated,\n QuoteUpdate,\n QuoteHistory,\n ListQuotesQuery,\n QuoteReason,\n QuoteReasonDraft,\n QuoteReasonUpdate,\n QuoteReasonCreated,\n ListQuoteReasonsQuery,\n} from \"./quote-types\";\n\n/**\n * Quote Service (`/quote/{tenant}/…`): B2B quotes and quote reasons. Quotes are\n * customer-owned and never anonymous, so every method takes a REQUIRED `auth`:\n * pass `auth.customer(token)` for a customer's own quotes, or `auth.service()`\n * (an admin token) for `quote_manage`-scoped ops (`delete`, reason mutations).\n */\nexport class QuoteService {\n static readonly channel = \"quote\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private quotesBase(): string {\n return `/quote/${this.ctx.tenant}/quotes`;\n }\n\n private _reasons?: QuoteReasonsResource;\n /** Quote reasons config (`/quote-reasons`). CRUD sub-resource. */\n get reasons(): QuoteReasonsResource {\n return (this._reasons ??= new QuoteReasonsResource(this.ctx));\n }\n\n /** List quotes, wrapped in {@link PaginatedItems}. Pass `{}` for no filter. */\n async list(query: ListQuotesQuery, auth: AuthContext): Promise<PaginatedItems<Quote>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.q) q.q = query.q;\n if (query.sort) q.sort = query.sort;\n return requestPage<Quote>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.quotesBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Create a quote (`POST /quotes`, 201). */\n async create(draft: QuoteDraft, auth: AuthContext): Promise<QuoteCreated> {\n return this.ctx.http.request<QuoteCreated>({\n method: \"POST\",\n path: this.quotesBase(),\n auth,\n body: draft,\n });\n }\n\n /** Retrieve one quote by id. */\n async get(quoteId: string, auth: AuthContext): Promise<Quote> {\n return this.ctx.http.request<Quote>({\n method: \"GET\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n });\n }\n\n /** Apply an update-op array to a quote (`PATCH /quotes/{id}`, 204). */\n async update(quoteId: string, update: QuoteUpdate, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n body: update,\n });\n }\n\n /** Delete a quote (`DELETE /quotes/{id}`). Requires the admin `quote_manage` scope. */\n async delete(quoteId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n });\n }\n\n /** Retrieve a quote's change history (`GET /quotes/{id}/history`). */\n async history(quoteId: string, auth: AuthContext): Promise<QuoteHistory> {\n return this.ctx.http.request<QuoteHistory>({\n method: \"GET\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}/history`,\n auth,\n });\n }\n\n /**\n * Generate a quote PDF (`POST /quotes/{id}/pdf`). Returns the raw PDF bytes.\n * Uses `requestRaw` (no typed-error mapping) — a non-2xx is thrown explicitly.\n */\n async generatePdf(quoteId: string, auth: AuthContext): Promise<Blob> {\n const path = `${this.quotesBase()}/${encodeURIComponent(quoteId)}/pdf`;\n const res = await this.ctx.http.requestRaw({ method: \"POST\", path, auth });\n if (!res.ok) {\n const body = await res.text();\n throw errorFromResponse(res.status, `POST ${path} failed: ${res.status}`, body);\n }\n return await res.blob();\n }\n}\n\n/**\n * Quote reasons (`/quote/{tenant}/quote-reasons`). Config data. Like the rest\n * of the quote domain, every method takes a REQUIRED `auth`: reads accept a\n * customer or admin token; `create`/`update`/`delete` need the admin\n * `quote.quote_manage` scope (`auth.service()`).\n */\nexport class QuoteReasonsResource {\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/quote/${this.ctx.tenant}/quote-reasons`;\n }\n\n /** List reasons, wrapped in {@link PaginatedItems}. Pass `{}` for no paging override. */\n async list(query: ListQuoteReasonsQuery, auth: AuthContext): Promise<PaginatedItems<QuoteReason>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n return requestPage<QuoteReason>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.base(),\n auth,\n query: { pageNumber, pageSize },\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Retrieve one reason by id. */\n async get(reasonId: string, auth: AuthContext): Promise<QuoteReason> {\n return this.ctx.http.request<QuoteReason>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n });\n }\n\n /** Create a reason (`POST /quote-reasons`). Requires the admin `quote_manage` scope. */\n async create(draft: QuoteReasonDraft, auth: AuthContext): Promise<QuoteReasonCreated> {\n return this.ctx.http.request<QuoteReasonCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Replace a reason (`PUT /quote-reasons/{id}`, 204). `draft.metadata.version`\n * is required for optimistic locking. Requires the admin `quote_manage` scope.\n */\n async update(reasonId: string, draft: QuoteReasonUpdate, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a reason (`DELETE /quote-reasons/{id}`). Requires the admin `quote_manage` scope. */\n async delete(reasonId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Return, ReturnList, ReturnInput, ReturnUpdate, ReturnPatch, ReturnCreated } from \"./returns-types\";\n\nexport type { Return, ReturnList, ReturnInput, ReturnUpdate, ReturnPatch, ReturnCreated } from \"./returns-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Returns Service (`/return/{tenant}/returns`): CRUD over returns\n * (RMA). Defaults to the service token; for customer self-service (own returns)\n * pass `auth.customer(token)` (the React hooks do this).\n */\nexport class ReturnsService {\n static readonly channel = \"returns\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/return/${this.ctx.tenant}/returns`;\n }\n\n /** List returns (paged; supports `pageSize`/`pageNumber`/`sort`/`q`). */\n async listReturns(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ReturnList> {\n return this.ctx.http.request<ReturnList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one return by id. */\n async getReturn(returnId: string, auth: AuthContext = SERVICE): Promise<Return> {\n return this.ctx.http.request<Return>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n });\n }\n\n /** Create a return. Returns the created `{ id }`. */\n async createReturn(input: ReturnInput, auth: AuthContext = SERVICE): Promise<ReturnCreated> {\n return this.ctx.http.request<ReturnCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a return by id (`PUT`). */\n async updateReturn(returnId: string, input: ReturnUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a return by id (`PATCH`, JSON-Patch op-array). */\n async patchReturn(returnId: string, ops: ReturnPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a return by id. */\n async deleteReturn(returnId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n IndexConfig,\n IndexConfigCreated,\n IndexPublicConfig,\n ReindexInput,\n ReindexJob,\n ReindexJobInput,\n} from \"./indexing-types\";\n\nexport type {\n IndexConfig,\n IndexConfigCreated,\n IndexPublicConfig,\n ReindexInput,\n ReindexJob,\n ReindexJobInput,\n ReindexEntityType,\n ReindexJobStatus,\n} from \"./indexing-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** Options for {@link IndexingService.listReindexJobs}. */\nexport interface ListReindexJobsOptions {\n pageNumber?: number;\n pageSize?: number;\n /** Raw Emporix `q` filter string. */\n q?: string;\n /** Emporix sort syntax, e.g. `\"metadata.createdAt:desc\"`. */\n sort?: string;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/**\n * Emporix Indexing Service (`/indexing/{tenant}/…`): search-index provider\n * configurations and reindex. Server-side; defaults to the service token.\n *\n * On the `BATTERY_INCLUDED` provider every write validates the stored\n * `indexName`/`writeKey` against the search backend *before* it takes effect:\n * invalid credentials fail with `400` and when that validation is itself\n * unreachable the call fails with `502`. Either way nothing is written — so a\n * `400` from these methods can mean the credentials are wrong rather than the\n * request body.\n */\nexport class IndexingService {\n static readonly channel = \"indexing\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/indexing/${this.ctx.tenant}`;\n }\n\n /** List indexing configurations. */\n async listConfigurations(auth: AuthContext = SERVICE): Promise<IndexConfig[]> {\n return this.ctx.http.request<IndexConfig[]>({ method: \"GET\", path: `${this.base()}/configurations`, auth });\n }\n\n /** Get a configuration by provider name. */\n async getConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<IndexConfig> {\n return this.ctx.http.request<IndexConfig>({\n method: \"GET\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /** Create a configuration. Nothing is stored if credential validation fails. */\n async createConfiguration(input: IndexConfig, auth: AuthContext = SERVICE): Promise<IndexConfigCreated> {\n return this.ctx.http.request<IndexConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/configurations`,\n auth,\n body: input,\n });\n }\n\n /** Update a configuration. Left unchanged if credential validation fails. */\n async updateConfiguration(provider: string, input: IndexConfig, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a configuration by provider name. */\n async deleteConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /** List public indexing configurations. */\n async listPublicConfigurations(auth: AuthContext = SERVICE): Promise<IndexPublicConfig[]> {\n return this.ctx.http.request<IndexPublicConfig[]>({ method: \"GET\", path: `${this.base()}/public/configurations`, auth });\n }\n\n /** Get a public configuration by provider name. */\n async getPublicConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<IndexPublicConfig> {\n return this.ctx.http.request<IndexPublicConfig>({\n method: \"GET\",\n path: `${this.base()}/public/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /**\n * Create a reindex job (replaces {@link reindex}). A `FULL` reindex of the\n * given `entityType`; set `rag: true` to also rebuild the RAG vector index\n * (PRODUCT only). Resolves to the created job (`201`) or, when a job for that\n * `entityType` is already `IN_PROGRESS`, that running job (`200`).\n *\n * On `BATTERY_INCLUDED` with `entityType: \"PRODUCT\"` the stored credentials\n * are validated first; no job is created on the `400`/`502` cases above.\n */\n async createReindexJob(input: ReindexJobInput, auth: AuthContext = SERVICE): Promise<ReindexJob> {\n return this.ctx.http.request<ReindexJob>({\n method: \"POST\",\n path: `${this.base()}/reindex-jobs`,\n auth,\n body: input,\n });\n }\n\n /** List reindex jobs (paginated). */\n async listReindexJobs(\n opts: ListReindexJobsOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<ReindexJob>> {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 50;\n const query: Record<string, string | number | undefined> = { pageNumber, pageSize };\n if (opts.q !== undefined) query.q = opts.q;\n if (opts.sort !== undefined) query.sort = opts.sort;\n return requestPage<ReindexJob>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `${this.base()}/reindex-jobs`,\n query,\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n },\n );\n }\n\n /** Fetch one reindex job by id. */\n async getReindexJob(reindexJobId: string, auth: AuthContext = SERVICE): Promise<ReindexJob> {\n return this.ctx.http.request<ReindexJob>({\n method: \"GET\",\n path: `${this.base()}/reindex-jobs/${encodeURIComponent(reindexJobId)}`,\n auth,\n });\n }\n\n /**\n * Trigger a reindex. On `BATTERY_INCLUDED` the same credential validation\n * runs first, so this can fail with `400`/`502` before any job starts.\n * @deprecated since 2026-06-18, removal 2026-12-01 — use {@link createReindexJob}\n * (`createReindexJob({ entityType: \"PRODUCT\" })`), which returns a trackable job.\n */\n async reindex(input: ReindexInput, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"POST\", path: `${this.base()}/reindex`, auth, body: input });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage, type PageParams } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n FilterNode,\n IndexAnalyzer,\n IndexExportPackage,\n IndexField,\n IndexImportResult,\n IndexJob,\n IndexRequest,\n IndexSelection,\n JobId,\n QueryNode,\n SavedQuery,\n SavedQueryId,\n SavedQueryRequest,\n SearchHit as GenSearchHit,\n SearchIndex as GenSearchIndex,\n SearchPost,\n} from \"../generated/search-service\";\n\n/** A matching document. Stored fields come back as stored, plus `id` and `_score`. */\nexport type SearchHit = GenSearchHit;\n/**\n * Body of {@link SearchService.search}: a direct search (`index` plus `queries`,\n * `filters` or both) or a saved-search call (`searchQueryId` plus `query`).\n */\nexport type SearchInput = SearchPost;\n/** One query node: an `and` group, an `or` group, or one query. */\nexport type SearchQueryNode = QueryNode;\n/** One filter node: an `and` group, an `or` group, or one comparison. */\nexport type SearchFilterNode = FilterNode;\n/** A stored saved search. The request field `index` comes back as `indexId`. */\nexport type SavedSearch = SavedQuery;\n/** Body of {@link SearchService.upsertSavedSearch}. */\nexport type SavedSearchInput = SavedQueryRequest;\n/** `201` response of {@link SearchService.upsertSavedSearch}. */\nexport type SavedSearchCreated = SavedQueryId;\n/** A search index on one type: a custom schema type, `customer` or `legal-entity`. */\nexport type SearchIndex = GenSearchIndex;\n/** Body of {@link SearchService.upsertIndex}. */\nexport type SearchIndexInput = IndexRequest;\n/**\n * One field of a search index. A string field with `text: true` can name an\n * `analyzer` and up to three `additionalAnalyzers`; a list of objects is\n * indexed through `itemFields` instead of flags on the list itself.\n */\nexport type SearchIndexField = IndexField;\n/**\n * Named text-comparison rules on an index (`analyzers`, at most ten), starting\n * from a preset (`basedOn`: `STANDARD`, `FOLDED`, `IDENTIFIER`, `SOUNDS_LIKE`).\n * Every analyzer must be selected by a field, or the index write answers `400`.\n */\nexport type SearchIndexAnalyzer = IndexAnalyzer;\n/** An index build or deletion job. */\nexport type SearchIndexJob = IndexJob;\n/** The id of the job an index write started. */\nexport type SearchIndexJobRef = JobId;\n/** One index to export: `{ type, id }`. */\nexport type SearchIndexSelection = IndexSelection;\n/**\n * Exported index configuration: `exportedAt` plus `data`, a base64-encoded JSON\n * array. {@link SearchService.importIndexes} takes it back unchanged.\n */\nexport type SearchIndexExport = IndexExportPackage;\n/** Result for one imported index. `jobId` and `jobType` are present when a build job started. */\nexport type SearchIndexImportResult = IndexImportResult;\n\n/** Paging, sort, filter and projection for the list reads. */\nexport interface SearchListOptions {\n pageNumber?: number;\n /** Defaults to 60, the server's default. */\n pageSize?: number;\n /** `field`, `field:ASC` or `field:DESC`, comma-separated. Default: `metadata.createdAt` descending. */\n sort?: string;\n /** Raw Emporix `q` filter string. */\n q?: string;\n /** Comma-separated properties to return. */\n fields?: string;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/** Options for {@link SearchService.listSavedSearches} and {@link SearchService.listIndexes}. */\nexport interface SearchTypeListOptions extends SearchListOptions {\n /** One type: a custom schema type, `customer` or `legal-entity`. Omitted, the list spans every type, and each item carries `type`. */\n type?: string;\n}\n\n/**\n * Options for {@link SearchService.search}. Without `sort`, hits are ordered by\n * relevance; without `fields`, each hit carries `_score`.\n */\nexport type SearchOptions = Omit<SearchListOptions, \"q\">;\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\nfunction pageQuery(opts: SearchListOptions): { query: Record<string, string | number>; page: PageParams } {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 60;\n const query: Record<string, string | number> = { pageNumber, pageSize };\n if (opts.sort !== undefined) query.sort = opts.sort;\n if (opts.q !== undefined) query.q = opts.q;\n if (opts.fields !== undefined) query.fields = opts.fields;\n const page: PageParams = {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n };\n return { query, page };\n}\n\n/**\n * Emporix Search Service (`/search/{tenant}/…`, **preview**): searches the\n * documents of one type, stores saved searches, and manages the search indexes\n * and the jobs that build them. A type is a custom schema type, `customer` or\n * `legal-entity` (the last two since 2026-10-29). Server-side; defaults to the\n * service token.\n *\n * Scopes: `search.search_read` for every read and for `search`,\n * `search.search_manage` for every write. Searching also needs read access to\n * the documents themselves, or it answers `403`: `schema.custominstance_read`,\n * `custom.{type}_read` or `custom.{type}_read_own` for a custom type;\n * `customer.customer_read` or `customer.customer_read_own` for `customer`;\n * `customermanagement.legalentity_read` or `…_read_own` for `legal-entity`. A\n * site-restricted read scope (`customer.customer_read--DE#AT`) returns only the\n * documents whose `restriction` / `restrictions` match, and an own scope only\n * the caller's own customer or legal entity.\n */\nexport class SearchService {\n static readonly channel = \"search\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/search/${this.ctx.tenant}`;\n }\n\n /**\n * Search the documents of one type — a custom schema type, `customer` or\n * `legal-entity`. Paging, `sort` and `fields` travel as query parameters, not\n * in the body.\n *\n * Filter and sort fields must be indexed on the index the search uses —\n * `exact`, or `text: true` for a `CONTAINS` filter — or the call answers\n * `400`. A `TEXT` or `PHRASE` query may pick the field's `analyzer` or one of\n * its `additionalAnalyzers`. Conditions joined by `and` on fields of one\n * `itemFields` list must match the same list item. A saved-search call\n * (`{ searchQueryId, query }`) answers `404` when no saved search has that id\n * for `type`, and `502` means the Schema Service could not confirm that a\n * custom `type` is a custom entity.\n *\n * @example\n * const hits = await client.search.search(\"VEHICLE\", {\n * index: \"vehicles\",\n * queries: [{ type: \"TEXT\", query: \"diesel\", field: \"name.en\" }],\n * filters: { field: \"status\", operator: \"EQ\", value: \"ACTIVE\" },\n * });\n */\n async search(\n type: string,\n input: SearchInput,\n opts: SearchOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SearchHit>> {\n const { query, page } = pageQuery(opts);\n return requestPage<SearchHit>(\n this.ctx.http,\n {\n method: \"POST\",\n path: `${this.base()}/search/${encodeURIComponent(type)}`,\n auth,\n query,\n body: input,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n },\n page,\n );\n }\n\n /** List saved searches of one type (`opts.type`), or of every type. */\n async listSavedSearches(\n opts: SearchTypeListOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SavedSearch>> {\n const { query, page } = pageQuery(opts);\n const t = opts.type;\n return requestPage<SavedSearch>(\n this.ctx.http,\n {\n method: \"GET\",\n path: t === undefined ? `${this.base()}/search/queries` : `${this.base()}/search/${encodeURIComponent(t)}/queries`,\n auth,\n query,\n },\n page,\n );\n }\n\n /** Fetch one saved search. */\n async getSavedSearch(\n type: string,\n id: string,\n opts: { fields?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<SavedSearch> {\n return this.ctx.http.request<SavedSearch>({\n method: \"GET\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n\n /**\n * Create or replace a saved search. Resolves to `{ id }` when it was created\n * (`201`) and to `undefined` when it replaced an existing one (`204`).\n *\n * A replace needs the stored `metadata.version` — `400` without it, `409`\n * when it is stale. `index` must already exist for `type` (`404`\n * otherwise). Saving does not start an index build.\n */\n async upsertSavedSearch(\n type: string,\n id: string,\n input: SavedSearchInput,\n auth: AuthContext = SERVICE,\n ): Promise<SavedSearchCreated | undefined> {\n return this.ctx.http.request<SavedSearchCreated | undefined>({\n method: \"PUT\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a saved search. Does not start an index build. */\n async deleteSavedSearch(type: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** List search indexes of one type (`opts.type`), or of every type. */\n async listIndexes(\n opts: SearchTypeListOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SearchIndex>> {\n const { query, page } = pageQuery(opts);\n const t = opts.type;\n return requestPage<SearchIndex>(\n this.ctx.http,\n {\n method: \"GET\",\n path: t === undefined ? `${this.base()}/search/indexes` : `${this.base()}/search/${encodeURIComponent(t)}/indexes`,\n auth,\n query,\n },\n page,\n );\n }\n\n /** Fetch one search index. */\n async getIndex(\n type: string,\n id: string,\n opts: { fields?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<SearchIndex> {\n return this.ctx.http.request<SearchIndex>({\n method: \"GET\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n\n /**\n * Create or update a search index. Resolves to the id of the job that builds\n * it (`202`) — for a new index, a changed field list, or an index whose\n * status is `building` or `failed` — and to `undefined` (`204`) when the\n * index is `ready` and its fields are unchanged; `name` and `description`\n * still change then. Track the job with {@link getJob}.\n *\n * `metadata.version` is optional on an update too. When sent, it is an\n * optimistic lock: a stale one answers `409`, as does a job that is already\n * running for this index.\n */\n async upsertIndex(\n type: string,\n id: string,\n input: SearchIndexInput,\n auth: AuthContext = SERVICE,\n ): Promise<SearchIndexJobRef | undefined> {\n return this.ctx.http.request<SearchIndexJobRef | undefined>({\n method: \"PUT\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n body: input,\n });\n }\n\n /**\n * Start deleting a search index. Resolves to the id of the job that removes\n * it (`202`); `409` means a job for this index is already running.\n */\n async deleteIndex(type: string, id: string, auth: AuthContext = SERVICE): Promise<SearchIndexJobRef> {\n return this.ctx.http.request<SearchIndexJobRef>({\n method: \"DELETE\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Export the configuration of the selected indexes as one package, to be\n * imported on another tenant with {@link importIndexes}. The decoded `data`\n * holds `id`, `type`, `fields` and the optional `name` and `description` of\n * each index, not its `status` or `metadata`. `404` when a selected index does\n * not exist, `400` for an empty selection.\n */\n async exportIndexes(selections: SearchIndexSelection[], auth: AuthContext = SERVICE): Promise<SearchIndexExport> {\n return this.ctx.http.request<SearchIndexExport>({\n method: \"POST\",\n path: `${this.base()}/search/indexes/export`,\n auth,\n body: selections,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n\n /**\n * Create or update every index in a package from {@link exportIndexes}, with\n * the same checks as {@link upsertIndex}. Resolves to one result per index,\n * in package order; `jobId` and `jobType` are absent for a ready index whose\n * fields did not change.\n *\n * Not atomic: when an index fails, the ones before it stay created or updated\n * and the call throws that index's error — `400` for an unreadable package or\n * an invalid field, `409` for a running job or a stale `metadata.version`.\n */\n async importIndexes(pkg: SearchIndexExport, auth: AuthContext = SERVICE): Promise<SearchIndexImportResult[]> {\n return this.ctx.http.request<SearchIndexImportResult[]>({\n method: \"POST\",\n path: `${this.base()}/search/indexes/import`,\n auth,\n body: pkg,\n });\n }\n\n /** List index jobs of the tenant. */\n async listJobs(opts: SearchListOptions = {}, auth: AuthContext = SERVICE): Promise<PaginatedItems<SearchIndexJob>> {\n const { query, page } = pageQuery(opts);\n return requestPage<SearchIndexJob>(\n this.ctx.http,\n { method: \"GET\", path: `${this.base()}/jobs`, auth, query },\n page,\n );\n }\n\n /** Fetch one index job. */\n async getJob(id: string, opts: { fields?: string } = {}, auth: AuthContext = SERVICE): Promise<SearchIndexJob> {\n return this.ctx.http.request<SearchIndexJob>({\n method: \"GET\",\n path: `${this.base()}/jobs/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { SseEvent } from \"../core/sse\";\nimport type { Page } from \"../generated/import-service\";\nimport type {\n ImportCancelResult,\n ImportConfig,\n ImportHealthThresholds,\n ImportJobGroup,\n ImportLicense,\n ImportStats,\n ImportStatsQuery,\n ImportErrorRecord,\n ImportFile,\n ImportFileQueue,\n ImportFileUploadLimits,\n ImportPage,\n ImportRecordOutcome,\n ImportRun,\n ImportRunDetail,\n ImportRunEvent,\n ImportRunDiagnostics,\n ImportRunDiagnosticsQuery,\n ImportRunInput,\n ImportRunStream,\n ImportSchedule,\n ImportStream,\n ImportStreamOrder,\n ImportedRecord,\n} from \"./imports-types\";\n\nexport type {\n ImportCancelResult,\n ImportConfig,\n ImportDiagnosticKind,\n ImportDiagnosticRecord,\n ImportErrorRecord,\n ImportFile,\n ImportFileQueue,\n ImportFileStatus,\n ImportFileUploadLimits,\n ImportHealthThresholds,\n ImportJobGroup,\n ImportLicense,\n ImportPage,\n ImportRecordOutcome,\n ImportRun,\n ImportRunDetail,\n ImportRunDiagnostics,\n ImportRunDiagnosticsQuery,\n ImportRunEvent,\n ImportRunInput,\n ImportRunMode,\n ImportRunStatus,\n ImportRunStream,\n ImportSchedule,\n ImportStats,\n ImportStatsQuery,\n ImportStream,\n ImportStreamOrder,\n ImportedRecord,\n} from \"./imports-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\nconst DEFAULT_PAGE_SIZE = 50;\n\n/** One-based paging options, shared by every paginated import endpoint. */\nexport interface ImportPageOptions {\n /** One-based page number. Default `1`. */\n pageNumber?: number;\n /** Page size. Default `50`. The service may clamp this — the result echoes what it used. */\n pageSize?: number;\n}\n\n/** Options for {@link ImportService.searchRecords}. `type` is required. */\nexport interface SearchImportedRecordsOptions extends ImportPageOptions {\n /** The target type to search, one of {@link ImportService.listDataTypes}. */\n type: string;\n /**\n * Case-insensitive substring match on the record's natural key. This is NOT\n * the Emporix query language — `field:value`, comparisons and boolean logic\n * are not supported here.\n */\n search?: string;\n /** Filter by import outcome. Omit for records of all outcomes. */\n outcome?: ImportRecordOutcome;\n}\n\n/** Options for {@link ImportService.searchStreamRecords}. */\nexport type SearchStreamRecordsOptions = Omit<SearchImportedRecordsOptions, \"type\">;\n\n/** The wire shape of a paginated import response. */\ntype WirePage<T> = Page & { content?: T[] };\n\nfunction pageArgs(opts: ImportPageOptions): { pageNumber: number; pageSize: number } {\n return { pageNumber: opts.pageNumber ?? 1, pageSize: opts.pageSize ?? DEFAULT_PAGE_SIZE };\n}\n\n/**\n * Spring page → {@link ImportPage}. `pageNumber` / `pageSize` prefer the\n * server's echo over what was requested, because the service clamps `size`;\n * reporting the requested value would misdescribe the page you actually got.\n */\nfunction toPage<T>(\n wire: WirePage<T>,\n requested: { pageNumber: number; pageSize: number },\n): ImportPage<T> {\n const totalPages = wire.totalPages ?? 0;\n const pageNumber = (wire.number ?? requested.pageNumber - 1) + 1;\n return {\n items: wire.content ?? [],\n pageNumber,\n pageSize: wire.size ?? requested.pageSize,\n hasNextPage: pageNumber < totalPages,\n totalElements: wire.totalElements ?? 0,\n totalPages,\n };\n}\n\n/**\n * One SSE frame → one typed event. Anything unparseable, non-object or under an\n * event name this SDK does not model becomes `unknown` instead of throwing: a\n * preview service is allowed to grow event types, and a run in flight must not\n * die because of one frame we cannot read.\n */\nfunction toRunEvent(ev: SseEvent): ImportRunEvent {\n let payload: unknown;\n try {\n payload = JSON.parse(ev.data);\n } catch {\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n if (typeof payload !== \"object\" || payload === null) {\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n switch (ev.event) {\n case \"snapshot\": {\n const detail = payload as ImportRunDetail;\n return { type: \"snapshot\", run: detail.run, streams: detail.streams ?? [] };\n }\n case \"stream\":\n return { type: \"stream\", stream: payload as ImportRunStream };\n case \"run\":\n return { type: \"run\", run: payload as ImportRun };\n default:\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n}\n\n/**\n * Emporix Import Service (`/importtool/{tenant}/…`): import configurations,\n * their streams and schedules, run control, and the records an import produced.\n *\n * **Service-account only.** Every operation requires the\n * `importtool.import_trigger` scope on the client credentials, and the service\n * has no customer or anonymous variant — which is why `@viu/emporix-sdk-react`\n * ships no hooks for it. Call it from a server (Node, a Next Route Handler or\n * Server Action), never from a browser bundle.\n *\n * **Paging is one-based here, zero-based on the wire.** The facade takes\n * `pageNumber` starting at 1 and sends `page = pageNumber - 1`, matching the\n * rest of the SDK.\n *\n * **Upstream marks every operation as preview**: the contract may change without\n * a major version bump, and nearly every response field is optional in the spec.\n * Treat run counters and status as possibly absent.\n */\nexport class ImportService {\n static readonly channel = \"import\" as const;\n\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/importtool/${this.ctx.tenant}`;\n }\n\n /** List every import configuration of the tenant. */\n async listConfigs(auth: AuthContext = SERVICE): Promise<ImportConfig[]> {\n return this.ctx.http.request<ImportConfig[]>({\n method: \"GET\",\n path: `${this.base()}/configs`,\n auth,\n });\n }\n\n /** Fetch one configuration by id. */\n async getConfig(id: string, auth: AuthContext = SERVICE): Promise<ImportConfig> {\n return this.ctx.http.request<ImportConfig>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** List the streams of one configuration. */\n async listStreams(configId: string, auth: AuthContext = SERVICE): Promise<ImportStream[]> {\n return this.ctx.http.request<ImportStream[]>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/streams`,\n auth,\n });\n }\n\n /** Fetch one stream by id. */\n async getStream(id: string, auth: AuthContext = SERVICE): Promise<ImportStream> {\n return this.ctx.http.request<ImportStream>({\n method: \"GET\",\n path: `${this.base()}/streams/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * The order in which a configuration's streams run, and the dependencies\n * behind it. Read it here instead of deriving it from the stream definitions:\n * mapping transformations add dependencies that no single stream shows, so a\n * self-computed order can differ from the one used at run time.\n *\n * The result lists stream **names**, while {@link triggerRun}'s `streamIds`\n * takes stream **ids** — map through {@link listStreams} before passing a\n * subset back.\n */\n async getStreamOrder(configId: string, auth: AuthContext = SERVICE): Promise<ImportStreamOrder> {\n return this.ctx.http.request<ImportStreamOrder>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/stream-order`,\n auth,\n });\n }\n\n /**\n * Fetch a configuration's schedule. Resolves to `null` when none is\n * configured — the service answers `204`, not `404`, so an absent schedule is\n * a normal result rather than an error.\n */\n async getSchedule(\n configId: string,\n auth: AuthContext = SERVICE,\n ): Promise<ImportSchedule | null> {\n const res = await this.ctx.http.request<ImportSchedule | undefined>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n auth,\n });\n return res ?? null;\n }\n\n /**\n * Create or replace a configuration's schedule.\n *\n * **`cron` is a six-field Spring expression** (`second minute hour\n * day-of-month month day-of-week`). The familiar five-field `\"0 * * * *\"` is\n * not «hourly» here, it is invalid, and the service answers `400` rather than\n * storing it — which it used to do, leaving a schedule that silently never\n * fired.\n *\n * A `404` means no configuration with that id, so there is nothing to\n * schedule. Use {@link deleteSchedule} to clear a schedule that outlived its\n * configuration.\n */\n async setSchedule(\n configId: string,\n input: ImportSchedule,\n auth: AuthContext = SERVICE,\n ): Promise<ImportSchedule> {\n return this.ctx.http.request<ImportSchedule>({\n method: \"PUT\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n body: input,\n auth,\n });\n }\n\n /**\n * Remove a configuration's schedule. It then runs only when triggered.\n *\n * **Idempotent, and deliberately not gated on the configuration existing.**\n * Removing a schedule that is not there also resolves — and unlike\n * {@link setSchedule}, this does not require the configuration to exist. That\n * is the point: a schedule left behind by a deleted configuration is exactly\n * what needs removing, so refusing those would leave them with no way out.\n *\n * The service answers `204`, so this resolves to `void` rather than to the\n * removed schedule.\n */\n async deleteSchedule(configId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n auth,\n });\n }\n\n /**\n * Trigger a run. `mode` defaults to `DELTA` server-side; `dryRun: true` maps\n * and validates without writing to the target.\n *\n * **The run comes back `QUEUED`, not `RUNNING`.** It starts when a worker is\n * free, usually within moments, or after one of the tenant's runs finishes when\n * `maxConcurrentImports` are already executing — no `429` any more. A\n * configuration holds at most one executing and one queued run: while it has a\n * run `QUEUED`, `RUNNING` or `RESUMABLE`, this call answers `409`.\n *\n * A dry run can also hand back what it *would* have written: pass\n * `sampleSize` (1–100, default 25) and read the run's `dryRunSample`. Set\n * `origin` to name what asked for the run — `trigger` only distinguishes\n * `MANUAL` from `SCHEDULED`, so without it a dashboard click and an\n * integration scenario are indistinguishable in the history. Note the service\n * **rejects** an `origin` over 40 characters instead of shortening it.\n *\n * `streamIds` runs a subset — see {@link ImportRunInput} for what is rejected,\n * and note it takes ids where {@link getStreamOrder} reports names.\n *\n * A run executes each stream's **published** mappings. Publishing needs\n * `importtool.import_manage` and is not part of the public API, so it happens\n * in the Management Dashboard's Import Tool rather than through this SDK; a dry\n * run with `mappings: \"draft\"` checks unpublished changes first. A stream whose\n * mappings were never published is `ABORTED` in the run details, and the run\n * finishes `PARTIAL`.\n *\n * **A refused run still resolves.** When `streamIds` names such a stream, or\n * every enabled stream is in that state, the service answers `200` with the\n * run anyway, and the run then finishes `ABORTED` with a `message` naming the\n * streams. Read it back with {@link getRun}, or follow it with\n * {@link streamRun}, before treating a resolved call as a started import.\n *\n * A configuration that does not exist answers `404` (since 2026-11-06; it used\n * to be a `500`). A real run with nothing to import answers `400`: every stream\n * it starts from reads uploaded files, and none has ever had one. Upload a file\n * with {@link uploadStreamFile} first. A dry run is not refused for this.\n *\n * Not retried on a 5xx: a POST that timed out may already have queued a run.\n *\n * @example\n * ```ts\n * // Preview the mapping without writing anything.\n * const run = await client.imports.triggerRun(configId, {\n * dryRun: true,\n * sampleSize: 5,\n * origin: \"Dashboard\",\n * });\n * for (const row of run.dryRunSample ?? []) {\n * console.log(row.stream, row.targetType, row.key, row.fields);\n * }\n * ```\n */\n async triggerRun(\n configId: string,\n input: ImportRunInput = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportRun> {\n return this.ctx.http.request<ImportRun>({\n method: \"POST\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/runs`,\n body: input,\n auth,\n });\n }\n\n /** List a configuration's runs, newest first. */\n async listRuns(\n configId: string,\n opts: ImportPageOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportRun>> {\n const args = pageArgs(opts);\n const wire = await this.ctx.http.request<WirePage<ImportRun>>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/runs`,\n query: { page: args.pageNumber - 1, size: args.pageSize },\n auth,\n });\n return toPage(wire, args);\n }\n\n /** Fetch one run with its per-stream progress. */\n async getRun(runId: string, auth: AuthContext = SERVICE): Promise<ImportRunDetail> {\n return this.ctx.http.request<ImportRunDetail>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}`,\n auth,\n });\n }\n\n /**\n * Stream a run's progress as Server-Sent Events: an initial `snapshot`, then a\n * `stream` event per processed batch, then a final `run` event when the run\n * finishes. The iterator ends when the service closes the stream; breaking out\n * of the `for await` aborts the request.\n *\n * Two ways this differs from every other method here. It does not re-auth: a\n * `401` while opening the stream throws instead of minting a fresh token and\n * retrying once, so a long-lived consumer should be ready to re-open (or fall\n * back to polling {@link getRun}). And frames this SDK version cannot read\n * arrive as `{ type: \"unknown\" }` rather than throwing — see\n * {@link ImportRunEvent}.\n */\n async *streamRun(\n runId: string,\n auth: AuthContext = SERVICE,\n ): AsyncIterable<ImportRunEvent> {\n const frames = this.ctx.http.requestStream({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/events`,\n auth,\n });\n for await (const frame of frames) yield toRunEvent(frame);\n }\n\n /**\n * Request cancellation of a run. `force: true` hard-stops it immediately;\n * without it the run stops at the next safe point. The service answers `202`\n * with `accepted: false` when the run is unknown or already finished — that is\n * a result, not an error. A state conflict may instead come back as a `409`,\n * which does throw.\n *\n * A `QUEUED` run is cancelled at once, with or without `force`. A `RESUMABLE`\n * run stops only with `force: true`; without it the call answers `409`.\n */\n async cancelRun(\n runId: string,\n opts: { force?: boolean } = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportCancelResult> {\n const query: Record<string, string | number | undefined> = {};\n if (opts.force) query.force = \"true\";\n return this.ctx.http.request<ImportCancelResult>({\n method: \"POST\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/cancel`,\n query,\n auth,\n });\n }\n\n /** List the errors recorded during a run. */\n async listRunErrors(\n runId: string,\n opts: ImportPageOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportErrorRecord>> {\n const args = pageArgs(opts);\n const wire = await this.ctx.http.request<WirePage<ImportErrorRecord>>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/errors`,\n query: { page: args.pageNumber - 1, size: args.pageSize },\n auth,\n });\n return toPage(wire, args);\n }\n\n /**\n * The rows behind a run's feed-quality counters: source rows that repeated a\n * natural key (`kind: \"REPEATED_KEY\"`, counted as `duplicateKeys`) and child\n * lines with no parent to attach to (`\"UNRESOLVED_PARENT\"`, counted as\n * `unresolvedParents`). Neither is a failure, which is why these rows are not\n * in {@link listRunErrors}.\n *\n * **A capped sample** — see {@link ImportRunDiagnostics} before reading\n * `rows.length` as the size of the problem. `limit` defaults to 500 here\n * (1–50 000); {@link downloadRunDiagnosticsCsv} defaults to 50 000.\n */\n async listRunDiagnostics(\n runId: string,\n query: ImportRunDiagnosticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportRunDiagnostics> {\n return this.ctx.http.request<ImportRunDiagnostics>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/diagnostics`,\n query: { ...query },\n auth,\n });\n }\n\n /**\n * The same rows as {@link listRunDiagnostics}, as CSV text for a spreadsheet\n * or a ticket. Comment lines above the header record whether `limit` or the\n * recording cap cut rows off, so the file keeps that context when shared on\n * its own. `limit` defaults to 50 000 here, not 500.\n *\n * Every value is quoted, and a value starting with `=`, `+`, `-` or `@` is\n * prefixed with an apostrophe so spreadsheet software does not evaluate source\n * data as a formula. Strip it if you parse the file instead of opening it.\n */\n async downloadRunDiagnosticsCsv(\n runId: string,\n query: ImportRunDiagnosticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<string> {\n // `request` falls back to the raw text when a body is not JSON, and a CSV\n // with a quoted multi-column header never is.\n return this.ctx.http.request<string>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/diagnostics/csv`,\n query: { ...query },\n auth,\n });\n }\n\n /** List the target types that hold imported records — the valid `type` values for {@link searchRecords}. */\n async listDataTypes(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `${this.base()}/data/types`,\n auth,\n });\n }\n\n /** Search imported records of one target type. */\n async searchRecords(\n opts: SearchImportedRecordsOptions,\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportedRecord>> {\n const args = pageArgs(opts);\n const query: Record<string, string | number | undefined> = {\n type: opts.type,\n page: args.pageNumber - 1,\n size: args.pageSize,\n };\n if (opts.search !== undefined) query.search = opts.search;\n if (opts.outcome !== undefined) query.outcome = opts.outcome;\n const wire = await this.ctx.http.request<WirePage<ImportedRecord>>({\n method: \"GET\",\n path: `${this.base()}/data/records`,\n query,\n auth,\n });\n return toPage(wire, args);\n }\n\n /** Search the imported records produced by one stream. */\n async searchStreamRecords(\n streamId: string,\n opts: SearchStreamRecordsOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportedRecord>> {\n const args = pageArgs(opts);\n const query: Record<string, string | number | undefined> = {\n page: args.pageNumber - 1,\n size: args.pageSize,\n };\n if (opts.search !== undefined) query.search = opts.search;\n if (opts.outcome !== undefined) query.outcome = opts.outcome;\n const wire = await this.ctx.http.request<WirePage<ImportedRecord>>({\n method: \"GET\",\n path: `${this.base()}/data/streams/${encodeURIComponent(streamId)}/records`,\n query,\n auth,\n });\n return toPage(wire, args);\n }\n\n // ─── Analytics and retry (upstream release 2026-08-26) ─────────────────────\n\n /**\n * Aggregated import analytics.\n *\n * Every section is optional in the response, and `sections` is what decides\n * which the service computes — asking for all of them on a tenant with a long\n * history is the expensive call, so name the ones you render.\n *\n * `from` / `to` are ISO timestamps. Omitted, the service picks its own window;\n * do not assume it is «everything».\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async stats(\n query: ImportStatsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportStats> {\n return this.ctx.http.request<ImportStats>({\n method: \"GET\",\n path: `${this.base()}/stats`,\n query: { ...query },\n auth,\n });\n }\n\n /**\n * The dashboard's job groups: configurations with their runs grouped under\n * them.\n *\n * Named after the path rather than the summary («Retrieving job groups»)\n * because the resource lives under `/dashboard` and is shaped for that view —\n * a caller wanting plain run history wants {@link listRuns}.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async listJobGroups(auth: AuthContext = SERVICE): Promise<ImportJobGroup[]> {\n return this.ctx.http.request<ImportJobGroup[]>({\n method: \"GET\",\n path: `${this.base()}/dashboard/job-groups`,\n auth,\n });\n }\n\n /**\n * The tenant's health thresholds — the error rates above which a stream counts\n * as degraded or failing in {@link stats}.\n *\n * Read-only here: changing them needs `importtool.import_manage`, which this\n * service does not cover.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async getHealthThresholds(\n auth: AuthContext = SERVICE,\n ): Promise<ImportHealthThresholds> {\n return this.ctx.http.request<ImportHealthThresholds>({\n method: \"GET\",\n path: `${this.base()}/settings/health-thresholds`,\n auth,\n });\n }\n\n /**\n * The tenant's import limits and current consumption. `maxConcurrentImports`\n * caps executing runs only: a run beyond it waits `QUEUED` instead of being\n * rejected.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async getLicense(auth: AuthContext = SERVICE): Promise<ImportLicense> {\n return this.ctx.http.request<ImportLicense>({\n method: \"GET\",\n path: `${this.base()}/license`,\n auth,\n });\n }\n\n /**\n * Retry only the failed records of a finished run.\n *\n * Returns a **new** run — the retry is its own run with `retry: true`, not a\n * mutation of the original. Poll it with {@link getRun} or follow it with\n * {@link streamRun} exactly as you would a triggered run. Like one, it comes\n * back `QUEUED`, answers `409` while the configuration has a run `QUEUED`,\n * `RUNNING` or `RESUMABLE`, runs the published mappings and can finish\n * `ABORTED`. A run that does not exist answers `404`.\n *\n * Not retried on a 5xx, for the same reason {@link triggerRun} is not: a POST\n * that timed out may already have queued the retry.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async retryRun(runId: string, auth: AuthContext = SERVICE): Promise<ImportRun> {\n return this.ctx.http.request<ImportRun>({\n method: \"POST\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/retry`,\n auth,\n });\n }\n\n // ─── File queue (upstream release 2026-10-28) ──────────────────────────────\n\n /**\n * A file-based stream's queue: what it still has to import, in load order,\n * and the files it already dealt with, newest first. `historyLimit` caps\n * `history` only (1–500, default 100); `pending` comes back whole up to 2000\n * files — see {@link ImportFileQueue}.\n */\n async listStreamFiles(\n streamId: string,\n opts: { historyLimit?: number } = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportFileQueue> {\n const query: Record<string, string | number | undefined> = {};\n if (opts.historyLimit !== undefined) query.historyLimit = opts.historyLimit;\n return this.ctx.http.request<ImportFileQueue>({\n method: \"GET\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files`,\n query,\n auth,\n });\n }\n\n /**\n * Queue a delimited file (CSV or one of its variants) for a file-based\n * stream's next run. Nothing is imported by this call — trigger a run for\n * that.\n *\n * `fileName` is required: the service displays it and infers the compression\n * from it, and a bare `Blob` would otherwise arrive named «blob».\n *\n * The service recognises a file by the SHA-256 of its content, whatever its\n * name, and answers `409` when the stream already imported or queued those\n * bytes; a file that previously `FAILED` is accepted again. It also answers\n * `409` when the stream does not read files, or when a run in flight uses\n * bytes this upload would replace. `413`: the file is over the limit from\n * {@link getStreamFileLimits}. `503`: uploading is not configured in this\n * environment.\n *\n * Not retried on a 5xx: a request that timed out may have queued the file,\n * and sending it again would then answer `409`. Check {@link listStreamFiles}\n * instead.\n */\n async uploadStreamFile(\n streamId: string,\n file: Blob,\n fileName: string,\n auth: AuthContext = SERVICE,\n ): Promise<ImportFile> {\n const fd = new FormData();\n fd.set(\"file\", file, fileName);\n return this.ctx.http.request<ImportFile>({\n method: \"POST\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files`,\n body: fd,\n auth,\n });\n }\n\n /**\n * The largest file this environment accepts, and whether uploading is\n * available at all — check it to refuse an oversize file before sending it.\n *\n * When `gatewayLimited` is `true`, a larger file is refused by the API gateway\n * with the gateway's own `413` body, before it reaches the service. Publish\n * such a file at an HTTP(S) URL and set it as the connection's file URL\n * instead.\n */\n async getStreamFileLimits(\n streamId: string,\n auth: AuthContext = SERVICE,\n ): Promise<ImportFileUploadLimits> {\n return this.ctx.http.request<ImportFileUploadLimits>({\n method: \"GET\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files/limits`,\n auth,\n });\n }\n\n /**\n * Set the order in which a stream's waiting files are read, and resolve to\n * the queue in that order. For an `INCREMENTAL` feed the order is the data: a\n * later file's values win on a key an earlier one also carries, so place an\n * older export first.\n *\n * Takes **every** waiting file's id, in load order — not a single file to\n * move. A list that is not exactly the waiting set answers `400`. `409` means\n * the job has a run in flight, or the queue is too long to reorder (the\n * queue's `pendingTruncated`).\n */\n async setStreamFileOrder(\n streamId: string,\n fileIds: string[],\n auth: AuthContext = SERVICE,\n ): Promise<ImportFile[]> {\n return this.ctx.http.request<ImportFile[]>({\n method: \"PUT\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files/order`,\n body: fileIds,\n auth,\n });\n }\n\n /**\n * Remove a waiting file from the queue and delete its stored bytes.\n *\n * Only a `PENDING` file can go: a file a run has claimed or already imported\n * answers `409`, and so does any file while the job has a run in flight. An\n * imported file stays in the history on purpose — removing it would make the\n * same bytes importable again.\n */\n async deleteStreamFile(\n streamId: string,\n fileId: string,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files/${encodeURIComponent(fileId)}`,\n auth,\n });\n }\n\n /**\n * Put a `FAILED` file back at the end of the stream's queue, so the next run\n * reads the content the service already holds — no new upload. Use it after\n * fixing the cause of the failure, a mapping say. Resolves to the file,\n * `PENDING` again.\n *\n * Only a failed file can be queued again; `409` otherwise. A file imported with\n * some records failing is `PROCESSED`: retry those records with\n * {@link retryRun} instead. On a `SNAPSHOT` stream a failed file cannot be\n * queued again once a newer file arrived, since the older snapshot would be\n * imported over newer data — upload a corrected current file instead. `409`\n * also when the stored content is gone, and while the job has a run in flight.\n *\n * Not retried on a 5xx: if the first attempt went through, the file is no\n * longer `FAILED` and a repeat answers `409`.\n */\n async requeueStreamFile(\n streamId: string,\n fileId: string,\n auth: AuthContext = SERVICE,\n ): Promise<ImportFile> {\n return this.ctx.http.request<ImportFile>({\n method: \"POST\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files/${encodeURIComponent(fileId)}/requeue`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { ChangelogHistoryResponse } from \"../generated/audit-logs-changelog\";\nimport type { AuditLogPage, AuditLogQuery } from \"./audit-log-types\";\n\nexport type {\n AuditLogChangeType,\n AuditLogEntry,\n AuditLogPage,\n AuditLogPathChange,\n AuditLogQuery,\n AuditLogRelatedEntity,\n} from \"./audit-log-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * The body envelope → {@link AuditLogPage}. `pageNumber` / `pageSize` come from\n * the server's echo rather than from what was requested, so the page describes\n * what actually came back.\n */\nfunction toPage(wire: ChangelogHistoryResponse): AuditLogPage {\n const pageNumber = wire.page ?? 1;\n const totalPages = wire.totalPages ?? 0;\n return {\n items: wire.items ?? [],\n pageNumber,\n pageSize: wire.size ?? 0,\n hasNextPage: pageNumber < totalPages,\n totalElements: wire.totalElements ?? 0,\n totalPages,\n };\n}\n\n/**\n * Emporix Audit Log Service, upstream «Audit Logs (Changelog) Service»\n * (`/changelog/{tenant}/changelogs`): tenant-wide change history for platform\n * entities — who changed what, when, and from which value to which.\n *\n * **Service-account only.** Reads need the `changelog.changelog_read` scope\n * (`changelog.changelog_manage` also grants it) on the client credentials. There\n * is no customer or anonymous variant, which is why `@viu/emporix-sdk-react`\n * ships no hooks for it — call it from a server, never from a browser bundle.\n *\n * **Upstream marks this service as preview**: the contract may change without a\n * major version bump, and nearly every field of an entry is optional in the\n * spec.\n */\nexport class AuditLogService {\n static readonly channel = \"audit-log\" as const;\n\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/changelog/${this.ctx.tenant}`;\n }\n\n /**\n * List changes across the tenant, newest occurrence first.\n *\n * **The window defaults to the last 30 days.** When `q` carries no\n * conjunctive `occurredAt` lower bound, the service silently applies a\n * trailing 30-day window — an unfiltered call is *not* «everything ever». Pass\n * an explicit top-level or `AND`-ed `occurredAt` range to widen it; an\n * `occurredAt` that appears only inside an `OR` arm does not lift the default.\n *\n * **`entityId` needs `entity`.** Filtering by id alone is a `400`, not an\n * empty page. There is no path-based history endpoint either — scoping to one\n * document means naming both in `q`:\n *\n * @example\n * ```ts\n * // The history of one order.\n * const page = await client.auditLogs.list({\n * q: `entity:order entityId:${orderId}`,\n * });\n * for (const entry of page.items) {\n * console.log(entry.at, entry.actor, entry.paths);\n * }\n *\n * // Everything a given person changed in June, across all entities.\n * await client.auditLogs.list({\n * q: 'actor:\"Jane Doe\" occurredAt:(>\"2026-06-01T00:00:00.000Z\" AND <\"2026-07-01T00:00:00.000Z\")',\n * pageSize: 100,\n * });\n * ```\n */\n async list(opts: AuditLogQuery = {}, auth: AuthContext = SERVICE): Promise<AuditLogPage> {\n const wire = await this.ctx.http.request<ChangelogHistoryResponse>({\n method: \"GET\",\n path: `${this.base()}/changelogs`,\n // Absent options are left off the wire entirely; the service applies its\n // own defaults (page 1, size 20) and sends back what it used.\n query: { q: opts.q, page: opts.pageNumber, size: opts.pageSize },\n auth,\n });\n return toPage(wire);\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Unit,\n UnitInput,\n UnitUpdate,\n UnitCreated,\n ConversionFactorInput,\n ConversionFactorResult,\n ConvertUnitInput,\n ConvertUnitResult,\n} from \"./unit-handling-types\";\n\nexport type {\n Unit,\n UnitInput,\n UnitUpdate,\n UnitCreated,\n ConversionFactorInput,\n ConversionFactorResult,\n ConvertUnitInput,\n ConvertUnitResult,\n} from \"./unit-handling-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Unit Handling Service (`/unit-handling/{tenant}/…`): units CRUD, unit\n * types, and conversion commands. Server-side; defaults to the service token.\n */\nexport class UnitHandlingService {\n static readonly channel = \"unit-handling\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/unit-handling/${this.ctx.tenant}`;\n }\n\n /** Find units (filter/sort/page). */\n async listUnits(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<Unit[]> {\n return this.ctx.http.request<Unit[]>({\n method: \"GET\",\n path: `${this.base()}/units`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a unit by code. */\n async getUnit(unitCode: string, auth: AuthContext = SERVICE): Promise<Unit> {\n return this.ctx.http.request<Unit>({\n method: \"GET\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n });\n }\n\n /** Add a new unit. */\n async createUnit(input: UnitInput, auth: AuthContext = SERVICE): Promise<UnitCreated> {\n return this.ctx.http.request<UnitCreated>({ method: \"POST\", path: `${this.base()}/units`, auth, body: input });\n }\n\n /** Update a unit by code. */\n async updateUnit(unitCode: string, input: UnitUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a unit by code. */\n async deleteUnit(unitCode: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n });\n }\n\n /** Delete multiple units by code (bulk). The codes are sent as the request body. */\n async deleteUnits(codes: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/units`,\n auth,\n body: codes,\n });\n }\n\n /** Fetch a conversion factor (`PUT /units/conversion-factor-commands`). */\n async getConversionFactor(input: ConversionFactorInput, auth: AuthContext = SERVICE): Promise<ConversionFactorResult> {\n return this.ctx.http.request<ConversionFactorResult>({\n method: \"PUT\",\n path: `${this.base()}/units/conversion-factor-commands`,\n auth,\n body: input,\n });\n }\n\n /** Convert a value between units (`PUT /units/convert-unit-commands`). */\n async convertUnit(input: ConvertUnitInput, auth: AuthContext = SERVICE): Promise<ConvertUnitResult> {\n return this.ctx.http.request<ConvertUnitResult>({\n method: \"PUT\",\n path: `${this.base()}/units/convert-unit-commands`,\n auth,\n body: input,\n });\n }\n\n /** List all unit types. */\n async listUnitTypes(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({ method: \"GET\", path: `${this.base()}/types`, auth });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Catalog, CatalogList, CatalogInput, CatalogUpdate, CatalogPatch, CatalogCreated } from \"./catalog-types\";\n\nexport type { Catalog, CatalogList, CatalogInput, CatalogUpdate, CatalogPatch, CatalogCreated } from \"./catalog-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Catalog Management (`/catalog/{tenant}/catalogs`): CRUD over catalogs.\n * Server-side; defaults to the service token. `updateCatalog` is an upsert (PUT).\n */\nexport class CatalogService {\n static readonly channel = \"catalog\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/catalog/${this.ctx.tenant}/catalogs`;\n }\n\n /** List catalogs (filtered/sorted). */\n async listCatalogs(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<CatalogList> {\n return this.ctx.http.request<CatalogList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a catalog by id. */\n async getCatalog(catalogId: string, auth: AuthContext = SERVICE): Promise<Catalog> {\n return this.ctx.http.request<Catalog>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n });\n }\n\n /** Retrieve all catalogs that contain a category. */\n async getCatalogsForCategory(categoryId: string, auth: AuthContext = SERVICE): Promise<CatalogList> {\n return this.ctx.http.request<CatalogList>({\n method: \"GET\",\n path: `${this.base()}/categories/${encodeURIComponent(categoryId)}`,\n auth,\n });\n }\n\n /** Create a catalog. */\n async createCatalog(input: CatalogInput, auth: AuthContext = SERVICE): Promise<CatalogCreated> {\n return this.ctx.http.request<CatalogCreated>({ method: \"POST\", path: this.base(), auth, body: input });\n }\n\n /** Upsert a catalog by id (`PUT`). */\n async updateCatalog(catalogId: string, input: CatalogUpdate, auth: AuthContext = SERVICE): Promise<CatalogCreated> {\n return this.ctx.http.request<CatalogCreated>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a catalog by id (`PATCH`). */\n async patchCatalog(catalogId: string, patch: CatalogPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Remove a catalog by id. */\n async deleteCatalog(catalogId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery } from \"../core/query\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n Vendor,\n VendorList,\n VendorInput,\n VendorUpdate,\n VendorCreated,\n VendorSearchQuery,\n VendorLocation,\n VendorLocationList,\n VendorLocationInput,\n VendorLocationUpdate,\n} from \"./vendor-types\";\n\nexport type {\n Vendor,\n VendorList,\n VendorInput,\n VendorUpdate,\n VendorCreated,\n VendorSearchQuery,\n VendorLocation,\n VendorLocationList,\n VendorLocationInput,\n VendorLocationUpdate,\n} from \"./vendor-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Vendor Service (`/vendor/{tenant}/…`): vendors and their locations.\n * Server-side; defaults to the service token. PUT methods are upserts. Vendor\n * locations are the vendor's own pickup/warehouse locations (distinct from the\n * customer-management `client.locations`).\n */\nexport class VendorService {\n static readonly channel = \"vendor\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/vendor/${this.ctx.tenant}`;\n }\n\n // --- Vendors ---\n\n /** List all vendors. */\n async listVendors(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<VendorList> {\n return this.ctx.http.request<VendorList>({\n method: \"GET\",\n path: `${this.base()}/vendors`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a vendor by id. */\n async getVendor(vendorId: string, auth: AuthContext = SERVICE): Promise<Vendor> {\n return this.ctx.http.request<Vendor>({\n method: \"GET\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n });\n }\n\n /**\n * Search vendors (`POST /vendors/search`). A built filter in `q` is resolved to\n * a string; paging, sort and fields go in the query string.\n */\n async searchVendors(query: VendorSearchQuery, auth: AuthContext = SERVICE): Promise<VendorList> {\n const input =\n query.q !== undefined\n ? { ...query, q: resolveQuery(query.q, { compoundLogicalQuery: false }) }\n : query;\n return this.ctx.http.request<VendorList>({\n method: \"POST\",\n path: `${this.base()}/vendors/search`,\n auth,\n ...splitQuery(input, SEARCH_PAGING),\n });\n }\n\n /** Create a vendor. */\n async createVendor(input: VendorInput, auth: AuthContext = SERVICE): Promise<VendorCreated> {\n return this.ctx.http.request<VendorCreated>({ method: \"POST\", path: `${this.base()}/vendors`, auth, body: input });\n }\n\n /** Upsert a vendor by id (`PUT`). */\n async updateVendor(vendorId: string, input: VendorUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a vendor by id. */\n async deleteVendor(vendorId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n });\n }\n\n // --- Vendor locations ---\n\n /** List all vendor locations. */\n async listVendorLocations(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<VendorLocationList> {\n return this.ctx.http.request<VendorLocationList>({\n method: \"GET\",\n path: `${this.base()}/locations`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a vendor location by id. */\n async getVendorLocation(locationId: string, auth: AuthContext = SERVICE): Promise<VendorLocation> {\n return this.ctx.http.request<VendorLocation>({\n method: \"GET\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n });\n }\n\n /** Create a vendor location. */\n async createVendorLocation(input: VendorLocationInput, auth: AuthContext = SERVICE): Promise<VendorCreated> {\n return this.ctx.http.request<VendorCreated>({ method: \"POST\", path: `${this.base()}/locations`, auth, body: input });\n }\n\n /** Upsert a vendor location by id (`PUT`). */\n async updateVendorLocation(locationId: string, input: VendorLocationUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a vendor location by id. */\n async deleteVendorLocation(locationId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery } from \"../core/query\";\nimport { splitQuery } from \"../core/search\";\nimport type {\n AdminCustomer,\n AdminCustomerList,\n AdminCustomerInput,\n AdminCustomerUpdate,\n AdminCustomerPatch,\n AdminCustomerCreated,\n AdminCustomerSearchQuery,\n AdminCustomerAddress,\n AdminCustomerAddressList,\n AdminCustomerAddressInput,\n AdminCustomerAddressUpdate,\n AdminPasswordMigrationRetention,\n AdminPasswordMigrationRetentionInput,\n AdminCustomerImport,\n AdminCustomerImportResult,\n} from \"./customer-admin-types\";\n\nexport type {\n AdminCustomer,\n AdminCustomerList,\n AdminCustomerInput,\n AdminCustomerUpdate,\n AdminCustomerPatch,\n AdminCustomerCreated,\n AdminCustomerSearchQuery,\n AdminCustomerAddress,\n AdminCustomerAddressList,\n AdminCustomerAddressInput,\n AdminCustomerAddressUpdate,\n AdminPasswordMigrationRetention,\n AdminPasswordMigrationRetentionInput,\n AdminCustomerImport,\n AdminCustomerImportAccount,\n AdminCustomerLegacyAuth,\n AdminCustomerImportResult,\n} from \"./customer-admin-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Customer Service — tenant/seller-managed customer profiles and\n * addresses (`/customer/{tenant}/customers`). Server-side; defaults to the\n * service token. Distinct from the storefront `client.customers`.\n */\nexport class CustomerAdminService {\n static readonly channel = \"customer-admin\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/customer/${this.ctx.tenant}/customers`;\n }\n\n private customerPath(customerNumber: string): string {\n return `${this.base()}/${encodeURIComponent(customerNumber)}`;\n }\n\n private configPath(): string {\n return `/customer/${this.ctx.tenant}/config/password-migration-retention`;\n }\n\n private addressPath(customerNumber: string, addressId: string): string {\n return `${this.customerPath(customerNumber)}/addresses/${encodeURIComponent(addressId)}`;\n }\n\n // --- Customers ---\n\n /** List customers. */\n async listCustomers(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<AdminCustomerList> {\n return this.ctx.http.request<AdminCustomerList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /**\n * Search customers (`POST /customers/search`). A built filter in `q` is resolved\n * to a string; `pageNumber`, `pageSize`, `sort` and `expand` go in the query string.\n */\n async searchCustomers(query: AdminCustomerSearchQuery, auth: AuthContext = SERVICE): Promise<AdminCustomerList> {\n const input =\n query.q !== undefined\n ? { ...query, q: resolveQuery(query.q, { compoundLogicalQuery: false }) }\n : query;\n return this.ctx.http.request<AdminCustomerList>({\n method: \"POST\",\n path: `${this.base()}/search`,\n auth,\n ...splitQuery(input, [\"pageNumber\", \"pageSize\", \"sort\", \"expand\"]),\n });\n }\n\n /** Retrieve a customer profile by number. */\n async getCustomer(customerNumber: string, auth: AuthContext = SERVICE): Promise<AdminCustomer> {\n return this.ctx.http.request<AdminCustomer>({ method: \"GET\", path: this.customerPath(customerNumber), auth });\n }\n\n /** Create a customer. */\n async createCustomer(input: AdminCustomerInput, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"POST\", path: this.base(), auth, body: input });\n }\n\n /** Upsert a customer profile by number (`PUT`). */\n async upsertCustomer(customerNumber: string, input: AdminCustomerUpdate, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"PUT\", path: this.customerPath(customerNumber), auth, body: input });\n }\n\n /** Partially update a customer profile (`PATCH`). */\n async patchCustomer(customerNumber: string, patch: AdminCustomerPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.customerPath(customerNumber), auth, body: patch });\n }\n\n /** Delete a customer profile. */\n async deleteCustomer(customerNumber: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.customerPath(customerNumber), auth });\n }\n\n // --- Addresses ---\n\n /** List a customer's addresses. */\n async listAddresses(customerNumber: string, auth: AuthContext = SERVICE): Promise<AdminCustomerAddressList> {\n return this.ctx.http.request<AdminCustomerAddressList>({\n method: \"GET\",\n path: `${this.customerPath(customerNumber)}/addresses`,\n auth,\n });\n }\n\n /** Retrieve one address. */\n async getAddress(customerNumber: string, addressId: string, auth: AuthContext = SERVICE): Promise<AdminCustomerAddress> {\n return this.ctx.http.request<AdminCustomerAddress>({ method: \"GET\", path: this.addressPath(customerNumber, addressId), auth });\n }\n\n /** Add an address. */\n async addAddress(customerNumber: string, input: AdminCustomerAddressInput, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({\n method: \"POST\",\n path: `${this.customerPath(customerNumber)}/addresses`,\n auth,\n body: input,\n });\n }\n\n /** Upsert an address by id (`PUT`). */\n async upsertAddress(customerNumber: string, addressId: string, input: AdminCustomerAddressUpdate, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"PUT\", path: this.addressPath(customerNumber, addressId), auth, body: input });\n }\n\n /** Partially update an address by id (`PATCH`). */\n async patchAddress(customerNumber: string, addressId: string, patch: AdminCustomerAddressUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.addressPath(customerNumber, addressId), auth, body: patch });\n }\n\n /** Delete an address by id. */\n async deleteAddress(customerNumber: string, addressId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.addressPath(customerNumber, addressId), auth });\n }\n\n /** Add tags to an address (`?tags=` query). */\n async addAddressTags(customerNumber: string, addressId: string, tags: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.addressPath(customerNumber, addressId)}/tags`,\n auth,\n query: { tags: tags.join(\",\") },\n });\n }\n\n /** Remove tags from an address (`?tags=` query). */\n async removeAddressTags(customerNumber: string, addressId: string, tags: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.addressPath(customerNumber, addressId)}/tags`,\n auth,\n query: { tags: tags.join(\",\") },\n });\n }\n\n // --- Password-migration retention ---\n\n /**\n * Retrieves the tenant's password-migration retention config. Requires the\n * `customer.import_read` scope. An unconfigured tenant answers with an empty\n * object rather than a 404.\n */\n async getPasswordMigrationRetention(auth: AuthContext = SERVICE): Promise<AdminPasswordMigrationRetention> {\n return this.ctx.http.request<AdminPasswordMigrationRetention>({\n method: \"GET\",\n path: this.configPath(),\n auth,\n });\n }\n\n /**\n * Creates or updates the retention config (`POST`). Requires the\n * `customer.import_manage` scope. **Call this before importing customers with\n * `legacyAuth`** — that import is rejected without an active config. Re-POST with\n * an earlier `retentionEndDate` to shorten a running window.\n */\n async configurePasswordMigrationRetention(\n input: AdminPasswordMigrationRetentionInput,\n auth: AuthContext = SERVICE,\n ): Promise<AdminPasswordMigrationRetention> {\n return this.ctx.http.request<AdminPasswordMigrationRetention>({\n method: \"POST\",\n path: this.configPath(),\n auth,\n body: input,\n });\n }\n\n /**\n * Removes the retention config. Requires the `customer.import_manage` scope.\n * Intended for after the migration window: when the window ends, unmigrated\n * accounts need a password reset and their legacy credentials are cleared.\n */\n async deletePasswordMigrationRetention(auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.configPath(), auth });\n }\n\n // --- Bulk import ---\n\n /**\n * Bulk-imports customers (`POST /customers/import`). Requires the\n * `customer.import_manage` scope.\n *\n * Responds **207 Multi-Status**: per-item failures do **not** throw — inspect each\n * entry's `code`. Each item must carry exactly one of `account.passwordHash` or\n * `account.legacyAuth`, and importing `legacyAuth` requires an active retention\n * config (see `configurePasswordMigrationRetention`).\n */\n async importCustomers(\n input: AdminCustomerImport[],\n auth: AuthContext = SERVICE,\n ): Promise<AdminCustomerImportResult[]> {\n return this.ctx.http.request<AdminCustomerImportResult[]>({\n method: \"POST\",\n path: `${this.base()}/import`,\n auth,\n body: input,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Approval,\n ApprovalList,\n ApprovalInput,\n ApprovalPatch,\n ApprovalCreated,\n ApprovalPermittedInput,\n ApprovalPermittedResult,\n ApprovalUsersQuery,\n ApprovalUsersResult,\n} from \"./approval-types\";\n\nexport type {\n Approval,\n ApprovalList,\n ApprovalInput,\n ApprovalPatch,\n ApprovalCreated,\n ApprovalPermittedInput,\n ApprovalPermittedResult,\n ApprovalUsersQuery,\n ApprovalUsersResult,\n} from \"./approval-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Approval Service (`/approval/{tenant}/…`): B2B cart/quote approval\n * workflows — list/view approvals, create an approval request, approve or reject\n * via JSON-Patch, plus permitted-checks and approver search.\n *\n * Every endpoint is **CustomerAccessToken-only**. The trailing `auth` keeps the\n * SDK's uniform method shape, but a customer token is required in practice — pass\n * `auth.customer(token)` (the React hooks supply the browser context). The\n * service token will be rejected by Emporix.\n */\nexport class ApprovalService {\n static readonly channel = \"approval\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/approval/${this.ctx.tenant}`;\n }\n\n /** List approvals (paged via `pageNumber`/`pageSize`/`sort`/`q`). Returns an array. */\n async listApprovals(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalList> {\n return this.ctx.http.request<ApprovalList>({\n method: \"GET\",\n path: `${this.base()}/approvals`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a single approval by id. */\n async getApproval(approvalId: string, auth: AuthContext = SERVICE): Promise<Approval> {\n return this.ctx.http.request<Approval>({\n method: \"GET\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n });\n }\n\n /** Create an approval request (cart or quote). Returns the created `{ id }`. */\n async createApproval(input: ApprovalInput, auth: AuthContext = SERVICE): Promise<ApprovalCreated> {\n return this.ctx.http.request<ApprovalCreated>({\n method: \"POST\",\n path: `${this.base()}/approvals`,\n auth,\n body: input,\n });\n }\n\n /** Approve/reject/amend an approval via a JSON-Patch op-array (`PATCH`). */\n async updateApproval(\n approvalId: string,\n ops: ApprovalPatch,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete an approval by id. */\n async deleteApproval(approvalId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n });\n }\n\n /** Check whether an operation on a resource is permitted / needs approval. */\n async checkPermitted(\n input: ApprovalPermittedInput,\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalPermittedResult> {\n return this.ctx.http.request<ApprovalPermittedResult>({\n method: \"POST\",\n path: `${this.base()}/approval/permitted`,\n auth,\n body: input,\n });\n }\n\n /** Search for users eligible to approve a resource. Returns an array. */\n async searchApprovers(\n input: ApprovalUsersQuery,\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalUsersResult> {\n return this.ctx.http.request<ApprovalUsersResult>({\n method: \"POST\",\n path: `${this.base()}/search/users`,\n auth,\n body: input,\n });\n }\n}\n\n/** The status transitions a client can request. `PENDING` and `EXPIRED` are set by Emporix. */\nexport type ApprovalDecision = \"APPROVED\" | \"DECLINED\" | \"CLOSED\";\n\n/**\n * Builds the JSON-Patch for an approval decision, with both measured quirks baked in.\n *\n * Two things about this patch are counter-intuitive, both measured against tenant\n * `viu` on 2026-08-18:\n *\n * 1. **`replace` is lowercase.** The upstream spec shipped the enum uppercase and the\n * live API answers `REPLACE` with 400. That is repaired at the spec level (see\n * `scripts/spec-patches.ts`), so the type now guides you correctly.\n * 2. **The approver comment needs `add`, not `replace`.** `approverComment` does not\n * exist on a fresh approval, and `replace` on an absent field answers\n * `APPROVAL-400010` «Missing field \"approverComment\"». Because PATCH is atomic,\n * that failure takes the status change down with it — the decision silently does\n * not happen. `add` creates the field and overwrites it on a second decision, so\n * it is correct in both cases. The upstream spec's own «Add comment by the\n * approver» example agrees; only its enum did not.\n *\n * Status and comment travel in one request on purpose: since PATCH is atomic, a\n * rejection can never land without its reason.\n *\n * @example\n * await client.approvals.updateApproval(id, approvalStatusPatch(\"DECLINED\", \"Over budget\"), auth);\n */\nexport function approvalStatusPatch(\n status: ApprovalDecision,\n approverComment?: string,\n): ApprovalPatch {\n const comment = approverComment?.trim() ?? \"\";\n return [\n { op: \"replace\", path: \"/status\", value: status },\n // `as const` on both fields: the generated type narrows `path` to an enum too, so\n // a widened `string` from the spread would not be assignable.\n ...(comment !== \"\"\n ? [{ op: \"add\" as const, path: \"/approverComment\" as const, value: comment }]\n : []),\n ];\n}\n","import type { EmporixConfig, ResolvedConfig } from \"./core/config\";\nimport type { TokenProvider, CustomerTokenRefresher } from \"./core/auth\";\nimport type { LogLevel, ServiceName } from \"./core/logger\";\nimport { createCore, type EmporixCore } from \"./core/create-core\";\nimport { CustomerService } from \"./services/customer\";\nimport { ProductService } from \"./services/product\";\nimport { CategoryService } from \"./services/category\";\nimport { CartService } from \"./services/cart\";\nimport { CheckoutService } from \"./services/checkout\";\nimport { PaymentGatewayService } from \"./services/payment\";\nimport { PriceService } from \"./services/price\";\nimport { MediaService } from \"./services/media\";\nimport { SegmentService } from \"./services/segment\";\nimport { SiteService } from \"./services/site\";\nimport { SessionContextService } from \"./services/session-context\";\nimport { CompaniesService } from \"./services/companies\";\nimport { ContactsService } from \"./services/contacts\";\nimport { LocationsService } from \"./services/locations\";\nimport { CustomerGroupsService } from \"./services/customer-groups\";\nimport { IamService } from \"./services/iam\";\nimport { OrdersService, SalesOrdersService } from \"./services/orders\";\nimport { AvailabilityService } from \"./services/availability\";\nimport { TenantConfigService } from \"./services/tenant-config\";\nimport { ClientConfigService } from \"./services/client-config\";\nimport { ShoppingListService } from \"./services/shopping-list\";\nimport { RagIndexerService } from \"./services/ai-rag-indexer\";\nimport { SequentialIdService } from \"./services/sequential-id\";\nimport { FeeService } from \"./services/fee\";\nimport { CloudFunctionsService } from \"./services/cloud-functions\";\nimport { WebhookService } from \"./services/webhook\";\nimport { SchemaService } from \"./services/schema\";\nimport { AiService } from \"./services/ai\";\nimport { TaxService } from \"./services/tax\";\nimport { CouponService } from \"./services/coupon\";\nimport { RewardPointsService } from \"./services/reward-points\";\nimport { BrandService } from \"./services/brand\";\nimport { LabelService } from \"./services/label\";\nimport { CountryService } from \"./services/country\";\nimport { CurrencyService } from \"./services/currency\";\nimport { ShippingService } from \"./services/shipping\";\nimport { InvoiceService } from \"./services/invoice\";\nimport { QuoteService } from \"./services/quote\";\nimport { ReturnsService } from \"./services/returns\";\nimport { IndexingService } from \"./services/indexing\";\nimport { SearchService } from \"./services/search\";\nimport { ImportService } from \"./services/imports\";\nimport { AuditLogService } from \"./services/audit-log\";\nimport { UnitHandlingService } from \"./services/unit-handling\";\nimport { CatalogService } from \"./services/catalog\";\nimport { VendorService } from \"./services/vendor\";\nimport { CustomerAdminService } from \"./services/customer-admin\";\nimport { ApprovalService } from \"./services/approval\";\n\n/** The Emporix SDK entry point. One instance safely serves many concurrent shoppers. */\nexport class EmporixClient {\n readonly customers: CustomerService;\n readonly products: ProductService;\n readonly categories: CategoryService;\n readonly carts: CartService;\n readonly checkout: CheckoutService;\n readonly payments: PaymentGatewayService;\n readonly prices: PriceService;\n readonly media: MediaService;\n readonly segments: SegmentService;\n readonly sites: SiteService;\n readonly sessionContext: SessionContextService;\n readonly companies: CompaniesService;\n readonly contacts: ContactsService;\n readonly locations: LocationsService;\n readonly customerGroups: CustomerGroupsService;\n readonly iam: IamService;\n readonly orders: OrdersService;\n readonly salesOrders: SalesOrdersService;\n readonly availability: AvailabilityService;\n readonly tenantConfig: TenantConfigService;\n readonly clientConfig: ClientConfigService;\n readonly shoppingLists: ShoppingListService;\n readonly ragIndexer: RagIndexerService;\n readonly sequentialIds: SequentialIdService;\n readonly fees: FeeService;\n readonly cloudFunctions: CloudFunctionsService;\n readonly webhooks: WebhookService;\n readonly schemas: SchemaService;\n readonly ai: AiService;\n readonly taxes: TaxService;\n readonly coupons: CouponService;\n readonly rewardPoints: RewardPointsService;\n readonly brands: BrandService;\n readonly labels: LabelService;\n readonly countries: CountryService;\n readonly currencies: CurrencyService;\n readonly shipping: ShippingService;\n readonly invoices: InvoiceService;\n readonly quotes: QuoteService;\n readonly returns: ReturnsService;\n readonly indexing: IndexingService;\n readonly search: SearchService;\n readonly imports: ImportService;\n readonly auditLogs: AuditLogService;\n readonly units: UnitHandlingService;\n readonly catalogs: CatalogService;\n readonly vendors: VendorService;\n readonly customerAdmin: CustomerAdminService;\n readonly approvals: ApprovalService;\n /** The validated tenant this client is bound to. */\n readonly tenant: string;\n /**\n * The token provider in use by this client. Exposed so React/Next hosts can\n * call `attachAnonymousStore` to wire session persistence. Treat as\n * read-only — replacing it after construction is not supported.\n */\n readonly tokenProvider: TokenProvider;\n /**\n * The validated config used to construct this client. Exposed so React /\n * Next hosts can read static settings such as `credentials.storefront.context`\n * (siteCode, currency, targetLocation) without re-plumbing them through the\n * Provider tree. Treat as read-only.\n */\n readonly config: ResolvedConfig;\n private readonly core: EmporixCore;\n\n constructor(config: EmporixConfig) {\n const core = createCore(config);\n this.core = core;\n this.tenant = core.tenant;\n this.config = core.config;\n this.tokenProvider = core.tokenProvider;\n\n const mk = core.mk;\n this.customers = new CustomerService(mk(CustomerService.channel));\n this.products = new ProductService(mk(ProductService.channel));\n this.categories = new CategoryService(mk(CategoryService.channel));\n this.carts = new CartService(mk(CartService.channel));\n this.checkout = new CheckoutService(mk(CheckoutService.channel));\n this.payments = new PaymentGatewayService(mk(PaymentGatewayService.channel));\n this.prices = new PriceService(mk(PriceService.channel));\n this.media = new MediaService(mk(MediaService.channel));\n this.segments = new SegmentService(mk(SegmentService.channel), {\n products: this.products,\n categories: this.categories,\n });\n this.sites = new SiteService(mk(SiteService.channel));\n this.sessionContext = new SessionContextService(mk(SessionContextService.channel));\n this.companies = new CompaniesService(mk(CompaniesService.channel));\n this.contacts = new ContactsService(mk(ContactsService.channel));\n this.locations = new LocationsService(mk(LocationsService.channel));\n this.customerGroups = new CustomerGroupsService(mk(CustomerGroupsService.channel));\n this.iam = new IamService(mk(IamService.channel));\n this.orders = new OrdersService(mk(OrdersService.channel));\n this.salesOrders = new SalesOrdersService(mk(SalesOrdersService.channel));\n this.availability = new AvailabilityService(mk(AvailabilityService.channel));\n this.tenantConfig = new TenantConfigService(mk(TenantConfigService.channel));\n this.clientConfig = new ClientConfigService(mk(ClientConfigService.channel));\n this.shoppingLists = new ShoppingListService(mk(ShoppingListService.channel));\n this.ragIndexer = new RagIndexerService(mk(RagIndexerService.channel));\n this.sequentialIds = new SequentialIdService(mk(SequentialIdService.channel));\n this.fees = new FeeService(mk(FeeService.channel));\n this.cloudFunctions = new CloudFunctionsService(mk(CloudFunctionsService.channel));\n this.webhooks = new WebhookService(mk(WebhookService.channel));\n this.schemas = new SchemaService(mk(SchemaService.channel));\n this.ai = new AiService(mk(AiService.channel));\n this.taxes = new TaxService(mk(TaxService.channel));\n this.coupons = new CouponService(mk(CouponService.channel));\n this.rewardPoints = new RewardPointsService(mk(RewardPointsService.channel));\n this.brands = new BrandService(mk(BrandService.channel));\n this.labels = new LabelService(mk(LabelService.channel));\n this.countries = new CountryService(mk(CountryService.channel));\n this.currencies = new CurrencyService(mk(CurrencyService.channel));\n this.shipping = new ShippingService(mk(ShippingService.channel));\n this.invoices = new InvoiceService(mk(InvoiceService.channel));\n this.quotes = new QuoteService(mk(QuoteService.channel));\n this.returns = new ReturnsService(mk(ReturnsService.channel));\n this.indexing = new IndexingService(mk(IndexingService.channel));\n this.search = new SearchService(mk(SearchService.channel));\n this.imports = new ImportService(mk(ImportService.channel));\n this.auditLogs = new AuditLogService(mk(AuditLogService.channel));\n this.units = new UnitHandlingService(mk(UnitHandlingService.channel));\n this.catalogs = new CatalogService(mk(CatalogService.channel));\n this.vendors = new VendorService(mk(VendorService.channel));\n this.customerAdmin = new CustomerAdminService(mk(CustomerAdminService.channel));\n this.approvals = new ApprovalService(mk(ApprovalService.channel));\n }\n\n /**\n * Re-binds the storefront price context (currency / siteCode / targetLocation)\n * for anonymous pricing and invalidates the current anonymous session, so the\n * next request re-mints a token bound to the new context. Use this to switch\n * currency at runtime. Carts are currency-bound — clear the cart after a\n * currency change (the React `setCurrency` does this for you).\n *\n * Also sets the storefront `language` (an `Accept-Language` header on every\n * read); a language-only change does NOT re-mint the token.\n */\n setStorefrontContext(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n language?: string;\n }): void {\n this.core.setStorefrontContext(ctx);\n }\n\n /** Sets the runtime log level globally or for one service. */\n setLogLevel(level: LogLevel, opts: { service?: ServiceName; force?: boolean } = {}): void {\n this.core.setLogLevel(level, opts);\n }\n\n /** Returns the effective log level for a service. */\n getLogLevel(service: ServiceName): LogLevel {\n return this.core.getLogLevel(service);\n }\n\n /**\n * Registers (or clears with `null`) a customer-token refresher. When set, a\n * `customer`-kind 401 triggers one refresh-and-retry. Off by default — the\n * customer token stays caller-owned. The React `EmporixProvider` wires this\n * automatically via `autoRefreshCustomerToken`.\n */\n setCustomerTokenRefresher(refresher: CustomerTokenRefresher | null): void {\n this.core.setCustomerTokenRefresher(refresher);\n }\n}\n","import type { EmporixConfig } from \"./core/config\";\nimport type { ServiceName } from \"./core/logger\";\nimport { EmporixError } from \"./core/errors\";\nimport { createCore, type EmporixCore } from \"./core/create-core\";\n\n/**\n * A service class the factory can instantiate: carries its channel + optional\n * deps. The constructor signature is intentionally loose (`...args: any[]`) so\n * both dep-free services (`new Svc(ctx)`) and dependent ones\n * (`new Svc(ctx, deps)` — e.g. `SegmentService`) satisfy it.\n */\nexport interface ServiceClass<I> {\n readonly channel: ServiceName;\n readonly deps?: readonly string[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): I;\n}\n\n/**\n * Tree-shakeable client factory. Builds ONLY the service classes you pass —\n * imports no services itself, so a bundler drops every service you don't use.\n * `EmporixClient` remains the batteries-included default; reach for this when\n * bundle size matters. Dependent services (e.g. `segments`) require their deps\n * to be present in the map under their public names (`products`, `categories`).\n */\nexport function createEmporixClient<S extends Record<string, ServiceClass<unknown>>>(\n config: EmporixConfig,\n services: S,\n): Omit<EmporixCore, \"mk\"> & { [K in keyof S]: InstanceType<S[K]> } {\n const { mk, ...core } = createCore(config);\n const built: Record<string, unknown> = {};\n const entries = Object.entries(services) as [string, ServiceClass<unknown>][];\n\n // Pass 1: dependency-free services.\n for (const [key, Svc] of entries) {\n if (!Svc.deps?.length) built[key] = new Svc(mk(Svc.channel));\n }\n // Pass 2: dependents (only `segments` today; deps are all dep-free, so two\n // passes suffice — a deeper graph would need a topological sort).\n for (const [key, Svc] of entries) {\n if (!Svc.deps?.length) continue;\n const deps: Record<string, unknown> = {};\n for (const dep of Svc.deps) {\n if (!(dep in built)) {\n throw new EmporixError(\n `createEmporixClient: \"${key}\" requires \"${dep}\" in the services map`,\n );\n }\n deps[dep] = built[dep];\n }\n built[key] = new Svc(mk(Svc.channel), deps);\n }\n\n return { ...core, ...built } as Omit<EmporixCore, \"mk\"> & {\n [K in keyof S]: InstanceType<S[K]>;\n };\n}\n","/**\n * Extracts the product id from a product `itemYrn`\n * (`urn:yaas:hybris:product:product:<tenant>;<productId>`). Cart and order line\n * items carry only the YRN, not a bare product id. Returns \"\" when the YRN is\n * missing or has no `;` segment.\n *\n * Approval resource items are an exception: their `itemYrn` is frequently the bare\n * product id with no YRN wrapper, so this returns \"\" and you want the sibling\n * `itemId` as a fallback. Measured on tenant `viu`, 2026-08-18.\n */\nexport function productIdFromYrn(yrn: string | undefined): string {\n if (!yrn) return \"\";\n const semi = yrn.lastIndexOf(\";\");\n return semi >= 0 ? yrn.slice(semi + 1) : \"\";\n}\n\n/**\n * Builds a product `itemYrn` — the form `carts.addItem` requires.\n *\n * The inverse of {@link productIdFromYrn}. Emporix rejects anything else with\n * «Given yrn does not match yaas urn scheme».\n */\nexport function productYrn(tenant: string, productId: string): string {\n return `urn:yaas:hybris:product:product:${tenant};${productId}`;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/errors.ts","../src/core/config.ts","../src/core/auth.ts","../src/core/session-keys.ts","../src/core/session-storage.ts","../src/core/browser-storage.ts","../src/core/proxy.ts","../src/core/logger.ts","../src/core/query-keys.ts","../src/core/customer-session-store.ts","../src/core/sse.ts","../src/core/http.ts","../package.json","../src/version.ts","../src/core/create-core.ts","../src/core/require-customer.ts","../src/services/customer.ts","../src/core/context.ts","../src/core/paged.ts","../src/core/query.ts","../src/services/product.ts","../src/services/category.ts","../src/services/cart.ts","../src/services/checkout.ts","../src/services/payment.ts","../src/core/search.ts","../src/services/price.ts","../src/services/media.ts","../src/services/segment.ts","../src/services/site.ts","../src/services/session-context.ts","../src/services/companies.ts","../src/services/contacts.ts","../src/services/locations.ts","../src/services/iam.ts","../src/services/customer-groups.ts","../src/services/orders.ts","../src/services/availability.ts","../src/services/tenant-config.ts","../src/services/client-config.ts","../src/services/shopping-list.ts","../src/services/ai-rag-indexer.ts","../src/services/sequential-id.ts","../src/services/fee.ts","../src/services/cloud-functions.ts","../src/services/webhook.ts","../src/services/schema.ts","../src/services/ai-resources.ts","../src/services/ai.ts","../src/services/tax.ts","../src/services/coupon.ts","../src/services/reward-points.ts","../src/services/brand.ts","../src/services/label.ts","../src/services/country.ts","../src/services/currency.ts","../src/services/shipping.ts","../src/services/invoice.ts","../src/services/quote.ts","../src/services/returns.ts","../src/services/indexing.ts","../src/services/search.ts","../src/services/imports.ts","../src/services/audit-log.ts","../src/services/unit-handling.ts","../src/services/catalog.ts","../src/services/vendor.ts","../src/services/customer-admin.ts","../src/services/approval.ts","../src/client.ts","../src/create-emporix-client.ts","../src/core/yrn.ts"],"names":["auth","ANON","SERVICE","text","version","setIfDefined","toPage"],"mappings":"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","file":"index.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/** 409 — conflict: a stale `metadata.version`, or an id that already exists. */\nexport class EmporixConflictError 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 === 409) return new EmporixConflictError(message, status, body);\n if (status >= 500) return new EmporixServerError(message, status, body);\n return new EmporixError(message, status, body);\n}\n","import type { Logger, LoggerConfig } from \"./logger\";\nimport type { TokenProvider } from \"./auth\";\n\n/** Default Emporix API host. */\nexport const DEFAULT_HOST = \"https://api.emporix.io\";\n\n/**\n * Tenant guard. Emporix docs only state \"always lowercase\"; the 3–16 char\n * `^[a-z][a-z0-9]+$` rule is an SDK-side guard, not a documented constraint.\n */\nconst TENANT_RE = /^[a-z][a-z0-9]{2,15}$/;\n\n/** A client-credentials credential set (service / custom). */\nexport interface ServiceCredentials {\n clientId: string;\n secret: string;\n scope?: string;\n}\n\n/** Storefront credential — anonymous token needs the client id only, no secret. */\nexport interface StorefrontCredentials {\n clientId: string;\n /**\n * Session context bound at anonymous-login time. Required for\n * `prices.matchByContext` to resolve currency/site/country server-side.\n * `targetLocation` is an ISO country code.\n */\n context?: { currency?: string; siteCode?: string; targetLocation?: string; language?: string };\n}\n\n/** What {@link EmporixProxyConfig.onUnauthorized} learns about the request a proxy answered with 401. */\nexport interface EmporixUnauthorizedInfo {\n method: string;\n /** The API path, without host and query, e.g. `/customer/acme/me`. */\n path: string;\n}\n\n/**\n * Proxy mode, for a Backend for Frontend (BFF) that holds the Emporix tokens.\n *\n * With it set, the SDK requests no token and sends no `Authorization` header:\n * every request goes to `host` — usually a same-origin path such as `/emporix` —\n * with the session cookie and `headers`, and the proxy attaches the bearer token\n * itself. A `customer` or `anonymous` {@link AuthContext} is still accepted but\n * no longer decides anything on the wire; `auth.service()` throws. A 401 is never\n * retried or refreshed: `onUnauthorized` runs, then `EmporixAuthError` is thrown.\n *\n * See `docs/bff.md` for what the proxy has to do.\n */\nexport interface EmporixProxyConfig {\n /** Sent with every request, e.g. `{ \"X-CSRF\": \"1\" }` for the proxy's CSRF check. */\n headers?: Record<string, string>;\n /** `fetch`'s `credentials`. Default `\"same-origin\"`, which sends the session cookie to the same origin. */\n credentials?: RequestInit[\"credentials\"];\n /**\n * Called on every 401, before the `EmporixAuthError` is thrown — typically to\n * send the browser to the proxy's login. Parallel requests call it once each.\n */\n onUnauthorized?: (info: EmporixUnauthorizedInfo) => void;\n}\n\n/** User-supplied SDK configuration. */\nexport interface EmporixConfig {\n tenant: string;\n /**\n * API host. Default `https://api.emporix.io`. A path such as `/emporix` is\n * resolved against `globalThis.location.origin` per request — what a\n * same-origin proxy needs (see {@link EmporixProxyConfig}); without a\n * `location` (on a server) such a request throws.\n */\n host?: string;\n credentials: {\n /**\n * Service (client-credentials) credentials. Optional: storefront/SPA apps\n * use only `storefront` (anonymous) + caller-supplied customer tokens and\n * must never ship a backend secret. Required only when a `service`\n * AuthContext is actually used — enforced lazily by the TokenProvider.\n */\n backend?: ServiceCredentials;\n storefront?: StorefrontCredentials;\n custom?: Record<string, ServiceCredentials>;\n };\n tokenProvider?: TokenProvider;\n timeouts?: { connectMs?: number; readMs?: number };\n retry?: { maxAttempts?: number };\n cache?: { expirationBufferSeconds?: number; maxLifetimeSeconds?: number };\n logger?: LoggerConfig;\n /**\n * Replaces the global `fetch` for API requests. Receives the same arguments.\n *\n * Deliberately NOT used for token requests (`core/auth.ts`) or SSE\n * (`HttpClient.stream`): a cached token response would be a security defect,\n * and caching an event stream is meaningless. Those keep the global `fetch`,\n * which makes them structurally uncacheable rather than uncached by\n * convention.\n */\n fetch?: typeof globalThis.fetch;\n /**\n * Sent as `Content-Language` on every request that carries a body: the\n * language of the localized fields in it. Unset (the default) sends no header.\n *\n * - `\"*\"` — localized fields are maps of translations, `{ de: \"…\", en: \"…\" }`;\n * - a language code such as `\"de\"` — they are plain strings in that language.\n *\n * Without the header, most services read localized fields as plain strings in\n * the tenant's default language and answer a map with a 400 («localized values\n * must be of String type when the Content-Language header is not set to all\n * languages»). Categories and catalogs are the exception: they always take maps.\n *\n * It applies to every write the client makes, so set it on the client that does\n * back-office writes, not on a storefront client. Product and category writes\n * can override it per call with `contentLanguage` in their write options.\n */\n contentLanguage?: string;\n /**\n * Proxy (BFF) mode — see {@link EmporixProxyConfig}. Excludes `tokenProvider`\n * and `credentials.backend` / `credentials.custom`: in proxy mode the SDK\n * requests no tokens, so neither could ever be used.\n */\n proxy?: EmporixProxyConfig;\n}\n\n/** {@link EmporixProxyConfig} with defaults applied. */\nexport interface ResolvedProxyConfig {\n headers: Record<string, string>;\n credentials: NonNullable<RequestInit[\"credentials\"]>;\n onUnauthorized: ((info: EmporixUnauthorizedInfo) => void) | undefined;\n}\n\n/** Fully-resolved configuration with defaults applied. */\nexport interface ResolvedConfig {\n tenant: string;\n host: string;\n credentials: EmporixConfig[\"credentials\"];\n tokenProvider: TokenProvider | undefined;\n timeouts: { connectMs: number; readMs: number };\n retry: { maxAttempts: number };\n cache: { expirationBufferSeconds: number; maxLifetimeSeconds: number };\n logger: LoggerConfig | undefined;\n fetch: typeof globalThis.fetch | undefined;\n contentLanguage: string | undefined;\n /** Set exactly when the client runs in proxy mode. */\n proxy: ResolvedProxyConfig | undefined;\n}\n\n/**\n * `context` belongs inside `credentials.storefront`, and at the top level it is\n * silently lost.\n *\n * `EmporixConfig` has no top-level `context`, so such an object is dropped without a\n * word — and then `matchByContext` answers `[]` with no error, because the anonymous\n * token was minted without site, currency and country. Measured on tenant `viu`\n * (2026-08-18): 0 matches when misplaced, 1 when placed correctly. The expensive part\n * is the silence: it reads exactly like «no prices configured».\n *\n * A warning rather than a throw — configs that misplace it work today (badly), and a\n * throw would stop them on upgrade. `logger: false` is honoured as an explicit\n * request for silence; the object form of `LoggerConfig` carries no `warn` method, so\n * anything that is not a `Logger` instance falls back to the console.\n */\nfunction warnOnMisplacedContext(input: EmporixConfig): void {\n if (!(\"context\" in input)) return;\n const logger = input.logger;\n if (logger === false) return;\n const message =\n \"EmporixConfig has no top-level `context` — it is being ignored. Move it into \" +\n \"`credentials.storefront.context`, otherwise the anonymous token carries no \" +\n \"site/currency/country and price matching returns an empty list without erroring.\";\n if (logger && typeof (logger as Logger).warn === \"function\") {\n (logger as Logger).warn(message);\n return;\n }\n // Same escape hatch as the read-only-storage warning in `session-storage.ts`: this\n // has to reach a developer who configured no logger at all, which is exactly the\n // situation the mistake happens in.\n // eslint-disable-next-line no-console\n console.warn(`[emporix] ${message}`);\n}\n\n/** Validates user config and applies defaults. Throws on invalid tenant/credentials. */\nexport function validateConfig(input: EmporixConfig): ResolvedConfig {\n if (!TENANT_RE.test(input.tenant)) {\n throw new Error(\n `Invalid tenant \"${input.tenant}\": must be lowercase, 3–16 chars, match ^[a-z][a-z0-9]+$`,\n );\n }\n if (!input.credentials) {\n throw new Error(\"credentials is required (provide at least one of backend/storefront/custom)\");\n }\n warnOnMisplacedContext(input);\n const proxy = input.proxy;\n if (proxy) {\n // A throw, not a warning: both would sit unused, and a backend secret in a\n // browser bundle is exactly what proxy mode exists to prevent.\n if (input.tokenProvider) {\n throw new Error(\"proxy and tokenProvider are mutually exclusive: in proxy mode the SDK requests no tokens\");\n }\n if (input.credentials.backend || input.credentials.custom) {\n throw new Error(\n \"credentials.backend and credentials.custom cannot be used in proxy mode: the proxy attaches the token, \" +\n \"and service credentials never belong in a browser\",\n );\n }\n }\n return {\n tenant: input.tenant,\n host: input.host ?? DEFAULT_HOST,\n credentials: input.credentials,\n tokenProvider: input.tokenProvider,\n timeouts: {\n connectMs: input.timeouts?.connectMs ?? 10_000,\n readMs: input.timeouts?.readMs ?? 60_000,\n },\n retry: { maxAttempts: input.retry?.maxAttempts ?? 3 },\n cache: {\n expirationBufferSeconds: input.cache?.expirationBufferSeconds ?? 60,\n maxLifetimeSeconds: input.cache?.maxLifetimeSeconds ?? 3600,\n },\n logger: input.logger,\n fetch: input.fetch,\n contentLanguage: input.contentLanguage,\n proxy: proxy\n ? {\n headers: proxy.headers ?? {},\n credentials: proxy.credentials ?? \"same-origin\",\n onUnauthorized: proxy.onUnauthorized,\n }\n : undefined,\n };\n}\n","import type { ResolvedConfig, ServiceCredentials } from \"./config\";\nimport { EmporixAuthError, EmporixTimeoutError, EmporixNetworkError } from \"./errors\";\n\n/** Which token a call should use. */\nexport type AuthKind = \"service\" | \"customer\" | \"anonymous\" | \"raw\";\n\n/** Caller-supplied, per-call auth selector. Never stored on the client. */\nexport type AuthContext =\n | { kind: \"service\"; credentials?: string }\n | { kind: \"anonymous\" }\n | { kind: \"customer\"; token: string }\n | { kind: \"raw\"; token: string };\n\n/**\n * Supplies a fresh customer token when a `customer`-kind request 401s. The host\n * (e.g. EmporixProvider) implements this; the SDK never refreshes the\n * caller-owned customer token unless a refresher is registered.\n */\nexport interface CustomerTokenRefresher {\n /**\n * Called on a `customer`-kind 401. Receives the token that just failed;\n * returns a fresh customer token to retry with, or `null` to give up (the\n * 401 then propagates as EmporixAuthError).\n */\n refresh(expiredToken: string): Promise<string | null>;\n}\n\n/** An obtained anonymous storefront session. */\nexport interface AnonymousSession {\n accessToken: string;\n refreshToken: string;\n sessionId: string;\n expiresIn: number;\n}\n\n/**\n * An anonymous session as it survives outside the client instance.\n *\n * `accessToken` and `expiresAt` are optional, and a store is free to drop them:\n * they turn a *server* round trip into zero token calls, because a server client\n * lives for one request and would otherwise refresh on every single one. A\n * long-lived browser client keeps the token in memory anyway, so the React\n * storage adapters deliberately persist only the two required fields — a token\n * readable by JavaScript buys nothing there.\n *\n * A store that returns `accessToken` without a future `expiresAt` gets treated as\n * having no token at all; see {@link DefaultTokenProvider.attachAnonymousStore}.\n */\nexport interface StoredAnonymousSession {\n refreshToken: string;\n sessionId: string;\n /** The access token itself, so a fresh client need not spend a refresh call for it. */\n accessToken?: string;\n /** Epoch ms after which `accessToken` is stale. The expiry buffer is already applied. */\n expiresAt?: number;\n}\n\n/**\n * Persistence callback for anonymous sessions. `read` is called once on the\n * first need for an anonymous token to bootstrap a possibly-existing session;\n * `write` is called after every successful login or refresh. `write(null)`\n * means the SDK is invalidating the stored session.\n */\nexport interface AnonymousSessionStore {\n read(): StoredAnonymousSession | null;\n write(session: StoredAnonymousSession | null): void;\n}\n\n/** Supplies SDK-managed tokens (service/custom + anonymous). May be user-injected. */\nexport interface TokenProvider {\n /** Service/custom client-credentials token for the named credential set. */\n getToken(credentialSet: string): Promise<string>;\n /** Cached anonymous storefront session (preserves sessionId across refreshes). */\n getAnonymousToken(): Promise<AnonymousSession>;\n /** Refresh the anonymous session, preserving sessionId. */\n refreshAnonymous?(): Promise<AnonymousSession>;\n /** Invalidate a cached SDK-managed token so the next call re-auths. */\n invalidate?(credentialSet: string): void;\n /** Invalidate the cached anonymous session entirely (next call re-logs in). */\n invalidateAnonymous?(): void;\n /**\n * Mark the anonymous access token stale but keep the refresh token, so the\n * next {@link getAnonymousToken} refreshes (preserving sessionId) rather\n * than starting a brand-new session.\n */\n expireAnonymous?(): void;\n /**\n * Install a persistence adapter for the anonymous session. The host (e.g.\n * `EmporixProvider`) calls this at construction so the SDK can bootstrap\n * an existing session and persist refreshes. Idempotent: a later call\n * replaces the previous adapter.\n */\n attachAnonymousStore?(store: AnonymousSessionStore): void;\n /**\n * Override the storefront context (currency/site/country) used for the next\n * anonymous login, then invalidate the current anonymous session so it\n * re-mints with the new context. No-op for providers without anon support.\n */\n setAnonymousContext?(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n }): void;\n /**\n * Subscribe to token-refresh events. Optional — implementations may no-op.\n * Returns an unsubscribe function. `DefaultTokenProvider` emits for the\n * anonymous-login / anonymous-refresh paths.\n */\n onRefresh?(\n listener: (event: { kind: \"anonymous\" | \"customer\"; success: boolean }) => void,\n ): () => void;\n}\n\n/** Tiny constructors for {@link AuthContext}. */\nexport const auth = {\n /** Service/custom credential set (default `backend`). */\n service: (credentials?: string): AuthContext =>\n credentials === undefined ? { kind: \"service\" } : { kind: \"service\", credentials },\n /** Cached anonymous storefront token. */\n anonymous: (): AuthContext => ({ kind: \"anonymous\" }),\n /** Caller-owned customer bearer token. */\n customer: (token: string): AuthContext => ({ kind: \"customer\", token }),\n /** Exact token, no transformation (SSO / token-exchange). */\n raw: (token: string): AuthContext => ({ kind: \"raw\", token }),\n};\n\n/** Resolves an {@link AuthContext} to a concrete bearer token. */\nexport async function resolveToken(ctx: AuthContext, provider: TokenProvider): Promise<string> {\n switch (ctx.kind) {\n case \"service\":\n return provider.getToken(ctx.credentials ?? \"backend\");\n case \"anonymous\":\n return (await provider.getAnonymousToken()).accessToken;\n case \"customer\":\n case \"raw\":\n return ctx.token;\n }\n}\n\n/**\n * Late-bindable, single-flight holder for an optional\n * {@link CustomerTokenRefresher}. Single-flight is required because Emporix\n * rotates the refresh token on each refresh — concurrent refreshes would\n * invalidate each other. Off (returns `null`) until a refresher is set.\n */\nexport class CustomerRefreshRegistry {\n private refresher: CustomerTokenRefresher | null = null;\n private inflight: Promise<string | null> | null = null;\n\n set(refresher: CustomerTokenRefresher | null): void {\n this.refresher = refresher;\n }\n\n get enabled(): boolean {\n return this.refresher !== null;\n }\n\n /** Concurrent callers share one in-flight refresh. */\n refresh(expiredToken: string): Promise<string | null> {\n if (!this.refresher) return Promise.resolve(null);\n if (this.inflight) return this.inflight;\n const p = Promise.resolve(this.refresher.refresh(expiredToken)).finally(() => {\n this.inflight = null;\n });\n this.inflight = p;\n return p;\n }\n}\n\ninterface CacheEntry {\n token: string;\n expiresAt: number;\n obtainedAt: number;\n}\n\n/** SDK-owned token provider: client-credentials service tokens + anonymous session. */\nexport class DefaultTokenProvider implements TokenProvider {\n private readonly serviceCache = new Map<string, CacheEntry>();\n private readonly serviceLocks = new Map<string, Promise<string>>();\n private anon: (AnonymousSession & { expiresAt: number }) | undefined;\n private anonLock: Promise<AnonymousSession> | undefined;\n private anonStore?: AnonymousSessionStore;\n private contextOverride:\n | { currency?: string; siteCode?: string; targetLocation?: string }\n | undefined;\n private readonly refreshListeners = new Set<\n (event: { kind: \"anonymous\" | \"customer\"; success: boolean }) => void\n >();\n\n constructor(private readonly cfg: ResolvedConfig) {}\n\n onRefresh(\n listener: (event: { kind: \"anonymous\" | \"customer\"; success: boolean }) => void,\n ): () => void {\n this.refreshListeners.add(listener);\n return () => {\n this.refreshListeners.delete(listener);\n };\n }\n\n private notifyRefresh(kind: \"anonymous\" | \"customer\", success: boolean): void {\n for (const l of this.refreshListeners) {\n try {\n l({ kind, success });\n } catch {\n // Never let a telemetry listener break the auth path.\n }\n }\n }\n\n attachAnonymousStore(store: AnonymousSessionStore): void {\n this.anonStore = store;\n // Bootstrap `this.anon` from the store if we don't have it yet.\n //\n // A persisted access token that is still inside its lifetime is adopted as\n // is, and that is the point on a server: a client that lives for one request\n // would otherwise spend one `/anonymous/refresh` per request for a token it\n // already holds. Without a token — or past its expiry — `expiresAt` stays 0\n // and the next getAnonymousToken refreshes, which preserves the sessionId,\n // so the guest's cart survives either way.\n //\n // `expiresAt` counts only when there is a token to go with it. A store that\n // returns one without the other would otherwise make `anonFresh()` true and\n // hand out an empty bearer token.\n //\n // Trusting a stored expiry means trusting the writer's clock. A token\n // revoked early, or an expiry that a skewed clock made look valid, comes\n // back as a 401 — which `HttpClient` answers with `expireAnonymous()` plus\n // one retry, so the failure mode is a refresh, not an error.\n if (!this.anon) {\n const persisted = store.read();\n if (persisted) {\n const token = persisted.accessToken ?? \"\";\n this.anon = {\n accessToken: token,\n refreshToken: persisted.refreshToken,\n sessionId: persisted.sessionId,\n expiresIn: 0,\n expiresAt: token === \"\" ? 0 : (persisted.expiresAt ?? 0),\n };\n }\n }\n }\n\n private creds(set: string): ServiceCredentials {\n if (set === \"backend\") {\n const b = this.cfg.credentials.backend;\n if (!b?.clientId || !b.secret) {\n throw new EmporixAuthError(\n \"A 'service' AuthContext was used but credentials.backend is not configured\",\n );\n }\n return b;\n }\n const c = this.cfg.credentials.custom?.[set];\n if (!c) throw new Error(`Unknown credential set \"${set}\"`);\n return c;\n }\n\n private fresh(e: CacheEntry | undefined): boolean {\n if (!e) return false;\n const now = Date.now();\n if (now - e.obtainedAt >= this.cfg.cache.maxLifetimeSeconds * 1000) return false;\n return now < e.expiresAt;\n }\n\n async getToken(set: string): Promise<string> {\n // Surface an unknown credential set before entering the cache/lock path.\n this.creds(set);\n const cached = this.serviceCache.get(set);\n if (this.fresh(cached)) return cached!.token;\n const inflight = this.serviceLocks.get(set);\n if (inflight) return inflight;\n const p = this.requestServiceToken(set).finally(() => this.serviceLocks.delete(set));\n this.serviceLocks.set(set, p);\n return p;\n }\n\n /**\n * fetch with the configured read timeout. Token endpoints sit in front of\n * single-flight locks — one hung call would otherwise block every request\n * on this credential set forever.\n */\n private async boundedFetch(url: string | URL, init: RequestInit = {}): Promise<Response> {\n const ms = this.cfg.timeouts?.readMs ?? 60_000;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), ms);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(`token request timed out after ${ms}ms`);\n }\n throw new EmporixNetworkError(`token request network failure: ${(err as Error).message}`);\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async requestServiceToken(set: string): Promise<string> {\n const c = this.creds(set);\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: c.clientId,\n client_secret: c.secret,\n });\n if (c.scope) body.set(\"scope\", c.scope);\n const res = await this.boundedFetch(`${this.cfg.host}/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n const json = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) {\n throw new EmporixAuthError(`Token request failed for \"${set}\"`, res.status, json);\n }\n const obtainedAt = Date.now();\n const ttl = Number((json.expires_in as number | undefined) ?? 3600);\n this.serviceCache.set(set, {\n token: json.access_token as string,\n obtainedAt,\n expiresAt: obtainedAt + (ttl - this.cfg.cache.expirationBufferSeconds) * 1000,\n });\n return this.serviceCache.get(set)!.token;\n }\n\n invalidate(set: string): void {\n this.serviceCache.delete(set);\n }\n\n private anonFresh(): boolean {\n return !!this.anon && Date.now() < this.anon.expiresAt;\n }\n\n async getAnonymousToken(): Promise<AnonymousSession> {\n if (this.anonFresh()) return this.stripExpiry(this.anon!);\n if (this.anonLock) return this.anonLock;\n // Token expired but a refresh token survives → refresh to keep the same\n // sessionId; only fall back to a brand-new login if the refresh fails.\n const canRefresh = !!this.anon?.refreshToken;\n const obtain = canRefresh\n ? this.fetchAnonymous(\"refresh\").catch(() => this.fetchAnonymous(\"login\"))\n : this.fetchAnonymous(\"login\");\n const p = obtain.finally(() => {\n this.anonLock = undefined;\n });\n this.anonLock = p;\n return p;\n }\n\n /** Refreshes the anonymous session, preserving its sessionId. */\n async refreshAnonymous(): Promise<AnonymousSession> {\n if (!this.anon) return this.getAnonymousToken();\n return this.fetchAnonymous(\"refresh\");\n }\n\n invalidateAnonymous(): void {\n this.anon = undefined;\n this.anonStore?.write(null);\n }\n\n setAnonymousContext(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n }): void {\n const base = this.contextOverride ?? this.cfg.credentials.storefront?.context ?? {};\n this.contextOverride = { ...base, ...ctx };\n this.invalidateAnonymous();\n }\n\n /** Force a stale access token while keeping the refresh token + sessionId. */\n expireAnonymous(): void {\n if (this.anon) this.anon = { ...this.anon, expiresAt: 0 };\n }\n\n private stripExpiry(s: AnonymousSession & { expiresAt: number }): AnonymousSession {\n const { expiresAt: _expiresAt, ...rest } = s;\n return rest;\n }\n\n private async fetchAnonymous(mode: \"login\" | \"refresh\"): Promise<AnonymousSession> {\n const sf = this.cfg.credentials.storefront;\n if (!sf?.clientId) {\n throw new Error(\"credentials.storefront.clientId is required for anonymous tokens\");\n }\n const url = new URL(`${this.cfg.host}/customerlogin/auth/anonymous/${mode}`);\n url.searchParams.set(\"tenant\", this.cfg.tenant);\n url.searchParams.set(\"client_id\", sf.clientId);\n // Context is the runtime override (set via setAnonymousContext) if present,\n // else the config-fixed context.\n const c = this.contextOverride ?? sf.context;\n if (c?.currency) url.searchParams.set(\"currency\", c.currency);\n if (c?.siteCode) url.searchParams.set(\"siteCode\", c.siteCode);\n if (c?.targetLocation) url.searchParams.set(\"targetLocation\", c.targetLocation);\n if (mode === \"refresh\" && this.anon) {\n url.searchParams.set(\"refresh_token\", this.anon.refreshToken);\n }\n try {\n const res = await this.boundedFetch(url, { method: \"GET\" });\n const json = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) {\n this.notifyRefresh(\"anonymous\", false);\n throw new EmporixAuthError(`Anonymous token ${mode} failed`, res.status, json);\n }\n const obtainedAt = Date.now();\n this.anon = {\n accessToken: json.access_token as string,\n refreshToken: json.refresh_token as string,\n sessionId: json.sessionId as string,\n expiresIn: json.expires_in as number,\n expiresAt:\n obtainedAt +\n ((json.expires_in as number) - this.cfg.cache.expirationBufferSeconds) * 1000,\n };\n // The access token and its expiry go out too, so a store that keeps them\n // (a server one) can hand the next request a usable token instead of\n // another refresh. A store that only wants the refresh token drops them.\n this.anonStore?.write({\n refreshToken: this.anon.refreshToken,\n sessionId: this.anon.sessionId,\n accessToken: this.anon.accessToken,\n expiresAt: this.anon.expiresAt,\n });\n this.notifyRefresh(\"anonymous\", true);\n return this.stripExpiry(this.anon);\n } catch (err) {\n // Re-throw EmporixAuthError as-is; for non-Emporix errors (network), also notify.\n if (!(err instanceof EmporixAuthError)) {\n this.notifyRefresh(\"anonymous\", false);\n }\n throw err;\n }\n }\n}\n// Customer-token refreshes happen via client.customers.refresh() and don't\n// route through this TokenProvider — only the anonymous flow notifies.\n// React-side useCustomerSession.refresh emits its own telemetry event in a\n// follow-up if needed.\n","/**\n * The persisted session-state contract, shared by every host.\n *\n * It lives in the core SDK rather than in `@viu/emporix-sdk-react` because it is\n * not a React concern: the same eight keys are cookie names in a Next\n * `proxy.ts`, Web Storage keys in a browser adapter, and record fields in a\n * server-side session store. Keeping it here is what let\n * `@viu/emporix-sdk-next` drop its dependency on the React package — it needed\n * these strings, not React.\n *\n * `@viu/emporix-sdk-react` re-exports both from `./storage` and `/ssr`, so\n * existing imports keep working.\n */\n\n/** Keys that participate in {@link EmporixStorage.subscribeAll}. */\nexport type EmporixStorageKey =\n | \"customerToken\"\n | \"cartId\"\n | \"siteCode\"\n | \"language\"\n | \"anonymousSession\"\n | \"activeLegalEntityId\"\n | \"refreshToken\"\n | \"saasToken\";\n\n/**\n * The eight persisted session keys, as the strings each backend actually uses.\n * Same strings on purpose — a value written by one backend must be readable by\n * the next, and the cookie set by a Next `proxy.ts` has to be the one\n * `createCookieStorage` looks for.\n *\n * The `satisfies` is the point, not the deduplication: a ninth\n * {@link EmporixStorageKey} without an entry here is a compile error, and an\n * entry here without a union member is too. `as const` stays in front of it so\n * the literal types survive for consumers.\n */\nexport const STORAGE_KEYS = {\n customerToken: \"emporix.customerToken\",\n cartId: \"emporix.cartId\",\n anonymousSession: \"emporix.anonymousSession\",\n siteCode: \"emporix.siteCode\",\n language: \"emporix.language\",\n activeLegalEntityId: \"emporix.activeLegalEntityId\",\n refreshToken: \"emporix.refreshToken\",\n saasToken: \"emporix.saasToken\",\n} as const satisfies Record<EmporixStorageKey, string>;\n","/**\n * The persisted-session layer: the {@link EmporixStorage} contract and the two\n * framework-free implementations of it that are not browser-specific.\n *\n * It lives in the core SDK for the same reason {@link STORAGE_KEYS} does — none\n * of it is a React concern. A cookie-backed storage fits Next, Remix, SvelteKit,\n * Nitro or a plain Node handler equally, and `@viu/emporix-sdk-next` needed\n * exactly this and nothing else from `@viu/emporix-sdk-react`.\n *\n * `@viu/emporix-sdk-react` re-exports all of it and keeps the browser backends\n * (memory, localStorage, sessionStorage, document.cookie), which genuinely belong\n * there.\n */\nimport { auth, type AuthContext, type StoredAnonymousSession } from \"./auth\";\nimport { STORAGE_KEYS, type EmporixStorageKey } from \"./session-keys\";\n\n/**\n * The subset of an anonymous session a browser storage keeps.\n *\n * Derived from {@link StoredAnonymousSession} rather than re-declared: a server\n * store may additionally persist the access token and its expiry, a browser one\n * deliberately does not (the client is long-lived and holds the token in memory,\n * so writing it would only expose a bearer token to JavaScript).\n */\nexport type PersistedAnonymousSession = Pick<\n StoredAnonymousSession,\n \"refreshToken\" | \"sessionId\"\n>;\n\n/** Pluggable persistence for SDK session state. SSR-safe by default (memory). */\nexport interface EmporixStorage {\n // Customer token (unchanged).\n getCustomerToken(): string | null;\n setCustomerToken(token: string | null): void;\n subscribe?(listener: (token: string | null) => void): () => void;\n\n // Active guest / customer cart id.\n getCartId(): string | null;\n setCartId(id: string | null): void;\n\n // Anonymous session — used by DefaultTokenProvider (via EmporixProvider\n // wiring) to preserve sessionId across page reloads.\n getAnonymousSession(): PersistedAnonymousSession | null;\n setAnonymousSession(session: PersistedAnonymousSession | null): void;\n\n // Active site code (MS-2). `null` = no site bound yet.\n getSiteCode(): string | null;\n setSiteCode(code: string | null): void;\n\n // Active language (Accept-Language). `null` = use the site/tenant default.\n getLanguage(): string | null;\n setLanguage(language: string | null): void;\n\n // Active legal entity id (B2B). `null` = B2C mode.\n getActiveLegalEntityId(): string | null;\n setActiveLegalEntityId(id: string | null): void;\n\n // Refresh token — optional persistence. When absent, B2B company-switch\n // falls back to a local-state-only update (no server-side token rescope).\n getRefreshToken(): string | null;\n setRefreshToken(token: string | null): void;\n\n // SaaS token (the checkout `saas-token` header). Persisted so a logged-in\n // customer can still complete checkout after a page reload — the refresh\n // endpoint does not re-mint it. Optional: a custom adapter may omit these,\n // in which case the saasToken stays in-memory only.\n getSaasToken?(): string | null;\n setSaasToken?(token: string | null): void;\n\n /**\n * Subscribe to any storage write. The listener receives the key that\n * changed. Returns an unsubscribe function. Optional — backends may no-op.\n * Used by the telemetry layer to emit `storage.write` events.\n */\n subscribeAll?(listener: (key: EmporixStorageKey) => void): () => void;\n}\n\n/** Backward-compat alias. New code should prefer {@link EmporixStorage}. */\nexport type TokenStorage = EmporixStorage;\n\n/**\n * Parses a stored anonymous session (from Web Storage or a cookie) into a\n * {@link PersistedAnonymousSession}. Returns `null` for absent, malformed or\n * incomplete values — a half-written session must not become a half-valid one.\n */\nexport function parseAnonymousSession(raw: string | null): PersistedAnonymousSession | null {\n if (raw === null) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedAnonymousSession>;\n return typeof parsed.refreshToken === \"string\" && typeof parsed.sessionId === \"string\"\n ? { refreshToken: parsed.refreshToken, sessionId: parsed.sessionId }\n : null;\n } catch {\n return null;\n }\n}\n\n/** Backend-agnostic cookie accessor. `set` absent means the storage is read-only. */\nexport interface CookieIo {\n get(name: string): string | null;\n /** `null` deletes the cookie. */\n set?(name: string, value: string | null): void;\n}\n\n/**\n * Builds an {@link EmporixStorage} over a cookie accessor. Contains the whole\n * name-to-accessor mapping so no backend repeats it.\n *\n * `opts.notify` is a callback rather than a flag so this module stays free of\n * listener-set lifetime: the browser backend owns a `createListenerSet`, passes\n * its `notify` here, and attaches `subscribeAll` to the result itself. This\n * function never sets `subscribeAll` — the server backend therefore has none,\n * which is correct: a server render has no lifetime to observe.\n */\nexport function createCookieBackedStorage(\n io: CookieIo,\n opts: { tokenName?: string; notify?: (key: EmporixStorageKey) => void } = {},\n): EmporixStorage {\n const tokenName = opts.tokenName ?? STORAGE_KEYS.customerToken;\n const notify = opts.notify;\n\n // Read-only mode: warn once per key so a genuine bug surfaces, but a render\n // loop cannot flood the log.\n const warned = new Set<EmporixStorageKey>();\n const write = (name: string, value: string | null, key: EmporixStorageKey): void => {\n if (io.set === undefined) {\n if (!warned.has(key)) {\n warned.add(key);\n // eslint-disable-next-line no-console\n console.warn(\n `[emporix] storage is read-only; ignoring write to \"${key}\". ` +\n \"Provide a `set` accessor to enable writes (e.g. from a Server Action).\",\n );\n }\n return;\n }\n io.set(name, value);\n notify?.(key);\n };\n\n return {\n getCustomerToken: () => io.get(tokenName),\n setCustomerToken: (t) => write(tokenName, t, \"customerToken\"),\n\n getCartId: () => io.get(STORAGE_KEYS.cartId),\n setCartId: (id) => write(STORAGE_KEYS.cartId, id, \"cartId\"),\n\n getAnonymousSession: () => parseAnonymousSession(io.get(STORAGE_KEYS.anonymousSession)),\n setAnonymousSession: (s) =>\n write(\n STORAGE_KEYS.anonymousSession,\n s === null\n ? null\n : JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n \"anonymousSession\",\n ),\n\n getSiteCode: () => io.get(STORAGE_KEYS.siteCode),\n setSiteCode: (code) => write(STORAGE_KEYS.siteCode, code, \"siteCode\"),\n\n getLanguage: () => io.get(STORAGE_KEYS.language),\n setLanguage: (l) => write(STORAGE_KEYS.language, l, \"language\"),\n\n getActiveLegalEntityId: () => io.get(STORAGE_KEYS.activeLegalEntityId),\n setActiveLegalEntityId: (id) =>\n write(STORAGE_KEYS.activeLegalEntityId, id, \"activeLegalEntityId\"),\n\n getRefreshToken: () => io.get(STORAGE_KEYS.refreshToken),\n setRefreshToken: (t) => write(STORAGE_KEYS.refreshToken, t, \"refreshToken\"),\n\n getSaasToken: () => io.get(STORAGE_KEYS.saasToken),\n setSaasToken: (t) => write(STORAGE_KEYS.saasToken, t, \"saasToken\"),\n };\n}\n\n/**\n * A synchronous cookie accessor supplied by the caller. Deliberately\n * synchronous: {@link EmporixStorage} is synchronous throughout, so any\n * `await` (e.g. Next's `await cookies()`) belongs to the caller.\n *\n * Omit `set` for a read-only storage. Next.js forbids cookie writes during a\n * Server Component render — only Server Actions and Route Handlers may write.\n */\nexport interface ServerCookieJar {\n get(name: string): string | null;\n /** `null` deletes the cookie. */\n set?(name: string, value: string | null): void;\n}\n\n/**\n * An {@link EmporixStorage} reading (and optionally writing) through a\n * caller-supplied cookie jar — for RSC, Server Actions, Route Handlers, or any\n * other server runtime. No framework import: the jar shape fits Next, Remix,\n * SvelteKit, Nitro or a plain Node handler.\n *\n * `subscribe` / `subscribeAll` are absent: a server render has no lifetime over\n * which to observe changes.\n *\n * ```ts\n * // Next.js Server Component (read-only)\n * const jar = await cookies();\n * const storage = createServerStorage({ get: (n) => jar.get(n)?.value ?? null });\n *\n * // Next.js Server Action (read-write)\n * const jar = await cookies();\n * const storage = createServerStorage({\n * get: (n) => jar.get(n)?.value ?? null,\n * set: (n, v) =>\n * v === null\n * ? jar.delete(n)\n * : jar.set(n, v, { httpOnly: true, sameSite: \"lax\", secure: true, path: \"/\" }),\n * });\n * ```\n */\nexport function createServerStorage(jar: ServerCookieJar): EmporixStorage {\n return createCookieBackedStorage(\n jar.set !== undefined ? { get: jar.get, set: jar.set } : { get: jar.get },\n );\n}\n\n/**\n * Resolves the {@link AuthContext} a server-side read should use, mirroring\n * exactly what the React `useEmporixQuery` resolves on the client: the customer\n * context when a token is stored, anonymous otherwise.\n *\n * Use this rather than hand-rolling it — `authKind` is part of every React-Query\n * key, so a mismatch here produces a silent cache miss (a second fetch after\n * hydration, no error).\n */\nexport function serverAuth(storage: EmporixStorage): AuthContext {\n const token = storage.getCustomerToken();\n return token !== null ? auth.customer(token) : auth.anonymous();\n}\n","/**\n * The browser session-storage backends: memory, localStorage, sessionStorage,\n * document.cookie.\n *\n * The contract and the framework-free backends live in `./session-storage`;\n * these are the ones that need browser globals. They were in\n * `@viu/emporix-sdk-react` until `@viu/emporix-sdk-angular` needed them too —\n * `localStorage` is not a React API, and duplicating a storage backend per\n * binding means two of them writing subtly different values under the same key.\n *\n * Every export is a named factory and the package sets `sideEffects: false`, so\n * a Node consumer that imports none of them bundles none of them. That is\n * asserted by `scripts/check-treeshake.mjs`.\n */\nimport {\n createCookieBackedStorage,\n parseAnonymousSession,\n type EmporixStorage,\n type PersistedAnonymousSession,\n} from \"./session-storage\";\nimport { STORAGE_KEYS, type EmporixStorageKey } from \"./session-keys\";\n\n/**\n * The three methods these backends use from a Web `Storage`.\n *\n * Declared locally on purpose. This package compiles with `lib: [\"ES2022\"]` and\n * no `\"DOM\"` — that is the invariant which keeps the SDK runnable on Node, edge\n * runtimes and workers, and adding DOM to the lib to satisfy this one file would\n * switch that compile-time guard off for all ~60 services. So every browser\n * global below is reached through a narrowed `globalThis` instead of an ambient\n * declaration, which is also the pattern the localStorage and sessionStorage\n * availability checks already used before this code moved here.\n */\nexport interface WebStorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\n/** Narrowed view of the browser globals these backends touch. */\ninterface BrowserGlobals {\n localStorage?: WebStorageLike;\n sessionStorage?: WebStorageLike;\n document?: { cookie: string };\n location?: { protocol: string };\n}\n\nconst browser = globalThis as unknown as BrowserGlobals;\n\n/**\n * Internal: create a swallow-on-throw listener set used by all the storage\n * backends for `subscribeAll`. Centralizes the try/catch wrapper so a buggy\n * telemetry handler never breaks a storage write.\n */\nexport function createListenerSet<T>(): {\n add(l: (value: T) => void): () => void;\n notify(value: T): void;\n} {\n const listeners = new Set<(v: T) => void>();\n return {\n add(l) {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n notify(value) {\n for (const l of listeners) {\n try {\n l(value);\n } catch {\n // Swallow handler errors; telemetry must never break writes.\n }\n }\n },\n };\n}\n\n/** In-memory token store. Default, SSR-safe, no persistence. */\nexport function createMemoryStorage(opts: { initial?: string } = {}): EmporixStorage {\n let token: string | null = opts.initial ?? null;\n let cartId: string | null = null;\n let anon: PersistedAnonymousSession | null = null;\n let siteCode: string | null = null;\n let language: string | null = null;\n let activeLegalEntityId: string | null = null;\n let refreshToken: string | null = null;\n let saasToken: string | null = null;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => token,\n setCustomerToken: (t) => {\n token = t;\n for (const l of tokenListeners) l(token);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => cartId,\n setCartId: (id) => {\n cartId = id;\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => anon,\n setAnonymousSession: (s) => {\n anon = s;\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => siteCode,\n setSiteCode: (code) => {\n siteCode = code;\n all.notify(\"siteCode\");\n },\n getLanguage: () => language,\n setLanguage: (l) => {\n language = l;\n all.notify(\"language\");\n },\n getActiveLegalEntityId: () => activeLegalEntityId,\n setActiveLegalEntityId: (id) => {\n activeLegalEntityId = id;\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => refreshToken,\n setRefreshToken: (t) => {\n refreshToken = t;\n all.notify(\"refreshToken\");\n },\n getSaasToken: () => saasToken,\n setSaasToken: (t) => {\n saasToken = t;\n all.notify(\"saasToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n\n/**\n * Internal: build an {@link EmporixStorage} backed by any Web `Storage`\n * instance (`localStorage` or `sessionStorage`). Both share the identical\n * `getItem`/`setItem`/`removeItem` surface, so the 8-key wiring lives here once.\n * Callers own the availability check + memory fallback before delegating.\n */\nexport function fromWebStorage(\n storage: WebStorageLike,\n opts: { key?: string } = {},\n): EmporixStorage {\n const tokenKey = opts.key ?? STORAGE_KEYS.customerToken;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => storage.getItem(tokenKey),\n setCustomerToken: (t) => {\n if (t === null) storage.removeItem(tokenKey);\n else storage.setItem(tokenKey, t);\n for (const l of tokenListeners) l(t);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => storage.getItem(STORAGE_KEYS.cartId),\n setCartId: (id) => {\n if (id === null) storage.removeItem(STORAGE_KEYS.cartId);\n else storage.setItem(STORAGE_KEYS.cartId, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () =>\n parseAnonymousSession(storage.getItem(STORAGE_KEYS.anonymousSession)),\n setAnonymousSession: (s) => {\n if (s === null) storage.removeItem(STORAGE_KEYS.anonymousSession);\n else\n storage.setItem(\n STORAGE_KEYS.anonymousSession,\n JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n );\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => storage.getItem(STORAGE_KEYS.siteCode),\n setSiteCode: (code) => {\n if (code === null) storage.removeItem(STORAGE_KEYS.siteCode);\n else storage.setItem(STORAGE_KEYS.siteCode, code);\n all.notify(\"siteCode\");\n },\n getLanguage: () => storage.getItem(STORAGE_KEYS.language),\n setLanguage: (l) => {\n if (l === null) storage.removeItem(STORAGE_KEYS.language);\n else storage.setItem(STORAGE_KEYS.language, l);\n all.notify(\"language\");\n },\n getActiveLegalEntityId: () => storage.getItem(STORAGE_KEYS.activeLegalEntityId),\n setActiveLegalEntityId: (id) => {\n if (id === null) storage.removeItem(STORAGE_KEYS.activeLegalEntityId);\n else storage.setItem(STORAGE_KEYS.activeLegalEntityId, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => storage.getItem(STORAGE_KEYS.refreshToken),\n setRefreshToken: (t) => {\n if (t === null) storage.removeItem(STORAGE_KEYS.refreshToken);\n else storage.setItem(STORAGE_KEYS.refreshToken, t);\n all.notify(\"refreshToken\");\n },\n getSaasToken: () => storage.getItem(STORAGE_KEYS.saasToken),\n setSaasToken: (t) => {\n if (t === null) storage.removeItem(STORAGE_KEYS.saasToken);\n else storage.setItem(STORAGE_KEYS.saasToken, t);\n all.notify(\"saasToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n\n/**\n * Browser `localStorage`-backed store: persistent and shared across tabs.\n * Falls back to memory on the server (or when localStorage is unavailable).\n */\nexport function createLocalStorage(opts: { key?: string } = {}): EmporixStorage {\n const store = browser.localStorage;\n if (store === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] localStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n return fromWebStorage(store, opts);\n}\n\n/** @deprecated Use {@link createLocalStorage}. Kept for backward compatibility. */\nexport const createLocalStorageStorage = createLocalStorage;\n\n/**\n * Browser `sessionStorage`-backed store: per-tab persistence that survives a\n * reload but is cleared when the tab closes and is not shared across tabs.\n * Falls back to memory on the server (or when sessionStorage is unavailable).\n */\nexport function createSessionStorage(opts: { key?: string } = {}): EmporixStorage {\n const store = browser.sessionStorage;\n if (store === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] sessionStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n return fromWebStorage(store, opts);\n}\n\n/**\n * Cookie-backed store. `Secure` defaults to on for https origins; override\n * with `secure: false` only for non-https dev setups. Consumer must still pick\n * an appropriate `sameSite` for CSRF safety.\n */\nexport function createCookieStorage(\n opts: { name?: string; secure?: boolean; sameSite?: \"lax\" | \"strict\" | \"none\" } = {},\n): EmporixStorage {\n const sameSite = opts.sameSite ?? \"lax\";\n // Default: Secure on https origins. Tokens must not ride plain-http\n // cookies in production; localhost/http dev keeps working without opts.\n const secure = opts.secure ?? browser.location?.protocol === \"https:\";\n const doc = browser.document;\n if (doc === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] document unavailable; cookie storage falling back to in-memory\");\n return createMemoryStorage();\n }\n const attrs = `path=/; SameSite=${sameSite}${secure ? \"; Secure\" : \"\"}`;\n const all = createListenerSet<EmporixStorageKey>();\n const storage = createCookieBackedStorage(\n {\n get: (name) => {\n for (const part of doc.cookie.split(\"; \")) {\n const [k, ...v] = part.split(\"=\");\n if (k === name) return decodeURIComponent(v.join(\"=\")) || null;\n }\n return null;\n },\n set: (name, value) => {\n doc.cookie =\n value === null\n ? `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attrs}`\n : `${name}=${encodeURIComponent(value)}; ${attrs}`;\n },\n },\n {\n ...(opts.name !== undefined ? { tokenName: opts.name } : {}),\n notify: (key) => all.notify(key),\n },\n );\n return { ...storage, subscribeAll: (l) => all.add(l) };\n}\n","/**\n * Proxy (BFF) mode pieces that are not HTTP: the token provider that refuses to\n * mint, and the storage view the framework bindings put in front of their\n * storage. The HTTP side lives in `HttpClient`; see `EmporixProxyConfig`.\n */\nimport { EmporixAuthError } from \"./errors\";\nimport type { TokenProvider } from \"./auth\";\nimport type { EmporixStorage } from \"./session-storage\";\nimport type { EmporixStorageKey } from \"./session-keys\";\nimport { createListenerSet } from \"./browser-storage\";\n\n/**\n * What a proxy-mode storage reports as the customer token while the proxy\n * session belongs to a logged-in customer.\n *\n * A marker, not a token: in proxy mode `HttpClient` sends no `Authorization`\n * header, so whatever a `customer` {@link AuthContext} carries never leaves the\n * browser. It exists so that every \"is a customer logged in?\" check written\n * against `getCustomerToken()` keeps working without a token in the browser.\n */\nexport const PROXY_CUSTOMER_TOKEN = \"emporix-proxy-session\";\n\n/**\n * The token provider of a proxy-mode client. Every token request throws: the\n * proxy holds the tokens, and a request for one is a bug that would otherwise\n * end in a token in the browser. `setAnonymousContext` is a no-op — binding a\n * guest session to a site and currency is the proxy's job then.\n */\nexport function createProxyModeTokenProvider(): TokenProvider {\n const refuse = (): never => {\n throw new EmporixAuthError(\n \"The client runs in proxy mode: the proxy attaches the token, so the SDK requests none\",\n );\n };\n return {\n getToken: async () => refuse(),\n getAnonymousToken: async () => refuse(),\n refreshAnonymous: async () => refuse(),\n setAnonymousContext: () => {},\n };\n}\n\n/** Keys that hold a token. A proxy-mode storage neither reads nor writes them. */\nconst TOKEN_KEYS: ReadonlySet<EmporixStorageKey> = new Set<EmporixStorageKey>([\n \"customerToken\",\n \"anonymousSession\",\n \"refreshToken\",\n \"saasToken\",\n]);\n\n/** An {@link EmporixStorage} whose customer state is set from outside. */\nexport interface ProxySessionStorage extends EmporixStorage {\n /**\n * Whether the proxy session belongs to a logged-in customer. A change notifies\n * `subscribe` and `subscribeAll` listeners as a `customerToken` change.\n */\n setProxyAuthenticated(authenticated: boolean): void;\n}\n\n/**\n * Wraps a storage for proxy mode. Cart id, site, language and active legal\n * entity pass through to `base`; the token slots do not:\n *\n * - `getCustomerToken()` answers {@link PROXY_CUSTOMER_TOKEN} or `null`, as\n * `setProxyAuthenticated` last said;\n * - the anonymous session, refresh token and SaaS token read as `null`;\n * - writes to any of them are dropped, so nothing ever puts a token into `base`.\n *\n * A token already in `base` — from a session before the switch to proxy mode —\n * is hidden, not removed.\n */\nexport function createProxySessionStorage(\n base: EmporixStorage,\n authenticated: boolean,\n): ProxySessionStorage {\n let current = authenticated;\n const tokenListeners = createListenerSet<string | null>();\n const keyListeners = createListenerSet<EmporixStorageKey>();\n const token = (): string | null => (current ? PROXY_CUSTOMER_TOKEN : null);\n const drop = (): void => {};\n\n return {\n getCustomerToken: token,\n setCustomerToken: drop,\n subscribe: (listener) => tokenListeners.add(listener),\n\n getCartId: () => base.getCartId(),\n setCartId: (id) => base.setCartId(id),\n\n getAnonymousSession: () => null,\n setAnonymousSession: drop,\n\n getSiteCode: () => base.getSiteCode(),\n setSiteCode: (code) => base.setSiteCode(code),\n\n getLanguage: () => base.getLanguage(),\n setLanguage: (language) => base.setLanguage(language),\n\n getActiveLegalEntityId: () => base.getActiveLegalEntityId(),\n setActiveLegalEntityId: (id) => base.setActiveLegalEntityId(id),\n\n getRefreshToken: () => null,\n setRefreshToken: drop,\n getSaasToken: () => null,\n setSaasToken: drop,\n\n subscribeAll(listener) {\n const own = keyListeners.add(listener);\n const passed = base.subscribeAll?.((key) => {\n if (!TOKEN_KEYS.has(key)) listener(key);\n });\n return () => {\n own();\n passed?.();\n };\n },\n\n setProxyAuthenticated(next) {\n if (next === current) return;\n current = next;\n tokenListeners.notify(token());\n keyListeners.notify(\"customerToken\");\n },\n };\n}\n","/** Log severity, low → high. */\nexport type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\n/** Numeric ordering used for fast comparison. */\nexport const LEVEL: Record<LogLevel, number> = {\n trace: 10, debug: 20, info: 30, warn: 40, error: 50, silent: 60,\n};\n\n/** Services that bind their own logger and are independently level-controllable. */\nexport type ServiceName =\n | \"customer\"\n | \"product\"\n | \"category\"\n | \"cart\"\n | \"checkout\"\n | \"payment\"\n | \"price\"\n | \"media\"\n | \"segment\"\n | \"site\"\n | \"session-context\"\n | \"customer-management\"\n | \"iam\"\n | \"orders\"\n | \"sales-orders\"\n | \"availability\"\n | \"configuration\"\n | \"shopping-list\"\n | \"ai-rag-indexer\"\n | \"sequential-id\"\n | \"fee\"\n | \"webhook\"\n | \"schema\"\n | \"ai\"\n | \"tax\"\n | \"coupon\"\n | \"reward-points\"\n | \"brand\"\n | \"label\"\n | \"country\"\n | \"currency\"\n | \"shipping\"\n | \"returns\"\n | \"indexing\"\n | \"search\"\n | \"import\"\n | \"audit-log\"\n | \"unit-handling\"\n | \"catalog\"\n | \"vendor\"\n | \"customer-admin\"\n | \"approval\"\n | \"invoice\"\n | \"quote\"\n | \"cloud-functions\"\n | \"http\"\n | \"auth\";\n\n/** Arbitrary structured fields attached to a log line. */\nexport interface LogFields { [key: string]: unknown; }\n\n/** The logger contract consumers may implement or swap. */\nexport interface Logger {\n level: LogLevel;\n isLevelEnabled(level: LogLevel): boolean;\n trace(msg: string, fields?: LogFields): void;\n debug(msg: string, fields?: LogFields): void;\n info(msg: string, fields?: LogFields): void;\n warn(msg: string, fields?: LogFields): void;\n error(msg: string, fields?: LogFields): void;\n child(bindings: LogFields): Logger;\n}\n\n/** Object form of logger configuration. */\nexport interface LoggerObjectConfig {\n level?: LogLevel;\n services?: Partial<Record<ServiceName, LogLevel>>;\n pretty?: boolean;\n redact?: string[];\n}\n\n/** `false` → noop logger; `Logger` → user-supplied; object → built-in console logger. */\nexport type LoggerConfig = false | Logger | LoggerObjectConfig;\n\nfunction isValidLevel(v: string | undefined): v is LogLevel {\n return v !== undefined && v in LEVEL;\n}\n\n/** Browser-safe env read — `process` is undefined in browsers/edge runtimes. */\nfunction readEnv(name: string): string | undefined {\n try {\n return typeof process !== \"undefined\" && process.env ? process.env[name] : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves the effective level per service following:\n * env per-service > env global > config.services[svc] > config.level > \"warn\".\n * Runtime `set()` mutates programmatic levels but never overrides env-set ones\n * unless `force` is passed.\n */\nexport class LevelResolver {\n private cfgLevel: LogLevel;\n private cfgServices: Partial<Record<ServiceName, LogLevel>>;\n private forcedServices: Partial<Record<ServiceName, LogLevel>> = {};\n private forcedGlobal: LogLevel | undefined;\n private warned = false;\n\n constructor(\n cfg: LoggerObjectConfig,\n private readonly warn: (msg: string) => void = () => {},\n ) {\n this.cfgLevel = cfg.level ?? \"warn\";\n this.cfgServices = { ...cfg.services };\n }\n\n private envFor(svc: ServiceName): LogLevel | undefined {\n const raw = readEnv(`EMPORIX_LOG_LEVEL_${svc.toUpperCase()}`);\n if (raw === undefined) return undefined;\n if (isValidLevel(raw)) return raw;\n if (!this.warned) {\n this.warned = true;\n this.warn(`Invalid EMPORIX_LOG_LEVEL_${svc.toUpperCase()}=\"${raw}\" ignored`);\n }\n return undefined;\n }\n\n private envGlobal(): LogLevel | undefined {\n const raw = readEnv(\"EMPORIX_LOG_LEVEL\");\n if (raw === undefined) return undefined;\n if (isValidLevel(raw)) return raw;\n if (!this.warned) {\n this.warned = true;\n this.warn(`Invalid EMPORIX_LOG_LEVEL=\"${raw}\" ignored`);\n }\n return undefined;\n }\n\n /**\n * Effective level for a service. Forced overrides (from `set(..., force)`)\n * take precedence over env vars; otherwise env > programmatic config.\n */\n get(svc: ServiceName): LogLevel {\n return (\n this.forcedServices[svc] ??\n this.envFor(svc) ??\n this.forcedGlobal ??\n this.envGlobal() ??\n this.cfgServices[svc] ??\n this.cfgLevel ??\n \"warn\"\n );\n }\n\n /** Numeric effective level for a service. */\n numericLevel(svc: ServiceName): number {\n return LEVEL[this.get(svc)];\n }\n\n /** True if `svc`'s effective level allows emitting at `at`. */\n isAtLeast(svc: ServiceName, at: LogLevel): boolean {\n return this.numericLevel(svc) <= LEVEL[at];\n }\n\n /** Mutates programmatic level (global or one service). Env-set levels are sticky unless `force`. */\n set(level: LogLevel, svc?: ServiceName, force = false): void {\n if (svc) {\n const envBound = readEnv(`EMPORIX_LOG_LEVEL_${svc.toUpperCase()}`) !== undefined;\n if (envBound && !force) {\n this.warn(`Level for \"${svc}\" is env-controlled; pass force to override`);\n return;\n }\n if (force) this.forcedServices[svc] = level;\n else this.cfgServices[svc] = level;\n } else {\n const envBound = readEnv(\"EMPORIX_LOG_LEVEL\") !== undefined;\n if (envBound && !force) {\n this.warn(\"Global level is env-controlled; pass force to override\");\n return;\n }\n if (force) this.forcedGlobal = level;\n else this.cfgLevel = level;\n }\n }\n}\n\n/** Default redaction floor — never reducible. */\nconst DEFAULT_REDACT = new Set([\n \"authorization\", \"password\", \"oldpassword\", \"newpassword\", \"clientsecret\",\n \"secret\", \"access_token\", \"refresh_token\", \"customertoken\", \"saastoken\",\n \"saas-token\", \"bearertoken\", \"apikey\", \"token\",\n]);\n\n/** Deep-clones `value`, replacing redacted keys with a mask. AuthContext token is stripped. */\nexport function redact(value: unknown, extra: string[] = []): unknown {\n const keys = new Set(DEFAULT_REDACT);\n for (const k of extra) keys.add(k.toLowerCase());\n const walk = (v: unknown): unknown => {\n if (Array.isArray(v)) return v.map(walk);\n if (v && typeof v === \"object\") {\n const src = v as Record<string, unknown>;\n // AuthContext: keep only `kind`.\n if (typeof src.kind === \"string\" && \"token\" in src) return { kind: src.kind };\n const out: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(src)) {\n if (keys.has(k.toLowerCase())) {\n out[k] =\n k.toLowerCase() === \"authorization\" && typeof val === \"string\"\n ? \"Bearer ***redacted***\"\n : \"***redacted***\";\n } else {\n out[k] = walk(val);\n }\n }\n return out;\n }\n return v;\n };\n return walk(value);\n}\n\ninterface Sink {\n log: (...a: unknown[]) => void;\n info: (...a: unknown[]) => void;\n warn: (...a: unknown[]) => void;\n error: (...a: unknown[]) => void;\n}\n\nconst EMIT: Record<Exclude<LogLevel, \"silent\">, number> = {\n trace: LEVEL.trace, debug: LEVEL.debug, info: LEVEL.info, warn: LEVEL.warn, error: LEVEL.error,\n};\n\nabstract class BaseLogger implements Logger {\n constructor(\n protected readonly resolver: LevelResolver,\n protected readonly bindings: LogFields,\n protected readonly extraRedact: string[],\n ) {}\n private svc(): ServiceName {\n return (this.bindings.service as ServiceName) ?? \"http\";\n }\n get level(): LogLevel {\n return this.resolver.get(this.svc());\n }\n isLevelEnabled(level: LogLevel): boolean {\n return this.resolver.isAtLeast(this.svc(), level);\n }\n protected abstract emit(\n level: Exclude<LogLevel, \"silent\">,\n msg: string,\n fields: LogFields,\n ): void;\n private at(level: Exclude<LogLevel, \"silent\">, msg: string, fields?: LogFields): void {\n if (this.resolver.numericLevel(this.svc()) > EMIT[level]) return;\n const merged = { ...this.bindings, ...(fields ?? {}) };\n this.emit(level, msg, redact(merged, this.extraRedact) as LogFields);\n }\n trace(m: string, f?: LogFields): void { this.at(\"trace\", m, f); }\n debug(m: string, f?: LogFields): void { this.at(\"debug\", m, f); }\n info(m: string, f?: LogFields): void { this.at(\"info\", m, f); }\n warn(m: string, f?: LogFields): void { this.at(\"warn\", m, f); }\n error(m: string, f?: LogFields): void { this.at(\"error\", m, f); }\n abstract child(bindings: LogFields): Logger;\n}\n\nclass ConsoleLogger extends BaseLogger {\n constructor(\n resolver: LevelResolver,\n bindings: LogFields,\n extra: string[],\n private readonly sink: Sink,\n private readonly pretty: boolean,\n ) {\n super(resolver, bindings, extra);\n }\n protected emit(level: Exclude<LogLevel, \"silent\">, msg: string, fields: LogFields): void {\n if (this.pretty) {\n const fn =\n level === \"error\" ? this.sink.error\n : level === \"warn\" ? this.sink.warn\n : level === \"info\" ? this.sink.info\n : this.sink.log;\n fn(`[${level}] ${msg}`, fields);\n } else {\n this.sink.log(JSON.stringify({ ts: new Date().toISOString(), level, msg, ...fields }));\n }\n }\n child(bindings: LogFields): Logger {\n return new ConsoleLogger(\n this.resolver,\n { ...this.bindings, ...bindings },\n this.extraRedact,\n this.sink,\n this.pretty,\n );\n }\n}\n\nclass NoopLogger implements Logger {\n level: LogLevel = \"silent\";\n isLevelEnabled(): boolean { return false; }\n trace(): void {}\n debug(): void {}\n info(): void {}\n warn(): void {}\n error(): void {}\n child(): Logger { return this; }\n}\n\n/** Creates the built-in console logger. `opts.sink` overrides `console` (used in tests). */\nexport function createConsoleLogger(\n resolver: LevelResolver,\n bindings: LogFields = {},\n opts: { pretty?: boolean; redact?: string[]; sink?: Sink } = {},\n): Logger {\n const pretty = opts.pretty ?? readEnv(\"NODE_ENV\") !== \"production\";\n const sink: Sink = opts.sink ?? {\n log: console.log,\n info: console.info,\n warn: console.warn,\n error: console.error,\n };\n return new ConsoleLogger(resolver, bindings, opts.redact ?? [], sink, pretty);\n}\n\n/** Creates a logger that discards everything. */\nexport function createNoopLogger(): Logger {\n return new NoopLogger();\n}\n","/**\n * The cache-key shape every framework binding shares.\n *\n * Shape: `[\"emporix\", resource, ...args, { tenant, authKind, siteCode?, language? }]`\n *\n * It lives in the core SDK for the same reason {@link STORAGE_KEYS} does: it is\n * not a React concern. `@viu/emporix-sdk-react` and `@viu/emporix-sdk-angular`\n * must produce byte-identical keys or the two bindings, the docs and the\n * devtools all describe different caches. One definition is the only way that\n * holds — a copy per binding would agree on the day it was written and nowhere\n * after.\n *\n * The trailing meta object groups the discriminators that differentiate cache\n * entries across tenants, auth-kinds and (where applicable) active sites.\n * `siteCode` is included only when explicitly passed — non-site-aware reads\n * pass `undefined` and the field is dropped.\n */\nexport function emporixKey<TArgs extends readonly unknown[]>(\n resource: string,\n args: TArgs,\n context: {\n tenant: string;\n authKind: string;\n siteCode?: string | null;\n language?: string | null;\n },\n): readonly [\"emporix\", string, ...TArgs, Record<string, unknown>] {\n const meta: Record<string, unknown> = {\n tenant: context.tenant,\n authKind: context.authKind,\n };\n if (context.siteCode !== undefined) {\n meta.siteCode = context.siteCode;\n }\n if (context.language !== undefined) {\n meta.language = context.language;\n }\n return [\"emporix\", resource, ...args, meta] as const;\n}\n\n/** Which site discriminators go into the query key's meta object. */\nexport type SiteFields = \"full\" | \"language\" | \"none\";\n\n/**\n * Builds the site portion of a query key's meta object. Shared by every read\n * path — React's `useEmporixQuery`, its `prefetchEmporix`, and Angular's\n * `emporixQueryOptions` — so none of them can disagree about which\n * discriminators a resource carries. Key parity is structural, not tested.\n *\n * Note `null` is preserved rather than dropped: an unbound site is a distinct\n * cache identity from a bound one, and {@link emporixKey} only omits a field\n * when it is `undefined`.\n */\nexport function siteMeta(\n site: SiteFields,\n siteCode: string | null,\n language: string | null,\n): { siteCode?: string | null; language?: string | null } {\n return site === \"full\"\n ? { siteCode, language }\n : site === \"language\"\n ? { language }\n : {};\n}\n","/**\n * In-memory customer-session store, keyed by storage instance.\n *\n * Moved out of the React bindings: it is a subscribe/snapshot store over\n * {@link EmporixStorage} with no framework API in it. React consumes it through\n * `useSyncExternalStore`, Angular through a `signal` — the store itself does not\n * know or care, which is exactly why it does not belong in either binding.\n */\nimport type { EmporixStorage } from \"./session-storage\";\n\n/**\n * The three session tokens the customer session tracks. `token` is mirrored\n * from persistent storage; `refreshToken` and `saasToken` are in-memory only\n * (deliberately never persisted).\n */\nexport interface CustomerSessionState {\n token: string | null;\n refreshToken: string | null;\n saasToken: string | null;\n}\n\nexport interface CustomerSessionStore {\n getSnapshot: () => CustomerSessionState;\n setState: (\n next: CustomerSessionState | ((prev: CustomerSessionState) => CustomerSessionState),\n ) => void;\n subscribe: (listener: () => void) => () => void;\n}\n\n// One store per storage instance. The storage object is the stable per-app\n// identity (a WeakMap lets it be GC'd with the app; each test gets a fresh\n// storage → a fresh isolated store).\nconst stores = new WeakMap<EmporixStorage, CustomerSessionStore>();\n\n/**\n * Shared in-memory store for the customer session, keyed by the storage\n * instance. Every consumer reads and writes the same store, so a login in one\n * place (the auth form) is visible in another (the checkout page) — without\n * this, the in-memory `saasToken` lived in a single component's local state and\n * customer checkout would 401 elsewhere.\n */\nexport function getCustomerSessionStore(storage: EmporixStorage): CustomerSessionStore {\n const existing = stores.get(storage);\n if (existing) return existing;\n\n // Re-hydrate from storage so a page reload keeps the full session: `token`\n // and `refreshToken` are persisted by the storage adapter; `saasToken` is\n // too (when the adapter supports it) — the checkout `saas-token` header is\n // needed after a reload and the refresh endpoint cannot re-mint it.\n let state: CustomerSessionState = {\n token: storage.getCustomerToken(),\n refreshToken: storage.getRefreshToken(),\n saasToken: storage.getSaasToken?.() ?? null,\n };\n const listeners = new Set<() => void>();\n const store: CustomerSessionStore = {\n getSnapshot: () => state,\n setState: (next) => {\n const resolved =\n typeof next === \"function\"\n ? (next as (prev: CustomerSessionState) => CustomerSessionState)(state)\n : next;\n if (resolved === state) return;\n state = resolved;\n for (const listener of listeners) listener();\n },\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n // Mirror external token writes (login/logout from any consumer, telemetry-\n // driven flows) into the store, so EVERY subscriber observes token changes.\n // Lifetime: the subscription lives exactly as long as the storage instance\n // that owns this store.\n storage.subscribe?.((t) => {\n store.setState((s) => (s.token === t ? s : { ...s, token: t }));\n });\n stores.set(storage, store);\n return store;\n}\n","/** One Server-Sent Events frame. `data` is the concatenated data lines. */\nexport interface SseEvent {\n event?: string;\n data: string;\n id?: string;\n}\n\n/** Parse one frame (fields separated by \"\\n\"); returns undefined if it has no fields. */\nfunction parseFrame(frame: string): SseEvent | undefined {\n const ev: SseEvent = { data: \"\" };\n const dataLines: string[] = [];\n let saw = false;\n for (const line of frame.split(\"\\n\")) {\n if (line === \"\" || line.startsWith(\":\")) continue; // blank / comment\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) value = value.slice(1); // strip one leading space\n if (field === \"data\") {\n dataLines.push(value);\n saw = true;\n } else if (field === \"event\") {\n ev.event = value;\n saw = true;\n } else if (field === \"id\") {\n ev.id = value;\n saw = true;\n }\n }\n if (!saw) return undefined;\n ev.data = dataLines.join(\"\\n\");\n return ev;\n}\n\n/**\n * Parse an SSE byte stream (already decoded to text chunks) into events.\n * Buffers across chunk boundaries; frames are separated by a blank line.\n */\nexport async function* parseSseStream(\n chunks: AsyncIterable<string>,\n): AsyncIterable<SseEvent> {\n let buf = \"\";\n for await (const chunk of chunks) {\n buf += chunk.replace(/\\r\\n/g, \"\\n\");\n let idx: number;\n while ((idx = buf.indexOf(\"\\n\\n\")) !== -1) {\n const ev = parseFrame(buf.slice(0, idx));\n buf = buf.slice(idx + 2);\n if (ev) yield ev;\n }\n }\n const tail = parseFrame(buf);\n if (tail) yield tail;\n}\n","import {\n type AuthContext,\n type TokenProvider,\n type CustomerRefreshRegistry,\n resolveToken,\n} from \"./auth\";\nimport {\n errorFromResponse,\n EmporixAuthError,\n EmporixError,\n EmporixTimeoutError,\n EmporixNetworkError,\n} from \"./errors\";\nimport type { ResolvedProxyConfig } from \"./config\";\nimport type { Logger } from \"./logger\";\nimport { parseSseStream, type SseEvent } from \"./sse\";\n\n/** A single HTTP request through the SDK. */\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n path: string;\n auth: AuthContext;\n /**\n * Query parameters. Booleans are serialized with `String(v)`, so a facade can\n * pass one straight through instead of stringifying it at the call site.\n */\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Extra request headers (merged before auth; cannot override Authorization). */\n headers?: Record<string, string>;\n /** Per-request abort timeout override (ms). */\n timeoutMs?: number;\n /**\n * Marks this request as safe to retry on 5xx/429 despite a non-idempotent\n * method. GET/PUT/DELETE retry by default; POST/PATCH only with this flag\n * (a 5xx can arrive after the server already committed — retrying e.g.\n * placeOrder would duplicate the order/charge).\n */\n idempotent?: boolean;\n}\n\n/**\n * A successful response: the parsed body plus its headers.\n *\n * `Headers` rather than the whole `Response` on purpose — by the time this\n * returns, the body has been consumed, and a `Response` whose body cannot be\n * read again is a trap in a caller's hands.\n */\nexport interface HttpResult<T> {\n data: T;\n headers: Headers;\n}\n\n/** Construction options for {@link HttpClient}. */\nexport interface HttpClientOptions {\n host: string;\n /**\n * Tenant, emitted as `Emporix-Tenant` on every request.\n *\n * The tenant is already in the path of nearly every endpoint, so this looks\n * redundant — it is not. Emporix validates dashboard/IAM user tokens against\n * this header and answers 401 without it, even when `Authorization` is\n * correct. `@emporix/api-calls`, the client library the Management Dashboard\n * itself uses, sets it whenever a tenant is known.\n *\n * Optional so a bare `new HttpClient(...)` stays constructible; every client\n * built through `createCore` passes it.\n */\n tenant?: string;\n provider: TokenProvider;\n logger: Logger;\n retry: { maxAttempts: number };\n timeouts: { connectMs: number; readMs: number };\n /** Override the retry backoff delay (ms → Promise). Defaults to a real timer. */\n sleep?: (ms: number) => Promise<void>;\n /** Opt-in customer-token refresher registry (off unless a refresher is set). */\n customerRefresh?: CustomerRefreshRegistry;\n /**\n * Shared storefront request context. When `language` is set, every request\n * carries `Accept-Language: <language>`. Mutated at runtime via\n * `EmporixClient.setStorefrontContext({ language })`.\n */\n requestContext?: { language?: string | undefined };\n /**\n * Sent as `Content-Language` on every request that carries a body — see\n * `EmporixConfig.contentLanguage`. Reads and bodiless requests never get it.\n */\n contentLanguage?: string;\n /**\n * Replaces the global `fetch` for API requests. Not used by token requests\n * (`core/auth.ts`) or by {@link HttpClient.stream} — see `EmporixConfig.fetch`.\n */\n fetch?: typeof globalThis.fetch;\n /**\n * Proxy mode — see `EmporixConfig.proxy`. No token is resolved and no\n * `Authorization` header is sent; `headers` and `credentials` go on every\n * request, the stream included; a 401 calls `onUnauthorized` and throws.\n */\n proxy?: ResolvedProxyConfig;\n}\n\nlet requestSeq = 0;\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n/** Fetch wrapper: auth resolution, JSON parsing, typed error mapping, logging. */\nexport class HttpClient {\n private readonly sleep: (ms: number) => Promise<void>;\n /** Resolved request fetch. The arrow keeps `globalThis.fetch` correctly bound. */\n private readonly doFetch: typeof globalThis.fetch;\n constructor(private readonly opts: HttpClientOptions) {\n this.sleep =\n opts.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)));\n this.doFetch = opts.fetch ?? ((...args) => globalThis.fetch(...args));\n }\n\n /**\n * `null` in proxy mode, where no token is resolved at all — the provider is\n * never asked, so no token request can happen. A service context is refused\n * there rather than sent anonymously through the proxy.\n */\n private async tokenFor(o: RequestOptions): Promise<string | null> {\n if (!this.opts.proxy) return resolveToken(o.auth, this.opts.provider);\n if (o.auth.kind === \"service\") {\n throw new EmporixAuthError(\n `${o.method} ${o.path}: auth.service() is not available in proxy mode — service tokens ` +\n \"never belong in a browser. Make this call from your server.\",\n );\n }\n return null;\n }\n\n /** `host + path` plus query. A relative host (`/emporix`) resolves against the page origin. */\n private urlFor(o: RequestOptions): URL {\n const host = this.opts.host;\n let url: URL;\n if (host.startsWith(\"/\")) {\n const origin = (globalThis as { location?: { origin?: string } }).location?.origin;\n if (!origin) {\n throw new EmporixError(\n `host \"${host}\" is a path, which needs a page origin to resolve against, and ` +\n \"globalThis.location is not available here. Use an absolute host on a server.\",\n );\n }\n url = new URL(host + o.path, origin);\n } else {\n url = new URL(host + o.path);\n }\n for (const [k, v] of Object.entries(o.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n return url;\n }\n\n /** Proxy mode: report the 401 before it is thrown. A throwing callback must not mask it. */\n private reportUnauthorized(o: RequestOptions): void {\n try {\n this.opts.proxy?.onUnauthorized?.({ method: o.method, path: o.path });\n } catch {\n // The EmporixAuthError that follows is the signal the caller relies on.\n }\n }\n\n private buildHeaders(\n o: RequestOptions,\n token: string | null,\n isFormData: boolean,\n ): Record<string, string> {\n const headers: Record<string, string> = {\n // Before `o.headers` on purpose: a caller may override the tenant for a\n // single request, the way `Accept-Language` and `Content-Language` can be\n // overridden. Only `Authorization` is non-negotiable.\n ...(this.opts.tenant !== undefined ? { \"Emporix-Tenant\": this.opts.tenant } : {}),\n ...(this.opts.requestContext?.language\n ? { \"Accept-Language\": this.opts.requestContext.language }\n : {}),\n ...(this.opts.contentLanguage && o.body !== undefined\n ? { \"Content-Language\": this.opts.contentLanguage }\n : {}),\n ...(this.opts.proxy?.headers ?? {}),\n ...(o.headers ?? {}),\n ...(token !== null ? { Authorization: `Bearer ${token}` } : {}),\n // JSON bodies: set Content-Type. FormData bodies: let `fetch`\n // emit `multipart/form-data; boundary=...` itself.\n ...(o.body !== undefined && !isFormData\n ? { \"Content-Type\": \"application/json\" }\n : {}),\n };\n if (token === null) {\n // Proxy mode: no Authorization at all, not even one a caller passed in.\n for (const k of Object.keys(headers)) {\n if (k.toLowerCase() === \"authorization\") delete headers[k];\n }\n }\n return headers;\n }\n\n /** `fetch`'s `credentials` — set only in proxy mode, where the session cookie must go along. */\n private credentialsInit(): Pick<RequestInit, \"credentials\"> {\n return this.opts.proxy ? { credentials: this.opts.proxy.credentials } : {};\n }\n\n /**\n * Issues a request and returns the parsed body. Retries 5xx/429 on idempotent\n * methods and re-auths once on a 401 — see {@link send}.\n */\n async request<T = unknown>(o: RequestOptions): Promise<T> {\n return (await this.send<T>(o)).data;\n }\n\n /**\n * Like {@link request}, but also hands back the response headers.\n *\n * Emporix puts pagination metadata there — `X-Total-Count` and, on the schema\n * service's custom instances, `X-Next-Cursor` / `X-Prev-Cursor`. Facades\n * should reach for `core/paged.ts`'s `requestPage` rather than calling this\n * directly; it exists for metadata that does not fit the paginated shape.\n */\n async requestWithMeta<T = unknown>(o: RequestOptions): Promise<HttpResult<T>> {\n return this.send<T>(o);\n }\n\n private async send<T>(o: RequestOptions): Promise<HttpResult<T>> {\n const requestId = `req-${++requestSeq}`;\n const log = this.opts.logger.child({ requestId });\n const url = this.urlFor(o);\n const sdkManaged = o.auth.kind === \"service\" || o.auth.kind === \"anonymous\";\n const maxAttempts = this.opts.retry.maxAttempts;\n let reauthed = false;\n let customerToken = o.auth.kind === \"customer\" ? o.auth.token : undefined;\n let customerReauthed = false;\n\n for (let attempt = 1; ; attempt++) {\n const token =\n !this.opts.proxy && customerToken !== undefined ? customerToken : await this.tokenFor(o);\n log.debug(\"http request\", {\n authKind: o.auth.kind,\n method: o.method,\n url: url.pathname,\n attempt,\n });\n\n const controller = new AbortController();\n const overallMs = o.timeoutMs ?? this.opts.timeouts.readMs;\n // connectMs bounds time-to-headers (fetch resolving); the overall budget\n // bounds headers + body. timeoutMs overrides the overall budget only.\n const connectMs = Math.min(this.opts.timeouts.connectMs, overallMs);\n const timeoutMsg = `${o.method} ${o.path} timed out after ${overallMs}ms (connect budget ${connectMs}ms)`;\n let connectTimer: ReturnType<typeof setTimeout> | undefined;\n let overallTimer: ReturnType<typeof setTimeout> | undefined;\n // The overall budget is a rejecting promise raced against fetch + the\n // body read, not just an abort. An abort interrupts the connection but\n // does NOT reliably unblock an already-streaming body that stalls\n // mid-read — racing the timer guarantees the read is bounded regardless.\n const overallBudget = new Promise<never>((_, reject) => {\n overallTimer = setTimeout(() => {\n controller.abort();\n reject(new EmporixTimeoutError(timeoutMsg));\n }, overallMs);\n });\n connectTimer = setTimeout(() => controller.abort(), connectMs);\n const isFormData =\n typeof FormData !== \"undefined\" && o.body instanceof FormData;\n const init: RequestInit = {\n method: o.method,\n headers: this.buildHeaders(o, token, isFormData),\n signal: controller.signal,\n ...this.credentialsInit(),\n };\n if (o.body !== undefined) {\n init.body = isFormData ? (o.body as FormData) : JSON.stringify(o.body);\n }\n let res: Response;\n let text: string;\n try {\n res = await Promise.race([this.doFetch(url, init), overallBudget]);\n // Headers are in — the connect budget no longer applies; the body\n // read stays bounded by the overall budget timer.\n clearTimeout(connectTimer);\n connectTimer = undefined;\n const body = res.text();\n // Swallow a late body rejection if the budget timer wins the race,\n // so it doesn't surface as an unhandled rejection.\n body.catch(() => {});\n text = await Promise.race([body, overallBudget]);\n } catch (err) {\n if (err instanceof EmporixTimeoutError) throw err;\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(timeoutMsg);\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n } finally {\n if (connectTimer !== undefined) clearTimeout(connectTimer);\n if (overallTimer !== undefined) clearTimeout(overallTimer);\n }\n const parsed = text ? safeJson(text) : undefined;\n if (res.ok) {\n log.debug(\"http ok\", { status: res.status });\n return { data: parsed as T, headers: res.headers };\n }\n\n // 401 asymmetry.\n if (res.status === 401) {\n if (this.opts.proxy) {\n // The proxy owns the session: no token to re-mint, none to refresh.\n this.reportUnauthorized(o);\n throw errorFromResponse(res.status, `${o.method} ${o.path} → 401`, parsed);\n }\n if (sdkManaged && !reauthed) {\n reauthed = true;\n if (o.auth.kind === \"service\") {\n this.opts.provider.invalidate?.(o.auth.credentials ?? \"backend\");\n } else if (this.opts.provider.expireAnonymous) {\n // Keep the refresh token so the retry refreshes (same sessionId)\n // instead of starting a new anonymous session.\n this.opts.provider.expireAnonymous();\n } else {\n this.opts.provider.invalidateAnonymous?.();\n }\n log.warn(\"sdk-managed 401, re-authing once\", { authKind: o.auth.kind });\n continue;\n }\n if (\n o.auth.kind === \"customer\" &&\n !customerReauthed &&\n this.opts.customerRefresh?.enabled\n ) {\n customerReauthed = true;\n const fresh = await this.opts.customerRefresh.refresh(customerToken!);\n if (fresh) {\n customerToken = fresh;\n log.warn(\"customer 401, refreshed once\", { authKind: o.auth.kind });\n continue;\n }\n }\n throw errorFromResponse(res.status, `${o.method} ${o.path} → 401`, parsed);\n }\n\n // Retry 5xx / 429 — gated on idempotency: a 5xx can arrive AFTER the\n // server committed the write (e.g. placeOrder), so replaying a POST\n // could duplicate orders/charges. GET/PUT/DELETE are idempotent by\n // spec; POST/PATCH retry only when the caller opts in.\n const idempotent =\n o.method === \"GET\" ||\n o.method === \"PUT\" ||\n o.method === \"DELETE\" ||\n o.idempotent === true;\n const retryable = idempotent && (res.status >= 500 || res.status === 429);\n if (retryable && attempt < maxAttempts) {\n // headers.get() yields null when absent — Number(null) is 0, which\n // would short-circuit the exponential branch into a 0ms instant\n // retry. Only a non-empty header value counts.\n const retryAfterHeader = res.headers.get(\"Retry-After\");\n const retryAfter = retryAfterHeader ? Number(retryAfterHeader) : Number.NaN;\n const backoff =\n Number.isFinite(retryAfter) && retryAfter >= 0\n ? Math.min(retryAfter * 1000, 8000) // cap rogue Retry-After (e.g. 86400)\n : Math.min(1000 * 2 ** (attempt - 1), 8000) + Math.random() * 100;\n log.warn(\"retryable failure\", { status: res.status, attempt, backoffMs: backoff });\n await this.sleep(backoff);\n continue;\n }\n\n log.error(\"http error (final)\", { status: res.status, attempt });\n throw errorFromResponse(res.status, `${o.method} ${o.path} → ${res.status}`, parsed);\n }\n }\n\n /**\n * Single-shot fetch that returns the raw {@link Response} unparsed. Used by\n * endpoints whose responses are not JSON (binary downloads, redirect-only\n * endpoints). Skips the retry-on-5xx and 401-reauth-once paths intentionally\n * — those depend on parsing the JSON error body, which a raw consumer must\n * handle itself if needed. Auth resolution + timeout + logging are still\n * applied.\n *\n * `extra.redirect` is forwarded to `fetch` so callers can use `'manual'` to\n * capture 30x responses with their `Location` header (Node fetch exposes\n * the header in this mode; browser fetch returns an opaque response).\n */\n async requestRaw(\n o: RequestOptions,\n extra?: { redirect?: \"follow\" | \"manual\" | \"error\" },\n ): Promise<Response> {\n const requestId = `req-${++requestSeq}`;\n const log = this.opts.logger.child({ requestId });\n const url = this.urlFor(o);\n const token = await this.tokenFor(o);\n log.debug(\"http requestRaw\", {\n authKind: o.auth.kind,\n method: o.method,\n url: url.pathname,\n redirect: extra?.redirect ?? \"follow\",\n });\n const controller = new AbortController();\n const timer = setTimeout(\n () => controller.abort(),\n o.timeoutMs ?? this.opts.timeouts.readMs,\n );\n const isFormData =\n typeof FormData !== \"undefined\" && o.body instanceof FormData;\n const init: RequestInit = {\n method: o.method,\n headers: this.buildHeaders(o, token, isFormData),\n signal: controller.signal,\n ...(extra?.redirect ? { redirect: extra.redirect } : {}),\n ...this.credentialsInit(),\n };\n if (o.body !== undefined) {\n init.body = isFormData ? (o.body as FormData) : JSON.stringify(o.body);\n }\n let res: Response;\n try {\n res = await this.doFetch(url, init);\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(\n `${o.method} ${o.path} timed out after ${o.timeoutMs ?? this.opts.timeouts.readMs}ms`,\n );\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n } finally {\n clearTimeout(timer);\n }\n // Proxy mode maps a 401 here too: every path reports it the same way.\n if (this.opts.proxy && res.status === 401) {\n this.reportUnauthorized(o);\n const text = await res.text().catch(() => \"\");\n throw errorFromResponse(401, `${o.method} ${o.path} → 401`, text ? safeJson(text) : undefined);\n }\n return res;\n }\n\n /**\n * Open a Server-Sent Events stream (`text/event-stream`) and yield parsed\n * events. Unlike {@link request}, no overall read budget applies (streams are\n * long-lived) — only `connectMs` bounds time-to-headers, and the consumer\n * breaking the iterator aborts the fetch. Like {@link requestRaw}, it does\n * NOT retry or re-auth on 401; a non-2xx maps to a typed error before the\n * stream begins.\n */\n async *requestStream(o: RequestOptions): AsyncIterable<SseEvent> {\n const log = this.opts.logger.child({ requestId: `req-${++requestSeq}` });\n const url = this.urlFor(o);\n const token = await this.tokenFor(o);\n const controller = new AbortController();\n const connectTimer = setTimeout(() => controller.abort(), this.opts.timeouts.connectMs);\n const headers = this.buildHeaders(o, token, false);\n headers[\"Accept\"] = \"text/event-stream\";\n let res: Response;\n try {\n res = await fetch(url, {\n method: o.method,\n headers,\n signal: controller.signal,\n ...(o.body !== undefined ? { body: JSON.stringify(o.body) } : {}),\n ...this.credentialsInit(),\n });\n } catch (err) {\n clearTimeout(connectTimer);\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(`${o.method} ${o.path} timed out opening stream`);\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n }\n clearTimeout(connectTimer);\n if (!res.ok) {\n if (this.opts.proxy && res.status === 401) this.reportUnauthorized(o);\n const text = await res.text().catch(() => \"\");\n throw errorFromResponse(\n res.status,\n `${o.method} ${o.path} → ${res.status}`,\n text ? safeJson(text) : undefined,\n );\n }\n log.debug(\"http stream open\", { status: res.status });\n if (!res.body) return;\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n async function* readChunks(): AsyncIterable<string> {\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n yield decoder.decode(value, { stream: true });\n }\n } finally {\n controller.abort(); // cancel the fetch if the consumer breaks early\n }\n }\n yield* parseSseStream(readChunks());\n }\n}\n","{\n \"name\": \"@viu/emporix-sdk\",\n \"version\": \"4.11.0\",\n \"description\": \"TypeScript SDK for the Emporix Commerce Engine\",\n \"license\": \"MIT\",\n \"author\": {\n \"name\": \"viu\",\n \"url\": \"https://github.com/viuteam\"\n },\n \"homepage\": \"https://github.com/viuteam/emporix-sdk#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/viuteam/emporix-sdk.git\",\n \"directory\": \"packages/sdk\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/viuteam/emporix-sdk/issues\"\n },\n \"keywords\": [\n \"emporix\",\n \"ecommerce\",\n \"commerce\",\n \"sdk\",\n \"typescript\",\n \"storefront\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./customer\": {\n \"types\": \"./dist/customer.d.ts\",\n \"import\": \"./dist/customer.js\",\n \"require\": \"./dist/customer.cjs\"\n },\n \"./product\": {\n \"types\": \"./dist/product.d.ts\",\n \"import\": \"./dist/product.js\",\n \"require\": \"./dist/product.cjs\"\n },\n \"./category\": {\n \"types\": \"./dist/category.d.ts\",\n \"import\": \"./dist/category.js\",\n \"require\": \"./dist/category.cjs\"\n },\n \"./cart\": {\n \"types\": \"./dist/cart.d.ts\",\n \"import\": \"./dist/cart.js\",\n \"require\": \"./dist/cart.cjs\"\n },\n \"./checkout\": {\n \"types\": \"./dist/checkout.d.ts\",\n \"import\": \"./dist/checkout.js\",\n \"require\": \"./dist/checkout.cjs\"\n },\n \"./payment\": {\n \"types\": \"./dist/payment.d.ts\",\n \"import\": \"./dist/payment.js\",\n \"require\": \"./dist/payment.cjs\"\n },\n \"./price\": {\n \"types\": \"./dist/price.d.ts\",\n \"import\": \"./dist/price.js\",\n \"require\": \"./dist/price.cjs\"\n },\n \"./media\": {\n \"types\": \"./dist/media.d.ts\",\n \"import\": \"./dist/media.js\",\n \"require\": \"./dist/media.cjs\"\n },\n \"./segment\": {\n \"types\": \"./dist/segment.d.ts\",\n \"import\": \"./dist/segment.js\",\n \"require\": \"./dist/segment.cjs\"\n },\n \"./companies\": {\n \"types\": \"./dist/companies.d.ts\",\n \"import\": \"./dist/companies.js\",\n \"require\": \"./dist/companies.cjs\"\n },\n \"./contacts\": {\n \"types\": \"./dist/contacts.d.ts\",\n \"import\": \"./dist/contacts.js\",\n \"require\": \"./dist/contacts.cjs\"\n },\n \"./locations\": {\n \"types\": \"./dist/locations.d.ts\",\n \"import\": \"./dist/locations.js\",\n \"require\": \"./dist/locations.cjs\"\n },\n \"./customer-groups\": {\n \"types\": \"./dist/customer-groups.d.ts\",\n \"import\": \"./dist/customer-groups.js\",\n \"require\": \"./dist/customer-groups.cjs\"\n },\n \"./orders\": {\n \"types\": \"./dist/orders.d.ts\",\n \"import\": \"./dist/orders.js\",\n \"require\": \"./dist/orders.cjs\"\n },\n \"./availability\": {\n \"types\": \"./dist/availability.d.ts\",\n \"import\": \"./dist/availability.js\",\n \"require\": \"./dist/availability.cjs\"\n }\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run --coverage\",\n \"lint\": \"eslint src\",\n \"typecheck\": \"tsc --noEmit\",\n \"check:treeshake\": \"node scripts/check-treeshake.mjs\",\n \"fetch:specs\": \"tsx scripts/fetch-specs.ts\",\n \"generate\": \"tsx scripts/generate.ts\"\n },\n \"devDependencies\": {\n \"@hey-api/openapi-ts\": \"^0.97.3\",\n \"@types/node\": \"^24.0.0\",\n \"@typescript-eslint/eslint-plugin\": \"^8.0.0\",\n \"@typescript-eslint/parser\": \"^8.0.0\",\n \"@vitest/coverage-v8\": \"^4.1.12\",\n \"eslint\": \"^9.0.0\",\n \"msw\": \"^2.4.0\",\n \"prettier\": \"^3.3.0\",\n \"tsup\": \"^8.2.0\",\n \"tsx\": \"^4.19.0\",\n \"typescript\": \"^5.6.0\",\n \"vitest\": \"^4.1.12\"\n }\n}\n","import { version } from \"../package.json\";\n\n/**\n * The published `@viu/emporix-sdk` version, surfaced on every log line as\n * `sdkVersion`. Read from `package.json` so it always matches the released\n * package; esbuild inlines the literal at build time (browser-safe — no\n * runtime filesystem access).\n */\nexport const SDK_VERSION: string = version;\n","import {\n validateConfig,\n type EmporixConfig,\n type EmporixUnauthorizedInfo,\n type ResolvedConfig,\n} from \"./config\";\nimport {\n DefaultTokenProvider,\n CustomerRefreshRegistry,\n type TokenProvider,\n type CustomerTokenRefresher,\n} from \"./auth\";\nimport { HttpClient } from \"./http\";\nimport { createProxyModeTokenProvider } from \"./proxy\";\nimport { createListenerSet } from \"./browser-storage\";\nimport {\n LevelResolver,\n createConsoleLogger,\n createNoopLogger,\n type Logger,\n type LogLevel,\n type ServiceName,\n type LoggerObjectConfig,\n} from \"./logger\";\nimport type { ClientContext } from \"./context\";\nimport { SDK_VERSION } from \"../version\";\n\n/** The service-agnostic core shared by `EmporixClient` and `createEmporixClient`. */\nexport interface EmporixCore {\n readonly tenant: string;\n readonly config: ResolvedConfig;\n readonly tokenProvider: TokenProvider;\n setStorefrontContext(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n language?: string;\n }): void;\n setLogLevel(level: LogLevel, opts?: { service?: ServiceName; force?: boolean }): void;\n getLogLevel(service: ServiceName): LogLevel;\n setCustomerTokenRefresher(refresher: CustomerTokenRefresher | null): void;\n /**\n * Proxy mode: subscribes to the 401s the proxy answers, next to\n * `config.proxy.onUnauthorized`. Returns the unsubscribe function. Never fires\n * outside proxy mode — there a 401 is answered by re-authenticating.\n */\n onUnauthorized(listener: (info: EmporixUnauthorizedInfo) => void): () => void;\n /** Internal: builds a per-service ClientContext (logger child + HttpClient). */\n mk(service: ServiceName): ClientContext;\n}\n\n/** Validates config and assembles the shared infrastructure (no services). */\nexport function createCore(config: EmporixConfig): EmporixCore {\n const cfg = validateConfig(config);\n\n let loggerObj: LoggerObjectConfig = {};\n let baseLogger: Logger | undefined;\n if (cfg.logger === false) {\n baseLogger = createNoopLogger();\n } else if (cfg.logger && typeof (cfg.logger as Logger).child === \"function\") {\n baseLogger = cfg.logger as Logger;\n } else if (cfg.logger) {\n loggerObj = cfg.logger as LoggerObjectConfig;\n }\n const resolver = new LevelResolver(loggerObj);\n const root =\n baseLogger ??\n createConsoleLogger(resolver, {\n sdk: \"emporix\",\n sdkVersion: SDK_VERSION,\n tenant: cfg.tenant,\n });\n\n const tokenProvider: TokenProvider = cfg.proxy\n ? createProxyModeTokenProvider()\n : (cfg.tokenProvider ?? new DefaultTokenProvider(cfg));\n const customerRefresh = new CustomerRefreshRegistry();\n const unauthorized = createListenerSet<EmporixUnauthorizedInfo>();\n const proxy = cfg.proxy && {\n ...cfg.proxy,\n onUnauthorized: (info: EmporixUnauthorizedInfo) => {\n try {\n cfg.proxy?.onUnauthorized?.(info);\n } finally {\n unauthorized.notify(info);\n }\n },\n };\n const requestContext: { language?: string | undefined } = {\n language: cfg.credentials.storefront?.context?.language,\n };\n\n const mk = (service: ServiceName): ClientContext => ({\n tenant: cfg.tenant,\n tokenProvider,\n logger: root.child({ service }),\n http: new HttpClient({\n host: cfg.host,\n tenant: cfg.tenant,\n provider: tokenProvider,\n logger: root.child({ service: \"http\" }),\n retry: cfg.retry,\n timeouts: cfg.timeouts,\n customerRefresh,\n requestContext,\n // exactOptionalPropertyTypes: `{ fetch: undefined }` is a type error\n // against `fetch?: typeof globalThis.fetch`, so spread conditionally.\n ...(cfg.fetch !== undefined ? { fetch: cfg.fetch } : {}),\n ...(cfg.contentLanguage !== undefined ? { contentLanguage: cfg.contentLanguage } : {}),\n ...(proxy ? { proxy } : {}),\n }),\n });\n\n return {\n tenant: cfg.tenant,\n config: cfg,\n tokenProvider,\n mk,\n setStorefrontContext(ctx) {\n if (ctx.language !== undefined) {\n requestContext.language = ctx.language || undefined;\n }\n const { language: _language, ...priceContext } = ctx;\n if (Object.keys(priceContext).length > 0) {\n tokenProvider.setAnonymousContext?.(priceContext);\n }\n },\n setLogLevel(level, opts = {}) {\n resolver.set(level, opts.service, opts.force ?? false);\n },\n getLogLevel(service) {\n return resolver.get(service);\n },\n setCustomerTokenRefresher(refresher) {\n customerRefresh.set(refresher);\n },\n onUnauthorized(listener) {\n return unauthorized.add(listener);\n },\n };\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 } from \"../core/context\";\nimport type { AuthContext, AnonymousSession } from \"../core/auth\";\nimport { EmporixAuthError } from \"../core/errors\";\nimport { requireCustomer } from \"../core/require-customer\";\nimport type {\n Customer as GeneratedCustomer,\n Address as GeneratedAddress,\n CustomerSignup,\n CustomerUpdateDto,\n PasswordChangeDto,\n PasswordResetRequestDto,\n PasswordUpdate,\n AddressCreateDto,\n AddressUpdateDto,\n ChangeEmailRequestDto,\n UpdateEmail,\n RefreshToken,\n ValidateTokenResponse,\n} from \"../generated/customer\";\n\n/**\n * Caller-owned customer session. Maps the Emporix `CustomerToken` wire shape to\n * idiomatic names: `access_token` → `customerToken`, `saas_token` →\n * `saasToken`. `saasToken` is a JWT required for the checkout (`saas-token`\n * header). The wire's `*_token` (snake_case) fields are canonical; the\n * camelCase variants are deprecated in the Emporix spec.\n */\nexport interface CustomerSession {\n customerToken: string;\n /** JWT required for completing checkout (sent as the `saas-token` header). */\n saasToken: string;\n refreshToken: string;\n /** Same session as the anonymous token — preserves the cart across login. */\n sessionId: string | undefined;\n /** Customer access-token lifetime in seconds. */\n expiresIn: number | undefined;\n /** Only set by `socialLogin`: the IdP access token echoed by Emporix. */\n socialAccessToken?: string;\n /** Only set by `socialLogin`: the IdP ID token echoed by Emporix. */\n socialIdToken?: string;\n}\n\n/** Customer profile as returned by the Customer service (all generated fields). */\nexport type Customer = GeneratedCustomer;\n\n/** A customer address as returned by the Customer service (all generated fields). */\nexport type Address = GeneratedAddress;\n\n/** Generated request bodies (caller sends the exact wire shape). */\nexport type CustomerSignupInput = CustomerSignup;\nexport type CustomerUpdateInput = CustomerUpdateDto;\nexport type PasswordChangeInput = PasswordChangeDto;\nexport type PasswordResetRequestInput = PasswordResetRequestDto;\nexport type PasswordResetConfirmInput = PasswordUpdate;\nexport type AddressCreateInput = AddressCreateDto;\nexport type AddressUpdateInput = AddressUpdateDto;\nexport type ChangeEmailInput = ChangeEmailRequestDto;\nexport type ConfirmEmailChangeInput = UpdateEmail;\nexport type ResendActivationInput = RefreshToken;\n/**\n * What `validateToken` reports about a customer token: `scope` is the\n * space-separated scope list, plus `sessionId`, `email`, `legalEntityId` and\n * `expires_in`. Every field is optional upstream.\n */\nexport type CustomerTokenValidation = ValidateTokenResponse;\n\n/** Union of the wire shapes the four session endpoints return. snake_case is\n * canonical; camelCase is the deprecated fallback (vendored spec, design §2). */\ninterface WireSession {\n access_token?: string;\n saas_token?: string;\n refresh_token?: string;\n session_id?: string;\n expires_in?: string | number;\n accessToken?: string;\n saasToken?: string;\n refreshToken?: string;\n social_access_token?: string;\n social_id_token?: string;\n}\n\n/** Wire→facade mapping shared by login/refresh/socialLogin/exchangeToken.\n * Throws instead of fabricating an empty session: `customerToken: \"\"` would\n * read as authenticated downstream and 401-loop every subsequent call. */\nfunction toSession(\n endpoint: string,\n wire: WireSession,\n opts: { carrySaasToken?: string } = {},\n): CustomerSession {\n const customerToken = wire.access_token ?? wire.accessToken;\n if (!customerToken) {\n throw new EmporixAuthError(`${endpoint}: response missing access_token`, undefined, wire);\n }\n return {\n customerToken,\n saasToken: wire.saas_token ?? wire.saasToken ?? opts.carrySaasToken ?? \"\",\n refreshToken: wire.refresh_token ?? wire.refreshToken ?? \"\",\n sessionId: wire.session_id,\n expiresIn: wire.expires_in != null ? Number(wire.expires_in) : undefined,\n ...(wire.social_access_token ? { socialAccessToken: wire.social_access_token } : {}),\n ...(wire.social_id_token ? { socialIdToken: wire.social_id_token } : {}),\n };\n}\n\n/** Customer signup, session, profile and addresses. */\nexport class CustomerService {\n static readonly channel = \"customer\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Obtains an anonymous storefront session (accessToken + sessionId + refreshToken). */\n async anonymous(): Promise<AnonymousSession> {\n return this.ctx.tokenProvider.getAnonymousToken();\n }\n\n /** Registers a customer. Default auth: anonymous. */\n async signup(\n input: CustomerSignupInput,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<Customer> {\n return this.ctx.http.request<Customer>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/signup`,\n auth,\n body: input,\n });\n }\n\n /**\n * Logs a customer in. Threads the anonymous token so the session (and its\n * cart) survives — losing it silently creates a new session per Emporix docs.\n * Wire `accessToken` is mapped to `customerToken`.\n */\n async login(\n creds: { email: string; password: string },\n opts: { anonymousToken?: string } = {},\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<CustomerSession> {\n const effective: AuthContext = opts.anonymousToken\n ? { kind: \"raw\", token: opts.anonymousToken }\n : auth;\n const wire = await this.ctx.http.request<WireSession>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/login`,\n auth: effective,\n body: creds,\n });\n return toSession(\"login\", wire);\n }\n\n /**\n * Refreshes an authenticated customer session via its refresh token,\n * preserving the same `sessionId`. Calls\n * `GET /customer/{tenant}/refreshauthtoken?refreshToken=…`, which **must be\n * authorized with an anonymous token** (default auth: anonymous) — not the\n * expired customer token. The refresh response does **not** include a\n * `saas_token`; pass the original `saasToken` to carry it forward (it has\n * its own, independent lifetime).\n */\n async refresh(\n input: { refreshToken: string; saasToken?: string; legalEntityId?: string },\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<CustomerSession> {\n const query: Record<string, string> = { refreshToken: input.refreshToken };\n if (input.legalEntityId) query.legalEntityId = input.legalEntityId;\n const wire = await this.ctx.http.request<WireSession>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/refreshauthtoken`,\n query,\n auth,\n });\n // Refresh does not return a saas_token — carry the original forward.\n return toSession(\n \"refresh\",\n wire,\n input.saasToken !== undefined ? { carrySaasToken: input.saasToken } : {},\n );\n }\n\n /**\n * Logs the customer out server-side: `GET /customer/{tenant}/logout?\n * accessToken=…` authorized with the customer token. Invalidates the\n * access token (204 No Content). Requires customer/raw auth — the token is\n * sent both as the bearer and the `accessToken` query param (per Emporix).\n */\n async logout(auth?: AuthContext): Promise<void> {\n const ctx = requireCustomer(auth);\n const token = (ctx as { token: string }).token;\n await this.ctx.http.request<void>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/logout`,\n query: { accessToken: token },\n auth: ctx,\n });\n }\n\n /**\n * Authorization-Code SSO: exchanges the IdP `code` for an Emporix customer\n * session via `POST /customer/{tenant}/socialLogin`. The browser performs\n * the IdP redirect itself; the SDK only does this Emporix exchange.\n * Default auth: anonymous (Emporix requires an anonymous Bearer). The\n * response has no `session_id` and returns `expires_in` as a string —\n * normalized to a number here.\n */\n async socialLogin(\n input: { code: string; redirectUri: string; codeVerifier?: string; sessionId?: string },\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<CustomerSession> {\n const query: Record<string, string> = {\n code: input.code,\n redirect_uri: input.redirectUri,\n };\n if (input.codeVerifier) query.code_verifier = input.codeVerifier;\n const wire = await this.ctx.http.request<WireSession>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/socialLogin`,\n query,\n auth,\n ...(input.sessionId ? { headers: { \"session-id\": input.sessionId } } : {}),\n });\n return toSession(\"socialLogin\", wire);\n }\n\n /**\n * RFC 8693 token exchange: exchanges an external IdP JWT for an Emporix\n * customer session via `POST /customer/{tenant}/exchangeauthtoken`.\n * Emporix uses a proprietary query-param wire (not the RFC form body).\n * Default auth: anonymous. `config` selects a site-specific IdP config\n * (multi-site); omit for the tenant default. Returns `session_id` and a\n * fresh `saas_token`; `expires_in` is an integer (normalized anyway).\n */\n async exchangeToken(\n input: { subjectToken: string; config?: string },\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<CustomerSession> {\n const query: Record<string, string> = { subjectAccessToken: input.subjectToken };\n if (input.config) query.config = input.config;\n const wire = await this.ctx.http.request<WireSession>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/exchangeauthtoken`,\n query,\n auth,\n });\n return toSession(\"exchangeToken\", wire);\n }\n\n /** Returns the authenticated customer. Requires customer/raw auth. */\n async me(auth?: AuthContext): Promise<Customer> {\n return this.ctx.http.request<Customer>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/me`,\n auth: requireCustomer(auth),\n });\n }\n\n /**\n * Validates a customer token and returns what the tenant knows about it —\n * `scope`, `sessionId`, `email`, `legalEntityId`, `expires_in`\n * (`GET /validateauthtoken`). Requires customer/raw auth.\n *\n * An invalid or expired token answers `401`, which surfaces as\n * {@link EmporixAuthError} rather than a falsy result: this is a check, not a\n * predicate. Reach for it when you hold a token from elsewhere — an SSO\n * exchange, a Managed Dashboard host — and need its scopes before deciding\n * what to render, instead of discovering them from a failed call.\n */\n async validateToken(auth?: AuthContext): Promise<CustomerTokenValidation> {\n return this.ctx.http.request<CustomerTokenValidation>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/validateauthtoken`,\n auth: requireCustomer(auth),\n });\n }\n\n /** Updates the authenticated customer. Requires customer/raw auth. */\n async update(patch: CustomerUpdateInput, auth?: AuthContext): Promise<Customer> {\n return this.ctx.http.request<Customer>({\n method: \"PUT\",\n path: `/customer/${this.ctx.tenant}/me`,\n auth: requireCustomer(auth),\n body: patch,\n });\n }\n\n /** Changes the password. Requires customer/raw auth. */\n async changePassword(input: PasswordChangeInput, auth?: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/password/change`,\n auth: requireCustomer(auth),\n body: input,\n });\n }\n\n /** Requests a password reset email. Default auth: anonymous. */\n async requestPasswordReset(\n input: PasswordResetRequestInput,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/password/reset`,\n auth,\n body: input,\n });\n }\n\n /** Confirms a password reset. Default auth: anonymous. */\n async confirmPasswordReset(\n input: PasswordResetConfirmInput,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/password/reset/update`,\n auth,\n body: input,\n });\n }\n\n /**\n * Completes double opt-in signup with the emailed token, creating the account\n * and returning a logged-in {@link CustomerSession}. Default auth: anonymous.\n */\n async confirmSignup(\n token: string,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<CustomerSession> {\n const wire = await this.ctx.http.request<WireSession>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/signup/optin/${encodeURIComponent(token)}`,\n auth,\n });\n return toSession(\"confirmSignup\", wire);\n }\n\n /** Resends the double opt-in activation link. Default auth: anonymous. */\n async resendActivation(\n input: ResendActivationInput,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/signup/optin/refresh_token`,\n auth,\n body: input,\n });\n }\n\n /** Requests a login-email change (emails a confirmation token). Requires customer/raw auth. */\n async changeEmail(input: ChangeEmailInput, auth?: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/me/accounts/internal/email/change`,\n auth: requireCustomer(auth),\n body: input,\n });\n }\n\n /** Confirms a login-email change with the emailed token. Default auth: anonymous. */\n async confirmEmailChange(\n input: ConfirmEmailChangeInput,\n auth: AuthContext = { kind: \"anonymous\" },\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/me/accounts/internal/email/change/confirm`,\n auth,\n body: input,\n });\n }\n\n /** Address sub-resource. All operations require customer/raw auth. */\n readonly addresses = {\n list: async (auth?: AuthContext): Promise<Address[]> =>\n this.ctx.http.request<Address[]>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/me/addresses`,\n auth: requireCustomer(auth),\n }),\n add: async (address: AddressCreateInput, auth?: AuthContext): Promise<Address> =>\n this.ctx.http.request<Address>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/me/addresses`,\n auth: requireCustomer(auth),\n body: address,\n }),\n update: async (id: string, patch: AddressUpdateInput, auth?: AuthContext): Promise<Address> =>\n this.ctx.http.request<Address>({\n method: \"PUT\",\n path: `/customer/${this.ctx.tenant}/me/addresses/${id}`,\n auth: requireCustomer(auth),\n body: patch,\n }),\n remove: async (id: string, auth?: AuthContext): Promise<void> =>\n this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/customer/${this.ctx.tenant}/me/addresses/${id}`,\n auth: requireCustomer(auth),\n }),\n get: async (id: string, auth?: AuthContext): Promise<Address> =>\n this.ctx.http.request<Address>({\n method: \"GET\",\n path: `/customer/${this.ctx.tenant}/me/addresses/${id}`,\n auth: requireCustomer(auth),\n }),\n addTags: async (id: string, tags: string[], auth?: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/customer/${this.ctx.tenant}/me/addresses/${id}/tags`,\n query: { tags: tags.join(\",\") },\n auth: requireCustomer(auth),\n });\n },\n removeTags: async (id: string, tags: string[], auth?: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/customer/${this.ctx.tenant}/me/addresses/${id}/tags`,\n query: { tags: tags.join(\",\") },\n auth: requireCustomer(auth),\n });\n },\n };\n}\n","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 {\n BasicProductWithId,\n BundleProductWithId,\n ParentVariantProductWithId,\n VariantProductWithId,\n DynamicVariantProductWithId,\n ProductMedia,\n ProductCreateBody,\n ProductUpdateBody,\n ProductPartialUpdateBody,\n ProductBulkCreateBody,\n ProductBulkUpdateBody,\n BulkResponse,\n ResourceLocation,\n DynamicVariantRecalculationRequest,\n DynamicVariantRecalculationResponse,\n DynamicVariantRecalculationJobResponse,\n DynamicVariantRecalculationJobStatus,\n ProductTemplateResponse,\n ProductTemplateCreation,\n ProductTemplateUpdate,\n} from \"../generated/product\";\n\nconst ANON: AuthContext = { kind: \"anonymous\" };\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** A product as returned by the Product service (all generated fields). */\nexport type Product =\n | BasicProductWithId\n | BundleProductWithId\n | ParentVariantProductWithId\n | ProductVariant;\n\n/**\n * A product below a parent: a `VARIANT` of a `PARENT_VARIANT` (`parentVariantId`),\n * or a `DYNAMIC_VARIANT` of any level (`parentVariantId` is the direct parent,\n * `parentVariantPath` lists every ancestor up to the root).\n */\nexport type ProductVariant = VariantProductWithId | DynamicVariantProductWithId;\n\n/** A single product media entry (generated; `ProductMedia` is the list type). */\nexport type Media = ProductMedia[number];\n\n/** Body for creating a product (`POST /products`) — any of the 5 product shapes. */\nexport type ProductCreateInput = ProductCreateBody;\n\n/** Body for a full product replace (`PUT /products/{id}`). */\nexport type ProductUpdateInput = ProductUpdateBody;\n\n/** Body for a partial product update (`PATCH /products/{id}`). */\nexport type ProductPatchInput = ProductPartialUpdateBody;\n\n/** Id/location envelope returned when a product is created. */\nexport type ProductCreated = ResourceLocation;\n\n/** Body for bulk-creating products (`POST /products/bulk`). */\nexport type ProductBulkCreateInput = ProductBulkCreateBody;\n\n/** Body for bulk-updating products (`PUT /products/bulk`). */\nexport type ProductBulkUpdateInput = ProductBulkUpdateBody;\n\n/** Per-entry result of a bulk product operation (207 Multi-Status). */\nexport type ProductBulkResult = BulkResponse;\n\n/** Body for triggering a dynamic-variant recalculation. */\nexport type ProductRecalculationInput = DynamicVariantRecalculationRequest;\n\n/** Result of triggering a recalculation — created jobs plus skipped product ids. */\nexport type ProductRecalculationResult = DynamicVariantRecalculationResponse;\n\n/** A dynamic-variant recalculation job. */\nexport type ProductRecalculationJob = DynamicVariantRecalculationJobResponse;\n\n/** Status of a recalculation job. */\nexport type ProductRecalculationJobStatus = DynamicVariantRecalculationJobStatus;\n\n/** A product template as returned by the Product service. */\nexport type ProductTemplate = ProductTemplateResponse;\n\n/** Body for creating a product template. */\nexport type ProductTemplateCreateInput = ProductTemplateCreation;\n\n/** Body for updating a product template (`PUT`, full replace). */\nexport type ProductTemplateUpdateInput = ProductTemplateUpdate;\n\n/** Id envelope returned when a product template is created. */\nexport type ProductTemplateCreated = { id?: string };\n\n/** Options shared by the product write endpoints. */\nexport interface ProductWriteOptions {\n skipVariantGeneration?: boolean;\n doIndex?: boolean;\n skipRelatedItemsValidation?: boolean;\n /**\n * `Content-Language` for this call, overriding `EmporixConfig.contentLanguage`:\n * `\"*\"` when `name`, `description` and the other localized fields are maps of\n * translations, a language code such as `\"de\"` when they are plain strings.\n */\n contentLanguage?: string;\n}\n\n/** Catalog reads. Default auth: anonymous; pass customer for personalized pricing. */\nexport class ProductService {\n static readonly channel = \"product\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Fetches one product by id. */\n async get(productId: string, auth?: AuthContext): Promise<Product>;\n /** @deprecated The second parameter is unused — pass the auth context second: `get(id, auth)`. */\n async get(productId: string, opts: Record<string, never> | undefined, auth?: AuthContext): Promise<Product>;\n async get(\n productId: string,\n authOrOpts?: AuthContext | Record<string, never>,\n legacyAuth?: AuthContext,\n ): Promise<Product> {\n // The legacy options slot is `{}` or `undefined`; an auth context always has a `kind`.\n const auth =\n legacyAuth ?? (authOrOpts !== undefined && \"kind\" in authOrOpts ? (authOrOpts as AuthContext) : ANON);\n return this.ctx.http.request<Product>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products/${productId}`,\n auth,\n });\n }\n\n /** Fetches one product by its code. */\n async getByCode(code: string, auth: AuthContext = ANON): Promise<Product> {\n const rows = await this.ctx.http.request<Product[]>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products`,\n query: { q: `code:${code}` },\n auth,\n });\n const first = rows[0];\n if (!first) throw new Error(`No product with code \"${code}\"`);\n return first;\n }\n\n /** One page of products. */\n async list(\n params: { pageNumber?: number; pageSize?: number; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Product>> {\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Product>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products`,\n query: { 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 product across pages. */\n listAll(params: { pageSize?: number } = {}, auth: AuthContext = ANON): AsyncIterable<Product> {\n const pageSize = params.pageSize ?? 50;\n return iterateAll<Product>((pageNumber) => this.list({ pageNumber, pageSize }, auth));\n }\n\n /**\n * Searches products by a `q` filter — a raw Emporix DSL string or a built\n * filter (e.g. `@viu/emporix-mixins`' `mixinQuery(...)`). Product supports\n * `compoundLogicalQuery`, so `or()` filters are allowed.\n */\n async search(\n query: QueryFor<\"PRODUCT\">,\n params: { pageNumber?: number; pageSize?: number; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Product>> {\n const q = resolveQuery(query, { compoundLogicalQuery: true });\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Product>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products`,\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 /**\n * Free-text product search by name. The product `q` is a `field:value` DSL,\n * so a bare term (e.g. \"in time\") 400s with \"No value for key …\". This builds\n * a `name:(~<term>)` regex filter (regex metacharacters escaped) and delegates\n * to {@link search}.\n *\n * Safe for text a shopper typed: `( ) \"` are **removed** rather than escaped,\n * because Emporix parses the filter's own structure before it looks at the\n * regex. `name:(~a \\()` is rejected with «Missing closing parenthesis in value»\n * even though the paren is escaped, so a search box would 400 on an opening\n * bracket. Measured against a live tenant on 2026-08-03: of every regex\n * metacharacter only those three break; the rest survive escaping.\n *\n * A query consisting solely of those characters leaves nothing to search for and\n * returns an empty page without a request — `name:(~)` is a 400.\n */\n async searchByName(\n query: string,\n // Makes no request of its own — `totalCount` is here purely so it can be\n // forwarded to `search`, which is where the header actually gets sent.\n params: { pageNumber?: number; pageSize?: number; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Product>> {\n // Replaced by a space rather than dropped, so «Access(JIT)» does not become\n // one run-together word — and then collapsed, because a leftover double space\n // is two LITERAL spaces in the regex and would match nothing.\n const term = query\n .replace(/[()\"]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (term === \"\") {\n // Defaults mirror `search`, so the shape matches a real answer.\n return {\n items: [],\n pageNumber: params.pageNumber ?? 1,\n pageSize: params.pageSize ?? 50,\n hasNextPage: false,\n };\n }\n const escaped = term.replace(/[.*+?^${}|[\\]\\\\]/g, \"\\\\$&\");\n return this.search(`name:(~${escaped})`, params, auth);\n }\n\n /**\n * Bulk fetch by id. POSTs `/products/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<Product[]> {\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<Product[]>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products/search`,\n query: { pageSize: chunk.length },\n auth,\n body: { q: `id:(${chunk.join(\",\")})` },\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n }),\n ),\n );\n return pages.flat();\n }\n\n /**\n * Bulk fetch by code. POSTs `/products/search` with `q=\"code:(c1,c2,…)\"`,\n * chunking when the list is larger than `options.chunkSize` (default 100).\n * Duplicate codes are de-duplicated. Codes containing query-delimiter\n * characters (`(`, `)`, `,`, whitespace, `\"`) are dropped with a logged\n * warning, because the Emporix `q` syntax uses them as delimiters and does\n * not support escaping them in a plain IN-list. An empty list — or one with\n * no safe codes — short-circuits with no HTTP call. **Order is not\n * guaranteed** across chunks — re-index by `code` if order matters.\n */\n async searchByCodes(\n codes: string[],\n options: { chunkSize?: number } = {},\n auth: AuthContext = ANON,\n ): Promise<Product[]> {\n const unique = [...new Set(codes)];\n const unsafe = /[(),\"\\s]/;\n const safe = unique.filter((c) => !unsafe.test(c));\n const dropped = unique.filter((c) => unsafe.test(c));\n if (dropped.length > 0) {\n this.ctx.logger.warn(\n \"products.searchByCodes: dropped codes containing query-delimiter characters\",\n { dropped },\n );\n }\n if (safe.length === 0) return [];\n const chunkSize = options.chunkSize ?? 100;\n const chunks: string[][] = [];\n for (let i = 0; i < safe.length; i += chunkSize) {\n chunks.push(safe.slice(i, i + chunkSize));\n }\n const pages = await Promise.all(\n chunks.map((chunk) =>\n this.ctx.http.request<Product[]>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products/search`,\n query: { pageSize: chunk.length },\n auth,\n body: { q: `code:(${chunk.join(\",\")})` },\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n }),\n ),\n );\n return pages.flat();\n }\n\n /**\n * Streams the variants below a product, page by page, in two searches: the\n * VARIANT children of a PARENT_VARIANT (`productType:VARIANT\n * parentVariantId:<id>`), then the DYNAMIC_VARIANT descendants of every level\n * (`parentVariantPath:<id>` — every ancestor is in the path). Only one of the\n * two finds anything for a given product. Default pageSize 200. The query\n * syntax (space-separated fields = implicit AND) is encapsulated here so\n * consumers don't build it themselves.\n */\n async *listVariantChildrenAll(\n parentVariantId: string,\n params: { pageSize?: number } = {},\n auth: AuthContext = ANON,\n ): AsyncIterable<ProductVariant> {\n const pageSize = params.pageSize ?? 200;\n for (const q of [\n `productType:VARIANT parentVariantId:${parentVariantId}`,\n `parentVariantPath:${parentVariantId}`,\n ]) {\n // Both queries can only match variants.\n yield* iterateAll((pageNumber) =>\n this.search(q, { pageNumber, pageSize }, auth) as Promise<PaginatedItems<ProductVariant>>,\n );\n }\n }\n\n /**\n * Resolves every variant below a product into a flat array (loads every\n * page): the VARIANT children of a PARENT_VARIANT, or the DYNAMIC_VARIANT\n * descendants of all levels — tell them apart by `parentVariantId` (the\n * direct parent) or pick the purchasable ones by `sellable`. Default pageSize\n * 200. Returns `[]` when there are none — never throws.\n */\n async listVariantChildren(\n parentVariantId: string,\n params: { pageSize?: number } = {},\n auth: AuthContext = ANON,\n ): Promise<ProductVariant[]> {\n const out: ProductVariant[] = [];\n for await (const child of this.listVariantChildrenAll(parentVariantId, params, auth)) {\n out.push(child);\n }\n return out;\n }\n\n // --- Admin writes. Default auth: service. ---\n\n /**\n * Creates a product (`POST /products`). Default auth: service. Accepts any of\n * the five product shapes (basic, bundle, parent-variant, variant,\n * dynamic-variant).\n */\n async create(\n input: ProductCreateInput,\n options: ProductWriteOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ProductCreated> {\n const query = {\n ...(options.skipVariantGeneration === undefined ? {} : { skipVariantGeneration: String(options.skipVariantGeneration) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n ...(options.skipRelatedItemsValidation === undefined ? {} : { skipRelatedItemsValidation: String(options.skipRelatedItemsValidation) }),\n };\n return this.ctx.http.request<ProductCreated>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Partially updates a product (`PATCH /products/{productId}`). Default auth:\n * service. Use {@link replace} for a full replace (PUT).\n *\n * Omitted fields stay as they are. **Mixins merge rather than replace**, and\n * the corollary catches people out: there is no way to delete a mixin here.\n * - a mixin name you omit stays on the product;\n * - fields you send inside a mixin are merged recursively, and fields you\n * omit inside that mixin keep their values;\n * - `null` does **not** delete a mixin — it stores `null` as its value.\n *\n * To actually remove one, read the product and send it back through\n * {@link replace} with `partial: false`, leaving the mixin out of both\n * `mixins` and `metadata.mixins`.\n *\n * Despite the HTTP verb this is **not** a JSON-Patch endpoint: an op-array of\n * `{ op, path, value }` is rejected. Send a partial product document.\n */\n async update(\n productId: string,\n input: ProductPatchInput,\n options: ProductWriteOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n const query = {\n ...(options.skipVariantGeneration === undefined ? {} : { skipVariantGeneration: String(options.skipVariantGeneration) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n ...(options.skipRelatedItemsValidation === undefined ? {} : { skipRelatedItemsValidation: String(options.skipRelatedItemsValidation) }),\n };\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/product/${this.ctx.tenant}/products/${productId}`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Full-replaces a product (`PUT /products/{productId}`). Returns the created\n * resource on 201 (upsert) and nothing on 204. `options.partial` sends\n * `?partial=true` for a merge-style replace. Default auth: service.\n *\n * With `partial: false` (the default) the body must be the **complete**\n * product document, and any mixin name missing from it is removed — which is\n * what makes this the only way to delete a mixin, since {@link update} merges\n * them. The flip side is that a body you did not build from a fresh read will\n * silently drop mixins.\n */\n async replace(\n productId: string,\n input: ProductUpdateInput,\n options: ProductWriteOptions & { partial?: boolean } = {},\n auth: AuthContext = SERVICE,\n ): Promise<ProductCreated | void> {\n const query = {\n ...(options.partial === undefined ? {} : { partial: String(options.partial) }),\n ...(options.skipVariantGeneration === undefined ? {} : { skipVariantGeneration: String(options.skipVariantGeneration) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n ...(options.skipRelatedItemsValidation === undefined ? {} : { skipRelatedItemsValidation: String(options.skipRelatedItemsValidation) }),\n };\n return this.ctx.http.request<ProductCreated | void>({\n method: \"PUT\",\n path: `/product/${this.ctx.tenant}/products/${productId}`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Deletes a product (`DELETE /products/{productId}`). `options.force` deletes\n * even when the product is referenced. Default auth: service.\n */\n async delete(\n productId: string,\n options: { force?: boolean; doIndex?: boolean } = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n const query = {\n ...(options.force === undefined ? {} : { force: String(options.force) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n };\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/product/${this.ctx.tenant}/products/${productId}`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n auth,\n });\n }\n\n /**\n * Bulk-creates products (`POST /products/bulk`). Responds 207 Multi-Status:\n * partial failures do **not** throw — inspect each entry. Default auth: service.\n */\n async bulkCreate(\n input: ProductBulkCreateInput,\n options: ProductWriteOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ProductBulkResult[]> {\n const query = {\n ...(options.skipVariantGeneration === undefined ? {} : { skipVariantGeneration: String(options.skipVariantGeneration) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n ...(options.skipRelatedItemsValidation === undefined ? {} : { skipRelatedItemsValidation: String(options.skipRelatedItemsValidation) }),\n };\n return this.ctx.http.request<ProductBulkResult[]>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products/bulk`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Bulk-updates products (`PUT /products/bulk`). Responds 207 Multi-Status:\n * partial failures do **not** throw — inspect each entry. Default auth: service.\n */\n async bulkUpdate(\n input: ProductBulkUpdateInput,\n options: ProductWriteOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ProductBulkResult[]> {\n const query = {\n ...(options.skipVariantGeneration === undefined ? {} : { skipVariantGeneration: String(options.skipVariantGeneration) }),\n ...(options.doIndex === undefined ? {} : { doIndex: String(options.doIndex) }),\n ...(options.skipRelatedItemsValidation === undefined ? {} : { skipRelatedItemsValidation: String(options.skipRelatedItemsValidation) }),\n };\n return this.ctx.http.request<ProductBulkResult[]>({\n method: \"PUT\",\n path: `/product/${this.ctx.tenant}/products/bulk`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(options.contentLanguage === undefined\n ? {}\n : { headers: { \"Content-Language\": options.contentLanguage } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Triggers a dynamic-variant recalculation for the given product ids\n * (`POST /products/recalculate`, 202). The result carries the created or\n * already-referenced `jobs` plus `skippedProductIds` — products whose root\n * already has a PENDING/PROCESSING job. Default auth: service.\n */\n async recalculate(\n input: ProductRecalculationInput,\n auth: AuthContext = SERVICE,\n ): Promise<ProductRecalculationResult> {\n return this.ctx.http.request<ProductRecalculationResult>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/products/recalculate`,\n body: input,\n auth,\n });\n }\n\n /** Lists dynamic-variant recalculation jobs, optionally filtered by status. Default auth: anonymous. */\n async listRecalculationJobs(\n params: { status?: ProductRecalculationJobStatus } = {},\n auth: AuthContext = ANON,\n ): Promise<ProductRecalculationJob[]> {\n return this.ctx.http.request<ProductRecalculationJob[]>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products/recalculate/jobs`,\n ...(params.status === undefined ? {} : { query: { status: params.status } }),\n auth,\n });\n }\n\n /** Fetches one dynamic-variant recalculation job by id. Default auth: anonymous. */\n async getRecalculationJob(jobId: string, auth: AuthContext = ANON): Promise<ProductRecalculationJob> {\n return this.ctx.http.request<ProductRecalculationJob>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/products/recalculate/jobs/${jobId}`,\n auth,\n });\n }\n\n /**\n * Product templates (`/product-templates`). Reads default to anonymous,\n * writes to service auth.\n */\n readonly templates = {\n /** One page of product templates. Default auth: anonymous. */\n list: async (\n params: { pageNumber?: number; pageSize?: number; sort?: string; q?: string } = {},\n auth: AuthContext = ANON,\n ): Promise<ProductTemplate[]> =>\n this.ctx.http.request<ProductTemplate[]>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/product-templates`,\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.q === undefined ? {} : { q: params.q }),\n },\n auth,\n }),\n\n /** Fetches one product template by id. Default auth: anonymous. */\n get: async (templateId: string, auth: AuthContext = ANON): Promise<ProductTemplate> =>\n this.ctx.http.request<ProductTemplate>({\n method: \"GET\",\n path: `/product/${this.ctx.tenant}/product-templates/${templateId}`,\n auth,\n }),\n\n /** Creates a product template. Default auth: service. */\n create: async (\n input: ProductTemplateCreateInput,\n auth: AuthContext = SERVICE,\n ): Promise<ProductTemplateCreated> =>\n this.ctx.http.request<ProductTemplateCreated>({\n method: \"POST\",\n path: `/product/${this.ctx.tenant}/product-templates`,\n body: input,\n auth,\n }),\n\n /** Full-replaces a product template (`PUT`). Default auth: service. */\n update: async (\n templateId: string,\n input: ProductTemplateUpdateInput,\n auth: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `/product/${this.ctx.tenant}/product-templates/${templateId}`,\n body: input,\n auth,\n });\n },\n\n /** Deletes a product template. Default auth: service. */\n delete: async (templateId: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/product/${this.ctx.tenant}/product-templates/${templateId}`,\n auth,\n });\n },\n };\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 GetCategoryTreeRetrieveCategoryTreeData,\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/** Filters for listing category trees (`GET /category-trees`). */\nexport type CategoryTreeListParams = NonNullable<GetCategoryTreeRetrieveCategoryTreeData[\"query\"]>;\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 * To filter by category type, category ids or publication, use {@link listTrees}.\n */\n async tree(auth: AuthContext = ANON): Promise<CategoryNode[]> {\n return this.listTrees({}, auth);\n }\n\n /**\n * The category trees, filtered (`GET /category-trees`). Default auth: anonymous.\n * {@link tree} is this call without filters.\n *\n * - `categoryIds` goes out comma-joined, because the HTTP layer sends one value\n * per key. Emporix reads `a,b` like the repeated `categoryIds=a&categoryIds=b`;\n * both were probed on `viu` on 2026-10-27. An empty list matches nothing and\n * sends no request.\n * - `showUnpublished` needs `category.category_read_unpublished`. An anonymous\n * token does not carry it, and Emporix answers **403**.\n * - Filter by `type` with care. On `viu` on 2026-10-27, 27 trees built from\n * categories that all read `STANDARD` came back for neither `STANDARD` nor\n * `CLASSIFICATION`, only unfiltered.\n */\n async listTrees(\n params: CategoryTreeListParams = {},\n auth: AuthContext = ANON,\n ): Promise<CategoryNode[]> {\n if (params.categoryIds?.length === 0) return [];\n return this.ctx.http.request<CategoryNode[]>({\n method: \"GET\",\n path: `/category/${this.ctx.tenant}/category-trees`,\n query: {\n type: params.type,\n categoryIds: params.categoryIds?.join(\",\"),\n showUnpublished: params.showUnpublished,\n },\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","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError, EmporixValidationError, errorFromResponse } from \"../core/errors\";\nimport type {\n Cart as GeneratedCart,\n CreateCart,\n CreatedCart,\n CartItemRequest,\n UpdateCartItem,\n AddressRequest,\n AppliedDiscount,\n BatchResponse as GeneratedBatchResponse,\n SingleBatchResponse as GeneratedSingleBatchResponse,\n CartValidationResult as GeneratedCartValidationResult,\n CartItemResponse,\n CartItemsBatchUpdateRequest,\n CartItemsBatchUpdateResponse,\n Search,\n CartGetAll,\n UpdateCart,\n DiscountResponse,\n CartDtRestrictions,\n Discount,\n ExecuteCommand,\n ExecuteCommandResult,\n ExecuteResponse,\n PostCartExecuteData,\n} from \"../generated/cart\";\n\n/** A cart as returned by the Cart service (all generated fields). */\nexport type Cart = GeneratedCart;\n\n/** The cart-create response (`{ cartId, yrn }`, generated). */\nexport type CartCreated = CreatedCart;\n\n/** Generated request bodies (caller sends the exact wire shape). */\nexport type CreateCartInput = CreateCart;\nexport type CartItemInput = CartItemRequest;\nexport type CartItemUpdate = UpdateCartItem;\n\n/** Per-entry result of `addItemsBatch`. `status` is HTTP-style per entry (e.g. 201 = added, 4xx = failed). */\nexport type CartItemBatchEntry = GeneratedSingleBatchResponse;\n/** Response shape of `addItemsBatch` — one entry per input item, matching by `index`. */\nexport type CartItemsBatchResponse = GeneratedBatchResponse;\n\n/** An address payload for cart shipping/billing (generated). */\nexport type CartAddress = AddressRequest;\n\n/** Result of validating a cart's items (generated). */\nexport type CartValidationResult = GeneratedCartValidationResult;\n\n/** A single cart item as returned by the Cart service (generated). */\nexport type CartItem = CartItemResponse;\n\n/** Request body for updating multiple cart items (generated). */\nexport type CartItemsBatchUpdateInput = CartItemsBatchUpdateRequest;\n\n/** Per-entry response for a multi-item update (generated). */\nexport type CartItemsBatchUpdateResult = CartItemsBatchUpdateResponse;\n\n/** Body for searching carts (`POST /carts/search`) — a `q` filter. */\nexport type CartSearchInput = Search;\n\n/** A cart summary as returned by `POST /carts/search`. */\nexport type CartSummary = CartGetAll;\n\n/** Body for a full cart update (`PUT /carts/{id}`). */\nexport type CartUpdateInput = UpdateCart;\n\n/** A discount entry as returned by `GET /carts/{id}/discounts`. */\nexport type CartDiscount = DiscountResponse;\n\n/** Lead-time and non-delivery-time restrictions for a cart (`GET …/dtRestrictions`). */\nexport type CartDeliveryRestrictions = CartDtRestrictions;\n\n/** Body for applying a discount (`POST /carts/{id}/discounts`, generated). */\nexport type CartDiscountInput = Discount;\n\n/**\n * Request body per command type of {@link CartService.execute}. The spec states\n * this only in prose — its `data` is an untyped object — so it is the one\n * hand-written piece. A command type missing here (one Emporix adds after this\n * was written) keeps the spec's untyped `data` and still works.\n */\nexport interface CartCommandBodies {\n AddCartItem: CartItemInput;\n UpdateCartItem: CartItemUpdate;\n AddCartItemsBatch: CartItemInput[];\n UpdateCartItemsBatch: CartItemsBatchUpdateInput;\n UpdateCart: CartUpdateInput;\n ApplyCartDiscount: CartDiscountInput;\n}\n\n/**\n * One command of a {@link CartService.execute} chain: `type` picks the REST\n * operation, `data` is that operation's request body, `options` holds its\n * remaining path and query parameters (`itemId`, `partial`, `expandCalculation`,\n * `zipCode`, `countryCode`, `resourceVersion`, `codes`, `discountIndex`). The\n * cart id is the `execute` path parameter, never a command field.\n *\n * `options` is the generated type, where every field is optional: `itemId`\n * (`UpdateCartItem`, `DeleteCartItem`) and `discountIndex` (`DeleteCartDiscount`)\n * are required by the server, which reports a missing one on that command.\n */\nexport type CartCommand = {\n [T in ExecuteCommand[\"type\"]]: Omit<ExecuteCommand, \"type\" | \"data\"> & { type: T } &\n (T extends keyof CartCommandBodies ? { data: CartCommandBodies[T] } : Pick<ExecuteCommand, \"data\">);\n}[ExecuteCommand[\"type\"]];\n\n/** `onError` and `versioning` of {@link CartService.execute} — both query parameters (generated). */\nexport type CartExecuteOptions = NonNullable<PostCartExecuteData[\"query\"]>;\n\n/** The `207` body of {@link CartService.execute}: one result per command that ran, in order (generated). */\nexport type CartExecuteResult = ExecuteResponse;\n\n/**\n * One entry of {@link CartExecuteResult}`.results`: `code`/`status` of the\n * equivalent REST call, and as `data` its response body — or its error body\n * when `code` is not 2xx; absent for a 204 (generated).\n */\nexport type CartCommandResult = ExecuteCommandResult;\n\nfunction requireCartAuth(auth: AuthContext | undefined): AuthContext {\n if (auth && (auth.kind === \"customer\" || auth.kind === \"anonymous\")) return auth;\n throw new EmporixValidationError(\n \"CartService requires an explicit { kind: 'customer' } or { kind: 'anonymous' } AuthContext\",\n );\n}\n\nfunction requireCustomerAuth(auth: AuthContext | undefined): AuthContext {\n if (auth && auth.kind === \"customer\") return auth;\n throw new EmporixValidationError(\"cart.merge requires a { kind: 'customer' } AuthContext\");\n}\n\n/** Cart operations. Every method requires an explicit customer/anonymous context. */\nexport class CartService {\n static readonly channel = \"cart\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/cart/${this.ctx.tenant}/carts`;\n }\n\n /** Creates a cart. */\n async create(\n input: CreateCartInput | undefined,\n auth: AuthContext,\n ): Promise<CartCreated> {\n return this.ctx.http.request<CartCreated>({\n method: \"POST\",\n path: this.base(),\n auth: requireCartAuth(auth),\n body: input ?? {},\n });\n }\n\n /** Fetches a cart by id. */\n async get(cartId: string, auth: AuthContext): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"GET\",\n path: `${this.base()}/${cartId}`,\n auth: requireCartAuth(auth),\n });\n }\n\n /** Returns the current cart for the session, or null if none. */\n /**\n * Get the customer / anonymous cart matching the given criteria. Per Emporix:\n * uniqueness is defined by `siteCode` + `type` + `legalEntityId` +\n * (`customerId` derived from a customer token, or `sessionId` derived from an\n * anonymous token). With `create: true`, Emporix creates a new cart if none\n * matches.\n *\n * Returns `null` on 404 (no cart found and `create` was not set). All other\n * errors are propagated.\n */\n async getCurrent(\n auth: AuthContext,\n opts: { siteCode: string; type?: string; legalEntityId?: string; create?: boolean },\n ): Promise<Cart | null> {\n const query: Record<string, string | number> = { siteCode: opts.siteCode };\n if (opts.type !== undefined) query.type = opts.type;\n if (opts.legalEntityId !== undefined) query.legalEntityId = opts.legalEntityId;\n if (opts.create) query.create = \"true\";\n try {\n return await this.ctx.http.request<Cart>({\n method: \"GET\",\n path: this.base(),\n query,\n auth: requireCartAuth(auth),\n });\n } catch (e) {\n if (e instanceof EmporixNotFoundError) return null;\n throw e;\n }\n }\n\n /** Adds an item. */\n async addItem(\n cartId: string,\n item: CartItemInput,\n auth: AuthContext,\n ): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"POST\",\n path: `${this.base()}/${cartId}/items`,\n auth: requireCartAuth(auth),\n body: item,\n });\n }\n\n /**\n * Adds multiple items in a single request via `POST /carts/{id}/itemsBatch`.\n * Server-side limit is 200 entries per call — callers handling larger sets\n * must chunk. The response carries a per-entry `status` (HTTP-style: 201\n * for added, 4xx/5xx for failed) and `index` matching the input position;\n * partial failures do **not** throw — inspect `status` per entry.\n */\n async addItemsBatch(\n cartId: string,\n items: CartItemInput[],\n auth: AuthContext,\n ): Promise<CartItemsBatchResponse> {\n return this.ctx.http.request<CartItemsBatchResponse>({\n method: \"POST\",\n path: `${this.base()}/${cartId}/itemsBatch`,\n auth: requireCartAuth(auth),\n body: items,\n });\n }\n\n /**\n * Updates an item. By default this is a **full replace** — the server expects\n * the complete item (e.g. `itemYrn` + the `price` row). Pass\n * `{ partial: true }` to send a **partial update** (`?partial=true`), e.g. a\n * quantity-only change with just `{ quantity }`.\n */\n async updateItem(\n cartId: string,\n itemId: string,\n patch: CartItemUpdate,\n auth: AuthContext,\n opts: { partial?: boolean } = {},\n ): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}/items/${itemId}`,\n auth: requireCartAuth(auth),\n body: patch,\n ...(opts.partial ? { query: { partial: \"true\" } } : {}),\n });\n }\n\n /** Removes an item. */\n async removeItem(cartId: string, itemId: string, auth: AuthContext): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}/items/${itemId}`,\n auth: requireCartAuth(auth),\n });\n }\n\n /** Empties the cart. */\n async clear(cartId: string, auth: AuthContext): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}/items`,\n auth: requireCartAuth(auth),\n });\n }\n\n /**\n * Applies a coupon by code. Coupon application goes through the cart's\n * `discounts` endpoint (`POST …/discounts` with a coupon-code-only payload) —\n * the live API has no `…/coupons` path. The apply response only carries the\n * applied-discount reference (`{ discountId, discountIndex }`), so the updated\n * cart is re-fetched and returned to preserve the `Cart` contract.\n */\n async applyCoupon(cartId: string, code: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<AppliedDiscount>({\n method: \"POST\",\n path: `${this.base()}/${cartId}/discounts`,\n auth: cartAuth,\n body: { code },\n });\n return this.get(cartId, cartAuth);\n }\n\n /**\n * Removes a coupon by code via `DELETE …/discounts?codes=<code>` — the live\n * API has no `…/coupons/<code>` path. The delete responds 204 No Content, so\n * the updated cart is re-fetched and returned.\n */\n async removeCoupon(cartId: string, code: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}/discounts`,\n query: { codes: code },\n auth: cartAuth,\n });\n return this.get(cartId, cartAuth);\n }\n\n /** Validates the cart's items (pricing/consistency checks). */\n async validate(cartId: string, auth: AuthContext): Promise<CartValidationResult> {\n return this.ctx.http.request<CartValidationResult>({\n method: \"GET\",\n path: `${this.base()}/${cartId}/validate`,\n auth: requireCartAuth(auth),\n });\n }\n\n /** Lists the items in a cart with calculated prices. */\n async listItems(cartId: string, auth: AuthContext): Promise<CartItem[]> {\n return this.ctx.http.request<CartItem[]>({\n method: \"GET\",\n path: `${this.base()}/${cartId}/items`,\n auth: requireCartAuth(auth),\n });\n }\n\n /** Refreshes a cart and its items (re-prices), then returns the updated cart. */\n async refresh(cartId: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}/refresh`,\n auth: cartAuth,\n });\n return this.get(cartId, cartAuth);\n }\n\n /** Changes the cart's site (re-prices to the new site's currency), then returns the updated cart. */\n async changeSite(cartId: string, siteCode: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${cartId}/changeSite`,\n auth: cartAuth,\n body: { siteCode },\n });\n return this.get(cartId, cartAuth);\n }\n\n /** Changes the cart's currency (re-prices), then returns the updated cart. */\n async changeCurrency(cartId: string, currency: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${cartId}/changeCurrency`,\n auth: cartAuth,\n body: { currency },\n });\n return this.get(cartId, cartAuth);\n }\n\n /**\n * Updates multiple cart items in one request (`PUT …/itemsBatch`). Like\n * `addItemsBatch`, the response carries a per-entry `status`; partial failures\n * do not throw — inspect each entry.\n */\n async updateItemsBatch(\n cartId: string,\n items: CartItemsBatchUpdateInput,\n auth: AuthContext,\n ): Promise<CartItemsBatchUpdateResult> {\n return this.ctx.http.request<CartItemsBatchUpdateResult>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}/itemsBatch`,\n auth: requireCartAuth(auth),\n body: items,\n });\n }\n\n /**\n * Sets the cart's shipping address, preserving the billing address.\n *\n * The API has no per-type address endpoint: addresses live in the cart's\n * `addresses` array, written via `PUT /carts/{cartId}`. That array is a **full\n * replace** — sending only one type leaves the other as an empty stub — so\n * this method reads the cart, merges, writes, and re-fetches. Use\n * {@link setAddresses} to set both in a single request.\n */\n async setShippingAddress(\n cartId: string,\n address: CartAddress,\n auth: AuthContext,\n ): Promise<Cart> {\n return this.mergeAddress(cartId, address, \"SHIPPING\", requireCartAuth(auth));\n }\n\n /**\n * Sets the cart's billing address, preserving the shipping address. See\n * {@link setShippingAddress} for why this reads before writing.\n */\n async setBillingAddress(\n cartId: string,\n address: CartAddress,\n auth: AuthContext,\n ): Promise<Cart> {\n return this.mergeAddress(cartId, address, \"BILLING\", requireCartAuth(auth));\n }\n\n /**\n * Sets both cart addresses in one request (`PUT /carts/{cartId}`), skipping\n * the read that {@link setShippingAddress} needs.\n *\n * **This replaces the cart's address set**: a type you omit is cleared, and\n * `{}` clears both. Use it when you already hold both addresses (a checkout\n * form submitting them together); use the per-type setters to change one and\n * keep the other.\n */\n async setAddresses(\n cartId: string,\n addresses: { shipping?: CartAddress; billing?: CartAddress },\n auth: AuthContext,\n ): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n const next: CartAddress[] = [];\n if (addresses.shipping) next.push({ ...addresses.shipping, type: \"SHIPPING\" });\n if (addresses.billing) next.push({ ...addresses.billing, type: \"BILLING\" });\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}`,\n auth: cartAuth,\n body: { addresses: next },\n });\n return this.get(cartId, cartAuth);\n }\n\n /**\n * Reads the cart, replaces the entry of `type` with `address` (keeping every\n * other type verbatim — resending it unchanged is what stops the server from\n * wiping it), writes, and returns the re-fetched cart.\n */\n private async mergeAddress(\n cartId: string,\n address: CartAddress,\n type: \"SHIPPING\" | \"BILLING\",\n cartAuth: AuthContext,\n ): Promise<Cart> {\n const current = await this.get(cartId, cartAuth);\n const others = (current.addresses ?? []).filter((a) => a.type !== type);\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}`,\n auth: cartAuth,\n body: { addresses: [...others, { ...address, type }] },\n });\n return this.get(cartId, cartAuth);\n }\n\n /**\n * Merges one or more anonymous carts into the specified customer cart.\n * Per Emporix: the target cart in the path **must belong to the logged-in\n * customer**, and each id in `anonymousCartIds` must belong to an anonymous\n * customer. Anonymous carts go `CLOSED` on success.\n *\n * Requires a customer `AuthContext`.\n */\n async merge(\n customerCartId: string,\n anonymousCartIds: string[],\n auth: AuthContext,\n ): Promise<Cart> {\n return this.ctx.http.request<Cart>({\n method: \"POST\",\n path: `${this.base()}/${customerCartId}/merge`,\n auth: requireCustomerAuth(auth),\n body: { carts: anonymousCartIds },\n });\n }\n\n /**\n * Searches carts tenant-wide (`POST /carts/search`, body `{ q }`). This is a\n * backend/admin operation — a customer token cannot scan other customers'\n * carts, so `auth` is forwarded unguarded (pass a service token for admin\n * use). The server enforces scope (403 on insufficient).\n */\n async search(\n query: CartSearchInput,\n auth: AuthContext,\n params: { pageNumber?: number; pageSize?: number; sort?: string; fields?: string } = {},\n ): Promise<CartSummary[]> {\n return this.ctx.http.request<CartSummary[]>({\n method: \"POST\",\n path: `${this.base()}/search`,\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.fields === undefined ? {} : { fields: params.fields }),\n },\n body: query,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n auth,\n });\n }\n\n /**\n * Deletes a cart (`DELETE /carts/{cartId}`). Backend/admin or owner\n * operation — `auth` is forwarded unguarded (service or customer). Returns\n * nothing; the cart no longer exists.\n */\n async delete(cartId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}`,\n auth,\n });\n }\n\n /**\n * Full-updates a cart (`PUT /carts/{cartId}`, body `UpdateCart`). Backend or\n * owner operation — `auth` is forwarded unguarded. The endpoint returns 204,\n * so the cart is re-fetched with the same `auth` (via a direct GET, not\n * `get()`, so a service token is not rejected by the cart-auth guard) and\n * returned.\n */\n async update(cartId: string, input: CartUpdateInput, auth: AuthContext): Promise<Cart> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${cartId}`,\n auth,\n body: input,\n });\n return this.ctx.http.request<Cart>({\n method: \"GET\",\n path: `${this.base()}/${cartId}`,\n auth,\n });\n }\n\n /** Fetches a single cart item's details (`GET /carts/{cartId}/items/{itemId}`). */\n async getItem(cartId: string, itemId: string, auth: AuthContext): Promise<CartItem> {\n return this.ctx.http.request<CartItem>({\n method: \"GET\",\n path: `${this.base()}/${cartId}/items/${itemId}`,\n auth: requireCartAuth(auth),\n });\n }\n\n /** Lists the discounts applied to a cart (`GET /carts/{cartId}/discounts`). */\n async listDiscounts(cartId: string, auth: AuthContext): Promise<CartDiscount[]> {\n return this.ctx.http.request<CartDiscount[]>({\n method: \"GET\",\n path: `${this.base()}/${cartId}/discounts`,\n auth: requireCartAuth(auth),\n });\n }\n\n /**\n * Removes all discounts from a cart (`DELETE /carts/{cartId}/discounts` with\n * no `codes` filter), then re-fetches and returns the updated cart. Use\n * `removeCoupon(code)` to remove a specific coupon by code.\n */\n async removeAllDiscounts(cartId: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}/discounts`,\n auth: cartAuth,\n });\n return this.get(cartId, cartAuth);\n }\n\n /**\n * Removes a single discount by its index (`DELETE\n * /carts/{cartId}/discounts/{discountIndex}`), then re-fetches and returns\n * the updated cart.\n */\n async removeDiscountByIndex(cartId: string, discountIndex: string, auth: AuthContext): Promise<Cart> {\n const cartAuth = requireCartAuth(auth);\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${cartId}/discounts/${discountIndex}`,\n auth: cartAuth,\n });\n return this.get(cartId, cartAuth);\n }\n\n /** Retrieves the cart's lead-time and non-delivery-time restrictions (`GET /carts/{cartId}/dtRestrictions`). */\n async getDeliveryRestrictions(cartId: string, auth: AuthContext): Promise<CartDeliveryRestrictions> {\n return this.ctx.http.request<CartDeliveryRestrictions>({\n method: \"GET\",\n path: `${this.base()}/${cartId}/dtRestrictions`,\n auth: requireCartAuth(auth),\n });\n }\n\n /**\n * Runs up to 10 cart commands on this cart in one request, in order\n * (`POST /carts/{cartId}/execute`). The typical chain is `AddCartItem` then\n * `GetCart`: the calculated cart comes back without a second round trip.\n *\n * - `onError: \"fail\"` (default) stops at the first command that does not\n * answer 2xx and **throws the error that command's REST call would have\n * thrown** — an `EmporixNotFoundError` for a 404, … — with the command's\n * error body. The commands before it **have already been applied**.\n * - `onError: \"resume\"` runs every command and resolves with all results;\n * check each `code`.\n * - A `400` for the whole request (no commands or more than 10, an unknown\n * type, `versioning: \"explicit\"` without a `resourceVersion`) means no\n * command ran.\n *\n * The request takes about as long as its commands together — size the\n * client's `timeouts.readMs` for long chains. It is never retried: a replay\n * would apply the writes twice.\n *\n * `auth` is forwarded unguarded: a customer or anonymous token works on the\n * shopper's own cart; a service token needs `cart.cart_manage`, plus\n * `cart.cart_manage_external_prices` when a command carries an external\n * price, product, fee or discount.\n */\n async execute(\n cartId: string,\n commands: CartCommand[],\n auth: AuthContext,\n opts: CartExecuteOptions = {},\n ): Promise<CartExecuteResult> {\n const path = `${this.base()}/${encodeURIComponent(cartId)}/execute`;\n const res = await this.ctx.http.request<CartExecuteResult>({\n method: \"POST\",\n path,\n auth,\n query: { ...opts },\n body: { commands },\n });\n if (opts.onError !== \"resume\") {\n const failed = res.results.find((r) => r.code < 200 || r.code > 299);\n if (failed) {\n throw errorFromResponse(\n failed.code,\n `POST ${path} → command ${failed.index} (${failed.type}) → ${failed.code}`,\n failed.data,\n );\n }\n }\n return res;\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixAuthError } from \"../core/errors\";\nimport type {\n ResponseCheckout,\n RequestCheckout,\n RequestFromQuoteCheckout,\n CustomerJson,\n} from \"../generated/checkout\";\n\n/** `requestCheckout` body (cart-based, generated). */\nexport type CheckoutInput = RequestCheckout;\n\n/** `requestFromQuoteCheckout` body (quote-based, generated). */\nexport type QuoteCheckoutInput = RequestFromQuoteCheckout;\n\n/** `responseCheckout` — the full generated checkout response. */\nexport type CheckoutResult = ResponseCheckout;\n\n/** Options for a checkout call. */\nexport interface CheckoutOptions {\n /** Customer `saasToken` from `customers.login()` — required for logged-in checkout. */\n saasToken?: string;\n /** Site code (`?siteCode=`). */\n siteCode?: string;\n}\n\nfunction isGuest(customer: CustomerJson | undefined): boolean {\n return customer?.guest === true;\n}\n\nfunction resolveAuth(auth: AuthContext | undefined, guest: boolean): AuthContext {\n if (auth && (auth.kind === \"customer\" || auth.kind === \"raw\")) return auth;\n if (guest && auth && auth.kind === \"anonymous\") return auth;\n throw new EmporixAuthError(\n \"checkout requires a customer/raw AuthContext (or anonymous for a guest checkout)\",\n );\n}\n\n/** Triggers Emporix checkout (atomic: validate → order → payment → close cart). */\nexport class CheckoutService {\n static readonly channel = \"checkout\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private headers(opts: CheckoutOptions, guest: boolean): Record<string, string> | undefined {\n if (guest || !opts.saasToken) return undefined;\n return { \"saas-token\": opts.saasToken };\n }\n\n private query(opts: CheckoutOptions): Record<string, string> | undefined {\n return opts.siteCode ? { siteCode: opts.siteCode } : undefined;\n }\n\n /** Checkout from a cart. Requires customer/raw auth (or anonymous for guest). */\n async placeOrder(\n input: CheckoutInput,\n auth?: AuthContext,\n opts: CheckoutOptions = {},\n ): Promise<CheckoutResult> {\n const guest = isGuest(input.customer);\n const headers = this.headers(opts, guest);\n const query = this.query(opts);\n return this.ctx.http.request<CheckoutResult>({\n method: \"POST\",\n path: `/checkout/${this.ctx.tenant}/checkouts/order`,\n auth: resolveAuth(auth, guest),\n ...(query ? { query } : {}),\n ...(headers ? { headers } : {}),\n body: input,\n });\n }\n\n /** Checkout from a quote. */\n async placeOrderFromQuote(\n input: QuoteCheckoutInput,\n auth?: AuthContext,\n opts: CheckoutOptions = {},\n ): Promise<CheckoutResult> {\n const headers = this.headers(opts, false);\n const query = this.query(opts);\n return this.ctx.http.request<CheckoutResult>({\n method: \"POST\",\n path: `/checkout/${this.ctx.tenant}/checkouts/order`,\n auth: resolveAuth(auth, false),\n ...(query ? { query } : {}),\n ...(headers ? { headers } : {}),\n body: input,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\nimport { requireCustomer } from \"../core/require-customer\";\nimport type {\n PaymentModeFrontendResponse,\n AuthorizePaymentRequest,\n InitializePaymentRequest,\n InitializePaymentResponse,\n PaymentModeResponse,\n PaymentModeRequest,\n PaymentMethodUpdateRequest,\n PaymentTransactionResponse,\n AuthorizePaymentResponse,\n CaptureRequest,\n RefundRequest,\n CommonPaymentResponse,\n} from \"../generated/payment\";\n\nconst ANON: AuthContext = auth.anonymous();\nconst SERVICE: AuthContext = auth.service();\n\n/** A frontend payment mode (generated). */\nexport type PaymentMode = PaymentModeFrontendResponse;\n\n/** Post-checkout authorize request (generated; caller sends the exact wire shape). */\nexport type AuthorizePaymentInput = AuthorizePaymentRequest;\n\n/** Frontend payment-initialize request (generated). */\nexport type InitializePaymentInput = InitializePaymentRequest;\n\n/** Frontend payment-initialize response (generated). */\nexport type InitializePaymentResult = InitializePaymentResponse;\n\n/** Post-checkout authorize result. */\nexport interface AuthorizePaymentResult {\n successful: boolean;\n paymentTransactionId?: string;\n authorizationToken?: string;\n requiresExternalPayment?: boolean;\n externalPaymentRedirectURL?: string;\n externalPaymentHttpMethod?: string;\n [k: string]: unknown;\n}\n\n/** A configured payment mode (admin view, `/paymentmodes/config`). */\nexport type PaymentModeConfig = PaymentModeResponse;\n\n/** Body for creating a payment-mode configuration. */\nexport type PaymentModeCreateInput = PaymentModeRequest;\n\n/** Body for updating a payment-mode configuration. */\nexport type PaymentModeUpdateInput = PaymentMethodUpdateRequest;\n\n/** A payment transaction (generated). */\nexport type PaymentTransaction = PaymentTransactionResponse;\n\n/** Result of a backend payment authorization. */\nexport type PaymentAuthorizeResult = AuthorizePaymentResponse;\n\n/** Body for capturing an authorized payment. */\nexport type PaymentCaptureInput = CaptureRequest;\n\n/** Body for refunding a captured payment. */\nexport type PaymentRefundInput = RefundRequest;\n\n/**\n * Result of a refund/cancel operation. Business failures are reported in the\n * body (`successful: false` + `message`), not via HTTP status.\n */\nexport type PaymentActionResult = CommonPaymentResponse;\n\n/** Result of a capture — like {@link PaymentActionResult} plus the provider's capture id. */\nexport type PaymentCaptureResult = {\n successful?: boolean;\n message?: string;\n captureId?: string;\n};\n\n/** Payment-Gateway: list frontend payment modes, authorize deferred payments. */\nexport class PaymentGatewayService {\n static readonly channel = \"payment\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /**\n * Lists configured frontend payment modes. The endpoint requires a bearer\n * token but no customer scope (\"No scope required\"), so it defaults to an\n * anonymous context and works for guests and logged-in customers alike.\n */\n async listPaymentModes(authCtx: AuthContext = ANON): Promise<PaymentMode[]> {\n return this.ctx.http.request<PaymentMode[]>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/frontend`,\n auth: authCtx,\n });\n }\n\n /** Authorizes a post-checkout (deferred) payment for an existing order. */\n async authorize(\n input: AuthorizePaymentInput,\n authCtx?: AuthContext,\n ): Promise<AuthorizePaymentResult> {\n return this.ctx.http.request<AuthorizePaymentResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/frontend/authorize`,\n auth: requireCustomer(authCtx),\n body: input,\n });\n }\n\n /** Retrieves a single frontend payment mode by id. Defaults to anonymous (no scope required). */\n async getMode(id: string, authCtx: AuthContext = ANON): Promise<PaymentMode> {\n return this.ctx.http.request<PaymentMode>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/frontend/${id}`,\n auth: authCtx,\n });\n }\n\n /** Initializes a payment from the frontend. Defaults to anonymous (no scope required). */\n async initialize(\n input: InitializePaymentInput,\n authCtx: AuthContext = ANON,\n ): Promise<InitializePaymentResult> {\n return this.ctx.http.request<InitializePaymentResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/frontend/initialize`,\n auth: authCtx,\n body: input,\n });\n }\n\n /**\n * Payment-mode **configuration** (`/paymentmodes/config`) — the admin view.\n * For the storefront view use {@link listPaymentModes} / {@link getMode}.\n * Defaults to service auth.\n */\n readonly modes = {\n /** Lists all configured payment modes. The endpoint takes no query parameters. */\n list: async (authCtx: AuthContext = SERVICE): Promise<PaymentModeConfig[]> =>\n this.ctx.http.request<PaymentModeConfig[]>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/config`,\n auth: authCtx,\n }),\n\n /** Retrieves one payment-mode configuration by id. */\n get: async (id: string, authCtx: AuthContext = SERVICE): Promise<PaymentModeConfig> =>\n this.ctx.http.request<PaymentModeConfig>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/config/${id}`,\n auth: authCtx,\n }),\n\n /** Creates a payment-mode configuration. Responds 200 with the created mode. */\n create: async (\n input: PaymentModeCreateInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentModeConfig> =>\n this.ctx.http.request<PaymentModeConfig>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/config`,\n body: input,\n auth: authCtx,\n }),\n\n /** Updates a payment-mode configuration (PUT). Responds 200 with the updated mode. */\n update: async (\n id: string,\n input: PaymentModeUpdateInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentModeConfig> =>\n this.ctx.http.request<PaymentModeConfig>({\n method: \"PUT\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/config/${id}`,\n body: input,\n auth: authCtx,\n }),\n\n /** Deletes a payment-mode configuration. */\n delete: async (id: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/payment-gateway/${this.ctx.tenant}/paymentmodes/config/${id}`,\n auth: authCtx,\n });\n },\n };\n\n /**\n * Backend transaction lifecycle and reads. `authorize` creates the transaction\n * that `capture`/`refund`/`cancel` then act on. Business failures are reported\n * in the response body (`successful: false`), not as HTTP errors — always check\n * `successful`. Defaults to service auth.\n */\n readonly transactions = {\n /** One page of payment transactions. */\n list: async (\n params: { pageNumber?: number; pageSize?: number; sort?: string } = {},\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentTransaction[]> => {\n const query = {\n ...(params.pageNumber === undefined ? {} : { pageNumber: params.pageNumber }),\n ...(params.pageSize === undefined ? {} : { pageSize: params.pageSize }),\n ...(params.sort === undefined ? {} : { sort: params.sort }),\n };\n return this.ctx.http.request<PaymentTransaction[]>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/transactions`,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n auth: authCtx,\n });\n },\n\n /** Retrieves one payment transaction by id. */\n get: async (transactionId: string, authCtx: AuthContext = SERVICE): Promise<PaymentTransaction> =>\n this.ctx.http.request<PaymentTransaction>({\n method: \"GET\",\n path: `/payment-gateway/${this.ctx.tenant}/transactions/${transactionId}`,\n auth: authCtx,\n }),\n\n /**\n * Authorizes a payment as a backend caller (`POST /payment/authorize`). The\n * storefront equivalent is {@link PaymentGatewayService.authorize}, which\n * targets `/payment/frontend/authorize` with a customer token.\n */\n authorize: async (\n input: AuthorizePaymentInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentAuthorizeResult> =>\n this.ctx.http.request<PaymentAuthorizeResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/authorize`,\n body: input,\n auth: authCtx,\n }),\n\n /**\n * Captures an authorized payment. Omit `input` to capture the full\n * authorized amount. Returns the provider's `captureId` on success.\n */\n capture: async (\n transactionId: string,\n input?: PaymentCaptureInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentCaptureResult> =>\n this.ctx.http.request<PaymentCaptureResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/${transactionId}/capture`,\n ...(input === undefined ? {} : { body: input }),\n auth: authCtx,\n }),\n\n /**\n * Refunds a captured payment. Omit `input` to refund the full captured\n * amount; pass `captureId` when several captures exist for the payment.\n */\n refund: async (\n transactionId: string,\n input?: PaymentRefundInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PaymentActionResult> =>\n this.ctx.http.request<PaymentActionResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/${transactionId}/refund`,\n ...(input === undefined ? {} : { body: input }),\n auth: authCtx,\n }),\n\n /** Cancels an authorized payment. Takes no body. */\n cancel: async (transactionId: string, authCtx: AuthContext = SERVICE): Promise<PaymentActionResult> =>\n this.ctx.http.request<PaymentActionResult>({\n method: \"POST\",\n path: `/payment-gateway/${this.ctx.tenant}/payment/${transactionId}/cancel`,\n auth: authCtx,\n }),\n };\n}\n","/**\n * Paging, sort and field selection for a `POST …/search` endpoint. Emporix reads\n * them from the query string, not the body, so the SDK sends them there. Without\n * them a search returns only the server's first page.\n */\nexport interface SearchPaging {\n pageNumber?: number;\n pageSize?: number;\n /** Properties to sort by, in Emporix sort syntax. */\n sort?: string;\n /** Comma-separated fields to return. */\n fields?: string;\n}\n\n/** The {@link SearchPaging} keys, for {@link splitQuery}. */\nexport const SEARCH_PAGING = [\"pageNumber\", \"pageSize\", \"sort\", \"fields\"] as const;\n\n/**\n * Splits a request input: the named keys go to the query string, everything\n * else stays in the body. A `POST …/search` declares its paging, sort and similar\n * parameters in the query and ignores them in the body — sent there, the search\n * silently returns the first page.\n */\nexport function splitQuery(\n input: object,\n queryKeys: readonly string[],\n): { body: Record<string, unknown>; query: Record<string, string | number | boolean | undefined> } {\n const body: Record<string, unknown> = {};\n const query: Record<string, string | number | boolean | undefined> = {};\n for (const [key, value] of Object.entries(input)) {\n if (queryKeys.includes(key)) query[key] = value as string | number | boolean | undefined;\n else body[key] = value;\n }\n return { body, query };\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixAuthError } from \"../core/errors\";\nimport { splitQuery, type SearchPaging } from \"../core/search\";\nimport type {\n Match,\n MatchByContext,\n MatchResponse,\n CreatePrice,\n GetPrice,\n PriceModelDefinitionCreation,\n PriceModelRetrieval,\n PriceListCreation,\n PriceListUpdate,\n PriceList as GenPriceList,\n PriceListPriceCreation,\n PriceListPriceUpdate,\n PriceListPrice as GenPriceListPrice,\n PriceBulkResponseEntry,\n} from \"../generated/price\";\n\n/** Session-context match request body (generated). */\nexport type PriceMatchByContextInput = MatchByContext;\n\n/** Explicit-context match request body (generated). */\nexport type PriceMatchInput = Match;\n\n/** Item (product or price) a price was matched for. */\nexport interface PriceMatchItemRef {\n itemType?: string;\n id?: string;\n /** Localized (or plain) product name — present on the live API, absent from the OpenAPI doc. */\n name?: Record<string, string> | string;\n}\n\n/**\n * A resolved price. Superset of the generated match-response schema: the\n * deployed API returns the matched item under `itemId` (with a localized\n * `name`), while the OpenAPI doc/codegen call it `itemRef`.\n */\nexport type PriceMatch = Omit<MatchResponse, \"itemRef\"> & {\n /** Item the price was matched for, as returned by the API. */\n itemId?: PriceMatchItemRef;\n /**\n * @deprecated The OpenAPI doc names this `itemRef`, but the deployed API\n * returns `itemId`. Mirrored from `itemId` for back-compat — prefer `itemId`.\n */\n itemRef?: PriceMatchItemRef;\n};\n\n/**\n * Normalizes a raw match row: the deployed API returns `itemId`, while the\n * codegen type calls it `itemRef`. Expose `itemId` canonically and mirror it\n * to the deprecated `itemRef` so existing consumers keep working.\n */\nfunction normalizeMatch(raw: MatchResponse): PriceMatch {\n const itemId = (raw as MatchResponse & { itemId?: PriceMatchItemRef }).itemId ?? raw.itemRef;\n const base = raw as PriceMatch;\n if (!itemId) return base;\n // Mirror only id/type into the deprecated itemRef (drop name); build without\n // explicit `undefined` for exactOptionalPropertyTypes.\n const itemRef: PriceMatchItemRef = {\n ...(itemId.itemType !== undefined ? { itemType: itemId.itemType } : {}),\n ...(itemId.id !== undefined ? { id: itemId.id } : {}),\n };\n return { ...base, itemId, itemRef };\n}\n\n/** Options for {@link PriceService.matchByContextChunked}. */\nexport interface MatchByContextChunkedOptions {\n /** Items per request. Default 50. Must be >= 1. */\n chunkSize?: number;\n /** Maximum number of requests in flight at once. Default 4. Must be >= 1. */\n concurrency?: number;\n /** Invoked once per failed chunk (default mode only — not when throwing). */\n onChunkError?: (err: unknown, chunkIndex: number) => void;\n /** When true, the first failing chunk rejects the whole call. Default false. */\n throwOnAnyChunkError?: boolean;\n}\n\n/** A resolved/stored price (generated read shape). */\nexport type Price = GetPrice;\n/** Create/upsert body for a flat price (generated). */\nexport type PriceCreateInput = CreatePrice;\n/** A price model (read). */\nexport type PriceModel = PriceModelRetrieval;\n/** Create/upsert body for a price model (generated). */\nexport type PriceModelInput = PriceModelDefinitionCreation;\n/** A price list (read). */\nexport type PriceList = GenPriceList;\n/** Create body for a price list (generated). */\nexport type PriceListInput = PriceListCreation;\n/** Upsert body for a price list (generated). */\nexport type PriceListUpdateInput = PriceListUpdate;\n/** A price inside a price list (read). */\nexport type PriceListPrice = GenPriceListPrice;\n/** Add body for a price-list price (generated). */\nexport type PriceListPriceInput = PriceListPriceCreation;\n/** Upsert body for a price-list price (generated). */\nexport type PriceListPriceUpdateInput = PriceListPriceUpdate;\n/** Per-entry result of a bulk price operation (generated). */\nexport type PriceBulkResult = PriceBulkResponseEntry;\n\nconst ANON: AuthContext = { kind: \"anonymous\" };\nconst SERVICE: AuthContext = { kind: \"service\" };\n\nfunction requireContextAuth(auth: AuthContext | undefined): AuthContext {\n const a = auth ?? ANON;\n if (a.kind === \"anonymous\" || a.kind === \"customer\" || a.kind === \"raw\") return a;\n throw new EmporixAuthError(\n \"match-prices-by-context requires an anonymous, customer, or raw AuthContext\",\n );\n}\n\n/**\n * Price matching. The Cart service does not resolve prices — call this\n * explicitly before rendering money and again right before placing an order.\n * The SDK is stateless: it never caches or revalidates prices.\n */\nexport class PriceService {\n static readonly channel = \"price\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /**\n * Resolves prices using the session context bound to the bearer token\n * (currency/site/country were set at anonymous-login time). Default auth:\n * anonymous; pass a customer/raw context for personalized pricing.\n */\n async matchByContext(\n input: PriceMatchByContextInput,\n auth?: AuthContext,\n ): Promise<PriceMatch[]> {\n const rows = await this.ctx.http.request<MatchResponse[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/match-prices-by-context`,\n auth: requireContextAuth(auth),\n body: input,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n return rows.map(normalizeMatch);\n }\n\n /**\n * Resolves prices from an explicit context. Default auth: service\n * (requires `price.price_read` / `price.price_manage`).\n */\n async match(input: PriceMatchInput, auth: AuthContext = SERVICE): Promise<PriceMatch[]> {\n const rows = await this.ctx.http.request<MatchResponse[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/match-prices`,\n auth,\n body: input,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n return rows.map(normalizeMatch);\n }\n\n /**\n * Chunked variant of {@link matchByContext} for large `items` arrays. The\n * Emporix backend handles only a limited number of items per request\n * (production limit ~50), so this splits `input.items` into chunks and runs\n * `matchByContext` with bounded concurrency.\n *\n * By default a failing chunk is skipped (its items are absent from the\n * result) and `opts.onChunkError` is called once for it; pass\n * `throwOnAnyChunkError: true` to reject on the first failure instead.\n *\n * **Result order is not guaranteed** — match entries back to your items by\n * `priceId` / `itemId.id`.\n */\n async matchByContextChunked(\n input: PriceMatchByContextInput,\n opts: MatchByContextChunkedOptions = {},\n auth?: AuthContext,\n ): Promise<PriceMatch[]> {\n const chunkSize = opts.chunkSize ?? 50;\n const concurrency = opts.concurrency ?? 4;\n if (chunkSize < 1) throw new Error(\"chunkSize must be >= 1\");\n if (concurrency < 1) throw new Error(\"concurrency must be >= 1\");\n\n const items = input.items ?? [];\n if (items.length === 0) return [];\n\n const chunks: PriceMatchByContextInput[] = [];\n for (let i = 0; i < items.length; i += chunkSize) {\n chunks.push({ ...input, items: items.slice(i, i + chunkSize) });\n }\n\n const results: PriceMatch[][] = new Array(chunks.length);\n let cursor = 0;\n\n const worker = async (): Promise<void> => {\n for (;;) {\n const idx = cursor++;\n const chunk = chunks[idx];\n if (chunk === undefined) return; // past the end\n try {\n results[idx] = await this.matchByContext(chunk, auth);\n } catch (err) {\n if (opts.throwOnAnyChunkError) throw err;\n results[idx] = [];\n opts.onChunkError?.(err, idx);\n }\n }\n };\n\n const workerCount = Math.min(concurrency, chunks.length);\n await Promise.all(Array.from({ length: workerCount }, () => worker()));\n\n return results.flat();\n }\n\n // --- Admin CRUD (flat prices). Default auth: service. ---\n\n /** Creates a flat price. Default auth: service. */\n async create(input: PriceCreateInput, authCtx: AuthContext = SERVICE): Promise<Price> {\n return this.ctx.http.request<Price>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/prices`,\n auth: authCtx,\n body: input,\n });\n }\n\n /** Lists flat prices. Default auth: service. */\n async list(\n query?: Record<string, string | number>,\n authCtx: AuthContext = SERVICE,\n ): Promise<Price[]> {\n return this.ctx.http.request<Price[]>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/prices`,\n auth: authCtx,\n ...(query ? { query } : {}),\n });\n }\n\n /** Retrieves one flat price by id. Default auth: service. */\n async get(priceId: string, authCtx: AuthContext = SERVICE): Promise<Price> {\n return this.ctx.http.request<Price>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/prices/${priceId}`,\n auth: authCtx,\n });\n }\n\n /** Upserts a flat price by id (PUT). Default auth: service. */\n async upsert(priceId: string, input: PriceCreateInput, authCtx: AuthContext = SERVICE): Promise<Price> {\n return this.ctx.http.request<Price>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/prices/${priceId}`,\n auth: authCtx,\n body: input,\n });\n }\n\n /** Deletes a flat price by id. Default auth: service. */\n async delete(priceId: string, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/price/${this.ctx.tenant}/prices/${priceId}`,\n auth: authCtx,\n });\n }\n\n /**\n * Searches flat prices: the criteria go in the body, `expand` in the query\n * string. Default auth: service.\n */\n async search(query: Record<string, unknown> & { expand?: string }, authCtx: AuthContext = SERVICE): Promise<Price[]> {\n return this.ctx.http.request<Price[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/prices/search`,\n auth: authCtx,\n ...splitQuery(query, [\"expand\"]),\n });\n }\n\n /** Creates multiple flat prices in one request. Default auth: service. */\n async bulkCreate(inputs: PriceCreateInput[], authCtx: AuthContext = SERVICE): Promise<PriceBulkResult[]> {\n return this.ctx.http.request<PriceBulkResult[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/prices/bulk`,\n auth: authCtx,\n body: inputs,\n });\n }\n\n /** Upserts multiple flat prices in one request (PUT). Default auth: service. */\n async bulkUpsert(inputs: PriceCreateInput[], authCtx: AuthContext = SERVICE): Promise<PriceBulkResult[]> {\n return this.ctx.http.request<PriceBulkResult[]>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/prices/bulk`,\n auth: authCtx,\n body: inputs,\n });\n }\n\n /** Price-model admin CRUD (`/priceModels`). Default auth: service. */\n readonly models = {\n list: async (\n query?: Record<string, string | number>,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceModel[]> =>\n this.ctx.http.request<PriceModel[]>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/priceModels`,\n auth: authCtx,\n ...(query ? { query } : {}),\n }),\n create: async (input: PriceModelInput, authCtx: AuthContext = SERVICE): Promise<PriceModel> =>\n this.ctx.http.request<PriceModel>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/priceModels`,\n auth: authCtx,\n body: input,\n }),\n get: async (modelId: string, authCtx: AuthContext = SERVICE): Promise<PriceModel> =>\n this.ctx.http.request<PriceModel>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/priceModels/${modelId}`,\n auth: authCtx,\n }),\n upsert: async (\n modelId: string,\n input: PriceModelInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceModel> =>\n this.ctx.http.request<PriceModel>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/priceModels/${modelId}`,\n auth: authCtx,\n body: input,\n }),\n delete: async (modelId: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/price/${this.ctx.tenant}/priceModels/${modelId}`,\n auth: authCtx,\n });\n },\n };\n\n /** Price-list admin CRUD (`/price-lists`) + nested price management. Default auth: service. */\n readonly lists = {\n list: async (\n query?: Record<string, string | number>,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceList[]> =>\n this.ctx.http.request<PriceList[]>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/price-lists`,\n auth: authCtx,\n ...(query ? { query } : {}),\n }),\n create: async (input: PriceListInput, authCtx: AuthContext = SERVICE): Promise<PriceList> =>\n this.ctx.http.request<PriceList>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/price-lists`,\n auth: authCtx,\n body: input,\n }),\n /** `q` in the body; `pageNumber`, `pageSize` and `sort` in the query string. */\n search: async (\n query: Record<string, unknown> & Omit<SearchPaging, \"fields\">,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceList[]> =>\n this.ctx.http.request<PriceList[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/price-lists/search`,\n auth: authCtx,\n ...splitQuery(query, [\"pageNumber\", \"pageSize\", \"sort\"]),\n }),\n get: async (listId: string, authCtx: AuthContext = SERVICE): Promise<PriceList> =>\n this.ctx.http.request<PriceList>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}`,\n auth: authCtx,\n }),\n upsert: async (\n listId: string,\n input: PriceListUpdateInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceList> =>\n this.ctx.http.request<PriceList>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}`,\n auth: authCtx,\n body: input,\n }),\n delete: async (listId: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}`,\n auth: authCtx,\n });\n },\n listPrices: async (\n listId: string,\n query?: Record<string, string | number>,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceListPrice[]> =>\n this.ctx.http.request<PriceListPrice[]>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices`,\n auth: authCtx,\n ...(query ? { query } : {}),\n }),\n addPrice: async (\n listId: string,\n input: PriceListPriceInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceListPrice> =>\n this.ctx.http.request<PriceListPrice>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices`,\n auth: authCtx,\n body: input,\n }),\n getPrice: async (\n listId: string,\n priceId: string,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceListPrice> =>\n this.ctx.http.request<PriceListPrice>({\n method: \"GET\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/${priceId}`,\n auth: authCtx,\n }),\n upsertPrice: async (\n listId: string,\n priceId: string,\n input: PriceListPriceUpdateInput,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceListPrice> =>\n this.ctx.http.request<PriceListPrice>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/${priceId}`,\n auth: authCtx,\n body: input,\n }),\n deletePrice: async (\n listId: string,\n priceId: string,\n authCtx: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/${priceId}`,\n auth: authCtx,\n });\n },\n /** `q` in the body; `pageNumber`, `pageSize` and `sort` in the query string. */\n searchPrices: async (\n listId: string,\n query: Record<string, unknown> & Omit<SearchPaging, \"fields\">,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceListPrice[]> =>\n this.ctx.http.request<PriceListPrice[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/search`,\n auth: authCtx,\n ...splitQuery(query, [\"pageNumber\", \"pageSize\", \"sort\"]),\n }),\n bulkCreatePrices: async (\n listId: string,\n inputs: PriceListPriceInput[],\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceBulkResult[]> =>\n this.ctx.http.request<PriceBulkResult[]>({\n method: \"POST\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/bulk`,\n auth: authCtx,\n body: inputs,\n }),\n bulkUpsertPrices: async (\n listId: string,\n inputs: PriceListPriceInput[],\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceBulkResult[]> =>\n this.ctx.http.request<PriceBulkResult[]>({\n method: \"PUT\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/bulk`,\n auth: authCtx,\n body: inputs,\n }),\n bulkDeletePrices: async (\n listId: string,\n body: Record<string, unknown>,\n authCtx: AuthContext = SERVICE,\n ): Promise<PriceBulkResult[]> =>\n this.ctx.http.request<PriceBulkResult[]>({\n method: \"DELETE\",\n path: `/price/${this.ctx.tenant}/price-lists/${listId}/prices/bulk`,\n auth: authCtx,\n body,\n }),\n };\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixError, errorFromResponse } from \"../core/errors\";\nimport type {\n AssetCreateBlob,\n AssetCreateLink,\n AssetUpdateBlob,\n AssetUpdateLink,\n DownloadUrl,\n GetAsset,\n GetMediaRetrieveDownloadUrlData,\n MetadataUpdate,\n PatchOperation,\n RefId,\n UploadSession,\n UploadSessionRequest,\n} from \"../generated/media\";\n\n/**\n * The spec marks `metadata` optional on both update bodies; the live API rejects\n * an update without it — «`metadata.version` is required for update» (measured\n * 2026-10-06 on BLOB and LINK assets). Required here, so leaving it out is a\n * compile error rather than a 400.\n */\ntype Versioned<T> = Omit<T, \"metadata\"> & { metadata: MetadataUpdate };\n\n/** Generated media types (caller sends the exact wire shape). */\nexport type AssetCreateBlobInput = AssetCreateBlob;\nexport type AssetCreateLinkInput = AssetCreateLink;\nexport type AssetUpdateBlobInput = Versioned<AssetUpdateBlob>;\nexport type AssetUpdateLinkInput = Versioned<AssetUpdateLink>;\n/**\n * @deprecated `update()` takes {@link AssetUpdateLinkInput} as its JSON body and\n * {@link AssetUpdateBlobInput} next to a file; a BLOB is never sent as JSON.\n */\nexport type AssetUpdateInput = AssetUpdateBlob | AssetUpdateLink;\nexport type Asset = GetAsset;\nexport type AssetRefId = RefId;\n/** Partial-update body (`PATCH /assets/{id}`) — an RFC-6902 JSON-Patch op-array. */\nexport type AssetPatch = PatchOperation[];\n/** Result of {@link MediaService.getDownloadUrl} — `{ provider, url, expiresAt? }`. */\nexport type AssetDownloadUrl = DownloadUrl;\n/** Query for {@link MediaService.getDownloadUrl} — `{ disposition? }`. */\nexport type AssetDownloadUrlQuery = NonNullable<GetMediaRetrieveDownloadUrlData[\"query\"]>;\n/** Body for {@link MediaService.startUploadSession}: a BLOB create payload plus `uploadType`. */\nexport type AssetUploadSessionInput = UploadSessionRequest;\n/** The storage instruction {@link MediaService.startUploadSession} returns. */\nexport type AssetUploadSession = UploadSession;\n\n/**\n * Filter / pagination options for {@link MediaService.list}. The explicit\n * fields are typed for autocomplete; the index signature stays open so\n * Emporix `q`-syntax filters like `\"refIds.id\"` can be passed verbatim.\n */\nexport interface ListAssetsQuery {\n pageNumber?: number;\n pageSize?: number;\n /** Emporix sort syntax, e.g. `\"name,metadata.createdAt:desc\"`. */\n sort?: string;\n /** Emporix `q`-syntax filter, e.g. `\"name:hero\"`. */\n q?: string;\n /**\n * Ask for `X-Total-Count`. An SDK-side flag, not an Emporix query parameter:\n * it becomes a request header.\n */\n totalCount?: boolean;\n [key: string]: string | number | boolean | undefined;\n}\n\n/**\n * Result of {@link MediaService.download}. The endpoint's behaviour depends\n * on the asset's `access`:\n * - `PUBLIC` assets respond with a 30x redirect whose `Location` header\n * carries the externally-cacheable storage URL — useful when the\n * storefront wants to send the user there directly.\n * - `PRIVATE` assets respond with the raw bytes (plus an `ETag` header\n * for caching). The file lives in Google Cloud Storage and is reachable\n * without the service token only through a signed URL from\n * {@link MediaService.getDownloadUrl}.\n */\nexport type DownloadResult =\n | { kind: \"redirect\"; url: string }\n | {\n kind: \"bytes\";\n data: ArrayBuffer;\n etag?: string;\n contentType?: string;\n };\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\nfunction isProductRef(r: AssetRefId, productId: string): boolean {\n return r.type === \"PRODUCT\" && r.id === productId;\n}\n\n/**\n * Media assets (BLOB/LINK). All endpoints require a backend-only scope\n * (`media.asset_manage` / `media.asset_read`) — default auth: service.\n */\nexport class MediaService {\n static readonly channel = \"media\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/media/${this.ctx.tenant}/assets`;\n }\n\n /**\n * Create an asset. BLOB uploads via multipart (max 30 MB); LINK via JSON.\n * {@link startUploadSession} sends the file straight to storage instead.\n */\n async create(\n input:\n | { kind: \"blob\"; file: Blob; body: AssetCreateBlobInput }\n | { kind: \"link\"; body: AssetCreateLinkInput },\n auth: AuthContext = SERVICE,\n ): Promise<{ id: string }> {\n if (input.kind === \"blob\") {\n const fd = new FormData();\n fd.set(\"file\", input.file);\n fd.set(\"body\", JSON.stringify(input.body));\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: fd,\n });\n }\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input.body,\n });\n }\n\n /**\n * List assets, wrapped in the shared {@link PaginatedItems} envelope so\n * callers can iterate over pages consistently with the rest of the SDK.\n * `hasNextPage` is the standard SDK heuristic: `true` when the returned\n * page is full (`items.length === requested pageSize`). Pagination\n * defaults match Emporix's server defaults (`pageNumber: 1`,\n * `pageSize: 60`) so an empty `query` produces stable expectations.\n */\n async list(\n query: ListAssetsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<Asset>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n // Destructured out because the rest of `query` is spread into the query\n // string: `totalCount` is an SDK-side flag that becomes a request header,\n // and would otherwise ride along as a stray `?totalCount=true`.\n const { totalCount, ...rest } = query;\n return requestPage<Asset>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.base(),\n auth,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n /** Fetch an asset by id. */\n async get(assetId: string, auth: AuthContext = SERVICE): Promise<Asset> {\n return this.ctx.http.request<Asset>({\n method: \"GET\",\n path: `${this.base()}/${assetId}`,\n auth,\n });\n }\n\n /**\n * Replace an asset (`PUT`, HTTP 204 — nothing is returned). The spec takes one\n * body per asset type, mirrored by the discriminated input:\n * - `{ kind: \"json\", body }` — a LINK asset, sent as `application/json`. The\n * body is the whole asset: `type: \"LINK\"`, `access` and `url` are required.\n * - `{ kind: \"blob\", file, body }` — a BLOB asset, sent as\n * `multipart/form-data`: the file (max 30 MB) and the asset body, both\n * required, so this always replaces the bytes.\n *\n * A BLOB's metadata alone — `refIds`, `details`, mixins — goes through\n * {@link patch}. Earlier versions also took a BLOB as the JSON body and\n * promised the updated asset in return; the spec allows neither.\n *\n * `type` and `access` are immutable. Optimistic locking is via\n * `body.metadata.version`; a stale one gets a 409.\n */\n async update(\n assetId: string,\n input:\n | { kind: \"json\"; body: AssetUpdateLinkInput }\n | { kind: \"blob\"; file: Blob; body: AssetUpdateBlobInput },\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n const path = `${this.base()}/${encodeURIComponent(assetId)}`;\n if (input.kind === \"blob\") {\n const fd = new FormData();\n fd.set(\"file\", input.file);\n fd.set(\"body\", JSON.stringify(input.body));\n await this.ctx.http.request<void>({ method: \"PUT\", path, auth, body: fd });\n return;\n }\n await this.ctx.http.request<void>({ method: \"PUT\", path, auth, body: input.body });\n }\n\n /**\n * Partially update an asset with an RFC-6902 JSON-Patch op-array\n * (`PATCH /assets/{id}`, HTTP 204 — nothing is returned).\n *\n * This is the way to change one field without resending the whole asset, and\n * the only way to touch a `BLOB` asset's metadata **without re-uploading the\n * file** — {@link update} in `blob` mode always replaces the bytes.\n *\n * Append to an array with a path ending in `/-`, which preserves the existing\n * entries:\n *\n * ```ts\n * await client.media.patch(assetId, [\n * { op: \"add\", path: \"/refIds/-\", value: { id: \"product1\", type: \"PRODUCT\" } },\n * ]);\n * ```\n *\n * `type` and `access` are immutable here too, as with {@link update}. Only\n * `add`, `remove` and `replace` are accepted, and optimistic locking still\n * applies — a stale `metadata.version` gets a 409.\n */\n async patch(assetId: string, ops: AssetPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(assetId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Remove an asset. */\n async remove(assetId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${assetId}`,\n auth,\n });\n }\n\n /**\n * Download an asset by id. Returns a discriminated union:\n * - `{ kind: \"redirect\", url }` for `PUBLIC` assets (server-side 30x with\n * the storage URL in `Location`).\n * - `{ kind: \"bytes\", data }` for `PRIVATE` assets (server-side 200 with\n * the asset bytes; `etag` + `contentType` headers are exposed for\n * caching). When the server reports `text/plain` Content-Type (the\n * OpenAPI-documented format), the SDK decodes the base64 stream into\n * an `ArrayBuffer` transparently; binary Content-Types are passed\n * through verbatim.\n *\n * Emporix recommends {@link getDownloadUrl} for every download: here the file\n * passes through the Media API. A `413` means the asset's known size exceeds\n * the streaming limit (30 MB by default) — only {@link getDownloadUrl} can\n * serve it. A `409` means the asset is still `PENDING` from a direct upload\n * whose file has not reached storage.\n *\n * Implementation note: uses `redirect: \"manual\"` so the redirect-location\n * is observable. In Node.js this works; in a browser the redirect Location\n * is intentionally hidden by fetch — there, `PUBLIC` downloads will\n * surface as an opaque-redirect and the SDK throws. Browser code should\n * use the asset's `url` field from `get()` for `LINK` assets, or the\n * direct storage URL for `PUBLIC` `BLOB` assets (typically delivered via\n * an `<img>` tag rather than `download()`).\n */\n async download(\n assetId: string,\n auth: AuthContext = SERVICE,\n ): Promise<DownloadResult> {\n const path = `${this.base()}/${assetId}/download`;\n const res = await this.ctx.http.requestRaw(\n { method: \"GET\", path, auth },\n { redirect: \"manual\" },\n );\n\n // PUBLIC: server-side redirect — capture Location.\n if (res.status >= 300 && res.status < 400) {\n const url = res.headers.get(\"location\");\n if (!url) {\n throw new EmporixError(\n `media.download: ${res.status} response without a Location header`,\n res.status,\n );\n }\n return { kind: \"redirect\", url };\n }\n\n // PRIVATE: bytes.\n if (res.ok) {\n const etag = res.headers.get(\"etag\") ?? undefined;\n const contentType = res.headers.get(\"content-type\") ?? undefined;\n let data: ArrayBuffer;\n if (contentType?.startsWith(\"text/plain\")) {\n // Per OpenAPI spec the server returns the byte stream as a\n // base64-encoded text/plain body. Decode once into raw bytes\n // so callers always see an ArrayBuffer.\n const text = await res.text();\n const bin = atob(text);\n const arr = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i);\n data = arr.buffer;\n } else {\n data = await res.arrayBuffer();\n }\n return {\n kind: \"bytes\",\n data,\n ...(etag !== undefined ? { etag } : {}),\n ...(contentType !== undefined ? { contentType } : {}),\n };\n }\n\n // Error: surface via the standard EmporixError hierarchy.\n const text = await res.text();\n let parsed: unknown = undefined;\n if (text) {\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = text;\n }\n }\n throw errorFromResponse(res.status, `GET ${path} → ${res.status}`, parsed);\n }\n\n /**\n * Get a URL that serves the stored file straight from storage\n * (`GET /assets/{assetId}/download-url`). Emporix recommends it for every\n * download: the file never passes through the Media API, there is no size\n * limit, and the URL can be handed to a browser as it is.\n *\n * - `PRIVATE` BLOB → `provider: \"GCS\"`, a signed Google Cloud Storage URL that\n * works without an Emporix token until `expiresAt` (15 minutes by default).\n * - `PUBLIC` BLOB → `provider: \"CLOUDINARY\"`, the permanent URL.\n * - `LINK` → `provider: \"LINK\"`, the stored URL.\n *\n * `disposition` (`attachment` by default, or `inline`) affects private URLs\n * only. Unlike {@link startUploadSession}, this works whether or not direct\n * upload is enabled for the tenant. A `409` means a direct upload is still\n * `PENDING` and its file has not reached storage; once it has, this call\n * completes the asset before answering.\n */\n async getDownloadUrl(\n assetId: string,\n query: AssetDownloadUrlQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<AssetDownloadUrl> {\n return this.ctx.http.request<AssetDownloadUrl>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(assetId)}/download-url`,\n auth,\n query: { ...query },\n });\n }\n\n /**\n * Start a direct upload of a `BLOB` asset (`POST /assets/upload-session`,\n * `201`). Emporix creates the asset as `PENDING` — `id` is its id — and\n * returns where to send the file. **This method does not send it**:\n *\n * - `upload.method === \"PUT\"` (a `PRIVATE` asset, `uploadType: \"put\"` or\n * omitted): `PUT` the file to `upload.url` with every `upload.headers` entry.\n * - `upload.method === \"POST\"` (every `PUBLIC` asset, or `uploadType: \"form\"`):\n * a multipart `POST` to `upload.url` with every `upload.fields` entry\n * unchanged and the file part last.\n *\n * That request goes to Google Cloud Storage or Cloudinary, not to Emporix, so\n * it must not carry the Emporix token — which is also why a browser can make\n * it. The asset turns `READY` once storage confirms; until then, calls that\n * need the file answer `409`. The instruction is valid for 15 minutes (GCS) or\n * an hour (Cloudinary), and an unused session expires at `expiresAt`.\n *\n * Direct upload is enabled per tenant by Emporix Support. Without it the call\n * throws an `EmporixForbiddenError` whose `body.message` is `direct upload is\n * not enabled for this tenant`, and nothing is created — the same status as a\n * missing scope, so read the message.\n */\n async startUploadSession(\n input: AssetUploadSessionInput,\n auth: AuthContext = SERVICE,\n ): Promise<AssetUploadSession> {\n return this.ctx.http.request<AssetUploadSession>({\n method: \"POST\",\n path: `${this.base()}/upload-session`,\n auth,\n body: input,\n });\n }\n\n /** Multipart upload sugar: builds `AssetCreateBlob` from input. */\n async uploadFile(\n input: {\n file: Blob;\n productId?: string;\n filename?: string;\n mimeType?: string;\n access?: \"PUBLIC\" | \"PRIVATE\";\n },\n auth: AuthContext = SERVICE,\n ): Promise<{ id: string }> {\n const body: AssetCreateBlobInput = {\n type: \"BLOB\",\n access: input.access ?? \"PUBLIC\",\n ...(input.productId\n ? { refIds: [{ type: \"PRODUCT\", id: input.productId }] }\n : {}),\n ...(input.filename || input.mimeType\n ? {\n details: {\n ...(input.filename ? { filename: input.filename } : {}),\n ...(input.mimeType ? { mimeType: input.mimeType } : {}),\n },\n }\n : {}),\n };\n return this.create({ kind: \"blob\", file: input.file, body }, auth);\n }\n\n /**\n * Replace the file content of an existing BLOB asset. Sugar over\n * {@link update} with `kind: \"blob\"`, and like it resolves to nothing — the\n * PUT answers 204. `access` is required because the field is immutable and\n * the server validates that the body matches.\n *\n * Pass `version` from `asset.metadata.version` for optimistic locking\n * (recommended when concurrent writers are possible) — a stale one gets a 409.\n * Without it the current version is read first, because the live API rejects\n * an update that carries none; the write then wins over any in between.\n */\n async replaceFile(\n assetId: string,\n input: {\n file: Blob;\n access: \"PUBLIC\" | \"PRIVATE\";\n filename?: string;\n mimeType?: string;\n version?: number;\n },\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n const version =\n input.version ?? (await this.get(assetId, auth)).metadata?.version ?? 1;\n const body: AssetUpdateBlobInput = {\n type: \"BLOB\",\n access: input.access,\n ...(input.filename || input.mimeType\n ? {\n details: {\n ...(input.filename ? { filename: input.filename } : {}),\n ...(input.mimeType ? { mimeType: input.mimeType } : {}),\n },\n }\n : {}),\n metadata: { version },\n };\n return this.update(assetId, { kind: \"blob\", file: input.file, body }, auth);\n }\n\n /** External-URL sugar: builds `AssetCreateLink`. */\n async link(\n input: { url: string; productId?: string; access?: \"PUBLIC\" | \"PRIVATE\" },\n auth: AuthContext = SERVICE,\n ): Promise<{ id: string }> {\n const body: AssetCreateLinkInput = {\n type: \"LINK\",\n access: input.access ?? \"PUBLIC\",\n url: input.url,\n ...(input.productId\n ? { refIds: [{ type: \"PRODUCT\", id: input.productId }] }\n : {}),\n };\n return this.create({ kind: \"link\", body }, auth);\n }\n\n /**\n * Idempotently add a PRODUCT refId to an asset, through a JSON Patch that\n * appends the one reference, so it works for BLOB and LINK alike and leaves\n * the rest of the asset alone.\n *\n * Resolves to the asset as read back after the patch, because Emporix answers\n * 204 to a reference to a product that does not exist and drops it — check\n * `refIds` rather than trusting the call. Only a PUBLIC asset takes a product\n * reference; a PRIVATE one answers 400.\n *\n * Earlier versions sent a JSON PUT of `{ type, refIds }`, which the spec\n * rejects for both types: a BLOB takes no JSON PUT, and a LINK's requires\n * `access` and `url`.\n */\n async attachToProduct(\n assetId: string,\n productId: string,\n auth: AuthContext = SERVICE,\n ): Promise<Asset> {\n const a = await this.get(assetId, auth);\n const refIds: AssetRefId[] = a.refIds ?? [];\n if (refIds.some((r) => isProductRef(r, productId))) return a;\n const ref: AssetRefId = { type: \"PRODUCT\", id: productId };\n // `/refIds/-` appends to an existing array only (RFC 6902).\n const op =\n a.refIds === undefined\n ? { op: \"add\" as const, path: \"/refIds\", value: [ref] }\n : { op: \"add\" as const, path: \"/refIds/-\", value: ref };\n await this.patch(assetId, [op], auth);\n return this.get(assetId, auth);\n }\n\n /**\n * Remove a PRODUCT refId from an asset (no-op if absent), through a JSON Patch\n * that replaces the references and nothing else. Resolves to the asset as\n * read back after the patch, like {@link attachToProduct}. Earlier versions\n * sent a spec-invalid JSON PUT, as that one did.\n */\n async detachFromProduct(\n assetId: string,\n productId: string,\n auth: AuthContext = SERVICE,\n ): Promise<Asset> {\n const a = await this.get(assetId, auth);\n const refIds: AssetRefId[] = a.refIds ?? [];\n const next = refIds.filter((r) => !isProductRef(r, productId));\n if (next.length === refIds.length) return a;\n await this.patch(assetId, [{ op: \"replace\", path: \"/refIds\", value: next }], auth);\n return this.get(assetId, auth);\n }\n\n /** Convenience: list assets attached to a product (server-side filter). */\n async listForProduct(\n productId: string,\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<Asset>> {\n return this.list({ \"refIds.id\": productId }, auth);\n }\n}\n\n// Re-export so consumers can `import { isProductRef } from \"@viu/emporix-sdk/media\"`?\n// Internal helper — kept module-private; convenience methods in Task 4 use it.\nexport const _internalMedia = { isProductRef };\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { requireCustomer } from \"../core/require-customer\";\nimport { SEARCH_PAGING, splitQuery, type SearchPaging } from \"../core/search\";\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/** Input for a segment search: the generated body (`{ q? }`) plus {@link SearchPaging} (query). */\nexport type SegmentSearchQuery = SegmentsSearch & SearchPaging;\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 /**\n * Searches segments: `q` in the body; paging, sort, fields, `legalEntityId`\n * and `customerId` in the query string. `customerId` returns that customer's\n * segments and needs `customersegment.segment_read`. Default auth: service.\n */\n async search(\n query: SegmentSearchQuery & { legalEntityId?: string; customerId?: string },\n authCtx: AuthContext = SERVICE,\n ): Promise<Segment[]> {\n return this.ctx.http.request<Segment[]>({\n method: \"POST\",\n path: `${this.base()}/search`,\n auth: authCtx,\n ...splitQuery(query, [...SEARCH_PAGING, \"legalEntityId\", \"customerId\"]),\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 (\n segmentId: string,\n query: Record<string, unknown> & SearchPaging,\n authCtx: AuthContext = SERVICE,\n ): Promise<SegmentCustomer[]> =>\n this.ctx.http.request<SegmentCustomer[]>({\n method: \"POST\",\n path: `${this.base()}/${segmentId}/customers/search`,\n auth: authCtx,\n ...splitQuery(query, SEARCH_PAGING),\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 ...splitQuery(query, SEARCH_PAGING),\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 (\n segmentId: string,\n query: Record<string, unknown> & SearchPaging & { legalEntityId?: string },\n authCtx: AuthContext = SERVICE,\n ): Promise<SegmentItem[]> =>\n this.ctx.http.request<SegmentItem[]>({\n method: \"POST\",\n path: `${this.base()}/${segmentId}/items/search`,\n auth: authCtx,\n ...splitQuery(query, [...SEARCH_PAGING, \"legalEntityId\"]),\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","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\nimport type {\n Site,\n SiteInput,\n SiteCreated,\n SiteMixin,\n SiteMixins,\n SiteMixinCreated,\n} from \"./site-types\";\n\nexport type {\n Site,\n SiteAddress,\n SiteHomeBase,\n SiteInput,\n SiteCreated,\n SiteMixin,\n SiteMixins,\n SiteMixinCreated,\n} from \"./site-types\";\n\nconst ANON: AuthContext = auth.anonymous();\nconst SERVICE: AuthContext = auth.service();\n\n/**\n * Read-only access to the tenant's site catalog. List returns active sites\n * visible to the storefront context (the `site_manage` scope is only needed\n * to read inactive sites).\n */\nexport class SiteService {\n static readonly channel = \"site\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Lists active sites. */\n async list(authCtx: AuthContext = ANON): Promise<Site[]> {\n return this.ctx.http.request<Site[]>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites`,\n auth: authCtx,\n });\n }\n\n /** Retrieves one site by code. */\n async get(code: string, authCtx: AuthContext = ANON): Promise<Site> {\n return this.ctx.http.request<Site>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${code}`,\n auth: authCtx,\n });\n }\n\n /**\n * Returns the tenant's default site (the one with `default: true`).\n * Throws if no default is configured — a tenant should always have one.\n */\n async current(authCtx: AuthContext = ANON): Promise<Site> {\n const sites = await this.list(authCtx);\n const def = sites.find((s) => s.default);\n if (!def) {\n throw new Error(\n `SiteService.current: no default site for tenant \"${this.ctx.tenant}\"`,\n );\n }\n return def;\n }\n\n /** Lists just the tenant's site codes (`GET /siteslist`). Default auth: anonymous. */\n async listCodes(authCtx: AuthContext = ANON): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/siteslist`,\n auth: authCtx,\n });\n }\n\n // --- Admin writes. Default auth: service. ---\n\n /** Creates a site (`POST /sites`). Default auth: service. */\n async create(input: SiteInput, authCtx: AuthContext = SERVICE): Promise<SiteCreated> {\n return this.ctx.http.request<SiteCreated>({\n method: \"POST\",\n path: `/site/${this.ctx.tenant}/sites`,\n body: input,\n auth: authCtx,\n });\n }\n\n /**\n * Partially updates a site (`PATCH /sites/{siteCode}`). The endpoint responds\n * 200 without a defined body, so nothing is returned — re-read with\n * {@link get} when the updated site is needed. Default auth: service.\n */\n async update(siteCode: string, input: SiteInput, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n body: input,\n auth: authCtx,\n });\n }\n\n /**\n * Full-replaces a site (`PUT /sites/{siteCode}`). Like {@link update} it\n * returns nothing (200 with no defined body). `options.expand` is forwarded as\n * a query parameter. Default auth: service.\n */\n async replace(\n siteCode: string,\n input: SiteInput,\n options: { expand?: string } = {},\n authCtx: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n ...(options.expand === undefined ? {} : { query: { expand: options.expand } }),\n body: input,\n auth: authCtx,\n });\n }\n\n /** Deletes a site (`DELETE /sites/{siteCode}`). Default auth: service. */\n async delete(siteCode: string, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n auth: authCtx,\n });\n }\n\n /**\n * Site mixins (`/sites/{siteCode}/mixins`). Mixin content is an open map —\n * the spec defines no structure. Reads default to anonymous, writes to\n * service auth.\n */\n readonly mixins = {\n /** All mixin groups of a site, as a map of group name to content. */\n list: async (siteCode: string, authCtx: AuthContext = ANON): Promise<SiteMixins> =>\n this.ctx.http.request<SiteMixins>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins`,\n auth: authCtx,\n }),\n\n /** One mixin group's content by name. */\n get: async (siteCode: string, mixinName: string, authCtx: AuthContext = ANON): Promise<SiteMixin> =>\n this.ctx.http.request<SiteMixin>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n auth: authCtx,\n }),\n\n /** Adds a mixin to a site. Default auth: service. */\n create: async (\n siteCode: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<SiteMixinCreated> =>\n this.ctx.http.request<SiteMixinCreated>({\n method: \"POST\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins`,\n body: input,\n auth: authCtx,\n }),\n\n /**\n * Partially updates a mixin (PATCH). Responds 200 without a defined body,\n * so nothing is returned. Default auth: service.\n */\n update: async (\n siteCode: string,\n mixinName: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n body: input,\n auth: authCtx,\n });\n },\n\n /** Full-replaces a mixin (PUT). Returns nothing, like {@link update}. Default auth: service. */\n replace: async (\n siteCode: string,\n mixinName: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n body: input,\n auth: authCtx,\n });\n },\n\n /** Removes a mixin from a site. Default auth: service. */\n delete: async (siteCode: string, mixinName: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n auth: authCtx,\n });\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\nimport type {\n SessionContext,\n SessionContextPatch,\n SessionAttributeInput,\n} from \"./session-context-types\";\n\nexport type {\n SessionContext,\n SessionContextPatch,\n SessionContextData,\n SessionAttributeInput,\n} from \"./session-context-types\";\n\nconst ANON: AuthContext = auth.anonymous();\n\n/**\n * Session-context binding for the current storefront session. Every method here\n * hits a `/me/context` path, so the session-id comes from the `Authorization`\n * token — no path or query parameter required.\n *\n * **The service's other half is intentionally not wrapped.** Emporix also exposes\n * the same four operations addressed by an explicit session id —\n * `GET`/`PUT /{sessionId}/context`, `POST`/`DELETE` on its attributes. Those are\n * administrative: they let a caller read and rewrite *someone else's* session,\n * which is not a storefront capability and needs a service token. Wrapping them\n * here would put an admin surface on the object a storefront holds. If you need\n * them, build the request directly — the generated types are in\n * `../generated/session-context`.\n */\nexport class SessionContextService {\n static readonly channel = \"session-context\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /**\n * Retrieves the current session context, or `null` when the server returns\n * 404 (no session exists yet — the session-context is created server-side\n * only after the user creates a cart).\n */\n async get(authCtx: AuthContext = ANON): Promise<SessionContext | null> {\n try {\n return await this.ctx.http.request<SessionContext>({\n method: \"GET\",\n path: `/session-context/${this.ctx.tenant}/me/context`,\n auth: authCtx,\n });\n } catch (err) {\n if (isNotFound(err)) return null;\n throw err;\n }\n }\n\n /**\n * Partially updates the current session context. Returns `true` when the\n * PATCH was applied, `false` when there is no session context yet (the\n * server returned 404 on the version-lookup GET, so there is nothing to\n * update). Non-404 errors propagate.\n */\n async patch(input: SessionContextPatch, authCtx: AuthContext = ANON): Promise<boolean> {\n let version = input.version;\n if (version === undefined) {\n const current = await this.get(authCtx);\n if (current === null) return false;\n version = current.metadata?.version;\n if (version === undefined) {\n throw new Error(\n \"SessionContextService.patch: no metadata.version in server response\",\n );\n }\n }\n const { version: _v, ...fields } = input;\n void _v;\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/session-context/${this.ctx.tenant}/me/context`,\n body: {\n ...fields,\n metadata: { version },\n },\n auth: authCtx,\n });\n return true;\n }\n\n /** Adds an attribute to the current session context. Default auth: anonymous. */\n async addAttribute(\n attribute: SessionAttributeInput,\n authCtx: AuthContext = ANON,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/session-context/${this.ctx.tenant}/me/context/attributes`,\n body: attribute,\n auth: authCtx,\n });\n }\n\n /** Removes a named attribute from the current session context. Default auth: anonymous. */\n async removeAttribute(name: string, authCtx: AuthContext = ANON): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/session-context/${this.ctx.tenant}/me/context/attributes/${encodeURIComponent(name)}`,\n auth: authCtx,\n });\n }\n}\n\nfunction isNotFound(err: unknown): boolean {\n if (err && typeof err === \"object\") {\n const status = (err as { status?: unknown }).status;\n if (typeof status === \"number\" && status === 404) return true;\n }\n return false;\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { SEARCH_PAGING, splitQuery, type SearchPaging } from \"../core/search\";\nimport type {\n LegalEntity,\n LegalEntityCreate,\n LegalEntityUpdate,\n} from \"../generated/customer-management\";\n\n/** Input for `companies.search`: an Emporix `q`-syntax filter (body) plus {@link SearchPaging} (query). */\nexport type LegalEntitySearchInput = { q?: string } & SearchPaging;\n\n/**\n * Storefront-customer access to Legal Entities.\n *\n * `listMine`/`get` require `customermanagement.legalentity_read_own` on the\n * customer token. `create`/`update`/`delete` require the corresponding\n * `_manage` scopes — typically only granted to Admin-group customers; a 403\n * surfaces as `EmporixInsufficientScopeError`.\n */\nexport class CompaniesService {\n static readonly channel = \"customer-management\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/customer-management/${this.ctx.tenant}/legal-entities`;\n }\n\n /** Lists the legal entities the calling customer is assigned to. */\n async listMine(auth: AuthContext): Promise<LegalEntity[]> {\n return this.ctx.http.request<LegalEntity[]>({\n method: \"GET\",\n path: this.base(),\n auth,\n });\n }\n\n /** Fetches a single legal entity by id. */\n async get(legalEntityId: string, auth: AuthContext): Promise<LegalEntity> {\n return this.ctx.http.request<LegalEntity>({\n method: \"GET\",\n path: `${this.base()}/${legalEntityId}`,\n auth,\n });\n }\n\n /** Creates a legal entity. Requires `customermanagement.legalentity_manage`. */\n async create(input: LegalEntityCreate, auth: AuthContext): Promise<{ id: string }> {\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /**\n * Updates a legal entity via `PUT …/legal-entities/{id}` (upsert / full\n * replace). The live API rejects `PATCH` on this path with 405; send the\n * complete entity, as the server replaces the resource. The body stays typed\n * as a partial of `LegalEntityUpdate` for backward compatibility.\n */\n async update(\n legalEntityId: string,\n patch: Partial<LegalEntityUpdate>,\n auth: AuthContext,\n ): Promise<LegalEntity> {\n return this.ctx.http.request<LegalEntity>({\n method: \"PUT\",\n path: `${this.base()}/${legalEntityId}`,\n auth,\n body: patch,\n });\n }\n\n /** Deletes a legal entity (async cascade on the server). */\n async delete(legalEntityId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${legalEntityId}`,\n auth,\n });\n }\n\n /**\n * Searches legal entities via `POST /legal-entities/search` with an Emporix\n * `q`-syntax filter body; paging, sort and fields go in the query string.\n * Requires the same read scope as {@link listMine}.\n */\n async search(query: LegalEntitySearchInput, auth: AuthContext): Promise<LegalEntity[]> {\n return this.ctx.http.request<LegalEntity[]>({\n method: \"POST\",\n path: `${this.base()}/search`,\n auth,\n ...splitQuery(query, SEARCH_PAGING),\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n\n /**\n * Retrieves a legal entity's chain of parent entities\n * (`GET /legal-entities/{id}/parent-hierarchy`).\n */\n async parentHierarchy(legalEntityId: string, auth: AuthContext): Promise<LegalEntity[]> {\n return this.ctx.http.request<LegalEntity[]>({\n method: \"GET\",\n path: `${this.base()}/${legalEntityId}/parent-hierarchy`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n ContactAssignment,\n ContactAssignmentCreate,\n ContactAssignmentUpdate,\n} from \"../generated/customer-management\";\n\n/**\n * Manages contact assignments linking customers to legal entities.\n *\n * `listForCompany` requires `customermanagement.contactassignment_read`;\n * `assign`/`update`/`unassign` require `_manage`. The query param\n * `legalEntityId` scopes the list to one company.\n */\nexport class ContactsService {\n static readonly channel = \"customer-management\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/customer-management/${this.ctx.tenant}/contact-assignments`;\n }\n\n /** Lists contact assignments for one legal entity. */\n async listForCompany(legalEntityId: string, auth: AuthContext): Promise<ContactAssignment[]> {\n return this.ctx.http.request<ContactAssignment[]>({\n method: \"GET\",\n path: this.base(),\n query: { legalEntityId },\n auth,\n });\n }\n\n /** Creates a contact assignment. */\n async assign(input: ContactAssignmentCreate, auth: AuthContext): Promise<{ id: string }> {\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /**\n * Updates a contact assignment via `PUT …/contact-assignments/{id}` (upsert /\n * full replace). The live API rejects `PATCH` on this path with 405; send the\n * complete entity, as the server replaces the resource. The body stays typed\n * as a partial of `ContactAssignmentUpdate` for backward compatibility.\n */\n async update(\n contactAssignmentId: string,\n patch: Partial<ContactAssignmentUpdate>,\n auth: AuthContext,\n ): Promise<ContactAssignment> {\n return this.ctx.http.request<ContactAssignment>({\n method: \"PUT\",\n path: `${this.base()}/${contactAssignmentId}`,\n auth,\n body: patch,\n });\n }\n\n /** Deletes a contact assignment. */\n async unassign(contactAssignmentId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${contactAssignmentId}`,\n auth,\n });\n }\n\n /** Fetches a single contact assignment by id. */\n async get(contactAssignmentId: string, auth: AuthContext): Promise<ContactAssignment> {\n return this.ctx.http.request<ContactAssignment>({\n method: \"GET\",\n path: `${this.base()}/${contactAssignmentId}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Location,\n LocationCreate,\n LocationUpdate,\n} from \"../generated/customer-management\";\n\n/**\n * Manages locations owned by a legal entity. Three types are supported:\n * HEADQUARTER, WAREHOUSE, OFFICE.\n *\n * Reads require `customermanagement.location_read`; mutations require\n * `_manage`.\n */\nexport class LocationsService {\n static readonly channel = \"customer-management\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/customer-management/${this.ctx.tenant}/locations`;\n }\n\n /** Lists locations owned by one legal entity. */\n async listForCompany(legalEntityId: string, auth: AuthContext): Promise<Location[]> {\n return this.ctx.http.request<Location[]>({\n method: \"GET\",\n path: this.base(),\n query: { legalEntityId },\n auth,\n });\n }\n\n /** Fetches one location by id. */\n async get(locationId: string, auth: AuthContext): Promise<Location> {\n return this.ctx.http.request<Location>({\n method: \"GET\",\n path: `${this.base()}/${locationId}`,\n auth,\n });\n }\n\n /** Creates a location for a legal entity. */\n async create(input: LocationCreate, auth: AuthContext): Promise<{ id: string }> {\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /**\n * Updates a location via `PUT …/locations/{id}` (upsert / full replace). The\n * live API rejects `PATCH` on this path with 405; send the complete entity,\n * as the server replaces the resource. The body stays typed as a partial of\n * `LocationUpdate` for backward compatibility.\n */\n async update(\n locationId: string,\n patch: Partial<LocationUpdate>,\n auth: AuthContext,\n ): Promise<Location> {\n return this.ctx.http.request<Location>({\n method: \"PUT\",\n path: `${this.base()}/${locationId}`,\n auth,\n body: patch,\n });\n }\n\n /** Deletes a location. */\n async delete(locationId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${locationId}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n IamUser,\n IamUserDetail,\n IamUserCreate,\n IamUserUpdate,\n IamUserScopes,\n IamUserCreated,\n IamGroup,\n IamGroupCreate,\n IamGroupUpdate,\n IamGroupCreated,\n IamGroupMemberInput,\n IamGroupMemberCreated,\n IamAccessControl,\n IamAccessControlUpsert,\n IamAccessControlCreated,\n IamScope,\n IamScopeUpsert,\n IamScopeCreated,\n} from \"./iam-types\";\n\nexport type * from \"./iam-types\";\n\n/**\n * IAM admin CRUD: users, user-groups, access-controls, scopes. Every method\n * requires an explicit `auth` (admin/service token; `getMe*` take the caller's\n * customer token). The deprecated legacy-RBAC model (roles/permissions/\n * resources/templates) is intentionally not wrapped.\n */\nexport class IamService {\n static readonly channel = \"iam\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/iam/${this.ctx.tenant}`;\n }\n\n readonly users = {\n list: async (auth: AuthContext, query?: Record<string, string | number>): Promise<IamUser[]> =>\n this.ctx.http.request<IamUser[]>({\n method: \"GET\",\n path: `${this.base()}/users`,\n auth,\n ...(query ? { query } : {}),\n }),\n create: async (input: IamUserCreate, auth: AuthContext): Promise<IamUserCreated> =>\n this.ctx.http.request<IamUserCreated>({\n method: \"POST\",\n path: `${this.base()}/users`,\n auth,\n body: input,\n }),\n get: async (userId: string, auth: AuthContext): Promise<IamUserDetail> =>\n this.ctx.http.request<IamUserDetail>({\n method: \"GET\",\n path: `${this.base()}/users/${userId}`,\n auth,\n }),\n getMe: async (auth: AuthContext): Promise<IamUserDetail> =>\n this.ctx.http.request<IamUserDetail>({\n method: \"GET\",\n path: `${this.base()}/users/me`,\n auth,\n }),\n update: async (userId: string, input: IamUserUpdate, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/users/${userId}`,\n auth,\n body: input,\n });\n },\n delete: async (userId: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/users/${userId}`,\n auth,\n });\n },\n /**\n * Lists one vendor's Management Dashboard users, with their groups\n * (`GET /users/vendors/{vendorId}`).\n */\n listForVendor: async (vendorId: string, auth: AuthContext): Promise<IamUser[]> =>\n this.ctx.http.request<IamUser[]>({\n method: \"GET\",\n path: `${this.base()}/users/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n }),\n getGroups: async (userId: string, auth: AuthContext): Promise<IamGroup[]> =>\n this.ctx.http.request<IamGroup[]>({\n method: \"GET\",\n path: `${this.base()}/users/${userId}/groups`,\n auth,\n }),\n /** Removes a user from every group at once (`DELETE /users/{userId}/groups`, `204`). */\n removeFromAllGroups: async (userId: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/users/${encodeURIComponent(userId)}/groups`,\n auth,\n });\n },\n /**\n * Reads one of a user's groups (`GET /users/{userId}/groups/{groupId}`).\n * The collection read above returns the same shape per entry; this exists\n * because Emporix exposes the item separately and a caller holding both ids\n * should not have to page the collection to resolve one group.\n */\n getGroup: async (userId: string, groupId: string, auth: AuthContext): Promise<IamGroup> =>\n this.ctx.http.request<IamGroup>({\n method: \"GET\",\n path: `${this.base()}/users/${encodeURIComponent(userId)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n }),\n getScopes: async (userId: string, auth: AuthContext): Promise<IamUserScopes> =>\n this.ctx.http.request<IamUserScopes>({\n method: \"GET\",\n path: `${this.base()}/users/${userId}/scopes`,\n auth,\n }),\n getMyScopes: async (auth: AuthContext): Promise<IamUserScopes> =>\n this.ctx.http.request<IamUserScopes>({\n method: \"GET\",\n path: `${this.base()}/users/me/scopes`,\n auth,\n }),\n getAccessControls: async (userId: string, auth: AuthContext): Promise<IamAccessControl[]> =>\n this.ctx.http.request<IamAccessControl[]>({\n method: \"GET\",\n path: `${this.base()}/users/${userId}/access-controls`,\n auth,\n }),\n getMyAccessControls: async (auth: AuthContext): Promise<IamAccessControl[]> =>\n this.ctx.http.request<IamAccessControl[]>({\n method: \"GET\",\n path: `${this.base()}/users/me/access-controls`,\n auth,\n }),\n };\n\n readonly groups = {\n list: async (auth: AuthContext, query?: Record<string, string | number>): Promise<IamGroup[]> =>\n this.ctx.http.request<IamGroup[]>({\n method: \"GET\",\n path: `${this.base()}/groups`,\n auth,\n ...(query ? { query } : {}),\n }),\n create: async (input: IamGroupCreate, auth: AuthContext): Promise<IamGroupCreated> =>\n this.ctx.http.request<IamGroupCreated>({\n method: \"POST\",\n path: `${this.base()}/groups`,\n auth,\n body: input,\n }),\n get: async (groupId: string, auth: AuthContext): Promise<IamGroup> =>\n this.ctx.http.request<IamGroup>({\n method: \"GET\",\n path: `${this.base()}/groups/${groupId}`,\n auth,\n }),\n update: async (groupId: string, input: IamGroupUpdate, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/groups/${groupId}`,\n auth,\n body: input,\n });\n },\n delete: async (groupId: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/groups/${groupId}`,\n auth,\n });\n },\n listUsers: async (groupId: string, auth: AuthContext): Promise<IamUser[]> =>\n this.ctx.http.request<IamUser[]>({\n method: \"GET\",\n path: `${this.base()}/groups/${groupId}/users`,\n auth,\n }),\n addUser: async (\n groupId: string,\n input: IamGroupMemberInput,\n auth: AuthContext,\n ): Promise<IamGroupMemberCreated> =>\n this.ctx.http.request<IamGroupMemberCreated>({\n method: \"POST\",\n path: `${this.base()}/groups/${groupId}/users`,\n auth,\n body: input,\n }),\n updateUser: async (\n groupId: string,\n userType: string,\n userId: string,\n input: IamGroupMemberInput,\n auth: AuthContext,\n ): Promise<IamGroupMemberCreated> =>\n this.ctx.http.request<IamGroupMemberCreated>({\n method: \"PUT\",\n path: `${this.base()}/groups/${groupId}/users/${userType}/${userId}`,\n auth,\n body: input,\n }),\n removeAllUsers: async (groupId: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/groups/${groupId}/users`,\n auth,\n });\n },\n listAccessControls: async (groupId: string, auth: AuthContext): Promise<IamAccessControl[]> =>\n this.ctx.http.request<IamAccessControl[]>({\n method: \"GET\",\n path: `${this.base()}/groups/${groupId}/access-controls`,\n auth,\n }),\n };\n\n readonly accessControls = {\n list: async (auth: AuthContext): Promise<IamAccessControl[]> =>\n this.ctx.http.request<IamAccessControl[]>({\n method: \"GET\",\n path: `${this.base()}/access-controls`,\n auth,\n }),\n get: async (id: string, auth: AuthContext): Promise<IamAccessControl> =>\n this.ctx.http.request<IamAccessControl>({\n method: \"GET\",\n path: `${this.base()}/access-controls/${id}`,\n auth,\n }),\n upsert: async (\n id: string,\n input: IamAccessControlUpsert,\n auth: AuthContext,\n ): Promise<IamAccessControlCreated> =>\n this.ctx.http.request<IamAccessControlCreated>({\n method: \"PUT\",\n path: `${this.base()}/access-controls/${id}`,\n auth,\n body: input,\n }),\n delete: async (id: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/access-controls/${id}`,\n auth,\n });\n },\n };\n\n readonly scopes = {\n list: async (auth: AuthContext): Promise<IamScope[]> =>\n this.ctx.http.request<IamScope[]>({\n method: \"GET\",\n path: `${this.base()}/scopes`,\n auth,\n }),\n get: async (scopeId: string, auth: AuthContext): Promise<IamScope> =>\n this.ctx.http.request<IamScope>({\n method: \"GET\",\n path: `${this.base()}/scopes/${scopeId}`,\n auth,\n }),\n upsertCustom: async (\n scopeId: string,\n input: IamScopeUpsert,\n auth: AuthContext,\n ): Promise<IamScopeCreated> =>\n this.ctx.http.request<IamScopeCreated>({\n method: \"PUT\",\n path: `${this.base()}/scopes/${scopeId}`,\n auth,\n body: input,\n }),\n deleteCustom: async (scopeId: string, auth: AuthContext): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/scopes/${scopeId}`,\n auth,\n });\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { GroupsQueryDocument, AssignmentCreateRequest } from \"../generated/iam\";\nimport { IamService } from \"./iam\";\n\n/**\n * Access to IAM customer groups for a legal entity. Thin B2B-friendly wrapper\n * over {@link IamService.groups}; kept for backward compatibility.\n *\n * `listForCompany` requires `iam.group_read`; the member mutations\n * (`addMember`/`removeMember`) require `iam.group_manage` — typically only\n * granted to Admin-group customers; a 403 surfaces as\n * `EmporixInsufficientScopeError`.\n */\nexport class CustomerGroupsService {\n static readonly channel = \"iam\" as const;\n private readonly iam: IamService;\n constructor(private readonly ctx: ClientContext) {\n this.iam = new IamService(ctx);\n }\n\n /** Lists customer groups belonging to one legal entity. */\n async listForCompany(legalEntityId: string, auth: AuthContext): Promise<GroupsQueryDocument[]> {\n return this.iam.groups.list(auth, { \"b2b.legalEntityId\": legalEntityId });\n }\n\n /** Adds a user (customer or employee) to a group. */\n async addMember(\n groupId: string,\n member: AssignmentCreateRequest,\n auth: AuthContext,\n ): Promise<{ id: string }> {\n // `addUser` returns `AssignmentIdResponse` (id optional); the original public\n // contract is `{ id: string }` (the old `request<{id:string}>` asserted the\n // same). Cast to preserve that contract — the wire body is identical.\n return (await this.iam.groups.addUser(groupId, member, auth)) as { id: string };\n }\n\n /**\n * Removes a user from a group. Uses `DELETE …/groups/{groupId}/users/{userId}`\n * directly — this endpoint is deprecated upstream and intentionally not\n * exposed on {@link IamService}, so it is not delegated. No non-deprecated\n * single-user removal exists.\n */\n async removeMember(groupId: string, userId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/iam/${this.ctx.tenant}/groups/${groupId}/users/${userId}`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery, type QueryFor } from \"../core/query\";\nimport type {\n Order,\n OrderStatus,\n OrderUpdateDto,\n SalesOrder,\n Transition,\n SalesOrderCreationDto,\n ResourceLocation,\n SearchRequest,\n HistoricalTransitionsResponse,\n OrderCalculationDto,\n OrderEntriesDto,\n OrderSplitRequest,\n OrderSplitResponse,\n} from \"../generated/order-v2\";\n\n/**\n * Salesorder PATCH body. The generated `orderUpdateDto` models a full order\n * (it requires `entries`/`customer`), but `PATCH /salesorders/{id}` accepts a\n * subset — so the SDK exposes a partial of it.\n */\nexport type SalesOrderPatch = Partial<OrderUpdateDto>;\n\n/** Body for creating a sales-order as an employee (`POST /salesorders`). */\nexport type SalesOrderCreateInput = SalesOrderCreationDto;\n\n/** Id/location envelope returned when a sales-order is created. */\nexport type SalesOrderCreated = ResourceLocation;\n\n/** Body for a full sales-order replace (`PUT /salesorders/{id}`). */\nexport type SalesOrderReplaceInput = OrderUpdateDto;\n\n/** Body for `salesOrders.search` (`POST /salesorders/search`). */\nexport type SalesOrderSearchInput = SearchRequest;\n\n/** Response of `salesOrders.listHistoricalTransitions`. */\nexport type SalesOrderHistoricalTransitions = HistoricalTransitionsResponse;\n\n/** Body for `salesOrders.calculate` (`POST /salesorders/{id}/calculations`). */\nexport type SalesOrderCalculationInput = OrderCalculationDto;\n\n/** Body for `salesOrders.updateEntries` (`POST /salesorders/{id}/entries`). */\nexport type SalesOrderEntriesInput = OrderEntriesDto;\n\n/** Body for `salesOrders.split` (`POST /salesorders/{id}/split`). */\nexport type SalesOrderSplitInput = OrderSplitRequest;\n\n/** Response of `salesOrders.split`. */\nexport type SalesOrderSplitResult = OrderSplitResponse;\n\n/** Options for `salesOrders.list`. */\nexport interface ListSalesOrdersOptions {\n pageNumber?: number;\n pageSize?: number;\n sort?: string;\n fields?: string;\n /** A `q` filter — raw DSL string or a built filter for entity \"ORDER\". */\n q?: QueryFor<\"ORDER\">;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/** Options for `orders.listForLegalEntity`. */\nexport interface ListLegalEntityOrdersOptions {\n pageNumber?: number;\n pageSize?: number;\n sort?: string;\n saasToken?: string;\n /** A `q` filter — raw DSL string or a built filter for entity \"ORDER\". */\n q?: QueryFor<\"ORDER\">;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/** Optional fields supported by the order-v2 list endpoint. */\nexport interface ListMyOrdersOptions {\n pageNumber?: number;\n pageSize?: number;\n status?: OrderStatus;\n legalEntityId?: string;\n siteCode?: string;\n saasToken?: string;\n /** A `q` filter — raw DSL string or a built filter (e.g. mixinQuery for entity \"ORDER\"). */\n q?: QueryFor<\"ORDER\">;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/** Options for single-order reads (saas-token only). */\nexport interface GetOrderOptions {\n saasToken?: string;\n}\n\n/** Options for status transitions. */\nexport interface OrderTransitionOptions {\n saasToken?: string;\n comment?: string;\n}\n\n/** Options for `salesOrders.update`. */\nexport interface UpdateSalesOrderOptions {\n /** Forwarded as `?recalculate=`. Omit to use the server default (true). */\n recalculate?: boolean;\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/**\n * Storefront-customer access to Order-v2's customer endpoints.\n *\n * `listMine`/`get` require `order.order_read_own`; transitions require\n * `order.order_manage_own`. All methods accept an optional `saasToken` that\n * is passed as the `saas-token` header (mirrors `checkout.placeOrder`).\n */\nexport class OrdersService {\n static readonly channel = \"orders\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/order-v2/${this.ctx.tenant}/orders`;\n }\n\n private saasHeader(saasToken: string | undefined): Record<string, string> | undefined {\n return saasToken ? { \"saas-token\": saasToken } : undefined;\n }\n\n /** Lists the calling customer's orders. */\n async listMine(\n auth: AuthContext,\n opts: ListMyOrdersOptions = {},\n ): Promise<PaginatedItems<Order>> {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 50;\n const query: Record<string, string | number | undefined> = {\n pageNumber,\n pageSize,\n };\n setIfDefined(query, \"status\", opts.status);\n setIfDefined(query, \"legalEntityId\", opts.legalEntityId);\n setIfDefined(query, \"siteCode\", opts.siteCode);\n if (opts.q !== undefined) {\n setIfDefined(query, \"q\", resolveQuery(opts.q, { compoundLogicalQuery: false }));\n }\n const headers = this.saasHeader(opts.saasToken);\n // order-v2 returns a bare JSON array, not a {items,...} envelope — the total\n // lives in the X-Total-Count header, which `requestPage` reads when the\n // caller opts in with `totalCount: true`.\n return requestPage<Order>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.base(),\n query,\n auth,\n ...(headers ? { headers } : {}),\n },\n {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n },\n );\n }\n\n /** Fetches one of the calling customer's orders by id. */\n async get(\n orderId: string,\n auth: AuthContext,\n opts: GetOrderOptions = {},\n ): Promise<Order> {\n const headers = this.saasHeader(opts.saasToken);\n return this.ctx.http.request<Order>({\n method: \"GET\",\n path: `${this.base()}/${orderId}`,\n auth,\n ...(headers ? { headers } : {}),\n });\n }\n\n /**\n * The status transitions the customer may trigger on one of their orders\n * (`GET /orders/{orderId}/transitions`) — for example whether it can still be\n * cancelled, before offering {@link cancel}.\n */\n async listTransitions(\n orderId: string,\n auth: AuthContext,\n opts: GetOrderOptions = {},\n ): Promise<Transition[]> {\n const headers = this.saasHeader(opts.saasToken);\n return this.ctx.http.request<Transition[]>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(orderId)}/transitions`,\n auth,\n ...(headers ? { headers } : {}),\n });\n }\n\n /** Transitions an order to a new status. Server enforces legal transitions. */\n async transition(\n orderId: string,\n status: OrderStatus,\n auth: AuthContext,\n opts: OrderTransitionOptions = {},\n ): Promise<void> {\n const body: { status: OrderStatus; comment?: string } = { status };\n if (opts.comment !== undefined) body.comment = opts.comment;\n const headers = this.saasHeader(opts.saasToken);\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${orderId}/transitions`,\n auth,\n body,\n ...(headers ? { headers } : {}),\n });\n }\n\n /** Convenience: transitions to `DECLINED` (customer cancel). */\n async cancel(\n orderId: string,\n auth: AuthContext,\n opts: { saasToken?: string } = {},\n ): Promise<void> {\n await this.transition(orderId, \"DECLINED\", auth, opts);\n }\n\n /**\n * Lists a legal entity's orders (`GET /legal-entity-orders/{legalEntityId}`),\n * wrapped into `PaginatedItems`. B2B storefront view — requires a customer\n * token with access to the legal entity.\n */\n async listForLegalEntity(\n legalEntityId: string,\n auth: AuthContext,\n opts: ListLegalEntityOrdersOptions = {},\n ): Promise<PaginatedItems<SalesOrder>> {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 50;\n const query: Record<string, string | number | undefined> = { pageNumber, pageSize };\n setIfDefined(query, \"sort\", opts.sort);\n if (opts.q !== undefined) {\n setIfDefined(query, \"q\", resolveQuery(opts.q, { compoundLogicalQuery: false }));\n }\n const headers = this.saasHeader(opts.saasToken);\n return requestPage<SalesOrder>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/order-v2/${this.ctx.tenant}/legal-entity-orders/${legalEntityId}`,\n query,\n auth,\n ...(headers ? { headers } : {}),\n },\n {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n },\n );\n }\n\n /**\n * Fetches one order within a legal entity\n * (`GET /legal-entity-orders/{legalEntityId}/{orderId}`).\n */\n async getForLegalEntity(\n legalEntityId: string,\n orderId: string,\n auth: AuthContext,\n opts: { saasToken?: string } = {},\n ): Promise<SalesOrder> {\n const headers = this.saasHeader(opts.saasToken);\n return this.ctx.http.request<SalesOrder>({\n method: \"GET\",\n path: `/order-v2/${this.ctx.tenant}/legal-entity-orders/${legalEntityId}/${orderId}`,\n auth,\n ...(headers ? { headers } : {}),\n });\n }\n}\n\n/**\n * Backend / service-account access to the merchant-facing\n * `/salesorders/{id}` resource. Requires `order.order_read` (read) /\n * `order.order_manage` (update) scopes on a service token.\n *\n * The full admin list + filter surface is deferred to a follow-up\n * sub-spec. This service ships only single-resource read + patch — the\n * common backend use case (e.g. mixin updates after fulfilment).\n */\nexport class SalesOrdersService {\n static readonly channel = \"sales-orders\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/order-v2/${this.ctx.tenant}/salesorders`;\n }\n\n /** Fetches a single sales-order by id. */\n async get(orderId: string, auth: AuthContext): Promise<Order> {\n return this.ctx.http.request<Order>({\n method: \"GET\",\n path: `${this.base()}/${orderId}`,\n auth,\n });\n }\n\n /**\n * Patches an existing order (status, mixins, customAttributes, metadata).\n * Resolves on the `204`, which carries no body — read the order back with\n * {@link get} for its new state.\n */\n async update(\n orderId: string,\n patch: SalesOrderPatch,\n auth: AuthContext,\n opts: UpdateSalesOrderOptions = {},\n ): Promise<void> {\n const query: Record<string, string> = {};\n if (opts.recalculate === false) query.recalculate = \"false\";\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${orderId}`,\n auth,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n body: patch,\n });\n }\n\n /** Lists tenant sales-orders (`GET /salesorders`), wrapped into `PaginatedItems`. */\n async list(auth: AuthContext, opts: ListSalesOrdersOptions = {}): Promise<PaginatedItems<SalesOrder>> {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 50;\n const query: Record<string, string | number | undefined> = { pageNumber, pageSize };\n setIfDefined(query, \"sort\", opts.sort);\n setIfDefined(query, \"fields\", opts.fields);\n if (opts.q !== undefined) {\n setIfDefined(query, \"q\", resolveQuery(opts.q, { compoundLogicalQuery: false }));\n }\n return requestPage<SalesOrder>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.base(),\n query,\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n },\n );\n }\n\n /** Searches tenant sales-orders (`POST /salesorders/search`, body carries the `q` filter). */\n async search(\n query: SalesOrderSearchInput,\n auth: AuthContext,\n opts: { pageNumber?: number; pageSize?: number; sort?: string; fields?: string } = {},\n ): Promise<SalesOrder[]> {\n const q: Record<string, string | number | undefined> = {};\n setIfDefined(q, \"pageNumber\", opts.pageNumber);\n setIfDefined(q, \"pageSize\", opts.pageSize);\n setIfDefined(q, \"sort\", opts.sort);\n setIfDefined(q, \"fields\", opts.fields);\n return this.ctx.http.request<SalesOrder[]>({\n method: \"POST\",\n path: `${this.base()}/search`,\n ...(Object.keys(q).length > 0 ? { query: q } : {}),\n body: query,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n auth,\n });\n }\n\n /** Creates a sales-order as an employee (`POST /salesorders`). Returns the created resource location. */\n async create(input: SalesOrderCreateInput, auth: AuthContext): Promise<SalesOrderCreated> {\n return this.ctx.http.request<SalesOrderCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /**\n * Full-replaces a sales-order (`PUT /salesorders/{orderId}`, body `OrderUpdateDto`).\n * The endpoint returns 204, so the order is re-fetched (direct GET) and returned.\n * Note: `update` on this class is the PATCH (partial); `replace` is the PUT (full).\n */\n async replace(orderId: string, input: SalesOrderReplaceInput, auth: AuthContext): Promise<SalesOrder> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${orderId}`,\n auth,\n body: input,\n });\n return this.ctx.http.request<SalesOrder>({\n method: \"GET\",\n path: `${this.base()}/${orderId}`,\n auth,\n });\n }\n\n /** Deletes a sales-order (`DELETE /salesorders/{orderId}`). */\n async delete(orderId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${orderId}`,\n auth,\n });\n }\n\n /** Lists the available transitions for a sales-order (`GET /salesorders/{orderId}/transitions`). */\n async listTransitions(orderId: string, auth: AuthContext): Promise<Transition[]> {\n return this.ctx.http.request<Transition[]>({\n method: \"GET\",\n path: `${this.base()}/${orderId}/transitions`,\n auth,\n });\n }\n\n /** Transitions a sales-order to a new status (`POST /salesorders/{orderId}/transitions`). */\n async transition(orderId: string, input: Transition, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${orderId}/transitions`,\n auth,\n body: input,\n });\n }\n\n /** Lists the historical transitions of a sales-order (`GET /salesorders/{orderId}/historical-transitions`). */\n async listHistoricalTransitions(orderId: string, auth: AuthContext): Promise<SalesOrderHistoricalTransitions> {\n return this.ctx.http.request<SalesOrderHistoricalTransitions>({\n method: \"GET\",\n path: `${this.base()}/${orderId}/historical-transitions`,\n auth,\n });\n }\n\n /** Calculates order-entry totals for a sales-order (`POST /salesorders/{orderId}/calculations`). */\n async calculate(orderId: string, input: SalesOrderCalculationInput, auth: AuthContext): Promise<unknown> {\n return this.ctx.http.request<unknown>({\n method: \"POST\",\n path: `${this.base()}/${orderId}/calculations`,\n auth,\n body: input,\n });\n }\n\n /** Updates a sales-order's entries (`POST /salesorders/{orderId}/entries`). Returns the updated order. */\n async updateEntries(orderId: string, input: SalesOrderEntriesInput, auth: AuthContext): Promise<SalesOrder> {\n return this.ctx.http.request<SalesOrder>({\n method: \"POST\",\n path: `${this.base()}/${orderId}/entries`,\n auth,\n body: input,\n });\n }\n\n /** Splits a sales-order (`POST /salesorders/{orderId}/split`). */\n async split(orderId: string, input: SalesOrderSplitInput, auth: AuthContext): Promise<SalesOrderSplitResult> {\n return this.ctx.http.request<SalesOrderSplitResult>({\n method: \"POST\",\n path: `${this.base()}/${orderId}/split`,\n auth,\n body: input,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError } from \"../core/errors\";\nimport type {\n Availability,\n AvailabilityInput,\n AvailabilityCreated,\n AvailabilityBulkInput,\n AvailabilityBulkDeleteInput,\n AvailabilityBulkResult,\n} from \"./availability-types\";\n\nexport type {\n Availability,\n AvailabilityInput,\n AvailabilityCreated,\n AvailabilityBulkInput,\n AvailabilityBulkDeleteInput,\n AvailabilityBulkResult,\n} from \"./availability-types\";\n\n/** Shared options for {@link AvailabilityService} reads. */\nexport interface AvailabilityOptions {\n /**\n * When `true`, a product with no availability record resolves to a default\n * `{ available: true }` instead of throwing (single `get`) / being marked\n * unavailable (`getMany`). Off by default — opt in for tenants that sell\n * without stock management.\n */\n defaultAvailableOnNotFound?: boolean;\n}\n\nconst ANON: AuthContext = { kind: \"anonymous\" };\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Reads product availability per site. Default auth is anonymous (like\n * `PriceService.matchByContext`); pass a customer/raw/service context to use a\n * different token. Requires the `availability.availability_view` scope on\n * whichever token is used.\n */\nexport class AvailabilityService {\n static readonly channel = \"availability\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /**\n * Single product. Resolves the availability record, or — when\n * `opts.defaultAvailableOnNotFound` is set — a default available record on 404.\n */\n async get(\n productId: string,\n siteCode: string,\n auth: AuthContext = ANON,\n opts: AvailabilityOptions = {},\n ): Promise<Availability> {\n try {\n return await this.ctx.http.request<Availability>({\n method: \"GET\",\n path: `/availability/${this.ctx.tenant}/availability/${encodeURIComponent(\n productId,\n )}/${encodeURIComponent(siteCode)}`,\n auth,\n });\n } catch (err) {\n if (err instanceof EmporixNotFoundError && opts.defaultAvailableOnNotFound) {\n return { productId, site: siteCode, available: true };\n }\n throw err;\n }\n }\n\n /**\n * Batch read via `POST .../availability/search` (one request). Products with\n * no availability record are absent from the response; each is synthesized as\n * `{ available: false }` (or `{ available: true }` when\n * `opts.defaultAvailableOnNotFound` is set). The result preserves input order\n * and length. An empty `productIds` resolves to `[]` without a request.\n */\n async getMany(\n productIds: string[],\n siteCode: string,\n auth: AuthContext = ANON,\n opts: AvailabilityOptions = {},\n ): Promise<Availability[]> {\n if (productIds.length === 0) return [];\n const found = await this.ctx.http.request<Availability[]>({\n method: \"POST\",\n path: `/availability/${this.ctx.tenant}/availability/search`,\n auth,\n query: { site: siteCode, pageSize: productIds.length },\n body: productIds,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n const byId = new Map<string, Availability>();\n for (const a of found) if (a.productId) byId.set(a.productId, a);\n return productIds.map(\n (id) =>\n byId.get(id) ?? {\n productId: id,\n site: siteCode,\n available: Boolean(opts.defaultAvailableOnNotFound),\n },\n );\n }\n\n /**\n * Lists every availability record for a site (`GET /availability/site/{site}`),\n * wrapped into `PaginatedItems`. Default auth: anonymous.\n */\n async listForSite(\n siteCode: string,\n params: { pageNumber?: number; pageSize?: number; q?: string; sort?: string; totalCount?: boolean } = {},\n auth: AuthContext = ANON,\n ): Promise<PaginatedItems<Availability>> {\n const pageNumber = params.pageNumber ?? 1;\n const pageSize = params.pageSize ?? 50;\n return requestPage<Availability>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `/availability/${this.ctx.tenant}/availability/site/${encodeURIComponent(siteCode)}`,\n query: {\n pageNumber,\n pageSize,\n ...(params.q === undefined ? {} : { q: params.q }),\n ...(params.sort === undefined ? {} : { sort: params.sort }),\n },\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(params.totalCount === undefined ? {} : { totalCount: params.totalCount }),\n },\n );\n }\n\n // --- Admin writes. Default auth: service. ---\n\n /**\n * Creates an availability record for a product on a site\n * (`POST /availability/{productId}/{site}`). Responds 409 when the record\n * already exists — use {@link update} to upsert. Default auth: service.\n */\n async create(\n productId: string,\n siteCode: string,\n input: AvailabilityInput,\n auth: AuthContext = SERVICE,\n ): Promise<AvailabilityCreated> {\n return this.ctx.http.request<AvailabilityCreated>({\n method: \"POST\",\n path: `/availability/${this.ctx.tenant}/availability/${encodeURIComponent(\n productId,\n )}/${encodeURIComponent(siteCode)}`,\n body: input,\n auth,\n });\n }\n\n /**\n * Upserts a product's availability on a site\n * (`PUT /availability/{productId}/{site}`). Returns the created record's id\n * on 201 and nothing on 204. This endpoint has no PATCH counterpart.\n * Default auth: service.\n */\n async update(\n productId: string,\n siteCode: string,\n input: AvailabilityInput,\n auth: AuthContext = SERVICE,\n ): Promise<AvailabilityCreated | void> {\n return this.ctx.http.request<AvailabilityCreated | void>({\n method: \"PUT\",\n path: `/availability/${this.ctx.tenant}/availability/${encodeURIComponent(\n productId,\n )}/${encodeURIComponent(siteCode)}`,\n body: input,\n auth,\n });\n }\n\n /**\n * Deletes a product's availability on a site\n * (`DELETE /availability/{productId}/{site}`). Default auth: service.\n */\n async delete(productId: string, siteCode: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/availability/${this.ctx.tenant}/availability/${encodeURIComponent(\n productId,\n )}/${encodeURIComponent(siteCode)}`,\n auth,\n });\n }\n\n /**\n * Bulk-creates availability records (`POST /availability/bulk`). Responds 207\n * Multi-Status: partial failures do **not** throw — inspect each entry.\n *\n * `options.vendorId` limits the operation to a vendor's products. It is sent\n * as the `vendor-id` header. **Note:** the OpenAPI schema spells this header\n * `venodr-id`, which is an evident upstream typo (the body field is\n * `vendorId`); the SDK sends the corrected name. Unverified against the live\n * API — if the service really expects the misspelling, the filter silently\n * has no effect.\n *\n * Default auth: service.\n */\n async bulkCreate(\n input: AvailabilityBulkInput[],\n options: { vendorId?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<AvailabilityBulkResult[]> {\n return this.ctx.http.request<AvailabilityBulkResult[]>({\n method: \"POST\",\n path: `/availability/${this.ctx.tenant}/availability/bulk`,\n ...(options.vendorId === undefined ? {} : { headers: { \"vendor-id\": options.vendorId } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Bulk-updates availability records (`PUT /availability/bulk`). Responds 207\n * Multi-Status: partial failures do **not** throw — inspect each entry. See\n * {@link bulkCreate} for the `vendorId` header caveat. Default auth: service.\n */\n async bulkUpdate(\n input: AvailabilityBulkInput[],\n options: { vendorId?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<AvailabilityBulkResult[]> {\n return this.ctx.http.request<AvailabilityBulkResult[]>({\n method: \"PUT\",\n path: `/availability/${this.ctx.tenant}/availability/bulk`,\n ...(options.vendorId === undefined ? {} : { headers: { \"vendor-id\": options.vendorId } }),\n body: input,\n auth,\n });\n }\n\n /**\n * Bulk-deletes availability records (`DELETE /availability/bulk`). Unusually\n * for a DELETE, this endpoint takes a body listing the records to remove.\n * Responds 207 Multi-Status: partial failures do **not** throw — inspect each\n * entry. See {@link bulkCreate} for the `vendorId` header caveat. Default\n * auth: service.\n */\n async bulkDelete(\n input: AvailabilityBulkDeleteInput[],\n options: { vendorId?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<AvailabilityBulkResult[]> {\n return this.ctx.http.request<AvailabilityBulkResult[]>({\n method: \"DELETE\",\n path: `/availability/${this.ctx.tenant}/availability/bulk`,\n ...(options.vendorId === undefined ? {} : { headers: { \"vendor-id\": options.vendorId } }),\n body: input,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Configuration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nexport type { Configuration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Tenant-wide configuration (`/configuration/{tenant}/configurations`).\n * Requires the backend-only `configuration.configuration_view` /\n * `configuration.configuration_manage` scopes — default auth: service.\n * Server-side use only; the service token must never reach a browser.\n */\nexport class TenantConfigService {\n static readonly channel = \"configuration\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/configuration/${this.ctx.tenant}/configurations`;\n }\n\n /** List tenant configurations, optionally filtered by `keys`. */\n async list(opts: ListConfigOptions = {}, auth: AuthContext = SERVICE): Promise<Configuration[]> {\n const query = opts.keys && opts.keys.length > 0 ? { keys: opts.keys.join(\",\") } : undefined;\n return this.ctx.http.request<Configuration[]>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(query ? { query } : {}),\n });\n }\n\n /** Retrieve one tenant configuration by key. */\n async get<T = unknown>(key: string, auth: AuthContext = SERVICE): Promise<Configuration<T>> {\n return this.ctx.http.request<Configuration<T>>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /** Create one or more tenant configurations (array in, array out). */\n async create(drafts: ConfigurationDraft[], auth: AuthContext = SERVICE): Promise<Configuration[]> {\n return this.ctx.http.request<Configuration[]>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: drafts,\n });\n }\n\n /** Update one tenant configuration by key. */\n async update<T = unknown>(\n key: string,\n draft: ConfigurationDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<Configuration<T>> {\n return this.ctx.http.request<Configuration<T>>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete one tenant configuration by key. */\n async delete(key: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /**\n * List the platform-wide global configurations\n * (`GET /global-configurations`) — a separate resource from the tenant's own\n * `/configurations`.\n */\n async listGlobal<T = unknown>(auth: AuthContext = SERVICE): Promise<Configuration<T>[]> {\n return this.ctx.http.request<Configuration<T>[]>({\n method: \"GET\",\n path: `/configuration/${this.ctx.tenant}/global-configurations`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { ClientConfiguration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nexport type { ClientConfiguration } from \"./configuration-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Per-client configuration (`/configuration/{tenant}/clients/{client}/configurations`).\n * Requires the backend-only `configuration.configuration_view` /\n * `configuration.configuration_manage` scopes — default auth: service.\n * Server-side use only; the service token must never reach a browser.\n * The `client` arg is injected into each write body so callers don't repeat it.\n */\nexport class ClientConfigService {\n static readonly channel = \"configuration\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(client: string): string {\n return `/configuration/${this.ctx.tenant}/clients/${encodeURIComponent(client)}/configurations`;\n }\n\n /** List a client's configurations, optionally filtered by `keys`. */\n async list(\n client: string,\n opts: ListConfigOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration[]> {\n const query = opts.keys && opts.keys.length > 0 ? { keys: opts.keys.join(\",\") } : undefined;\n return this.ctx.http.request<ClientConfiguration[]>({\n method: \"GET\",\n path: this.base(client),\n auth,\n ...(query ? { query } : {}),\n });\n }\n\n /** Retrieve one client configuration by key. */\n async get<T = unknown>(\n client: string,\n key: string,\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration<T>> {\n return this.ctx.http.request<ClientConfiguration<T>>({\n method: \"GET\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /** Create one or more client configurations. Injects `client` into each item. */\n async create(\n client: string,\n drafts: ConfigurationDraft[],\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration[]> {\n const body = drafts.map((d) => ({ ...d, client }));\n return this.ctx.http.request<ClientConfiguration[]>({\n method: \"POST\",\n path: this.base(client),\n auth,\n body,\n });\n }\n\n /** Update one client configuration by key. Injects `client` into the body. */\n async update<T = unknown>(\n client: string,\n key: string,\n draft: ConfigurationDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration<T>> {\n return this.ctx.http.request<ClientConfiguration<T>>({\n method: \"PUT\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n body: { ...draft, client },\n });\n }\n\n /** Delete one client configuration by key. */\n async delete(client: string, key: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /**\n * List the client ids that have configurations (`GET /clients`). Note this\n * targets `/configuration/{tenant}/clients` directly — the private `base`\n * helper appends `/configurations` for a specific client.\n */\n async listClients(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `/configuration/${this.ctx.tenant}/clients`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError } from \"../core/errors\";\n\n/** A single shopping-list line item. */\nexport interface ShoppingListItem {\n id?: number;\n productId: string;\n quantity: number;\n cuttingOption?: string;\n servicePackagingOption?: string;\n comment?: string;\n mixins?: Record<string, unknown>;\n}\n\n/** A shopping list, normalized from the per-customer wire envelope. */\nexport interface ShoppingList {\n key: string;\n name: string;\n items: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\n/** Input for create / replace. */\nexport interface ShoppingListDraft {\n name: string;\n items?: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n}\n\ninterface WireList {\n name?: string;\n items?: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nconst RESERVED = new Set([\"customerId\", \"metadata\"]);\n\n/** One per-customer wire envelope (`{ customerId, <listKey>: {…} }`) as a list array. */\nfunction toLists(env: Record<string, unknown>): ShoppingList[] {\n const out: ShoppingList[] = [];\n for (const [key, value] of Object.entries(env)) {\n if (RESERVED.has(key) || value === null || typeof value !== \"object\") continue;\n const v = value as WireList;\n out.push({\n key,\n name: v.name ?? key,\n items: v.items ?? [],\n ...(v.mixins ? { mixins: v.mixins } : {}),\n ...(v.metadata ? { metadata: v.metadata } : {}),\n });\n }\n return out;\n}\n\n/**\n * Per-customer shopping lists (`/shoppinglist/{tenant}/shopping-lists`).\n * `auth` is required: a customer token manages the caller's own lists;\n * a service token (employee scope) can act on any `customerId`. The Emporix\n * API has no item-level CRUD, so `addItem`/`removeItem`/`setItemQuantity`\n * read the list and `PUT` the full body — **last-write-wins**.\n */\nexport class ShoppingListService {\n static readonly channel = \"shopping-list\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/shoppinglist/${this.ctx.tenant}/shopping-lists`;\n }\n\n /**\n * The caller's lists, normalized to an array. With employee scope Emporix\n * returns **every customer's** lists and ignores `name` — read one customer's\n * with {@link getForCustomer} instead.\n */\n async list(auth: AuthContext, opts: { name?: string } = {}): Promise<ShoppingList[]> {\n const envelopes = await this.ctx.http.request<Array<Record<string, unknown>>>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n return (envelopes ?? []).flatMap(toLists);\n }\n\n /**\n * One customer's lists (`GET /shopping-lists/{customerId}`), normalized to an\n * array — the employee read; `name` narrows it to one list.\n */\n async getForCustomer(customerId: string, auth: AuthContext, opts: { name?: string } = {}): Promise<ShoppingList[]> {\n const envelope = await this.ctx.http.request<Record<string, unknown>>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n return envelope ? toLists(envelope) : [];\n }\n\n /** Create a list; returns the new list id. */\n async create(draft: ShoppingListDraft, auth: AuthContext): Promise<{ id: string }> {\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /** Replace the named list (low-level PUT). */\n async replace(customerId: string, draft: ShoppingListDraft, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete the named list, or all the customer's lists when `name` is omitted. */\n async delete(customerId: string, auth: AuthContext, opts: { name?: string } = {}): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n }\n\n private async loadList(customerId: string, listName: string, auth: AuthContext): Promise<ShoppingList> {\n // A service token reads the target customer's lists: through `list()` it\n // would get every customer's, with `name` ignored, and the first match\n // could belong to someone else — whose items would then be written here.\n const lists =\n auth.kind === \"service\"\n ? await this.getForCustomer(customerId, auth, { name: listName })\n : await this.list(auth, { name: listName });\n const found = lists.find((l) => l.name === listName);\n if (!found) throw new EmporixNotFoundError(`Shopping list \"${listName}\" not found`, 404);\n return found;\n }\n\n private async put(customerId: string, list: ShoppingList, items: ShoppingListItem[], auth: AuthContext): Promise<void> {\n await this.replace(\n customerId,\n { name: list.name, items, ...(list.mixins ? { mixins: list.mixins } : {}) },\n auth,\n );\n }\n\n /** Add/replace an item by `productId` (read-modify-write, last-write-wins). */\n async addItem(customerId: string, listName: string, item: ShoppingListItem, auth: AuthContext): Promise<void> {\n const list = await this.loadList(customerId, listName, auth);\n const items = [...list.items.filter((i) => i.productId !== item.productId), item];\n await this.put(customerId, list, items, auth);\n }\n\n /** Remove an item by `productId` (no-op if absent). */\n async removeItem(customerId: string, listName: string, productId: string, auth: AuthContext): Promise<void> {\n const list = await this.loadList(customerId, listName, auth);\n const items = list.items.filter((i) => i.productId !== productId);\n await this.put(customerId, list, items, auth);\n }\n\n /** Set an item's quantity; `quantity <= 0` removes it. Adds the item if absent. */\n async setItemQuantity(customerId: string, listName: string, productId: string, quantity: number, auth: AuthContext): Promise<void> {\n if (quantity <= 0) return this.removeItem(customerId, listName, productId, auth);\n const list = await this.loadList(customerId, listName, auth);\n let items = list.items.map((i) => (i.productId === productId ? { ...i, quantity } : i));\n if (!items.some((i) => i.productId === productId)) items = [...items, { productId, quantity }];\n await this.put(customerId, list, items, auth);\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { MetadataFilter, RagType } from \"./ai-rag-indexer-types\";\n\nexport type { MetadataFilter, RagType } from \"./ai-rag-indexer-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * AI RAG Indexer (`/ai-rag-indexer/{tenant}/{type}`). Read which fields the RAG\n * index embeds / can filter on, and trigger a full asynchronous rebuild.\n *\n * Requires the backend-only `ai.agent_read` (reads) / `ai.agent_manage`\n * (`reindex`) scopes — default auth: service. **Server-side use only**; the\n * service token must never reach a browser.\n *\n * Quirks: only `PRODUCT` exists today (the `type` arg defaults to it);\n * `reindex` is a **full** rebuild (no delta), runs **asynchronously**, returns\n * `204` once *scheduled* (not on completion), has **no status endpoint** to\n * poll, and is costly — call it sparingly. The set of embedded fields is\n * configured in the AI Service, not here.\n */\nexport class RagIndexerService {\n static readonly channel = \"ai-rag-indexer\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(type: RagType): string {\n return `/ai-rag-indexer/${this.ctx.tenant}/${encodeURIComponent(type)}`;\n }\n\n /** The indexable embedding field names for `type` (default `\"PRODUCT\"`). */\n async ragMetadata(type: RagType = \"PRODUCT\", auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `${this.base(type)}/rag-metadata`,\n auth,\n });\n }\n\n /** The filterable metadata fields for `type` (default `\"PRODUCT\"`). */\n async filterMetadata(\n type: RagType = \"PRODUCT\",\n auth: AuthContext = SERVICE,\n ): Promise<MetadataFilter[]> {\n return this.ctx.http.request<MetadataFilter[]>({\n method: \"GET\",\n path: `${this.base(type)}/filter-metadata`,\n auth,\n });\n }\n\n /**\n * Schedule a full asynchronous re-index for `type` (default `\"PRODUCT\"`).\n * Resolves once the rebuild is *scheduled* (HTTP 204); there is no progress\n * to await or poll. Costly — avoid calling on a hot path.\n * @deprecated since 2026-06-18, removal 2026-12-01 — use the indexing service:\n * `client.indexing.createReindexJob({ entityType: \"PRODUCT\", rag: true })`.\n */\n async reindex(type: RagType = \"PRODUCT\", auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base(type)}/reindex`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n SequenceSchema,\n SequenceSchemaCreate,\n NextIdCommandRequest,\n NextIdResponse,\n NextIdOptions,\n NextIdsBatchRequest,\n NextIdsBatchResponse,\n} from \"./sequential-id-types\";\n\nexport type {\n SequenceSchema,\n SequenceSchemaCreate,\n NextIdCommandRequest,\n NextIdResponse,\n NextIdOptions,\n BatchNextIdEntry,\n NextIdsBatchRequest,\n NextIdsBatchResponse,\n} from \"./sequential-id-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Sequential ID Service (`/sequential-id/{tenant}/…`): server-managed,\n * gap-free sequential identifiers (order/invoice numbers, etc.) driven by\n * tenant-defined sequence schemas.\n *\n * Requires the backend-only `sequentialid.schema_view` (read + next-id) /\n * `sequentialid.schema_manage` (CRUD + set-active) scopes — default auth:\n * service. Server-side use only; the service token must never reach a browser.\n *\n * Schemas are immutable upstream (no PATCH/PUT): to change one, `deleteSchema`\n * then `createSchema`. The `maxValue` is a hard cap with no auto-reset, and\n * only one schema may be active per type.\n */\nexport class SequentialIdService {\n static readonly channel = \"sequential-id\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/sequential-id/${this.ctx.tenant}/schemas`;\n }\n\n /** List all sequence schemas for the tenant. */\n async listSchemas(auth: AuthContext = SERVICE): Promise<SequenceSchema[]> {\n return this.ctx.http.request<SequenceSchema[]>({\n method: \"GET\",\n path: this.base(),\n auth,\n });\n }\n\n /** Retrieve one sequence schema by id. */\n async getSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}`,\n auth,\n });\n }\n\n /** Create a sequence schema. Schemas are immutable — there is no update. */\n async createSchema(\n schema: SequenceSchemaCreate,\n auth: AuthContext = SERVICE,\n ): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: schema,\n });\n }\n\n /** Delete a sequence schema by id. */\n async deleteSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}`,\n auth,\n });\n }\n\n /** Mark a schema active for its type (only one schema may be active per type). */\n async setActiveSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}/setActive`,\n auth,\n });\n }\n\n /** Get the active schema for a given schema type. */\n async listSchemasByType(schemaType: string, auth: AuthContext = SERVICE): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"GET\",\n path: `${this.base()}/types/${encodeURIComponent(schemaType)}`,\n auth,\n });\n }\n\n /**\n * Generate the next id for a schema type. `body` carries an optional\n * `sequenceKey` (independent sub-pool counter) and `placeholders`.\n * `opts.siteCode` derives time/country placeholders from the site's settings.\n */\n async nextId(\n schemaType: string,\n body: NextIdCommandRequest = {},\n opts: NextIdOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<NextIdResponse> {\n const query = opts.siteCode ? { siteCode: opts.siteCode } : undefined;\n return this.ctx.http.request<NextIdResponse>({\n method: \"POST\",\n path: `${this.base()}/types/${encodeURIComponent(schemaType)}/nextId`,\n auth,\n body,\n ...(query ? { query } : {}),\n });\n }\n\n /**\n * Generate next ids for multiple schema types in one call. NOTE: the batch\n * endpoint path omits the `{tenant}` segment — the service derives the\n * tenant from the token.\n */\n async nextIdsBatch(\n req: NextIdsBatchRequest,\n auth: AuthContext = SERVICE,\n ): Promise<NextIdsBatchResponse> {\n return this.ctx.http.request<NextIdsBatchResponse>({\n method: \"POST\",\n path: `/sequential-id/sequenceSchemaBatch/nextIds`,\n auth,\n body: req,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { splitQuery } from \"../core/search\";\nimport type {\n Fee,\n ItemFee,\n FeeDraft,\n ItemFeeDraft,\n ItemFeeSearch,\n ItemFeeSearchByProductId,\n ItemFeeSearchByProductIds,\n ListFeesQuery,\n SetItemFeesOptions,\n} from \"./fee-types\";\n\nexport type {\n Fee,\n ItemFee,\n FeeDraft,\n ItemFeeDraft,\n ItemFeeSearch,\n ItemFeeSearchByProductId,\n ItemFeeSearchByProductIds,\n ListFeesQuery,\n SetItemFeesOptions,\n} from \"./fee-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Fee Service (`/fee/{tenant}/…`): fee definitions plus the\n * item/product mappings that attach them. Writes require a backend-only scope\n * (`fee.fee_*` / `fee.item_*`); GETs need a token but no scope. Default auth:\n * service. Server-side use only — the service token must never reach a browser.\n *\n * Quirks (server behavior, not handled here): a payment-type fee's `code` must\n * equal the payment-mode code or the fee is silently ignored; a wrong/missing\n * `siteCode` filters to an empty array rather than erroring; an expired\n * `activeTimespan` silently disables the fee; `setItemFees`/`setProductFees`\n * replace the whole mapping unless `partial` is set.\n */\nexport class FeeService {\n static readonly channel = \"fee\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private feesBase(): string {\n return `/fee/${this.ctx.tenant}/fees`;\n }\n\n private itemFeesBase(): string {\n return `/fee/${this.ctx.tenant}/itemFees`;\n }\n\n private productFeesBase(): string {\n return `/fee/${this.ctx.tenant}/productFees`;\n }\n\n // --- Fee definitions ---\n\n /**\n * List fee definitions, wrapped in the shared {@link PaginatedItems}\n * envelope (same heuristic as `media.list`: `hasNextPage` is true when the\n * returned page is full). Defaults match Emporix server defaults\n * (`pageNumber: 1`, `pageSize: 60`).\n */\n async list(query: ListFeesQuery = {}, auth: AuthContext = SERVICE): Promise<PaginatedItems<Fee>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n // Destructured out because the rest is spread into the query string — see\n // `media.list` for the same note.\n const { totalCount, ...rest } = query;\n return requestPage<Fee>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.feesBase(),\n auth,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n /** Retrieve one fee definition by id. */\n async get(id: string, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"GET\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a fee definition. */\n async create(draft: FeeDraft, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"POST\",\n path: this.feesBase(),\n auth,\n body: draft,\n });\n }\n\n /** Update a fee definition by id. */\n async update(id: string, draft: FeeDraft, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"PUT\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a fee definition by id. */\n async delete(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n // --- Item-fee mappings ---\n\n /** List all item-fee mappings. */\n async listItemFees(auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: this.itemFeesBase(),\n auth,\n });\n }\n\n /** Fee mappings for one item YRN. */\n async getItemFees(itemYrn: string, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`,\n auth,\n });\n }\n\n /** Create an item-fee mapping. */\n async createItemFee(draft: ItemFeeDraft, auth: AuthContext = SERVICE): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"POST\",\n path: this.itemFeesBase(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Set the fee list for an item YRN. Destructive replace by default; pass\n * `{ partial: true }` to merge (`?partial=true`).\n */\n async setItemFees(\n itemYrn: string,\n feeIds: string[],\n opts: SetItemFeesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"PUT\",\n path: `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`,\n auth,\n body: { feeIds },\n ...(opts.partial ? { query: { partial: \"true\" } } : {}),\n });\n }\n\n /**\n * Delete item-fee mappings for a YRN. Without `feeId`, removes all mappings\n * for the YRN; with `feeId`, removes that single fee from the mapping.\n */\n async deleteItemFees(itemYrn: string, feeId?: string, auth: AuthContext = SERVICE): Promise<void> {\n const base = `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`;\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: feeId ? `${base}/${encodeURIComponent(feeId)}` : base,\n auth,\n });\n }\n\n /** Search item-fee mappings by item YRNs + site. */\n async searchItemFees(search: ItemFeeSearch, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/search`,\n auth,\n body: search,\n });\n }\n\n // --- Product-fee mappings ---\n\n /** Fee mappings for a product id. */\n async getProductFees(productId: string, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n });\n }\n\n /**\n * Set the fee list for a product id. Destructive replace by default; pass\n * `{ partial: true }` to merge (`?partial=true`).\n */\n async setProductFees(\n productId: string,\n feeIds: string[],\n opts: SetItemFeesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"PUT\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n body: { feeIds },\n ...(opts.partial ? { query: { partial: \"true\" } } : {}),\n });\n }\n\n /** Delete all fee mappings for a product id. */\n async deleteProductFees(productId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n });\n }\n\n /**\n * Removes **one** fee from a product\n * (`DELETE /productFees/{productId}/fees/{feeId}`). Use\n * {@link deleteProductFees} to clear every fee of a product.\n */\n async deleteProductFee(\n productId: string,\n feeId: string,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees/${encodeURIComponent(feeId)}`,\n auth,\n });\n }\n\n /**\n * Finds item fees for one product across several sites\n * (`POST /itemFees/searchByProductId`).\n */\n async searchItemFeesByProductId(\n search: ItemFeeSearchByProductId,\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/searchByProductId`,\n auth,\n body: search,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n\n /**\n * Finds item fees for several products on one site\n * (`POST /itemFees/searchByProductIds`). Note the upstream asymmetry:\n * `productIds` is a comma-separated **string** and `siteCode` is singular.\n * `siteFallback` goes in the query string, everything else in the body.\n */\n async searchItemFeesByProductIds(\n search: ItemFeeSearchByProductIds,\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/searchByProductIds`,\n auth,\n ...splitQuery(search, [\"siteFallback\"]),\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\n\n/** Options for {@link CloudFunctionsService.invoke}. */\nexport interface InvokeCloudFunctionOptions<TReq = unknown> {\n /** HTTP method. Default: \"POST\" (the canonical invoke). */\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n /** Optional sub-path the function exposes (leading slash optional). */\n path?: string;\n /** Request body (arbitrary JSON). */\n body?: TReq;\n /** Query-string params. */\n query?: Record<string, string | number | undefined>;\n /** Extra request headers (Content-Type: application/json is the default). */\n headers?: Record<string, string>;\n}\n\n/**\n * Invokes Emporix-hosted cloud functions. Request/response shapes are\n * caller-defined (generic) — there is no schema. Auth may be service,\n * customer, anonymous, or raw; the default is anonymous.\n */\nexport class CloudFunctionsService {\n static readonly channel = \"cloud-functions\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/cloud-functions/${this.ctx.tenant}/functions`;\n }\n\n async invoke<TRes = unknown, TReq = unknown>(\n functionId: string,\n options: InvokeCloudFunctionOptions<TReq> = {},\n authCtx: AuthContext = auth.anonymous(),\n ): Promise<TRes> {\n const sub = options.path ? `/${options.path.replace(/^\\//, \"\")}` : \"\";\n return this.ctx.http.request<TRes>({\n method: options.method ?? \"POST\",\n path: `${this.base()}/${functionId}${sub}`,\n auth: authCtx,\n ...(options.body !== undefined ? { body: options.body } : {}),\n ...(options.query ? { query: options.query } : {}),\n ...(options.headers ? { headers: options.headers } : {}),\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n WebhookSubscription,\n WebhookSubscriptionUpdateItem,\n WebhookSubscriptionUpdateResultItem,\n WebhookConfig,\n WebhookConfigDraft,\n WebhookConfigPatch,\n WebhookConfigCreated,\n WebhookStatistics,\n WebhookDashboardAccess,\n WebhookStatisticsQuery,\n DeleteConfigOptions,\n} from \"./webhook-types\";\n\nexport type {\n WebhookSubscription,\n WebhookSubscriptionUpdateItem,\n WebhookSubscriptionUpdateResultItem,\n WebhookConfig,\n WebhookConfigDraft,\n WebhookConfigPatch,\n WebhookConfigCreated,\n WebhookStatistics,\n WebhookDashboardAccess,\n WebhookStatisticsQuery,\n DeleteConfigOptions,\n} from \"./webhook-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Webhook administration (`/webhook/{tenant}/…`): the event-subscription\n * catalog and batch toggle, delivery-config CRUD, statistics, and Svix\n * dashboard access. Requires the backend-only `webhook.subscription_read` /\n * `webhook.subscription_manage` scopes — default auth: service. Server-side\n * use only; the service token must never reach a browser.\n */\nexport class WebhookService {\n static readonly channel = \"webhook\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/webhook/${this.ctx.tenant}`;\n }\n\n /** List the event-subscription catalog with each event's on/off state. */\n async listEventSubscriptions(auth: AuthContext = SERVICE): Promise<WebhookSubscription[]> {\n return this.ctx.http.request<WebhookSubscription[]>({\n method: \"GET\",\n path: `${this.base()}/event-subscriptions`,\n auth,\n });\n }\n\n /**\n * Batch subscribe/unsubscribe events. Returns the **207** per-item result\n * array verbatim — the batch can partially fail, so inspect each element's\n * `code`/`status` (e.g. `results.filter(r => (r.code ?? 0) >= 400)`). Does\n * NOT throw on a 207 with failed items; only a non-2xx HTTP status throws.\n */\n async updateEventSubscriptions(\n items: WebhookSubscriptionUpdateItem[],\n auth: AuthContext = SERVICE,\n ): Promise<WebhookSubscriptionUpdateResultItem[]> {\n return this.ctx.http.request<WebhookSubscriptionUpdateResultItem[]>({\n method: \"PATCH\",\n path: `${this.base()}/event-subscriptions`,\n auth,\n body: items,\n });\n }\n\n /** List delivery configurations. */\n async listConfigs(auth: AuthContext = SERVICE): Promise<WebhookConfig[]> {\n return this.ctx.http.request<WebhookConfig[]>({\n method: \"GET\",\n path: `${this.base()}/config`,\n auth,\n });\n }\n\n /** Retrieve one delivery configuration by code. */\n async getConfig(code: string, auth: AuthContext = SERVICE): Promise<WebhookConfig> {\n return this.ctx.http.request<WebhookConfig>({\n method: \"GET\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a delivery configuration. Returns the server-assigned `{ code }`. */\n async createConfig(\n draft: WebhookConfigDraft,\n auth: AuthContext = SERVICE,\n ): Promise<WebhookConfigCreated> {\n return this.ctx.http.request<WebhookConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/config`,\n auth,\n body: draft,\n });\n }\n\n /** Replace a delivery configuration by code (204). */\n async replaceConfig(\n code: string,\n draft: WebhookConfigDraft,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n body: draft,\n });\n }\n\n /**\n * Partially update a delivery configuration by code (204). The body is an\n * **array** of `{ op, path, value }` operations (UPSERT / REMOVE).\n */\n async patchConfig(\n code: string,\n patches: WebhookConfigPatch[],\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n body: patches,\n });\n }\n\n /**\n * Delete a delivery configuration by code. Pass `{ force: true }` to delete\n * the currently-active config (the server otherwise rejects it).\n */\n async deleteConfig(\n code: string,\n opts: DeleteConfigOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n ...(opts.force === true ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /** Read delivery statistics over an optional `YYYY-MM` range. */\n async getStatistics(\n query: WebhookStatisticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<WebhookStatistics> {\n const q: Record<string, string> = {};\n if (query.fromYearMonth) q.fromYearMonth = query.fromYearMonth;\n if (query.toYearMonth) q.toYearMonth = query.toYearMonth;\n return this.ctx.http.request<WebhookStatistics>({\n method: \"GET\",\n path: `${this.base()}/statistics`,\n auth,\n ...(Object.keys(q).length > 0 ? { query: q } : {}),\n });\n }\n\n /** Obtain Svix dashboard access (URL / token). */\n async getDashboardAccess(auth: AuthContext = SERVICE): Promise<WebhookDashboardAccess> {\n return this.ctx.http.request<WebhookDashboardAccess>({\n method: \"GET\",\n path: `${this.base()}/dashboard-access`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Schema,\n SchemaDraft,\n SchemaUpdate,\n SchemaTypeName,\n SchemaTargetType,\n SchemaCreated,\n ListSchemasQuery,\n CustomEntity,\n CustomEntityDraft,\n CustomEntityUpdate,\n CustomEntityCreated,\n CustomInstance,\n CustomInstanceDraft,\n CustomInstanceReplace,\n CustomInstancePatch,\n CustomInstanceCreated,\n ListInstancesQuery,\n ListCustomEntitiesOptions,\n InstanceSearchBody,\n SearchInstancesQuery,\n BulkPatchInstanceItem,\n BulkInstanceResult,\n SchemaReference,\n SchemaReferenceInput,\n SchemaReferenceUpdateInput,\n SchemaReferenceCreated,\n SchemaInstanceBulkCreateItem,\n SchemaInstanceBulkUpsertItem,\n SchemaExport,\n SchemaImportInput,\n ListSchemaReferencesQuery,\n} from \"./schema-types\";\n\nexport type {\n Schema,\n SchemaAttribute,\n SchemaTypeName,\n SchemaTargetType,\n SchemaDraft,\n SchemaUpdate,\n SchemaCreated,\n CustomEntity,\n CustomInstance,\n CustomEntityDraft,\n CustomEntityUpdate,\n CustomEntityCreated,\n CustomInstanceDraft,\n CustomInstanceReplace,\n CustomInstancePatch,\n CustomInstanceCreated,\n ListSchemasQuery,\n ListInstancesQuery,\n ListCustomEntitiesOptions,\n InstanceSearchBody,\n SearchInstancesQuery,\n BulkPatchInstanceItem,\n BulkInstanceResult,\n SchemaReference,\n SchemaReferenceInput,\n SchemaReferenceUpdateInput,\n SchemaReferenceCreated,\n SchemaInstanceBulkCreateItem,\n SchemaInstanceBulkUpsertItem,\n SchemaExport,\n SchemaImportInput,\n ListSchemaReferencesQuery,\n} from \"./schema-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** Passes a `Blob` through; serializes a plain object into a JSON blob. */\nfunction toJsonBlob(file: Blob | Record<string, unknown>): Blob {\n return file instanceof Blob\n ? file\n : new Blob([JSON.stringify(file)], { type: \"application/json\" });\n}\n\n/**\n * Schema Service (`/schema/{tenant}/…`): schemas, entity types, custom\n * entities and their instances. Requires the backend-only `schema.schema_*`\n * / `schema.custominstance_*` scopes — default auth: service. Server-side use\n * only; the service token must never reach a browser.\n */\nexport class SchemaService {\n static readonly channel = \"schema\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private schemasBase(): string {\n return `/schema/${this.ctx.tenant}/schemas`;\n }\n\n private entitiesBase(): string {\n return `/schema/${this.ctx.tenant}/custom-entities`;\n }\n\n private instancesBase(type: string): string {\n return `${this.entitiesBase()}/${encodeURIComponent(type)}/instances`;\n }\n\n private referencesBase(): string {\n return `/schema/${this.ctx.tenant}/references`;\n }\n\n // --- (A) Schemas ---------------------------------------------------------\n\n /**\n * List schemas, wrapped in the shared {@link PaginatedItems} envelope.\n * `hasNextPage` is the standard SDK heuristic (`items.length === pageSize`).\n * Pagination defaults match the rest of the SDK (`pageNumber: 1`,\n * `pageSize: 60`).\n */\n async listSchemas(\n query: ListSchemasQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<Schema>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.q) q.q = query.q;\n if (query.type) q.type = query.type;\n return requestPage<Schema>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.schemasBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Retrieve one schema by id. */\n async getSchema(id: string, auth: AuthContext = SERVICE): Promise<Schema> {\n return this.ctx.http.request<Schema>({\n method: \"GET\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a schema. Resolves to the `201`'s id envelope — read the schema back for the rest. */\n async createSchema(draft: SchemaDraft, auth: AuthContext = SERVICE): Promise<SchemaCreated> {\n return this.ctx.http.request<SchemaCreated>({\n method: \"POST\",\n path: this.schemasBase(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Update a schema; resolves on the `204`. The upstream API requires\n * `draft.metadata.version`; a stale version yields a 409\n * (`EmporixConflictError`).\n */\n async updateSchema(\n id: string,\n draft: SchemaUpdate,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a schema by id. */\n async deleteSchema(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Validate a schema document without persisting it (`POST /schemas/file`).\n * Returns the server's validation result verbatim.\n */\n async validateSchemaFile<R = unknown>(\n body: SchemaDraft,\n auth: AuthContext = SERVICE,\n ): Promise<R> {\n return this.ctx.http.request<R>({\n method: \"POST\",\n path: `${this.schemasBase()}/file`,\n auth,\n body,\n });\n }\n\n // --- (B) Types -----------------------------------------------------------\n\n /** List entity types that currently have at least one schema. */\n async listTypes(auth: AuthContext = SERVICE): Promise<SchemaTypeName[]> {\n return this.ctx.http.request<SchemaTypeName[]>({\n method: \"GET\",\n path: `/schema/${this.ctx.tenant}/types`,\n auth,\n });\n }\n\n /** Set the entity types a schema applies to (`PUT /schemas/{id}/types`). */\n async setSchemaTypes(\n id: string,\n types: SchemaTargetType[],\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}/types`,\n auth,\n body: { types },\n });\n }\n\n // --- (C) Custom entities -------------------------------------------------\n\n /** List custom-entity definitions. `expandSchemas` inlines each schema body. */\n async listCustomEntities(\n opts: ListCustomEntitiesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntity[]> {\n return this.ctx.http.request<CustomEntity[]>({\n method: \"GET\",\n path: this.entitiesBase(),\n auth,\n ...(opts.expandSchemas ? { query: { expandSchemas: \"true\" } } : {}),\n });\n }\n\n /** Retrieve one custom-entity definition by id. */\n async getCustomEntity(id: string, auth: AuthContext = SERVICE): Promise<CustomEntity> {\n return this.ctx.http.request<CustomEntity>({\n method: \"GET\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a custom-entity definition. Resolves to the `201`'s id envelope. */\n async createCustomEntity(\n draft: CustomEntityDraft,\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntityCreated> {\n return this.ctx.http.request<CustomEntityCreated>({\n method: \"POST\",\n path: this.entitiesBase(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Update a custom-entity definition — an upsert: resolves to the id envelope\n * when the `PUT` created the type (`201`), to `undefined` when it updated it\n * (`204`).\n */\n async updateCustomEntity(\n id: string,\n draft: CustomEntityUpdate,\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntityCreated | undefined> {\n return this.ctx.http.request<CustomEntityCreated | undefined>({\n method: \"PUT\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /**\n * Delete a custom-entity definition. The server rejects with 409 if\n * instances or schemas still reference it (`EmporixConflictError`).\n */\n async deleteCustomEntity(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n // --- (D) Custom instances ------------------------------------------------\n\n /**\n * List a custom entity's instances, wrapped in {@link PaginatedItems}.\n * `type` is the custom-entity type and is always the first argument.\n */\n async listInstances<T = Record<string, unknown>>(\n type: string,\n query: ListInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<CustomInstance<T>>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n // `totalCount` is an SDK-side flag, not an Emporix query parameter — it\n // becomes a request header in requestPage. Sending it in the query too\n // would be a stray `?totalCount=true` on every call.\n const { totalCount, ...rest } = query;\n return requestPage<CustomInstance<T>>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.instancesBase(type),\n auth,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n /**\n * Async-iterates every instance of a type.\n *\n * Not built on `iterateAll`: that helper drives pagination by page number, and\n * the server ignores `pageNumber` the moment a cursor is in play. This follows\n * `nextCursor` while the server offers one and falls back to `pageNumber + 1`\n * when it does not — so it is correct whether or not the tenant's deployment\n * emits cursor headers on a request that carries no cursor.\n */\n async *listAllInstances<T = Record<string, unknown>>(\n type: string,\n // Takes the full query type rather than an `Omit<…>`: `ListInstancesQuery`\n // has an index signature, so `Omit` would not actually forbid `next` — it\n // would only look like it did. The overrides below win regardless.\n query: ListInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): AsyncIterable<CustomInstance<T>> {\n let cursor: string | undefined;\n let pageNumber = 1;\n for (;;) {\n const page = await this.listInstances<T>(\n type,\n { ...query, pageNumber, ...(cursor === undefined ? {} : { next: cursor }) },\n auth,\n );\n for (const item of page.items) yield item;\n if (!page.hasNextPage) return;\n cursor = page.nextCursor;\n // Only advances while there is no cursor. Once cursor mode takes over the\n // server ignores pageNumber anyway, so leaving it pinned keeps the two\n // modes from interfering.\n if (cursor === undefined) pageNumber += 1;\n }\n }\n\n /** Retrieve one instance by id. */\n async getInstance<T = Record<string, unknown>>(\n type: string,\n id: string,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstance<T>> {\n return this.ctx.http.request<CustomInstance<T>>({\n method: \"GET\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Create an instance of a custom entity. Resolves to the `201`'s id envelope;\n * an id that already exists is answered with a 409 (`EmporixConflictError`).\n */\n async createInstance<T = Record<string, unknown>>(\n type: string,\n draft: CustomInstanceDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstanceCreated> {\n return this.ctx.http.request<CustomInstanceCreated>({\n method: \"POST\",\n path: this.instancesBase(type),\n auth,\n body: draft,\n });\n }\n\n /**\n * Replace an instance (full `PUT`, an upsert). Resolves to the id envelope\n * when it created the instance (`201`), to `undefined` when it replaced one\n * (`204`). A stale `metadata.version` is answered with a 409.\n */\n async replaceInstance<T = Record<string, unknown>>(\n type: string,\n id: string,\n draft: CustomInstanceReplace<T>,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstanceCreated | undefined> {\n return this.ctx.http.request<CustomInstanceCreated | undefined>({\n method: \"PUT\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /**\n * Partially update an instance (`PATCH`) with RFC-6902 operations, e.g.\n * `[{ op: \"replace\", path: \"/mixins/shoe/size\", value: 44 }]`. Resolves on\n * the `204`.\n */\n async patchInstance(\n type: string,\n id: string,\n patch: CustomInstancePatch,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n body: patch,\n });\n }\n\n /**\n * Patch up to 200 custom instances of `type` in one call\n * (`PATCH /custom-entities/{type}/instances/bulk`). Returns a 207 envelope:\n * a per-item result array — a 207 is success, individual failures live in\n * each item's `code`/`status`.\n */\n async bulkPatchInstances(\n type: string,\n items: BulkPatchInstanceItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"PATCH\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Create multiple instances in one request\n * (`POST /custom-entities/{type}/instances/bulk`). Returns a 207 envelope:\n * a per-item result array — a 207 is success, individual failures live in\n * each item's `code`/`status`.\n */\n async bulkCreateInstances(\n type: string,\n items: SchemaInstanceBulkCreateItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"POST\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Upsert multiple instances in one request\n * (`PUT /custom-entities/{type}/instances/bulk`). Each item carries its `id`.\n * Returns the same 207 per-item envelope as {@link bulkCreateInstances}.\n */\n async bulkUpsertInstances(\n type: string,\n items: SchemaInstanceBulkUpsertItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"PUT\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Delete multiple instances by id\n * (`DELETE /custom-entities/{type}/instances/bulk`). Returns the same 207\n * per-item envelope as {@link bulkCreateInstances}.\n *\n * **Note:** the OpenAPI schema declares no request body for this operation,\n * but its description mandates one — \"The IDs of items should be defined in\n * the request body as an array of strings\" (example\n * `[\"firstId\", \"secondId\"]`). The SDK follows the description and sends the\n * id array. Unverified against the live API.\n */\n async bulkDeleteInstances(\n type: string,\n ids: string[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"DELETE\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: ids,\n });\n }\n\n /**\n * Export custom entities and their schemas\n * (`POST /custom-entities/export`). Pass the entity types to include; the\n * result carries a base64 `data` payload plus `exportedAt`.\n */\n async exportCustomEntities(types: string[], auth: AuthContext = SERVICE): Promise<SchemaExport> {\n return this.ctx.http.request<SchemaExport>({\n method: \"POST\",\n path: `${this.entitiesBase()}/export`,\n auth,\n body: types,\n });\n }\n\n /**\n * Import custom entities and their schemas\n * (`POST /custom-entities/import`) from the base64 `data` produced by\n * {@link exportCustomEntities}.\n */\n async importCustomEntities(input: SchemaImportInput, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.entitiesBase()}/import`,\n auth,\n body: input,\n });\n }\n\n /** Delete an instance by id. */\n async deleteInstance(type: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Structured search over a custom entity's instances\n * (`POST /instances/search`), wrapped in {@link PaginatedItems}.\n *\n * The `query` parameter is third and `auth` fourth. This used to forward no\n * query parameters at all and report a hard-coded `hasNextPage: false`, so a\n * search could only ever return the server's default first page.\n */\n async searchInstances<T = Record<string, unknown>>(\n type: string,\n body: InstanceSearchBody,\n query: SearchInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<CustomInstance<T>>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const { totalCount, ...rest } = query;\n return requestPage<CustomInstance<T>>(\n this.ctx.http,\n {\n method: \"POST\",\n path: `${this.instancesBase(type)}/search`,\n auth,\n body,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n // --- (E) References ------------------------------------------------------\n\n /**\n * Reference entities (`/references`) — a schema plus an uploaded JSON file.\n * Create/update are `multipart/form-data` (parts `file` and `body`), like\n * the media service's blob upload. Default auth: service.\n */\n readonly references = {\n /**\n * List references, wrapped in {@link PaginatedItems}. Pagination defaults\n * match the rest of this service (`pageNumber: 1`, `pageSize: 60`).\n */\n list: async (\n query: ListSchemaReferencesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SchemaReference>> => {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.sort) q.sort = query.sort;\n if (query.q) q.q = query.q;\n if (query.fields) q.fields = query.fields;\n if (query.type) q.type = query.type;\n return requestPage<SchemaReference>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.referencesBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n },\n\n /** Retrieve one reference by id. */\n get: async (id: string, auth: AuthContext = SERVICE): Promise<SchemaReference> =>\n this.ctx.http.request<SchemaReference>({\n method: \"GET\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n auth,\n }),\n\n /**\n * Create a reference. `file` is the reference's JSON content — pass a\n * `Blob` to upload as-is, or a plain object to have it serialized into a\n * JSON blob. `body` carries the metadata.\n */\n create: async (\n input: { file: Blob | Record<string, unknown>; body: SchemaReferenceInput },\n auth: AuthContext = SERVICE,\n ): Promise<SchemaReferenceCreated> => {\n const fd = new FormData();\n fd.set(\"file\", toJsonBlob(input.file));\n fd.set(\"body\", JSON.stringify(input.body));\n return this.ctx.http.request<SchemaReferenceCreated>({\n method: \"POST\",\n path: this.referencesBase(),\n auth,\n body: fd,\n });\n },\n\n /**\n * Update a reference (multipart, like {@link create}). `options.version`\n * enables optimistic locking — the server answers 409 on a stale version.\n */\n update: async (\n id: string,\n input: { file: Blob | Record<string, unknown>; body: SchemaReferenceUpdateInput },\n options: { version?: number } = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> => {\n const fd = new FormData();\n fd.set(\"file\", toJsonBlob(input.file));\n fd.set(\"body\", JSON.stringify(input.body));\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n ...(options.version === undefined ? {} : { query: { version: options.version } }),\n auth,\n body: fd,\n });\n },\n\n /** Delete a reference by id. */\n delete: async (id: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchQuery,\n Created,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n} from \"./ai-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * A symmetric CRUD resource over an agentic sub-collection (`tools`,\n * `mcp-servers`, `tokens`, `oauths`). All six operations share the upstream\n * shape; only the base path and the Read/Write types differ. Server-side only\n * — every call defaults to the SERVICE (backend) token.\n */\nexport class AgenticCrudResource<Read, Write> {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string,\n ) {}\n\n private item(id: string): string {\n return `${this.path}/${encodeURIComponent(id)}`;\n }\n\n /** List the collection (`GET {path}`). Optional `q`/paging/sort/fields/expand. */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<Read[]> {\n return this.ctx.http.request<Read[]>({ method: \"GET\", path: this.path, auth, query: { ...query } });\n }\n\n /** Structured search (`POST {path}/search`): `q` in the body, paging/sort/fields in the query. */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<Read[]> {\n return this.ctx.http.request<Read[]>({ method: \"POST\", path: `${this.path}/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n\n /** Retrieve one entry by id (`GET {path}/{id}`). */\n get(id: string, opts: GetOptions = {}, auth: AuthContext = SERVICE): Promise<Read> {\n return this.ctx.http.request<Read>({ method: \"GET\", path: this.item(id), auth, query: { ...opts } });\n }\n\n /**\n * Create-or-replace by id (`PUT {path}/{id}`). Resolves to `{ id }` on create\n * (HTTP 201) and `undefined` on update (HTTP 204). `{ force: true }`\n * cascade-disables dependents.\n */\n upsert(\n id: string,\n body: Write,\n opts: MutateOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Created | undefined> {\n return this.ctx.http.request<Created | undefined>({\n method: \"PUT\",\n path: this.item(id),\n auth,\n body,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /**\n * Partial update with an op array (`PATCH {path}/{id}`, 204). `ops` use the\n * upstream UPPERCASE enum (`ADD | REMOVE | REPLACE`), sent verbatim.\n */\n async patch(id: string, ops: AgenticPatchOp[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.item(id), auth, body: ops });\n }\n\n /** Delete by id (`DELETE {path}/{id}`). `{ force: true }` removes even if referenced. */\n async delete(id: string, opts: MutateOptions = {}, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: this.item(id),\n auth,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n}\n\n/**\n * AI async jobs (`/ai-service/{tenant}/jobs`). NOTE: not under `/agentic`.\n * `chatAsync` returns a `jobId`; poll/list/delete it here.\n */\nexport class JobsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly base: string,\n ) {}\n\n /** List jobs (`GET /jobs`). */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<Job[]> {\n return this.ctx.http.request<Job[]>({ method: \"GET\", path: `${this.base}/jobs`, auth, query: { ...query } });\n }\n /** Structured job search (`POST /jobs/search`). */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<Job[]> {\n return this.ctx.http.request<Job[]>({ method: \"POST\", path: `${this.base}/jobs/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /** Retrieve one job (`GET /jobs/{jobId}`). */\n get(jobId: string, auth: AuthContext = SERVICE): Promise<Job> {\n return this.ctx.http.request<Job>({ method: \"GET\", path: `${this.base}/jobs/${encodeURIComponent(jobId)}`, auth });\n }\n /** Delete one job (`DELETE /jobs/{jobId}`). */\n async delete(jobId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: `${this.base}/jobs/${encodeURIComponent(jobId)}`, auth });\n }\n}\n\n/** Agent templates (`/agentic/templates`). `list · search · clone`. */\nexport class TemplatesResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/templates`\n ) {}\n\n /** List available templates (`GET /agentic/templates`). */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentTemplate[]> {\n return this.ctx.http.request<AgentTemplate[]>({ method: \"GET\", path: this.path, auth, query: { ...query } });\n }\n /** Structured template search (`POST /agentic/templates/search`). */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentTemplate[]> {\n return this.ctx.http.request<AgentTemplate[]>({ method: \"POST\", path: `${this.path}/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /**\n * Instantiate a new agent from a template\n * (`POST /agentic/templates/{templateId}/agents`, HTTP 201). Returns the\n * created agent's id.\n */\n clone(templateId: string, body: AgentFromTemplate, auth: AuthContext = SERVICE): Promise<Created> {\n return this.ctx.http.request<Created>({\n method: \"POST\",\n path: `${this.path}/${encodeURIComponent(templateId)}/agents`,\n auth,\n body,\n });\n }\n}\n\n/** Agent logs (`/agentic/logs`): request logs and session logs. */\nexport class LogsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/logs`\n ) {}\n\n /** List request logs (`GET /agentic/logs/requests`). */\n listRequests(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentRequestLog[]> {\n return this.ctx.http.request<AgentRequestLog[]>({ method: \"GET\", path: `${this.path}/requests`, auth, query: { ...query } });\n }\n /** Retrieve one request log (`GET /agentic/logs/requests/{requestId}`). */\n getRequest(requestId: string, auth: AuthContext = SERVICE): Promise<AgentRequestLog> {\n return this.ctx.http.request<AgentRequestLog>({ method: \"GET\", path: `${this.path}/requests/${encodeURIComponent(requestId)}`, auth });\n }\n /** Structured request-log search (`POST /agentic/logs/requests/search`). */\n searchRequests(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentRequestLog[]> {\n return this.ctx.http.request<AgentRequestLog[]>({ method: \"POST\", path: `${this.path}/requests/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /** List session logs (`GET /agentic/logs/sessions`). */\n listSessions(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentSessionLog[]> {\n return this.ctx.http.request<AgentSessionLog[]>({ method: \"GET\", path: `${this.path}/sessions`, auth, query: { ...query } });\n }\n /** Retrieve one session log (`GET /agentic/logs/sessions/{sessionId}`). */\n getSession(sessionId: string, auth: AuthContext = SERVICE): Promise<AgentSessionLog> {\n return this.ctx.http.request<AgentSessionLog>({ method: \"GET\", path: `${this.path}/sessions/${encodeURIComponent(sessionId)}`, auth });\n }\n /** Structured session-log search (`POST /agentic/logs/sessions/search`). */\n searchSessions(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentSessionLog[]> {\n return this.ctx.http.request<AgentSessionLog[]>({ method: \"POST\", path: `${this.path}/sessions/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n}\n\n/** Agent analytics (`/agentic/analytics`). */\nexport class AnalyticsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/analytics`\n ) {}\n\n /** Aggregated metrics (`GET /agentic/analytics`); scope with `agentId`. */\n get(opts: AnalyticsQuery = {}, auth: AuthContext = SERVICE): Promise<AgentAnalytics> {\n return this.ctx.http.request<AgentAnalytics>({ method: \"GET\", path: this.path, auth, query: { ...opts } });\n }\n /** Per-agent execution counts (`GET /agentic/analytics/executions`). `agentIds` required. */\n executions(query: ExecutionsQuery, auth: AuthContext = SERVICE): Promise<AgentExecutions> {\n return this.ctx.http.request<AgentExecutions>({ method: \"GET\", path: `${this.path}/executions`, auth, query: { ...query } });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport {\n AgenticCrudResource,\n JobsResource,\n TemplatesResource,\n LogsResource,\n AnalyticsResource,\n} from \"./ai-resources\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n TextRequest,\n TextResponse,\n CompletionRequest,\n CompletionResponse,\n Agent,\n AgentInput,\n AgentPatchOp,\n AgentSearchQuery,\n ChatRequest,\n ChatResponse,\n JobIdResponse,\n DeleteAgentOptions,\n ChatOptions,\n Conversation,\n ConversationSearchQuery,\n Created,\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchQuery,\n OAuthConfig,\n OAuthInput,\n Tool,\n ToolInput,\n Token,\n TokenInput,\n McpServer,\n McpServerInput,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n ProviderModels,\n CommerceEvents,\n Attachment,\n AttachmentOptions,\n AttachmentReuseOptions,\n AgentsExport,\n AgentsExportRequest,\n AgentsImport,\n AgentsImportRequest,\n} from \"./ai-types\";\n\nexport type {\n TextRequest,\n TextResponse,\n CompletionMessage,\n CompletionRequest,\n CompletionResponse,\n Agent,\n AgentInput,\n AgentPatchOp,\n AgentSearchQuery,\n ChatRequest,\n ChatResponse,\n JobIdResponse,\n DeleteAgentOptions,\n ChatOptions,\n ChatStreamOptions,\n Conversation,\n ConversationSearchQuery,\n Created,\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchPaging,\n SearchQuery,\n OAuthConfig,\n OAuthInput,\n Tool,\n ToolInput,\n Token,\n TokenInput,\n McpServer,\n McpServerInput,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n ProviderModels,\n CommerceEvents,\n Attachment,\n AttachmentOptions,\n AttachmentReuseOptions,\n AgentsExport,\n AgentsExportRequest,\n AgentsImport,\n AgentsImportRequest,\n} from \"./ai-types\";\n\nexport type {\n AgenticCrudResource,\n AnalyticsResource,\n JobsResource,\n LogsResource,\n TemplatesResource,\n} from \"./ai-resources\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * `chat` and `chatAsync` took `auth` second until 4.0.0; now options come\n * second and `auth` third, as on `chatStream`. An old call would otherwise have\n * its auth context read as options and run on the default service token —\n * silently, in plain JavaScript — so it throws instead.\n */\nfunction assertChatOptions(opts: ChatOptions, method: string): void {\n if (typeof opts === \"object\" && opts !== null && \"kind\" in opts) {\n throw new Error(\n `ai.${method}: the second argument is { sessionId? } since 4.0.0 — pass the auth context third`,\n );\n }\n}\n\nfunction sessionHeader(opts: ChatOptions): { headers?: Record<string, string> } {\n return opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {};\n}\n\nconst AUTH_KINDS = new Set([\"service\", \"anonymous\", \"customer\", \"raw\"]);\n\n/**\n * `listAgents` and `listConversations` took only `auth` before they could page.\n * Tells that original call apart from `(query, auth)`, so an auth context is\n * never sent as query parameters — which would put a customer token in the URL.\n */\nfunction isAuthContext(value: ListQuery | AuthContext): value is AuthContext {\n return AUTH_KINDS.has(String((value as { kind?: unknown }).kind));\n}\n\n/**\n * Emporix AI Service (`/ai-service/{tenant}/…`): text generation, chat\n * completions, and the agentic layer (agent CRUD + synchronous/asynchronous\n * chat). Every endpoint requires a backend-only `ai.*` scope and the\n * **service (clientCredentials) token** — default auth: service.\n *\n * Server-side use only; the service token must never reach a browser. A\n * storefront chat (scope `ai.agentexecution_manage_own`) would require a\n * BFF / token-proxy — out of scope for this SDK.\n *\n * The model is server-fixed per tenant; there is no `model` parameter.\n */\nexport class AiService {\n static readonly channel = \"ai\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/ai-service/${this.ctx.tenant}`;\n }\n\n // --- Agentic building blocks (CRUD sub-resources) ----------------------\n\n private _oauths?: AgenticCrudResource<OAuthConfig, OAuthInput>;\n /** OAuth 2.0 client-credentials configs (`/agentic/oauths`). CRUD sub-resource. */\n get oauths(): AgenticCrudResource<OAuthConfig, OAuthInput> {\n return (this._oauths ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/oauths`));\n }\n\n private _tools?: AgenticCrudResource<Tool, ToolInput>;\n /** Agentic tools (`/agentic/tools`). CRUD sub-resource. */\n get tools(): AgenticCrudResource<Tool, ToolInput> {\n return (this._tools ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/tools`));\n }\n\n private _tokens?: AgenticCrudResource<Token, TokenInput>;\n /** Stored tokens (`/agentic/tokens`) — an OAuth config's client secret. CRUD sub-resource. */\n get tokens(): AgenticCrudResource<Token, TokenInput> {\n return (this._tokens ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/tokens`));\n }\n\n private _mcpServers?: AgenticCrudResource<McpServer, McpServerInput>;\n /** MCP-server configs (`/agentic/mcp-servers`). CRUD sub-resource. */\n get mcpServers(): AgenticCrudResource<McpServer, McpServerInput> {\n return (this._mcpServers ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/mcp-servers`));\n }\n\n private _jobs?: JobsResource;\n /** AI async jobs (`/jobs`). `list · search · get · delete`. */\n get jobs(): JobsResource {\n return (this._jobs ??= new JobsResource(this.ctx, this.base()));\n }\n\n private _templates?: TemplatesResource;\n /** Agent templates (`/agentic/templates`). `list · search · clone`. */\n get templates(): TemplatesResource {\n return (this._templates ??= new TemplatesResource(this.ctx, `${this.base()}/agentic/templates`));\n }\n\n private _logs?: LogsResource;\n /** Agent logs (`/agentic/logs`): request + session logs. */\n get logs(): LogsResource {\n return (this._logs ??= new LogsResource(this.ctx, `${this.base()}/agentic/logs`));\n }\n\n private _analytics?: AnalyticsResource;\n /** Agent analytics (`/agentic/analytics`). `get · executions`. */\n get analytics(): AnalyticsResource {\n return (this._analytics ??= new AnalyticsResource(this.ctx, `${this.base()}/agentic/analytics`));\n }\n\n /** Generate text from a single prompt (`POST /texts`). Honors `maxTokens`. */\n async generateText(input: TextRequest, auth: AuthContext = SERVICE): Promise<TextResponse> {\n return this.ctx.http.request<TextResponse>({\n method: \"POST\",\n path: `${this.base()}/texts`,\n auth,\n body: input,\n });\n }\n\n /** Run a chat completion over a message list (`POST /completions`). No `maxTokens`. */\n async complete(\n input: CompletionRequest,\n auth: AuthContext = SERVICE,\n ): Promise<CompletionResponse> {\n return this.ctx.http.request<CompletionResponse>({\n method: \"POST\",\n path: `${this.base()}/completions`,\n auth,\n body: input,\n });\n }\n\n /**\n * List agents (`GET /agentic/agents`). `q`, `pageNumber`, `pageSize`, `sort`,\n * `fields` and `expand` go in the query string; without paging keys the\n * server returns its first page. The original `listAgents(auth)` still works.\n */\n listAgents(auth?: AuthContext): Promise<Agent[]>;\n listAgents(query: ListQuery, auth?: AuthContext): Promise<Agent[]>;\n async listAgents(queryOrAuth: ListQuery | AuthContext = {}, auth: AuthContext = SERVICE): Promise<Agent[]> {\n const [query, ctx]: [ListQuery, AuthContext] = isAuthContext(queryOrAuth)\n ? [{}, queryOrAuth]\n : [queryOrAuth, auth];\n return this.ctx.http.request<Agent[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/agents`,\n auth: ctx,\n query: { ...query },\n });\n }\n\n /** Retrieve one agent by id. */\n async getAgent(id: string, auth: AuthContext = SERVICE): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"GET\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create-or-replace an agent by id (`PUT`). Takes the agent write shape. */\n async upsertAgent(id: string, agent: AgentInput, auth: AuthContext = SERVICE): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"PUT\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n body: agent,\n });\n }\n\n /**\n * Patch an agent with an op array (`PATCH`). `ops` use the upstream\n * UPPERCASE enum (`ADD | REMOVE | REPLACE`) and are sent verbatim — this is\n * NOT RFC-6902 JSON-Patch.\n */\n async patchAgent(\n id: string,\n ops: AgentPatchOp[],\n auth: AuthContext = SERVICE,\n ): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"PATCH\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n body: ops,\n });\n }\n\n /**\n * Delete an agent by id. Pass `{ force: true }` to delete an agent that is\n * still referenced elsewhere (`?force=true`).\n */\n async deleteAgent(\n id: string,\n auth: AuthContext = SERVICE,\n opts: DeleteAgentOptions = {},\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /**\n * Server-side agent search (`POST /agentic/agents/search`). `q` goes in the\n * body; `pageNumber`, `pageSize`, `sort` and `fields` in the query string.\n */\n async searchAgents(query: AgentSearchQuery, auth: AuthContext = SERVICE): Promise<Agent[]> {\n return this.ctx.http.request<Agent[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/search`,\n auth,\n ...splitQuery(query, SEARCH_PAGING),\n });\n }\n\n /**\n * Synchronous agent chat (`POST /agentic/chat`). Returns the response\n * ARRAY verbatim (the upstream contract is an array, not a single object).\n *\n * `opts.sessionId` is sent as the `session-id` header. It carries the\n * conversation — continuity needs it plus `enabledMemory` on the agent — and\n * it is how a chat reaches an attachment: pass the `sessionId` the upload or\n * reuse returned, and list the file under `input.attachments`.\n */\n async chat(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ChatResponse[]> {\n assertChatOptions(opts, \"chat\");\n return this.ctx.http.request<ChatResponse[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/chat`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n }\n\n /**\n * Fire-and-forget agent chat (`POST /agentic/chat-async`, HTTP 201).\n * Returns the job-id ARRAY verbatim. `opts` as for {@link chat}.\n */\n async chatAsync(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<JobIdResponse[]> {\n assertChatOptions(opts, \"chatAsync\");\n return this.ctx.http.request<JobIdResponse[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/chat-async`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n }\n\n /**\n * Streaming agent chat (`POST /agentic/chat-stream`, `text/event-stream`).\n * Yields each SSE `data` payload verbatim — the upstream contract types the\n * stream body as an opaque string, so chunks are raw strings, not parsed\n * objects. Consume with `for await`. `opts` as for {@link chat}.\n */\n async *chatStream(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): AsyncIterable<string> {\n assertChatOptions(opts, \"chatStream\");\n const events = this.ctx.http.requestStream({\n method: \"POST\",\n path: `${this.base()}/agentic/chat-stream`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n for await (const ev of events) yield ev.data;\n }\n\n /**\n * List stored agentic conversations (`GET /agentic/conversations`), paged\n * like {@link listAgents}. The original `listConversations(auth)` still works.\n */\n listConversations(auth?: AuthContext): Promise<Conversation[]>;\n listConversations(query: ListQuery, auth?: AuthContext): Promise<Conversation[]>;\n async listConversations(\n queryOrAuth: ListQuery | AuthContext = {},\n auth: AuthContext = SERVICE,\n ): Promise<Conversation[]> {\n const [query, ctx]: [ListQuery, AuthContext] = isAuthContext(queryOrAuth)\n ? [{}, queryOrAuth]\n : [queryOrAuth, auth];\n return this.ctx.http.request<Conversation[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/conversations`,\n auth: ctx,\n query: { ...query },\n });\n }\n\n /** Server-side conversation search (`POST /agentic/conversations/search`), paged like {@link searchAgents}. */\n async searchConversations(\n query: ConversationSearchQuery,\n auth: AuthContext = SERVICE,\n ): Promise<Conversation[]> {\n return this.ctx.http.request<Conversation[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/conversations/search`,\n auth,\n ...splitQuery(query, SEARCH_PAGING),\n });\n }\n\n // --- Standalone agentic reads / bulk operations ------------------------\n\n /** List models available to the tenant, grouped by provider (`GET /agentic/models`). */\n async listModels(auth: AuthContext = SERVICE): Promise<ProviderModels[]> {\n return this.ctx.http.request<ProviderModels[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/models`,\n auth,\n });\n }\n\n /** List commerce events available to agent triggers (`GET /agentic/commerce-events`). */\n async listCommerceEvents(auth: AuthContext = SERVICE): Promise<CommerceEvents> {\n return this.ctx.http.request<CommerceEvents>({\n method: \"GET\",\n path: `${this.base()}/agentic/commerce-events`,\n auth,\n });\n }\n\n /**\n * Upload a chat attachment for an agent\n * (`POST /agentic/{agentId}/attachments`, multipart, HTTP 201). The response\n * `sessionId` must be threaded into subsequent chat calls to bind the file.\n * Pass `opts.sessionId` to attach to an existing session.\n *\n * The endpoint takes exactly one of `attachment` or `attachmentId` — both or\n * neither is a `400`. This method always sends the file; to point a second\n * agent at a file already in the session, use {@link reuseAttachment}.\n */\n async uploadAttachment(\n agentId: string,\n attachment: Blob | File,\n opts: AttachmentOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Attachment> {\n const form = new FormData();\n form.append(\"attachment\", attachment);\n return this.ctx.http.request<Attachment>({\n method: \"POST\",\n path: `${this.base()}/agentic/${encodeURIComponent(agentId)}/attachments`,\n auth,\n body: form,\n ...(opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {}),\n });\n }\n\n /**\n * Assign an existing media asset to an agent as a chat attachment\n * (`POST /agentic/{agentId}/attachments` with the `attachmentId` form field,\n * HTTP 200). Resolves to the attachment `id` and the `sessionId` to send on\n * the following chat calls.\n *\n * Use it to hand a second agent the same file instead of uploading it twice.\n * Pass `opts.sessionId` to attach to an existing chat session; without it the\n * service opens a new one and returns its id — thread that into the chat, or\n * the agent never sees the file. With `ai.agentexecution_manage` the asset may\n * be any media asset, not only one uploaded to this session.\n *\n * ```ts\n * const { id, sessionId } = await client.ai.uploadAttachment(\"agent-a\", file);\n * await client.ai.reuseAttachment(\"agent-b\", id!, { sessionId: sessionId! });\n * ```\n */\n async reuseAttachment(\n agentId: string,\n attachmentId: string,\n opts: AttachmentReuseOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Attachment> {\n const form = new FormData();\n form.append(\"attachmentId\", attachmentId);\n return this.ctx.http.request<Attachment>({\n method: \"POST\",\n path: `${this.base()}/agentic/${encodeURIComponent(agentId)}/attachments`,\n auth,\n body: form,\n ...(opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {}),\n });\n }\n\n /** Export agents + components as a base64/checksum blob (`POST /agentic/agents/export`). */\n async exportAgents(body: AgentsExportRequest, auth: AuthContext = SERVICE): Promise<AgentsExport> {\n return this.ctx.http.request<AgentsExport>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/export`,\n auth,\n body,\n });\n }\n\n /** Import previously-exported agents (`POST /agentic/agents/import`). */\n async importAgents(body: AgentsImportRequest, auth: AuthContext = SERVICE): Promise<AgentsImport> {\n return this.ctx.http.request<AgentsImport>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/import`,\n auth,\n body,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n TaxConfig,\n TaxConfigInput,\n TaxConfigUpdate,\n TaxConfigCreated,\n TaxCalculationRequest,\n TaxCalculationResult,\n} from \"./tax-types\";\n\nexport type {\n TaxClass,\n TaxLocation,\n TaxConfig,\n TaxConfigInput,\n TaxConfigUpdate,\n TaxConfigCreated,\n TaxCalculationInput,\n TaxCalculationRequest,\n TaxCalculationResult,\n} from \"./tax-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Tax Service (`/tax/{tenant}/…`): CRUD over per-location tax\n * configurations and the net/gross tax-calculation command. Every endpoint\n * requires a backend `tax.tax_read` / `tax.tax_manage` scope and the\n * **service (clientCredentials) token** — default auth: service.\n *\n * Server-side use only; the service token must never reach a browser.\n */\nexport class TaxService {\n static readonly channel = \"tax\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/tax/${this.ctx.tenant}`;\n }\n\n /** List all per-location tax configurations. */\n async listTaxConfigs(auth: AuthContext = SERVICE): Promise<TaxConfig[]> {\n return this.ctx.http.request<TaxConfig[]>({\n method: \"GET\",\n path: `${this.base()}/taxes`,\n auth,\n });\n }\n\n /** Retrieve one tax configuration by its location (country) code. */\n async getTaxConfig(locationCode: string, auth: AuthContext = SERVICE): Promise<TaxConfig> {\n return this.ctx.http.request<TaxConfig>({\n method: \"GET\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n });\n }\n\n /** Create a tax configuration (`POST`). Returns the created `{ locationCode }`. */\n async createTaxConfig(\n input: TaxConfigInput,\n auth: AuthContext = SERVICE,\n ): Promise<TaxConfigCreated> {\n return this.ctx.http.request<TaxConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/taxes`,\n auth,\n body: input,\n });\n }\n\n /**\n * Update a tax configuration by location code (`PUT`). `metadata.version` is\n * required (optimistic locking — a stale version yields 409).\n */\n async updateTaxConfig(\n locationCode: string,\n input: TaxConfigUpdate,\n auth: AuthContext = SERVICE,\n ): Promise<TaxConfig> {\n return this.ctx.http.request<TaxConfig>({\n method: \"PUT\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a tax configuration by location code. */\n async deleteTaxConfig(locationCode: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n });\n }\n\n /**\n * Calculate net/gross values for a price (`PUT /taxes/calculation-commands`).\n * Single command in, single result out.\n */\n async calculateTax(\n request: TaxCalculationRequest,\n auth: AuthContext = SERVICE,\n ): Promise<TaxCalculationResult> {\n return this.ctx.http.request<TaxCalculationResult>({\n method: \"PUT\",\n path: `${this.base()}/taxes/calculation-commands`,\n auth,\n body: request,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n CouponList,\n Coupon,\n CouponInput,\n CouponUpdate,\n CouponCreated,\n Redemption,\n RedemptionInput,\n RedemptionCreated,\n ReferralCoupon,\n} from \"./coupon-types\";\n\nexport type {\n Coupon,\n CouponList,\n CouponInput,\n CouponUpdate,\n CouponCreated,\n Redemption,\n RedemptionInput,\n RedemptionCreated,\n ReferralCoupon,\n} from \"./coupon-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Coupon Service (`/coupon/{tenant}/…`): coupon CRUD, validation,\n * redemptions, and referral coupons.\n *\n * Every method defaults to the **service (clientCredentials) token**. For\n * customer-driven validation/redemption, pass `auth.customer(token)` as the\n * trailing argument (the React hooks do this with the browser context). The\n * service token must never reach a browser.\n */\nexport class CouponService {\n static readonly channel = \"coupon\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/coupon/${this.ctx.tenant}`;\n }\n\n /** List coupons by criteria. Returns a plain array. */\n async listCoupons(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CouponList> {\n return this.ctx.http.request<CouponList>({\n method: \"GET\",\n path: `${this.base()}/coupons`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one coupon by code. */\n async getCoupon(code: string, auth: AuthContext = SERVICE): Promise<Coupon> {\n return this.ctx.http.request<Coupon>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a coupon (`POST`, HTTP 201). Returns the created resource's `{ id?, yrn? }`. */\n async createCoupon(input: CouponInput, auth: AuthContext = SERVICE): Promise<CouponCreated> {\n return this.ctx.http.request<CouponCreated>({\n method: \"POST\",\n path: `${this.base()}/coupons`,\n auth,\n body: input,\n });\n }\n\n /** Replace a coupon by code (`PUT`). Resolves once the update is accepted. */\n async updateCoupon(code: string, input: CouponUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a coupon by code (`PATCH` merge body). */\n async patchCoupon(code: string, patch: CouponUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a coupon by code. */\n async deleteCoupon(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /**\n * Check whether a coupon can be redeemed (`POST /validation`). Resolves when\n * redeemable; throws an `EmporixError` otherwise (no response body).\n */\n async validateCoupon(\n code: string,\n redemption: RedemptionInput,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/validation`,\n auth,\n body: redemption,\n });\n }\n\n /** List a coupon's redemptions by criteria. */\n async listRedemptions(\n code: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<Redemption[]> {\n return this.ctx.http.request<Redemption[]>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Redeem a coupon by creating a redemption (`POST`, HTTP 201). Returns the resource location. */\n async redeemCoupon(\n code: string,\n redemption: RedemptionInput,\n auth: AuthContext = SERVICE,\n ): Promise<RedemptionCreated> {\n return this.ctx.http.request<RedemptionCreated>({\n method: \"POST\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions`,\n auth,\n body: redemption,\n });\n }\n\n /** Retrieve one redemption by id. */\n async getRedemption(code: string, id: string, auth: AuthContext = SERVICE): Promise<Redemption> {\n return this.ctx.http.request<Redemption>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Delete a redemption by id. */\n async deleteRedemption(code: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Retrieve a customer's referral coupon (resolves to an empty body when none exists). */\n async getReferralCoupon(customerNumber: string, auth: AuthContext = SERVICE): Promise<ReferralCoupon> {\n return this.ctx.http.request<ReferralCoupon>({\n method: \"GET\",\n path: `${this.base()}/referral-coupons/${encodeURIComponent(customerNumber)}`,\n auth,\n });\n }\n\n /** Create a referral coupon code for a customer (no request body). */\n async createReferralCoupon(\n customerNumber: string,\n auth: AuthContext = SERVICE,\n ): Promise<ReferralCoupon> {\n return this.ctx.http.request<ReferralCoupon>({\n method: \"POST\",\n path: `${this.base()}/referral-coupons/${encodeURIComponent(customerNumber)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError } from \"../core/errors\";\nimport type {\n CustomerSummaryBatch,\n PointsSummary,\n NewPointsEntry,\n AddedPoints,\n RedeemedPoints,\n RedeemOption,\n RedeemOptionList,\n RedeemMyPointsInput,\n RedeemCouponResult,\n} from \"./reward-points-types\";\n\nexport type {\n CustomerSummaryBatch,\n PointsSummary,\n NewPointsEntry,\n AddedPoints,\n RedeemedPoints,\n RedeemOption,\n RedeemOptionList,\n RedeemMyPointsInput,\n RedeemCouponResult,\n} from \"./reward-points-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Reward Points Service (`/reward-points/…`): admin customer-points\n * management, the signed-in customer's own points, and redeem options.\n *\n * Auth differs per group: admin and redeem-option management default to the\n * **service token**; the `/public/*` methods require a **customer token** (they\n * accept only `CustomerAccessToken`). Note the mixed base paths — customer/\n * public/batch endpoints omit `{tenant}`, redeem options include it. A point\n * balance (`getCustomerPoints` / `getMyPoints`) is returned as a bare `number`.\n */\nexport class RewardPointsService {\n static readonly channel = \"reward-points\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Base without tenant (customer / public / batch endpoints). */\n private base(): string {\n return `/reward-points`;\n }\n\n /** Tenant-scoped base (redeem options only). */\n private tenantBase(): string {\n return `/reward-points/${this.ctx.tenant}`;\n }\n\n // --- Admin: customer points management (service token) ---\n\n /** Batch summary across all customers. */\n async listAllSummaries(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CustomerSummaryBatch> {\n return this.ctx.http.request<CustomerSummaryBatch>({\n method: \"GET\",\n path: `${this.base()}/summaryBatch`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one customer's reward-points balance. */\n async getCustomerPoints(customerId: string, auth: AuthContext = SERVICE): Promise<number> {\n return this.ctx.http.request<number>({\n method: \"GET\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Create a reward-points entry for a customer. */\n async createCustomerPoints(\n customerId: string,\n input: NewPointsEntry,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a customer's reward points. */\n async deleteCustomerPoints(customerId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Retrieve a reward-points summary for one customer. */\n async getCustomerSummary(customerId: string, auth: AuthContext = SERVICE): Promise<PointsSummary> {\n return this.ctx.http.request<PointsSummary>({\n method: \"GET\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/summary`,\n auth,\n });\n }\n\n /** Add reward points for a customer. */\n async addPoints(customerId: string, input: AddedPoints, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/addPoints`,\n auth,\n body: input,\n });\n }\n\n /** Redeem a customer's reward points (on behalf). */\n async redeemPoints(customerId: string, input: RedeemedPoints, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/redeemPoints`,\n auth,\n body: input,\n });\n }\n\n // --- Storefront: the signed-in customer's own points (customer token required) ---\n\n /** The signed-in customer's reward-points balance. Requires a customer `auth`. */\n async getMyPoints(auth: AuthContext): Promise<number> {\n // A customer who has never earned points has no entry, and Emporix answers\n // 404 \"No reward points found\" — for the signed-in customer that simply\n // means zero points, so map it to 0 rather than surfacing an error.\n try {\n return await this.ctx.http.request<number>({\n method: \"GET\",\n path: `${this.base()}/public/customer`,\n auth,\n });\n } catch (err) {\n if (err instanceof EmporixNotFoundError) return 0;\n throw err;\n }\n }\n\n /** The signed-in customer's reward-points summary. Requires a customer `auth`. */\n async getMySummary(auth: AuthContext): Promise<PointsSummary> {\n // Same as getMyPoints: a 404 means the signed-in customer has no entry yet,\n // i.e. an empty summary (zero active points, no history), not an error.\n try {\n return await this.ctx.http.request<PointsSummary>({\n method: \"GET\",\n path: `${this.base()}/public/customer/summary`,\n auth,\n });\n } catch (err) {\n if (err instanceof EmporixNotFoundError) {\n return { activePoints: 0, summary: { addedPointsList: [] } };\n }\n throw err;\n }\n }\n\n /**\n * Redeem the signed-in customer's points for a coupon code. Requires a\n * customer `auth`. Returns the issued coupon `{ code }`.\n */\n async redeemMyPoints(input: RedeemMyPointsInput, auth: AuthContext): Promise<RedeemCouponResult> {\n return this.ctx.http.request<RedeemCouponResult>({\n method: \"POST\",\n path: `${this.base()}/public/customer/redeem`,\n auth,\n body: input,\n });\n }\n\n // --- Redeem options (tenant-scoped; read open to customer, management service-only) ---\n\n /** List redeem options. Defaults to the service token; pass a customer `auth` for storefront reads. */\n async listRedeemOptions(auth: AuthContext = SERVICE): Promise<RedeemOptionList> {\n return this.ctx.http.request<RedeemOptionList>({\n method: \"GET\",\n path: `${this.tenantBase()}/redeemOptions`,\n auth,\n });\n }\n\n /** Create a redeem option. Returns the updated options list. */\n async createRedeemOption(input: RedeemOption, auth: AuthContext = SERVICE): Promise<RedeemOptionList> {\n return this.ctx.http.request<RedeemOptionList>({\n method: \"POST\",\n path: `${this.tenantBase()}/redeemOptions`,\n auth,\n body: input,\n });\n }\n\n /** Update a redeem option by id. Resolves once accepted (no response body). */\n async updateRedeemOption(\n redeemOptionId: string,\n input: RedeemOption,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.tenantBase()}/redeemOptions/${encodeURIComponent(redeemOptionId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a redeem option by id. */\n async deleteRedeemOption(redeemOptionId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.tenantBase()}/redeemOptions/${encodeURIComponent(redeemOptionId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Brand, BrandList, BrandInput, BrandUpdate } from \"./brand-types\";\n\nexport type { Brand, BrandList, BrandInput, BrandUpdate } from \"./brand-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Brand Service (`/brand/brands`): CRUD over brands. Server-side;\n * defaults to the service token (reads also work with an anonymous token).\n * The path carries no `{tenant}` segment — the tenant comes from the token.\n */\nexport class BrandService {\n static readonly channel = \"brand\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/brand/brands`;\n }\n\n /** List all brands. */\n async listBrands(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<BrandList> {\n return this.ctx.http.request<BrandList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one brand by id. */\n async getBrand(brandId: string, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n });\n }\n\n /** Create a brand. */\n async createBrand(input: BrandInput, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a brand by id. */\n async updateBrand(brandId: string, input: BrandUpdate, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a brand by id. */\n async patchBrand(brandId: string, patch: BrandUpdate, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a brand by id. */\n async deleteBrand(brandId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Label, LabelList, LabelInput, LabelUpdate } from \"./label-types\";\n\nexport type { Label, LabelList, LabelInput, LabelUpdate } from \"./label-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Label Service (`/label/labels`): CRUD over product labels (e.g.\n * \"Sale\", \"New\"). Server-side; defaults to the service token. The path carries\n * no `{tenant}` segment — the tenant comes from the token.\n */\nexport class LabelService {\n static readonly channel = \"label\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/label/labels`;\n }\n\n /** List all labels. */\n async listLabels(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<LabelList> {\n return this.ctx.http.request<LabelList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one label by id. */\n async getLabel(labelId: string, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n });\n }\n\n /** Create a label. */\n async createLabel(input: LabelInput, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a label by id. */\n async updateLabel(labelId: string, input: LabelUpdate, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a label by id. */\n async patchLabel(labelId: string, patch: LabelUpdate, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a label by id. */\n async deleteLabel(labelId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Country, CountryList, CountryUpdate, Region, RegionList } from \"./country-types\";\n\nexport type { Country, CountryList, CountryUpdate, Region, RegionList } from \"./country-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Country Service (`/country/{tenant}/…`): countries and regions\n * master data. Server-side; defaults to the service token (reads also work\n * with an anonymous token). Countries are predefined — list/get/patch only\n * (no create/delete).\n */\nexport class CountryService {\n static readonly channel = \"country\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/country/${this.ctx.tenant}`;\n }\n\n /** List all countries. */\n async listCountries(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CountryList> {\n return this.ctx.http.request<CountryList>({\n method: \"GET\",\n path: `${this.base()}/countries`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one country by code. */\n async getCountry(countryCode: string, auth: AuthContext = SERVICE): Promise<Country> {\n return this.ctx.http.request<Country>({\n method: \"GET\",\n path: `${this.base()}/countries/${encodeURIComponent(countryCode)}`,\n auth,\n });\n }\n\n /** Partially update a country by code. Resolves once accepted (no response body). */\n async patchCountry(countryCode: string, patch: CountryUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/countries/${encodeURIComponent(countryCode)}`,\n auth,\n body: patch,\n });\n }\n\n /** List all regions. */\n async listRegions(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<RegionList> {\n return this.ctx.http.request<RegionList>({\n method: \"GET\",\n path: `${this.base()}/regions`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one region by code. */\n async getRegion(regionCode: string, auth: AuthContext = SERVICE): Promise<Region> {\n return this.ctx.http.request<Region>({\n method: \"GET\",\n path: `${this.base()}/regions/${encodeURIComponent(regionCode)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Currency,\n CurrencyList,\n CurrencyInput,\n CurrencyUpdate,\n CurrencyCreated,\n ExchangeRate,\n ExchangeRateList,\n ExchangeRateInput,\n ExchangeRateUpdate,\n ExchangeRateCreated,\n} from \"./currency-types\";\n\nexport type {\n Currency,\n CurrencyList,\n CurrencyInput,\n CurrencyUpdate,\n CurrencyCreated,\n ExchangeRate,\n ExchangeRateList,\n ExchangeRateInput,\n ExchangeRateUpdate,\n ExchangeRateCreated,\n} from \"./currency-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Currency Service (`/currency/{tenant}/…`): currencies and exchange\n * rates. Server-side; defaults to the service token.\n */\nexport class CurrencyService {\n static readonly channel = \"currency\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/currency/${this.ctx.tenant}`;\n }\n\n // --- Currencies ---\n\n /** List all currencies. */\n async listCurrencies(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CurrencyList> {\n return this.ctx.http.request<CurrencyList>({\n method: \"GET\",\n path: `${this.base()}/currencies`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one currency by code. */\n async getCurrency(code: string, auth: AuthContext = SERVICE): Promise<Currency> {\n return this.ctx.http.request<Currency>({\n method: \"GET\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a currency. */\n async createCurrency(input: CurrencyInput, auth: AuthContext = SERVICE): Promise<CurrencyCreated> {\n return this.ctx.http.request<CurrencyCreated>({\n method: \"POST\",\n path: `${this.base()}/currencies`,\n auth,\n body: input,\n });\n }\n\n /** Update a currency by code. */\n async updateCurrency(code: string, input: CurrencyUpdate, auth: AuthContext = SERVICE): Promise<Currency> {\n return this.ctx.http.request<Currency>({\n method: \"PUT\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a currency by code. */\n async deleteCurrency(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n // --- Exchange rates ---\n\n /** List all exchange rates. */\n async listExchangeRates(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ExchangeRateList> {\n return this.ctx.http.request<ExchangeRateList>({\n method: \"GET\",\n path: `${this.base()}/exchanges`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one exchange rate by code. */\n async getExchangeRate(code: string, auth: AuthContext = SERVICE): Promise<ExchangeRate> {\n return this.ctx.http.request<ExchangeRate>({\n method: \"GET\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create an exchange rate. */\n async createExchangeRate(input: ExchangeRateInput, auth: AuthContext = SERVICE): Promise<ExchangeRateCreated> {\n return this.ctx.http.request<ExchangeRateCreated>({\n method: \"POST\",\n path: `${this.base()}/exchanges`,\n auth,\n body: input,\n });\n }\n\n /** Update an exchange rate by code. */\n async updateExchangeRate(code: string, input: ExchangeRateUpdate, auth: AuthContext = SERVICE): Promise<ExchangeRate> {\n return this.ctx.http.request<ExchangeRate>({\n method: \"PUT\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete an exchange rate by code. */\n async deleteExchangeRate(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Site,\n SiteList,\n FindSiteInput,\n Zone,\n ZoneList,\n ShippingMethod,\n ShippingMethodList,\n ShippingGroup,\n ShippingGroupList,\n CgRelation,\n CgRelationList,\n QuoteInput,\n QuoteResult,\n QuoteSlotInput,\n ShippingFee,\n MinimumFee,\n ResourceCreated,\n DeliveryWindowList,\n DeliveryWindowValidation,\n DeliveryTime,\n DeliveryTimeList,\n DeliveryTimeInput,\n DeliveryTimeUpdate,\n DeliverySlot,\n DeliverySlotList,\n DeliveryCycleInput,\n ShippingPatch,\n DeliveryCreated,\n} from \"./shipping-types\";\n\nexport type {\n Site,\n SiteList,\n FindSiteInput,\n Zone,\n ZoneList,\n ShippingMethod,\n ShippingMethodList,\n ShippingGroup,\n ShippingGroupList,\n CgRelation,\n CgRelationList,\n QuoteInput,\n QuoteResult,\n QuoteSlotInput,\n ShippingFee,\n MinimumFee,\n ResourceCreated,\n DeliveryWindow,\n DeliveryWindowList,\n DeliveryWindowValidation,\n DeliveryTime,\n DeliveryTimeList,\n DeliveryTimeInput,\n DeliveryTimeUpdate,\n DeliverySlot,\n DeliverySlotList,\n DeliveryCycleInput,\n ShippingPatch,\n DeliveryCreated,\n} from \"./shipping-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * The zone whose `shipTo` covers `country`, else the default zone, else the first.\n *\n * Pure — no client, no request. Pair it with `listZones(site, { expand:\n * \"methods,fees\" })` to turn a zone list into the one zone a checkout should\n * offer.\n *\n * The `?? []` guards a field the generated schema marks required. Emporix'\n * schema has been wrong about optionality before, and a storefront that throws\n * on an unexpected shape is worse than one that finds no zone.\n */\nexport function resolveZone(zones: ZoneList | undefined, country: string): Zone | undefined {\n if (!zones || zones.length === 0) return undefined;\n const c = country.trim().toUpperCase();\n const byCountry = c\n ? zones.find((z) => (z.shipTo ?? []).some((s) => s.country?.toUpperCase() === c))\n : undefined;\n return byCountry ?? zones.find((z) => z.default) ?? zones[0];\n}\n\n/**\n * The applicable fee: the highest `minOrderValue` at or below `cartTotal`, else\n * the first fee.\n *\n * `<=`, not `<`: a total that exactly meets a free-shipping threshold gets free\n * shipping.\n */\nexport function pickFee(fees: ShippingFee[] | undefined, cartTotal: number): ShippingFee | undefined {\n if (!fees || fees.length === 0) return undefined;\n const eligible = fees\n .filter((f) => (f.minOrderValue?.amount ?? 0) <= cartTotal)\n .sort((a, b) => (b.minOrderValue?.amount ?? 0) - (a.minOrderValue?.amount ?? 0));\n return eligible[0] ?? fees[0];\n}\n\n/**\n * Emporix Shipping Service (`/shipping/{tenant}/…`), Phase 1 — config: sites,\n * zones, methods, cost/quote, groups, customer-group relations. Server-side;\n * defaults to the service token. Most methods are site-scoped and take `site`\n * first; `findSites` is tenant-level. Delivery scheduling is Phase 2.\n */\nexport class ShippingService {\n static readonly channel = \"shipping\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/shipping/${this.ctx.tenant}`;\n }\n\n private siteBase(site: string): string {\n return `${this.base()}/${encodeURIComponent(site)}`;\n }\n\n // --- Sites ---\n\n /** Find shipping-related sites by postal code (`POST /findSite`). */\n async findSites(input: FindSiteInput, auth: AuthContext = SERVICE): Promise<SiteList> {\n return this.ctx.http.request<SiteList>({\n method: \"POST\",\n path: `${this.base()}/findSite`,\n auth,\n body: input,\n });\n }\n\n // --- Zones ---\n\n /** List shipping zones for a site. */\n async listZones(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ZoneList> {\n return this.ctx.http.request<ZoneList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping zone. */\n async getZone(site: string, zoneId: string, auth: AuthContext = SERVICE): Promise<Zone> {\n return this.ctx.http.request<Zone>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n });\n }\n\n /** Create a shipping zone. */\n async createZone(site: string, zone: Zone, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/zones`,\n auth,\n body: zone,\n });\n }\n\n /** Replace a shipping zone. */\n async updateZone(site: string, zoneId: string, zone: Zone, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n body: zone,\n });\n }\n\n /** Partially update a shipping zone. */\n async patchZone(site: string, zoneId: string, patch: Zone, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a shipping zone. */\n async deleteZone(site: string, zoneId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n });\n }\n\n // --- Methods (per zone) ---\n\n /** List shipping methods of a zone. */\n async listMethods(\n site: string,\n zoneId: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ShippingMethodList> {\n return this.ctx.http.request<ShippingMethodList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping method. */\n async getMethod(site: string, zoneId: string, methodId: string, auth: AuthContext = SERVICE): Promise<ShippingMethod> {\n return this.ctx.http.request<ShippingMethod>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n });\n }\n\n /** Create a shipping method in a zone. */\n async createMethod(site: string, zoneId: string, method: ShippingMethod, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods`,\n auth,\n body: method,\n });\n }\n\n /** Replace a shipping method. */\n async updateMethod(site: string, zoneId: string, methodId: string, method: ShippingMethod, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n body: method,\n });\n }\n\n /** Partially update a shipping method. */\n async patchMethod(site: string, zoneId: string, methodId: string, patch: ShippingMethod, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a shipping method. */\n async deleteMethod(site: string, zoneId: string, methodId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n });\n }\n\n // --- Cost / quote ---\n\n /** Calculate the final shipping cost (`POST /quote`). */\n async quote(site: string, input: QuoteInput, auth: AuthContext = SERVICE): Promise<QuoteResult> {\n return this.ctx.http.request<QuoteResult>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote`,\n auth,\n body: input,\n });\n }\n\n /** Calculate the minimum shipping cost (`POST /quote/minimum`). */\n async quoteMinimum(site: string, input: QuoteInput, auth: AuthContext = SERVICE): Promise<MinimumFee> {\n return this.ctx.http.request<MinimumFee>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote/minimum`,\n auth,\n body: input,\n });\n }\n\n /** Calculate the shipping cost for a given slot (`POST /quote/slot`). */\n async quoteSlot(site: string, input: QuoteSlotInput, auth: AuthContext = SERVICE): Promise<MinimumFee> {\n return this.ctx.http.request<MinimumFee>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote/slot`,\n auth,\n body: input,\n });\n }\n\n // --- Groups ---\n\n /** List shipping groups for a site. */\n async listGroups(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ShippingGroupList> {\n return this.ctx.http.request<ShippingGroupList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/groups`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping group. */\n async getGroup(site: string, groupId: string, auth: AuthContext = SERVICE): Promise<ShippingGroup> {\n return this.ctx.http.request<ShippingGroup>({\n method: \"GET\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n });\n }\n\n /** Create a shipping group. */\n async createGroup(site: string, group: ShippingGroup, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/groups`,\n auth,\n body: group,\n });\n }\n\n /** Replace a shipping group. */\n async updateGroup(site: string, groupId: string, group: ShippingGroup, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n body: group,\n });\n }\n\n /** Delete a shipping group. */\n async deleteGroup(site: string, groupId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n });\n }\n\n // --- Customer-group relations ---\n\n /** List customer-group relations for a site. */\n async listCgRelations(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CgRelationList> {\n return this.ctx.http.request<CgRelationList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/cgrelations`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a customer's customer-group relations. */\n async getCgRelations(site: string, customerId: string, auth: AuthContext = SERVICE): Promise<CgRelation> {\n return this.ctx.http.request<CgRelation>({\n method: \"GET\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Create a customer-group relation. */\n async createCgRelation(site: string, relation: CgRelation, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/cgrelations`,\n auth,\n body: relation,\n });\n }\n\n /** Update a customer's customer-group relations. */\n async updateCgRelations(site: string, customerId: string, relation: CgRelation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n body: relation,\n });\n }\n\n /** Delete a customer's customer-group relation. */\n async deleteCgRelation(site: string, customerId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n // --- Phase 2: delivery windows ---\n\n /** Retrieve delivery windows for a delivery area + cart. */\n async getAreaDeliveryWindows(deliveryAreaId: string, cartId: string, auth: AuthContext = SERVICE): Promise<DeliveryWindowList> {\n return this.ctx.http.request<DeliveryWindowList>({\n method: \"GET\",\n path: `${this.base()}/areaDeliveryTimes/${encodeURIComponent(deliveryAreaId)}/${encodeURIComponent(cartId)}`,\n auth,\n });\n }\n\n /** Retrieve delivery windows for a cart. */\n async getCartDeliveryWindows(cartId: string, auth: AuthContext = SERVICE): Promise<DeliveryWindowList> {\n return this.ctx.http.request<DeliveryWindowList>({\n method: \"GET\",\n path: `${this.base()}/actualDeliveryWindows/${encodeURIComponent(cartId)}`,\n auth,\n });\n }\n\n /** Increment the delivery-window counter. */\n async incrementDeliveryWindowCounter(input: DeliveryWindowValidation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/actualDeliveryWindows/incrementCounter`,\n auth,\n body: input,\n });\n }\n\n /** Validate a delivery window. Resolves when valid; throws otherwise. */\n async validateDeliveryWindow(input: DeliveryWindowValidation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/deliveryWindowValidation`,\n auth,\n body: input,\n });\n }\n\n // --- Phase 2: delivery times ---\n\n /** List all delivery times. */\n async listDeliveryTimes(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<DeliveryTimeList> {\n return this.ctx.http.request<DeliveryTimeList>({\n method: \"GET\",\n path: `${this.base()}/delivery-times`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one delivery time. */\n async getDeliveryTime(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<DeliveryTime> {\n return this.ctx.http.request<DeliveryTime>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n });\n }\n\n /** Create a delivery time. */\n async createDeliveryTime(input: DeliveryTimeInput, auth: AuthContext = SERVICE): Promise<DeliveryCreated> {\n return this.ctx.http.request<DeliveryCreated>({\n method: \"POST\",\n path: `${this.base()}/delivery-times`,\n auth,\n body: input,\n });\n }\n\n /** Create multiple delivery times (`POST /delivery-times/bulk`). */\n async createDeliveryTimesBulk(inputs: DeliveryTimeInput[], auth: AuthContext = SERVICE): Promise<DeliveryCreated[]> {\n return this.ctx.http.request<DeliveryCreated[]>({\n method: \"POST\",\n path: `${this.base()}/delivery-times/bulk`,\n auth,\n body: inputs,\n });\n }\n\n /** Replace a delivery time. */\n async updateDeliveryTime(deliveryTimeId: string, input: DeliveryTimeUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a delivery time (JSON-Patch op array). */\n async patchDeliveryTime(deliveryTimeId: string, ops: ShippingPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a delivery time. */\n async deleteDeliveryTime(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n });\n }\n\n // --- Phase 2: delivery time slots ---\n\n /** List slots of a delivery time. */\n async listSlots(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<DeliverySlotList> {\n return this.ctx.http.request<DeliverySlotList>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n });\n }\n\n /** Retrieve one slot. */\n async getSlot(deliveryTimeId: string, slotId: string, auth: AuthContext = SERVICE): Promise<DeliverySlot> {\n return this.ctx.http.request<DeliverySlot>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n });\n }\n\n /** Create a slot in a delivery time. */\n async createSlot(deliveryTimeId: string, input: DeliverySlot, auth: AuthContext = SERVICE): Promise<DeliveryCreated> {\n return this.ctx.http.request<DeliveryCreated>({\n method: \"POST\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n body: input,\n });\n }\n\n /** Replace a slot. */\n async updateSlot(deliveryTimeId: string, slotId: string, input: DeliverySlot, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a slot (JSON-Patch op array). */\n async patchSlot(deliveryTimeId: string, slotId: string, ops: ShippingPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a slot. */\n async deleteSlot(deliveryTimeId: string, slotId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n });\n }\n\n /** Delete all slots of a delivery time. */\n async deleteAllSlots(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n });\n }\n\n // --- Phase 2: delivery cycles ---\n\n /** Generate a delivery cycle (`POST /delivery-cycles/generate`). Returns the cycle id. */\n async generateDeliveryCycle(input: DeliveryCycleInput, auth: AuthContext = SERVICE): Promise<string> {\n return this.ctx.http.request<string>({\n method: \"POST\",\n path: `${this.base()}/delivery-cycles/generate`,\n auth,\n body: input,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { InvoiceJobDraft, InvoiceJobCreated, InvoiceJob } from \"./invoice-types\";\n\nexport type { InvoiceJobDraft, InvoiceJobCreated, InvoiceJob } from \"./invoice-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Invoice Service (`/invoice/{tenant}/…`): create invoice-generation jobs and\n * poll their status. Backend-only — default auth: service.\n */\nexport class InvoiceService {\n static readonly channel = \"invoice\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/invoice/${this.ctx.tenant}/jobs/invoices`;\n }\n\n /** Create an invoice-generation job (`POST …/jobs/invoices`, 201). */\n async createJob(draft: InvoiceJobDraft, auth: AuthContext = SERVICE): Promise<InvoiceJobCreated> {\n return this.ctx.http.request<InvoiceJobCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /** Retrieve a job and its per-order results (`GET …/jobs/invoices/{jobId}`). */\n async getJob(jobId: string, auth: AuthContext = SERVICE): Promise<InvoiceJob> {\n return this.ctx.http.request<InvoiceJob>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(jobId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { errorFromResponse } from \"../core/errors\";\nimport type {\n Quote,\n QuoteDraft,\n QuoteCreated,\n QuoteUpdate,\n QuoteHistory,\n ListQuotesQuery,\n QuoteReason,\n QuoteReasonDraft,\n QuoteReasonUpdate,\n QuoteReasonCreated,\n ListQuoteReasonsQuery,\n} from \"./quote-types\";\n\nexport type {\n Quote,\n QuoteDraft,\n QuoteCreated,\n QuoteUpdate,\n QuoteHistory,\n ListQuotesQuery,\n QuoteReason,\n QuoteReasonDraft,\n QuoteReasonUpdate,\n QuoteReasonCreated,\n ListQuoteReasonsQuery,\n} from \"./quote-types\";\n\n/**\n * Quote Service (`/quote/{tenant}/…`): B2B quotes and quote reasons. Quotes are\n * customer-owned and never anonymous, so every method takes a REQUIRED `auth`:\n * pass `auth.customer(token)` for a customer's own quotes, or `auth.service()`\n * (an admin token) for `quote_manage`-scoped ops (`delete`, reason mutations).\n */\nexport class QuoteService {\n static readonly channel = \"quote\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private quotesBase(): string {\n return `/quote/${this.ctx.tenant}/quotes`;\n }\n\n private _reasons?: QuoteReasonsResource;\n /** Quote reasons config (`/quote-reasons`). CRUD sub-resource. */\n get reasons(): QuoteReasonsResource {\n return (this._reasons ??= new QuoteReasonsResource(this.ctx));\n }\n\n /** List quotes, wrapped in {@link PaginatedItems}. Pass `{}` for no filter. */\n async list(query: ListQuotesQuery, auth: AuthContext): Promise<PaginatedItems<Quote>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.q) q.q = query.q;\n if (query.sort) q.sort = query.sort;\n return requestPage<Quote>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.quotesBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Create a quote (`POST /quotes`, 201). */\n async create(draft: QuoteDraft, auth: AuthContext): Promise<QuoteCreated> {\n return this.ctx.http.request<QuoteCreated>({\n method: \"POST\",\n path: this.quotesBase(),\n auth,\n body: draft,\n });\n }\n\n /** Retrieve one quote by id. */\n async get(quoteId: string, auth: AuthContext): Promise<Quote> {\n return this.ctx.http.request<Quote>({\n method: \"GET\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n });\n }\n\n /** Apply an update-op array to a quote (`PATCH /quotes/{id}`, 204). */\n async update(quoteId: string, update: QuoteUpdate, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n body: update,\n });\n }\n\n /** Delete a quote (`DELETE /quotes/{id}`). Requires the admin `quote_manage` scope. */\n async delete(quoteId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n });\n }\n\n /** Retrieve a quote's change history (`GET /quotes/{id}/history`). */\n async history(quoteId: string, auth: AuthContext): Promise<QuoteHistory> {\n return this.ctx.http.request<QuoteHistory>({\n method: \"GET\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}/history`,\n auth,\n });\n }\n\n /**\n * Generate a quote PDF (`POST /quotes/{id}/pdf`). Returns the raw PDF bytes.\n * Uses `requestRaw` (no typed-error mapping) — a non-2xx is thrown explicitly.\n */\n async generatePdf(quoteId: string, auth: AuthContext): Promise<Blob> {\n const path = `${this.quotesBase()}/${encodeURIComponent(quoteId)}/pdf`;\n const res = await this.ctx.http.requestRaw({ method: \"POST\", path, auth });\n if (!res.ok) {\n const body = await res.text();\n throw errorFromResponse(res.status, `POST ${path} failed: ${res.status}`, body);\n }\n return await res.blob();\n }\n}\n\n/**\n * Quote reasons (`/quote/{tenant}/quote-reasons`). Config data. Like the rest\n * of the quote domain, every method takes a REQUIRED `auth`: reads accept a\n * customer or admin token; `create`/`update`/`delete` need the admin\n * `quote.quote_manage` scope (`auth.service()`).\n */\nexport class QuoteReasonsResource {\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/quote/${this.ctx.tenant}/quote-reasons`;\n }\n\n /** List reasons, wrapped in {@link PaginatedItems}. Pass `{}` for no paging override. */\n async list(query: ListQuoteReasonsQuery, auth: AuthContext): Promise<PaginatedItems<QuoteReason>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n return requestPage<QuoteReason>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.base(),\n auth,\n query: { pageNumber, pageSize },\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Retrieve one reason by id. */\n async get(reasonId: string, auth: AuthContext): Promise<QuoteReason> {\n return this.ctx.http.request<QuoteReason>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n });\n }\n\n /** Create a reason (`POST /quote-reasons`). Requires the admin `quote_manage` scope. */\n async create(draft: QuoteReasonDraft, auth: AuthContext): Promise<QuoteReasonCreated> {\n return this.ctx.http.request<QuoteReasonCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Replace a reason (`PUT /quote-reasons/{id}`, 204). `draft.metadata.version`\n * is required for optimistic locking. Requires the admin `quote_manage` scope.\n */\n async update(reasonId: string, draft: QuoteReasonUpdate, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a reason (`DELETE /quote-reasons/{id}`). Requires the admin `quote_manage` scope. */\n async delete(reasonId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Return, ReturnList, ReturnInput, ReturnUpdate, ReturnPatch, ReturnCreated } from \"./returns-types\";\n\nexport type { Return, ReturnList, ReturnInput, ReturnUpdate, ReturnPatch, ReturnCreated } from \"./returns-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Returns Service (`/return/{tenant}/returns`): CRUD over returns\n * (RMA). Defaults to the service token; for customer self-service (own returns)\n * pass `auth.customer(token)` (the React hooks do this).\n */\nexport class ReturnsService {\n static readonly channel = \"returns\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/return/${this.ctx.tenant}/returns`;\n }\n\n /** List returns (paged; supports `pageSize`/`pageNumber`/`sort`/`q`). */\n async listReturns(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ReturnList> {\n return this.ctx.http.request<ReturnList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one return by id. */\n async getReturn(returnId: string, auth: AuthContext = SERVICE): Promise<Return> {\n return this.ctx.http.request<Return>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n });\n }\n\n /** Create a return. Returns the created `{ id }`. */\n async createReturn(input: ReturnInput, auth: AuthContext = SERVICE): Promise<ReturnCreated> {\n return this.ctx.http.request<ReturnCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a return by id (`PUT`). */\n async updateReturn(returnId: string, input: ReturnUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a return by id (`PATCH`, JSON-Patch op-array). */\n async patchReturn(returnId: string, ops: ReturnPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a return by id. */\n async deleteReturn(returnId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n IndexConfig,\n IndexConfigCreated,\n IndexPublicConfig,\n ReindexInput,\n ReindexJob,\n ReindexJobInput,\n} from \"./indexing-types\";\n\nexport type {\n IndexConfig,\n IndexConfigCreated,\n IndexPublicConfig,\n ReindexInput,\n ReindexJob,\n ReindexJobInput,\n ReindexEntityType,\n ReindexJobStatus,\n} from \"./indexing-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** Options for {@link IndexingService.listReindexJobs}. */\nexport interface ListReindexJobsOptions {\n pageNumber?: number;\n pageSize?: number;\n /** Raw Emporix `q` filter string. */\n q?: string;\n /** Emporix sort syntax, e.g. `\"metadata.createdAt:desc\"`. */\n sort?: string;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/**\n * Emporix Indexing Service (`/indexing/{tenant}/…`): search-index provider\n * configurations and reindex. Server-side; defaults to the service token.\n *\n * On the `BATTERY_INCLUDED` provider every write validates the stored\n * `indexName`/`writeKey` against the search backend *before* it takes effect:\n * invalid credentials fail with `400` and when that validation is itself\n * unreachable the call fails with `502`. Either way nothing is written — so a\n * `400` from these methods can mean the credentials are wrong rather than the\n * request body.\n */\nexport class IndexingService {\n static readonly channel = \"indexing\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/indexing/${this.ctx.tenant}`;\n }\n\n /** List indexing configurations. */\n async listConfigurations(auth: AuthContext = SERVICE): Promise<IndexConfig[]> {\n return this.ctx.http.request<IndexConfig[]>({ method: \"GET\", path: `${this.base()}/configurations`, auth });\n }\n\n /** Get a configuration by provider name. */\n async getConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<IndexConfig> {\n return this.ctx.http.request<IndexConfig>({\n method: \"GET\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /** Create a configuration. Nothing is stored if credential validation fails. */\n async createConfiguration(input: IndexConfig, auth: AuthContext = SERVICE): Promise<IndexConfigCreated> {\n return this.ctx.http.request<IndexConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/configurations`,\n auth,\n body: input,\n });\n }\n\n /** Update a configuration. Left unchanged if credential validation fails. */\n async updateConfiguration(provider: string, input: IndexConfig, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a configuration by provider name. */\n async deleteConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /** List public indexing configurations. */\n async listPublicConfigurations(auth: AuthContext = SERVICE): Promise<IndexPublicConfig[]> {\n return this.ctx.http.request<IndexPublicConfig[]>({ method: \"GET\", path: `${this.base()}/public/configurations`, auth });\n }\n\n /** Get a public configuration by provider name. */\n async getPublicConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<IndexPublicConfig> {\n return this.ctx.http.request<IndexPublicConfig>({\n method: \"GET\",\n path: `${this.base()}/public/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /**\n * Create a reindex job (replaces {@link reindex}). A `FULL` reindex of the\n * given `entityType`; set `rag: true` to also rebuild the RAG vector index\n * (PRODUCT only). Resolves to the created job (`201`) or, when a job for that\n * `entityType` is already `IN_PROGRESS`, that running job (`200`).\n *\n * On `BATTERY_INCLUDED` with `entityType: \"PRODUCT\"` the stored credentials\n * are validated first; no job is created on the `400`/`502` cases above.\n */\n async createReindexJob(input: ReindexJobInput, auth: AuthContext = SERVICE): Promise<ReindexJob> {\n return this.ctx.http.request<ReindexJob>({\n method: \"POST\",\n path: `${this.base()}/reindex-jobs`,\n auth,\n body: input,\n });\n }\n\n /** List reindex jobs (paginated). */\n async listReindexJobs(\n opts: ListReindexJobsOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<ReindexJob>> {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 50;\n const query: Record<string, string | number | undefined> = { pageNumber, pageSize };\n if (opts.q !== undefined) query.q = opts.q;\n if (opts.sort !== undefined) query.sort = opts.sort;\n return requestPage<ReindexJob>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `${this.base()}/reindex-jobs`,\n query,\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n },\n );\n }\n\n /** Fetch one reindex job by id. */\n async getReindexJob(reindexJobId: string, auth: AuthContext = SERVICE): Promise<ReindexJob> {\n return this.ctx.http.request<ReindexJob>({\n method: \"GET\",\n path: `${this.base()}/reindex-jobs/${encodeURIComponent(reindexJobId)}`,\n auth,\n });\n }\n\n /**\n * Trigger a reindex. On `BATTERY_INCLUDED` the same credential validation\n * runs first, so this can fail with `400`/`502` before any job starts.\n * @deprecated since 2026-06-18, removal 2026-12-01 — use {@link createReindexJob}\n * (`createReindexJob({ entityType: \"PRODUCT\" })`), which returns a trackable job.\n */\n async reindex(input: ReindexInput, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"POST\", path: `${this.base()}/reindex`, auth, body: input });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage, type PageParams } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n FilterNode,\n IndexAnalyzer,\n IndexExportPackage,\n IndexField,\n IndexImportResult,\n IndexJob,\n IndexRequest,\n IndexSelection,\n JobId,\n QueryNode,\n SavedQuery,\n SavedQueryId,\n SavedQueryRequest,\n SearchHit as GenSearchHit,\n SearchIndex as GenSearchIndex,\n SearchPost,\n} from \"../generated/search-service\";\n\n/** A matching document. Stored fields come back as stored, plus `id` and `_score`. */\nexport type SearchHit = GenSearchHit;\n/**\n * Body of {@link SearchService.search}: a direct search (`index` plus `queries`,\n * `filters` or both) or a saved-search call (`searchQueryId` plus `query`).\n */\nexport type SearchInput = SearchPost;\n/** One query node: an `and` group, an `or` group, or one query. */\nexport type SearchQueryNode = QueryNode;\n/** One filter node: an `and` group, an `or` group, or one comparison. */\nexport type SearchFilterNode = FilterNode;\n/** A stored saved search. The request field `index` comes back as `indexId`. */\nexport type SavedSearch = SavedQuery;\n/** Body of {@link SearchService.upsertSavedSearch}. */\nexport type SavedSearchInput = SavedQueryRequest;\n/** `201` response of {@link SearchService.upsertSavedSearch}. */\nexport type SavedSearchCreated = SavedQueryId;\n/** A search index on one type: a custom schema type, `customer` or `legal-entity`. */\nexport type SearchIndex = GenSearchIndex;\n/** Body of {@link SearchService.upsertIndex}. */\nexport type SearchIndexInput = IndexRequest;\n/**\n * One field of a search index. A string field with `text: true` can name an\n * `analyzer` and up to three `additionalAnalyzers`; a list of objects is\n * indexed through `itemFields` instead of flags on the list itself.\n */\nexport type SearchIndexField = IndexField;\n/**\n * Named text-comparison rules on an index (`analyzers`, at most ten), starting\n * from a preset (`basedOn`: `STANDARD`, `FOLDED`, `IDENTIFIER`, `SOUNDS_LIKE`).\n * Every analyzer must be selected by a field, or the index write answers `400`.\n */\nexport type SearchIndexAnalyzer = IndexAnalyzer;\n/** An index build or deletion job. */\nexport type SearchIndexJob = IndexJob;\n/** The id of the job an index write started. */\nexport type SearchIndexJobRef = JobId;\n/** One index to export: `{ type, id }`. */\nexport type SearchIndexSelection = IndexSelection;\n/**\n * Exported index configuration: `exportedAt` plus `data`, a base64-encoded JSON\n * array. {@link SearchService.importIndexes} takes it back unchanged.\n */\nexport type SearchIndexExport = IndexExportPackage;\n/** Result for one imported index. `jobId` and `jobType` are present when a build job started. */\nexport type SearchIndexImportResult = IndexImportResult;\n\n/** Paging, sort, filter and projection for the list reads. */\nexport interface SearchListOptions {\n pageNumber?: number;\n /** Defaults to 60, the server's default. */\n pageSize?: number;\n /** `field`, `field:ASC` or `field:DESC`, comma-separated. Default: `metadata.createdAt` descending. */\n sort?: string;\n /** Raw Emporix `q` filter string. */\n q?: string;\n /** Comma-separated properties to return. */\n fields?: string;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/** Options for {@link SearchService.listSavedSearches} and {@link SearchService.listIndexes}. */\nexport interface SearchTypeListOptions extends SearchListOptions {\n /** One type: a custom schema type, `customer` or `legal-entity`. Omitted, the list spans every type, and each item carries `type`. */\n type?: string;\n}\n\n/**\n * Options for {@link SearchService.search}. Without `sort`, hits are ordered by\n * relevance; without `fields`, each hit carries `_score`.\n */\nexport type SearchOptions = Omit<SearchListOptions, \"q\">;\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\nfunction pageQuery(opts: SearchListOptions): { query: Record<string, string | number>; page: PageParams } {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 60;\n const query: Record<string, string | number> = { pageNumber, pageSize };\n if (opts.sort !== undefined) query.sort = opts.sort;\n if (opts.q !== undefined) query.q = opts.q;\n if (opts.fields !== undefined) query.fields = opts.fields;\n const page: PageParams = {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n };\n return { query, page };\n}\n\n/**\n * Emporix Search Service (`/search/{tenant}/…`, **preview**): searches the\n * documents of one type, stores saved searches, and manages the search indexes\n * and the jobs that build them. A type is a custom schema type, `customer` or\n * `legal-entity` (the last two since 2026-10-29). Server-side; defaults to the\n * service token.\n *\n * Scopes: `search.search_read` for every read and for `search`,\n * `search.search_manage` for every write. Searching also needs read access to\n * the documents themselves, or it answers `403`: `schema.custominstance_read`,\n * `custom.{type}_read` or `custom.{type}_read_own` for a custom type;\n * `customer.customer_read` or `customer.customer_read_own` for `customer`;\n * `customermanagement.legalentity_read` or `…_read_own` for `legal-entity`. A\n * site-restricted read scope (`customer.customer_read--DE#AT`) returns only the\n * documents whose `restriction` / `restrictions` match, and an own scope only\n * the caller's own customer or legal entity.\n */\nexport class SearchService {\n static readonly channel = \"search\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/search/${this.ctx.tenant}`;\n }\n\n /**\n * Search the documents of one type — a custom schema type, `customer` or\n * `legal-entity`. Paging, `sort` and `fields` travel as query parameters, not\n * in the body.\n *\n * Filter and sort fields must be indexed on the index the search uses —\n * `exact`, or `text: true` for a `CONTAINS` filter — or the call answers\n * `400`. A `TEXT` or `PHRASE` query may pick the field's `analyzer` or one of\n * its `additionalAnalyzers`. Conditions joined by `and` on fields of one\n * `itemFields` list must match the same list item. A saved-search call\n * (`{ searchQueryId, query }`) answers `404` when no saved search has that id\n * for `type`, and `502` means the Schema Service could not confirm that a\n * custom `type` is a custom entity.\n *\n * @example\n * const hits = await client.search.search(\"VEHICLE\", {\n * index: \"vehicles\",\n * queries: [{ type: \"TEXT\", query: \"diesel\", field: \"name.en\" }],\n * filters: { field: \"status\", operator: \"EQ\", value: \"ACTIVE\" },\n * });\n */\n async search(\n type: string,\n input: SearchInput,\n opts: SearchOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SearchHit>> {\n const { query, page } = pageQuery(opts);\n return requestPage<SearchHit>(\n this.ctx.http,\n {\n method: \"POST\",\n path: `${this.base()}/search/${encodeURIComponent(type)}`,\n auth,\n query,\n body: input,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n },\n page,\n );\n }\n\n /** List saved searches of one type (`opts.type`), or of every type. */\n async listSavedSearches(\n opts: SearchTypeListOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SavedSearch>> {\n const { query, page } = pageQuery(opts);\n const t = opts.type;\n return requestPage<SavedSearch>(\n this.ctx.http,\n {\n method: \"GET\",\n path: t === undefined ? `${this.base()}/search/queries` : `${this.base()}/search/${encodeURIComponent(t)}/queries`,\n auth,\n query,\n },\n page,\n );\n }\n\n /** Fetch one saved search. */\n async getSavedSearch(\n type: string,\n id: string,\n opts: { fields?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<SavedSearch> {\n return this.ctx.http.request<SavedSearch>({\n method: \"GET\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n\n /**\n * Create or replace a saved search. Resolves to `{ id }` when it was created\n * (`201`) and to `undefined` when it replaced an existing one (`204`).\n *\n * A replace needs the stored `metadata.version` — `400` without it, `409`\n * when it is stale. `index` must already exist for `type` (`404`\n * otherwise). Saving does not start an index build.\n */\n async upsertSavedSearch(\n type: string,\n id: string,\n input: SavedSearchInput,\n auth: AuthContext = SERVICE,\n ): Promise<SavedSearchCreated | undefined> {\n return this.ctx.http.request<SavedSearchCreated | undefined>({\n method: \"PUT\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a saved search. Does not start an index build. */\n async deleteSavedSearch(type: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** List search indexes of one type (`opts.type`), or of every type. */\n async listIndexes(\n opts: SearchTypeListOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SearchIndex>> {\n const { query, page } = pageQuery(opts);\n const t = opts.type;\n return requestPage<SearchIndex>(\n this.ctx.http,\n {\n method: \"GET\",\n path: t === undefined ? `${this.base()}/search/indexes` : `${this.base()}/search/${encodeURIComponent(t)}/indexes`,\n auth,\n query,\n },\n page,\n );\n }\n\n /** Fetch one search index. */\n async getIndex(\n type: string,\n id: string,\n opts: { fields?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<SearchIndex> {\n return this.ctx.http.request<SearchIndex>({\n method: \"GET\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n\n /**\n * Create or update a search index. Resolves to the id of the job that builds\n * it (`202`) — for a new index, a changed field list, or an index whose\n * status is `building` or `failed` — and to `undefined` (`204`) when the\n * index is `ready` and its fields are unchanged; `name` and `description`\n * still change then. Track the job with {@link getJob}.\n *\n * `metadata.version` is optional on an update too. When sent, it is an\n * optimistic lock: a stale one answers `409`, as does a job that is already\n * running for this index.\n */\n async upsertIndex(\n type: string,\n id: string,\n input: SearchIndexInput,\n auth: AuthContext = SERVICE,\n ): Promise<SearchIndexJobRef | undefined> {\n return this.ctx.http.request<SearchIndexJobRef | undefined>({\n method: \"PUT\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n body: input,\n });\n }\n\n /**\n * Start deleting a search index. Resolves to the id of the job that removes\n * it (`202`); `409` means a job for this index is already running.\n */\n async deleteIndex(type: string, id: string, auth: AuthContext = SERVICE): Promise<SearchIndexJobRef> {\n return this.ctx.http.request<SearchIndexJobRef>({\n method: \"DELETE\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Export the configuration of the selected indexes as one package, to be\n * imported on another tenant with {@link importIndexes}. The decoded `data`\n * holds `id`, `type`, `fields` and the optional `name` and `description` of\n * each index, not its `status` or `metadata`. `404` when a selected index does\n * not exist, `400` for an empty selection.\n */\n async exportIndexes(selections: SearchIndexSelection[], auth: AuthContext = SERVICE): Promise<SearchIndexExport> {\n return this.ctx.http.request<SearchIndexExport>({\n method: \"POST\",\n path: `${this.base()}/search/indexes/export`,\n auth,\n body: selections,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n\n /**\n * Create or update every index in a package from {@link exportIndexes}, with\n * the same checks as {@link upsertIndex}. Resolves to one result per index,\n * in package order; `jobId` and `jobType` are absent for a ready index whose\n * fields did not change.\n *\n * Not atomic: when an index fails, the ones before it stay created or updated\n * and the call throws that index's error — `400` for an unreadable package or\n * an invalid field, `409` for a running job or a stale `metadata.version`.\n */\n async importIndexes(pkg: SearchIndexExport, auth: AuthContext = SERVICE): Promise<SearchIndexImportResult[]> {\n return this.ctx.http.request<SearchIndexImportResult[]>({\n method: \"POST\",\n path: `${this.base()}/search/indexes/import`,\n auth,\n body: pkg,\n });\n }\n\n /** List index jobs of the tenant. */\n async listJobs(opts: SearchListOptions = {}, auth: AuthContext = SERVICE): Promise<PaginatedItems<SearchIndexJob>> {\n const { query, page } = pageQuery(opts);\n return requestPage<SearchIndexJob>(\n this.ctx.http,\n { method: \"GET\", path: `${this.base()}/jobs`, auth, query },\n page,\n );\n }\n\n /** Fetch one index job. */\n async getJob(id: string, opts: { fields?: string } = {}, auth: AuthContext = SERVICE): Promise<SearchIndexJob> {\n return this.ctx.http.request<SearchIndexJob>({\n method: \"GET\",\n path: `${this.base()}/jobs/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { SseEvent } from \"../core/sse\";\nimport type { Page } from \"../generated/import-service\";\nimport type {\n ImportCancelResult,\n ImportConfig,\n ImportHealthThresholds,\n ImportJobGroup,\n ImportLicense,\n ImportStats,\n ImportStatsQuery,\n ImportErrorRecord,\n ImportFile,\n ImportFileQueue,\n ImportFileUploadLimits,\n ImportPage,\n ImportRecordOutcome,\n ImportRun,\n ImportRunDetail,\n ImportRunEvent,\n ImportRunDiagnostics,\n ImportRunDiagnosticsQuery,\n ImportRunInput,\n ImportRunStream,\n ImportSchedule,\n ImportStream,\n ImportStreamOrder,\n ImportedRecord,\n} from \"./imports-types\";\n\nexport type {\n ImportCancelResult,\n ImportConfig,\n ImportDiagnosticKind,\n ImportDiagnosticRecord,\n ImportErrorRecord,\n ImportFile,\n ImportFileQueue,\n ImportFileStatus,\n ImportFileUploadLimits,\n ImportHealthThresholds,\n ImportJobGroup,\n ImportLicense,\n ImportPage,\n ImportRecordOutcome,\n ImportRun,\n ImportRunDetail,\n ImportRunDiagnostics,\n ImportRunDiagnosticsQuery,\n ImportRunEvent,\n ImportRunInput,\n ImportRunMode,\n ImportRunStatus,\n ImportRunStream,\n ImportSchedule,\n ImportStats,\n ImportStatsQuery,\n ImportStream,\n ImportStreamOrder,\n ImportedRecord,\n} from \"./imports-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\nconst DEFAULT_PAGE_SIZE = 50;\n\n/** One-based paging options, shared by every paginated import endpoint. */\nexport interface ImportPageOptions {\n /** One-based page number. Default `1`. */\n pageNumber?: number;\n /** Page size. Default `50`. The service may clamp this — the result echoes what it used. */\n pageSize?: number;\n}\n\n/** Options for {@link ImportService.searchRecords}. `type` is required. */\nexport interface SearchImportedRecordsOptions extends ImportPageOptions {\n /** The target type to search, one of {@link ImportService.listDataTypes}. */\n type: string;\n /**\n * Case-insensitive substring match on the record's natural key. This is NOT\n * the Emporix query language — `field:value`, comparisons and boolean logic\n * are not supported here.\n */\n search?: string;\n /** Filter by import outcome. Omit for records of all outcomes. */\n outcome?: ImportRecordOutcome;\n}\n\n/** Options for {@link ImportService.searchStreamRecords}. */\nexport type SearchStreamRecordsOptions = Omit<SearchImportedRecordsOptions, \"type\">;\n\n/** The wire shape of a paginated import response. */\ntype WirePage<T> = Page & { content?: T[] };\n\nfunction pageArgs(opts: ImportPageOptions): { pageNumber: number; pageSize: number } {\n return { pageNumber: opts.pageNumber ?? 1, pageSize: opts.pageSize ?? DEFAULT_PAGE_SIZE };\n}\n\n/**\n * Spring page → {@link ImportPage}. `pageNumber` / `pageSize` prefer the\n * server's echo over what was requested, because the service clamps `size`;\n * reporting the requested value would misdescribe the page you actually got.\n */\nfunction toPage<T>(\n wire: WirePage<T>,\n requested: { pageNumber: number; pageSize: number },\n): ImportPage<T> {\n const totalPages = wire.totalPages ?? 0;\n const pageNumber = (wire.number ?? requested.pageNumber - 1) + 1;\n return {\n items: wire.content ?? [],\n pageNumber,\n pageSize: wire.size ?? requested.pageSize,\n hasNextPage: pageNumber < totalPages,\n totalElements: wire.totalElements ?? 0,\n totalPages,\n };\n}\n\n/**\n * One SSE frame → one typed event. Anything unparseable, non-object or under an\n * event name this SDK does not model becomes `unknown` instead of throwing: a\n * preview service is allowed to grow event types, and a run in flight must not\n * die because of one frame we cannot read.\n */\nfunction toRunEvent(ev: SseEvent): ImportRunEvent {\n let payload: unknown;\n try {\n payload = JSON.parse(ev.data);\n } catch {\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n if (typeof payload !== \"object\" || payload === null) {\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n switch (ev.event) {\n case \"snapshot\": {\n const detail = payload as ImportRunDetail;\n return { type: \"snapshot\", run: detail.run, streams: detail.streams ?? [] };\n }\n case \"stream\":\n return { type: \"stream\", stream: payload as ImportRunStream };\n case \"run\":\n return { type: \"run\", run: payload as ImportRun };\n default:\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n}\n\n/**\n * Emporix Import Service (`/importtool/{tenant}/…`): import configurations,\n * their streams and schedules, run control, and the records an import produced.\n *\n * **Service-account only.** Every operation requires the\n * `importtool.import_trigger` scope on the client credentials, and the service\n * has no customer or anonymous variant — which is why `@viu/emporix-sdk-react`\n * ships no hooks for it. Call it from a server (Node, a Next Route Handler or\n * Server Action), never from a browser bundle.\n *\n * **Paging is one-based here, zero-based on the wire.** The facade takes\n * `pageNumber` starting at 1 and sends `page = pageNumber - 1`, matching the\n * rest of the SDK.\n *\n * **Upstream marks every operation as preview**: the contract may change without\n * a major version bump, and nearly every response field is optional in the spec.\n * Treat run counters and status as possibly absent.\n */\nexport class ImportService {\n static readonly channel = \"import\" as const;\n\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/importtool/${this.ctx.tenant}`;\n }\n\n /** List every import configuration of the tenant. */\n async listConfigs(auth: AuthContext = SERVICE): Promise<ImportConfig[]> {\n return this.ctx.http.request<ImportConfig[]>({\n method: \"GET\",\n path: `${this.base()}/configs`,\n auth,\n });\n }\n\n /** Fetch one configuration by id. */\n async getConfig(id: string, auth: AuthContext = SERVICE): Promise<ImportConfig> {\n return this.ctx.http.request<ImportConfig>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** List the streams of one configuration. */\n async listStreams(configId: string, auth: AuthContext = SERVICE): Promise<ImportStream[]> {\n return this.ctx.http.request<ImportStream[]>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/streams`,\n auth,\n });\n }\n\n /** Fetch one stream by id. */\n async getStream(id: string, auth: AuthContext = SERVICE): Promise<ImportStream> {\n return this.ctx.http.request<ImportStream>({\n method: \"GET\",\n path: `${this.base()}/streams/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * The order in which a configuration's streams run, and the dependencies\n * behind it. Read it here instead of deriving it from the stream definitions:\n * mapping transformations add dependencies that no single stream shows, so a\n * self-computed order can differ from the one used at run time.\n *\n * The result lists stream **names**, while {@link triggerRun}'s `streamIds`\n * takes stream **ids** — map through {@link listStreams} before passing a\n * subset back.\n */\n async getStreamOrder(configId: string, auth: AuthContext = SERVICE): Promise<ImportStreamOrder> {\n return this.ctx.http.request<ImportStreamOrder>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/stream-order`,\n auth,\n });\n }\n\n /**\n * Fetch a configuration's schedule. Resolves to `null` when none is\n * configured — the service answers `204`, not `404`, so an absent schedule is\n * a normal result rather than an error.\n */\n async getSchedule(\n configId: string,\n auth: AuthContext = SERVICE,\n ): Promise<ImportSchedule | null> {\n const res = await this.ctx.http.request<ImportSchedule | undefined>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n auth,\n });\n return res ?? null;\n }\n\n /**\n * Create or replace a configuration's schedule.\n *\n * **`cron` is a six-field Spring expression** (`second minute hour\n * day-of-month month day-of-week`). The familiar five-field `\"0 * * * *\"` is\n * not «hourly» here, it is invalid, and the service answers `400` rather than\n * storing it — which it used to do, leaving a schedule that silently never\n * fired.\n *\n * A `404` means no configuration with that id, so there is nothing to\n * schedule. Use {@link deleteSchedule} to clear a schedule that outlived its\n * configuration.\n */\n async setSchedule(\n configId: string,\n input: ImportSchedule,\n auth: AuthContext = SERVICE,\n ): Promise<ImportSchedule> {\n return this.ctx.http.request<ImportSchedule>({\n method: \"PUT\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n body: input,\n auth,\n });\n }\n\n /**\n * Remove a configuration's schedule. It then runs only when triggered.\n *\n * **Idempotent, and deliberately not gated on the configuration existing.**\n * Removing a schedule that is not there also resolves — and unlike\n * {@link setSchedule}, this does not require the configuration to exist. That\n * is the point: a schedule left behind by a deleted configuration is exactly\n * what needs removing, so refusing those would leave them with no way out.\n *\n * The service answers `204`, so this resolves to `void` rather than to the\n * removed schedule.\n */\n async deleteSchedule(configId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n auth,\n });\n }\n\n /**\n * Trigger a run. `mode` defaults to `DELTA` server-side; `dryRun: true` maps\n * and validates without writing to the target.\n *\n * **The run comes back `QUEUED`, not `RUNNING`.** It starts when a worker is\n * free, usually within moments, or after one of the tenant's runs finishes when\n * `maxConcurrentImports` are already executing — no `429` any more. A\n * configuration holds at most one executing and one queued run: while it has a\n * run `QUEUED`, `RUNNING` or `RESUMABLE`, this call answers `409`.\n *\n * A dry run can also hand back what it *would* have written: pass\n * `sampleSize` (1–100, default 25) and read the run's `dryRunSample`. Set\n * `origin` to name what asked for the run — `trigger` only distinguishes\n * `MANUAL` from `SCHEDULED`, so without it a dashboard click and an\n * integration scenario are indistinguishable in the history. Note the service\n * **rejects** an `origin` over 40 characters instead of shortening it.\n *\n * `streamIds` runs a subset — see {@link ImportRunInput} for what is rejected,\n * and note it takes ids where {@link getStreamOrder} reports names.\n *\n * A run executes each stream's **published** mappings. Publishing needs\n * `importtool.import_manage` and is not part of the public API, so it happens\n * in the Management Dashboard's Import Tool rather than through this SDK; a dry\n * run with `mappings: \"draft\"` checks unpublished changes first. A stream whose\n * mappings were never published is `ABORTED` in the run details, and the run\n * finishes `PARTIAL`.\n *\n * **A refused run still resolves.** When `streamIds` names such a stream, or\n * every enabled stream is in that state, the service answers `200` with the\n * run anyway, and the run then finishes `ABORTED` with a `message` naming the\n * streams. Read it back with {@link getRun}, or follow it with\n * {@link streamRun}, before treating a resolved call as a started import.\n *\n * A configuration that does not exist answers `404` (since 2026-11-06; it used\n * to be a `500`). A real run with nothing to import answers `400`: every stream\n * it starts from reads uploaded files, and none has ever had one. Upload a file\n * with {@link uploadStreamFile} first. A dry run is not refused for this.\n *\n * Not retried on a 5xx: a POST that timed out may already have queued a run.\n *\n * @example\n * ```ts\n * // Preview the mapping without writing anything.\n * const run = await client.imports.triggerRun(configId, {\n * dryRun: true,\n * sampleSize: 5,\n * origin: \"Dashboard\",\n * });\n * for (const row of run.dryRunSample ?? []) {\n * console.log(row.stream, row.targetType, row.key, row.fields);\n * }\n * ```\n */\n async triggerRun(\n configId: string,\n input: ImportRunInput = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportRun> {\n return this.ctx.http.request<ImportRun>({\n method: \"POST\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/runs`,\n body: input,\n auth,\n });\n }\n\n /** List a configuration's runs, newest first. */\n async listRuns(\n configId: string,\n opts: ImportPageOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportRun>> {\n const args = pageArgs(opts);\n const wire = await this.ctx.http.request<WirePage<ImportRun>>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/runs`,\n query: { page: args.pageNumber - 1, size: args.pageSize },\n auth,\n });\n return toPage(wire, args);\n }\n\n /** Fetch one run with its per-stream progress. */\n async getRun(runId: string, auth: AuthContext = SERVICE): Promise<ImportRunDetail> {\n return this.ctx.http.request<ImportRunDetail>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}`,\n auth,\n });\n }\n\n /**\n * Stream a run's progress as Server-Sent Events: an initial `snapshot`, then a\n * `stream` event per processed batch, then a final `run` event when the run\n * finishes. The iterator ends when the service closes the stream; breaking out\n * of the `for await` aborts the request.\n *\n * Two ways this differs from every other method here. It does not re-auth: a\n * `401` while opening the stream throws instead of minting a fresh token and\n * retrying once, so a long-lived consumer should be ready to re-open (or fall\n * back to polling {@link getRun}). And frames this SDK version cannot read\n * arrive as `{ type: \"unknown\" }` rather than throwing — see\n * {@link ImportRunEvent}.\n */\n async *streamRun(\n runId: string,\n auth: AuthContext = SERVICE,\n ): AsyncIterable<ImportRunEvent> {\n const frames = this.ctx.http.requestStream({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/events`,\n auth,\n });\n for await (const frame of frames) yield toRunEvent(frame);\n }\n\n /**\n * Request cancellation of a run. `force: true` hard-stops it immediately;\n * without it the run stops at the next safe point. The service answers `202`\n * with `accepted: false` when the run is unknown or already finished — that is\n * a result, not an error. A state conflict may instead come back as a `409`,\n * which does throw.\n *\n * A `QUEUED` run is cancelled at once, with or without `force`. A `RESUMABLE`\n * run stops only with `force: true`; without it the call answers `409`.\n */\n async cancelRun(\n runId: string,\n opts: { force?: boolean } = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportCancelResult> {\n const query: Record<string, string | number | undefined> = {};\n if (opts.force) query.force = \"true\";\n return this.ctx.http.request<ImportCancelResult>({\n method: \"POST\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/cancel`,\n query,\n auth,\n });\n }\n\n /** List the errors recorded during a run. */\n async listRunErrors(\n runId: string,\n opts: ImportPageOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportErrorRecord>> {\n const args = pageArgs(opts);\n const wire = await this.ctx.http.request<WirePage<ImportErrorRecord>>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/errors`,\n query: { page: args.pageNumber - 1, size: args.pageSize },\n auth,\n });\n return toPage(wire, args);\n }\n\n /**\n * The rows behind a run's feed-quality counters: source rows that repeated a\n * natural key (`kind: \"REPEATED_KEY\"`, counted as `duplicateKeys`) and child\n * lines with no parent to attach to (`\"UNRESOLVED_PARENT\"`, counted as\n * `unresolvedParents`). Neither is a failure, which is why these rows are not\n * in {@link listRunErrors}.\n *\n * **A capped sample** — see {@link ImportRunDiagnostics} before reading\n * `rows.length` as the size of the problem. `limit` defaults to 500 here\n * (1–50 000); {@link downloadRunDiagnosticsCsv} defaults to 50 000.\n */\n async listRunDiagnostics(\n runId: string,\n query: ImportRunDiagnosticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportRunDiagnostics> {\n return this.ctx.http.request<ImportRunDiagnostics>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/diagnostics`,\n query: { ...query },\n auth,\n });\n }\n\n /**\n * The same rows as {@link listRunDiagnostics}, as CSV text for a spreadsheet\n * or a ticket. Comment lines above the header record whether `limit` or the\n * recording cap cut rows off, so the file keeps that context when shared on\n * its own. `limit` defaults to 50 000 here, not 500.\n *\n * Every value is quoted, and a value starting with `=`, `+`, `-` or `@` is\n * prefixed with an apostrophe so spreadsheet software does not evaluate source\n * data as a formula. Strip it if you parse the file instead of opening it.\n */\n async downloadRunDiagnosticsCsv(\n runId: string,\n query: ImportRunDiagnosticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<string> {\n // `request` falls back to the raw text when a body is not JSON, and a CSV\n // with a quoted multi-column header never is.\n return this.ctx.http.request<string>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/diagnostics/csv`,\n query: { ...query },\n auth,\n });\n }\n\n /** List the target types that hold imported records — the valid `type` values for {@link searchRecords}. */\n async listDataTypes(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `${this.base()}/data/types`,\n auth,\n });\n }\n\n /** Search imported records of one target type. */\n async searchRecords(\n opts: SearchImportedRecordsOptions,\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportedRecord>> {\n const args = pageArgs(opts);\n const query: Record<string, string | number | undefined> = {\n type: opts.type,\n page: args.pageNumber - 1,\n size: args.pageSize,\n };\n if (opts.search !== undefined) query.search = opts.search;\n if (opts.outcome !== undefined) query.outcome = opts.outcome;\n const wire = await this.ctx.http.request<WirePage<ImportedRecord>>({\n method: \"GET\",\n path: `${this.base()}/data/records`,\n query,\n auth,\n });\n return toPage(wire, args);\n }\n\n /** Search the imported records produced by one stream. */\n async searchStreamRecords(\n streamId: string,\n opts: SearchStreamRecordsOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportedRecord>> {\n const args = pageArgs(opts);\n const query: Record<string, string | number | undefined> = {\n page: args.pageNumber - 1,\n size: args.pageSize,\n };\n if (opts.search !== undefined) query.search = opts.search;\n if (opts.outcome !== undefined) query.outcome = opts.outcome;\n const wire = await this.ctx.http.request<WirePage<ImportedRecord>>({\n method: \"GET\",\n path: `${this.base()}/data/streams/${encodeURIComponent(streamId)}/records`,\n query,\n auth,\n });\n return toPage(wire, args);\n }\n\n // ─── Analytics and retry (upstream release 2026-08-26) ─────────────────────\n\n /**\n * Aggregated import analytics.\n *\n * Every section is optional in the response, and `sections` is what decides\n * which the service computes — asking for all of them on a tenant with a long\n * history is the expensive call, so name the ones you render.\n *\n * `from` / `to` are ISO timestamps. Omitted, the service picks its own window;\n * do not assume it is «everything».\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async stats(\n query: ImportStatsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportStats> {\n return this.ctx.http.request<ImportStats>({\n method: \"GET\",\n path: `${this.base()}/stats`,\n query: { ...query },\n auth,\n });\n }\n\n /**\n * The dashboard's job groups: configurations with their runs grouped under\n * them.\n *\n * Named after the path rather than the summary («Retrieving job groups»)\n * because the resource lives under `/dashboard` and is shaped for that view —\n * a caller wanting plain run history wants {@link listRuns}.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async listJobGroups(auth: AuthContext = SERVICE): Promise<ImportJobGroup[]> {\n return this.ctx.http.request<ImportJobGroup[]>({\n method: \"GET\",\n path: `${this.base()}/dashboard/job-groups`,\n auth,\n });\n }\n\n /**\n * The tenant's health thresholds — the error rates above which a stream counts\n * as degraded or failing in {@link stats}.\n *\n * Read-only here: changing them needs `importtool.import_manage`, which this\n * service does not cover.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async getHealthThresholds(\n auth: AuthContext = SERVICE,\n ): Promise<ImportHealthThresholds> {\n return this.ctx.http.request<ImportHealthThresholds>({\n method: \"GET\",\n path: `${this.base()}/settings/health-thresholds`,\n auth,\n });\n }\n\n /**\n * The tenant's import limits and current consumption. `maxConcurrentImports`\n * caps executing runs only: a run beyond it waits `QUEUED` instead of being\n * rejected.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async getLicense(auth: AuthContext = SERVICE): Promise<ImportLicense> {\n return this.ctx.http.request<ImportLicense>({\n method: \"GET\",\n path: `${this.base()}/license`,\n auth,\n });\n }\n\n /**\n * Retry only the failed records of a finished run.\n *\n * Returns a **new** run — the retry is its own run with `retry: true`, not a\n * mutation of the original. Poll it with {@link getRun} or follow it with\n * {@link streamRun} exactly as you would a triggered run. Like one, it comes\n * back `QUEUED`, answers `409` while the configuration has a run `QUEUED`,\n * `RUNNING` or `RESUMABLE`, runs the published mappings and can finish\n * `ABORTED`. A run that does not exist answers `404`.\n *\n * Not retried on a 5xx, for the same reason {@link triggerRun} is not: a POST\n * that timed out may already have queued the retry.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async retryRun(runId: string, auth: AuthContext = SERVICE): Promise<ImportRun> {\n return this.ctx.http.request<ImportRun>({\n method: \"POST\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/retry`,\n auth,\n });\n }\n\n // ─── File queue (upstream release 2026-10-28) ──────────────────────────────\n\n /**\n * A file-based stream's queue: what it still has to import, in load order,\n * and the files it already dealt with, newest first. `historyLimit` caps\n * `history` only (1–500, default 100); `pending` comes back whole up to 2000\n * files — see {@link ImportFileQueue}.\n */\n async listStreamFiles(\n streamId: string,\n opts: { historyLimit?: number } = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportFileQueue> {\n const query: Record<string, string | number | undefined> = {};\n if (opts.historyLimit !== undefined) query.historyLimit = opts.historyLimit;\n return this.ctx.http.request<ImportFileQueue>({\n method: \"GET\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files`,\n query,\n auth,\n });\n }\n\n /**\n * Queue a delimited file (CSV or one of its variants) for a file-based\n * stream's next run. Nothing is imported by this call — trigger a run for\n * that.\n *\n * `fileName` is required: the service displays it and infers the compression\n * from it, and a bare `Blob` would otherwise arrive named «blob».\n *\n * The service recognises a file by the SHA-256 of its content, whatever its\n * name, and answers `409` when the stream already imported or queued those\n * bytes; a file that previously `FAILED` is accepted again. It also answers\n * `409` when the stream does not read files, or when a run in flight uses\n * bytes this upload would replace. `413`: the file is over the limit from\n * {@link getStreamFileLimits}. `503`: uploading is not configured in this\n * environment.\n *\n * Not retried on a 5xx: a request that timed out may have queued the file,\n * and sending it again would then answer `409`. Check {@link listStreamFiles}\n * instead.\n */\n async uploadStreamFile(\n streamId: string,\n file: Blob,\n fileName: string,\n auth: AuthContext = SERVICE,\n ): Promise<ImportFile> {\n const fd = new FormData();\n fd.set(\"file\", file, fileName);\n return this.ctx.http.request<ImportFile>({\n method: \"POST\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files`,\n body: fd,\n auth,\n });\n }\n\n /**\n * The largest file this environment accepts, and whether uploading is\n * available at all — check it to refuse an oversize file before sending it.\n *\n * When `gatewayLimited` is `true`, a larger file is refused by the API gateway\n * with the gateway's own `413` body, before it reaches the service. Publish\n * such a file at an HTTP(S) URL and set it as the connection's file URL\n * instead.\n */\n async getStreamFileLimits(\n streamId: string,\n auth: AuthContext = SERVICE,\n ): Promise<ImportFileUploadLimits> {\n return this.ctx.http.request<ImportFileUploadLimits>({\n method: \"GET\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files/limits`,\n auth,\n });\n }\n\n /**\n * Set the order in which a stream's waiting files are read, and resolve to\n * the queue in that order. For an `INCREMENTAL` feed the order is the data: a\n * later file's values win on a key an earlier one also carries, so place an\n * older export first.\n *\n * Takes **every** waiting file's id, in load order — not a single file to\n * move. A list that is not exactly the waiting set answers `400`. `409` means\n * the job has a run in flight, or the queue is too long to reorder (the\n * queue's `pendingTruncated`).\n */\n async setStreamFileOrder(\n streamId: string,\n fileIds: string[],\n auth: AuthContext = SERVICE,\n ): Promise<ImportFile[]> {\n return this.ctx.http.request<ImportFile[]>({\n method: \"PUT\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files/order`,\n body: fileIds,\n auth,\n });\n }\n\n /**\n * Remove a waiting file from the queue and delete its stored bytes.\n *\n * Only a `PENDING` file can go: a file a run has claimed or already imported\n * answers `409`, and so does any file while the job has a run in flight. An\n * imported file stays in the history on purpose — removing it would make the\n * same bytes importable again.\n */\n async deleteStreamFile(\n streamId: string,\n fileId: string,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files/${encodeURIComponent(fileId)}`,\n auth,\n });\n }\n\n /**\n * Put a `FAILED` file back at the end of the stream's queue, so the next run\n * reads the content the service already holds — no new upload. Use it after\n * fixing the cause of the failure, a mapping say. Resolves to the file,\n * `PENDING` again.\n *\n * Only a failed file can be queued again; `409` otherwise. A file imported with\n * some records failing is `PROCESSED`: retry those records with\n * {@link retryRun} instead. On a `SNAPSHOT` stream a failed file cannot be\n * queued again once a newer file arrived, since the older snapshot would be\n * imported over newer data — upload a corrected current file instead. `409`\n * also when the stored content is gone, and while the job has a run in flight.\n *\n * Not retried on a 5xx: if the first attempt went through, the file is no\n * longer `FAILED` and a repeat answers `409`.\n */\n async requeueStreamFile(\n streamId: string,\n fileId: string,\n auth: AuthContext = SERVICE,\n ): Promise<ImportFile> {\n return this.ctx.http.request<ImportFile>({\n method: \"POST\",\n path: `${this.base()}/streams/${encodeURIComponent(streamId)}/files/${encodeURIComponent(fileId)}/requeue`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { ChangelogHistoryResponse } from \"../generated/audit-logs-changelog\";\nimport type { AuditLogPage, AuditLogQuery } from \"./audit-log-types\";\n\nexport type {\n AuditLogChangeType,\n AuditLogEntry,\n AuditLogPage,\n AuditLogPathChange,\n AuditLogQuery,\n AuditLogRelatedEntity,\n} from \"./audit-log-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * The body envelope → {@link AuditLogPage}. `pageNumber` / `pageSize` come from\n * the server's echo rather than from what was requested, so the page describes\n * what actually came back.\n */\nfunction toPage(wire: ChangelogHistoryResponse): AuditLogPage {\n const pageNumber = wire.page ?? 1;\n const totalPages = wire.totalPages ?? 0;\n return {\n items: wire.items ?? [],\n pageNumber,\n pageSize: wire.size ?? 0,\n hasNextPage: pageNumber < totalPages,\n totalElements: wire.totalElements ?? 0,\n totalPages,\n };\n}\n\n/**\n * Emporix Audit Log Service, upstream «Audit Logs (Changelog) Service»\n * (`/changelog/{tenant}/changelogs`): tenant-wide change history for platform\n * entities — who changed what, when, and from which value to which.\n *\n * **Service-account only.** Reads need the `changelog.changelog_read` scope\n * (`changelog.changelog_manage` also grants it) on the client credentials. There\n * is no customer or anonymous variant, which is why `@viu/emporix-sdk-react`\n * ships no hooks for it — call it from a server, never from a browser bundle.\n *\n * **Upstream marks this service as preview**: the contract may change without a\n * major version bump, and nearly every field of an entry is optional in the\n * spec.\n */\nexport class AuditLogService {\n static readonly channel = \"audit-log\" as const;\n\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/changelog/${this.ctx.tenant}`;\n }\n\n /**\n * List changes across the tenant, newest occurrence first.\n *\n * **The window defaults to the last 30 days.** When `q` carries no\n * conjunctive `occurredAt` lower bound, the service silently applies a\n * trailing 30-day window — an unfiltered call is *not* «everything ever». Pass\n * an explicit top-level or `AND`-ed `occurredAt` range to widen it; an\n * `occurredAt` that appears only inside an `OR` arm does not lift the default.\n *\n * **`entityId` needs `entity`.** Filtering by id alone is a `400`, not an\n * empty page. There is no path-based history endpoint either — scoping to one\n * document means naming both in `q`:\n *\n * @example\n * ```ts\n * // The history of one order.\n * const page = await client.auditLogs.list({\n * q: `entity:order entityId:${orderId}`,\n * });\n * for (const entry of page.items) {\n * console.log(entry.at, entry.actor, entry.paths);\n * }\n *\n * // Everything a given person changed in June, across all entities.\n * await client.auditLogs.list({\n * q: 'actor:\"Jane Doe\" occurredAt:(>\"2026-06-01T00:00:00.000Z\" AND <\"2026-07-01T00:00:00.000Z\")',\n * pageSize: 100,\n * });\n * ```\n */\n async list(opts: AuditLogQuery = {}, auth: AuthContext = SERVICE): Promise<AuditLogPage> {\n const wire = await this.ctx.http.request<ChangelogHistoryResponse>({\n method: \"GET\",\n path: `${this.base()}/changelogs`,\n // Absent options are left off the wire entirely; the service applies its\n // own defaults (page 1, size 20) and sends back what it used.\n query: { q: opts.q, page: opts.pageNumber, size: opts.pageSize },\n auth,\n });\n return toPage(wire);\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Unit,\n UnitInput,\n UnitUpdate,\n UnitCreated,\n ConversionFactorInput,\n ConversionFactorResult,\n ConvertUnitInput,\n ConvertUnitResult,\n} from \"./unit-handling-types\";\n\nexport type {\n Unit,\n UnitInput,\n UnitUpdate,\n UnitCreated,\n ConversionFactorInput,\n ConversionFactorResult,\n ConvertUnitInput,\n ConvertUnitResult,\n} from \"./unit-handling-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Unit Handling Service (`/unit-handling/{tenant}/…`): units CRUD, unit\n * types, and conversion commands. Server-side; defaults to the service token.\n */\nexport class UnitHandlingService {\n static readonly channel = \"unit-handling\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/unit-handling/${this.ctx.tenant}`;\n }\n\n /** Find units (filter/sort/page). */\n async listUnits(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<Unit[]> {\n return this.ctx.http.request<Unit[]>({\n method: \"GET\",\n path: `${this.base()}/units`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a unit by code. */\n async getUnit(unitCode: string, auth: AuthContext = SERVICE): Promise<Unit> {\n return this.ctx.http.request<Unit>({\n method: \"GET\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n });\n }\n\n /** Add a new unit. */\n async createUnit(input: UnitInput, auth: AuthContext = SERVICE): Promise<UnitCreated> {\n return this.ctx.http.request<UnitCreated>({ method: \"POST\", path: `${this.base()}/units`, auth, body: input });\n }\n\n /** Update a unit by code. */\n async updateUnit(unitCode: string, input: UnitUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a unit by code. */\n async deleteUnit(unitCode: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n });\n }\n\n /** Delete multiple units by code (bulk). The codes are sent as the request body. */\n async deleteUnits(codes: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/units`,\n auth,\n body: codes,\n });\n }\n\n /** Fetch a conversion factor (`PUT /units/conversion-factor-commands`). */\n async getConversionFactor(input: ConversionFactorInput, auth: AuthContext = SERVICE): Promise<ConversionFactorResult> {\n return this.ctx.http.request<ConversionFactorResult>({\n method: \"PUT\",\n path: `${this.base()}/units/conversion-factor-commands`,\n auth,\n body: input,\n });\n }\n\n /** Convert a value between units (`PUT /units/convert-unit-commands`). */\n async convertUnit(input: ConvertUnitInput, auth: AuthContext = SERVICE): Promise<ConvertUnitResult> {\n return this.ctx.http.request<ConvertUnitResult>({\n method: \"PUT\",\n path: `${this.base()}/units/convert-unit-commands`,\n auth,\n body: input,\n });\n }\n\n /** List all unit types. */\n async listUnitTypes(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({ method: \"GET\", path: `${this.base()}/types`, auth });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Catalog, CatalogList, CatalogInput, CatalogUpdate, CatalogPatch, CatalogCreated } from \"./catalog-types\";\n\nexport type { Catalog, CatalogList, CatalogInput, CatalogUpdate, CatalogPatch, CatalogCreated } from \"./catalog-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Catalog Management (`/catalog/{tenant}/catalogs`): CRUD over catalogs.\n * Server-side; defaults to the service token. `updateCatalog` is an upsert (PUT).\n */\nexport class CatalogService {\n static readonly channel = \"catalog\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/catalog/${this.ctx.tenant}/catalogs`;\n }\n\n /** List catalogs (filtered/sorted). */\n async listCatalogs(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<CatalogList> {\n return this.ctx.http.request<CatalogList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a catalog by id. */\n async getCatalog(catalogId: string, auth: AuthContext = SERVICE): Promise<Catalog> {\n return this.ctx.http.request<Catalog>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n });\n }\n\n /** Retrieve all catalogs that contain a category. */\n async getCatalogsForCategory(categoryId: string, auth: AuthContext = SERVICE): Promise<CatalogList> {\n return this.ctx.http.request<CatalogList>({\n method: \"GET\",\n path: `${this.base()}/categories/${encodeURIComponent(categoryId)}`,\n auth,\n });\n }\n\n /** Create a catalog. */\n async createCatalog(input: CatalogInput, auth: AuthContext = SERVICE): Promise<CatalogCreated> {\n return this.ctx.http.request<CatalogCreated>({ method: \"POST\", path: this.base(), auth, body: input });\n }\n\n /** Upsert a catalog by id (`PUT`). */\n async updateCatalog(catalogId: string, input: CatalogUpdate, auth: AuthContext = SERVICE): Promise<CatalogCreated> {\n return this.ctx.http.request<CatalogCreated>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a catalog by id (`PATCH`). */\n async patchCatalog(catalogId: string, patch: CatalogPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Remove a catalog by id. */\n async deleteCatalog(catalogId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery } from \"../core/query\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n Vendor,\n VendorList,\n VendorInput,\n VendorUpdate,\n VendorCreated,\n VendorSearchQuery,\n VendorLocation,\n VendorLocationList,\n VendorLocationInput,\n VendorLocationUpdate,\n} from \"./vendor-types\";\n\nexport type {\n Vendor,\n VendorList,\n VendorInput,\n VendorUpdate,\n VendorCreated,\n VendorSearchQuery,\n VendorLocation,\n VendorLocationList,\n VendorLocationInput,\n VendorLocationUpdate,\n} from \"./vendor-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Vendor Service (`/vendor/{tenant}/…`): vendors and their locations.\n * Server-side; defaults to the service token. PUT methods are upserts. Vendor\n * locations are the vendor's own pickup/warehouse locations (distinct from the\n * customer-management `client.locations`).\n */\nexport class VendorService {\n static readonly channel = \"vendor\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/vendor/${this.ctx.tenant}`;\n }\n\n // --- Vendors ---\n\n /** List all vendors. */\n async listVendors(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<VendorList> {\n return this.ctx.http.request<VendorList>({\n method: \"GET\",\n path: `${this.base()}/vendors`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a vendor by id. */\n async getVendor(vendorId: string, auth: AuthContext = SERVICE): Promise<Vendor> {\n return this.ctx.http.request<Vendor>({\n method: \"GET\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n });\n }\n\n /**\n * Search vendors (`POST /vendors/search`). A built filter in `q` is resolved to\n * a string; paging, sort and fields go in the query string.\n */\n async searchVendors(query: VendorSearchQuery, auth: AuthContext = SERVICE): Promise<VendorList> {\n const input =\n query.q !== undefined\n ? { ...query, q: resolveQuery(query.q, { compoundLogicalQuery: false }) }\n : query;\n return this.ctx.http.request<VendorList>({\n method: \"POST\",\n path: `${this.base()}/vendors/search`,\n auth,\n ...splitQuery(input, SEARCH_PAGING),\n });\n }\n\n /** Create a vendor. */\n async createVendor(input: VendorInput, auth: AuthContext = SERVICE): Promise<VendorCreated> {\n return this.ctx.http.request<VendorCreated>({ method: \"POST\", path: `${this.base()}/vendors`, auth, body: input });\n }\n\n /** Upsert a vendor by id (`PUT`). */\n async updateVendor(vendorId: string, input: VendorUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a vendor by id. */\n async deleteVendor(vendorId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n });\n }\n\n // --- Vendor locations ---\n\n /** List all vendor locations. */\n async listVendorLocations(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<VendorLocationList> {\n return this.ctx.http.request<VendorLocationList>({\n method: \"GET\",\n path: `${this.base()}/locations`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a vendor location by id. */\n async getVendorLocation(locationId: string, auth: AuthContext = SERVICE): Promise<VendorLocation> {\n return this.ctx.http.request<VendorLocation>({\n method: \"GET\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n });\n }\n\n /** Create a vendor location. */\n async createVendorLocation(input: VendorLocationInput, auth: AuthContext = SERVICE): Promise<VendorCreated> {\n return this.ctx.http.request<VendorCreated>({ method: \"POST\", path: `${this.base()}/locations`, auth, body: input });\n }\n\n /** Upsert a vendor location by id (`PUT`). */\n async updateVendorLocation(locationId: string, input: VendorLocationUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a vendor location by id. */\n async deleteVendorLocation(locationId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery } from \"../core/query\";\nimport { splitQuery } from \"../core/search\";\nimport type {\n AdminCustomer,\n AdminCustomerList,\n AdminCustomerInput,\n AdminCustomerUpdate,\n AdminCustomerPatch,\n AdminCustomerCreated,\n AdminCustomerSearchQuery,\n AdminCustomerAddress,\n AdminCustomerAddressList,\n AdminCustomerAddressInput,\n AdminCustomerAddressUpdate,\n AdminPasswordMigrationRetention,\n AdminPasswordMigrationRetentionInput,\n AdminCustomerImport,\n AdminCustomerImportResult,\n} from \"./customer-admin-types\";\n\nexport type {\n AdminCustomer,\n AdminCustomerList,\n AdminCustomerInput,\n AdminCustomerUpdate,\n AdminCustomerPatch,\n AdminCustomerCreated,\n AdminCustomerSearchQuery,\n AdminCustomerAddress,\n AdminCustomerAddressList,\n AdminCustomerAddressInput,\n AdminCustomerAddressUpdate,\n AdminPasswordMigrationRetention,\n AdminPasswordMigrationRetentionInput,\n AdminCustomerImport,\n AdminCustomerImportAccount,\n AdminCustomerLegacyAuth,\n AdminCustomerImportResult,\n} from \"./customer-admin-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Customer Service — tenant/seller-managed customer profiles and\n * addresses (`/customer/{tenant}/customers`). Server-side; defaults to the\n * service token. Distinct from the storefront `client.customers`.\n */\nexport class CustomerAdminService {\n static readonly channel = \"customer-admin\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/customer/${this.ctx.tenant}/customers`;\n }\n\n private customerPath(customerNumber: string): string {\n return `${this.base()}/${encodeURIComponent(customerNumber)}`;\n }\n\n private configPath(): string {\n return `/customer/${this.ctx.tenant}/config/password-migration-retention`;\n }\n\n private addressPath(customerNumber: string, addressId: string): string {\n return `${this.customerPath(customerNumber)}/addresses/${encodeURIComponent(addressId)}`;\n }\n\n // --- Customers ---\n\n /** List customers. */\n async listCustomers(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<AdminCustomerList> {\n return this.ctx.http.request<AdminCustomerList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /**\n * Search customers (`POST /customers/search`). A built filter in `q` is resolved\n * to a string; `pageNumber`, `pageSize`, `sort` and `expand` go in the query string.\n */\n async searchCustomers(query: AdminCustomerSearchQuery, auth: AuthContext = SERVICE): Promise<AdminCustomerList> {\n const input =\n query.q !== undefined\n ? { ...query, q: resolveQuery(query.q, { compoundLogicalQuery: false }) }\n : query;\n return this.ctx.http.request<AdminCustomerList>({\n method: \"POST\",\n path: `${this.base()}/search`,\n auth,\n ...splitQuery(input, [\"pageNumber\", \"pageSize\", \"sort\", \"expand\"]),\n });\n }\n\n /** Retrieve a customer profile by number. */\n async getCustomer(customerNumber: string, auth: AuthContext = SERVICE): Promise<AdminCustomer> {\n return this.ctx.http.request<AdminCustomer>({ method: \"GET\", path: this.customerPath(customerNumber), auth });\n }\n\n /** Create a customer. */\n async createCustomer(input: AdminCustomerInput, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"POST\", path: this.base(), auth, body: input });\n }\n\n /** Upsert a customer profile by number (`PUT`). */\n async upsertCustomer(customerNumber: string, input: AdminCustomerUpdate, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"PUT\", path: this.customerPath(customerNumber), auth, body: input });\n }\n\n /** Partially update a customer profile (`PATCH`). */\n async patchCustomer(customerNumber: string, patch: AdminCustomerPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.customerPath(customerNumber), auth, body: patch });\n }\n\n /** Delete a customer profile. */\n async deleteCustomer(customerNumber: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.customerPath(customerNumber), auth });\n }\n\n // --- Addresses ---\n\n /** List a customer's addresses. */\n async listAddresses(customerNumber: string, auth: AuthContext = SERVICE): Promise<AdminCustomerAddressList> {\n return this.ctx.http.request<AdminCustomerAddressList>({\n method: \"GET\",\n path: `${this.customerPath(customerNumber)}/addresses`,\n auth,\n });\n }\n\n /** Retrieve one address. */\n async getAddress(customerNumber: string, addressId: string, auth: AuthContext = SERVICE): Promise<AdminCustomerAddress> {\n return this.ctx.http.request<AdminCustomerAddress>({ method: \"GET\", path: this.addressPath(customerNumber, addressId), auth });\n }\n\n /** Add an address. */\n async addAddress(customerNumber: string, input: AdminCustomerAddressInput, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({\n method: \"POST\",\n path: `${this.customerPath(customerNumber)}/addresses`,\n auth,\n body: input,\n });\n }\n\n /** Upsert an address by id (`PUT`). */\n async upsertAddress(customerNumber: string, addressId: string, input: AdminCustomerAddressUpdate, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"PUT\", path: this.addressPath(customerNumber, addressId), auth, body: input });\n }\n\n /** Partially update an address by id (`PATCH`). */\n async patchAddress(customerNumber: string, addressId: string, patch: AdminCustomerAddressUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.addressPath(customerNumber, addressId), auth, body: patch });\n }\n\n /** Delete an address by id. */\n async deleteAddress(customerNumber: string, addressId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.addressPath(customerNumber, addressId), auth });\n }\n\n /** Add tags to an address (`?tags=` query). */\n async addAddressTags(customerNumber: string, addressId: string, tags: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.addressPath(customerNumber, addressId)}/tags`,\n auth,\n query: { tags: tags.join(\",\") },\n });\n }\n\n /** Remove tags from an address (`?tags=` query). */\n async removeAddressTags(customerNumber: string, addressId: string, tags: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.addressPath(customerNumber, addressId)}/tags`,\n auth,\n query: { tags: tags.join(\",\") },\n });\n }\n\n // --- Password-migration retention ---\n\n /**\n * Retrieves the tenant's password-migration retention config. Requires the\n * `customer.import_read` scope. An unconfigured tenant answers with an empty\n * object rather than a 404.\n */\n async getPasswordMigrationRetention(auth: AuthContext = SERVICE): Promise<AdminPasswordMigrationRetention> {\n return this.ctx.http.request<AdminPasswordMigrationRetention>({\n method: \"GET\",\n path: this.configPath(),\n auth,\n });\n }\n\n /**\n * Creates or updates the retention config (`POST`). Requires the\n * `customer.import_manage` scope. **Call this before importing customers with\n * `legacyAuth`** — that import is rejected without an active config. Re-POST with\n * an earlier `retentionEndDate` to shorten a running window.\n */\n async configurePasswordMigrationRetention(\n input: AdminPasswordMigrationRetentionInput,\n auth: AuthContext = SERVICE,\n ): Promise<AdminPasswordMigrationRetention> {\n return this.ctx.http.request<AdminPasswordMigrationRetention>({\n method: \"POST\",\n path: this.configPath(),\n auth,\n body: input,\n });\n }\n\n /**\n * Removes the retention config. Requires the `customer.import_manage` scope.\n * Intended for after the migration window: when the window ends, unmigrated\n * accounts need a password reset and their legacy credentials are cleared.\n */\n async deletePasswordMigrationRetention(auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.configPath(), auth });\n }\n\n // --- Bulk import ---\n\n /**\n * Bulk-imports customers (`POST /customers/import`). Requires the\n * `customer.import_manage` scope.\n *\n * Responds **207 Multi-Status**: per-item failures do **not** throw — inspect each\n * entry's `code`. Each item must carry exactly one of `account.passwordHash` or\n * `account.legacyAuth`, and importing `legacyAuth` requires an active retention\n * config (see `configurePasswordMigrationRetention`).\n */\n async importCustomers(\n input: AdminCustomerImport[],\n auth: AuthContext = SERVICE,\n ): Promise<AdminCustomerImportResult[]> {\n return this.ctx.http.request<AdminCustomerImportResult[]>({\n method: \"POST\",\n path: `${this.base()}/import`,\n auth,\n body: input,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Approval,\n ApprovalList,\n ApprovalInput,\n ApprovalPatch,\n ApprovalCreated,\n ApprovalPermittedInput,\n ApprovalPermittedResult,\n ApprovalUsersQuery,\n ApprovalUsersResult,\n} from \"./approval-types\";\n\nexport type {\n Approval,\n ApprovalList,\n ApprovalInput,\n ApprovalPatch,\n ApprovalCreated,\n ApprovalPermittedInput,\n ApprovalPermittedResult,\n ApprovalUsersQuery,\n ApprovalUsersResult,\n} from \"./approval-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Approval Service (`/approval/{tenant}/…`): B2B cart/quote approval\n * workflows — list/view approvals, create an approval request, approve or reject\n * via JSON-Patch, plus permitted-checks and approver search.\n *\n * Every endpoint is **CustomerAccessToken-only**. The trailing `auth` keeps the\n * SDK's uniform method shape, but a customer token is required in practice — pass\n * `auth.customer(token)` (the React hooks supply the browser context). The\n * service token will be rejected by Emporix.\n */\nexport class ApprovalService {\n static readonly channel = \"approval\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/approval/${this.ctx.tenant}`;\n }\n\n /** List approvals (paged via `pageNumber`/`pageSize`/`sort`/`q`). Returns an array. */\n async listApprovals(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalList> {\n return this.ctx.http.request<ApprovalList>({\n method: \"GET\",\n path: `${this.base()}/approvals`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a single approval by id. */\n async getApproval(approvalId: string, auth: AuthContext = SERVICE): Promise<Approval> {\n return this.ctx.http.request<Approval>({\n method: \"GET\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n });\n }\n\n /** Create an approval request (cart or quote). Returns the created `{ id }`. */\n async createApproval(input: ApprovalInput, auth: AuthContext = SERVICE): Promise<ApprovalCreated> {\n return this.ctx.http.request<ApprovalCreated>({\n method: \"POST\",\n path: `${this.base()}/approvals`,\n auth,\n body: input,\n });\n }\n\n /** Approve/reject/amend an approval via a JSON-Patch op-array (`PATCH`). */\n async updateApproval(\n approvalId: string,\n ops: ApprovalPatch,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete an approval by id. */\n async deleteApproval(approvalId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n });\n }\n\n /** Check whether an operation on a resource is permitted / needs approval. */\n async checkPermitted(\n input: ApprovalPermittedInput,\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalPermittedResult> {\n return this.ctx.http.request<ApprovalPermittedResult>({\n method: \"POST\",\n path: `${this.base()}/approval/permitted`,\n auth,\n body: input,\n });\n }\n\n /** Search for users eligible to approve a resource. Returns an array. */\n async searchApprovers(\n input: ApprovalUsersQuery,\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalUsersResult> {\n return this.ctx.http.request<ApprovalUsersResult>({\n method: \"POST\",\n path: `${this.base()}/search/users`,\n auth,\n body: input,\n });\n }\n}\n\n/** The status transitions a client can request. `PENDING` and `EXPIRED` are set by Emporix. */\nexport type ApprovalDecision = \"APPROVED\" | \"DECLINED\" | \"CLOSED\";\n\n/**\n * Builds the JSON-Patch for an approval decision, with both measured quirks baked in.\n *\n * Two things about this patch are counter-intuitive, both measured against tenant\n * `viu` on 2026-08-18:\n *\n * 1. **`replace` is lowercase.** The upstream spec shipped the enum uppercase and the\n * live API answers `REPLACE` with 400. That is repaired at the spec level (see\n * `scripts/spec-patches.ts`), so the type now guides you correctly.\n * 2. **The approver comment needs `add`, not `replace`.** `approverComment` does not\n * exist on a fresh approval, and `replace` on an absent field answers\n * `APPROVAL-400010` «Missing field \"approverComment\"». Because PATCH is atomic,\n * that failure takes the status change down with it — the decision silently does\n * not happen. `add` creates the field and overwrites it on a second decision, so\n * it is correct in both cases. The upstream spec's own «Add comment by the\n * approver» example agrees; only its enum did not.\n *\n * Status and comment travel in one request on purpose: since PATCH is atomic, a\n * rejection can never land without its reason.\n *\n * @example\n * await client.approvals.updateApproval(id, approvalStatusPatch(\"DECLINED\", \"Over budget\"), auth);\n */\nexport function approvalStatusPatch(\n status: ApprovalDecision,\n approverComment?: string,\n): ApprovalPatch {\n const comment = approverComment?.trim() ?? \"\";\n return [\n { op: \"replace\", path: \"/status\", value: status },\n // `as const` on both fields: the generated type narrows `path` to an enum too, so\n // a widened `string` from the spread would not be assignable.\n ...(comment !== \"\"\n ? [{ op: \"add\" as const, path: \"/approverComment\" as const, value: comment }]\n : []),\n ];\n}\n","import type { EmporixConfig, EmporixUnauthorizedInfo, ResolvedConfig } from \"./core/config\";\nimport type { TokenProvider, CustomerTokenRefresher } from \"./core/auth\";\nimport type { LogLevel, ServiceName } from \"./core/logger\";\nimport { createCore, type EmporixCore } from \"./core/create-core\";\nimport { CustomerService } from \"./services/customer\";\nimport { ProductService } from \"./services/product\";\nimport { CategoryService } from \"./services/category\";\nimport { CartService } from \"./services/cart\";\nimport { CheckoutService } from \"./services/checkout\";\nimport { PaymentGatewayService } from \"./services/payment\";\nimport { PriceService } from \"./services/price\";\nimport { MediaService } from \"./services/media\";\nimport { SegmentService } from \"./services/segment\";\nimport { SiteService } from \"./services/site\";\nimport { SessionContextService } from \"./services/session-context\";\nimport { CompaniesService } from \"./services/companies\";\nimport { ContactsService } from \"./services/contacts\";\nimport { LocationsService } from \"./services/locations\";\nimport { CustomerGroupsService } from \"./services/customer-groups\";\nimport { IamService } from \"./services/iam\";\nimport { OrdersService, SalesOrdersService } from \"./services/orders\";\nimport { AvailabilityService } from \"./services/availability\";\nimport { TenantConfigService } from \"./services/tenant-config\";\nimport { ClientConfigService } from \"./services/client-config\";\nimport { ShoppingListService } from \"./services/shopping-list\";\nimport { RagIndexerService } from \"./services/ai-rag-indexer\";\nimport { SequentialIdService } from \"./services/sequential-id\";\nimport { FeeService } from \"./services/fee\";\nimport { CloudFunctionsService } from \"./services/cloud-functions\";\nimport { WebhookService } from \"./services/webhook\";\nimport { SchemaService } from \"./services/schema\";\nimport { AiService } from \"./services/ai\";\nimport { TaxService } from \"./services/tax\";\nimport { CouponService } from \"./services/coupon\";\nimport { RewardPointsService } from \"./services/reward-points\";\nimport { BrandService } from \"./services/brand\";\nimport { LabelService } from \"./services/label\";\nimport { CountryService } from \"./services/country\";\nimport { CurrencyService } from \"./services/currency\";\nimport { ShippingService } from \"./services/shipping\";\nimport { InvoiceService } from \"./services/invoice\";\nimport { QuoteService } from \"./services/quote\";\nimport { ReturnsService } from \"./services/returns\";\nimport { IndexingService } from \"./services/indexing\";\nimport { SearchService } from \"./services/search\";\nimport { ImportService } from \"./services/imports\";\nimport { AuditLogService } from \"./services/audit-log\";\nimport { UnitHandlingService } from \"./services/unit-handling\";\nimport { CatalogService } from \"./services/catalog\";\nimport { VendorService } from \"./services/vendor\";\nimport { CustomerAdminService } from \"./services/customer-admin\";\nimport { ApprovalService } from \"./services/approval\";\n\n/** The Emporix SDK entry point. One instance safely serves many concurrent shoppers. */\nexport class EmporixClient {\n readonly customers: CustomerService;\n readonly products: ProductService;\n readonly categories: CategoryService;\n readonly carts: CartService;\n readonly checkout: CheckoutService;\n readonly payments: PaymentGatewayService;\n readonly prices: PriceService;\n readonly media: MediaService;\n readonly segments: SegmentService;\n readonly sites: SiteService;\n readonly sessionContext: SessionContextService;\n readonly companies: CompaniesService;\n readonly contacts: ContactsService;\n readonly locations: LocationsService;\n readonly customerGroups: CustomerGroupsService;\n readonly iam: IamService;\n readonly orders: OrdersService;\n readonly salesOrders: SalesOrdersService;\n readonly availability: AvailabilityService;\n readonly tenantConfig: TenantConfigService;\n readonly clientConfig: ClientConfigService;\n readonly shoppingLists: ShoppingListService;\n readonly ragIndexer: RagIndexerService;\n readonly sequentialIds: SequentialIdService;\n readonly fees: FeeService;\n readonly cloudFunctions: CloudFunctionsService;\n readonly webhooks: WebhookService;\n readonly schemas: SchemaService;\n readonly ai: AiService;\n readonly taxes: TaxService;\n readonly coupons: CouponService;\n readonly rewardPoints: RewardPointsService;\n readonly brands: BrandService;\n readonly labels: LabelService;\n readonly countries: CountryService;\n readonly currencies: CurrencyService;\n readonly shipping: ShippingService;\n readonly invoices: InvoiceService;\n readonly quotes: QuoteService;\n readonly returns: ReturnsService;\n readonly indexing: IndexingService;\n readonly search: SearchService;\n readonly imports: ImportService;\n readonly auditLogs: AuditLogService;\n readonly units: UnitHandlingService;\n readonly catalogs: CatalogService;\n readonly vendors: VendorService;\n readonly customerAdmin: CustomerAdminService;\n readonly approvals: ApprovalService;\n /** The validated tenant this client is bound to. */\n readonly tenant: string;\n /**\n * The token provider in use by this client. Exposed so React/Next hosts can\n * call `attachAnonymousStore` to wire session persistence. Treat as\n * read-only — replacing it after construction is not supported.\n */\n readonly tokenProvider: TokenProvider;\n /**\n * The validated config used to construct this client. Exposed so React /\n * Next hosts can read static settings such as `credentials.storefront.context`\n * (siteCode, currency, targetLocation) without re-plumbing them through the\n * Provider tree. Treat as read-only.\n */\n readonly config: ResolvedConfig;\n private readonly core: EmporixCore;\n\n constructor(config: EmporixConfig) {\n const core = createCore(config);\n this.core = core;\n this.tenant = core.tenant;\n this.config = core.config;\n this.tokenProvider = core.tokenProvider;\n\n const mk = core.mk;\n this.customers = new CustomerService(mk(CustomerService.channel));\n this.products = new ProductService(mk(ProductService.channel));\n this.categories = new CategoryService(mk(CategoryService.channel));\n this.carts = new CartService(mk(CartService.channel));\n this.checkout = new CheckoutService(mk(CheckoutService.channel));\n this.payments = new PaymentGatewayService(mk(PaymentGatewayService.channel));\n this.prices = new PriceService(mk(PriceService.channel));\n this.media = new MediaService(mk(MediaService.channel));\n this.segments = new SegmentService(mk(SegmentService.channel), {\n products: this.products,\n categories: this.categories,\n });\n this.sites = new SiteService(mk(SiteService.channel));\n this.sessionContext = new SessionContextService(mk(SessionContextService.channel));\n this.companies = new CompaniesService(mk(CompaniesService.channel));\n this.contacts = new ContactsService(mk(ContactsService.channel));\n this.locations = new LocationsService(mk(LocationsService.channel));\n this.customerGroups = new CustomerGroupsService(mk(CustomerGroupsService.channel));\n this.iam = new IamService(mk(IamService.channel));\n this.orders = new OrdersService(mk(OrdersService.channel));\n this.salesOrders = new SalesOrdersService(mk(SalesOrdersService.channel));\n this.availability = new AvailabilityService(mk(AvailabilityService.channel));\n this.tenantConfig = new TenantConfigService(mk(TenantConfigService.channel));\n this.clientConfig = new ClientConfigService(mk(ClientConfigService.channel));\n this.shoppingLists = new ShoppingListService(mk(ShoppingListService.channel));\n this.ragIndexer = new RagIndexerService(mk(RagIndexerService.channel));\n this.sequentialIds = new SequentialIdService(mk(SequentialIdService.channel));\n this.fees = new FeeService(mk(FeeService.channel));\n this.cloudFunctions = new CloudFunctionsService(mk(CloudFunctionsService.channel));\n this.webhooks = new WebhookService(mk(WebhookService.channel));\n this.schemas = new SchemaService(mk(SchemaService.channel));\n this.ai = new AiService(mk(AiService.channel));\n this.taxes = new TaxService(mk(TaxService.channel));\n this.coupons = new CouponService(mk(CouponService.channel));\n this.rewardPoints = new RewardPointsService(mk(RewardPointsService.channel));\n this.brands = new BrandService(mk(BrandService.channel));\n this.labels = new LabelService(mk(LabelService.channel));\n this.countries = new CountryService(mk(CountryService.channel));\n this.currencies = new CurrencyService(mk(CurrencyService.channel));\n this.shipping = new ShippingService(mk(ShippingService.channel));\n this.invoices = new InvoiceService(mk(InvoiceService.channel));\n this.quotes = new QuoteService(mk(QuoteService.channel));\n this.returns = new ReturnsService(mk(ReturnsService.channel));\n this.indexing = new IndexingService(mk(IndexingService.channel));\n this.search = new SearchService(mk(SearchService.channel));\n this.imports = new ImportService(mk(ImportService.channel));\n this.auditLogs = new AuditLogService(mk(AuditLogService.channel));\n this.units = new UnitHandlingService(mk(UnitHandlingService.channel));\n this.catalogs = new CatalogService(mk(CatalogService.channel));\n this.vendors = new VendorService(mk(VendorService.channel));\n this.customerAdmin = new CustomerAdminService(mk(CustomerAdminService.channel));\n this.approvals = new ApprovalService(mk(ApprovalService.channel));\n }\n\n /**\n * Re-binds the storefront price context (currency / siteCode / targetLocation)\n * for anonymous pricing and invalidates the current anonymous session, so the\n * next request re-mints a token bound to the new context. Use this to switch\n * currency at runtime. Carts are currency-bound — clear the cart after a\n * currency change (the React `setCurrency` does this for you).\n *\n * Also sets the storefront `language` (an `Accept-Language` header on every\n * read); a language-only change does NOT re-mint the token.\n */\n setStorefrontContext(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n language?: string;\n }): void {\n this.core.setStorefrontContext(ctx);\n }\n\n /** Sets the runtime log level globally or for one service. */\n setLogLevel(level: LogLevel, opts: { service?: ServiceName; force?: boolean } = {}): void {\n this.core.setLogLevel(level, opts);\n }\n\n /** Returns the effective log level for a service. */\n getLogLevel(service: ServiceName): LogLevel {\n return this.core.getLogLevel(service);\n }\n\n /**\n * Registers (or clears with `null`) a customer-token refresher. When set, a\n * `customer`-kind 401 triggers one refresh-and-retry. Off by default — the\n * customer token stays caller-owned. The React `EmporixProvider` wires this\n * automatically via `autoRefreshCustomerToken`.\n */\n setCustomerTokenRefresher(refresher: CustomerTokenRefresher | null): void {\n this.core.setCustomerTokenRefresher(refresher);\n }\n\n /**\n * Proxy mode (`config.proxy`): subscribes to the 401s the proxy answers, next\n * to `proxy.onUnauthorized`. Returns the unsubscribe function. The React\n * `EmporixProvider` uses it for `onCustomerSessionExpired`. Never fires outside\n * proxy mode — there a 401 is answered by re-authenticating.\n */\n onUnauthorized(listener: (info: EmporixUnauthorizedInfo) => void): () => void {\n return this.core.onUnauthorized(listener);\n }\n}\n","import type { EmporixConfig } from \"./core/config\";\nimport type { ServiceName } from \"./core/logger\";\nimport { EmporixError } from \"./core/errors\";\nimport { createCore, type EmporixCore } from \"./core/create-core\";\n\n/**\n * A service class the factory can instantiate: carries its channel + optional\n * deps. The constructor signature is intentionally loose (`...args: any[]`) so\n * both dep-free services (`new Svc(ctx)`) and dependent ones\n * (`new Svc(ctx, deps)` — e.g. `SegmentService`) satisfy it.\n */\nexport interface ServiceClass<I> {\n readonly channel: ServiceName;\n readonly deps?: readonly string[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): I;\n}\n\n/**\n * Tree-shakeable client factory. Builds ONLY the service classes you pass —\n * imports no services itself, so a bundler drops every service you don't use.\n * `EmporixClient` remains the batteries-included default; reach for this when\n * bundle size matters. Dependent services (e.g. `segments`) require their deps\n * to be present in the map under their public names (`products`, `categories`).\n */\nexport function createEmporixClient<S extends Record<string, ServiceClass<unknown>>>(\n config: EmporixConfig,\n services: S,\n): Omit<EmporixCore, \"mk\"> & { [K in keyof S]: InstanceType<S[K]> } {\n const { mk, ...core } = createCore(config);\n const built: Record<string, unknown> = {};\n const entries = Object.entries(services) as [string, ServiceClass<unknown>][];\n\n // Pass 1: dependency-free services.\n for (const [key, Svc] of entries) {\n if (!Svc.deps?.length) built[key] = new Svc(mk(Svc.channel));\n }\n // Pass 2: dependents (only `segments` today; deps are all dep-free, so two\n // passes suffice — a deeper graph would need a topological sort).\n for (const [key, Svc] of entries) {\n if (!Svc.deps?.length) continue;\n const deps: Record<string, unknown> = {};\n for (const dep of Svc.deps) {\n if (!(dep in built)) {\n throw new EmporixError(\n `createEmporixClient: \"${key}\" requires \"${dep}\" in the services map`,\n );\n }\n deps[dep] = built[dep];\n }\n built[key] = new Svc(mk(Svc.channel), deps);\n }\n\n return { ...core, ...built } as Omit<EmporixCore, \"mk\"> & {\n [K in keyof S]: InstanceType<S[K]>;\n };\n}\n","/**\n * Extracts the product id from a product `itemYrn`\n * (`urn:yaas:hybris:product:product:<tenant>;<productId>`). Cart and order line\n * items carry only the YRN, not a bare product id. Returns \"\" when the YRN is\n * missing or has no `;` segment.\n *\n * Approval resource items are an exception: their `itemYrn` is frequently the bare\n * product id with no YRN wrapper, so this returns \"\" and you want the sibling\n * `itemId` as a fallback. Measured on tenant `viu`, 2026-08-18.\n */\nexport function productIdFromYrn(yrn: string | undefined): string {\n if (!yrn) return \"\";\n const semi = yrn.lastIndexOf(\";\");\n return semi >= 0 ? yrn.slice(semi + 1) : \"\";\n}\n\n/**\n * Builds a product `itemYrn` — the form `carts.addItem` requires.\n *\n * The inverse of {@link productIdFromYrn}. Emporix rejects anything else with\n * «Given yrn does not match yaas urn scheme».\n */\nexport function productYrn(tenant: string, productId: string): string {\n return `urn:yaas:hybris:product:product:${tenant};${productId}`;\n}\n"]}
|