@reactionary/commercetools 0.8.0 → 0.9.1

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.
@@ -0,0 +1,86 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result)
9
+ __defProp(target, key, result);
10
+ return result;
11
+ };
12
+ import {
13
+ PersonalizationProfileCapability,
14
+ PersonalizationProfileSchema,
15
+ PersonalizationProfileQueryGetProfileSchema,
16
+ Reactionary,
17
+ success
18
+ } from "@reactionary/core";
19
+ import createDebug from "debug";
20
+ const debug = createDebug("reactionary:commercetools:personalization-profile");
21
+ class CommercetoolsPersonalizationProfileCapability extends PersonalizationProfileCapability {
22
+ config;
23
+ commercetools;
24
+ factory;
25
+ constructor(config, cache, context, commercetools, factory) {
26
+ super(cache, context);
27
+ this.config = config;
28
+ this.commercetools = commercetools;
29
+ this.factory = factory;
30
+ }
31
+ async getClient() {
32
+ const client = await this.commercetools.getClient();
33
+ return client.withProjectKey({ projectKey: this.config.projectKey });
34
+ }
35
+ async getPersonalizationProfile(payload) {
36
+ const identity = payload.identity;
37
+ debug("getPersonalizationProfile", payload);
38
+ if (identity.type === "Anonymous") {
39
+ return success(
40
+ this.factory.parsePersonalizationProfile(this.context, {
41
+ id: "anonymous:",
42
+ version: 0,
43
+ createdAt: "",
44
+ lastModifiedAt: "",
45
+ email: "",
46
+ addresses: [],
47
+ isEmailVerified: false,
48
+ authenticationMode: "Password",
49
+ customerGroupAssignments: []
50
+ })
51
+ );
52
+ }
53
+ if (identity.type === "Guest") {
54
+ return success(
55
+ this.factory.parsePersonalizationProfile(this.context, {
56
+ id: identity.id.userId,
57
+ version: 0,
58
+ createdAt: "",
59
+ lastModifiedAt: "",
60
+ email: "",
61
+ addresses: [],
62
+ isEmailVerified: false,
63
+ authenticationMode: "Password",
64
+ customerGroupAssignments: []
65
+ })
66
+ );
67
+ }
68
+ const client = await this.getClient();
69
+ const response = await client.me().get({
70
+ queryArgs: {
71
+ expand: ["customerGroupAssignments[*].customerGroup"]
72
+ }
73
+ }).execute();
74
+ const model = this.factory.parsePersonalizationProfile(this.context, response.body);
75
+ return success(model);
76
+ }
77
+ }
78
+ __decorateClass([
79
+ Reactionary({
80
+ inputSchema: PersonalizationProfileQueryGetProfileSchema,
81
+ outputSchema: PersonalizationProfileSchema
82
+ })
83
+ ], CommercetoolsPersonalizationProfileCapability.prototype, "getPersonalizationProfile", 1);
84
+ export {
85
+ CommercetoolsPersonalizationProfileCapability
86
+ };
@@ -27,6 +27,7 @@ import {
27
27
  PriceSchema,
28
28
  ShippingMethodSchema,
29
29
  StoreSchema,
30
+ PersonalizationProfileSchema,
30
31
  CartPaginatedSearchResultSchema
31
32
  } from "@reactionary/core";
32
33
  import {
@@ -68,6 +69,8 @@ import { CommercetoolsCompanyFactory } from "../factories/company/company.factor
68
69
  import { CommercetoolsEmployeeFactory } from "../factories/employee/employee.factory.js";
69
70
  import { CommercetoolsEmployeeCapability } from "../capabilities/employee.capability.js";
70
71
  import { CommercetoolsEmployeeInvitationCapability } from "../capabilities/employee-invitation.capability.js";
72
+ import { CommercetoolsPersonalizationProfileCapability } from "../capabilities/personalization-profile.capability.js";
73
+ import { CommercetoolsPersonalizationProfileFactory } from "../factories/personalization-profile/personalization-profile.factory.js";
71
74
  import { CommercetoolsEmployeeInvitationFactory } from "../factories/employee-invitation/employee-invitation.factory.js";
72
75
  const capabilityKeys = [
73
76
  "product",
@@ -88,7 +91,8 @@ const capabilityKeys = [
88
91
  "companyRegistration",
89
92
  "company",
90
93
  "employee",
91
- "employeeInvitation"
94
+ "employeeInvitation",
95
+ "personalizationProfile"
92
96
  ];
93
97
  const capabilityDescriptors = {
94
98
  product: {
@@ -331,6 +335,18 @@ const capabilityDescriptors = {
331
335
  args.commercetoolsApi,
332
336
  args.factory
333
337
  )
338
+ },
339
+ personalizationProfile: {
340
+ isEnabled: (caps) => caps.personalizationProfile?.enabled,
341
+ getOverride: (caps) => caps.personalizationProfile,
342
+ createDefaultFactory: () => new CommercetoolsPersonalizationProfileFactory(PersonalizationProfileSchema),
343
+ createDefaultCapability: (args) => new CommercetoolsPersonalizationProfileCapability(
344
+ args.config,
345
+ args.cache,
346
+ args.context,
347
+ args.commercetoolsApi,
348
+ args.factory
349
+ )
334
350
  }
335
351
  };
336
352
  export {
@@ -0,0 +1,18 @@
1
+ class CommercetoolsPersonalizationProfileFactory {
2
+ personalizationProfileSchema;
3
+ constructor(personalizationProfileSchema) {
4
+ this.personalizationProfileSchema = personalizationProfileSchema;
5
+ }
6
+ parsePersonalizationProfile(_context, data) {
7
+ const segments = (data.customerGroupAssignments ?? []).map((assignment) => assignment.customerGroup.obj?.key).filter((key) => key != null);
8
+ const result = {
9
+ identifier: { key: data.id },
10
+ segments,
11
+ blurb: ""
12
+ };
13
+ return this.personalizationProfileSchema.parse(result);
14
+ }
15
+ }
16
+ export {
17
+ CommercetoolsPersonalizationProfileFactory
18
+ };
package/index.js CHANGED
@@ -13,6 +13,7 @@ export * from "./capabilities/company-registration.capability.js";
13
13
  export * from "./capabilities/company.capability.js";
14
14
  export * from "./capabilities/employee.capability.js";
15
15
  export * from "./capabilities/employee-invitation.capability.js";
16
+ export * from "./capabilities/personalization-profile.capability.js";
16
17
  export * from "./factories/product/product.factory.js";
17
18
  export * from "./factories/checkout/checkout.factory.js";
18
19
  export * from "./factories/product-search/product-search.factory.js";
@@ -32,5 +33,6 @@ export * from "./factories/company-registration/company-registration.factory.js"
32
33
  export * from "./factories/company/company.factory.js";
33
34
  export * from "./factories/employee/employee.factory.js";
34
35
  export * from "./factories/employee-invitation/employee-invitation.factory.js";
36
+ export * from "./factories/personalization-profile/personalization-profile.factory.js";
35
37
  export * from "./schema/capabilities.schema.js";
36
38
  export * from "./schema/configuration.schema.js";
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@reactionary/commercetools",
3
- "version": "0.8.0",
3
+ "version": "0.9.1",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "types": "./src/index.d.ts",
7
7
  "dependencies": {
8
8
  "vitest": "^4.0.9",
9
9
  "@nx/vite": "22.4.5",
10
- "@reactionary/core": "0.8.0",
10
+ "@reactionary/core": "0.9.1",
11
11
  "zod": "4.1.9",
12
12
  "@commercetools/ts-client": "^4.9.1",
13
13
  "@commercetools/platform-sdk": "^8.25.0",
@@ -23,7 +23,8 @@ const CommercetoolsCapabilitiesSchema = CapabilitiesSchema.pick({
23
23
  price: true,
24
24
  category: true,
25
25
  store: true,
26
- profile: true
26
+ profile: true,
27
+ personalizationProfile: true
27
28
  }).extend({
28
29
  productSearch: EnabledCapabilitySchema.optional(),
29
30
  productAssociations: EnabledCapabilitySchema.optional(),
@@ -38,6 +39,7 @@ const CommercetoolsCapabilitiesSchema = CapabilitiesSchema.pick({
38
39
  category: EnabledCapabilitySchema.optional(),
39
40
  store: EnabledCapabilitySchema.optional(),
40
41
  profile: EnabledCapabilitySchema.optional(),
42
+ personalizationProfile: EnabledCapabilitySchema.optional(),
41
43
  companyRegistration: EnabledCapabilitySchema.optional(),
42
44
  company: EnabledCapabilitySchema.optional(),
43
45
  employee: EnabledCapabilitySchema.optional(),
@@ -0,0 +1,13 @@
1
+ import type { Cache, PersonalizationProfileFactory, PersonalizationProfileFactoryOutput, PersonalizationProfileFactoryWithOutput, PersonalizationProfileQueryGetProfile, NotFoundError, RequestContext, Result } from '@reactionary/core';
2
+ import { PersonalizationProfileCapability } from '@reactionary/core';
3
+ import type { CommercetoolsAPI } from '../core/client.js';
4
+ import type { CommercetoolsConfiguration } from '../schema/configuration.schema.js';
5
+ import type { CommercetoolsPersonalizationProfileFactory } from '../factories/personalization-profile/personalization-profile.factory.js';
6
+ export declare class CommercetoolsPersonalizationProfileCapability<TFactory extends PersonalizationProfileFactory = CommercetoolsPersonalizationProfileFactory> extends PersonalizationProfileCapability<PersonalizationProfileFactoryOutput<TFactory>> {
7
+ protected config: CommercetoolsConfiguration;
8
+ protected commercetools: CommercetoolsAPI;
9
+ protected factory: PersonalizationProfileFactoryWithOutput<TFactory>;
10
+ constructor(config: CommercetoolsConfiguration, cache: Cache, context: RequestContext, commercetools: CommercetoolsAPI, factory: PersonalizationProfileFactoryWithOutput<TFactory>);
11
+ protected getClient(): Promise<import("@commercetools/platform-sdk").ByProjectKeyRequestBuilder>;
12
+ getPersonalizationProfile(payload: PersonalizationProfileQueryGetProfile): Promise<Result<PersonalizationProfileFactoryOutput<TFactory>, NotFoundError>>;
13
+ }
@@ -1,6 +1,6 @@
1
1
  import type * as z from 'zod';
2
2
  import { type CommercetoolsCapabilities, type CommercetoolsCapabilitiesSchema } from '../schema/capabilities.schema.js';
3
- export declare const capabilityKeys: readonly ["product", "profile", "productSearch", "productAssociations", "productList", "productReviews", "identity", "cart", "inventory", "price", "category", "checkout", "store", "order", "orderSearch", "companyRegistration", "company", "employee", "employeeInvitation"];
3
+ export declare const capabilityKeys: readonly ["product", "profile", "productSearch", "productAssociations", "productList", "productReviews", "identity", "cart", "inventory", "price", "category", "checkout", "store", "order", "orderSearch", "companyRegistration", "company", "employee", "employeeInvitation", "personalizationProfile"];
4
4
  export type OverridableCapabilityKey = (typeof capabilityKeys)[number];
5
5
  type ParsedCapabilities = z.infer<typeof CommercetoolsCapabilitiesSchema>;
6
6
  export type CapabilityDescriptor = {
@@ -1,4 +1,4 @@
1
- import type { CartFactory, CategoryFactory, CheckoutFactory, ClientFromCapabilities, IdentityFactory, InventoryFactory, OrderFactory, OrderSearchFactory, PriceFactory, ProductAssociationsFactory, ProductFactory, ProductListFactory, ProductReviewsFactory, ProductSearchFactory, ProfileFactory, StoreFactory } from '@reactionary/core';
1
+ import type { CartFactory, CategoryFactory, CheckoutFactory, ClientFromCapabilities, IdentityFactory, InventoryFactory, PersonalizationProfileFactory, OrderFactory, OrderSearchFactory, PriceFactory, ProductAssociationsFactory, ProductFactory, ProductListFactory, ProductReviewsFactory, ProductSearchFactory, ProfileFactory, StoreFactory } from '@reactionary/core';
2
2
  import type { CommercetoolsCapabilities } from '../schema/capabilities.schema.js';
3
3
  import type { OverridableCapabilityKey } from './capability-descriptors.js';
4
4
  import type { CommercetoolsCartFactory } from '../factories/cart/cart.factory.js';
@@ -16,6 +16,7 @@ import type { CommercetoolsProductReviewsFactory } from '../factories/product-re
16
16
  import type { CommercetoolsProductSearchFactory } from '../factories/product-search/product-search.factory.js';
17
17
  import type { CommercetoolsProfileFactory } from '../factories/profile/profile.factory.js';
18
18
  import type { CommercetoolsStoreFactory } from '../factories/store/store.factory.js';
19
+ import type { CommercetoolsPersonalizationProfileFactory } from '../factories/personalization-profile/personalization-profile.factory.js';
19
20
  import type { CommercetoolsCompanyRegistrationFactory } from '../factories/company-registration/company-registration.factory.js';
20
21
  import type { CommercetoolsCompanyFactory } from '../factories/company/company.factory.js';
21
22
  import type { CommercetoolsEmployeeFactory } from '../factories/employee/employee.factory.js';
@@ -39,6 +40,7 @@ import type { CommercetoolsCompanyRegistrationCapability } from '../capabilities
39
40
  import type { CommercetoolsCompanyCapability } from '../capabilities/company.capability.js';
40
41
  import type { CommercetoolsEmployeeCapability } from '../capabilities/employee.capability.js';
41
42
  import type { CommercetoolsEmployeeInvitationCapability } from '../capabilities/employee-invitation.capability.js';
43
+ import type { CommercetoolsPersonalizationProfileCapability } from '../capabilities/personalization-profile.capability.js';
42
44
  type EnabledCapability<TCapability> = TCapability extends {
43
45
  enabled: true;
44
46
  } ? true : false;
@@ -73,6 +75,7 @@ type FactoryContractMap = {
73
75
  company: CommercetoolsCompanyFactory;
74
76
  employee: CommercetoolsEmployeeFactory;
75
77
  employeeInvitation: CommercetoolsEmployeeInvitationFactory;
78
+ personalizationProfile: PersonalizationProfileFactory;
76
79
  };
77
80
  type DefaultFactoryMap = {
78
81
  product: CommercetoolsProductFactory;
@@ -94,6 +97,7 @@ type DefaultFactoryMap = {
94
97
  company: CommercetoolsCompanyFactory;
95
98
  employee: CommercetoolsEmployeeFactory;
96
99
  employeeInvitation: CommercetoolsEmployeeInvitationFactory;
100
+ personalizationProfile: CommercetoolsPersonalizationProfileFactory;
97
101
  };
98
102
  type ResolvedFactoryMap<T extends CommercetoolsCapabilities> = {
99
103
  [K in OverridableCapabilityKey]: ExtractCapabilityFactory<T[K], FactoryContractMap[K], DefaultFactoryMap[K]>;
@@ -118,6 +122,7 @@ type DefaultCapabilityMap<T extends CommercetoolsCapabilities> = {
118
122
  company: CommercetoolsCompanyCapability;
119
123
  employee: CommercetoolsEmployeeCapability;
120
124
  employeeInvitation: CommercetoolsEmployeeInvitationCapability;
125
+ personalizationProfile: CommercetoolsPersonalizationProfileCapability<ResolvedFactoryMap<T>['personalizationProfile']>;
121
126
  };
122
127
  type CapabilityImplementationMap<T extends CommercetoolsCapabilities> = {
123
128
  [K in OverridableCapabilityKey]: ExtractCapabilityImplementation<T[K], DefaultCapabilityMap<T>[K]>;
@@ -0,0 +1,8 @@
1
+ import type { AnyPersonalizationProfileSchema, PersonalizationProfileFactory, PersonalizationProfileSchema, RequestContext } from '@reactionary/core';
2
+ import type { Customer } from '@commercetools/platform-sdk';
3
+ import type * as z from 'zod';
4
+ export declare class CommercetoolsPersonalizationProfileFactory<TPersonalizationProfileSchema extends AnyPersonalizationProfileSchema = typeof PersonalizationProfileSchema> implements PersonalizationProfileFactory<TPersonalizationProfileSchema> {
5
+ readonly personalizationProfileSchema: TPersonalizationProfileSchema;
6
+ constructor(personalizationProfileSchema: TPersonalizationProfileSchema);
7
+ parsePersonalizationProfile(_context: RequestContext, data: Customer): z.output<TPersonalizationProfileSchema>;
8
+ }
package/src/index.d.ts CHANGED
@@ -13,6 +13,7 @@ export * from './capabilities/company-registration.capability.js';
13
13
  export * from './capabilities/company.capability.js';
14
14
  export * from './capabilities/employee.capability.js';
15
15
  export * from './capabilities/employee-invitation.capability.js';
16
+ export * from './capabilities/personalization-profile.capability.js';
16
17
  export * from './factories/product/product.factory.js';
17
18
  export * from './factories/checkout/checkout.factory.js';
18
19
  export * from './factories/product-search/product-search.factory.js';
@@ -32,5 +33,6 @@ export * from './factories/company-registration/company-registration.factory.js'
32
33
  export * from './factories/company/company.factory.js';
33
34
  export * from './factories/employee/employee.factory.js';
34
35
  export * from './factories/employee-invitation/employee-invitation.factory.js';
36
+ export * from './factories/personalization-profile/personalization-profile.factory.js';
35
37
  export * from './schema/capabilities.schema.js';
36
38
  export * from './schema/configuration.schema.js';
@@ -1,4 +1,4 @@
1
- import type { Cache, CartFactory, CartFactoryWithOutput, CartCapability, CategoryFactory, CategoryFactoryWithOutput, CategoryCapability, CheckoutFactory, CheckoutFactoryWithOutput, CheckoutCapability, IdentityFactory, IdentityFactoryWithOutput, IdentityCapability, InventoryFactory, InventoryFactoryWithOutput, InventoryCapability, OrderFactory, OrderFactoryWithOutput, OrderCapability, OrderSearchFactory, OrderSearchFactoryWithOutput, OrderSearchCapability, PriceFactory, PriceFactoryWithOutput, PriceCapability, ProductAssociationsFactory, ProductAssociationsFactoryWithOutput, ProductAssociationsCapability, ProductFactory, ProductFactoryWithOutput, ProductListFactory, ProductListFactoryWithOutput, ProductListCapability, ProductCapability, ProductReviewsFactory, ProductReviewsFactoryWithOutput, ProductReviewsCapability, ProductSearchFactory, ProductSearchFactoryWithOutput, ProductSearchCapability, ProfileFactory, ProfileFactoryWithOutput, ProfileCapability, RequestContext, StoreFactory, StoreFactoryWithOutput, StoreCapability, CompanyRegistrationCapability, CompanyCapability, EmployeeCapability, EmployeeInvitationCapability } from '@reactionary/core';
1
+ import type { Cache, CartFactory, CartFactoryWithOutput, CartCapability, CategoryFactory, CategoryFactoryWithOutput, CategoryCapability, CheckoutFactory, CheckoutFactoryWithOutput, CheckoutCapability, IdentityFactory, IdentityFactoryWithOutput, IdentityCapability, InventoryFactory, InventoryFactoryWithOutput, InventoryCapability, OrderFactory, OrderFactoryWithOutput, OrderCapability, OrderSearchFactory, OrderSearchFactoryWithOutput, OrderSearchCapability, PriceFactory, PriceFactoryWithOutput, PriceCapability, ProductAssociationsFactory, ProductAssociationsFactoryWithOutput, ProductAssociationsCapability, ProductFactory, ProductFactoryWithOutput, ProductListFactory, ProductListFactoryWithOutput, ProductListCapability, ProductCapability, ProductReviewsFactory, ProductReviewsFactoryWithOutput, ProductReviewsCapability, ProductSearchFactory, ProductSearchFactoryWithOutput, ProductSearchCapability, ProfileFactory, ProfileFactoryWithOutput, ProfileCapability, RequestContext, StoreFactory, StoreFactoryWithOutput, StoreCapability, PersonalizationProfileFactory, PersonalizationProfileFactoryWithOutput, PersonalizationProfileCapability, CompanyRegistrationCapability, CompanyCapability, EmployeeCapability, EmployeeInvitationCapability } from '@reactionary/core';
2
2
  import type { CommercetoolsAPI } from '../core/client.js';
3
3
  import type { CommercetoolsConfiguration } from './configuration.schema.js';
4
4
  import type { CommercetoolsCompanyRegistrationFactory } from '../factories/company-registration/company-registration.factory.js';
@@ -46,6 +46,9 @@ export declare const CommercetoolsCapabilitiesSchema: z.ZodObject<{
46
46
  profile: z.ZodOptional<z.ZodOptional<z.ZodObject<{
47
47
  enabled: z.ZodBoolean;
48
48
  }, z.core.$loose>>>;
49
+ personalizationProfile: z.ZodOptional<z.ZodOptional<z.ZodObject<{
50
+ enabled: z.ZodBoolean;
51
+ }, z.core.$loose>>>;
49
52
  companyRegistration: z.ZodOptional<z.ZodOptional<z.ZodObject<{
50
53
  enabled: z.ZodBoolean;
51
54
  }, z.core.$loose>>>;
@@ -98,6 +101,7 @@ export type CommercetoolsStoreCapabilityConfig = CommercetoolsCapabilityConfig<S
98
101
  export type CommercetoolsProfileCapabilityConfig = CommercetoolsCapabilityConfig<ProfileFactoryWithOutput<ProfileFactory>, ProfileCapability>;
99
102
  export type CommercetoolsOrderCapabilityConfig = CommercetoolsCapabilityConfig<OrderFactoryWithOutput<OrderFactory>, OrderCapability>;
100
103
  export type CommercetoolsOrderSearchCapabilityConfig = CommercetoolsCapabilityConfig<OrderSearchFactoryWithOutput<OrderSearchFactory>, OrderSearchCapability>;
104
+ export type CommercetoolsPersonalizationProfileCapabilityConfig = CommercetoolsCapabilityConfig<PersonalizationProfileFactoryWithOutput<PersonalizationProfileFactory>, PersonalizationProfileCapability>;
101
105
  export type CommercetoolsCompanyRegistrationCapabilityConfig = CommercetoolsCapabilityConfig<CommercetoolsCompanyRegistrationFactory, CompanyRegistrationCapability>;
102
106
  export type CommercetoolsCompanyCapabilityConfig = CommercetoolsCapabilityConfig<CommercetoolsCompanyFactory, CompanyCapability>;
103
107
  export type CommercetoolsEmployeeCapabilityConfig = CommercetoolsCapabilityConfig<CommercetoolsEmployeeFactory, EmployeeCapability>;
@@ -121,6 +125,7 @@ export type CommercetoolsCapabilityConfigMap<TProductFactory extends ProductFact
121
125
  company: EnabledCapabilityConfig<CommercetoolsCompanyFactory, CompanyCapability>;
122
126
  employee: EnabledCapabilityConfig<CommercetoolsEmployeeFactory, EmployeeCapability>;
123
127
  employeeInvitation: EnabledCapabilityConfig<CommercetoolsEmployeeInvitationFactory, EmployeeInvitationCapability>;
128
+ personalizationProfile: EnabledCapabilityConfig<PersonalizationProfileFactoryWithOutput<PersonalizationProfileFactory>, PersonalizationProfileCapability>;
124
129
  };
125
130
  type CommercetoolsCapabilitiesBase = z.infer<typeof CommercetoolsCapabilitiesSchema>;
126
131
  export type CommercetoolsCapabilities<TProductFactory extends ProductFactory = ProductFactory, TProductCapability extends ProductCapability = ProductCapability, TCheckoutFactory extends CheckoutFactory = CheckoutFactory, TCheckoutCapability extends CheckoutCapability = CheckoutCapability> = Omit<CommercetoolsCapabilitiesBase, keyof CommercetoolsCapabilityConfigMap<TProductFactory, TProductCapability, TCheckoutFactory, TCheckoutCapability>> & Partial<CommercetoolsCapabilityConfigMap<TProductFactory, TProductCapability, TCheckoutFactory, TCheckoutCapability>>;