@akinon/next 1.108.0-rc.87 → 1.108.0-rc.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,319 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
-
4
- jest.mock(
5
- 'countries',
6
- () => ({
7
- countries: [
8
- { value: 'ae', localizable: true },
9
- { value: 'qa', localizable: true },
10
- { value: 'sa', localizable: true }
11
- ],
12
- countryCurrencyMap: { ae: 'aed', qa: 'qar', sa: 'sar' },
13
- countryShortCodeMap: { ae: 'uae', qa: 'qtr', sa: 'ksa' }
14
- }),
15
- { virtual: true }
16
- );
17
-
18
- jest.mock(
19
- '@theme/routes',
20
- () => ({
21
- ROUTES: {
22
- AUTH: '/auth',
23
- BASKET: '/basket',
24
- ACCOUNT_ORDERS: '/account/orders'
25
- }
26
- }),
27
- { virtual: true }
28
- );
29
-
30
- type Locale = {
31
- value: string;
32
- label?: string;
33
- localePath?: string;
34
- apiValue?: string;
35
- rtl?: boolean;
36
- };
37
-
38
- type Settings = {
39
- localization: {
40
- defaultLocaleValue: string;
41
- localeUrlStrategy: string;
42
- locales: Locale[];
43
- };
44
- };
45
-
46
- function resolveSettingsPath(): string | null {
47
- const insideNodeModules = __dirname.includes('node_modules');
48
-
49
- const candidates: string[] = [];
50
-
51
- if (insideNodeModules) {
52
- const projectRoot = path.resolve(__dirname, '../../../../');
53
- candidates.push(path.join(projectRoot, 'src/settings.js'));
54
- candidates.push(
55
- path.join(projectRoot, 'apps', 'projectzeronext', 'src', 'settings.js')
56
- );
57
- } else {
58
- const repoRoot = path.resolve(__dirname, '../../..');
59
- candidates.push(
60
- path.join(repoRoot, 'apps', 'projectzeronext', 'src', 'settings.js')
61
- );
62
- candidates.push(path.join(repoRoot, 'src', 'settings.js'));
63
- }
64
-
65
- for (const p of candidates) {
66
- if (fs.existsSync(p)) return p;
67
- }
68
-
69
- return null;
70
- }
71
-
72
- function loadProjectSettings(): Settings {
73
- const settingsPath = resolveSettingsPath();
74
- if (settingsPath) {
75
- const settings: any = require(settingsPath);
76
- return settings as Settings;
77
- }
78
-
79
- return {
80
- localization: {
81
- defaultLocaleValue: 'en',
82
- localeUrlStrategy: 'hide-default-locale',
83
- locales: [
84
- { value: 'en', label: 'EN' },
85
- { value: 'tr', label: 'TR' }
86
- ]
87
- }
88
- };
89
- }
90
-
91
- function getUrlPathWithLocaleLocal(
92
- pathname: string,
93
- currentLocale: string | undefined,
94
- settings: Settings
95
- ): string {
96
- const { defaultLocaleValue, localeUrlStrategy } = settings.localization;
97
- const effectiveLocale = currentLocale ?? defaultLocaleValue;
98
-
99
- if (
100
- localeUrlStrategy === 'subdomain' ||
101
- localeUrlStrategy === 'hide-all-locales'
102
- ) {
103
- return pathname;
104
- }
105
-
106
- if (localeUrlStrategy === 'hide-default-locale') {
107
- if (effectiveLocale === defaultLocaleValue) {
108
- return pathname;
109
- }
110
- return `/${effectiveLocale}${pathname}`;
111
- }
112
-
113
- return `/${effectiveLocale}${pathname}`;
114
- }
115
-
116
- function computeUrlLocaleMatcherRegex(settings: Settings): RegExp {
117
- const { locales, localeUrlStrategy, defaultLocaleValue } =
118
- settings.localization;
119
-
120
- const filtered =
121
- localeUrlStrategy === 'show-all-locales' ||
122
- localeUrlStrategy === 'subdomain'
123
- ? locales
124
- : locales.filter((l: any) => l.value !== defaultLocaleValue);
125
-
126
- return new RegExp(
127
- `^/(${filtered.map((l: any) => l.value).join('|')})(?=/|$)`
128
- );
129
- }
130
-
131
- function redirectMinimal(
132
- destPath: string,
133
- pageUrlInput: string,
134
- settings: Settings
135
- ): string {
136
- const regex = computeUrlLocaleMatcherRegex(settings);
137
- const pageUrl = new URL(pageUrlInput);
138
- let currentLocaleValue = settings.localization.defaultLocaleValue;
139
-
140
- const match = pageUrl.pathname.match(regex);
141
- if (match && match[0]) {
142
- currentLocaleValue = match[0].replace('/', '');
143
- }
144
-
145
- const redirectUrlWithLocale = getUrlPathWithLocaleLocal(
146
- destPath,
147
- currentLocaleValue,
148
- settings
149
- );
150
-
151
- const callbackPath = pageUrl.pathname.replace(regex, '');
152
-
153
- return `${redirectUrlWithLocale}?callbackUrl=${callbackPath}`;
154
- }
155
-
156
- describe('Redirect utility functional tests', () => {
157
- const settings = loadProjectSettings();
158
-
159
- function buildPageUrl(pathAfter: string, locale: string): string {
160
- const { defaultLocaleValue, localeUrlStrategy } = settings.localization;
161
- const isDefault = locale === defaultLocaleValue;
162
- let prefix = '';
163
- if (isDefault) {
164
- prefix = localeUrlStrategy === 'show-all-locales' ? `/${locale}` : '';
165
- } else {
166
- prefix = `/${locale}`;
167
- }
168
- return `https://example.com${prefix}${pathAfter}`;
169
- }
170
-
171
- describe('getUrlPathWithLocale functional tests', () => {
172
- it('should respect project localeUrlStrategy dynamically', () => {
173
- const { defaultLocaleValue, locales, localeUrlStrategy } =
174
- settings.localization;
175
-
176
- const nonDefault = locales.find((l) => l.value !== defaultLocaleValue);
177
-
178
- const resultDefault = getUrlPathWithLocaleLocal(
179
- '/login',
180
- defaultLocaleValue,
181
- settings
182
- );
183
- const resultNonDefault = nonDefault
184
- ? getUrlPathWithLocaleLocal('/login', nonDefault.value, settings)
185
- : null;
186
- const resultUndefined = getUrlPathWithLocaleLocal(
187
- '/login',
188
- undefined,
189
- settings
190
- );
191
-
192
- if (localeUrlStrategy === 'hide-default-locale') {
193
- expect(resultDefault).toBe('/login');
194
- if (resultNonDefault && nonDefault) {
195
- expect(resultNonDefault).toBe(`/${nonDefault.value}/login`);
196
- }
197
- expect(resultUndefined).toBe('/login');
198
- } else if (localeUrlStrategy === 'show-all-locales') {
199
- expect(resultDefault).toBe(`/${defaultLocaleValue}/login`);
200
- if (resultNonDefault && nonDefault) {
201
- expect(resultNonDefault).toBe(`/${nonDefault.value}/login`);
202
- }
203
- expect(resultUndefined).toBe(`/${defaultLocaleValue}/login`);
204
- } else if (localeUrlStrategy === 'hide-all-locales') {
205
- expect(resultDefault).toBe('/login');
206
- if (resultNonDefault) {
207
- expect(resultNonDefault).toBe('/login');
208
- }
209
- expect(resultUndefined).toBe('/login');
210
- } else if (localeUrlStrategy === 'subdomain') {
211
- expect(resultDefault).toBe('/login');
212
- if (resultNonDefault) {
213
- expect(resultNonDefault).toBe('/login');
214
- }
215
- expect(resultUndefined).toBe('/login');
216
- }
217
- });
218
- });
219
-
220
- describe('redirect function behavior (simulated)', () => {
221
- it('should redirect with correct URL for default locale (no query preserved)', () => {
222
- const { defaultLocaleValue } = settings.localization;
223
- const regex = computeUrlLocaleMatcherRegex(settings);
224
- const url = buildPageUrl(
225
- '/profile?tab=settings&view=list#frag',
226
- defaultLocaleValue
227
- );
228
- const matched = new URL(url).pathname.match(regex)?.[0]?.replace('/', '');
229
- const expectedPath = getUrlPathWithLocaleLocal(
230
- '/login',
231
- matched,
232
- settings
233
- );
234
- const out = redirectMinimal('/login', url, settings);
235
- expect(out).toBe(`${expectedPath}?callbackUrl=/profile`);
236
- });
237
-
238
- it('should handle non-default locale from path', () => {
239
- const nonDefault = settings.localization.locales.find(
240
- (l) => l.value !== settings.localization.defaultLocaleValue
241
- );
242
- if (!nonDefault) return;
243
- const url = buildPageUrl('/products/123', nonDefault.value);
244
- const regex = computeUrlLocaleMatcherRegex(settings);
245
- const matched = new URL(url).pathname.match(regex)?.[0]?.replace('/', '');
246
- const expectedPath = getUrlPathWithLocaleLocal(
247
- '/auth',
248
- matched,
249
- settings
250
- );
251
- const out = redirectMinimal('/auth', url, settings);
252
- expect(out).toBe(`${expectedPath}?callbackUrl=/products/123`);
253
- });
254
-
255
- it('should use env fallback when header missing (no query preserved)', () => {
256
- const { defaultLocaleValue } = settings.localization;
257
- const url = buildPageUrl('/some/path?x=1#y', defaultLocaleValue).replace(
258
- 'https://example.com',
259
- 'https://fallback.com'
260
- );
261
- const regex = computeUrlLocaleMatcherRegex(settings);
262
- const matched = new URL(url).pathname.match(regex)?.[0]?.replace('/', '');
263
- const expectedPath = getUrlPathWithLocaleLocal(
264
- '/login',
265
- matched,
266
- settings
267
- );
268
- const out = redirectMinimal('/login', url, settings);
269
- expect(out).toBe(`${expectedPath}?callbackUrl=/some/path`);
270
- });
271
-
272
- it('should throw with invalid URL', () => {
273
- expect(() => new URL('')).toThrow();
274
- });
275
-
276
- it('should mention RedirectType usage in implementation', () => {
277
- const redirectFilePath = path.resolve(__dirname, '../utils/redirect.ts');
278
- const content = fs.readFileSync(redirectFilePath, 'utf8');
279
- expect(content.includes('RedirectType')).toBe(true);
280
- expect(content.includes('nextRedirect(redirectUrl, type)')).toBe(true);
281
- expect(content.includes('nextRedirect(redirectUrl)')).toBe(true);
282
- });
283
- });
284
-
285
- describe('URL locale matcher regex behavior (simulated)', () => {
286
- it('should match prefixes based on project strategy', () => {
287
- const { defaultLocaleValue, locales, localeUrlStrategy } =
288
- settings.localization;
289
- const urlLocaleMatcherRegex = computeUrlLocaleMatcherRegex(settings);
290
-
291
- const nonDefault = locales.find((l) => l.value !== defaultLocaleValue);
292
-
293
- if (localeUrlStrategy === 'show-all-locales') {
294
- expect(
295
- urlLocaleMatcherRegex.test(`/${defaultLocaleValue}/profile`)
296
- ).toBe(true);
297
- } else {
298
- expect(
299
- urlLocaleMatcherRegex.test(`/${defaultLocaleValue}/profile`)
300
- ).toBe(false);
301
- }
302
-
303
- if (nonDefault) {
304
- expect(urlLocaleMatcherRegex.test(`/${nonDefault.value}/profile`)).toBe(
305
- true
306
- );
307
- }
308
- expect(urlLocaleMatcherRegex.test('/profile')).toBe(false);
309
- });
310
- });
311
-
312
- it('should verify redirect utility file exists and has expected structure', () => {
313
- const redirectFilePath = path.resolve(__dirname, '../utils/redirect.ts');
314
- const redirectFileContent = fs.readFileSync(redirectFilePath, 'utf8');
315
- expect(redirectFileContent.includes('export const redirect')).toBe(true);
316
- expect(redirectFileContent.includes('getUrlPathWithLocale')).toBe(true);
317
- expect(redirectFileContent.includes('callbackUrl')).toBe(true);
318
- });
319
- });
@@ -1,72 +0,0 @@
1
- import { Cache, CacheKey } from '../../lib/cache';
2
- import { basket } from '../../data/urls';
3
- import { Basket } from '../../types';
4
- import appFetch from '../../utils/app-fetch';
5
- import { ServerVariables } from '../../utils/server-variables';
6
- import logger from '../../utils/log';
7
-
8
- type GetBasketParams = {
9
- locale?: string;
10
- currency?: string;
11
- namespace?: string;
12
- };
13
-
14
- const getBasketDataHandler = ({
15
- locale,
16
- currency,
17
- namespace
18
- }: GetBasketParams) => {
19
- return async function () {
20
- try {
21
- const url = namespace
22
- ? basket.getBasketDetail(namespace)
23
- : basket.getBasket;
24
-
25
- const basketData = await appFetch<{ basket: Basket }>({
26
- url,
27
- locale,
28
- currency,
29
- init: {
30
- headers: {
31
- Accept: 'application/json',
32
- 'Content-Type': 'application/json'
33
- }
34
- }
35
- });
36
-
37
- if (!basketData?.basket) {
38
- logger.warn('Basket data is undefined', {
39
- handler: 'getBasketDataHandler',
40
- namespace
41
- });
42
- }
43
-
44
- return basketData;
45
- } catch (error) {
46
- logger.error('Error fetching basket data', {
47
- handler: 'getBasketDataHandler',
48
- error,
49
- namespace
50
- });
51
- throw error;
52
- }
53
- };
54
- };
55
-
56
- export const getBasketData = async ({
57
- locale = ServerVariables.locale,
58
- currency = ServerVariables.currency,
59
- namespace
60
- }: GetBasketParams = {}) => {
61
- return Cache.wrap(
62
- CacheKey.Basket(namespace),
63
- locale,
64
- getBasketDataHandler({ locale, currency, namespace }),
65
- {
66
- expire: 0,
67
- cache: false
68
- }
69
- );
70
- };
71
-
72
-