1.0
a new registry host, a Node 20/22 floor, and @alokai/connect in place of five core packages
Showing every integration. Set your stack in Preferences and this page hides what isn't yours.
20.* || >=22.14.0Three changes block the upgrade before you change any code. Node 18 can't install this release, enterprise packages come from a new registry host, and the five @vue-storefront/* core packages are gone in favour of @alokai/connect. That last change alone is why every published package in 1.0.0 takes a major version, so a long version table here doesn't mean a long list of API changes. Read the locale change next: the locale moves from the vsf-locale cookie to an x-alokai-locale header, and that changes server-side code in both storefronts.
The two patches after 1.0.0 are small, but one of them isn't optional. If you installed a CMS or search module on 1.0.0, the install wrote release-candidate vendor pins into your own app manifests. 1.0.1 corrects those pins for new installs, but only you can correct the copies already in your manifests.
Highlights
Node 18 no longer installs - the floor is Node 20, and 22.14 in practice
@alokai/cliEvery published package checks the Node version on install, so your runtime decides whether you can take anything else in this release.
The root manifest's engines.node moves from ^18 to 20.* || >=22.14.0. The published packages move their own engines.node from >=18 to the same range - @alokai/connect, @alokai/cli and @vsf-enterprise/sapcc-api among them. The release also expects @types/node at ^22.13.17 and .nvmrc / .node-version at 22.14.0.
On Node 18 the install is refused, so nothing else in this release reaches you until you move the runtime. Node 20 satisfies the range, but the release records it as untested and doesn't recommend it, so move to 22.14.0 or higher. Update every CI job that pins a Node version too - otherwise the pipeline fails on the same engine check.
See the step in the upgrade guide →Enterprise packages now come from npm.alokai.cloud
A project that still points at the old registry host can't resolve any @alokai or @vsf-enterprise version in this release. The error looks like a missing package, not a registry change.
.npmrc maps the @vsf-enterprise: and @alokai: scopes to https://npm.alokai.cloud, replacing https://registrynpm.storefrontcloud.io.
Point .npmrc at the new host and log in against it before you install - your stored credentials belong to the old host. Until you do, none of this release's @alokai and @vsf-enterprise versions resolve, so the install fails before any code change matters.
Five @vue-storefront/* core packages collapse into one - @alokai/connect
@alokai/connect@vue-storefront/next@vue-storefront/nuxtAlokai's core shipped as five separate @vue-storefront/* packages. They become one package, and only the packaging changes - the names, signatures and behaviour stay the same.
@alokai/connect and its subpaths replace @vue-storefront/middleware, @vue-storefront/sdk, @vue-storefront/logger, @vue-storefront/unified-data-model and @vue-storefront/multistore. The subpaths are @alokai/connect/middleware, @alokai/connect/sdk, @alokai/connect/logger, @alokai/connect/integration-kit and @alokai/connect/config-switcher. The data models and the unified method declarations are at the @alokai/connect root.
Ten symbols and their types are on @alokai/connect/integration-kit, not on the root: apiClientFactory, validatePassword, unifiedExtensionFactory, createUnifiedCmsExtension, getNormalizers, assignToNormalizerContext, mergeNormalizers, getApiDefinitions, defineAddCustomFieldsFactory and toContextualizedNormalizers.
@alokai/connect itself is at 1.0.0. Every published integration, SDK and storefront package in this release is rebuilt against it, which is why all 62 of them take a major version.
The old package names aren't installable any more, so an untouched project doesn't build until you repoint every import. For most imports that's a find-and-replace. Multistore is the exception - its configuration changes shape, and it has a highlight of its own.
See the step in the upgrade guide →Multistore becomes the config switcher, and its configuration changes shape
@alokai/connectMultistore is the one part of the move to @alokai/connect that isn't a rename. Its configuration object changes shape, so a project that only repoints the import doesn't compile.
@vue-storefront/multistore is now @alokai/connect/config-switcher, and createMultistoreExtension is now createConfigSwitcherExtension. The old fetchConfiguration / mergeConfigurations / cacheManagerFactory object becomes a single call.
Each store's settings nest one level deeper, under an api key. switchStrategy: "domain" reproduces the old behaviour. mergeConfigurations has no replacement and needs none. cacheTTL, in seconds, replaces cacheManagerFactory.
If you were using the multistore functionality, rewrite multistore.config.ts - repointing its import isn't enough. Delete the apps/storefront-middleware/multistore directory and its multistore:dev script too.
Locale travels as the x-alokai-locale header instead of the vsf-locale cookie
@vue-storefront/next@alokai/cookies-bridgeThe locale traveled in a cookie, and a CDN isn't handed cookies, so you couldn't cache responses that depended on the locale. Carrying it in a header makes them cacheable.
Every SDK request now carries an x-alokai-locale header. The middleware turns that header back into a vsf-locale cookie on each request, so integrations that read the cookie keep working.
In @vue-storefront/next, getSdk gains a getLocale option. Your own server-side wrapper in apps/storefront-unified-nextjs/sdk/index.ts becomes async, because it resolves the locale before it builds the SDK.
A project that doesn't use @alokai/connect gets the same conversion from @alokai/cookies-bridge. Install it and register createCookiesBridgeExtension([{ header: 'x-alokai-locale', cookie: 'vsf-locale' }]) as the first entry in each integration's extensions list.
The cost is server-side code in Next.js. You have to await getSdk() everywhere on the server and pass the locale in - sdk/index.ts, middleware.ts and components/providers.tsx all change.
Nuxt stops writing the locale cookie
@vue-storefront/nuxtThe middleware writes the locale cookie itself now. A Nuxt app that keeps writing it sets a value the middleware overwrites on every request, and keeps a cookie on the responses the header change makes cacheable.
Nuxt stops writing the locale cookie and drops cookieNames.locale.
The cookie writes live in files your project owns, so remove them by hand from localization.ts and composables/useLocation/useLocation.ts.
All changes by area
Every change in 1.0 has one entry here, grouped by area. The highlights, from above and from the patch sections, are here too, marked with a star. Open an area to see its changes, and open a change to read why it changed and what changed. The upgrade guide from 0.2.0 to 1.0.2 collects the migration steps for the whole line.
Alokai ConnectAction needed3 changes
changed Five @vue-storefront/* core packages collapse into one - @alokai/connect highlight Action needed
The old package names aren't installable any more, so an untouched project doesn't build until you repoint every import. For most imports that's a find-and-replace; multistore is the exception.
step →What changedWhy, and what changed ▸
Alokai's core shipped as five separate @vue-storefront/* packages. They become one package, and only the packaging changes - the names, signatures and behaviour stay the same.
@alokai/connect and its subpaths - @alokai/connect/middleware, @alokai/connect/sdk, @alokai/connect/logger, @alokai/connect/integration-kit, @alokai/connect/config-switcher - replace @vue-storefront/middleware, @vue-storefront/sdk, @vue-storefront/logger, @vue-storefront/unified-data-model and @vue-storefront/multistore.
Ten symbols and their types are on @alokai/connect/integration-kit, not on the root: apiClientFactory, validatePassword, unifiedExtensionFactory, createUnifiedCmsExtension, getNormalizers, assignToNormalizerContext, mergeNormalizers, getApiDefinitions, defineAddCustomFieldsFactory and toContextualizedNormalizers. Every published package is rebuilt against @alokai/connect, which is why all 62 take a major version.
@alokai/connect@vue-storefront/next@vue-storefront/nuxtchanged Multistore becomes the config switcher, and its configuration changes shape highlight Action needed
If you were using the multistore functionality, rewrite multistore.config.ts - repointing its import isn't enough. Delete the apps/storefront-middleware/multistore directory and its multistore:dev script too.
What changedWhy, and what changed ▸
Multistore is the one part of the move to @alokai/connect that isn't a rename. Its configuration object changes shape, so a project that only repoints the import doesn't compile.
@vue-storefront/multistore is now @alokai/connect/config-switcher, and createMultistoreExtension is now createConfigSwitcherExtension. Each store's settings nest one level deeper, under an api key. switchStrategy: "domain" reproduces the old behaviour, mergeConfigurations has no replacement and needs none, and cacheTTL, in seconds, replaces cacheManagerFactory.
@alokai/connectchanged The middleware upload ceiling doubles to 20MB
The default maxFileSize is still 5MB. You can now set the limit higher, but if you don't set it, you get the same limit as before.
What changedWhy, and what changed ▸
In @alokai/connect, the middleware's absolute cap on uploaded file size doubles from 10MB to 20MB.
@alokai/connectStorefrontAction needed13 changes
changed Locale travels as the x-alokai-locale header instead of the vsf-locale cookie highlight Action needed
In a Next.js project, you have to await getSdk() everywhere on the server and pass the locale in - sdk/index.ts, middleware.ts and components/providers.tsx all change.
What changedWhy, and what changed ▸
The locale traveled in a cookie, and a CDN isn't handed cookies, so you couldn't cache responses that depended on the locale. Carrying it in a header makes them cacheable.
Every SDK request carries an x-alokai-locale header. The middleware turns it back into a vsf-locale cookie, so integrations that read the cookie keep working. getSdk in @vue-storefront/next gains a getLocale option, which makes your own apps/storefront-unified-nextjs/sdk/index.ts wrapper async.
A project that doesn't use @alokai/connect gets the same conversion by registering createCookiesBridgeExtension([{ header: 'x-alokai-locale', cookie: 'vsf-locale' }]) from @alokai/cookies-bridge as the first entry in each integration's extensions list.
@vue-storefront/next@alokai/cookies-bridgechanged Nuxt stops writing the locale cookie highlight Action needed
Remove the locale cookie writes by hand from your own localization.ts and composables/useLocation/useLocation.ts - they live in files your project owns.
What changedWhy, and what changed ▸
The middleware writes the locale cookie itself now. A Nuxt app that keeps writing it sets a value the middleware overwrites on every request, and keeps a cookie on the responses the header change makes cacheable.
Nuxt stops writing the locale cookie and drops cookieNames.locale.
@vue-storefront/nuxtadded The mock CMS gains an injectEnvironment endpoint
You can change the mock's configuration per run, for example in end-to-end tests.
What changedWhy, and what changed ▸
@vsf-enterprise/cms-mock-api has a new injectEnvironment endpoint. It overwrites the predefined cms-mock configuration.
@vsf-enterprise/cms-mock-apiadded createAlokaiMiddleware and a Nuxt server handler append the request path headers
Your server-side code can read the request path from x-pathname, instead of reconstructing it.
What changedWhy, and what changed ▸
createAlokaiMiddleware in @vue-storefront/next wraps your own Next.js middleware and registers the Alokai-specific logic. It appends x-pathname and x-search to the Next.js request object.
@vue-storefront/nuxt has a new server middleware handler that appends the same two headers to the Nuxt request object.
@vue-storefront/next@vue-storefront/nuxtchanged getPathnameFromRequestHeaders is not in the shipped release
Don't plan around getPathnameFromRequestHeaders. Read the pathname from the x-pathname header that createAlokaiMiddleware appends.
What changedWhy, and what changed ▸
One entry of this release announces getPathnameFromRequestHeaders as added to @vue-storefront/next, and another announces it as removed. The shipped 6.0.0 doesn't export the function.
@vue-storefront/nextadded defineSdkModule lets each SDK module live in its own file
Nothing forces the layout on an existing project. But @vsf-enterprise/module-kit now writes installed modules in that shape, so if your config stays inline, the modules you install don't match the rest of it.
What changedWhy, and what changed ▸
With defineSdkModule, each SDK module can live in its own file, instead of inline in the SDK config. The files go under sdk/modules/ in Next.js or sdk-modules/ in Nuxt, and an index.ts re-exports them. A widened defineSdkConfig accepts those re-exported modules.
@vue-storefront/next@vue-storefront/nuxtadded The storefront can set the config-switcher header itself
Your storefront can set the x-alokai-middleware-config-id header itself, instead of relying on whatever the middleware infers.
What changedWhy, and what changed ▸
@vue-storefront/next re-exports defineGetConfigSwitcherHeader from @alokai/connect/sdk, and Nuxt registers it as an auto-import. The defaultRequestConfig of middlewareModule accepts a getConfigSwitcherHeader function.
@vue-storefront/next@vue-storefront/nuxtfixed cms-components-utils drops lodash-es for Edge Runtime compatibility
The package now runs on the Edge Runtime. Before, it couldn't.
What changedWhy, and what changed ▸
@vsf-enterprise/cms-components-utils no longer depends on lodash-es, which doesn't work on the Edge Runtime. The package has its own kebab-case helper instead.
@vsf-enterprise/cms-components-utilsfixed The Nuxt cart page stops throwing on jw-paginate in dev mode Action needed
If you run the Nuxt storefront in dev mode, add jw-paginate to the dev optimizeDeps.include list in nuxt.config.ts yourself. Production builds were never affected.
What changedWhy, and what changed ▸
In dev mode, the Nuxt cart page threw SyntaxError: The requested module '/node_modules/jw-paginate/lib/jw-paginate.js' does not provide an export named 'default'.
The fix is a jw-paginate entry in the dev optimizeDeps.include list of nuxt.config.ts. That file belongs to your project, so no package in the upgrade changes it.
fixed The Nuxt server middleware gains its missing h3 imports
The fix comes with the package version, so you have nothing to change.
What changedWhy, and what changed ▸
The Nuxt server middleware in @vue-storefront/nuxt now imports defineEventHandler and getRequestURL from h3. Before, these imports were missing.
@vue-storefront/nuxtchanged The storefront metatag content carries the current company name
The metatags are in your own app files, so your copies keep the old name until you edit them.
What changedWhy, and what changed ▸
The metatag content in both storefronts uses the current company name.
changed The Nuxt Tailwind preset is replaced wholesale Action needed
Replace the file by hand, then run yarn build:packages so the apps see the new preset.
What changedWhy, and what changed ▸
packages/tailwind-config/src/nuxt.ts is a file in your project, not a package, so the version bump doesn't update it.
The whole Nuxt Tailwind preset in packages/tailwind-config/src/nuxt.ts is new. It builds on @storefront-ui/react/tailwind-config, with sfTypography as a plugin. The screen breakpoints sit under theme.extend.
fixed A newly generated project's version field is a real version number highlight 1.0.2
This reaches only the projects you generate from now on, never an existing project through an upgrade. If your project was generated before 1.0.2, it still has the tag string, carrying whichever version generated it. Nothing consumes it - that manifest is private: true - so there's nothing to repair.
What changedWhy, and what changed ▸
The version field of a generated project held the ecosystem tag string where a version number belongs.
The CLI writes the version number alone into the root package.json of a generated project, where it used to write "version": "@alokai/ecosystem@1.0.1". The same value goes to the root manifest and to every apps/*/package.json.
CLI & toolingAction needed22 changes
changed Node 18 no longer installs - the floor is Node 20, and 22.14 in practice highlight Action needed
On Node 18 the install is refused. Node 20 satisfies the range but is recorded as untested, so move to 22.14.0 or higher - and update every CI job that pins a Node version too.
step →What changedWhy, and what changed ▸
Every published package checks the Node version on install, so your runtime decides whether you can take anything else in this release.
engines.node moves to 20.* || >=22.14.0 in the root manifest (from ^18) and in the published packages - @alokai/connect, @alokai/cli and @vsf-enterprise/sapcc-api among them. The release also expects @types/node at ^22.13.17 and .nvmrc / .node-version at 22.14.0.
@alokai/clichanged Enterprise packages now come from npm.alokai.cloud highlight Action needed
Point .npmrc at the new host and log in against it - until you do, none of this release's @alokai and @vsf-enterprise versions resolve.
What changedWhy, and what changed ▸
A project that still points at the old registry host can't resolve any @alokai or @vsf-enterprise version in this release. The error looks like a missing package, not a registry change.
.npmrc maps the @vsf-enterprise: and @alokai: scopes to https://npm.alokai.cloud, replacing https://registrynpm.storefrontcloud.io.
security express moves to ^4.20.0, closing a security advisory
The upgrade brings in the fix. You have no credential to rotate and no code to change.
What changedWhy, and what changed ▸
express moves to ^4.20.0 in every package that embeds it, @vsf-enterprise/stripe-commercetools included. The update fixes the vulnerability in GHSA-qw6h-vgh9-j6wx.
changed axios moves to ^1.7.9 across the integration packages
The new version comes inside the packages you install, so you have nothing to change.
What changedWhy, and what changed ▸
axios moves to ^1.7.9 in 18 of the integration packages.
added @alokai/cli is new to your project and owns the store lifecycle
The binary comes with the package. The store script is a line in your own root package.json.
What changedWhy, and what changed ▸
@alokai/cli is new to your project at 1.0.0. The store add, store move, store remove, store build, store dev, store start, store test, store changed, and store deploy commands all run through its alokai-cli binary. A generated project exposes the binary as a store script in its root package.json.
@alokai/cliadded store deploy takes framework, project-name and cloud-region flags
A deploy that would have failed halfway now fails at the start and names what's missing.
What changedWhy, and what changed ▸
store deploy takes --framework, --project-name, and --cloud-region. They take precedence over the matching alokai.config.json values. You can't combine them with --all.
store deploy also checks for missing dependencies before it starts, instead of failing part-way through a deploy.
@alokai/cliadded store changed takes --deployable
With --deployable, a store with no deployment configuration no longer appears in the report.
What changedWhy, and what changed ▸
store changed takes --deployable. With it, the report lists only the changes to deployable stores.
@alokai/cliadded store test takes --playwright-options
Your CI can now detect a failing store test run.
What changedWhy, and what changed ▸
store test takes --playwright-options (-p), for example alokai-cli store test --playwright-options="--project=nuxt-desktop --headed". A run over several stores tests them one after another, not in parallel through Turbo's pipeline. The command returns exit code 1 when it fails, and it works with --ui.
@alokai/clichanged Store composition reads ancestor env files and symlinks node_modules
Inside a store, hoisted and non-hoisted copies of a dependency no longer disagree about types.
What changedWhy, and what changed ▸
Store composition looks for .env and .env.example in ancestor stores before it falls back to the base apps. It creates .env from an overridden .env.example in every app. It also symlinks node_modules into each app under stores/.
@alokai/clichanged Adopting the CLI needs cross-env on Windows and a renamed config field
Your editor reads the schema from the installed CLI, so the schema stays in step with the version you're on.
What changedWhy, and what changed ▸
On Windows, adopting the CLI needs cross-env in the project - yarn add cross-env -W -D. alokai.config.json carries deployment.framework instead of deployment.frontend. Its $schema points at node_modules/@alokai/cli/lib/static/alokaiConfigSchema.json instead of a copy checked into the repository.
@alokai/clichanged create builds a project from the published release bundle Action needed
If you call create from a script, template, or pipeline, replace --inheritance-only with --template there. The old name gets an unknown-flag error, not a warning.
What changedWhy, and what changed ▸
A scaffolding pipeline that passes the old flag name to create breaks the next time it runs.
create builds a project from the published release bundle, not from a repository checkout. Its --inheritance-only flag is renamed to --template. The new consoleProjectName and cloudRegion flags write the Console project name and cloud region into alokai.config.json.
add-module installs modules at that release's version. It takes --store-id to name the store to install into.
@vsf-enterprise/storefront-cliremoved module-kit 3.0.0 removes three pieces of its authoring API Action needed
If you have your own installation schemas or file visitors, update them, or they don't compile against 3.0.0.
step →What changedWhy, and what changed ▸
Schemas written against 2.1.1 use symbols that no longer exist, so they fail to compile rather than behave differently.
The module installation context no longer has appsDirectory - a store object replaces it. addSdkMiddlewareModule replaces modifySdkConfig. createRemoveSdkPropertyVisitor is removed.
createAddMiddlewareModuleVisitor emits export const x = defineSdkModule(...). It passes a headers variable instead of the output of getRequestHeaders(). modifyFile is optional on defineSchema.
baseCmsSchemas also patches the PLP and PDP imports, adds the unifiedCms SDK module, and fixes the Nuxt Accordion import.
@vsf-enterprise/module-kitfixed file-modifier handles export const and creates a missing input path
Both fixes apply the next time a module installation runs.
What changedWhy, and what changed ▸
pushExport handles export const declarations and overwrites an existing export of the same name. With type: "javascript", modifyFile creates the inputPath when it's missing.
@vsf-enterprise/file-modifierchanged storefront-cli detects @alokai/connect and keeps .gitignore and .npmrc in new projects
A project you generate with create gets its .gitignore and .npmrc intact.
What changedWhy, and what changed ▸
The CLI detects @alokai/connect in a project instead of the legacy middleware package. create now restores .gitignore and .npmrc in the project it generates. npm pack leaves both out of the published bundle, so they ship with a .template suffix that create strips.
@vsf-enterprise/storefront-clifixed Fixes land across the CLI packages
The upgrade brings in all of these fixes.
What changedWhy, and what changed ▸
store changed on a repository with a single commit is fixed, and so is the deployment of nested stores. The spinner no longer hides --verbose logs for start and build. A generated start:standalone script no longer ignores an existing start script.
In dev mode, middleware and SSR URLs keep a path suffix such as /api. The extensions on the CLI bin scripts are fixed. The missing defu, get-port-please, and tiny-exec dependencies are added.
@alokai/cli@vsf-enterprise/storefront-cliadded @alokai/cli reads CONSOLE_API_URL and says more when a deploy fails
You can point a deploy at a non-default Console endpoint, and a failed deploy gives you more to go on.
What changedWhy, and what changed ▸
The CLI reads CONSOLE_API_URL from the environment. deploy prints more debug output when it fails.
@alokai/clifixed The CMS and search modules you install now pin stable vendor packages, not release candidates highlight Action needed 1.0.1
If you added a CMS or search module while on 1.0.0, your app manifests still pin the release candidates, and the upgrade doesn't touch them. Bump them yourself. If you install one of these modules after upgrading, you get the stable versions with nothing to do.
step →What changedWhy, and what changed ▸
On 1.0.0, installing a CMS or search module pinned release-candidate builds of its vendor packages in your app manifests. That's vendor code that was never meant to reach production.
Installing one of eight modules now pins the stable releases of its vendor packages. The eight are Amplience, Bloomreach Content, Builder.io, Contentful, Contentstack, SAP SmartEdit, Storyblok, and Coveo. The pins move like this: @vsf-enterprise/contentful-api and @vsf-enterprise/contentful-sdk 6.0.0-rc.3 -> 6.0.0, @vsf-enterprise/amplience-api 6.0.0-rc.3 -> 6.0.0 with @vsf-enterprise/amplience-sdk 4.0.0-rc.3 -> 4.0.0, @vsf-enterprise/bloomreach-content-manager 2.0.0-rc.3 -> 2.0.0 with @vsf-enterprise/bloomreach-content-sdk 5.0.0-rc.3 -> 5.0.0, @vsf-enterprise/builderio-sdk 4.0.0-rc.3 -> 4.0.0, @vsf-enterprise/contentstack-api 6.0.0-rc.3 -> 6.0.0 with @vsf-enterprise/contentstack-sdk 5.0.0-rc.3 -> 5.0.0, @vsf-enterprise/smartedit-api 3.0.0-rc.3 -> 3.0.0 with @vsf-enterprise/smartedit-sdk 2.0.0-rc.3 -> 2.0.0, @vsf-enterprise/storyblok-api 3.0.0-rc.3 -> 3.0.0 with @vsf-enterprise/storyblok-sdk 2.0.0-rc.2 -> 2.0.0, and @vsf-enterprise/coveo-api 3.0.0-rc.3 -> 3.0.0.
changed Project generation stops writing commercetools types into every project Action needed 1.0.1
A SAP Commerce Cloud, Salesforce Commerce Cloud, Magento, or BigCommerce project generated on 1.0.0 or earlier still carries the dependency, and the upgrade can't take it back. You can safely remove it: nothing outside a commercetools store's own checkout code imports it.
step →What changedWhy, and what changed ▸
Every generated project got a commercetools types package, whatever its platform. A -types package is how tooling and the next person to open your repository tell which platform a project integrates, so on any other platform it sent a false signal.
Project generation no longer writes @vsf-enterprise/commercetools-types into apps/storefront-middleware/package.json for platforms other than commercetools.
added Module authoring can write into an integration's middleware configuration 1.0.1
If you write modules, your module's install.js can add its own configuration keys instead of asking developers to paste them in.
What changedWhy, and what changed ▸
createAddIntegrationConfigPropertiesVisitor in @vsf-enterprise/module-kit adds properties to the configuration object in an integration's integrations/<integration>/config.ts. For example, createAddIntegrationConfigPropertiesVisitor('api: { uri: process.env.API_URI }') adds that api entry.
@vsf-enterprise/module-kitadded A per-store lint fix script ships with newly generated projects 1.0.1
The upgrade doesn't add this script to a project that already exists. If you want to lint a single store, add it yourself. Skip it and nothing breaks - you keep linting the whole workspace with lint:fix.
What changedWhy, and what changed ▸
A newly generated project's root package.json has a lint:store:fix script, node scripts/lint-stores.mjs, and the @colors/colors devDependency it needs. scripts/lint-stores.mjs finds the folders to lint by reading apps/ instead of a hardcoded list. So it also covers any app your project added.
fixed Every alokai-cli store command works on a project with no frontend app highlight 1.0.2
If your project runs the middleware without a storefront app, store build, store dev, and store deploy now work on it. The fix is in @alokai/cli@1.0.1, and you get it only once you move to that version. Projects with a Next.js or Nuxt app never hit the error and see no difference.
What changedWhy, and what changed ▸
On a project whose apps/ held only the middleware, any command that read alokai.config.json failed, not just deployment.
The CLI no longer throws Default framework not found when apps/ holds neither storefront-unified-nextjs nor storefront-unified-nuxt. It leaves deployment.framework empty in the resolved store config instead.
@alokai/cliadded The integration boilerplate is installable for the first time 1.0.2
If you're starting your own integration, you can install the boilerplate for the first time. If you aren't, there's nothing here for you.
What changedWhy, and what changed ▸
@alokai/boilerplate-integration was private: true until this release and was never on the registry. So 1.0.1 is its first published version, not an upgrade from an earlier one. Its engines.node is >=16.x, not the workspace floor.
@alokai/boilerplate-integrationSAP Commerce CloudAction needed3 changes
changed sapccModule is rebuilt on middlewareModule and two cart methods are renamed Action needed
Calls to the old cart method names no longer typecheck, so rename them. If you built the SAPCC module yourself, swap it for sapccModule to get the token refresh and the image utility.
What changedWhy, and what changed ▸
A SAPCC module you built yourself from middlewareModule and SapccEndpoints didn't refresh an expired token and had no image utility.
sapccModule in @vsf-enterprise/sapcc-sdk is built on middlewareModule and SapccEndpoints. It refreshes an expired token on its own and ships a transformImageUrl utility. addCartEntry and updateCartEntry are renamed to addToCart and updateCart.
@vsf-enterprise/sapcc-sdkfixed Per-method token modes work again in the SAPCC API
If you set per-method token modes, they take effect with this version, so the methods you listed can now carry a different token than before.
What changedWhy, and what changed ▸
@vsf-enterprise/sapcc-api applies a methodsTokenModes map such as { getProduct: TokenModes.APPLICATION }. Before this release, it ignored the map and every request used the same token.
@vsf-enterprise/sapcc-apichanged The SAP ASM module writes its own asmUri configuration on install Action needed 1.0.1
If you installed the module before this release, you have neither, and the upgrade doesn't add them. The module can't reach the assisted service endpoints until you add both yourself.
step →What changedWhy, and what changed ▸
A sap-asm install performed before this release left the assisted service endpoints with no URI to call.
Installing the sap-asm module writes asmUri: process.env.SAPCC_ASM_API_URI into configuration.api in apps/storefront-middleware/integrations/sapcc/config.ts. It also appends SAPCC_ASM_API_URI to apps/storefront-middleware/.env.example.
commercetools1 change
fixed The Algolia adapter normalizes deeply nested categories
Category facets built from a deeply nested commercetools category tree no longer come back malformed.
What changedWhy, and what changed ▸
@vsf-enterprise/unified-api-commercetools/algolia normalizes deeply nested categories correctly.
@vsf-enterprise/unified-api-commercetoolsMagento 2Action needed1 change
fixed Address regions now reach the Magento API Action needed
A free-text or display-only region that isn't valid for that country is now rejected instead of ignored, so a call that used to succeed fails. Before you upgrade a production project, map what your address forms put into region to the region codes Magento accepts for that country. Addresses already stored in Magento don't gain a region.
What changedWhy, and what changed ▸
The unified setCartAddress dropped the region before it reached Magento, so Magento never checked what your storefront put in region.
The unified setCartAddress in @vsf-enterprise/unified-api-magento resolves region and region_id from the shippingAddress argument. It passes both on to the Magento API.
@vsf-enterprise/unified-api-magentoSalesforce Commerce Cloud1 change
changed unified-api-sfcc picks up updated SFCC dependencies
The update stays behind the unified API, which doesn't change.
What changedWhy, and what changed ▸
@vsf-enterprise/unified-api-sfcc picks up updated @vsf-enterprise/sfcc-api and @vsf-enterprise/sfcc-types dependencies.
@vsf-enterprise/unified-api-sfccCI / deployment workflows2 changes
changed The generated CI workflow drops a dead Node matrix and moves to a standard runner 1.0.1
The upgrade doesn't touch the workflow in your project, so it keeps the unused matrix and the larger-runner label until you edit it.
What changedWhy, and what changed ▸
The generated project's .github/workflows/continuous-integration.yml no longer declares a node-version: ["18.20.2"] matrix. Nothing read that matrix: the setup action installs Node from .nvmrc through actions/setup-node. runs-on moves from ubuntu-latest-8core to ubuntu-latest, the runner every GitHub plan provides, instead of a larger-runner tier.
changed The affected-stores action reports only deployable stores 1.0.1
The upgrade doesn't touch the action file in your project. If you want this, add --deployable to its store changed call yourself.
What changedWhy, and what changed ▸
The generated project's .github/actions/affected-stores/action.yml calls store changed with --deployable. A store without frontend components no longer blocks the run. The --deployable flag itself isn't new in this release.
Patches in 1.0.x
1.0.2
20 Jun 2025 · Patch · 2 of 66 packages moved
The fix worth your attention is in @alokai/cli: a project whose apps/ directory holds only the middleware can now run the store commands. The other fix is in project generation and reaches only projects created after this release. Nothing here changes a default, removes an option, or moves the Node floor. The whole upgrade is one version bump in package.json.
Every alokai-cli store command works on a project with no frontend app
@alokai/cliOn a project whose apps/ held only the middleware, any command that read alokai.config.json failed, not just deployment.
The CLI no longer throws Default framework not found when apps/ holds neither storefront-unified-nextjs nor storefront-unified-nuxt. It leaves deployment.framework empty in the resolved store config instead.
If your project runs the middleware without a storefront app - a headless setup, or a store you deploy middleware-first - alokai-cli store build, alokai-cli store dev, and alokai-cli store deploy now work on it. If you still hit the error on Alokai 1.0.1, that's because the published package wasn't bumped for the fix then. The fix is in @alokai/cli@1.0.1, and you get it only once you move to that version. Projects with a Next.js or Nuxt app never hit the error and see no difference.
A newly generated project's version field is a real version number
The version field of a generated project held the ecosystem tag string where a version number belongs.
The CLI writes the version number alone into the root package.json of a generated project, where it used to write "version": "@alokai/ecosystem@1.0.1". The same value goes to the root manifest and to every apps/*/package.json. The app manifests already held a plain number. Apart from that field and the @alokai/cli version the root manifest pins, a project generated at 1.0.2 is identical to one generated at 1.0.1.
This reaches only the projects you generate from now on, never an existing project through an upgrade. If your project was generated before 1.0.2, its root package.json still has the tag string of the version that generated it - a project created at 1.0.0 holds "version": "@alokai/ecosystem@1.0.0", not the version you're upgrading from. Nothing consumes it: that manifest is private: true, so yarn never validates the field, and no tooling in this release reads it. There's nothing to repair, and no step asks you to.
1.0.1
6 Jun 2025 · Patch · 2 of 65 packages moved
Alokai 1.0.1 exists for one fix: the CMS and search modules pinned release-candidate builds of their vendor packages, and now pin the stable releases. The fix applies to installs from 1.0.1 onwards. A module you installed on 1.0.0 keeps the version it got, and you correct it by hand in your own app manifests.
The SAP ASM module now writes its asmUri configuration for you. Four files the CLI writes at project creation also changed: the CI workflow's runner label and unused Node matrix, the affected-stores action, and a new per-store lint script. None of them reach a project that already exists. Neither does the dependency that generation stopped writing, @vsf-enterprise/commercetools-types, which every non-commercetools project still carries until you remove it.
The CMS and search modules you install now pin stable vendor packages, not release candidates
On 1.0.0, installing a CMS or search module pinned release-candidate builds of its vendor packages in your app manifests. That's vendor code that was never meant to reach production.
Installing one of eight modules now pins the stable releases of its vendor packages. The eight are Amplience, Bloomreach Content, Builder.io, Contentful, Contentstack, SAP SmartEdit, Storyblok, and Coveo. The pins move like this: @vsf-enterprise/contentful-api and @vsf-enterprise/contentful-sdk 6.0.0-rc.3 -> 6.0.0, @vsf-enterprise/amplience-api 6.0.0-rc.3 -> 6.0.0 with @vsf-enterprise/amplience-sdk 4.0.0-rc.3 -> 4.0.0, @vsf-enterprise/bloomreach-content-manager 2.0.0-rc.3 -> 2.0.0 with @vsf-enterprise/bloomreach-content-sdk 5.0.0-rc.3 -> 5.0.0, @vsf-enterprise/builderio-sdk 4.0.0-rc.3 -> 4.0.0, @vsf-enterprise/contentstack-api 6.0.0-rc.3 -> 6.0.0 with @vsf-enterprise/contentstack-sdk 5.0.0-rc.3 -> 5.0.0, @vsf-enterprise/smartedit-api 3.0.0-rc.3 -> 3.0.0 with @vsf-enterprise/smartedit-sdk 2.0.0-rc.3 -> 2.0.0, @vsf-enterprise/storyblok-api 3.0.0-rc.3 -> 3.0.0 with @vsf-enterprise/storyblok-sdk 2.0.0-rc.2 -> 2.0.0, and @vsf-enterprise/coveo-api 3.0.0-rc.3 -> 3.0.0.
A module install writes those versions into your apps/storefront-middleware/package.json and your storefront app's package.json once, and never revisits them. So if you added a CMS or search module while on 1.0.0, those files still pin the release candidates, and the upgrade doesn't touch them. Bump them yourself. If you install one of these modules after upgrading, you get the stable versions with nothing to do.