Skip to content

Commit 5772eda

Browse files
author
vmarta_sfemu
committed
Sync from monorepo
Template version: 0.4.0-alpha.2 Uses NPM packages @salesforce/storefront-next-* v0.4.0-alpha.2 Synced by: vmarta_sfemu Monorepo SHA: d8913956ac58de3b49f0473f09e813f2e8af7b25 Latest change: f8c681cc3 - chore: bump version to 0.4.0-alpha.2
1 parent f14d295 commit 5772eda

8 files changed

Lines changed: 35 additions & 67 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
- Remove manual `contentLinkUuid` type extensions in favor of SCAPI types (@W-21280780)
1414
- `ComponentType` now uses `contentLinkUuid`, `fragment`, `localized`, `visible` from Shopper Experience API v1.3.0
1515
- Document the use of dynamic images ([#1519](https://github.com/commerce-emu/storefront-next/pull/1519))
16+
- Update Page Designer middleware and `vite.config.ts` to align with upstream `@salesforce/mrt-utilities` conditional export flow (no local Vite alias requirement) ([#1533](https://github.com/commerce-emu/storefront-next/pull/1533))
1617
- Standardize behaviors of API errors in Checkout (@W-22199926) ([#1521](https://github.com/commerce-emu/storefront-next/pull/1521))
1718
- Migrate i18n infrastructure to SDK: replace `src/lib/i18next.ts`, `src/lib/i18next.client.ts`, and `scripts/aggregate-extension-locales.js` with imports from `@salesforce/storefront-next-runtime/i18n` and `sfnext locales aggregate-extensions`
1819

e2e/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@salesforce/storefront-next-e2e",
3-
"version": "0.4.0-alpha.1",
3+
"version": "0.4.0-alpha.2",
44
"private": true,
55
"scripts": {
66
"typecheck": "pnpm def && tsc --noEmit",

lighthouserc.cjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ module.exports = {
1717
ci: {
1818
collect: {
1919
numberOfRuns: 5,
20-
startServerCommand: 'pnpm start --port 3001',
20+
startServerCommand: 'cross-env NODE_OPTIONS=--conditions=dev-data-store pnpm start --port 3001',
2121
startServerReadyPattern: 'SFCC Storefront Next',
2222
startServerReadyTimeout: 30000,
2323
url: [

package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
{
22
"name": "template-retail-rsc-app",
3-
"version": "0.4.0-alpha.1",
3+
"version": "0.4.0-alpha.2",
44
"description": "Production-ready React storefront template for Salesforce Commerce Cloud.",
55
"private": true,
66
"type": "module",
77
"scripts": {
88
"build": "pnpm locales:aggregate-extensions && pnpm generate:cartridge && react-router build",
99
"bundlesize:test": "cross-env BUNDLES_SIZE_CHECK=true pnpm build",
1010
"bundlesize:analyze": "cross-env BUNDLES_SIZE_ANALYZE=true pnpm build",
11-
"dev": "pnpm locales:aggregate-extensions && sfnext dev",
12-
"dev:debug": "cross-env NODE_OPTIONS=--inspect sfnext dev",
13-
"dev:log": "cross-env SFCC_LOG_LEVEL=debug sfnext dev",
11+
"dev": "pnpm locales:aggregate-extensions && cross-env NODE_OPTIONS=--conditions=dev-data-store sfnext dev",
12+
"dev:debug": "cross-env NODE_OPTIONS=\"--inspect --conditions=dev-data-store\" sfnext dev",
13+
"dev:log": "cross-env NODE_OPTIONS=--conditions=dev-data-store SFCC_LOG_LEVEL=debug sfnext dev",
1414
"dev:ui-targets": "cross-env VITE_UI_TARGET_DEV_MODE=true pnpm dev",
1515
"smoke-test:generate": "node src/lib/ui-target-dev-mode/smoke-test/generate-config.cjs",
1616
"deploy:cartridge": "sfnext deploy-cartridge",
@@ -19,7 +19,7 @@
1919
"validate:cartridge": "sfnext validate-cartridge",
2020
"generate:eslint": "node scripts/generate-eslint-config.js",
2121
"locales:aggregate-extensions": "sfnext locales aggregate-extensions",
22-
"start": "cross-env SFNEXT_DATA_STORE_ALLOW_LOCAL=true sfnext preview",
22+
"start": "cross-env SFNEXT_DATA_STORE_UNAVAILABLE_MODE=fallback sfnext preview",
2323
"preview": "pnpm start",
2424
"push": "sfnext push --project-directory .",
2525
"typecheck": "react-router typegen && cross-env NODE_OPTIONS=--max-old-space-size=8192 tsc --noEmit",
@@ -82,8 +82,8 @@
8282
"@radix-ui/react-switch": "1.2.2",
8383
"@radix-ui/react-tooltip": "1.2.8",
8484
"@react-router/node": "7.12.0",
85-
"@salesforce/storefront-next-dev": "0.4.0-alpha.1",
86-
"@salesforce/storefront-next-runtime": "0.4.0-alpha.1",
85+
"@salesforce/storefront-next-dev": "0.4.0-alpha.2",
86+
"@salesforce/storefront-next-runtime": "0.4.0-alpha.2",
8787
"@vis.gl/react-google-maps": "1.7.1",
8888
"class-variance-authority": "0.7.1",
8989
"clsx": "2.1.1",

pnpm-workspace.yaml.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ minimumReleaseAge: 2880
2020
# Storefront Next SDK packages are exempt.
2121
# (https://pnpm.io/settings#minimumreleaseageexclude)
2222
minimumReleaseAgeExclude:
23-
- '@salesforce/storefront-next-dev@0.4.0-alpha.1'
24-
- '@salesforce/storefront-next-runtime@0.4.0-alpha.1'
23+
- '@salesforce/storefront-next-dev@0.4.0-alpha.2'
24+
- '@salesforce/storefront-next-runtime@0.4.0-alpha.2'
2525
- '@salesforce/mrt-utilities'
2626

2727
# Prevent lockfile version downgrades.

src/middlewares/page-designer-page-resolution.server.test.ts

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,14 @@ import { createTestContext } from '@/lib/test-utils';
2020
import { scapiMiddlewareContext, type ScapiMiddlewareEntry } from '@/lib/scapi-middleware';
2121
import { resolvePage } from '@salesforce/storefront-next-runtime/design/data';
2222
import {
23+
DataStore,
2324
DataStoreNotFoundError,
2425
DataStoreUnavailableError,
2526
DataStoreServiceError,
2627
} from '@salesforce/storefront-next-runtime/data-store';
2728

2829
const mockGetEntry = vi.fn();
2930
const mockResolveQualifiers = vi.fn();
30-
const mockDataStoreProvider = { kind: 'mrt' as const, getEntry: mockGetEntry };
31-
const mockGetDefaultDataStoreProvider = vi.fn().mockResolvedValue(mockDataStoreProvider);
3231

3332
const mockLogger = vi.hoisted(() => ({
3433
error: vi.fn(),
@@ -47,10 +46,15 @@ const mockClients = {
4746
},
4847
} as any;
4948

50-
vi.mock('@salesforce/storefront-next-runtime/data-store', async (importOriginal) => ({
51-
...(await importOriginal()),
52-
getDefaultDataStoreProvider: (...args: unknown[]) => mockGetDefaultDataStoreProvider(...args),
53-
}));
49+
vi.mock('@salesforce/storefront-next-runtime/data-store', async (importOriginal) => {
50+
const original = await importOriginal<typeof import('@salesforce/storefront-next-runtime/data-store')>();
51+
return {
52+
...original,
53+
DataStore: {
54+
getDataStore: vi.fn(() => ({ getEntry: mockGetEntry })),
55+
},
56+
};
57+
});
5458

5559
vi.mock('@salesforce/storefront-next-runtime/design/data', () => ({
5660
resolvePage: vi.fn(),
@@ -145,7 +149,8 @@ describe('pageDesignerResolutionMiddleware', () => {
145149
mockGetEntry.mockReset();
146150
mockResolveQualifiers.mockReset();
147151
mockedResolvePage.mockReset();
148-
mockGetDefaultDataStoreProvider.mockReset().mockResolvedValue(mockDataStoreProvider);
152+
DataStore._testDocumentClient = null;
153+
DataStore._testLogMRTError = null;
149154
});
150155

151156
describe('factory registration', () => {
@@ -179,16 +184,6 @@ describe('pageDesignerResolutionMiddleware', () => {
179184
expect(next).toHaveBeenCalled();
180185
});
181186

182-
it('should return undefined from onRequest when data store provider is not available', async () => {
183-
mockGetDefaultDataStoreProvider.mockResolvedValue(null);
184-
const handler = await setupHandler();
185-
186-
const result = await handler(middlewareParams(new Request(getPageUrl('homepage'))));
187-
188-
expect(result).toBeUndefined();
189-
expect(mockedResolvePage).not.toHaveBeenCalled();
190-
});
191-
192187
it('should return an onRequest handler from factory when feature flag is enabled', async () => {
193188
const context = createTestContext({
194189
appConfig: { features: { mrtBasedPageDesignerResolution: true } } as any,

src/middlewares/page-designer-page-resolution.server.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,16 @@ import {
2323
type SiteManifest,
2424
} from '@salesforce/storefront-next-runtime/design/data';
2525
import {
26-
getDefaultDataStoreProvider,
27-
type DataStoreProvider,
26+
DataStore,
2827
DataStoreNotFoundError,
2928
DataStoreUnavailableError,
3029
DataStoreServiceError,
3130
} from '@salesforce/storefront-next-runtime/data-store';
3231
import type { ShopperExperience, Middleware, Clients } from '@salesforce/storefront-next-runtime/scapi';
3332
import { getConfig } from '@salesforce/storefront-next-runtime/config';
3433
import { siteContext } from '@salesforce/storefront-next-runtime/site-context';
35-
import type { AppConfig } from '@/types/config';
3634
import { getTranslation } from '@salesforce/storefront-next-runtime/i18n';
35+
import type { AppConfig } from '@/types/config';
3736
import { scapiMiddlewareContext } from '@/lib/scapi-middleware';
3837
import { getLogger } from '@/lib/logger.server';
3938
import type { Logger } from '@/lib/logger';
@@ -56,6 +55,7 @@ type ManifestWrapperKey<TType extends ManifestType> = TType extends 'page' ? 'co
5655
type ManifestValue<TType extends ManifestType> = {
5756
[K in ManifestWrapperKey<TType>]: string;
5857
};
58+
type DataStoreClient = Pick<DataStore, 'getEntry'>;
5959

6060
/**
6161
* Thrown when a Data Store entry cannot be decoded (base64), decompressed
@@ -127,16 +127,11 @@ function createPageResolutionMiddleware(
127127
const locale = i18next.language ?? config.i18n.fallbackLng;
128128
const logger = getLogger(context);
129129
const onError = getErrorHandler(logger);
130-
const dataStorePromise = getDefaultDataStoreProvider();
130+
const dataStore = DataStore.getDataStore();
131131

132132
return {
133133
async onRequest({ request }) {
134134
const metrics: Metrics = {};
135-
const dataStore = await dataStorePromise;
136-
137-
if (!dataStore) {
138-
return;
139-
}
140135

141136
const response = await resolveGetPageRequest({
142137
metrics,
@@ -280,7 +275,7 @@ async function resolveGetPageRequest({
280275
}: {
281276
request: Request;
282277
context: RouterContextProvider | Readonly<RouterContextProvider>;
283-
dataStore: DataStoreProvider;
278+
dataStore: DataStoreClient;
284279
siteId: string;
285280
locale: string;
286281
metrics: Metrics;
@@ -367,7 +362,7 @@ function getPageResolutionParams({
367362
onError,
368363
clients,
369364
}: {
370-
dataStore: DataStoreProvider;
365+
dataStore: DataStoreClient;
371366
siteId: string;
372367
locale: string;
373368
pageId: string;
@@ -456,7 +451,7 @@ function getPageManifestStorage({
456451
onError,
457452
metrics,
458453
}: {
459-
dataStore: DataStoreProvider;
454+
dataStore: DataStoreClient;
460455
siteId: string;
461456
onError: (error: unknown) => void;
462457
metrics: Metrics;
@@ -489,14 +484,14 @@ function getPageManifestStorage({
489484
* @throws {DataStoreEntryUnpackError} If decoding, decompression, or parsing fails.
490485
*/
491486
async function getAndUnpackDataStoreEntry(
492-
dataStore: DataStoreProvider,
487+
dataStore: DataStoreClient,
493488
key: string,
494489
manifestType: ManifestType,
495490
metrics: Metrics
496491
): Promise<PageManifest | SiteManifest> {
497492
metrics[`${manifestType}ManifestRetrievalStart`] = performance.now();
498493

499-
const entry = await dataStore.getEntry<ManifestValue<typeof manifestType>>(key);
494+
const entry = (await dataStore.getEntry(key)) as { value?: ManifestValue<typeof manifestType> } | undefined;
500495

501496
metrics[`${manifestType}ManifestRetrievalEnd`] = performance.now();
502497

@@ -509,7 +504,7 @@ async function getAndUnpackDataStoreEntry(
509504

510505
metrics[`${manifestType}ManifestUnpackStart`] = performance.now();
511506

512-
if (!entry.value?.compressedData && !entry.value?.data) {
507+
if (!entry.value) {
513508
// This will get caught so the error message doesn't
514509
// really matter here.
515510
throw new Error('Data store entry is blank');

vite.config.ts

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
import { dirname, resolve } from 'node:path';
1717
import { fileURLToPath } from 'node:url';
18-
import { existsSync, readFileSync } from 'node:fs';
18+
import { readFileSync } from 'node:fs';
1919
import { defineConfig, perEnvironmentPlugin, loadEnv } from 'vite';
2020
import tailwindcss from '@tailwindcss/vite';
2121
import tsconfigPaths from 'vite-tsconfig-paths';
@@ -70,20 +70,6 @@ export default defineConfig(({ mode }) => {
7070
'See .env.default for a complete example.'
7171
);
7272
}
73-
74-
const localProviderPath = resolve(__dirname, '../storefront-next-dev/dist/data-store/local-provider.js');
75-
const mrtUtilitiesPath = resolve(
76-
__dirname,
77-
'../storefront-next-runtime/node_modules/@salesforce/mrt-utilities/dist/esm/middleware/index.js'
78-
);
79-
const localDevAliases: Record<string, string> = {};
80-
if (existsSync(localProviderPath)) {
81-
localDevAliases['@salesforce/storefront-next-dev/data-store/local-provider'] = localProviderPath;
82-
}
83-
if (existsSync(mrtUtilitiesPath)) {
84-
localDevAliases['@salesforce/mrt-utilities/middleware'] = mrtUtilitiesPath;
85-
}
86-
8773
return {
8874
build: {
8975
sourcemap: true,
@@ -180,20 +166,11 @@ export default defineConfig(({ mode }) => {
180166
// Server-only config access (must be before '@' to take precedence)
181167
'@/config/server': resolve(__dirname, './config.server.ts'),
182168
'@': resolve(__dirname, './src'),
183-
// Fonts alias for easy customization
184-
...localDevAliases,
185169
// Fonts alias — uses root-absolute path (not a filesystem resolve) because fonts
186170
// live in public/. Vite serves public assets at the root, so '/fonts' maps to
187171
// public/fonts/. Using resolve(__dirname, './public/fonts') would trigger Vite
188172
// warnings about importing from the public directory.
189173
'@fonts': '/fonts',
190-
// The mrt-utilities package's "development" export condition points to
191-
// ./src/index.ts which doesn't exist in the published package. Alias to
192-
// the ESM dist to fix module resolution in tests and dev.
193-
'@salesforce/mrt-utilities': resolve(
194-
__dirname,
195-
'../storefront-next-runtime/node_modules/@salesforce/mrt-utilities/dist/esm/index.js'
196-
),
197174
},
198175
// Prevent duplicate React instances in the monorepo. hooks break if multiple copies are loaded
199176
dedupe: ['react', 'react-dom', 'react-router'],

0 commit comments

Comments
 (0)