42269cc45b
## Summary This preserves percent-encoded payloads when normalizing links fields. `lowercaseUrlOriginAndRemoveTrailingSlash` was decoding the path and query string while lowercasing the URL origin. That changes URLs where encoded payloads are semantically significant, such as Google Maps links containing `%2F` segments. Closes #18698. ## Changes - stop decoding the path/query payload in `lowercaseUrlOriginAndRemoveTrailingSlash` - preserve the raw path, query, and hash while still lowercasing the origin and trimming a trailing slash - update shared URL normalization tests to assert encoded payloads stay encoded - add a server-side regression test covering imported links field normalization ## Validation - `corepack yarn jest --config packages/twenty-shared/jest.config.mjs packages/twenty-shared/src/utils/url/__tests__/lowercaseUrlOriginAndRemoveTrailingSlash.test.ts --runInBand` - `corepack yarn jest --config packages/twenty-server/jest.config.mjs packages/twenty-server/src/engine/core-modules/record-transformer/utils/__tests__/transform-links-value.util.spec.ts --runInBand` - `corepack yarn nx test twenty-server --runInBand --testFile=src/engine/core-modules/record-transformer/utils/__tests__/transform-links-value.util.spec.ts` --------- Co-authored-by: Charles Bochet <charles@twenty.com>
16 lines
555 B
TypeScript
16 lines
555 B
TypeScript
import { getURLSafely } from '@/utils/getURLSafely';
|
|
import { isDefined } from '@/utils/validation';
|
|
|
|
// Lowercases the URL origin (scheme + host) and removes a trailing slash.
|
|
// URL() already lowercases the origin and preserves percent-encoded sequences
|
|
// in the path, query, and hash (e.g. %2F stays %2F, %2520 stays %2520).
|
|
export const normalizeUrlOrigin = (rawUrl: string) => {
|
|
const url = getURLSafely(rawUrl);
|
|
|
|
if (!isDefined(url)) {
|
|
return rawUrl;
|
|
}
|
|
|
|
return (url.origin + url.pathname + url.search + url.hash).replace(/\/$/, '');
|
|
};
|