fix(@angular/build): ensure locale base href retains leading slash (#… · angular/angular-cli@0fc7d57

1+

/**

2+

* @license

3+

* Copyright Google LLC All Rights Reserved.

4+

*

5+

* Use of this source code is governed by an MIT-style license that can be

6+

* found in the LICENSE file at https://angular.dev/license

7+

*/

8+9+

import { NormalizedApplicationBuildOptions, getLocaleBaseHref } from './options';

10+11+

describe('getLocaleBaseHref', () => {

12+

const baseI18nOptions: NormalizedApplicationBuildOptions['i18nOptions'] = {

13+

inlineLocales: new Set(),

14+

sourceLocale: 'en-US',

15+

locales: {},

16+

flatOutput: false,

17+

shouldInline: false,

18+

hasDefinedSourceLocale: false,

19+

};

20+21+

it('should return undefined if flatOutput is true', () => {

22+

const result = getLocaleBaseHref(undefined, { ...baseI18nOptions, flatOutput: true }, 'fr');

23+

expect(result).toBeUndefined();

24+

});

25+26+

it('should return undefined if locale is not found', () => {

27+

const result = getLocaleBaseHref(undefined, baseI18nOptions, 'fr');

28+

expect(result).toBeUndefined();

29+

});

30+31+

it('should return baseHref from locale data if present', () => {

32+

const i18nOptions = {

33+

...baseI18nOptions,

34+

locales: {

35+

fr: {

36+

files: [],

37+

translation: {},

38+

subPath: 'fr',

39+

baseHref: '/fr/',

40+

},

41+

},

42+

};

43+

const result = getLocaleBaseHref(undefined, i18nOptions, 'fr');

44+

expect(result).toBe('/fr/');

45+

});

46+47+

it('should join baseHref and locale subPath if baseHref is provided', () => {

48+

const i18nOptions = {

49+

...baseI18nOptions,

50+

locales: {

51+

fr: {

52+

files: [],

53+

translation: {},

54+

subPath: 'fr',

55+

},

56+

},

57+

};

58+

const result = getLocaleBaseHref('/app/', i18nOptions, 'fr');

59+

expect(result).toBe('/app/fr/');

60+

});

61+62+

it('should handle missing baseHref (undefined) correctly', () => {

63+

const i18nOptions = {

64+

...baseI18nOptions,

65+

locales: {

66+

fr: {

67+

files: [],

68+

translation: {},

69+

subPath: 'fr',

70+

},

71+

},

72+

};

73+

const result = getLocaleBaseHref(undefined, i18nOptions, 'fr');

74+

expect(result).toBe('/fr/');

75+

});

76+77+

it('should handle empty baseHref correctly', () => {

78+

const i18nOptions = {

79+

...baseI18nOptions,

80+

locales: {

81+

fr: {

82+

files: [],

83+

translation: {},

84+

subPath: 'fr',

85+

},

86+

},

87+

};

88+

const result = getLocaleBaseHref('', i18nOptions, 'fr');

89+

expect(result).toBe('/fr/');

90+

});

91+92+

it('should strip leading slash if baseHref does not start with slash', () => {

93+

const i18nOptions = {

94+

...baseI18nOptions,

95+

locales: {

96+

fr: {

97+

files: [],

98+

translation: {},

99+

subPath: 'fr',

100+

},

101+

},

102+

};

103+

const result = getLocaleBaseHref('app/', i18nOptions, 'fr');

104+

expect(result).toBe('app/fr/');

105+

});

106+

});