@ozdao/martyrs 0.2.564 → 0.2.566

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 (366) hide show
  1. package/dist/abac-BPl9Bmf9.js +1527 -0
  2. package/dist/builder.js +51 -39
  3. package/dist/{common.schema-GFSlNJo7.js → common.schema-DswiUXKB.js} +1 -1
  4. package/dist/community.server.js +48 -9
  5. package/dist/core.server.js +6 -4
  6. package/dist/{crud-C7FSTUes.js → crud-q1ye5IhV.js} +7 -7
  7. package/dist/events.server.js +3 -3
  8. package/dist/gallery.server.js +2 -2
  9. package/dist/inventory.server.js +4 -6
  10. package/dist/{main-CmjWiDVF.js → main-B9o1iBAZ.js} +1279 -1287
  11. package/dist/marketplace.server.js +1 -1
  12. package/dist/martyrs/dist/main-B9o1iBAZ.js +943 -0
  13. package/dist/martyrs/dist/main-B9o1iBAZ.js.map +1 -0
  14. package/dist/martyrs/dist/web-BF3ijvEr.js +55 -0
  15. package/dist/martyrs/dist/web-BF3ijvEr.js.map +1 -0
  16. package/dist/martyrs/src/components/BottomSheet/BottomSheet.vue.js +96 -0
  17. package/dist/martyrs/src/components/BottomSheet/BottomSheet.vue.js.map +1 -0
  18. package/dist/martyrs/src/components/Button/{Button.vue.js → Button.vue2.js} +36 -45
  19. package/dist/martyrs/src/components/Button/Button.vue2.js.map +1 -0
  20. package/dist/martyrs/src/components/Feed/Carousel.vue.js +1 -1
  21. package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
  22. package/dist/martyrs/src/components/Field/{Field.vue2.js → Field.vue.js} +2 -2
  23. package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -0
  24. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +2 -2
  25. package/dist/martyrs/src/components/FieldPhone/FieldPhone.vue.js +1 -1
  26. package/dist/martyrs/src/components/FieldPhone/FieldPhone.vue.js.map +1 -1
  27. package/dist/martyrs/src/components/Loader/{Loader.vue2.js → Loader.vue.js} +3 -4
  28. package/dist/martyrs/src/components/Loader/Loader.vue.js.map +1 -0
  29. package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js +1 -1
  30. package/dist/martyrs/src/components/Media/Media.vue.js +1 -1
  31. package/dist/martyrs/src/components/Menu/{Menu.vue.js → Menu.vue2.js} +2 -2
  32. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +1 -0
  33. package/dist/martyrs/src/components/Select/{Select.vue2.js → Select.vue.js} +2 -2
  34. package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -0
  35. package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue.js → SelectMulti.vue2.js} +2 -2
  36. package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue2.js.map +1 -0
  37. package/dist/martyrs/src/components/Tree/Tree.vue.js +6 -3
  38. package/dist/martyrs/src/components/Tree/Tree.vue.js.map +1 -1
  39. package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js +1 -1
  40. package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js +1 -1
  41. package/dist/martyrs/src/modules/auth/auth.client.js +10 -7
  42. package/dist/martyrs/src/modules/auth/auth.client.js.map +1 -1
  43. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +2 -2
  45. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +2 -2
  46. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +3 -3
  47. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +1 -1
  48. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
  49. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +2 -2
  50. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +2 -2
  51. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +13 -13
  52. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js.map +1 -1
  53. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +2 -2
  54. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +2 -2
  55. package/dist/martyrs/src/modules/auth/views/router/auth.router.js +116 -0
  56. package/dist/martyrs/src/modules/auth/views/router/auth.router.js.map +1 -0
  57. package/dist/martyrs/src/modules/auth/views/router/users.router.js +180 -0
  58. package/dist/martyrs/src/modules/auth/views/router/users.router.js.map +1 -0
  59. package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +4 -4
  60. package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js.map +1 -1
  61. package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +1 -1
  62. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +2 -2
  63. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +2 -2
  64. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +1 -1
  65. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.js +1 -1
  66. package/dist/martyrs/src/modules/core/locales/en.js +45 -0
  67. package/dist/martyrs/src/modules/core/locales/en.js.map +1 -1
  68. package/dist/martyrs/src/modules/core/locales/ru.js +45 -0
  69. package/dist/martyrs/src/modules/core/locales/ru.js.map +1 -1
  70. package/dist/martyrs/src/modules/core/views/classes/i18n.manager.js +9 -0
  71. package/dist/martyrs/src/modules/core/views/classes/i18n.manager.js.map +1 -1
  72. package/dist/martyrs/src/modules/core/views/components/blocks/BlockSearch.vue.js +1 -1
  73. package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +1 -1
  74. package/dist/martyrs/src/modules/core/views/components/blocks/PopupAuth.vue.js +1 -1
  75. package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +2 -2
  76. package/dist/martyrs/src/modules/core/views/components/layouts/App.vue.js +1 -1
  77. package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +3 -2
  78. package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js.map +1 -1
  79. package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +2 -2
  80. package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +1 -1
  81. package/dist/martyrs/src/modules/core/views/components/sections/Walkthrough.vue.js +1 -1
  82. package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterRange.vue.js +1 -1
  83. package/dist/martyrs/src/modules/core/views/mixins/mixins.js +1 -2
  84. package/dist/martyrs/src/modules/core/views/mixins/mixins.js.map +1 -1
  85. package/dist/martyrs/src/modules/core/views/router/addRoutes.js +6 -1
  86. package/dist/martyrs/src/modules/core/views/router/addRoutes.js.map +1 -1
  87. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +2 -2
  88. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
  89. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +4 -4
  90. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +2 -2
  91. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +2 -2
  92. package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +2 -2
  93. package/dist/martyrs/src/modules/events/components/sections/Feed.vue.js +1 -1
  94. package/dist/martyrs/src/modules/events/components/sections/List.vue.js +1 -1
  95. package/dist/martyrs/src/modules/events/events.client.js +15 -12
  96. package/dist/martyrs/src/modules/events/events.client.js.map +1 -1
  97. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +4 -4
  98. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +3 -3
  99. package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +1 -1
  100. package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +1 -1
  101. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +3 -3
  102. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +5 -5
  103. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js.map +1 -1
  104. package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +1 -1
  105. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js +1 -1
  106. package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +95 -0
  107. package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js.map +1 -0
  108. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +6 -3
  109. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -1
  110. package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +25 -25
  111. package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js.map +1 -1
  112. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
  113. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
  114. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +3 -3
  115. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +4 -4
  116. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +2 -2
  117. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +1 -1
  118. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +3 -3
  119. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js +31 -6
  120. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js.map +1 -1
  121. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +121 -206
  122. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -1
  123. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +2 -2
  124. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +9 -13
  125. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -1
  126. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
  127. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +167 -246
  128. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
  129. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +2 -2
  130. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +136 -221
  131. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +1 -1
  132. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
  133. package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js +171 -0
  134. package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js.map +1 -0
  135. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +32 -154
  136. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js.map +1 -1
  137. package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js +96 -0
  138. package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js.map +1 -0
  139. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +55 -27
  140. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js.map +1 -1
  141. package/dist/martyrs/src/modules/music/components/player/tonar.png.js +5 -0
  142. package/dist/martyrs/src/modules/music/components/player/tonar.png.js.map +1 -0
  143. package/dist/martyrs/src/modules/music/store/albums.js +8 -2
  144. package/dist/martyrs/src/modules/music/store/albums.js.map +1 -1
  145. package/dist/martyrs/src/modules/music/store/player.js +83 -65
  146. package/dist/martyrs/src/modules/music/store/player.js.map +1 -1
  147. package/dist/martyrs/src/modules/music/store/tracks.js +4 -13
  148. package/dist/martyrs/src/modules/music/store/tracks.js.map +1 -1
  149. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js +4 -4
  150. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js.map +1 -1
  151. package/dist/martyrs/src/modules/notifications/notifications.client.js +2 -2
  152. package/dist/martyrs/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue.js +3 -0
  153. package/dist/martyrs/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue.js.map +1 -1
  154. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +3 -3
  155. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +3 -3
  156. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +2 -2
  157. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  158. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
  159. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +2 -2
  160. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +1 -1
  161. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +1 -1
  162. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +2 -2
  163. package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
  164. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
  165. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js.map +1 -1
  166. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
  167. package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
  168. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +2 -2
  169. package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +2 -2
  170. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
  171. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +2 -2
  172. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +5 -5
  173. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js.map +1 -1
  174. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +3 -3
  175. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +3 -3
  176. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +3 -3
  177. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +2 -2
  178. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +2 -2
  179. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +1 -1
  180. package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js +1 -1
  181. package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js.map +1 -1
  182. package/dist/martyrs/src/modules/products/components/blocks/CardProduct.vue.js +15 -2
  183. package/dist/martyrs/src/modules/products/components/blocks/CardProduct.vue.js.map +1 -1
  184. package/dist/martyrs/src/modules/products/components/elements/Image360.vue.js +1 -1
  185. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +10 -7
  186. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js.map +1 -1
  187. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +7 -6
  188. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
  189. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +11 -2
  190. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
  191. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +4 -4
  192. package/dist/martyrs/src/modules/products/components/pages/ProductRecommmendation.vue.js +1 -1
  193. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +1 -1
  194. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +2 -2
  195. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +3 -3
  196. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +3 -3
  197. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +1 -1
  198. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
  199. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +11 -8
  200. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js.map +1 -1
  201. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
  202. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +211 -61
  203. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js.map +1 -1
  204. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +2 -2
  205. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +2 -2
  206. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  207. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +4 -4
  208. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js.map +1 -1
  209. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +3 -3
  210. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +3 -3
  211. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +1 -1
  212. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +2 -2
  213. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +2 -2
  214. package/dist/martyrs.css +1 -1
  215. package/dist/martyrs.es.js +1 -1
  216. package/dist/music.server.js +44 -18
  217. package/dist/node_modules/.pnpm/{@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1 → @capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4}/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/definitions.js +1 -0
  218. package/dist/node_modules/.pnpm/@capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/definitions.js.map +1 -0
  219. package/dist/node_modules/.pnpm/{@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1 → @capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4}/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/index.js +1 -1
  220. package/dist/node_modules/.pnpm/{@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1 → @capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4}/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/index.js.map +1 -1
  221. package/dist/node_modules/.pnpm/{@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1 → @capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4}/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/web.js +16 -1
  222. package/dist/node_modules/.pnpm/@capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/web.js.map +1 -0
  223. package/dist/node_modules/.pnpm/{@capacitor_core@7.0.1 → @capacitor_core@7.4.4}/node_modules/@capacitor/core/dist/index.js +2 -1
  224. package/dist/node_modules/.pnpm/@capacitor_core@7.4.4/node_modules/@capacitor/core/dist/index.js.map +1 -0
  225. package/dist/node_modules/.pnpm/{@capacitor_device@7.0.0_@capacitor_core@7.0.1 → @capacitor_device@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/device/dist/esm/index.js +1 -1
  226. package/dist/node_modules/.pnpm/{@capacitor_device@7.0.0_@capacitor_core@7.0.1 → @capacitor_device@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/device/dist/esm/index.js.map +1 -1
  227. package/dist/node_modules/.pnpm/{@capacitor_device@7.0.0_@capacitor_core@7.0.1 → @capacitor_device@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/device/dist/esm/web.js +1 -1
  228. package/dist/node_modules/.pnpm/{@capacitor_device@7.0.0_@capacitor_core@7.0.1 → @capacitor_device@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/device/dist/esm/web.js.map +1 -1
  229. package/dist/node_modules/.pnpm/{@capacitor_keyboard@7.0.0_@capacitor_core@7.0.1 → @capacitor_keyboard@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/keyboard/dist/esm/definitions.js.map +1 -1
  230. package/dist/node_modules/.pnpm/{@capacitor_keyboard@7.0.0_@capacitor_core@7.0.1 → @capacitor_keyboard@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/keyboard/dist/esm/index.js +1 -1
  231. package/dist/node_modules/.pnpm/{@capacitor_keyboard@7.0.0_@capacitor_core@7.0.1 → @capacitor_keyboard@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/keyboard/dist/esm/index.js.map +1 -1
  232. package/dist/node_modules/.pnpm/{@capacitor_push-notifications@7.0.0_@capacitor_core@7.0.1 → @capacitor_push-notifications@7.0.3_@capacitor_core@7.4.4}/node_modules/@capacitor/push-notifications/dist/esm/index.js +1 -1
  233. package/dist/node_modules/.pnpm/{@capacitor_push-notifications@7.0.0_@capacitor_core@7.0.1 → @capacitor_push-notifications@7.0.3_@capacitor_core@7.4.4}/node_modules/@capacitor/push-notifications/dist/esm/index.js.map +1 -1
  234. package/dist/node_modules/.pnpm/{capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.0.1 → capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.4.4}/node_modules/capacitor-plugin-app-tracking-transparency/dist/esm/index.js +1 -1
  235. package/dist/node_modules/.pnpm/{capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.0.1 → capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.4.4}/node_modules/capacitor-plugin-app-tracking-transparency/dist/esm/index.js.map +1 -1
  236. package/dist/node_modules/.pnpm/{capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.0.1 → capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.4.4}/node_modules/capacitor-plugin-app-tracking-transparency/dist/esm/web.js +1 -1
  237. package/dist/node_modules/.pnpm/{capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.0.1 → capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.4.4}/node_modules/capacitor-plugin-app-tracking-transparency/dist/esm/web.js.map +1 -1
  238. package/dist/notifications.server.js +0 -3
  239. package/dist/orders.server.js +5 -6
  240. package/dist/organizations.server.js +9 -10
  241. package/dist/products.server.js +27 -26
  242. package/dist/{queryProcessor-CBQgZycY.js → queryProcessor-C_5Iipam.js} +4 -1
  243. package/dist/rents.server.js +2 -3
  244. package/dist/spots.server.js +1 -1
  245. package/dist/style.css +252 -161
  246. package/dist/{web-cNKIl_cL.js → web-BF3ijvEr.js} +1 -1
  247. package/package.json +1 -1
  248. package/src/builder/modes/ssr.rspack.dev.js +4 -3
  249. package/src/builder/rspack/rspack.config.api.js +15 -4
  250. package/src/builder/rspack/rspack.config.base.js +3 -3
  251. package/src/builder/rspack/rspack.config.ssr.client.js +28 -28
  252. package/src/builder/templates/page.js +2 -2
  253. package/src/components/BottomSheet/BottomSheet.vue +4 -4
  254. package/src/components/Button/Button.vue +50 -37
  255. package/src/components/FieldPhone/FieldPhone.vue +1 -1
  256. package/src/components/Loader/Loader.vue +1 -1
  257. package/src/components/Tree/Tree.vue +6 -3
  258. package/src/modules/LAYOUT.MD +767 -0
  259. package/src/modules/PROCESS.md +0 -0
  260. package/src/modules/TASKS.MD +17 -0
  261. package/src/modules/auth/auth.client.js +11 -7
  262. package/src/modules/auth/views/components/pages/SignIn.vue +1 -1
  263. package/src/modules/auth/views/router/auth.router.js +94 -0
  264. package/src/modules/auth/views/router/users.router.js +153 -0
  265. package/src/modules/backoffice/components/partials/Sidebar.vue +7 -7
  266. package/src/modules/community/community.server.js +8 -0
  267. package/src/modules/community/policies/blog.policies.js +55 -0
  268. package/src/modules/community/routes/blog.routes.js +1 -1
  269. package/src/modules/community/routes/comments.routes.js +1 -1
  270. package/src/modules/community/routes/reactions.routes.js +1 -4
  271. package/src/modules/core/controllers/classes/abac/abac.adapter.express.js +206 -124
  272. package/src/modules/core/controllers/classes/abac/abac.adapter.ws.js +203 -50
  273. package/src/modules/core/controllers/classes/abac/abac.core.js +127 -36
  274. package/src/modules/core/controllers/classes/abac/abac.fields.js +144 -179
  275. package/src/modules/core/controllers/classes/abac/abac.js +201 -10
  276. package/src/modules/core/controllers/classes/abac/abac.policies.js +147 -57
  277. package/src/modules/core/controllers/classes/crud/crud.policies.js +5 -5
  278. package/src/modules/core/controllers/policies/core.policies.js +5 -2
  279. package/src/modules/core/controllers/utils/queryProcessor.js +4 -1
  280. package/src/modules/core/core.server.js +1 -0
  281. package/src/modules/core/locales/en.js +45 -0
  282. package/src/modules/core/locales/ru.js +45 -0
  283. package/src/modules/core/models/schemas/common.schema.js +1 -1
  284. package/src/modules/core/views/classes/i18n.manager.js +13 -0
  285. package/src/modules/core/views/components/layouts/Client.vue +1 -1
  286. package/src/modules/core/views/components/sections/filters/FilterPrice.vue +81 -0
  287. package/src/modules/core/views/mixins/mixins.js +1 -2
  288. package/src/modules/core/views/router/addRoutes.js +6 -1
  289. package/src/modules/events/events.client.js +3 -0
  290. package/src/modules/events/routes/events.routes.js +1 -1
  291. package/src/modules/inventory/components/pages/InventoryEdit.vue +3 -3
  292. package/src/modules/inventory/policies/inventory.policies.js +1 -1
  293. package/src/modules/inventory/routes/inventory.routes.js +1 -1
  294. package/src/modules/marketplace/marketplace.router.js +66 -0
  295. package/src/modules/marketplace/views/components/layouts/Marketplace.vue +363 -0
  296. package/src/modules/marketplace/views/components/pages/Catalog.vue +73 -0
  297. package/src/modules/music/components/blocks/ActionButtons.vue +74 -0
  298. package/src/modules/music/components/cards/AlbumCard.vue +1 -1
  299. package/src/modules/music/components/cards/ArtistCardSmall.vue +8 -6
  300. package/src/modules/music/components/layouts/MusicBottomPlayer.vue +94 -4
  301. package/src/modules/music/components/pages/Album.vue +55 -67
  302. package/src/modules/music/components/pages/MusicHome.vue +4 -6
  303. package/src/modules/music/components/pages/Playlist.vue +61 -70
  304. package/src/modules/music/components/pages/Track.vue +54 -71
  305. package/src/modules/music/components/player/FullscreenPlayer.vue +248 -0
  306. package/src/modules/music/components/player/MusicPlayer.vue +21 -216
  307. package/src/modules/music/components/player/PlayerControls.vue +112 -0
  308. package/src/modules/music/components/player/Visualizer.vue +151 -0
  309. package/src/modules/music/components/player/VolumeControl.vue +75 -23
  310. package/src/modules/music/components/player/tonar.png +0 -0
  311. package/src/modules/music/controllers/stream.controller.js +1 -1
  312. package/src/modules/music/music.server.js +1 -1
  313. package/src/modules/music/policies/music.policies.js +3 -2
  314. package/src/modules/music/router/library.router.js +26 -0
  315. package/src/modules/music/router/music.router.js +176 -0
  316. package/src/modules/music/routes/albums.routes.js +13 -12
  317. package/src/modules/music/routes/tracks.routes.js +39 -0
  318. package/src/modules/music/store/albums.js +10 -2
  319. package/src/modules/music/store/player.js +101 -89
  320. package/src/modules/music/store/tracks.js +5 -21
  321. package/src/modules/notifications/components/elements/NotificationBadge.vue +5 -6
  322. package/src/modules/notifications/notifications.server.js +1 -3
  323. package/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue +5 -0
  324. package/src/modules/orders/orders.server.js +0 -1
  325. package/src/modules/organizations/components/blocks/CardOrganization.vue +2 -2
  326. package/src/modules/organizations/components/pages/DepartmentEdit.vue +2 -2
  327. package/src/modules/organizations/components/pages/OrganizationEdit.vue +2 -2
  328. package/src/modules/organizations/policies/organizations.policies.js +12 -6
  329. package/src/modules/organizations/routes/organizations.routes.js +1 -3
  330. package/src/modules/products/components/blocks/CardCategory.vue +1 -1
  331. package/src/modules/products/components/blocks/CardProduct.vue +16 -2
  332. package/src/modules/products/components/pages/Categories.vue +9 -6
  333. package/src/modules/products/components/pages/CategoryEdit.vue +8 -4
  334. package/src/modules/products/components/pages/Product.vue +11 -5
  335. package/src/modules/products/components/sections/SectionProduct.vue +11 -7
  336. package/src/modules/products/controllers/categories.controller.js +32 -27
  337. package/src/modules/products/routes/categories.routes.js +1 -1
  338. package/src/modules/rents/controllers/routes/rents.routes.js +1 -1
  339. package/src/modules/rents/views/components/pages/RentsEdit.vue +208 -49
  340. package/src/modules/spots/components/pages/Map.vue +2 -2
  341. package/src/styles/config.scss +6 -6
  342. package/dist/abac-DYoheWuc.js +0 -1031
  343. package/dist/core.abac-DUPBnlk6.js +0 -298
  344. package/dist/core.logger-C3q8A9dl.js +0 -51
  345. package/dist/martyrs/src/components/Button/Button.vue.js.map +0 -1
  346. package/dist/martyrs/src/components/Field/Field.vue2.js.map +0 -1
  347. package/dist/martyrs/src/components/Loader/Loader.vue2.js.map +0 -1
  348. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
  349. package/dist/martyrs/src/components/Select/Select.vue2.js.map +0 -1
  350. package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue.js.map +0 -1
  351. package/dist/martyrs/src/modules/auth/auth.router.js +0 -342
  352. package/dist/martyrs/src/modules/auth/auth.router.js.map +0 -1
  353. package/dist/node_modules/.pnpm/@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/definitions.js.map +0 -1
  354. package/dist/node_modules/.pnpm/@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/web.js.map +0 -1
  355. package/dist/node_modules/.pnpm/@capacitor_core@7.0.1/node_modules/@capacitor/core/dist/index.js.map +0 -1
  356. package/src/modules/auth/auth.router.js +0 -262
  357. package/src/modules/core/controllers/classes/abac/v2/abac-core-fixed.js +0 -313
  358. package/src/modules/core/controllers/classes/abac/v2/abac-express-fixed.js +0 -276
  359. package/src/modules/core/controllers/classes/abac/v2/abac-fields-fixed.js +0 -425
  360. package/src/modules/core/controllers/classes/abac/v2/abac-main-fixed.js +0 -295
  361. package/src/modules/core/controllers/classes/abac/v2/abac-policies-fixed.js +0 -316
  362. package/src/modules/core/controllers/classes/abac/v2/abac-ws-fixed.js +0 -237
  363. package/src/modules/core/controllers/classes/core.abac.js +0 -310
  364. package/src/modules/core/controllers/classes/core.crud.js +0 -89
  365. package/src/modules/governance/reactcode/eslint.config.js +0 -28
  366. /package/dist/node_modules/.pnpm/{@capacitor_keyboard@7.0.0_@capacitor_core@7.0.1 → @capacitor_keyboard@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/keyboard/dist/esm/definitions.js +0 -0
@@ -9,23 +9,70 @@ import ABACFields from './abac.fields.js';
9
9
  import ABACExpressAdapter from './abac.adapter.express.js';
10
10
  import ABACWebSocketAdapter from './abac.adapter.ws.js';
11
11
 
12
+ /**
13
+ * @typedef {Object} ABACOptions
14
+ * @property {boolean} [strictMode=false] - Строгий режим (undefined = deny)
15
+ * @property {boolean} [defaultDeny=false] - Запрет по умолчанию
16
+ * @property {string} [serviceKey] - Ключ для сервисных запросов
17
+ * @property {boolean} [enableAudit=true] - Включить аудит
18
+ * @property {boolean} [cacheEnabled=true] - Включить кэширование
19
+ * @property {number} [cacheTTL=300] - TTL кэша в секундах
20
+ * @property {number} [concurrencyLimit=10] - Лимит параллельных политик
21
+ * @property {Object} [logger] - Кастомный логгер
22
+ */
23
+
24
+ /**
25
+ * @typedef {Object} ABACContext
26
+ * @property {string|null} user - ID пользователя
27
+ * @property {string} action - Действие (read, create, update, delete, etc)
28
+ * @property {string} resource - Тип ресурса
29
+ * @property {Object} [currentResource] - Загруженный ресурс
30
+ * @property {string} [resourceId] - ID ресурса
31
+ * @property {Object} data - Данные запроса
32
+ * @property {Object} [data.body] - Body запроса (Express)
33
+ * @property {Object} [data.query] - Query параметры (Express)
34
+ * @property {Object} [data.params] - Route параметры (Express)
35
+ * @property {Object} [req] - Express request
36
+ * @property {Object} [socket] - WebSocket соединение
37
+ * @property {Object} [params] - Route параметры
38
+ * @property {boolean} [skipFieldPolicies=false] - Пропустить проверку полей
39
+ * @property {Object} [options] - Дополнительные опции
40
+ */
41
+
42
+ /**
43
+ * @typedef {Object} ABACResult
44
+ * @property {boolean} allow - Разрешен ли доступ
45
+ * @property {string} reason - Причина решения
46
+ * @property {Array} [policies] - Примененные политики
47
+ */
48
+
49
+ /**
50
+ * @typedef {Object} FieldsResult
51
+ * @property {Object} allowed - Разрешенные данные
52
+ * @property {Array} denied - Запрещенные поля
53
+ * @property {Array} errors - Ошибки валидации
54
+ * @property {Object} transformed - Трансформированные данные
55
+ */
56
+
12
57
  class GlobalABAC {
13
58
  constructor(db, options = {}) {
14
59
  this.db = db;
60
+
61
+ /** @type {ABACOptions} */
15
62
  this.options = {
16
63
  strictMode: false,
17
64
  defaultDeny: false,
18
65
  serviceKey: process.env.SERVICE_KEY,
19
66
  enableAudit: true,
20
67
  cacheEnabled: true,
21
- cacheTTL: 300, // 5 минут
68
+ cacheTTL: 300,
22
69
  concurrencyLimit: 10,
23
70
  ...options,
24
71
  };
25
72
 
26
73
  // Инициализация компонентов
27
74
  this.cache = new Cache({ ttlSeconds: this.options.cacheTTL });
28
- this.logger = options.auditLogger || new Logger(db);
75
+ this.logger = this.options.logger || new Logger(db);
29
76
 
30
77
  // Инициализация модулей
31
78
  this.core = new ABACCore(this);
@@ -35,53 +82,140 @@ class GlobalABAC {
35
82
  this.websocket = new ABACWebSocketAdapter(this);
36
83
  }
37
84
 
38
- // API методы для регистрации политик
85
+ /**
86
+ * Регистрация глобальной политики
87
+ * @param {string} name - Имя политики
88
+ * @param {Function} policyFn - Функция политики (context) => boolean|{allow, force, reason}
89
+ * @param {Object} [metadata] - Метаданные политики
90
+ * @param {string} [metadata.type='dynamic'] - Тип (static|dynamic)
91
+ * @param {number} [metadata.priority=0] - Приоритет
92
+ * @returns {GlobalABAC}
93
+ */
39
94
  registerGlobalPolicy(name, policyFn, metadata = {}) {
40
95
  return this.policies.registerGlobalPolicy(name, policyFn, metadata);
41
96
  }
42
97
 
98
+ /**
99
+ * Регистрация политики для ресурса
100
+ * @param {string} resourceName - Имя ресурса
101
+ * @param {Function} policyFn - Функция политики
102
+ * @param {Object} [options] - Опции
103
+ * @param {string} [options.modelName] - Имя модели в БД
104
+ * @returns {GlobalABAC}
105
+ */
43
106
  registerResourcePolicy(resourceName, policyFn, options = {}) {
44
107
  return this.policies.registerResourcePolicy(resourceName, policyFn, options);
45
108
  }
46
109
 
47
- registerFieldsPolicy(resourceName, builderFn) {
48
- return this.fields.registerFieldsPolicy(resourceName, builderFn);
110
+ /**
111
+ * Регистрация политики полей
112
+ * @param {string} resourceName - Имя ресурса
113
+ * @param {Object} config - Конфигурация полей
114
+ * @returns {GlobalABAC}
115
+ *
116
+ * @example
117
+ * abac.registerFieldsPolicy('user', {
118
+ * 'email': { access: 'deny', actions: ['update'] },
119
+ * 'password': { access: 'deny', actions: '*', rule: 'remove' },
120
+ * 'profile.*': {
121
+ * access: async (ctx) => ctx.user === ctx.currentResource?.id,
122
+ * transform: (value) => sanitize(value)
123
+ * }
124
+ * });
125
+ */
126
+ registerFieldsPolicy(resourceName, config) {
127
+ return this.fields.registerFieldsPolicy(resourceName, config);
49
128
  }
50
129
 
130
+ /**
131
+ * Регистрация расширения контекста
132
+ * @param {string} moduleName - Имя модуля
133
+ * @param {Function} extensionFn - Функция расширения (context) => void
134
+ * @returns {GlobalABAC}
135
+ */
51
136
  registerExtension(moduleName, extensionFn) {
52
137
  return this.policies.registerExtension(moduleName, extensionFn);
53
138
  }
54
139
 
55
- // Основные методы проверки
140
+ /**
141
+ * Проверка доступа
142
+ * @param {ABACContext|Object} context - Контекст проверки
143
+ * @param {Object} [customPolicies] - Дополнительные политики
144
+ * @returns {Promise<ABACResult>}
145
+ */
56
146
  async checkAccess(context, customPolicies = {}) {
57
147
  return this.core.checkAccess(context, customPolicies);
58
148
  }
59
149
 
60
- async checkFields(context, data, action = null, isQuery = false) {
61
- return this.fields.checkFields(context, data, action, isQuery);
150
+ /**
151
+ * Проверка доступа к полям
152
+ * @param {ABACContext|Object} context - Контекст
153
+ * @param {Object} data - Данные для проверки
154
+ * @param {string} [action] - Действие
155
+ * @returns {Promise<FieldsResult>}
156
+ */
157
+ async checkFields(context, data, action = null) {
158
+ return this.fields.checkFields(context, data, action);
62
159
  }
63
160
 
161
+ /**
162
+ * Проверка конкретных политик
163
+ * @param {ABACContext|Object} context - Контекст
164
+ * @param {string[]} policyNames - Имена политик
165
+ * @param {Object} [customPolicies] - Дополнительные политики
166
+ * @returns {Promise<ABACResult>}
167
+ */
64
168
  async checkPolicies(context, policyNames = [], customPolicies = {}) {
65
169
  return this.policies.checkPolicies(context, policyNames, customPolicies);
66
170
  }
67
171
 
68
- // Адаптеры
172
+ /**
173
+ * Express middleware для проверки доступа
174
+ * @param {string} resource - Ресурс
175
+ * @param {string} action - Действие
176
+ * @param {Object} [options] - Опции
177
+ * @returns {Function|Function[]} Middleware функция(и)
178
+ */
69
179
  middleware(resource, action, options = {}) {
70
180
  return this.express.middleware(resource, action, options);
71
181
  }
72
182
 
183
+ /**
184
+ * Express middleware для проверки политик
185
+ * @param {string[]} policyNames - Имена политик
186
+ * @param {Object} [customPolicies] - Дополнительные политики
187
+ * @param {Object} [options] - Опции
188
+ * @returns {Function} Middleware функция
189
+ */
73
190
  policyMiddleware(policyNames = [], customPolicies = {}, options = {}) {
74
191
  return this.express.policyMiddleware(policyNames, customPolicies, options);
75
192
  }
76
193
 
194
+ /**
195
+ * Express middleware для проверки полей
196
+ * @param {string} resource - Ресурс
197
+ * @param {Object} [options] - Опции
198
+ * @returns {Function} Middleware функция
199
+ */
77
200
  fieldsMiddleware(resource, options = {}) {
78
201
  return this.express.fieldsMiddleware(resource, options);
79
202
  }
80
203
 
204
+ /**
205
+ * WebSocket handler
206
+ * @param {string} moduleName - Имя модуля
207
+ * @param {Object} [options] - Опции
208
+ * @returns {Function} Handler функция
209
+ */
81
210
  wsHandler(moduleName, options = {}) {
82
211
  return this.websocket.handler(moduleName, options);
83
212
  }
84
213
 
214
+ /**
215
+ * Получение модели ресурса из БД
216
+ * @param {string} resourceName - Имя ресурса
217
+ * @returns {Object|null} Mongoose модель или null
218
+ */
85
219
  getResourceModel(resourceName) {
86
220
  const resourcePolicy = this.policies.resources.get(resourceName);
87
221
  if (!resourcePolicy) return null;
@@ -89,11 +223,61 @@ class GlobalABAC {
89
223
  const modelName = resourcePolicy.modelName || resourceName;
90
224
  return this.db[modelName] || null;
91
225
  }
226
+
227
+ /**
228
+ * Очистка кэша
229
+ * @param {Object} [options] - Опции очистки
230
+ * @param {string} [options.user] - Очистить для пользователя
231
+ * @param {string} [options.resource] - Очистить для ресурса
232
+ * @param {string} [options.policy] - Очистить для политики
233
+ */
234
+ async clearCache(options = {}) {
235
+ if (options.user) {
236
+ await this.cache.invalidateTag(`user_${options.user}`);
237
+ }
238
+ if (options.resource) {
239
+ await this.cache.invalidateTag(`resource_${options.resource}`);
240
+ }
241
+ if (options.policy) {
242
+ await this.cache.invalidateTag(`policy_${options.policy}`);
243
+ }
244
+ if (!options.user && !options.resource && !options.policy) {
245
+ await this.cache.clear();
246
+ }
247
+ }
248
+
249
+ /**
250
+ * Получение статистики
251
+ * @returns {Object} Статистика системы
252
+ */
253
+ getStats() {
254
+ return {
255
+ policies: {
256
+ global: this.policies.global.size,
257
+ resources: this.policies.resources.size,
258
+ extensions: this.policies.extensions.size
259
+ },
260
+ fields: {
261
+ configs: this.fields.configs.size
262
+ },
263
+ cache: {
264
+ size: this.cache.size,
265
+ hits: this.cache.hits,
266
+ misses: this.cache.misses
267
+ }
268
+ };
269
+ }
92
270
  }
93
271
 
94
272
  // Экспорт синглтона
95
273
  let instance = null;
96
274
 
275
+ /**
276
+ * Получение экземпляра ABAC
277
+ * @param {Object} db - База данных
278
+ * @param {ABACOptions} [options] - Опции
279
+ * @returns {GlobalABAC}
280
+ */
97
281
  export const getInstance = (db, options) => {
98
282
  if (!instance) {
99
283
  instance = new GlobalABAC(db, options);
@@ -101,4 +285,11 @@ export const getInstance = (db, options) => {
101
285
  return instance;
102
286
  };
103
287
 
104
- export default { getInstance };
288
+ /**
289
+ * Сброс экземпляра (для тестов)
290
+ */
291
+ export const resetInstance = () => {
292
+ instance = null;
293
+ };
294
+
295
+ export default { getInstance, resetInstance };
@@ -12,6 +12,9 @@ export default class ABACPolicies {
12
12
  };
13
13
  }
14
14
 
15
+ /**
16
+ * Регистрация глобальной политики
17
+ */
15
18
  registerGlobalPolicy(name, policyFn, metadata = {}) {
16
19
  if (typeof policyFn !== 'function') {
17
20
  throw new Error(`Global policy "${name}" must be a function`);
@@ -20,6 +23,7 @@ export default class ABACPolicies {
20
23
  const policy = {
21
24
  fn: policyFn,
22
25
  type: metadata.type || 'dynamic',
26
+ priority: metadata.priority || 0,
23
27
  ...metadata
24
28
  };
25
29
 
@@ -28,6 +32,9 @@ export default class ABACPolicies {
28
32
  return this.abac;
29
33
  }
30
34
 
35
+ /**
36
+ * Регистрация политики ресурса
37
+ */
31
38
  registerResourcePolicy(resourceName, policyFn, options = {}) {
32
39
  if (typeof policyFn !== 'function') {
33
40
  throw new Error(`Resource policy for "${resourceName}" must be a function`);
@@ -41,6 +48,9 @@ export default class ABACPolicies {
41
48
  return this.abac;
42
49
  }
43
50
 
51
+ /**
52
+ * Регистрация расширения
53
+ */
44
54
  registerExtension(moduleName, extensionFn) {
45
55
  if (typeof extensionFn !== 'function') {
46
56
  throw new Error(`Extension "${moduleName}" must be a function`);
@@ -51,97 +61,127 @@ export default class ABACPolicies {
51
61
  return this.abac;
52
62
  }
53
63
 
64
+ /**
65
+ * Обновление приоритетов с сортировкой
66
+ */
54
67
  updatePriorities() {
55
- // Группируем политики по типам
56
68
  this.priorities = {
57
69
  static: [],
58
70
  dynamic: [],
59
71
  extensions: []
60
72
  };
61
73
 
74
+ // Группируем и сортируем по приоритету
62
75
  for (const [name, policy] of this.global) {
63
76
  const type = policy.type || 'dynamic';
64
77
  this.priorities[type].push([name, policy]);
65
78
  }
66
79
 
80
+ // Сортировка по приоритету (выше = раньше)
81
+ this.priorities.static.sort((a, b) => (b[1].priority || 0) - (a[1].priority || 0));
82
+ this.priorities.dynamic.sort((a, b) => (b[1].priority || 0) - (a[1].priority || 0));
83
+
67
84
  // Добавляем расширения
68
85
  this.priorities.extensions = Array.from(this.extensions.entries());
69
86
  }
70
87
 
88
+ /**
89
+ * Основная логика оценки политик
90
+ */
71
91
  async evaluate(context, customPolicies = {}) {
72
92
  const core = this.abac.core;
73
93
 
74
- // Переменные для отслеживания результатов
75
- let hasForceAllow = false;
76
- let hasForceDisallow = false;
77
- let hasDeny = false;
78
- let denyReason = '';
79
- let allowReason = '';
94
+ // Структура для отслеживания результатов
95
+ const evaluation = {
96
+ hasForceAllow: false,
97
+ hasForceDisallow: false,
98
+ hasDeny: false,
99
+ denyReason: '',
100
+ allowReason: '',
101
+ appliedPolicies: []
102
+ };
80
103
 
81
104
  // Функция для обработки результата политики
82
- const processResult = (result) => {
105
+ const processResult = (name, result) => {
106
+ evaluation.appliedPolicies.push({ name, result });
107
+
83
108
  if (result.force) {
84
109
  if (result.allow) {
85
- hasForceAllow = true;
86
- allowReason = result.reason;
110
+ evaluation.hasForceAllow = true;
111
+ evaluation.allowReason = result.reason;
87
112
  } else {
88
- hasForceDisallow = true;
89
- denyReason = result.reason;
113
+ evaluation.hasForceDisallow = true;
114
+ evaluation.denyReason = result.reason;
90
115
  }
91
116
  } else if (!result.allow) {
92
- hasDeny = true;
93
- if (!denyReason) denyReason = result.reason;
117
+ evaluation.hasDeny = true;
118
+ if (!evaluation.denyReason) {
119
+ evaluation.denyReason = result.reason;
120
+ }
94
121
  }
95
122
  };
96
123
 
97
124
  // Функция для проверки force флагов
98
125
  const checkForceFlags = () => {
99
- if (hasForceDisallow) {
126
+ if (evaluation.hasForceDisallow) {
100
127
  return {
101
128
  allow: false,
102
- reason: denyReason || 'FORCE_DENIED_BY_POLICY',
129
+ reason: evaluation.denyReason || 'FORCE_DENIED_BY_POLICY',
130
+ policies: evaluation.appliedPolicies
103
131
  };
104
132
  }
105
133
 
106
- if (hasForceAllow) {
134
+ if (evaluation.hasForceAllow) {
107
135
  return {
108
136
  allow: true,
109
- reason: allowReason || 'FORCE_ALLOWED_BY_POLICY',
137
+ reason: evaluation.allowReason || 'FORCE_ALLOWED_BY_POLICY',
138
+ policies: evaluation.appliedPolicies
110
139
  };
111
140
  }
112
141
 
113
142
  return null;
114
143
  };
115
144
 
116
- // Выполняем политики по типам
117
- for (const type of ['static', 'dynamic']) {
118
- const policies = [...this.priorities[type]];
119
-
120
- // Добавляем кастомные политики к dynamic
121
- if (type === 'dynamic') {
122
- for (const [name, fn] of Object.entries(customPolicies)) {
123
- policies.push([name, { fn, type: 'dynamic' }]);
124
- }
145
+ // 1. Static политики early exit)
146
+ const staticResults = await core.executePoliciesLimited(
147
+ this.priorities.static,
148
+ context,
149
+ true // останавливаемся на deny
150
+ );
151
+
152
+ for (const { name, result, error } of staticResults) {
153
+ if (!error) {
154
+ processResult(name, result);
125
155
  }
156
+ }
157
+
158
+ let forceResult = checkForceFlags();
159
+ if (forceResult) return forceResult;
126
160
 
127
- const results = await core.executePoliciesLimited(
128
- policies,
129
- context,
130
- type === 'static' // Для static останавливаемся на deny
131
- );
161
+ // 2. Dynamic политики + custom
162
+ const dynamicPolicies = [...this.priorities.dynamic];
163
+
164
+ // Добавляем кастомные политики
165
+ for (const [name, fn] of Object.entries(customPolicies)) {
166
+ dynamicPolicies.push([name, { fn, type: 'dynamic' }]);
167
+ }
168
+
169
+ const dynamicResults = await core.executePoliciesLimited(
170
+ dynamicPolicies,
171
+ context,
172
+ false
173
+ );
132
174
 
133
- // Обрабатываем результаты
134
- for (const { result, error } of results) {
135
- if (error) continue;
136
- processResult(result);
175
+ for (const { name, result, error } of dynamicResults) {
176
+ if (!error) {
177
+ processResult(name, result);
137
178
  }
138
-
139
- // Проверяем force флаги после каждого этапа
140
- const forceResult = checkForceFlags();
141
- if (forceResult) return forceResult;
142
179
  }
180
+
181
+ forceResult = checkForceFlags();
182
+ if (forceResult) return forceResult;
143
183
 
144
- // Проверка политики ресурса
184
+ // 3. Resource-specific политика
145
185
  const resourcePolicy = this.resources.get(context.resource);
146
186
 
147
187
  if (resourcePolicy) {
@@ -151,31 +191,36 @@ export default class ABACPolicies {
151
191
  );
152
192
 
153
193
  if (!results[0].error) {
154
- processResult(results[0].result);
194
+ processResult(`RESOURCE_${context.resource}`, results[0].result);
155
195
  }
156
196
 
157
- // Проверяем результат ресурсной политики
158
- const forceResult = checkForceFlags();
197
+ forceResult = checkForceFlags();
159
198
  if (forceResult) return forceResult;
160
199
  }
161
200
 
162
- // Проверяем накопленный deny перед расширениями
163
- if (hasDeny) {
201
+ // Проверяем накопленный deny
202
+ if (evaluation.hasDeny) {
164
203
  return {
165
204
  allow: false,
166
- reason: denyReason || 'DENIED_BY_POLICY',
205
+ reason: evaluation.denyReason || 'DENIED_BY_POLICY',
206
+ policies: evaluation.appliedPolicies
167
207
  };
168
208
  }
169
209
 
170
- // Выполнение расширений
210
+ // 4. Extensions (последний шанс разрешить)
171
211
  const extensionResults = await core.executePoliciesLimited(
172
212
  this.priorities.extensions,
173
213
  context
174
214
  );
175
215
 
176
- for (const { result } of extensionResults) {
216
+ for (const { name, result } of extensionResults) {
217
+ processResult(name, result);
177
218
  if (result.allow) {
178
- return { allow: true, reason: result.reason };
219
+ return {
220
+ allow: true,
221
+ reason: result.reason,
222
+ policies: evaluation.appliedPolicies
223
+ };
179
224
  }
180
225
  }
181
226
 
@@ -184,10 +229,13 @@ export default class ABACPolicies {
184
229
  return {
185
230
  allow: defaultAllow,
186
231
  reason: defaultAllow ? 'DEFAULT_ALLOW' : 'DEFAULT_DENY',
232
+ policies: evaluation.appliedPolicies
187
233
  };
188
234
  }
189
235
 
190
- // Проверка конкретных политик
236
+ /**
237
+ * Проверка конкретных политик
238
+ */
191
239
  async checkPolicies(rawContext, policyNames = [], customPolicies = {}) {
192
240
  const context = this.abac.core.normalizeContext(rawContext);
193
241
  const policies = this.getPoliciesByNames(policyNames, customPolicies);
@@ -198,17 +246,54 @@ export default class ABACPolicies {
198
246
  this.abac.options.strictMode
199
247
  );
200
248
 
201
- // Анализируем результаты
202
- for (const { result } of results) {
203
- if (result.force) return { allow: result.allow, reason: result.reason };
204
- if (!result.allow && this.abac.options.strictMode) {
205
- return { allow: false, reason: result.reason };
249
+ // Структурированный анализ результатов
250
+ const evaluation = {
251
+ passed: [],
252
+ failed: [],
253
+ errors: []
254
+ };
255
+
256
+ for (const { name, result, error } of results) {
257
+ if (error) {
258
+ evaluation.errors.push({ name, error: error.message });
259
+ continue;
260
+ }
261
+
262
+ if (result.force) {
263
+ return {
264
+ allow: result.allow,
265
+ reason: result.reason,
266
+ evaluation
267
+ };
268
+ }
269
+
270
+ if (result.allow) {
271
+ evaluation.passed.push(name);
272
+ } else {
273
+ evaluation.failed.push({ name, reason: result.reason });
274
+
275
+ if (this.abac.options.strictMode) {
276
+ return {
277
+ allow: false,
278
+ reason: result.reason,
279
+ evaluation
280
+ };
281
+ }
206
282
  }
207
283
  }
208
284
 
209
- return { allow: true, reason: 'POLICIES_PASSED' };
285
+ const allPassed = evaluation.failed.length === 0 && evaluation.errors.length === 0;
286
+
287
+ return {
288
+ allow: allPassed,
289
+ reason: allPassed ? 'POLICIES_PASSED' : `FAILED: ${evaluation.failed[0]?.name}`,
290
+ evaluation
291
+ };
210
292
  }
211
293
 
294
+ /**
295
+ * Получение политик по именам
296
+ */
212
297
  getPoliciesByNames(names, customPolicies = {}) {
213
298
  const policies = {};
214
299
 
@@ -217,9 +302,14 @@ export default class ABACPolicies {
217
302
  policies[name] = this.global.get(name);
218
303
  } else if (this.extensions.has(name)) {
219
304
  policies[name] = { fn: this.extensions.get(name), type: 'extension' };
305
+ } else if (this.resources.has(name)) {
306
+ policies[name] = this.resources.get(name);
307
+ } else {
308
+ this.abac.logger?.warn('Policy not found', { name });
220
309
  }
221
310
  }
222
311
 
312
+ // Добавляем кастомные
223
313
  Object.assign(policies, customPolicies);
224
314
  return policies;
225
315
  }
@@ -83,9 +83,9 @@ export default class CRUDPolicies {
83
83
  action,
84
84
  req,
85
85
  data: {
86
- ...req.body,
87
- ...req.query,
88
- params: req.params,
86
+ body: req.body || {},
87
+ query: req.query || {},
88
+ params: req.params || {}
89
89
  },
90
90
  params: req.params
91
91
  };
@@ -152,8 +152,8 @@ export default class CRUDPolicies {
152
152
  action: 'read',
153
153
  req,
154
154
  data: {
155
- ...req.query,
156
- params: req.params,
155
+ query: req.query || {},
156
+ params: req.params || {}
157
157
  },
158
158
  params: req.params
159
159
  };
@@ -44,9 +44,12 @@ export default (function initializeDefaultPolicies(abacAccessControl) {
44
44
  let { user, action, data, currentResource, options } = context;
45
45
  const ObjectId = abacAccessControl.db.mongoose.Types.ObjectId;
46
46
  // Для create операций с владением пользователя
47
- if (action === 'create' && data.owner?.type === 'user') {
47
+ if (action === 'create' && data.body?.owner?.type === 'user') {
48
+ const ownerTarget = data.body.owner.target;
49
+ const creatorTarget = data.body.creator?.target;
50
+
48
51
  // Проверяем, что пользователь создает ресурс от своего имени
49
- if (data.owner.target === user && data.creator.target === user) {
52
+ if (ownerTarget === user && creatorTarget === user) {
50
53
  return { allow: true, force: false };
51
54
  } else {
52
55
  return {