sfcc-dev-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +338 -0
  3. package/dist/best-practices-client.d.ts +55 -0
  4. package/dist/best-practices-client.d.ts.map +1 -0
  5. package/dist/best-practices-client.js +201 -0
  6. package/dist/best-practices-client.js.map +1 -0
  7. package/dist/cache.d.ts +105 -0
  8. package/dist/cache.d.ts.map +1 -0
  9. package/dist/cache.js +225 -0
  10. package/dist/cache.js.map +1 -0
  11. package/dist/config.d.ts +26 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +67 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/docs-client.d.ts +124 -0
  16. package/dist/docs-client.d.ts.map +1 -0
  17. package/dist/docs-client.js +442 -0
  18. package/dist/docs-client.js.map +1 -0
  19. package/dist/index.d.ts +18 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +18 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/log-client.d.ts +79 -0
  24. package/dist/log-client.d.ts.map +1 -0
  25. package/dist/log-client.js +226 -0
  26. package/dist/log-client.js.map +1 -0
  27. package/dist/main.d.ts +15 -0
  28. package/dist/main.d.ts.map +1 -0
  29. package/dist/main.js +110 -0
  30. package/dist/main.js.map +1 -0
  31. package/dist/server.d.ts +35 -0
  32. package/dist/server.d.ts.map +1 -0
  33. package/dist/server.js +539 -0
  34. package/dist/server.js.map +1 -0
  35. package/dist/types.d.ts +79 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +8 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils.d.ts +46 -0
  40. package/dist/utils.d.ts.map +1 -0
  41. package/dist/utils.js +96 -0
  42. package/dist/utils.js.map +1 -0
  43. package/docs/TopLevel/APIException.md +68 -0
  44. package/docs/TopLevel/Array.md +897 -0
  45. package/docs/TopLevel/ArrayBuffer.md +79 -0
  46. package/docs/TopLevel/BigInt.md +132 -0
  47. package/docs/TopLevel/Boolean.md +62 -0
  48. package/docs/TopLevel/ConversionError.md +23 -0
  49. package/docs/TopLevel/DataView.md +352 -0
  50. package/docs/TopLevel/Date.md +924 -0
  51. package/docs/TopLevel/ES6Iterator.md +33 -0
  52. package/docs/TopLevel/Error.md +88 -0
  53. package/docs/TopLevel/EvalError.md +23 -0
  54. package/docs/TopLevel/Fault.md +87 -0
  55. package/docs/TopLevel/Float32Array.md +124 -0
  56. package/docs/TopLevel/Float64Array.md +124 -0
  57. package/docs/TopLevel/Function.md +105 -0
  58. package/docs/TopLevel/Generator.md +78 -0
  59. package/docs/TopLevel/IOError.md +62 -0
  60. package/docs/TopLevel/Int16Array.md +124 -0
  61. package/docs/TopLevel/Int32Array.md +124 -0
  62. package/docs/TopLevel/Int8Array.md +124 -0
  63. package/docs/TopLevel/InternalError.md +23 -0
  64. package/docs/TopLevel/Iterable.md +41 -0
  65. package/docs/TopLevel/Iterator.md +48 -0
  66. package/docs/TopLevel/JSON.md +162 -0
  67. package/docs/TopLevel/Map.md +216 -0
  68. package/docs/TopLevel/Math.md +865 -0
  69. package/docs/TopLevel/Module.md +45 -0
  70. package/docs/TopLevel/Namespace.md +96 -0
  71. package/docs/TopLevel/Number.md +375 -0
  72. package/docs/TopLevel/Object.md +641 -0
  73. package/docs/TopLevel/QName.md +96 -0
  74. package/docs/TopLevel/RangeError.md +23 -0
  75. package/docs/TopLevel/ReferenceError.md +23 -0
  76. package/docs/TopLevel/RegExp.md +109 -0
  77. package/docs/TopLevel/Set.md +165 -0
  78. package/docs/TopLevel/StopIteration.md +20 -0
  79. package/docs/TopLevel/String.md +1299 -0
  80. package/docs/TopLevel/Symbol.md +78 -0
  81. package/docs/TopLevel/SyntaxError.md +23 -0
  82. package/docs/TopLevel/SystemError.md +62 -0
  83. package/docs/TopLevel/TypeError.md +23 -0
  84. package/docs/TopLevel/URIError.md +23 -0
  85. package/docs/TopLevel/Uint16Array.md +124 -0
  86. package/docs/TopLevel/Uint32Array.md +124 -0
  87. package/docs/TopLevel/Uint8Array.md +124 -0
  88. package/docs/TopLevel/Uint8ClampedArray.md +124 -0
  89. package/docs/TopLevel/WeakMap.md +137 -0
  90. package/docs/TopLevel/WeakSet.md +92 -0
  91. package/docs/TopLevel/XML.md +937 -0
  92. package/docs/TopLevel/XMLList.md +484 -0
  93. package/docs/TopLevel/XMLStreamError.md +74 -0
  94. package/docs/TopLevel/arguments.md +34 -0
  95. package/docs/TopLevel/global.md +462 -0
  96. package/docs/best-practices/ocapi_hooks.md +295 -0
  97. package/docs/best-practices/scapi_custom_endpoint.md +176 -0
  98. package/docs/best-practices/scapi_hooks.md +295 -0
  99. package/docs/best-practices/sfra_controllers.md +190 -0
  100. package/docs/dw_campaign/ABTest.md +47 -0
  101. package/docs/dw_campaign/ABTestMgr.md +70 -0
  102. package/docs/dw_campaign/ABTestSegment.md +96 -0
  103. package/docs/dw_campaign/AmountDiscount.md +51 -0
  104. package/docs/dw_campaign/ApproachingDiscount.md +124 -0
  105. package/docs/dw_campaign/BonusChoiceDiscount.md +146 -0
  106. package/docs/dw_campaign/BonusDiscount.md +48 -0
  107. package/docs/dw_campaign/Campaign.md +365 -0
  108. package/docs/dw_campaign/CampaignMgr.md +395 -0
  109. package/docs/dw_campaign/CampaignStatusCodes.md +24 -0
  110. package/docs/dw_campaign/Coupon.md +292 -0
  111. package/docs/dw_campaign/CouponMgr.md +138 -0
  112. package/docs/dw_campaign/CouponRedemption.md +94 -0
  113. package/docs/dw_campaign/CouponStatusCodes.md +20 -0
  114. package/docs/dw_campaign/Discount.md +160 -0
  115. package/docs/dw_campaign/DiscountPlan.md +282 -0
  116. package/docs/dw_campaign/FixedPriceDiscount.md +52 -0
  117. package/docs/dw_campaign/FixedPriceShippingDiscount.md +52 -0
  118. package/docs/dw_campaign/FreeDiscount.md +17 -0
  119. package/docs/dw_campaign/FreeShippingDiscount.md +17 -0
  120. package/docs/dw_campaign/PercentageDiscount.md +52 -0
  121. package/docs/dw_campaign/PercentageOptionDiscount.md +48 -0
  122. package/docs/dw_campaign/PriceBookPriceDiscount.md +47 -0
  123. package/docs/dw_campaign/Promotion.md +826 -0
  124. package/docs/dw_campaign/PromotionMgr.md +386 -0
  125. package/docs/dw_campaign/PromotionPlan.md +318 -0
  126. package/docs/dw_campaign/SlotContent.md +144 -0
  127. package/docs/dw_campaign/SourceCodeGroup.md +72 -0
  128. package/docs/dw_campaign/SourceCodeInfo.md +126 -0
  129. package/docs/dw_campaign/SourceCodeStatusCodes.md +24 -0
  130. package/docs/dw_campaign/TotalFixedPriceDiscount.md +47 -0
  131. package/docs/dw_catalog/Catalog.md +122 -0
  132. package/docs/dw_catalog/CatalogMgr.md +182 -0
  133. package/docs/dw_catalog/Category.md +1296 -0
  134. package/docs/dw_catalog/CategoryAssignment.md +192 -0
  135. package/docs/dw_catalog/CategoryLink.md +96 -0
  136. package/docs/dw_catalog/PriceBook.md +242 -0
  137. package/docs/dw_catalog/PriceBookMgr.md +205 -0
  138. package/docs/dw_catalog/Product.md +2593 -0
  139. package/docs/dw_catalog/ProductActiveData.md +1275 -0
  140. package/docs/dw_catalog/ProductAttributeModel.md +277 -0
  141. package/docs/dw_catalog/ProductAvailabilityLevels.md +142 -0
  142. package/docs/dw_catalog/ProductAvailabilityModel.md +356 -0
  143. package/docs/dw_catalog/ProductInventoryList.md +140 -0
  144. package/docs/dw_catalog/ProductInventoryMgr.md +99 -0
  145. package/docs/dw_catalog/ProductInventoryRecord.md +563 -0
  146. package/docs/dw_catalog/ProductLink.md +96 -0
  147. package/docs/dw_catalog/ProductMgr.md +138 -0
  148. package/docs/dw_catalog/ProductOption.md +214 -0
  149. package/docs/dw_catalog/ProductOptionModel.md +246 -0
  150. package/docs/dw_catalog/ProductOptionValue.md +123 -0
  151. package/docs/dw_catalog/ProductPriceInfo.md +172 -0
  152. package/docs/dw_catalog/ProductPriceModel.md +745 -0
  153. package/docs/dw_catalog/ProductPriceTable.md +134 -0
  154. package/docs/dw_catalog/ProductSearchHit.md +545 -0
  155. package/docs/dw_catalog/ProductSearchModel.md +1912 -0
  156. package/docs/dw_catalog/ProductSearchRefinementDefinition.md +97 -0
  157. package/docs/dw_catalog/ProductSearchRefinementValue.md +73 -0
  158. package/docs/dw_catalog/ProductSearchRefinements.md +216 -0
  159. package/docs/dw_catalog/ProductVariationAttribute.md +100 -0
  160. package/docs/dw_catalog/ProductVariationAttributeValue.md +238 -0
  161. package/docs/dw_catalog/ProductVariationModel.md +849 -0
  162. package/docs/dw_catalog/Recommendation.md +296 -0
  163. package/docs/dw_catalog/SearchModel.md +877 -0
  164. package/docs/dw_catalog/SearchRefinementDefinition.md +146 -0
  165. package/docs/dw_catalog/SearchRefinementValue.md +185 -0
  166. package/docs/dw_catalog/SearchRefinements.md +156 -0
  167. package/docs/dw_catalog/SortingOption.md +120 -0
  168. package/docs/dw_catalog/SortingRule.md +47 -0
  169. package/docs/dw_catalog/Store.md +562 -0
  170. package/docs/dw_catalog/StoreGroup.md +96 -0
  171. package/docs/dw_catalog/StoreInventoryFilter.md +74 -0
  172. package/docs/dw_catalog/StoreInventoryFilterValue.md +74 -0
  173. package/docs/dw_catalog/StoreMgr.md +236 -0
  174. package/docs/dw_catalog/Variant.md +859 -0
  175. package/docs/dw_catalog/VariationGroup.md +792 -0
  176. package/docs/dw_content/Content.md +534 -0
  177. package/docs/dw_content/ContentMgr.md +160 -0
  178. package/docs/dw_content/ContentSearchModel.md +670 -0
  179. package/docs/dw_content/ContentSearchRefinementDefinition.md +49 -0
  180. package/docs/dw_content/ContentSearchRefinementValue.md +17 -0
  181. package/docs/dw_content/ContentSearchRefinements.md +208 -0
  182. package/docs/dw_content/Folder.md +467 -0
  183. package/docs/dw_content/Library.md +121 -0
  184. package/docs/dw_content/MarkupText.md +88 -0
  185. package/docs/dw_content/MediaFile.md +317 -0
  186. package/docs/dw_crypto/CertificateRef.md +42 -0
  187. package/docs/dw_crypto/Cipher.md +524 -0
  188. package/docs/dw_crypto/Encoding.md +220 -0
  189. package/docs/dw_crypto/JWE.md +182 -0
  190. package/docs/dw_crypto/JWS.md +264 -0
  191. package/docs/dw_crypto/JWSHeader.md +148 -0
  192. package/docs/dw_crypto/KeyRef.md +44 -0
  193. package/docs/dw_crypto/Mac.md +109 -0
  194. package/docs/dw_crypto/MessageDigest.md +139 -0
  195. package/docs/dw_crypto/SecureRandom.md +148 -0
  196. package/docs/dw_crypto/Signature.md +246 -0
  197. package/docs/dw_crypto/WeakCipher.md +532 -0
  198. package/docs/dw_crypto/WeakMac.md +109 -0
  199. package/docs/dw_crypto/WeakMessageDigest.md +139 -0
  200. package/docs/dw_crypto/WeakSignature.md +242 -0
  201. package/docs/dw_customer/AddressBook.md +163 -0
  202. package/docs/dw_customer/AgentUserMgr.md +83 -0
  203. package/docs/dw_customer/AgentUserStatusCodes.md +24 -0
  204. package/docs/dw_customer/AuthenticationStatus.md +96 -0
  205. package/docs/dw_customer/Credentials.md +494 -0
  206. package/docs/dw_customer/Customer.md +571 -0
  207. package/docs/dw_customer/CustomerActiveData.md +552 -0
  208. package/docs/dw_customer/CustomerAddress.md +852 -0
  209. package/docs/dw_customer/CustomerCDPData.md +70 -0
  210. package/docs/dw_customer/CustomerContextMgr.md +64 -0
  211. package/docs/dw_customer/CustomerGroup.md +134 -0
  212. package/docs/dw_customer/CustomerList.md +71 -0
  213. package/docs/dw_customer/CustomerMgr.md +735 -0
  214. package/docs/dw_customer/CustomerPasswordConstraints.md +142 -0
  215. package/docs/dw_customer/CustomerPaymentInstrument.md +125 -0
  216. package/docs/dw_customer/CustomerStatusCodes.md +24 -0
  217. package/docs/dw_customer/EncryptedObject.md +18 -0
  218. package/docs/dw_customer/ExternalProfile.md +160 -0
  219. package/docs/dw_customer/OrderHistory.md +111 -0
  220. package/docs/dw_customer/ProductList.md +952 -0
  221. package/docs/dw_customer/ProductListItem.md +492 -0
  222. package/docs/dw_customer/ProductListItemPurchase.md +145 -0
  223. package/docs/dw_customer/ProductListMgr.md +234 -0
  224. package/docs/dw_customer/ProductListRegistrant.md +193 -0
  225. package/docs/dw_customer/Profile.md +1128 -0
  226. package/docs/dw_customer/Wallet.md +118 -0
  227. package/docs/dw_extensions.applepay/ApplePayHookResult.md +161 -0
  228. package/docs/dw_extensions.applepay/ApplePayHooks.md +255 -0
  229. package/docs/dw_extensions.facebook/FacebookFeedHooks.md +47 -0
  230. package/docs/dw_extensions.facebook/FacebookProduct.md +1483 -0
  231. package/docs/dw_extensions.paymentrequest/PaymentRequestHookResult.md +159 -0
  232. package/docs/dw_extensions.paymentrequest/PaymentRequestHooks.md +160 -0
  233. package/docs/dw_extensions.payments/SalesforceBancontactPaymentDetails.md +79 -0
  234. package/docs/dw_extensions.payments/SalesforceCardPaymentDetails.md +103 -0
  235. package/docs/dw_extensions.payments/SalesforceEpsPaymentDetails.md +51 -0
  236. package/docs/dw_extensions.payments/SalesforceIdealPaymentDetails.md +51 -0
  237. package/docs/dw_extensions.payments/SalesforceKlarnaPaymentDetails.md +51 -0
  238. package/docs/dw_extensions.payments/SalesforcePayPalOrder.md +234 -0
  239. package/docs/dw_extensions.payments/SalesforcePayPalOrderAddress.md +191 -0
  240. package/docs/dw_extensions.payments/SalesforcePayPalOrderPayer.md +118 -0
  241. package/docs/dw_extensions.payments/SalesforcePayPalPaymentDetails.md +79 -0
  242. package/docs/dw_extensions.payments/SalesforcePaymentDetails.md +57 -0
  243. package/docs/dw_extensions.payments/SalesforcePaymentIntent.md +269 -0
  244. package/docs/dw_extensions.payments/SalesforcePaymentMethod.md +304 -0
  245. package/docs/dw_extensions.payments/SalesforcePaymentRequest.md +622 -0
  246. package/docs/dw_extensions.payments/SalesforcePaymentsHooks.md +45 -0
  247. package/docs/dw_extensions.payments/SalesforcePaymentsMgr.md +592 -0
  248. package/docs/dw_extensions.payments/SalesforcePaymentsSiteConfiguration.md +95 -0
  249. package/docs/dw_extensions.payments/SalesforceSepaDebitPaymentDetails.md +51 -0
  250. package/docs/dw_extensions.payments/SalesforceVenmoPaymentDetails.md +79 -0
  251. package/docs/dw_extensions.pinterest/PinterestAvailability.md +86 -0
  252. package/docs/dw_extensions.pinterest/PinterestFeedHooks.md +69 -0
  253. package/docs/dw_extensions.pinterest/PinterestOrder.md +172 -0
  254. package/docs/dw_extensions.pinterest/PinterestOrderHooks.md +45 -0
  255. package/docs/dw_extensions.pinterest/PinterestProduct.md +814 -0
  256. package/docs/dw_io/CSVStreamReader.md +80 -0
  257. package/docs/dw_io/CSVStreamWriter.md +60 -0
  258. package/docs/dw_io/File.md +554 -0
  259. package/docs/dw_io/FileReader.md +41 -0
  260. package/docs/dw_io/FileWriter.md +103 -0
  261. package/docs/dw_io/InputStream.md +34 -0
  262. package/docs/dw_io/OutputStream.md +34 -0
  263. package/docs/dw_io/PrintWriter.md +71 -0
  264. package/docs/dw_io/RandomAccessFileReader.md +167 -0
  265. package/docs/dw_io/Reader.md +274 -0
  266. package/docs/dw_io/StringWriter.md +81 -0
  267. package/docs/dw_io/Writer.md +92 -0
  268. package/docs/dw_io/XMLIndentingStreamWriter.md +112 -0
  269. package/docs/dw_io/XMLStreamConstants.md +24 -0
  270. package/docs/dw_io/XMLStreamReader.md +1043 -0
  271. package/docs/dw_io/XMLStreamWriter.md +572 -0
  272. package/docs/dw_net/FTPClient.md +675 -0
  273. package/docs/dw_net/FTPFileInfo.md +122 -0
  274. package/docs/dw_net/HTTPClient.md +769 -0
  275. package/docs/dw_net/HTTPRequestPart.md +206 -0
  276. package/docs/dw_net/Mail.md +431 -0
  277. package/docs/dw_net/SFTPClient.md +579 -0
  278. package/docs/dw_net/SFTPFileInfo.md +122 -0
  279. package/docs/dw_net/WebDAVClient.md +667 -0
  280. package/docs/dw_net/WebDAVFileInfo.md +184 -0
  281. package/docs/dw_object/ActiveData.md +75 -0
  282. package/docs/dw_object/CustomAttributes.md +16 -0
  283. package/docs/dw_object/CustomObject.md +73 -0
  284. package/docs/dw_object/CustomObjectMgr.md +291 -0
  285. package/docs/dw_object/Extensible.md +64 -0
  286. package/docs/dw_object/ExtensibleObject.md +68 -0
  287. package/docs/dw_object/Note.md +121 -0
  288. package/docs/dw_object/ObjectAttributeDefinition.md +373 -0
  289. package/docs/dw_object/ObjectAttributeGroup.md +170 -0
  290. package/docs/dw_object/ObjectAttributeValueDefinition.md +72 -0
  291. package/docs/dw_object/ObjectTypeDefinition.md +216 -0
  292. package/docs/dw_object/PersistentObject.md +94 -0
  293. package/docs/dw_object/SimpleExtensible.md +46 -0
  294. package/docs/dw_object/SystemObjectMgr.md +153 -0
  295. package/docs/dw_order/AbstractItem.md +244 -0
  296. package/docs/dw_order/AbstractItemCtnr.md +240 -0
  297. package/docs/dw_order/Appeasement.md +325 -0
  298. package/docs/dw_order/AppeasementItem.md +90 -0
  299. package/docs/dw_order/Basket.md +362 -0
  300. package/docs/dw_order/BasketMgr.md +402 -0
  301. package/docs/dw_order/BonusDiscountLineItem.md +248 -0
  302. package/docs/dw_order/CouponLineItem.md +272 -0
  303. package/docs/dw_order/CreateAgentBasketLimitExceededException.md +18 -0
  304. package/docs/dw_order/CreateBasketFromOrderException.md +26 -0
  305. package/docs/dw_order/CreateCouponLineItemException.md +26 -0
  306. package/docs/dw_order/CreateOrderException.md +18 -0
  307. package/docs/dw_order/CreateTemporaryBasketLimitExceededException.md +18 -0
  308. package/docs/dw_order/GiftCertificate.md +545 -0
  309. package/docs/dw_order/GiftCertificateLineItem.md +324 -0
  310. package/docs/dw_order/GiftCertificateMgr.md +161 -0
  311. package/docs/dw_order/GiftCertificateStatusCodes.md +24 -0
  312. package/docs/dw_order/Invoice.md +316 -0
  313. package/docs/dw_order/InvoiceItem.md +222 -0
  314. package/docs/dw_order/LineItem.md +532 -0
  315. package/docs/dw_order/LineItemCtnr.md +2317 -0
  316. package/docs/dw_order/Order.md +2441 -0
  317. package/docs/dw_order/OrderAddress.md +807 -0
  318. package/docs/dw_order/OrderItem.md +476 -0
  319. package/docs/dw_order/OrderMgr.md +535 -0
  320. package/docs/dw_order/OrderPaymentInstrument.md +220 -0
  321. package/docs/dw_order/OrderProcessStatusCodes.md +24 -0
  322. package/docs/dw_order/PaymentCard.md +217 -0
  323. package/docs/dw_order/PaymentInstrument.md +1414 -0
  324. package/docs/dw_order/PaymentMethod.md +242 -0
  325. package/docs/dw_order/PaymentMgr.md +117 -0
  326. package/docs/dw_order/PaymentProcessor.md +70 -0
  327. package/docs/dw_order/PaymentStatusCodes.md +24 -0
  328. package/docs/dw_order/PaymentTransaction.md +304 -0
  329. package/docs/dw_order/PriceAdjustment.md +640 -0
  330. package/docs/dw_order/PriceAdjustmentLimitTypes.md +20 -0
  331. package/docs/dw_order/ProductLineItem.md +1821 -0
  332. package/docs/dw_order/ProductShippingCost.md +96 -0
  333. package/docs/dw_order/ProductShippingLineItem.md +320 -0
  334. package/docs/dw_order/ProductShippingModel.md +125 -0
  335. package/docs/dw_order/Return.md +318 -0
  336. package/docs/dw_order/ReturnCase.md +340 -0
  337. package/docs/dw_order/ReturnCaseItem.md +343 -0
  338. package/docs/dw_order/ReturnItem.md +362 -0
  339. package/docs/dw_order/Shipment.md +1227 -0
  340. package/docs/dw_order/ShipmentShippingCost.md +46 -0
  341. package/docs/dw_order/ShipmentShippingModel.md +146 -0
  342. package/docs/dw_order/ShippingLineItem.md +272 -0
  343. package/docs/dw_order/ShippingLocation.md +366 -0
  344. package/docs/dw_order/ShippingMethod.md +266 -0
  345. package/docs/dw_order/ShippingMgr.md +158 -0
  346. package/docs/dw_order/ShippingOrder.md +507 -0
  347. package/docs/dw_order/ShippingOrderItem.md +331 -0
  348. package/docs/dw_order/SumItem.md +147 -0
  349. package/docs/dw_order/TaxGroup.md +143 -0
  350. package/docs/dw_order/TaxItem.md +74 -0
  351. package/docs/dw_order/TaxMgr.md +215 -0
  352. package/docs/dw_order/TrackingInfo.md +312 -0
  353. package/docs/dw_order/TrackingRef.md +113 -0
  354. package/docs/dw_order.hooks/CalculateHooks.md +77 -0
  355. package/docs/dw_order.hooks/OrderHooks.md +41 -0
  356. package/docs/dw_order.hooks/PaymentHooks.md +180 -0
  357. package/docs/dw_order.hooks/ReturnHooks.md +135 -0
  358. package/docs/dw_order.hooks/ShippingOrderHooks.md +245 -0
  359. package/docs/dw_rpc/SOAPUtil.md +333 -0
  360. package/docs/dw_rpc/Stub.md +259 -0
  361. package/docs/dw_rpc/WebReference.md +83 -0
  362. package/docs/dw_suggest/BrandSuggestions.md +17 -0
  363. package/docs/dw_suggest/CategorySuggestions.md +53 -0
  364. package/docs/dw_suggest/ContentSuggestions.md +53 -0
  365. package/docs/dw_suggest/CustomSuggestions.md +17 -0
  366. package/docs/dw_suggest/ProductSuggestions.md +53 -0
  367. package/docs/dw_suggest/SearchPhraseSuggestions.md +117 -0
  368. package/docs/dw_suggest/SuggestModel.md +397 -0
  369. package/docs/dw_suggest/SuggestedCategory.md +46 -0
  370. package/docs/dw_suggest/SuggestedContent.md +46 -0
  371. package/docs/dw_suggest/SuggestedPhrase.md +70 -0
  372. package/docs/dw_suggest/SuggestedProduct.md +47 -0
  373. package/docs/dw_suggest/SuggestedTerm.md +143 -0
  374. package/docs/dw_suggest/SuggestedTerms.md +132 -0
  375. package/docs/dw_suggest/Suggestions.md +179 -0
  376. package/docs/dw_svc/FTPService.md +118 -0
  377. package/docs/dw_svc/FTPServiceDefinition.md +69 -0
  378. package/docs/dw_svc/HTTPFormService.md +18 -0
  379. package/docs/dw_svc/HTTPFormServiceDefinition.md +18 -0
  380. package/docs/dw_svc/HTTPService.md +415 -0
  381. package/docs/dw_svc/HTTPServiceDefinition.md +303 -0
  382. package/docs/dw_svc/LocalServiceRegistry.md +43 -0
  383. package/docs/dw_svc/Result.md +255 -0
  384. package/docs/dw_svc/SOAPService.md +115 -0
  385. package/docs/dw_svc/SOAPServiceDefinition.md +17 -0
  386. package/docs/dw_svc/Service.md +295 -0
  387. package/docs/dw_svc/ServiceCallback.md +268 -0
  388. package/docs/dw_svc/ServiceConfig.md +120 -0
  389. package/docs/dw_svc/ServiceCredential.md +150 -0
  390. package/docs/dw_svc/ServiceDefinition.md +176 -0
  391. package/docs/dw_svc/ServiceProfile.md +168 -0
  392. package/docs/dw_svc/ServiceRegistry.md +109 -0
  393. package/docs/dw_system/AgentUserStatusCodes.md +21 -0
  394. package/docs/dw_system/Cache.md +102 -0
  395. package/docs/dw_system/CacheMgr.md +42 -0
  396. package/docs/dw_system/HookMgr.md +66 -0
  397. package/docs/dw_system/InternalObject.md +56 -0
  398. package/docs/dw_system/JobProcessMonitor.md +124 -0
  399. package/docs/dw_system/Log.md +237 -0
  400. package/docs/dw_system/LogNDC.md +88 -0
  401. package/docs/dw_system/Logger.md +263 -0
  402. package/docs/dw_system/OrganizationPreferences.md +18 -0
  403. package/docs/dw_system/Pipeline.md +73 -0
  404. package/docs/dw_system/PipelineDictionary.md +16 -0
  405. package/docs/dw_system/RESTErrorResponse.md +66 -0
  406. package/docs/dw_system/RESTResponseMgr.md +258 -0
  407. package/docs/dw_system/RESTSuccessResponse.md +39 -0
  408. package/docs/dw_system/RemoteInclude.md +74 -0
  409. package/docs/dw_system/Request.md +839 -0
  410. package/docs/dw_system/RequestHooks.md +59 -0
  411. package/docs/dw_system/Response.md +318 -0
  412. package/docs/dw_system/SearchStatus.md +91 -0
  413. package/docs/dw_system/Session.md +476 -0
  414. package/docs/dw_system/Site.md +567 -0
  415. package/docs/dw_system/SitePreferences.md +49 -0
  416. package/docs/dw_system/Status.md +273 -0
  417. package/docs/dw_system/StatusItem.md +273 -0
  418. package/docs/dw_system/System.md +182 -0
  419. package/docs/dw_system/Transaction.md +84 -0
  420. package/docs/dw_util/ArrayList.md +50 -0
  421. package/docs/dw_util/Assert.md +391 -0
  422. package/docs/dw_util/BigInteger.md +326 -0
  423. package/docs/dw_util/Bytes.md +246 -0
  424. package/docs/dw_util/Calendar.md +663 -0
  425. package/docs/dw_util/Collection.md +338 -0
  426. package/docs/dw_util/Currency.md +163 -0
  427. package/docs/dw_util/DateUtils.md +86 -0
  428. package/docs/dw_util/Decimal.md +438 -0
  429. package/docs/dw_util/FilteringCollection.md +87 -0
  430. package/docs/dw_util/Geolocation.md +271 -0
  431. package/docs/dw_util/HashMap.md +43 -0
  432. package/docs/dw_util/HashSet.md +46 -0
  433. package/docs/dw_util/Iterator.md +97 -0
  434. package/docs/dw_util/LinkedHashMap.md +43 -0
  435. package/docs/dw_util/LinkedHashSet.md +46 -0
  436. package/docs/dw_util/List.md +519 -0
  437. package/docs/dw_util/Locale.md +267 -0
  438. package/docs/dw_util/Map.md +313 -0
  439. package/docs/dw_util/MapEntry.md +70 -0
  440. package/docs/dw_util/MappingKey.md +76 -0
  441. package/docs/dw_util/MappingMgr.md +122 -0
  442. package/docs/dw_util/PropertyComparator.md +51 -0
  443. package/docs/dw_util/SecureEncoder.md +350 -0
  444. package/docs/dw_util/SecureFilter.md +350 -0
  445. package/docs/dw_util/SeekableIterator.md +176 -0
  446. package/docs/dw_util/Set.md +19 -0
  447. package/docs/dw_util/SortedMap.md +148 -0
  448. package/docs/dw_util/SortedSet.md +151 -0
  449. package/docs/dw_util/StringUtils.md +717 -0
  450. package/docs/dw_util/Template.md +88 -0
  451. package/docs/dw_util/UUIDUtils.md +38 -0
  452. package/docs/dw_value/EnumValue.md +92 -0
  453. package/docs/dw_value/MimeEncodedText.md +103 -0
  454. package/docs/dw_value/Money.md +604 -0
  455. package/docs/dw_value/Quantity.md +376 -0
  456. package/docs/dw_web/CSRFProtection.md +83 -0
  457. package/docs/dw_web/ClickStream.md +157 -0
  458. package/docs/dw_web/ClickStreamEntry.md +289 -0
  459. package/docs/dw_web/Cookie.md +390 -0
  460. package/docs/dw_web/Cookies.md +46 -0
  461. package/docs/dw_web/Form.md +74 -0
  462. package/docs/dw_web/FormAction.md +199 -0
  463. package/docs/dw_web/FormElement.md +220 -0
  464. package/docs/dw_web/FormElementValidationResult.md +157 -0
  465. package/docs/dw_web/FormField.md +603 -0
  466. package/docs/dw_web/FormFieldOption.md +238 -0
  467. package/docs/dw_web/FormFieldOptions.md +42 -0
  468. package/docs/dw_web/FormGroup.md +199 -0
  469. package/docs/dw_web/FormList.md +126 -0
  470. package/docs/dw_web/FormListItem.md +48 -0
  471. package/docs/dw_web/Forms.md +16 -0
  472. package/docs/dw_web/HttpParameter.md +513 -0
  473. package/docs/dw_web/HttpParameterMap.md +185 -0
  474. package/docs/dw_web/LoopIterator.md +261 -0
  475. package/docs/dw_web/PageMetaData.md +230 -0
  476. package/docs/dw_web/PageMetaTag.md +142 -0
  477. package/docs/dw_web/PagingModel.md +365 -0
  478. package/docs/dw_web/Resource.md +126 -0
  479. package/docs/dw_web/URL.md +213 -0
  480. package/docs/dw_web/URLAction.md +26 -0
  481. package/docs/dw_web/URLParameter.md +22 -0
  482. package/docs/dw_web/URLRedirect.md +71 -0
  483. package/docs/dw_web/URLRedirectMgr.md +73 -0
  484. package/docs/dw_web/URLUtils.md +1246 -0
  485. package/package.json +43 -0
  486. package/scripts/convert-docs.js +617 -0
  487. package/src/best-practices-client.ts +243 -0
  488. package/src/cache.ts +291 -0
  489. package/src/config.ts +77 -0
  490. package/src/docs-client.ts +540 -0
  491. package/src/index.ts +22 -0
  492. package/src/log-client.ts +260 -0
  493. package/src/main.ts +133 -0
  494. package/src/server.ts +614 -0
  495. package/src/types.ts +83 -0
  496. package/src/utils.ts +103 -0
  497. package/tsconfig.json +21 -0
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2025, SFCC Development MCP Server
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,338 @@
1
+ # SFCC Development MCP Server
2
+
3
+ An MCP (Model Context Protocol) server that provides comprehensive access to Salesforce B2C Commerce Cloud development features. This allows AI agents to assist with SFCC development tasks including log analysis, debugging, monitoring, and **SFCC documentation querying**.
4
+
5
+ ## Features
6
+
7
+ ### SFCC Best Practices Guides
8
+ - **Get Available Guides**: List all available SFCC best practice guides covering OCAPI hooks, SCAPI hooks, SFRA controllers, and custom SCAPI endpoints
9
+ - **Get Complete Guide**: Retrieve comprehensive best practice guides with structured content for specific SFCC development areas
10
+ - **Search Best Practices**: Search across all best practice guides for specific terms, concepts, or patterns
11
+ - **Get Hook Reference**: Access detailed hook reference tables for OCAPI and SCAPI hooks with endpoints and extension points
12
+
13
+ ### SFCC Documentation Querying
14
+ - **Get Class Information**: Retrieve detailed information about any SFCC class including properties, methods, and descriptions
15
+ - **Search Classes**: Find SFCC classes by name with partial matching
16
+ - **Get Class Methods**: List all methods for a specific SFCC class with signatures
17
+ - **Get Class Properties**: List all properties for a specific SFCC class with types and modifiers
18
+ - **Search Methods**: Find methods across all SFCC classes by name
19
+ - **List All Classes**: Get a complete list of available SFCC classes
20
+ - **Get Raw Documentation**: Access the complete Markdown documentation for any class
21
+
22
+ ### Log Analysis & Monitoring
23
+ - **Get Latest Errors**: Retrieve the most recent error messages from SFCC logs
24
+ - **Get Latest Warnings**: Fetch recent warning messages
25
+ - **Get Latest Info**: Access recent info-level log entries
26
+ - **Summarize Logs**: Get an overview of log activity with error counts and key issues
27
+ - **Search Logs**: Search for specific patterns across log files
28
+ - **List Log Files**: View available log files with metadata
29
+
30
+ ## Installation
31
+
32
+ 1. Clone this repository
33
+ 2. Install dependencies:
34
+ ```bash
35
+ npm install
36
+ ```
37
+ 3. Build the TypeScript code:
38
+ ```bash
39
+ npm run build
40
+ ```
41
+
42
+ ## Configuration
43
+
44
+ ### Using dw.json (Recommended)
45
+
46
+ The server supports the standard SFCC `dw.json` configuration format used by Commerce Cloud development tools. Create a `dw.json` file in your project root:
47
+
48
+ ```json
49
+ {
50
+ "hostname": "your-instance.sandbox.us01.dx.commercecloud.salesforce.com",
51
+ "username": "your-username",
52
+ "password": "your-password",
53
+ "client-id": "your-client-id",
54
+ "client-secret": "your-client-secret",
55
+ "code-version": "version1"
56
+ }
57
+ ```
58
+
59
+ **Required fields:**
60
+ - `hostname`: Your SFCC instance hostname
61
+ - `username`: Your SFCC username
62
+ - `password`: Your SFCC password
63
+
64
+ **Optional fields:**
65
+ - `client-id`: OAuth client ID (for API access)
66
+ - `client-secret`: OAuth client secret (for API access)
67
+ - `code-version`: Code version to use
68
+
69
+ ### Using Environment Variables
70
+
71
+ Alternatively, you can configure the server using environment variables:
72
+
73
+ ```bash
74
+ export SFCC_HOSTNAME="your-instance.sandbox.us01.dx.commercecloud.salesforce.com"
75
+ export SFCC_USERNAME="your-username"
76
+ export SFCC_PASSWORD="your-password"
77
+ export SFCC_CLIENT_ID="your-client-id"
78
+ export SFCC_CLIENT_SECRET="your-client-secret"
79
+ export SFCC_SITE_ID="RefArch"
80
+ ```
81
+
82
+ ## Usage
83
+
84
+ ### Launch Parameters and Command Line Options
85
+
86
+ The server supports several command line parameters to customize its behavior:
87
+
88
+ #### `--dw-json <path>`
89
+
90
+ Specify a custom path to your `dw.json` configuration file:
91
+
92
+ ```bash
93
+ # Using npm with custom dw.json path
94
+ npm start -- --dw-json /path/to/your/dw.json
95
+
96
+ # Using npm with relative path
97
+ npm start -- --dw-json ./config/dw.json
98
+
99
+ # Using node directly
100
+ node dist/main.js --dw-json /path/to/your/dw.json
101
+ ```
102
+
103
+ #### Configuration Loading Priority
104
+
105
+ The server loads configuration in the following order of preference:
106
+
107
+ 1. **Command line `--dw-json` argument** (highest priority)
108
+ - Allows you to specify a custom path to your dw.json file
109
+ - Useful for different environments or project configurations
110
+
111
+ 2. **`./dw.json` file in current directory**
112
+ - Automatically detected if present in the working directory
113
+ - Standard SFCC development workflow
114
+
115
+ 3. **Environment variables** (lowest priority)
116
+ - Falls back to environment variables if no dw.json is found
117
+ - See the "Using Environment Variables" section below
118
+
119
+ ### Starting the Server
120
+
121
+ ```bash
122
+ # Basic start (uses ./dw.json or environment variables)
123
+ npm start
124
+
125
+ # Start with custom dw.json file
126
+ npm start -- --dw-json /path/to/custom/dw.json
127
+
128
+ # Or directly with node
129
+ node dist/main.js
130
+
131
+ # Or with custom configuration
132
+ node dist/main.js --dw-json ./config/production.json
133
+ ```
134
+
135
+ ### Using with npx
136
+
137
+ You can also run the server directly using npx without installing it locally:
138
+
139
+ ```bash
140
+ # Run with npx (uses ./dw.json or environment variables)
141
+ npx sfcc-dev-mcp
142
+
143
+ # Run with npx and custom dw.json file
144
+ npx sfcc-dev-mcp --dw-json /path/to/custom/dw.json
145
+
146
+ # Run with npx and relative path
147
+ npx sfcc-dev-mcp --dw-json ./config/dw.json
148
+ ```
149
+
150
+ **Note:** When using npx, make sure your `dw.json` file is in the current working directory or specify the full path using the `--dw-json` parameter.
151
+
152
+ ### MCP Client Configuration
153
+
154
+ Add this server to your MCP client configuration. For example, in Claude Desktop's config:
155
+
156
+ ```json
157
+ {
158
+ "mcpServers": {
159
+ "sfcc-dev": {
160
+ "command": "node",
161
+ "args": ["/path/to/sfcc-dev-mcp/dist/main.js"]
162
+ }
163
+ }
164
+ }
165
+ ```
166
+
167
+ ## Available Tools
168
+
169
+ ### SFCC Documentation Tools
170
+
171
+ 1. **`get_sfcc_class_info`** - Get comprehensive information about an SFCC class
172
+ ```json
173
+ {
174
+ "className": "Catalog"
175
+ }
176
+ ```
177
+
178
+ 2. **`search_sfcc_classes`** - Search for classes by name
179
+ ```json
180
+ {
181
+ "query": "product"
182
+ }
183
+ ```
184
+
185
+ 3. **`get_sfcc_class_methods`** - Get all methods for a class
186
+ ```json
187
+ {
188
+ "className": "dw.catalog.Product"
189
+ }
190
+ ```
191
+
192
+ 4. **`get_sfcc_class_properties`** - Get all properties for a class
193
+ ```json
194
+ {
195
+ "className": "dw.catalog.Catalog"
196
+ }
197
+ ```
198
+
199
+ 5. **`search_sfcc_methods`** - Find methods across all classes
200
+ ```json
201
+ {
202
+ "methodName": "getPrice"
203
+ }
204
+ ```
205
+
206
+ 6. **`list_sfcc_classes`** - List all available SFCC classes
207
+
208
+ 7. **`get_sfcc_class_documentation`** - Get raw documentation
209
+ ```json
210
+ {
211
+ "className": "dw.catalog.Product"
212
+ }
213
+ ```
214
+
215
+ ### SFCC Best Practices Tools
216
+
217
+ 1. **`get_available_best_practice_guides`** - List all available best practice guides
218
+ ```json
219
+ {}
220
+ ```
221
+
222
+ 2. **`get_best_practice_guide`** - Get a complete best practice guide
223
+ ```json
224
+ {
225
+ "guideName": "sfra_controllers"
226
+ }
227
+ ```
228
+
229
+ 3. **`search_best_practices`** - Search across all best practice guides
230
+ ```json
231
+ {
232
+ "query": "validation"
233
+ }
234
+ ```
235
+
236
+ 4. **`get_hook_reference`** - Get hook reference tables for OCAPI/SCAPI
237
+ ```json
238
+ {
239
+ "guideName": "ocapi_hooks"
240
+ }
241
+ ```
242
+
243
+ ### Log Analysis Tools
244
+
245
+ 1. **`get_latest_errors`** - Get recent error messages
246
+ 2. **`get_latest_warnings`** - Get recent warning messages
247
+ 3. **`get_latest_info`** - Get recent info messages
248
+ 4. **`summarize_logs`** - Get log summary with counts
249
+ 5. **`search_logs`** - Search for patterns in logs
250
+ 6. **`list_log_files`** - List available log files
251
+
252
+ ## Example AI Assistant Interactions
253
+
254
+ With this MCP server, AI assistants can now answer questions like:
255
+
256
+ **"How does the Catalog class work in SFCC?"**
257
+ - The assistant queries `get_sfcc_class_info` for the Catalog class
258
+ - Gets back structured information about properties (description, displayName, ID, root) and methods (getDescription, getDisplayName, etc.)
259
+ - Provides a comprehensive explanation of the class functionality
260
+
261
+ **"Find all classes related to products"**
262
+ - The assistant uses `search_sfcc_classes` with query "product"
263
+ - Returns classes like `dw.catalog.Product`, `dw.catalog.ProductMgr`, `dw.catalog.ProductOption`, etc.
264
+
265
+ **"What methods are available for managing customers?"**
266
+ - The assistant calls `search_sfcc_methods` with "customer"
267
+ - Gets back customer-related methods from multiple classes across the SFCC API
268
+
269
+ **"How do I implement SFRA controller extensions properly?"**
270
+ - The assistant uses `get_best_practice_guide` with "sfra_controllers"
271
+ - Returns comprehensive best practices including server.append(), server.prepend(), and server.replace() patterns
272
+ - Provides code examples and architectural guidance for SFRA development
273
+
274
+ **"What are the security best practices for OCAPI hooks?"**
275
+ - The assistant calls `search_best_practices` with query "security"
276
+ - Finds security-related content across all best practice guides
277
+ - Returns specific guidance on input validation, authorization, and data integrity
278
+
279
+ **"Show me all available SCAPI hook extension points"**
280
+ - The assistant uses `get_hook_reference` with "scapi_hooks"
281
+ - Returns comprehensive tables of all SCAPI hook endpoints and their available extension points
282
+ - Provides structured reference for implementing custom hook logic
283
+
284
+ ## Best Practices Coverage
285
+
286
+ The server includes comprehensive best practices guides for all major SFCC development areas:
287
+ - **OCAPI Hooks** - Legacy API extension patterns and implementation guidance
288
+ - **SCAPI Hooks** - Modern API hooks with transactional integrity and performance considerations
289
+ - **SFRA Controllers** - Storefront controller patterns, middleware chains, and extension strategies
290
+ - **Custom SCAPI Endpoints** - Three-pillar architecture for building new API endpoints
291
+
292
+ ## Documentation Coverage
293
+
294
+ The server includes comprehensive documentation for all SFCC packages:
295
+ - `dw.campaign` - Campaign and promotion management
296
+ - `dw.catalog` - Product and catalog management
297
+ - `dw.content` - Content management
298
+ - `dw.customer` - Customer management
299
+ - `dw.order` - Order processing
300
+ - `dw.system` - System utilities
301
+ - `dw.web` - Web framework
302
+ - And many more...
303
+
304
+ ## Security Notes
305
+
306
+ - Store your `dw.json` file securely and never commit it to version control
307
+ - Add `dw.json` to your `.gitignore` file
308
+ - Use environment variables in production environments
309
+ - Ensure your SFCC credentials have appropriate permissions
310
+
311
+ ## Development
312
+
313
+ ### Building from Source
314
+
315
+ ```bash
316
+ npm run build
317
+ ```
318
+
319
+ ### Running Tests
320
+
321
+ ```bash
322
+ npm test
323
+ ```
324
+
325
+ ### Documentation Generation
326
+
327
+ The SFCC documentation is automatically converted from the official SFCC documentation using the included scraping script:
328
+
329
+ ```bash
330
+ # Convert SFCC documentation (with rate limiting)
331
+ node scripts/convert-docs.js
332
+
333
+ # Test mode (limited conversion)
334
+ node scripts/convert-docs.js --test
335
+
336
+ # Conservative rate limiting
337
+ node scripts/convert-docs.js --slow
338
+ ```
@@ -0,0 +1,55 @@
1
+ /**
2
+ * SFCC Best Practices Client
3
+ *
4
+ * Provides access to SFCC development best practices documentation including
5
+ * OCAPI hooks, SCAPI hooks, SCAPI custom endpoints, and SFRA controllers.
6
+ */
7
+ export interface BestPracticeGuide {
8
+ title: string;
9
+ description: string;
10
+ sections: string[];
11
+ content: string;
12
+ }
13
+ /**
14
+ * Client for accessing SFCC best practices documentation
15
+ */
16
+ export declare class SFCCBestPracticesClient {
17
+ private cache;
18
+ private docsPath;
19
+ constructor();
20
+ /**
21
+ * Get all available best practice guides
22
+ */
23
+ getAvailableGuides(): Promise<Array<{
24
+ name: string;
25
+ title: string;
26
+ description: string;
27
+ }>>;
28
+ /**
29
+ * Get a specific best practice guide
30
+ */
31
+ getBestPracticeGuide(guideName: string): Promise<BestPracticeGuide | null>;
32
+ /**
33
+ * Search across all best practices for specific terms
34
+ */
35
+ searchBestPractices(query: string): Promise<Array<{
36
+ guide: string;
37
+ title: string;
38
+ matches: Array<{
39
+ section: string;
40
+ content: string;
41
+ }>;
42
+ }>>;
43
+ /**
44
+ * Get hook reference tables for OCAPI/SCAPI hooks
45
+ */
46
+ getHookReference(guideName: string): Promise<Array<{
47
+ category: string;
48
+ hooks: Array<{
49
+ endpoint: string;
50
+ hookPoints: string[];
51
+ signature?: string;
52
+ }>;
53
+ }>>;
54
+ }
55
+ //# sourceMappingURL=best-practices-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"best-practices-client.d.ts","sourceRoot":"","sources":["../src/best-practices-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,QAAQ,CAAS;;IAWzB;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IAgC9F;;OAEG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAyChF;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QACtD,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,KAAK,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAC,CAAC,CAAC;KACpD,CAAC,CAAC;IAiDH;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QACvD,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,KAAK,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAC,CAAC,CAAC;KAC5E,CAAC,CAAC;CAkEJ"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * SFCC Best Practices Client
3
+ *
4
+ * Provides access to SFCC development best practices documentation including
5
+ * OCAPI hooks, SCAPI hooks, SCAPI custom endpoints, and SFRA controllers.
6
+ */
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ import { CacheManager } from './cache.js';
11
+ /**
12
+ * Client for accessing SFCC best practices documentation
13
+ */
14
+ export class SFCCBestPracticesClient {
15
+ cache;
16
+ docsPath;
17
+ constructor() {
18
+ this.cache = new CacheManager();
19
+ // ES module compatible way to get __dirname
20
+ const __filename = fileURLToPath(import.meta.url);
21
+ const __dirname = path.dirname(__filename);
22
+ this.docsPath = path.join(__dirname, '..', 'docs', 'best-practices');
23
+ }
24
+ /**
25
+ * Get all available best practice guides
26
+ */
27
+ async getAvailableGuides() {
28
+ const cacheKey = 'best-practices:available-guides';
29
+ const cached = this.cache.getSearchResults(cacheKey);
30
+ if (cached)
31
+ return cached;
32
+ const guides = [
33
+ {
34
+ name: 'ocapi_hooks',
35
+ title: 'OCAPI Hooks Best Practices',
36
+ description: 'Best practices for implementing OCAPI hooks in Salesforce B2C Commerce Cloud'
37
+ },
38
+ {
39
+ name: 'scapi_hooks',
40
+ title: 'SCAPI Hooks Best Practices',
41
+ description: 'Essential best practices for implementing SCAPI hooks with AI development assistance'
42
+ },
43
+ {
44
+ name: 'scapi_custom_endpoint',
45
+ title: 'Custom SCAPI Endpoint Best Practices',
46
+ description: 'Best practices for creating custom SCAPI endpoints in B2C Commerce Cloud'
47
+ },
48
+ {
49
+ name: 'sfra_controllers',
50
+ title: 'SFRA Controllers Best Practices',
51
+ description: 'Best practices and code patterns for developing SFRA controllers'
52
+ }
53
+ ];
54
+ this.cache.setSearchResults(cacheKey, guides);
55
+ return guides;
56
+ }
57
+ /**
58
+ * Get a specific best practice guide
59
+ */
60
+ async getBestPracticeGuide(guideName) {
61
+ const cacheKey = `best-practices:guide:${guideName}`;
62
+ const cached = this.cache.getFileContent(cacheKey);
63
+ if (cached)
64
+ return JSON.parse(cached);
65
+ try {
66
+ const filePath = path.join(this.docsPath, `${guideName}.md`);
67
+ const content = await fs.readFile(filePath, 'utf-8');
68
+ const lines = content.split('\n');
69
+ const title = lines.find(line => line.startsWith('#'))?.replace('#', '').trim() || guideName;
70
+ // Extract sections (## headers)
71
+ const sections = lines
72
+ .filter(line => line.startsWith('##'))
73
+ .map(line => line.replace('##', '').trim());
74
+ // Extract description (first paragraph after title)
75
+ const descriptionStart = lines.findIndex(line => line.startsWith('#')) + 1;
76
+ const descriptionEnd = lines.findIndex((line, index) => index > descriptionStart && (line.startsWith('#') || line.trim() === ''));
77
+ const description = lines
78
+ .slice(descriptionStart, descriptionEnd > -1 ? descriptionEnd : descriptionStart + 3)
79
+ .join(' ')
80
+ .trim();
81
+ const guide = {
82
+ title,
83
+ description,
84
+ sections,
85
+ content
86
+ };
87
+ this.cache.setFileContent(cacheKey, JSON.stringify(guide));
88
+ return guide;
89
+ }
90
+ catch (error) {
91
+ console.error(`Error reading best practice guide ${guideName}:`, error);
92
+ return null;
93
+ }
94
+ }
95
+ /**
96
+ * Search across all best practices for specific terms
97
+ */
98
+ async searchBestPractices(query) {
99
+ const cacheKey = `best-practices:search:${query.toLowerCase()}`;
100
+ const cached = this.cache.getSearchResults(cacheKey);
101
+ if (cached)
102
+ return cached;
103
+ const guides = await this.getAvailableGuides();
104
+ const results = [];
105
+ for (const guide of guides) {
106
+ const guideContent = await this.getBestPracticeGuide(guide.name);
107
+ if (!guideContent)
108
+ continue;
109
+ const matches = [];
110
+ const lines = guideContent.content.split('\n');
111
+ let currentSection = '';
112
+ for (let i = 0; i < lines.length; i++) {
113
+ const line = lines[i];
114
+ if (line.startsWith('##')) {
115
+ currentSection = line.replace('##', '').trim();
116
+ }
117
+ if (line.toLowerCase().includes(query.toLowerCase())) {
118
+ // Get context around the match
119
+ const start = Math.max(0, i - 2);
120
+ const end = Math.min(lines.length, i + 3);
121
+ const context = lines.slice(start, end).join('\n');
122
+ matches.push({
123
+ section: currentSection || 'Introduction',
124
+ content: context
125
+ });
126
+ }
127
+ }
128
+ if (matches.length > 0) {
129
+ results.push({
130
+ guide: guide.name,
131
+ title: guide.title,
132
+ matches
133
+ });
134
+ }
135
+ }
136
+ this.cache.setSearchResults(cacheKey, results);
137
+ return results;
138
+ }
139
+ /**
140
+ * Get hook reference tables for OCAPI/SCAPI hooks
141
+ */
142
+ async getHookReference(guideName) {
143
+ if (!guideName.includes('hooks'))
144
+ return [];
145
+ const cacheKey = `best-practices:hook-reference:${guideName}`;
146
+ const cached = this.cache.getSearchResults(cacheKey);
147
+ if (cached)
148
+ return cached;
149
+ const guide = await this.getBestPracticeGuide(guideName);
150
+ if (!guide)
151
+ return [];
152
+ const reference = [];
153
+ const lines = guide.content.split('\n');
154
+ let currentCategory = '';
155
+ let inTable = false;
156
+ let hooks = [];
157
+ for (const line of lines) {
158
+ // Look for hook reference sections
159
+ if (line.match(/^###?\s+(Shop API Hooks|Data API Hooks|Shopper.*Hooks|.*API Hooks)/i)) {
160
+ if (currentCategory && hooks.length > 0) {
161
+ reference.push({ category: currentCategory, hooks: [...hooks] });
162
+ }
163
+ currentCategory = line.replace(/^#+\s*/, '');
164
+ hooks = [];
165
+ inTable = false;
166
+ }
167
+ // Detect table headers
168
+ if (line.includes('API Endpoint') && line.includes('Hook')) {
169
+ inTable = true;
170
+ continue;
171
+ }
172
+ // Skip separator line
173
+ if (line.match(/^\|[\s\-\|]+\|$/)) {
174
+ continue;
175
+ }
176
+ // Parse table rows
177
+ if (inTable && line.startsWith('|') && !line.includes('**')) {
178
+ const parts = line.split('|').map(p => p.trim()).filter(p => p);
179
+ if (parts.length >= 2) {
180
+ const endpoint = parts[0].replace(/`/g, '');
181
+ const hookPoints = parts[1].split(',').map(h => h.replace(/`/g, '').trim());
182
+ const signature = parts[2] ? parts[2].replace(/`/g, '') : undefined;
183
+ if (endpoint && hookPoints.length > 0) {
184
+ hooks.push({ endpoint, hookPoints, signature });
185
+ }
186
+ }
187
+ }
188
+ // End table when we hit a new section
189
+ if (inTable && line.startsWith('#')) {
190
+ inTable = false;
191
+ }
192
+ }
193
+ // Add last category
194
+ if (currentCategory && hooks.length > 0) {
195
+ reference.push({ category: currentCategory, hooks });
196
+ }
197
+ this.cache.setSearchResults(cacheKey, reference);
198
+ return reference;
199
+ }
200
+ }
201
+ //# sourceMappingURL=best-practices-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"best-practices-client.js","sourceRoot":"","sources":["../src/best-practices-client.ts"],"names":[],"mappings":"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"}