CHANGED The logger now skips empty/whitespace-only string messages (logger.info(""), logger.error(" ")) instead of emitting a meaningless {"message":""} entry. Applies to every consumer (middleware, storefront, SDK). Log an actual message or pass data as the log argument/metadata to record something.
CHANGED The GCP structured logger now serializes an error's full cause chain for ANY error that has one - previously only AppError subclasses did. So an SSR SDKError: fetch failed whose real reason is a nested SocketError/ECONNRESET is now logged with that reason (under cause) instead of just the top-level message. The serialization is unchanged (circular-safe via serializeErrorForLog, then secret-redacted and depth/size-bounded via sanitizeLogMetadata); this only widens which errors it applies to. Affects every consumer that logs a plain Error with a cause (middleware and storefront).
ADDEDcreateStorefrontLogger(options?) and withStorefrontScope(logger, scope) to @alokai/connect/logger. createStorefrontLogger builds the standard GCP-structured logger tagged alokai.context: "storefront" (previously duplicated in @vue-storefront/next and @vue-storefront/nuxt, now shared). withStorefrontScope wraps such a logger so every entry carries per-log detail under alokai.scope - and only scope, so callers cannot override the protected alokai.context. The underlying metadata injector stays internal: exposing it would hand consumers an unguarded way to overwrite the reserved alokai namespace.
ADDEDinstallConsoleBridge(logger, options?) to @alokai/connect/logger: an opt-in helper that routes the runtime's raw console.error/console.warn output through the Alokai logger, so framework SSR errors and third-party console output are emitted as single structured (GCP JSON in production) entries instead of multi-line dumps that log collectors cannot parse. Renders nested Errors with their stack, strips ANSI color codes, keeps non-error arguments as details metadata, drops empty/whitespace-only output (blank spacing lines) on every patched console method, guards against reporter recursion, passes already-structured logger lines straight through, and falls back to the native console on failure. Kept free of Node built-ins so the logger stays browser-safe. Options: metadata (merged into every entry); returns a handle with uninstall().
ADDED@vue-storefront/next/instrumentation export with a ready-to-use register hook. Wire it up from your app's root instrumentation.ts (export { register } from "@vue-storefront/next/instrumentation";) to re-emit Next.js' raw, multi-line console.error/warn dumps - which log collectors (GCP, Datadog, Elasticsearch) cannot parse - as single structured GCP JSON entries matching the middleware log format. register installs a console→logger bridge that normalizes every server console.error/warn (rendering Errors with their stack) and drops empty spacing lines. Active only in production Node runtime; local dev output is unchanged.
ADDED The storefront logger now emits a one-time warning in a production Node server when instrumentation.ts did not wire the Alokai register hook, so a missing setup is surfaced instead of silently skipping SSR log normalization.
ADDED A Nitro server plugin that routes Nitro's raw server console output - including unhandled SSR errors - through the Alokai logger, so the multi-line text Nitro prints by default (which log collectors like GCP, Datadog, Elasticsearch cannot parse) is re-emitted as single structured GCP JSON entries matching the middleware log format. Installs a console→logger bridge that normalizes every server console.error/warn (rendering Errors with their stack) and drops empty spacing lines. Registered automatically by the module; active only in production builds, so local dev output is unchanged.
CHANGED The default logger option includeStackTrace is now true (was false), aligning Nuxt with the middleware and Next.js defaults so 5xx/unexpected errors carry a stack trace out of the box. Set alokai.logger.includeStackTrace: false in nuxt.config to opt out. Traces are still never attached to 4xx client errors.
ADDEDstore build now guarantees each composed Next.js app wires the Alokai instrumentation - automatically, without failing the build. It parses the composed instrumentation.ts (AST, not string matching) and, when the file does not already export register, appends export { register } from "@vue-storefront/next/instrumentation"; as the last statement (so any side-effect imports still run first) with a "do not remove" comment; when there is no instrumentation file, it creates one. This runs on the composed .out output only - your project's source is left untouched - so removing the wiring from source cannot silently disable SSR/RSC log normalization.
A file whose register references @vue-storefront/next/instrumentation (our re-export, an export *, or a wrapper that imports it) is left exactly as-is, so custom instrumentation is never clobbered and the step is idempotent. A file that exports a custom register with NO reference to our module cannot be wired (our hook can't run without being imported), so it overrides Alokai's - the build fails with a fix hint. Whether a register that does reference our module actually calls it can't be proven statically without false positives, so that residual case is enforced at runtime instead (@vue-storefront/next throws on server start if the hook never ran).
FIXED The generated Deployment workflow now reads CONSOLE_API_URL from the CONSOLE_API_URL repository variable (vars.CONSOLE_API_URL), so you can configure the Console API URL as a non-secret variable.
FIXED Next.js standalone Docker images no longer crash with Cannot find module 'react-dom/server.browser' on npm/pnpm projects. react-dom is now kept as an explicit production dependency of the deployed app so it survives the production install step.
FIXED Middleware error responses (404/405 and endpoint errors) are now sent as text/plain with X-Content-Type-Options: nosniff instead of text/html, so request values reflected in an error body can no longer be rendered as HTML in the browser (reflected HTML injection).
Note: The response body and status codes are unchanged - only the Content-Type header changes (text/html → text/plain) and X-Content-Type-Options: nosniff is added. This is non-breaking for clients that read the response body or status. The only case to check is code that branches on the literal text/html content-type of these error responses.
FIXEDstore deploy no longer ignores the projectName, framework, and cloudRegion values from alokai.config.json when the CLI_PROJECT_NAME, CLI_FRAMEWORK, or CLI_CLOUD_REGION environment variable is set to an empty string - which happens in the generated GitHub Actions workflow when the corresponding repository variable is not defined. An empty environment variable is now treated as unset.
FIXED Circuit-breaker-blocked requests no longer crash the middleware error handler and no longer leak the upstream Authorization header into logs.
Requests rejected by an open circuit breaker previously threw TypeError: Cannot read properties of undefined (reading 'errorBoundary') while handling the error, masking the original failure. The blocked request now returns its proper error response.
Serialized error causes written to logs now redact secret-named fields (e.g. the raw request _header and Authorization/Cookie headers on axios-style errors), matching the redaction already applied to log metadata.
ADDED New @alokai/ai-toolkit package that makes coding agents (Claude Code, Cursor, Codex, Gemini CLI, GitHub Copilot) meaningfully more effective in an Alokai codebase. It gives your agent framework-aware context so generated code follows Alokai conventions, agent-driven review workflows to run before opening a PR (for example, catching common performance regressions in a Next.js diff), and Alokai reference docs it can consult on demand. Customer projects pick it up via a new alokai ai sync command in @alokai/cli, which keeps the toolkit and your project's AGENTS.md in sync as the package evolves. The generated Next.js storefront also follows the Next.js AI agents guidance, so agents pick up framework-level context alongside the Alokai skills. See the migration guide below for adopting it in an existing project.
ADDEDintegration generate in @alokai/cli now accepts an --answers flag taking a JSON object of the template's prompt answers (keyed by prompt name), so the command can run non-interactively. Interactive prompts are skipped and the integration is generated directly from the supplied answers. Enables scripting and automated testing of integration generation.
ADDEDintegration generate in @alokai/cli now accepts a --skip-version-check flag that lets generation proceed even when the project's Alokai ecosystem version is not in the compatibility matrix (the version-mismatch warning is still printed instead of aborting).
ADDED New Alokai Image Optimizer for both Next.js (@vue-storefront/next) and Nuxt (@vue-storefront/nuxt) storefronts. It rewrites image URLs matching a configured media host to a /img-proxy/{key}/...?width=&quality=&format=auto route so the optimizer CDN can transform them, and the server route proxies the bytes back from the origin. On Nuxt, set alokai.imageOptimizer.hosts in your Nuxt config to register an @nuxt/image provider plus a /img-proxy/:host/**:path server route (mirroring the Next.js createImageOptimizer API); the default and sapcc URL variants and per-host cacheControl are supported, and the media host for each key is overridable per deployment via NUXT_PUBLIC_{KEY}_MEDIA_HOST (leaving it empty passes image URLs through untouched). Toggle the optimizer at runtime with NEXT_PUBLIC_IMAGE_OPTIMIZER_ENABLED=true (Next.js) or NUXT_PUBLIC_IMAGE_OPTIMIZER_ENABLED=true (Nuxt); when unset or set to any other value, image URLs are passed through unchanged and the optimizer route returns 404.
ADDED Multi-instance bootstrap for Config Switcher in @alokai/connect. Each configured store now gets its own isolated init() and extendApp() at startup with correctly merged configuration, so services initialized during startup (such as authentication token services) are correctly configured per store.
ADDED Opt-in retry of transient failures for integration API methods in @alokai/connect. When enabled, calls that fail with a transient transport error (502/503/504/408/429 and normalized network failures such as ETIMEDOUT/ECONNRESET) are automatically retried before failing. Off by default; enable per integration via the new retry config:
ADDEDcreateStorefrontEvents factory, exported from @vue-storefront/next/client - a typed, client-side pub/sub for storefront domain events. Declare your app's event map once and use the bound emitStorefrontEvent / subscribeStorefrontEvent / useStorefrontEvent / StorefrontEventEmitter helpers, so modules (analytics, personalization, search) can emit and subscribe without the core knowing who listens. useStorefrontEvent reads the handler through a ref so inline handlers do not re-subscribe every render; StorefrontEventEmitter emits once per mount (Strict-Mode-safe) for server-rendered pages.
ADDEDgetCurrentPath helper, exported from @vue-storefront/next/server - returns the current request path (pathname + search) inside an App-Router Server Component, reading the headers set by createAlokaiMiddleware. It lives in a dedicated server entry because it imports next/headers, which is unavailable in the client / Pages Router bundles that also import the package.
ADDED (SAPCC only) Added support for SAP Customer Data Cloud.
ADDED (Compass only) retryFailedToolCalls action config option that routes failed tool calls back to the LLM for retry, even when shouldReactToToolsResponses is disabled.
ADDED (Compass only) outputSchema in structured-output actions now accepts a dynamic schema definition { schema, cache? }, mirroring the schema + cache shape already used by tools. The schema is resolved per invocation with access to the request context and the workflow payload, and - when a cache.key is provided - goes through the same Redis-backed caching pipeline as dynamic tool schemas. Static z.ZodType schemas keep working unchanged.
ADDED (Compass only) New ALOKAI_COMPASS_NO_CREDENTIALS_MANAGER environment variable that disables the Alokai-hosted credentials manager. When set, Compass reads ALOKAI_COMPASS_API_KEY and ALOKAI_COMPASS_API_URL directly from the environment, allowing Compass to be pointed to the Alokai AI service. When the flag is set without ALOKAI_COMPASS_API_URL, the server fails fast at startup with a clear error. Installing the Compass module via storefront-cli add-module compass now also seeds .env.example with a commented ALOKAI_COMPASS_API_URL=https://llm-gateway.alokai.dev line as a discoverable default.
CHANGED (Compass only) Tool return values now expose an instructions property that yields a system message for the LLM on how to interpret the tool-call result.
REMOVED (Compass only) Removed the custom previewProducts tool.
ADDED (SmartEdit only) Header and footer are now consistently rendered on all CMS-managed pages. The connectCmsPage helper wraps each page with the default layout (navbar, main content area, and footer), ensuring consistent appearance whether a page has CMS content or falls back to the storefront default. See the migration guide below for the required layout changes in existing SAP storefronts.
FIXED Integrations generated by @alokai/cli from the openapi and graphql templates now build against the current Alokai version. Previously a freshly generated openapi or graphql integration failed to compile and needed manual fixes before it could be used. The openapi template's fetch HTTP-client option now also builds out of the box, with no manual setup required.
CHANGED Improved integration boilerplate templates in @alokai/cli. The graphql template now reads the integration's baseUrl from the <INTEGRATION>_BASE_URL environment variable instead of a hardcoded placeholder URL, so you configure the endpoint through your environment. The sdk-proxy template now ships a working example endpoint (getSample, returning sample data) out of the box instead of a non-functional placeholder, giving you a runnable starting point to adapt to your own SDK.
FIXED@alokai/cli version check no longer crashes when the Alokai version API is temporarily unavailable - a warning is shown and the check is skipped gracefully.
FIXED Bump actions/setup-node, actions/checkout, actions/download-artifact to v5 to avoid Node 20 deprecation warnings.
FIXEDintegrationConfigSchema in @alokai/connect accepts any object instead of only {}. The previous schema rejected the config the config-switcher injects, breaking middleware bootstrap.
FIXED GCP structured logging in @alokai/connect now surfaces the full error cause chain and AppError subclass details. The per-request error log serializes the underlying cause - previously it took the cause from AppError.toJSON(), which flattens it to name/message, hiding the real reason of a transport failure (the network error carried as cause - ECONNRESET, ETIMEDOUT, the upstream status/response body). Logs also now include the data and cause fields from AppError subclasses (e.g. ValidationError, HttpError), so normalizer failures and other diagnostics surface without the logger needing to know about specific subclasses. Secret redaction, circular-reference safety, and size bounds are preserved. AppError.toJSON(), which the error handler returns to API clients, is intentionally left untouched, so nothing extra is exposed to clients.
FIXED Correctly infer type for custom fields of SfOrderListItem in @alokai/connect.
FIXEDcart-page-providers.tsx is now correctly installed to cart/components/ instead of my-account/my-orders/[id]/components/.
FIXEDenv('NEXT_PUBLIC_*') from @vue-storefront/next now returns the correct value on the client during the first render and inside initial useEffect calls. Previously, runtime env vars were undefined until shortly after hydration, which could break integrations that read them eagerly - for example, the SAP CDC module's getCdcConfig() returned no API key on first render and failed to load the Gigya SDK.
FIXEDAlokaiInstrumentation now reliably captures the initial page view and any navigation that happens during page load. Previously, the history-trace script started running after hydration, so the very first page view and any router navigation triggered before that point were not reported.
FIXED Multiple bugs in the re-order module. wantedQuantities on the product card is now correctly keyed by SKU instead of cart line item ID. Items not found in the updated cart after the add-line-items API call are now reported as errors instead of successes. use-re-order-products guards against undefined lineItems crashing on .forEach and surfaces unhandled mutateAsync rejections as error notifications. The local-storage hook now correctly resets state to initialValue when the item is removed (newValue === null) or storage is cleared (changedKey === null), fixing a stale closure that prevented clearing from taking effect.
ADDED Ability to add a suffix to hardcoded store IDs from the generate-gtm action. Generated workflows were also updated to use environment: ${{ matrix.store_id }} so that different store IDs can have different GitHub environments (and env vars/secrets) associated with them.
CHANGED Updated @storefront-ui/react to 4.0.1, @storefront-ui/vue to 3.1.2, and @storefront-ui/nuxt to 3.3.1.
CHANGED Aligned axios to ^1.15.2.
CHANGED Bumped pinned dependency versions (defu, glob, h3, lodash-es, minimatch, path-to-regexp, rollup, diff, uuid) to patched releases within the same major to address known security vulnerabilities. No public API or runtime behavior change.
CHANGED Node engines tightened to ^20.10.0 || >=22.14.0 to match the runtime support range for JSON ESM imports with with { type: "json" }.
FIXED (SAPCC only) Improved facet value matching to handle prefixed values (e.g. color-black, size-10) and prefer superZoom image format for gallery and primary images. The facet normalizer now resolves prefixed facet values by trying an exact match first and then a suffix match; the product images normalizer prefers the superZoom format over zoom for highest quality; and the getOptions helper falls back to variantOptions when baseOptions is empty.
ADDED (Compass only) New appendToCompactHistory SDK utility in @alokai/compass for appending entries to the compact history in localStorage.
FIXED (Compass only) Chat history no longer disappears on page reload when the assistant is using compact history. The useWorkflow hook now passes the prior conversation to the SDK as messageHistory, ensuring the full chat is persisted to localStorage across turns.
FIXED (Compass only) Context messages in compact history are now stringified before being persisted, ensuring the assistant can recall prior search context (e.g. "green beanie") across conversation turns.
FIXED (Compass only) CompassProvider no longer overrides the root translation provider. Previously, wrapping the app with CompassProvider blocked access to all translation namespaces except AddToCartButton and Compass, causing missing translation errors for components like NavCartButton and AuthButton.
FIXED (Compass only) Cart page loading spinner no longer gets stuck. Previously, the Compass assistant's useFrontendActions hook subscribed to cart query state, causing a render loop that prevented isLoading from resolving to false.
FIXED (Compass only) Lazy-load pako compression library to avoid bundling it on the client when compression is not used.
FIXED (Compass only) Bumped @frsource/autoresize-textarea to ^2.0.196 in the Compass module's Next.js dependencies. Versions 2.0.192-2.0.195 stopped shipping the dist/index.d.ts declaration file, causing tsc --noEmit to fail with TS7016 when generating the SAPCC store with the Compass module added. The upstream author republished the declarations in 2.0.196.
CHANGED (Compass only) ProductMessage now embeds only { name, sku } in the product-visit context messages sent to the assistant, instead of the full SfProduct object. This significantly reduces the prompt size (and token cost) on every product page view without losing enough identity for the assistant to follow up or tool-call for more detail.
CHANGED (Compass only) Adjusted model naming to the new convention. Each action config now carries a model (the dated codename forwarded to the proxy in no-credentials mode) and a legacyModel (the concrete model resolved in credentials-manager mode). The default Compass module config sets both for every workflow action so it behaves correctly in both modes.
CHANGED (Compass only) The model option on defineAction is now typed as string (was the literal union "heavy" | "light" | "medium"), so the IDE no longer suggests a hardcoded set of names that drifts away from what the gateway actually exposes. The TSDoc on the field links to the new Available Models docs page where the live, curated catalog is browsable.
FIXED (Contentstack only) LivePreview typed its onLiveEdit callback parameter as required, which failed to type-check against the published contentstack SDK signature (() => void) and left the parameter as an implicit any. Marking livePreviewUrl optional (livePreviewUrl?: string) makes the handler assignable to both signatures.
FIXED (Coveo only) The Coveo proxy forwards only whitelisted headers (the auth token plus JSON content headers) and rewrites the host, instead of spreading every incoming header. Forwarding the incoming request's content-length / transfer-encoding described the original body - not the re-serialized payload axios sends upstream - which hung the request and eventually OOM-ed the middleware.
FIXED (SmartEdit only) Restored full heading hierarchy (h1-h6), responsive typography, and list styles in the SmartEdit paragraph component.
New projects generated by the Alokai CLI already include everything below. For projects generated before this release:
Run alokai ai sync. When prompted:
confirm the install - the CLI will add @alokai/ai-toolkit to devDependencies at the version pinned for your ecosystem release;
confirm the postinstall wiring - the CLI will add (or append) alokai ai sync to scripts.postinstall so symlinks and the managed AGENTS.md block are refreshed on every install.
For non-interactive runs (e.g. CI), pass --yes:
yarn alokai ai sync --yes
(Optional) Pin the agent targets explicitly in your root alokai.config.json. Without this, the CLI auto-detects installed agents from the project. The forced agents list ensures symlinks land in standard paths even on machines (or CI runners) where the agent home directory is not yet present:
After step 1, your agents (Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot) will see the Alokai skills and the managed AGENTS.md guidance on next startup.
Each page that should be enrichable with CMS content must be wrapped with connectCmsPage. The helper accepts the page component and an options object with a getCmsPagePath function that returns the CMS page path for the given page props.
Apply the following changes to each page where you want to display CMS content:
Example — page without shared sub-layout (app/[locale]/(default)/cart/page.tsx)
Create a new app/[locale]/(default)/my-account/(navigation-sidepanel)/components/my-account-base-layout.tsx file that consolidates the shared my-account navigation sidepanel layout (heading, navigation sidebar, and children slot). This component is used inside each my-account page wrapped with connectCmsPage above.
The (default)/layout.tsx must be replaced with the version provided by the cms-smartedit module (installed automatically when running yarn sf-modules install cms-smartedit). The key structural change is that Navbar and Footer are removed from the root layout and are instead rendered per-page by connectCmsPage. This prevents double-rendering since connectCmsPage now always wraps pages with BaseDefaultLayoutWithNavbarAndFooter.
The new layout exports three components:
DefaultLayout (default export) — thin wrapper that delegates to BaseDefaultLayout
connectCmsPage now is supposed to handle fallback to generic header/footer when CMS content is not provided. To migrate, follow the example of sf-modules/cms-smartedit/components/connect-cms-page.tsx:
If you have custom CMS page templates (e.g. ContentPage1Template, LandingPage2Template, ProductDetailsPageTemplate), remove the BaseTemplateLayout wrapper and BASE_TEMPLATE_LAYOUT_SLOTS from each template. The header/footer slots (NavigationBar, Footer, SearchBox, etc.) are now rendered by connectCmsPage via BaseTemplateLayout at the page level — templates should only render their own content slots.
CHANGED Improved the developer experience of writing custom GraphQL queries. The custom method boilerplate now tags queries with gql, so editors provide GraphQL syntax highlighting and - with a GraphQL editor extension - schema-aware autocompletion. The custom queries guides now lead with the recommended custom API method approach and document the editor setup.
FIXED Middleware: clearer circuit breaker logs. Messages and severities now make it obvious whether the breaker is only observing upstream errors (logged at warning, traffic still flowing) or actually blocking traffic (error, breaker open) - previously every upstream error logged Circuit breaker FAILURE at error level, which read like the breaker had tripped. Each event carries an impact field (observing/blocking/probing/recovered) and a recommendedAction field (investigate_upstream/none), and the messages spell out what to do when the breaker opens or the error rate approaches the threshold, linking to the troubleshooting guide.
FIXED Middleware: the EXTREME_DEBUG circuit breaker preset is now actually blocked in production. It logged "Falling back to BALANCED preset" but kept running with EXTREME_DEBUG's 95% failure tolerance; it now falls back to BALANCED as the log states.
FIXEDMisconfigured api methods now fail with a clear error. An api method name that resolves to something non-callable (a non-function export, a missing default export, or a broken import) now throws a descriptive configuration error naming the integration/extension/function, instead of an opaque TypeError: fnToExecute is not a function deep in the circuit breaker. Server-side faults (status >= 500) raised while preparing the api function are logged via the Alokai logger and return a generic message, so the detail stays in the logs and is never leaked to the client; client errors (e.g. a 404 for an unknown function name) keep their message and stay unlogged.
FIXEDFailure logs now show the real underlying cause. Circuit breaker failure logs include the full cause chain, so a transport error normalized into an HttpError ("Failed to communicate with external service") no longer hides the real reason (ECONNRESET, the upstream status/body, ...). A new log-only serializer captures the whole error/cause tree of any integration or HTTP client. The logger redacts secret-bearing keys (auth headers, cookies, tokens, ...) - extendable via logger.redactKeys - and bounds depth and size, so nothing sensitive or unbounded reaches the logs. Client-facing responses (AppError.toJSON()) are unchanged.
FIXED Contentstack Live Preview now stays in sync with the latest draft on every edit. The onLiveEdit callback receives a ready-to-use livePreviewUrl with the live preview query encoded, and the Next.js integration navigates to it with router.replace instead of router.refresh() so the previewed content is re-fetched correctly.
FIXEDenv('NEXT_PUBLIC_*') now returns the correct value on the client during the first render and inside initial useEffect calls. Previously, runtime env vars were undefined until shortly after hydration, which could break integrations that read them eagerly — for example, the SAP CDC module's getCdcConfig() returned no API key on first render and failed to load the Gigya SDK.
FIXEDAlokaiInstrumentation now reliably captures the initial page view and any navigation that happens during page load. Previously, the history-trace script started running after hydration, so the very first page view and any router navigation triggered before that point were not reported.
FIXEDgetProductReferences now normalizes each reference's target via normalizeProductCatalogItem instead of normalizeProduct. The SeProductReferences component renders catalog cards (via ProductCardVertical, which is typed SfProductCatalogItem) — so the data must flow through the catalog-item normalizer chain. With the previous normalizeProduct choice, customer-side addCustomFields.normalizeProductCatalogItem augmentations (e.g. @vsf-modules/compass's required description: string) caused a structural $custom mismatch and failed typecheck in customer projects (ES-2626).
FIXED Normalizer validation errors now include the input object, normalizer name, Zod validation issues, and a link to documentation. Previously, these details were stripped during error serialization, making it difficult to diagnose schema mismatches between e-commerce platforms and the Unified Data Layer.
ADDED--docker-image-tag flag for store deploy command to allow specifying a custom Docker image tag instead of the auto-generated git commit SHA. Can also be set via the CLI_DOCKER_IMAGE_TAG environment variable.
ADDEDdefineMocker for recording and replaying outgoing HTTP requests in middleware.
import { defineMocker } from "@alokai/connect/integration-kit";const { extension, mocker } = defineMocker({ // Enable or disable the extension entirely (default: true) enabled: process.env.MOCKER_ENABLED === "true", // Initial mode: "idle" | "recording" | "replaying" mode: () => "recording", // Allow real network requests for unmatched hosts during replay allowUnmocked: (host) => host.includes("my-trusted-api.com"), // Control which recorded requests are saved and replayed shouldMock: (call) => !call.scope?.includes("internal-service"), // Preload previously saved recordings (required when mode is "replaying") recordings: () => savedRecordings, // Specify custom call duration delayResponse: (call) => call.duration, // Do something with request paths before matching (e.g. strip dynamic segments) filteringPath: (_call, path) => path.replace(/\/api\/v[0-9]+\//, "/api/"), // Do something with the body before matching filteringRequestBody: (_call, body) => body, // Do something with the recordings (e.g. save them to a file) onRecordingStopped: (recordings, allRecordings) => { console.log({ recordings }); },});// Programmatic control (no HTTP requests needed):mocker.record(); // Start recordingmocker.replay(); // Start replayingmocker.stop(); // Stop recording or replayingmocker.reset(); // Stop and clear all statemocker.getState(); // Get current state
Once registered, the mocker also exposes HTTP endpoints on your middleware server:
Endpoint
Method
Description
/mocker
GET
View current state and available handlers
/mocker/record
GET
Start recording outgoing HTTP requests
/mocker/replay
GET
Start replaying previously recorded requests
/mocker/stop
GET
Stop recording or replaying
/mocker/reset
GET
Stop and clear all recordings and state
ADDED Payload size limits for Compass workflows. Text and image content is measured after transforms and trimming, right before the LLM call. Default limits: 200KB text, 1MB images. Configurable per workflow via limits in workflow config.
ADDED Periodic chat history compaction — older messages are summarized while preserving recent context. Opt in via useCompactHistory in the assistant hook or as an SDK parameter.
ADDED Image analysis action and context message rendering — describes images for both chat history and compact chat history.
ADDED Compass batch cart removal and clear cart tools for the chatbot workflow.
ADDED Handle Set-Cookie headers from commerce API responses by intercepting, streaming, and applying them on the client. Compactor tool-call summaries improved to prevent LLM hallucination of IDs and SKUs.
CHANGED Consolidated product search into the main assistant action, removing the separate search-products router step. Category enum strategy for searchProducts tool schema updated accordingly.
CHANGED Compass module: replaced defineDynamicTool with unified defineTool in tool definitions.
CHANGED Compass analytics action no longer accepts the model option.
ADDEDcms-smartedit now maps the root path / to pageLabelOrId: 'homepage' by default in resolvePages. SmartEdit's default "homepage" label works out of the box on the root route without manual configuration. See migration guide below.
FIXED Deploying a new storefront to CI/CD no longer fails due to missing private package access. Switching from the CMS mock to a real CMS provider no longer leaves behind stale mock references in the codebase.
FIXED Updated install.js to target correct file paths after sf-modules refactor (category and product pages). Added replaceAllOrThrow safety guard so install-time regressions throw immediately instead of silently producing broken storefronts.
FIXED Resolved tinyexec version conflict causing MODULE_NOT_FOUND error on global CLI install.
FIXED Deploying a store with --framework nextjs no longer triggers unnecessary nuxt prepare during composition, preventing CI failures caused by unbuilt workspace packages.
CHANGED Upgraded OpenAI models: GPT-4.1 to GPT-5-chat (heavy) and GPT-4.1-mini to GPT-5-mini (medium). Compactor-aware tool-calling instructions are now injected automatically when a workflow has a compactor enabled. Cart data is now returned from the getCart tool so the LLM can resolve line item IDs for remove/update operations. Guided selling prompts updated for GPT-5-chat compatibility.
FIXEDgetTypedApiClient now accepts any integration context, not just the primary commerce one. Previously, the function typed its context parameter using the project-specific IntegrationContext from @/types (which resolved to the commerce integration's context type), causing TypeScript errors when calling the helper from within a second integration's methods (e.g. SmartEdit). The parameter is now typed using the base IntegrationContext from @alokai/connect/middleware, which all integration contexts extend.
ADDED Opt-in method-level circuit breaker granularity. Set granularity: "method" in the circuitBreaker config to isolate breakers per API method — a failing endpoint no longer trips the breaker for the entire integration.
FIXED Unified 404 error handling in connectCmsPage across all CMS modules. When the API returns 404, null is passed as page to the consumer instead of silently catching all errors or calling notFound() directly. Non-404 errors now propagate correctly.
CHANGED Update to Tailwind 4 requires some manual changes in the storefronts code. See the migration guide below for more details.
ADDED Circuit Breaker automatically protects your application from cascading failures when backend services become unavailable. When errors exceed a threshold, the circuit breaker blocks requests immediately instead of waiting for timeouts, giving failing services time to recover. Works out of the box with sensible defaults — no code changes required. All circuit breaker events logged with structured metadata. Prometheus metrics for monitoring state transitions and request outcomes. Configurable presets (PRODUCTION, DEVELOPMENT, AGGRESSIVE, TOLERANT, FAST_FAILURE, HARD_FAIL, RELAXED_DEBUG, EXTREME_DEBUG). Please, check Circuit Breaker for more details.
FIXED Default error handler now returns JSON for 5xx server errors (consistent with 4xx responses) instead of a plain text message.
const response = await fetch(url); if (response.status >= 500) {- const text = await response.text();- console.error(text);+ const body = await response.json();+ console.error(body.message); }
CHANGED (Next.js only) Next@16 support
CHANGED Upgraded to Nuxt 4. All Nuxt-related packages now require Nuxt ^4.0.0.
CHANGED Improved error handling in middleware with better type safety and more reliable error responses. Error responses are now more consistent and predictable — if you're catching and handling errors from API calls, you may notice more detailed error information in 4xx responses (validation errors, not found errors, etc.), better structured error objects with proper error types, and improved error messages for authentication and token-related issues.
CHANGED The storefront-middleware app now uses ESM (ECMAScript Modules) instead of CommonJS.
ADDED (@alokai/connect) normalizeGraphQLError helper for normalizing GraphQL errors from any client (Apollo Client, urql, graphql-request) to HttpError. Maps GraphQL error codes to appropriate HTTP status codes and preserves error metadata. The normalizer is client-agnostic and works without requiring the graphql package as a dependency.
ADDED (@alokai/connect) withData method on HttpError class, useful for adding context to errors without reconstructing the entire error.
ADDED (@alokai/connect) New HTTP Client adapter types for error handling on the middleware layer.
ADDED (@alokai/cli) The alokai-cli store build command now accepts the --skip-compose flag.
ADDED (@vsf-enterprise/sapcc-types) ASM typings are now available in the sapcc-types package.
CHANGED (@alokai/connect) Allow headers to accept async functions and promised header objects.
CHANGED (@alokai/connect) The InferCustom type alias now falls back to Record<string, unknown> instead of object.
CHANGED (@vsf-enterprise/sapcc-api) Migrate to use axiosErrorAdapter from @alokai/middleware-axios-error-adapter.
CHANGED (@vsf-enterprise/magento-api) Migrate to use apolloErrorAdapter from @alokai/middleware-apollo-error-adapter.
CHANGED (@vsf-enterprise/contentstack-api) Contentstack normalizers now preserve original snake_case field names from the CMS instead of converting them to camelCase. This allows field names in the storefront to match your Contentstack schema, enabling use of auto-generated TypeScript types.
ADDED (@alokai/connect/integration-kit) defineIntegrationExtension factory for creating typed custom extensions with full type inference for API methods, hooks configuration, and extendApp.
ADDED (@vue-storefront/next) Runtime environment variable support via env() function. This replaces the next-runtime-env package with a built-in solution that automatically injects NEXT_PUBLIC_* environment variables into the client-side for runtime access. The new solution provides a unified env() function that works on both server and client, automatic injection of NEXT_PUBLIC_* variables via AlokaiProvider, no additional configuration or props needed, and supports runtime environment changes (e.g., in Alokai Console).
ADDED (@alokai/cli) Support for ni (package manager agnostic tool), enabling automatic detection and usage of the package manager configured in your project (npm, yarn, pnpm, or bun). This allows developers to use their preferred package manager while the CLI automatically adapts to the project's configuration.
CHANGED Refactored the ProductCardVertical component to accept the product prop directly, eliminating the need for prop drilling from ancestor components.
CHANGED (@alokai/connect) Changed lodash to lodash-es for better ESM compatibility.
ADDED Missing typescript devDependency in playwright app.
CHANGED (@alokai/connect/sdk) When using the middlewareModule, it no longer throws when trying to access a method by a non-string property name and returns undefined instead. This avoids errors in edge cases where React's built-in development hooks inspect SDK modules by accessing Symbol properties.
CHANGED Replaced .cursorrules and .windsurfrules with AGENTS.md in generated projects.
FIXED (@alokai/cli) CLI now detects the package manager binary path more reliably under Yarn Berry (Yarn 3/4).
CHANGEDcommitlint has been removed from generated projects.
FIXED Add typecheck step to generated project CI workflow.
FIXED (@alokai/connect) Fixed CONFIG type inference when providing extensions property in identify functions using the Integration interface. Previously, keyof typeof config.configuration.workflows resolved to string | number | symbol; now it correctly resolves to the literal union (e.g., "a" | "b" | "c").
CHANGED Replaced Rollup with tsdown for @vsf-enterprise and @alokai package builds.
FIXED (@vue-storefront/next) Security vulnerability fix for Next.js (CVE-2025-66478).
CHANGED (@vsf-enterprise/storefront-cli) Add --cwd flag to add-module command.
FIXED (@alokai/cli) Improved store composition performance by skipping excluded directories and parallelizing file copy operations.
FIXED (@alokai/cli) Improved error handling for missing ni commands. The CLI would throw a generic spawn nr ENOENT error when @antfu/ni was not found. It now provides a clear error message with instructions to install @antfu/ni as a dev dependency.
FIXED (@vsf-enterprise/module-kit) Fixed improper package.json path resolution when running the add-module command from @vsf-enterprise/storefront-cli.
CHANGED (@alokai/connect) Updated logger printer behaviour in dev mode. Logs are now printed in a single line as a formatted message instead of JSON.
FIXED (@alokai/connect) Fixed ESM module loading for integrations. The middleware now prefers ESM modules and falls back to CommonJS when ESM fails, with a warning log for debugging.
FIXED (@alokai/connect/sdk) SDK no longer crashes with "process is not defined" error when used with browser-first bundlers like Vite.
CHANGED Docker containers now use Node.js 22 instead of Node.js 18.
The SfCheckbox component is now wrapped in a label element by default. To comply with WCAG ARIA requirements, a label must not appear inside another label. Please update all instances where SfCheckbox is used within another label, for example:
Migrate any customizations from your tailwind.config.ts and your components using Tailwind upgrade guide.
Remove file tailwind.config.ts.
In every .vue component that uses Tailwind @apply directive add a line at the top of <style> block: @reference '@/assets/css/tailwind.css';
The SfCheckbox component is now wrapped in a label element by default. To comply with WCAG ARIA requirements, a label must not appear inside another label. Please update all instances where SfCheckbox is used within another label, for example:
The module's wrapper components handle this mapping automatically, so if you're using the standard RenderCmsContent component, no changes are needed for component rendering.
You can free up space by removing removing unnecessary tools and caches in continuous-delivery.yml workflow. In this case we're removing the Android SDK which is available by default in the Github runner.
steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0+ - name: Free up space in the actions runner+ run: sudo rm -rf /usr/local/lib/android
Increase max-old-space-size in the Deploy store step
FIXED Nuxt application now correctly loads environment variables when running yarn store start command. Previously, the Nuxt dev script in multistore configurations was not properly configured to load environment variables from .env files, causing the application to start without required environment variables. Now, the CLI ensures environment variables are correctly passed to the Nuxt dev process, enabling proper local development with all necessary configuration.
FIXED Resolved CommonJS module compatibility issue with pako library in Nuxt applications. Previously, Nuxt applications would fail to build or run due to the pako library being incompatible with the CommonJS module system, resulting in module resolution errors. Now, the pako library is properly configured to work with Nuxt's module system, allowing applications to build and run successfully. The issue was reported only in production builds, not in development mode.
FIXED version pinning in generated project package.json files. The following packages now use exact versions without ^ or ~ prefixes to prevent version mismatch issues that could block the upgrade command:
FIXED CLI now correctly passes environment variables to middleware dev script in multistore setup. Previously, environment variables set via cross-env were not properly propagated to all commands in the dev script pipeline, causing API_PORT to not be available during development. Now, all environment variables are correctly passed through to the entire dev command, ensuring proper configuration and consistent behavior across all development processes. Also, NODE_ENV=development is now correctly set alongside API_PORT, ensuring consistent behavior. It is no longer needed to set NODE_ENV=development in the dev script manually.
CHANGEDcontext.getApiClient() can now be called without arguments to return the current integration's API client, providing a convenient shorthand for self-referring. When called without arguments, the method now returns fully typed results based on the current integration's API, CONFIG, and CLIENT types, eliminating the need for manual type annotations.
import type { Endpoints } from "@vsf-enterprise/sapcc-api";import type { Endpoints as UnifiedEndpoints } from "@vsf-enterprise/unified-api-sapcc";// Before: Always required integration nameconst sapcc = await context.getApiClient("commerce");// After: Can be called without arguments for current integrationconst sapcc = await context.getApiClient();const product = await sapcc.api.getProduct({ id: "123" });// When using extension methods - provide generics for extensionsconst sapccWithExtensions = await context.getApiClient< Endpoints & { unified: UnifiedEndpoints }>();const unifiedProduct = await sapccWithExtensions.api.unified.getProductDetails({ id: "123",});
Note: When calling other integrations, you still need to pass the integration name as the first argument.
CHANGEDcontext.api became deprecated and will be removed in the next major version, to provide better type safety and consistency with the API client pattern.
// Before (deprecated)const product = await context.api.getProduct({ id: "123" });// After (recommended)const { api } = await context.getApiClient();const product = await api.getProduct({ id: "123" });
CHANGED Extensions typed as ApiClientExtension<Endpoints> must preserve the original method signatures when overriding built-in API methods, to ensure type safety and prevent runtime errors.
ADDED Type-safe data federation helper (typedApiClient.ts), enabling centralized type management when accessing multiple integrations from custom methods. This helper provides full IDE autocomplete and type checking when using getApiClient() to combine data from different sources (commerce, CMS, legacy systems) within a single function. All store templates now include this helper pre-configured with their respective integrations and extensions.
import { getTypedApiClient } from "@/integrations/typedApiClient";export async function getEnrichedProduct( context: IntegrationContext, params: { id: string },) { // Full type safety and autocomplete for both integrations const commerce = await getTypedApiClient(context, "commerce"); const cms = await getTypedApiClient(context, "cms"); const [product, content] = await Promise.all([ commerce.api.unified.getProductDetails({ id: params.id }), cms.api.getContent({ id: params.id }), ]); return { ...product, content };}
CHANGED Development mode terminal output now preserves watch logs history, preventing logs from being cleared on each recompilation to improve developer experience.
ADDED Centralized environment configuration loader in apps/storefront-middleware/src/config/env.ts, enabling better environment variable management. Loads .env files only in non-production environments, preventing accidental dotenv usage in production and enabling future schema validation.
ADDED@oclif/plugin-plugins dependency to @alokai/cli package, allowing the CLI to be extended with additional plugins for enhanced functionality.
ADDED Handling for streamed responses from 3rd party services, enabling real-time data processing and improved performance for large payloads.
ADDED Per-route body-parser configuration, allowing fine-grained control over request size limits for different endpoints.
ADDED Built-in POST request body compression mechanism in the middlewareModule of @alokai/connect/sdk, reducing network payload size and improving performance for large requests.
CHANGED CLI integration generate and extension generate commands now prevent execution if there is a version mismatch, preventing compatibility issues.
ADDED Metrics collection for request latency and error rate, enabling better monitoring and debugging of middleware performance.
FIXED Integration boilerplate config.ts now correctly points to transpiled JavaScript files instead of TypeScript source files. Previously, the boilerplate pointed to .ts files which caused runtime errors in production mode. Now it correctly references .js files from the transpiled lib directory, ensuring integrations work in both development and production modes.
FIXED Nested calls to context.getApiClient(). Previously, calling getApiClient() within another getApiClient() call would cause errors. Now nested calls work correctly, enabling more complex integration patterns.
FIXED CLI validation for integration names now allows numbers. Previously, the kebab-case validation rejected integration names containing digits (e.g., sf-b2b, integration-123). Now the regex correctly accepts alphanumeric characters in kebab-case format.
FIXED Workspace name conflict in alokai-cli upgrade command. Previously, the upgrade command would fail with "There are more than one workspace with name 'playwright'" error. Now the .out directory is properly cleaned during the upgrade process.
CHANGED AI Agent context files updated to improve the quality of responses related to the Alokai project, providing better assistance during development.
For existing customers who want to add the type-safe data federation pattern, create a typedApiClient.ts file in your middleware's integrations/ directory:
import type { ApiClient } from "@alokai/connect/middleware";import type { YourIntegrationContext } from "@vsf-enterprise/your-integration-api";import type { Endpoints as UnifiedEndpoints } from "@vsf-enterprise/unified-api-your-integration";import type { IntegrationContext } from "@/types";interface IntegrationContextMap { commerce: { context: YourIntegrationContext; extensions: { unified: UnifiedEndpoints; // Add other namespaced extensions here }; }; // Add other integrations here}export async function getTypedApiClient< TKey extends keyof IntegrationContextMap,>( context: IntegrationContext, key: TKey,): Promise< ApiClient< IntegrationContextMap[TKey]["context"]["api"] & IntegrationContextMap[TKey]["extensions"], IntegrationContextMap[TKey]["context"]["config"], IntegrationContextMap[TKey]["context"]["client"] >> { return context.getApiClient(key);}
CHANGEDdeploy command of @alokai/cli now pushes the information about the Alokai version used in the project, to provide better visibility and tracking in the Alokai Console.
ADDEDalokai lint command that provides a unified way to run linting across the entire project, including both applications and stores. This command introduces graceful error handling, unified linting for all applications via Turbo, auto-fix support, flexible filtering, enhanced error reporting, and silent mode for integration use.
# Run lint for entire projectalokai lint# Run lint with auto-fixalokai lint --fix# Run lint with custom filteralokai lint --filter=packages/my-package# Exclude multiple patternsalokai lint --filter='!packages/excluded !apps/test'
ADDEDalokai version command that allows you to check the version of your Alokai project, update the version field in package.json files, and be informed about possible upgrades. This command provides centralized version management across the entire project.
yarn alokai version# Example output:# The project is running on Alokai version: 1.3.0# Versions in package.json files updated successfully.# You are running the latest Alokai version.
ADDEDalokai version upgrade command that allows users to upgrade their dependencies to the next Alokai version. This command automates the upgrade process for better version management. It only upgrades dependencies of minor and patch Alokai versions.
yarn alokai version upgrade
CHANGED Error handling for @alokai/cli package installation failures has been improved to provide user-friendly error messages for package authentication and not found errors, replacing generic error messages with specific guidance for Alokai package authentication problems.
CHANGED Next.js base metadata have been moved from app/[locale]/layout.tsx to config/metadata.ts, to enable more granular control over metadata in child stores and allow metadata overrides without modifying the layout component.
ADDED Support for --cwd flag and ALOKAI_CWD environment variable to run Alokai CLI commands from non-root directories. This enhancement allows users to execute Alokai CLI commands from any directory by specifying the project root.
# Using --cwd flagalokai-cli store build --cwd=./path/to/alokai/project# Using environment variableALOKAI_CWD=./path/to/alokai/project alokai-cli store build
FIXED Security vulnerability fixes across multiple packages in @alokai/connect. Previously, there were 40 vulnerabilities (23 Low, 8 Moderate, 2 High, 7 Critical). Now there are 24 vulnerabilities (22 Low, 2 Moderate, 0 High, 0 Critical), representing a 40% reduction in total vulnerabilities with all critical and high severity issues resolved.
CHANGED--verbose flag default value for dev command from false to true, to provide more detailed output during development by default and improve debugging experience.
FIXEDdeployment-workflow.yml now properly passes verbose flag to the command. Previously, the verbose flag was not being passed correctly, causing deployment workflows to run without detailed output when expected.
ADDED Prerequisites section to integration template README instructions that includes instructions for installing required dev dependencies and enhanced documentation structure with proper AI-driven vs manual setup sections. This improves the developer experience when creating new integrations.
FIXED Typo in integration template default value. Previously, the integration generate command used incorrect default template value resti-api, now it correctly uses rest-api.
CHANGED Turborepo filter descriptions in store commands have been improved to provide clearer guidance on how to use Turborepo package filters, replacing vague descriptions with specific examples and use cases.
CHANGED@alokai/connect dependency has been removed from root package.json file to avoid duplication, as it's already present in the apps/**/package.json files where it's actually needed.
FIXED Single store deployment framework auto detection. Previously, calling the command without framework flag caused a TypeError with "paths[1]" argument being undefined. Now the framework is properly auto-detected.
FIXEDX-Frame-Options header has been set to DENY by default, which prevents the site from being embedded in iframes. This will block features like live preview in some CMS systems (Contentful).
To control iframe embedding, update the Next.js middleware:
+ type Header = {+ key: string;+ value: string;+ }++ /**+ * Headers to set for every response+ */+ const responseHeaders: Header[] = [+ /*+ * NOTE: The X-Frame-Options header below prevents the site from being embedded in iframes,+ * which blocks features like live preview in CMS systems (Contentful, Amplience, etc.).+ * To enable live preview functionality, you may need to remove or modify this header.+ * See the CMS module documentation for specific configuration steps.+ */+ env('NEXT_PUBLIC_DISABLE_X_FRAME_OPTIONS_HEADER') !== 'true' && {+ key: 'X-Frame-Options',+ value: 'DENY',+ },+ ].filter((header): header is Header => !!header);++ export default createAlokaiMiddleware(async (request) => {+ // ...+ for (const header of responseHeaders) {+ response.headers.set(header.key, header.value);+ }+ //...
Now, by default the X-Frame-Options header is set to DENY, which prevents the site from being embedded in iframes. To enable live preview functionality in some CMS systems, you need to set the NEXT_PUBLIC_DISABLE_X_FRAME_OPTIONS_HEADER environment variable to true.
If you are struggling with running integration tests with yarn store test, because the middleware app is not build before tests start, make sure to update your turbo.json file:
[FIX] Fix extension generation failing with ENOENT error when creating unified-commerce extensions
Fixed an issue where generating extensions using alokai-cli extension generate command would fail with "ENOENT: no such file or directory" error when trying to rename the middleware directory during the extension creation process.
ADDED Templates for integration boilerplates. Now, the developers are able to generate boilerplates for integrations based on the OpenAPI, GraphQL, REST API, proxied SDKs with extensions to unifiy both commerce and CMS integrations. More information can be found in the docs.
ADDED Auto-imports for the Nuxt are now fully supported and will be automatically generated when the store is synced during the dev process or when the store is composed.
CHANGED Watch mode for dev will be now little bit more verbose, so the developer can easily tell when the process of synchronizing data is finished.
CHANGED Enabled Typescript shim for *.vue files in nuxt.config.ts.
CHANGED Turned CMS Mock integration into a separate Storefront Module and moved its code to the @/sf-modules/cms-mock directory in all Storefront apps.
CHANGED Changed CMS Mock module key in storefront-middleware/middleware.config.ts from cms to cms-mock. Updated the corresponding SDK module accordingly.
CHANGED Deprecated the useCmsPage composable in favour of the new ConnectCmsPage wrapper in storefront-unified-nuxt.
CHANGED Re-exported RenderCmsContent and ConnectCmsPage wrappers from @/components/cms/wrappers/index.ts for easier maintenance of CMS-enhanced pages (e.g. PDP and PLP).
CHANGED Moved interfaces describing dynamic content of CMS-only and CMS-enhanced pages to the @/sf-modules/<module_name>/types/index.ts file and re-exported them from the @/types/cms.ts file.
CHANGED Renamed Unified SDK modules registered by CMS Modules to allow for using multiple CMS modules in a single Storefront. Instead of sdk.unifiedCms, every CMS module is now registering its own namespace:
CMS Module
Unified SDK Namespace
cms-amplience
sdk.unifiedAmplience
cms-bloomreach-content
sdk.unifiedBloomreachContent
cms-builderio
sdk.unifiedBuilderio
cms-contentful
sdk.unifiedContentful
cms-contentstack
sdk.unifiedContentstack
cms-mock
sdk.unifiedCmsMock
cms-smartedit
sdk.unifiedSmartedit
cms-storyblok
sdk.unifiedStoryblok
Unified SDK modules files added to the Storefront by CMS modules have been renamed accordingly:
CHANGED AI contexts to be more framework and integration specific. Now, Next.js projects are going to include only Next-related context, and the same for Nuxt. The same rule applies to integrations.
FIXED Random 404 errors on CMS pages using Contentstack Live Preview feature.
The changes described in this migration guide are recommended for developers intending to use multiple CMS modules in their project - either now, or in the future. For other projects, the changes should be considered optional.
Replace useCmsPage composable with the ConnectCmsPage wrapper
::tabs{:titles='["Next", "Nuxt"]'}
#tab-1
No changes required.
#tab-2
If your CMS module is using the useCmsPage composable and a LivePreview.vue component, replace them with a single generic ConnectCmsPage wrapper. The wrapper should feature both the content fetching logic of the useCmsPage composable and the live-preview-enabling capabilities of the LivePreview.vue component. See the below Contentful example for reference.
<details>
<summary>Click to show the code</summary>
Re-export CMS module components from the @/sf-modules directory
::tabs{:titles='["Next", "Nuxt"]'}
#tab-1
If your connectCmsPage and RenderCmsContent components are located in the @/components/cms/wrappers directory, move them to the @/sf-modules/<module_name>/components directory and re-export them from there:
export { default as connectCmsPage } from '@/sf-modules/<module_name>/components/connect-cms-page';export { default as RenderCmsContent } from '@/sf-modules/<module_name>/components/render-cms-content';
Second, ensure the components are re-exported from the @/components/cms/wrappers directory:
export * from '@/sf-modules/<module_name>/components';
Finally, ensure the components are properly imported by pages that use them:
import { connectCmsPage, RenderCmsContent } from '@/components/cms/wrappers';
#tab-2
If your ConnectCmsPage and RenderCmsContent components are located in the @/components/cms/wrappers directory, move them to the @/sf-modules/<module_name>/components directory and re-export them from there:
export { default as connectCmsPage } from '@/sf-modules/<module_name>/components/ConnectCmsPage/ConnectCmsPage.vue';export { default as RenderCmsContent } from '@/sf-modules/<module_name>/components/RenderCmsContent/RenderCmsContent.vue';
Second, ensure the components are re-exported from the @/components/cms/wrappers directory:
export * from '@/sf-modules/<module_name>/components';
Finally, ensure the components are properly imported by pages that use them:
<script setup lang="ts">import { RenderCmsContent, ConnectCmsPage } from '@/components/cms/wrappers';</script>
::
Move dynamic pages interfaces to the @/sf-modules directory
::tabs{:titles='["Next", "Nuxt"]'}
#tab-1
First, create the @/sf-modules/<module_name>/types/index.ts file and move there:
all interfaces describing dynamic CMS content from your pages in the apps/storefront-unified-nextjs/app directory (including PLP & PDP),
the PropsWithCmsPage page interface from the @/sf-modules/<module_name>/components/connect-cms-page.tsx file
Second, re-export the interfaces from the @/types/cms.ts file:
export type * from '@/sf-modules/<module_name>/types';
Finally, ensure the moved interfaces are properly imported by pages that use them:
import type { CategoryPage, PropsWithCmsPage } from '@/types/cms';
#tab-2
First, create the @/sf-modules/<module_name>/types/index.ts file and move there all interfaces describing dynamic CMS content from your pages in the apps/storefront-unified-nextjs/app directory (including PLP & PDP):
Rename the UnifiedCmsEndpoints interface
First, in the main types.ts file, find export statements refering to your CMS module and replace them with a single export all statement:
export type { UnifiedCmsEndpoints } from '@sf-modules-middleware/<module-name>';export type { Endpoints as CmsModuleEndpoints } from '@vsf-enterprise/<cms>-api';export * from '@sf-modules-middleware/<module_name>';
Second, rename and re-export everything from the types.ts file of your CMS module:
export type { UnifiedEndpoints as UnifiedCmsEndpoints } from '@vsf-enterprise/<cms>-api';export type { Endpoints as CmsModuleNameEndpoints UnifiedEndpoints as UnifiedCmsModuleNameEndpoints } from '@vsf-enterprise/<cms>-api';
Update the unifiedCms SDK module
::tabs{:titles='["Next", "Nuxt"]'}
First, rename the @/sdk/modules/unified-cms.ts file, update the UnifiedCmsEndpoints import and the unifiedCms key.
#tab-1
import { defineSdkModule } from '@vue-storefront/next';import type { UnifiedCmsEndpoints } from 'storefront-middleware/types'; // [!code --]import type { UnifiedCmsModuleNameEndpoints } from 'storefront-middleware/types'; // [!code ++]export const unifedCms = defineSdkModule(() => { /* */ }); // [!code --]export const unifedCmsModuleName = defineSdkModule(() => { /* */ }); // [!code ++]
Second, update the corresponding export path in the SDK modules barrell file:
export * from "@/sdk/modules/unified-cms" // [!code --]export * from "@/sdk/modules/unified-cms-module-name" // [!code ++]
#tab-2
First, rename the @/sdk-modules/unified-cms.ts file, update the UnifiedCmsEndpoints import and the unifiedCms key.
Now query is being stored within search params instead of cookies, which fixes a random 404 errors on CMS pages after using Contentstack's live preview. To fix live preview in Contentstack:
Update the @vsf-enterprise/contentstack-api and @vsf-enterprise/contentstack-sdk following the compatibility matrix.
Pass searchParams to sdk.unifiedContentstack.getPage call:
ADDED A capability to monitor page views in the storefront apps.
ADDED Support for ignorePaths field handling in alokai.config.json.
CHANGED Deployable stores are now recognised by the fact they have "deployable" field instead of config at all, so that template stores can be parametrised in alokai.config.json.
CHANGED The @alokai/connect/config-switcher now supports using no header with the extension, defaulting to the default value when no header is provided.
ADDED Adds "userAlreadyExists" error handling to nuxt register-b2b module.
ADDED Add rename command used to change store id. Example usage:
alokai-cli store rename --store-id sapcc-b2c --new-store-id sapcc-my-brand
ADDED Add integration generate command for generating integration boilerplate code. Example usage:
alokai-cli integration generate myIntegration
ADDED Added store lint command.
ADDED Alokai CLI's build, dev, start and test commands now support the --turbo-option flag for passing custom options when running a Turbo task.
CHANGED Replaced relative imports with aliased imports in Storefront apps: playwright, storefront-middleware and storefront-unified-[nuxt|nextjs].
CHANGED The prepare script in the base Nuxt app now runs alokai-cli store prepare command after nuxt prepare by default.
CHANGED The @vue-storefront/nuxt module now injects value of NUXT_PUBLIC_ALOKAI_VERSION environment variable into appConfig.
CHANGED Generation of tsconfig files. Previously, apps had private configuration that was replicated in each store. Now shared configuration will be inherited from the root config, reducing duplication and improving maintainability. Example:
- import { confg as cmsConfig } from './integrations/cms-mock';+ import { config as cmsConfig } from '@/integrations/cms-mock';
CHANGED The store prepare command of @alokai/cli now generates the include array in store-specific tsconfig.json files to comply with the stricter file inclusion requirements enforced by the compilerOptions.composite: true setting.
CHANGEDlint and lint:fix scripts in generated project. Now they lint stores directory as well.
CHANGED add missing dist directory to instrumentation npm packages and updated those packages:
@alokai/instrumentation-next-component@1.0.0
@alokai/instrumentation-nuxt3-module@1.0.0
@vue-storefront/next@6.1.0
@vue-storefront/nuxt@9.1.0
FIXED Removed the dotenv library from @alokai/connect/logger to allow using it in React Native projects.
FIXED Fixed Typescript errors in the /apps/stores/default/storefront-unified-nuxt app by adding proper paths configuration in the /apps/stores/default/storefront-unified-nuxt/tsconfig.json file. To add the required paths configuration in your stores' Nuxt apps, run Alokai CLI's store prepare command from the root of your repository:
yarn store prepare --all
FIXED Hydration warnings in the storefront-unified-nuxt application.
FIXED Fixes register-b2b playwright test suite.
FIXED Add autogenerated tsconfig.json (create in substores) to .gitignore.
FIXED Move data-testid to <SfModal> element. To migrate update the file apps/storefront-unified-nextjs/sf-modules/register-b2b/components/success-b2b-register-modal.tsx:
FIXED Removes duplicated email input in file apps/storefront-unified-nuxt/components/RegisterForm/RegisterForm.vue
FIXED Add missing "prettier" devDependency to storefront-unified-nextjs app. This change will be needed for upcoming Yarn 4 migration. To migrate, add following line to apps/storefront-unified-nextjs/package.json:
FIXED Paths to files for AI contexts. Previously they were pointing to non-existing directories. Now they point to the proper ones.
FIXED Adds fixes to re-order module. To apply them in an existing storefront, update apps/storefront-unified-nuxt/components/CartPageProductCard/CartPageProductCard.vue file:
- defineProps<{+ const props = defineProps<{
FIXED Adds fixes to register-b2b module. To apply them in an existing storefront, remove duplicated lines in script section of apps/storefront-unified-nuxt/components/RegisterForm/RegisterForm.vue file:
:::warning
Before starting the migration, please update all the dependencies to the compatible versions based on the compatibility matrix.
:::
Update the root package.json version to 1.1.0.
To monitor page views in the storefront apps, see Instrumentation guide.
If you have stores with configs that you wish to keep as non templates and they don't have deployment field, you can add the field to the alokai.config.json file.
Add storefront-middleware as a Project Reference in your storefront-unified-[nuxt|nextjs] apps
Since storefront-middleware is a composite project, it can be added as a Typescript Project Reference by other apps in your repository. This is required for proper resolution of absolute imports within storefront-middleware in storefront-unified-[nuxt|nextjs] apps.
Ensure storefront-middleware build before running in dev mode
Since storefront-unified-[nuxt|nextjs] apps now depend on storefront-middleware as a Project Reference, make sure storefront-middleware is built before running your apps in dev mode to avoid type errors.
From the root of your repository, run the alokai-cli store prepare command to automatically update tsconfig.json files in stores:
yarn store prepare --all
In a Nuxt app, this command should be run every time you run nuxt prepare. We recommend adding it to the prepare script in your Nuxt app's package.json:
{ "scripts": {- "prepare": "nuxt prepare"+ "prepare": "nuxt prepare && cd ../.. && yarn store prepare --all --app-type=nuxt" }}
And you can add tsconfig.json for Nuxt app to the root .gitignore file.
In the root package.json file, add the following linting scripts:
{ "scripts": { "lint": "turbo run lint --filter=\"!./out/**\" && yarn store lint --all", "lint:fix": "turbo run lint:fix --filter=\"!./out/**\" && yarn store lint --all --fix" }}
Use eslint to auto-replace relative imports with absolute ones
The final step is allowing eslint to automatically replace relative imports in your apps with absolute ones. Lint-fix your base apps and stores by running the lint:fix script from the root of your repository:
yarn lint:fix
Make sure the script finishes successfully and commit the files automatically fixed by eslint.
If you experience issues when running the above script, try to resolve version of eslint dependency in the root package.json of your project. We recommend trying version 9.23.0.
\{ "resolutions": \{+ "eslint": "9.23.0" \},\}
Make #test:integration turbo tasks dependent on storefront-middleware build
When running integration tests with playwright (either in a headless mode using the test:integration script or in a headed mode using the test:integration:ui script), make sure that the storefront-middleware build is completed first. This is now a requirement since the storefront-middleware app is a composite project referenced by storefront-unified-[nuxt|nextjs] apps.
To add the dependency, in the turbo.json file, update your base app tasks configuration:
FIXED Version field in generated project package.json. Previously, the version field in generated project package.json was incorrectly set to @alokai/ecosystem@1.0.1 instead of just 1.0.1. Now, the version field now correctly shows just the version number (e.g., 1.0.1) as expected.
CHANGED Updated the package for compatibility with Node.js 22.
CHANGED Updated the enterprise registry to npm.alokai.cloud.
CHANGED Updates to SDK and frontend apps. Now, every sdk request should contain x-alokai-locale header instead of vsf-locale cookie. This change is important in CDN support, as we cannot pass cookies to the CDN.
CHANGED Replaced core dependencies with a new @alokai/connect package. @vue-storefront/middleware, @vue-storefront/sdk, vue-storefront/logger, vue-storefront/unified-data-model, @vue-storefront/multistore were replaced with @alokai/connect. The replacement preserves the same functionality and interface as the original packages.
CHANGED The @vue-storefront/multistore package has been renamed to @alokai/connect/config-switcher. If you were using the multistore functionality, you'll need to update your code to use the new package.
ADDED Module-based SDK configuration with defineSdkModule and enhanced defineSdkConfig in @vue-storefront/nuxt. This new approach allows for better code organization and reusability of SDK modules. Before, all modules were defined inline in the config file. Now, you can extract them to separate files.
ADDEDcreateAlokaiMiddleware to @vue-storefront/next - a wrapper for a Next.js middleware which registers the Alokai-specific logic.
Example usage
// apps/storefront-unified-nextjs/middleware.tsimport { createAlokaiMiddleware } from "@vue-storefront/next";export default createAlokaiMiddleware(async (request) => { // your middleware logic});
ADDED to @vue-storefront/nextgetPathnameFromRequestHeaders function which allows getting pathname from the request headers during the server side rendering. It requires createAlokaiMiddleware to be used in the middleware.ts file.
ADDEDgetConfigSwitcherHeader to defaultRequestConfig in the middlewareModule of @alokai/connect/sdk. It allows setting the x-alokai-middleware-config-id header on the Storefront side for the Config Switcher extension.
ADDED New feature for the middleware app. Now, for every request, the middleware will convert the x-alokai-locale header into vsf-locale cookie. This change is important in CDN support, as we cannot pass cookies to the CDN.
The feature can also be implemented in the projects that are NOT using @alokai/connect package, by adding an extension to each registered integration:
Install @alokai/cookies-bridge package:
yarn add @alokai/cookies-bridge
Add the extension to the integration configuration:
// Only in projects that are NOT using `@alokai/connect` package.+ import { createCookiesBridgeExtension } from "@alokai/cookies-bridge";+ const cookiesBridgeExtension = createCookiesBridgeExtension([{+ header: 'x-alokai-locale',+ cookie: 'vsf-locale',+ }]);export const config = {configuration: { // ...}extensions: (extensions: ApiClientExtension[]) => [+ cookiesBridgeExtension, ...extensions, unifiedApiExtension, cdnExtension, ...(IS_MULTISTORE_ENABLED === 'true' ? [configSwitcherExtensionFactory()] : []),],};
Note: The extension should be added as first in the extensions list, as it should be executed before any other extension.
In some projects, the middleware configuration might be placed in middleware.config.ts file, but implementation is the same.
ADDED Added a way to pass playwright test options in Alokai CLI through the --playwright-options (-p) flag in the store test command.
alokai-cli store test --playwright-options="--project=nuxt-desktop --headed"
CHANGED The maximum file upload size limit has been increased to 20MB.
CHANGED Updated the express version to ^4.20.0 to fix security vulnerabilities. See more in GitHub Vulnerability Alert.
FIXED Fixed randomly failing integration tests when running them for multiple stores using the store test command. The issue was due to tests running in parallel through Turbo's pipeline. From now on, when running tests for multiple stores (using the --all flag or passing an array of store IDs via the --store-id flag), the tests will be run for each store consecutively.
FIXED Issue with jw-paginate on cart page in Nuxt storefront. Previously, it was throwing a SyntaxError: The requested module '/node_modules/jw-paginate/lib/jw-paginate.js?v=5a45ef3c' does not provide an export named 'default' error. Now, it is fixed by adding jw-paginate to the optimizeDeps.include config in nuxt.config.ts.
Update your Next application to use the new x-alokai-locale header instead of the vsf-locale cookie.
:::info
The changes below are only relevant for Next apps. If you are using Nuxt, you can skip this section.
:::
Step 1: Update the storefront-unified-nextjs/sdk/index.ts file to pass current locale into SDK instance:
+import { getLocale as nextIntlGetLocale } from 'next-intl/server';import { getSdk as getUniversalSdk } from './sdk.server';/*** A dedicated function to get the SDK instance on the server side.* You can import it in React Server Components, Middleware, Route Handlers.*/-export const getSdk = () =>+export const getSdk = async ({ getLocale = nextIntlGetLocale } = {}) => {- getUniversalSdk({+ const locale = await getLocale();+ return getUniversalSdk({+ getLocale: () => locale,+ getRequestHeaders: () => ({+ cookies: cookies(),+ headers: headers(),+ }),+ });+};
:::warning
If you're using SDK directly in a destructuring pattern like this: const { products } = getSdk().unified.getProducts({ skus });, you should first assign the resolved sdk to a variable:
Use @alokai/connect package instead of @vue-storefront/middleware, @vue-storefront/sdk, vue-storefront/logger, vue-storefront/unified-data-model, @vue-storefront/multistore packages.
In this guide, we'll walk you through the process of migrating from the legacy packages to the new @alokai/connect package. This migration guide is designed to help you transition smoothly and take advantage of the new features and improvements in the @alokai/connect package.
Update packages/tailwind-config/src/nuxt.ts. Please remember to run yarn build:packages after modifying packages dir.
Interfaces of packages did not change, so you can expect the same names, methods, and behavior as before.
The @vue-storefront/multistore package has been renamed to @alokai/connect/config-switcher. You can use the new package to switch between different store configurations at runtime.
Some functions were moved to the @alokai/connect/integration-kit package. Be sure to import them from the correct package. You can think about integration-kit as a place for all utilities related to creating new integrations.
Functions moved from @vue-storefront/middleware:
apiClientFactory
Functions moved from @vue-storefront/unified-data-model:
validatePassword
unifiedExtensionFactory
createUnifiedCmsExtension
getNormalizers
assignToNormalizerContext
mergeNormalizers
getApiDefinitions
defineAddCustomFieldsFactory
toContextualizedNormalizers
All other functions remain in their respective packages.
All types related with moved functions are also moved to the @alokai/connect/integration-kit package.
Data models and unified methods declarations are now part of the root @alokai/connect package.
Migration steps:
Step 1: Install the new package.
Navigate to your storefront-unified-<framework> and storefront-middleware apps and install the new package:
# Using yarnyarn add @alokai/connect# Using pnpmpnpm add @alokai/connect# Using npmnpm install @alokai/connect
Step 2: Remove the legacy packages
Navigate to your storefront-unified-<framework> remove the legacy packages:
yarn remove @vue-storefront/sdk
Then, navigate to your storefront-middleware app and remove the legacy packages:
yarn remove @vue-storefront/middleware
If you are using @vue-storefront/unified-data-model or @vue-storefront/logger in your project, you need to remove them as well.
Find all imports of the legacy packages in your project and update them to import from the new @alokai/connect package. For example:
- import { createApiClient } from "@vue-storefront/middleware";+ import { createApiClient } from "@alokai/connect/integration-kit";- import { createLogger } from "@vue-storefront/logger";+ import { createLogger } from "@alokai/connect/logger";
Step 4: Update your code
Review your codebase and update any references to the legacy packages. Make sure to test your application thoroughly to ensure that everything works as expected. Because of the functional equivalence between the legacy and new packages, you should not encounter any breaking changes.
Migrate from @vue-storefront/multistore to @alokai/connect/config-switcher
::info
This section is only relevant if you were using the @vue-storefront/multistore package in your project. If you weren't using multistore functionality, you can skip this section.
::
Step 1: Update your imports
- import { createMultistoreExtension } from "@vue-storefront/multistore";+ import { createConfigSwitcherExtension } from "@alokai/connect/config-switcher";
Step 2: Update your configuration file
Rename the multistore.config.ts file to configSwitcher.config.ts and update the imports to import from the new @alokai/connect/config-switcher package.
:::info Configuration Merging
The new package automatically handles configuration merging, so you no longer need to implement the mergeConfigurations method. The base configuration for your integration is automatically deep-merged with the store-specific configuration.
:::
Step 4: Remove old files
You can now remove the apps/storefront-middleware/multistore directory, as it won't be needed anymore.
Update the app bootstrapping in apps/storefront-middleware/src/index.ts
import { createServer, type CreateServerOptions,} from "@alokai/connect/middleware";import { config } from "../middleware.config";const developmentCorsConfig: CreateServerOptions["cors"] = { credentials: true, origin: true,};const port = Number(process.env.API_PORT) || 4000;runApp();async function runApp() { const app = await createServer(config, { cors: process.env.NODE_ENV === "production" ? undefined : developmentCorsConfig, }); app.listen(port, "", () => { console.log(`API server listening on port ${port}`); });}
Remove multistore:dev script from apps/storefront-middleware/package.json.
Step 5: (Optional) Set up caching
The new package includes built-in caching with a configurable TTL, so you no longer need to implement the cacheManagerFactory method. By default, configurations are cached for 10 seconds, but you can adjust this by setting the cacheTTL parameter:
Use Node.js version 22.14.0 or higher for optimal performance, security, and compatibility. While Node.js 20 is technically supported, it is not recommended as it may cause compatibility issues with certain packages and has not been thoroughly tested.
Step 1: Update your .nvmrc or .node-version file to 22.14.0
- 18.17.1+ 22.14.0
Step 2: Upgrade @types/node to version ^22.13.17 for compatibility with the latest Node.js features.
CHANGED In both @vue-storefront/next and @vue-storefront/nuxt, the config parameter available in the callback passed to defineSdkConfig() no longer contains computed middlewareUrl property. It now exposes apiUrl and ssrApiUrl that should be used instead. Read the migration guides for this Storefront version to see examples of using apiUrl and ssrApiUrl in your SDK configuration files. This change is necessary to support custom domain setup OOTB.
CHANGED Storefronts has been update to be compliant with the European Accessibility Act (EAA) and Web Content Accessibility Guidelines (WCAG) 2.1 AA.
ADDED Multistore capabilities with shared configuration packages
To migrate your existing project to the new multistore setup, follow the multistore migration guide. Your Alokai Solution Architect can help you with the migration process.
:::info
The changes below are only relevant for Next apps. If you are using Nuxt, you can skip this section.
:::
Update environment variables
In the apps/storefront-unified-nextjs/sdk/options.ts file, verify the NEXT_PUBLIC_ALOKAI_MIDDLEWARE_SSR_API_URL environment variable exists:
const ssrApiUrl = env('NEXT_PUBLIC_ALOKAI_MIDDLEWARE_SSR_API_URL');+ if (!ssrApiUrl) {+ throw new Error('NEXT_PUBLIC_ALOKAI_MIDDLEWARE_SSR_API_URL is required to run the app');+ }
Also, make sure the environment variable is added to the apps/storefront-unified-nextjs/.env.example file and - if it exists - the apps/storefront-unified-nextjs/.env file:
remember to reinstall the dependencies of your project with the yarn install command afterwards.
Update SDK configuration file
Update your SDK configuration file (apps/storefront-unified-nextjs/sdk/config.ts) so that registered modules use apiUrl and ssrApiUrl properties instead of middlewareUrl.
Make sure the NUXT_PUBLIC_ALOKAI_MIDDLEWARE_SSR_API_URL environment variable is added to the apps/storefront-unified-nuxt/.env.example file and - if it exists - the apps/storefront-unified-nuxt/.env file:
remember to reinstall the dependencies of your project with the yarn install command afterwards.
Update SDK configuration file
Update your SDK configuration file (apps/storefront-unified-nuxt/sdk.config.ts) so that registered modules use apiUrl and ssrApiUrl properties instead of middlewareUrl.
ADDED Alokai ecosystem versioning: Each release of a core package now includes a version bump for the entire ecosystem, simplifying tracking of changes and ensuring compatibility between packages. Core packages include:
@vue-storefront/middleware
@vue-storefront/multistore
@vue-storefront/unified-data-model
@vue-storefront/sdk
@vue-storefront/nuxt
@vue-storefront/next
Compatibility matrix for the entire ecosystem is available here.
CHANGED@vue-storefront/nuxt version updated to v7.0.0.
CHANGED from now on getSdk is available instead of sdk property on global NuxtApp.$alokai object.
CHANGED You should now ensure that environment variables NEXT_PUBLIC_ALOKAI_MIDDLEWARE_SSR_API_URL (for Next.js apps) and NUXT_PUBLIC_ALOKAI_MIDDLEWARE_SSR_API_URL (for Nuxt apps) are set in your file both locally and in your deployed application.
FIXED Nuxt App - useLazyProduct composable merged product data wrongly.
FIXED Nuxt App - localization plugin need to set locale cookie directly in the plugin initialization.
FIXED Next App - the initial page load with a locale in the URL, different from the previously set one, now correctly fetches data in the right language from the server.
Set the NEXT_PUBLIC_ALOKAI_MIDDLEWARE_SSR_API_URL environment variable to http://additional-app-middleware:4000 in your deployed application.
Use cookies from next/headers in your getSdk function to fix the issue with the initial page load with a locale in the URL, different from the previously set one.
Running the yarn lint command might result in errors caused by the custom extension in the Storefront Middleware app. If that is the case in your project, in the apps/storefront-middleware/api/custom-methods/custom.ts file disable the following eslint rule on line 1:
+ /* eslint-disable @typescript-eslint/no-unused-vars */import { type IntegrationContext } from '../../types';import type { CustomMethodArgs, CustomMethodResponse } from './types';
Running the yarn lint command might result in errors caused by the Typescript configuration files in the Nuxt Storefront and Storefront Middleware apps. If that is the case in your project, add new lines at the end of the apps/storefront-unified-nuxt/tsconfig.json and apps/storefront-middleware/tsconfig.json files.