@akinon/next 2.0.33-rc.0 → 2.0.33
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.
- package/CHANGELOG.md +1 -24
- package/bin/pz-generate-routes.js +1 -4
- package/components/plugin-module.tsx +1 -0
- package/data/client/checkout.ts +1 -0
- package/data/server/category.ts +1 -13
- package/data/server/list.ts +0 -12
- package/data/server/product.ts +0 -10
- package/data/server/special-page.ts +0 -13
- package/data/server/widget.ts +1 -14
- package/data/urls.ts +4 -9
- package/hooks/use-captcha.tsx +1 -1
- package/middlewares/default.ts +205 -252
- package/package.json +2 -2
- package/plugins.d.ts +0 -10
- package/plugins.js +0 -1
- package/redux/middlewares/checkout.ts +3 -45
- package/redux/middlewares/pre-order/installment-option.ts +1 -9
- package/types/index.ts +9 -20
- package/utils/csrf.ts +1 -1
- package/with-pz-config.js +2 -3
- package/utils/payload-optimizer.ts +0 -481
package/middlewares/default.ts
CHANGED
|
@@ -18,11 +18,7 @@ import {
|
|
|
18
18
|
withBfcacheHeaders
|
|
19
19
|
} from '.';
|
|
20
20
|
import { getCsrfCookieFlags, urlLocaleMatcherRegex } from '../utils';
|
|
21
|
-
import {
|
|
22
|
-
getPzSegmentsConfig,
|
|
23
|
-
encodePzValue,
|
|
24
|
-
isLegacyMode
|
|
25
|
-
} from '../utils/pz-segments';
|
|
21
|
+
import { getPzSegmentsConfig, encodePzValue, isLegacyMode } from '../utils/pz-segments';
|
|
26
22
|
import withCurrency from './currency';
|
|
27
23
|
import withLocale from './locale';
|
|
28
24
|
import logger from '../utils/log';
|
|
@@ -336,98 +332,98 @@ const withPzDefault =
|
|
|
336
332
|
req: PzNextRequest,
|
|
337
333
|
event: NextFetchEvent
|
|
338
334
|
) => {
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
335
|
+
let middlewareResult: NextResponse | void =
|
|
336
|
+
NextResponse.next();
|
|
337
|
+
|
|
338
|
+
try {
|
|
339
|
+
const { locale, prettyUrl, currency } =
|
|
340
|
+
req.middlewareParams.rewrites;
|
|
341
|
+
const { defaultLocaleValue } =
|
|
342
|
+
Settings.localization;
|
|
343
|
+
const url = req.nextUrl.clone();
|
|
344
|
+
const pathnameWithoutLocale =
|
|
345
|
+
url.pathname.replace(
|
|
346
|
+
urlLocaleMatcherRegex,
|
|
347
|
+
''
|
|
348
|
+
);
|
|
353
349
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
350
|
+
middlewareResult = (await middleware(
|
|
351
|
+
req,
|
|
352
|
+
event
|
|
353
|
+
)) as NextResponse | void;
|
|
358
354
|
|
|
359
|
-
|
|
355
|
+
let customRewriteUrlDiff = '';
|
|
360
356
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
357
|
+
if (
|
|
358
|
+
middlewareResult instanceof
|
|
359
|
+
NextResponse &&
|
|
360
|
+
middlewareResult.headers.get(
|
|
361
|
+
'pz-override-response'
|
|
362
|
+
) &&
|
|
363
|
+
middlewareResult.headers.get(
|
|
364
|
+
'x-middleware-rewrite'
|
|
365
|
+
)
|
|
366
|
+
) {
|
|
367
|
+
const rewriteUrl = new URL(
|
|
367
368
|
middlewareResult.headers.get(
|
|
368
369
|
'x-middleware-rewrite'
|
|
369
370
|
)
|
|
370
|
-
)
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
371
|
+
);
|
|
372
|
+
const originalUrl = new URL(req.url);
|
|
373
|
+
customRewriteUrlDiff =
|
|
374
|
+
rewriteUrl.pathname.replace(
|
|
375
|
+
originalUrl.pathname,
|
|
376
|
+
''
|
|
375
377
|
);
|
|
376
|
-
|
|
377
|
-
customRewriteUrlDiff =
|
|
378
|
-
rewriteUrl.pathname.replace(
|
|
379
|
-
originalUrl.pathname,
|
|
380
|
-
''
|
|
381
|
-
);
|
|
382
|
-
}
|
|
378
|
+
}
|
|
383
379
|
|
|
384
|
-
|
|
380
|
+
let ordersPrefix: string;
|
|
385
381
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
382
|
+
if (isLegacyMode(Settings)) {
|
|
383
|
+
url.basePath = `/${commerceUrl}`;
|
|
384
|
+
url.pathname =
|
|
385
|
+
`/${locale.length ? `${locale}/` : ''}${currency}/${customRewriteUrlDiff}${
|
|
386
|
+
prettyUrl ?? pathnameWithoutLocale
|
|
387
|
+
}`.replace(/\/+/g, '/');
|
|
388
|
+
ordersPrefix = `/${currency}/orders`;
|
|
389
|
+
} else {
|
|
390
|
+
const pzConfig =
|
|
391
|
+
getPzSegmentsConfig(Settings);
|
|
392
|
+
const fullUrlPath =
|
|
393
|
+
`${customRewriteUrlDiff}${
|
|
391
394
|
prettyUrl ?? pathnameWithoutLocale
|
|
392
395
|
}`.replace(/\/+/g, '/');
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
string
|
|
425
|
-
> = {
|
|
426
|
-
locale: resolvedLocale,
|
|
427
|
-
currency,
|
|
428
|
-
url: encodeURIComponent(fullUrl),
|
|
429
|
-
...Object.fromEntries(
|
|
430
|
-
customSegments.map((seg) => [
|
|
396
|
+
const fullUrl = `${req.nextUrl.origin}${fullUrlPath}`;
|
|
397
|
+
const resolvedLocale =
|
|
398
|
+
locale?.length > 0
|
|
399
|
+
? locale
|
|
400
|
+
: Settings.localization
|
|
401
|
+
.defaultLocaleValue;
|
|
402
|
+
const resolveContext = {
|
|
403
|
+
req,
|
|
404
|
+
event,
|
|
405
|
+
url,
|
|
406
|
+
locale: resolvedLocale,
|
|
407
|
+
currency,
|
|
408
|
+
pathname: pathnameWithoutLocale
|
|
409
|
+
};
|
|
410
|
+
const customSegments = pzConfig.segments
|
|
411
|
+
.filter(
|
|
412
|
+
(seg) =>
|
|
413
|
+
seg.name !== 'locale' &&
|
|
414
|
+
seg.name !== 'currency' &&
|
|
415
|
+
seg.name !== 'url'
|
|
416
|
+
);
|
|
417
|
+
const segmentValues: Record<
|
|
418
|
+
string,
|
|
419
|
+
string
|
|
420
|
+
> = {
|
|
421
|
+
locale: resolvedLocale,
|
|
422
|
+
currency,
|
|
423
|
+
url: encodeURIComponent(fullUrl),
|
|
424
|
+
...Object.fromEntries(
|
|
425
|
+
customSegments
|
|
426
|
+
.map((seg) => [
|
|
431
427
|
seg.name,
|
|
432
428
|
req.middlewareParams.rewrites[
|
|
433
429
|
seg.name
|
|
@@ -436,121 +432,105 @@ const withPzDefault =
|
|
|
436
432
|
? seg.resolve(resolveContext)
|
|
437
433
|
: '')
|
|
438
434
|
])
|
|
439
|
-
|
|
440
|
-
|
|
435
|
+
)
|
|
436
|
+
};
|
|
441
437
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
438
|
+
const pzValue = encodePzValue(
|
|
439
|
+
segmentValues,
|
|
440
|
+
pzConfig
|
|
441
|
+
);
|
|
442
|
+
|
|
443
|
+
url.pathname =
|
|
444
|
+
`/${pzValue}/${fullUrlPath}`.replace(
|
|
445
|
+
/\/+/g,
|
|
446
|
+
'/'
|
|
445
447
|
);
|
|
448
|
+
ordersPrefix = `/${pzValue}/orders`;
|
|
449
|
+
}
|
|
446
450
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
451
|
+
if (
|
|
452
|
+
Settings.usePrettyUrlRoute &&
|
|
453
|
+
url.searchParams.toString().length > 0 &&
|
|
454
|
+
!Object.entries(ROUTES).find(
|
|
455
|
+
([, value]) =>
|
|
456
|
+
new RegExp(`^${value}/?$`).test(
|
|
457
|
+
pathnameWithoutLocale
|
|
458
|
+
)
|
|
459
|
+
)
|
|
460
|
+
) {
|
|
461
|
+
url.pathname =
|
|
462
|
+
url.pathname +
|
|
463
|
+
(/\/$/.test(url.pathname) ? '' : '/') +
|
|
464
|
+
`searchparams|${encodeURIComponent(
|
|
465
|
+
url.searchParams.toString()
|
|
466
|
+
)}`;
|
|
467
|
+
}
|
|
454
468
|
|
|
469
|
+
Settings.rewrites.forEach((rewrite) => {
|
|
470
|
+
url.pathname = url.pathname.replace(
|
|
471
|
+
rewrite.source,
|
|
472
|
+
rewrite.destination
|
|
473
|
+
);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
// if middleware.ts has a return value for current url
|
|
477
|
+
if (
|
|
478
|
+
middlewareResult instanceof NextResponse
|
|
479
|
+
) {
|
|
480
|
+
// pz-override-response header is used to prevent 404 page for custom responses.
|
|
455
481
|
if (
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
!Object.entries(ROUTES).find(
|
|
460
|
-
([, value]) =>
|
|
461
|
-
new RegExp(`^${value}/?$`).test(
|
|
462
|
-
pathnameWithoutLocale
|
|
463
|
-
)
|
|
464
|
-
)
|
|
482
|
+
middlewareResult.headers.get(
|
|
483
|
+
'pz-override-response'
|
|
484
|
+
) !== 'true'
|
|
465
485
|
) {
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
? ''
|
|
470
|
-
: '/') +
|
|
471
|
-
`searchparams|${encodeURIComponent(
|
|
472
|
-
url.searchParams.toString()
|
|
473
|
-
)}`;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
Settings.rewrites.forEach((rewrite) => {
|
|
477
|
-
url.pathname = url.pathname.replace(
|
|
478
|
-
rewrite.source,
|
|
479
|
-
rewrite.destination
|
|
486
|
+
middlewareResult.headers.set(
|
|
487
|
+
'x-middleware-rewrite',
|
|
488
|
+
url.href
|
|
480
489
|
);
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
middlewareResult
|
|
490
|
+
} else if (
|
|
491
|
+
middlewareResult.headers.get(
|
|
492
|
+
'x-middleware-rewrite'
|
|
493
|
+
) &&
|
|
494
|
+
middlewareResult.headers.get(
|
|
495
|
+
'pz-override-response'
|
|
496
|
+
) === 'true'
|
|
486
497
|
) {
|
|
487
|
-
// pz-override-response header is used to prevent 404 page for custom responses.
|
|
488
|
-
if (
|
|
489
|
-
middlewareResult.headers.get(
|
|
490
|
-
'pz-override-response'
|
|
491
|
-
) !== 'true'
|
|
492
|
-
) {
|
|
493
|
-
middlewareResult.headers.set(
|
|
494
|
-
'x-middleware-rewrite',
|
|
495
|
-
url.href
|
|
496
|
-
);
|
|
497
|
-
} else if (
|
|
498
|
-
middlewareResult.headers.get(
|
|
499
|
-
'x-middleware-rewrite'
|
|
500
|
-
) &&
|
|
501
|
-
middlewareResult.headers.get(
|
|
502
|
-
'pz-override-response'
|
|
503
|
-
) === 'true'
|
|
504
|
-
) {
|
|
505
|
-
middlewareResult =
|
|
506
|
-
NextResponse.rewrite(url);
|
|
507
|
-
}
|
|
508
|
-
} else {
|
|
509
|
-
// if middleware.ts doesn't have a return value.
|
|
510
|
-
// e.g. NextResponse.next() doesn't exist in middleware.ts
|
|
511
|
-
|
|
512
498
|
middlewareResult =
|
|
513
499
|
NextResponse.rewrite(url);
|
|
514
500
|
}
|
|
501
|
+
} else {
|
|
502
|
+
// if middleware.ts doesn't have a return value.
|
|
503
|
+
// e.g. NextResponse.next() doesn't exist in middleware.ts
|
|
515
504
|
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
const fallbackHost =
|
|
520
|
-
req.headers.get('x-forwarded-host') ||
|
|
521
|
-
req.headers.get('host');
|
|
522
|
-
const hostname =
|
|
523
|
-
process.env.NEXT_PUBLIC_URL ||
|
|
524
|
-
`https://${fallbackHost}`;
|
|
525
|
-
const rootHostname =
|
|
526
|
-
localeUrlStrategy ===
|
|
527
|
-
LocaleUrlStrategy.Subdomain
|
|
528
|
-
? getRootHostname(hostname)
|
|
529
|
-
: null;
|
|
505
|
+
middlewareResult =
|
|
506
|
+
NextResponse.rewrite(url);
|
|
507
|
+
}
|
|
530
508
|
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
1000 * 60 * 60 * 24 * 7
|
|
546
|
-
) // 7 days
|
|
547
|
-
}
|
|
548
|
-
);
|
|
549
|
-
}
|
|
509
|
+
const { localeUrlStrategy } =
|
|
510
|
+
Settings.localization;
|
|
511
|
+
|
|
512
|
+
const fallbackHost =
|
|
513
|
+
req.headers.get('x-forwarded-host') ||
|
|
514
|
+
req.headers.get('host');
|
|
515
|
+
const hostname =
|
|
516
|
+
process.env.NEXT_PUBLIC_URL ||
|
|
517
|
+
`https://${fallbackHost}`;
|
|
518
|
+
const rootHostname =
|
|
519
|
+
localeUrlStrategy ===
|
|
520
|
+
LocaleUrlStrategy.Subdomain
|
|
521
|
+
? getRootHostname(hostname)
|
|
522
|
+
: null;
|
|
550
523
|
|
|
524
|
+
if (
|
|
525
|
+
!url.pathname.startsWith(
|
|
526
|
+
ordersPrefix
|
|
527
|
+
)
|
|
528
|
+
) {
|
|
551
529
|
middlewareResult.cookies.set(
|
|
552
|
-
'pz-
|
|
553
|
-
|
|
530
|
+
'pz-locale',
|
|
531
|
+
locale?.length > 0
|
|
532
|
+
? locale
|
|
533
|
+
: defaultLocaleValue,
|
|
554
534
|
{
|
|
555
535
|
domain: rootHostname,
|
|
556
536
|
sameSite: 'none',
|
|
@@ -560,6 +540,7 @@ const withPzDefault =
|
|
|
560
540
|
) // 7 days
|
|
561
541
|
}
|
|
562
542
|
);
|
|
543
|
+
}
|
|
563
544
|
|
|
564
545
|
middlewareResult.cookies.set(
|
|
565
546
|
'pz-currency',
|
|
@@ -602,87 +583,59 @@ const withPzDefault =
|
|
|
602
583
|
req.cookies.get('pz-post-checkout-flow')
|
|
603
584
|
) {
|
|
604
585
|
if (
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
586
|
+
pathnameWithoutLocale.startsWith(
|
|
587
|
+
'/orders/completed/'
|
|
588
|
+
) ||
|
|
589
|
+
pathnameWithoutLocale.startsWith(
|
|
590
|
+
'/basket'
|
|
591
|
+
)
|
|
608
592
|
) {
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
req.cookies.get('pz-locale')?.value,
|
|
613
|
-
ip
|
|
614
|
-
});
|
|
593
|
+
middlewareResult.cookies.delete(
|
|
594
|
+
'pz-post-checkout-flow'
|
|
595
|
+
);
|
|
615
596
|
}
|
|
597
|
+
}
|
|
616
598
|
|
|
599
|
+
if (process.env.ACC_APP_VERSION) {
|
|
617
600
|
middlewareResult.headers.set(
|
|
618
|
-
'
|
|
619
|
-
|
|
601
|
+
'acc-app-version',
|
|
602
|
+
process.env.ACC_APP_VERSION
|
|
620
603
|
);
|
|
604
|
+
}
|
|
621
605
|
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
);
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
if (
|
|
629
|
-
req.cookies.get('pz-post-checkout-flow')
|
|
630
|
-
) {
|
|
631
|
-
if (
|
|
632
|
-
pathnameWithoutLocale.startsWith(
|
|
633
|
-
'/orders/completed/'
|
|
634
|
-
) ||
|
|
635
|
-
pathnameWithoutLocale.startsWith(
|
|
636
|
-
'/basket'
|
|
637
|
-
)
|
|
638
|
-
) {
|
|
639
|
-
middlewareResult.cookies.delete(
|
|
640
|
-
'pz-post-checkout-flow'
|
|
641
|
-
);
|
|
642
|
-
}
|
|
643
|
-
}
|
|
606
|
+
// Set CSRF token if not set
|
|
607
|
+
try {
|
|
608
|
+
const url = `${Settings.commerceUrl}${user.csrfToken}`;
|
|
644
609
|
|
|
645
|
-
if (
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
610
|
+
if (!req.cookies.get('csrftoken')) {
|
|
611
|
+
const { csrf_token } = await (
|
|
612
|
+
await fetch(url)
|
|
613
|
+
).json();
|
|
614
|
+
middlewareResult.cookies.set(
|
|
615
|
+
'csrftoken',
|
|
616
|
+
csrf_token,
|
|
617
|
+
{
|
|
618
|
+
path: '/',
|
|
619
|
+
domain: rootHostname,
|
|
620
|
+
...getCsrfCookieFlags()
|
|
621
|
+
}
|
|
649
622
|
);
|
|
650
623
|
}
|
|
651
|
-
|
|
652
|
-
// Set CSRF token if not set
|
|
653
|
-
try {
|
|
654
|
-
const url = `${Settings.commerceUrl}${user.csrfToken}`;
|
|
655
|
-
|
|
656
|
-
if (!req.cookies.get('csrftoken')) {
|
|
657
|
-
const { csrf_token } = await (
|
|
658
|
-
await fetch(url)
|
|
659
|
-
).json();
|
|
660
|
-
middlewareResult.cookies.set(
|
|
661
|
-
'csrftoken',
|
|
662
|
-
csrf_token,
|
|
663
|
-
{
|
|
664
|
-
path: '/',
|
|
665
|
-
domain: rootHostname,
|
|
666
|
-
...getCsrfCookieFlags()
|
|
667
|
-
}
|
|
668
|
-
);
|
|
669
|
-
}
|
|
670
|
-
} catch (error) {
|
|
671
|
-
logger.error('CSRF Error', {
|
|
672
|
-
error,
|
|
673
|
-
ip
|
|
674
|
-
});
|
|
675
|
-
}
|
|
676
624
|
} catch (error) {
|
|
677
|
-
logger.error('
|
|
625
|
+
logger.error('CSRF Error', {
|
|
678
626
|
error,
|
|
679
627
|
ip
|
|
680
628
|
});
|
|
681
629
|
}
|
|
682
|
-
|
|
683
|
-
|
|
630
|
+
} catch (error) {
|
|
631
|
+
logger.error('withPzDefault Error', {
|
|
632
|
+
error,
|
|
633
|
+
ip
|
|
634
|
+
});
|
|
684
635
|
}
|
|
685
|
-
|
|
636
|
+
|
|
637
|
+
return middlewareResult;
|
|
638
|
+
})
|
|
686
639
|
)
|
|
687
640
|
)
|
|
688
641
|
)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akinon/next",
|
|
3
3
|
"description": "Core package for Project Zero Next",
|
|
4
|
-
"version": "2.0.33
|
|
4
|
+
"version": "2.0.33",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"bin": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"set-cookie-parser": "2.6.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@akinon/eslint-plugin-projectzero": "2.0.33
|
|
39
|
+
"@akinon/eslint-plugin-projectzero": "2.0.33",
|
|
40
40
|
"@babel/core": "7.26.10",
|
|
41
41
|
"@babel/preset-env": "7.26.9",
|
|
42
42
|
"@babel/preset-typescript": "7.27.0",
|
package/plugins.d.ts
CHANGED
|
@@ -37,16 +37,6 @@ declare module '@akinon/pz-cybersource-uc/src/redux/middleware' {
|
|
|
37
37
|
export default middleware as any;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
declare module '@akinon/pz-apple-pay' {}
|
|
41
|
-
|
|
42
|
-
declare module '@akinon/pz-similar-products' {
|
|
43
|
-
export const SimilarProductsModal: any;
|
|
44
|
-
export const SimilarProductsFilterSidebar: any;
|
|
45
|
-
export const SimilarProductsResultsGrid: any;
|
|
46
|
-
export const SimilarProductsPlugin: any;
|
|
47
|
-
export const SimilarProductsButtonPlugin: any;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
40
|
declare module '@akinon/pz-cybersource-uc/src/redux/reducer' {
|
|
51
41
|
export default reducer as any;
|
|
52
42
|
}
|