@wix/web5-core 1.56.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 (947) hide show
  1. package/README.md +8 -0
  2. package/dist/cjs/client/clientBundleOverride.js +48 -0
  3. package/dist/cjs/client/clientBundleOverride.js.map +1 -0
  4. package/dist/cjs/client/devEnvironment.js +4 -0
  5. package/dist/cjs/client/devEnvironment.js.map +1 -0
  6. package/dist/cjs/client/loadClientBundle.js +85 -0
  7. package/dist/cjs/client/loadClientBundle.js.map +1 -0
  8. package/dist/cjs/client/wixAuthFetch.js +73 -0
  9. package/dist/cjs/client/wixAuthFetch.js.map +1 -0
  10. package/dist/cjs/clients.js +15 -0
  11. package/dist/cjs/clients.js.map +1 -0
  12. package/dist/cjs/color/colorUtils.js +126 -0
  13. package/dist/cjs/color/colorUtils.js.map +1 -0
  14. package/dist/cjs/component/componentDefinitions/CalloutSectionDefinition.js +67 -0
  15. package/dist/cjs/component/componentDefinitions/CalloutSectionDefinition.js.map +1 -0
  16. package/dist/cjs/component/componentDefinitions/ComparisonSectionDefinition.js +141 -0
  17. package/dist/cjs/component/componentDefinitions/ComparisonSectionDefinition.js.map +1 -0
  18. package/dist/cjs/component/componentDefinitions/CtaBannerSectionDefinition.js +85 -0
  19. package/dist/cjs/component/componentDefinitions/CtaBannerSectionDefinition.js.map +1 -0
  20. package/dist/cjs/component/componentDefinitions/EntitySectionDefinition.js +171 -0
  21. package/dist/cjs/component/componentDefinitions/EntitySectionDefinition.js.map +1 -0
  22. package/dist/cjs/component/componentDefinitions/ErrorSectionDefinition.js +81 -0
  23. package/dist/cjs/component/componentDefinitions/ErrorSectionDefinition.js.map +1 -0
  24. package/dist/cjs/component/componentDefinitions/FallbackSectionDefinition.js +29 -0
  25. package/dist/cjs/component/componentDefinitions/FallbackSectionDefinition.js.map +1 -0
  26. package/dist/cjs/component/componentDefinitions/FeatureCardsSectionDefinition.js +119 -0
  27. package/dist/cjs/component/componentDefinitions/FeatureCardsSectionDefinition.js.map +1 -0
  28. package/dist/cjs/component/componentDefinitions/FeatureSection9PlusDefinition.js +75 -0
  29. package/dist/cjs/component/componentDefinitions/FeatureSection9PlusDefinition.js.map +1 -0
  30. package/dist/cjs/component/componentDefinitions/HeroEntitySectionDefinition.js +124 -0
  31. package/dist/cjs/component/componentDefinitions/HeroEntitySectionDefinition.js.map +1 -0
  32. package/dist/cjs/component/componentDefinitions/HeroSectionDefinition.js +209 -0
  33. package/dist/cjs/component/componentDefinitions/HeroSectionDefinition.js.map +1 -0
  34. package/dist/cjs/component/componentDefinitions/HtmlCommentSectionDefinition.js +19 -0
  35. package/dist/cjs/component/componentDefinitions/HtmlCommentSectionDefinition.js.map +1 -0
  36. package/dist/cjs/component/componentDefinitions/KpiSectionDefinition.js +114 -0
  37. package/dist/cjs/component/componentDefinitions/KpiSectionDefinition.js.map +1 -0
  38. package/dist/cjs/component/componentDefinitions/NextStepsSectionDefinition.js +136 -0
  39. package/dist/cjs/component/componentDefinitions/NextStepsSectionDefinition.js.map +1 -0
  40. package/dist/cjs/component/componentDefinitions/SearchSectionDefinition.js +18 -0
  41. package/dist/cjs/component/componentDefinitions/SearchSectionDefinition.js.map +1 -0
  42. package/dist/cjs/component/componentDefinitions/SkipNodesSectionDefinition.js +20 -0
  43. package/dist/cjs/component/componentDefinitions/SkipNodesSectionDefinition.js.map +1 -0
  44. package/dist/cjs/component/componentDefinitions/TextBlockSectionDefinition.js +65 -0
  45. package/dist/cjs/component/componentDefinitions/TextBlockSectionDefinition.js.map +1 -0
  46. package/dist/cjs/component/componentDefinitions/index.js +48 -0
  47. package/dist/cjs/component/componentDefinitions/index.js.map +1 -0
  48. package/dist/cjs/component/componentDefinitions/listItemsSectionDefinition.js +86 -0
  49. package/dist/cjs/component/componentDefinitions/listItemsSectionDefinition.js.map +1 -0
  50. package/dist/cjs/component/componentDefinitions/parse-utils.js +434 -0
  51. package/dist/cjs/component/componentDefinitions/parse-utils.js.map +1 -0
  52. package/dist/cjs/component/componentDefinitions/specHelpers.js +36 -0
  53. package/dist/cjs/component/componentDefinitions/specHelpers.js.map +1 -0
  54. package/dist/cjs/component/componentParser.js +365 -0
  55. package/dist/cjs/component/componentParser.js.map +1 -0
  56. package/dist/cjs/component/diagnosticTypes.js +30 -0
  57. package/dist/cjs/component/diagnosticTypes.js.map +1 -0
  58. package/dist/cjs/component/parser-types.js +4 -0
  59. package/dist/cjs/component/parser-types.js.map +1 -0
  60. package/dist/cjs/component/section-definition.js +4 -0
  61. package/dist/cjs/component/section-definition.js.map +1 -0
  62. package/dist/cjs/component/types.js +4 -0
  63. package/dist/cjs/component/types.js.map +1 -0
  64. package/dist/cjs/components/placement/PlacementPayloadContext.js +29 -0
  65. package/dist/cjs/components/placement/PlacementPayloadContext.js.map +1 -0
  66. package/dist/cjs/components/placement/PlacementResponseRenderer.css +269 -0
  67. package/dist/cjs/components/placement/PlacementResponseRenderer.js +259 -0
  68. package/dist/cjs/components/placement/PlacementResponseRenderer.js.map +1 -0
  69. package/dist/cjs/components/placement/buildPlacementDependencies.js +214 -0
  70. package/dist/cjs/components/placement/buildPlacementDependencies.js.map +1 -0
  71. package/dist/cjs/components/ui/BottomContainer.js +26 -0
  72. package/dist/cjs/components/ui/BottomContainer.js.map +1 -0
  73. package/dist/cjs/components/ui/CalloutBlock.js +156 -0
  74. package/dist/cjs/components/ui/CalloutBlock.js.map +1 -0
  75. package/dist/cjs/components/ui/Disclaimer.css +35 -0
  76. package/dist/cjs/components/ui/Disclaimer.js +56 -0
  77. package/dist/cjs/components/ui/Disclaimer.js.map +1 -0
  78. package/dist/cjs/components/ui/FeedbackBar.css +267 -0
  79. package/dist/cjs/components/ui/FeedbackBar.js +417 -0
  80. package/dist/cjs/components/ui/FeedbackBar.js.map +1 -0
  81. package/dist/cjs/components/ui/Loader.js +73 -0
  82. package/dist/cjs/components/ui/Loader.js.map +1 -0
  83. package/dist/cjs/components/ui/MarkdownText.js +419 -0
  84. package/dist/cjs/components/ui/MarkdownText.js.map +1 -0
  85. package/dist/cjs/components/ui/OptimizedImage.js +414 -0
  86. package/dist/cjs/components/ui/OptimizedImage.js.map +1 -0
  87. package/dist/cjs/components/ui/PlacementLoader.css +101 -0
  88. package/dist/cjs/components/ui/PlacementLoader.js +62 -0
  89. package/dist/cjs/components/ui/PlacementLoader.js.map +1 -0
  90. package/dist/cjs/components/ui/PromptEntryEmptyState.css +172 -0
  91. package/dist/cjs/components/ui/PromptEntryEmptyState.js +96 -0
  92. package/dist/cjs/components/ui/PromptEntryEmptyState.js.map +1 -0
  93. package/dist/cjs/components/ui/SearchSection.css +538 -0
  94. package/dist/cjs/components/ui/SearchSection.js +550 -0
  95. package/dist/cjs/components/ui/SearchSection.js.map +1 -0
  96. package/dist/cjs/components/ui/SectionSkeleton.css +109 -0
  97. package/dist/cjs/components/ui/SectionSkeleton.js +190 -0
  98. package/dist/cjs/components/ui/SectionSkeleton.js.map +1 -0
  99. package/dist/cjs/components/ui/SmartIcon.js +122 -0
  100. package/dist/cjs/components/ui/SmartIcon.js.map +1 -0
  101. package/dist/cjs/components/ui/UnifiedLink.js +169 -0
  102. package/dist/cjs/components/ui/UnifiedLink.js.map +1 -0
  103. package/dist/cjs/components/ui/UserQuery.js +348 -0
  104. package/dist/cjs/components/ui/UserQuery.js.map +1 -0
  105. package/dist/cjs/components/ui/icons/ArrowTopRightIcon.js +37 -0
  106. package/dist/cjs/components/ui/icons/ArrowTopRightIcon.js.map +1 -0
  107. package/dist/cjs/components/ui/icons/ArrowUpIcon.js +61 -0
  108. package/dist/cjs/components/ui/icons/ArrowUpIcon.js.map +1 -0
  109. package/dist/cjs/components/ui/icons/CheckIcon.js +37 -0
  110. package/dist/cjs/components/ui/icons/CheckIcon.js.map +1 -0
  111. package/dist/cjs/components/ui/icons/CommentIcon.js +34 -0
  112. package/dist/cjs/components/ui/icons/CommentIcon.js.map +1 -0
  113. package/dist/cjs/components/ui/icons/PlusIcon.js +51 -0
  114. package/dist/cjs/components/ui/icons/PlusIcon.js.map +1 -0
  115. package/dist/cjs/components/ui/icons/RedoIcon.js +51 -0
  116. package/dist/cjs/components/ui/icons/RedoIcon.js.map +1 -0
  117. package/dist/cjs/components/ui/icons/ShareIcon.js +81 -0
  118. package/dist/cjs/components/ui/icons/ShareIcon.js.map +1 -0
  119. package/dist/cjs/components/ui/icons/UndoIcon.js +51 -0
  120. package/dist/cjs/components/ui/icons/UndoIcon.js.map +1 -0
  121. package/dist/cjs/components/ui/table.js +159 -0
  122. package/dist/cjs/components/ui/table.js.map +1 -0
  123. package/dist/cjs/context/ChipsContext.js +12 -0
  124. package/dist/cjs/context/ChipsContext.js.map +1 -0
  125. package/dist/cjs/context/ComponentDependenciesContext.js +32 -0
  126. package/dist/cjs/context/ComponentDependenciesContext.js.map +1 -0
  127. package/dist/cjs/entity/defaultExtractor.js +117 -0
  128. package/dist/cjs/entity/defaultExtractor.js.map +1 -0
  129. package/dist/cjs/entity/enrichEntitiesFromPayload.js +39 -0
  130. package/dist/cjs/entity/enrichEntitiesFromPayload.js.map +1 -0
  131. package/dist/cjs/entity/fetchEntityListData.js +78 -0
  132. package/dist/cjs/entity/fetchEntityListData.js.map +1 -0
  133. package/dist/cjs/entity/index.js +41 -0
  134. package/dist/cjs/entity/index.js.map +1 -0
  135. package/dist/cjs/entity/types.js +4 -0
  136. package/dist/cjs/entity/types.js.map +1 -0
  137. package/dist/cjs/errors/conversationErrorTypes.js +56 -0
  138. package/dist/cjs/errors/conversationErrorTypes.js.map +1 -0
  139. package/dist/cjs/errors/errorTemplates.js +86 -0
  140. package/dist/cjs/errors/errorTemplates.js.map +1 -0
  141. package/dist/cjs/errors/index.js +13 -0
  142. package/dist/cjs/errors/index.js.map +1 -0
  143. package/dist/cjs/external-types.d.js +2 -0
  144. package/dist/cjs/external-types.d.js.map +1 -0
  145. package/dist/cjs/featureToggles/FeatureToggleContext.js +44 -0
  146. package/dist/cjs/featureToggles/FeatureToggleContext.js.map +1 -0
  147. package/dist/cjs/hooks/useConversation.js +10 -0
  148. package/dist/cjs/hooks/useConversation.js.map +1 -0
  149. package/dist/cjs/hooks/useDebugImageContext.js +10 -0
  150. package/dist/cjs/hooks/useDebugImageContext.js.map +1 -0
  151. package/dist/cjs/hooks/useEntityTransforms.js +10 -0
  152. package/dist/cjs/hooks/useEntityTransforms.js.map +1 -0
  153. package/dist/cjs/hooks/useMarkdownUtils.js +10 -0
  154. package/dist/cjs/hooks/useMarkdownUtils.js.map +1 -0
  155. package/dist/cjs/hooks/useResolveGenericEntityData.js +10 -0
  156. package/dist/cjs/hooks/useResolveGenericEntityData.js.map +1 -0
  157. package/dist/cjs/hooks/useResolveSearchSpringEntityData.js +146 -0
  158. package/dist/cjs/hooks/useResolveSearchSpringEntityData.js.map +1 -0
  159. package/dist/cjs/hooks/useResolveShopifyEntityData.js +190 -0
  160. package/dist/cjs/hooks/useResolveShopifyEntityData.js.map +1 -0
  161. package/dist/cjs/hooks/useResolvedImageSources.js +160 -0
  162. package/dist/cjs/hooks/useResolvedImageSources.js.map +1 -0
  163. package/dist/cjs/hooks/useWeb5Link.js +10 -0
  164. package/dist/cjs/hooks/useWeb5Link.js.map +1 -0
  165. package/dist/cjs/image/contextualImageTypes.js +4 -0
  166. package/dist/cjs/image/contextualImageTypes.js.map +1 -0
  167. package/dist/cjs/image/imageSearchFilterTypes.js +19 -0
  168. package/dist/cjs/image/imageSearchFilterTypes.js.map +1 -0
  169. package/dist/cjs/image/imageSearchFilters.js +22 -0
  170. package/dist/cjs/image/imageSearchFilters.js.map +1 -0
  171. package/dist/cjs/index.js +285 -0
  172. package/dist/cjs/index.js.map +1 -0
  173. package/dist/cjs/lib/utils.js +33 -0
  174. package/dist/cjs/lib/utils.js.map +1 -0
  175. package/dist/cjs/markdownBlocks.js +645 -0
  176. package/dist/cjs/markdownBlocks.js.map +1 -0
  177. package/dist/cjs/match/astToParts.js +374 -0
  178. package/dist/cjs/match/astToParts.js.map +1 -0
  179. package/dist/cjs/match/extractProps.js +654 -0
  180. package/dist/cjs/match/extractProps.js.map +1 -0
  181. package/dist/cjs/match/index.js +11 -0
  182. package/dist/cjs/match/index.js.map +1 -0
  183. package/dist/cjs/match/matchAllSections.js +34 -0
  184. package/dist/cjs/match/matchAllSections.js.map +1 -0
  185. package/dist/cjs/match/matchMarkdown.js +39 -0
  186. package/dist/cjs/match/matchMarkdown.js.map +1 -0
  187. package/dist/cjs/parts/parts.js +183 -0
  188. package/dist/cjs/parts/parts.js.map +1 -0
  189. package/dist/cjs/patternAnalyzer/conflictDetector.js +103 -0
  190. package/dist/cjs/patternAnalyzer/conflictDetector.js.map +1 -0
  191. package/dist/cjs/patternAnalyzer/index.js +40 -0
  192. package/dist/cjs/patternAnalyzer/index.js.map +1 -0
  193. package/dist/cjs/patternAnalyzer/markdownGenerator.js +347 -0
  194. package/dist/cjs/patternAnalyzer/markdownGenerator.js.map +1 -0
  195. package/dist/cjs/patternAnalyzer/mergeDetector.js +505 -0
  196. package/dist/cjs/patternAnalyzer/mergeDetector.js.map +1 -0
  197. package/dist/cjs/patternAnalyzer/parserValidator.js +56 -0
  198. package/dist/cjs/patternAnalyzer/parserValidator.js.map +1 -0
  199. package/dist/cjs/patternAnalyzer/patternWriter.js +106 -0
  200. package/dist/cjs/patternAnalyzer/patternWriter.js.map +1 -0
  201. package/dist/cjs/patternAnalyzer/run.js +140 -0
  202. package/dist/cjs/patternAnalyzer/run.js.map +1 -0
  203. package/dist/cjs/patternAnalyzer/types.js +4 -0
  204. package/dist/cjs/patternAnalyzer/types.js.map +1 -0
  205. package/dist/cjs/patternValidator/ERROR_MESSAGES.md +110 -0
  206. package/dist/cjs/patternValidator/README.md +757 -0
  207. package/dist/cjs/patternValidator/automaton.js +349 -0
  208. package/dist/cjs/patternValidator/automaton.js.map +1 -0
  209. package/dist/cjs/patternValidator/index.js +196 -0
  210. package/dist/cjs/patternValidator/index.js.map +1 -0
  211. package/dist/cjs/patternValidator/lexer.js +218 -0
  212. package/dist/cjs/patternValidator/lexer.js.map +1 -0
  213. package/dist/cjs/patternValidator/matcher.js +722 -0
  214. package/dist/cjs/patternValidator/matcher.js.map +1 -0
  215. package/dist/cjs/patternValidator/parser.js +533 -0
  216. package/dist/cjs/patternValidator/parser.js.map +1 -0
  217. package/dist/cjs/patternValidator/types.js +4 -0
  218. package/dist/cjs/patternValidator/types.js.map +1 -0
  219. package/dist/cjs/patternValidator/validator.test.js +1277 -0
  220. package/dist/cjs/patternValidator/validator.test.js.map +1 -0
  221. package/dist/cjs/registry/ComponentRegistry.js +438 -0
  222. package/dist/cjs/registry/ComponentRegistry.js.map +1 -0
  223. package/dist/cjs/registry/Intent.js +19 -0
  224. package/dist/cjs/registry/Intent.js.map +1 -0
  225. package/dist/cjs/registry/index.js +9 -0
  226. package/dist/cjs/registry/index.js.map +1 -0
  227. package/dist/cjs/registry/types.js +4 -0
  228. package/dist/cjs/registry/types.js.map +1 -0
  229. package/dist/cjs/services/cart/addToCart.js +147 -0
  230. package/dist/cjs/services/cart/addToCart.js.map +1 -0
  231. package/dist/cjs/services/cart/index.js +7 -0
  232. package/dist/cjs/services/cart/index.js.map +1 -0
  233. package/dist/cjs/services/searchspring/index.js +10 -0
  234. package/dist/cjs/services/searchspring/index.js.map +1 -0
  235. package/dist/cjs/services/searchspring/searchSpringClient.js +49 -0
  236. package/dist/cjs/services/searchspring/searchSpringClient.js.map +1 -0
  237. package/dist/cjs/services/searchspring/transformSSProduct.js +70 -0
  238. package/dist/cjs/services/searchspring/transformSSProduct.js.map +1 -0
  239. package/dist/cjs/services/searchspring/types.js +4 -0
  240. package/dist/cjs/services/searchspring/types.js.map +1 -0
  241. package/dist/cjs/services/shopify/globals.d.js +4 -0
  242. package/dist/cjs/services/shopify/globals.d.js.map +1 -0
  243. package/dist/cjs/services/shopify/index.js +22 -0
  244. package/dist/cjs/services/shopify/index.js.map +1 -0
  245. package/dist/cjs/services/shopify/queries.js +214 -0
  246. package/dist/cjs/services/shopify/queries.js.map +1 -0
  247. package/dist/cjs/services/shopify/resolveStoreDomain.js +28 -0
  248. package/dist/cjs/services/shopify/resolveStoreDomain.js.map +1 -0
  249. package/dist/cjs/services/shopify/shopifyEntityResolver.js +109 -0
  250. package/dist/cjs/services/shopify/shopifyEntityResolver.js.map +1 -0
  251. package/dist/cjs/services/shopify/shopifyStorefrontClient.js +58 -0
  252. package/dist/cjs/services/shopify/shopifyStorefrontClient.js.map +1 -0
  253. package/dist/cjs/services/shopify/transformShopifyEntity.js +137 -0
  254. package/dist/cjs/services/shopify/transformShopifyEntity.js.map +1 -0
  255. package/dist/cjs/services/shopify/types.js +4 -0
  256. package/dist/cjs/services/shopify/types.js.map +1 -0
  257. package/dist/cjs/styles/base-tokens.css +152 -0
  258. package/dist/cjs/styles/base-utilities.css +424 -0
  259. package/dist/cjs/styles/components.css +6 -0
  260. package/dist/cjs/styles/prompt-input-tokens.css +136 -0
  261. package/dist/cjs/styles/tailwind-theme.css +138 -0
  262. package/dist/cjs/test-types.d.js +2 -0
  263. package/dist/cjs/test-types.d.js.map +1 -0
  264. package/dist/cjs/testUtils.js +25 -0
  265. package/dist/cjs/testUtils.js.map +1 -0
  266. package/dist/cjs/types/answerUpdatedEvent.js +20 -0
  267. package/dist/cjs/types/answerUpdatedEvent.js.map +1 -0
  268. package/dist/cjs/types/blog.js +4 -0
  269. package/dist/cjs/types/blog.js.map +1 -0
  270. package/dist/cjs/types/callout.js +6 -0
  271. package/dist/cjs/types/callout.js.map +1 -0
  272. package/dist/cjs/types/dependencies.js +4 -0
  273. package/dist/cjs/types/dependencies.js.map +1 -0
  274. package/dist/cjs/types/entity.js +4 -0
  275. package/dist/cjs/types/entity.js.map +1 -0
  276. package/dist/cjs/types/link-types.js +62 -0
  277. package/dist/cjs/types/link-types.js.map +1 -0
  278. package/dist/cjs/types/page-section.js +4 -0
  279. package/dist/cjs/types/page-section.js.map +1 -0
  280. package/dist/cjs/types/placement.js +4 -0
  281. package/dist/cjs/types/placement.js.map +1 -0
  282. package/dist/cjs/types/redirectEvent.js +27 -0
  283. package/dist/cjs/types/redirectEvent.js.map +1 -0
  284. package/dist/cjs/types/userQueryEvent.js +19 -0
  285. package/dist/cjs/types/userQueryEvent.js.map +1 -0
  286. package/dist/cjs/utils/analyticsEvents.js +91 -0
  287. package/dist/cjs/utils/analyticsEvents.js.map +1 -0
  288. package/dist/cjs/utils/componentTracking.js +90 -0
  289. package/dist/cjs/utils/componentTracking.js.map +1 -0
  290. package/dist/cjs/utils/contentKeywordMatcher.js +56 -0
  291. package/dist/cjs/utils/contentKeywordMatcher.js.map +1 -0
  292. package/dist/cjs/utils/conversationApi.js +52 -0
  293. package/dist/cjs/utils/conversationApi.js.map +1 -0
  294. package/dist/cjs/utils/conversationMode.js +23 -0
  295. package/dist/cjs/utils/conversationMode.js.map +1 -0
  296. package/dist/cjs/utils/diagnosticsCollector.js +58 -0
  297. package/dist/cjs/utils/diagnosticsCollector.js.map +1 -0
  298. package/dist/cjs/utils/entityLinkParser.js +256 -0
  299. package/dist/cjs/utils/entityLinkParser.js.map +1 -0
  300. package/dist/cjs/utils/htmlCommentParser.js +122 -0
  301. package/dist/cjs/utils/htmlCommentParser.js.map +1 -0
  302. package/dist/cjs/utils/image-utils.js +49 -0
  303. package/dist/cjs/utils/image-utils.js.map +1 -0
  304. package/dist/cjs/utils/intentExtractor.js +47 -0
  305. package/dist/cjs/utils/intentExtractor.js.map +1 -0
  306. package/dist/cjs/utils/markdownPreprocessor.js +268 -0
  307. package/dist/cjs/utils/markdownPreprocessor.js.map +1 -0
  308. package/dist/cjs/utils/navigationStack.js +35 -0
  309. package/dist/cjs/utils/navigationStack.js.map +1 -0
  310. package/dist/cjs/utils/nodeMatchers.js +43 -0
  311. package/dist/cjs/utils/nodeMatchers.js.map +1 -0
  312. package/dist/cjs/utils/propsExtractor.js +66 -0
  313. package/dist/cjs/utils/propsExtractor.js.map +1 -0
  314. package/dist/cjs/utils/sessionManager.js +161 -0
  315. package/dist/cjs/utils/sessionManager.js.map +1 -0
  316. package/dist/cjs/utils/unifiedMarkdownParser.js +44 -0
  317. package/dist/cjs/utils/unifiedMarkdownParser.js.map +1 -0
  318. package/dist/cjs/utils/web5LinkValidator.js +56 -0
  319. package/dist/cjs/utils/web5LinkValidator.js.map +1 -0
  320. package/dist/cjs/utils/web5LinkValidator.test.js +115 -0
  321. package/dist/cjs/utils/web5LinkValidator.test.js.map +1 -0
  322. package/dist/esm/client/clientBundleOverride.js +43 -0
  323. package/dist/esm/client/clientBundleOverride.js.map +1 -0
  324. package/dist/esm/client/devEnvironment.js +2 -0
  325. package/dist/esm/client/devEnvironment.js.map +1 -0
  326. package/dist/esm/client/loadClientBundle.js +82 -0
  327. package/dist/esm/client/loadClientBundle.js.map +1 -0
  328. package/dist/esm/client/wixAuthFetch.js +68 -0
  329. package/dist/esm/client/wixAuthFetch.js.map +1 -0
  330. package/dist/esm/clients.js +11 -0
  331. package/dist/esm/clients.js.map +1 -0
  332. package/dist/esm/color/colorUtils.js +118 -0
  333. package/dist/esm/color/colorUtils.js.map +1 -0
  334. package/dist/esm/component/componentDefinitions/CalloutSectionDefinition.js +61 -0
  335. package/dist/esm/component/componentDefinitions/CalloutSectionDefinition.js.map +1 -0
  336. package/dist/esm/component/componentDefinitions/ComparisonSectionDefinition.js +135 -0
  337. package/dist/esm/component/componentDefinitions/ComparisonSectionDefinition.js.map +1 -0
  338. package/dist/esm/component/componentDefinitions/CtaBannerSectionDefinition.js +79 -0
  339. package/dist/esm/component/componentDefinitions/CtaBannerSectionDefinition.js.map +1 -0
  340. package/dist/esm/component/componentDefinitions/EntitySectionDefinition.js +165 -0
  341. package/dist/esm/component/componentDefinitions/EntitySectionDefinition.js.map +1 -0
  342. package/dist/esm/component/componentDefinitions/ErrorSectionDefinition.js +75 -0
  343. package/dist/esm/component/componentDefinitions/ErrorSectionDefinition.js.map +1 -0
  344. package/dist/esm/component/componentDefinitions/FallbackSectionDefinition.js +23 -0
  345. package/dist/esm/component/componentDefinitions/FallbackSectionDefinition.js.map +1 -0
  346. package/dist/esm/component/componentDefinitions/FeatureCardsSectionDefinition.js +113 -0
  347. package/dist/esm/component/componentDefinitions/FeatureCardsSectionDefinition.js.map +1 -0
  348. package/dist/esm/component/componentDefinitions/FeatureSection9PlusDefinition.js +69 -0
  349. package/dist/esm/component/componentDefinitions/FeatureSection9PlusDefinition.js.map +1 -0
  350. package/dist/esm/component/componentDefinitions/HeroEntitySectionDefinition.js +119 -0
  351. package/dist/esm/component/componentDefinitions/HeroEntitySectionDefinition.js.map +1 -0
  352. package/dist/esm/component/componentDefinitions/HeroSectionDefinition.js +203 -0
  353. package/dist/esm/component/componentDefinitions/HeroSectionDefinition.js.map +1 -0
  354. package/dist/esm/component/componentDefinitions/HtmlCommentSectionDefinition.js +13 -0
  355. package/dist/esm/component/componentDefinitions/HtmlCommentSectionDefinition.js.map +1 -0
  356. package/dist/esm/component/componentDefinitions/KpiSectionDefinition.js +108 -0
  357. package/dist/esm/component/componentDefinitions/KpiSectionDefinition.js.map +1 -0
  358. package/dist/esm/component/componentDefinitions/NextStepsSectionDefinition.js +130 -0
  359. package/dist/esm/component/componentDefinitions/NextStepsSectionDefinition.js.map +1 -0
  360. package/dist/esm/component/componentDefinitions/SearchSectionDefinition.js +12 -0
  361. package/dist/esm/component/componentDefinitions/SearchSectionDefinition.js.map +1 -0
  362. package/dist/esm/component/componentDefinitions/SkipNodesSectionDefinition.js +14 -0
  363. package/dist/esm/component/componentDefinitions/SkipNodesSectionDefinition.js.map +1 -0
  364. package/dist/esm/component/componentDefinitions/TextBlockSectionDefinition.js +59 -0
  365. package/dist/esm/component/componentDefinitions/TextBlockSectionDefinition.js.map +1 -0
  366. package/dist/esm/component/componentDefinitions/index.js +45 -0
  367. package/dist/esm/component/componentDefinitions/index.js.map +1 -0
  368. package/dist/esm/component/componentDefinitions/listItemsSectionDefinition.js +80 -0
  369. package/dist/esm/component/componentDefinitions/listItemsSectionDefinition.js.map +1 -0
  370. package/dist/esm/component/componentDefinitions/parse-utils.js +412 -0
  371. package/dist/esm/component/componentDefinitions/parse-utils.js.map +1 -0
  372. package/dist/esm/component/componentDefinitions/specHelpers.js +31 -0
  373. package/dist/esm/component/componentDefinitions/specHelpers.js.map +1 -0
  374. package/dist/esm/component/componentParser.js +358 -0
  375. package/dist/esm/component/componentParser.js.map +1 -0
  376. package/dist/esm/component/diagnosticTypes.js +26 -0
  377. package/dist/esm/component/diagnosticTypes.js.map +1 -0
  378. package/dist/esm/component/parser-types.js +2 -0
  379. package/dist/esm/component/parser-types.js.map +1 -0
  380. package/dist/esm/component/section-definition.js +2 -0
  381. package/dist/esm/component/section-definition.js.map +1 -0
  382. package/dist/esm/component/types.js +2 -0
  383. package/dist/esm/component/types.js.map +1 -0
  384. package/dist/esm/components/placement/PlacementPayloadContext.js +24 -0
  385. package/dist/esm/components/placement/PlacementPayloadContext.js.map +1 -0
  386. package/dist/esm/components/placement/PlacementResponseRenderer.css +269 -0
  387. package/dist/esm/components/placement/PlacementResponseRenderer.js +173 -0
  388. package/dist/esm/components/placement/PlacementResponseRenderer.js.map +1 -0
  389. package/dist/esm/components/placement/buildPlacementDependencies.js +212 -0
  390. package/dist/esm/components/placement/buildPlacementDependencies.js.map +1 -0
  391. package/dist/esm/components/ui/BottomContainer.js +14 -0
  392. package/dist/esm/components/ui/BottomContainer.js.map +1 -0
  393. package/dist/esm/components/ui/CalloutBlock.js +118 -0
  394. package/dist/esm/components/ui/CalloutBlock.js.map +1 -0
  395. package/dist/esm/components/ui/Disclaimer.css +35 -0
  396. package/dist/esm/components/ui/Disclaimer.js +32 -0
  397. package/dist/esm/components/ui/Disclaimer.js.map +1 -0
  398. package/dist/esm/components/ui/FeedbackBar.css +267 -0
  399. package/dist/esm/components/ui/FeedbackBar.js +221 -0
  400. package/dist/esm/components/ui/FeedbackBar.js.map +1 -0
  401. package/dist/esm/components/ui/Loader.js +43 -0
  402. package/dist/esm/components/ui/Loader.js.map +1 -0
  403. package/dist/esm/components/ui/MarkdownText.js +283 -0
  404. package/dist/esm/components/ui/MarkdownText.js.map +1 -0
  405. package/dist/esm/components/ui/OptimizedImage.js +354 -0
  406. package/dist/esm/components/ui/OptimizedImage.js.map +1 -0
  407. package/dist/esm/components/ui/PlacementLoader.css +101 -0
  408. package/dist/esm/components/ui/PlacementLoader.js +28 -0
  409. package/dist/esm/components/ui/PlacementLoader.js.map +1 -0
  410. package/dist/esm/components/ui/PromptEntryEmptyState.css +172 -0
  411. package/dist/esm/components/ui/PromptEntryEmptyState.js +36 -0
  412. package/dist/esm/components/ui/PromptEntryEmptyState.js.map +1 -0
  413. package/dist/esm/components/ui/SearchSection.css +538 -0
  414. package/dist/esm/components/ui/SearchSection.js +317 -0
  415. package/dist/esm/components/ui/SearchSection.js.map +1 -0
  416. package/dist/esm/components/ui/SectionSkeleton.css +109 -0
  417. package/dist/esm/components/ui/SectionSkeleton.js +100 -0
  418. package/dist/esm/components/ui/SectionSkeleton.js.map +1 -0
  419. package/dist/esm/components/ui/SmartIcon.js +91 -0
  420. package/dist/esm/components/ui/SmartIcon.js.map +1 -0
  421. package/dist/esm/components/ui/UnifiedLink.js +105 -0
  422. package/dist/esm/components/ui/UnifiedLink.js.map +1 -0
  423. package/dist/esm/components/ui/UserQuery.js +167 -0
  424. package/dist/esm/components/ui/UserQuery.js.map +1 -0
  425. package/dist/esm/components/ui/icons/ArrowTopRightIcon.js +17 -0
  426. package/dist/esm/components/ui/icons/ArrowTopRightIcon.js.map +1 -0
  427. package/dist/esm/components/ui/icons/ArrowUpIcon.js +29 -0
  428. package/dist/esm/components/ui/icons/ArrowUpIcon.js.map +1 -0
  429. package/dist/esm/components/ui/icons/CheckIcon.js +17 -0
  430. package/dist/esm/components/ui/icons/CheckIcon.js.map +1 -0
  431. package/dist/esm/components/ui/icons/CommentIcon.js +15 -0
  432. package/dist/esm/components/ui/icons/CommentIcon.js.map +1 -0
  433. package/dist/esm/components/ui/icons/PlusIcon.js +25 -0
  434. package/dist/esm/components/ui/icons/PlusIcon.js.map +1 -0
  435. package/dist/esm/components/ui/icons/RedoIcon.js +25 -0
  436. package/dist/esm/components/ui/icons/RedoIcon.js.map +1 -0
  437. package/dist/esm/components/ui/icons/ShareIcon.js +37 -0
  438. package/dist/esm/components/ui/icons/ShareIcon.js.map +1 -0
  439. package/dist/esm/components/ui/icons/UndoIcon.js +25 -0
  440. package/dist/esm/components/ui/icons/UndoIcon.js.map +1 -0
  441. package/dist/esm/components/ui/table.js +92 -0
  442. package/dist/esm/components/ui/table.js.map +1 -0
  443. package/dist/esm/context/ChipsContext.js +7 -0
  444. package/dist/esm/context/ChipsContext.js.map +1 -0
  445. package/dist/esm/context/ComponentDependenciesContext.js +19 -0
  446. package/dist/esm/context/ComponentDependenciesContext.js.map +1 -0
  447. package/dist/esm/entity/defaultExtractor.js +111 -0
  448. package/dist/esm/entity/defaultExtractor.js.map +1 -0
  449. package/dist/esm/entity/enrichEntitiesFromPayload.js +35 -0
  450. package/dist/esm/entity/enrichEntitiesFromPayload.js.map +1 -0
  451. package/dist/esm/entity/fetchEntityListData.js +76 -0
  452. package/dist/esm/entity/fetchEntityListData.js.map +1 -0
  453. package/dist/esm/entity/index.js +29 -0
  454. package/dist/esm/entity/index.js.map +1 -0
  455. package/dist/esm/entity/types.js +2 -0
  456. package/dist/esm/entity/types.js.map +1 -0
  457. package/dist/esm/errors/conversationErrorTypes.js +50 -0
  458. package/dist/esm/errors/conversationErrorTypes.js.map +1 -0
  459. package/dist/esm/errors/errorTemplates.js +81 -0
  460. package/dist/esm/errors/errorTemplates.js.map +1 -0
  461. package/dist/esm/errors/index.js +3 -0
  462. package/dist/esm/errors/index.js.map +1 -0
  463. package/dist/esm/external-types.d.js +2 -0
  464. package/dist/esm/external-types.d.js.map +1 -0
  465. package/dist/esm/featureToggles/FeatureToggleContext.js +30 -0
  466. package/dist/esm/featureToggles/FeatureToggleContext.js.map +1 -0
  467. package/dist/esm/hooks/useConversation.js +6 -0
  468. package/dist/esm/hooks/useConversation.js.map +1 -0
  469. package/dist/esm/hooks/useDebugImageContext.js +6 -0
  470. package/dist/esm/hooks/useDebugImageContext.js.map +1 -0
  471. package/dist/esm/hooks/useEntityTransforms.js +6 -0
  472. package/dist/esm/hooks/useEntityTransforms.js.map +1 -0
  473. package/dist/esm/hooks/useMarkdownUtils.js +6 -0
  474. package/dist/esm/hooks/useMarkdownUtils.js.map +1 -0
  475. package/dist/esm/hooks/useResolveGenericEntityData.js +6 -0
  476. package/dist/esm/hooks/useResolveGenericEntityData.js.map +1 -0
  477. package/dist/esm/hooks/useResolveSearchSpringEntityData.js +146 -0
  478. package/dist/esm/hooks/useResolveSearchSpringEntityData.js.map +1 -0
  479. package/dist/esm/hooks/useResolveShopifyEntityData.js +191 -0
  480. package/dist/esm/hooks/useResolveShopifyEntityData.js.map +1 -0
  481. package/dist/esm/hooks/useResolvedImageSources.js +169 -0
  482. package/dist/esm/hooks/useResolvedImageSources.js.map +1 -0
  483. package/dist/esm/hooks/useWeb5Link.js +6 -0
  484. package/dist/esm/hooks/useWeb5Link.js.map +1 -0
  485. package/dist/esm/image/contextualImageTypes.js +2 -0
  486. package/dist/esm/image/contextualImageTypes.js.map +1 -0
  487. package/dist/esm/image/imageSearchFilterTypes.js +15 -0
  488. package/dist/esm/image/imageSearchFilterTypes.js.map +1 -0
  489. package/dist/esm/image/imageSearchFilters.js +18 -0
  490. package/dist/esm/image/imageSearchFilters.js.map +1 -0
  491. package/dist/esm/index.js +152 -0
  492. package/dist/esm/index.js.map +1 -0
  493. package/dist/esm/lib/utils.js +33 -0
  494. package/dist/esm/lib/utils.js.map +1 -0
  495. package/dist/esm/markdownBlocks.js +641 -0
  496. package/dist/esm/markdownBlocks.js.map +1 -0
  497. package/dist/esm/match/astToParts.js +371 -0
  498. package/dist/esm/match/astToParts.js.map +1 -0
  499. package/dist/esm/match/extractProps.js +634 -0
  500. package/dist/esm/match/extractProps.js.map +1 -0
  501. package/dist/esm/match/index.js +4 -0
  502. package/dist/esm/match/index.js.map +1 -0
  503. package/dist/esm/match/matchAllSections.js +31 -0
  504. package/dist/esm/match/matchAllSections.js.map +1 -0
  505. package/dist/esm/match/matchMarkdown.js +36 -0
  506. package/dist/esm/match/matchMarkdown.js.map +1 -0
  507. package/dist/esm/parts/parts.js +171 -0
  508. package/dist/esm/parts/parts.js.map +1 -0
  509. package/dist/esm/patternAnalyzer/conflictDetector.js +99 -0
  510. package/dist/esm/patternAnalyzer/conflictDetector.js.map +1 -0
  511. package/dist/esm/patternAnalyzer/index.js +36 -0
  512. package/dist/esm/patternAnalyzer/index.js.map +1 -0
  513. package/dist/esm/patternAnalyzer/markdownGenerator.js +344 -0
  514. package/dist/esm/patternAnalyzer/markdownGenerator.js.map +1 -0
  515. package/dist/esm/patternAnalyzer/mergeDetector.js +504 -0
  516. package/dist/esm/patternAnalyzer/mergeDetector.js.map +1 -0
  517. package/dist/esm/patternAnalyzer/parserValidator.js +52 -0
  518. package/dist/esm/patternAnalyzer/parserValidator.js.map +1 -0
  519. package/dist/esm/patternAnalyzer/patternWriter.js +102 -0
  520. package/dist/esm/patternAnalyzer/patternWriter.js.map +1 -0
  521. package/dist/esm/patternAnalyzer/run.js +138 -0
  522. package/dist/esm/patternAnalyzer/run.js.map +1 -0
  523. package/dist/esm/patternAnalyzer/types.js +2 -0
  524. package/dist/esm/patternAnalyzer/types.js.map +1 -0
  525. package/dist/esm/patternValidator/ERROR_MESSAGES.md +110 -0
  526. package/dist/esm/patternValidator/README.md +757 -0
  527. package/dist/esm/patternValidator/automaton.js +345 -0
  528. package/dist/esm/patternValidator/automaton.js.map +1 -0
  529. package/dist/esm/patternValidator/index.js +190 -0
  530. package/dist/esm/patternValidator/index.js.map +1 -0
  531. package/dist/esm/patternValidator/lexer.js +214 -0
  532. package/dist/esm/patternValidator/lexer.js.map +1 -0
  533. package/dist/esm/patternValidator/matcher.js +717 -0
  534. package/dist/esm/patternValidator/matcher.js.map +1 -0
  535. package/dist/esm/patternValidator/parser.js +531 -0
  536. package/dist/esm/patternValidator/parser.js.map +1 -0
  537. package/dist/esm/patternValidator/types.js +2 -0
  538. package/dist/esm/patternValidator/types.js.map +1 -0
  539. package/dist/esm/patternValidator/validator.test.js +1275 -0
  540. package/dist/esm/patternValidator/validator.test.js.map +1 -0
  541. package/dist/esm/registry/ComponentRegistry.js +435 -0
  542. package/dist/esm/registry/ComponentRegistry.js.map +1 -0
  543. package/dist/esm/registry/Intent.js +15 -0
  544. package/dist/esm/registry/Intent.js.map +1 -0
  545. package/dist/esm/registry/index.js +3 -0
  546. package/dist/esm/registry/index.js.map +1 -0
  547. package/dist/esm/registry/types.js +2 -0
  548. package/dist/esm/registry/types.js.map +1 -0
  549. package/dist/esm/services/cart/addToCart.js +146 -0
  550. package/dist/esm/services/cart/addToCart.js.map +1 -0
  551. package/dist/esm/services/cart/index.js +2 -0
  552. package/dist/esm/services/cart/index.js.map +1 -0
  553. package/dist/esm/services/searchspring/index.js +3 -0
  554. package/dist/esm/services/searchspring/index.js.map +1 -0
  555. package/dist/esm/services/searchspring/searchSpringClient.js +44 -0
  556. package/dist/esm/services/searchspring/searchSpringClient.js.map +1 -0
  557. package/dist/esm/services/searchspring/transformSSProduct.js +66 -0
  558. package/dist/esm/services/searchspring/transformSSProduct.js.map +1 -0
  559. package/dist/esm/services/searchspring/types.js +2 -0
  560. package/dist/esm/services/searchspring/types.js.map +1 -0
  561. package/dist/esm/services/shopify/globals.d.js +7 -0
  562. package/dist/esm/services/shopify/globals.d.js.map +1 -0
  563. package/dist/esm/services/shopify/index.js +6 -0
  564. package/dist/esm/services/shopify/index.js.map +1 -0
  565. package/dist/esm/services/shopify/queries.js +210 -0
  566. package/dist/esm/services/shopify/queries.js.map +1 -0
  567. package/dist/esm/services/shopify/resolveStoreDomain.js +25 -0
  568. package/dist/esm/services/shopify/resolveStoreDomain.js.map +1 -0
  569. package/dist/esm/services/shopify/shopifyEntityResolver.js +105 -0
  570. package/dist/esm/services/shopify/shopifyEntityResolver.js.map +1 -0
  571. package/dist/esm/services/shopify/shopifyStorefrontClient.js +52 -0
  572. package/dist/esm/services/shopify/shopifyStorefrontClient.js.map +1 -0
  573. package/dist/esm/services/shopify/transformShopifyEntity.js +130 -0
  574. package/dist/esm/services/shopify/transformShopifyEntity.js.map +1 -0
  575. package/dist/esm/services/shopify/types.js +2 -0
  576. package/dist/esm/services/shopify/types.js.map +1 -0
  577. package/dist/esm/styles/base-tokens.css +152 -0
  578. package/dist/esm/styles/base-utilities.css +424 -0
  579. package/dist/esm/styles/components.css +6 -0
  580. package/dist/esm/styles/prompt-input-tokens.css +136 -0
  581. package/dist/esm/styles/tailwind-theme.css +138 -0
  582. package/dist/esm/test-types.d.js +2 -0
  583. package/dist/esm/test-types.d.js.map +1 -0
  584. package/dist/esm/testUtils.js +20 -0
  585. package/dist/esm/testUtils.js.map +1 -0
  586. package/dist/esm/types/answerUpdatedEvent.js +16 -0
  587. package/dist/esm/types/answerUpdatedEvent.js.map +1 -0
  588. package/dist/esm/types/blog.js +2 -0
  589. package/dist/esm/types/blog.js.map +1 -0
  590. package/dist/esm/types/callout.js +2 -0
  591. package/dist/esm/types/callout.js.map +1 -0
  592. package/dist/esm/types/dependencies.js +2 -0
  593. package/dist/esm/types/dependencies.js.map +1 -0
  594. package/dist/esm/types/entity.js +2 -0
  595. package/dist/esm/types/entity.js.map +1 -0
  596. package/dist/esm/types/link-types.js +52 -0
  597. package/dist/esm/types/link-types.js.map +1 -0
  598. package/dist/esm/types/page-section.js +2 -0
  599. package/dist/esm/types/page-section.js.map +1 -0
  600. package/dist/esm/types/placement.js +2 -0
  601. package/dist/esm/types/placement.js.map +1 -0
  602. package/dist/esm/types/redirectEvent.js +23 -0
  603. package/dist/esm/types/redirectEvent.js.map +1 -0
  604. package/dist/esm/types/userQueryEvent.js +15 -0
  605. package/dist/esm/types/userQueryEvent.js.map +1 -0
  606. package/dist/esm/utils/analyticsEvents.js +84 -0
  607. package/dist/esm/utils/analyticsEvents.js.map +1 -0
  608. package/dist/esm/utils/componentTracking.js +84 -0
  609. package/dist/esm/utils/componentTracking.js.map +1 -0
  610. package/dist/esm/utils/contentKeywordMatcher.js +50 -0
  611. package/dist/esm/utils/contentKeywordMatcher.js.map +1 -0
  612. package/dist/esm/utils/conversationApi.js +45 -0
  613. package/dist/esm/utils/conversationApi.js.map +1 -0
  614. package/dist/esm/utils/conversationMode.js +18 -0
  615. package/dist/esm/utils/conversationMode.js.map +1 -0
  616. package/dist/esm/utils/diagnosticsCollector.js +52 -0
  617. package/dist/esm/utils/diagnosticsCollector.js.map +1 -0
  618. package/dist/esm/utils/entityLinkParser.js +246 -0
  619. package/dist/esm/utils/entityLinkParser.js.map +1 -0
  620. package/dist/esm/utils/htmlCommentParser.js +117 -0
  621. package/dist/esm/utils/htmlCommentParser.js.map +1 -0
  622. package/dist/esm/utils/image-utils.js +45 -0
  623. package/dist/esm/utils/image-utils.js.map +1 -0
  624. package/dist/esm/utils/intentExtractor.js +45 -0
  625. package/dist/esm/utils/intentExtractor.js.map +1 -0
  626. package/dist/esm/utils/markdownPreprocessor.js +257 -0
  627. package/dist/esm/utils/markdownPreprocessor.js.map +1 -0
  628. package/dist/esm/utils/navigationStack.js +27 -0
  629. package/dist/esm/utils/navigationStack.js.map +1 -0
  630. package/dist/esm/utils/nodeMatchers.js +38 -0
  631. package/dist/esm/utils/nodeMatchers.js.map +1 -0
  632. package/dist/esm/utils/propsExtractor.js +58 -0
  633. package/dist/esm/utils/propsExtractor.js.map +1 -0
  634. package/dist/esm/utils/sessionManager.js +151 -0
  635. package/dist/esm/utils/sessionManager.js.map +1 -0
  636. package/dist/esm/utils/unifiedMarkdownParser.js +36 -0
  637. package/dist/esm/utils/unifiedMarkdownParser.js.map +1 -0
  638. package/dist/esm/utils/web5LinkValidator.js +52 -0
  639. package/dist/esm/utils/web5LinkValidator.js.map +1 -0
  640. package/dist/esm/utils/web5LinkValidator.test.js +113 -0
  641. package/dist/esm/utils/web5LinkValidator.test.js.map +1 -0
  642. package/dist/types/client/clientBundleOverride.d.ts +26 -0
  643. package/dist/types/client/clientBundleOverride.d.ts.map +1 -0
  644. package/dist/types/client/devEnvironment.d.ts +24 -0
  645. package/dist/types/client/devEnvironment.d.ts.map +1 -0
  646. package/dist/types/client/loadClientBundle.d.ts +27 -0
  647. package/dist/types/client/loadClientBundle.d.ts.map +1 -0
  648. package/dist/types/client/wixAuthFetch.d.ts +12 -0
  649. package/dist/types/client/wixAuthFetch.d.ts.map +1 -0
  650. package/dist/types/clients.d.ts +10 -0
  651. package/dist/types/clients.d.ts.map +1 -0
  652. package/dist/types/color/colorUtils.d.ts +9 -0
  653. package/dist/types/color/colorUtils.d.ts.map +1 -0
  654. package/dist/types/component/componentDefinitions/CalloutSectionDefinition.d.ts +11 -0
  655. package/dist/types/component/componentDefinitions/CalloutSectionDefinition.d.ts.map +1 -0
  656. package/dist/types/component/componentDefinitions/ComparisonSectionDefinition.d.ts +11 -0
  657. package/dist/types/component/componentDefinitions/ComparisonSectionDefinition.d.ts.map +1 -0
  658. package/dist/types/component/componentDefinitions/CtaBannerSectionDefinition.d.ts +11 -0
  659. package/dist/types/component/componentDefinitions/CtaBannerSectionDefinition.d.ts.map +1 -0
  660. package/dist/types/component/componentDefinitions/EntitySectionDefinition.d.ts +11 -0
  661. package/dist/types/component/componentDefinitions/EntitySectionDefinition.d.ts.map +1 -0
  662. package/dist/types/component/componentDefinitions/ErrorSectionDefinition.d.ts +12 -0
  663. package/dist/types/component/componentDefinitions/ErrorSectionDefinition.d.ts.map +1 -0
  664. package/dist/types/component/componentDefinitions/FallbackSectionDefinition.d.ts +16 -0
  665. package/dist/types/component/componentDefinitions/FallbackSectionDefinition.d.ts.map +1 -0
  666. package/dist/types/component/componentDefinitions/FeatureCardsSectionDefinition.d.ts +11 -0
  667. package/dist/types/component/componentDefinitions/FeatureCardsSectionDefinition.d.ts.map +1 -0
  668. package/dist/types/component/componentDefinitions/FeatureSection9PlusDefinition.d.ts +11 -0
  669. package/dist/types/component/componentDefinitions/FeatureSection9PlusDefinition.d.ts.map +1 -0
  670. package/dist/types/component/componentDefinitions/HeroEntitySectionDefinition.d.ts +23 -0
  671. package/dist/types/component/componentDefinitions/HeroEntitySectionDefinition.d.ts.map +1 -0
  672. package/dist/types/component/componentDefinitions/HeroSectionDefinition.d.ts +12 -0
  673. package/dist/types/component/componentDefinitions/HeroSectionDefinition.d.ts.map +1 -0
  674. package/dist/types/component/componentDefinitions/HtmlCommentSectionDefinition.d.ts +11 -0
  675. package/dist/types/component/componentDefinitions/HtmlCommentSectionDefinition.d.ts.map +1 -0
  676. package/dist/types/component/componentDefinitions/KpiSectionDefinition.d.ts +11 -0
  677. package/dist/types/component/componentDefinitions/KpiSectionDefinition.d.ts.map +1 -0
  678. package/dist/types/component/componentDefinitions/NextStepsSectionDefinition.d.ts +11 -0
  679. package/dist/types/component/componentDefinitions/NextStepsSectionDefinition.d.ts.map +1 -0
  680. package/dist/types/component/componentDefinitions/SearchSectionDefinition.d.ts +10 -0
  681. package/dist/types/component/componentDefinitions/SearchSectionDefinition.d.ts.map +1 -0
  682. package/dist/types/component/componentDefinitions/SkipNodesSectionDefinition.d.ts +12 -0
  683. package/dist/types/component/componentDefinitions/SkipNodesSectionDefinition.d.ts.map +1 -0
  684. package/dist/types/component/componentDefinitions/TextBlockSectionDefinition.d.ts +11 -0
  685. package/dist/types/component/componentDefinitions/TextBlockSectionDefinition.d.ts.map +1 -0
  686. package/dist/types/component/componentDefinitions/index.d.ts +26 -0
  687. package/dist/types/component/componentDefinitions/index.d.ts.map +1 -0
  688. package/dist/types/component/componentDefinitions/listItemsSectionDefinition.d.ts +11 -0
  689. package/dist/types/component/componentDefinitions/listItemsSectionDefinition.d.ts.map +1 -0
  690. package/dist/types/component/componentDefinitions/parse-utils.d.ts +88 -0
  691. package/dist/types/component/componentDefinitions/parse-utils.d.ts.map +1 -0
  692. package/dist/types/component/componentDefinitions/specHelpers.d.ts +16 -0
  693. package/dist/types/component/componentDefinitions/specHelpers.d.ts.map +1 -0
  694. package/dist/types/component/componentParser.d.ts +63 -0
  695. package/dist/types/component/componentParser.d.ts.map +1 -0
  696. package/dist/types/component/diagnosticTypes.d.ts +23 -0
  697. package/dist/types/component/diagnosticTypes.d.ts.map +1 -0
  698. package/dist/types/component/parser-types.d.ts +71 -0
  699. package/dist/types/component/parser-types.d.ts.map +1 -0
  700. package/dist/types/component/section-definition.d.ts +32 -0
  701. package/dist/types/component/section-definition.d.ts.map +1 -0
  702. package/dist/types/component/types.d.ts +315 -0
  703. package/dist/types/component/types.d.ts.map +1 -0
  704. package/dist/types/components/placement/PlacementPayloadContext.d.ts +20 -0
  705. package/dist/types/components/placement/PlacementPayloadContext.d.ts.map +1 -0
  706. package/dist/types/components/placement/PlacementResponseRenderer.d.ts +106 -0
  707. package/dist/types/components/placement/PlacementResponseRenderer.d.ts.map +1 -0
  708. package/dist/types/components/placement/buildPlacementDependencies.d.ts +44 -0
  709. package/dist/types/components/placement/buildPlacementDependencies.d.ts.map +1 -0
  710. package/dist/types/components/ui/BottomContainer.d.ts +9 -0
  711. package/dist/types/components/ui/BottomContainer.d.ts.map +1 -0
  712. package/dist/types/components/ui/CalloutBlock.d.ts +9 -0
  713. package/dist/types/components/ui/CalloutBlock.d.ts.map +1 -0
  714. package/dist/types/components/ui/Disclaimer.d.ts +21 -0
  715. package/dist/types/components/ui/Disclaimer.d.ts.map +1 -0
  716. package/dist/types/components/ui/FeedbackBar.d.ts +41 -0
  717. package/dist/types/components/ui/FeedbackBar.d.ts.map +1 -0
  718. package/dist/types/components/ui/Loader.d.ts +9 -0
  719. package/dist/types/components/ui/Loader.d.ts.map +1 -0
  720. package/dist/types/components/ui/MarkdownText.d.ts +9 -0
  721. package/dist/types/components/ui/MarkdownText.d.ts.map +1 -0
  722. package/dist/types/components/ui/OptimizedImage.d.ts +59 -0
  723. package/dist/types/components/ui/OptimizedImage.d.ts.map +1 -0
  724. package/dist/types/components/ui/PlacementLoader.d.ts +15 -0
  725. package/dist/types/components/ui/PlacementLoader.d.ts.map +1 -0
  726. package/dist/types/components/ui/PromptEntryEmptyState.d.ts +21 -0
  727. package/dist/types/components/ui/PromptEntryEmptyState.d.ts.map +1 -0
  728. package/dist/types/components/ui/SearchSection.d.ts +37 -0
  729. package/dist/types/components/ui/SearchSection.d.ts.map +1 -0
  730. package/dist/types/components/ui/SectionSkeleton.d.ts +27 -0
  731. package/dist/types/components/ui/SectionSkeleton.d.ts.map +1 -0
  732. package/dist/types/components/ui/SmartIcon.d.ts +19 -0
  733. package/dist/types/components/ui/SmartIcon.d.ts.map +1 -0
  734. package/dist/types/components/ui/UnifiedLink.d.ts +22 -0
  735. package/dist/types/components/ui/UnifiedLink.d.ts.map +1 -0
  736. package/dist/types/components/ui/UserQuery.d.ts +33 -0
  737. package/dist/types/components/ui/UserQuery.d.ts.map +1 -0
  738. package/dist/types/components/ui/icons/ArrowTopRightIcon.d.ts +3 -0
  739. package/dist/types/components/ui/icons/ArrowTopRightIcon.d.ts.map +1 -0
  740. package/dist/types/components/ui/icons/ArrowUpIcon.d.ts +3 -0
  741. package/dist/types/components/ui/icons/ArrowUpIcon.d.ts.map +1 -0
  742. package/dist/types/components/ui/icons/CheckIcon.d.ts +3 -0
  743. package/dist/types/components/ui/icons/CheckIcon.d.ts.map +1 -0
  744. package/dist/types/components/ui/icons/CommentIcon.d.ts +3 -0
  745. package/dist/types/components/ui/icons/CommentIcon.d.ts.map +1 -0
  746. package/dist/types/components/ui/icons/PlusIcon.d.ts +3 -0
  747. package/dist/types/components/ui/icons/PlusIcon.d.ts.map +1 -0
  748. package/dist/types/components/ui/icons/RedoIcon.d.ts +3 -0
  749. package/dist/types/components/ui/icons/RedoIcon.d.ts.map +1 -0
  750. package/dist/types/components/ui/icons/ShareIcon.d.ts +3 -0
  751. package/dist/types/components/ui/icons/ShareIcon.d.ts.map +1 -0
  752. package/dist/types/components/ui/icons/UndoIcon.d.ts +3 -0
  753. package/dist/types/components/ui/icons/UndoIcon.d.ts.map +1 -0
  754. package/dist/types/components/ui/table.d.ts +11 -0
  755. package/dist/types/components/ui/table.d.ts.map +1 -0
  756. package/dist/types/context/ChipsContext.d.ts +8 -0
  757. package/dist/types/context/ChipsContext.d.ts.map +1 -0
  758. package/dist/types/context/ComponentDependenciesContext.d.ts +8 -0
  759. package/dist/types/context/ComponentDependenciesContext.d.ts.map +1 -0
  760. package/dist/types/entity/defaultExtractor.d.ts +14 -0
  761. package/dist/types/entity/defaultExtractor.d.ts.map +1 -0
  762. package/dist/types/entity/enrichEntitiesFromPayload.d.ts +27 -0
  763. package/dist/types/entity/enrichEntitiesFromPayload.d.ts.map +1 -0
  764. package/dist/types/entity/fetchEntityListData.d.ts +20 -0
  765. package/dist/types/entity/fetchEntityListData.d.ts.map +1 -0
  766. package/dist/types/entity/index.d.ts +16 -0
  767. package/dist/types/entity/index.d.ts.map +1 -0
  768. package/dist/types/entity/types.d.ts +13 -0
  769. package/dist/types/entity/types.d.ts.map +1 -0
  770. package/dist/types/errors/conversationErrorTypes.d.ts +20 -0
  771. package/dist/types/errors/conversationErrorTypes.d.ts.map +1 -0
  772. package/dist/types/errors/errorTemplates.d.ts +27 -0
  773. package/dist/types/errors/errorTemplates.d.ts.map +1 -0
  774. package/dist/types/errors/index.d.ts +3 -0
  775. package/dist/types/errors/index.d.ts.map +1 -0
  776. package/dist/types/featureToggles/FeatureToggleContext.d.ts +18 -0
  777. package/dist/types/featureToggles/FeatureToggleContext.d.ts.map +1 -0
  778. package/dist/types/hooks/useConversation.d.ts +3 -0
  779. package/dist/types/hooks/useConversation.d.ts.map +1 -0
  780. package/dist/types/hooks/useDebugImageContext.d.ts +2 -0
  781. package/dist/types/hooks/useDebugImageContext.d.ts.map +1 -0
  782. package/dist/types/hooks/useEntityTransforms.d.ts +3 -0
  783. package/dist/types/hooks/useEntityTransforms.d.ts.map +1 -0
  784. package/dist/types/hooks/useMarkdownUtils.d.ts +3 -0
  785. package/dist/types/hooks/useMarkdownUtils.d.ts.map +1 -0
  786. package/dist/types/hooks/useResolveGenericEntityData.d.ts +11 -0
  787. package/dist/types/hooks/useResolveGenericEntityData.d.ts.map +1 -0
  788. package/dist/types/hooks/useResolveSearchSpringEntityData.d.ts +20 -0
  789. package/dist/types/hooks/useResolveSearchSpringEntityData.d.ts.map +1 -0
  790. package/dist/types/hooks/useResolveShopifyEntityData.d.ts +21 -0
  791. package/dist/types/hooks/useResolveShopifyEntityData.d.ts.map +1 -0
  792. package/dist/types/hooks/useResolvedImageSources.d.ts +6 -0
  793. package/dist/types/hooks/useResolvedImageSources.d.ts.map +1 -0
  794. package/dist/types/hooks/useWeb5Link.d.ts +3 -0
  795. package/dist/types/hooks/useWeb5Link.d.ts.map +1 -0
  796. package/dist/types/image/contextualImageTypes.d.ts +17 -0
  797. package/dist/types/image/contextualImageTypes.d.ts.map +1 -0
  798. package/dist/types/image/imageSearchFilterTypes.d.ts +14 -0
  799. package/dist/types/image/imageSearchFilterTypes.d.ts.map +1 -0
  800. package/dist/types/image/imageSearchFilters.d.ts +16 -0
  801. package/dist/types/image/imageSearchFilters.d.ts.map +1 -0
  802. package/dist/types/index.d.ts +88 -0
  803. package/dist/types/index.d.ts.map +1 -0
  804. package/dist/types/lib/utils.d.ts +3 -0
  805. package/dist/types/lib/utils.d.ts.map +1 -0
  806. package/dist/types/markdownBlocks.d.ts +44 -0
  807. package/dist/types/markdownBlocks.d.ts.map +1 -0
  808. package/dist/types/match/astToParts.d.ts +15 -0
  809. package/dist/types/match/astToParts.d.ts.map +1 -0
  810. package/dist/types/match/extractProps.d.ts +207 -0
  811. package/dist/types/match/extractProps.d.ts.map +1 -0
  812. package/dist/types/match/index.d.ts +4 -0
  813. package/dist/types/match/index.d.ts.map +1 -0
  814. package/dist/types/match/matchAllSections.d.ts +15 -0
  815. package/dist/types/match/matchAllSections.d.ts.map +1 -0
  816. package/dist/types/match/matchMarkdown.d.ts +25 -0
  817. package/dist/types/match/matchMarkdown.d.ts.map +1 -0
  818. package/dist/types/parts/parts.d.ts +144 -0
  819. package/dist/types/parts/parts.d.ts.map +1 -0
  820. package/dist/types/patternAnalyzer/conflictDetector.d.ts +19 -0
  821. package/dist/types/patternAnalyzer/conflictDetector.d.ts.map +1 -0
  822. package/dist/types/patternAnalyzer/index.d.ts +10 -0
  823. package/dist/types/patternAnalyzer/index.d.ts.map +1 -0
  824. package/dist/types/patternAnalyzer/markdownGenerator.d.ts +9 -0
  825. package/dist/types/patternAnalyzer/markdownGenerator.d.ts.map +1 -0
  826. package/dist/types/patternAnalyzer/mergeDetector.d.ts +14 -0
  827. package/dist/types/patternAnalyzer/mergeDetector.d.ts.map +1 -0
  828. package/dist/types/patternAnalyzer/parserValidator.d.ts +13 -0
  829. package/dist/types/patternAnalyzer/parserValidator.d.ts.map +1 -0
  830. package/dist/types/patternAnalyzer/patternWriter.d.ts +8 -0
  831. package/dist/types/patternAnalyzer/patternWriter.d.ts.map +1 -0
  832. package/dist/types/patternAnalyzer/run.d.ts +2 -0
  833. package/dist/types/patternAnalyzer/run.d.ts.map +1 -0
  834. package/dist/types/patternAnalyzer/types.d.ts +59 -0
  835. package/dist/types/patternAnalyzer/types.d.ts.map +1 -0
  836. package/dist/types/patternValidator/automaton.d.ts +3 -0
  837. package/dist/types/patternValidator/automaton.d.ts.map +1 -0
  838. package/dist/types/patternValidator/index.d.ts +48 -0
  839. package/dist/types/patternValidator/index.d.ts.map +1 -0
  840. package/dist/types/patternValidator/lexer.d.ts +3 -0
  841. package/dist/types/patternValidator/lexer.d.ts.map +1 -0
  842. package/dist/types/patternValidator/matcher.d.ts +14 -0
  843. package/dist/types/patternValidator/matcher.d.ts.map +1 -0
  844. package/dist/types/patternValidator/parser.d.ts +14 -0
  845. package/dist/types/patternValidator/parser.d.ts.map +1 -0
  846. package/dist/types/patternValidator/types.d.ts +125 -0
  847. package/dist/types/patternValidator/types.d.ts.map +1 -0
  848. package/dist/types/patternValidator/validator.test.d.ts +2 -0
  849. package/dist/types/patternValidator/validator.test.d.ts.map +1 -0
  850. package/dist/types/registry/ComponentRegistry.d.ts +64 -0
  851. package/dist/types/registry/ComponentRegistry.d.ts.map +1 -0
  852. package/dist/types/registry/Intent.d.ts +12 -0
  853. package/dist/types/registry/Intent.d.ts.map +1 -0
  854. package/dist/types/registry/index.d.ts +4 -0
  855. package/dist/types/registry/index.d.ts.map +1 -0
  856. package/dist/types/registry/types.d.ts +99 -0
  857. package/dist/types/registry/types.d.ts.map +1 -0
  858. package/dist/types/services/cart/addToCart.d.ts +26 -0
  859. package/dist/types/services/cart/addToCart.d.ts.map +1 -0
  860. package/dist/types/services/cart/index.d.ts +2 -0
  861. package/dist/types/services/cart/index.d.ts.map +1 -0
  862. package/dist/types/services/searchspring/index.d.ts +4 -0
  863. package/dist/types/services/searchspring/index.d.ts.map +1 -0
  864. package/dist/types/services/searchspring/searchSpringClient.d.ts +13 -0
  865. package/dist/types/services/searchspring/searchSpringClient.d.ts.map +1 -0
  866. package/dist/types/services/searchspring/transformSSProduct.d.ts +7 -0
  867. package/dist/types/services/searchspring/transformSSProduct.d.ts.map +1 -0
  868. package/dist/types/services/searchspring/types.d.ts +48 -0
  869. package/dist/types/services/searchspring/types.d.ts.map +1 -0
  870. package/dist/types/services/shopify/index.d.ts +7 -0
  871. package/dist/types/services/shopify/index.d.ts.map +1 -0
  872. package/dist/types/services/shopify/queries.d.ts +13 -0
  873. package/dist/types/services/shopify/queries.d.ts.map +1 -0
  874. package/dist/types/services/shopify/resolveStoreDomain.d.ts +14 -0
  875. package/dist/types/services/shopify/resolveStoreDomain.d.ts.map +1 -0
  876. package/dist/types/services/shopify/shopifyEntityResolver.d.ts +21 -0
  877. package/dist/types/services/shopify/shopifyEntityResolver.d.ts.map +1 -0
  878. package/dist/types/services/shopify/shopifyStorefrontClient.d.ts +19 -0
  879. package/dist/types/services/shopify/shopifyStorefrontClient.d.ts.map +1 -0
  880. package/dist/types/services/shopify/transformShopifyEntity.d.ts +11 -0
  881. package/dist/types/services/shopify/transformShopifyEntity.d.ts.map +1 -0
  882. package/dist/types/services/shopify/types.d.ts +109 -0
  883. package/dist/types/services/shopify/types.d.ts.map +1 -0
  884. package/dist/types/testUtils.d.ts +7 -0
  885. package/dist/types/testUtils.d.ts.map +1 -0
  886. package/dist/types/types/answerUpdatedEvent.d.ts +29 -0
  887. package/dist/types/types/answerUpdatedEvent.d.ts.map +1 -0
  888. package/dist/types/types/blog.d.ts +22 -0
  889. package/dist/types/types/blog.d.ts.map +1 -0
  890. package/dist/types/types/callout.d.ts +7 -0
  891. package/dist/types/types/callout.d.ts.map +1 -0
  892. package/dist/types/types/dependencies.d.ts +191 -0
  893. package/dist/types/types/dependencies.d.ts.map +1 -0
  894. package/dist/types/types/entity.d.ts +38 -0
  895. package/dist/types/types/entity.d.ts.map +1 -0
  896. package/dist/types/types/link-types.d.ts +38 -0
  897. package/dist/types/types/link-types.d.ts.map +1 -0
  898. package/dist/types/types/page-section.d.ts +27 -0
  899. package/dist/types/types/page-section.d.ts.map +1 -0
  900. package/dist/types/types/placement.d.ts +94 -0
  901. package/dist/types/types/placement.d.ts.map +1 -0
  902. package/dist/types/types/redirectEvent.d.ts +42 -0
  903. package/dist/types/types/redirectEvent.d.ts.map +1 -0
  904. package/dist/types/types/userQueryEvent.d.ts +24 -0
  905. package/dist/types/types/userQueryEvent.d.ts.map +1 -0
  906. package/dist/types/utils/analyticsEvents.d.ts +24 -0
  907. package/dist/types/utils/analyticsEvents.d.ts.map +1 -0
  908. package/dist/types/utils/componentTracking.d.ts +55 -0
  909. package/dist/types/utils/componentTracking.d.ts.map +1 -0
  910. package/dist/types/utils/contentKeywordMatcher.d.ts +14 -0
  911. package/dist/types/utils/contentKeywordMatcher.d.ts.map +1 -0
  912. package/dist/types/utils/conversationApi.d.ts +26 -0
  913. package/dist/types/utils/conversationApi.d.ts.map +1 -0
  914. package/dist/types/utils/conversationMode.d.ts +16 -0
  915. package/dist/types/utils/conversationMode.d.ts.map +1 -0
  916. package/dist/types/utils/diagnosticsCollector.d.ts +33 -0
  917. package/dist/types/utils/diagnosticsCollector.d.ts.map +1 -0
  918. package/dist/types/utils/entityLinkParser.d.ts +97 -0
  919. package/dist/types/utils/entityLinkParser.d.ts.map +1 -0
  920. package/dist/types/utils/htmlCommentParser.d.ts +13 -0
  921. package/dist/types/utils/htmlCommentParser.d.ts.map +1 -0
  922. package/dist/types/utils/image-utils.d.ts +10 -0
  923. package/dist/types/utils/image-utils.d.ts.map +1 -0
  924. package/dist/types/utils/intentExtractor.d.ts +11 -0
  925. package/dist/types/utils/intentExtractor.d.ts.map +1 -0
  926. package/dist/types/utils/markdownPreprocessor.d.ts +95 -0
  927. package/dist/types/utils/markdownPreprocessor.d.ts.map +1 -0
  928. package/dist/types/utils/navigationStack.d.ts +6 -0
  929. package/dist/types/utils/navigationStack.d.ts.map +1 -0
  930. package/dist/types/utils/nodeMatchers.d.ts +10 -0
  931. package/dist/types/utils/nodeMatchers.d.ts.map +1 -0
  932. package/dist/types/utils/propsExtractor.d.ts +51 -0
  933. package/dist/types/utils/propsExtractor.d.ts.map +1 -0
  934. package/dist/types/utils/sessionManager.d.ts +57 -0
  935. package/dist/types/utils/sessionManager.d.ts.map +1 -0
  936. package/dist/types/utils/unifiedMarkdownParser.d.ts +9 -0
  937. package/dist/types/utils/unifiedMarkdownParser.d.ts.map +1 -0
  938. package/dist/types/utils/web5LinkValidator.d.ts +14 -0
  939. package/dist/types/utils/web5LinkValidator.d.ts.map +1 -0
  940. package/dist/types/utils/web5LinkValidator.test.d.ts +2 -0
  941. package/dist/types/utils/web5LinkValidator.test.d.ts.map +1 -0
  942. package/package.json +103 -0
  943. package/src/styles/base-tokens.css +152 -0
  944. package/src/styles/base-utilities.css +424 -0
  945. package/src/styles/components.css +6 -0
  946. package/src/styles/prompt-input-tokens.css +136 -0
  947. package/src/styles/tailwind-theme.css +138 -0
@@ -0,0 +1,1277 @@
1
+ "use strict";
2
+
3
+ var _index = require("./index");
4
+ /**
5
+ * Helper function to convert block element strings to mock AST nodes for testing
6
+ * Accepts BlockElement or list pattern strings like 'list{[t], [t]}'
7
+ */
8
+ function createMockAstNodes(blockElements) {
9
+ return blockElements.map(element => {
10
+ // Handle list patterns like 'list{[t], [t, link]}'
11
+ if (typeof element === 'string' && element.startsWith('list{')) {
12
+ // Parse list pattern: list{[t], [t, link]} -> [[t], [t, link]]
13
+ const listPattern = element.slice(5, -1); // Remove 'list{' and '}'
14
+ const items = [];
15
+
16
+ // Parse items: [t], [t, link] -> ['t'], ['t', 'link']
17
+ const itemMatches = listPattern.match(/\[([^\]]+)\]/g) || [];
18
+ for (const itemMatch of itemMatches) {
19
+ const itemContent = itemMatch.slice(1, -1); // Remove '[' and ']'
20
+ const itemElements = itemContent.split(',').map(e => e.trim());
21
+
22
+ // Convert item elements to paragraph children
23
+ // To get multiple 't' elements, we need to break up text nodes
24
+ // We'll create separate paragraphs for consecutive 't' elements, or use separators
25
+ const paragraphs = [];
26
+ let currentParagraphChildren = [];
27
+ let lastWasText = false;
28
+ for (const itemElement of itemElements) {
29
+ if (itemElement === 't') {
30
+ // If previous was text, start a new paragraph to prevent merging
31
+ // Or add a separator to force text splitting
32
+ if (lastWasText && currentParagraphChildren.length > 0) {
33
+ // Finish current paragraph and start new one
34
+ paragraphs.push({
35
+ type: 'paragraph',
36
+ children: [...currentParagraphChildren]
37
+ });
38
+ currentParagraphChildren = [{
39
+ type: 'text',
40
+ value: 'Text'
41
+ }];
42
+ } else {
43
+ currentParagraphChildren.push({
44
+ type: 'text',
45
+ value: 'Text'
46
+ });
47
+ }
48
+ lastWasText = true;
49
+ } else if (itemElement === 'link') {
50
+ currentParagraphChildren.push({
51
+ type: 'link',
52
+ url: 'http://example.com',
53
+ children: [{
54
+ type: 'text',
55
+ value: 'Link'
56
+ }]
57
+ });
58
+ lastWasText = false;
59
+ } else if (itemElement === 'image') {
60
+ currentParagraphChildren.push({
61
+ type: 'image',
62
+ url: 'http://example.com/image.jpg',
63
+ alt: 'Image'
64
+ });
65
+ lastWasText = false;
66
+ } else if (itemElement === 'web5_icon') {
67
+ currentParagraphChildren.push({
68
+ type: 'image',
69
+ url: 'web5://icon/dollar',
70
+ alt: ''
71
+ });
72
+ lastWasText = false;
73
+ }
74
+ }
75
+
76
+ // Add final paragraph if it has children
77
+ if (currentParagraphChildren.length > 0) {
78
+ paragraphs.push({
79
+ type: 'paragraph',
80
+ children: currentParagraphChildren
81
+ });
82
+ }
83
+ items.push({
84
+ type: 'listItem',
85
+ children: paragraphs.length > 0 ? paragraphs : []
86
+ });
87
+ }
88
+ return {
89
+ type: 'list',
90
+ ordered: false,
91
+ start: null,
92
+ spread: false,
93
+ children: items
94
+ };
95
+ }
96
+
97
+ // Handle entity links for testing (e.g., 'entity_link:blog_post:abc123')
98
+ const elementStr = String(element);
99
+ if (elementStr.startsWith('entity_link:')) {
100
+ const parts = elementStr.slice('entity_link:'.length).split(':');
101
+ const entityType = parts[0] || 'default_type';
102
+ const entityId = parts[1] || 'default_id';
103
+ return {
104
+ type: 'paragraph',
105
+ children: [{
106
+ type: 'link',
107
+ url: `web5://entity/${entityType}/${entityId}`,
108
+ children: [{
109
+ type: 'text',
110
+ value: 'Entity Link'
111
+ }]
112
+ }]
113
+ };
114
+ }
115
+
116
+ // Handle web5 icon images for testing (e.g., 'web5_icon:dollar')
117
+ if (elementStr.startsWith('web5_icon:')) {
118
+ const iconName = elementStr.slice('web5_icon:'.length);
119
+ return {
120
+ type: 'paragraph',
121
+ children: [{
122
+ type: 'image',
123
+ url: `web5://icon/${iconName}`,
124
+ alt: ''
125
+ }]
126
+ };
127
+ }
128
+
129
+ // Handle web5 images with custom type for testing (e.g., 'web5_image:illustration:chart')
130
+ if (elementStr.startsWith('web5_image:')) {
131
+ const parts = elementStr.slice('web5_image:'.length).split(':');
132
+ const imageType = parts[0] || 'default';
133
+ const imageName = parts[1] || 'default';
134
+ return {
135
+ type: 'paragraph',
136
+ children: [{
137
+ type: 'image',
138
+ url: `web5://${imageType}/${imageName}`,
139
+ alt: ''
140
+ }]
141
+ };
142
+ }
143
+
144
+ // Handle http links for testing (e.g., 'http_link')
145
+ if (elementStr === 'http_link') {
146
+ return {
147
+ type: 'paragraph',
148
+ children: [{
149
+ type: 'link',
150
+ url: 'http://example.com/page',
151
+ children: [{
152
+ type: 'text',
153
+ value: 'HTTP Link'
154
+ }]
155
+ }]
156
+ };
157
+ }
158
+
159
+ // Handle https links for testing (e.g., 'https_link')
160
+ if (elementStr === 'https_link') {
161
+ return {
162
+ type: 'paragraph',
163
+ children: [{
164
+ type: 'link',
165
+ url: 'https://example.com/page',
166
+ children: [{
167
+ type: 'text',
168
+ value: 'HTTPS Link'
169
+ }]
170
+ }]
171
+ };
172
+ }
173
+ switch (element) {
174
+ case 'h1':
175
+ return {
176
+ type: 'heading',
177
+ depth: 1,
178
+ children: [{
179
+ type: 'text',
180
+ value: 'Heading 1'
181
+ }]
182
+ };
183
+ case 'h2':
184
+ return {
185
+ type: 'heading',
186
+ depth: 2,
187
+ children: [{
188
+ type: 'text',
189
+ value: 'Heading 2'
190
+ }]
191
+ };
192
+ case 'h3':
193
+ return {
194
+ type: 'heading',
195
+ depth: 3,
196
+ children: [{
197
+ type: 'text',
198
+ value: 'Heading 3'
199
+ }]
200
+ };
201
+ case 'h4':
202
+ return {
203
+ type: 'heading',
204
+ depth: 4,
205
+ children: [{
206
+ type: 'text',
207
+ value: 'Heading 4'
208
+ }]
209
+ };
210
+ case 'h5':
211
+ return {
212
+ type: 'heading',
213
+ depth: 5,
214
+ children: [{
215
+ type: 'text',
216
+ value: 'Heading 5'
217
+ }]
218
+ };
219
+ case 'h6':
220
+ return {
221
+ type: 'heading',
222
+ depth: 6,
223
+ children: [{
224
+ type: 'text',
225
+ value: 'Heading 6'
226
+ }]
227
+ };
228
+ case 't':
229
+ return {
230
+ type: 'paragraph',
231
+ children: [{
232
+ type: 'text',
233
+ value: 'Text content'
234
+ }]
235
+ };
236
+ case 'link':
237
+ return {
238
+ type: 'paragraph',
239
+ children: [{
240
+ type: 'link',
241
+ url: 'http://example.com',
242
+ children: [{
243
+ type: 'text',
244
+ value: 'Link'
245
+ }]
246
+ }]
247
+ };
248
+ case 'image':
249
+ return {
250
+ type: 'paragraph',
251
+ children: [{
252
+ type: 'image',
253
+ url: 'http://example.com/image.jpg',
254
+ alt: 'Image'
255
+ }]
256
+ };
257
+ case 'html_comment':
258
+ return {
259
+ type: 'html',
260
+ value: '<!-- comment -->'
261
+ };
262
+ case 'table':
263
+ return {
264
+ type: 'table',
265
+ align: [],
266
+ children: []
267
+ };
268
+ case 'callout':
269
+ return {
270
+ type: 'blockquote',
271
+ children: []
272
+ };
273
+ case 'thematicBreak':
274
+ return {
275
+ type: 'thematicBreak'
276
+ };
277
+ default:
278
+ // For other types, create a simple paragraph
279
+ return {
280
+ type: 'paragraph',
281
+ children: [{
282
+ type: 'text',
283
+ value: String(element)
284
+ }]
285
+ };
286
+ }
287
+ });
288
+ }
289
+ describe('Pattern Validator', () => {
290
+ describe('Pattern Syntax Validation', () => {
291
+ it('validates correct patterns', () => {
292
+ expect((0, _index.validatePatternSyntax)('h2 > t').valid).toBe(true);
293
+ expect((0, _index.validatePatternSyntax)('t+').valid).toBe(true);
294
+ expect((0, _index.validatePatternSyntax)('(t | image)*').valid).toBe(true);
295
+ expect((0, _index.validatePatternSyntax)('h2 > t[1-3] > link?').valid).toBe(true);
296
+ expect((0, _index.validatePatternSyntax)('(h2 > t)+').valid).toBe(true);
297
+ });
298
+ it('detects invalid elements', () => {
299
+ const result = (0, _index.validatePatternSyntax)('h2 > invalid');
300
+ expect(result.valid).toBe(false);
301
+ expect(result.error).toContain('Invalid element');
302
+ });
303
+ it('detects empty patterns', () => {
304
+ const result = (0, _index.validatePatternSyntax)('');
305
+ expect(result.valid).toBe(false);
306
+ expect(result.error).toBe('Pattern rule is empty');
307
+ });
308
+ it('detects syntax errors', () => {
309
+ expect((0, _index.validatePatternSyntax)('h2 >').valid).toBe(false);
310
+ expect((0, _index.validatePatternSyntax)('(h2 > t').valid).toBe(false);
311
+ expect((0, _index.validatePatternSyntax)('h2 [').valid).toBe(false);
312
+ });
313
+ it('detects unexpected characters', () => {
314
+ const result = (0, _index.validatePatternSyntax)('h2 @ t');
315
+ expect(result.valid).toBe(false);
316
+ expect(result.error).toContain('Unexpected character');
317
+ });
318
+ });
319
+ describe('Basic sequences', () => {
320
+ it('matches simple sequence', () => {
321
+ const nodes1 = createMockAstNodes(['h2', 't']);
322
+ const nodes2 = createMockAstNodes(['h2', 'image']);
323
+ const result1 = (0, _index.validatePattern)(nodes1, 'h2 > t');
324
+ const result2 = (0, _index.validatePattern)(nodes2, 'h2 > t');
325
+ expect(result1.valid).toBe(true);
326
+ expect(result1.endIndex).toBe(1); // Matched both h2 and t
327
+ // nodes2 matches h2 (partial match), so valid is true but endIndex is 0
328
+ expect(result2.valid).toBe(false);
329
+ expect(result2.endIndex).toBe(0); // Only matched h2
330
+ });
331
+ it('matches longer sequence', () => {
332
+ const nodes1 = createMockAstNodes(['h2', 't', 'link']);
333
+ const nodes2 = createMockAstNodes(['h2', 't']);
334
+ const result1 = (0, _index.validatePattern)(nodes1, 'h2 > t > link');
335
+ const result2 = (0, _index.validatePattern)(nodes2, 'h2 > t > link');
336
+ expect(result1.valid).toBe(true);
337
+ expect(result1.endIndex).toBe(2); // Matched all three
338
+ // nodes2 matches h2 > t (partial match), so valid is true but endIndex is 1
339
+ expect(result2.valid).toBe(false);
340
+ expect(result2.endIndex).toBe(1); // Only matched h2 and t
341
+ });
342
+ });
343
+ describe('Quantifiers', () => {
344
+ it('matches star quantifier (0 or more)', () => {
345
+ const nodes1 = createMockAstNodes(['h2']);
346
+ const nodes2 = createMockAstNodes(['h2', 't']);
347
+ const nodes3 = createMockAstNodes(['h2', 't', 't', 't']);
348
+ expect((0, _index.validatePattern)(nodes1, 'h2 > t*').valid).toBe(true);
349
+ expect((0, _index.validatePattern)(nodes2, 'h2 > t*').valid).toBe(true);
350
+ expect((0, _index.validatePattern)(nodes3, 'h2 > t*').valid).toBe(true);
351
+ });
352
+ it('matches plus quantifier (1 or more)', () => {
353
+ const nodes1 = createMockAstNodes(['h2']);
354
+ const nodes2 = createMockAstNodes(['h2', 't']);
355
+ const nodes3 = createMockAstNodes(['h2', 't', 't']);
356
+ const result1 = (0, _index.validatePattern)(nodes1, 'h2 > t+');
357
+ const result2 = (0, _index.validatePattern)(nodes2, 'h2 > t+');
358
+ const result3 = (0, _index.validatePattern)(nodes3, 'h2 > t+');
359
+ // nodes1 matches h2 (partial match), so valid is true but endIndex is 0
360
+ expect(result1.valid).toBe(false);
361
+ expect(result1.endIndex).toBe(0); // Only matched h2
362
+ expect(result2.valid).toBe(true);
363
+ expect(result2.endIndex).toBe(1); // Matched h2 and t
364
+ expect(result3.valid).toBe(true);
365
+ expect(result3.endIndex).toBe(2); // Matched h2, t, t
366
+ });
367
+ it('matches optional quantifier', () => {
368
+ const nodes1 = createMockAstNodes(['h2']);
369
+ const nodes2 = createMockAstNodes(['h2', 't']);
370
+ const nodes3 = createMockAstNodes(['h2', 't', 't']);
371
+ const result1 = (0, _index.validatePattern)(nodes1, 'h2 > t?');
372
+ const result2 = (0, _index.validatePattern)(nodes2, 'h2 > t?');
373
+ const result3 = (0, _index.validatePattern)(nodes3, 'h2 > t?');
374
+ expect(result1.valid).toBe(true);
375
+ expect(result1.endIndex).toBe(0); // Matched h2 (t is optional)
376
+ expect(result2.valid).toBe(true);
377
+ expect(result2.endIndex).toBe(1); // Matched h2 and t
378
+ // nodes3 matches h2 > t (partial match), so valid is true but endIndex is 1
379
+ expect(result3.valid).toBe(true);
380
+ expect(result3.endIndex).toBe(1); // Only matched h2 and first t
381
+ });
382
+ it('matches exact count', () => {
383
+ const nodes1 = createMockAstNodes(['h2', 't', 't']);
384
+ const nodes2 = createMockAstNodes(['h2', 't']);
385
+ const nodes3 = createMockAstNodes(['h2', 't', 't', 't']);
386
+ const result1 = (0, _index.validatePattern)(nodes1, 'h2 > t[2]');
387
+ const result2 = (0, _index.validatePattern)(nodes2, 'h2 > t[2]');
388
+ const result3 = (0, _index.validatePattern)(nodes3, 'h2 > t[2]');
389
+ expect(result1.valid).toBe(true);
390
+ expect(result1.endIndex).toBe(2); // Matched h2, t, t
391
+ // nodes2 matches h2 > t (partial match), so valid is true but endIndex is 1
392
+ expect(result2.valid).toBe(false);
393
+ expect(result2.endIndex).toBe(1); // Only matched h2 and t
394
+ // nodes3 matches h2 > t[2] (partial match), so valid is true but endIndex is 2
395
+ expect(result3.valid).toBe(true);
396
+ expect(result3.endIndex).toBe(2); // Matched h2, t, t (third t not matched)
397
+ });
398
+ it('matches range quantifier', () => {
399
+ const nodes1 = createMockAstNodes(['h2', 't']);
400
+ const nodes2 = createMockAstNodes(['h2', 't', 't']);
401
+ const nodes3 = createMockAstNodes(['h2', 't', 't', 't']);
402
+ const nodes4 = createMockAstNodes(['h2']);
403
+ const nodes5 = createMockAstNodes(['h2', 't', 't', 't', 't']);
404
+ const result1 = (0, _index.validatePattern)(nodes1, 'h2 > t[1-3]');
405
+ const result2 = (0, _index.validatePattern)(nodes2, 'h2 > t[1-3]');
406
+ const result3 = (0, _index.validatePattern)(nodes3, 'h2 > t[1-3]');
407
+ const result4 = (0, _index.validatePattern)(nodes4, 'h2 > t[1-3]');
408
+ const result5 = (0, _index.validatePattern)(nodes5, 'h2 > t[1-3]');
409
+ expect(result1.valid).toBe(true);
410
+ expect(result1.endIndex).toBe(1); // Matched h2, t
411
+ expect(result2.valid).toBe(true);
412
+ expect(result2.endIndex).toBe(2); // Matched h2, t, t
413
+ expect(result3.valid).toBe(true);
414
+ expect(result3.endIndex).toBe(3); // Matched h2, t, t, t
415
+ // nodes4 matches h2 (partial match), so valid is true but endIndex is 0
416
+ expect(result4.valid).toBe(false);
417
+ expect(result4.endIndex).toBe(0); // Only matched h2
418
+ // nodes5 matches h2 > t[1-3] (partial match), so valid is true but endIndex is 3
419
+ expect(result5.valid).toBe(true);
420
+ expect(result5.endIndex).toBe(3); // Matched h2, t, t, t (fourth t not matched)
421
+ });
422
+ it('matches up-to quantifier', () => {
423
+ const nodes1 = createMockAstNodes(['h2']);
424
+ const nodes2 = createMockAstNodes(['h2', 't']);
425
+ const nodes3 = createMockAstNodes(['h2', 't', 't']);
426
+ const nodes4 = createMockAstNodes(['h2', 't', 't', 't']);
427
+ const result1 = (0, _index.validatePattern)(nodes1, 'h2 > t[-2]');
428
+ const result2 = (0, _index.validatePattern)(nodes2, 'h2 > t[-2]');
429
+ const result3 = (0, _index.validatePattern)(nodes3, 'h2 > t[-2]');
430
+ const result4 = (0, _index.validatePattern)(nodes4, 'h2 > t[-2]');
431
+ expect(result1.valid).toBe(true);
432
+ expect(result1.endIndex).toBe(0); // Matched h2
433
+ expect(result2.valid).toBe(true);
434
+ expect(result2.endIndex).toBe(1); // Matched h2, t
435
+ expect(result3.valid).toBe(true);
436
+ expect(result3.endIndex).toBe(2); // Matched h2, t, t
437
+ // nodes4 matches h2 > t[-2] (partial match), so valid is true but endIndex is 2
438
+ expect(result4.valid).toBe(true);
439
+ expect(result4.endIndex).toBe(2); // Matched h2, t, t (third t not matched)
440
+ });
441
+ });
442
+ describe('Alternation', () => {
443
+ it('matches simple alternation', () => {
444
+ const nodes1 = createMockAstNodes(['h2', 't']);
445
+ const nodes2 = createMockAstNodes(['h2', 'image']);
446
+ const nodes3 = createMockAstNodes(['h2', 'link']);
447
+ const result1 = (0, _index.validatePattern)(nodes1, 'h2 > (t | image)');
448
+ const result2 = (0, _index.validatePattern)(nodes2, 'h2 > (t | image)');
449
+ const result3 = (0, _index.validatePattern)(nodes3, 'h2 > (t | image)');
450
+ expect(result1.valid).toBe(true);
451
+ expect(result1.endIndex).toBe(1); // Matched h2, t
452
+ expect(result2.valid).toBe(true);
453
+ expect(result2.endIndex).toBe(1); // Matched h2, image
454
+ // nodes3 matches h2 (partial match), so valid is true but endIndex is 0
455
+ expect(result3.valid).toBe(false);
456
+ expect(result3.endIndex).toBe(0); // Only matched h2
457
+ });
458
+ it('matches alternation with quantifier', () => {
459
+ const nodes1 = createMockAstNodes(['h2']);
460
+ const nodes2 = createMockAstNodes(['h2', 't']);
461
+ const nodes3 = createMockAstNodes(['h2', 't', 'image', 't']);
462
+ expect((0, _index.validatePattern)(nodes1, 'h2 > (t | image)*').valid).toBe(true);
463
+ expect((0, _index.validatePattern)(nodes2, 'h2 > (t | image)*').valid).toBe(true);
464
+ expect((0, _index.validatePattern)(nodes3, 'h2 > (t | image)*').valid).toBe(true);
465
+ });
466
+ });
467
+ describe('Groups', () => {
468
+ it('matches group with quantifier', () => {
469
+ const nodes1 = [];
470
+ const nodes2 = createMockAstNodes(['h2', 't']);
471
+ const nodes3 = createMockAstNodes(['h2', 't', 'h2', 't']);
472
+ const nodes4 = createMockAstNodes(['h2']);
473
+ const result1 = (0, _index.validatePattern)(nodes1, '(h2 > t)*');
474
+ const result2 = (0, _index.validatePattern)(nodes2, '(h2 > t)*');
475
+ const result3 = (0, _index.validatePattern)(nodes3, '(h2 > t)*');
476
+ const result4 = (0, _index.validatePattern)(nodes4, '(h2 > t)*');
477
+ const result5 = (0, _index.validatePattern)(nodes1, '(h2 > t)+');
478
+ const result6 = (0, _index.validatePattern)(nodes2, '(h2 > t)+');
479
+ expect(result1.valid).toBe(true); // 0 repetitions
480
+ expect(result1.endIndex).toBe(-1); // No match
481
+ expect(result2.valid).toBe(true); // 1 repetition
482
+ expect(result2.endIndex).toBe(1); // Matched h2, t
483
+ expect(result3.valid).toBe(true); // 2 repetitions
484
+ expect(result3.endIndex).toBe(3); // Matched h2, t, h2, t
485
+ // nodes4 matches h2 (partial match), so valid is true but endIndex is 0
486
+ expect(result4.valid).toBe(false); // partial match
487
+ expect(result4.endIndex).toBe(0); // Matched h2
488
+ // nodes1 with + requires at least 1, empty array doesn't match, so valid is false
489
+ expect(result5.valid).toBe(false); // no match (empty array with + quantifier)
490
+ expect(result5.endIndex).toBe(-1); // No match
491
+ expect(result6.valid).toBe(true); // exactly 1
492
+ expect(result6.endIndex).toBe(1); // Matched h2, t
493
+ });
494
+ });
495
+ describe('ThematicBreak', () => {
496
+ it('matches single thematicBreak', () => {
497
+ const nodes = createMockAstNodes(['thematicBreak']);
498
+ const result = (0, _index.validatePattern)(nodes, 'thematicBreak');
499
+ expect(result.valid).toBe(true);
500
+ expect(result.endIndex).toBe(0);
501
+ });
502
+ it('matches thematicBreak with quantifiers', () => {
503
+ const nodes1 = createMockAstNodes(['h1', 'thematicBreak']);
504
+ const nodes2 = createMockAstNodes(['h1', 'thematicBreak', 'thematicBreak']);
505
+ const nodes3 = createMockAstNodes(['h1']);
506
+
507
+ // Optional thematicBreak
508
+ expect((0, _index.validatePattern)(nodes1, 'h1 > thematicBreak?').valid).toBe(true);
509
+ expect((0, _index.validatePattern)(nodes3, 'h1 > thematicBreak?').valid).toBe(true);
510
+
511
+ // One or more thematicBreak
512
+ expect((0, _index.validatePattern)(nodes1, 'h1 > thematicBreak+').valid).toBe(true);
513
+ expect((0, _index.validatePattern)(nodes2, 'h1 > thematicBreak+').valid).toBe(true);
514
+ expect((0, _index.validatePattern)(nodes3, 'h1 > thematicBreak+').valid).toBe(false);
515
+
516
+ // Zero or more thematicBreak
517
+ expect((0, _index.validatePattern)(nodes1, 'h1 > thematicBreak*').valid).toBe(true);
518
+ expect((0, _index.validatePattern)(nodes2, 'h1 > thematicBreak*').valid).toBe(true);
519
+ expect((0, _index.validatePattern)(nodes3, 'h1 > thematicBreak*').valid).toBe(true);
520
+ });
521
+ it('matches thematicBreak in sequences', () => {
522
+ const nodes1 = createMockAstNodes(['h1', 'thematicBreak', 't']);
523
+ const nodes2 = createMockAstNodes(['h2', 'thematicBreak', 't', 'link']);
524
+ expect((0, _index.validatePattern)(nodes1, 'h1 > thematicBreak > t').valid).toBe(true);
525
+ expect((0, _index.validatePattern)(nodes2, 'h2 > thematicBreak > t > link').valid).toBe(true);
526
+ });
527
+ it('matches thematicBreak in alternation', () => {
528
+ const nodes1 = createMockAstNodes(['h2', 'thematicBreak', 't']);
529
+ const nodes2 = createMockAstNodes(['h2', 'callout', 't']);
530
+ const nodes3 = createMockAstNodes(['h2', 't']);
531
+ expect((0, _index.validatePattern)(nodes1, 'h2 > (thematicBreak | callout) > t').valid).toBe(true);
532
+ expect((0, _index.validatePattern)(nodes2, 'h2 > (thematicBreak | callout) > t').valid).toBe(true);
533
+ expect((0, _index.validatePattern)(nodes3, 'h2 > (thematicBreak | callout) > t').valid).toBe(false);
534
+ });
535
+ it('validates thematicBreak pattern syntax', () => {
536
+ expect((0, _index.validatePatternSyntax)('thematicBreak').valid).toBe(true);
537
+ expect((0, _index.validatePatternSyntax)('h1 > thematicBreak').valid).toBe(true);
538
+ expect((0, _index.validatePatternSyntax)('thematicBreak+').valid).toBe(true);
539
+ expect((0, _index.validatePatternSyntax)('thematicBreak?').valid).toBe(true);
540
+ expect((0, _index.validatePatternSyntax)('thematicBreak*').valid).toBe(true);
541
+ });
542
+ });
543
+ describe('Complex patterns', () => {
544
+ it('matches nested patterns', () => {
545
+ const nodes1 = createMockAstNodes(['h2', 'link', 'image']);
546
+ const nodes2 = createMockAstNodes(['h2', 'link', 'image', 'link', 'image']);
547
+ expect((0, _index.validatePattern)(nodes1, 'h2 > (link > image)*').valid).toBe(true);
548
+ expect((0, _index.validatePattern)(nodes2, 'h2 > (link > image)*').valid).toBe(true);
549
+ });
550
+ it('matches multiple quantifiers', () => {
551
+ const nodes1 = createMockAstNodes(['h2', 't', 't', 'link']);
552
+ const nodes2 = createMockAstNodes(['h2', 't', 't', 'link', 'link']);
553
+ expect((0, _index.validatePattern)(nodes1, 'h2 > t+ > link*').valid).toBe(true);
554
+ expect((0, _index.validatePattern)(nodes2, 'h2 > t+ > link*').valid).toBe(true);
555
+ });
556
+ });
557
+ describe('Lists', () => {
558
+ it('matches simple list', () => {
559
+ const nodes = createMockAstNodes(['list{[t], [t]}']);
560
+ expect((0, _index.validatePattern)(nodes, 'list').valid).toBe(true);
561
+ });
562
+ it('validates list item count', () => {
563
+ // list{item[-2]:...} means up to 2 items
564
+ const nodes1 = createMockAstNodes(['list{[t]}']);
565
+ const nodes2 = createMockAstNodes(['list{[t], [t]}']);
566
+ const nodes3 = createMockAstNodes(['list{[t], [t], [t]}']);
567
+ expect((0, _index.validatePattern)(nodes1, 'list{item[-2]:t}').valid).toBe(true);
568
+ expect((0, _index.validatePattern)(nodes2, 'list{item[-2]:t}').valid).toBe(true);
569
+ expect((0, _index.validatePattern)(nodes3, 'list{item[-2]:t}').valid).toBe(false);
570
+ });
571
+ it('validates list item structure', () => {
572
+ // Each item should have: t > image > t+ > link*
573
+ const pattern = 'list{item[-2]:t > image > t+ > link*}';
574
+
575
+ // Valid: 1 item with t, image, t
576
+ const nodes1 = createMockAstNodes(['list{[t, image, t]}']);
577
+ expect((0, _index.validatePattern)(nodes1, pattern).valid).toBe(true);
578
+
579
+ // Valid: 1 item with t, image, t, t (multiple t's with t+)
580
+ const nodes2 = createMockAstNodes(['list{[t, image, t, t]}']);
581
+ expect((0, _index.validatePattern)(nodes2, pattern).valid).toBe(true);
582
+
583
+ // Valid: 1 item with t, image, t, link
584
+ const nodes3 = createMockAstNodes(['list{[t, image, t, link]}']);
585
+ expect((0, _index.validatePattern)(nodes3, pattern).valid).toBe(true);
586
+
587
+ // Valid: 2 items
588
+ const nodes4 = createMockAstNodes(['list{[t, image, t], [t, image, t, t, link]}']);
589
+ expect((0, _index.validatePattern)(nodes4, pattern).valid).toBe(true);
590
+
591
+ // Invalid: missing image
592
+ const nodes5 = createMockAstNodes(['list{[t, t]}']);
593
+ expect((0, _index.validatePattern)(nodes5, pattern).valid).toBe(false);
594
+
595
+ // Invalid: wrong order
596
+ const nodes6 = createMockAstNodes(['list{[image, t, t]}']);
597
+ expect((0, _index.validatePattern)(nodes6, pattern).valid).toBe(false);
598
+ });
599
+ it('validates complex pattern with list', () => {
600
+ const pattern = 'h2 > (link > image > t > list{item[-2]:t > image > t+ > link*})*';
601
+
602
+ // h2 alone (0 repetitions of group)
603
+ const nodes1 = createMockAstNodes(['h2']);
604
+ expect((0, _index.validatePattern)(nodes1, pattern).valid).toBe(true);
605
+
606
+ // h2 > link > image > t > list with valid items
607
+ const nodes2 = createMockAstNodes(['h2', 'link', 'image', 't', 'list{[t, image, t, link]}']);
608
+ expect((0, _index.validatePattern)(nodes2, pattern).valid).toBe(true);
609
+ });
610
+ it('validates real-world complex pattern from user', () => {
611
+ const blocks = ['h2',
612
+ // 1
613
+ 'link',
614
+ // 2
615
+ 't',
616
+ // 3
617
+ 'link',
618
+ // 4
619
+ 't',
620
+ // 5
621
+ 'link',
622
+ // 6
623
+ 't',
624
+ // 7
625
+ 'link',
626
+ // 8
627
+ 'html_comment',
628
+ // 9
629
+ 'link',
630
+ // 10
631
+ 'image',
632
+ // 11
633
+ 't',
634
+ // 12
635
+ 'list{[t, t]}',
636
+ // 13 - list with 1 item containing ['t', 't']
637
+ 'html_comment',
638
+ // 14
639
+ 'link',
640
+ // 15
641
+ 'image',
642
+ // 16
643
+ 't',
644
+ // 17
645
+ 'list{[t, t]}' // 18 - list with 1 item containing ['t', 't']
646
+ ];
647
+ const nodes = createMockAstNodes(blocks);
648
+
649
+ // Pattern breakdown:
650
+ // h2 -> matches position 1
651
+ // (link > t)* -> matches positions 2-7 (3 repetitions: 2-3, 4-5, 6-7)
652
+ // link -> matches position 8
653
+ // (html_comment > link > image > t > list{item[1]:t > t})* -> matches 9-18 (2 repetitions)
654
+ // First repetition: 9-13
655
+ // Second repetition: 14-18
656
+ //
657
+ // list{[t, t]} means: 1 item with elements ['t', 't']
658
+
659
+ // Now with proper implementation, we can use quantifiers on groups with lists!
660
+ const properPattern = 'h2 > (link > t)* > link > (html_comment > link > image > t > list)*';
661
+ expect((0, _index.validatePattern)(nodes, properPattern).valid).toBe(true);
662
+
663
+ // Also test with item structure validation
664
+ const patternWithItemValidation = 'h2 > (link > t)* > link > (html_comment > link > image > t > list{item[1]:t > t})*';
665
+ expect((0, _index.validatePattern)(nodes, patternWithItemValidation).valid).toBe(true);
666
+ });
667
+
668
+ // TDD Tests for proper list validation implementation
669
+ describe('Advanced list validation (TDD)', () => {
670
+ it('Test 1: validates list in simple repetitive pattern', () => {
671
+ const blocks = ['t', 'list{[t]}', 't', 'list{[t]}', 't', 'list{[t]}'];
672
+ const nodes = createMockAstNodes(blocks);
673
+
674
+ // Pattern: t > list repeated 3 times
675
+ const pattern = '(t > list)*';
676
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
677
+ });
678
+ it('Test 2: validates list in complex group repetition', () => {
679
+ const blocks = ['h2', 'html_comment', 'link', 'list{[t]}', 'html_comment', 'link', 'list{[t]}'];
680
+ const nodes = createMockAstNodes(blocks);
681
+
682
+ // Pattern: h2 followed by repeated groups
683
+ const pattern = 'h2 > (html_comment > link > list)*';
684
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
685
+ });
686
+ it('Test 3: validates list with simple item structure', () => {
687
+ const nodes1 = createMockAstNodes(['list{[t, t]}']);
688
+ const nodes2 = createMockAstNodes(['list{[t]}']);
689
+
690
+ // Pattern: list with 1 item containing 2 't' elements in sequence
691
+ const pattern = 'list{item[1]:t > t}';
692
+ const result1 = (0, _index.validatePattern)(nodes1, pattern);
693
+ const result2 = (0, _index.validatePattern)(nodes2, pattern);
694
+ expect(result1.valid).toBe(true);
695
+ expect(result1.endIndex).toBe(0); // Matched the list
696
+
697
+ // nodes2 has list{[t]} but pattern expects list{item[1]:t > t} (1 item with 2 t's)
698
+ // The list structure doesn't match (only 1 t instead of 2), so it should fail
699
+ expect(result2.valid).toBe(false); // Structure doesn't match
700
+ expect(result2.endIndex).toBe(-1); // No match
701
+ });
702
+ it('Test 4: validates list with complex item structure using quantifiers', () => {
703
+ const nodes1 = createMockAstNodes(['list{[t, t, t, link, link]}']);
704
+ const nodes2 = createMockAstNodes(['list{[t, t, link]}']);
705
+ const nodes3 = createMockAstNodes(['list{[link, link]}']);
706
+
707
+ // Pattern: list with 1 item containing 1+ t's followed by exactly 2 links
708
+ // link[2] should expand to link > link
709
+ const pattern = 'list{item[1]:t+ > link[2]}';
710
+ expect((0, _index.validatePattern)(nodes1, pattern).valid).toBe(true);
711
+
712
+ // Should fail with wrong number of links
713
+ expect((0, _index.validatePattern)(nodes2, pattern).valid).toBe(false);
714
+
715
+ // Should fail with no t at start
716
+ expect((0, _index.validatePattern)(nodes3, pattern).valid).toBe(false);
717
+ });
718
+ it('Test 5: validates list with variable item counts and quantifiers', () => {
719
+ // Test data has 2 lists:
720
+ // 1st list: 1 item with 2 't' elements
721
+ // 2nd list: 3 items, each with 2 't' elements
722
+ const blocks = ['h2', 'link', 't', 'link', 't', 'link', 't', 'link', 'html_comment', 'link', 'image', 't', 'list{[t, t]}',
723
+ // 1 item: ['t', 't']
724
+ 'html_comment', 'link', 'image', 't', 'list{[t, t], [t, t], [t, t]}' // 3 items: ['t', 't'], ['t', 't'], ['t', 't']
725
+ ];
726
+ const nodes = createMockAstNodes(blocks);
727
+
728
+ // Pattern: list with 1+ items, each item has 1+ 't' elements
729
+ // Use + quantifier for "1 or more"
730
+ const pattern = 'h2 > (link > t)* > link > (html_comment > link > image > t > list{item+:t+})*';
731
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
732
+
733
+ // Should also work with explicit range [1-] for "1 or more"
734
+ const patternWithRange = 'h2 > (link > t)* > link > (html_comment > link > image > t > list{item[1-]:t+})*';
735
+ expect((0, _index.validatePattern)(nodes, patternWithRange).valid).toBe(true);
736
+ });
737
+ });
738
+ describe('Super Complex Patterns (8 Advanced Cases)', () => {
739
+ it('Complex 1: Multiple lists with wildcards', () => {
740
+ // Real-world: Product specifications with flexible structure
741
+ const blocks = ['h2', 'list{[t, t, link]}', 'list{[t, link, link, link]}', 'list{[t]}'];
742
+ const nodes = createMockAstNodes(blocks);
743
+ const pattern = 'h2 > list{item+:t+ > link*}+';
744
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
745
+ });
746
+ it('Complex 2: Deeply nested groups with quantifiers', () => {
747
+ // Real-world: Blog post with multiple paragraphs, each with optional formatting
748
+ const blocks = ['h2', 't', 'link', 't', 't', 'image', 't', 't', 'link', 't'];
749
+ const nodes = createMockAstNodes(blocks);
750
+ const pattern = 'h2 > (t > (link | image) > t)+';
751
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
752
+ });
753
+ it('Complex 3: Lists with complex quantified item structures', () => {
754
+ // Real-world: Feature comparison table with variable columns
755
+ const blocks = ['h3', 'list{[t, t, t, link, link, image]}', 'list{[t, link, image], [t, t, link, link]}', 'list{[t, image]}'];
756
+ const nodes = createMockAstNodes(blocks);
757
+ const pattern = 'h3 > list{item+:t+ > link* > image?}+';
758
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
759
+ });
760
+ it('Complex 4: Alternation with lists', () => {
761
+ // Real-world: Flexible content sections
762
+ const blocks = ['h2', 't', 'list{[t, t]}', 'list{[t, link, link]}'];
763
+ const nodes = createMockAstNodes(blocks);
764
+ const pattern = 'h2 > t > list{item+:t+ > link*}+';
765
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
766
+ });
767
+ it('Complex 5: Optional groups with mandatory list validation', () => {
768
+ // Real-world: Product page with optional gallery but required specs
769
+ const blocks = ['h1', 't', 'image', 'image', 'image', 'h2', 'list{[t, t, link]}', 'list{[t, link], [t, t, link]}'];
770
+ const nodes = createMockAstNodes(blocks);
771
+ const pattern = 'h1 > t > image* > h2 > list{item+:t+ > link}+';
772
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
773
+ });
774
+ it('Complex 6: Optional elements throughout', () => {
775
+ // Real-world: Blog post with optional media
776
+ const blocks = ['h1', 't', 'image', 'list{[t, link]}', 'callout', 'link'];
777
+ const nodes = createMockAstNodes(blocks);
778
+ const pattern = 'h1 > t > image? > list{item+:t+ > link*} > callout? > link?';
779
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
780
+ });
781
+ it('Complex 7: Complex alternation with exact quantifiers', () => {
782
+ // Real-world: Structured data with specific format requirements
783
+ const blocks = ['h3', 'link', 'link', 'link', 't', 't', 'image', 'list{[t, link]}', 'list{[t, link, link]}', 'callout'];
784
+ const nodes = createMockAstNodes(blocks);
785
+ const pattern = 'h3 > link[3] > t[2] > image > list{item+:t > link*}+ > callout';
786
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
787
+ });
788
+ it('Complex 8: Nested alternation in list items', () => {
789
+ // Real-world: Flexible content blocks in CMS
790
+ const blocks = ['h2', 'list{[t, link], [image, t], [link, image, t]}', 'list{[t], [link, link], [image]}'];
791
+ const nodes = createMockAstNodes(blocks);
792
+ const pattern = 'h2 > list{item[1-5]:(t | image | link)+}+';
793
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
794
+ });
795
+ it('Complex 9: Nested list with quantifiers', () => {
796
+ const blocks = ['h1', 't', 'h2', 't', 't', 't', 'image', 'image', 'list{[t], [t]}', 'h2', 't', 't', 't', 'image', 'image', 'list{[t], [t]}'];
797
+ const nodes = createMockAstNodes(blocks);
798
+
799
+ // Test with error details to debug
800
+ const pattern = 'h1 > t? > (h2 > t+ > image[2] > list{item+:t})[1-3]';
801
+ const result = (0, _index.validatePattern)(nodes, pattern);
802
+ if (!result.valid) {
803
+ console.log('Complex 9 Error:', result.error);
804
+ }
805
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
806
+ });
807
+ });
808
+ describe('Error Messages', () => {
809
+ it('provides detailed error for wrong item count', () => {
810
+ const nodes = createMockAstNodes(['h2', 'list{[t], [t], [t]}']);
811
+ const pattern = 'h2 > list{item[2]:t}';
812
+ const result = (0, _index.validatePattern)(nodes, pattern);
813
+ // With new behavior, partial matches are valid, but we still get error messages
814
+ expect(result.valid).toBe(false);
815
+ expect(result.endIndex).toBe(0); // Matched h2
816
+ // Error message should indicate wrong item count
817
+ if (result.error) {
818
+ expect(result.error).toContain('Expected exactly 2 items');
819
+ expect(result.error).toContain('got 3 items');
820
+ }
821
+ });
822
+ it('provides detailed error for item structure mismatch', () => {
823
+ const nodes = createMockAstNodes(['h2', 'list{[t, link, link]}']);
824
+ const pattern = 'h2 > list{item[1]:t > link}'; // Expects exactly 2 elements but got 3
825
+
826
+ const result = (0, _index.validatePattern)(nodes, pattern);
827
+ // With new behavior, partial matches are valid, but we still get an error message
828
+ // The pattern matches h2 (partial match), so valid is true, but error indicates structure mismatch
829
+ expect(result.valid).toBe(false); // Partial match is valid
830
+ // Error message should indicate structure mismatch
831
+ if (result.error) {
832
+ expect(result.error).toContain('Item #1');
833
+ expect(result.error).toContain('does not match');
834
+ }
835
+ });
836
+ it('provides detailed error for unexpected element', () => {
837
+ const nodes = createMockAstNodes(['h2', 'image', 't']);
838
+ const pattern = 'h2 > t > link';
839
+ const result = (0, _index.validatePattern)(nodes, pattern);
840
+ // With new behavior, partial matches are valid, but we still get an error message
841
+ // The pattern matches h2 (partial match), so valid is true, but error indicates unexpected element
842
+ expect(result.valid).toBe(false); // Partial match is valid
843
+ expect(result.endIndex).toBe(0); // Matched up to index 0 (h2)
844
+ // Error message should indicate unexpected element
845
+ if (result.error) {
846
+ expect(result.error).toContain('Unexpected element');
847
+ expect(result.error).toContain('image');
848
+ expect(result.error).toContain('position 2');
849
+ }
850
+ });
851
+ it('provides detailed error for incomplete pattern', () => {
852
+ const nodes = createMockAstNodes(['h2', 't']);
853
+ const pattern = 'h2 > t > link > image';
854
+ const result = (0, _index.validatePattern)(nodes, pattern);
855
+ // With new behavior, partial matches are valid, but we still get an error message
856
+ // The pattern matches h2 > t (partial match), so valid is true, but error indicates incomplete
857
+ expect(result.valid).toBe(false); // Partial match is valid
858
+ expect(result.endIndex).toBe(1); // Matched up to index 1 (h2, t)
859
+ // Error message should indicate incomplete pattern
860
+ if (result.error) {
861
+ expect(result.error).toContain('incomplete');
862
+ expect(result.error).toContain('Expected more elements');
863
+ }
864
+ });
865
+ });
866
+ });
867
+ describe('Entity Link Patterns', () => {
868
+ describe('Pattern Syntax Validation', () => {
869
+ it('validates link attribute selector syntax', () => {
870
+ // Basic attribute selectors
871
+ expect((0, _index.validatePatternSyntax)('link[entityType]').valid).toBe(true);
872
+ expect((0, _index.validatePatternSyntax)('link[entityType="blog_post"]').valid).toBe(true);
873
+ expect((0, _index.validatePatternSyntax)('link[protocol="entity"]').valid).toBe(true);
874
+ expect((0, _index.validatePatternSyntax)('link[entityId="abc123"]').valid).toBe(true);
875
+ });
876
+ it('validates link attribute operators', () => {
877
+ // Contains operator
878
+ expect((0, _index.validatePatternSyntax)('link[entityType*="post"]').valid).toBe(true);
879
+ // Starts with operator
880
+ expect((0, _index.validatePatternSyntax)('link[entityType^="blog"]').valid).toBe(true);
881
+ // Ends with operator
882
+ expect((0, _index.validatePatternSyntax)('link[entityId$="123"]').valid).toBe(true);
883
+ });
884
+ it('validates multiple link attributes', () => {
885
+ expect((0, _index.validatePatternSyntax)('link[entityType="blog_post"][entityId]').valid).toBe(true);
886
+ expect((0, _index.validatePatternSyntax)('link[protocol="entity"][entityType="product"]').valid).toBe(true);
887
+ });
888
+ it('validates link attributes with quantifiers', () => {
889
+ expect((0, _index.validatePatternSyntax)('link[entityType="blog_post"]?').valid).toBe(true);
890
+ expect((0, _index.validatePatternSyntax)('link[entityType="blog_post"]*').valid).toBe(true);
891
+ expect((0, _index.validatePatternSyntax)('link[entityType="blog_post"]+').valid).toBe(true);
892
+ expect((0, _index.validatePatternSyntax)('link[entityType="blog_post"][2]').valid).toBe(true);
893
+ expect((0, _index.validatePatternSyntax)('link[entityType="blog_post"][1-3]').valid).toBe(true);
894
+ });
895
+ it('validates link attributes in sequences', () => {
896
+ expect((0, _index.validatePatternSyntax)('h2 > link[entityType="blog_post"] > t').valid).toBe(true);
897
+ expect((0, _index.validatePatternSyntax)('link[protocol="entity"] > image > t').valid).toBe(true);
898
+ });
899
+ it('validates link attributes in groups and alternation', () => {
900
+ expect((0, _index.validatePatternSyntax)('(link[entityType="blog_post"] | link[entityType="product"])').valid).toBe(true);
901
+ expect((0, _index.validatePatternSyntax)('(t > link[entityType])+').valid).toBe(true);
902
+ });
903
+ });
904
+ describe('Entity Link Matching', () => {
905
+ it('matches entity link with exact entityType', () => {
906
+ const nodes = createMockAstNodes(['entity_link:blog_post:abc123', 't']);
907
+ const result = (0, _index.validatePattern)(nodes, 'link[entityType="blog_post"] > t');
908
+ expect(result.valid).toBe(true);
909
+ expect(result.endIndex).toBe(1);
910
+ });
911
+ it('does not match entity link with different entityType', () => {
912
+ const nodes = createMockAstNodes(['entity_link:product:xyz789', 't']);
913
+ const result = (0, _index.validatePattern)(nodes, 'link[entityType="blog_post"] > t');
914
+ expect(result.valid).toBe(false);
915
+ });
916
+ it('matches entity link with entityType exists check', () => {
917
+ const nodes = createMockAstNodes(['entity_link:any_type:any_id', 't']);
918
+ const result = (0, _index.validatePattern)(nodes, 'link[entityType] > t');
919
+ expect(result.valid).toBe(true);
920
+ });
921
+ it('does not match http link when entityType is required', () => {
922
+ const nodes = createMockAstNodes(['http_link', 't']);
923
+ const result = (0, _index.validatePattern)(nodes, 'link[entityType] > t');
924
+ expect(result.valid).toBe(false);
925
+ });
926
+ it('matches entity link with exact entityId', () => {
927
+ const nodes = createMockAstNodes(['entity_link:blog_post:abc123', 't']);
928
+ const result = (0, _index.validatePattern)(nodes, 'link[entityId="abc123"] > t');
929
+ expect(result.valid).toBe(true);
930
+ });
931
+ it('matches entity link with protocol="web5"', () => {
932
+ const nodes = createMockAstNodes(['entity_link:blog_post:abc123', 't']);
933
+ const result = (0, _index.validatePattern)(nodes, 'link[protocol="web5"] > t');
934
+ expect(result.valid).toBe(true);
935
+ });
936
+ it('does not match entity link when http protocol is required', () => {
937
+ const nodes = createMockAstNodes(['entity_link:blog_post:abc123', 't']);
938
+ const result = (0, _index.validatePattern)(nodes, 'link[protocol="http"] > t');
939
+ expect(result.valid).toBe(false);
940
+ });
941
+ it('matches http link with protocol="http"', () => {
942
+ const nodes = createMockAstNodes(['http_link', 't']);
943
+ const result = (0, _index.validatePattern)(nodes, 'link[protocol="http"] > t');
944
+ expect(result.valid).toBe(true);
945
+ });
946
+ it('matches https link with protocol="https"', () => {
947
+ const nodes = createMockAstNodes(['https_link', 't']);
948
+ const result = (0, _index.validatePattern)(nodes, 'link[protocol="https"] > t');
949
+ expect(result.valid).toBe(true);
950
+ });
951
+ });
952
+ describe('Entity Link Attribute Operators', () => {
953
+ it('matches entityType containing substring (*=)', () => {
954
+ const nodes = createMockAstNodes(['entity_link:blog_post:abc123', 't']);
955
+ expect((0, _index.validatePattern)(nodes, 'link[entityType*="blog"] > t').valid).toBe(true);
956
+ expect((0, _index.validatePattern)(nodes, 'link[entityType*="post"] > t').valid).toBe(true);
957
+ expect((0, _index.validatePattern)(nodes, 'link[entityType*="log_po"] > t').valid).toBe(true);
958
+ expect((0, _index.validatePattern)(nodes, 'link[entityType*="product"] > t').valid).toBe(false);
959
+ });
960
+ it('matches entityType starting with prefix (^=)', () => {
961
+ const nodes = createMockAstNodes(['entity_link:blog_post:abc123', 't']);
962
+ expect((0, _index.validatePattern)(nodes, 'link[entityType^="blog"] > t').valid).toBe(true);
963
+ expect((0, _index.validatePattern)(nodes, 'link[entityType^="blog_"] > t').valid).toBe(true);
964
+ expect((0, _index.validatePattern)(nodes, 'link[entityType^="post"] > t').valid).toBe(false);
965
+ });
966
+ it('matches entityType ending with suffix ($=)', () => {
967
+ const nodes = createMockAstNodes(['entity_link:blog_post:abc123', 't']);
968
+ expect((0, _index.validatePattern)(nodes, 'link[entityType$="post"] > t').valid).toBe(true);
969
+ expect((0, _index.validatePattern)(nodes, 'link[entityType$="_post"] > t').valid).toBe(true);
970
+ expect((0, _index.validatePattern)(nodes, 'link[entityType$="blog"] > t').valid).toBe(false);
971
+ });
972
+ it('matches entityId ending with suffix ($=)', () => {
973
+ const nodes = createMockAstNodes(['entity_link:blog_post:post123', 't']);
974
+ expect((0, _index.validatePattern)(nodes, 'link[entityId$="123"] > t').valid).toBe(true);
975
+ expect((0, _index.validatePattern)(nodes, 'link[entityId$="789"] > t').valid).toBe(false);
976
+ });
977
+ });
978
+ describe('Multiple Link Attributes', () => {
979
+ it('matches with both entityType and entityId', () => {
980
+ const nodes = createMockAstNodes(['entity_link:blog_post:abc123', 't']);
981
+ const result = (0, _index.validatePattern)(nodes, 'link[entityType="blog_post"][entityId="abc123"] > t');
982
+ expect(result.valid).toBe(true);
983
+ });
984
+ it('does not match if one attribute fails', () => {
985
+ const nodes = createMockAstNodes(['entity_link:blog_post:abc123', 't']);
986
+ const result = (0, _index.validatePattern)(nodes, 'link[entityType="blog_post"][entityId="xyz789"] > t');
987
+ expect(result.valid).toBe(false);
988
+ });
989
+ it('matches with protocol and entityType', () => {
990
+ const nodes = createMockAstNodes(['entity_link:product:xyz789', 't']);
991
+ const result = (0, _index.validatePattern)(nodes, 'link[protocol="web5"][entityType="product"] > t');
992
+ expect(result.valid).toBe(true);
993
+ });
994
+ });
995
+ describe('Optional Entity Links', () => {
996
+ it('matches pattern without link when optional', () => {
997
+ const nodes = createMockAstNodes(['h2', 't']);
998
+ const result = (0, _index.validatePattern)(nodes, 'h2 > link[entityType="blog_post"]? > t');
999
+ expect(result.valid).toBe(true);
1000
+ expect(result.endIndex).toBe(1);
1001
+ });
1002
+ it('matches pattern with matching link when optional', () => {
1003
+ const nodes = createMockAstNodes(['h2', 'entity_link:blog_post:abc123', 't']);
1004
+ const result = (0, _index.validatePattern)(nodes, 'h2 > link[entityType="blog_post"]? > t');
1005
+ expect(result.valid).toBe(true);
1006
+ expect(result.endIndex).toBe(2);
1007
+ });
1008
+ it('skips non-matching optional entity link', () => {
1009
+ // When optional entity link doesn't match, pattern should try to match without it
1010
+ const nodes = createMockAstNodes(['h2', 'http_link', 't']);
1011
+ const result = (0, _index.validatePattern)(nodes, 'h2 > link[entityType="blog_post"]? > link > t');
1012
+ expect(result.valid).toBe(true);
1013
+ });
1014
+ });
1015
+ describe('Entity Links with Quantifiers', () => {
1016
+ it('matches zero or more entity links (*)', () => {
1017
+ const nodes1 = createMockAstNodes(['h2', 't']);
1018
+ const nodes2 = createMockAstNodes(['h2', 'entity_link:blog_post:1', 't']);
1019
+ const nodes3 = createMockAstNodes(['h2', 'entity_link:blog_post:1', 'entity_link:blog_post:2', 't']);
1020
+ expect((0, _index.validatePattern)(nodes1, 'h2 > link[entityType="blog_post"]* > t').valid).toBe(true);
1021
+ expect((0, _index.validatePattern)(nodes2, 'h2 > link[entityType="blog_post"]* > t').valid).toBe(true);
1022
+ expect((0, _index.validatePattern)(nodes3, 'h2 > link[entityType="blog_post"]* > t').valid).toBe(true);
1023
+ });
1024
+ it('matches one or more entity links (+)', () => {
1025
+ const nodes1 = createMockAstNodes(['h2', 't']);
1026
+ const nodes2 = createMockAstNodes(['h2', 'entity_link:blog_post:1', 't']);
1027
+ const nodes3 = createMockAstNodes(['h2', 'entity_link:blog_post:1', 'entity_link:blog_post:2', 't']);
1028
+ expect((0, _index.validatePattern)(nodes1, 'h2 > link[entityType="blog_post"]+ > t').valid).toBe(false);
1029
+ expect((0, _index.validatePattern)(nodes2, 'h2 > link[entityType="blog_post"]+ > t').valid).toBe(true);
1030
+ expect((0, _index.validatePattern)(nodes3, 'h2 > link[entityType="blog_post"]+ > t').valid).toBe(true);
1031
+ });
1032
+ it('matches exact count of entity links ([N])', () => {
1033
+ const nodes = createMockAstNodes(['h2', 'entity_link:blog_post:1', 'entity_link:blog_post:2', 't']);
1034
+ expect((0, _index.validatePattern)(nodes, 'h2 > link[entityType="blog_post"][2] > t').valid).toBe(true);
1035
+ expect((0, _index.validatePattern)(nodes, 'h2 > link[entityType="blog_post"][3] > t').valid).toBe(false);
1036
+ });
1037
+ });
1038
+ describe('Backward Compatibility', () => {
1039
+ it('plain link matches entity links', () => {
1040
+ const nodes = createMockAstNodes(['entity_link:blog_post:abc123', 't']);
1041
+ const result = (0, _index.validatePattern)(nodes, 'link > t');
1042
+ expect(result.valid).toBe(true);
1043
+ });
1044
+ it('plain link matches http links', () => {
1045
+ const nodes = createMockAstNodes(['http_link', 't']);
1046
+ const result = (0, _index.validatePattern)(nodes, 'link > t');
1047
+ expect(result.valid).toBe(true);
1048
+ });
1049
+ it('plain link with quantifiers works as before', () => {
1050
+ const nodes = createMockAstNodes(['link', 'link', 't']);
1051
+ expect((0, _index.validatePattern)(nodes, 'link+ > t').valid).toBe(true);
1052
+ expect((0, _index.validatePattern)(nodes, 'link* > t').valid).toBe(true);
1053
+ expect((0, _index.validatePattern)(nodes, 'link? > link > t').valid).toBe(true);
1054
+ });
1055
+ });
1056
+ describe('Complex Entity Link Patterns', () => {
1057
+ it('matches mixed entity and regular links in sequence', () => {
1058
+ const nodes = createMockAstNodes(['entity_link:blog_post:abc123', 't', 'http_link', 't']);
1059
+ const result = (0, _index.validatePattern)(nodes, 'link[protocol="web5"] > t > link[protocol="http"] > t');
1060
+ expect(result.valid).toBe(true);
1061
+ });
1062
+ it('matches entity links in alternation', () => {
1063
+ const nodes1 = createMockAstNodes(['h2', 'entity_link:blog_post:1', 't']);
1064
+ const nodes2 = createMockAstNodes(['h2', 'entity_link:product:1', 't']);
1065
+ const pattern = 'h2 > (link[entityType="blog_post"] | link[entityType="product"]) > t';
1066
+ expect((0, _index.validatePattern)(nodes1, pattern).valid).toBe(true);
1067
+ expect((0, _index.validatePattern)(nodes2, pattern).valid).toBe(true);
1068
+ });
1069
+ it('matches entity links in groups with quantifiers', () => {
1070
+ const nodes = createMockAstNodes(['h2', 'entity_link:blog_post:1', 't', 'entity_link:blog_post:2', 't']);
1071
+ const result = (0, _index.validatePattern)(nodes, 'h2 > (link[entityType="blog_post"] > t)+');
1072
+ expect(result.valid).toBe(true);
1073
+ expect(result.endIndex).toBe(4);
1074
+ });
1075
+ it('matches real-world blog post pattern with entity links', () => {
1076
+ const nodes = createMockAstNodes(['h2', 't', 'entity_link:blog_post:123', 'image', 't', 'entity_link:blog_post:456', 'image', 't']);
1077
+ const pattern = 'h2 > t > (link[entityType="blog_post"] > image > t)+';
1078
+ expect((0, _index.validatePattern)(nodes, pattern).valid).toBe(true);
1079
+ });
1080
+ it('matches pattern with entity type prefix matching', () => {
1081
+ const nodes = createMockAstNodes(['entity_link:blog_post:1', 'entity_link:blog_article:2', 't']);
1082
+ // Match any link where entityType starts with "blog"
1083
+ const result = (0, _index.validatePattern)(nodes, 'link[entityType^="blog"]+ > t');
1084
+ expect(result.valid).toBe(true);
1085
+ });
1086
+ });
1087
+ describe('Image Attribute Selectors', () => {
1088
+ describe('Pattern Syntax Validation', () => {
1089
+ it('validates image attribute selector syntax', () => {
1090
+ expect((0, _index.validatePatternSyntax)('image[type]').valid).toBe(true);
1091
+ expect((0, _index.validatePatternSyntax)('image[type="icon"]').valid).toBe(true);
1092
+ expect((0, _index.validatePatternSyntax)('image[src]').valid).toBe(true);
1093
+ expect((0, _index.validatePatternSyntax)('image[alt="money"]').valid).toBe(true);
1094
+ });
1095
+ it('validates image attribute operators', () => {
1096
+ expect((0, _index.validatePatternSyntax)('image[src*="web5"]').valid).toBe(true);
1097
+ expect((0, _index.validatePatternSyntax)('image[src^="web5://"]').valid).toBe(true);
1098
+ expect((0, _index.validatePatternSyntax)('image[alt$="icon"]').valid).toBe(true);
1099
+ });
1100
+ it('validates multiple image attributes', () => {
1101
+ expect((0, _index.validatePatternSyntax)('image[type="icon"][alt]').valid).toBe(true);
1102
+ });
1103
+ it('validates image attributes with quantifiers', () => {
1104
+ expect((0, _index.validatePatternSyntax)('image[type="icon"]?').valid).toBe(true);
1105
+ expect((0, _index.validatePatternSyntax)('image[type="icon"]*').valid).toBe(true);
1106
+ expect((0, _index.validatePatternSyntax)('image[type="icon"]+').valid).toBe(true);
1107
+ expect((0, _index.validatePatternSyntax)('image[type="icon"][2]').valid).toBe(true);
1108
+ expect((0, _index.validatePatternSyntax)('image[type="icon"][1-3]').valid).toBe(true);
1109
+ });
1110
+ it('validates image attributes in sequences', () => {
1111
+ expect((0, _index.validatePatternSyntax)('h2 > image[type="icon"] > t').valid).toBe(true);
1112
+ });
1113
+ it('validates image attributes in groups and alternation', () => {
1114
+ expect((0, _index.validatePatternSyntax)('(image[type="icon"] | image[type="illustration"])').valid).toBe(true);
1115
+ expect((0, _index.validatePatternSyntax)('(t > image[type="icon"])+').valid).toBe(true);
1116
+ });
1117
+ it('validates image attributes in list item patterns', () => {
1118
+ expect((0, _index.validatePatternSyntax)('h2 > list{item[2-]:(image[type="icon"] | h3 | t | link)* > t+}').valid).toBe(true);
1119
+ });
1120
+ });
1121
+ describe('Image Attribute Matching', () => {
1122
+ it('matches web5 illustration with type="illustration"', () => {
1123
+ const nodes = createMockAstNodes(['web5_image:illustration:chart', 't']);
1124
+ const result = (0, _index.validatePattern)(nodes, 'image[type="illustration"] > t');
1125
+ expect(result.valid).toBe(true);
1126
+ });
1127
+ it('does not match regular image when type is required', () => {
1128
+ const nodes = createMockAstNodes(['image', 't']);
1129
+ const result = (0, _index.validatePattern)(nodes, 'image[type] > t');
1130
+ expect(result.valid).toBe(false);
1131
+ });
1132
+ it('does not match regular image with src starts-with web5://', () => {
1133
+ const nodes = createMockAstNodes(['image', 't']);
1134
+ const result = (0, _index.validatePattern)(nodes, 'image[src^="web5://"] > t');
1135
+ expect(result.valid).toBe(false);
1136
+ });
1137
+ it('plain image pattern does not match icon element', () => {
1138
+ const iconNodes = createMockAstNodes(['web5_icon:dollar', 't']);
1139
+ expect((0, _index.validatePattern)(iconNodes, 'image > t').valid).toBe(false);
1140
+ const regularNodes = createMockAstNodes(['image', 't']);
1141
+ expect((0, _index.validatePattern)(regularNodes, 'image > t').valid).toBe(true);
1142
+ });
1143
+ });
1144
+ describe('Icon BlockElement Matching', () => {
1145
+ it('matches web5 icon with icon pattern', () => {
1146
+ const nodes = createMockAstNodes(['web5_icon:dollar', 't']);
1147
+ const result = (0, _index.validatePattern)(nodes, 'icon > t');
1148
+ expect(result.valid).toBe(true);
1149
+ });
1150
+ it('does not match regular image with icon pattern', () => {
1151
+ const nodes = createMockAstNodes(['image', 't']);
1152
+ const result = (0, _index.validatePattern)(nodes, 'icon > t');
1153
+ expect(result.valid).toBe(false);
1154
+ });
1155
+ });
1156
+ describe('Icon in List Items', () => {
1157
+ it('matches list items with icons using icon pattern', () => {
1158
+ const nodes = createMockAstNodes(['h2', 'list{[web5_icon, t], [web5_icon, t]}']);
1159
+ const result = (0, _index.validatePattern)(nodes, 'h2 > list{item[2-]:icon > t}');
1160
+ expect(result.valid).toBe(true);
1161
+ });
1162
+ it('rejects list items with regular images when icon is required', () => {
1163
+ const nodes = createMockAstNodes(['h2', 'list{[image, t], [image, t]}']);
1164
+ const result = (0, _index.validatePattern)(nodes, 'h2 > list{item[2-]:icon > t}');
1165
+ expect(result.valid).toBe(false);
1166
+ });
1167
+ it('matches FeatureSection9Plus pattern with icons in list items', () => {
1168
+ const nodes = createMockAstNodes(['h2', 'list{[web5_icon, t, t], [web5_icon, t, t]}']);
1169
+ const result = (0, _index.validatePattern)(nodes, 'h2 > list{item[2-]:(icon | h3 | t | link)* > t+}');
1170
+ expect(result.valid).toBe(true);
1171
+ });
1172
+ it('matches FeatureSection9Plus pattern without icons (backward compat)', () => {
1173
+ const nodes = createMockAstNodes(['h2', 'list{[t, t], [t, t]}']);
1174
+ const result = (0, _index.validatePattern)(nodes, 'h2 > list{item[2-]:(icon | h3 | t | link)* > t+}');
1175
+ expect(result.valid).toBe(true);
1176
+ });
1177
+ it('matches alternation of icon and text in list items', () => {
1178
+ const nodes = createMockAstNodes(['h2', 'list{[web5_icon, t, link], [t, link]}']);
1179
+ const result = (0, _index.validatePattern)(nodes, 'h2 > list{item[1-]:(icon | t)* > (t? > link)+}');
1180
+ expect(result.valid).toBe(true);
1181
+ });
1182
+ });
1183
+ });
1184
+ });
1185
+ });
1186
+ describe('Stop clause (~)', () => {
1187
+ const comment = content => ({
1188
+ type: 'html',
1189
+ value: `<!-- ${content} -->`
1190
+ });
1191
+ describe('Syntax validation', () => {
1192
+ it('accepts a bare stop element', () => {
1193
+ expect((0, _index.validatePatternSyntax)('html_comment > t* ~ html_comment').valid).toBe(true);
1194
+ });
1195
+ it('accepts a stop element with attributes', () => {
1196
+ expect((0, _index.validatePatternSyntax)('html_comment > (t | list)* ~ html_comment[type="end"]').valid).toBe(true);
1197
+ expect((0, _index.validatePatternSyntax)('h2 > t* ~ link[entityType="solution"]').valid).toBe(true);
1198
+ expect((0, _index.validatePatternSyntax)('h2 > t* ~ image[type="icon"]').valid).toBe(true);
1199
+ });
1200
+ it('rejects a trailing ~ with no element', () => {
1201
+ const result = (0, _index.validatePatternSyntax)('h2 > t* ~');
1202
+ expect(result.valid).toBe(false);
1203
+ expect(result.error).toContain("Expected a single element after '~'");
1204
+ });
1205
+ it('rejects quantifiers on the stop element', () => {
1206
+ expect((0, _index.validatePatternSyntax)('h2 > t* ~ html_comment+').valid).toBe(false);
1207
+ expect((0, _index.validatePatternSyntax)('h2 > t* ~ html_comment*').valid).toBe(false);
1208
+ expect((0, _index.validatePatternSyntax)('h2 > t* ~ html_comment[2]').valid).toBe(false);
1209
+ });
1210
+ it('rejects groups after ~', () => {
1211
+ expect((0, _index.validatePatternSyntax)('h2 > t* ~ (h2 | t)').valid).toBe(false);
1212
+ });
1213
+ it('rejects a second ~', () => {
1214
+ expect((0, _index.validatePatternSyntax)('h2 > t* ~ html_comment ~ t').valid).toBe(false);
1215
+ });
1216
+ it('rejects tokens after the stop clause', () => {
1217
+ expect((0, _index.validatePatternSyntax)('h2 > t* ~ html_comment > t').valid).toBe(false);
1218
+ });
1219
+ });
1220
+ describe('Matching', () => {
1221
+ it('stops before an attribute-matched end comment even when the loop accepts comments', () => {
1222
+ const nodes = [comment('semantic: intro'), ...createMockAstNodes(['t', 't']), comment('type: end')];
1223
+ const result = (0, _index.validatePattern)(nodes, 'html_comment > (t | html_comment)* ~ html_comment[type="end"]');
1224
+ expect(result.valid).toBe(true);
1225
+ expect(result.astEndIndex).toBe(2); // end comment (index 3) excluded
1226
+ });
1227
+ it('consumes the end comment without a stop clause (baseline greedy behavior)', () => {
1228
+ const nodes = [comment('semantic: intro'), ...createMockAstNodes(['t', 't']), comment('type: end')];
1229
+ const result = (0, _index.validatePattern)(nodes, 'html_comment > (t | html_comment)*');
1230
+ expect(result.valid).toBe(true);
1231
+ expect(result.astEndIndex).toBe(3);
1232
+ });
1233
+ it('stops before an identical end comment (candidate retry)', () => {
1234
+ const nodes = createMockAstNodes(['html_comment', 't', 't', 'html_comment']);
1235
+ const result = (0, _index.validatePattern)(nodes, 'html_comment > t* ~ html_comment');
1236
+ expect(result.valid).toBe(true);
1237
+ expect(result.astEndIndex).toBe(2);
1238
+ });
1239
+ it('matches at end-of-input when the stop marker is absent (streaming)', () => {
1240
+ const nodes = [comment('semantic: intro'), ...createMockAstNodes(['t', 't'])];
1241
+ const result = (0, _index.validatePattern)(nodes, 'html_comment > t* ~ html_comment[type="end"]');
1242
+ expect(result.valid).toBe(true);
1243
+ expect(result.astEndIndex).toBe(2);
1244
+ });
1245
+ it('fails when the marker is present but no valid prefix exists', () => {
1246
+ const nodes = createMockAstNodes(['t', 't', 'html_comment']);
1247
+ const result = (0, _index.validatePattern)(nodes, 'h2 > t* ~ html_comment');
1248
+ expect(result.valid).toBe(false);
1249
+ expect(result.error).toContain('stop marker');
1250
+ });
1251
+ it('does not match through a marker even if the full input would match', () => {
1252
+ const nodes = createMockAstNodes(['html_comment', 't', 'html_comment', 't']);
1253
+ // Without the stop clause the full input matches
1254
+ expect((0, _index.validatePattern)(nodes, 'html_comment > t > html_comment > t').valid).toBe(true);
1255
+ const result = (0, _index.validatePattern)(nodes, 'html_comment > t > html_comment > t ~ html_comment');
1256
+ expect(result.valid).toBe(false);
1257
+ });
1258
+ it('fails when the only marker is at the start (empty prefix)', () => {
1259
+ const nodes = createMockAstNodes(['html_comment', 't']);
1260
+ const result = (0, _index.validatePattern)(nodes, 't ~ html_comment');
1261
+ expect(result.valid).toBe(false);
1262
+ });
1263
+ it('keeps extra-elements-before-marker semantics', () => {
1264
+ const nodes = createMockAstNodes(['h2', 't', 't', 'html_comment']);
1265
+ const result = (0, _index.validatePattern)(nodes, 'h2 > t ~ html_comment');
1266
+ expect(result.valid).toBe(true);
1267
+ expect(result.astEndIndex).toBe(1); // second t is extra, marker untouched
1268
+ });
1269
+ it('supports stopping at non-comment elements', () => {
1270
+ const nodes = createMockAstNodes(['h2', 't', 't', 'h2', 't']);
1271
+ const result = (0, _index.validatePattern)(nodes, 'h2 > t+ ~ h2');
1272
+ expect(result.valid).toBe(true);
1273
+ expect(result.astEndIndex).toBe(2);
1274
+ });
1275
+ });
1276
+ });
1277
+ //# sourceMappingURL=validator.test.js.map