@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,647 @@
1
+ /**
2
+ * API для работы со сборками и версиями
3
+ */
4
+
5
+ import { graphqlRequest } from './graphql';
6
+ import type { BuildVersionManifest } from '../minecraft-types/build-manifest';
7
+
8
+ export interface Build {
9
+ id: string;
10
+ name: string;
11
+ description: string;
12
+ image?: string;
13
+ isPublic: boolean;
14
+ downloads?: number;
15
+ rating?: number | null;
16
+ minecraftVersion?: string;
17
+ loader?: string;
18
+ author: {
19
+ id: string;
20
+ username: string;
21
+ };
22
+ }
23
+
24
+ export interface Version {
25
+ id: string;
26
+ version: string;
27
+ name: string;
28
+ description: string;
29
+ image?: string;
30
+ minecraftVersion?: string;
31
+ loader?: string;
32
+ releaseTime?: string;
33
+ build: {
34
+ id: string;
35
+ };
36
+ }
37
+
38
+ /**
39
+ * Проверяет, существует ли сборка с указанным ID
40
+ */
41
+ export async function checkBuildExists(buildId: string): Promise<boolean> {
42
+ const query = `
43
+ query CheckBuildExists($id: ID!) {
44
+ build(where: { id: $id }) {
45
+ id
46
+ }
47
+ }
48
+ `;
49
+
50
+ try {
51
+ const result = await graphqlRequest<{ build: { id: string } | null }>(
52
+ query,
53
+ { id: buildId },
54
+ );
55
+ return result.build !== null;
56
+ } catch {
57
+ return false;
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Получает сборку по ID с последней версией и манифестом
63
+ */
64
+ export async function getBuildWithLatestVersion(buildId: string): Promise<{
65
+ id: string;
66
+ name: string;
67
+ latestVersion: {
68
+ id: string;
69
+ version: string;
70
+ manifest: BuildVersionManifest;
71
+ } | null;
72
+ } | null> {
73
+ const query = `
74
+ query GetBuildWithLatestVersion($where: BuildWhereUniqueInput!) {
75
+ build(where: $where) {
76
+ id
77
+ name
78
+ versions(
79
+ orderBy: { releaseTime: desc }
80
+ take: 1
81
+ ) {
82
+ id
83
+ version
84
+ manifest
85
+ }
86
+ }
87
+ }
88
+ `;
89
+
90
+ try {
91
+ const result = await graphqlRequest<{
92
+ build: {
93
+ id: string;
94
+ name: string;
95
+ versions: Array<{
96
+ id: string;
97
+ version: string;
98
+ manifest: BuildVersionManifest;
99
+ }>;
100
+ } | null;
101
+ }>(query, { where: { id: buildId } });
102
+
103
+ if (!result.build) {
104
+ return null;
105
+ }
106
+
107
+ return {
108
+ id: result.build.id,
109
+ name: result.build.name,
110
+ latestVersion:
111
+ result.build.versions.length > 0
112
+ ? {
113
+ id: result.build.versions[0].id,
114
+ version: result.build.versions[0].version,
115
+ manifest: result.build.versions[0].manifest,
116
+ }
117
+ : null,
118
+ };
119
+ } catch (error) {
120
+ console.error('Error getting build with latest version:', error);
121
+ return null;
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Получает версию сборки по ID сборки и номеру версии
127
+ */
128
+ export async function getBuildVersion(
129
+ buildId: string,
130
+ version: string,
131
+ ): Promise<{
132
+ id: string;
133
+ version: string;
134
+ manifest: BuildVersionManifest;
135
+ } | null> {
136
+ const query = `
137
+ query GetBuildVersion($where: BuildWhereUniqueInput!, $versionWhere: VersionWhereInput!) {
138
+ build(where: $where) {
139
+ id
140
+ versions(
141
+ where: $versionWhere
142
+ take: 1
143
+ ) {
144
+ id
145
+ version
146
+ manifest
147
+ }
148
+ }
149
+ }
150
+ `;
151
+
152
+ try {
153
+ const result = await graphqlRequest<{
154
+ build: {
155
+ id: string;
156
+ versions: Array<{
157
+ id: string;
158
+ version: string;
159
+ manifest: BuildVersionManifest;
160
+ }>;
161
+ } | null;
162
+ }>(query, {
163
+ where: { id: buildId },
164
+ versionWhere: { version: { equals: version } },
165
+ });
166
+
167
+ if (!result.build || result.build.versions.length === 0) {
168
+ return null;
169
+ }
170
+
171
+ return {
172
+ id: result.build.versions[0].id,
173
+ version: result.build.versions[0].version,
174
+ manifest: result.build.versions[0].manifest,
175
+ };
176
+ } catch (error) {
177
+ console.error('Error getting build version:', error);
178
+ return null;
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Создает новую сборку
184
+ */
185
+ export async function createBuild(data: {
186
+ name: string;
187
+ description: string;
188
+ image?: string;
189
+ isPublic?: boolean;
190
+ minecraftVersion?: string;
191
+ loader?: string;
192
+ }): Promise<Build> {
193
+ const mutation = `
194
+ mutation CreateBuild($data: BuildCreateInput!) {
195
+ createBuild(data: $data) {
196
+ id
197
+ name
198
+ description
199
+ image
200
+ isPublic
201
+ minecraftVersion
202
+ loader
203
+ author {
204
+ id
205
+ username
206
+ }
207
+ }
208
+ }
209
+ `;
210
+
211
+ const result = await graphqlRequest<{ createBuild: Build }>(mutation, {
212
+ data: {
213
+ name: data.name,
214
+ description: data.description,
215
+ image: data.image || '',
216
+ isPublic: data.isPublic || false,
217
+ minecraftVersion: data.minecraftVersion || '',
218
+ loader: data.loader || '',
219
+ },
220
+ });
221
+
222
+ return result.createBuild;
223
+ }
224
+
225
+ /**
226
+ * Обновляет информацию о сборке
227
+ */
228
+ export async function updateBuild(
229
+ buildId: string,
230
+ data: {
231
+ name?: string;
232
+ description?: string;
233
+ image?: string;
234
+ minecraftVersion?: string;
235
+ loader?: string;
236
+ isPublic?: boolean;
237
+ },
238
+ ): Promise<Build> {
239
+ const mutation = `
240
+ mutation UpdateBuild($where: BuildWhereUniqueInput!, $data: BuildUpdateInput!) {
241
+ updateBuild(where: $where, data: $data) {
242
+ id
243
+ name
244
+ description
245
+ image
246
+ isPublic
247
+ minecraftVersion
248
+ loader
249
+ author {
250
+ id
251
+ username
252
+ }
253
+ }
254
+ }
255
+ `;
256
+
257
+ const updateData: any = {};
258
+ if (data.name !== undefined) updateData.name = data.name;
259
+ if (data.description !== undefined) updateData.description = data.description;
260
+ if (data.image !== undefined) updateData.image = data.image;
261
+ if (data.minecraftVersion !== undefined)
262
+ updateData.minecraftVersion = data.minecraftVersion;
263
+ if (data.loader !== undefined) updateData.loader = data.loader;
264
+ if (data.isPublic !== undefined) updateData.isPublic = data.isPublic;
265
+
266
+ const result = await graphqlRequest<{ updateBuild: Build }>(mutation, {
267
+ where: { id: buildId },
268
+ data: updateData,
269
+ });
270
+
271
+ return result.updateBuild;
272
+ }
273
+
274
+ /**
275
+ * Получает сборки текущего пользователя (опубликованные)
276
+ */
277
+ export async function getMyBuilds(): Promise<Build[]> {
278
+ // Сначала получаем текущего пользователя
279
+ const userQuery = `
280
+ query {
281
+ authenticatedItem {
282
+ ... on User {
283
+ id
284
+ }
285
+ }
286
+ }
287
+ `;
288
+
289
+ const userResult = await graphqlRequest<{
290
+ authenticatedItem: { id: string } | null;
291
+ }>(userQuery);
292
+
293
+ if (!userResult.authenticatedItem) {
294
+ return [];
295
+ }
296
+
297
+ const query = `
298
+ query GetMyBuilds($where: BuildWhereInput!, $orderBy: [BuildOrderByInput!]!) {
299
+ builds(where: $where, orderBy: $orderBy) {
300
+ id
301
+ name
302
+ description
303
+ image
304
+ downloads
305
+ minecraftVersion
306
+ loader
307
+ author {
308
+ id
309
+ username
310
+ }
311
+ }
312
+ }
313
+ `;
314
+
315
+ const result = await graphqlRequest<{ builds: Build[] }>(query, {
316
+ where: {
317
+ author: { id: { equals: userResult.authenticatedItem.id } },
318
+ },
319
+ orderBy: [{ name: 'asc' }],
320
+ });
321
+
322
+ return result.builds;
323
+ }
324
+
325
+ /**
326
+ * Получает все версии сборки, отсортированные по дате релиза (последняя первая)
327
+ */
328
+ export async function getBuildVersions(buildId: string): Promise<Version[]> {
329
+ const query = `
330
+ query GetBuildVersions($where: BuildWhereUniqueInput!) {
331
+ build(where: $where) {
332
+ id
333
+ versions(
334
+ orderBy: { releaseTime: desc }
335
+ ) {
336
+ id
337
+ version
338
+ name
339
+ description
340
+ image
341
+ minecraftVersion
342
+ loader
343
+ releaseTime
344
+ build {
345
+ id
346
+ }
347
+ }
348
+ }
349
+ }
350
+ `;
351
+
352
+ try {
353
+ const result = await graphqlRequest<{
354
+ build: {
355
+ id: string;
356
+ versions: Version[];
357
+ } | null;
358
+ }>(query, { where: { id: buildId } });
359
+
360
+ if (!result.build) {
361
+ return [];
362
+ }
363
+
364
+ return result.build.versions;
365
+ } catch (error) {
366
+ console.error('Error getting build versions:', error);
367
+ return [];
368
+ }
369
+ }
370
+
371
+ /**
372
+ * Получает все сборки текущего пользователя (включая приватные)
373
+ */
374
+ export async function getAllUserBuilds(): Promise<Build[]> {
375
+ // Сначала получаем текущего пользователя
376
+ const userQuery = `
377
+ query {
378
+ authenticatedItem {
379
+ ... on User {
380
+ id
381
+ }
382
+ }
383
+ }
384
+ `;
385
+
386
+ const userResult = await graphqlRequest<{
387
+ authenticatedItem: { id: string } | null;
388
+ }>(userQuery);
389
+
390
+ if (!userResult.authenticatedItem) {
391
+ return [];
392
+ }
393
+
394
+ const query = `
395
+ query GetAllUserBuilds($where: BuildWhereInput!, $orderBy: [BuildOrderByInput!]!) {
396
+ builds(where: $where, orderBy: $orderBy) {
397
+ id
398
+ name
399
+ description
400
+ image
401
+ downloads
402
+ minecraftVersion
403
+ loader
404
+ isPublic
405
+ author {
406
+ id
407
+ username
408
+ }
409
+ }
410
+ }
411
+ `;
412
+
413
+ const result = await graphqlRequest<{ builds: Build[] }>(query, {
414
+ where: {
415
+ author: { id: { equals: userResult.authenticatedItem.id } },
416
+ },
417
+ orderBy: [{ name: 'asc' }],
418
+ });
419
+
420
+ return result.builds;
421
+ }
422
+
423
+ /**
424
+ * Создает версию сборки
425
+ */
426
+ export async function createVersion(data: {
427
+ buildId: string;
428
+ version: string;
429
+ name: string;
430
+ description: string;
431
+ image?: string;
432
+ manifest: BuildVersionManifest;
433
+ assetIds: string[];
434
+ versionAssets: Array<{
435
+ path: string;
436
+ sha1: string;
437
+ url: string;
438
+ name: string;
439
+ skipHashCheck?: boolean;
440
+ }>;
441
+ }): Promise<Version> {
442
+ const mutation = `
443
+ mutation CreateVersion($data: VersionCreateInput!) {
444
+ createVersion(data: $data) {
445
+ id
446
+ version
447
+ name
448
+ description
449
+ build {
450
+ id
451
+ }
452
+ }
453
+ }
454
+ `;
455
+
456
+ // Получаем текущее время для releaseTime
457
+ const releaseTime = new Date().toISOString();
458
+
459
+ // Очищаем манифест от локальных полей и обновляем метаданные
460
+ const cleanedManifest = cleanManifestForPublish(
461
+ data.manifest,
462
+ data.buildId,
463
+ data.version,
464
+ releaseTime,
465
+ );
466
+
467
+ // Обновляем versionAssets с реальными данными об ассетах
468
+ cleanedManifest.versionAssets = data.versionAssets.map((asset) => {
469
+ const result: any = {
470
+ name: asset.name,
471
+ path: asset.path,
472
+ sha1: asset.sha1,
473
+ url: asset.url,
474
+ };
475
+ if (asset.skipHashCheck) {
476
+ result.skipHashCheck = asset.skipHashCheck;
477
+ }
478
+ return result;
479
+ });
480
+
481
+ const result = await graphqlRequest<{ createVersion: Version }>(mutation, {
482
+ data: {
483
+ build: { connect: { id: data.buildId } },
484
+ version: data.version,
485
+ name: data.name,
486
+ description: data.description,
487
+ image: data.image || '',
488
+ manifest: cleanedManifest,
489
+ minecraftVersion: cleanedManifest._meta?.manifest?.minecraftVersion || '',
490
+ loader: cleanedManifest._meta?.manifest?.loader || '',
491
+ loaderVersion: cleanedManifest._meta?.manifest?.loaderVersion || '',
492
+ releaseTime: releaseTime,
493
+ assets: {
494
+ connect: data.assetIds.map((id) => ({ id })),
495
+ },
496
+ },
497
+ });
498
+
499
+ return result.createVersion;
500
+ }
501
+
502
+ /**
503
+ * Добавляет автора к существующему ассету
504
+ */
505
+ export async function addAuthorToAsset(assetId: string): Promise<void> {
506
+ const mutation = `
507
+ mutation UpdateAsset($where: AssetWhereUniqueInput!, $data: AssetUpdateInput!) {
508
+ updateAsset(where: $where, data: $data) {
509
+ id
510
+ }
511
+ }
512
+ `;
513
+
514
+ // Получаем текущего пользователя через authenticatedItem
515
+ const userQuery = `
516
+ query {
517
+ authenticatedItem {
518
+ ... on User {
519
+ id
520
+ }
521
+ }
522
+ }
523
+ `;
524
+
525
+ const userResult = await graphqlRequest<{
526
+ authenticatedItem: { id: string } | null;
527
+ }>(userQuery);
528
+
529
+ if (!userResult.authenticatedItem) {
530
+ throw new Error('User not authenticated');
531
+ }
532
+
533
+ await graphqlRequest(mutation, {
534
+ where: { id: assetId },
535
+ data: {
536
+ authors: {
537
+ connect: [{ id: userResult.authenticatedItem.id }],
538
+ },
539
+ },
540
+ });
541
+ }
542
+
543
+ /**
544
+ * Очищает манифест от локальных полей перед публикацией
545
+ */
546
+ function cleanManifestForPublish(
547
+ manifest: BuildVersionManifest,
548
+ buildId: string,
549
+ versionNumber: string,
550
+ releaseTime: string,
551
+ ): BuildVersionManifest {
552
+ const cleaned = JSON.parse(JSON.stringify(manifest)); // Глубокое копирование
553
+
554
+ // Устанавливаем id манифеста равным ID сборки (только на бэкенде, локальный не меняем)
555
+ cleaned.id = buildId;
556
+
557
+ // Обновляем _meta
558
+ if (cleaned._meta) {
559
+ // Обновляем UUID на ID сборки (всегда)
560
+ cleaned._meta.uuid = buildId;
561
+
562
+ // Обновляем версию на новую
563
+ cleaned._meta.version = versionNumber;
564
+
565
+ // Обновляем releaseTime на серверное время
566
+ cleaned._meta.releaseTime = releaseTime;
567
+
568
+ // Удаляем локальные настройки (settings)
569
+ if (cleaned._meta.settings) {
570
+ delete cleaned._meta.settings;
571
+ }
572
+
573
+ // Удаляем статистику (stats, playTime и т.д.)
574
+ if (cleaned._meta.stats) {
575
+ delete cleaned._meta.stats;
576
+ }
577
+
578
+ // Удаляем локальные пути и другие локальные данные
579
+ // Но сохраняем важные метаданные: name, description, image, manifest
580
+ }
581
+
582
+ return cleaned;
583
+ }
584
+
585
+ /**
586
+ * Получает список публичных сборок
587
+ */
588
+ export async function getPublicBuilds(options?: {
589
+ take?: number;
590
+ skip?: number;
591
+ orderBy?: Array<{ downloads?: 'asc' | 'desc'; rating?: 'asc' | 'desc' }>;
592
+ where?: {
593
+ minecraftVersion?: string;
594
+ search?: string;
595
+ };
596
+ }): Promise<Build[]> {
597
+ const query = `
598
+ query GetPublicBuilds($where: BuildWhereInput!, $orderBy: [BuildOrderByInput!]!, $take: Int, $skip: Int!) {
599
+ builds(where: $where, orderBy: $orderBy, take: $take, skip: $skip) {
600
+ id
601
+ name
602
+ description
603
+ image
604
+ isPublic
605
+ downloads
606
+ rating
607
+ minecraftVersion
608
+ loader
609
+ author {
610
+ id
611
+ username
612
+ }
613
+ }
614
+ }
615
+ `;
616
+
617
+ const where: any = {
618
+ isPublic: { equals: true },
619
+ };
620
+
621
+ // Поиск по названию или описанию (case-insensitive)
622
+ if (options?.where?.search) {
623
+ where.OR = [
624
+ { name: { contains: options.where.search, mode: 'insensitive' } },
625
+ { description: { contains: options.where.search, mode: 'insensitive' } },
626
+ ];
627
+ }
628
+
629
+ // Фильтр по версии Minecraft (прямо из поля Build)
630
+ if (options?.where?.minecraftVersion) {
631
+ where.minecraftVersion = {
632
+ equals: options.where.minecraftVersion,
633
+ mode: 'insensitive',
634
+ };
635
+ }
636
+
637
+ const orderBy = options?.orderBy || [{ downloads: 'desc' }];
638
+
639
+ const result = await graphqlRequest<{ builds: Build[] }>(query, {
640
+ where,
641
+ orderBy,
642
+ take: options?.take || 20,
643
+ skip: options?.skip || 0,
644
+ });
645
+
646
+ return result.builds;
647
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Конфигурация API
3
+ */
4
+
5
+ /**
6
+ * Получает полный URL GraphQL endpoint из переменных окружения
7
+ * VITE_API_URL должен содержать полный URL до GraphQL (например: http://localhost:3000/api/graphql)
8
+ */
9
+ export function getGraphQLUrl(): string {
10
+ const apiUrl = (import.meta as any).env?.VITE_API_URL as string | undefined;
11
+ if (apiUrl) {
12
+ // Убираем trailing slash если есть
13
+ return apiUrl.endsWith('/') ? apiUrl.slice(0, -1) : apiUrl;
14
+ }
15
+
16
+ // Fallback: используем localhost:3000/api/graphql
17
+ return 'http://localhost:3000/api/graphql';
18
+ }
19
+