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