@supersoniks/concorde 4.8.0 → 4.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (701) hide show
  1. package/.github/workflows/ci.yml +21 -0
  2. package/.github-export-ignore +30 -0
  3. package/.gitlab-ci.yml +13 -0
  4. package/CONTRIBUTING.md +59 -0
  5. package/DEV.md +54 -0
  6. package/LICENSE +21 -0
  7. package/OPEN_SOURCE_CHECKPOINT.md +133 -0
  8. package/README.md +29 -15
  9. package/build-infos.json +1 -1
  10. package/concorde-core.bundle.js +271 -271
  11. package/concorde-core.es.js +4503 -4389
  12. package/dist/concorde-core.bundle.js +271 -271
  13. package/dist/concorde-core.es.js +4503 -4389
  14. package/dist/docs-mock-api-sw.js +3 -2
  15. package/dist/docs-mock-api-sw.js.map +2 -2
  16. package/dist/js/components.js +12 -0
  17. package/dist/js/components.js.map +1 -0
  18. package/dist/js/concorde-loaded.js +5 -0
  19. package/dist/js/concorde-loaded.js.map +1 -0
  20. package/dist/js/core/_types/endpoint.js +5 -0
  21. package/dist/js/core/_types/endpoint.js.map +1 -0
  22. package/dist/js/core/_types/key.js +2 -0
  23. package/dist/js/core/_types/key.js.map +1 -0
  24. package/dist/js/core/_types/types.js +3 -0
  25. package/dist/js/core/_types/types.js.map +1 -0
  26. package/dist/js/core/components/functional/date/date.js +272 -0
  27. package/dist/js/core/components/functional/date/date.js.map +1 -0
  28. package/dist/js/core/components/functional/example/example.js +44 -0
  29. package/dist/js/core/components/functional/example/example.js.map +1 -0
  30. package/dist/js/core/components/functional/fetch/fetch.js +79 -0
  31. package/dist/js/core/components/functional/fetch/fetch.js.map +1 -0
  32. package/dist/js/core/components/functional/functional.js +17 -0
  33. package/dist/js/core/components/functional/functional.js.map +1 -0
  34. package/dist/js/core/components/functional/if/if.js +39 -0
  35. package/dist/js/core/components/functional/if/if.js.map +1 -0
  36. package/dist/js/core/components/functional/list/list.js +341 -0
  37. package/dist/js/core/components/functional/list/list.js.map +1 -0
  38. package/dist/js/core/components/functional/mix/mix.js +103 -0
  39. package/dist/js/core/components/functional/mix/mix.js.map +1 -0
  40. package/dist/js/core/components/functional/queue/queue.js +386 -0
  41. package/dist/js/core/components/functional/queue/queue.js.map +1 -0
  42. package/dist/js/core/components/functional/router/redirect.js +54 -0
  43. package/dist/js/core/components/functional/router/redirect.js.map +1 -0
  44. package/dist/js/core/components/functional/router/router.js +179 -0
  45. package/dist/js/core/components/functional/router/router.js.map +1 -0
  46. package/dist/js/core/components/functional/sdui/SDUIDescriptorTransformer.js +216 -0
  47. package/dist/js/core/components/functional/sdui/SDUIDescriptorTransformer.js.map +1 -0
  48. package/dist/js/core/components/functional/sdui/default-library.json +108 -0
  49. package/dist/js/core/components/functional/sdui/sdui-utils.js +64 -0
  50. package/dist/js/core/components/functional/sdui/sdui-utils.js.map +1 -0
  51. package/dist/js/core/components/functional/sdui/sdui.js +266 -0
  52. package/dist/js/core/components/functional/sdui/sdui.js.map +1 -0
  53. package/dist/js/core/components/functional/sdui/types.js +2 -0
  54. package/dist/js/core/components/functional/sdui/types.js.map +1 -0
  55. package/dist/js/core/components/functional/sonic-scope/sonic-scope.js +22 -0
  56. package/dist/js/core/components/functional/sonic-scope/sonic-scope.js.map +1 -0
  57. package/dist/js/core/components/functional/states/states.js +172 -0
  58. package/dist/js/core/components/functional/states/states.js.map +1 -0
  59. package/dist/js/core/components/functional/submit/submit.js +284 -0
  60. package/dist/js/core/components/functional/submit/submit.js.map +1 -0
  61. package/dist/js/core/components/functional/subscriber/subscriber.js +39 -0
  62. package/dist/js/core/components/functional/subscriber/subscriber.js.map +1 -0
  63. package/dist/js/core/components/functional/translation/translation.js +28 -0
  64. package/dist/js/core/components/functional/translation/translation.js.map +1 -0
  65. package/dist/js/core/components/functional/value/value.js +28 -0
  66. package/dist/js/core/components/functional/value/value.js.map +1 -0
  67. package/dist/js/core/components/ui/_css/scroll.js +25 -0
  68. package/dist/js/core/components/ui/_css/scroll.js.map +1 -0
  69. package/dist/js/core/components/ui/_css/shadow.js +22 -0
  70. package/dist/js/core/components/ui/_css/shadow.js.map +1 -0
  71. package/dist/js/core/components/ui/_css/size.js +36 -0
  72. package/dist/js/core/components/ui/_css/size.js.map +1 -0
  73. package/dist/js/core/components/ui/_css/type.js +92 -0
  74. package/dist/js/core/components/ui/_css/type.js.map +1 -0
  75. package/dist/js/core/components/ui/alert/alert.js +213 -0
  76. package/dist/js/core/components/ui/alert/alert.js.map +1 -0
  77. package/dist/js/core/components/ui/alert-messages/alert-messages.js +68 -0
  78. package/dist/js/core/components/ui/alert-messages/alert-messages.js.map +1 -0
  79. package/dist/js/core/components/ui/badge/badge.js +199 -0
  80. package/dist/js/core/components/ui/badge/badge.js.map +1 -0
  81. package/dist/js/core/components/ui/button/button.js +697 -0
  82. package/dist/js/core/components/ui/button/button.js.map +1 -0
  83. package/dist/js/core/components/ui/captcha/altchaStyles.js +226 -0
  84. package/dist/js/core/components/ui/captcha/altchaStyles.js.map +1 -0
  85. package/dist/js/core/components/ui/captcha/captcha.js +167 -0
  86. package/dist/js/core/components/ui/captcha/captcha.js.map +1 -0
  87. package/dist/js/core/components/ui/card/card-footer.js +26 -0
  88. package/dist/js/core/components/ui/card/card-footer.js.map +1 -0
  89. package/dist/js/core/components/ui/card/card-header-descripton.js +30 -0
  90. package/dist/js/core/components/ui/card/card-header-descripton.js.map +1 -0
  91. package/dist/js/core/components/ui/card/card-header.js +79 -0
  92. package/dist/js/core/components/ui/card/card-header.js.map +1 -0
  93. package/dist/js/core/components/ui/card/card-main.js +26 -0
  94. package/dist/js/core/components/ui/card/card-main.js.map +1 -0
  95. package/dist/js/core/components/ui/card/card.js +67 -0
  96. package/dist/js/core/components/ui/card/card.js.map +1 -0
  97. package/dist/js/core/components/ui/divider/divider.js +200 -0
  98. package/dist/js/core/components/ui/divider/divider.js.map +1 -0
  99. package/dist/js/core/components/ui/form/checkbox/checkbox.js +257 -0
  100. package/dist/js/core/components/ui/form/checkbox/checkbox.js.map +1 -0
  101. package/dist/js/core/components/ui/form/css/form-control.js +393 -0
  102. package/dist/js/core/components/ui/form/css/form-control.js.map +1 -0
  103. package/dist/js/core/components/ui/form/fieldset/fieldset.js +124 -0
  104. package/dist/js/core/components/ui/form/fieldset/fieldset.js.map +1 -0
  105. package/dist/js/core/components/ui/form/fieldset/legend-description.js +38 -0
  106. package/dist/js/core/components/ui/form/fieldset/legend-description.js.map +1 -0
  107. package/dist/js/core/components/ui/form/fieldset/legend.js +130 -0
  108. package/dist/js/core/components/ui/form/fieldset/legend.js.map +1 -0
  109. package/dist/js/core/components/ui/form/form-actions/form-actions.js +47 -0
  110. package/dist/js/core/components/ui/form/form-actions/form-actions.js.map +1 -0
  111. package/dist/js/core/components/ui/form/form-layout/form-layout.js +84 -0
  112. package/dist/js/core/components/ui/form/form-layout/form-layout.js.map +1 -0
  113. package/dist/js/core/components/ui/form/input/input.js +316 -0
  114. package/dist/js/core/components/ui/form/input/input.js.map +1 -0
  115. package/dist/js/core/components/ui/form/input/password-helper.js +134 -0
  116. package/dist/js/core/components/ui/form/input/password-helper.js.map +1 -0
  117. package/dist/js/core/components/ui/form/input/same-value-helper.js +85 -0
  118. package/dist/js/core/components/ui/form/input/same-value-helper.js.map +1 -0
  119. package/dist/js/core/components/ui/form/input-autocomplete/input-autocomplete.js +405 -0
  120. package/dist/js/core/components/ui/form/input-autocomplete/input-autocomplete.js.map +1 -0
  121. package/dist/js/core/components/ui/form/radio/radio.js +63 -0
  122. package/dist/js/core/components/ui/form/radio/radio.js.map +1 -0
  123. package/dist/js/core/components/ui/form/select/select.js +323 -0
  124. package/dist/js/core/components/ui/form/select/select.js.map +1 -0
  125. package/dist/js/core/components/ui/form/switch/switch.js +90 -0
  126. package/dist/js/core/components/ui/form/switch/switch.js.map +1 -0
  127. package/dist/js/core/components/ui/form/textarea/textarea.js +162 -0
  128. package/dist/js/core/components/ui/form/textarea/textarea.js.map +1 -0
  129. package/dist/js/core/components/ui/group/group.js +128 -0
  130. package/dist/js/core/components/ui/group/group.js.map +1 -0
  131. package/dist/js/core/components/ui/icon/icon.js +129 -0
  132. package/dist/js/core/components/ui/icon/icon.js.map +1 -0
  133. package/dist/js/core/components/ui/icon/icons.js +163 -0
  134. package/dist/js/core/components/ui/icon/icons.js.map +1 -0
  135. package/dist/js/core/components/ui/icon/icons.json +1 -0
  136. package/dist/js/core/components/ui/image/image.js +160 -0
  137. package/dist/js/core/components/ui/image/image.js.map +1 -0
  138. package/dist/js/core/components/ui/link/link.js +125 -0
  139. package/dist/js/core/components/ui/link/link.js.map +1 -0
  140. package/dist/js/core/components/ui/loader/loader.js +106 -0
  141. package/dist/js/core/components/ui/loader/loader.js.map +1 -0
  142. package/dist/js/core/components/ui/loader/styles/fixed.js +56 -0
  143. package/dist/js/core/components/ui/loader/styles/fixed.js.map +1 -0
  144. package/dist/js/core/components/ui/loader/styles/inline.js +70 -0
  145. package/dist/js/core/components/ui/loader/styles/inline.js.map +1 -0
  146. package/dist/js/core/components/ui/menu/menu-item.js +35 -0
  147. package/dist/js/core/components/ui/menu/menu-item.js.map +1 -0
  148. package/dist/js/core/components/ui/menu/menu.js +436 -0
  149. package/dist/js/core/components/ui/menu/menu.js.map +1 -0
  150. package/dist/js/core/components/ui/modal/modal-actions.js +44 -0
  151. package/dist/js/core/components/ui/modal/modal-actions.js.map +1 -0
  152. package/dist/js/core/components/ui/modal/modal-close.js +56 -0
  153. package/dist/js/core/components/ui/modal/modal-close.js.map +1 -0
  154. package/dist/js/core/components/ui/modal/modal-content.js +27 -0
  155. package/dist/js/core/components/ui/modal/modal-content.js.map +1 -0
  156. package/dist/js/core/components/ui/modal/modal-subtitle.js +34 -0
  157. package/dist/js/core/components/ui/modal/modal-subtitle.js.map +1 -0
  158. package/dist/js/core/components/ui/modal/modal-title.js +35 -0
  159. package/dist/js/core/components/ui/modal/modal-title.js.map +1 -0
  160. package/dist/js/core/components/ui/modal/modal-utils.js +32 -0
  161. package/dist/js/core/components/ui/modal/modal-utils.js.map +1 -0
  162. package/dist/js/core/components/ui/modal/modal.js +568 -0
  163. package/dist/js/core/components/ui/modal/modal.js.map +1 -0
  164. package/dist/js/core/components/ui/pop/pop.js +337 -0
  165. package/dist/js/core/components/ui/pop/pop.js.map +1 -0
  166. package/dist/js/core/components/ui/progress/progress.js +164 -0
  167. package/dist/js/core/components/ui/progress/progress.js.map +1 -0
  168. package/dist/js/core/components/ui/table/table-caption.js +29 -0
  169. package/dist/js/core/components/ui/table/table-caption.js.map +1 -0
  170. package/dist/js/core/components/ui/table/table-tbody.js +41 -0
  171. package/dist/js/core/components/ui/table/table-tbody.js.map +1 -0
  172. package/dist/js/core/components/ui/table/table-td.js +69 -0
  173. package/dist/js/core/components/ui/table/table-td.js.map +1 -0
  174. package/dist/js/core/components/ui/table/table-tfoot.js +28 -0
  175. package/dist/js/core/components/ui/table/table-tfoot.js.map +1 -0
  176. package/dist/js/core/components/ui/table/table-th.js +80 -0
  177. package/dist/js/core/components/ui/table/table-th.js.map +1 -0
  178. package/dist/js/core/components/ui/table/table-thead.js +26 -0
  179. package/dist/js/core/components/ui/table/table-thead.js.map +1 -0
  180. package/dist/js/core/components/ui/table/table-tr.js +67 -0
  181. package/dist/js/core/components/ui/table/table-tr.js.map +1 -0
  182. package/dist/js/core/components/ui/table/table.js +106 -0
  183. package/dist/js/core/components/ui/table/table.js.map +1 -0
  184. package/dist/js/core/components/ui/theme/theme-collection/core-variables.js +74 -0
  185. package/dist/js/core/components/ui/theme/theme-collection/core-variables.js.map +1 -0
  186. package/dist/js/core/components/ui/theme/theme-collection/dark.js +39 -0
  187. package/dist/js/core/components/ui/theme/theme-collection/dark.js.map +1 -0
  188. package/dist/js/core/components/ui/theme/theme-collection/light.js +32 -0
  189. package/dist/js/core/components/ui/theme/theme-collection/light.js.map +1 -0
  190. package/dist/js/core/components/ui/theme/theme.js +150 -0
  191. package/dist/js/core/components/ui/theme/theme.js.map +1 -0
  192. package/dist/js/core/components/ui/toast/message-subscriber.js +41 -0
  193. package/dist/js/core/components/ui/toast/message-subscriber.js.map +1 -0
  194. package/dist/js/core/components/ui/toast/toast-item.js +379 -0
  195. package/dist/js/core/components/ui/toast/toast-item.js.map +1 -0
  196. package/dist/js/core/components/ui/toast/toast.js +269 -0
  197. package/dist/js/core/components/ui/toast/toast.js.map +1 -0
  198. package/dist/js/core/components/ui/toast/types.js +2 -0
  199. package/dist/js/core/components/ui/toast/types.js.map +1 -0
  200. package/dist/js/core/components/ui/tooltip/tooltip.js +219 -0
  201. package/dist/js/core/components/ui/tooltip/tooltip.js.map +1 -0
  202. package/dist/js/core/components/ui/ui.js +41 -0
  203. package/dist/js/core/components/ui/ui.js.map +1 -0
  204. package/dist/js/core/core.js +14 -0
  205. package/dist/js/core/core.js.map +1 -0
  206. package/dist/js/core/decorators/Subscriber.js +9 -0
  207. package/dist/js/core/decorators/Subscriber.js.map +1 -0
  208. package/dist/js/core/decorators/api.js +611 -0
  209. package/dist/js/core/decorators/api.js.map +1 -0
  210. package/dist/js/core/decorators/lifecycle.js +67 -0
  211. package/dist/js/core/decorators/lifecycle.js.map +1 -0
  212. package/dist/js/core/decorators/subscriber/ancestorAttribute.js +27 -0
  213. package/dist/js/core/decorators/subscriber/ancestorAttribute.js.map +1 -0
  214. package/dist/js/core/decorators/subscriber/autoFill.js +26 -0
  215. package/dist/js/core/decorators/subscriber/autoFill.js.map +1 -0
  216. package/dist/js/core/decorators/subscriber/autoSubscribe.js +46 -0
  217. package/dist/js/core/decorators/subscriber/autoSubscribe.js.map +1 -0
  218. package/dist/js/core/decorators/subscriber/bind.js +150 -0
  219. package/dist/js/core/decorators/subscriber/bind.js.map +1 -0
  220. package/dist/js/core/decorators/subscriber/common.js +44 -0
  221. package/dist/js/core/decorators/subscriber/common.js.map +1 -0
  222. package/dist/js/core/decorators/subscriber/dynamicPath.js +75 -0
  223. package/dist/js/core/decorators/subscriber/dynamicPath.js.map +1 -0
  224. package/dist/js/core/decorators/subscriber/dynamicPropertyWatch.js +138 -0
  225. package/dist/js/core/decorators/subscriber/dynamicPropertyWatch.js.map +1 -0
  226. package/dist/js/core/decorators/subscriber/handle.js +22 -0
  227. package/dist/js/core/decorators/subscriber/handle.js.map +1 -0
  228. package/dist/js/core/decorators/subscriber/onAssign.js +199 -0
  229. package/dist/js/core/decorators/subscriber/onAssign.js.map +1 -0
  230. package/dist/js/core/decorators/subscriber/publish.js +108 -0
  231. package/dist/js/core/decorators/subscriber/publish.js.map +1 -0
  232. package/dist/js/core/decorators/subscriber/publisherPath.js +16 -0
  233. package/dist/js/core/decorators/subscriber/publisherPath.js.map +1 -0
  234. package/dist/js/core/decorators/subscriber/subscribe.js +20 -0
  235. package/dist/js/core/decorators/subscriber/subscribe.js.map +1 -0
  236. package/dist/js/core/directives/DataProvider.js +127 -0
  237. package/dist/js/core/directives/DataProvider.js.map +1 -0
  238. package/dist/js/core/directives/Wording.js +221 -0
  239. package/dist/js/core/directives/Wording.js.map +1 -0
  240. package/dist/js/core/mixins/Fetcher.js +325 -0
  241. package/dist/js/core/mixins/Fetcher.js.map +1 -0
  242. package/dist/js/core/mixins/FormCheckable.js +313 -0
  243. package/dist/js/core/mixins/FormCheckable.js.map +1 -0
  244. package/dist/js/core/mixins/FormElement.js +304 -0
  245. package/dist/js/core/mixins/FormElement.js.map +1 -0
  246. package/dist/js/core/mixins/FormInput.js +82 -0
  247. package/dist/js/core/mixins/FormInput.js.map +1 -0
  248. package/dist/js/core/mixins/Subscriber.js +354 -0
  249. package/dist/js/core/mixins/Subscriber.js.map +1 -0
  250. package/dist/js/core/mixins/TemplatesContainer.js +70 -0
  251. package/dist/js/core/mixins/TemplatesContainer.js.map +1 -0
  252. package/dist/js/core/mixins/mixins.js +7 -0
  253. package/dist/js/core/mixins/mixins.js.map +1 -0
  254. package/dist/js/core/utils/AncestorAttributeObserver.js +140 -0
  255. package/dist/js/core/utils/AncestorAttributeObserver.js.map +1 -0
  256. package/dist/js/core/utils/Arrays.js +141 -0
  257. package/dist/js/core/utils/Arrays.js.map +1 -0
  258. package/dist/js/core/utils/DataBindObserver.js +265 -0
  259. package/dist/js/core/utils/DataBindObserver.js.map +1 -0
  260. package/dist/js/core/utils/Electron.js +14 -0
  261. package/dist/js/core/utils/Electron.js.map +1 -0
  262. package/dist/js/core/utils/Format.js +43 -0
  263. package/dist/js/core/utils/Format.js.map +1 -0
  264. package/dist/js/core/utils/HTML.js +248 -0
  265. package/dist/js/core/utils/HTML.js.map +1 -0
  266. package/dist/js/core/utils/LocationHandler.js +143 -0
  267. package/dist/js/core/utils/LocationHandler.js.map +1 -0
  268. package/dist/js/core/utils/Objects.js +111 -0
  269. package/dist/js/core/utils/Objects.js.map +1 -0
  270. package/dist/js/core/utils/PublisherProxy.js +946 -0
  271. package/dist/js/core/utils/PublisherProxy.js.map +1 -0
  272. package/dist/js/core/utils/Utils.js +19 -0
  273. package/dist/js/core/utils/Utils.js.map +1 -0
  274. package/dist/js/core/utils/aesCrypto.js +98 -0
  275. package/dist/js/core/utils/aesCrypto.js.map +1 -0
  276. package/dist/js/core/utils/api.js +574 -0
  277. package/dist/js/core/utils/api.js.map +1 -0
  278. package/dist/js/core/utils/dataProviderKey.js +64 -0
  279. package/dist/js/core/utils/dataProviderKey.js.map +1 -0
  280. package/dist/js/core/utils/endpoint.js +74 -0
  281. package/dist/js/core/utils/endpoint.js.map +1 -0
  282. package/dist/js/core/utils/route.js +149 -0
  283. package/dist/js/core/utils/route.js.map +1 -0
  284. package/dist/js/core/utils/url-pattern.js +3 -0
  285. package/dist/js/core/utils/url-pattern.js.map +1 -0
  286. package/dist/js/dataprovider.js +2 -0
  287. package/dist/js/dataprovider.js.map +1 -0
  288. package/dist/js/decorators.js +39 -0
  289. package/dist/js/decorators.js.map +1 -0
  290. package/dist/js/directives.js +30 -0
  291. package/dist/js/directives.js.map +1 -0
  292. package/dist/js/index.js +8 -0
  293. package/dist/js/index.js.map +1 -0
  294. package/dist/js/mixins.js +23 -0
  295. package/dist/js/mixins.js.map +1 -0
  296. package/dist/js/test-utils/TestUtils.js +10 -0
  297. package/dist/js/test-utils/TestUtils.js.map +1 -0
  298. package/dist/js/utils.js +41 -0
  299. package/dist/js/utils.js.map +1 -0
  300. package/dist/types/components.d.ts +5 -0
  301. package/dist/types/components.d.ts.map +1 -0
  302. package/dist/types/concorde-loaded.d.ts +2 -0
  303. package/dist/types/concorde-loaded.d.ts.map +1 -0
  304. package/dist/types/core/_types/endpoint.d.ts +5 -0
  305. package/dist/types/core/_types/endpoint.d.ts.map +1 -0
  306. package/dist/types/core/_types/key.d.ts +2 -0
  307. package/dist/types/core/_types/key.d.ts.map +1 -0
  308. package/dist/types/core/_types/types.d.ts +28 -0
  309. package/dist/types/core/_types/types.d.ts.map +1 -0
  310. package/dist/types/core/components/functional/date/date.d.ts +52 -0
  311. package/dist/types/core/components/functional/date/date.d.ts.map +1 -0
  312. package/dist/types/core/components/functional/example/example.d.ts +15 -0
  313. package/dist/types/core/components/functional/example/example.d.ts.map +1 -0
  314. package/dist/types/core/components/functional/fetch/fetch.d.ts +102 -0
  315. package/dist/types/core/components/functional/fetch/fetch.d.ts.map +1 -0
  316. package/dist/types/core/components/functional/functional.d.ts +17 -0
  317. package/dist/types/core/components/functional/functional.d.ts.map +1 -0
  318. package/dist/types/core/components/functional/if/if.d.ts +13 -0
  319. package/dist/types/core/components/functional/if/if.d.ts.map +1 -0
  320. package/dist/types/core/components/functional/list/list.d.ts +149 -0
  321. package/dist/types/core/components/functional/list/list.d.ts.map +1 -0
  322. package/dist/types/core/components/functional/mix/mix.d.ts +23 -0
  323. package/dist/types/core/components/functional/mix/mix.d.ts.map +1 -0
  324. package/dist/types/core/components/functional/queue/queue.d.ts +79 -0
  325. package/dist/types/core/components/functional/queue/queue.d.ts.map +1 -0
  326. package/dist/types/core/components/functional/router/redirect.d.ts +19 -0
  327. package/dist/types/core/components/functional/router/redirect.d.ts.map +1 -0
  328. package/dist/types/core/components/functional/router/router.d.ts +46 -0
  329. package/dist/types/core/components/functional/router/router.d.ts.map +1 -0
  330. package/dist/types/core/components/functional/sdui/SDUIDescriptorTransformer.d.ts +59 -0
  331. package/dist/types/core/components/functional/sdui/SDUIDescriptorTransformer.d.ts.map +1 -0
  332. package/dist/types/core/components/functional/sdui/sdui-utils.d.ts +6 -0
  333. package/dist/types/core/components/functional/sdui/sdui-utils.d.ts.map +1 -0
  334. package/dist/types/core/components/functional/sdui/sdui.d.ts +145 -0
  335. package/dist/types/core/components/functional/sdui/sdui.d.ts.map +1 -0
  336. package/dist/types/core/components/functional/sdui/types.d.ts +38 -0
  337. package/dist/types/core/components/functional/sdui/types.d.ts.map +1 -0
  338. package/dist/types/core/components/functional/sonic-scope/sonic-scope.d.ts +6 -0
  339. package/dist/types/core/components/functional/sonic-scope/sonic-scope.d.ts.map +1 -0
  340. package/dist/types/core/components/functional/states/states.d.ts +42 -0
  341. package/dist/types/core/components/functional/states/states.d.ts.map +1 -0
  342. package/dist/types/core/components/functional/submit/submit.d.ts +37 -0
  343. package/dist/types/core/components/functional/submit/submit.d.ts.map +1 -0
  344. package/dist/types/core/components/functional/subscriber/subscriber.d.ts +13 -0
  345. package/dist/types/core/components/functional/subscriber/subscriber.d.ts.map +1 -0
  346. package/dist/types/core/components/functional/translation/translation.d.ts +7 -0
  347. package/dist/types/core/components/functional/translation/translation.d.ts.map +1 -0
  348. package/dist/types/core/components/functional/value/value.d.ts +8 -0
  349. package/dist/types/core/components/functional/value/value.d.ts.map +1 -0
  350. package/dist/types/core/components/ui/_css/scroll.d.ts +2 -0
  351. package/dist/types/core/components/ui/_css/scroll.d.ts.map +1 -0
  352. package/dist/types/core/components/ui/_css/shadow.d.ts +3 -0
  353. package/dist/types/core/components/ui/_css/shadow.d.ts.map +1 -0
  354. package/dist/types/core/components/ui/_css/size.d.ts +3 -0
  355. package/dist/types/core/components/ui/_css/size.d.ts.map +1 -0
  356. package/dist/types/core/components/ui/_css/type.d.ts +3 -0
  357. package/dist/types/core/components/ui/_css/type.d.ts.map +1 -0
  358. package/dist/types/core/components/ui/alert/alert.d.ts +37 -0
  359. package/dist/types/core/components/ui/alert/alert.d.ts.map +1 -0
  360. package/dist/types/core/components/ui/alert-messages/alert-messages.d.ts +15 -0
  361. package/dist/types/core/components/ui/alert-messages/alert-messages.d.ts.map +1 -0
  362. package/dist/types/core/components/ui/badge/badge.d.ts +27 -0
  363. package/dist/types/core/components/ui/badge/badge.d.ts.map +1 -0
  364. package/dist/types/core/components/ui/button/button.d.ts +180 -0
  365. package/dist/types/core/components/ui/button/button.d.ts.map +1 -0
  366. package/dist/types/core/components/ui/captcha/altchaStyles.d.ts +2 -0
  367. package/dist/types/core/components/ui/captcha/altchaStyles.d.ts.map +1 -0
  368. package/dist/types/core/components/ui/captcha/captcha.d.ts +30 -0
  369. package/dist/types/core/components/ui/captcha/captcha.d.ts.map +1 -0
  370. package/dist/types/core/components/ui/card/card-footer.d.ts +6 -0
  371. package/dist/types/core/components/ui/card/card-footer.d.ts.map +1 -0
  372. package/dist/types/core/components/ui/card/card-header-descripton.d.ts +6 -0
  373. package/dist/types/core/components/ui/card/card-header-descripton.d.ts.map +1 -0
  374. package/dist/types/core/components/ui/card/card-header.d.ts +9 -0
  375. package/dist/types/core/components/ui/card/card-header.d.ts.map +1 -0
  376. package/dist/types/core/components/ui/card/card-main.d.ts +6 -0
  377. package/dist/types/core/components/ui/card/card-main.d.ts.map +1 -0
  378. package/dist/types/core/components/ui/card/card.d.ts +13 -0
  379. package/dist/types/core/components/ui/card/card.d.ts.map +1 -0
  380. package/dist/types/core/components/ui/divider/divider.d.ts +16 -0
  381. package/dist/types/core/components/ui/divider/divider.d.ts.map +1 -0
  382. package/dist/types/core/components/ui/form/checkbox/checkbox.d.ts +176 -0
  383. package/dist/types/core/components/ui/form/checkbox/checkbox.d.ts.map +1 -0
  384. package/dist/types/core/components/ui/form/css/form-control.d.ts +5 -0
  385. package/dist/types/core/components/ui/form/css/form-control.d.ts.map +1 -0
  386. package/dist/types/core/components/ui/form/fieldset/fieldset.d.ts +24 -0
  387. package/dist/types/core/components/ui/form/fieldset/fieldset.d.ts.map +1 -0
  388. package/dist/types/core/components/ui/form/fieldset/legend-description.d.ts +6 -0
  389. package/dist/types/core/components/ui/form/fieldset/legend-description.d.ts.map +1 -0
  390. package/dist/types/core/components/ui/form/fieldset/legend.d.ts +17 -0
  391. package/dist/types/core/components/ui/form/fieldset/legend.d.ts.map +1 -0
  392. package/dist/types/core/components/ui/form/form-actions/form-actions.d.ts +8 -0
  393. package/dist/types/core/components/ui/form/form-actions/form-actions.d.ts.map +1 -0
  394. package/dist/types/core/components/ui/form/form-layout/form-layout.d.ts +13 -0
  395. package/dist/types/core/components/ui/form/form-layout/form-layout.d.ts.map +1 -0
  396. package/dist/types/core/components/ui/form/input/input.d.ts +123 -0
  397. package/dist/types/core/components/ui/form/input/input.d.ts.map +1 -0
  398. package/dist/types/core/components/ui/form/input/password-helper.d.ts +26 -0
  399. package/dist/types/core/components/ui/form/input/password-helper.d.ts.map +1 -0
  400. package/dist/types/core/components/ui/form/input/same-value-helper.d.ts +17 -0
  401. package/dist/types/core/components/ui/form/input/same-value-helper.d.ts.map +1 -0
  402. package/dist/types/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts +155 -0
  403. package/dist/types/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts.map +1 -0
  404. package/dist/types/core/components/ui/form/radio/radio.d.ts +15 -0
  405. package/dist/types/core/components/ui/form/radio/radio.d.ts.map +1 -0
  406. package/dist/types/core/components/ui/form/select/select.d.ts +59 -0
  407. package/dist/types/core/components/ui/form/select/select.d.ts.map +1 -0
  408. package/dist/types/core/components/ui/form/switch/switch.d.ts +6 -0
  409. package/dist/types/core/components/ui/form/switch/switch.d.ts.map +1 -0
  410. package/dist/types/core/components/ui/form/textarea/textarea.d.ts +94 -0
  411. package/dist/types/core/components/ui/form/textarea/textarea.d.ts.map +1 -0
  412. package/dist/types/core/components/ui/group/group.d.ts +17 -0
  413. package/dist/types/core/components/ui/group/group.d.ts.map +1 -0
  414. package/dist/types/core/components/ui/icon/icon.d.ts +28 -0
  415. package/dist/types/core/components/ui/icon/icon.d.ts.map +1 -0
  416. package/dist/types/core/components/ui/icon/icons.d.ts +11 -0
  417. package/dist/types/core/components/ui/icon/icons.d.ts.map +1 -0
  418. package/dist/types/core/components/ui/image/image.d.ts +16 -0
  419. package/dist/types/core/components/ui/image/image.d.ts.map +1 -0
  420. package/dist/types/core/components/ui/link/link.d.ts +30 -0
  421. package/dist/types/core/components/ui/link/link.d.ts.map +1 -0
  422. package/dist/types/core/components/ui/loader/loader.d.ts +24 -0
  423. package/dist/types/core/components/ui/loader/loader.d.ts.map +1 -0
  424. package/dist/types/core/components/ui/loader/styles/fixed.d.ts +2 -0
  425. package/dist/types/core/components/ui/loader/styles/fixed.d.ts.map +1 -0
  426. package/dist/types/core/components/ui/loader/styles/inline.d.ts +2 -0
  427. package/dist/types/core/components/ui/loader/styles/inline.d.ts.map +1 -0
  428. package/dist/types/core/components/ui/menu/menu-item.d.ts +6 -0
  429. package/dist/types/core/components/ui/menu/menu-item.d.ts.map +1 -0
  430. package/dist/types/core/components/ui/menu/menu.d.ts +52 -0
  431. package/dist/types/core/components/ui/menu/menu.d.ts.map +1 -0
  432. package/dist/types/core/components/ui/modal/modal-actions.d.ts +9 -0
  433. package/dist/types/core/components/ui/modal/modal-actions.d.ts.map +1 -0
  434. package/dist/types/core/components/ui/modal/modal-close.d.ts +11 -0
  435. package/dist/types/core/components/ui/modal/modal-close.d.ts.map +1 -0
  436. package/dist/types/core/components/ui/modal/modal-content.d.ts +6 -0
  437. package/dist/types/core/components/ui/modal/modal-content.d.ts.map +1 -0
  438. package/dist/types/core/components/ui/modal/modal-subtitle.d.ts +6 -0
  439. package/dist/types/core/components/ui/modal/modal-subtitle.d.ts.map +1 -0
  440. package/dist/types/core/components/ui/modal/modal-title.d.ts +6 -0
  441. package/dist/types/core/components/ui/modal/modal-title.d.ts.map +1 -0
  442. package/dist/types/core/components/ui/modal/modal-utils.d.ts +4 -0
  443. package/dist/types/core/components/ui/modal/modal-utils.d.ts.map +1 -0
  444. package/dist/types/core/components/ui/modal/modal.d.ts +79 -0
  445. package/dist/types/core/components/ui/modal/modal.d.ts.map +1 -0
  446. package/dist/types/core/components/ui/pop/pop.d.ts +42 -0
  447. package/dist/types/core/components/ui/pop/pop.d.ts.map +1 -0
  448. package/dist/types/core/components/ui/progress/progress.d.ts +12 -0
  449. package/dist/types/core/components/ui/progress/progress.d.ts.map +1 -0
  450. package/dist/types/core/components/ui/table/table-caption.d.ts +6 -0
  451. package/dist/types/core/components/ui/table/table-caption.d.ts.map +1 -0
  452. package/dist/types/core/components/ui/table/table-tbody.d.ts +6 -0
  453. package/dist/types/core/components/ui/table/table-tbody.d.ts.map +1 -0
  454. package/dist/types/core/components/ui/table/table-td.d.ts +13 -0
  455. package/dist/types/core/components/ui/table/table-td.d.ts.map +1 -0
  456. package/dist/types/core/components/ui/table/table-tfoot.d.ts +6 -0
  457. package/dist/types/core/components/ui/table/table-tfoot.d.ts.map +1 -0
  458. package/dist/types/core/components/ui/table/table-th.d.ts +12 -0
  459. package/dist/types/core/components/ui/table/table-th.d.ts.map +1 -0
  460. package/dist/types/core/components/ui/table/table-thead.d.ts +6 -0
  461. package/dist/types/core/components/ui/table/table-thead.d.ts.map +1 -0
  462. package/dist/types/core/components/ui/table/table-tr.d.ts +14 -0
  463. package/dist/types/core/components/ui/table/table-tr.d.ts.map +1 -0
  464. package/dist/types/core/components/ui/table/table.d.ts +18 -0
  465. package/dist/types/core/components/ui/table/table.d.ts.map +1 -0
  466. package/dist/types/core/components/ui/theme/theme-collection/core-variables.d.ts +2 -0
  467. package/dist/types/core/components/ui/theme/theme-collection/core-variables.d.ts.map +1 -0
  468. package/dist/types/core/components/ui/theme/theme-collection/dark.d.ts +2 -0
  469. package/dist/types/core/components/ui/theme/theme-collection/dark.d.ts.map +1 -0
  470. package/dist/types/core/components/ui/theme/theme-collection/light.d.ts +2 -0
  471. package/dist/types/core/components/ui/theme/theme-collection/light.d.ts.map +1 -0
  472. package/dist/types/core/components/ui/theme/theme.d.ts +20 -0
  473. package/dist/types/core/components/ui/theme/theme.d.ts.map +1 -0
  474. package/dist/types/core/components/ui/toast/message-subscriber.d.ts +19 -0
  475. package/dist/types/core/components/ui/toast/message-subscriber.d.ts.map +1 -0
  476. package/dist/types/core/components/ui/toast/toast-item.d.ts +41 -0
  477. package/dist/types/core/components/ui/toast/toast-item.d.ts.map +1 -0
  478. package/dist/types/core/components/ui/toast/toast.d.ts +28 -0
  479. package/dist/types/core/components/ui/toast/toast.d.ts.map +1 -0
  480. package/dist/types/core/components/ui/toast/types.d.ts +12 -0
  481. package/dist/types/core/components/ui/toast/types.d.ts.map +1 -0
  482. package/dist/types/core/components/ui/tooltip/tooltip.d.ts +21 -0
  483. package/dist/types/core/components/ui/tooltip/tooltip.d.ts.map +1 -0
  484. package/dist/types/core/components/ui/ui.d.ts +35 -0
  485. package/dist/types/core/components/ui/ui.d.ts.map +1 -0
  486. package/dist/types/core/core.d.ts +5 -0
  487. package/dist/types/core/core.d.ts.map +1 -0
  488. package/dist/types/core/decorators/Subscriber.d.ts +11 -0
  489. package/dist/types/core/decorators/Subscriber.d.ts.map +1 -0
  490. package/dist/types/core/decorators/api.d.ts +119 -0
  491. package/dist/types/core/decorators/api.d.ts.map +1 -0
  492. package/dist/types/core/decorators/lifecycle.d.ts +19 -0
  493. package/dist/types/core/decorators/lifecycle.d.ts.map +1 -0
  494. package/dist/types/core/decorators/subscriber/ancestorAttribute.d.ts +11 -0
  495. package/dist/types/core/decorators/subscriber/ancestorAttribute.d.ts.map +1 -0
  496. package/dist/types/core/decorators/subscriber/autoFill.d.ts +2 -0
  497. package/dist/types/core/decorators/subscriber/autoFill.d.ts.map +1 -0
  498. package/dist/types/core/decorators/subscriber/autoSubscribe.d.ts +2 -0
  499. package/dist/types/core/decorators/subscriber/autoSubscribe.d.ts.map +1 -0
  500. package/dist/types/core/decorators/subscriber/bind.d.ts +28 -0
  501. package/dist/types/core/decorators/subscriber/bind.d.ts.map +1 -0
  502. package/dist/types/core/decorators/subscriber/common.d.ts +14 -0
  503. package/dist/types/core/decorators/subscriber/common.d.ts.map +1 -0
  504. package/dist/types/core/decorators/subscriber/dynamicPath.d.ts +23 -0
  505. package/dist/types/core/decorators/subscriber/dynamicPath.d.ts.map +1 -0
  506. package/dist/types/core/decorators/subscriber/dynamicPropertyWatch.d.ts +42 -0
  507. package/dist/types/core/decorators/subscriber/dynamicPropertyWatch.d.ts.map +1 -0
  508. package/dist/types/core/decorators/subscriber/handle.d.ts +74 -0
  509. package/dist/types/core/decorators/subscriber/handle.d.ts.map +1 -0
  510. package/dist/types/core/decorators/subscriber/onAssign.d.ts +53 -0
  511. package/dist/types/core/decorators/subscriber/onAssign.d.ts.map +1 -0
  512. package/dist/types/core/decorators/subscriber/publish.d.ts +23 -0
  513. package/dist/types/core/decorators/subscriber/publish.d.ts.map +1 -0
  514. package/dist/types/core/decorators/subscriber/publisherPath.d.ts +3 -0
  515. package/dist/types/core/decorators/subscriber/publisherPath.d.ts.map +1 -0
  516. package/dist/types/core/decorators/subscriber/subscribe.d.ts +20 -0
  517. package/dist/types/core/decorators/subscriber/subscribe.d.ts.map +1 -0
  518. package/dist/types/core/directives/DataProvider.d.ts +45 -0
  519. package/dist/types/core/directives/DataProvider.d.ts.map +1 -0
  520. package/dist/types/core/directives/Wording.d.ts +44 -0
  521. package/dist/types/core/directives/Wording.d.ts.map +1 -0
  522. package/dist/types/core/mixins/Fetcher.d.ts +108 -0
  523. package/dist/types/core/mixins/Fetcher.d.ts.map +1 -0
  524. package/dist/types/core/mixins/FormCheckable.d.ts +95 -0
  525. package/dist/types/core/mixins/FormCheckable.d.ts.map +1 -0
  526. package/dist/types/core/mixins/FormElement.d.ts +37 -0
  527. package/dist/types/core/mixins/FormElement.d.ts.map +1 -0
  528. package/dist/types/core/mixins/FormInput.d.ts +79 -0
  529. package/dist/types/core/mixins/FormInput.d.ts.map +1 -0
  530. package/dist/types/core/mixins/Subscriber.d.ts +38 -0
  531. package/dist/types/core/mixins/Subscriber.d.ts.map +1 -0
  532. package/dist/types/core/mixins/TemplatesContainer.d.ts +14 -0
  533. package/dist/types/core/mixins/TemplatesContainer.d.ts.map +1 -0
  534. package/dist/types/core/mixins/mixins.d.ts +7 -0
  535. package/dist/types/core/mixins/mixins.d.ts.map +1 -0
  536. package/dist/types/core/utils/AncestorAttributeObserver.d.ts +38 -0
  537. package/dist/types/core/utils/AncestorAttributeObserver.d.ts.map +1 -0
  538. package/dist/types/core/utils/Arrays.d.ts +98 -0
  539. package/dist/types/core/utils/Arrays.d.ts.map +1 -0
  540. package/dist/types/core/utils/DataBindObserver.d.ts +84 -0
  541. package/dist/types/core/utils/DataBindObserver.d.ts.map +1 -0
  542. package/dist/types/core/utils/Electron.d.ts +8 -0
  543. package/dist/types/core/utils/Electron.d.ts.map +1 -0
  544. package/dist/types/core/utils/Format.d.ts +13 -0
  545. package/dist/types/core/utils/Format.d.ts.map +1 -0
  546. package/dist/types/core/utils/HTML.d.ts +64 -0
  547. package/dist/types/core/utils/HTML.d.ts.map +1 -0
  548. package/dist/types/core/utils/LocationHandler.d.ts +48 -0
  549. package/dist/types/core/utils/LocationHandler.d.ts.map +1 -0
  550. package/dist/types/core/utils/Objects.d.ts +31 -0
  551. package/dist/types/core/utils/Objects.d.ts.map +1 -0
  552. package/dist/types/core/utils/PublisherProxy.d.ts +230 -0
  553. package/dist/types/core/utils/PublisherProxy.d.ts.map +1 -0
  554. package/dist/types/core/utils/Utils.d.ts +6 -0
  555. package/dist/types/core/utils/Utils.d.ts.map +1 -0
  556. package/dist/types/core/utils/aesCrypto.d.ts +53 -0
  557. package/dist/types/core/utils/aesCrypto.d.ts.map +1 -0
  558. package/dist/types/core/utils/api.d.ts +173 -0
  559. package/dist/types/core/utils/api.d.ts.map +1 -0
  560. package/dist/types/core/utils/dataProviderKey.d.ts +56 -0
  561. package/dist/types/core/utils/dataProviderKey.d.ts.map +1 -0
  562. package/dist/types/core/utils/endpoint.d.ts +37 -0
  563. package/dist/types/core/utils/endpoint.d.ts.map +1 -0
  564. package/dist/types/core/utils/route.d.ts +41 -0
  565. package/dist/types/core/utils/route.d.ts.map +1 -0
  566. package/dist/types/core/utils/url-pattern.d.ts +3 -0
  567. package/dist/types/core/utils/url-pattern.d.ts.map +1 -0
  568. package/dist/types/dataprovider.d.ts +2 -0
  569. package/dist/types/dataprovider.d.ts.map +1 -0
  570. package/dist/types/decorators.d.ts +28 -0
  571. package/dist/types/decorators.d.ts.map +1 -0
  572. package/dist/types/directives.d.ts +21 -0
  573. package/dist/types/directives.d.ts.map +1 -0
  574. package/dist/types/index.d.ts +8 -0
  575. package/dist/types/index.d.ts.map +1 -0
  576. package/dist/types/mixins.d.ts +204 -0
  577. package/dist/types/mixins.d.ts.map +1 -0
  578. package/dist/types/test-utils/TestUtils.d.ts +4 -0
  579. package/dist/types/test-utils/TestUtils.d.ts.map +1 -0
  580. package/dist/types/utils.d.ts +17 -0
  581. package/dist/types/utils.d.ts.map +1 -0
  582. package/docs/assets/{index-t0-i22oI.css → index-CZLTFws2.css} +1 -1
  583. package/docs/assets/{index-wyNMyWT9.js → index-nkkwC13U.js} +781 -506
  584. package/docs/index.html +2 -3
  585. package/docs/src/core/components/functional/date/date.md +290 -0
  586. package/docs/src/core/components/functional/fetch/fetch.md +125 -0
  587. package/docs/src/core/components/functional/if/if.md +9 -0
  588. package/docs/src/core/components/functional/list/list.md +65 -0
  589. package/docs/src/core/components/functional/mix/mix.md +41 -0
  590. package/docs/src/core/components/functional/queue/queue.md +72 -0
  591. package/docs/src/core/components/functional/router/router.md +94 -0
  592. package/docs/src/core/components/functional/sdui/default-library.json +108 -0
  593. package/docs/src/core/components/functional/sdui/example.json +99 -0
  594. package/docs/src/core/components/functional/sdui/sdui.md +356 -0
  595. package/docs/src/core/components/functional/states/states.md +87 -0
  596. package/docs/src/core/components/functional/submit/submit.md +114 -0
  597. package/docs/src/core/components/functional/subscriber/subscriber.md +91 -0
  598. package/docs/src/core/components/functional/value/value.md +35 -0
  599. package/docs/src/core/components/ui/alert/alert.md +121 -0
  600. package/docs/src/core/components/ui/alert-messages/alert-messages.md +0 -0
  601. package/docs/src/core/components/ui/badge/badge.md +127 -0
  602. package/docs/src/core/components/ui/button/button.md +182 -0
  603. package/docs/src/core/components/ui/captcha/captcha.md +12 -0
  604. package/docs/src/core/components/ui/card/card.md +97 -0
  605. package/docs/src/core/components/ui/divider/divider.md +35 -0
  606. package/docs/src/core/components/ui/form/checkbox/checkbox.md +77 -0
  607. package/docs/src/core/components/ui/form/fieldset/fieldset.md +129 -0
  608. package/docs/src/core/components/ui/form/form-actions/form-actions.md +77 -0
  609. package/docs/src/core/components/ui/form/form-layout/form-layout.md +44 -0
  610. package/docs/src/core/components/ui/form/input/input.md +142 -0
  611. package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +133 -0
  612. package/docs/src/core/components/ui/form/radio/radio.md +57 -0
  613. package/docs/src/core/components/ui/form/select/select.md +71 -0
  614. package/docs/src/core/components/ui/form/switch/switch.md +57 -0
  615. package/docs/src/core/components/ui/form/textarea/textarea.md +65 -0
  616. package/docs/src/core/components/ui/group/group.md +75 -0
  617. package/docs/src/core/components/ui/icon/icon.md +125 -0
  618. package/docs/src/core/components/ui/icon/icons.json +1 -0
  619. package/docs/src/core/components/ui/image/image.md +107 -0
  620. package/docs/src/core/components/ui/link/link.md +43 -0
  621. package/docs/src/core/components/ui/loader/loader.md +55 -0
  622. package/docs/src/core/components/ui/menu/menu.md +329 -0
  623. package/docs/src/core/components/ui/modal/modal.md +119 -0
  624. package/docs/src/core/components/ui/pop/pop.md +96 -0
  625. package/docs/src/core/components/ui/progress/progress.md +63 -0
  626. package/docs/src/core/components/ui/table/table.md +455 -0
  627. package/docs/src/core/components/ui/toast/toast.md +166 -0
  628. package/docs/src/core/components/ui/tooltip/tooltip.md +82 -0
  629. package/docs/src/docs/_core-concept/dataFlow.md +79 -0
  630. package/docs/src/docs/_core-concept/overview.md +57 -0
  631. package/docs/src/docs/_core-concept/subscriber.md +75 -0
  632. package/docs/src/docs/_decorators/ancestor-attribute.md +127 -0
  633. package/docs/src/docs/_decorators/auto-subscribe.md +202 -0
  634. package/docs/src/docs/_decorators/bind.md +167 -0
  635. package/docs/src/docs/_decorators/get.md +77 -0
  636. package/docs/src/docs/_decorators/handle.md +175 -0
  637. package/docs/src/docs/_decorators/on-assign.md +390 -0
  638. package/docs/src/docs/_decorators/patch.md +45 -0
  639. package/docs/src/docs/_decorators/post.md +93 -0
  640. package/docs/src/docs/_decorators/publish.md +55 -0
  641. package/docs/src/docs/_decorators/put.md +43 -0
  642. package/docs/src/docs/_decorators/subscribe.md +100 -0
  643. package/docs/src/docs/_decorators/wait-for-ancestors.md +163 -0
  644. package/docs/src/docs/_directives/sub.md +91 -0
  645. package/docs/src/docs/_getting-started/ai-agents.md +56 -0
  646. package/docs/src/docs/_getting-started/concorde-manual-install.md +133 -0
  647. package/docs/src/docs/_getting-started/concorde-outside.md +33 -0
  648. package/docs/src/docs/_getting-started/create-a-component.md +139 -0
  649. package/docs/src/docs/_getting-started/my-first-component.md +236 -0
  650. package/docs/src/docs/_getting-started/my-first-subscriber.md +120 -0
  651. package/docs/src/docs/_getting-started/pubsub.md +37 -0
  652. package/docs/src/docs/_getting-started/start.md +47 -0
  653. package/docs/src/docs/_getting-started/theming.md +91 -0
  654. package/docs/src/docs/_misc/api-configuration.md +81 -0
  655. package/docs/src/docs/_misc/dataProviderKey.md +168 -0
  656. package/docs/src/docs/_misc/docs-mock-api.md +60 -0
  657. package/docs/src/docs/_misc/dynamic-path.md +71 -0
  658. package/docs/src/docs/_misc/endpoint.md +45 -0
  659. package/docs/src/docs/_misc/html-integration.md +13 -0
  660. package/docs/src/docs/search/docs-search.json +9117 -0
  661. package/docs/src/tag-list.json +1 -0
  662. package/docs/src/tsconfig-model.json +23 -0
  663. package/docs/src/tsconfig.declarations.json +22 -0
  664. package/docs/src/tsconfig.emit.json +23 -0
  665. package/docs/src/tsconfig.json +837 -0
  666. package/gitlab/job_github_mirror.sh +39 -0
  667. package/index.html +0 -1
  668. package/package.json +1084 -364
  669. package/public/docs-mock-api-sw.js +3 -2
  670. package/public/docs-mock-api-sw.js.map +2 -2
  671. package/scripts/github-export.mjs +150 -0
  672. package/scripts/post-build.mjs +43 -0
  673. package/scripts/pre-build.mjs +32 -4
  674. package/scripts/pre-publish.mjs +2 -0
  675. package/src/core/components/functional/queue/queue.ts +2 -2
  676. package/src/core/components/ui/modal/modal.ts +1 -1
  677. package/src/core/decorators/Subscriber.ts +1 -0
  678. package/src/core/decorators/api.spec.ts +74 -4
  679. package/src/core/decorators/api.ts +111 -30
  680. package/src/core/decorators/subscriber/ancestorAttribute.spec.ts +197 -0
  681. package/src/core/decorators/subscriber/ancestorAttribute.ts +40 -7
  682. package/src/core/decorators/subscriber/autoSubscribe.ts +7 -3
  683. package/src/core/mixins/Fetcher.ts +12 -6
  684. package/src/core/utils/AncestorAttributeObserver.ts +199 -0
  685. package/src/core/utils/HTML.ts +3 -11
  686. package/src/core/utils/PublisherProxy.ts +28 -37
  687. package/src/core/utils/api.ts +10 -10
  688. package/src/css.d.ts +19 -0
  689. package/src/directives.ts +3 -2
  690. package/src/docs/_decorators/ancestor-attribute.md +56 -8
  691. package/src/docs/_decorators/get.md +47 -1
  692. package/src/docs/components/docs-demo-sources.ts +20 -3
  693. package/src/docs/example/decorators-demo-geo.ts +5 -0
  694. package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +72 -31
  695. package/src/docs/example/decorators-demo.ts +164 -8
  696. package/src/docs/mock-api/router.ts +3 -1
  697. package/src/docs/search/docs-search.json +92 -2
  698. package/src/tsconfig.declarations.json +22 -0
  699. package/src/tsconfig.emit.json +23 -0
  700. package/src/tsconfig.json +3 -285
  701. package/src/tsconfig.tsbuildinfo +1 -1
@@ -578,7 +578,9 @@
578
578
  return json2(paginateUsers(url));
579
579
  }
580
580
  if (subPath === "/geo/communes" || subPath.startsWith("/geo/communes")) {
581
- return json2(geoCommunes(url));
581
+ return json2(geoCommunes(url), {
582
+ headers: { "X-Fetched-At": (/* @__PURE__ */ new Date()).toISOString() }
583
+ });
582
584
  }
583
585
  const jokeMatch = subPath.match(/^\/jokes\/joke\/([^/]+)$/);
584
586
  if (jokeMatch) {
@@ -605,4 +607,3 @@
605
607
  );
606
608
  });
607
609
  })();
608
- //# sourceMappingURL=docs-mock-api-sw.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/docs/mock-api/urls.ts", "../src/docs/mock-api/api-config-mock.ts", "../src/docs/mock-api/fixtures.ts", "../src/docs/mock-api/router.ts", "../src/docs/mock-api/service-worker.ts"],
4
- "sourcesContent": ["/** Base same-origin pour les d\u00E9mos doc (Service Worker + middleware Vite). */\nexport const DOCS_MOCK_API_BASE = \"/docs-mock-api\";\n\n/** Remplace https://reqres.in \u2014 chemins `api/users`, `api/users/2`, etc. */\nexport const DOCS_MOCK_REQRES_SERVICE = DOCS_MOCK_API_BASE;\n\n/** Remplace https://geo.api.gouv.fr/ \u2014 chemins `communes?\u2026`. */\nexport const DOCS_MOCK_GEO_SERVICE = `${DOCS_MOCK_API_BASE}/geo/`;\n\n/** Remplace https://v2.jokeapi.dev \u2014 chemins `joke/Any?\u2026`. */\nexport const DOCS_MOCK_JOKES_SERVICE = `${DOCS_MOCK_API_BASE}/jokes`;\n", "import { DOCS_MOCK_API_BASE } from \"./urls\";\n\n/** Bearer accept\u00E9 par GET /api/config/protected */\nexport const DOCS_MOCK_TOKEN_VALID = \"docs-mock-valid-token\";\n/** D\u00E9clenche HTTP 498 \u2192 renouvellement via tokenProvider */\nexport const DOCS_MOCK_TOKEN_STALE = \"docs-mock-stale-token\";\n/** \u00C9mis par GET /auth/token apr\u00E8s Basic auth ou eventsApiToken */\nexport const DOCS_MOCK_TOKEN_FRESH = \"docs-mock-fresh-token\";\n\nconst DOCS_MOCK_BASIC_USER = \"demo\";\nconst DOCS_MOCK_BASIC_PASSWORD = \"secret\";\n/** Valeur de l\u2019attribut anc\u00EAtre `eventsApiToken` (Bearer pour /auth/token) */\nexport const DOCS_MOCK_EVENTS_API_TOKEN = \"docs-mock-events-token\";\n\nconst WORDING_CATALOG: Record<string, Record<string, string>> = {\n \"api-config.greeting\": { fr: \"Bonjour\", en: \"Hello\" },\n \"api-config.farewell\": { fr: \"Au revoir\", en: \"Goodbye\" },\n \"api-config.hint\": {\n fr: \"Libell\u00E9s servis par le mock /wording/labels\",\n en: \"Labels served by mock /wording/labels\",\n },\n};\n\nfunction json(body: unknown, init: ResponseInit = {}): Response {\n const headers = new Headers(init.headers);\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n headers.set(\"Access-Control-Allow-Origin\", \"*\");\n headers.set(\"X-Docs-Mock-Api\", \"concorde-api-config\");\n return new Response(JSON.stringify(body), { ...init, headers });\n}\n\ntype ParsedAuth =\n | { kind: \"none\" }\n | { kind: \"basic\"; user: string; password: string }\n | { kind: \"bearer\"; token: string };\n\nfunction parseAuthorization(request: Request): ParsedAuth {\n const header = request.headers.get(\"authorization\");\n if (!header) return { kind: \"none\" };\n const basic = header.match(/^Basic\\s+(.+)$/i);\n if (basic) {\n try {\n const decoded = atob(basic[1]);\n const sep = decoded.indexOf(\":\");\n if (sep < 0) return { kind: \"none\" };\n return {\n kind: \"basic\",\n user: decoded.slice(0, sep),\n password: decoded.slice(sep + 1),\n };\n } catch {\n return { kind: \"none\" };\n }\n }\n const bearer = header.match(/^Bearer\\s+(.+)$/i);\n if (bearer) return { kind: \"bearer\", token: bearer[1].trim() };\n return { kind: \"none\" };\n}\n\nfunction isValidBasic(auth: ParsedAuth): boolean {\n return (\n auth.kind === \"basic\" &&\n auth.user === DOCS_MOCK_BASIC_USER &&\n auth.password === DOCS_MOCK_BASIC_PASSWORD\n );\n}\n\nfunction wordingLabels(url: URL): Response {\n const lang = url.searchParams.get(\"lang\") || \"fr\";\n const labels = url.searchParams.getAll(\"labels[]\").length\n ? url.searchParams.getAll(\"labels[]\")\n : url.searchParams.getAll(\"labels\");\n const result: Record<string, string> = {};\n for (const key of labels) {\n const entry = WORDING_CATALOG[key];\n result[key] =\n entry?.[lang] ?? entry?.en ?? `[missing:${key}]`;\n }\n return json({ lang, labels: result, ...result });\n}\n\n/**\n * Routes mock pour la page doc APIConfiguration (token, 498, wording).\n */\nexport function handleApiConfigMockRequest(\n request: Request,\n subPath: string,\n method: string,\n): Response | null {\n if (subPath === \"/auth/token\" && method === \"GET\") {\n const auth = parseAuthorization(request);\n if (isValidBasic(auth)) {\n return json({\n token: DOCS_MOCK_TOKEN_FRESH,\n source: \"basic\",\n serviceHost: new URL(request.url).searchParams.get(\"serviceHost\"),\n });\n }\n if (\n auth.kind === \"bearer\" &&\n auth.token === DOCS_MOCK_EVENTS_API_TOKEN\n ) {\n return json({\n token: DOCS_MOCK_TOKEN_FRESH,\n source: \"eventsApiToken\",\n });\n }\n return json({ error: \"Unauthorized\" }, { status: 401 });\n }\n\n if (subPath === \"/api/config/protected\" && method === \"GET\") {\n const auth = parseAuthorization(request);\n if (auth.kind === \"bearer\") {\n if (auth.token === DOCS_MOCK_TOKEN_STALE) {\n return json({ error: \"Token expired\", code: \"token_stale\" }, { status: 498 });\n }\n if (\n auth.token === DOCS_MOCK_TOKEN_VALID ||\n auth.token === DOCS_MOCK_TOKEN_FRESH\n ) {\n return json({\n ok: true,\n message: \"Protected resource\",\n tokenUsed: auth.token,\n });\n }\n }\n if (isValidBasic(auth)) {\n return json({\n ok: true,\n message: \"Protected resource (basic)\",\n tokenUsed: null,\n });\n }\n return json({ error: \"Unauthorized\" }, { status: 401 });\n }\n\n if (\n (subPath === \"/wording/labels\" || subPath.startsWith(\"/wording/labels\")) &&\n method === \"GET\"\n ) {\n return wordingLabels(new URL(request.url));\n }\n\n return null;\n}\n\nexport const API_CONFIG_MOCK_PATHS = [\n `${DOCS_MOCK_API_BASE}/auth/token`,\n `${DOCS_MOCK_API_BASE}/api/config/protected`,\n `${DOCS_MOCK_API_BASE}/wording/labels`,\n] as const;\n", "/** Donn\u00E9es type ReqRes pour les d\u00E9mos doc (sans appel externe). */\n\nexport type ReqresUser = {\n id: number;\n email: string;\n first_name: string;\n last_name: string;\n avatar: string;\n};\n\nconst reqresAvatar = (seed: string) =>\n `https://i.pravatar.cc/150?u=${encodeURIComponent(seed)}`;\n\nconst REQRES_EXTRA_NAMES: [string, string][] = [\n [\"Michael\", \"Lawson\"],\n [\"Tobias\", \"Funke\"],\n [\"Lindsay\", \"Funke\"],\n [\"Maeby\", \"Funke\"],\n [\"George\", \"Michael\"],\n [\"Annye\", \"Vang\"],\n [\"Rachel\", \"Howe\"],\n [\"Terry\", \"Medhurst\"],\n [\"Bette\", \"Haag\"],\n [\"Lester\", \"Solomon\"],\n [\"April\", \"Douglas\"],\n [\"Marian\", \"Roberts\"],\n [\"Kathryn\", \"Murphy\"],\n [\"Gloria\", \"Armstrong\"],\n [\"Adam\", \"Bradley\"],\n [\"Angela\", \"Hicks\"],\n [\"Rose\", \"Wheeler\"],\n [\"Sara\", \"Berry\"],\n [\"Glen\", \"Kuhn\"],\n [\"Roger\", \"Cox\"],\n];\n\nfunction buildReqresUser(\n id: number,\n first_name: string,\n last_name: string,\n): ReqresUser {\n const slug = `${first_name}-${last_name}`.toLowerCase();\n return {\n id,\n email: `${first_name.toLowerCase()}.${last_name.toLowerCase()}@example.com`,\n first_name,\n last_name,\n avatar: reqresAvatar(slug),\n };\n}\n\n/** Jeu \u00E9tendu pour d\u00E9mos queue / lazyload (pagination par offset). */\nexport const DOCS_REQRES_USERS: ReqresUser[] = [\n buildReqresUser(1, \"George\", \"Bluth\"),\n buildReqresUser(2, \"Janet\", \"Weaver\"),\n buildReqresUser(3, \"Emma\", \"Wong\"),\n buildReqresUser(4, \"Eve\", \"Holt\"),\n ...REQRES_EXTRA_NAMES.map(([first_name, last_name], index) =>\n buildReqresUser(5 + index, first_name, last_name),\n ),\n];\n\nexport type ReqresUserResponse = { data: ReqresUser };\nexport type ReqresUsersListResponse = {\n page: number;\n per_page: number;\n total: number;\n total_pages: number;\n data: ReqresUser[];\n};\n\n/** Filter users for mock search (`q` \u2014 first name, last name, email). Same logic as the TS starter. */\nexport function filterDocsUsers(\n users: ReqresUser[],\n query: string | null | undefined,\n): ReqresUser[] {\n const q = query?.trim().toLowerCase();\n if (!q) return users;\n return users.filter((user) => {\n const haystack =\n `${user.first_name} ${user.last_name} ${user.email}`.toLowerCase();\n return haystack.includes(q);\n });\n}\n\nexport type GeoCommuneRow = { nom: string; code: string };\n\nexport const DOCS_GEO_COMMUNES: GeoCommuneRow[] = [\n { nom: \"Paris\", code: \"75056\" },\n { nom: \"Lyon\", code: \"69123\" },\n { nom: \"Marseille\", code: \"13055\" },\n { nom: \"Toulouse\", code: \"31555\" },\n { nom: \"Lille\", code: \"59350\" },\n { nom: \"Bordeaux\", code: \"33063\" },\n { nom: \"Nantes\", code: \"44109\" },\n { nom: \"Strasbourg\", code: \"67482\" },\n { nom: \"Montpellier\", code: \"34172\" },\n { nom: \"Rennes\", code: \"35238\" },\n];\n\n/** JokeAPI-style content flags (checkbox / radio / switch blacklist demos). */\nexport type DocsJokeFlagKey =\n | \"nsfw\"\n | \"religious\"\n | \"political\"\n | \"racist\"\n | \"sexist\"\n | \"explicit\";\n\n/** Forme proche de JokeAPI v2 (`key=\"jokes\"` sur sonic-queue / list). */\nexport type DocsJokeItem = {\n categories: string[];\n createdAt: string;\n id: number;\n joke: string;\n lang: \"fr\" | \"en\";\n flags: Record<DocsJokeFlagKey, boolean>;\n safe: boolean;\n type: string;\n setup?: string;\n delivery?: string;\n};\n\nconst jokeFlags = (\n partial: Partial<Record<DocsJokeFlagKey, boolean>> = {},\n): Record<DocsJokeFlagKey, boolean> => ({\n nsfw: false,\n religious: false,\n political: false,\n racist: false,\n sexist: false,\n explicit: false,\n ...partial,\n});\n\nexport type DocsJokeApiResponse = {\n error: boolean;\n amount: number;\n jokes: DocsJokeItem[];\n};\n\nconst SAMPLE_JOKES: DocsJokeItem[] = [\n {\n categories: [\"Programming\"],\n createdAt: \"2020-01-01 00:00:00\",\n id: 1,\n lang: \"en\",\n joke: \"Why do programmers prefer dark mode? Because light attracts bugs.\",\n flags: jokeFlags(),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Misc\"],\n createdAt: \"2020-01-02 00:00:00\",\n id: 2,\n lang: \"en\",\n joke: \"I told my computer I needed a break \u2014 it said: no problem, I'll go to sleep.\",\n flags: jokeFlags({ nsfw: true }),\n safe: false,\n type: \"single\",\n },\n {\n categories: [\"Pun\"],\n createdAt: \"2020-01-03 00:00:00\",\n id: 3,\n lang: \"en\",\n joke: \"Concorde docs run offline: even the API is a local joke.\",\n flags: jokeFlags(),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Animals\"],\n createdAt: \"2020-01-04 00:00:00\",\n id: 4,\n lang: \"en\",\n joke: \"The dog ate my homework and my pull request.\",\n flags: jokeFlags({ political: true }),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Animals\", \"Pun\"],\n createdAt: \"2020-01-05 00:00:00\",\n id: 5,\n lang: \"fr\",\n joke: \"Quel est le chien pr\u00E9f\u00E9r\u00E9 des d\u00E9veloppeurs ? Le labrador Retriever.\",\n flags: jokeFlags(),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Animals\"],\n createdAt: \"2020-01-06 00:00:00\",\n id: 6,\n lang: \"fr\",\n joke: \"Un chat et un chien discutent de TypeScript : le chien dit \u00AB woof \u00BB, le chat compile.\",\n flags: jokeFlags({ racist: true }),\n safe: false,\n type: \"single\",\n },\n {\n categories: [\"Misc\"],\n createdAt: \"2020-01-07 00:00:00\",\n id: 7,\n lang: \"fr\",\n joke: \"Pourquoi les blagues offline sont-elles fiables ? Parce qu'elles passent par le Service Worker.\",\n flags: jokeFlags({ religious: true }),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Programming\"],\n createdAt: \"2020-01-08 00:00:00\",\n id: 8,\n lang: \"fr\",\n joke: \"Mon compilateur et mon chien : tous deux ignorent mes commandes jusqu'au build.\",\n flags: jokeFlags({ sexist: true }),\n safe: false,\n type: \"single\",\n },\n {\n categories: [\"Misc\"],\n createdAt: \"2020-01-09 00:00:00\",\n id: 9,\n lang: \"en\",\n joke: \"A SQL query walks into a bar, walks up to two tables and asks: Can I join you?\",\n flags: jokeFlags({ explicit: true }),\n safe: false,\n type: \"single\",\n },\n {\n categories: [\"Pun\"],\n createdAt: \"2020-01-10 00:00:00\",\n id: 10,\n lang: \"fr\",\n joke: \"J'ai cherch\u00E9 \u00AB chien \u00BB dans la doc : le mock API a r\u00E9pondu.\",\n flags: jokeFlags(),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Misc\"],\n createdAt: \"2020-01-11 00:00:00\",\n id: 11,\n lang: \"en\",\n joke: \"There are only two hard things in Computer Science: cache invalidation and naming things.\",\n flags: jokeFlags({ political: true, explicit: true }),\n safe: false,\n type: \"single\",\n },\n {\n categories: [\"Animals\"],\n createdAt: \"2020-01-12 00:00:00\",\n id: 12,\n lang: \"fr\",\n joke: \"Le golden retriever a r\u00E9cup\u00E9r\u00E9 la donn\u00E9e du publisher.\",\n flags: jokeFlags({ racist: true, sexist: true }),\n safe: false,\n type: \"two-liner\",\n setup: \"Pourquoi le chien aime Concorde ?\",\n delivery: \"Parce qu'il sait fetch.\",\n },\n {\n categories: [\"Misc\"],\n createdAt: \"2020-01-13 00:00:00\",\n id: 13,\n lang: \"en\",\n joke: \"My code and my conscience: both have too many warnings.\",\n flags: jokeFlags(),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Programming\"],\n createdAt: \"2020-01-14 00:00:00\",\n id: 14,\n lang: \"en\",\n joke: \"Git blame is just a mirror.\",\n flags: jokeFlags({ religious: true, political: true }),\n safe: false,\n type: \"single\",\n },\n];\n\n/** `blacklistFlags` from queue filter form (comma-separated or repeated param). */\nexport function parseBlacklistFlags(url: URL): DocsJokeFlagKey[] {\n const keys = new Set<DocsJokeFlagKey>();\n const valid: DocsJokeFlagKey[] = [\n \"nsfw\",\n \"religious\",\n \"political\",\n \"racist\",\n \"sexist\",\n \"explicit\",\n ];\n const add = (raw: string) => {\n raw\n .split(\",\")\n .map((s) => s.trim().toLowerCase())\n .forEach((part) => {\n if (valid.includes(part as DocsJokeFlagKey)) keys.add(part as DocsJokeFlagKey);\n });\n };\n url.searchParams.getAll(\"blacklistFlags\").forEach(add);\n const single = url.searchParams.get(\"blacklistFlags\");\n if (single) add(single);\n return [...keys];\n}\n\n/** Exclude jokes that match any blacklisted flag (JokeAPI-style). */\nexport function applyJokeBlacklist(\n jokes: DocsJokeItem[],\n blacklist: DocsJokeFlagKey[],\n): DocsJokeItem[] {\n if (!blacklist.length) return jokes;\n return jokes.filter(\n (j) => !blacklist.some((flag) => j.flags[flag] === true),\n );\n}\n\n/** Filtre doc joke queue (`contains`, `lang`, `blacklistFlags` via `dataFilterProvider`). */\nexport function filterDocsJokes(\n jokes: DocsJokeItem[],\n url: URL,\n): DocsJokeItem[] {\n let pool = jokes;\n const contains = url.searchParams.get(\"contains\")?.trim().toLowerCase();\n if (contains) {\n pool = pool.filter((j) => {\n const haystack = [j.joke, j.setup, j.delivery, ...j.categories]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(contains);\n });\n }\n const lang = url.searchParams.get(\"lang\")?.trim().toLowerCase();\n if (lang === \"fr\" || lang === \"en\") {\n pool = pool.filter((j) => j.lang === lang);\n }\n pool = applyJokeBlacklist(pool, parseBlacklistFlags(url));\n return pool;\n}\n\n/**\n * R\u00E9ponse type JokeAPI v2.\n * - `amount` : taille du lot si pas de `offset`\n * - `offset` + `limit` / `per_page` : pagination (sonic-queue lazy)\n * - `contains`, `lang`, `blacklistFlags` : filtres formulaire (queue \u00AB Remove following jokes \u00BB)\n */\nexport function buildJokeApiResponse(url: URL): DocsJokeApiResponse {\n const pool = filterDocsJokes(SAMPLE_JOKES, url);\n const amount = Math.max(\n 1,\n parseInt(url.searchParams.get(\"amount\") || \"10\", 10),\n );\n const hasOffset = url.searchParams.has(\"offset\");\n const limit = Math.max(\n 1,\n parseInt(\n url.searchParams.get(\"limit\") ||\n url.searchParams.get(\"per_page\") ||\n String(amount),\n 10,\n ),\n );\n const offset = Math.max(0, parseInt(url.searchParams.get(\"offset\") || \"0\", 10));\n const start = hasOffset ? offset : 0;\n const count = hasOffset ? limit : amount;\n const jokes = pool.slice(start, start + count).map((j, i) => ({\n ...j,\n id: start + i + 1,\n }));\n return { error: false, amount: jokes.length, jokes };\n}\n", "import { handleApiConfigMockRequest } from \"./api-config-mock\";\nimport {\n DOCS_GEO_COMMUNES,\n DOCS_REQRES_USERS,\n buildJokeApiResponse,\n filterDocsUsers,\n type GeoCommuneRow,\n type ReqresUserResponse,\n type ReqresUsersListResponse,\n} from \"./fixtures\";\n\nexport const DOCS_MOCK_API_PREFIX = \"/docs-mock-api\";\n\nfunction json(\n body: unknown,\n init: ResponseInit & { delayMs?: number } = {},\n): Promise<Response> {\n const { delayMs = 0, ...responseInit } = init;\n const headers = new Headers(responseInit.headers);\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n headers.set(\"Access-Control-Allow-Origin\", \"*\");\n headers.set(\"X-Docs-Mock-Api\", \"concorde\");\n\n const build = () =>\n new Response(JSON.stringify(body), { ...responseInit, headers });\n\n if (delayMs <= 0) return Promise.resolve(build());\n return new Promise((resolve) =>\n setTimeout(() => resolve(build()), delayMs),\n );\n}\n\n/**\n * Liste utilisateurs type ReqRes.\n * - `offset` + `per_page` / `limit` : pagination index\u00E9e (sonic-queue avec `$offset` / `$limit`)\n * - `page` + `per_page` : num\u00E9ro de page 1-based (sonic-fetch, ex. `?page=2`)\n * - `q` : recherche sur pr\u00E9nom, nom, email (sonic-queue + `dataFilterProvider`, champ `name=\"q\"`)\n */\nexport function paginateUsers(url: URL): ReqresUsersListResponse {\n const perPage = Math.max(\n 1,\n parseInt(\n url.searchParams.get(\"per_page\") ||\n url.searchParams.get(\"limit\") ||\n \"6\",\n 10,\n ),\n );\n const pool = filterDocsUsers(DOCS_REQRES_USERS, url.searchParams.get(\"q\"));\n const total = pool.length;\n\n let start: number;\n let page: number;\n\n if (url.searchParams.has(\"offset\")) {\n start = Math.max(0, parseInt(url.searchParams.get(\"offset\") || \"0\", 10));\n page = Math.floor(start / perPage) + 1;\n } else {\n page = Math.max(1, parseInt(url.searchParams.get(\"page\") || \"1\", 10));\n start = (page - 1) * perPage;\n }\n\n const data = pool.slice(start, start + perPage);\n\n return {\n page,\n per_page: perPage,\n total,\n total_pages: Math.max(1, Math.ceil(total / perPage)),\n data,\n };\n}\n\nasync function parseRegisterFields(\n request: Request,\n): Promise<{ email?: string; password?: string }> {\n const contentType = (request.headers.get(\"content-type\") || \"\").toLowerCase();\n\n if (contentType.includes(\"multipart/form-data\")) {\n const fd = await request.formData();\n return {\n email: String(fd.get(\"email\") ?? \"\"),\n password: String(fd.get(\"password\") ?? \"\"),\n };\n }\n\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n const text = await request.text();\n const params = new URLSearchParams(text);\n return {\n email: params.get(\"email\") ?? \"\",\n password: params.get(\"password\") ?? \"\",\n };\n }\n\n const text = await request.text();\n if (!text.trim()) return {};\n\n try {\n const parsed = JSON.parse(text) as { email?: unknown; password?: unknown };\n return {\n email: parsed.email != null ? String(parsed.email) : \"\",\n password: parsed.password != null ? String(parsed.password) : \"\",\n };\n } catch {\n const params = new URLSearchParams(text);\n if (params.has(\"email\") || params.has(\"password\")) {\n return {\n email: params.get(\"email\") ?? \"\",\n password: params.get(\"password\") ?? \"\",\n };\n }\n return {};\n }\n}\n\nfunction registerOkBody(\n fields: { email: string; password: string },\n nested = false,\n) {\n const payload = {\n id: 4,\n token: \"docs-mock-register-token\",\n email: fields.email,\n };\n return nested ? { data: payload } : payload;\n}\n\nfunction geoCommunes(url: URL): GeoCommuneRow[] {\n const limit = Math.max(\n 1,\n parseInt(url.searchParams.get(\"limit\") || \"5\", 10),\n );\n const offset = Math.max(0, parseInt(url.searchParams.get(\"offset\") || \"0\", 10));\n return DOCS_GEO_COMMUNES.slice(offset, offset + limit);\n}\n\n/**\n * Intercepte les requ\u00EAtes vers /docs-mock-api/* (Service Worker ou middleware Vite).\n */\nexport async function handleDocsMockApiRequest(\n request: Request,\n): Promise<Response | null> {\n const url = new URL(request.url);\n if (!url.pathname.startsWith(DOCS_MOCK_API_PREFIX)) return null;\n\n const subPath = url.pathname.slice(DOCS_MOCK_API_PREFIX.length) || \"/\";\n const method = request.method.toUpperCase();\n\n if (subPath === \"/health\") {\n return json({ ok: true, service: \"concorde-docs-mock-api\" });\n }\n\n const apiConfigResponse = handleApiConfigMockRequest(request, subPath, method);\n if (apiConfigResponse) return apiConfigResponse;\n\n if (\n (subPath === \"/api/register\" || subPath === \"/api/register/nested\") &&\n method === \"POST\"\n ) {\n const body = await parseRegisterFields(request);\n if (!body.email?.trim() || !body.password?.trim()) {\n return json(\n {\n messages: [\n {\n content: \"email and password are required\",\n status: \"error\",\n },\n ],\n },\n { status: 400 },\n );\n }\n return json(\n registerOkBody(\n { email: body.email!.trim(), password: body.password!.trim() },\n subPath === \"/api/register/nested\",\n ),\n );\n }\n\n const sessionSyncMatch = subPath.match(/^\\/api\\/sessions\\/([^/]+)\\/sync$/);\n if (sessionSyncMatch && method === \"POST\") {\n const sessionId = decodeURIComponent(sessionSyncMatch[1]);\n let body: Record<string, unknown> = {};\n try {\n const text = await request.text();\n if (text.trim()) {\n body = JSON.parse(text) as Record<string, unknown>;\n }\n } catch {\n body = {};\n }\n return json({\n ok: true,\n sessionId,\n serverTime: Date.now(),\n echo: body,\n });\n }\n\n if (subPath === \"/api/register/echo\" && method === \"GET\") {\n const email = url.searchParams.get(\"email\") ?? \"\";\n const password = url.searchParams.get(\"password\") ?? \"\";\n if (!email.trim() || !password.trim()) {\n return json(\n {\n messages: [\n {\n content: \"email and password query params are required\",\n status: \"error\",\n },\n ],\n },\n { status: 400 },\n );\n }\n return json({\n method: \"GET\",\n query: { email, password },\n email,\n note: \"sonic-submit method=\\\"get\\\" appends form fields to the endpoint URL\",\n });\n }\n\n if (method !== \"GET\") {\n return json({ error: \"Method not allowed\" }, { status: 405 });\n }\n\n const userMatch = subPath.match(/^\\/api\\/users\\/(\\d+)$/);\n if (userMatch) {\n const id = parseInt(userMatch[1], 10);\n const user =\n DOCS_REQRES_USERS.find((u) => u.id === id) ?? DOCS_REQRES_USERS[0];\n const body: ReqresUserResponse = { data: { ...user, id } };\n return json(body);\n }\n\n if (subPath === \"/api/users\") {\n return json(paginateUsers(url));\n }\n\n if (subPath === \"/geo/communes\" || subPath.startsWith(\"/geo/communes\")) {\n return json(geoCommunes(url));\n }\n\n const jokeMatch = subPath.match(/^\\/jokes\\/joke\\/([^/]+)$/);\n if (jokeMatch) {\n return json(buildJokeApiResponse(url));\n }\n\n return json({ error: \"Not found\", path: subPath }, { status: 404 });\n}\n", "/// <reference lib=\"webworker\" />\nimport { handleDocsMockApiRequest} from \"./router\";\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nself.addEventListener(\"install\", (event) => {\n event.waitUntil(self.skipWaiting());\n});\n\nself.addEventListener(\"activate\", (event) => {\n event.waitUntil(self.clients.claim());\n});\n\nself.addEventListener(\"fetch\", (event) => {\n const {request} = event;\n event.respondWith(\n (async () => {\n const mocked = await handleDocsMockApiRequest(request);\n if (mocked) return mocked;\n return fetch(request);\n })(),\n );\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/** Base same-origin pour les d\u00E9mos doc (Service Worker + middleware Vite). */\nexport const DOCS_MOCK_API_BASE = \"/docs-mock-api\";\n\n/** Remplace https://reqres.in \u2014 chemins `api/users`, `api/users/2`, etc. */\nexport const DOCS_MOCK_REQRES_SERVICE = DOCS_MOCK_API_BASE;\n\n/** Remplace https://geo.api.gouv.fr/ \u2014 chemins `communes?\u2026`. */\nexport const DOCS_MOCK_GEO_SERVICE = `${DOCS_MOCK_API_BASE}/geo/`;\n\n/** Remplace https://v2.jokeapi.dev \u2014 chemins `joke/Any?\u2026`. */\nexport const DOCS_MOCK_JOKES_SERVICE = `${DOCS_MOCK_API_BASE}/jokes`;\n", "import { DOCS_MOCK_API_BASE } from \"./urls\";\n\n/** Bearer accept\u00E9 par GET /api/config/protected */\nexport const DOCS_MOCK_TOKEN_VALID = \"docs-mock-valid-token\";\n/** D\u00E9clenche HTTP 498 \u2192 renouvellement via tokenProvider */\nexport const DOCS_MOCK_TOKEN_STALE = \"docs-mock-stale-token\";\n/** \u00C9mis par GET /auth/token apr\u00E8s Basic auth ou eventsApiToken */\nexport const DOCS_MOCK_TOKEN_FRESH = \"docs-mock-fresh-token\";\n\nconst DOCS_MOCK_BASIC_USER = \"demo\";\nconst DOCS_MOCK_BASIC_PASSWORD = \"secret\";\n/** Valeur de l\u2019attribut anc\u00EAtre `eventsApiToken` (Bearer pour /auth/token) */\nexport const DOCS_MOCK_EVENTS_API_TOKEN = \"docs-mock-events-token\";\n\nconst WORDING_CATALOG: Record<string, Record<string, string>> = {\n \"api-config.greeting\": { fr: \"Bonjour\", en: \"Hello\" },\n \"api-config.farewell\": { fr: \"Au revoir\", en: \"Goodbye\" },\n \"api-config.hint\": {\n fr: \"Libell\u00E9s servis par le mock /wording/labels\",\n en: \"Labels served by mock /wording/labels\",\n },\n};\n\nfunction json(body: unknown, init: ResponseInit = {}): Response {\n const headers = new Headers(init.headers);\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n headers.set(\"Access-Control-Allow-Origin\", \"*\");\n headers.set(\"X-Docs-Mock-Api\", \"concorde-api-config\");\n return new Response(JSON.stringify(body), { ...init, headers });\n}\n\ntype ParsedAuth =\n | { kind: \"none\" }\n | { kind: \"basic\"; user: string; password: string }\n | { kind: \"bearer\"; token: string };\n\nfunction parseAuthorization(request: Request): ParsedAuth {\n const header = request.headers.get(\"authorization\");\n if (!header) return { kind: \"none\" };\n const basic = header.match(/^Basic\\s+(.+)$/i);\n if (basic) {\n try {\n const decoded = atob(basic[1]);\n const sep = decoded.indexOf(\":\");\n if (sep < 0) return { kind: \"none\" };\n return {\n kind: \"basic\",\n user: decoded.slice(0, sep),\n password: decoded.slice(sep + 1),\n };\n } catch {\n return { kind: \"none\" };\n }\n }\n const bearer = header.match(/^Bearer\\s+(.+)$/i);\n if (bearer) return { kind: \"bearer\", token: bearer[1].trim() };\n return { kind: \"none\" };\n}\n\nfunction isValidBasic(auth: ParsedAuth): boolean {\n return (\n auth.kind === \"basic\" &&\n auth.user === DOCS_MOCK_BASIC_USER &&\n auth.password === DOCS_MOCK_BASIC_PASSWORD\n );\n}\n\nfunction wordingLabels(url: URL): Response {\n const lang = url.searchParams.get(\"lang\") || \"fr\";\n const labels = url.searchParams.getAll(\"labels[]\").length\n ? url.searchParams.getAll(\"labels[]\")\n : url.searchParams.getAll(\"labels\");\n const result: Record<string, string> = {};\n for (const key of labels) {\n const entry = WORDING_CATALOG[key];\n result[key] =\n entry?.[lang] ?? entry?.en ?? `[missing:${key}]`;\n }\n return json({ lang, labels: result, ...result });\n}\n\n/**\n * Routes mock pour la page doc APIConfiguration (token, 498, wording).\n */\nexport function handleApiConfigMockRequest(\n request: Request,\n subPath: string,\n method: string,\n): Response | null {\n if (subPath === \"/auth/token\" && method === \"GET\") {\n const auth = parseAuthorization(request);\n if (isValidBasic(auth)) {\n return json({\n token: DOCS_MOCK_TOKEN_FRESH,\n source: \"basic\",\n serviceHost: new URL(request.url).searchParams.get(\"serviceHost\"),\n });\n }\n if (\n auth.kind === \"bearer\" &&\n auth.token === DOCS_MOCK_EVENTS_API_TOKEN\n ) {\n return json({\n token: DOCS_MOCK_TOKEN_FRESH,\n source: \"eventsApiToken\",\n });\n }\n return json({ error: \"Unauthorized\" }, { status: 401 });\n }\n\n if (subPath === \"/api/config/protected\" && method === \"GET\") {\n const auth = parseAuthorization(request);\n if (auth.kind === \"bearer\") {\n if (auth.token === DOCS_MOCK_TOKEN_STALE) {\n return json({ error: \"Token expired\", code: \"token_stale\" }, { status: 498 });\n }\n if (\n auth.token === DOCS_MOCK_TOKEN_VALID ||\n auth.token === DOCS_MOCK_TOKEN_FRESH\n ) {\n return json({\n ok: true,\n message: \"Protected resource\",\n tokenUsed: auth.token,\n });\n }\n }\n if (isValidBasic(auth)) {\n return json({\n ok: true,\n message: \"Protected resource (basic)\",\n tokenUsed: null,\n });\n }\n return json({ error: \"Unauthorized\" }, { status: 401 });\n }\n\n if (\n (subPath === \"/wording/labels\" || subPath.startsWith(\"/wording/labels\")) &&\n method === \"GET\"\n ) {\n return wordingLabels(new URL(request.url));\n }\n\n return null;\n}\n\nexport const API_CONFIG_MOCK_PATHS = [\n `${DOCS_MOCK_API_BASE}/auth/token`,\n `${DOCS_MOCK_API_BASE}/api/config/protected`,\n `${DOCS_MOCK_API_BASE}/wording/labels`,\n] as const;\n", "/** Donn\u00E9es type ReqRes pour les d\u00E9mos doc (sans appel externe). */\n\nexport type ReqresUser = {\n id: number;\n email: string;\n first_name: string;\n last_name: string;\n avatar: string;\n};\n\nconst reqresAvatar = (seed: string) =>\n `https://i.pravatar.cc/150?u=${encodeURIComponent(seed)}`;\n\nconst REQRES_EXTRA_NAMES: [string, string][] = [\n [\"Michael\", \"Lawson\"],\n [\"Tobias\", \"Funke\"],\n [\"Lindsay\", \"Funke\"],\n [\"Maeby\", \"Funke\"],\n [\"George\", \"Michael\"],\n [\"Annye\", \"Vang\"],\n [\"Rachel\", \"Howe\"],\n [\"Terry\", \"Medhurst\"],\n [\"Bette\", \"Haag\"],\n [\"Lester\", \"Solomon\"],\n [\"April\", \"Douglas\"],\n [\"Marian\", \"Roberts\"],\n [\"Kathryn\", \"Murphy\"],\n [\"Gloria\", \"Armstrong\"],\n [\"Adam\", \"Bradley\"],\n [\"Angela\", \"Hicks\"],\n [\"Rose\", \"Wheeler\"],\n [\"Sara\", \"Berry\"],\n [\"Glen\", \"Kuhn\"],\n [\"Roger\", \"Cox\"],\n];\n\nfunction buildReqresUser(\n id: number,\n first_name: string,\n last_name: string,\n): ReqresUser {\n const slug = `${first_name}-${last_name}`.toLowerCase();\n return {\n id,\n email: `${first_name.toLowerCase()}.${last_name.toLowerCase()}@example.com`,\n first_name,\n last_name,\n avatar: reqresAvatar(slug),\n };\n}\n\n/** Jeu \u00E9tendu pour d\u00E9mos queue / lazyload (pagination par offset). */\nexport const DOCS_REQRES_USERS: ReqresUser[] = [\n buildReqresUser(1, \"George\", \"Bluth\"),\n buildReqresUser(2, \"Janet\", \"Weaver\"),\n buildReqresUser(3, \"Emma\", \"Wong\"),\n buildReqresUser(4, \"Eve\", \"Holt\"),\n ...REQRES_EXTRA_NAMES.map(([first_name, last_name], index) =>\n buildReqresUser(5 + index, first_name, last_name),\n ),\n];\n\nexport type ReqresUserResponse = { data: ReqresUser };\nexport type ReqresUsersListResponse = {\n page: number;\n per_page: number;\n total: number;\n total_pages: number;\n data: ReqresUser[];\n};\n\n/** Filter users for mock search (`q` \u2014 first name, last name, email). Same logic as the TS starter. */\nexport function filterDocsUsers(\n users: ReqresUser[],\n query: string | null | undefined,\n): ReqresUser[] {\n const q = query?.trim().toLowerCase();\n if (!q) return users;\n return users.filter((user) => {\n const haystack =\n `${user.first_name} ${user.last_name} ${user.email}`.toLowerCase();\n return haystack.includes(q);\n });\n}\n\nexport type GeoCommuneRow = { nom: string; code: string };\n\nexport const DOCS_GEO_COMMUNES: GeoCommuneRow[] = [\n { nom: \"Paris\", code: \"75056\" },\n { nom: \"Lyon\", code: \"69123\" },\n { nom: \"Marseille\", code: \"13055\" },\n { nom: \"Toulouse\", code: \"31555\" },\n { nom: \"Lille\", code: \"59350\" },\n { nom: \"Bordeaux\", code: \"33063\" },\n { nom: \"Nantes\", code: \"44109\" },\n { nom: \"Strasbourg\", code: \"67482\" },\n { nom: \"Montpellier\", code: \"34172\" },\n { nom: \"Rennes\", code: \"35238\" },\n];\n\n/** JokeAPI-style content flags (checkbox / radio / switch blacklist demos). */\nexport type DocsJokeFlagKey =\n | \"nsfw\"\n | \"religious\"\n | \"political\"\n | \"racist\"\n | \"sexist\"\n | \"explicit\";\n\n/** Forme proche de JokeAPI v2 (`key=\"jokes\"` sur sonic-queue / list). */\nexport type DocsJokeItem = {\n categories: string[];\n createdAt: string;\n id: number;\n joke: string;\n lang: \"fr\" | \"en\";\n flags: Record<DocsJokeFlagKey, boolean>;\n safe: boolean;\n type: string;\n setup?: string;\n delivery?: string;\n};\n\nconst jokeFlags = (\n partial: Partial<Record<DocsJokeFlagKey, boolean>> = {},\n): Record<DocsJokeFlagKey, boolean> => ({\n nsfw: false,\n religious: false,\n political: false,\n racist: false,\n sexist: false,\n explicit: false,\n ...partial,\n});\n\nexport type DocsJokeApiResponse = {\n error: boolean;\n amount: number;\n jokes: DocsJokeItem[];\n};\n\nconst SAMPLE_JOKES: DocsJokeItem[] = [\n {\n categories: [\"Programming\"],\n createdAt: \"2020-01-01 00:00:00\",\n id: 1,\n lang: \"en\",\n joke: \"Why do programmers prefer dark mode? Because light attracts bugs.\",\n flags: jokeFlags(),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Misc\"],\n createdAt: \"2020-01-02 00:00:00\",\n id: 2,\n lang: \"en\",\n joke: \"I told my computer I needed a break \u2014 it said: no problem, I'll go to sleep.\",\n flags: jokeFlags({ nsfw: true }),\n safe: false,\n type: \"single\",\n },\n {\n categories: [\"Pun\"],\n createdAt: \"2020-01-03 00:00:00\",\n id: 3,\n lang: \"en\",\n joke: \"Concorde docs run offline: even the API is a local joke.\",\n flags: jokeFlags(),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Animals\"],\n createdAt: \"2020-01-04 00:00:00\",\n id: 4,\n lang: \"en\",\n joke: \"The dog ate my homework and my pull request.\",\n flags: jokeFlags({ political: true }),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Animals\", \"Pun\"],\n createdAt: \"2020-01-05 00:00:00\",\n id: 5,\n lang: \"fr\",\n joke: \"Quel est le chien pr\u00E9f\u00E9r\u00E9 des d\u00E9veloppeurs ? Le labrador Retriever.\",\n flags: jokeFlags(),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Animals\"],\n createdAt: \"2020-01-06 00:00:00\",\n id: 6,\n lang: \"fr\",\n joke: \"Un chat et un chien discutent de TypeScript : le chien dit \u00AB woof \u00BB, le chat compile.\",\n flags: jokeFlags({ racist: true }),\n safe: false,\n type: \"single\",\n },\n {\n categories: [\"Misc\"],\n createdAt: \"2020-01-07 00:00:00\",\n id: 7,\n lang: \"fr\",\n joke: \"Pourquoi les blagues offline sont-elles fiables ? Parce qu'elles passent par le Service Worker.\",\n flags: jokeFlags({ religious: true }),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Programming\"],\n createdAt: \"2020-01-08 00:00:00\",\n id: 8,\n lang: \"fr\",\n joke: \"Mon compilateur et mon chien : tous deux ignorent mes commandes jusqu'au build.\",\n flags: jokeFlags({ sexist: true }),\n safe: false,\n type: \"single\",\n },\n {\n categories: [\"Misc\"],\n createdAt: \"2020-01-09 00:00:00\",\n id: 9,\n lang: \"en\",\n joke: \"A SQL query walks into a bar, walks up to two tables and asks: Can I join you?\",\n flags: jokeFlags({ explicit: true }),\n safe: false,\n type: \"single\",\n },\n {\n categories: [\"Pun\"],\n createdAt: \"2020-01-10 00:00:00\",\n id: 10,\n lang: \"fr\",\n joke: \"J'ai cherch\u00E9 \u00AB chien \u00BB dans la doc : le mock API a r\u00E9pondu.\",\n flags: jokeFlags(),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Misc\"],\n createdAt: \"2020-01-11 00:00:00\",\n id: 11,\n lang: \"en\",\n joke: \"There are only two hard things in Computer Science: cache invalidation and naming things.\",\n flags: jokeFlags({ political: true, explicit: true }),\n safe: false,\n type: \"single\",\n },\n {\n categories: [\"Animals\"],\n createdAt: \"2020-01-12 00:00:00\",\n id: 12,\n lang: \"fr\",\n joke: \"Le golden retriever a r\u00E9cup\u00E9r\u00E9 la donn\u00E9e du publisher.\",\n flags: jokeFlags({ racist: true, sexist: true }),\n safe: false,\n type: \"two-liner\",\n setup: \"Pourquoi le chien aime Concorde ?\",\n delivery: \"Parce qu'il sait fetch.\",\n },\n {\n categories: [\"Misc\"],\n createdAt: \"2020-01-13 00:00:00\",\n id: 13,\n lang: \"en\",\n joke: \"My code and my conscience: both have too many warnings.\",\n flags: jokeFlags(),\n safe: true,\n type: \"single\",\n },\n {\n categories: [\"Programming\"],\n createdAt: \"2020-01-14 00:00:00\",\n id: 14,\n lang: \"en\",\n joke: \"Git blame is just a mirror.\",\n flags: jokeFlags({ religious: true, political: true }),\n safe: false,\n type: \"single\",\n },\n];\n\n/** `blacklistFlags` from queue filter form (comma-separated or repeated param). */\nexport function parseBlacklistFlags(url: URL): DocsJokeFlagKey[] {\n const keys = new Set<DocsJokeFlagKey>();\n const valid: DocsJokeFlagKey[] = [\n \"nsfw\",\n \"religious\",\n \"political\",\n \"racist\",\n \"sexist\",\n \"explicit\",\n ];\n const add = (raw: string) => {\n raw\n .split(\",\")\n .map((s) => s.trim().toLowerCase())\n .forEach((part) => {\n if (valid.includes(part as DocsJokeFlagKey)) keys.add(part as DocsJokeFlagKey);\n });\n };\n url.searchParams.getAll(\"blacklistFlags\").forEach(add);\n const single = url.searchParams.get(\"blacklistFlags\");\n if (single) add(single);\n return [...keys];\n}\n\n/** Exclude jokes that match any blacklisted flag (JokeAPI-style). */\nexport function applyJokeBlacklist(\n jokes: DocsJokeItem[],\n blacklist: DocsJokeFlagKey[],\n): DocsJokeItem[] {\n if (!blacklist.length) return jokes;\n return jokes.filter(\n (j) => !blacklist.some((flag) => j.flags[flag] === true),\n );\n}\n\n/** Filtre doc joke queue (`contains`, `lang`, `blacklistFlags` via `dataFilterProvider`). */\nexport function filterDocsJokes(\n jokes: DocsJokeItem[],\n url: URL,\n): DocsJokeItem[] {\n let pool = jokes;\n const contains = url.searchParams.get(\"contains\")?.trim().toLowerCase();\n if (contains) {\n pool = pool.filter((j) => {\n const haystack = [j.joke, j.setup, j.delivery, ...j.categories]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(contains);\n });\n }\n const lang = url.searchParams.get(\"lang\")?.trim().toLowerCase();\n if (lang === \"fr\" || lang === \"en\") {\n pool = pool.filter((j) => j.lang === lang);\n }\n pool = applyJokeBlacklist(pool, parseBlacklistFlags(url));\n return pool;\n}\n\n/**\n * R\u00E9ponse type JokeAPI v2.\n * - `amount` : taille du lot si pas de `offset`\n * - `offset` + `limit` / `per_page` : pagination (sonic-queue lazy)\n * - `contains`, `lang`, `blacklistFlags` : filtres formulaire (queue \u00AB Remove following jokes \u00BB)\n */\nexport function buildJokeApiResponse(url: URL): DocsJokeApiResponse {\n const pool = filterDocsJokes(SAMPLE_JOKES, url);\n const amount = Math.max(\n 1,\n parseInt(url.searchParams.get(\"amount\") || \"10\", 10),\n );\n const hasOffset = url.searchParams.has(\"offset\");\n const limit = Math.max(\n 1,\n parseInt(\n url.searchParams.get(\"limit\") ||\n url.searchParams.get(\"per_page\") ||\n String(amount),\n 10,\n ),\n );\n const offset = Math.max(0, parseInt(url.searchParams.get(\"offset\") || \"0\", 10));\n const start = hasOffset ? offset : 0;\n const count = hasOffset ? limit : amount;\n const jokes = pool.slice(start, start + count).map((j, i) => ({\n ...j,\n id: start + i + 1,\n }));\n return { error: false, amount: jokes.length, jokes };\n}\n", "import { handleApiConfigMockRequest } from \"./api-config-mock\";\nimport {\n DOCS_GEO_COMMUNES,\n DOCS_REQRES_USERS,\n buildJokeApiResponse,\n filterDocsUsers,\n type GeoCommuneRow,\n type ReqresUserResponse,\n type ReqresUsersListResponse,\n} from \"./fixtures\";\n\nexport const DOCS_MOCK_API_PREFIX = \"/docs-mock-api\";\n\nfunction json(\n body: unknown,\n init: ResponseInit & { delayMs?: number } = {},\n): Promise<Response> {\n const { delayMs = 0, ...responseInit } = init;\n const headers = new Headers(responseInit.headers);\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n headers.set(\"Access-Control-Allow-Origin\", \"*\");\n headers.set(\"X-Docs-Mock-Api\", \"concorde\");\n\n const build = () =>\n new Response(JSON.stringify(body), { ...responseInit, headers });\n\n if (delayMs <= 0) return Promise.resolve(build());\n return new Promise((resolve) =>\n setTimeout(() => resolve(build()), delayMs),\n );\n}\n\n/**\n * Liste utilisateurs type ReqRes.\n * - `offset` + `per_page` / `limit` : pagination index\u00E9e (sonic-queue avec `$offset` / `$limit`)\n * - `page` + `per_page` : num\u00E9ro de page 1-based (sonic-fetch, ex. `?page=2`)\n * - `q` : recherche sur pr\u00E9nom, nom, email (sonic-queue + `dataFilterProvider`, champ `name=\"q\"`)\n */\nexport function paginateUsers(url: URL): ReqresUsersListResponse {\n const perPage = Math.max(\n 1,\n parseInt(\n url.searchParams.get(\"per_page\") ||\n url.searchParams.get(\"limit\") ||\n \"6\",\n 10,\n ),\n );\n const pool = filterDocsUsers(DOCS_REQRES_USERS, url.searchParams.get(\"q\"));\n const total = pool.length;\n\n let start: number;\n let page: number;\n\n if (url.searchParams.has(\"offset\")) {\n start = Math.max(0, parseInt(url.searchParams.get(\"offset\") || \"0\", 10));\n page = Math.floor(start / perPage) + 1;\n } else {\n page = Math.max(1, parseInt(url.searchParams.get(\"page\") || \"1\", 10));\n start = (page - 1) * perPage;\n }\n\n const data = pool.slice(start, start + perPage);\n\n return {\n page,\n per_page: perPage,\n total,\n total_pages: Math.max(1, Math.ceil(total / perPage)),\n data,\n };\n}\n\nasync function parseRegisterFields(\n request: Request,\n): Promise<{ email?: string; password?: string }> {\n const contentType = (request.headers.get(\"content-type\") || \"\").toLowerCase();\n\n if (contentType.includes(\"multipart/form-data\")) {\n const fd = await request.formData();\n return {\n email: String(fd.get(\"email\") ?? \"\"),\n password: String(fd.get(\"password\") ?? \"\"),\n };\n }\n\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n const text = await request.text();\n const params = new URLSearchParams(text);\n return {\n email: params.get(\"email\") ?? \"\",\n password: params.get(\"password\") ?? \"\",\n };\n }\n\n const text = await request.text();\n if (!text.trim()) return {};\n\n try {\n const parsed = JSON.parse(text) as { email?: unknown; password?: unknown };\n return {\n email: parsed.email != null ? String(parsed.email) : \"\",\n password: parsed.password != null ? String(parsed.password) : \"\",\n };\n } catch {\n const params = new URLSearchParams(text);\n if (params.has(\"email\") || params.has(\"password\")) {\n return {\n email: params.get(\"email\") ?? \"\",\n password: params.get(\"password\") ?? \"\",\n };\n }\n return {};\n }\n}\n\nfunction registerOkBody(\n fields: { email: string; password: string },\n nested = false,\n) {\n const payload = {\n id: 4,\n token: \"docs-mock-register-token\",\n email: fields.email,\n };\n return nested ? { data: payload } : payload;\n}\n\nfunction geoCommunes(url: URL): GeoCommuneRow[] {\n const limit = Math.max(\n 1,\n parseInt(url.searchParams.get(\"limit\") || \"5\", 10),\n );\n const offset = Math.max(0, parseInt(url.searchParams.get(\"offset\") || \"0\", 10));\n return DOCS_GEO_COMMUNES.slice(offset, offset + limit);\n}\n\n/**\n * Intercepte les requ\u00EAtes vers /docs-mock-api/* (Service Worker ou middleware Vite).\n */\nexport async function handleDocsMockApiRequest(\n request: Request,\n): Promise<Response | null> {\n const url = new URL(request.url);\n if (!url.pathname.startsWith(DOCS_MOCK_API_PREFIX)) return null;\n\n const subPath = url.pathname.slice(DOCS_MOCK_API_PREFIX.length) || \"/\";\n const method = request.method.toUpperCase();\n\n if (subPath === \"/health\") {\n return json({ ok: true, service: \"concorde-docs-mock-api\" });\n }\n\n const apiConfigResponse = handleApiConfigMockRequest(request, subPath, method);\n if (apiConfigResponse) return apiConfigResponse;\n\n if (\n (subPath === \"/api/register\" || subPath === \"/api/register/nested\") &&\n method === \"POST\"\n ) {\n const body = await parseRegisterFields(request);\n if (!body.email?.trim() || !body.password?.trim()) {\n return json(\n {\n messages: [\n {\n content: \"email and password are required\",\n status: \"error\",\n },\n ],\n },\n { status: 400 },\n );\n }\n return json(\n registerOkBody(\n { email: body.email!.trim(), password: body.password!.trim() },\n subPath === \"/api/register/nested\",\n ),\n );\n }\n\n const sessionSyncMatch = subPath.match(/^\\/api\\/sessions\\/([^/]+)\\/sync$/);\n if (sessionSyncMatch && method === \"POST\") {\n const sessionId = decodeURIComponent(sessionSyncMatch[1]);\n let body: Record<string, unknown> = {};\n try {\n const text = await request.text();\n if (text.trim()) {\n body = JSON.parse(text) as Record<string, unknown>;\n }\n } catch {\n body = {};\n }\n return json({\n ok: true,\n sessionId,\n serverTime: Date.now(),\n echo: body,\n });\n }\n\n if (subPath === \"/api/register/echo\" && method === \"GET\") {\n const email = url.searchParams.get(\"email\") ?? \"\";\n const password = url.searchParams.get(\"password\") ?? \"\";\n if (!email.trim() || !password.trim()) {\n return json(\n {\n messages: [\n {\n content: \"email and password query params are required\",\n status: \"error\",\n },\n ],\n },\n { status: 400 },\n );\n }\n return json({\n method: \"GET\",\n query: { email, password },\n email,\n note: \"sonic-submit method=\\\"get\\\" appends form fields to the endpoint URL\",\n });\n }\n\n if (method !== \"GET\") {\n return json({ error: \"Method not allowed\" }, { status: 405 });\n }\n\n const userMatch = subPath.match(/^\\/api\\/users\\/(\\d+)$/);\n if (userMatch) {\n const id = parseInt(userMatch[1], 10);\n const user =\n DOCS_REQRES_USERS.find((u) => u.id === id) ?? DOCS_REQRES_USERS[0];\n const body: ReqresUserResponse = { data: { ...user, id } };\n return json(body);\n }\n\n if (subPath === \"/api/users\") {\n return json(paginateUsers(url));\n }\n\n if (subPath === \"/geo/communes\" || subPath.startsWith(\"/geo/communes\")) {\n return json(geoCommunes(url), {\n headers: { \"X-Fetched-At\": new Date().toISOString() },\n });\n }\n\n const jokeMatch = subPath.match(/^\\/jokes\\/joke\\/([^/]+)$/);\n if (jokeMatch) {\n return json(buildJokeApiResponse(url));\n }\n\n return json({ error: \"Not found\", path: subPath }, { status: 404 });\n}\n", "/// <reference lib=\"webworker\" />\nimport { handleDocsMockApiRequest} from \"./router\";\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nself.addEventListener(\"install\", (event) => {\n event.waitUntil(self.skipWaiting());\n});\n\nself.addEventListener(\"activate\", (event) => {\n event.waitUntil(self.clients.claim());\n});\n\nself.addEventListener(\"fetch\", (event) => {\n const {request} = event;\n event.respondWith(\n (async () => {\n const mocked = await handleDocsMockApiRequest(request);\n if (mocked) return mocked;\n return fetch(request);\n })(),\n );\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["json", "text"]
7
7
  }
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Prépare une arborescence « lib publique » pour GitHub :
4
+ * - sans site doc (src/docs, index.html, …)
5
+ * - sans sonic-captcha (altcha.supersoniks.org)
6
+ * - sans scripts / jobs GitLab internes
7
+ *
8
+ * Usage :
9
+ * node scripts/github-export.mjs [répertoire_cible]
10
+ *
11
+ * Par défaut : ../concorde-github-export
12
+ */
13
+ import fs from "fs";
14
+ import path from "path";
15
+ import { fileURLToPath } from "url";
16
+
17
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
18
+ const ROOT = path.resolve(__dirname, "..");
19
+ const IGNORE_FILE = path.join(ROOT, ".github-export-ignore");
20
+ const DEFAULT_OUT = path.resolve(ROOT, "../concorde-github-export");
21
+
22
+ const EXPORT_FILTER_KEY =
23
+ /(?:^|\/)(?:docs|mock-api|undefined)(?:\/|$)|captcha|\.demo\.|\.stories\.|TestUtils|\/prism\/|\/search\/|\/tailwind\/|\/header\/|\/navigation\/|\/layout\.ts$|\/code\.ts$|^code$|^docs$|^layout$/;
24
+
25
+ function readIgnorePatterns() {
26
+ if (!fs.existsSync(IGNORE_FILE)) return [];
27
+ return fs
28
+ .readFileSync(IGNORE_FILE, "utf8")
29
+ .split("\n")
30
+ .map((l) => l.trim())
31
+ .filter((l) => l && !l.startsWith("#"));
32
+ }
33
+
34
+ function globToRegExp(pattern) {
35
+ const escaped = pattern
36
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&")
37
+ .replace(/\*\*/g, "{{GLOBSTAR}}")
38
+ .replace(/\*/g, "[^/]*")
39
+ .replace(/\{\{GLOBSTAR\}\}/g, ".*");
40
+ return new RegExp(`^${escaped}$`);
41
+ }
42
+
43
+ function shouldExclude(relativePath, patterns) {
44
+ const normalized = relativePath.replace(/\\/g, "/");
45
+ for (const pattern of patterns) {
46
+ const re = globToRegExp(pattern);
47
+ if (re.test(normalized)) return true;
48
+ if (normalized.startsWith(pattern.endsWith("/") ? pattern : `${pattern}/`))
49
+ return true;
50
+ if (normalized === pattern) return true;
51
+ }
52
+ return false;
53
+ }
54
+
55
+ function listAllFiles(dir, base = dir) {
56
+ const out = [];
57
+ for (const name of fs.readdirSync(dir, { withFileTypes: true })) {
58
+ if (name.name === ".git" || name.name === "node_modules") continue;
59
+ const full = path.join(dir, name.name);
60
+ const rel = path.relative(base, full).replace(/\\/g, "/");
61
+ if (name.isDirectory()) {
62
+ if (shouldExclude(rel, ignorePatterns)) continue;
63
+ out.push(...listAllFiles(full, base));
64
+ } else {
65
+ if (!shouldExclude(rel, ignorePatterns)) out.push(rel);
66
+ }
67
+ }
68
+ return out;
69
+ }
70
+
71
+ function copyFile(rel, destRoot) {
72
+ const src = path.join(ROOT, rel);
73
+ const dest = path.join(destRoot, rel);
74
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
75
+ fs.copyFileSync(src, dest);
76
+ }
77
+
78
+ function patchUiTs(destRoot) {
79
+ const uiPath = path.join(
80
+ destRoot,
81
+ "src/core/components/ui/ui.ts",
82
+ );
83
+ if (!fs.existsSync(uiPath)) return;
84
+ const content = fs.readFileSync(uiPath, "utf8");
85
+ const patched = content.replace(
86
+ /import "\.\/captcha\/captcha";\n?/,
87
+ "",
88
+ );
89
+ fs.writeFileSync(uiPath, patched);
90
+ }
91
+
92
+ function exportHaystack(value) {
93
+ if (typeof value === "string") return value;
94
+ if (value && typeof value === "object") {
95
+ return `${value.types ?? ""}${value.default ?? ""}`;
96
+ }
97
+ return String(value);
98
+ }
99
+
100
+ function filterPackageJson(destRoot) {
101
+ const pkgPath = path.join(destRoot, "package.json");
102
+ if (!fs.existsSync(pkgPath)) return;
103
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
104
+ if (pkg.exports && typeof pkg.exports === "object") {
105
+ const next = {};
106
+ for (const [key, value] of Object.entries(pkg.exports)) {
107
+ const hay = `${key}:${exportHaystack(value)}`;
108
+ if (EXPORT_FILTER_KEY.test(hay)) continue;
109
+ if (exportHaystack(value).includes("/captcha/")) continue;
110
+ if (exportHaystack(value).includes("/docs/")) continue;
111
+ if (exportHaystack(value).includes(".demo.")) continue;
112
+ if (exportHaystack(value).includes(".stories.")) continue;
113
+ next[key] = value;
114
+ }
115
+ pkg.exports = next;
116
+ }
117
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
118
+ }
119
+
120
+ function patchReadme(destRoot) {
121
+ const readmePath = path.join(destRoot, "README.md");
122
+ if (!fs.existsSync(readmePath)) return;
123
+ let text = fs.readFileSync(readmePath, "utf8");
124
+ text = text.replace(
125
+ /Le dépôt GitHub est un \*\*miroir\*\* synchronisé depuis GitLab \(voir \[OPEN_SOURCE_CHECKPOINT\.md\]\(OPEN_SOURCE_CHECKPOINT\.md\)\)\./,
126
+ "Le dépôt GitHub est un **export filtré** depuis GitLab (librairie uniquement, sans site doc ni composant captcha — voir [OPEN_SOURCE_CHECKPOINT.md](OPEN_SOURCE_CHECKPOINT.md)).",
127
+ );
128
+ fs.writeFileSync(readmePath, text);
129
+ }
130
+
131
+ const ignorePatterns = readIgnorePatterns();
132
+ const outDir = path.resolve(process.argv[2] || DEFAULT_OUT);
133
+
134
+ if (fs.existsSync(outDir)) {
135
+ fs.rmSync(outDir, { recursive: true, force: true });
136
+ }
137
+ fs.mkdirSync(outDir, { recursive: true });
138
+
139
+ const files = listAllFiles(ROOT);
140
+ for (const rel of files) {
141
+ copyFile(rel, outDir);
142
+ }
143
+
144
+ patchUiTs(outDir);
145
+ filterPackageJson(outDir);
146
+ patchReadme(outDir);
147
+
148
+ console.log(`✅ Export GitHub : ${files.length} fichiers → ${outDir}`);
149
+ console.log(" Exclusions : .github-export-ignore");
150
+ console.log(" Patches : ui.ts (sans captcha), package.json exports");
@@ -2,6 +2,11 @@
2
2
 
3
3
  import fs from "fs";
4
4
  import path from "path";
5
+ import { execSync } from "child_process";
6
+ import { fileURLToPath } from "url";
7
+
8
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
+ const root = path.resolve(__dirname, "..");
5
10
 
6
11
  //copy concorde-core.bundle.js and concorde-core.es.js from docs to the root of the project
7
12
  fs.copyFileSync(
@@ -12,3 +17,41 @@ fs.copyFileSync(
12
17
  path.resolve("dist/concorde-core.es.js"),
13
18
  path.resolve("concorde-core.es.js")
14
19
  );
20
+
21
+ for (const file of ["concorde-core.bundle.js", "concorde-core.es.js"]) {
22
+ const content = fs.readFileSync(path.resolve(file), "utf8");
23
+ const checks = [
24
+ ["concordeIsLoaded", "signal de chargement"],
25
+ ["customElements.define", "enregistrement des web components"],
26
+ ["concorde-loaded", "événement concorde-loaded"],
27
+ ];
28
+ for (const [needle, label] of checks) {
29
+ if (!content.includes(needle)) {
30
+ console.error(`❌ ${file} : marqueur manquant (${label})`);
31
+ process.exit(1);
32
+ }
33
+ }
34
+ }
35
+ console.log("✅ Bundles concorde-core vérifiés");
36
+
37
+ console.log("🚀 Génération des types (.d.ts)");
38
+ const fetcherPath = path.join(root, "src/core/mixins/Fetcher.ts");
39
+ const fetcherOriginal = fs.readFileSync(fetcherPath, "utf8");
40
+ fs.writeFileSync(
41
+ fetcherPath,
42
+ fetcherOriginal.replace("protected async _fetchData()", "async _fetchData()")
43
+ );
44
+ try {
45
+ execSync("tsc -p src/tsconfig.declarations.json", {
46
+ cwd: root,
47
+ stdio: "inherit",
48
+ });
49
+ } finally {
50
+ fs.writeFileSync(fetcherPath, fetcherOriginal);
51
+ }
52
+
53
+ console.log("🚀 Génération du JavaScript (dist/js/)");
54
+ execSync("tsc -p src/tsconfig.emit.json", {
55
+ cwd: root,
56
+ stdio: "inherit",
57
+ });
@@ -43,10 +43,14 @@ function listFiles(dir) {
43
43
  return files;
44
44
  }
45
45
  const componentsFiles = listFiles(path.resolve(__dirname, "../src"));
46
+ const isPublishableTs = (file) =>
47
+ file.match(/\.ts$/) &&
48
+ !file.match(/\.(spec|test|demo|stories|type-test)\.ts$/) &&
49
+ !file.includes("/docs/");
46
50
  //short notation for ts file
47
51
  const shortPathMapping = {};
48
52
  componentsFiles.forEach((file) => {
49
- if (!file.match(/\.ts$/)) {
53
+ if (!isPublishableTs(file)) {
50
54
  return;
51
55
  }
52
56
  //add simplified path to tsconfig paths
@@ -108,6 +112,27 @@ fs.writeFileSync(tsConfigPath, JSON.stringify(tsConfig, null, 2));
108
112
 
109
113
  //Do the same using shrotpathMapping to fill the exports un package.json
110
114
 
115
+ function typesPath(srcRelative) {
116
+ if (!srcRelative.endsWith(".ts")) return null;
117
+ return srcRelative
118
+ .replace(/^\.\/src\//, "./dist/types/")
119
+ .replace(/\.ts$/, ".d.ts");
120
+ }
121
+
122
+ function jsPath(srcRelative) {
123
+ if (!srcRelative.endsWith(".ts")) return null;
124
+ return srcRelative
125
+ .replace(/^\.\/src\//, "./dist/js/")
126
+ .replace(/\.ts$/, ".js");
127
+ }
128
+
129
+ function exportEntry(srcRelative) {
130
+ const types = typesPath(srcRelative);
131
+ const js = jsPath(srcRelative);
132
+ if (!types || !js) return srcRelative;
133
+ return { types, default: js };
134
+ }
135
+
111
136
  const packageJsonPath = path.resolve(__dirname, "../package.json");
112
137
  let packageJson = JSON.parse(fs.readFileSync(packageJsonPath));
113
138
 
@@ -116,8 +141,11 @@ const pExports = {
116
141
  "./src/core/components/ui/icon/icons.json",
117
142
  "./core/components/functional/sdui/default-library.json":
118
143
  "./src/core/components/functional/sdui/default-library.json",
119
- "./dataProviderKey": "./src/core/utils/dataProviderKey.ts",
120
- "./*": "./src/*.ts",
144
+ "./dataProviderKey": exportEntry("./src/core/utils/dataProviderKey.ts"),
145
+ "./*": {
146
+ types: "./dist/types/*.d.ts",
147
+ default: "./dist/js/*.js",
148
+ },
121
149
  "./vite-config": "./vite/config.js",
122
150
  "./rollup-plugin-*": "./rollup/plugin-*.js",
123
151
  };
@@ -127,7 +155,7 @@ for (let key in shortPathMapping) {
127
155
  let p = shortPathMapping[key][0];
128
156
  //set path relative to project source
129
157
  p = p.replace(path.resolve(__dirname, "../src") + "/", "./src/");
130
- pExports[key] = p;
158
+ pExports[key] = exportEntry(p);
131
159
  }
132
160
 
133
161
  packageJson.exports = pExports;
@@ -4,6 +4,8 @@ import fs from "fs";
4
4
  const requiredFiles = [
5
5
  'concorde-core.bundle.js',
6
6
  'concorde-core.es.js',
7
+ 'dist/types/decorators.d.ts',
8
+ 'dist/js/decorators.js',
7
9
  'ai/AGENTS.md',
8
10
  'scripts/ai-init.mjs',
9
11
  ];
@@ -60,7 +60,7 @@ export default class Queue extends Subscriber(LitElement, {} as QueueProps) {
60
60
  @property() filteredFields = "";
61
61
  disconnectedCallback() {
62
62
  for (const dataProvider of this.listDataProviders) {
63
- PublisherManager.delete(dataProvider);
63
+ PublisherManager.getInstance().delete(dataProvider);
64
64
  this.listDataProviders = [];
65
65
  }
66
66
  this.filterPublisher?.offInternalMutation(this.updateFilteredContent);
@@ -167,7 +167,7 @@ export default class Queue extends Subscriber(LitElement, {} as QueueProps) {
167
167
  */
168
168
 
169
169
  for (const dataProvider of this.listDataProviders) {
170
- PublisherManager.delete(dataProvider);
170
+ PublisherManager.getInstance().delete(dataProvider);
171
171
  // this.publisher.lastFetchedData = {};
172
172
  }
173
173
  this.listDataProviders = [];
@@ -445,7 +445,7 @@ export class Modal extends Subscriber(LitElement) {
445
445
  }
446
446
 
447
447
  // Show the modal
448
- async show(): Promise<void> {
448
+ private async show(): Promise<void> {
449
449
  this._modalElement.show();
450
450
  this._animationState = "in";
451
451
  await this.animation("in");
@@ -7,3 +7,4 @@ export type { HandleOptions } from "./subscriber/handle";
7
7
  export { autoSubscribe } from "./subscriber/autoSubscribe";
8
8
  export { autoFill } from "./subscriber/autoFill";
9
9
  export { ancestorAttribute } from "./subscriber/ancestorAttribute";
10
+ export type { AncestorAttributeOptions } from "./subscriber/ancestorAttribute";
@@ -22,6 +22,15 @@ async function flushGetMicrotasks() {
22
22
  await Promise.resolve();
23
23
  }
24
24
 
25
+ async function flushGetFrames() {
26
+ await new Promise<void>((resolve) => {
27
+ requestAnimationFrame(() => {
28
+ requestAnimationFrame(() => resolve());
29
+ });
30
+ });
31
+ await Promise.resolve();
32
+ }
33
+
25
34
  function mockPayload<T>(result: T) {
26
35
  return {
27
36
  request: new Request("https://api.example.test/items/1"),
@@ -61,7 +70,7 @@ describe("get", () => {
61
70
  }
62
71
  const el = document.createElement(tag) as InstanceType<typeof C>;
63
72
  document.body.appendChild(el);
64
- await flushGetMicrotasks();
73
+ await flushGetFrames();
65
74
  expect(el.payload?.result).toEqual({ id: "loaded" });
66
75
  expect(el.payload?.response?.ok).toBe(true);
67
76
  expect(el.payload?.request.url).toContain("api.example.test");
@@ -88,7 +97,7 @@ describe("get", () => {
88
97
 
89
98
  const el = document.createElement(tag) as InstanceType<typeof TestRow>;
90
99
  document.body.appendChild(el);
91
- await flushGetMicrotasks();
100
+ await flushGetFrames();
92
101
 
93
102
  expect(API.prototype.getDetailed).toHaveBeenCalledWith("rows/42");
94
103
  expect(el.payload?.result).toEqual({ id: "loaded" });
@@ -136,15 +145,76 @@ describe("get", () => {
136
145
  }
137
146
  const el = document.createElement(tag) as InstanceType<typeof C>;
138
147
  document.body.appendChild(el);
139
- await flushGetMicrotasks();
148
+ await flushGetFrames();
140
149
  expect(API.prototype.getDetailed).toHaveBeenCalledTimes(1);
141
150
 
142
151
  pub.set({
143
152
  ...staticConfig,
144
153
  serviceURL: "https://api.example.test/v2",
145
154
  });
146
- await flushGetMicrotasks();
155
+ await flushGetFrames();
147
156
  expect(API.prototype.getDetailed).toHaveBeenCalledTimes(2);
148
157
  expect(el.payload?.result).toEqual({ id: "loaded" });
149
158
  });
159
+
160
+ it("relance le GET quand le publisher trigger est invalidé", async () => {
161
+ const triggerPubId = "getSpecTrigger1";
162
+ const triggerKey = new DataProviderKey<number>(triggerPubId);
163
+ const itemEp = new Endpoint<{ id: string }>("items/1");
164
+ const tag = "test-api-get-trigger";
165
+
166
+ class C extends HTMLElement {
167
+ @get(itemEp, { triggerKey })
168
+ payload: ApiResult<{ id: string }> | null = null;
169
+ }
170
+ if (!customElements.get(tag)) {
171
+ customElements.define(tag, C);
172
+ }
173
+
174
+ const wrap = document.createElement("div");
175
+ wrap.setAttribute("serviceURL", "https://api.example.test");
176
+ const el = document.createElement(tag) as InstanceType<typeof C>;
177
+ wrap.appendChild(el);
178
+ document.body.appendChild(wrap);
179
+
180
+ await flushGetMicrotasks();
181
+ const callsBeforeInvalidate = vi.mocked(API.prototype.getDetailed).mock
182
+ .calls.length;
183
+ expect(callsBeforeInvalidate).toBeGreaterThanOrEqual(1);
184
+
185
+ PublisherManager.get(triggerPubId).invalidate();
186
+ await flushGetFrames();
187
+ expect(
188
+ vi.mocked(API.prototype.getDetailed).mock.calls.length,
189
+ ).toBeGreaterThan(callsBeforeInvalidate);
190
+ expect(el.payload?.result).toEqual({ id: "loaded" });
191
+ });
192
+
193
+ it("refetch automatique avec refetchEveryMs", async () => {
194
+ vi.useFakeTimers();
195
+ const itemEp = new Endpoint<{ id: string }>("items/1");
196
+ const tag = "test-api-get-refetch";
197
+
198
+ class C extends HTMLElement {
199
+ @get(itemEp, { refetchEveryMs: 1000 })
200
+ payload: ApiResult<{ id: string }> | null = null;
201
+ }
202
+ if (!customElements.get(tag)) {
203
+ customElements.define(tag, C);
204
+ }
205
+
206
+ const wrap = document.createElement("div");
207
+ wrap.setAttribute("serviceURL", "https://api.example.test");
208
+ wrap.appendChild(document.createElement(tag));
209
+ document.body.appendChild(wrap);
210
+
211
+ await flushGetMicrotasks();
212
+ expect(API.prototype.getDetailed).toHaveBeenCalledTimes(1);
213
+
214
+ await vi.advanceTimersByTimeAsync(1000);
215
+ await flushGetMicrotasks();
216
+ expect(API.prototype.getDetailed).toHaveBeenCalledTimes(2);
217
+
218
+ vi.useRealTimers();
219
+ });
150
220
  });