@akinon/projectzero 1.99.0 → 1.100.0-rc.72

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.
Files changed (63) hide show
  1. package/CHANGELOG.md +235 -4
  2. package/app-template/.env.example +1 -0
  3. package/app-template/.github/instructions/routing.instructions.md +603 -0
  4. package/app-template/CHANGELOG.md +5001 -312
  5. package/app-template/README.md +25 -1
  6. package/app-template/package.json +21 -19
  7. package/app-template/public/locales/en/common.json +48 -1
  8. package/app-template/public/locales/tr/common.json +48 -1
  9. package/app-template/src/app/[commerce]/[locale]/[currency]/basket/page.tsx +9 -82
  10. package/app-template/src/app/[commerce]/[locale]/[currency]/category/[pk]/page.tsx +17 -4
  11. package/app-template/src/app/[commerce]/[locale]/[currency]/flat-page/[pk]/page.tsx +12 -1
  12. package/app-template/src/app/[commerce]/[locale]/[currency]/group-product/[pk]/page.tsx +29 -11
  13. package/app-template/src/app/[commerce]/[locale]/[currency]/landing-page/[pk]/page.tsx +12 -1
  14. package/app-template/src/app/[commerce]/[locale]/[currency]/product/[pk]/loading.tsx +67 -0
  15. package/app-template/src/app/[commerce]/[locale]/[currency]/product/[pk]/page.tsx +28 -10
  16. package/app-template/src/app/[commerce]/[locale]/[currency]/special-page/[pk]/page.tsx +12 -1
  17. package/app-template/src/app/api/form/[...id]/route.ts +1 -7
  18. package/app-template/src/app/api/image-proxy/route.ts +1 -0
  19. package/app-template/src/app/api/similar-product-list/route.ts +1 -0
  20. package/app-template/src/app/api/similar-products/route.ts +1 -0
  21. package/app-template/src/assets/fonts/pz-icon.css +3 -0
  22. package/app-template/src/components/__tests__/link.test.tsx +2 -0
  23. package/app-template/src/components/accordion.tsx +22 -19
  24. package/app-template/src/components/currency-select.tsx +1 -0
  25. package/app-template/src/components/file-input.tsx +27 -7
  26. package/app-template/src/components/generate-form-fields.tsx +43 -4
  27. package/app-template/src/components/input.tsx +9 -2
  28. package/app-template/src/components/modal.tsx +32 -16
  29. package/app-template/src/components/pagination.tsx +1 -0
  30. package/app-template/src/components/select.tsx +38 -26
  31. package/app-template/src/components/types/index.ts +25 -1
  32. package/app-template/src/hooks/index.ts +2 -0
  33. package/app-template/src/hooks/use-product-cart.ts +77 -0
  34. package/app-template/src/hooks/use-stock-alert.ts +74 -0
  35. package/app-template/src/plugins.js +3 -1
  36. package/app-template/src/settings.js +8 -2
  37. package/app-template/src/types/index.ts +74 -3
  38. package/app-template/src/utils/variant-validation.ts +41 -0
  39. package/app-template/src/views/account/address-form.tsx +8 -4
  40. package/app-template/src/views/account/contact-form.tsx +1 -1
  41. package/app-template/src/views/account/content-header.tsx +2 -2
  42. package/app-template/src/views/account/faq/faq-tabs.tsx +8 -2
  43. package/app-template/src/views/basket/basket-content.tsx +106 -0
  44. package/app-template/src/views/basket/basket-item.tsx +22 -14
  45. package/app-template/src/views/basket/summary.tsx +10 -7
  46. package/app-template/src/views/breadcrumb.tsx +2 -2
  47. package/app-template/src/views/category/category-info.tsx +1 -0
  48. package/app-template/src/views/category/filters/index.tsx +1 -1
  49. package/app-template/src/views/guest-login/index.tsx +6 -1
  50. package/app-template/src/views/header/action-menu.tsx +1 -1
  51. package/app-template/src/views/header/search/index.tsx +17 -5
  52. package/app-template/src/views/login/index.tsx +11 -10
  53. package/app-template/src/views/otp-login/index.tsx +11 -6
  54. package/app-template/src/views/product/product-actions.tsx +165 -0
  55. package/app-template/src/views/product/product-info.tsx +62 -263
  56. package/app-template/src/views/product/product-share.tsx +56 -0
  57. package/app-template/src/views/product/product-variants.tsx +26 -0
  58. package/app-template/src/views/product/slider.tsx +86 -73
  59. package/app-template/src/views/register/index.tsx +15 -11
  60. package/app-template/src/widgets/footer-menu.tsx +6 -2
  61. package/commands/plugins.ts +63 -16
  62. package/dist/commands/plugins.js +57 -16
  63. package/package.json +1 -1
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import { Variant } from '@theme/views/product';
3
+ import { VariantType } from '@akinon/next/types';
4
+
5
+ interface ProductVariantsProps {
6
+ variants: VariantType[];
7
+ onVariantChange: () => void;
8
+ }
9
+
10
+ export const ProductVariants: React.FC<ProductVariantsProps> = ({
11
+ variants,
12
+ onVariantChange
13
+ }) => {
14
+ return (
15
+ <div className="flex flex-col">
16
+ {variants.map((variant) => (
17
+ <Variant
18
+ key={variant.attribute_key}
19
+ {...variant}
20
+ className="items-center mt-8"
21
+ onChange={onVariantChange}
22
+ />
23
+ ))}
24
+ </div>
25
+ );
26
+ };
@@ -7,6 +7,7 @@ import { Product } from '@akinon/next/types';
7
7
  import { Image } from '@akinon/next/components/image';
8
8
  import useFavButton from '../../hooks/use-fav-button';
9
9
  import { twMerge } from 'tailwind-merge';
10
+ import PluginModule, { Component } from '@akinon/next/components/plugin-module';
10
11
 
11
12
  type ProductSliderItem = {
12
13
  product: Product;
@@ -35,90 +36,102 @@ export default function ProductInfoSlider({ product }: ProductSliderItem) {
35
36
  carouselRef.current?.next();
36
37
  };
37
38
 
38
- const handleThumbnailClick = (index) => {
39
+ const handleThumbnailClick = (index: number) => {
39
40
  setActiveIndex(index);
40
41
  carouselRef.current?.goToSlide(index);
41
42
  };
42
43
 
43
44
  return (
44
- <div className="lg:grid lg:grid-cols-6">
45
- <div className="lg:col-span-1">
46
- <div className="flex flex-col items-center justify-center md:mr-[6px]">
47
- <button
48
- onClick={goToPrev}
49
- className={twMerge(
50
- 'hidden justify-center p-2 mb-3 border border-gray-100 rounded-full cursor-pointer lg:block',
51
- [activeIndex === 0 && 'cursor-not-allowed opacity-45']
52
- )}
53
- disabled={activeIndex === 0}
45
+ <>
46
+ <div className="lg:grid lg:grid-cols-6">
47
+ <div className="lg:col-span-1">
48
+ <div className="flex flex-col items-center justify-center md:mr-[6px]">
49
+ <button
50
+ onClick={goToPrev}
51
+ className={twMerge(
52
+ 'hidden justify-center p-2 mb-3 border border-gray-100 rounded-full cursor-pointer lg:block',
53
+ [activeIndex === 0 && 'cursor-not-allowed opacity-45']
54
+ )}
55
+ disabled={activeIndex === 0}
56
+ >
57
+ <Icon name="chevron-up" size={15} className="fill-[#000000]" />
58
+ </button>
59
+ <div className="hidden flex-col items-center overflow-scroll w-[80px] max-h-[620px] lg:block">
60
+ {product?.productimage_set?.map((item, index) => (
61
+ <Image
62
+ key={index}
63
+ src={item.image}
64
+ alt={`Thumbnail ${index}`}
65
+ width={80}
66
+ height={128}
67
+ aspectRatio={80 / 128}
68
+ className={twMerge('cursor-pointer', [
69
+ activeIndex === index && 'border-2 border-primary'
70
+ ])}
71
+ onClick={() => handleThumbnailClick(index)}
72
+ />
73
+ ))}
74
+ </div>
75
+ <button
76
+ onClick={goToNext}
77
+ className={twMerge(
78
+ 'hidden justify-center p-2 mt-3 border border-gray-100 rounded-full cursor-pointer lg:block',
79
+ [
80
+ activeIndex === product.productimage_set.length - 1 &&
81
+ 'cursor-not-allowed opacity-45'
82
+ ]
83
+ )}
84
+ disabled={activeIndex === product.productimage_set.length - 1}
85
+ >
86
+ <Icon name="chevron-down" size={15} className="fill-[#000000]" />
87
+ </button>
88
+ </div>
89
+ </div>
90
+
91
+ <div className="relative lg:col-span-5">
92
+ <FavButton className="absolute right-8 top-6 z-[20] sm:hidden" />
93
+
94
+ <PluginModule
95
+ component={Component.ProductImageSearchFeature}
96
+ props={{
97
+ product,
98
+ activeIndex,
99
+ showResetButton: true
100
+ }}
101
+ />
102
+
103
+ <CarouselCore
104
+ responsive={{
105
+ all: {
106
+ breakpoint: { max: 5000, min: 0 },
107
+ items: 1
108
+ }
109
+ }}
110
+ arrows={false}
111
+ swipeable={true}
112
+ ref={carouselRef}
113
+ afterChange={(previousSlide, { currentSlide }) => {
114
+ setActiveIndex(currentSlide);
115
+ }}
116
+ containerAspectRatio={{ mobile: 520 / 798, desktop: 484 / 726 }}
54
117
  >
55
- <Icon name="chevron-up" size={15} className="fill-[#000000]" />
56
- </button>
57
- <div className="hidden flex-col items-center overflow-scroll w-[80px] max-h-[620px] lg:block">
58
- {product?.productimage_set?.map((item, index) => (
118
+ {product?.productimage_set?.map((item, i) => (
59
119
  <Image
60
- key={index}
120
+ key={i}
61
121
  src={item.image}
62
- alt={`Thumbnail ${index}`}
63
- width={80}
64
- height={128}
65
- className={twMerge('cursor-pointer', [
66
- activeIndex === index && 'border-2 border-primary'
67
- ])}
68
- onClick={() => handleThumbnailClick(index)}
122
+ alt={product?.name || 'Product image'}
123
+ draggable={false}
124
+ aspectRatio={484 / 726}
125
+ sizes="(min-width: 425px) 512px,
126
+ (min-width: 601px) 576px,
127
+ (min-width: 768px) 336px,
128
+ (min-width: 1024px) 484px, 368px"
129
+ fill
69
130
  />
70
131
  ))}
71
- </div>
72
- <button
73
- onClick={goToNext}
74
- className={twMerge(
75
- 'hidden justify-center p-2 mt-3 border border-gray-100 rounded-full cursor-pointer lg:block',
76
- [
77
- activeIndex === product.productimage_set.length - 1 &&
78
- 'cursor-not-allowed opacity-45'
79
- ]
80
- )}
81
- disabled={activeIndex === product.productimage_set.length - 1}
82
- >
83
- <Icon name="chevron-down" size={15} className="fill-[#000000]" />
84
- </button>
132
+ </CarouselCore>
85
133
  </div>
86
134
  </div>
87
-
88
- <div className="relative lg:col-span-5">
89
- <FavButton className="absolute right-8 top-6 z-[20] sm:hidden" />
90
-
91
- <CarouselCore
92
- responsive={{
93
- all: {
94
- breakpoint: { max: 5000, min: 0 },
95
- items: 1
96
- }
97
- }}
98
- arrows={false}
99
- swipeable={true}
100
- ref={carouselRef}
101
- afterChange={(previousSlide, { currentSlide }) => {
102
- setActiveIndex(currentSlide);
103
- }}
104
- containerAspectRatio={{ mobile: 520 / 798, desktop: 484 / 726 }}
105
- >
106
- {product?.productimage_set?.map((item, i) => (
107
- <Image
108
- key={i}
109
- src={item.image}
110
- alt={product.name}
111
- draggable={false}
112
- aspectRatio={484 / 726}
113
- sizes="(min-width: 425px) 512px,
114
- (min-width: 601px) 576px,
115
- (min-width: 768px) 336px,
116
- (min-width: 1024px) 484px, 368px"
117
- fill
118
- />
119
- ))}
120
- </CarouselCore>
121
- </div>
122
- </div>
135
+ </>
123
136
  );
124
137
  }
@@ -2,11 +2,11 @@
2
2
 
3
3
  import { yupResolver } from '@hookform/resolvers/yup';
4
4
  import clsx from 'clsx';
5
- import { signIn, SignInOptions } from 'next-auth/react';
5
+ import { signIn } from 'next-auth/react';
6
6
  import { useState } from 'react';
7
7
  import { SubmitHandler, useForm } from 'react-hook-form';
8
8
  import { useAppDispatch, useAppSelector } from '@akinon/next/redux/hooks';
9
- import { RegisterFormType } from '@theme/types';
9
+ import { RegisterFormType, FormType, PzSignInOptions } from '@theme/types';
10
10
  import { Button, Checkbox, Icon, Input, Modal } from '@theme/components';
11
11
  import * as yup from 'yup';
12
12
  import { useCaptcha, useLocalization, useRouter } from '@akinon/next/hooks';
@@ -125,8 +125,9 @@ export const Register = () => {
125
125
  redirect: false,
126
126
  callbackUrl: '/',
127
127
  captchaValidated,
128
- ...data
129
- } as SignInOptions);
128
+ ...data,
129
+ formType: FormType.register
130
+ } as PzSignInOptions);
130
131
  };
131
132
 
132
133
  const onSubmit: SubmitHandler<RegisterFormType> = async (data) => {
@@ -143,7 +144,6 @@ export const Register = () => {
143
144
  if (registerResponse.error) {
144
145
  const errors: AuthError[] = JSON.parse(registerResponse.error);
145
146
 
146
-
147
147
  if (errors.find((error) => error.type === 'captcha')) {
148
148
  if (await validateCaptcha()) {
149
149
  onSubmit(data);
@@ -171,25 +171,25 @@ export const Register = () => {
171
171
  try {
172
172
  parsedValue = JSON.parse(item.value);
173
173
  } catch {
174
- parsedValue = [item.value];
174
+ parsedValue = [item.value];
175
175
  }
176
176
  } else {
177
- parsedValue = item.value;
177
+ parsedValue = item.value;
178
178
  }
179
179
 
180
180
  if (Array.isArray(parsedValue)) {
181
181
  setError(item.name as keyof RegisterFormType, {
182
182
  type: 'custom',
183
- message: parsedValue.join(', '),
183
+ message: parsedValue.join(', ')
184
184
  });
185
185
  } else {
186
186
  Object.keys(parsedValue).forEach((key) => {
187
187
  const fieldName = key as keyof RegisterFormType;
188
188
  const errorMessages = parsedValue[key] as string[];
189
-
189
+
190
190
  setError(fieldName, {
191
191
  type: 'custom',
192
- message: errorMessages.join(', '),
192
+ message: errorMessages.join(', ')
193
193
  });
194
194
  });
195
195
  }
@@ -247,7 +247,11 @@ export const Register = () => {
247
247
  </p>
248
248
 
249
249
  <form onSubmit={handleSubmit(onSubmit)} className="flex flex-col gap-4">
250
- <input type="hidden" value="register" {...register('formType')} />
250
+ <input
251
+ type="hidden"
252
+ value={FormType.register}
253
+ {...register('formType')}
254
+ />
251
255
  <input type="hidden" value={locale} {...register('locale')} />
252
256
 
253
257
  <div className={clsx({ 'mb-4': errors.email })}>
@@ -2,6 +2,7 @@ import 'server-only';
2
2
 
3
3
  import { Link, Accordion } from '@theme/components';
4
4
  import { getWidgetData } from '@akinon/next/data/server';
5
+ import { ServerVariables } from '@akinon/next/utils/server-variables';
5
6
 
6
7
  type SideItem = {
7
8
  value: string;
@@ -47,6 +48,7 @@ type FooterMenuType = {
47
48
 
48
49
  export default async function FooterMenu() {
49
50
  const data = await getWidgetData<FooterMenuType>({ slug: 'footer-menu' });
51
+ const { locale } = ServerVariables;
50
52
 
51
53
  return (
52
54
  <div className="flex-1">
@@ -72,7 +74,7 @@ export default async function FooterMenu() {
72
74
  : '_self'
73
75
  }
74
76
  data-testid={`footer-categories-${item?.value?.name
75
- ?.toLocaleLowerCase()
77
+ ?.toLocaleLowerCase(locale)
76
78
  .split(' ')
77
79
  .join('')}`}
78
80
  >
@@ -96,7 +98,9 @@ export default async function FooterMenu() {
96
98
  ? '_blank'
97
99
  : '_self'
98
100
  }
99
- data-testid={`footer-categories-${item?.value?.name?.toLocaleLowerCase()}`}
101
+ data-testid={`footer-categories-${item?.value?.name?.toLocaleLowerCase(
102
+ locale
103
+ )}`}
100
104
  >
101
105
  {item?.value?.name}
102
106
  </Link>
@@ -29,7 +29,14 @@ async function checkVersion(pkg: PackageJson) {
29
29
 
30
30
  if (!semver.satisfies(pkg.dependencies['@akinon/next'], latestVersion)) {
31
31
  console.warn(
32
- `\x1b[43mWarning: The "${packageName}" package is currently at version ${pkg.dependencies['@akinon/next']}. Please upgrade it to the latest version (${latestVersion}) to ensure plugin compatibility.`,
32
+ `\x1b[43m Warning: The "${packageName}" package is currently at`,
33
+ `\x1b[41m version ${pkg.dependencies['@akinon/next']}`,
34
+ `\x1b[43m Please upgrade it to the latest version (${latestVersion}) to ensure plugin compatibility.`,
35
+ '\x1b[0m\n'
36
+ );
37
+ } else {
38
+ console.log(
39
+ `\x1b[42m Info: The package "${packageName}" is currently in the current version (${latestVersion}).`,
33
40
  '\x1b[0m\n'
34
41
  );
35
42
  }
@@ -54,7 +61,27 @@ export default async () => {
54
61
  }
55
62
  }
56
63
 
57
- const pkg: PackageJson = require(path.resolve(rootDir, './package.json'));
64
+ function findPackageJson(): PackageJson {
65
+ const packageJsonPaths = [
66
+ path.resolve(rootDir, './package.json'),
67
+ path.resolve(rootDir, './apps/projectzeronext/package.json')
68
+ ];
69
+
70
+ for (const packageJsonPath of packageJsonPaths) {
71
+ try {
72
+ const pkg = require(packageJsonPath);
73
+ if (pkg.dependencies['@akinon/next']) {
74
+ return pkg;
75
+ }
76
+ } catch (error) {
77
+ continue;
78
+ }
79
+ }
80
+
81
+ throw new Error('Could not find package.json with @akinon/next dependency');
82
+ }
83
+
84
+ const pkg = findPackageJson();
58
85
  await checkVersion(pkg);
59
86
 
60
87
  const pluginsFilePath = findPluginsFilePath();
@@ -69,45 +96,65 @@ export default async () => {
69
96
  }
70
97
 
71
98
  const definedPlugins = [
99
+ {
100
+ name: 'Akifast',
101
+ value: 'pz-akifast'
102
+ },
103
+ {
104
+ name: 'Apple Pay',
105
+ value: 'pz-apple-pay'
106
+ },
107
+ {
108
+ name: 'B2B',
109
+ value: 'pz-b2b'
110
+ },
72
111
  {
73
112
  name: 'Basket Gift Pack',
74
113
  value: 'pz-basket-gift-pack'
75
114
  },
76
115
  {
77
- name: 'Click & Collect',
78
- value: 'pz-click-collect'
116
+ name: 'BKM Express',
117
+ value: 'pz-bkm'
79
118
  },
80
119
  {
81
120
  name: 'Checkout Gift Pack',
82
121
  value: 'pz-checkout-gift-pack'
83
122
  },
84
123
  {
85
- name: 'One Click Checkout',
86
- value: 'pz-one-click-checkout'
124
+ name: 'Click & Collect',
125
+ value: 'pz-click-collect'
126
+ },
127
+ {
128
+ name: 'Credit Payment',
129
+ value: 'pz-credit-payment'
87
130
  },
88
131
  {
89
132
  name: 'Garanti Pay',
90
133
  value: 'pz-gpay'
91
134
  },
92
135
  {
93
- name: 'Pay On Delivery',
94
- value: 'pz-pay-on-delivery'
136
+ name: 'Masterpass',
137
+ value: 'pz-masterpass'
95
138
  },
96
139
  {
97
- name: 'Otp',
98
- value: 'pz-otp'
140
+ name: 'Multi Basket',
141
+ value: 'pz-multi-basket'
99
142
  },
100
143
  {
101
- name: 'BKM Express',
102
- value: 'pz-bkm'
144
+ name: 'One Click Checkout',
145
+ value: 'pz-one-click-checkout'
103
146
  },
104
147
  {
105
- name: 'Credit Payment',
106
- value: 'pz-credit-payment'
148
+ name: 'Otp',
149
+ value: 'pz-otp'
107
150
  },
108
151
  {
109
- name: 'Multi Basket',
110
- value: 'pz-multi-basket'
152
+ name: 'Pay On Delivery',
153
+ value: 'pz-pay-on-delivery'
154
+ },
155
+ {
156
+ name: 'Saved Card',
157
+ value: 'pz-saved-card'
111
158
  },
112
159
  {
113
160
  name: 'Tabby Payment Extension',
@@ -50,7 +50,10 @@ function checkVersion(pkg) {
50
50
  const pkgInfo = (yield response.json());
51
51
  const latestVersion = pkgInfo['dist-tags'].latest;
52
52
  if (!semver_1.default.satisfies(pkg.dependencies['@akinon/next'], latestVersion)) {
53
- console.warn(`\x1b[43mWarning: The "${packageName}" package is currently at version ${pkg.dependencies['@akinon/next']}. Please upgrade it to the latest version (${latestVersion}) to ensure plugin compatibility.`, '\x1b[0m\n');
53
+ console.warn(`\x1b[43m Warning: The "${packageName}" package is currently at`, `\x1b[41m version ${pkg.dependencies['@akinon/next']}`, `\x1b[43m Please upgrade it to the latest version (${latestVersion}) to ensure plugin compatibility.`, '\x1b[0m\n');
54
+ }
55
+ else {
56
+ console.log(`\x1b[42m Info: The package "${packageName}" is currently in the current version (${latestVersion}).`, '\x1b[0m\n');
54
57
  }
55
58
  }
56
59
  catch (error) {
@@ -72,7 +75,25 @@ exports.default = () => __awaiter(void 0, void 0, void 0, function* () {
72
75
  throw new Error('plugins.js was not found in either of the expected locations.');
73
76
  }
74
77
  }
75
- const pkg = require(path_1.default.resolve(rootDir, './package.json'));
78
+ function findPackageJson() {
79
+ const packageJsonPaths = [
80
+ path_1.default.resolve(rootDir, './package.json'),
81
+ path_1.default.resolve(rootDir, './apps/projectzeronext/package.json')
82
+ ];
83
+ for (const packageJsonPath of packageJsonPaths) {
84
+ try {
85
+ const pkg = require(packageJsonPath);
86
+ if (pkg.dependencies['@akinon/next']) {
87
+ return pkg;
88
+ }
89
+ }
90
+ catch (error) {
91
+ continue;
92
+ }
93
+ }
94
+ throw new Error('Could not find package.json with @akinon/next dependency');
95
+ }
96
+ const pkg = findPackageJson();
76
97
  yield checkVersion(pkg);
77
98
  const pluginsFilePath = findPluginsFilePath();
78
99
  let installedPlugins = [];
@@ -84,45 +105,65 @@ exports.default = () => __awaiter(void 0, void 0, void 0, function* () {
84
105
  process.exit(1);
85
106
  }
86
107
  const definedPlugins = [
108
+ {
109
+ name: 'Akifast',
110
+ value: 'pz-akifast'
111
+ },
112
+ {
113
+ name: 'Apple Pay',
114
+ value: 'pz-apple-pay'
115
+ },
116
+ {
117
+ name: 'B2B',
118
+ value: 'pz-b2b'
119
+ },
87
120
  {
88
121
  name: 'Basket Gift Pack',
89
122
  value: 'pz-basket-gift-pack'
90
123
  },
91
124
  {
92
- name: 'Click & Collect',
93
- value: 'pz-click-collect'
125
+ name: 'BKM Express',
126
+ value: 'pz-bkm'
94
127
  },
95
128
  {
96
129
  name: 'Checkout Gift Pack',
97
130
  value: 'pz-checkout-gift-pack'
98
131
  },
99
132
  {
100
- name: 'One Click Checkout',
101
- value: 'pz-one-click-checkout'
133
+ name: 'Click & Collect',
134
+ value: 'pz-click-collect'
135
+ },
136
+ {
137
+ name: 'Credit Payment',
138
+ value: 'pz-credit-payment'
102
139
  },
103
140
  {
104
141
  name: 'Garanti Pay',
105
142
  value: 'pz-gpay'
106
143
  },
107
144
  {
108
- name: 'Pay On Delivery',
109
- value: 'pz-pay-on-delivery'
145
+ name: 'Masterpass',
146
+ value: 'pz-masterpass'
110
147
  },
111
148
  {
112
- name: 'Otp',
113
- value: 'pz-otp'
149
+ name: 'Multi Basket',
150
+ value: 'pz-multi-basket'
114
151
  },
115
152
  {
116
- name: 'BKM Express',
117
- value: 'pz-bkm'
153
+ name: 'One Click Checkout',
154
+ value: 'pz-one-click-checkout'
118
155
  },
119
156
  {
120
- name: 'Credit Payment',
121
- value: 'pz-credit-payment'
157
+ name: 'Otp',
158
+ value: 'pz-otp'
122
159
  },
123
160
  {
124
- name: 'Multi Basket',
125
- value: 'pz-multi-basket'
161
+ name: 'Pay On Delivery',
162
+ value: 'pz-pay-on-delivery'
163
+ },
164
+ {
165
+ name: 'Saved Card',
166
+ value: 'pz-saved-card'
126
167
  },
127
168
  {
128
169
  name: 'Tabby Payment Extension',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akinon/projectzero",
3
- "version": "1.99.0",
3
+ "version": "1.100.0-rc.72",
4
4
  "private": false,
5
5
  "description": "CLI tool to manage your Project Zero Next project",
6
6
  "bin": {