@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,276 @@
1
+ /**
2
+ * Общие контракты для @rynt/minecraft-launcher и расширений (useModel('launcher')).
3
+ * Единый источник: SDK не зависит от пакета minecraft-launcher.
4
+ */
5
+
6
+ import type { ChildProcess } from 'node:child_process';
7
+ import type { ComputedRef, Ref } from 'vue';
8
+
9
+ import type { Download, Library, Rule, VersionAsset } from './build-manifest';
10
+ import type {
11
+ LoaderGameVersion,
12
+ LoaderVersionSummary,
13
+ MinecraftVersion,
14
+ MinecraftVersionManifest,
15
+ } from './launcher-versions';
16
+
17
+ export type {
18
+ LoaderGameVersion,
19
+ LoaderVersionSummary,
20
+ MinecraftVersion,
21
+ MinecraftVersionManifest,
22
+ };
23
+
24
+ export interface MinecraftVersionDetails {
25
+ id: string;
26
+ type: string;
27
+ mainClass: string;
28
+ inheritsFrom?: string;
29
+ minecraftArguments?: string;
30
+ versionAssets?: VersionAsset[];
31
+ arguments?: {
32
+ game: (string | { rules?: Rule[]; value: string | string[] })[];
33
+ jvm: (string | { rules?: Rule[]; value: string | string[] })[];
34
+ };
35
+ libraries: Library[];
36
+ assetIndex: AssetIndex;
37
+ downloads: {
38
+ client: Download;
39
+ server?: Download;
40
+ client_mappings?: Download;
41
+ server_mappings?: Download;
42
+ };
43
+ javaVersion?: {
44
+ component: string;
45
+ majorVersion: number;
46
+ };
47
+ minimumLauncherVersion?: number;
48
+ }
49
+
50
+ export interface AssetIndex {
51
+ id: string;
52
+ sha1: string;
53
+ size: number;
54
+ totalSize: number;
55
+ url: string;
56
+ }
57
+
58
+ export interface AssetManifest {
59
+ map_to_resources?: boolean;
60
+ objects: {
61
+ [key: string]: {
62
+ hash: string;
63
+ size: number;
64
+ };
65
+ };
66
+ }
67
+
68
+ export interface FabricLoaderVersion {
69
+ separator: string;
70
+ build: number;
71
+ maven: string;
72
+ version: string;
73
+ }
74
+
75
+ export interface FabricGameVersion {
76
+ version: string;
77
+ stable: boolean;
78
+ }
79
+
80
+ export interface FabricInstallerVersion {
81
+ url: string;
82
+ maven: string;
83
+ version: string;
84
+ stable: boolean;
85
+ }
86
+
87
+ export interface FabricVersionInfo {
88
+ loader: FabricLoaderVersion;
89
+ intermediary: {
90
+ maven: string;
91
+ version: string;
92
+ };
93
+ launcherMeta: {
94
+ version: number;
95
+ libraries: {
96
+ client: Library[];
97
+ common: Library[];
98
+ server: Library[];
99
+ };
100
+ mainClass: {
101
+ client: string;
102
+ server: string;
103
+ };
104
+ };
105
+ }
106
+
107
+ export interface NodeModules {
108
+ child_process?: typeof import('node:child_process');
109
+ fs?: typeof import('node:fs');
110
+ path?: typeof import('node:path');
111
+ os?: typeof import('node:os');
112
+ crypto?: typeof import('node:crypto');
113
+ axios?: typeof import('axios').default;
114
+ 'adm-zip'?: unknown;
115
+ /**
116
+ * Resolved at runtime via NW.js / minecraft-launcher (`@xmcl/core` is not an SDK dependency).
117
+ * Typed as unknown here so packages that only import SDK types (e.g. marketplace-service) can compile.
118
+ */
119
+ '@xmcl/core'?: unknown;
120
+ }
121
+
122
+ export interface LauncherConfig {
123
+ baseDirectory?: string;
124
+ nodeModules?: NodeModules;
125
+ versionsDirectory?: string;
126
+ librariesDirectory?: string;
127
+ assetsDirectory?: string;
128
+ logsDirectory?: string;
129
+ savesDirectory?: string;
130
+ javaPath?: string;
131
+ minMemory?: number;
132
+ maxMemory?: number;
133
+ jvmArguments?: string[];
134
+ gameArguments?: string[];
135
+ versionManifestUrl?: string;
136
+ assetsUrl?: string;
137
+ librariesUrl?: string;
138
+ downloadConcurrency?: number;
139
+ downloadRetries?: number;
140
+ downloadRetryDelayMs?: number;
141
+ }
142
+
143
+ export interface LaunchOptions {
144
+ version: string;
145
+ buildName?: string;
146
+ loaderId?: string;
147
+ loaderVersion?: string;
148
+ ignoreVersionAssets?: boolean;
149
+ username: string;
150
+ uuid?: string;
151
+ accessToken?: string;
152
+ clientToken?: string;
153
+ gameDirectory?: string;
154
+ versionsDirectory?: string;
155
+ javaPath?: string;
156
+ memory?: {
157
+ min?: number;
158
+ max?: number;
159
+ };
160
+ jvmArguments?: string[];
161
+ gameArguments?: string[];
162
+ width?: number;
163
+ height?: number;
164
+ fullscreen?: boolean;
165
+ server?: {
166
+ ip: string;
167
+ port?: number;
168
+ };
169
+ authlibInjectorUrl?: string;
170
+ minecraftApiArgs?: Record<string, string>;
171
+ }
172
+
173
+ export interface DownloadProgress {
174
+ file: string;
175
+ downloaded: number;
176
+ total: number;
177
+ percentage: number;
178
+ }
179
+
180
+ export interface LaunchProgress {
181
+ stage:
182
+ | 'downloading'
183
+ | 'extracting'
184
+ | 'validating'
185
+ | 'verifying'
186
+ | 'launching'
187
+ | 'running'
188
+ | 'cancelled';
189
+ progress?: DownloadProgress;
190
+ message?: string;
191
+ }
192
+
193
+ /** Результат `resolvePaths(config)` в composable */
194
+ export interface MinecraftLauncherResolvedPaths {
195
+ base: string;
196
+ versions: string;
197
+ libraries: string;
198
+ assets: string;
199
+ logs: string;
200
+ jre: string;
201
+ indexes: string;
202
+ objects: string;
203
+ natives: string;
204
+ }
205
+
206
+ export type LauncherLogLevel = 'info' | 'warn' | 'error';
207
+
208
+ export interface LauncherLogEntry {
209
+ at: string;
210
+ level: LauncherLogLevel;
211
+ message: string;
212
+ }
213
+
214
+ /**
215
+ * Публичный return-объект `useMinecraftLauncher()`.
216
+ * Должен совпадать с реализацией в @rynt/minecraft-launcher.
217
+ */
218
+ export interface UseMinecraftLauncherApi {
219
+ config: Ref<LauncherConfig>;
220
+ isDownloading: Ref<boolean>;
221
+ isLaunching: Ref<boolean>;
222
+ progress: Ref<LaunchProgress | null>;
223
+ error: Ref<Error | null>;
224
+ gameProcess: Ref<ChildProcess | null>;
225
+ gameLogs: Ref<string[]>;
226
+ launcherLogs: Ref<LauncherLogEntry[]>;
227
+ versionManifest: Ref<MinecraftVersionManifest | null>;
228
+
229
+ paths: ComputedRef<MinecraftLauncherResolvedPaths>;
230
+
231
+ updateConfig: (updates: Partial<LauncherConfig>) => void;
232
+ findJavaPath: (baseDirectory?: string) => string;
233
+ generateOfflineTokens: () => { accessToken: string; clientToken: string; uuid: string };
234
+ loadVersionManifest: () => Promise<MinecraftVersionManifest>;
235
+ getVersionInfo: (versionId: string, _buildDir?: string) => Promise<MinecraftVersionDetails>;
236
+
237
+ getLoaders: () => Promise<{ id: string; name: string }[]>;
238
+ getLoaderGameVersions: (loaderId: string) => Promise<LoaderGameVersion[]>;
239
+ getLoaderVersions: (loaderId: string, gameVersion: string) => Promise<LoaderVersionSummary[]>;
240
+
241
+ downloadVersion: (
242
+ versionId: string,
243
+ loaderId?: string,
244
+ loaderVersion?: string,
245
+ buildName?: string,
246
+ onProgress?: (progress: LaunchProgress) => void,
247
+ ignoreVersionAssets?: boolean,
248
+ customVersionsDir?: string,
249
+ ) => Promise<void>;
250
+
251
+ verifyFiles: (
252
+ versionId: string,
253
+ loaderId?: string,
254
+ loaderVersion?: string,
255
+ buildName?: string,
256
+ ignoreVersionAssets?: boolean,
257
+ customVersionsDir?: string,
258
+ ) => Promise<{ missing: string[]; invalid: string[] }>;
259
+
260
+ launch: (
261
+ options: LaunchOptions,
262
+ onProgress?: (progress: LaunchProgress) => void,
263
+ ) => Promise<ChildProcess>;
264
+
265
+ downloadAndLaunch: (
266
+ options: LaunchOptions,
267
+ onProgress?: (progress: LaunchProgress) => void,
268
+ ) => Promise<ChildProcess>;
269
+
270
+ killProcess: (processId: string, signal?: NodeJS.Signals | number) => boolean;
271
+ getProcess: (processId: string) => ChildProcess | null;
272
+ isProcessRunning: (processId: string) => boolean;
273
+ stopDownload: (reason?: string) => Promise<void>;
274
+ }
275
+
276
+ export type UseMinecraftLauncherReturn = UseMinecraftLauncherApi;
@@ -0,0 +1 @@
1
+ export * from './navigation';
@@ -0,0 +1,17 @@
1
+ import type { NavigationSection, MenuItem } from '../types';
2
+
3
+ export const mockSections: NavigationSection[] = [
4
+ { link: '/', label: 'Главная', icon: 'home' },
5
+ { link: '/builds', label: 'Сборки', icon: 'box' },
6
+ { link: '/servers', label: 'Серверы', icon: 'server' },
7
+ { link: '/friends', label: 'Друзья', icon: 'users' },
8
+ { link: '/settings', label: 'Настройки', icon: 'settings' },
9
+ { link: '/library', label: 'Библиотека', icon: 'search' },
10
+ ];
11
+
12
+ export const mockMenuItems: MenuItem[] = [
13
+ { id: 'profile', label: 'Профиль', icon: 'user' },
14
+ { id: 'settings', label: 'Настройки', icon: 'settings' },
15
+ { id: 'logout', label: 'Выйти', icon: 'close' },
16
+ ];
17
+
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Build URL with query parameters
3
+ */
4
+ function buildUrl(baseUrl: string, params?: Record<string, string | number | boolean | undefined>): string {
5
+ if (!params) return baseUrl;
6
+
7
+ const url = new URL(baseUrl);
8
+ Object.entries(params).forEach(([key, value]) => {
9
+ if (value !== undefined && value !== null) {
10
+ url.searchParams.append(key, String(value));
11
+ }
12
+ });
13
+ return url.toString();
14
+ }
15
+
16
+ /**
17
+ * Fetch wrapper that works in both browser and NW.js
18
+ * Uses native fetch API so requests are visible in Network tab
19
+ */
20
+ export async function httpGet<T>(
21
+ url: string,
22
+ options?: {
23
+ params?: Record<string, string | number | boolean | undefined>;
24
+ headers?: Record<string, string>;
25
+ }
26
+ ): Promise<T> {
27
+ const fullUrl = buildUrl(url, options?.params);
28
+
29
+ const response = await fetch(fullUrl, {
30
+ method: 'GET',
31
+ headers: {
32
+ 'Content-Type': 'application/json',
33
+ ...options?.headers,
34
+ },
35
+ });
36
+
37
+ if (!response.ok) {
38
+ const errorText = await response.text().catch(() => 'Unknown error');
39
+ throw new Error(`HTTP ${response.status}: ${errorText}`);
40
+ }
41
+
42
+ return response.json() as Promise<T>;
43
+ }
44
+
45
+
@@ -0,0 +1,5 @@
1
+ export * from './providers';
2
+ export * from './http';
3
+ export * from './mod-marketplace-registry';
4
+ export * from './mod-marketplace-types';
5
+ export * from './types';
@@ -0,0 +1,266 @@
1
+ import type { Ref } from 'vue';
2
+ import { reactive, ref, type Reactive } from 'vue';
3
+
4
+ import type { BuildVersionManifest } from '../minecraft-types/build-manifest';
5
+ import {
6
+ getModMarketplaceProvider,
7
+ listModMarketplaceProviders,
8
+ } from './mod-marketplace-registry';
9
+ import {
10
+ mergeMarketplaceItems,
11
+ runMarketplaceSearch,
12
+ } from './marketplace-search-utils';
13
+ import type {
14
+ MarketplaceItem,
15
+ MarketplaceSearchContext,
16
+ ProjectType,
17
+ } from './types';
18
+
19
+ export type MarketplaceEditorSearchBindings = {
20
+ manifest: Ref<BuildVersionManifest | null>;
21
+ searchQuery: Ref<string>;
22
+ isSearching: Ref<boolean>;
23
+ searchError: Ref<string | null>;
24
+ searchResultsByProvider: Reactive<Record<string, MarketplaceItem[]>>;
25
+ isSearchingByProvider: Reactive<Record<string, boolean>>;
26
+ isLoadingMoreByProvider: Reactive<Record<string, boolean>>;
27
+ hasMoreByProvider: Reactive<Record<string, boolean>>;
28
+ searchPageByProvider: Reactive<Record<string, number>>;
29
+ marketplaceBrowseStarted: Ref<boolean>;
30
+ marketplaceTab: Ref<string>;
31
+ };
32
+
33
+ export type MarketplaceEditorSearchOptions = {
34
+ projectType: ProjectType;
35
+ logTag: string;
36
+ buildBaseSearchContext?: (
37
+ manifest: BuildVersionManifest | null,
38
+ query: string,
39
+ ) => Omit<MarketplaceSearchContext, 'page' | 'query'>;
40
+ };
41
+
42
+ export function createMarketplaceEditorSearch(
43
+ bindings: MarketplaceEditorSearchBindings,
44
+ options: MarketplaceEditorSearchOptions,
45
+ ) {
46
+ const {
47
+ manifest,
48
+ searchQuery,
49
+ isSearching,
50
+ searchError,
51
+ searchResultsByProvider,
52
+ isSearchingByProvider,
53
+ isLoadingMoreByProvider,
54
+ hasMoreByProvider,
55
+ searchPageByProvider,
56
+ marketplaceBrowseStarted,
57
+ marketplaceTab,
58
+ } = bindings;
59
+
60
+ function syncMarketplaceProviderSearchKeys(): void {
61
+ for (const p of listModMarketplaceProviders()) {
62
+ if (!(p.id in searchResultsByProvider)) {
63
+ searchResultsByProvider[p.id] = [];
64
+ }
65
+ if (!(p.id in isSearchingByProvider)) {
66
+ isSearchingByProvider[p.id] = false;
67
+ }
68
+ if (!(p.id in isLoadingMoreByProvider)) {
69
+ isLoadingMoreByProvider[p.id] = false;
70
+ }
71
+ if (!(p.id in hasMoreByProvider)) {
72
+ hasMoreByProvider[p.id] = false;
73
+ }
74
+ if (!(p.id in searchPageByProvider)) {
75
+ searchPageByProvider[p.id] = -1;
76
+ }
77
+ }
78
+ }
79
+
80
+ function getProvidersForLoadMore(tabId: string): string[] {
81
+ syncMarketplaceProviderSearchKeys();
82
+ if (tabId === 'all') {
83
+ return listModMarketplaceProviders()
84
+ .map((p) => p.id)
85
+ .filter((id) => hasMoreByProvider[id]);
86
+ }
87
+ return hasMoreByProvider[tabId] ? [tabId] : [];
88
+ }
89
+
90
+ function canLoadMoreMarketplace(tabId: string): boolean {
91
+ return getProvidersForLoadMore(tabId).length > 0;
92
+ }
93
+
94
+ function isLoadingMoreMarketplace(tabId: string): boolean {
95
+ syncMarketplaceProviderSearchKeys();
96
+ if (tabId === 'all') {
97
+ return listModMarketplaceProviders().some(
98
+ (p) => isLoadingMoreByProvider[p.id],
99
+ );
100
+ }
101
+ return Boolean(isLoadingMoreByProvider[tabId]);
102
+ }
103
+
104
+ function buildBaseSearchContext(query: string): MarketplaceSearchContext {
105
+ if (options.buildBaseSearchContext) {
106
+ return {
107
+ ...options.buildBaseSearchContext(manifest.value, query),
108
+ query,
109
+ };
110
+ }
111
+ return {
112
+ projectType: options.projectType,
113
+ query,
114
+ minecraftVersion:
115
+ manifest.value?._meta?.manifest?.minecraftVersion || undefined,
116
+ };
117
+ }
118
+
119
+ async function searchProvider(
120
+ providerId: string,
121
+ reset: boolean,
122
+ baseSearchCtx: MarketplaceSearchContext,
123
+ ): Promise<void> {
124
+ const prov = getModMarketplaceProvider(providerId);
125
+ if (!prov) return;
126
+
127
+ const page = reset ? 0 : (searchPageByProvider[providerId] ?? -1) + 1;
128
+ const ctx: MarketplaceSearchContext = { ...baseSearchCtx, page };
129
+
130
+ if (reset) {
131
+ isSearchingByProvider[providerId] = true;
132
+ } else {
133
+ isLoadingMoreByProvider[providerId] = true;
134
+ }
135
+
136
+ try {
137
+ const result = await runMarketplaceSearch(prov, ctx);
138
+ if (reset) {
139
+ searchResultsByProvider[providerId] = result.items;
140
+ } else {
141
+ searchResultsByProvider[providerId] = mergeMarketplaceItems(
142
+ searchResultsByProvider[providerId] ?? [],
143
+ result.items,
144
+ );
145
+ }
146
+ hasMoreByProvider[providerId] = result.hasMore;
147
+ searchPageByProvider[providerId] = page;
148
+ } catch (e) {
149
+ console.warn(`[${options.logTag}] ${providerId} search failed:`, e);
150
+ if (reset) {
151
+ searchResultsByProvider[providerId] = [];
152
+ hasMoreByProvider[providerId] = false;
153
+ searchPageByProvider[providerId] = -1;
154
+ }
155
+ } finally {
156
+ if (reset) {
157
+ isSearchingByProvider[providerId] = false;
158
+ } else {
159
+ isLoadingMoreByProvider[providerId] = false;
160
+ }
161
+ }
162
+ }
163
+
164
+ async function searchProviders(
165
+ providerIds: string[],
166
+ reset: boolean,
167
+ ): Promise<void> {
168
+ syncMarketplaceProviderSearchKeys();
169
+ marketplaceBrowseStarted.value = true;
170
+
171
+ const baseSearchCtx = buildBaseSearchContext(searchQuery.value);
172
+
173
+ if (reset) {
174
+ isSearching.value = true;
175
+ searchError.value = null;
176
+ for (const id of providerIds) {
177
+ searchResultsByProvider[id] = [];
178
+ hasMoreByProvider[id] = false;
179
+ searchPageByProvider[id] = -1;
180
+ }
181
+ }
182
+
183
+ try {
184
+ await Promise.allSettled(
185
+ providerIds.map((id) => searchProvider(id, reset, baseSearchCtx)),
186
+ );
187
+ } catch (e) {
188
+ searchError.value = e instanceof Error ? e.message : String(e);
189
+ } finally {
190
+ if (reset) {
191
+ isSearching.value = false;
192
+ }
193
+ }
194
+ }
195
+
196
+ async function search(reset = true): Promise<void> {
197
+ const allIds = listModMarketplaceProviders().map((p) => p.id);
198
+ await searchProviders(allIds, reset);
199
+ }
200
+
201
+ async function loadMoreMarketplaceResults(): Promise<void> {
202
+ if (isSearching.value) return;
203
+ const tabId = marketplaceTab.value;
204
+ const providerIds = getProvidersForLoadMore(tabId);
205
+ if (!providerIds.length) return;
206
+ if (isLoadingMoreMarketplace(tabId)) return;
207
+ await searchProviders(providerIds, false);
208
+ }
209
+
210
+ function getMarketplaceSearchResults(tabId: string): MarketplaceItem[] {
211
+ syncMarketplaceProviderSearchKeys();
212
+ if (tabId === 'all') {
213
+ const merged: MarketplaceItem[] = [];
214
+ for (const p of listModMarketplaceProviders()) {
215
+ merged.push(...(searchResultsByProvider[p.id] ?? []));
216
+ }
217
+ return merged;
218
+ }
219
+ return searchResultsByProvider[tabId] ?? [];
220
+ }
221
+
222
+ function isMarketplaceTabSearching(tabId: string): boolean {
223
+ syncMarketplaceProviderSearchKeys();
224
+ if (tabId === 'all') {
225
+ return listModMarketplaceProviders().some(
226
+ (p) => isSearchingByProvider[p.id],
227
+ );
228
+ }
229
+ return Boolean(isSearchingByProvider[tabId]);
230
+ }
231
+
232
+ function resetMarketplaceSearchState(): void {
233
+ syncMarketplaceProviderSearchKeys();
234
+ for (const p of listModMarketplaceProviders()) {
235
+ searchResultsByProvider[p.id] = [];
236
+ isSearchingByProvider[p.id] = false;
237
+ isLoadingMoreByProvider[p.id] = false;
238
+ hasMoreByProvider[p.id] = false;
239
+ searchPageByProvider[p.id] = -1;
240
+ }
241
+ }
242
+
243
+ return {
244
+ syncMarketplaceProviderSearchKeys,
245
+ canLoadMoreMarketplace,
246
+ isLoadingMoreMarketplace,
247
+ search,
248
+ loadMoreMarketplaceResults,
249
+ getMarketplaceSearchResults,
250
+ isMarketplaceTabSearching,
251
+ resetMarketplaceSearchState,
252
+ };
253
+ }
254
+
255
+ export function createMarketplaceEditorSearchState() {
256
+ return {
257
+ isSearching: ref(false),
258
+ searchError: ref<string | null>(null),
259
+ searchResultsByProvider: reactive<Record<string, MarketplaceItem[]>>({}),
260
+ isSearchingByProvider: reactive<Record<string, boolean>>({}),
261
+ isLoadingMoreByProvider: reactive<Record<string, boolean>>({}),
262
+ hasMoreByProvider: reactive<Record<string, boolean>>({}),
263
+ searchPageByProvider: reactive<Record<string, number>>({}),
264
+ marketplaceBrowseStarted: ref(false),
265
+ };
266
+ }
@@ -0,0 +1,42 @@
1
+ import type { ModMarketplaceProvider } from './mod-marketplace-types';
2
+ import type {
3
+ MarketplaceItem,
4
+ MarketplaceSearchContext,
5
+ MarketplaceSearchResult,
6
+ } from './types';
7
+ import { MARKETPLACE_SEARCH_PAGE_SIZE as PAGE_SIZE } from './types';
8
+
9
+ export async function runMarketplaceSearch(
10
+ provider: ModMarketplaceProvider,
11
+ ctx: MarketplaceSearchContext,
12
+ ): Promise<MarketplaceSearchResult> {
13
+ const result = await provider.search(ctx);
14
+ return normalizeMarketplaceSearchResult(result);
15
+ }
16
+
17
+ export function normalizeMarketplaceSearchResult(
18
+ result: MarketplaceSearchResult | MarketplaceItem[],
19
+ ): MarketplaceSearchResult {
20
+ if (Array.isArray(result)) {
21
+ return {
22
+ items: result,
23
+ hasMore: result.length >= PAGE_SIZE,
24
+ };
25
+ }
26
+ return result;
27
+ }
28
+
29
+ export function mergeMarketplaceItems(
30
+ existing: MarketplaceItem[],
31
+ incoming: MarketplaceItem[],
32
+ ): MarketplaceItem[] {
33
+ const seen = new Set(existing.map((i) => `${i.provider}:${i.projectId}`));
34
+ const merged = [...existing];
35
+ for (const item of incoming) {
36
+ const key = `${item.provider}:${item.projectId}`;
37
+ if (seen.has(key)) continue;
38
+ seen.add(key);
39
+ merged.push(item);
40
+ }
41
+ return merged;
42
+ }