@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.
- package/README.md +122 -0
- package/REGISTRIES.md +189 -0
- package/env.d.ts +11 -0
- package/host-shims.d.ts +30 -0
- package/package.json +88 -0
- package/src/extension-marketplace/api-types.ts +141 -0
- package/src/extension-marketplace/client.ts +296 -0
- package/src/extension-marketplace/index.ts +22 -0
- package/src/extension-marketplace/schemas.ts +178 -0
- package/src/extensions/ExtensionRoutePage.vue +17 -0
- package/src/extensions/context.ts +37 -0
- package/src/extensions/disabled-folder.ts +21 -0
- package/src/extensions/extension-expose-map.ts +5 -0
- package/src/extensions/extension-expose.ts +48 -0
- package/src/extensions/graph.ts +67 -0
- package/src/extensions/index.ts +251 -0
- package/src/extensions/invite-handler/types.ts +20 -0
- package/src/extensions/launcher-entities/create-launcher-entity.ts +25 -0
- package/src/extensions/launcher-entities/keys.ts +46 -0
- package/src/extensions/launcher-entities/launcher-entity-components.ts +177 -0
- package/src/extensions/launcher-entities/props-map.ts +69 -0
- package/src/extensions/launcher-entities/registry.ts +32 -0
- package/src/extensions/launcher-models/apis/accounts-contracts.ts +102 -0
- package/src/extensions/launcher-models/apis/launcher-model-apis.ts +553 -0
- package/src/extensions/launcher-models/keys.ts +23 -0
- package/src/extensions/launcher-models/public.ts +9 -0
- package/src/extensions/launcher-models/registry-core.ts +34 -0
- package/src/extensions/manifest-types.ts +22 -0
- package/src/extensions/manifest.ts +46 -0
- package/src/extensions/marketplace-open-key.ts +26 -0
- package/src/extensions/plugin-types.ts +44 -0
- package/src/extensions/plugin.ts +62 -0
- package/src/extensions/registries/bootstrap.ts +11 -0
- package/src/extensions/registries/builtins/account-provider.ts +6 -0
- package/src/extensions/registries/builtins/app-topbar-left-widgets.ts +6 -0
- package/src/extensions/registries/builtins/app-topbar-right-widgets.ts +6 -0
- package/src/extensions/registries/builtins/app-topbar-status-widgets.ts +6 -0
- package/src/extensions/registries/builtins/build-card-actions.ts +6 -0
- package/src/extensions/registries/builtins/build-card-after-meta.ts +6 -0
- package/src/extensions/registries/builtins/build-card-before-media.ts +6 -0
- package/src/extensions/registries/builtins/build-card-before-meta.ts +6 -0
- package/src/extensions/registries/builtins/build-card-footer-actions.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-after-content.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-before-content.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-before-hero.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-header-actions.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-mod-row-actions.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-resourcepack-row-actions.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-right-column-bottom.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-right-column-top.ts +6 -0
- package/src/extensions/registries/builtins/dialog-footer-actions.ts +6 -0
- package/src/extensions/registries/builtins/feed-after-content.ts +6 -0
- package/src/extensions/registries/builtins/feed-before-content.ts +6 -0
- package/src/extensions/registries/builtins/file-editor.ts +19 -0
- package/src/extensions/registries/builtins/friends-after-list.ts +6 -0
- package/src/extensions/registries/builtins/friends-before-list.ts +6 -0
- package/src/extensions/registries/builtins/index.ts +141 -0
- package/src/extensions/registries/builtins/invite-handler.ts +7 -0
- package/src/extensions/registries/builtins/library-after-content.ts +6 -0
- package/src/extensions/registries/builtins/library-before-content.ts +6 -0
- package/src/extensions/registries/builtins/loader.ts +8 -0
- package/src/extensions/registries/builtins/map-card-actions.ts +6 -0
- package/src/extensions/registries/builtins/map-card-after-meta.ts +6 -0
- package/src/extensions/registries/builtins/map-card-before-meta.ts +6 -0
- package/src/extensions/registries/builtins/map-card-footer-actions.ts +6 -0
- package/src/extensions/registries/builtins/map-detail-after-content.ts +6 -0
- package/src/extensions/registries/builtins/map-detail-before-content.ts +6 -0
- package/src/extensions/registries/builtins/map-detail-header-actions.ts +6 -0
- package/src/extensions/registries/builtins/markdown-editor-tiptap-extensions.ts +7 -0
- package/src/extensions/registries/builtins/markdown-editor-toolbar-actions.ts +6 -0
- package/src/extensions/registries/builtins/markdown-renderer-after-content.ts +6 -0
- package/src/extensions/registries/builtins/markdown-renderer-before-content.ts +6 -0
- package/src/extensions/registries/builtins/mod-details-footer-actions.ts +6 -0
- package/src/extensions/registries/builtins/mod-manage-actions.ts +6 -0
- package/src/extensions/registries/builtins/mod-provider.ts +5 -0
- package/src/extensions/registries/builtins/nav.ts +7 -0
- package/src/extensions/registries/builtins/page.ts +13 -0
- package/src/extensions/registries/builtins/projects-after-content.ts +6 -0
- package/src/extensions/registries/builtins/projects-before-content.ts +6 -0
- package/src/extensions/registries/builtins/resourcepack-manage-actions.ts +7 -0
- package/src/extensions/registries/builtins/server-card-actions.ts +6 -0
- package/src/extensions/registries/builtins/server-card-after-meta.ts +6 -0
- package/src/extensions/registries/builtins/server-card-before-meta.ts +6 -0
- package/src/extensions/registries/builtins/server-card-footer-actions.ts +6 -0
- package/src/extensions/registries/builtins/server-detail-after-content.ts +6 -0
- package/src/extensions/registries/builtins/server-detail-before-content.ts +6 -0
- package/src/extensions/registries/builtins/server-detail-header-actions.ts +6 -0
- package/src/extensions/registries/builtins/settings-after-sections.ts +6 -0
- package/src/extensions/registries/builtins/settings-before-sections.ts +6 -0
- package/src/extensions/registries/builtins/settings-section-widgets.ts +6 -0
- package/src/extensions/registries/builtins/shaderpack-manage-actions.ts +7 -0
- package/src/extensions/registries/builtins/shell.ts +5 -0
- package/src/extensions/registries/builtins/sidebar-after-content.ts +6 -0
- package/src/extensions/registries/builtins/sidebar-before-content.ts +6 -0
- package/src/extensions/registries/builtins/sidebar-footer-widgets.ts +6 -0
- package/src/extensions/registries/builtins/sidebar-header-widgets.ts +6 -0
- package/src/extensions/registries/builtins/sidebar.ts +11 -0
- package/src/extensions/registries/builtins/theme.ts +5 -0
- package/src/extensions/registries/builtins/user-card-after-meta.ts +6 -0
- package/src/extensions/registries/builtins/user-card-before-meta.ts +6 -0
- package/src/extensions/registries/builtins/user-menu-actions.ts +6 -0
- package/src/extensions/registries/builtins/user-menu-after-actions.ts +6 -0
- package/src/extensions/registries/builtins/user-menu-before-actions.ts +6 -0
- package/src/extensions/registries/builtins/user-strip.ts +5 -0
- package/src/extensions/registries/clear-extension-ui-registries.ts +15 -0
- package/src/extensions/registries/define-extension-registry.ts +58 -0
- package/src/extensions/registries/extension-host-api.ts +41 -0
- package/src/extensions/registries/extension-registry-api.ts +103 -0
- package/src/extensions/registries/extension-registry-payload-map.ts +9 -0
- package/src/extensions/registries/extension-scope.ts +41 -0
- package/src/extensions/registries/get-registry.ts +23 -0
- package/src/extensions/registries/index.ts +58 -0
- package/src/extensions/registries/manifest-rynt.ts +193 -0
- package/src/extensions/registries/registry-slot.ts +40 -0
- package/src/extensions/registries/registry-value-map.ts +89 -0
- package/src/extensions/registries/store.ts +206 -0
- package/src/extensions/resolve-extensions.ts +245 -0
- package/src/extensions/router-bridge.ts +103 -0
- package/src/extensions/session.ts +6 -0
- package/src/extensions/slug.ts +23 -0
- package/src/extensions/version.ts +147 -0
- package/src/host/extensions-composables.ts +33 -0
- package/src/host/extensions-init.ts +194 -0
- package/src/host/index.ts +11 -0
- package/src/host/launcher-models/index.ts +4 -0
- package/src/index.ts +229 -0
- package/src/minecraft-loader/base-loader.ts +102 -0
- package/src/minecraft-loader/index.ts +11 -0
- package/src/minecraft-loader/loader-registry.ts +72 -0
- package/src/shared/api/assets.ts +112 -0
- package/src/shared/api/auth.ts +283 -0
- package/src/shared/api/builds.ts +647 -0
- package/src/shared/api/config.ts +19 -0
- package/src/shared/api/download-stats.ts +103 -0
- package/src/shared/api/downloads.ts +36 -0
- package/src/shared/api/entity-authorship.ts +60 -0
- package/src/shared/api/events.ts +393 -0
- package/src/shared/api/friends.ts +140 -0
- package/src/shared/api/graphql.ts +87 -0
- package/src/shared/api/index.ts +23 -0
- package/src/shared/api/invites.ts +262 -0
- package/src/shared/api/library.ts +44 -0
- package/src/shared/api/maps.ts +385 -0
- package/src/shared/api/notify-websocket.ts +140 -0
- package/src/shared/api/posts.ts +357 -0
- package/src/shared/api/projectServers.ts +379 -0
- package/src/shared/api/serverMembers.ts +173 -0
- package/src/shared/api/users.ts +294 -0
- package/src/shared/composables/buildEditor/useBuildEditor.ts +66 -0
- package/src/shared/composables/buildManifest/buildManifest.ts +447 -0
- package/src/shared/composables/filesEditor/filesEditor.ts +346 -0
- package/src/shared/composables/index.ts +10 -0
- package/src/shared/composables/modsEditor/modsEditor.ts +1678 -0
- package/src/shared/composables/registrySlot/registry-slot-utils.ts +25 -0
- package/src/shared/composables/registrySlot/useRegistrySlotMissing.ts +35 -0
- package/src/shared/composables/resourcePacksEditor/resourcePacksEditor.ts +448 -0
- package/src/shared/composables/shaderPacksEditor/shaderPacksEditor.ts +395 -0
- package/src/shared/composables/useSkinRender.ts +70 -0
- package/src/shared/composables/useZlDeepLink.ts +178 -0
- package/src/shared/definitions/defineGraphCache.ts +216 -0
- package/src/shared/definitions/defineStore.ts +32 -0
- package/src/shared/definitions/index.ts +2 -0
- package/src/shared/minecraft-types/build-manifest.ts +611 -0
- package/src/shared/minecraft-types/index.ts +3 -0
- package/src/shared/minecraft-types/launcher-versions.ts +32 -0
- package/src/shared/minecraft-types/minecraft-launcher-types.ts +276 -0
- package/src/shared/mocks/index.ts +1 -0
- package/src/shared/mocks/navigation.ts +17 -0
- package/src/shared/mods/http.ts +45 -0
- package/src/shared/mods/index.ts +5 -0
- package/src/shared/mods/marketplace-editor-search.ts +266 -0
- package/src/shared/mods/marketplace-search-utils.ts +42 -0
- package/src/shared/mods/mod-marketplace-registry.ts +66 -0
- package/src/shared/mods/mod-marketplace-types.ts +28 -0
- package/src/shared/mods/providers/curseforge.ts +464 -0
- package/src/shared/mods/providers/index.ts +8 -0
- package/src/shared/mods/providers/modrinth.ts +402 -0
- package/src/shared/mods/resolve-mods-provider-loader-ids.ts +77 -0
- package/src/shared/mods/types.ts +76 -0
- package/src/shared/styles/index.css +713 -0
- package/src/shared/themes/index.ts +23 -0
- package/src/shared/themes/theme-tokens-black.json +126 -0
- package/src/shared/themes/theme-tokens-classic.json +126 -0
- package/src/shared/themes/theme-tokens-pink.json +126 -0
- package/src/shared/themes/theme-tokens.json +126 -0
- package/src/shared/themes/types.ts +85 -0
- package/src/shared/types/API_DOCUMENTATION.md +422 -0
- package/src/shared/types/account.ts +40 -0
- package/src/shared/types/build.ts +8 -0
- package/src/shared/types/entities.ts +181 -0
- package/src/shared/types/index.ts +6 -0
- package/src/shared/types/invite-payloads.ts +60 -0
- package/src/shared/types/navigation.ts +16 -0
- package/src/shared/types/running-build.ts +51 -0
- package/src/shared/types/serverMember.ts +17 -0
- package/src/shared/types/user.ts +55 -0
- package/src/shared/ui/base/Avatar.vue +262 -0
- package/src/shared/ui/base/Badge.vue +47 -0
- package/src/shared/ui/base/Button.vue +78 -0
- package/src/shared/ui/base/Divider.vue +42 -0
- package/src/shared/ui/base/Icon.vue +597 -0
- package/src/shared/ui/base/StatusIndicator.vue +44 -0
- package/src/shared/ui/base/index.ts +7 -0
- package/src/shared/ui/cards/InviteCard.vue +47 -0
- package/src/shared/ui/cards/index.ts +2 -0
- package/src/shared/ui/dialog/Dialog.vue +71 -0
- package/src/shared/ui/dialog/DialogContent.vue +31 -0
- package/src/shared/ui/dialog/DialogFooter.vue +14 -0
- package/src/shared/ui/dialog/DialogHeader.vue +41 -0
- package/src/shared/ui/dialog/index.ts +5 -0
- package/src/shared/ui/editors/AttachmentImagesEditor.vue +133 -0
- package/src/shared/ui/editors/ContentAttachmentsDisplay.vue +76 -0
- package/src/shared/ui/editors/MarkdownEditor.vue +956 -0
- package/src/shared/ui/editors/MarkdownRenderer.vue +299 -0
- package/src/shared/ui/editors/RichContentImageViewer.vue +85 -0
- package/src/shared/ui/editors/SocialPostMediaZone.vue +320 -0
- package/src/shared/ui/editors/index.ts +6 -0
- package/src/shared/ui/editors/markdown-editor-gallery.ts +234 -0
- package/src/shared/ui/editors/markdown-editor-image.ts +178 -0
- package/src/shared/ui/form/Checkbox.vue +38 -0
- package/src/shared/ui/form/FormField.vue +30 -0
- package/src/shared/ui/form/FormGrid.vue +38 -0
- package/src/shared/ui/form/ImageEditor.vue +598 -0
- package/src/shared/ui/form/Input.vue +72 -0
- package/src/shared/ui/form/Range.vue +65 -0
- package/src/shared/ui/form/Select.vue +76 -0
- package/src/shared/ui/form/Switch.vue +38 -0
- package/src/shared/ui/form/Textarea.vue +144 -0
- package/src/shared/ui/form/index.ts +9 -0
- package/src/shared/ui/index.ts +9 -0
- package/src/shared/ui/layout/BusyOverlay.vue +31 -0
- package/src/shared/ui/layout/Callout.vue +44 -0
- package/src/shared/ui/layout/Card.vue +38 -0
- package/src/shared/ui/layout/Container.vue +36 -0
- package/src/shared/ui/layout/EmptyState.vue +99 -0
- package/src/shared/ui/layout/EntityMediaRow.vue +54 -0
- package/src/shared/ui/layout/FilterResultsLayout.vue +22 -0
- package/src/shared/ui/layout/FloatingPanel.vue +37 -0
- package/src/shared/ui/layout/FullscreenDimmer.vue +11 -0
- package/src/shared/ui/layout/Grid.vue +40 -0
- package/src/shared/ui/layout/Inline.vue +59 -0
- package/src/shared/ui/layout/LoadingState.vue +39 -0
- package/src/shared/ui/layout/MediaBox.vue +47 -0
- package/src/shared/ui/layout/OverlayPanel.vue +28 -0
- package/src/shared/ui/layout/OverlayWaitPanel.vue +22 -0
- package/src/shared/ui/layout/PageSection.vue +43 -0
- package/src/shared/ui/layout/PageToolbar.vue +29 -0
- package/src/shared/ui/layout/Panel.vue +39 -0
- package/src/shared/ui/layout/ProgressBar.vue +49 -0
- package/src/shared/ui/layout/Section.vue +30 -0
- package/src/shared/ui/layout/SegmentedControl.vue +43 -0
- package/src/shared/ui/layout/SelectableCard.vue +46 -0
- package/src/shared/ui/layout/SelectableRow.vue +41 -0
- package/src/shared/ui/layout/Skeleton.vue +25 -0
- package/src/shared/ui/layout/SkeletonAvatar.vue +30 -0
- package/src/shared/ui/layout/SkeletonEntityCard.vue +20 -0
- package/src/shared/ui/layout/SkeletonFeedPost.vue +22 -0
- package/src/shared/ui/layout/SkeletonGrid.vue +18 -0
- package/src/shared/ui/layout/SkeletonListRow.vue +31 -0
- package/src/shared/ui/layout/SkeletonText.vue +25 -0
- package/src/shared/ui/layout/Stack.vue +42 -0
- package/src/shared/ui/layout/StateBlock.vue +44 -0
- package/src/shared/ui/layout/TwoPaneLayout.vue +35 -0
- package/src/shared/ui/layout/VirtualList.vue +160 -0
- package/src/shared/ui/layout/index.ts +35 -0
- package/src/shared/ui/layout/skeletonSurfaceStyles.ts +24 -0
- package/src/shared/ui/navigation/NavItem.vue +139 -0
- package/src/shared/ui/navigation/Tab.vue +61 -0
- package/src/shared/ui/navigation/Tabs.vue +37 -0
- package/src/shared/ui/navigation/index.ts +4 -0
- package/src/shared/ui/primitives/Action.vue +19 -0
- package/src/shared/ui/primitives/Block.vue +28 -0
- package/src/shared/ui/primitives/CanvasView.vue +19 -0
- package/src/shared/ui/primitives/Control.vue +24 -0
- package/src/shared/ui/primitives/ControlSelect.vue +19 -0
- package/src/shared/ui/primitives/ControlTextarea.vue +17 -0
- package/src/shared/ui/primitives/FieldLabel.vue +19 -0
- package/src/shared/ui/primitives/Form.vue +19 -0
- package/src/shared/ui/primitives/Heading.vue +29 -0
- package/src/shared/ui/primitives/Image.vue +17 -0
- package/src/shared/ui/primitives/LineBreak.vue +3 -0
- package/src/shared/ui/primitives/Link.vue +19 -0
- package/src/shared/ui/primitives/List.vue +28 -0
- package/src/shared/ui/primitives/ListItem.vue +19 -0
- package/src/shared/ui/primitives/OptionItem.vue +19 -0
- package/src/shared/ui/primitives/Text.vue +28 -0
- package/src/shared/ui/primitives/VideoView.vue +19 -0
- package/src/shared/ui/primitives/index.ts +19 -0
- package/src/shared/ui/primitives/resolveElement.ts +25 -0
- package/src/shared/ui/special/AngularAccent.vue +106 -0
- package/src/shared/ui/special/ExtensionRegistrySlotButton.vue +143 -0
- package/src/shared/ui/special/InfoRow.vue +39 -0
- package/src/shared/ui/special/LogViewer.vue +53 -0
- package/src/shared/ui/special/PageHeader.vue +23 -0
- package/src/shared/ui/special/RegistrySlotMissingCallout.vue +48 -0
- package/src/shared/ui/special/WelcomeCard.vue +32 -0
- package/src/shared/ui/special/index.ts +9 -0
- package/src/shared/utils/app-paths.ts +50 -0
- package/src/shared/utils/attachments.ts +16 -0
- package/src/shared/utils/autostart.ts +213 -0
- package/src/shared/utils/build-files.ts +439 -0
- package/src/shared/utils/build-manifest-init.ts +176 -0
- package/src/shared/utils/cloudinary.ts +67 -0
- package/src/shared/utils/cn.ts +7 -0
- package/src/shared/utils/download-stats-week.ts +165 -0
- package/src/shared/utils/entity-api-to-cache.ts +84 -0
- package/src/shared/utils/entity-build-from-api.ts +1 -0
- package/src/shared/utils/entity-display.ts +27 -0
- package/src/shared/utils/entity-map-from-api.ts +1 -0
- package/src/shared/utils/file-hash.ts +65 -0
- package/src/shared/utils/formatSize.ts +5 -0
- package/src/shared/utils/formatTime.ts +157 -0
- package/src/shared/utils/getAccountSkinRender.ts +32 -0
- package/src/shared/utils/index.ts +34 -0
- package/src/shared/utils/local-mods.ts +678 -0
- package/src/shared/utils/local-settings.ts +217 -0
- package/src/shared/utils/member-join-stats.ts +35 -0
- package/src/shared/utils/platform.ts +86 -0
- package/src/shared/utils/play-host-slug.ts +92 -0
- package/src/shared/utils/rich-content.ts +294 -0
- package/src/shared/utils/safeRequest.ts +23 -0
- package/src/shared/utils/semver.ts +81 -0
- package/src/shared/utils/serverPermissions.ts +155 -0
- package/src/shared/utils/skin-render-cache.ts +372 -0
- package/src/shared/utils/stripMarkdown.ts +45 -0
- package/src/shared/utils/transliterate.ts +74 -0
- package/src/shared/utils/updateAccountSkinRender.ts +64 -0
- package/src/shared/utils/updater.ts +218 -0
- package/src/shared/utils/uploadImage.ts +195 -0
- package/src/shared/utils/user-status.ts +9 -0
- package/src/tiptap/index.ts +7 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import {
|
|
3
|
+
getPlatform,
|
|
4
|
+
getArchitecture,
|
|
5
|
+
getPackageNwPath,
|
|
6
|
+
getExecutablePath,
|
|
7
|
+
} from './platform';
|
|
8
|
+
|
|
9
|
+
// Проверка на наличие Node.js окружения (NW.js)
|
|
10
|
+
const isNodeEnv = typeof window !== 'undefined' && (window as any).nw;
|
|
11
|
+
|
|
12
|
+
let fs: any;
|
|
13
|
+
let path: any;
|
|
14
|
+
let child_process: any;
|
|
15
|
+
let os: any;
|
|
16
|
+
let AdmZip: any;
|
|
17
|
+
|
|
18
|
+
if (isNodeEnv) {
|
|
19
|
+
try {
|
|
20
|
+
const nw = (window as any).nw;
|
|
21
|
+
fs = nw.require('fs');
|
|
22
|
+
path = nw.require('path');
|
|
23
|
+
child_process = nw.require('child_process');
|
|
24
|
+
os = nw.require('os');
|
|
25
|
+
AdmZip = nw.require('adm-zip');
|
|
26
|
+
} catch (error) {
|
|
27
|
+
console.error('Не удалось загрузить Node.js модули:', error);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const VERSION_URL = 'http://repo.rynt.space/version';
|
|
32
|
+
const REPO_BASE_URL = 'https://repo.rynt.space/latest';
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Получить текущую версию приложения
|
|
36
|
+
*/
|
|
37
|
+
export function getCurrentVersion(): string {
|
|
38
|
+
// Версия из package.json через Vite
|
|
39
|
+
return import.meta.env.VITE_PACKAGE_VERSION || '0.0.0';
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Проверить, находимся ли мы в dev режиме
|
|
44
|
+
*/
|
|
45
|
+
export function isDevMode(): boolean {
|
|
46
|
+
console.log(import.meta.env.VITE_PACKAGE_VERSION, import.meta.env.DEV);
|
|
47
|
+
return import.meta.env.DEV === true;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Получить актуальную версию с сервера
|
|
52
|
+
*/
|
|
53
|
+
export async function getLatestVersion(): Promise<string> {
|
|
54
|
+
try {
|
|
55
|
+
const response = await axios.get(VERSION_URL + '?' + Date.now(), {
|
|
56
|
+
timeout: 10000,
|
|
57
|
+
});
|
|
58
|
+
return response.data.trim();
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.error('Ошибка при получении версии с сервера:', error);
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Скачать новый package.nw
|
|
67
|
+
*/
|
|
68
|
+
export async function downloadUpdate(
|
|
69
|
+
onProgress?: (progress: number) => void,
|
|
70
|
+
): Promise<void> {
|
|
71
|
+
if (!isNodeEnv || !fs || !path || !AdmZip) {
|
|
72
|
+
throw new Error('Node.js окружение недоступно');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const platform = getPlatform();
|
|
76
|
+
const arch = getArchitecture();
|
|
77
|
+
const downloadUrl = `${REPO_BASE_URL}/${platform}/packages/${platform}-${arch}.nw`;
|
|
78
|
+
|
|
79
|
+
console.log(`[Updater] Скачивание обновления с ${downloadUrl}`);
|
|
80
|
+
|
|
81
|
+
const execDir = getExecutablePath();
|
|
82
|
+
const downloadDir = execDir || process.cwd();
|
|
83
|
+
|
|
84
|
+
const tempFilePath = path.join(downloadDir, 'package.nw.new');
|
|
85
|
+
const extractTargetDir = process.cwd();
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
// Загружаем FileDownloader через nw.require
|
|
89
|
+
const nw = (window as any).nw;
|
|
90
|
+
const FileDownloader = nw.require('nodejs-file-downloader');
|
|
91
|
+
|
|
92
|
+
// Скачиваем файл во временный файл
|
|
93
|
+
const downloader = new FileDownloader({
|
|
94
|
+
url: downloadUrl,
|
|
95
|
+
directory: downloadDir,
|
|
96
|
+
fileName: 'package.nw.new',
|
|
97
|
+
onProgress: (percentage: string | number) => {
|
|
98
|
+
const progress =
|
|
99
|
+
typeof percentage === 'string' ? parseFloat(percentage) : percentage;
|
|
100
|
+
if (onProgress) {
|
|
101
|
+
onProgress(progress);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
await downloader.download();
|
|
107
|
+
console.log('[Updater] Файл успешно скачан');
|
|
108
|
+
|
|
109
|
+
// Проверяем, что файл существует
|
|
110
|
+
if (!fs.existsSync(tempFilePath)) {
|
|
111
|
+
throw new Error('Скачанный файл не найден');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
console.log(
|
|
115
|
+
`[Updater] Распаковка обновления в ${extractTargetDir} (overwrite без очистки)`,
|
|
116
|
+
);
|
|
117
|
+
extractArchiveWithOverwrite(tempFilePath, extractTargetDir);
|
|
118
|
+
|
|
119
|
+
// Постоянное обновление: package.nw рядом с exe (переживает полный перезапуск).
|
|
120
|
+
const packageNwPath = getPackageNwPath();
|
|
121
|
+
if (packageNwPath && downloadDir) {
|
|
122
|
+
if (fs.existsSync(packageNwPath)) {
|
|
123
|
+
console.log('[Updater] Удаление старого package.nw');
|
|
124
|
+
fs.unlinkSync(packageNwPath);
|
|
125
|
+
}
|
|
126
|
+
console.log('[Updater] Сохранение нового package.nw рядом с исполняемым файлом');
|
|
127
|
+
fs.renameSync(tempFilePath, packageNwPath);
|
|
128
|
+
} else if (fs.existsSync(tempFilePath)) {
|
|
129
|
+
fs.unlinkSync(tempFilePath);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
console.log('[Updater] Обновление успешно установлено');
|
|
133
|
+
} catch (error) {
|
|
134
|
+
if (fs.existsSync(tempFilePath)) {
|
|
135
|
+
try {
|
|
136
|
+
fs.unlinkSync(tempFilePath);
|
|
137
|
+
} catch (e) {
|
|
138
|
+
console.error('[Updater] Ошибка при удалении временного файла:', e);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function extractArchiveWithOverwrite(
|
|
146
|
+
archivePath: string,
|
|
147
|
+
targetDir: string,
|
|
148
|
+
): void {
|
|
149
|
+
if (!fs.existsSync(targetDir)) {
|
|
150
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
151
|
+
}
|
|
152
|
+
const zip = new AdmZip(archivePath);
|
|
153
|
+
zip.extractAllTo(targetDir, true);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Перезапустить приложение
|
|
158
|
+
*/
|
|
159
|
+
export function restartApplication(): void {
|
|
160
|
+
if (!isNodeEnv || !child_process || !path || !os) {
|
|
161
|
+
throw new Error('Node.js окружение недоступно');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const execPath = process.execPath;
|
|
165
|
+
const execDir = path.dirname(execPath);
|
|
166
|
+
const platform = os.platform();
|
|
167
|
+
|
|
168
|
+
console.log('[Updater] Перезапуск приложения...');
|
|
169
|
+
|
|
170
|
+
// Создаем скрипт для перезапуска
|
|
171
|
+
let restartScript: string;
|
|
172
|
+
let restartCommand: string;
|
|
173
|
+
|
|
174
|
+
if (platform === 'win32') {
|
|
175
|
+
// Windows: создаем bat-файл
|
|
176
|
+
restartScript = path.join(execDir, 'restart.bat');
|
|
177
|
+
const batContent = `@echo off
|
|
178
|
+
timeout /t 1 /nobreak >nul
|
|
179
|
+
start "" "${execPath}"
|
|
180
|
+
`;
|
|
181
|
+
fs.writeFileSync(restartScript, batContent);
|
|
182
|
+
restartCommand = restartScript;
|
|
183
|
+
} else if (platform === 'darwin') {
|
|
184
|
+
// macOS: создаем shell-скрипт
|
|
185
|
+
restartScript = path.join(execDir, 'restart.sh');
|
|
186
|
+
const shContent = `#!/bin/bash
|
|
187
|
+
sleep 3
|
|
188
|
+
open "${execPath}"
|
|
189
|
+
`;
|
|
190
|
+
fs.writeFileSync(restartScript, shContent);
|
|
191
|
+
fs.chmodSync(restartScript, '755');
|
|
192
|
+
restartCommand = restartScript;
|
|
193
|
+
} else {
|
|
194
|
+
// Linux: создаем shell-скрипт
|
|
195
|
+
restartScript = path.join(execDir, 'restart.sh');
|
|
196
|
+
const shContent = `#!/bin/bash
|
|
197
|
+
sleep 3
|
|
198
|
+
"${execPath}" &
|
|
199
|
+
`;
|
|
200
|
+
fs.writeFileSync(restartScript, shContent);
|
|
201
|
+
fs.chmodSync(restartScript, '755');
|
|
202
|
+
restartCommand = restartScript;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Запускаем скрипт перезапуска в отдельном процессе
|
|
206
|
+
const restartProcess = child_process.spawn(restartCommand, [], {
|
|
207
|
+
detached: true,
|
|
208
|
+
stdio: 'ignore',
|
|
209
|
+
shell: platform === 'win32',
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
restartProcess.unref();
|
|
213
|
+
|
|
214
|
+
// Закрываем текущее приложение
|
|
215
|
+
if ((window as any).nw) {
|
|
216
|
+
(window as any).nw.App.quit();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
interface UploadImageOptions {
|
|
2
|
+
folder?: string;
|
|
3
|
+
maxWidth?: number;
|
|
4
|
+
maxHeight?: number;
|
|
5
|
+
quality?: number;
|
|
6
|
+
/** Максимальный размер файла в байтах (по умолчанию 5 MB). */
|
|
7
|
+
maxSizeBytes?: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface UploadImageResult {
|
|
11
|
+
url: string;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
size: number;
|
|
15
|
+
originalName?: string;
|
|
16
|
+
mimeType?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function compressImage(
|
|
20
|
+
file: File,
|
|
21
|
+
maxWidth: number,
|
|
22
|
+
maxHeight: number,
|
|
23
|
+
quality: number = 0.85
|
|
24
|
+
): Promise<Blob> {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
const reader = new FileReader();
|
|
27
|
+
reader.onload = (e) => {
|
|
28
|
+
const img = new Image();
|
|
29
|
+
img.onload = () => {
|
|
30
|
+
let width = img.width;
|
|
31
|
+
let height = img.height;
|
|
32
|
+
|
|
33
|
+
if (width > maxWidth || height > maxHeight) {
|
|
34
|
+
const ratio = Math.min(maxWidth / width, maxHeight / height);
|
|
35
|
+
width = Math.round(width * ratio);
|
|
36
|
+
height = Math.round(height * ratio);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const canvas = document.createElement('canvas');
|
|
40
|
+
canvas.width = width;
|
|
41
|
+
canvas.height = height;
|
|
42
|
+
const ctx = canvas.getContext('2d');
|
|
43
|
+
|
|
44
|
+
if (!ctx) {
|
|
45
|
+
reject(new Error('Не удалось создать canvas context'));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
ctx.drawImage(img, 0, 0, width, height);
|
|
50
|
+
|
|
51
|
+
canvas.toBlob(
|
|
52
|
+
(blob) => {
|
|
53
|
+
if (blob) {
|
|
54
|
+
resolve(blob);
|
|
55
|
+
} else {
|
|
56
|
+
reject(new Error('Не удалось сжать изображение'));
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
file.type.startsWith('image/png') ? 'image/png' : 'image/jpeg',
|
|
60
|
+
quality
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
img.onerror = () => reject(new Error('Ошибка загрузки изображения'));
|
|
64
|
+
img.src = e.target?.result as string;
|
|
65
|
+
};
|
|
66
|
+
reader.onerror = () => reject(new Error('Ошибка чтения файла'));
|
|
67
|
+
reader.readAsDataURL(file);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function getImageDimensions(file: File): Promise<{ width: number; height: number }> {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
const reader = new FileReader();
|
|
74
|
+
reader.onload = (e) => {
|
|
75
|
+
const img = new Image();
|
|
76
|
+
img.onload = () => {
|
|
77
|
+
resolve({ width: img.width, height: img.height });
|
|
78
|
+
};
|
|
79
|
+
img.onerror = () => reject(new Error('Ошибка загрузки изображения'));
|
|
80
|
+
img.src = e.target?.result as string;
|
|
81
|
+
};
|
|
82
|
+
reader.onerror = () => reject(new Error('Ошибка чтения файла'));
|
|
83
|
+
reader.readAsDataURL(file);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function uploadToCloudinary(
|
|
88
|
+
blob: Blob,
|
|
89
|
+
options: UploadImageOptions = {}
|
|
90
|
+
): Promise<UploadImageResult> {
|
|
91
|
+
const CLOUDINARY_URL = (import.meta as any).env?.VITE_CLOUDINARY_URL as string | undefined;
|
|
92
|
+
const CLOUDINARY_CLOUD_NAME = (import.meta as any).env?.VITE_CLOUDINARY_CLOUD_NAME as string | undefined;
|
|
93
|
+
const CLOUDINARY_UPLOAD_PRESET = (import.meta as any).env?.VITE_CLOUDINARY_UPLOAD_PRESET as string | undefined;
|
|
94
|
+
|
|
95
|
+
const parseCloudinaryUrl = (url: string): string | null => {
|
|
96
|
+
try {
|
|
97
|
+
const match = url.match(/cloudinary:\/\/[^:]+:[^@]+@(.+)/);
|
|
98
|
+
return match ? match[1] : null;
|
|
99
|
+
} catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const cloudName = CLOUDINARY_CLOUD_NAME || (CLOUDINARY_URL ? parseCloudinaryUrl(CLOUDINARY_URL) : null);
|
|
105
|
+
|
|
106
|
+
if (!cloudName) {
|
|
107
|
+
throw new Error('Cloudinary Cloud Name не настроен. Установите VITE_CLOUDINARY_CLOUD_NAME или VITE_CLOUDINARY_URL');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (!CLOUDINARY_UPLOAD_PRESET) {
|
|
111
|
+
throw new Error('Cloudinary Upload Preset не настроен. Установите VITE_CLOUDINARY_UPLOAD_PRESET');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const formData = new FormData();
|
|
115
|
+
formData.append('file', blob);
|
|
116
|
+
formData.append('upload_preset', CLOUDINARY_UPLOAD_PRESET);
|
|
117
|
+
|
|
118
|
+
if (options.folder) {
|
|
119
|
+
formData.append('folder', options.folder);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const response = await fetch(
|
|
123
|
+
`https://api.cloudinary.com/v1_1/${cloudName}/image/upload`,
|
|
124
|
+
{
|
|
125
|
+
method: 'POST',
|
|
126
|
+
body: formData,
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
if (!response.ok) {
|
|
131
|
+
const errorData = await response.json().catch(() => ({}));
|
|
132
|
+
throw new Error(errorData?.error?.message || `Ошибка загрузки: ${response.statusText}`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const data = await response.json();
|
|
136
|
+
const url = data.secure_url || data.url;
|
|
137
|
+
|
|
138
|
+
if (!url) {
|
|
139
|
+
throw new Error('Не удалось получить ссылку на изображение');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
url,
|
|
144
|
+
width: data.width || 0,
|
|
145
|
+
height: data.height || 0,
|
|
146
|
+
size: data.bytes || blob.size,
|
|
147
|
+
mimeType: data.format ? `image/${data.format}` : undefined,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export async function uploadImage(
|
|
152
|
+
file: File,
|
|
153
|
+
options: UploadImageOptions = {}
|
|
154
|
+
): Promise<UploadImageResult> {
|
|
155
|
+
const maxWidth = options.maxWidth || 1280;
|
|
156
|
+
const maxHeight = options.maxHeight || 1280;
|
|
157
|
+
const quality = options.quality || 0.85;
|
|
158
|
+
|
|
159
|
+
if (!file.type.startsWith('image/')) {
|
|
160
|
+
throw new Error('Файл должен быть изображением');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const maxSizeBytes = options.maxSizeBytes ?? 5 * 1024 * 1024;
|
|
164
|
+
if (file.size > maxSizeBytes) {
|
|
165
|
+
throw new Error(
|
|
166
|
+
`Размер файла не должен превышать ${Math.round(maxSizeBytes / (1024 * 1024))}MB`,
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const originalDimensions = await getImageDimensions(file);
|
|
171
|
+
|
|
172
|
+
const isGif = file.type === 'image/gif';
|
|
173
|
+
let blobToUpload: Blob;
|
|
174
|
+
let finalWidth = originalDimensions.width;
|
|
175
|
+
let finalHeight = originalDimensions.height;
|
|
176
|
+
|
|
177
|
+
if (isGif) {
|
|
178
|
+
blobToUpload = file;
|
|
179
|
+
} else {
|
|
180
|
+
blobToUpload = await compressImage(file, maxWidth, maxHeight, quality);
|
|
181
|
+
const compressedDimensions = await getImageDimensions(new File([blobToUpload], file.name, { type: blobToUpload.type }));
|
|
182
|
+
finalWidth = compressedDimensions.width;
|
|
183
|
+
finalHeight = compressedDimensions.height;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const result = await uploadToCloudinary(blobToUpload, options);
|
|
187
|
+
|
|
188
|
+
return {
|
|
189
|
+
...result,
|
|
190
|
+
width: result.width || finalWidth,
|
|
191
|
+
height: result.height || finalHeight,
|
|
192
|
+
originalName: file.name,
|
|
193
|
+
mimeType: file.type,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { UserStatusDetail } from '../types/user';
|
|
2
|
+
|
|
3
|
+
/** Друг или пользователь публикует локальный мир («Для друзей»). */
|
|
4
|
+
export function isSharingLocalGame(
|
|
5
|
+
statusDetail: UserStatusDetail | null | undefined,
|
|
6
|
+
): boolean {
|
|
7
|
+
if (!statusDetail || statusDetail.type !== 'build') return false;
|
|
8
|
+
return Boolean(statusDetail.shareForFriends && statusDetail.localServer);
|
|
9
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Типы и API ядра TipTap для авторов расширений (dev).
|
|
3
|
+
* Регистрируйте в редактор объекты из своих `@tiptap/extension-*` (они в бандле расширения).
|
|
4
|
+
* Ядро `@tiptap/core` при сборке расширения подменяется host-shim — тот же инстанс, что у MarkdownEditor.
|
|
5
|
+
*/
|
|
6
|
+
export type { AnyExtension, Editor, Extension, Mark, Node } from '@tiptap/core';
|
|
7
|
+
export { Extension } from '@tiptap/core';
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"noEmit": true,
|
|
5
|
+
"composite": false,
|
|
6
|
+
"types": ["node"],
|
|
7
|
+
"skipLibCheck": true
|
|
8
|
+
},
|
|
9
|
+
"include": ["env.d.ts", "host-shims.d.ts", "src/**/*.ts", "src/**/*.vue"],
|
|
10
|
+
"vueCompilerOptions": {
|
|
11
|
+
"strictTemplates": false
|
|
12
|
+
}
|
|
13
|
+
}
|