Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updating CXINT-1851 #17816

Merged
merged 4 commits into from
Sep 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading