@rynt/sdk 0.9.53

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 (332) hide show
  1. package/README.md +122 -0
  2. package/REGISTRIES.md +189 -0
  3. package/env.d.ts +11 -0
  4. package/host-shims.d.ts +30 -0
  5. package/package.json +88 -0
  6. package/src/extension-marketplace/api-types.ts +141 -0
  7. package/src/extension-marketplace/client.ts +296 -0
  8. package/src/extension-marketplace/index.ts +22 -0
  9. package/src/extension-marketplace/schemas.ts +178 -0
  10. package/src/extensions/ExtensionRoutePage.vue +17 -0
  11. package/src/extensions/context.ts +37 -0
  12. package/src/extensions/disabled-folder.ts +21 -0
  13. package/src/extensions/extension-expose-map.ts +5 -0
  14. package/src/extensions/extension-expose.ts +48 -0
  15. package/src/extensions/graph.ts +67 -0
  16. package/src/extensions/index.ts +251 -0
  17. package/src/extensions/invite-handler/types.ts +20 -0
  18. package/src/extensions/launcher-entities/create-launcher-entity.ts +25 -0
  19. package/src/extensions/launcher-entities/keys.ts +46 -0
  20. package/src/extensions/launcher-entities/launcher-entity-components.ts +177 -0
  21. package/src/extensions/launcher-entities/props-map.ts +69 -0
  22. package/src/extensions/launcher-entities/registry.ts +32 -0
  23. package/src/extensions/launcher-models/apis/accounts-contracts.ts +102 -0
  24. package/src/extensions/launcher-models/apis/launcher-model-apis.ts +553 -0
  25. package/src/extensions/launcher-models/keys.ts +23 -0
  26. package/src/extensions/launcher-models/public.ts +9 -0
  27. package/src/extensions/launcher-models/registry-core.ts +34 -0
  28. package/src/extensions/manifest-types.ts +22 -0
  29. package/src/extensions/manifest.ts +46 -0
  30. package/src/extensions/marketplace-open-key.ts +26 -0
  31. package/src/extensions/plugin-types.ts +44 -0
  32. package/src/extensions/plugin.ts +62 -0
  33. package/src/extensions/registries/bootstrap.ts +11 -0
  34. package/src/extensions/registries/builtins/account-provider.ts +6 -0
  35. package/src/extensions/registries/builtins/app-topbar-left-widgets.ts +6 -0
  36. package/src/extensions/registries/builtins/app-topbar-right-widgets.ts +6 -0
  37. package/src/extensions/registries/builtins/app-topbar-status-widgets.ts +6 -0
  38. package/src/extensions/registries/builtins/build-card-actions.ts +6 -0
  39. package/src/extensions/registries/builtins/build-card-after-meta.ts +6 -0
  40. package/src/extensions/registries/builtins/build-card-before-media.ts +6 -0
  41. package/src/extensions/registries/builtins/build-card-before-meta.ts +6 -0
  42. package/src/extensions/registries/builtins/build-card-footer-actions.ts +6 -0
  43. package/src/extensions/registries/builtins/build-detail-after-content.ts +6 -0
  44. package/src/extensions/registries/builtins/build-detail-before-content.ts +6 -0
  45. package/src/extensions/registries/builtins/build-detail-before-hero.ts +6 -0
  46. package/src/extensions/registries/builtins/build-detail-header-actions.ts +6 -0
  47. package/src/extensions/registries/builtins/build-detail-mod-row-actions.ts +6 -0
  48. package/src/extensions/registries/builtins/build-detail-resourcepack-row-actions.ts +6 -0
  49. package/src/extensions/registries/builtins/build-detail-right-column-bottom.ts +6 -0
  50. package/src/extensions/registries/builtins/build-detail-right-column-top.ts +6 -0
  51. package/src/extensions/registries/builtins/dialog-footer-actions.ts +6 -0
  52. package/src/extensions/registries/builtins/feed-after-content.ts +6 -0
  53. package/src/extensions/registries/builtins/feed-before-content.ts +6 -0
  54. package/src/extensions/registries/builtins/file-editor.ts +19 -0
  55. package/src/extensions/registries/builtins/friends-after-list.ts +6 -0
  56. package/src/extensions/registries/builtins/friends-before-list.ts +6 -0
  57. package/src/extensions/registries/builtins/index.ts +141 -0
  58. package/src/extensions/registries/builtins/invite-handler.ts +7 -0
  59. package/src/extensions/registries/builtins/library-after-content.ts +6 -0
  60. package/src/extensions/registries/builtins/library-before-content.ts +6 -0
  61. package/src/extensions/registries/builtins/loader.ts +8 -0
  62. package/src/extensions/registries/builtins/map-card-actions.ts +6 -0
  63. package/src/extensions/registries/builtins/map-card-after-meta.ts +6 -0
  64. package/src/extensions/registries/builtins/map-card-before-meta.ts +6 -0
  65. package/src/extensions/registries/builtins/map-card-footer-actions.ts +6 -0
  66. package/src/extensions/registries/builtins/map-detail-after-content.ts +6 -0
  67. package/src/extensions/registries/builtins/map-detail-before-content.ts +6 -0
  68. package/src/extensions/registries/builtins/map-detail-header-actions.ts +6 -0
  69. package/src/extensions/registries/builtins/markdown-editor-tiptap-extensions.ts +7 -0
  70. package/src/extensions/registries/builtins/markdown-editor-toolbar-actions.ts +6 -0
  71. package/src/extensions/registries/builtins/markdown-renderer-after-content.ts +6 -0
  72. package/src/extensions/registries/builtins/markdown-renderer-before-content.ts +6 -0
  73. package/src/extensions/registries/builtins/mod-details-footer-actions.ts +6 -0
  74. package/src/extensions/registries/builtins/mod-manage-actions.ts +6 -0
  75. package/src/extensions/registries/builtins/mod-provider.ts +5 -0
  76. package/src/extensions/registries/builtins/nav.ts +7 -0
  77. package/src/extensions/registries/builtins/page.ts +13 -0
  78. package/src/extensions/registries/builtins/projects-after-content.ts +6 -0
  79. package/src/extensions/registries/builtins/projects-before-content.ts +6 -0
  80. package/src/extensions/registries/builtins/resourcepack-manage-actions.ts +7 -0
  81. package/src/extensions/registries/builtins/server-card-actions.ts +6 -0
  82. package/src/extensions/registries/builtins/server-card-after-meta.ts +6 -0
  83. package/src/extensions/registries/builtins/server-card-before-meta.ts +6 -0
  84. package/src/extensions/registries/builtins/server-card-footer-actions.ts +6 -0
  85. package/src/extensions/registries/builtins/server-detail-after-content.ts +6 -0
  86. package/src/extensions/registries/builtins/server-detail-before-content.ts +6 -0
  87. package/src/extensions/registries/builtins/server-detail-header-actions.ts +6 -0
  88. package/src/extensions/registries/builtins/settings-after-sections.ts +6 -0
  89. package/src/extensions/registries/builtins/settings-before-sections.ts +6 -0
  90. package/src/extensions/registries/builtins/settings-section-widgets.ts +6 -0
  91. package/src/extensions/registries/builtins/shaderpack-manage-actions.ts +7 -0
  92. package/src/extensions/registries/builtins/shell.ts +5 -0
  93. package/src/extensions/registries/builtins/sidebar-after-content.ts +6 -0
  94. package/src/extensions/registries/builtins/sidebar-before-content.ts +6 -0
  95. package/src/extensions/registries/builtins/sidebar-footer-widgets.ts +6 -0
  96. package/src/extensions/registries/builtins/sidebar-header-widgets.ts +6 -0
  97. package/src/extensions/registries/builtins/sidebar.ts +11 -0
  98. package/src/extensions/registries/builtins/theme.ts +5 -0
  99. package/src/extensions/registries/builtins/user-card-after-meta.ts +6 -0
  100. package/src/extensions/registries/builtins/user-card-before-meta.ts +6 -0
  101. package/src/extensions/registries/builtins/user-menu-actions.ts +6 -0
  102. package/src/extensions/registries/builtins/user-menu-after-actions.ts +6 -0
  103. package/src/extensions/registries/builtins/user-menu-before-actions.ts +6 -0
  104. package/src/extensions/registries/builtins/user-strip.ts +5 -0
  105. package/src/extensions/registries/clear-extension-ui-registries.ts +15 -0
  106. package/src/extensions/registries/define-extension-registry.ts +58 -0
  107. package/src/extensions/registries/extension-host-api.ts +41 -0
  108. package/src/extensions/registries/extension-registry-api.ts +103 -0
  109. package/src/extensions/registries/extension-registry-payload-map.ts +9 -0
  110. package/src/extensions/registries/extension-scope.ts +41 -0
  111. package/src/extensions/registries/get-registry.ts +23 -0
  112. package/src/extensions/registries/index.ts +58 -0
  113. package/src/extensions/registries/manifest-rynt.ts +193 -0
  114. package/src/extensions/registries/registry-slot.ts +40 -0
  115. package/src/extensions/registries/registry-value-map.ts +89 -0
  116. package/src/extensions/registries/store.ts +206 -0
  117. package/src/extensions/resolve-extensions.ts +245 -0
  118. package/src/extensions/router-bridge.ts +103 -0
  119. package/src/extensions/session.ts +6 -0
  120. package/src/extensions/slug.ts +23 -0
  121. package/src/extensions/version.ts +147 -0
  122. package/src/host/extensions-composables.ts +33 -0
  123. package/src/host/extensions-init.ts +194 -0
  124. package/src/host/index.ts +11 -0
  125. package/src/host/launcher-models/index.ts +4 -0
  126. package/src/index.ts +229 -0
  127. package/src/minecraft-loader/base-loader.ts +102 -0
  128. package/src/minecraft-loader/index.ts +11 -0
  129. package/src/minecraft-loader/loader-registry.ts +72 -0
  130. package/src/shared/api/assets.ts +112 -0
  131. package/src/shared/api/auth.ts +283 -0
  132. package/src/shared/api/builds.ts +647 -0
  133. package/src/shared/api/config.ts +19 -0
  134. package/src/shared/api/download-stats.ts +103 -0
  135. package/src/shared/api/downloads.ts +36 -0
  136. package/src/shared/api/entity-authorship.ts +60 -0
  137. package/src/shared/api/events.ts +393 -0
  138. package/src/shared/api/friends.ts +140 -0
  139. package/src/shared/api/graphql.ts +87 -0
  140. package/src/shared/api/index.ts +23 -0
  141. package/src/shared/api/invites.ts +262 -0
  142. package/src/shared/api/library.ts +44 -0
  143. package/src/shared/api/maps.ts +385 -0
  144. package/src/shared/api/notify-websocket.ts +140 -0
  145. package/src/shared/api/posts.ts +357 -0
  146. package/src/shared/api/projectServers.ts +379 -0
  147. package/src/shared/api/serverMembers.ts +173 -0
  148. package/src/shared/api/users.ts +294 -0
  149. package/src/shared/composables/buildEditor/useBuildEditor.ts +66 -0
  150. package/src/shared/composables/buildManifest/buildManifest.ts +447 -0
  151. package/src/shared/composables/filesEditor/filesEditor.ts +346 -0
  152. package/src/shared/composables/index.ts +10 -0
  153. package/src/shared/composables/modsEditor/modsEditor.ts +1678 -0
  154. package/src/shared/composables/registrySlot/registry-slot-utils.ts +25 -0
  155. package/src/shared/composables/registrySlot/useRegistrySlotMissing.ts +35 -0
  156. package/src/shared/composables/resourcePacksEditor/resourcePacksEditor.ts +448 -0
  157. package/src/shared/composables/shaderPacksEditor/shaderPacksEditor.ts +395 -0
  158. package/src/shared/composables/useSkinRender.ts +70 -0
  159. package/src/shared/composables/useZlDeepLink.ts +178 -0
  160. package/src/shared/definitions/defineGraphCache.ts +216 -0
  161. package/src/shared/definitions/defineStore.ts +32 -0
  162. package/src/shared/definitions/index.ts +2 -0
  163. package/src/shared/minecraft-types/build-manifest.ts +611 -0
  164. package/src/shared/minecraft-types/index.ts +3 -0
  165. package/src/shared/minecraft-types/launcher-versions.ts +32 -0
  166. package/src/shared/minecraft-types/minecraft-launcher-types.ts +276 -0
  167. package/src/shared/mocks/index.ts +1 -0
  168. package/src/shared/mocks/navigation.ts +17 -0
  169. package/src/shared/mods/http.ts +45 -0
  170. package/src/shared/mods/index.ts +5 -0
  171. package/src/shared/mods/marketplace-editor-search.ts +266 -0
  172. package/src/shared/mods/marketplace-search-utils.ts +42 -0
  173. package/src/shared/mods/mod-marketplace-registry.ts +66 -0
  174. package/src/shared/mods/mod-marketplace-types.ts +28 -0
  175. package/src/shared/mods/providers/curseforge.ts +464 -0
  176. package/src/shared/mods/providers/index.ts +8 -0
  177. package/src/shared/mods/providers/modrinth.ts +402 -0
  178. package/src/shared/mods/resolve-mods-provider-loader-ids.ts +77 -0
  179. package/src/shared/mods/types.ts +76 -0
  180. package/src/shared/styles/index.css +713 -0
  181. package/src/shared/themes/index.ts +23 -0
  182. package/src/shared/themes/theme-tokens-black.json +126 -0
  183. package/src/shared/themes/theme-tokens-classic.json +126 -0
  184. package/src/shared/themes/theme-tokens-pink.json +126 -0
  185. package/src/shared/themes/theme-tokens.json +126 -0
  186. package/src/shared/themes/types.ts +85 -0
  187. package/src/shared/types/API_DOCUMENTATION.md +422 -0
  188. package/src/shared/types/account.ts +40 -0
  189. package/src/shared/types/build.ts +8 -0
  190. package/src/shared/types/entities.ts +181 -0
  191. package/src/shared/types/index.ts +6 -0
  192. package/src/shared/types/invite-payloads.ts +60 -0
  193. package/src/shared/types/navigation.ts +16 -0
  194. package/src/shared/types/running-build.ts +51 -0
  195. package/src/shared/types/serverMember.ts +17 -0
  196. package/src/shared/types/user.ts +55 -0
  197. package/src/shared/ui/base/Avatar.vue +262 -0
  198. package/src/shared/ui/base/Badge.vue +47 -0
  199. package/src/shared/ui/base/Button.vue +78 -0
  200. package/src/shared/ui/base/Divider.vue +42 -0
  201. package/src/shared/ui/base/Icon.vue +597 -0
  202. package/src/shared/ui/base/StatusIndicator.vue +44 -0
  203. package/src/shared/ui/base/index.ts +7 -0
  204. package/src/shared/ui/cards/InviteCard.vue +47 -0
  205. package/src/shared/ui/cards/index.ts +2 -0
  206. package/src/shared/ui/dialog/Dialog.vue +71 -0
  207. package/src/shared/ui/dialog/DialogContent.vue +31 -0
  208. package/src/shared/ui/dialog/DialogFooter.vue +14 -0
  209. package/src/shared/ui/dialog/DialogHeader.vue +41 -0
  210. package/src/shared/ui/dialog/index.ts +5 -0
  211. package/src/shared/ui/editors/AttachmentImagesEditor.vue +133 -0
  212. package/src/shared/ui/editors/ContentAttachmentsDisplay.vue +76 -0
  213. package/src/shared/ui/editors/MarkdownEditor.vue +956 -0
  214. package/src/shared/ui/editors/MarkdownRenderer.vue +299 -0
  215. package/src/shared/ui/editors/RichContentImageViewer.vue +85 -0
  216. package/src/shared/ui/editors/SocialPostMediaZone.vue +320 -0
  217. package/src/shared/ui/editors/index.ts +6 -0
  218. package/src/shared/ui/editors/markdown-editor-gallery.ts +234 -0
  219. package/src/shared/ui/editors/markdown-editor-image.ts +178 -0
  220. package/src/shared/ui/form/Checkbox.vue +38 -0
  221. package/src/shared/ui/form/FormField.vue +30 -0
  222. package/src/shared/ui/form/FormGrid.vue +38 -0
  223. package/src/shared/ui/form/ImageEditor.vue +598 -0
  224. package/src/shared/ui/form/Input.vue +72 -0
  225. package/src/shared/ui/form/Range.vue +65 -0
  226. package/src/shared/ui/form/Select.vue +76 -0
  227. package/src/shared/ui/form/Switch.vue +38 -0
  228. package/src/shared/ui/form/Textarea.vue +144 -0
  229. package/src/shared/ui/form/index.ts +9 -0
  230. package/src/shared/ui/index.ts +9 -0
  231. package/src/shared/ui/layout/BusyOverlay.vue +31 -0
  232. package/src/shared/ui/layout/Callout.vue +44 -0
  233. package/src/shared/ui/layout/Card.vue +38 -0
  234. package/src/shared/ui/layout/Container.vue +36 -0
  235. package/src/shared/ui/layout/EmptyState.vue +99 -0
  236. package/src/shared/ui/layout/EntityMediaRow.vue +54 -0
  237. package/src/shared/ui/layout/FilterResultsLayout.vue +22 -0
  238. package/src/shared/ui/layout/FloatingPanel.vue +37 -0
  239. package/src/shared/ui/layout/FullscreenDimmer.vue +11 -0
  240. package/src/shared/ui/layout/Grid.vue +40 -0
  241. package/src/shared/ui/layout/Inline.vue +59 -0
  242. package/src/shared/ui/layout/LoadingState.vue +39 -0
  243. package/src/shared/ui/layout/MediaBox.vue +47 -0
  244. package/src/shared/ui/layout/OverlayPanel.vue +28 -0
  245. package/src/shared/ui/layout/OverlayWaitPanel.vue +22 -0
  246. package/src/shared/ui/layout/PageSection.vue +43 -0
  247. package/src/shared/ui/layout/PageToolbar.vue +29 -0
  248. package/src/shared/ui/layout/Panel.vue +39 -0
  249. package/src/shared/ui/layout/ProgressBar.vue +49 -0
  250. package/src/shared/ui/layout/Section.vue +30 -0
  251. package/src/shared/ui/layout/SegmentedControl.vue +43 -0
  252. package/src/shared/ui/layout/SelectableCard.vue +46 -0
  253. package/src/shared/ui/layout/SelectableRow.vue +41 -0
  254. package/src/shared/ui/layout/Skeleton.vue +25 -0
  255. package/src/shared/ui/layout/SkeletonAvatar.vue +30 -0
  256. package/src/shared/ui/layout/SkeletonEntityCard.vue +20 -0
  257. package/src/shared/ui/layout/SkeletonFeedPost.vue +22 -0
  258. package/src/shared/ui/layout/SkeletonGrid.vue +18 -0
  259. package/src/shared/ui/layout/SkeletonListRow.vue +31 -0
  260. package/src/shared/ui/layout/SkeletonText.vue +25 -0
  261. package/src/shared/ui/layout/Stack.vue +42 -0
  262. package/src/shared/ui/layout/StateBlock.vue +44 -0
  263. package/src/shared/ui/layout/TwoPaneLayout.vue +35 -0
  264. package/src/shared/ui/layout/VirtualList.vue +160 -0
  265. package/src/shared/ui/layout/index.ts +35 -0
  266. package/src/shared/ui/layout/skeletonSurfaceStyles.ts +24 -0
  267. package/src/shared/ui/navigation/NavItem.vue +139 -0
  268. package/src/shared/ui/navigation/Tab.vue +61 -0
  269. package/src/shared/ui/navigation/Tabs.vue +37 -0
  270. package/src/shared/ui/navigation/index.ts +4 -0
  271. package/src/shared/ui/primitives/Action.vue +19 -0
  272. package/src/shared/ui/primitives/Block.vue +28 -0
  273. package/src/shared/ui/primitives/CanvasView.vue +19 -0
  274. package/src/shared/ui/primitives/Control.vue +24 -0
  275. package/src/shared/ui/primitives/ControlSelect.vue +19 -0
  276. package/src/shared/ui/primitives/ControlTextarea.vue +17 -0
  277. package/src/shared/ui/primitives/FieldLabel.vue +19 -0
  278. package/src/shared/ui/primitives/Form.vue +19 -0
  279. package/src/shared/ui/primitives/Heading.vue +29 -0
  280. package/src/shared/ui/primitives/Image.vue +17 -0
  281. package/src/shared/ui/primitives/LineBreak.vue +3 -0
  282. package/src/shared/ui/primitives/Link.vue +19 -0
  283. package/src/shared/ui/primitives/List.vue +28 -0
  284. package/src/shared/ui/primitives/ListItem.vue +19 -0
  285. package/src/shared/ui/primitives/OptionItem.vue +19 -0
  286. package/src/shared/ui/primitives/Text.vue +28 -0
  287. package/src/shared/ui/primitives/VideoView.vue +19 -0
  288. package/src/shared/ui/primitives/index.ts +19 -0
  289. package/src/shared/ui/primitives/resolveElement.ts +25 -0
  290. package/src/shared/ui/special/AngularAccent.vue +106 -0
  291. package/src/shared/ui/special/ExtensionRegistrySlotButton.vue +143 -0
  292. package/src/shared/ui/special/InfoRow.vue +39 -0
  293. package/src/shared/ui/special/LogViewer.vue +53 -0
  294. package/src/shared/ui/special/PageHeader.vue +23 -0
  295. package/src/shared/ui/special/RegistrySlotMissingCallout.vue +48 -0
  296. package/src/shared/ui/special/WelcomeCard.vue +32 -0
  297. package/src/shared/ui/special/index.ts +9 -0
  298. package/src/shared/utils/app-paths.ts +50 -0
  299. package/src/shared/utils/attachments.ts +16 -0
  300. package/src/shared/utils/autostart.ts +213 -0
  301. package/src/shared/utils/build-files.ts +439 -0
  302. package/src/shared/utils/build-manifest-init.ts +176 -0
  303. package/src/shared/utils/cloudinary.ts +67 -0
  304. package/src/shared/utils/cn.ts +7 -0
  305. package/src/shared/utils/download-stats-week.ts +165 -0
  306. package/src/shared/utils/entity-api-to-cache.ts +84 -0
  307. package/src/shared/utils/entity-build-from-api.ts +1 -0
  308. package/src/shared/utils/entity-display.ts +27 -0
  309. package/src/shared/utils/entity-map-from-api.ts +1 -0
  310. package/src/shared/utils/file-hash.ts +65 -0
  311. package/src/shared/utils/formatSize.ts +5 -0
  312. package/src/shared/utils/formatTime.ts +157 -0
  313. package/src/shared/utils/getAccountSkinRender.ts +32 -0
  314. package/src/shared/utils/index.ts +34 -0
  315. package/src/shared/utils/local-mods.ts +678 -0
  316. package/src/shared/utils/local-settings.ts +217 -0
  317. package/src/shared/utils/member-join-stats.ts +35 -0
  318. package/src/shared/utils/platform.ts +86 -0
  319. package/src/shared/utils/play-host-slug.ts +92 -0
  320. package/src/shared/utils/rich-content.ts +294 -0
  321. package/src/shared/utils/safeRequest.ts +23 -0
  322. package/src/shared/utils/semver.ts +81 -0
  323. package/src/shared/utils/serverPermissions.ts +155 -0
  324. package/src/shared/utils/skin-render-cache.ts +372 -0
  325. package/src/shared/utils/stripMarkdown.ts +45 -0
  326. package/src/shared/utils/transliterate.ts +74 -0
  327. package/src/shared/utils/updateAccountSkinRender.ts +64 -0
  328. package/src/shared/utils/updater.ts +218 -0
  329. package/src/shared/utils/uploadImage.ts +195 -0
  330. package/src/shared/utils/user-status.ts +9 -0
  331. package/src/tiptap/index.ts +7 -0
  332. package/tsconfig.json +13 -0
@@ -0,0 +1,25 @@
1
+ import { CORE_LOADER_REGISTRY_ID } from '../../../extensions/registries/builtins/loader';
2
+ import { resolveRegistrySlot } from '../../../extensions/registries/registry-slot';
3
+
4
+ export { CORE_LOADER_REGISTRY_ID };
5
+
6
+ /** Есть ли запись `(registryId, key)` в local store. */
7
+ export function isRegistrySlotMissing(
8
+ registryId: string,
9
+ key: string | undefined | null,
10
+ ): boolean {
11
+ if (!key?.trim()) {
12
+ return false;
13
+ }
14
+ return resolveRegistrySlot(registryId, key).status === 'missing';
15
+ }
16
+
17
+ /** Загрузчик из манифеста не зарегистрирован (`vanilla` всегда доступен). */
18
+ export function isCoreLoaderSlotMissing(
19
+ loaderId: string | undefined | null,
20
+ ): boolean {
21
+ if (!loaderId || loaderId === 'vanilla') {
22
+ return false;
23
+ }
24
+ return isRegistrySlotMissing(CORE_LOADER_REGISTRY_ID, loaderId);
25
+ }
@@ -0,0 +1,35 @@
1
+ import { computed, type MaybeRefOrGetter, toValue } from 'vue';
2
+
3
+ import { extensionRegistriesRevision } from '../../../extensions/registries/store';
4
+ import {
5
+ CORE_LOADER_REGISTRY_ID,
6
+ isCoreLoaderSlotMissing,
7
+ isRegistrySlotMissing,
8
+ } from './registry-slot-utils';
9
+
10
+ export function useRegistrySlotMissing(
11
+ registryId: MaybeRefOrGetter<string>,
12
+ registryKey: MaybeRefOrGetter<string | undefined | null>,
13
+ ) {
14
+ const isMissing = computed(() => {
15
+ void extensionRegistriesRevision.value;
16
+ return isRegistrySlotMissing(toValue(registryId), toValue(registryKey));
17
+ });
18
+
19
+ return { isMissing, registryId: computed(() => toValue(registryId)) };
20
+ }
21
+
22
+ export function useCoreLoaderSlotMissing(
23
+ loaderId: MaybeRefOrGetter<string | undefined | null>,
24
+ ) {
25
+ const isMissing = computed(() => {
26
+ void extensionRegistriesRevision.value;
27
+ return isCoreLoaderSlotMissing(toValue(loaderId));
28
+ });
29
+
30
+ return {
31
+ isMissing,
32
+ registryId: CORE_LOADER_REGISTRY_ID,
33
+ loaderKey: computed(() => toValue(loaderId) ?? ''),
34
+ };
35
+ }
@@ -0,0 +1,448 @@
1
+ import { defineStore } from '../../definitions/defineStore';
2
+ import { computed, ref, watch, type Ref } from 'vue';
3
+ import { debounce } from 'lodash-es';
4
+ import type { BuildVersionManifest, ResourcePack } from '../../minecraft-types/build-manifest';
5
+ import { useLocalBuildsModel } from '@/models';
6
+ import type { MarketplaceItem } from '../../mods/types';
7
+ import type { ProjectDetails } from '../../mods/types';
8
+ import {
9
+ createMarketplaceEditorSearch,
10
+ createMarketplaceEditorSearchState,
11
+ } from '../../mods/marketplace-editor-search';
12
+ import {
13
+ getModMarketplaceProvider,
14
+ listModMarketplaceProviders,
15
+ } from '../../mods/mod-marketplace-registry';
16
+ import {
17
+ scanLocalResourcePacks,
18
+ toggleResourcePackDisabled,
19
+ deleteLocalResourcePack,
20
+ } from '../../utils/local-mods';
21
+
22
+ /** Вкладки: `all` + id зарегистрированных провайдеров. */
23
+ export type ResourcePacksEditorMarketplaceTab = string;
24
+
25
+ export const useResourcePacksEditorModel = defineStore(
26
+ (_manifestRef: Ref<BuildVersionManifest | null>) => {
27
+ // Manifest ref - получаем напрямую при создании store
28
+ const manifest = _manifestRef;
29
+
30
+ const searchQuery = ref('');
31
+ const marketplaceTab = ref<ResourcePacksEditorMarketplaceTab>('all');
32
+
33
+ const marketplaceSearchState = createMarketplaceEditorSearchState();
34
+ const { isSearching, searchError, marketplaceBrowseStarted } =
35
+ marketplaceSearchState;
36
+
37
+ const marketplaceSearch = createMarketplaceEditorSearch(
38
+ {
39
+ manifest,
40
+ searchQuery,
41
+ marketplaceTab,
42
+ ...marketplaceSearchState,
43
+ },
44
+ {
45
+ projectType: 'resourcepack',
46
+ logTag: 'resourcePacksEditor',
47
+ },
48
+ );
49
+
50
+ const selectedResourcePackDetails = ref<ProjectDetails | null>(null);
51
+ const isLoadingResourcePackDetails = ref(false);
52
+ const resourcePackDetailsError = ref<string | null>(null);
53
+
54
+ // Store original manifest for comparing with local resource packs
55
+ const originalManifest = ref<BuildVersionManifest | null>(null);
56
+
57
+ // Local resource packs (not in manifest)
58
+ const localResourcePacks = ref<ResourcePack[]>([]);
59
+
60
+ const installedResourcePacks = computed<ResourcePack[]>(
61
+ () => (manifest.value?.resourcePacks ?? []) as ResourcePack[],
62
+ );
63
+
64
+ // All resource packs including local ones
65
+ const allResourcePacks = computed<ResourcePack[]>(() => [
66
+ ...installedResourcePacks.value,
67
+ ...localResourcePacks.value,
68
+ ]);
69
+
70
+ function isInstalledBySlug(slug: string): boolean {
71
+ return installedResourcePacks.value.some(
72
+ (rp) => rp.projectSlug === slug || rp.id === slug,
73
+ );
74
+ }
75
+
76
+ async function install(item: MarketplaceItem) {
77
+ if (!manifest.value) return;
78
+ const mc = manifest.value._meta?.manifest?.minecraftVersion;
79
+ if (!mc || mc.trim() === '') return;
80
+
81
+ const installCtx = {
82
+ projectType: 'resourcepack' as const,
83
+ minecraftVersion:
84
+ manifest.value?._meta?.manifest?.minecraftVersion || '',
85
+ loader: 'vanilla' as const, // Resource packs don't need loader
86
+ } as const;
87
+
88
+ const prov = getModMarketplaceProvider(item.provider);
89
+ if (!prov) {
90
+ console.warn(
91
+ `[resourcePacksEditor] Unknown marketplace provider: ${item.provider}`,
92
+ );
93
+ return;
94
+ }
95
+ const resourcePack = (await prov.install(
96
+ item,
97
+ installCtx,
98
+ )) as ResourcePack;
99
+
100
+ // Check if already installed
101
+ const isAlreadyInstalled = installedResourcePacks.value.some(
102
+ (rp) =>
103
+ rp.projectSlug === resourcePack.projectSlug ||
104
+ rp.id === resourcePack.id,
105
+ );
106
+
107
+ if (isAlreadyInstalled) {
108
+ console.warn(
109
+ `[resourcePacksEditor] Resource pack ${resourcePack.name} is already installed`,
110
+ );
111
+ return;
112
+ }
113
+
114
+ // Check compatibility with selected Minecraft version
115
+ // Resource packs only need Minecraft version check, no loader check
116
+ const currentMc = manifest.value?._meta?.manifest?.minecraftVersion || '';
117
+ if (
118
+ resourcePack.constraints &&
119
+ resourcePack.constraints.minecraft !== currentMc
120
+ ) {
121
+ // For resource packs, we can still install but warn the user
122
+ console.warn(
123
+ `[resourcePacksEditor] Resource pack ${resourcePack.name} is for Minecraft ${resourcePack.constraints.minecraft}, but selected version is ${currentMc}`,
124
+ );
125
+ }
126
+
127
+ const allResourcePacks = [...installedResourcePacks.value];
128
+ allResourcePacks.push(resourcePack);
129
+ manifest.value.resourcePacks = allResourcePacks;
130
+ }
131
+
132
+ function removeInstalled(idOrSlug: string) {
133
+ if (!manifest.value) return;
134
+
135
+ const allResourcePacks = [...installedResourcePacks.value];
136
+ manifest.value.resourcePacks = allResourcePacks.filter(
137
+ (rp) => rp.id !== idOrSlug && rp.projectSlug !== idOrSlug,
138
+ );
139
+ }
140
+
141
+ async function loadResourcePackDetails(item: MarketplaceItem) {
142
+ isLoadingResourcePackDetails.value = true;
143
+ resourcePackDetailsError.value = null;
144
+ try {
145
+ const prov = getModMarketplaceProvider(item.provider);
146
+ if (!prov) {
147
+ throw new Error(`Unknown provider: ${item.provider}`);
148
+ }
149
+ const details = await prov.getProjectDetails(item.projectId);
150
+ selectedResourcePackDetails.value = details;
151
+ } catch (e) {
152
+ resourcePackDetailsError.value =
153
+ e instanceof Error ? e.message : String(e);
154
+ selectedResourcePackDetails.value = null;
155
+ } finally {
156
+ isLoadingResourcePackDetails.value = false;
157
+ }
158
+ }
159
+
160
+ async function loadInstalledResourcePackDetails(
161
+ resourcePack: ResourcePack,
162
+ ) {
163
+ isLoadingResourcePackDetails.value = true;
164
+ resourcePackDetailsError.value = null;
165
+ try {
166
+ let details: ProjectDetails | null = null;
167
+ const prov = getModMarketplaceProvider(resourcePack.source);
168
+ if (prov) {
169
+ details = await prov.getProjectDetails(resourcePack.id);
170
+ }
171
+ if (details) {
172
+ selectedResourcePackDetails.value = details;
173
+ } else {
174
+ selectedResourcePackDetails.value = {
175
+ provider: resourcePack.source as ProjectDetails['provider'],
176
+ projectId: resourcePack.id,
177
+ slug: resourcePack.projectSlug || resourcePack.id,
178
+ name: resourcePack.name,
179
+ summary: 'Локальный ресурспак',
180
+ iconUrl: resourcePack.image || '',
181
+ downloads: 0,
182
+ };
183
+ }
184
+ } catch (e) {
185
+ resourcePackDetailsError.value =
186
+ e instanceof Error ? e.message : String(e);
187
+ selectedResourcePackDetails.value = null;
188
+ } finally {
189
+ isLoadingResourcePackDetails.value = false;
190
+ }
191
+ }
192
+
193
+ function clearResourcePackDetails() {
194
+ selectedResourcePackDetails.value = null;
195
+ resourcePackDetailsError.value = null;
196
+ }
197
+
198
+ /**
199
+ * Check if a resource pack is compatible with selected Minecraft version
200
+ */
201
+ function checkResourcePackCompatibility(resourcePack: ResourcePack): {
202
+ isValid: boolean;
203
+ reason?: string;
204
+ } {
205
+ if (!resourcePack.constraints) {
206
+ return { isValid: true };
207
+ }
208
+
209
+ const currentMc = manifest.value?._meta?.manifest?.minecraftVersion || '';
210
+ const mcMatch = resourcePack.constraints.minecraft === currentMc;
211
+
212
+ if (!mcMatch) {
213
+ return {
214
+ isValid: false,
215
+ reason: `Minecraft ${resourcePack.constraints.minecraft} (выбрано: ${currentMc})`,
216
+ };
217
+ }
218
+
219
+ return { isValid: true };
220
+ }
221
+
222
+ /**
223
+ * Get compatibility status for all installed resource packs
224
+ */
225
+ const resourcePacksCompatibilityStatus = computed(() => {
226
+ const status = new Map<string, { isValid: boolean; reason?: string }>();
227
+ const installed = installedResourcePacks.value;
228
+
229
+ for (const rp of installed) {
230
+ const rpKey = rp.id || rp.projectSlug;
231
+ status.set(rpKey, checkResourcePackCompatibility(rp));
232
+ }
233
+
234
+ return status;
235
+ });
236
+
237
+ const activeSearchResults = computed(() =>
238
+ marketplaceSearch.getMarketplaceSearchResults(marketplaceTab.value),
239
+ );
240
+
241
+ // Debounced search function
242
+ let debouncedSearch = debounce(() => {
243
+ void marketplaceSearch.search(true);
244
+ }, 500);
245
+
246
+ // Store watcher stop function
247
+ let stopWatcher: (() => void) | null = null;
248
+
249
+ // Auto-search when query changes (debounced) - will be recreated in init
250
+ function setupSearchWatcher() {
251
+ // Stop existing watcher if any
252
+ if (stopWatcher) {
253
+ stopWatcher();
254
+ }
255
+
256
+ // Create new watcher
257
+ stopWatcher = watch(searchQuery, () => {
258
+ debouncedSearch();
259
+ });
260
+ }
261
+
262
+ // Initial setup
263
+ setupSearchWatcher();
264
+
265
+ watch(
266
+ () => manifest.value?._meta?.manifest?.minecraftVersion,
267
+ () => {
268
+ if (!marketplaceBrowseStarted.value) return;
269
+ void marketplaceSearch.search(true);
270
+ },
271
+ );
272
+
273
+ /**
274
+ * Scan for local resource packs
275
+ */
276
+ function scanLocalResourcePacksList() {
277
+ if (!manifest.value?.id) return;
278
+
279
+ // Get original manifest from cache (before any edits)
280
+ const localBuilds = useLocalBuildsModel();
281
+ const original = localBuilds.getManifestById(manifest.value.id);
282
+ originalManifest.value = original;
283
+
284
+ // Scan local resource packs
285
+ localResourcePacks.value = scanLocalResourcePacks(
286
+ manifest.value.id,
287
+ original,
288
+ );
289
+ }
290
+
291
+ /**
292
+ * Toggle disabled state for a resource pack
293
+ */
294
+ function toggleResourcePackDisabledState(
295
+ resourcePack: ResourcePack,
296
+ disabled: boolean,
297
+ ) {
298
+ if (!manifest.value?.id) return false;
299
+
300
+ // If it's a local resource pack, toggle the file
301
+ if (
302
+ resourcePack.source === 'direct' &&
303
+ resourcePack.id.startsWith('local-')
304
+ ) {
305
+ const success = toggleResourcePackDisabled(
306
+ manifest.value.id,
307
+ resourcePack,
308
+ disabled,
309
+ );
310
+ if (success) {
311
+ // Update the resource pack's disabled state
312
+ resourcePack.disabled = disabled;
313
+ // Update file path if needed
314
+ if (resourcePack.files.length > 0) {
315
+ const file = resourcePack.files[0];
316
+ if (disabled) {
317
+ file.path = file.path.replace(/\.zip$/, '.zip.disabled');
318
+ } else {
319
+ file.path = file.path.replace(/\.disabled$/, '');
320
+ }
321
+ }
322
+ }
323
+ return success;
324
+ } else {
325
+ // For manifest resource packs, update the manifest AND rename the file
326
+ if (!manifest.value.resourcePacks) return false;
327
+
328
+ const rpIndex = manifest.value.resourcePacks.findIndex(
329
+ (rp) => rp.id === resourcePack.id,
330
+ );
331
+ if (rpIndex >= 0) {
332
+ // First, rename the file on disk
333
+ const success = toggleResourcePackDisabled(
334
+ manifest.value.id,
335
+ resourcePack,
336
+ disabled,
337
+ );
338
+ if (!success) return false;
339
+
340
+ // Then update the manifest
341
+ manifest.value.resourcePacks[rpIndex].disabled = disabled;
342
+ // Also update file paths
343
+ for (const file of manifest.value.resourcePacks[rpIndex].files) {
344
+ if (disabled) {
345
+ if (!file.path.endsWith('.disabled')) {
346
+ file.path = `${file.path}.disabled`;
347
+ }
348
+ if (!file.filename.endsWith('.disabled')) {
349
+ file.filename = `${file.filename}.disabled`;
350
+ }
351
+ } else {
352
+ file.path = file.path.replace(/\.disabled$/, '');
353
+ file.filename = file.filename.replace(/\.disabled$/, '');
354
+ }
355
+ }
356
+ return true;
357
+ }
358
+ }
359
+ return false;
360
+ }
361
+
362
+ /**
363
+ * Delete a local resource pack
364
+ */
365
+ function deleteLocalResourcePackFile(resourcePack: ResourcePack) {
366
+ if (!manifest.value?.id) return false;
367
+
368
+ if (
369
+ resourcePack.source === 'direct' &&
370
+ resourcePack.id.startsWith('local-')
371
+ ) {
372
+ const success = deleteLocalResourcePack(
373
+ manifest.value.id,
374
+ resourcePack,
375
+ );
376
+ if (success) {
377
+ // Remove from local resource packs list
378
+ localResourcePacks.value = localResourcePacks.value.filter(
379
+ (rp) => rp.id !== resourcePack.id,
380
+ );
381
+ }
382
+ return success;
383
+ }
384
+ return false;
385
+ }
386
+
387
+ /**
388
+ * Инициализация редактора (манифест уже передан при создании store)
389
+ */
390
+ const init = async (_manifest: BuildVersionManifest | null) => {
391
+ searchQuery.value = '';
392
+ searchError.value = null;
393
+ isSearching.value = false;
394
+ selectedResourcePackDetails.value = null;
395
+ resourcePackDetailsError.value = null;
396
+ marketplaceSearch.resetMarketplaceSearchState();
397
+
398
+ const validTabs = new Set<string>([
399
+ 'all',
400
+ ...listModMarketplaceProviders().map((p) => p.id),
401
+ ]);
402
+ if (!validTabs.has(marketplaceTab.value)) {
403
+ marketplaceTab.value = 'all';
404
+ }
405
+
406
+ setupSearchWatcher();
407
+
408
+ void marketplaceSearch.search(true);
409
+
410
+ // Scan local resource packs after initialization
411
+ scanLocalResourcePacksList();
412
+ };
413
+
414
+ return {
415
+ // Resource packs editor API
416
+ init,
417
+ marketplaceTab,
418
+ searchQuery,
419
+ isSearching,
420
+ searchError,
421
+ activeSearchResults,
422
+ getMarketplaceSearchResults: marketplaceSearch.getMarketplaceSearchResults,
423
+ isMarketplaceTabSearching: marketplaceSearch.isMarketplaceTabSearching,
424
+ loadMoreMarketplaceResults: marketplaceSearch.loadMoreMarketplaceResults,
425
+ canLoadMoreMarketplace: marketplaceSearch.canLoadMoreMarketplace,
426
+ isLoadingMoreMarketplace: marketplaceSearch.isLoadingMoreMarketplace,
427
+ marketplaceBrowseStarted,
428
+ installedResourcePacks,
429
+ allResourcePacks,
430
+ localResourcePacks,
431
+ isInstalledBySlug,
432
+ selectedResourcePackDetails,
433
+ isLoadingResourcePackDetails,
434
+ resourcePackDetailsError,
435
+ search: marketplaceSearch.search,
436
+ install,
437
+ removeInstalled,
438
+ loadResourcePackDetails,
439
+ loadInstalledResourcePackDetails,
440
+ clearResourcePackDetails,
441
+ resourcePacksCompatibilityStatus,
442
+ scanLocalResourcePacksList,
443
+ toggleResourcePackDisabledState,
444
+ deleteLocalResourcePackFile,
445
+ };
446
+ },
447
+ false,
448
+ );