Skip to content

Commit 4c2db6c

Browse files
committed
Drop ThunderstoreVersion references from ThunderstoreMod
Commonly used version-specific data - latest version number, icon and description are now stored in the ThunderstoreMod object. Rest of the version info needs to be fetched separately where it's actually used. This change drastically reduces memory usage for larger communities like Lethal Company.
1 parent 598486f commit 4c2db6c

File tree

6 files changed

+24
-39
lines changed

6 files changed

+24
-39
lines changed

src/components/views/DownloadModModal.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
<ul class="list">
7878
<li class="list-item" v-for='(mod, index) in $store.getters["profile/modsWithUpdates"]'
7979
:key='`to-update-${index}-${mod.getFullName()}`'>
80-
{{mod.getName()}} will be updated to: {{mod.getLatestVersion().getVersionNumber().toString()}}
80+
{{mod.getName()}} will be updated to: {{mod.getLatestVersion()}}
8181
</li>
8282
</ul>
8383
</template>
@@ -223,7 +223,7 @@ let assignId = 0;
223223
async getModVersions() {
224224
this.currentVersion = null;
225225
if (this.thunderstoreMod !== null) {
226-
this.selectedVersion = this.thunderstoreMod.getLatestVersion().getVersionNumber().toString();
226+
this.selectedVersion = this.thunderstoreMod.getLatestVersion();
227227
this.recommendedVersion = null;
228228
229229
this.versionNumbers = await PackageDb.getPackageVersionNumbers(

src/components/views/OnlineModList.vue

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
v-for='(key, index) in pagedModList' :key="`online-${key.getFullName()}-${index}-${settings.getContext().global.expandedCards}`"
55
:image="getImageUrl(key)"
66
:id="index"
7-
:description="key.getLatestVersion().getDescription()">
7+
:description="key.getDescription()">
88
<template v-slot:title>
99
<span v-if="key.isPinned()">
1010
<span class="tag is-info margin-right margin-right--half-width"
@@ -121,9 +121,7 @@ export default class OnlineModList extends Vue {
121121
}
122122
123123
getImageUrl(mod: ThunderstoreMod): string {
124-
return CdnProvider.replaceCdnHost(
125-
mod.getLatestVersion().getIcon()
126-
);
124+
return CdnProvider.replaceCdnHost(mod.getIcon());
127125
}
128126
129127
async created() {

src/components/views/OnlineModView.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export default class OnlineModView extends Vue {
147147
const searchKeys = SearchUtils.makeKeys(this.thunderstoreSearchFilter);
148148
if (searchKeys.length > 0) {
149149
searchableList = this.sortedThunderstoreModList.filter((x: ThunderstoreMod) => {
150-
return SearchUtils.isSearched(searchKeys, x.getFullName(), x.getLatestVersion().getDescription())
150+
return SearchUtils.isSearched(searchKeys, x.getFullName(), x.getDescription())
151151
});
152152
}
153153
if (!allowNsfw) {

src/model/ThunderstoreMod.ts

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import ThunderstoreVersion from './ThunderstoreVersion';
22

33
export default class ThunderstoreMod extends ThunderstoreVersion {
4-
private versions: ThunderstoreVersion[] = [];
54
private rating: number = 0;
65
private owner: string = '';
76
private packageUrl: string = '';
@@ -14,6 +13,7 @@ export default class ThunderstoreMod extends ThunderstoreVersion {
1413
private categories: string[] = [];
1514
private hasNsfwContent: boolean = false;
1615
private donationLink: string | undefined;
16+
private latestVersion: string = '';
1717

1818
public static parseFromThunderstoreData(data: any): ThunderstoreMod {
1919
const mod = new ThunderstoreMod();
@@ -24,43 +24,33 @@ export default class ThunderstoreMod extends ThunderstoreVersion {
2424
mod.setDateUpdated(data.date_updated);
2525
mod.setDeprecatedStatus(data.is_deprecated);
2626
mod.setPinnedStatus(data.is_pinned);
27-
const versions = [];
28-
for (const version of data.versions) {
29-
versions.push(new ThunderstoreVersion().make(version));
30-
}
31-
mod.setVersions(versions);
32-
mod.setDownloadCount(
33-
mod.versions
34-
.map(version => version.getDownloadCount())
35-
.reduce((x, y) => x + y)
36-
);
3727
mod.setRating(data.rating_score);
3828
mod.setTotalDownloads(
39-
mod.getVersions()
40-
.map(x => x.getDownloadCount())
41-
.reduce((x, y) => x + y)
29+
data.versions.reduce(
30+
(x: number, y: {downloads: number}) => x + y.downloads,
31+
0
32+
)
4233
);
4334
mod.setPackageUrl(data.package_url);
4435
mod.setCategories(data.categories);
4536
mod.setNsfwFlag(data.has_nsfw_content);
4637
mod.setDonationLink(data.donation_link);
38+
mod.setLatestVersion(data.versions[0].version_number);
39+
mod.setDescription(data.versions[0].description);
40+
mod.setIcon(data.versions[0].icon);
4741
return mod;
4842
}
4943

50-
public getVersions(): ThunderstoreVersion[] {
51-
return this.versions;
52-
}
53-
54-
public setVersions(versions: ThunderstoreVersion[]) {
55-
this.versions = versions;
44+
public getLatestVersion(): string {
45+
return this.latestVersion;
5646
}
5747

58-
public getLatestVersion(): ThunderstoreVersion {
59-
return this.getVersions().reduce(reduceToNewestVersion);
48+
public setLatestVersion(versionNumber: string) {
49+
this.latestVersion = versionNumber;
6050
}
6151

6252
public getLatestDependencyString(): string {
63-
return `${this.getFullName()}-${this.getLatestVersion().toString()}`;
53+
return `${this.getFullName()}-${this.getLatestVersion()}`;
6454
}
6555

6656
public getRating(): number {
@@ -159,7 +149,3 @@ export default class ThunderstoreMod extends ThunderstoreVersion {
159149
this.donationLink = url;
160150
}
161151
}
162-
163-
function reduceToNewestVersion(v1: ThunderstoreVersion, v2: ThunderstoreVersion) {
164-
return v1.getVersionNumber().isNewerThan(v2.getVersionNumber()) ? v1 : v2;
165-
};

src/store/modules/TsModsModule.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { ActionTree, GetterTree, MutationTree } from 'vuex';
33
import { State as RootState } from '../index';
44
import ManifestV2 from '../../model/ManifestV2';
55
import ThunderstoreMod from '../../model/ThunderstoreMod';
6+
import VersionNumber from '../../model/VersionNumber';
67
import CdnProvider from '../../providers/generic/connection/CdnProvider';
78
import ConnectionProvider from '../../providers/generic/connection/ConnectionProvider';
89
import * as PackageDb from '../../r2mm/manager/PackageDexieStore';
@@ -80,7 +81,7 @@ export const TsModsModule = {
8081
if (tsMod === undefined) {
8182
state.cache.set(cacheKey, {tsMod: undefined, isLatest: true});
8283
} else {
83-
const latestVersionNumber = tsMod.getLatestVersion().getVersionNumber();
84+
const latestVersionNumber = new VersionNumber(tsMod.getLatestVersion());
8485
const isLatest = mod.getVersionNumber().isEqualOrNewerThan(latestVersionNumber);
8586
state.cache.set(cacheKey, {tsMod, isLatest});
8687
}

test/jest/__tests__/utils/utils.getDeprecatedPackageMap.ts.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,10 @@ const createStubMod = (
227227
mod.setFullName(modName);
228228
mod.setDeprecatedStatus(deprecated);
229229

230-
const version = new ThunderstoreVersion();
231-
version.setFullName(`${mod}-1.0.0`);
232-
version.setDependencies(dependencyNames.map((depName) => `${depName}-1.0.0`));
233-
mod.setVersions([version]);
230+
// const version = new ThunderstoreVersion();
231+
// version.setFullName(`${mod}-1.0.0`);
232+
// version.setDependencies(dependencyNames.map((depName) => `${depName}-1.0.0`));
233+
// mod.setVersions([version]);
234234

235235
return mod;
236236
}

0 commit comments

Comments
 (0)