This is page 5 of 61. Use http://codebase.md/taurgis/sfcc-dev-mcp?lines=true&page={x} to view the full context. # Directory Structure ``` ├── .DS_Store ├── .github │ ├── dependabot.yml │ ├── instructions │ │ ├── mcp-node-tests.instructions.md │ │ └── mcp-yml-tests.instructions.md │ ├── ISSUE_TEMPLATE │ │ ├── bug_report.yml │ │ ├── config.yml │ │ ├── documentation.yml │ │ ├── feature_request.yml │ │ └── question.yml │ ├── PULL_REQUEST_TEMPLATE │ │ ├── bug_fix.md │ │ ├── documentation.md │ │ └── new_tool.md │ ├── pull_request_template.md │ └── workflows │ ├── ci.yml │ ├── deploy-pages.yml │ ├── publish.yml │ └── update-docs.yml ├── .gitignore ├── .husky │ └── pre-commit ├── aegis.config.docs-only.json ├── aegis.config.json ├── aegis.config.with-dw.json ├── AGENTS.md ├── ai-instructions │ ├── claude-desktop │ │ └── claude_custom_instructions.md │ ├── cursor │ │ └── .cursor │ │ └── rules │ │ ├── debugging-workflows.mdc │ │ ├── hooks-development.mdc │ │ ├── isml-templates.mdc │ │ ├── job-framework.mdc │ │ ├── performance-optimization.mdc │ │ ├── scapi-endpoints.mdc │ │ ├── security-patterns.mdc │ │ ├── sfcc-development.mdc │ │ ├── sfra-controllers.mdc │ │ ├── sfra-models.mdc │ │ ├── system-objects.mdc │ │ └── testing-patterns.mdc │ └── github-copilot │ └── copilot-instructions.md ├── CHANGELOG.md ├── CONTRIBUTING.md ├── docs │ ├── best-practices │ │ ├── cartridge_creation.md │ │ ├── isml_templates.md │ │ ├── job_framework.md │ │ ├── localserviceregistry.md │ │ ├── ocapi_hooks.md │ │ ├── performance.md │ │ ├── scapi_custom_endpoint.md │ │ ├── scapi_hooks.md │ │ ├── security.md │ │ ├── sfra_client_side_js.md │ │ ├── sfra_controllers.md │ │ ├── sfra_models.md │ │ └── sfra_scss.md │ ├── dw_campaign │ │ ├── ABTest.md │ │ ├── ABTestMgr.md │ │ ├── ABTestSegment.md │ │ ├── AmountDiscount.md │ │ ├── ApproachingDiscount.md │ │ ├── BonusChoiceDiscount.md │ │ ├── BonusDiscount.md │ │ ├── Campaign.md │ │ ├── CampaignMgr.md │ │ ├── CampaignStatusCodes.md │ │ ├── Coupon.md │ │ ├── CouponMgr.md │ │ ├── CouponRedemption.md │ │ ├── CouponStatusCodes.md │ │ ├── Discount.md │ │ ├── DiscountPlan.md │ │ ├── FixedPriceDiscount.md │ │ ├── FixedPriceShippingDiscount.md │ │ ├── FreeDiscount.md │ │ ├── FreeShippingDiscount.md │ │ ├── PercentageDiscount.md │ │ ├── PercentageOptionDiscount.md │ │ ├── PriceBookPriceDiscount.md │ │ ├── Promotion.md │ │ ├── PromotionMgr.md │ │ ├── PromotionPlan.md │ │ ├── SlotContent.md │ │ ├── SourceCodeGroup.md │ │ ├── SourceCodeInfo.md │ │ ├── SourceCodeStatusCodes.md │ │ └── TotalFixedPriceDiscount.md │ ├── dw_catalog │ │ ├── Catalog.md │ │ ├── CatalogMgr.md │ │ ├── Category.md │ │ ├── CategoryAssignment.md │ │ ├── CategoryLink.md │ │ ├── PriceBook.md │ │ ├── PriceBookMgr.md │ │ ├── Product.md │ │ ├── ProductActiveData.md │ │ ├── ProductAttributeModel.md │ │ ├── ProductAvailabilityLevels.md │ │ ├── ProductAvailabilityModel.md │ │ ├── ProductInventoryList.md │ │ ├── ProductInventoryMgr.md │ │ ├── ProductInventoryRecord.md │ │ ├── ProductLink.md │ │ ├── ProductMgr.md │ │ ├── ProductOption.md │ │ ├── ProductOptionModel.md │ │ ├── ProductOptionValue.md │ │ ├── ProductPriceInfo.md │ │ ├── ProductPriceModel.md │ │ ├── ProductPriceTable.md │ │ ├── ProductSearchHit.md │ │ ├── ProductSearchModel.md │ │ ├── ProductSearchRefinementDefinition.md │ │ ├── ProductSearchRefinements.md │ │ ├── ProductSearchRefinementValue.md │ │ ├── ProductVariationAttribute.md │ │ ├── ProductVariationAttributeValue.md │ │ ├── ProductVariationModel.md │ │ ├── Recommendation.md │ │ ├── SearchModel.md │ │ ├── SearchRefinementDefinition.md │ │ ├── SearchRefinements.md │ │ ├── SearchRefinementValue.md │ │ ├── SortingOption.md │ │ ├── SortingRule.md │ │ ├── Store.md │ │ ├── StoreGroup.md │ │ ├── StoreInventoryFilter.md │ │ ├── StoreInventoryFilterValue.md │ │ ├── StoreMgr.md │ │ ├── Variant.md │ │ └── VariationGroup.md │ ├── dw_content │ │ ├── Content.md │ │ ├── ContentMgr.md │ │ ├── ContentSearchModel.md │ │ ├── ContentSearchRefinementDefinition.md │ │ ├── ContentSearchRefinements.md │ │ ├── ContentSearchRefinementValue.md │ │ ├── Folder.md │ │ ├── Library.md │ │ ├── MarkupText.md │ │ └── MediaFile.md │ ├── dw_crypto │ │ ├── CertificateRef.md │ │ ├── CertificateUtils.md │ │ ├── Cipher.md │ │ ├── Encoding.md │ │ ├── JWE.md │ │ ├── JWEHeader.md │ │ ├── JWS.md │ │ ├── JWSHeader.md │ │ ├── KeyRef.md │ │ ├── Mac.md │ │ ├── MessageDigest.md │ │ ├── SecureRandom.md │ │ ├── Signature.md │ │ ├── WeakCipher.md │ │ ├── WeakMac.md │ │ ├── WeakMessageDigest.md │ │ ├── WeakSignature.md │ │ └── X509Certificate.md │ ├── dw_customer │ │ ├── AddressBook.md │ │ ├── AgentUserMgr.md │ │ ├── AgentUserStatusCodes.md │ │ ├── AuthenticationStatus.md │ │ ├── Credentials.md │ │ ├── Customer.md │ │ ├── CustomerActiveData.md │ │ ├── CustomerAddress.md │ │ ├── CustomerCDPData.md │ │ ├── CustomerContextMgr.md │ │ ├── CustomerGroup.md │ │ ├── CustomerList.md │ │ ├── CustomerMgr.md │ │ ├── CustomerPasswordConstraints.md │ │ ├── CustomerPaymentInstrument.md │ │ ├── CustomerStatusCodes.md │ │ ├── EncryptedObject.md │ │ ├── ExternalProfile.md │ │ ├── OrderHistory.md │ │ ├── ProductList.md │ │ ├── ProductListItem.md │ │ ├── ProductListItemPurchase.md │ │ ├── ProductListMgr.md │ │ ├── ProductListRegistrant.md │ │ ├── Profile.md │ │ └── Wallet.md │ ├── dw_extensions.applepay │ │ ├── ApplePayHookResult.md │ │ └── ApplePayHooks.md │ ├── dw_extensions.facebook │ │ ├── FacebookFeedHooks.md │ │ └── FacebookProduct.md │ ├── dw_extensions.paymentrequest │ │ ├── PaymentRequestHookResult.md │ │ └── PaymentRequestHooks.md │ ├── dw_extensions.payments │ │ ├── SalesforceBancontactPaymentDetails.md │ │ ├── SalesforceCardPaymentDetails.md │ │ ├── SalesforceEpsPaymentDetails.md │ │ ├── SalesforceIdealPaymentDetails.md │ │ ├── SalesforceKlarnaPaymentDetails.md │ │ ├── SalesforcePaymentDetails.md │ │ ├── SalesforcePaymentIntent.md │ │ ├── SalesforcePaymentMethod.md │ │ ├── SalesforcePaymentRequest.md │ │ ├── SalesforcePaymentsHooks.md │ │ ├── SalesforcePaymentsMgr.md │ │ ├── SalesforcePaymentsSiteConfiguration.md │ │ ├── SalesforcePayPalOrder.md │ │ ├── SalesforcePayPalOrderAddress.md │ │ ├── SalesforcePayPalOrderPayer.md │ │ ├── SalesforcePayPalPaymentDetails.md │ │ ├── SalesforceSepaDebitPaymentDetails.md │ │ └── SalesforceVenmoPaymentDetails.md │ ├── dw_extensions.pinterest │ │ ├── PinterestAvailability.md │ │ ├── PinterestFeedHooks.md │ │ ├── PinterestOrder.md │ │ ├── PinterestOrderHooks.md │ │ └── PinterestProduct.md │ ├── dw_io │ │ ├── CSVStreamReader.md │ │ ├── CSVStreamWriter.md │ │ ├── File.md │ │ ├── FileReader.md │ │ ├── FileWriter.md │ │ ├── InputStream.md │ │ ├── OutputStream.md │ │ ├── PrintWriter.md │ │ ├── RandomAccessFileReader.md │ │ ├── Reader.md │ │ ├── StringWriter.md │ │ ├── Writer.md │ │ ├── XMLIndentingStreamWriter.md │ │ ├── XMLStreamConstants.md │ │ ├── XMLStreamReader.md │ │ └── XMLStreamWriter.md │ ├── dw_job │ │ ├── JobExecution.md │ │ └── JobStepExecution.md │ ├── dw_net │ │ ├── FTPClient.md │ │ ├── FTPFileInfo.md │ │ ├── HTTPClient.md │ │ ├── HTTPRequestPart.md │ │ ├── Mail.md │ │ ├── SFTPClient.md │ │ ├── SFTPFileInfo.md │ │ ├── WebDAVClient.md │ │ └── WebDAVFileInfo.md │ ├── dw_object │ │ ├── ActiveData.md │ │ ├── CustomAttributes.md │ │ ├── CustomObject.md │ │ ├── CustomObjectMgr.md │ │ ├── Extensible.md │ │ ├── ExtensibleObject.md │ │ ├── Note.md │ │ ├── ObjectAttributeDefinition.md │ │ ├── ObjectAttributeGroup.md │ │ ├── ObjectAttributeValueDefinition.md │ │ ├── ObjectTypeDefinition.md │ │ ├── PersistentObject.md │ │ ├── SimpleExtensible.md │ │ └── SystemObjectMgr.md │ ├── dw_order │ │ ├── AbstractItem.md │ │ ├── AbstractItemCtnr.md │ │ ├── Appeasement.md │ │ ├── AppeasementItem.md │ │ ├── Basket.md │ │ ├── BasketMgr.md │ │ ├── BonusDiscountLineItem.md │ │ ├── CouponLineItem.md │ │ ├── CreateAgentBasketLimitExceededException.md │ │ ├── CreateBasketFromOrderException.md │ │ ├── CreateCouponLineItemException.md │ │ ├── CreateOrderException.md │ │ ├── CreateTemporaryBasketLimitExceededException.md │ │ ├── GiftCertificate.md │ │ ├── GiftCertificateLineItem.md │ │ ├── GiftCertificateMgr.md │ │ ├── GiftCertificateStatusCodes.md │ │ ├── Invoice.md │ │ ├── InvoiceItem.md │ │ ├── LineItem.md │ │ ├── LineItemCtnr.md │ │ ├── Order.md │ │ ├── OrderAddress.md │ │ ├── OrderItem.md │ │ ├── OrderMgr.md │ │ ├── OrderPaymentInstrument.md │ │ ├── OrderProcessStatusCodes.md │ │ ├── PaymentCard.md │ │ ├── PaymentInstrument.md │ │ ├── PaymentMethod.md │ │ ├── PaymentMgr.md │ │ ├── PaymentProcessor.md │ │ ├── PaymentStatusCodes.md │ │ ├── PaymentTransaction.md │ │ ├── PriceAdjustment.md │ │ ├── PriceAdjustmentLimitTypes.md │ │ ├── ProductLineItem.md │ │ ├── ProductShippingCost.md │ │ ├── ProductShippingLineItem.md │ │ ├── ProductShippingModel.md │ │ ├── Return.md │ │ ├── ReturnCase.md │ │ ├── ReturnCaseItem.md │ │ ├── ReturnItem.md │ │ ├── Shipment.md │ │ ├── ShipmentShippingCost.md │ │ ├── ShipmentShippingModel.md │ │ ├── ShippingLineItem.md │ │ ├── ShippingLocation.md │ │ ├── ShippingMethod.md │ │ ├── ShippingMgr.md │ │ ├── ShippingOrder.md │ │ ├── ShippingOrderItem.md │ │ ├── SumItem.md │ │ ├── TaxGroup.md │ │ ├── TaxItem.md │ │ ├── TaxMgr.md │ │ ├── TrackingInfo.md │ │ └── TrackingRef.md │ ├── dw_order.hooks │ │ ├── CalculateHooks.md │ │ ├── OrderHooks.md │ │ ├── PaymentHooks.md │ │ ├── ReturnHooks.md │ │ └── ShippingOrderHooks.md │ ├── dw_rpc │ │ ├── SOAPUtil.md │ │ ├── Stub.md │ │ └── WebReference.md │ ├── dw_suggest │ │ ├── BrandSuggestions.md │ │ ├── CategorySuggestions.md │ │ ├── ContentSuggestions.md │ │ ├── CustomSuggestions.md │ │ ├── ProductSuggestions.md │ │ ├── SearchPhraseSuggestions.md │ │ ├── SuggestedCategory.md │ │ ├── SuggestedContent.md │ │ ├── SuggestedPhrase.md │ │ ├── SuggestedProduct.md │ │ ├── SuggestedTerm.md │ │ ├── SuggestedTerms.md │ │ ├── Suggestions.md │ │ └── SuggestModel.md │ ├── dw_svc │ │ ├── FTPService.md │ │ ├── FTPServiceDefinition.md │ │ ├── HTTPFormService.md │ │ ├── HTTPFormServiceDefinition.md │ │ ├── HTTPService.md │ │ ├── HTTPServiceDefinition.md │ │ ├── LocalServiceRegistry.md │ │ ├── Result.md │ │ ├── Service.md │ │ ├── ServiceCallback.md │ │ ├── ServiceConfig.md │ │ ├── ServiceCredential.md │ │ ├── ServiceDefinition.md │ │ ├── ServiceProfile.md │ │ ├── ServiceRegistry.md │ │ ├── SOAPService.md │ │ └── SOAPServiceDefinition.md │ ├── dw_system │ │ ├── AgentUserStatusCodes.md │ │ ├── Cache.md │ │ ├── CacheMgr.md │ │ ├── HookMgr.md │ │ ├── InternalObject.md │ │ ├── JobProcessMonitor.md │ │ ├── Log.md │ │ ├── Logger.md │ │ ├── LogNDC.md │ │ ├── OrganizationPreferences.md │ │ ├── Pipeline.md │ │ ├── PipelineDictionary.md │ │ ├── RemoteInclude.md │ │ ├── Request.md │ │ ├── RequestHooks.md │ │ ├── Response.md │ │ ├── RESTErrorResponse.md │ │ ├── RESTResponseMgr.md │ │ ├── RESTSuccessResponse.md │ │ ├── SearchStatus.md │ │ ├── Session.md │ │ ├── Site.md │ │ ├── SitePreferences.md │ │ ├── Status.md │ │ ├── StatusItem.md │ │ ├── System.md │ │ └── Transaction.md │ ├── dw_util │ │ ├── ArrayList.md │ │ ├── Assert.md │ │ ├── BigInteger.md │ │ ├── Bytes.md │ │ ├── Calendar.md │ │ ├── Collection.md │ │ ├── Currency.md │ │ ├── DateUtils.md │ │ ├── Decimal.md │ │ ├── FilteringCollection.md │ │ ├── Geolocation.md │ │ ├── HashMap.md │ │ ├── HashSet.md │ │ ├── Iterator.md │ │ ├── LinkedHashMap.md │ │ ├── LinkedHashSet.md │ │ ├── List.md │ │ ├── Locale.md │ │ ├── Map.md │ │ ├── MapEntry.md │ │ ├── MappingKey.md │ │ ├── MappingMgr.md │ │ ├── PropertyComparator.md │ │ ├── SecureEncoder.md │ │ ├── SecureFilter.md │ │ ├── SeekableIterator.md │ │ ├── Set.md │ │ ├── SortedMap.md │ │ ├── SortedSet.md │ │ ├── StringUtils.md │ │ ├── Template.md │ │ └── UUIDUtils.md │ ├── dw_value │ │ ├── EnumValue.md │ │ ├── MimeEncodedText.md │ │ ├── Money.md │ │ └── Quantity.md │ ├── dw_web │ │ ├── ClickStream.md │ │ ├── ClickStreamEntry.md │ │ ├── Cookie.md │ │ ├── Cookies.md │ │ ├── CSRFProtection.md │ │ ├── Form.md │ │ ├── FormAction.md │ │ ├── FormElement.md │ │ ├── FormElementValidationResult.md │ │ ├── FormField.md │ │ ├── FormFieldOption.md │ │ ├── FormFieldOptions.md │ │ ├── FormGroup.md │ │ ├── FormList.md │ │ ├── FormListItem.md │ │ ├── Forms.md │ │ ├── HttpParameter.md │ │ ├── HttpParameterMap.md │ │ ├── LoopIterator.md │ │ ├── PageMetaData.md │ │ ├── PageMetaTag.md │ │ ├── PagingModel.md │ │ ├── Resource.md │ │ ├── URL.md │ │ ├── URLAction.md │ │ ├── URLParameter.md │ │ ├── URLRedirect.md │ │ ├── URLRedirectMgr.md │ │ └── URLUtils.md │ ├── sfra │ │ ├── account.md │ │ ├── address.md │ │ ├── billing.md │ │ ├── cart.md │ │ ├── categories.md │ │ ├── content.md │ │ ├── locale.md │ │ ├── order.md │ │ ├── payment.md │ │ ├── price-default.md │ │ ├── price-range.md │ │ ├── price-tiered.md │ │ ├── product-bundle.md │ │ ├── product-full.md │ │ ├── product-line-items.md │ │ ├── product-search.md │ │ ├── product-tile.md │ │ ├── querystring.md │ │ ├── render.md │ │ ├── request.md │ │ ├── response.md │ │ ├── server.md │ │ ├── shipping.md │ │ ├── store.md │ │ ├── stores.md │ │ └── totals.md │ └── TopLevel │ ├── APIException.md │ ├── arguments.md │ ├── Array.md │ ├── ArrayBuffer.md │ ├── BigInt.md │ ├── Boolean.md │ ├── ConversionError.md │ ├── DataView.md │ ├── Date.md │ ├── Error.md │ ├── ES6Iterator.md │ ├── EvalError.md │ ├── Fault.md │ ├── Float32Array.md │ ├── Float64Array.md │ ├── Function.md │ ├── Generator.md │ ├── global.md │ ├── Int16Array.md │ ├── Int32Array.md │ ├── Int8Array.md │ ├── InternalError.md │ ├── IOError.md │ ├── Iterable.md │ ├── Iterator.md │ ├── JSON.md │ ├── Map.md │ ├── Math.md │ ├── Module.md │ ├── Namespace.md │ ├── Number.md │ ├── Object.md │ ├── QName.md │ ├── RangeError.md │ ├── ReferenceError.md │ ├── RegExp.md │ ├── Set.md │ ├── StopIteration.md │ ├── String.md │ ├── Symbol.md │ ├── SyntaxError.md │ ├── SystemError.md │ ├── TypeError.md │ ├── Uint16Array.md │ ├── Uint32Array.md │ ├── Uint8Array.md │ ├── Uint8ClampedArray.md │ ├── URIError.md │ ├── WeakMap.md │ ├── WeakSet.md │ ├── XML.md │ ├── XMLList.md │ └── XMLStreamError.md ├── docs-site │ ├── .gitignore │ ├── App.tsx │ ├── components │ │ ├── Badge.tsx │ │ ├── BreadcrumbSchema.tsx │ │ ├── CodeBlock.tsx │ │ ├── Collapsible.tsx │ │ ├── ConfigBuilder.tsx │ │ ├── ConfigHero.tsx │ │ ├── ConfigModeTabs.tsx │ │ ├── icons.tsx │ │ ├── Layout.tsx │ │ ├── LightCodeContainer.tsx │ │ ├── NewcomerCTA.tsx │ │ ├── NextStepsStrip.tsx │ │ ├── OnThisPage.tsx │ │ ├── Search.tsx │ │ ├── SEO.tsx │ │ ├── Sidebar.tsx │ │ ├── StructuredData.tsx │ │ ├── ToolCard.tsx │ │ ├── ToolFilters.tsx │ │ ├── Typography.tsx │ │ └── VersionBadge.tsx │ ├── constants.tsx │ ├── index.html │ ├── main.tsx │ ├── metadata.json │ ├── package-lock.json │ ├── package.json │ ├── pages │ │ ├── AIInterfacesPage.tsx │ │ ├── ConfigurationPage.tsx │ │ ├── DevelopmentPage.tsx │ │ ├── ExamplesPage.tsx │ │ ├── FeaturesPage.tsx │ │ ├── HomePage.tsx │ │ ├── SecurityPage.tsx │ │ ├── ToolsPage.tsx │ │ └── TroubleshootingPage.tsx │ ├── postcss.config.js │ ├── public │ │ ├── .well-known │ │ │ └── security.txt │ │ ├── 404.html │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── apple-touch-icon.png │ │ ├── explain-product-pricing-methods-no-mcp.png │ │ ├── explain-product-pricing-methods.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ ├── llms.txt │ │ ├── robots.txt │ │ ├── site.webmanifest │ │ └── sitemap.xml │ ├── README.md │ ├── scripts │ │ ├── generate-search-index.js │ │ ├── generate-sitemap.js │ │ └── search-dev.js │ ├── src │ │ └── styles │ │ ├── input.css │ │ └── prism-theme.css │ ├── tailwind.config.js │ ├── tsconfig.json │ ├── types.ts │ ├── utils │ │ ├── search.ts │ │ └── toolsData.ts │ └── vite.config.ts ├── eslint.config.js ├── jest.config.js ├── LICENSE ├── package-lock.json ├── package.json ├── README.md ├── scripts │ └── convert-docs.js ├── SECURITY.md ├── server.json ├── src │ ├── clients │ │ ├── base │ │ │ ├── http-client.ts │ │ │ ├── oauth-token.ts │ │ │ └── ocapi-auth-client.ts │ │ ├── best-practices-client.ts │ │ ├── cartridge-generation-client.ts │ │ ├── docs │ │ │ ├── class-content-parser.ts │ │ │ ├── class-name-resolver.ts │ │ │ ├── documentation-scanner.ts │ │ │ ├── index.ts │ │ │ └── referenced-types-extractor.ts │ │ ├── docs-client.ts │ │ ├── log-client.ts │ │ ├── logs │ │ │ ├── index.ts │ │ │ ├── log-analyzer.ts │ │ │ ├── log-client.ts │ │ │ ├── log-constants.ts │ │ │ ├── log-file-discovery.ts │ │ │ ├── log-file-reader.ts │ │ │ ├── log-formatter.ts │ │ │ ├── log-processor.ts │ │ │ ├── log-types.ts │ │ │ └── webdav-client-manager.ts │ │ ├── ocapi │ │ │ ├── code-versions-client.ts │ │ │ ├── site-preferences-client.ts │ │ │ └── system-objects-client.ts │ │ ├── ocapi-client.ts │ │ └── sfra-client.ts │ ├── config │ │ ├── configuration-factory.ts │ │ └── dw-json-loader.ts │ ├── core │ │ ├── handlers │ │ │ ├── abstract-log-tool-handler.ts │ │ │ ├── base-handler.ts │ │ │ ├── best-practices-handler.ts │ │ │ ├── cartridge-handler.ts │ │ │ ├── client-factory.ts │ │ │ ├── code-version-handler.ts │ │ │ ├── docs-handler.ts │ │ │ ├── job-log-handler.ts │ │ │ ├── job-log-tool-config.ts │ │ │ ├── log-handler.ts │ │ │ ├── log-tool-config.ts │ │ │ ├── sfra-handler.ts │ │ │ ├── system-object-handler.ts │ │ │ └── validation-helpers.ts │ │ ├── server.ts │ │ └── tool-definitions.ts │ ├── index.ts │ ├── main.ts │ ├── services │ │ ├── file-system-service.ts │ │ ├── index.ts │ │ └── path-service.ts │ ├── tool-configs │ │ ├── best-practices-tool-config.ts │ │ ├── cartridge-tool-config.ts │ │ ├── code-version-tool-config.ts │ │ ├── docs-tool-config.ts │ │ ├── job-log-tool-config.ts │ │ ├── log-tool-config.ts │ │ ├── sfra-tool-config.ts │ │ └── system-object-tool-config.ts │ ├── types │ │ └── types.ts │ └── utils │ ├── cache.ts │ ├── job-log-tool-config.ts │ ├── job-log-utils.ts │ ├── log-cache.ts │ ├── log-tool-config.ts │ ├── log-tool-constants.ts │ ├── log-tool-utils.ts │ ├── logger.ts │ ├── ocapi-url-builder.ts │ ├── path-resolver.ts │ ├── query-builder.ts │ ├── utils.ts │ └── validator.ts ├── tests │ ├── __mocks__ │ │ ├── docs-client.ts │ │ ├── src │ │ │ └── clients │ │ │ └── base │ │ │ └── http-client.js │ │ └── webdav.js │ ├── base-handler.test.ts │ ├── base-http-client.test.ts │ ├── best-practices-handler.test.ts │ ├── cache.test.ts │ ├── cartridge-handler.test.ts │ ├── class-content-parser.test.ts │ ├── class-name-resolver.test.ts │ ├── client-factory.test.ts │ ├── code-version-handler.test.ts │ ├── code-versions-client.test.ts │ ├── config.test.ts │ ├── configuration-factory.test.ts │ ├── docs-handler.test.ts │ ├── documentation-scanner.test.ts │ ├── file-system-service.test.ts │ ├── job-log-handler.test.ts │ ├── job-log-utils.test.ts │ ├── log-client.test.ts │ ├── log-handler.test.ts │ ├── log-processor.test.ts │ ├── logger.test.ts │ ├── mcp │ │ ├── AGENTS.md │ │ ├── node │ │ │ ├── activate-code-version-advanced.full-mode.programmatic.test.js │ │ │ ├── code-versions.full-mode.programmatic.test.js │ │ │ ├── generate-cartridge-structure.docs-only.programmatic.test.js │ │ │ ├── get-available-best-practice-guides.docs-only.programmatic.test.js │ │ │ ├── get-available-sfra-documents.programmatic.test.js │ │ │ ├── get-best-practice-guide.docs-only.programmatic.test.js │ │ │ ├── get-hook-reference.docs-only.programmatic.test.js │ │ │ ├── get-job-execution-summary.full-mode.programmatic.test.js │ │ │ ├── get-job-log-entries.full-mode.programmatic.test.js │ │ │ ├── get-latest-debug.full-mode.programmatic.test.js │ │ │ ├── get-latest-error.full-mode.programmatic.test.js │ │ │ ├── get-latest-info.full-mode.programmatic.test.js │ │ │ ├── get-latest-job-log-files.full-mode.programmatic.test.js │ │ │ ├── get-latest-warn.full-mode.programmatic.test.js │ │ │ ├── get-log-file-contents.full-mode.programmatic.test.js │ │ │ ├── get-sfcc-class-documentation.docs-only.programmatic.test.js │ │ │ ├── get-sfcc-class-info.docs-only.programmatic.test.js │ │ │ ├── get-sfra-categories.docs-only.programmatic.test.js │ │ │ ├── get-sfra-document.programmatic.test.js │ │ │ ├── get-sfra-documents-by-category.docs-only.programmatic.test.js │ │ │ ├── get-system-object-definition.full-mode.programmatic.test.js │ │ │ ├── get-system-object-definitions.docs-only.programmatic.test.js │ │ │ ├── get-system-object-definitions.full-mode.programmatic.test.js │ │ │ ├── list-log-files.full-mode.programmatic.test.js │ │ │ ├── list-sfcc-classes.docs-only.programmatic.test.js │ │ │ ├── search-best-practices.docs-only.programmatic.test.js │ │ │ ├── search-custom-object-attribute-definitions.full-mode.programmatic.test.js │ │ │ ├── search-job-logs-by-name.full-mode.programmatic.test.js │ │ │ ├── search-job-logs.full-mode.programmatic.test.js │ │ │ ├── search-logs.full-mode.programmatic.test.js │ │ │ ├── search-sfcc-classes.docs-only.programmatic.test.js │ │ │ ├── search-sfcc-methods.docs-only.programmatic.test.js │ │ │ ├── search-sfra-documentation.docs-only.programmatic.test.js │ │ │ ├── search-site-preferences.full-mode.programmatic.test.js │ │ │ ├── search-system-object-attribute-definitions.full-mode.programmatic.test.js │ │ │ ├── search-system-object-attribute-groups.full-mode.programmatic.test.js │ │ │ ├── summarize-logs.full-mode.programmatic.test.js │ │ │ ├── tools.docs-only.programmatic.test.js │ │ │ └── tools.full-mode.programmatic.test.js │ │ ├── README.md │ │ ├── test-fixtures │ │ │ └── dw.json │ │ └── yaml │ │ ├── activate-code-version.docs-only.test.mcp.yml │ │ ├── activate-code-version.full-mode.test.mcp.yml │ │ ├── get_latest_error.test.mcp.yml │ │ ├── get-available-best-practice-guides.docs-only.test.mcp.yml │ │ ├── get-available-best-practice-guides.full-mode.test.mcp.yml │ │ ├── get-available-sfra-documents.docs-only.test.mcp.yml │ │ ├── get-available-sfra-documents.full-mode.test.mcp.yml │ │ ├── get-best-practice-guide.docs-only.test.mcp.yml │ │ ├── get-best-practice-guide.full-mode.test.mcp.yml │ │ ├── get-code-versions.docs-only.test.mcp.yml │ │ ├── get-code-versions.full-mode.test.mcp.yml │ │ ├── get-hook-reference.docs-only.test.mcp.yml │ │ ├── get-hook-reference.full-mode.test.mcp.yml │ │ ├── get-job-execution-summary.full-mode.test.mcp.yml │ │ ├── get-job-log-entries.full-mode.test.mcp.yml │ │ ├── get-latest-debug.full-mode.test.mcp.yml │ │ ├── get-latest-error.full-mode.test.mcp.yml │ │ ├── get-latest-info.full-mode.test.mcp.yml │ │ ├── get-latest-job-log-files.full-mode.test.mcp.yml │ │ ├── get-latest-warn.full-mode.test.mcp.yml │ │ ├── get-log-file-contents.full-mode.test.mcp.yml │ │ ├── get-sfcc-class-documentation.docs-only.test.mcp.yml │ │ ├── get-sfcc-class-documentation.full-mode.test.mcp.yml │ │ ├── get-sfcc-class-info.docs-only.test.mcp.yml │ │ ├── get-sfcc-class-info.full-mode.test.mcp.yml │ │ ├── get-sfra-categories.docs-only.test.mcp.yml │ │ ├── get-sfra-categories.full-mode.test.mcp.yml │ │ ├── get-sfra-document.docs-only.test.mcp.yml │ │ ├── get-sfra-document.full-mode.test.mcp.yml │ │ ├── get-sfra-documents-by-category.docs-only.test.mcp.yml │ │ ├── get-sfra-documents-by-category.full-mode.test.mcp.yml │ │ ├── get-system-object-definition.docs-only.test.mcp.yml │ │ ├── get-system-object-definition.full-mode.test.mcp.yml │ │ ├── get-system-object-definitions.docs-only.test.mcp.yml │ │ ├── get-system-object-definitions.full-mode.test.mcp.yml │ │ ├── list-log-files.full-mode.test.mcp.yml │ │ ├── list-sfcc-classes.docs-only.test.mcp.yml │ │ ├── list-sfcc-classes.full-mode.test.mcp.yml │ │ ├── search-best-practices.docs-only.test.mcp.yml │ │ ├── search-best-practices.full-mode.test.mcp.yml │ │ ├── search-custom-object-attribute-definitions.docs-only.test.mcp.yml │ │ ├── search-custom-object-attribute-definitions.test.mcp.yml │ │ ├── search-job-logs-by-name.full-mode.test.mcp.yml │ │ ├── search-job-logs.full-mode.test.mcp.yml │ │ ├── search-logs.full-mode.test.mcp.yml │ │ ├── search-sfcc-classes.docs-only.test.mcp.yml │ │ ├── search-sfcc-classes.full-mode.test.mcp.yml │ │ ├── search-sfcc-methods.docs-only.test.mcp.yml │ │ ├── search-sfcc-methods.full-mode.test.mcp.yml │ │ ├── search-sfra-documentation.docs-only.test.mcp.yml │ │ ├── search-sfra-documentation.full-mode.test.mcp.yml │ │ ├── search-site-preferences.docs-only.test.mcp.yml │ │ ├── search-site-preferences.full-mode.test.mcp.yml │ │ ├── search-system-object-attribute-definitions.docs-only.test.mcp.yml │ │ ├── search-system-object-attribute-definitions.full-mode.test.mcp.yml │ │ ├── search-system-object-attribute-groups.docs-only.test.mcp.yml │ │ ├── search-system-object-attribute-groups.full-mode.test.mcp.yml │ │ ├── summarize-logs.full-mode.test.mcp.yml │ │ ├── tools.docs-only.test.mcp.yml │ │ └── tools.full-mode.test.mcp.yml │ ├── oauth-token.test.ts │ ├── ocapi-auth-client.test.ts │ ├── ocapi-client.test.ts │ ├── path-service.test.ts │ ├── query-builder.test.ts │ ├── referenced-types-extractor.test.ts │ ├── servers │ │ ├── sfcc-mock-server │ │ │ ├── mock-data │ │ │ │ └── ocapi │ │ │ │ ├── code-versions.json │ │ │ │ ├── custom-object-attributes-customapi.json │ │ │ │ ├── custom-object-attributes-globalsettings.json │ │ │ │ ├── custom-object-attributes-versionhistory.json │ │ │ │ ├── site-preferences-ccv.json │ │ │ │ ├── site-preferences-fastforward.json │ │ │ │ ├── site-preferences-sfra.json │ │ │ │ ├── site-preferences-storefront.json │ │ │ │ ├── site-preferences-system.json │ │ │ │ ├── system-object-attribute-groups-campaign.json │ │ │ │ ├── system-object-attribute-groups-category.json │ │ │ │ ├── system-object-attribute-groups-order.json │ │ │ │ ├── system-object-attribute-groups-product.json │ │ │ │ ├── system-object-attribute-groups-sitepreferences.json │ │ │ │ ├── system-object-attributes-customeraddress.json │ │ │ │ ├── system-object-attributes-product-expanded.json │ │ │ │ ├── system-object-attributes-product.json │ │ │ │ ├── system-object-definition-category.json │ │ │ │ ├── system-object-definition-customer.json │ │ │ │ ├── system-object-definition-customeraddress.json │ │ │ │ ├── system-object-definition-order.json │ │ │ │ ├── system-object-definition-product.json │ │ │ │ ├── system-object-definitions-old.json │ │ │ │ └── system-object-definitions.json │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ ├── README.md │ │ │ ├── scripts │ │ │ │ └── setup-logs.js │ │ │ ├── server.js │ │ │ └── src │ │ │ ├── app.js │ │ │ ├── config │ │ │ │ └── server-config.js │ │ │ ├── middleware │ │ │ │ ├── auth.js │ │ │ │ ├── cors.js │ │ │ │ └── logging.js │ │ │ ├── routes │ │ │ │ ├── ocapi │ │ │ │ │ ├── code-versions-handler.js │ │ │ │ │ ├── oauth-handler.js │ │ │ │ │ ├── ocapi-error-utils.js │ │ │ │ │ ├── ocapi-utils.js │ │ │ │ │ ├── site-preferences-handler.js │ │ │ │ │ └── system-objects-handler.js │ │ │ │ ├── ocapi.js │ │ │ │ └── webdav.js │ │ │ └── utils │ │ │ ├── mock-data-loader.js │ │ │ └── webdav-xml.js │ │ └── sfcc-mock-server-manager.ts │ ├── sfcc-mock-server.test.ts │ ├── site-preferences-client.test.ts │ ├── system-objects-client.test.ts │ ├── utils.test.ts │ ├── validation-helpers.test.ts │ └── validator.test.ts ├── tsconfig.json └── tsconfig.test.json ``` # Files -------------------------------------------------------------------------------- /docs/dw_catalog/StoreInventoryFilter.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.catalog 2 | 3 | # Class StoreInventoryFilter 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.catalog.StoreInventoryFilter 9 | 10 | ## Description 11 | 12 | This class represents a store inventory filter, which can be used at ProductSearchModel.setStoreInventoryFilter(StoreInventoryFilter) to filter the search result by one or more store inventories. Compared to the default parameter 'ilids' (Inventory List IDs) see (ProductSearchModel.INVENTORY_LIST_IDS_PARAMETER the store inventory filter allows a customization of the parameter name and the inventory list ID parameter values for the URL generations via all URLRefine and URLRelax methods e.g. for ProductSearchModel.urlRefineCategory(String, String), ProductSearchModel.urlRelaxPrice(URL), SearchModel.urlRefineAttribute(String, String, String). Example custom URL: city=Burlington|Boston new dw.catalog.StoreInventoryFilter( "city", new dw.util.ArrayList( new dw.catalog.StoreInventoryFilterValue( "Burlington", "inventory_store_store9" ), new dw.catalog.StoreInventoryFilterValue( "Boston", "inventory_store_store8" ) ) ); 13 | 14 | ## Properties 15 | 16 | ### semanticURLParameter 17 | 18 | **Type:** String (Read Only) 19 | 20 | The semantic URL parameter of this StoreInventoryFilter. 21 | 22 | ### storeInventoryFilterValues 23 | 24 | **Type:** List (Read Only) 25 | 26 | A list of StoreInventoryFilterValue instances used by this StoreInventoryFilter. 27 | 28 | ## Constructor Summary 29 | 30 | StoreInventoryFilter(semanticURLParameter : String, storeFilterValues : List) Creates a new StoreInventoryFilter instance for the given semantic URL parameter and a list of StoreInventoryFilterValue instances. 31 | 32 | ## Method Summary 33 | 34 | ### getSemanticURLParameter 35 | 36 | **Signature:** `getSemanticURLParameter() : String` 37 | 38 | Returns the semantic URL parameter of this StoreInventoryFilter. 39 | 40 | ### getStoreInventoryFilterValues 41 | 42 | **Signature:** `getStoreInventoryFilterValues() : List` 43 | 44 | Returns a list of StoreInventoryFilterValue instances used by this StoreInventoryFilter. 45 | 46 | ## Constructor Detail 47 | 48 | ## Method Detail 49 | 50 | ## Method Details 51 | 52 | ### getSemanticURLParameter 53 | 54 | **Signature:** `getSemanticURLParameter() : String` 55 | 56 | **Description:** Returns the semantic URL parameter of this StoreInventoryFilter. 57 | 58 | **Returns:** 59 | 60 | the semantic URL parameter of this StoreInventoryFilter. 61 | 62 | --- 63 | 64 | ### getStoreInventoryFilterValues 65 | 66 | **Signature:** `getStoreInventoryFilterValues() : List` 67 | 68 | **Description:** Returns a list of StoreInventoryFilterValue instances used by this StoreInventoryFilter. 69 | 70 | **Returns:** 71 | 72 | a list of StoreInventoryFilterValue instances used by this StoreInventoryFilter. 73 | 74 | --- ``` -------------------------------------------------------------------------------- /docs/sfra/price-range.md: -------------------------------------------------------------------------------- ```markdown 1 | # SFRA Range Price Model 2 | 3 | ## Overview 4 | 5 | The Range Price model represents price ranges in SFRA applications, typically used for product sets, bundles, or variable products where prices can vary between a minimum and maximum value. 6 | 7 | ## Constructor 8 | 9 | ```javascript 10 | function RangePrice(min, max) 11 | ``` 12 | 13 | Creates a Range Price model instance with minimum and maximum pricing. 14 | 15 | ### Parameters 16 | 17 | - `min` (dw.value.Money) - Range minimum price 18 | - `max` (dw.value.Money) - Range maximum price 19 | 20 | ## Properties 21 | 22 | ### type 23 | **Type:** string 24 | 25 | Always set to 'range' to identify this as a range price model. 26 | 27 | ### min 28 | **Type:** DefaultPrice 29 | 30 | Minimum price in the range, formatted as a DefaultPrice model with value, currency, and formatted properties. Created as `new DefaultPrice(min)` where only the sales price is provided. 31 | 32 | ### max 33 | **Type:** DefaultPrice 34 | 35 | Maximum price in the range, formatted as a DefaultPrice model with value, currency, and formatted properties. Created as `new DefaultPrice(max)` where only the sales price is provided. 36 | 37 | ## Usage Example 38 | 39 | ```javascript 40 | var RangePrice = require('*/cartridge/models/price/range'); 41 | 42 | // For a product bundle with varying prices 43 | var minPrice = new Money(19.99, 'USD'); 44 | var maxPrice = new Money(49.99, 'USD'); 45 | 46 | var rangePrice = new RangePrice(minPrice, maxPrice); 47 | 48 | console.log(rangePrice.type); // "range" 49 | console.log(rangePrice.min.sales.formatted); // "$19.99" 50 | console.log(rangePrice.max.sales.formatted); // "$49.99" 51 | 52 | // Display price range 53 | console.log(rangePrice.min.sales.formatted + ' - ' + rangePrice.max.sales.formatted); 54 | // Output: "$19.99 - $49.99" 55 | ``` 56 | 57 | ## Use Cases 58 | 59 | Range prices are commonly used for: 60 | - **Product Bundles** - When bundle contents affect total price 61 | - **Product Sets** - Collections with varying individual prices 62 | - **Variable Products** - Products with options that affect pricing 63 | - **Category Displays** - Showing price ranges for product collections 64 | 65 | ## Notes 66 | 67 | - Both min and max are DefaultPrice models created with only the sales price (no list price) 68 | - Min and max prices are accessed via `.sales` property (e.g., `rangePrice.min.sales.formatted`) 69 | - Type property helps identify this as a range price in templates 70 | - Useful for displaying "from X to Y" pricing 71 | - Maintains currency and formatting consistency through DefaultPrice 72 | 73 | ## Related Models 74 | 75 | - **DefaultPrice Model** - Used for min and max price formatting 76 | - **TieredPrice Model** - Alternative pricing model for quantity discounts 77 | - **Product Models** - May use range prices for variable products 78 | ``` -------------------------------------------------------------------------------- /docs/TopLevel/QName.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: TopLevel 2 | 3 | # Class QName 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - QName 9 | 10 | ## Description 11 | 12 | QName objects are used to represent qualified names of XML elements and attributes. Each QName object has a local name of type string and a namespace URI of type string or null. When the namespace URI is null, this qualified name matches any namespace. If the QName of an XML element is specified without identifying a namespace (i.e., as an unqualified identifier), the uri property of the associated QName will be set to the in-scope default namespace. If the QName of an XML attribute is specified without identifying a namespace, the uri property of the associated QName will be the empty string representing no namespace. 13 | 14 | ## Properties 15 | 16 | ### localName 17 | 18 | **Type:** String (Read Only) 19 | 20 | The local name of the QName object. 21 | 22 | ### uri 23 | 24 | **Type:** String (Read Only) 25 | 26 | The Uniform Resource Identifier (URI) of the QName object. 27 | 28 | ## Constructor Summary 29 | 30 | QName() Constructs a QName object where localName is set to an empty String. 31 | 32 | QName(qname : QName) Constructs a QName object that is a copy of the specified qname. 33 | 34 | QName(uri : Namespace, localName : QName) Creates a QName object with a uri from a Namespace object and a localName from a QName object. 35 | 36 | ## Method Summary 37 | 38 | ### getLocalName 39 | 40 | **Signature:** `getLocalName() : String` 41 | 42 | Returns the local name of the QName object. 43 | 44 | ### getUri 45 | 46 | **Signature:** `getUri() : String` 47 | 48 | Returns the Uniform Resource Identifier (URI) of the QName object. 49 | 50 | ### toString 51 | 52 | **Signature:** `toString() : String` 53 | 54 | Returns a string composed of the URI, and the local name for the QName object, separated by "::". 55 | 56 | ## Constructor Detail 57 | 58 | ## Method Detail 59 | 60 | ## Method Details 61 | 62 | ### getLocalName 63 | 64 | **Signature:** `getLocalName() : String` 65 | 66 | **Description:** Returns the local name of the QName object. 67 | 68 | **Returns:** 69 | 70 | the local name of the QName object. 71 | 72 | --- 73 | 74 | ### getUri 75 | 76 | **Signature:** `getUri() : String` 77 | 78 | **Description:** Returns the Uniform Resource Identifier (URI) of the QName object. 79 | 80 | **Returns:** 81 | 82 | the Uniform Resource Identifier (URI) of the QName object. 83 | 84 | --- 85 | 86 | ### toString 87 | 88 | **Signature:** `toString() : String` 89 | 90 | **Description:** Returns a string composed of the URI, and the local name for the QName object, separated by "::". The format depends on the uri property of the QName object: If uri == "" toString returns localName else if uri == null toString returns *::localName else toString returns uri::localNam 91 | 92 | **Returns:** 93 | 94 | a string composed of the URI, and the local name for the QName object, separated by "::". 95 | 96 | --- ``` -------------------------------------------------------------------------------- /docs/dw_customer/ProductListItemPurchase.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.customer 2 | 3 | # Class ProductListItemPurchase 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.object.PersistentObject 9 | - dw.object.ExtensibleObject 10 | - dw.customer.ProductListItemPurchase 11 | 12 | ## Description 13 | 14 | A record of the purchase of an item contained in a product list. 15 | 16 | ## Properties 17 | 18 | ### item 19 | 20 | **Type:** ProductListItem (Read Only) 21 | 22 | The item that was purchased. 23 | 24 | ### orderNo 25 | 26 | **Type:** String (Read Only) 27 | 28 | The number of the order in which the 29 | product list item was purchased. 30 | 31 | ### purchaseDate 32 | 33 | **Type:** Date (Read Only) 34 | 35 | The date on which the product list item was purchased. 36 | 37 | ### purchaserName 38 | 39 | **Type:** String (Read Only) 40 | 41 | The name of the purchaser of the product list item. 42 | 43 | ### quantity 44 | 45 | **Type:** Quantity (Read Only) 46 | 47 | The quantity of the product list item that was purchased. 48 | 49 | ## Constructor Summary 50 | 51 | ## Method Summary 52 | 53 | ### getItem 54 | 55 | **Signature:** `getItem() : ProductListItem` 56 | 57 | Returns the item that was purchased. 58 | 59 | ### getOrderNo 60 | 61 | **Signature:** `getOrderNo() : String` 62 | 63 | Returns the number of the order in which the product list item was purchased. 64 | 65 | ### getPurchaseDate 66 | 67 | **Signature:** `getPurchaseDate() : Date` 68 | 69 | Returns the date on which the product list item was purchased. 70 | 71 | ### getPurchaserName 72 | 73 | **Signature:** `getPurchaserName() : String` 74 | 75 | Returns the name of the purchaser of the product list item. 76 | 77 | ### getQuantity 78 | 79 | **Signature:** `getQuantity() : Quantity` 80 | 81 | Returns the quantity of the product list item that was purchased. 82 | 83 | ## Method Detail 84 | 85 | ## Method Details 86 | 87 | ### getItem 88 | 89 | **Signature:** `getItem() : ProductListItem` 90 | 91 | **Description:** Returns the item that was purchased. 92 | 93 | **Returns:** 94 | 95 | the item that was purchased. 96 | 97 | --- 98 | 99 | ### getOrderNo 100 | 101 | **Signature:** `getOrderNo() : String` 102 | 103 | **Description:** Returns the number of the order in which the product list item was purchased. 104 | 105 | **Returns:** 106 | 107 | the number of the order in which the product list item was purchased. 108 | 109 | --- 110 | 111 | ### getPurchaseDate 112 | 113 | **Signature:** `getPurchaseDate() : Date` 114 | 115 | **Description:** Returns the date on which the product list item was purchased. 116 | 117 | **Returns:** 118 | 119 | the date on which the product list item was purchased. 120 | 121 | --- 122 | 123 | ### getPurchaserName 124 | 125 | **Signature:** `getPurchaserName() : String` 126 | 127 | **Description:** Returns the name of the purchaser of the product list item. 128 | 129 | **Returns:** 130 | 131 | the name of the purchaser of the product list item. 132 | 133 | --- 134 | 135 | ### getQuantity 136 | 137 | **Signature:** `getQuantity() : Quantity` 138 | 139 | **Description:** Returns the quantity of the product list item that was purchased. 140 | 141 | **Returns:** 142 | 143 | the quantity of the product list item that was purchased. 144 | 145 | --- ``` -------------------------------------------------------------------------------- /docs-site/components/StructuredData.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import React from 'react'; 2 | import { SITE_DATES } from '../constants'; 3 | 4 | interface StructuredDataProps { 5 | structuredData?: object; 6 | } 7 | 8 | const StructuredData: React.FC<StructuredDataProps> = ({ structuredData }) => { 9 | const combinedData = [ 10 | // Global Software Application Schema 11 | { 12 | "@context": "https://schema.org", 13 | "@type": "SoftwareApplication", 14 | "name": "SFCC Development MCP Server", 15 | "applicationCategory": "DeveloperApplication", 16 | "applicationSubCategory": "Development Tools", 17 | "operatingSystem": "Node.js", 18 | "description": "A Model Context Protocol server for Salesforce B2C Commerce Cloud development with AI-powered documentation access, log analysis, and development best practices.", 19 | "url": "https://sfcc-mcp-dev.rhino-inquisitor.com/", 20 | "downloadUrl": "https://www.npmjs.com/package/sfcc-dev-mcp", 21 | "installUrl": "https://sfcc-mcp-dev.rhino-inquisitor.com/configuration/", 22 | "softwareVersion": "1.0.0", 23 | "datePublished": SITE_DATES.PUBLISHED, 24 | "dateModified": SITE_DATES.MODIFIED, 25 | "author": { 26 | "@type": "Person", 27 | "name": "Thomas Theunen", 28 | "url": "https://github.com/taurgis" 29 | }, 30 | "publisher": { 31 | "@type": "Person", 32 | "name": "Thomas Theunen" 33 | }, 34 | "programmingLanguage": ["JavaScript", "TypeScript"], 35 | "runtimePlatform": "Node.js", 36 | "keywords": "SFCC, Salesforce Commerce Cloud, Model Context Protocol, MCP server, AI development tools, SFCC documentation, Commerce Cloud development", 37 | "requirements": "Node.js 18+, npm", 38 | "featureList": [ 39 | "SFCC API Documentation Access", 40 | "Real-time Log Analysis", 41 | "System Object Exploration", 42 | "Cartridge Generation", 43 | "Best Practices Guides", 44 | "AI Assistant Integration" 45 | ], 46 | "screenshot": "https://sfcc-mcp-dev.rhino-inquisitor.com/explain-product-pricing-methods.png", 47 | "offers": { 48 | "@type": "Offer", 49 | "price": "0", 50 | "priceCurrency": "USD", 51 | "availability": "https://schema.org/InStock" 52 | }, 53 | "license": "https://opensource.org/licenses/MIT", 54 | "codeRepository": "https://github.com/taurgis/sfcc-dev-mcp", 55 | "maintainer": { 56 | "@type": "Person", 57 | "name": "Thomas Theunen" 58 | } 59 | }, 60 | // Page-specific structured data (if provided) 61 | ...(structuredData ? [structuredData] : []) 62 | ]; 63 | 64 | return ( 65 | <script 66 | type="application/ld+json" 67 | dangerouslySetInnerHTML={{ __html: JSON.stringify(combinedData) }} 68 | /> 69 | ); 70 | }; 71 | 72 | export default StructuredData; ``` -------------------------------------------------------------------------------- /docs/dw_crypto/JWSHeader.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.crypto 2 | 3 | # Class JWSHeader 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.crypto.JWSHeader 9 | 10 | ## Description 11 | 12 | This class represents an immutable header of a JWS (JSON Web Signature) object. 13 | 14 | ## Properties 15 | 16 | ### algorithm 17 | 18 | **Type:** String (Read Only) 19 | 20 | Get the value of the algorithm parameter (alg). 21 | 22 | ## Constructor Summary 23 | 24 | ## Method Summary 25 | 26 | ### getAlgorithm 27 | 28 | **Signature:** `getAlgorithm() : String` 29 | 30 | Get the value of the algorithm parameter (alg). 31 | 32 | ### parse 33 | 34 | **Signature:** `static parse(map : Object) : JWSHeader` 35 | 36 | Convert the given Map or JavaScript object into a JWS header. 37 | 38 | ### parseEncoded 39 | 40 | **Signature:** `static parseEncoded(base64encoded : String) : JWSHeader` 41 | 42 | Parse the given string as a Base64URL-encoded JWS header. 43 | 44 | ### parseJSON 45 | 46 | **Signature:** `static parseJSON(json : String) : JWSHeader` 47 | 48 | Parse the given string as a JWS header. 49 | 50 | ### toMap 51 | 52 | **Signature:** `toMap() : Map` 53 | 54 | Get a copy of these headers as a Map. 55 | 56 | ### toString 57 | 58 | **Signature:** `toString() : String` 59 | 60 | Get the content of the headers as a JSON String. 61 | 62 | ## Method Detail 63 | 64 | ## Method Details 65 | 66 | ### getAlgorithm 67 | 68 | **Signature:** `getAlgorithm() : String` 69 | 70 | **Description:** Get the value of the algorithm parameter (alg). 71 | 72 | **Returns:** 73 | 74 | Algorithm parameter from this header. 75 | 76 | --- 77 | 78 | ### parse 79 | 80 | **Signature:** `static parse(map : Object) : JWSHeader` 81 | 82 | **Description:** Convert the given Map or JavaScript object into a JWS header. All keys correspond to JWS parameters. The algorithm parameter (alg) is required. See JWS.verify(CertificateRef) for supported values. 83 | 84 | **Parameters:** 85 | 86 | - `map`: Map or object data to convert. 87 | 88 | **Returns:** 89 | 90 | JWS Header. 91 | 92 | --- 93 | 94 | ### parseEncoded 95 | 96 | **Signature:** `static parseEncoded(base64encoded : String) : JWSHeader` 97 | 98 | **Description:** Parse the given string as a Base64URL-encoded JWS header. The algorithm parameter (alg) is required. See JWS.verify(CertificateRef) for supported values. 99 | 100 | **Parameters:** 101 | 102 | - `base64encoded`: Base64URL string to parse. 103 | 104 | **Returns:** 105 | 106 | JWS Header. 107 | 108 | --- 109 | 110 | ### parseJSON 111 | 112 | **Signature:** `static parseJSON(json : String) : JWSHeader` 113 | 114 | **Description:** Parse the given string as a JWS header. The algorithm parameter (alg) is required. See JWS.verify(CertificateRef) for supported values. 115 | 116 | **Parameters:** 117 | 118 | - `json`: JSON string to parse. 119 | 120 | **Returns:** 121 | 122 | JWS Header. 123 | 124 | --- 125 | 126 | ### toMap 127 | 128 | **Signature:** `toMap() : Map` 129 | 130 | **Description:** Get a copy of these headers as a Map. 131 | 132 | **Returns:** 133 | 134 | Copy of the JWS headers. 135 | 136 | --- 137 | 138 | ### toString 139 | 140 | **Signature:** `toString() : String` 141 | 142 | **Description:** Get the content of the headers as a JSON String. 143 | 144 | **Returns:** 145 | 146 | JSON String. 147 | 148 | --- ``` -------------------------------------------------------------------------------- /docs/dw_svc/ServiceCredential.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.svc 2 | 3 | # Class ServiceCredential 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.object.PersistentObject 9 | - dw.object.ExtensibleObject 10 | - dw.customer.EncryptedObject 11 | - dw.svc.ServiceCredential 12 | 13 | ## Description 14 | 15 | Configuration object for Service Credentials. 16 | 17 | ## Constants 18 | 19 | ### ENCRYPTION_ALGORITHM_RSA 20 | 21 | **Type:** String = "RSA" 22 | 23 | Constant for specification of the public key encryption algorithm RSA. 24 | 25 | ## Properties 26 | 27 | ### ID 28 | 29 | **Type:** String (Read Only) 30 | 31 | The unique Credential ID. 32 | 33 | ### password 34 | 35 | **Type:** String (Read Only) 36 | 37 | The Password in plain text. 38 | 39 | ### URL 40 | 41 | **Type:** String (Read Only) 42 | 43 | Return the URL. 44 | 45 | ### user 46 | 47 | **Type:** String (Read Only) 48 | 49 | The User ID. 50 | 51 | ## Constructor Summary 52 | 53 | ## Method Summary 54 | 55 | ### getEncryptedPassword 56 | 57 | **Signature:** `getEncryptedPassword(algorithm : String, publicKey : CertificateRef) : String` 58 | 59 | Encrypts the password from this object with the given algorithm and the public key taken from a certificate in the keystore. 60 | 61 | ### getID 62 | 63 | **Signature:** `getID() : String` 64 | 65 | Returns the unique Credential ID. 66 | 67 | ### getPassword 68 | 69 | **Signature:** `getPassword() : String` 70 | 71 | Returns the Password in plain text. 72 | 73 | ### getURL 74 | 75 | **Signature:** `getURL() : String` 76 | 77 | Return the URL. 78 | 79 | ### getUser 80 | 81 | **Signature:** `getUser() : String` 82 | 83 | Returns the User ID. 84 | 85 | ## Method Detail 86 | 87 | ## Method Details 88 | 89 | ### getEncryptedPassword 90 | 91 | **Signature:** `getEncryptedPassword(algorithm : String, publicKey : CertificateRef) : String` 92 | 93 | **Description:** Encrypts the password from this object with the given algorithm and the public key taken from a certificate in the keystore. Returned is the base64-encoded representation of the result. See also Cipher.encrypt(String, CertificateRef, String, String, Number) on how to generate RSA key pairs. 94 | 95 | **Deprecated:** 96 | 97 | Use Cipher to encrypt data as needed. 98 | 99 | **Parameters:** 100 | 101 | - `algorithm`: The algorithm to be used for the encryption of this password. Currently only "RSA" is supported. 102 | - `publicKey`: A reference to a trusted certificate entry containing the public key in the keystore. 103 | 104 | **Returns:** 105 | 106 | the base64-encoded representation of the password. 107 | 108 | --- 109 | 110 | ### getID 111 | 112 | **Signature:** `getID() : String` 113 | 114 | **Description:** Returns the unique Credential ID. 115 | 116 | **Returns:** 117 | 118 | unique Credential ID. 119 | 120 | --- 121 | 122 | ### getPassword 123 | 124 | **Signature:** `getPassword() : String` 125 | 126 | **Description:** Returns the Password in plain text. 127 | 128 | **Returns:** 129 | 130 | Password. 131 | 132 | --- 133 | 134 | ### getURL 135 | 136 | **Signature:** `getURL() : String` 137 | 138 | **Description:** Return the URL. 139 | 140 | **Returns:** 141 | 142 | URL. 143 | 144 | --- 145 | 146 | ### getUser 147 | 148 | **Signature:** `getUser() : String` 149 | 150 | **Description:** Returns the User ID. 151 | 152 | **Returns:** 153 | 154 | User ID. 155 | 156 | --- ``` -------------------------------------------------------------------------------- /tests/mcp/yaml/list-log-files.full-mode.test.mcp.yml: -------------------------------------------------------------------------------- ```yaml 1 | --- 2 | description: "Test list_log_files tool in full mode - Optimized for aegis framework testing" 3 | tests: 4 | # Core MCP protocol validation 5 | - it: "should return valid MCP response with log file metadata" 6 | request: 7 | jsonrpc: "2.0" 8 | id: "list-files-basic" 9 | method: "tools/call" 10 | params: 11 | name: "list_log_files" 12 | arguments: {} 13 | expect: 14 | response: 15 | jsonrpc: "2.0" 16 | id: "list-files-basic" 17 | result: 18 | content: 19 | match:arrayElements: 20 | match:partial: 21 | type: "text" 22 | text: "match:contains:Available log files" 23 | isError: false 24 | stderr: "toBeEmpty" 25 | performance: 26 | maxResponseTime: "2000ms" 27 | 28 | # SFCC log pattern validation (combined test for all log levels) 29 | - it: "should include all SFCC log levels with correct naming patterns" 30 | request: 31 | jsonrpc: "2.0" 32 | id: "list-files-patterns" 33 | method: "tools/call" 34 | params: 35 | name: "list_log_files" 36 | arguments: {} 37 | expect: 38 | response: 39 | jsonrpc: "2.0" 40 | id: "list-files-patterns" 41 | result: 42 | content: 43 | match:arrayElements: 44 | match:partial: 45 | text: "match:regex:(debug|error|info|warn)-blade-[\\d]{8}-[\\d]{6}\\.log" 46 | isError: false 47 | stderr: "toBeEmpty" 48 | 49 | # Comprehensive metadata validation (combined size and timestamp test) 50 | - it: "should include complete file metadata with proper formatting" 51 | request: 52 | jsonrpc: "2.0" 53 | id: "list-files-metadata" 54 | method: "tools/call" 55 | params: 56 | name: "list_log_files" 57 | arguments: {} 58 | expect: 59 | response: 60 | jsonrpc: "2.0" 61 | id: "list-files-metadata" 62 | result: 63 | content: 64 | match:arrayElements: 65 | match:partial: 66 | text: "match:regex:📄 \\/[\\w-]+\\.log[\\s\\S]*Size: [\\d.,]+ (Bytes|KB|MB)[\\s\\S]*Modified: [A-Za-z]{3}, [\\d]{1,2} [A-Za-z]{3} [\\d]{4} [\\d]{2}:[\\d]{2}:[\\d]{2} GMT" 67 | isError: false 68 | stderr: "toBeEmpty" 69 | 70 | # Parameter handling (simple edge case for aegis testing) 71 | - it: "should handle empty arguments gracefully" 72 | request: 73 | jsonrpc: "2.0" 74 | id: "list-files-empty-args" 75 | method: "tools/call" 76 | params: 77 | name: "list_log_files" 78 | arguments: {} 79 | expect: 80 | response: 81 | jsonrpc: "2.0" 82 | id: "list-files-empty-args" 83 | result: 84 | content: 85 | match:arrayElements: 86 | type: "text" 87 | text: "match:type:string" 88 | isError: false 89 | stderr: "toBeEmpty" 90 | ``` -------------------------------------------------------------------------------- /docs/dw_catalog/SearchRefinementDefinition.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.catalog 2 | 3 | # Class SearchRefinementDefinition 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.object.PersistentObject 9 | - dw.object.ExtensibleObject 10 | - dw.catalog.SearchRefinementDefinition 11 | 12 | ## Description 13 | 14 | Common search refinement definition base class. 15 | 16 | ## Properties 17 | 18 | ### attributeID 19 | 20 | **Type:** String (Read Only) 21 | 22 | The attribute ID. If the refinement definition is not an 23 | attribute refinement, the method returns an empty string. 24 | 25 | ### attributeRefinement 26 | 27 | **Type:** boolean (Read Only) 28 | 29 | Identifies if this is an attribute refinement. 30 | 31 | ### cutoffThreshold 32 | 33 | **Type:** Number (Read Only) 34 | 35 | The cut-off threshold. 36 | 37 | ### displayName 38 | 39 | **Type:** String (Read Only) 40 | 41 | The display name. 42 | 43 | ### valueTypeCode 44 | 45 | **Type:** Number (Read Only) 46 | 47 | A code for the data type used for this search refinement definition. See constants 48 | defined in ObjectAttributeDefinition. 49 | 50 | ## Constructor Summary 51 | 52 | ## Method Summary 53 | 54 | ### getAttributeID 55 | 56 | **Signature:** `getAttributeID() : String` 57 | 58 | Returns the attribute ID. 59 | 60 | ### getCutoffThreshold 61 | 62 | **Signature:** `getCutoffThreshold() : Number` 63 | 64 | Returns the cut-off threshold. 65 | 66 | ### getDisplayName 67 | 68 | **Signature:** `getDisplayName() : String` 69 | 70 | Returns the display name. 71 | 72 | ### getValueTypeCode 73 | 74 | **Signature:** `getValueTypeCode() : Number` 75 | 76 | Returns a code for the data type used for this search refinement definition. 77 | 78 | ### isAttributeRefinement 79 | 80 | **Signature:** `isAttributeRefinement() : boolean` 81 | 82 | Identifies if this is an attribute refinement. 83 | 84 | ## Method Detail 85 | 86 | ## Method Details 87 | 88 | ### getAttributeID 89 | 90 | **Signature:** `getAttributeID() : String` 91 | 92 | **Description:** Returns the attribute ID. If the refinement definition is not an attribute refinement, the method returns an empty string. 93 | 94 | **Returns:** 95 | 96 | the attribute ID. 97 | 98 | --- 99 | 100 | ### getCutoffThreshold 101 | 102 | **Signature:** `getCutoffThreshold() : Number` 103 | 104 | **Description:** Returns the cut-off threshold. 105 | 106 | **Returns:** 107 | 108 | the cut-off threshold. 109 | 110 | --- 111 | 112 | ### getDisplayName 113 | 114 | **Signature:** `getDisplayName() : String` 115 | 116 | **Description:** Returns the display name. 117 | 118 | **Returns:** 119 | 120 | the display name. 121 | 122 | --- 123 | 124 | ### getValueTypeCode 125 | 126 | **Signature:** `getValueTypeCode() : Number` 127 | 128 | **Description:** Returns a code for the data type used for this search refinement definition. See constants defined in ObjectAttributeDefinition. 129 | 130 | **Returns:** 131 | 132 | a code for the data type used for this search refinement definition. See constants defined in ObjectAttributeDefinition. 133 | 134 | --- 135 | 136 | ### isAttributeRefinement 137 | 138 | **Signature:** `isAttributeRefinement() : boolean` 139 | 140 | **Description:** Identifies if this is an attribute refinement. 141 | 142 | **Returns:** 143 | 144 | true if this is an attribute refinement, false otherwise. 145 | 146 | --- ``` -------------------------------------------------------------------------------- /docs/dw_suggest/SearchPhraseSuggestions.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.suggest 2 | 3 | # Class SearchPhraseSuggestions 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.suggest.SearchPhraseSuggestions 9 | 10 | ## Description 11 | 12 | The search phrase suggestions contain a list of suggested search phrases (see SuggestedPhrase) as well as, for each of the search phrase terms, a list with corrected and completed alternative terms. 13 | 14 | ## Properties 15 | 16 | ### suggestedPhrases 17 | 18 | **Type:** Iterator (Read Only) 19 | 20 | A list of SuggestedPhrase objects that relates to the 21 | user input search phrase. 22 | 23 | ### suggestedTerms 24 | 25 | **Type:** Iterator (Read Only) 26 | 27 | A list of SuggestedTerms objects. Each of the returned 28 | instances represents a set of terms suggested for a particular single term 29 | of the user input search phrase. 30 | 31 | ## Constructor Summary 32 | 33 | ## Method Summary 34 | 35 | ### getSuggestedPhrases 36 | 37 | **Signature:** `getSuggestedPhrases() : Iterator` 38 | 39 | Returns a list of SuggestedPhrase objects that relates to the user input search phrase. 40 | 41 | ### getSuggestedTerms 42 | 43 | **Signature:** `getSuggestedTerms() : Iterator` 44 | 45 | Returns a list of SuggestedTerms objects. 46 | 47 | ### hasSuggestedPhrases 48 | 49 | **Signature:** `hasSuggestedPhrases() : boolean` 50 | 51 | Returns whether this suggestions container has any suggested phrases. 52 | 53 | ### hasSuggestedTerms 54 | 55 | **Signature:** `hasSuggestedTerms() : boolean` 56 | 57 | Returns whether this suggestions container has any suggested terms. 58 | 59 | ## Method Detail 60 | 61 | ## Method Details 62 | 63 | ### getSuggestedPhrases 64 | 65 | **Signature:** `getSuggestedPhrases() : Iterator` 66 | 67 | **Description:** Returns a list of SuggestedPhrase objects that relates to the user input search phrase. 68 | 69 | **Returns:** 70 | 71 | a list of SuggestedPhrases 72 | 73 | **See Also:** 74 | 75 | hasSuggestedPhrases() 76 | 77 | --- 78 | 79 | ### getSuggestedTerms 80 | 81 | **Signature:** `getSuggestedTerms() : Iterator` 82 | 83 | **Description:** Returns a list of SuggestedTerms objects. Each of the returned instances represents a set of terms suggested for a particular single term of the user input search phrase. 84 | 85 | **Returns:** 86 | 87 | a list of SuggestedTerms for each term of the user input search phrase 88 | 89 | **See Also:** 90 | 91 | hasSuggestedTerms() 92 | 93 | --- 94 | 95 | ### hasSuggestedPhrases 96 | 97 | **Signature:** `hasSuggestedPhrases() : boolean` 98 | 99 | **Description:** Returns whether this suggestions container has any suggested phrases. Note that this method only looks for suggested phrases. It does not account for suggested terms. 100 | 101 | **Returns:** 102 | 103 | true only if there are phrases available 104 | 105 | --- 106 | 107 | ### hasSuggestedTerms 108 | 109 | **Signature:** `hasSuggestedTerms() : boolean` 110 | 111 | **Description:** Returns whether this suggestions container has any suggested terms. Note that this method checks suggested terms only, but not suggested phrases. 112 | 113 | **Returns:** 114 | 115 | true only if there are terms available 116 | 117 | --- ``` -------------------------------------------------------------------------------- /docs-site/index.html: -------------------------------------------------------------------------------- ```html 1 | 2 | <!DOCTYPE html> 3 | <html lang="en"> 4 | <head> 5 | <meta charset="UTF-8" /> 6 | <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" /> 7 | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 8 | 9 | <!-- Search Engine Specific --> 10 | <meta name="googlebot" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" /> 11 | 12 | <!-- Favicons --> 13 | <link rel="icon" type="image/x-icon" href="/favicon.ico" /> 14 | <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" /> 15 | <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" /> 16 | <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" /> 17 | <link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png" /> 18 | <link rel="icon" type="image/png" sizes="512x512" href="/android-chrome-512x512.png" /> 19 | 20 | <!-- Web App Manifest --> 21 | <link rel="manifest" href="/site.webmanifest" /> 22 | 23 | <!-- Import Map - Must come before module scripts --> 24 | <script type="importmap"> 25 | { 26 | "imports": { 27 | "react/": "https://aistudiocdn.com/react@^19.1.1/", 28 | "react": "https://aistudiocdn.com/react@^19.1.1", 29 | "react-dom/": "https://aistudiocdn.com/react-dom@^19.1.1/", 30 | "react-router-dom": "https://aistudiocdn.com/react-router-dom@^7.8.2" 31 | } 32 | } 33 | </script> 34 | 35 | <link rel="preload" href="/main.tsx" as="script" crossorigin /> 36 | <link rel="modulepreload" href="/main.tsx" /> 37 | 38 | <!-- Critical CSS --> 39 | <style> 40 | body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; } 41 | .loading { display: flex; justify-content: center; align-items: center; height: 100vh; } 42 | </style> 43 | 44 | <!-- Additional SEO --> 45 | <meta name="theme-color" content="#2563eb" /> 46 | <meta name="msapplication-TileColor" content="#2563eb" /> 47 | <meta name="format-detection" content="telephone=no" /> 48 | <meta name="color-scheme" content="light" /> 49 | <meta name="mobile-web-app-capable" content="yes" /> 50 | 51 | </head> 52 | <body class="bg-white"> 53 | <div id="root" role="application" aria-label="SFCC Development MCP Server Documentation"></div> 54 | <noscript> 55 | <div style="text-align: center; padding: 50px; font-family: system-ui;"> 56 | <h1>JavaScript Required</h1> 57 | <p>This documentation site requires JavaScript to function properly. Please enable JavaScript in your browser and refresh the page.</p> 58 | </div> 59 | </noscript> 60 | <script type="module" src="/main.tsx"></script> 61 | </body> 62 | </html> 63 | ``` -------------------------------------------------------------------------------- /docs/dw_extensions.pinterest/PinterestFeedHooks.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.extensions.pinterest 2 | 3 | # Class PinterestFeedHooks 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - dw.extensions.pinterest.PinterestFeedHooks 8 | 9 | ## Description 10 | 11 | PinterestFeedHooks interface containing extension points for customizing Pinterest export feeds. These hooks are not executed in a transaction. The extension points (hook names), and the functions that are called by each extension point. A function must be defined inside a JavaScript source and must be exported. The script with the exported hook function must be located inside a site cartridge. Inside the site cartridge a 'package.json' file with a 'hooks' entry must exist. "hooks": "./hooks.json" The hooks entry links to a json file, relative to the 'package.json' file. This file lists all registered hooks inside the hooks property: "hooks": [ {"name": "dw.extensions.pinterest.feed.transformProduct", "script": "./hooks.ds"} ] A hook entry has a 'name' and a 'script' property. The 'name' contains the extension point, the hook name. The 'script' contains the script relative to the hooks file, with the exported hook function. 12 | 13 | ## Constants 14 | 15 | ## Properties 16 | 17 | ## Constructor Summary 18 | 19 | ## Method Summary 20 | 21 | ### transformAvailability 22 | 23 | **Signature:** `transformAvailability(product : Product, pinterestAvailability : PinterestAvailability) : Status` 24 | 25 | Called after default transformation of given Demandware product to Pinterest availability as part of the availability feed export. 26 | 27 | ### transformProduct 28 | 29 | **Signature:** `transformProduct(product : Product, pinterestProduct : PinterestProduct) : Status` 30 | 31 | Called after default transformation of given Demandware product to Pinterest product as part of the catalog feed export. 32 | 33 | ## Method Detail 34 | 35 | ## Method Details 36 | 37 | ### transformAvailability 38 | 39 | **Signature:** `transformAvailability(product : Product, pinterestAvailability : PinterestAvailability) : Status` 40 | 41 | **Description:** Called after default transformation of given Demandware product to Pinterest availability as part of the availability feed export. 42 | 43 | **Parameters:** 44 | 45 | - `product`: the Demandware product 46 | - `pinterestAvailability`: the Pinterest representation of the product availability 47 | 48 | **Returns:** 49 | 50 | a non-null Status ends the hook execution 51 | 52 | --- 53 | 54 | ### transformProduct 55 | 56 | **Signature:** `transformProduct(product : Product, pinterestProduct : PinterestProduct) : Status` 57 | 58 | **Description:** Called after default transformation of given Demandware product to Pinterest product as part of the catalog feed export. 59 | 60 | **Parameters:** 61 | 62 | - `product`: the Demandware product 63 | - `pinterestProduct`: the Pinterest representation of the product 64 | 65 | **Returns:** 66 | 67 | a non-null Status ends the hook execution 68 | 69 | --- ``` -------------------------------------------------------------------------------- /docs/TopLevel/Uint8ClampedArray.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: TopLevel 2 | 3 | # Class Uint8ClampedArray 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - Uint8ClampedArray 9 | 10 | ## Description 11 | 12 | An optimized array to store 8-bit unsigned integer numbers. If a value outside of the range 0-255 is attempted to be set, either 0 or 255 is set instead. Elements of this array are stored in an ArrayBuffer object. 13 | 14 | ## Constants 15 | 16 | ### BYTES_PER_ELEMENT 17 | 18 | **Type:** Number = 1 19 | 20 | Number value of the element size. 21 | 22 | ## Properties 23 | 24 | ### buffer 25 | 26 | **Type:** ArrayBuffer 27 | 28 | The array buffer referenced by this typed array. 29 | 30 | ### byteLength 31 | 32 | **Type:** Number 33 | 34 | The number of bytes in the array buffer used by this typed array. 35 | 36 | ### byteOffset 37 | 38 | **Type:** Number 39 | 40 | The start offset for this typed array within the array buffer. 41 | 42 | ### length 43 | 44 | **Type:** Number 45 | 46 | The number of elements. 47 | 48 | ## Constructor Summary 49 | 50 | Uint8ClampedArray() Creates an empty array. 51 | 52 | Uint8ClampedArray(length : Number) Creates an array with the given element count. 53 | 54 | Uint8ClampedArray(typedArray : Object) Creates an array as a copy of the passed typed array. 55 | 56 | Uint8ClampedArray(array : Array) Creates an array as a copy of the passed array. 57 | 58 | Uint8ClampedArray(buffer : ArrayBuffer, byteOffset : Number, length : Number) Creates a typed array as a view on the given ArrayBuffer. 59 | 60 | ## Method Summary 61 | 62 | ### get 63 | 64 | **Signature:** `get(index : Number) : Number` 65 | 66 | Returns the value at the specified index. 67 | 68 | ### set 69 | 70 | **Signature:** `set(values : Object, offset : Number) : void` 71 | 72 | Copies all values from the source array into this typed array. 73 | 74 | ### subarray 75 | 76 | **Signature:** `subarray(begin : Number, end : Number) : Uint8ClampedArray` 77 | 78 | Returns a new array object based on the same ArrayBuffer store. 79 | 80 | ## Constructor Detail 81 | 82 | ## Method Detail 83 | 84 | ## Method Details 85 | 86 | ### get 87 | 88 | **Signature:** `get(index : Number) : Number` 89 | 90 | **Description:** Returns the value at the specified index. Note: This is not ECMAScript standard. Use array element access syntax for single value access. 91 | 92 | **Parameters:** 93 | 94 | - `index`: The index to use. 95 | 96 | **Returns:** 97 | 98 | The value at the specified index. 99 | 100 | --- 101 | 102 | ### set 103 | 104 | **Signature:** `set(values : Object, offset : Number) : void` 105 | 106 | **Description:** Copies all values from the source array into this typed array. 107 | 108 | **Parameters:** 109 | 110 | - `values`: The source values. Can be an array or a typed array. 111 | - `offset`: Optional. Target offset. 112 | 113 | --- 114 | 115 | ### subarray 116 | 117 | **Signature:** `subarray(begin : Number, end : Number) : Uint8ClampedArray` 118 | 119 | **Description:** Returns a new array object based on the same ArrayBuffer store. 120 | 121 | **Parameters:** 122 | 123 | - `begin`: Optional. The first included element. 124 | - `end`: Optional. The index of the end. This element is not included. 125 | 126 | **Returns:** 127 | 128 | The new array object. 129 | 130 | --- ``` -------------------------------------------------------------------------------- /src/clients/logs/webdav-client-manager.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * WebDAV client setup and authentication management 3 | */ 4 | 5 | import { createClient } from 'webdav'; 6 | import type { WebDAVClient } from 'webdav'; 7 | import { Logger } from '../../utils/logger.js'; 8 | import type { WebDAVClientConfig } from './log-types.js'; 9 | 10 | export class WebDAVClientManager { 11 | private logger: Logger; 12 | private client: WebDAVClient | null = null; 13 | 14 | constructor(logger: Logger) { 15 | this.logger = logger; 16 | } 17 | 18 | /** 19 | * Setup and configure WebDAV client with authentication 20 | */ 21 | setupClient(config: WebDAVClientConfig): WebDAVClient { 22 | let protocol = 'https'; 23 | 24 | if (config.hostname.startsWith('localhost') || config.hostname.startsWith('127.0.0.1')) { 25 | protocol = 'http'; 26 | } 27 | 28 | const webdavUrl = `${protocol}://${config.hostname}/on/demandware.servlet/webdav/Sites/Logs/`; 29 | this.logger.debug('Setting up WebDAV client:', { hostname: config.hostname, url: webdavUrl }); 30 | 31 | const authConfig = this.buildAuthConfig(config); 32 | 33 | // Add timeout configuration for better CI compatibility 34 | const clientConfig = { 35 | ...authConfig, 36 | timeout: 30000, // 30 second timeout (generous for CI environments) 37 | maxBodyLength: 10 * 1024 * 1024, // 10MB max body length 38 | maxContentLength: 10 * 1024 * 1024, // 10MB max content length 39 | }; 40 | 41 | this.client = createClient(webdavUrl, clientConfig); 42 | 43 | return this.client; 44 | } 45 | 46 | /** 47 | * Get the current WebDAV client instance 48 | */ 49 | getClient(): WebDAVClient { 50 | if (!this.client) { 51 | throw new Error('WebDAV client not initialized. Call setupClient() first.'); 52 | } 53 | return this.client; 54 | } 55 | 56 | /** 57 | * Build authentication configuration for WebDAV client 58 | */ 59 | private buildAuthConfig(config: WebDAVClientConfig): any { 60 | if (config.username && config.password) { 61 | this.logger.debug('Using basic authentication'); 62 | return { 63 | username: config.username, 64 | password: config.password, 65 | }; 66 | } 67 | 68 | if (config.clientId && config.clientSecret) { 69 | this.logger.debug('Using OAuth authentication (client credentials as basic auth for WebDAV)'); 70 | return { 71 | username: config.clientId, 72 | password: config.clientSecret, 73 | }; 74 | } 75 | 76 | throw new Error('Either username/password or clientId/clientSecret must be provided'); 77 | } 78 | 79 | /** 80 | * Test WebDAV connection 81 | */ 82 | async testConnection(): Promise<boolean> { 83 | try { 84 | const client = this.getClient(); 85 | await client.getDirectoryContents('/'); 86 | this.logger.debug('WebDAV connection test successful'); 87 | return true; 88 | } catch (error) { 89 | this.logger.error('WebDAV connection test failed:', error); 90 | return false; 91 | } 92 | } 93 | } 94 | ``` -------------------------------------------------------------------------------- /docs/sfra/address.md: -------------------------------------------------------------------------------- ```markdown 1 | # SFRA Address Model 2 | 3 | ## Overview 4 | 5 | The Address model represents an order address or customer address in SFRA applications. It provides a standardized way to handle address information across the application. 6 | 7 | ## Constructor 8 | 9 | ```javascript 10 | function address(addressObject) 11 | ``` 12 | 13 | Creates an Address model instance from an address object. 14 | 15 | ### Parameters 16 | 17 | - `addressObject` (dw.order.OrderAddress) - User's address object from the API 18 | 19 | ## Properties 20 | 21 | ### address 22 | **Type:** Object | null 23 | 24 | Contains the formatted address information with the following properties: 25 | 26 | - `address1` (string) - Primary address line 27 | - `address2` (string) - Secondary address line 28 | - `city` (string) - City name 29 | - `firstName` (string) - First name 30 | - `lastName` (string) - Last name 31 | - `ID` (string | null) - Address ID 32 | - `addressId` (string | null) - Address identifier (same as ID) 33 | - `phone` (string) - Phone number 34 | - `postalCode` (string) - Postal/ZIP code 35 | - `stateCode` (string) - State or province code 36 | - `jobTitle` (string) - Job title 37 | - `postBox` (string) - Post office box 38 | - `salutation` (string) - Salutation (Mr., Mrs., etc.) 39 | - `secondName` (string) - Second/middle name 40 | - `companyName` (string) - Company name 41 | - `suffix` (string) - Name suffix 42 | - `suite` (string) - Suite number 43 | - `title` (string) - Title 44 | - `countryCode` (Object) - Country code object with: 45 | - `displayValue` (string) - Display name of country 46 | - `value` (string) - Country code in uppercase 47 | 48 | ## Helper Functions 49 | 50 | ### createAddressObject(addressObject) 51 | Creates a plain object containing standardized address information. 52 | 53 | **Parameters:** 54 | - `addressObject` (dw.order.OrderAddress) - Address object from the API 55 | 56 | **Returns:** Object | null - Formatted address object or null if no address provided 57 | 58 | ## Usage Example 59 | 60 | ```javascript 61 | var AddressModel = require('*/cartridge/models/address'); 62 | 63 | // Create address model from API address object 64 | var customerAddress = customer.addressBook.preferredAddress; 65 | var addressModel = new AddressModel(customerAddress); 66 | 67 | // Access address properties 68 | console.log(addressModel.address.firstName); 69 | console.log(addressModel.address.city); 70 | console.log(addressModel.address.countryCode.value); 71 | ``` 72 | 73 | ## Notes 74 | 75 | - If `stateCode` is 'undefined', it will be converted to an empty string 76 | - Country codes are automatically converted to uppercase 77 | - The model handles both customer addresses and order addresses 78 | - All address fields are optional and may be null or empty strings 79 | 80 | ## Related Models 81 | 82 | - **Account Model** - Uses Address model for customer addresses 83 | - **Checkout Models** - Use Address model for billing and shipping addresses 84 | - **Order Models** - Use Address model for order address information 85 | ``` -------------------------------------------------------------------------------- /tests/servers/sfcc-mock-server/mock-data/ocapi/system-object-attribute-groups-sitepreferences.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "_v": "23.2", 3 | "_type": "object_attribute_group_search_result", 4 | "count": 8, 5 | "hits": [ 6 | { 7 | "_type": "object_attribute_group", 8 | "_resource_state": "250db50d76a5e4bf869062a6ed5aab18d77aed015a880e4f0f5b8e86cc8e071d", 9 | "id": "CCV", 10 | "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/CCV" 11 | }, 12 | { 13 | "_type": "object_attribute_group", 14 | "_resource_state": "34dce900d8eb50d95d97fcc0fd74449e78720a0da5a6804e561f347d8fdb5227", 15 | "id": "SFRA Unified Feature Cartridge", 16 | "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/SFRA%20Unified%20Feature%20Cartridge" 17 | }, 18 | { 19 | "_type": "object_attribute_group", 20 | "_resource_state": "0d4f2e59140361592a0e6998fdd68bacc4f06e4fb77cb25fef07142f8289fb0e", 21 | "id": "Storefront Configs", 22 | "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/Storefront%20Configs" 23 | }, 24 | { 25 | "_type": "object_attribute_group", 26 | "_resource_state": "07d4d8544eb98d9036cfd6343d55206374c44f0438c1beb22a88f0ad6cc1089c", 27 | "id": "fastforward", 28 | "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/fastforward" 29 | }, 30 | { 31 | "_type": "object_attribute_group", 32 | "_resource_state": "bbcd6304068fcf391c849bb37952598bebed1bd55bafbe211e2a6539b4b522a9", 33 | "id": "fastforward_cquotient", 34 | "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/fastforward_cquotient" 35 | }, 36 | { 37 | "_type": "object_attribute_group", 38 | "_resource_state": "efb6bd1843b9484576c8ffaf9447bc7d0bdee5bb6b0e9231d54804dbff5a11fa", 39 | "id": "ffGPT", 40 | "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/ffGPT" 41 | }, 42 | { 43 | "_type": "object_attribute_group", 44 | "_resource_state": "ed156d5f2de1fbbea7fa8350da7b2424feb7e54ac4e338d50fd6fec992df2c6f", 45 | "id": "google", 46 | "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/google" 47 | }, 48 | { 49 | "_type": "object_attribute_group", 50 | "_resource_state": "ec6e9f8a42c38f4a6b003b1e93b879c62bc6cd2ee639ef482509c55a3d579959", 51 | "id": "managedruntime", 52 | "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/managedruntime" 53 | } 54 | ], 55 | "query": { 56 | "match_all_query": { 57 | "_type": "match_all_query" 58 | } 59 | }, 60 | "start": 0, 61 | "total": 8 62 | } 63 | ``` -------------------------------------------------------------------------------- /src/services/path-service.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Path Service Interface and Implementation 3 | * 4 | * Provides an abstraction layer over Node.js path operations 5 | * to enable easier testing and better dependency injection. 6 | */ 7 | 8 | import * as path from 'path'; 9 | 10 | /** 11 | * Interface for path operations 12 | */ 13 | export interface IPathService { 14 | /** 15 | * Join path segments 16 | */ 17 | join(...paths: string[]): string; 18 | 19 | /** 20 | * Resolve path segments to an absolute path 21 | */ 22 | resolve(...paths: string[]): string; 23 | 24 | /** 25 | * Get the directory name of a path 26 | */ 27 | dirname(path: string): string; 28 | 29 | /** 30 | * Get the base name of a path 31 | */ 32 | basename(path: string, ext?: string): string; 33 | 34 | /** 35 | * Get the extension of a path 36 | */ 37 | extname(path: string): string; 38 | 39 | /** 40 | * Normalize a path 41 | */ 42 | normalize(path: string): string; 43 | 44 | /** 45 | * Check if path is absolute 46 | */ 47 | isAbsolute(path: string): boolean; 48 | } 49 | 50 | /** 51 | * Production implementation of path service 52 | */ 53 | export class PathService implements IPathService { 54 | join(...paths: string[]): string { 55 | return path.join(...paths); 56 | } 57 | 58 | resolve(...paths: string[]): string { 59 | return path.resolve(...paths); 60 | } 61 | 62 | dirname(filePath: string): string { 63 | return path.dirname(filePath); 64 | } 65 | 66 | basename(filePath: string, ext?: string): string { 67 | return path.basename(filePath, ext); 68 | } 69 | 70 | extname(filePath: string): string { 71 | return path.extname(filePath); 72 | } 73 | 74 | normalize(filePath: string): string { 75 | return path.normalize(filePath); 76 | } 77 | 78 | isAbsolute(filePath: string): boolean { 79 | return path.isAbsolute(filePath); 80 | } 81 | } 82 | 83 | /** 84 | * Mock implementation for testing 85 | */ 86 | export class MockPathService implements IPathService { 87 | // For testing, we can use the real path operations or provide custom behavior 88 | join(...paths: string[]): string { 89 | return paths.join('/'); 90 | } 91 | 92 | resolve(...paths: string[]): string { 93 | const joined = this.join(...paths); 94 | return joined.startsWith('/') ? joined : `/mock/root/${joined}`; 95 | } 96 | 97 | dirname(filePath: string): string { 98 | const parts = filePath.split('/'); 99 | return parts.slice(0, -1).join('/') || '/'; 100 | } 101 | 102 | basename(filePath: string, ext?: string): string { 103 | const parts = filePath.split('/'); 104 | const base = parts[parts.length - 1]; 105 | if (ext && base.endsWith(ext)) { 106 | return base.slice(0, -ext.length); 107 | } 108 | return base; 109 | } 110 | 111 | extname(filePath: string): string { 112 | const base = this.basename(filePath); 113 | const dotIndex = base.lastIndexOf('.'); 114 | return dotIndex >= 0 ? base.slice(dotIndex) : ''; 115 | } 116 | 117 | normalize(filePath: string): string { 118 | return filePath.replace(/\/+/g, '/'); 119 | } 120 | 121 | isAbsolute(filePath: string): boolean { 122 | return filePath.startsWith('/'); 123 | } 124 | } 125 | ``` -------------------------------------------------------------------------------- /docs/TopLevel/RegExp.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: TopLevel 2 | 3 | # Class RegExp 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - RegExp 9 | 10 | ## Description 11 | 12 | The RegExp object is a static object that generates instances of a regular expression for pattern matching and monitors all regular expressions in the current window or frame. Consult ECMA standards for the format of the pattern strings supported by these regular expressions. 13 | 14 | ## Properties 15 | 16 | ### global 17 | 18 | **Type:** boolean 19 | 20 | If the regular expression instance has the g modifier, then 21 | this property is set to true. 22 | 23 | ### ignoreCase 24 | 25 | **Type:** boolean 26 | 27 | If the regular expression instance has the i modifier, then 28 | this property is set to true. 29 | 30 | ### lastIndex 31 | 32 | **Type:** Number 33 | 34 | This is the zero-based index value of the character within the 35 | String where the next search for the pattern begins. In a new 36 | search, the value is zero. 37 | 38 | ### multiline 39 | 40 | **Type:** boolean 41 | 42 | If a search extends across multiple lines of test, the multiline 43 | property is set to true. 44 | 45 | ### source 46 | 47 | **Type:** String 48 | 49 | A String version of the characters used to create the regular 50 | expression. The value does not include the forward slash delimiters that 51 | surround the expression. 52 | 53 | ## Constructor Summary 54 | 55 | RegExp(pattern : String) Constructs the regular expression using the specified pattern. 56 | 57 | RegExp(pattern : String, attributes : String) Constructs the regular expression using the specified pattern and attributes. 58 | 59 | ## Method Summary 60 | 61 | ### exec 62 | 63 | **Signature:** `exec(string : String) : Array` 64 | 65 | Performs a search through the specified parameter for the current regular expression and returns an array of match information if successful. 66 | 67 | ### test 68 | 69 | **Signature:** `test(string : String) : boolean` 70 | 71 | Returns true if there is a match of the regular expression anywhere in the specified parameter. 72 | 73 | ## Constructor Detail 74 | 75 | ## Method Detail 76 | 77 | ## Method Details 78 | 79 | ### exec 80 | 81 | **Signature:** `exec(string : String) : Array` 82 | 83 | **Description:** Performs a search through the specified parameter for the current regular expression and returns an array of match information if successful. Returns null if the search produces no results. 84 | 85 | **Parameters:** 86 | 87 | - `string`: the String to apply the regular expression. 88 | 89 | **Returns:** 90 | 91 | an array of match information if successful, null otherwise. 92 | 93 | --- 94 | 95 | ### test 96 | 97 | **Signature:** `test(string : String) : boolean` 98 | 99 | **Description:** Returns true if there is a match of the regular expression anywhere in the specified parameter. No additional information is available about the results of the search. 100 | 101 | **Parameters:** 102 | 103 | - `string`: the String to apply the regular expression. 104 | 105 | **Returns:** 106 | 107 | true if there is a match of the regular expression anywhere in the specified parameter, false otherwise. 108 | 109 | --- ``` -------------------------------------------------------------------------------- /docs-site/App.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import React from 'react'; 2 | import type { RouteRecord } from 'vite-react-ssg'; 3 | import { Navigate } from 'react-router-dom'; 4 | import Layout from './components/Layout'; 5 | import HomePage from './pages/HomePage'; 6 | import ConfigurationPage from './pages/ConfigurationPage'; 7 | import AIInterfacesPage from './pages/AIInterfacesPage'; 8 | import FeaturesPage from './pages/FeaturesPage'; 9 | import ToolsPage from './pages/ToolsPage'; 10 | import ExamplesPage from './pages/ExamplesPage'; 11 | import SecurityPage from './pages/SecurityPage'; 12 | import DevelopmentPage from './pages/DevelopmentPage'; 13 | import TroubleshootingPage from './pages/TroubleshootingPage'; 14 | 15 | export const routes: RouteRecord[] = [ 16 | { 17 | path: '/', 18 | element: <Layout />, 19 | children: [ 20 | { 21 | index: true, 22 | element: <HomePage />, 23 | }, 24 | // Routes with trailing slashes 25 | { 26 | path: 'configuration/', 27 | element: <ConfigurationPage />, 28 | }, 29 | { 30 | path: 'ai-interfaces/', 31 | element: <AIInterfacesPage />, 32 | }, 33 | { 34 | path: 'features/', 35 | element: <FeaturesPage />, 36 | }, 37 | { 38 | path: 'tools/', 39 | element: <ToolsPage />, 40 | }, 41 | { 42 | path: 'examples/', 43 | element: <ExamplesPage />, 44 | }, 45 | { 46 | path: 'security/', 47 | element: <SecurityPage />, 48 | }, 49 | { 50 | path: 'development/', 51 | element: <DevelopmentPage />, 52 | }, 53 | { 54 | path: 'troubleshooting/', 55 | element: <TroubleshootingPage />, 56 | }, 57 | // Redirects from non-trailing slash URLs to trailing slash URLs 58 | { 59 | path: 'configuration', 60 | element: <Navigate to="/configuration/" replace />, 61 | }, 62 | { 63 | path: 'ai-interfaces', 64 | element: <Navigate to="/ai-interfaces/" replace />, 65 | }, 66 | { 67 | path: 'features', 68 | element: <Navigate to="/features/" replace />, 69 | }, 70 | { 71 | path: 'tools', 72 | element: <Navigate to="/tools/" replace />, 73 | }, 74 | { 75 | path: 'examples', 76 | element: <Navigate to="/examples/" replace />, 77 | }, 78 | { 79 | path: 'security', 80 | element: <Navigate to="/security/" replace />, 81 | }, 82 | { 83 | path: 'development', 84 | element: <Navigate to="/development/" replace />, 85 | }, 86 | { 87 | path: 'troubleshooting', 88 | element: <Navigate to="/troubleshooting/" replace />, 89 | }, 90 | // Redirect old installation path to AI interfaces 91 | { 92 | path: 'installation', 93 | element: <Navigate to="/ai-interfaces/" replace />, 94 | }, 95 | { 96 | path: 'installation/', 97 | element: <Navigate to="/ai-interfaces/" replace />, 98 | }, 99 | ], 100 | }, 101 | ]; 102 | 103 | export default routes; ``` -------------------------------------------------------------------------------- /docs/dw_web/PageMetaTag.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.web 2 | 3 | # Class PageMetaTag 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.web.PageMetaTag 9 | 10 | ## Description 11 | 12 | Page meta tags are used in HTML documents to provide structured data about a web page. They are usually part of the head section. Common tags are for example robots, description or social tags like open graph (e.g. 'og:title'). Page meta tags can be obtained within: home page context Site detail page context Product Content listing page context ProductSearchModel ContentSearchModel and can be set at PageMetaData container object, which is always available in the pipeline dictionary and is used as transfer object to fill the head area with meaningful page meta tag elements. 13 | 14 | ## Properties 15 | 16 | ### content 17 | 18 | **Type:** String (Read Only) 19 | 20 | The page meta tag content. 21 | 22 | ### ID 23 | 24 | **Type:** String (Read Only) 25 | 26 | The page meta tag ID. 27 | 28 | ### name 29 | 30 | **Type:** boolean (Read Only) 31 | 32 | Returns true if the page meta tag type is name, false otherwise. 33 | 34 | ### property 35 | 36 | **Type:** boolean (Read Only) 37 | 38 | Returns true if the page meta tag type is property, false otherwise. 39 | 40 | ### title 41 | 42 | **Type:** boolean (Read Only) 43 | 44 | Returns true if the page meta tag type is title, false otherwise. 45 | 46 | ## Constructor Summary 47 | 48 | ## Method Summary 49 | 50 | ### getContent 51 | 52 | **Signature:** `getContent() : String` 53 | 54 | Returns the page meta tag content. 55 | 56 | ### getID 57 | 58 | **Signature:** `getID() : String` 59 | 60 | Returns the page meta tag ID. 61 | 62 | ### isName 63 | 64 | **Signature:** `isName() : boolean` 65 | 66 | Returns true if the page meta tag type is name, false otherwise. 67 | 68 | ### isProperty 69 | 70 | **Signature:** `isProperty() : boolean` 71 | 72 | Returns true if the page meta tag type is property, false otherwise. 73 | 74 | ### isTitle 75 | 76 | **Signature:** `isTitle() : boolean` 77 | 78 | Returns true if the page meta tag type is title, false otherwise. 79 | 80 | ## Method Detail 81 | 82 | ## Method Details 83 | 84 | ### getContent 85 | 86 | **Signature:** `getContent() : String` 87 | 88 | **Description:** Returns the page meta tag content. 89 | 90 | **Returns:** 91 | 92 | page meta tag content 93 | 94 | --- 95 | 96 | ### getID 97 | 98 | **Signature:** `getID() : String` 99 | 100 | **Description:** Returns the page meta tag ID. 101 | 102 | **Returns:** 103 | 104 | page meta tag ID 105 | 106 | --- 107 | 108 | ### isName 109 | 110 | **Signature:** `isName() : boolean` 111 | 112 | **Description:** Returns true if the page meta tag type is name, false otherwise. 113 | 114 | **Returns:** 115 | 116 | true if the page meta tag type is name, false otherwise 117 | 118 | --- 119 | 120 | ### isProperty 121 | 122 | **Signature:** `isProperty() : boolean` 123 | 124 | **Description:** Returns true if the page meta tag type is property, false otherwise. 125 | 126 | **Returns:** 127 | 128 | true if the page meta tag type is property, false otherwise 129 | 130 | --- 131 | 132 | ### isTitle 133 | 134 | **Signature:** `isTitle() : boolean` 135 | 136 | **Description:** Returns true if the page meta tag type is title, false otherwise. 137 | 138 | **Returns:** 139 | 140 | true if the page meta tag type is title, false otherwise 141 | 142 | --- ``` -------------------------------------------------------------------------------- /docs/dw_catalog/ProductInventoryMgr.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.catalog 2 | 3 | # Class ProductInventoryMgr 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.catalog.ProductInventoryMgr 9 | 10 | ## Description 11 | 12 | This manager provides access to inventory-related objects. 13 | 14 | ## Constants 15 | 16 | ### INTEGRATIONMODE_B2C 17 | 18 | **Type:** String = "B2C" 19 | 20 | Integration mode 'B2C' - using B2C inventory, no integration with Omnichannel Inventory 21 | 22 | ### INTEGRATIONMODE_OCI 23 | 24 | **Type:** String = "OCI" 25 | 26 | Integration mode 'OCI' - integration with Omnichannel Inventory enabled 27 | 28 | ### INTEGRATIONMODE_OCI_CACHE 29 | 30 | **Type:** String = "OCI_CACHE" 31 | 32 | Integration mode 'OCI_CACHE' - using B2C inventory, initializing cache as preparation for integration with Omnichannel Inventory 33 | 34 | ## Properties 35 | 36 | ### inventoryIntegrationMode 37 | 38 | **Type:** String (Read Only) 39 | 40 | The current inventory integration mode as one of 41 | 42 | INTEGRATIONMODE_B2C 43 | INTEGRATIONMODE_OCI_CACHE 44 | INTEGRATIONMODE_OCI 45 | 46 | ### inventoryList 47 | 48 | **Type:** ProductInventoryList (Read Only) 49 | 50 | The inventory list assigned to the current site or null if no inventory list is assigned to the current 51 | site. 52 | 53 | ## Constructor Summary 54 | 55 | ## Method Summary 56 | 57 | ### getInventoryIntegrationMode 58 | 59 | **Signature:** `static getInventoryIntegrationMode() : String` 60 | 61 | Returns the current inventory integration mode as one of INTEGRATIONMODE_B2C INTEGRATIONMODE_OCI_CACHE INTEGRATIONMODE_OCI 62 | 63 | ### getInventoryList 64 | 65 | **Signature:** `static getInventoryList() : ProductInventoryList` 66 | 67 | Returns the inventory list assigned to the current site or null if no inventory list is assigned to the current site. 68 | 69 | ### getInventoryList 70 | 71 | **Signature:** `static getInventoryList(listID : String) : ProductInventoryList` 72 | 73 | Returns the inventory list with the passed ID or null if no inventory list exists with that ID. 74 | 75 | ## Method Detail 76 | 77 | ## Method Details 78 | 79 | ### getInventoryIntegrationMode 80 | 81 | **Signature:** `static getInventoryIntegrationMode() : String` 82 | 83 | **Description:** Returns the current inventory integration mode as one of INTEGRATIONMODE_B2C INTEGRATIONMODE_OCI_CACHE INTEGRATIONMODE_OCI 84 | 85 | **Returns:** 86 | 87 | The current inventory integration mode as a constant String. 88 | 89 | --- 90 | 91 | ### getInventoryList 92 | 93 | **Signature:** `static getInventoryList() : ProductInventoryList` 94 | 95 | **Description:** Returns the inventory list assigned to the current site or null if no inventory list is assigned to the current site. 96 | 97 | **Returns:** 98 | 99 | The ProductInventoryList assigned to the current site, or null. 100 | 101 | --- 102 | 103 | ### getInventoryList 104 | 105 | **Signature:** `static getInventoryList(listID : String) : ProductInventoryList` 106 | 107 | **Description:** Returns the inventory list with the passed ID or null if no inventory list exists with that ID. 108 | 109 | **Parameters:** 110 | 111 | - `listID`: The ID of the inventory list to retrieve. 112 | 113 | **Returns:** 114 | 115 | The ProductInventoryList identified by listID, or null. 116 | 117 | --- ``` -------------------------------------------------------------------------------- /docs/dw_job/JobExecution.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.job 2 | 3 | # Class JobExecution 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.job.JobExecution 9 | 10 | ## Description 11 | 12 | Represents an execution of a job. The job execution can be accessed from a JobStepExecution via JobStepExecution.getJobExecution(). If a pipeline is used to implement a step the step execution is available in the pipeline dictionary under the key 'JobStepExecution'. If a script module is used to implement a step the step execution is available as the second parameter of the module's function that is used to execute the step, e.g.: 13 | 14 | ```javascript 15 | ... 16 | exports.execute( parameters, stepExecution) 17 | { 18 | ... 19 | var jobExecution = stepExecution.getJobExecution(); 20 | ... 21 | } 22 | ... 23 | ``` 24 | 25 | ## Properties 26 | 27 | ### context 28 | 29 | **Type:** Map (Read Only) 30 | 31 | The job context which can be used to share data between steps. NOTE: Steps should be self-contained, the job context should only be used when necessary and with caution. If two steps which are running in parallel in the same job store data in the job context using the same key the result is undefined. Don't add any complex data to the job context since only simple data types are supported (for example, String and Integer). 32 | 33 | ### ID 34 | 35 | **Type:** String (Read Only) 36 | 37 | The ID of this job execution. 38 | 39 | ### jobID 40 | 41 | **Type:** String (Read Only) 42 | 43 | The ID of the job this job execution belongs to. 44 | 45 | ## Constructor Summary 46 | 47 | This class does not have a constructor, so you cannot create it directly. 48 | 49 | ## Method Summary 50 | 51 | ### getContext 52 | 53 | **Signature:** `getContext() : Map` 54 | 55 | Returns the job context which can be used to share data between steps. 56 | 57 | ### getID 58 | 59 | **Signature:** `getID() : String` 60 | 61 | Returns the ID of this job execution. 62 | 63 | ### getJobID 64 | 65 | **Signature:** `getJobID() : String` 66 | 67 | Returns the ID of the job this job execution belongs to. 68 | 69 | ## Method Detail 70 | 71 | ## Method Details 72 | 73 | ### getContext 74 | 75 | **Signature:** `getContext() : Map` 76 | 77 | **Description:** Returns the job context which can be used to share data between steps. NOTE: Steps should be self-contained, the job context should only be used when necessary and with caution. If two steps which are running in parallel in the same job store data in the job context using the same key the result is undefined. Don't add any complex data to the job context since only simple data types are supported (for example, String and Integer). 78 | 79 | **Returns:** 80 | 81 | the map that represents the job context. 82 | 83 | --- 84 | 85 | ### getID 86 | 87 | **Signature:** `getID() : String` 88 | 89 | **Description:** Returns the ID of this job execution. 90 | 91 | **Returns:** 92 | 93 | the ID of this job execution. 94 | 95 | --- 96 | 97 | ### getJobID 98 | 99 | **Signature:** `getJobID() : String` 100 | 101 | **Description:** Returns the ID of the job this job execution belongs to. 102 | 103 | **Returns:** 104 | 105 | the ID of the job this job execution belongs to. 106 | 107 | --- 108 | ``` -------------------------------------------------------------------------------- /src/services/file-system-service.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * File System Service Interface and Implementation 3 | * 4 | * Provides an abstraction layer over Node.js file system operations 5 | * to enable easier testing and better dependency injection. 6 | */ 7 | 8 | import * as fs from 'fs/promises'; 9 | 10 | /** 11 | * Interface for file system operations 12 | */ 13 | export interface IFileSystemService { 14 | /** 15 | * Check if a file or directory exists 16 | */ 17 | exists(path: string): Promise<boolean>; 18 | 19 | /** 20 | * Create a directory recursively 21 | */ 22 | mkdir(path: string, options?: { recursive?: boolean }): Promise<void>; 23 | 24 | /** 25 | * Write content to a file 26 | */ 27 | writeFile(path: string, content: string): Promise<void>; 28 | 29 | /** 30 | * Read content from a file 31 | */ 32 | readFile(path: string): Promise<string>; 33 | 34 | /** 35 | * Check access to a file or directory 36 | */ 37 | access(path: string): Promise<void>; 38 | } 39 | 40 | /** 41 | * Production implementation of file system service 42 | */ 43 | export class FileSystemService implements IFileSystemService { 44 | async exists(path: string): Promise<boolean> { 45 | try { 46 | await fs.access(path); 47 | return true; 48 | } catch { 49 | return false; 50 | } 51 | } 52 | 53 | async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> { 54 | await fs.mkdir(path, options); 55 | } 56 | 57 | async writeFile(path: string, content: string): Promise<void> { 58 | await fs.writeFile(path, content); 59 | } 60 | 61 | async readFile(path: string): Promise<string> { 62 | return await fs.readFile(path, 'utf-8'); 63 | } 64 | 65 | async access(path: string): Promise<void> { 66 | await fs.access(path); 67 | } 68 | } 69 | 70 | /** 71 | * Mock implementation for testing 72 | */ 73 | export class MockFileSystemService implements IFileSystemService { 74 | private mockFiles: Map<string, string> = new Map(); 75 | private mockDirectories: Set<string> = new Set(); 76 | 77 | // Mock methods for testing setup 78 | setMockFile(path: string, content: string): void { 79 | this.mockFiles.set(path, content); 80 | } 81 | 82 | setMockDirectory(path: string): void { 83 | this.mockDirectories.add(path); 84 | } 85 | 86 | clearMocks(): void { 87 | this.mockFiles.clear(); 88 | this.mockDirectories.clear(); 89 | } 90 | 91 | // Service implementation 92 | async exists(path: string): Promise<boolean> { 93 | return this.mockFiles.has(path) || this.mockDirectories.has(path); 94 | } 95 | 96 | async mkdir(path: string, _options?: { recursive?: boolean }): Promise<void> { 97 | this.mockDirectories.add(path); 98 | } 99 | 100 | async writeFile(path: string, content: string): Promise<void> { 101 | this.mockFiles.set(path, content); 102 | } 103 | 104 | async readFile(path: string): Promise<string> { 105 | const content = this.mockFiles.get(path); 106 | if (content === undefined) { 107 | throw new Error(`File not found: ${path}`); 108 | } 109 | return content; 110 | } 111 | 112 | async access(path: string): Promise<void> { 113 | if (!(await this.exists(path))) { 114 | throw new Error(`Path not accessible: ${path}`); 115 | } 116 | } 117 | } 118 | ``` -------------------------------------------------------------------------------- /docs/dw_rpc/WebReference.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.rpc 2 | 3 | # Class WebReference 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.rpc.WebReference 9 | 10 | ## Description 11 | 12 | Represents a web service defined in a WSDL file. The implementation is backed by a JAX-RPC framework. You should use the newer dw.ws package and WebReference2 class instead, which is based on JAX-WS. Use the Services module in Business Manager to set timeout values, not the methods for this class. The Services module provides better analytics and timeout management. To create an instance of a WebReference object, in a B2C Commerce Script file, reference a WSDL file in the webreferences directory and request the service Stub using one of the get service methods. For example, if your WSDL file is MyWSDL.wsdl, to create an instance of WebReference and access the Stub: var webref : WebReference = webreferences.MyWSDL; var stub : Stub = webref.getDefaultService(); Note: script classes representing your WSDL file are are generated by the platform and then placed in the WebReferences package. You do not need to include the importPackage statement in your B2C Commerce Script file to use classes in the WebReferences package. 13 | 14 | ## Properties 15 | 16 | ### defaultService 17 | 18 | **Type:** Stub (Read Only) 19 | 20 | The default service of the WebReference object. If you have more than one service 21 | defined in your WSDL, the default service is the first service alphabetically. If the service 22 | has multiple ports defined, the default service uses the SOAP port name that is first alphabetically. 23 | 24 | ## Constructor Summary 25 | 26 | WebReference() 27 | 28 | ## Method Summary 29 | 30 | ### getDefaultService 31 | 32 | **Signature:** `getDefaultService() : Stub` 33 | 34 | Returns the default service of the WebReference object. 35 | 36 | ### getService 37 | 38 | **Signature:** `getService(service : String, port : String) : Stub` 39 | 40 | Returns a specific service from this WebReference. 41 | 42 | ## Constructor Detail 43 | 44 | ## Method Detail 45 | 46 | ## Method Details 47 | 48 | ### getDefaultService 49 | 50 | **Signature:** `getDefaultService() : Stub` 51 | 52 | **Description:** Returns the default service of the WebReference object. If you have more than one service defined in your WSDL, the default service is the first service alphabetically. If the service has multiple ports defined, the default service uses the SOAP port name that is first alphabetically. 53 | 54 | **Deprecated:** 55 | 56 | use webreferences2 instead 57 | 58 | **Returns:** 59 | 60 | the default service of the WebReference object. 61 | 62 | --- 63 | 64 | ### getService 65 | 66 | **Signature:** `getService(service : String, port : String) : Stub` 67 | 68 | **Description:** Returns a specific service from this WebReference. 69 | 70 | **Deprecated:** 71 | 72 | use webreferences2 instead 73 | 74 | **Parameters:** 75 | 76 | - `service`: the service to locate. 77 | - `port`: the port name to use. var port = webref.getService("SampleServiceName","SamplePortName"); 78 | 79 | **Returns:** 80 | 81 | a specific service from this WebReference. 82 | 83 | --- ``` -------------------------------------------------------------------------------- /docs/dw_web/FormList.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.web 2 | 3 | # Class FormList 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.web.FormElement 9 | - dw.web.FormGroup 10 | - dw.web.FormList 11 | 12 | ## Description 13 | 14 | Represents a list of forms. 15 | 16 | ## Properties 17 | 18 | ### selectManyItems 19 | 20 | **Type:** List (Read Only) 21 | 22 | The selected list items if the list is 23 | configured to support selection of items. 24 | 25 | ### selectManyObjects 26 | 27 | **Type:** List (Read Only) 28 | 29 | A list of all selected objects if the list is configured 30 | to support the selection of items. The objects are the objects that were 31 | bound to each row. 32 | 33 | ### selectOneItem 34 | 35 | **Type:** FormListItem (Read Only) 36 | 37 | The default list item if the list is configured to 38 | support the selection of a default item. 39 | 40 | ### selectOneObject 41 | 42 | **Type:** Object (Read Only) 43 | 44 | The selected object if the list is configured to 45 | support the selection of a default item. The object is the object 46 | bound to the item. 47 | 48 | ## Constructor Summary 49 | 50 | ## Method Summary 51 | 52 | ### getSelectManyItems 53 | 54 | **Signature:** `getSelectManyItems() : List` 55 | 56 | returns the selected list items if the list is configured to support selection of items. 57 | 58 | ### getSelectManyObjects 59 | 60 | **Signature:** `getSelectManyObjects() : List` 61 | 62 | Returns a list of all selected objects if the list is configured to support the selection of items. 63 | 64 | ### getSelectOneItem 65 | 66 | **Signature:** `getSelectOneItem() : FormListItem` 67 | 68 | Returns the default list item if the list is configured to support the selection of a default item. 69 | 70 | ### getSelectOneObject 71 | 72 | **Signature:** `getSelectOneObject() : Object` 73 | 74 | Returns the selected object if the list is configured to support the selection of a default item. 75 | 76 | ## Method Detail 77 | 78 | ## Method Details 79 | 80 | ### getSelectManyItems 81 | 82 | **Signature:** `getSelectManyItems() : List` 83 | 84 | **Description:** returns the selected list items if the list is configured to support selection of items. 85 | 86 | **Returns:** 87 | 88 | a List of FormListItem elements or null if no selection was configured for the form. 89 | 90 | --- 91 | 92 | ### getSelectManyObjects 93 | 94 | **Signature:** `getSelectManyObjects() : List` 95 | 96 | **Description:** Returns a list of all selected objects if the list is configured to support the selection of items. The objects are the objects that were bound to each row. 97 | 98 | **Returns:** 99 | 100 | a List of objects or null if no selection was configured for the form. 101 | 102 | --- 103 | 104 | ### getSelectOneItem 105 | 106 | **Signature:** `getSelectOneItem() : FormListItem` 107 | 108 | **Description:** Returns the default list item if the list is configured to support the selection of a default item. 109 | 110 | **Returns:** 111 | 112 | the default FormListItem elements or null if no selection was configured 113 | 114 | --- 115 | 116 | ### getSelectOneObject 117 | 118 | **Signature:** `getSelectOneObject() : Object` 119 | 120 | **Description:** Returns the selected object if the list is configured to support the selection of a default item. The object is the object bound to the item. 121 | 122 | **Returns:** 123 | 124 | the selected object. 125 | 126 | --- ``` -------------------------------------------------------------------------------- /docs/dw_extensions.paymentrequest/PaymentRequestHookResult.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.extensions.paymentrequest 2 | 3 | # Class PaymentRequestHookResult 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.extensions.paymentrequest.PaymentRequestHookResult 9 | 10 | ## Description 11 | 12 | Result of a hook handling a Payment Request request 13 | 14 | ## Properties 15 | 16 | ### eventDetail 17 | 18 | **Type:** Object (Read Only) 19 | 20 | Detail to the JS custom event to dispatch in response to this result. 21 | 22 | ### eventName 23 | 24 | **Type:** String (Read Only) 25 | 26 | Name of the JS custom event to dispatch in response to this result. 27 | 28 | ### redirect 29 | 30 | **Type:** URL (Read Only) 31 | 32 | URL to navigate to in response to this result. 33 | 34 | ### status 35 | 36 | **Type:** Status (Read Only) 37 | 38 | Status describing the outcome of this result. 39 | 40 | ## Constructor Summary 41 | 42 | PaymentRequestHookResult(status : Status, redirect : URL) Constructs a result with the given outcome information. 43 | 44 | ## Method Summary 45 | 46 | ### getEventDetail 47 | 48 | **Signature:** `getEventDetail() : Object` 49 | 50 | Detail to the JS custom event to dispatch in response to this result. 51 | 52 | ### getEventName 53 | 54 | **Signature:** `getEventName() : String` 55 | 56 | Name of the JS custom event to dispatch in response to this result. 57 | 58 | ### getRedirect 59 | 60 | **Signature:** `getRedirect() : URL` 61 | 62 | URL to navigate to in response to this result. 63 | 64 | ### getStatus 65 | 66 | **Signature:** `getStatus() : Status` 67 | 68 | Status describing the outcome of this result. 69 | 70 | ### setEvent 71 | 72 | **Signature:** `setEvent(name : String) : void` 73 | 74 | Sets the name of the JS custom event to dispatch in response to this result. 75 | 76 | ### setEvent 77 | 78 | **Signature:** `setEvent(name : String, detail : Object) : void` 79 | 80 | Sets the name and detail of the JS custom event to dispatch in response to this result. 81 | 82 | ## Constructor Detail 83 | 84 | ## Method Detail 85 | 86 | ## Method Details 87 | 88 | ### getEventDetail 89 | 90 | **Signature:** `getEventDetail() : Object` 91 | 92 | **Description:** Detail to the JS custom event to dispatch in response to this result. 93 | 94 | **Returns:** 95 | 96 | event detail 97 | 98 | --- 99 | 100 | ### getEventName 101 | 102 | **Signature:** `getEventName() : String` 103 | 104 | **Description:** Name of the JS custom event to dispatch in response to this result. 105 | 106 | **Returns:** 107 | 108 | event name 109 | 110 | --- 111 | 112 | ### getRedirect 113 | 114 | **Signature:** `getRedirect() : URL` 115 | 116 | **Description:** URL to navigate to in response to this result. 117 | 118 | **Returns:** 119 | 120 | redirect URL 121 | 122 | --- 123 | 124 | ### getStatus 125 | 126 | **Signature:** `getStatus() : Status` 127 | 128 | **Description:** Status describing the outcome of this result. 129 | 130 | **Returns:** 131 | 132 | status of this result 133 | 134 | --- 135 | 136 | ### setEvent 137 | 138 | **Signature:** `setEvent(name : String) : void` 139 | 140 | **Description:** Sets the name of the JS custom event to dispatch in response to this result. 141 | 142 | **Parameters:** 143 | 144 | - `name`: JS custom event name 145 | 146 | --- 147 | 148 | ### setEvent 149 | 150 | **Signature:** `setEvent(name : String, detail : Object) : void` 151 | 152 | **Description:** Sets the name and detail of the JS custom event to dispatch in response to this result. 153 | 154 | **Parameters:** 155 | 156 | - `name`: JS custom event name 157 | - `detail`: JS custom event detail 158 | 159 | --- ``` -------------------------------------------------------------------------------- /docs/dw_net/WebDAVFileInfo.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.net 2 | 3 | # Class WebDAVFileInfo 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.net.WebDAVFileInfo 9 | 10 | ## Description 11 | 12 | Simple class representing a file on a remote WebDAV location. The class possesses only read-only attributes of the file and does not permit any manipulation of the file itself. Instances of this class are returned by WebDAVClient.propfind(String) which is used to get a listing of files in a WebDAV directory. Note: when this class is used with sensitive data, be careful in persisting sensitive information to disk. 13 | 14 | ## Properties 15 | 16 | ### contentType 17 | 18 | **Type:** String (Read Only) 19 | 20 | The content type of the file. 21 | 22 | ### creationDate 23 | 24 | **Type:** Date (Read Only) 25 | 26 | The creationDate of the file. 27 | 28 | ### directory 29 | 30 | **Type:** boolean (Read Only) 31 | 32 | Identifies if the file is a directory. 33 | 34 | ### name 35 | 36 | **Type:** String (Read Only) 37 | 38 | The name of the file. 39 | 40 | ### path 41 | 42 | **Type:** String (Read Only) 43 | 44 | The path of the file. 45 | 46 | ### size 47 | 48 | **Type:** Number (Read Only) 49 | 50 | The size of the file. 51 | 52 | ## Constructor Summary 53 | 54 | ## Method Summary 55 | 56 | ### getContentType 57 | 58 | **Signature:** `getContentType() : String` 59 | 60 | Returns the content type of the file. 61 | 62 | ### getCreationDate 63 | 64 | **Signature:** `getCreationDate() : Date` 65 | 66 | Returns the creationDate of the file. 67 | 68 | ### getName 69 | 70 | **Signature:** `getName() : String` 71 | 72 | Returns the name of the file. 73 | 74 | ### getPath 75 | 76 | **Signature:** `getPath() : String` 77 | 78 | Returns the path of the file. 79 | 80 | ### getSize 81 | 82 | **Signature:** `getSize() : Number` 83 | 84 | Returns the size of the file. 85 | 86 | ### isDirectory 87 | 88 | **Signature:** `isDirectory() : boolean` 89 | 90 | Identifies if the file is a directory. 91 | 92 | ### lastModified 93 | 94 | **Signature:** `lastModified() : Date` 95 | 96 | Returns the lastModified date of the file. 97 | 98 | ## Method Detail 99 | 100 | ## Method Details 101 | 102 | ### getContentType 103 | 104 | **Signature:** `getContentType() : String` 105 | 106 | **Description:** Returns the content type of the file. 107 | 108 | **Returns:** 109 | 110 | the content type of the file. 111 | 112 | --- 113 | 114 | ### getCreationDate 115 | 116 | **Signature:** `getCreationDate() : Date` 117 | 118 | **Description:** Returns the creationDate of the file. 119 | 120 | **Returns:** 121 | 122 | the creationDate of the file. 123 | 124 | --- 125 | 126 | ### getName 127 | 128 | **Signature:** `getName() : String` 129 | 130 | **Description:** Returns the name of the file. 131 | 132 | **Returns:** 133 | 134 | the name of the file. 135 | 136 | --- 137 | 138 | ### getPath 139 | 140 | **Signature:** `getPath() : String` 141 | 142 | **Description:** Returns the path of the file. 143 | 144 | **Returns:** 145 | 146 | the path of the file. 147 | 148 | --- 149 | 150 | ### getSize 151 | 152 | **Signature:** `getSize() : Number` 153 | 154 | **Description:** Returns the size of the file. 155 | 156 | **Returns:** 157 | 158 | the size of the file. 159 | 160 | --- 161 | 162 | ### isDirectory 163 | 164 | **Signature:** `isDirectory() : boolean` 165 | 166 | **Description:** Identifies if the file is a directory. 167 | 168 | **Returns:** 169 | 170 | true if the file is a directory, false otherwise. 171 | 172 | --- 173 | 174 | ### lastModified 175 | 176 | **Signature:** `lastModified() : Date` 177 | 178 | **Description:** Returns the lastModified date of the file. 179 | 180 | **Returns:** 181 | 182 | the lastModified date of the file. 183 | 184 | --- ``` -------------------------------------------------------------------------------- /docs/dw_order/SumItem.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.order 2 | 3 | # Class SumItem 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.order.SumItem 9 | 10 | ## Description 11 | 12 | Container used to represent an subtotal or grandtotal item which contains various prices and a tax breakdown held in a collection of tax-items. Usage example: var invoice : Invoice = ...; var productNet = invoice.productSubTotal.netPrice; var serviceNet = invoice.serviceSubTotal.netPrice; var grandNet = invoice.grandTotal.netPrice; var grandTax = invoice.grandTotal.tax; var grandGross = invoice.grandTotal.grossPrice; # tax breakdown for each(taxItem : TaxItem in invoice.grandTotal.taxItems) { var tax : Money = taxItem.amount; var taxGroup : TaxGroup = taxItem.taxGroup; var rate : Double = taxGroup.rate; var caption :String = taxGroup.caption; var taxType :String = taxGroup.taxType; } 13 | 14 | ## Properties 15 | 16 | ### grossPrice 17 | 18 | **Type:** Money (Read Only) 19 | 20 | Gross price of SumItem. 21 | 22 | ### netPrice 23 | 24 | **Type:** Money (Read Only) 25 | 26 | Net price of SumItem. 27 | 28 | ### tax 29 | 30 | **Type:** Money (Read Only) 31 | 32 | Total tax for SumItem. 33 | 34 | ### taxBasis 35 | 36 | **Type:** Money (Read Only) 37 | 38 | Price of entire SumItem on which tax calculation is based. Same as getNetPrice() 39 | or getGrossPrice() depending on whether the order is based on net or gross prices. 40 | 41 | ### taxItems 42 | 43 | **Type:** Collection (Read Only) 44 | 45 | Tax items representing a tax breakdown for the SumItem. 46 | 47 | ## Constructor Summary 48 | 49 | ## Method Summary 50 | 51 | ### getGrossPrice 52 | 53 | **Signature:** `getGrossPrice() : Money` 54 | 55 | Gross price of SumItem. 56 | 57 | ### getNetPrice 58 | 59 | **Signature:** `getNetPrice() : Money` 60 | 61 | Net price of SumItem. 62 | 63 | ### getTax 64 | 65 | **Signature:** `getTax() : Money` 66 | 67 | Total tax for SumItem. 68 | 69 | ### getTaxBasis 70 | 71 | **Signature:** `getTaxBasis() : Money` 72 | 73 | Price of entire SumItem on which tax calculation is based. 74 | 75 | ### getTaxItems 76 | 77 | **Signature:** `getTaxItems() : Collection` 78 | 79 | Tax items representing a tax breakdown for the SumItem. 80 | 81 | ## Method Detail 82 | 83 | ## Method Details 84 | 85 | ### getGrossPrice 86 | 87 | **Signature:** `getGrossPrice() : Money` 88 | 89 | **Description:** Gross price of SumItem. 90 | 91 | **Returns:** 92 | 93 | Gross price of SumItem. 94 | 95 | --- 96 | 97 | ### getNetPrice 98 | 99 | **Signature:** `getNetPrice() : Money` 100 | 101 | **Description:** Net price of SumItem. 102 | 103 | **Returns:** 104 | 105 | Net price of SumItem. 106 | 107 | --- 108 | 109 | ### getTax 110 | 111 | **Signature:** `getTax() : Money` 112 | 113 | **Description:** Total tax for SumItem. 114 | 115 | **Returns:** 116 | 117 | Total tax for SumItem. 118 | 119 | --- 120 | 121 | ### getTaxBasis 122 | 123 | **Signature:** `getTaxBasis() : Money` 124 | 125 | **Description:** Price of entire SumItem on which tax calculation is based. Same as getNetPrice() or getGrossPrice() depending on whether the order is based on net or gross prices. 126 | 127 | **Returns:** 128 | 129 | Price of entire item on which tax calculation is based 130 | 131 | --- 132 | 133 | ### getTaxItems 134 | 135 | **Signature:** `getTaxItems() : Collection` 136 | 137 | **Description:** Tax items representing a tax breakdown for the SumItem. 138 | 139 | **Returns:** 140 | 141 | tax items representing a tax breakdown for the SumItem 142 | 143 | **See Also:** 144 | 145 | TaxItem 146 | 147 | --- ``` -------------------------------------------------------------------------------- /src/utils/log-tool-constants.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Shared constants for log tool handlers 3 | * Centralizes defaults, types, and configuration 4 | */ 5 | 6 | // Log levels enum for type safety 7 | export enum LogLevel { 8 | ERROR = 'error', 9 | WARN = 'warn', 10 | INFO = 'info', 11 | DEBUG = 'debug', 12 | ALL = 'all' 13 | } 14 | 15 | // Default limits for different tool types 16 | export const DEFAULT_LIMITS = { 17 | latest: 10, 18 | search: 20, 19 | jobEntries: 50, 20 | jobSearch: 20, 21 | jobFiles: 10, 22 | } as const; 23 | 24 | // Tool name sets for O(1) lookup 25 | export const LOG_TOOL_NAMES_SET = new Set([ 26 | 'get_latest_error', 27 | 'get_latest_warn', 28 | 'get_latest_info', 29 | 'get_latest_debug', 30 | 'summarize_logs', 31 | 'search_logs', 32 | 'list_log_files', 33 | 'get_log_file_contents', 34 | ] as const); 35 | 36 | export const JOB_LOG_TOOL_NAMES_SET = new Set([ 37 | 'get_latest_job_log_files', 38 | 'search_job_logs_by_name', 39 | 'get_job_log_entries', 40 | 'search_job_logs', 41 | 'get_job_execution_summary', 42 | ] as const); 43 | 44 | // Type definitions 45 | export type LogToolName = 'get_latest_error' | 'get_latest_warn' | 'get_latest_info' | 'get_latest_debug' | 46 | 'summarize_logs' | 'search_logs' | 'list_log_files' | 'get_log_file_contents'; 47 | 48 | export type JobLogToolName = 'get_latest_job_log_files' | 'search_job_logs_by_name' | 'get_job_log_entries' | 49 | 'search_job_logs' | 'get_job_execution_summary'; 50 | 51 | // Typed argument interfaces for each tool 52 | export type LogToolArgs = 53 | | { tool: 'get_latest_error' | 'get_latest_warn' | 'get_latest_info' | 'get_latest_debug'; limit?: number; date?: string } 54 | | { tool: 'summarize_logs'; date?: string } 55 | | { tool: 'search_logs'; pattern: string; logLevel?: LogLevel; limit?: number; date?: string } 56 | | { tool: 'list_log_files' } 57 | | { tool: 'get_log_file_contents'; filename: string; maxBytes?: number; tailOnly?: boolean }; 58 | 59 | export type JobLogToolArgs = 60 | | { tool: 'get_latest_job_log_files'; limit?: number } 61 | | { tool: 'search_job_logs_by_name'; jobName: string; limit?: number } 62 | | { tool: 'get_job_log_entries'; level?: LogLevel; limit?: number; jobName?: string } 63 | | { tool: 'search_job_logs'; pattern: string; level?: LogLevel; limit?: number; jobName?: string } 64 | | { tool: 'get_job_execution_summary'; jobName: string }; 65 | 66 | // Helper functions 67 | export function getLimit(providedLimit: number | undefined, toolType: keyof typeof DEFAULT_LIMITS): number { 68 | return providedLimit ?? DEFAULT_LIMITS[toolType]; 69 | } 70 | 71 | export function isValidLogLevel(level: string): level is LogLevel { 72 | return Object.values(LogLevel).includes(level as LogLevel); 73 | } 74 | 75 | export function deriveLogLevel(toolName: string, argsLevel?: string): LogLevel { 76 | if (argsLevel && isValidLogLevel(argsLevel)) { 77 | return argsLevel as LogLevel; 78 | } 79 | 80 | // Extract level from tool name for get_latest_* tools 81 | const match = toolName.match(/get_latest_(\w+)/); 82 | if (match && isValidLogLevel(match[1])) { 83 | return match[1] as LogLevel; 84 | } 85 | 86 | return LogLevel.ALL; 87 | } 88 | ``` -------------------------------------------------------------------------------- /docs/TopLevel/BigInt.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: TopLevel 2 | 3 | # Class BigInt 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - BigInt 9 | 10 | ## Description 11 | 12 | A BigInt object is a wrapper for a primitive bigint value. bigint values can be numbers too large to be stored as number values. A bigint literal in code is an integer number with an appended n. Example: var hugeNumber = 1245678901234567890n; var hugeNumberObject = BigInt( hugeNumber ); 13 | 14 | ## Constructor Summary 15 | 16 | BigInt() Constructs a BigInt with value 0. 17 | 18 | BigInt(value : BigInt) Constructs a new BigInt using the specified BigInt. 19 | 20 | BigInt(value : String) Constructs a BigInt using the specified value. 21 | 22 | ## Method Summary 23 | 24 | ### asIntN 25 | 26 | **Signature:** `static asIntN(bits : Number, value : BigInt) : BigInt` 27 | 28 | Clamps the given BigInt value to a signed integer with a given precision. 29 | 30 | ### asUintN 31 | 32 | **Signature:** `static asUintN(bits : Number, value : BigInt) : BigInt` 33 | 34 | Clamps the given BigInt value to an unsigned integer with a given precision. 35 | 36 | ### toLocaleString 37 | 38 | **Signature:** `toLocaleString() : String` 39 | 40 | Converts this BigInt to a String using local number formatting conventions. 41 | 42 | ### toString 43 | 44 | **Signature:** `toString() : String` 45 | 46 | A String representation of this BigInt. 47 | 48 | ### toString 49 | 50 | **Signature:** `toString(radix : Number) : String` 51 | 52 | Converts the BigInt into a string using the specified radix (base). 53 | 54 | ## Constructor Detail 55 | 56 | ## Method Detail 57 | 58 | ## Method Details 59 | 60 | ### asIntN 61 | 62 | **Signature:** `static asIntN(bits : Number, value : BigInt) : BigInt` 63 | 64 | **Description:** Clamps the given BigInt value to a signed integer with a given precision. 65 | 66 | **Parameters:** 67 | 68 | - `bits`: Number of bits required for resulting integer. 69 | - `value`: The value to be clamped to the given number of bits. 70 | 71 | **Returns:** 72 | 73 | The value modulo 2bits, as a signed integer. 74 | 75 | --- 76 | 77 | ### asUintN 78 | 79 | **Signature:** `static asUintN(bits : Number, value : BigInt) : BigInt` 80 | 81 | **Description:** Clamps the given BigInt value to an unsigned integer with a given precision. 82 | 83 | **Parameters:** 84 | 85 | - `bits`: Number of bits required for resulting integer. 86 | - `value`: The value to be clamped to the given number of bits. 87 | 88 | **Returns:** 89 | 90 | The value modulo 2bits, as an unsigned integer. 91 | 92 | --- 93 | 94 | ### toLocaleString 95 | 96 | **Signature:** `toLocaleString() : String` 97 | 98 | **Description:** Converts this BigInt to a String using local number formatting conventions. The current implementation actually only returns the same as toString(). 99 | 100 | **Returns:** 101 | 102 | a String using local number formatting conventions. 103 | 104 | --- 105 | 106 | ### toString 107 | 108 | **Signature:** `toString() : String` 109 | 110 | **Description:** A String representation of this BigInt. 111 | 112 | **Returns:** 113 | 114 | a String representation of this BigInt. 115 | 116 | --- 117 | 118 | ### toString 119 | 120 | **Signature:** `toString(radix : Number) : String` 121 | 122 | **Description:** Converts the BigInt into a string using the specified radix (base). 123 | 124 | **Parameters:** 125 | 126 | - `radix`: the radix to use. 127 | 128 | **Returns:** 129 | 130 | a String representation of this BigInt. 131 | 132 | --- ``` -------------------------------------------------------------------------------- /docs/TopLevel/Module.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: TopLevel 2 | 3 | # Class Module 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - Module 9 | 10 | ## Description 11 | 12 | CommonJS modules are JavaScript files that are loaded using the require(String) function. This function returns a module object, which wraps the script code from the file. Within a module implementation, the module object can be accessed via the module variable. A module has a unique absolute id. The same module may be resolved by require(String) for different path arguments, like relative paths (starting with "./" or "../"), or absolute paths. See the documentation of require for more details about the lookup procedure. Every module object has an exports property which can be used by the module implementation to expose its public functions or properties. Only functions and properties that are explicitly exported are accessible from other modules, all others are private and not visible. For convenience, the global exports variable is by default also initialized with the module.exports property of the current module. In the most simple case, module elements can be exposed by adding them to the exports object, like: // Greeting.js exports.sayHello = function() { return 'Hello World!'; }; This is equivalent to: // Greeting.js module.exports.sayHello = function() { return 'Hello World!'; }; With the above implementation, a caller (for example another module in the same directory) could call the module function like this: var message = require('./Greeting').sayHello(); It is also possible to replace the whole module exports object with a completely different value, for example with a function: // Greeting.js module.exports = function sayHello() { return 'Hi!'; } Now the result of require would be a function, which can be invoked directly like: var message = require('./Greeting')(); This construction can be used for exporting constructor functions, so that a module becomes something like a class: // Greeting.js function Greeting() { this.message = 'Hi!'; } Greeting.prototype.getMessage = function() { return this.message; } module.exports = Greeting; which would be used like: var Greeting = require('./Greeting'); var m = new Greeting().getMessage(); 13 | 14 | ## Properties 15 | 16 | ### cartridge 17 | 18 | **Type:** String 19 | 20 | The name of the cartridge which contains the module. 21 | 22 | ### exports 23 | 24 | **Type:** Object 25 | 26 | The exports of the module. 27 | 28 | ### id 29 | 30 | **Type:** String 31 | 32 | The absolute, normalized id of the module, which uniquely identifies it. A call to the 33 | global.require(String) function with this id would resolve this module. 34 | 35 | ### superModule 36 | 37 | **Type:** Module 38 | 39 | The module (if exists) that is overridden by this module. The super module would have the same path as the 40 | current module but its code location would be checked later in the lookup sequence. This property is useful to 41 | reuse functionality implemented in overridden modules. 42 | 43 | ## Constructor Summary 44 | 45 | ## Method Summary ``` -------------------------------------------------------------------------------- /docs/sfra/billing.md: -------------------------------------------------------------------------------- ```markdown 1 | # SFRA Billing Model 2 | 3 | ## Overview 4 | 5 | The Billing model represents billing information for the current basket or order in SFRA applications. It provides a simple structure for managing billing address, payment information, and address associations. 6 | 7 | ## Constructor 8 | 9 | ```javascript 10 | function billing(addressModel, paymentModel, associatedAddressId) 11 | ``` 12 | 13 | Creates a Billing model instance with billing address, payment, and address association information. 14 | 15 | ### Parameters 16 | 17 | - `addressModel` (Object) - The billing address of the current basket 18 | - `paymentModel` (Object) - Payment information for the current basket 19 | - `associatedAddressId` (string) - The matching ID of the shipping or customer address 20 | 21 | ## Properties 22 | 23 | ### billingAddress 24 | **Type:** Object 25 | 26 | The billing address model containing complete address information including: 27 | - Address lines, city, state, postal code 28 | - Customer name and contact information 29 | - Country code and other address details 30 | 31 | ### payment 32 | **Type:** Object 33 | 34 | Payment model containing payment method information such as: 35 | - Credit card details (masked) 36 | - Payment processor information 37 | - Payment method type 38 | - Payment instrument details 39 | 40 | ### matchingAddressId 41 | **Type:** string 42 | 43 | The ID that matches this billing address to either: 44 | - A shipping address (if billing and shipping are the same) 45 | - A saved customer address 46 | - null if it's a new address 47 | 48 | ## Usage Example 49 | 50 | ```javascript 51 | var BillingModel = require('*/cartridge/models/billing'); 52 | var AddressModel = require('*/cartridge/models/address'); 53 | var PaymentModel = require('*/cartridge/models/payment'); 54 | 55 | // Create address and payment models 56 | var billingAddress = new AddressModel(basket.billingAddress); 57 | var paymentInfo = new PaymentModel(basket, customer); 58 | var matchingId = getMatchingAddressId(basket.billingAddress); 59 | 60 | // Create billing model 61 | var billing = new BillingModel(billingAddress, paymentInfo, matchingId); 62 | 63 | // Access billing properties 64 | console.log(billing.billingAddress.firstName); 65 | console.log(billing.payment.selectedPaymentInstruments); 66 | console.log(billing.matchingAddressId); 67 | ``` 68 | 69 | ## Address Matching 70 | 71 | The `matchingAddressId` property helps determine: 72 | - If the billing address matches a shipping address 73 | - If the billing address matches a saved customer address 74 | - Whether to show "same as shipping" options in the UI 75 | - Address management and selection logic 76 | 77 | ## Notes 78 | 79 | - Simple container model that aggregates billing-related information 80 | - Used extensively in checkout and order processing 81 | - Address matching enables UI optimizations like "same as shipping" 82 | - Works with both new and saved addresses 83 | - Integrates with payment processing workflows 84 | 85 | ## Related Models 86 | 87 | - **AddressModel** - Used for billing address formatting 88 | - **PaymentModel** - Used for payment information 89 | - **OrderModel** - Uses billing model for order information 90 | - **Cart Model** - May include billing information during checkout 91 | ``` -------------------------------------------------------------------------------- /src/clients/docs/referenced-types-extractor.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Referenced Types Extractor 3 | * 4 | * Responsible for extracting referenced types from SFCC class documentation 5 | * content. Analyzes property types, method signatures, return types, and 6 | * parameter types to identify related classes. 7 | * 8 | * Single Responsibility: Type reference extraction from documentation content 9 | */ 10 | 11 | export class ReferencedTypesExtractor { 12 | /** 13 | * Parse markdown content and extract referenced types from a class 14 | */ 15 | static extractReferencedTypes(content: string): string[] { 16 | const referencedTypes = new Set<string>(); 17 | const lines = content.split('\n'); 18 | 19 | for (const line of lines) { 20 | // Extract types from property definitions 21 | const propTypeMatch = line.match(/\*\*Type:\*\*\s*([A-Za-z][A-Za-z0-9.]*)/); 22 | if (propTypeMatch) { 23 | const type = propTypeMatch[1]; 24 | // Only include SFCC types (those that start with uppercase or contain dots) 25 | if (this.isSFCCType(type)) { 26 | referencedTypes.add(type); 27 | } 28 | } 29 | 30 | // Extract return types from method signatures 31 | const methodReturnMatch = line.match(/:\s*([A-Za-z][A-Za-z0-9.]*)\s*$/); 32 | if (methodReturnMatch) { 33 | const type = methodReturnMatch[1]; 34 | if (this.isSFCCType(type)) { 35 | referencedTypes.add(type); 36 | } 37 | } 38 | 39 | // Extract parameter types from method signatures 40 | const paramMatches = line.match(/\(\s*([^)]+)\s*\)/); 41 | if (paramMatches) { 42 | const params = paramMatches[1]; 43 | const typeMatches = params.match(/:\s*([A-Za-z][A-Za-z0-9.]*)/g); 44 | if (typeMatches) { 45 | typeMatches.forEach(match => { 46 | const type = match.replace(/:\s*/, ''); 47 | if (this.isSFCCType(type)) { 48 | referencedTypes.add(type); 49 | } 50 | }); 51 | } 52 | } 53 | } 54 | 55 | return Array.from(referencedTypes); 56 | } 57 | 58 | /** 59 | * Check if a type name represents an SFCC type 60 | * SFCC types typically start with uppercase or contain dots 61 | */ 62 | private static isSFCCType(type: string): boolean { 63 | return /^[A-Z]/.test(type) || type.includes('.'); 64 | } 65 | 66 | /** 67 | * Filter out circular references and self-references 68 | */ 69 | static filterCircularReferences( 70 | referencedTypes: string[], 71 | currentClassName: string, 72 | ): string[] { 73 | return referencedTypes.filter(typeName => { 74 | // Skip if it's the same class to avoid circular references 75 | if (typeName === currentClassName || typeName.endsWith(`.${currentClassName}`)) { 76 | return false; 77 | } 78 | return true; 79 | }); 80 | } 81 | 82 | /** 83 | * Extract and filter referenced types with circular reference protection 84 | */ 85 | static extractFilteredReferencedTypes( 86 | content: string, 87 | currentClassName: string, 88 | ): string[] { 89 | const referencedTypes = this.extractReferencedTypes(content); 90 | return this.filterCircularReferences(referencedTypes, currentClassName); 91 | } 92 | } 93 | ``` -------------------------------------------------------------------------------- /docs/dw_svc/ServiceProfile.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.svc 2 | 3 | # Class ServiceProfile 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.object.PersistentObject 9 | - dw.object.ExtensibleObject 10 | - dw.svc.ServiceProfile 11 | 12 | ## Description 13 | 14 | Configuration object for Service Profiles. 15 | 16 | ## Properties 17 | 18 | ### cbCalls 19 | 20 | **Type:** Number (Read Only) 21 | 22 | The maximum number of errors in an interval allowed by the circuit breaker. 23 | 24 | ### cbMillis 25 | 26 | **Type:** Number (Read Only) 27 | 28 | The interval of the circuit breaker in milliseconds. 29 | 30 | ### ID 31 | 32 | **Type:** String (Read Only) 33 | 34 | The unique Service ID. 35 | 36 | ### rateLimitCalls 37 | 38 | **Type:** Number (Read Only) 39 | 40 | The maximum number of calls in an interval allowed by the rate limiter. 41 | 42 | ### rateLimitMillis 43 | 44 | **Type:** Number (Read Only) 45 | 46 | The interval of the rate limiter in milliseconds. 47 | 48 | ### timeoutMillis 49 | 50 | **Type:** Number (Read Only) 51 | 52 | The service call timeout in milliseconds. 53 | 54 | ## Constructor Summary 55 | 56 | ## Method Summary 57 | 58 | ### getCbCalls 59 | 60 | **Signature:** `getCbCalls() : Number` 61 | 62 | Returns the maximum number of errors in an interval allowed by the circuit breaker. 63 | 64 | ### getCbMillis 65 | 66 | **Signature:** `getCbMillis() : Number` 67 | 68 | Returns the interval of the circuit breaker in milliseconds. 69 | 70 | ### getID 71 | 72 | **Signature:** `getID() : String` 73 | 74 | Returns the unique Service ID. 75 | 76 | ### getRateLimitCalls 77 | 78 | **Signature:** `getRateLimitCalls() : Number` 79 | 80 | Returns the maximum number of calls in an interval allowed by the rate limiter. 81 | 82 | ### getRateLimitMillis 83 | 84 | **Signature:** `getRateLimitMillis() : Number` 85 | 86 | Returns the interval of the rate limiter in milliseconds. 87 | 88 | ### getTimeoutMillis 89 | 90 | **Signature:** `getTimeoutMillis() : Number` 91 | 92 | Returns the service call timeout in milliseconds. 93 | 94 | ## Method Detail 95 | 96 | ## Method Details 97 | 98 | ### getCbCalls 99 | 100 | **Signature:** `getCbCalls() : Number` 101 | 102 | **Description:** Returns the maximum number of errors in an interval allowed by the circuit breaker. 103 | 104 | **Returns:** 105 | 106 | Maximum number of errors in an interval allowed by the circuit breaker. 107 | 108 | --- 109 | 110 | ### getCbMillis 111 | 112 | **Signature:** `getCbMillis() : Number` 113 | 114 | **Description:** Returns the interval of the circuit breaker in milliseconds. 115 | 116 | **Returns:** 117 | 118 | Circuit breaker interval in milliseconds. 119 | 120 | --- 121 | 122 | ### getID 123 | 124 | **Signature:** `getID() : String` 125 | 126 | **Description:** Returns the unique Service ID. 127 | 128 | **Returns:** 129 | 130 | unique Service ID 131 | 132 | --- 133 | 134 | ### getRateLimitCalls 135 | 136 | **Signature:** `getRateLimitCalls() : Number` 137 | 138 | **Description:** Returns the maximum number of calls in an interval allowed by the rate limiter. 139 | 140 | **Returns:** 141 | 142 | Maximum number of calls in an interval allowed by the rate limiter. 143 | 144 | --- 145 | 146 | ### getRateLimitMillis 147 | 148 | **Signature:** `getRateLimitMillis() : Number` 149 | 150 | **Description:** Returns the interval of the rate limiter in milliseconds. 151 | 152 | **Returns:** 153 | 154 | Interval of the rate limiter in milliseconds. 155 | 156 | --- 157 | 158 | ### getTimeoutMillis 159 | 160 | **Signature:** `getTimeoutMillis() : Number` 161 | 162 | **Description:** Returns the service call timeout in milliseconds. 163 | 164 | **Returns:** 165 | 166 | Service call timeout in milliseconds. 167 | 168 | --- ``` -------------------------------------------------------------------------------- /docs/dw_system/Pipeline.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.system 2 | 3 | # Class Pipeline 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.system.Pipeline 9 | 10 | ## Description 11 | 12 | A helper for executing pipelines from JavaScript. The main purpose for this API is to invoke process pipelines from JavaScript controllers, e.g. pipelines that return with an end node and that do not perform user interactions. Pipelines that span across multiple requests (e.g. that contain Interaction-Continue-Nodes) are not supported and may not work as expected. The pipeline will be executed within the current request and not by a remote call, so this API works roughly like a Call node in a pipeline. The called pipeline will get its own local pipeline dictionary. The dictionary can be populated with initial values from an argument object. Any results from the pipeline can be read from the pipeline dictionary that is returned by the execute(String) methods. If an exception occurs during the pipeline processing, the Error-branch of the pipeline will be called. If no error handling exists for the pipeline, the exception will be propagated and can be handled by the script code. If the pipeline finishes with an End node, the name of the end node can be obtained from the returned pipeline dictionary under the key 'EndNodeName'. Example: let Pipeline = require('dw/system/Pipeline'); let pdict = Pipeline.execute('MyPipeline-Start', { MyArgString: 'someStringValue', MyArgNumber: 12345, MyArgBoolean: true }); let result = pdict.MyReturnValue; This feature requires an API version >=15.5. 13 | 14 | ## Constructor Summary 15 | 16 | ## Method Summary 17 | 18 | ### execute 19 | 20 | **Signature:** `static execute(pipeline : String) : PipelineDictionary` 21 | 22 | Executes a pipeline. 23 | 24 | ### execute 25 | 26 | **Signature:** `static execute(pipeline : String, args : Object) : PipelineDictionary` 27 | 28 | Executes a pipeline. 29 | 30 | ## Method Detail 31 | 32 | ## Method Details 33 | 34 | ### execute 35 | 36 | **Signature:** `static execute(pipeline : String) : PipelineDictionary` 37 | 38 | **Description:** Executes a pipeline. 39 | 40 | **API Versioned:** 41 | 42 | From version 15.5. New convenience method for easier migration of pipeline-based systems to JavaScript controllers. 43 | 44 | **Parameters:** 45 | 46 | - `pipeline`: the pipeline identifier, must consist of the pipeline name and the start node name, like 'PipelineName-StartNodeName' 47 | 48 | **Returns:** 49 | 50 | the pipeline dictionary with the pipeline results 51 | 52 | --- 53 | 54 | ### execute 55 | 56 | **Signature:** `static execute(pipeline : String, args : Object) : PipelineDictionary` 57 | 58 | **Description:** Executes a pipeline. The pipeline dictionary will be initialized with the provided arguments. 59 | 60 | **API Versioned:** 61 | 62 | From version 15.5. New convenience method for easier migration of pipeline-based systems to JavaScript controllers. 63 | 64 | **Parameters:** 65 | 66 | - `pipeline`: the pipeline identifier, must consist of a pipeline name and a start node name, like 'PipelineName-StartNodeName' 67 | - `args`: an object whose properties represent the initial values of the pipeline dictionary 68 | 69 | **Returns:** 70 | 71 | the pipeline dictionary with the pipeline results 72 | 73 | --- ``` -------------------------------------------------------------------------------- /docs/dw_order/PaymentProcessor.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.order 2 | 3 | # Class PaymentProcessor 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.object.PersistentObject 9 | - dw.object.ExtensibleObject 10 | - dw.order.PaymentProcessor 11 | 12 | ## Description 13 | 14 | A PaymentProcessor represents an entity that processes payments of one or more types. In the B2C Commerce system, a payment processor is just a container for configuration values, which describe, for example, the parameters (URL, merchant ID, password, etc) required for connecting to a payment gateway. The system has several built in PaymentProcessors. These are: BASIC_CREDIT BASIC_GIFT_CERTIFICATE CYBERSOURCE_CREDIT CYBERSOURCE_BML PAYPAL_CREDIT PAYPAL_EXPRESS VERISIGN_CREDIT The first two of these are merely placeholders with no associated preference values. The remaining system payment processors define preference values which are maintained in the Business Manager and are used in conjunction with built-in B2C Commerce payment integrations. Preferences of system PaymentProcessors are not intended to be read programmatically. Merchants may also define custom payment processors. This is done by defining a payment processor with an arbitrary ID in the Business Manager, and then configuring an attribute group with the same ID on the SitePreferences system object. Attributes added to the group will be considered preferences of the payment processor and will be readable through getPreferenceValue(String). Merchants can design their checkout process to read these preferences at run time for connecting to their payment gateways. Every PaymentMethod in the system is associated with at most one PaymentProcessor. This basically represents the physical payment gateway which processes the (logical) payment method. Each payment processor may be associated with an arbitrary number of payment methods. Also, each payment transaction has one PaymentProcessor which is set by custom code during the checkout process. 15 | 16 | ## Properties 17 | 18 | ### ID 19 | 20 | **Type:** String (Read Only) 21 | 22 | The 'ID' of this processor. 23 | 24 | ## Constructor Summary 25 | 26 | ## Method Summary 27 | 28 | ### getID 29 | 30 | **Signature:** `getID() : String` 31 | 32 | Returns the 'ID' of this processor. 33 | 34 | ### getPreferenceValue 35 | 36 | **Signature:** `getPreferenceValue(name : String) : Object` 37 | 38 | Returns the value of the specified preference for this payment processor. 39 | 40 | ## Method Detail 41 | 42 | ## Method Details 43 | 44 | ### getID 45 | 46 | **Signature:** `getID() : String` 47 | 48 | **Description:** Returns the 'ID' of this processor. 49 | 50 | **Returns:** 51 | 52 | the 'ID' of this processor, e.g. "BASIC_CREDIT". 53 | 54 | --- 55 | 56 | ### getPreferenceValue 57 | 58 | **Signature:** `getPreferenceValue(name : String) : Object` 59 | 60 | **Description:** Returns the value of the specified preference for this payment processor. If the preference name is invalid (or null) or no preference value is defined for this payment processor, null is returned. 61 | 62 | **Parameters:** 63 | 64 | - `name`: preference name. Typically an attribute defined on SitePreferences contained in an attribute group whose name is the same as this.ID. 65 | 66 | **Returns:** 67 | 68 | preference value, or null. 69 | 70 | --- ``` -------------------------------------------------------------------------------- /src/tool-configs/best-practices-tool-config.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { GenericToolSpec, ToolExecutionContext } from '../core/handlers/base-handler.js'; 2 | import { ToolArguments } from '../core/handlers/base-handler.js'; 3 | import { ValidationHelpers, CommonValidations } from '../core/handlers/validation-helpers.js'; 4 | import { SFCCBestPracticesClient } from '../clients/best-practices-client.js'; 5 | 6 | export const BEST_PRACTICE_TOOL_NAMES = [ 7 | 'get_available_best_practice_guides', 8 | 'get_best_practice_guide', 9 | 'search_best_practices', 10 | 'get_hook_reference', 11 | ] as const; 12 | 13 | export type BestPracticeToolName = typeof BEST_PRACTICE_TOOL_NAMES[number]; 14 | export const BEST_PRACTICE_TOOL_NAMES_SET = new Set<BestPracticeToolName>(BEST_PRACTICE_TOOL_NAMES); 15 | 16 | /** 17 | * Configuration for SFCC best practices tools 18 | * Maps each tool to its validation, execution, and messaging logic 19 | */ 20 | export const BEST_PRACTICES_TOOL_CONFIG: Record<BestPracticeToolName, GenericToolSpec<ToolArguments, any>> = { 21 | get_available_best_practice_guides: { 22 | defaults: (args: ToolArguments) => args, 23 | validate: (_args: ToolArguments, _toolName: string) => { 24 | // No validation needed for list operation 25 | }, 26 | exec: async (_args: ToolArguments, context: ToolExecutionContext) => { 27 | const client = context.bestPracticesClient as SFCCBestPracticesClient; 28 | return client.getAvailableGuides(); 29 | }, 30 | logMessage: (_args: ToolArguments) => 'List guides', 31 | }, 32 | 33 | get_best_practice_guide: { 34 | defaults: (args: ToolArguments) => args, 35 | validate: (args: ToolArguments, toolName: string) => { 36 | ValidationHelpers.validateArguments(args, CommonValidations.requiredString('guideName'), toolName); 37 | }, 38 | exec: async (args: ToolArguments, context: ToolExecutionContext) => { 39 | const client = context.bestPracticesClient as SFCCBestPracticesClient; 40 | return client.getBestPracticeGuide(args.guideName as string); 41 | }, 42 | logMessage: (args: ToolArguments) => `Guide ${args.guideName}`, 43 | }, 44 | 45 | search_best_practices: { 46 | defaults: (args: ToolArguments) => args, 47 | validate: (args: ToolArguments, toolName: string) => { 48 | ValidationHelpers.validateArguments(args, CommonValidations.requiredString('query'), toolName); 49 | }, 50 | exec: async (args: ToolArguments, context: ToolExecutionContext) => { 51 | const client = context.bestPracticesClient as SFCCBestPracticesClient; 52 | return client.searchBestPractices(args.query as string); 53 | }, 54 | logMessage: (args: ToolArguments) => `Search best practices ${args.query}`, 55 | }, 56 | 57 | get_hook_reference: { 58 | defaults: (args: ToolArguments) => args, 59 | validate: (args: ToolArguments, toolName: string) => { 60 | ValidationHelpers.validateArguments(args, CommonValidations.requiredString('guideName'), toolName); 61 | }, 62 | exec: async (args: ToolArguments, context: ToolExecutionContext) => { 63 | const client = context.bestPracticesClient as SFCCBestPracticesClient; 64 | return client.getHookReference(args.guideName as string); 65 | }, 66 | logMessage: (args: ToolArguments) => `Hook reference ${args.guideName}`, 67 | }, 68 | }; 69 | ``` -------------------------------------------------------------------------------- /src/clients/ocapi/site-preferences-client.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * OCAPI Site Preferences Client 3 | * 4 | * This module handles all SFCC site preference related operations including 5 | * searching preferences across different instance types and preference groups. 6 | */ 7 | 8 | import { OCAPIConfig } from '../../types/types.js'; 9 | import { OCAPIAuthClient } from '../base/ocapi-auth-client.js'; 10 | import { QueryBuilder } from '../../utils/query-builder.js'; 11 | import { Validator } from '../../utils/validator.js'; 12 | import { buildOCAPIBaseUrl } from '../../utils/ocapi-url-builder.js'; 13 | 14 | /** 15 | * Interface for search request structure 16 | */ 17 | interface SearchRequest { 18 | query?: { 19 | text_query?: { 20 | fields: string[]; 21 | search_phrase: string; 22 | }; 23 | term_query?: { 24 | fields: string[]; 25 | operator: string; 26 | values: any[]; 27 | }; 28 | filtered_query?: { 29 | filter: any; 30 | query: any; 31 | }; 32 | bool_query?: { 33 | must?: any[]; 34 | must_not?: any[]; 35 | should?: any[]; 36 | }; 37 | match_all_query?: {}; 38 | }; 39 | sorts?: Array<{ 40 | field: string; 41 | sort_order?: 'asc' | 'desc'; 42 | }>; 43 | start?: number; 44 | count?: number; 45 | select?: string; 46 | } 47 | 48 | /** 49 | * Site preferences search options 50 | */ 51 | interface SitePreferencesOptions { 52 | maskPasswords?: boolean; 53 | expand?: string; 54 | } 55 | 56 | /** 57 | * OCAPI Site Preferences Client 58 | * Specialized client for site preference operations 59 | */ 60 | export class OCAPISitePreferencesClient extends OCAPIAuthClient { 61 | constructor(config: OCAPIConfig) { 62 | super(config); 63 | // Override the baseUrl for this specialized client 64 | this.baseUrl = buildOCAPIBaseUrl(config); 65 | } 66 | 67 | /** 68 | * Search site preferences across sites in the specified preference group and instance 69 | * 70 | * Allows searching for preferences by id, display_name, description, and value_type 71 | * Supports text queries, term queries, filtered queries, and boolean queries 72 | * 73 | * Searchable fields: 74 | * - id - String 75 | * - display_name - Localized String 76 | * - description - Localized String 77 | * - value_type - one of { 78 | * string, int, double, text, html, date, image, boolean, money, quantity, 79 | * datetime, email, password, set_of_string, set_of_int, set_of_double, enum_of_string, enum_of_int 80 | * } 81 | * 82 | * Note: value_type can only be joined with other attributes using a conjunction (AND) 83 | * Only searchable attributes can be used in sorting 84 | */ 85 | async searchSitePreferences( 86 | groupId: string, 87 | instanceType: string, 88 | searchRequest: SearchRequest, 89 | options?: SitePreferencesOptions, 90 | ): Promise<any> { 91 | Validator.validateRequired({ groupId, instanceType }, ['groupId', 'instanceType']); 92 | const validatedInstanceType = Validator.validateInstanceType(instanceType); 93 | Validator.validateSearchRequest(searchRequest); 94 | 95 | let endpoint = `/site_preferences/preference_groups/${encodeURIComponent(groupId)}/${validatedInstanceType}/preference_search`; 96 | 97 | if (options) { 98 | const queryString = QueryBuilder.fromObject(options); 99 | if (queryString) { 100 | endpoint += `?${queryString}`; 101 | } 102 | } 103 | 104 | return this.post(endpoint, searchRequest); 105 | } 106 | } 107 | ``` -------------------------------------------------------------------------------- /docs/dw_job/JobStepExecution.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.job 2 | 3 | # Class JobStepExecution 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.job.JobStepExecution 9 | 10 | ## Description 11 | 12 | Represents an execution of a step that belongs to a job. The job execution this step execution belongs to can be accessed via getJobExecution(). If a pipeline is used to implement a step this step execution is available in the pipeline dictionary under the key 'JobStepExecution'. If a script module is used to implement a step this step execution is available as the second parameter of the module's function that is used to execute the step, e.g.: 13 | 14 | ```javascript 15 | ... 16 | exports.execute( parameters, stepExecution) 17 | { 18 | ... 19 | var jobExecution = stepExecution.getJobExecution(); 20 | ... 21 | } 22 | ... 23 | ``` 24 | 25 | ## Properties 26 | 27 | ### ID 28 | 29 | **Type:** String (Read Only) 30 | 31 | The ID of this step execution. 32 | 33 | ### jobExecution 34 | 35 | **Type:** JobExecution (Read Only) 36 | 37 | The job execution this step execution belongs to. 38 | 39 | ### stepID 40 | 41 | **Type:** String (Read Only) 42 | 43 | The ID of the step this step execution belongs to. 44 | 45 | ### stepTypeID 46 | 47 | **Type:** String (Read Only) 48 | 49 | The ID of the step type of the step this step execution belongs to. 50 | 51 | ## Constructor Summary 52 | 53 | This class does not have a constructor, so you cannot create it directly. 54 | 55 | ## Method Summary 56 | 57 | ### getID 58 | 59 | **Signature:** `getID() : String` 60 | 61 | Returns the ID of this step execution. 62 | 63 | ### getJobExecution 64 | 65 | **Signature:** `getJobExecution() : JobExecution` 66 | 67 | Returns the job execution this step execution belongs to. 68 | 69 | ### getParameterValue 70 | 71 | **Signature:** `getParameterValue(name : String) : Object` 72 | 73 | Returns the value of the parameter of the step this step execution belongs to. 74 | 75 | ### getStepID 76 | 77 | **Signature:** `getStepID() : String` 78 | 79 | Returns the ID of the step this step execution belongs to. 80 | 81 | ### getStepTypeID 82 | 83 | **Signature:** `getStepTypeID() : String` 84 | 85 | Returns the ID of the step type of the step this step execution belongs to. 86 | 87 | ## Method Details 88 | 89 | ### getID 90 | 91 | **Signature:** `getID() : String` 92 | 93 | **Description:** Returns the ID of this step execution. 94 | 95 | **Returns:** 96 | 97 | the ID of this step execution. 98 | 99 | --- 100 | 101 | ### getJobExecution 102 | 103 | **Signature:** `getJobExecution() : JobExecution` 104 | 105 | **Description:** Returns the job execution this step execution belongs to. 106 | 107 | **Returns:** 108 | 109 | the job execution this step execution belongs to. 110 | 111 | --- 112 | 113 | ### getParameterValue 114 | 115 | **Signature:** `getParameterValue(name : String) : Object` 116 | 117 | **Description:** Returns the value of the parameter of the step this step execution belongs to. 118 | 119 | **Parameters:** 120 | 121 | - `name`: The name of the parameter. 122 | 123 | **Returns:** 124 | 125 | the value of the parameter of the step this step execution belongs to. 126 | 127 | --- 128 | 129 | ### getStepID 130 | 131 | **Signature:** `getStepID() : String` 132 | 133 | **Description:** Returns the ID of the step this step execution belongs to. 134 | 135 | **Returns:** 136 | 137 | the ID of the step this step execution belongs to. 138 | 139 | --- 140 | 141 | ### getStepTypeID 142 | 143 | **Signature:** `getStepTypeID() : String` 144 | 145 | **Description:** Returns the ID of the step type of the step this step execution belongs to. 146 | 147 | **Returns:** 148 | 149 | the ID of the step type of the step this step execution belongs to. 150 | 151 | --- 152 | ``` -------------------------------------------------------------------------------- /docs/dw_util/MappingMgr.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.util 2 | 3 | # Class MappingMgr 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.util.MappingMgr 9 | 10 | ## Description 11 | 12 | Used to manage and interface with mappings loaded into the system via the ImportKeyValueMapping job step. Class can be used to retrieve values for known keys, iterate over all keys known in a mapping or list all known mappings. Mappings are read into the system using the ImportKeyValueMapping job step. Generic mapping capability enables you to map keys to values, with the mapping stored in a high-performance data store that is independent of the database. This supports large datasets, with high performance for lookup. An example of using this feature is to map SKUs from a backend system to Commerce Cloud Digital SKUs on-the-fly in Digital script, so that interaction with the backend system is transparent and does not require adding Digital SKUs to the third party system. 13 | 14 | ## Properties 15 | 16 | ### mappingNames 17 | 18 | **Type:** Collection (Read Only) 19 | 20 | List all known mappings. 21 | 22 | ## Constructor Summary 23 | 24 | ## Method Summary 25 | 26 | ### get 27 | 28 | **Signature:** `static get(mappingName : String, key : MappingKey) : Map` 29 | 30 | Returns a map containing value(s) associated to the specified key for the specified mapping. 31 | 32 | ### getFirst 33 | 34 | **Signature:** `static getFirst(mappingName : String, key : MappingKey) : String` 35 | 36 | Gets the first string value of a mapping by name and key. 37 | 38 | ### getMappingNames 39 | 40 | **Signature:** `static getMappingNames() : Collection` 41 | 42 | List all known mappings. 43 | 44 | ### keyIterator 45 | 46 | **Signature:** `static keyIterator(mappingName : String) : SeekableIterator` 47 | 48 | Key iterator over known mapping keys by mapping name. 49 | 50 | ## Method Detail 51 | 52 | ## Method Details 53 | 54 | ### get 55 | 56 | **Signature:** `static get(mappingName : String, key : MappingKey) : Map` 57 | 58 | **Description:** Returns a map containing value(s) associated to the specified key for the specified mapping. 59 | 60 | **Parameters:** 61 | 62 | - `mappingName`: the mapping name 63 | - `key`: the key 64 | 65 | **Throws:** 66 | 67 | IllegalArgumentException - if mappingName is unknown 68 | 69 | --- 70 | 71 | ### getFirst 72 | 73 | **Signature:** `static getFirst(mappingName : String, key : MappingKey) : String` 74 | 75 | **Description:** Gets the first string value of a mapping by name and key. Ordering is determined by the input CSV file. Throws an exception if mappingName does not exist. 76 | 77 | **Parameters:** 78 | 79 | - `mappingName`: the mapping name 80 | - `key`: the key 81 | 82 | **Returns:** 83 | 84 | the value if a single value. The first value sequentially if a compound value. 85 | 86 | **Throws:** 87 | 88 | IllegalArgumentException - if mappingName is unknown 89 | 90 | --- 91 | 92 | ### getMappingNames 93 | 94 | **Signature:** `static getMappingNames() : Collection` 95 | 96 | **Description:** List all known mappings. 97 | 98 | **Returns:** 99 | 100 | the collection of mapping names 101 | 102 | --- 103 | 104 | ### keyIterator 105 | 106 | **Signature:** `static keyIterator(mappingName : String) : SeekableIterator` 107 | 108 | **Description:** Key iterator over known mapping keys by mapping name. Throws an exception if mappingName does not exist. 109 | 110 | **Parameters:** 111 | 112 | - `mappingName`: the mapping name 113 | 114 | **Returns:** 115 | 116 | the seekable iterator 117 | 118 | **Throws:** 119 | 120 | IllegalArgumentException - if mappingName is unknown 121 | 122 | --- ``` -------------------------------------------------------------------------------- /docs/dw_suggest/SuggestedTerms.md: -------------------------------------------------------------------------------- ```markdown 1 | ## Package: dw.suggest 2 | 3 | # Class SuggestedTerms 4 | 5 | ## Inheritance Hierarchy 6 | 7 | - Object 8 | - dw.suggest.SuggestedTerms 9 | 10 | ## Description 11 | 12 | This container represents a list of suggested terms, all belonging to a particular single original term of the users input search phrase. Each user input term of the search phrase is being processed separately by the suggestion engine. For each original term, a list of terms will be suggested, either completed terms, corrected terms or even the exact term if they are known to the engine as they are. A instance of this class refers to the original unmodified term, as well as to a list of SuggestedTerms objects representing a single suggested term. 13 | 14 | ## Properties 15 | 16 | ### empty 17 | 18 | **Type:** boolean (Read Only) 19 | 20 | Returns true if this set of suggested terms is empty. 21 | 22 | ### firstTerm 23 | 24 | **Type:** SuggestedTerm (Read Only) 25 | 26 | This method returns the suggested term which is considered best matching 27 | with the original term. See getTerms() for a note on ordering of 28 | suggested terms. 29 | 30 | ### originalTerm 31 | 32 | **Type:** String (Read Only) 33 | 34 | The original term of the user input, for which this instance 35 | provides a list of suggested terms. Suggested terms can either be corrected, 36 | or completed or exact matching. 37 | 38 | ### terms 39 | 40 | **Type:** Iterator (Read Only) 41 | 42 | The list of SuggestedTerms suggested for the original term. 43 | 44 | ## Constructor Summary 45 | 46 | ## Method Summary 47 | 48 | ### getFirstTerm 49 | 50 | **Signature:** `getFirstTerm() : SuggestedTerm` 51 | 52 | This method returns the suggested term which is considered best matching with the original term. 53 | 54 | ### getOriginalTerm 55 | 56 | **Signature:** `getOriginalTerm() : String` 57 | 58 | Returns the original term of the user input, for which this instance provides a list of suggested terms. 59 | 60 | ### getTerms 61 | 62 | **Signature:** `getTerms() : Iterator` 63 | 64 | Returns the list of SuggestedTerms suggested for the original term. 65 | 66 | ### isEmpty 67 | 68 | **Signature:** `isEmpty() : boolean` 69 | 70 | Returns true if this set of suggested terms is empty. 71 | 72 | ## Method Detail 73 | 74 | ## Method Details 75 | 76 | ### getFirstTerm 77 | 78 | **Signature:** `getFirstTerm() : SuggestedTerm` 79 | 80 | **Description:** This method returns the suggested term which is considered best matching with the original term. See getTerms() for a note on ordering of suggested terms. 81 | 82 | **Returns:** 83 | 84 | the best matching term 85 | 86 | **See Also:** 87 | 88 | getOriginalTerm() 89 | getTerms() 90 | 91 | --- 92 | 93 | ### getOriginalTerm 94 | 95 | **Signature:** `getOriginalTerm() : String` 96 | 97 | **Description:** Returns the original term of the user input, for which this instance provides a list of suggested terms. Suggested terms can either be corrected, or completed or exact matching. 98 | 99 | **Returns:** 100 | 101 | the original unmodified term of the user input search phrase 102 | 103 | --- 104 | 105 | ### getTerms 106 | 107 | **Signature:** `getTerms() : Iterator` 108 | 109 | **Description:** Returns the list of SuggestedTerms suggested for the original term. 110 | 111 | **Returns:** 112 | 113 | a iterator of suggested terms, might be empty 114 | 115 | **See Also:** 116 | 117 | getOriginalTerm() 118 | isEmpty() 119 | 120 | --- 121 | 122 | ### isEmpty 123 | 124 | **Signature:** `isEmpty() : boolean` 125 | 126 | **Description:** Returns true if this set of suggested terms is empty. 127 | 128 | **Returns:** 129 | 130 | true if no suggested term is contained in this set, false otherwise 131 | 132 | --- ```