Skip to content

Commit

Permalink
Updating CXINT-1851 (#17816)
Browse files Browse the repository at this point in the history
Co-authored-by: kpawelczak <[email protected]>
  • Loading branch information
SherwinVarghese and kpawelczak authored Sep 7, 2023
1 parent 647e237 commit 1f1e4b9
Show file tree
Hide file tree
Showing 15 changed files with 256 additions and 76 deletions.
2 changes: 2 additions & 0 deletions core-libs/setup/ssr/optimized-engine/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@
export * from './optimized-ssr-engine';
export * from './rendering-cache';
export * from './ssr-optimization-options';
export * from './rendering-strategy-resolver';
export * from './rendering-strategy-resolver-options';
37 changes: 22 additions & 15 deletions core-libs/setup/ssr/optimized-engine/optimized-ssr-engine.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1194,6 +1194,7 @@ describe('OptimizedSsrEngine', () => {
"maxRenderTime": 300000,
"reuseCurrentRendering": true,
"debug": false,
"renderingStrategyResolver": "(request) => {\\n return shouldFallbackToCsr(request, options)\\n ? ssr_optimization_options_1.RenderingStrategy.ALWAYS_CSR\\n : ssr_optimization_options_1.RenderingStrategy.DEFAULT;\\n}",
"logger": true
}
}
Expand All @@ -1206,20 +1207,25 @@ describe('OptimizedSsrEngine', () => {
logger: new MockExpressServerLogger() as ExpressServerLogger,
});
expect(consoleLogSpy.mock.lastCall).toMatchInlineSnapshot(`
[
"[spartacus] SSR optimization engine initialized",
{
"options": {
"concurrency": 10,
"debug": false,
"forcedSsrTimeout": 60000,
"logger": "MockExpressServerLogger",
"maxRenderTime": 300000,
"reuseCurrentRendering": true,
"timeout": 3000,
},
},
]
[
"[spartacus] SSR optimization engine initialized",
{
"options": {
"concurrency": 10,
"debug": false,
"forcedSsrTimeout": 60000,
"logger": "MockExpressServerLogger",
"maxRenderTime": 300000,
"renderingStrategyResolver": "(request) => {
return shouldFallbackToCsr(request, options)
? ssr_optimization_options_1.RenderingStrategy.ALWAYS_CSR
: ssr_optimization_options_1.RenderingStrategy.DEFAULT;
}",
"reuseCurrentRendering": true,
"timeout": 3000,
},
},
]
`);
});
it('should use the legacy server logger, if logger option not specified', () => {
Expand All @@ -1232,7 +1238,8 @@ describe('OptimizedSsrEngine', () => {
"forcedSsrTimeout": 60000,
"maxRenderTime": 300000,
"reuseCurrentRendering": true,
"debug": false
"debug": false,
"renderingStrategyResolver": "(request) => {\\n return shouldFallbackToCsr(request, options)\\n ? ssr_optimization_options_1.RenderingStrategy.ALWAYS_CSR\\n : ssr_optimization_options_1.RenderingStrategy.DEFAULT;\\n}"
}",
]
`);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: 2023 SAP Spartacus team <[email protected]>
*
* SPDX-License-Identifier: Apache-2.0
*/

export interface RenderingStrategyResolverOptions {
excludedUrls?: string[];
excludedParams?: string[];
}

export const defaultRenderingStrategyResolverOptions: RenderingStrategyResolverOptions =
{
excludedUrls: ['checkout', 'my-account'],
excludedParams: ['asm'],
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/// <reference types="jest" />

import { RenderingStrategy } from './ssr-optimization-options';
import { Request } from 'express';

import { defaultRenderingStrategyResolver } from './rendering-strategy-resolver';

describe('RenderingStrategyResolver', () => {
let resolver: (req: Request) => RenderingStrategy =
defaultRenderingStrategyResolver({
excludedUrls: ['checkout', 'my-account'],
excludedParams: ['asm'],
});

it('should return DEFAULT rendering strategy if no excluded parameters or URLs match', () => {
const request: Partial<Request> = {
query: {},
url: '/some-page',
};

const strategy = resolver(request as Request);

expect(strategy).toBe(RenderingStrategy.DEFAULT);
});

it('should return ALWAYS_CSR rendering strategy if an excluded parameter matches', () => {
const request: Partial<Request> = {
query: {
asm: 'true',
},
url: '/some-page',
};

const strategy = resolver(request as Request);

expect(strategy).toBe(RenderingStrategy.ALWAYS_CSR);
});

it('should return ALWAYS_CSR rendering strategy if the URL matches an excluded URL', () => {
const request: Partial<Request> = {
query: {},
url: '/checkout/confirm',
};

const strategy = resolver(request as Request);

expect(strategy).toBe(RenderingStrategy.ALWAYS_CSR);
});

it('should return ALWAYS_CSR rendering strategy if both excluded parameters and URLs match', () => {
const request: Partial<Request> = {
query: {
asm: 'true',
},
url: '/checkout/confirm',
};

const strategy = resolver(request as Request);

expect(strategy).toBe(RenderingStrategy.ALWAYS_CSR);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* SPDX-FileCopyrightText: 2023 SAP Spartacus team <[email protected]>
*
* SPDX-License-Identifier: Apache-2.0
*/

import { Request } from 'express';
import { RenderingStrategy } from './ssr-optimization-options';
import { RenderingStrategyResolverOptions } from './rendering-strategy-resolver-options';

const hasExcludedParams = (
request: Request,
excludedParams: string[] | undefined
): boolean => {
const params: string[] = request.query
? Object.getOwnPropertyNames(request.query)
: [];

if (!excludedParams) {
return false;
}

return excludedParams.some((excludedParam: string) =>
params.some((param: string): boolean => excludedParam === param)
);
};

const hasExcludedUrl = (
request: Request,
excludedUrls: string[] | undefined
) => {
return request.url && excludedUrls
? excludedUrls.some((url) => request.url.search(url) > -1)
: false;
};

const shouldFallbackToCsr = (
request: Request,
{ excludedParams, excludedUrls }: RenderingStrategyResolverOptions
) => {
return (
hasExcludedParams(request, excludedParams) ||
hasExcludedUrl(request, excludedUrls)
);
};

/**
* Creates a rendering strategy resolver function with the specified options.
*
* @function
* @param options - The options to configure the rendering strategy resolver.
* @param [options.excludedUrls] - An optional array of URLs for which server-side rendering (SSR) should be disabled.
* @param [options.excludedParams] - An optional array of Query parameters for which SSR should be disabled.
* @returns A rendering strategy resolver function that takes a Request object
* as a parameter and returns the rendering strategy to be applied for the request, which can be either
* `RenderingStrategy.ALWAYS_CSR` or `RenderingStrategy.DEFAULT`.
*/
export const defaultRenderingStrategyResolver =
(options: RenderingStrategyResolverOptions) =>
(request: Request): RenderingStrategy => {
return shouldFallbackToCsr(request, options)
? RenderingStrategy.ALWAYS_CSR
: RenderingStrategy.DEFAULT;
};
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

import { Request } from 'express';
import { ExpressServerLogger } from '../logger';
import { defaultRenderingStrategyResolver } from './rendering-strategy-resolver';
import { defaultRenderingStrategyResolverOptions } from './rendering-strategy-resolver-options';

export interface SsrOptimizationOptions {
/**
Expand Down Expand Up @@ -54,7 +56,10 @@ export interface SsrOptimizationOptions {
renderKeyResolver?: (req: Request) => string;

/**
* Allows defining custom rendering strategy per request
* This function allows for the definition of a custom rendering strategy on a per-request basis.
* By default, we provide a defaultRenderingStrategyResolver,
* which has a default parameter defaultRenderingStrategyResolverOptions.
* This default option disables server-side rendering (SSR) on pages such as 'checkout' and 'my-account'.
*
* @param req
*/
Expand Down Expand Up @@ -139,6 +144,9 @@ export const defaultSsrOptimizationOptions: SsrOptimizationOptions = {
maxRenderTime: 300_000,
reuseCurrentRendering: true,
debug: false,
renderingStrategyResolver: defaultRenderingStrategyResolver(
defaultRenderingStrategyResolverOptions
),
//CXSPA-3680 - set ExpressServerLogger as default
//logger: new ExpressServerLogger(),
};
Loading

0 comments on commit 1f1e4b9

Please sign in to comment.