diff --git a/apps/frontend/src/components/ui/moderation/NewModerationChecklist.vue b/apps/frontend/src/components/ui/moderation/NewModerationChecklist.vue index 1b1d0fb6d..2126091ad 100644 --- a/apps/frontend/src/components/ui/moderation/NewModerationChecklist.vue +++ b/apps/frontend/src/components/ui/moderation/NewModerationChecklist.vue @@ -464,7 +464,7 @@ const stageTextExpanded = computedAsync(async () => { const stage = checklist[stageIndex]; if (stage.text) { return renderHighlightedString( - expandVariables(await stage.text(), props.project, variables.value), + expandVariables(await stage.text(props.project), props.project, variables.value), ); } return null; @@ -980,6 +980,18 @@ async function processAction( } function shouldShowStage(stage: Stage): boolean { + let hasVisibleActions = false; + + for (const a of stage.actions) { + if (shouldShowAction(a)) { + hasVisibleActions = true; + } + } + + if (!hasVisibleActions) { + return false; + } + if (typeof stage.shouldShow === "function") { return stage.shouldShow(props.project); } diff --git a/apps/frontend/src/public/news/feed/articles.json b/apps/frontend/src/public/news/feed/articles.json index 4bd02e90b..2ec116ca1 100644 --- a/apps/frontend/src/public/news/feed/articles.json +++ b/apps/frontend/src/public/news/feed/articles.json @@ -98,13 +98,6 @@ "date": "2023-02-01T20:00:00.000Z", "link": "https://modrinth.com/news/article/accelerating-development" }, - { - "title": "Two years of Modrinth: a retrospective", - "summary": "The history of Modrinth as we know it from December 2020 to December 2022.", - "thumbnail": "https://modrinth.com/news/default.webp", - "date": "2023-01-07T00:00:00.000Z", - "link": "https://modrinth.com/news/article/two-years-of-modrinth-history" - }, { "title": "Modrinth's Anniversary Update", "summary": "Marking two years of Modrinth and discussing our New Year's Resolutions for 2023.", @@ -112,6 +105,13 @@ "date": "2023-01-07T00:00:00.000Z", "link": "https://modrinth.com/news/article/two-years-of-modrinth" }, + { + "title": "Two years of Modrinth: a retrospective", + "summary": "The history of Modrinth as we know it from December 2020 to December 2022.", + "thumbnail": "https://modrinth.com/news/default.webp", + "date": "2023-01-07T00:00:00.000Z", + "link": "https://modrinth.com/news/article/two-years-of-modrinth-history" + }, { "title": "Creators can now make money on Modrinth!", "summary": "Introducing the Creator Monetization Program allowing creators to earn revenue from their projects.", diff --git a/apps/frontend/src/public/news/feed/rss.xml b/apps/frontend/src/public/news/feed/rss.xml index 8a47c2382..c915b6244 100644 --- a/apps/frontend/src/public/news/feed/rss.xml +++ b/apps/frontend/src/public/news/feed/rss.xml @@ -4,7 +4,7 @@ https://modrinth.com/news/ @modrinth/blog - Sat, 05 Jul 2025 21:04:25 GMT + Tue, 15 Jul 2025 12:02:34 GMT @@ -12,7 +12,7 @@ https://modrinth.com/news/article/skins-now-in-modrinth-app/ https://modrinth.com/news/article/skins-now-in-modrinth-app/ - Sat, 05 Jul 2025 19:19:00 GMT + Sun, 06 Jul 2025 23:45:00 GMT <![CDATA[<p>We're thrilled to roll out Modrinth App <strong>v0.10</strong> with a beta release of one of our most highly requested features, the <strong>Skins page</strong>. The Skins page allows you to manage all of your Minecraft skins directly within Modrinth App. You can see all your saved custom skins and the default Minecraft skins in one convenient place.</p><p><img src="./skins-page.webp" alt="The new skins page, featuring a cute animated player model, your custom skins &amp; default skins."></p><p>Adding a new skin is simple, even Herobrine could do it! When you add or edit a skin, you can <strong>upload</strong> your custom texture file directly from your computer, <strong>choose</strong> between the wide or slim arm style to match your preferred character model, and even <strong>assign</strong> a specific cape to that look for the perfect finishing touch.</p><p>The interface makes it easy to preview your changes in real-time with the animated player model, so you can see exactly how your skin will look in-game before saving it.</p><p><img src="./edit-skin.webp" alt="The edit skin modal that shows when you go to add or edit a skin."></p><h2>Fixes and More!</h2><p>Alongside this major new feature, <strong>v0.10</strong> includes a host of improvements and bug fixes to make your experience smoother. We've updated the news feed to use our new system, fixed issues with project descriptions, and tidied up how data is handled. For a full breakdown of all the changes, you can <a href="https://modrinth.com/news/changelog?filter=app">check out the complete changelog here.</a></p><p>As the skins feature is in <em>beta</em>, we're eager to hear your feedback! <strong>Jump in, give it a try</strong>, and let us know what you think. You can share your thoughts on our <a href="https://discord.modrinth.com/" rel="noopener nofollow ugc">Discord server</a> or <a href="https://support.modrinth.com" rel="noopener nofollow ugc">start a support chat</a> if you're running into issues.</p><p>Thank you! We can't wait to see your skins in action. Happy customizing!</p>]]> @@ -25,7 +25,7 @@ <![CDATA[A Pride Month Success: Over $8,400 Raised for The Trevor Project!]]> - + https://modrinth.com/news/article/pride-campaign-2025/ https://modrinth.com/news/article/pride-campaign-2025/ Tue, 01 Jul 2025 18:00:00 GMT @@ -119,14 +119,6 @@ Wed, 01 Feb 2023 20:00:00 GMT <![CDATA[<p><strong>Update: On <a href="/news/article/capital-return" rel="noopener nofollow ugc">April 4, 2024</a> we announced that we had returned the remaining $800k in investor capital back to our investors to take a different path. <a href="/news/article/capital-return" rel="noopener nofollow ugc">Read that announcement here</a>. This article remains here for archival purposes.</strong></p><hr><p>There are over 3 billion gamers worldwide, but only a small fraction ever go further and mod the games they play. Modrinth is here to bring modding to every player on the planet—all the while allowing mod creators to make a living off of it.</p><p>Since our founding in 2020 and up until a few months ago, Modrinth has been a purely volunteer project. In the past couple months, the Modrinth team has been more productive than ever. We've released the <a href="../two-years-of-modrinth" rel="noopener nofollow ugc">Anniversary Update</a>, we're actively working on the launcher once more, and we're laying out plans for how to multiply Modrinth creator payouts.</p><p>The vision we have for the future of Modrinth is great, and right alongside that is the need for an amazing team to build out this vision. That's why we <a href="https://x.com/modrinth/status/1615416957905342472" rel="noopener nofollow ugc">recently announced</a> that <a href="https://careers.modrinth.com" rel="noopener nofollow ugc">we're hiring</a>—we've already come so far on just volunteer work, but for Modrinth to be sustainable and for its growth to be sustainable, we need to pick up the pace.</p><p>That's why we're excited to announce that we've raised a pre-seed round of funding led by <a href="https://www.makersfund.com/" rel="noopener nofollow ugc">Makers Fund</a>, with investors including <a href="https://x.com/ryanmjohnson" rel="noopener nofollow ugc">Ryan Johnson</a>, <a href="https://x.com/sthenc" rel="noopener nofollow ugc">Stephen Cole</a>, <a href="https://x.com/PimDeWitte" rel="noopener nofollow ugc">Pim de Witte</a>, <a href="https://www.linkedin.com/in/leechris1/" rel="noopener nofollow ugc">Chris Lee</a>, and <a href="https://x.com/andreas" rel="noopener nofollow ugc">Andreas Thorstensson</a> to accelerate development and expand to new horizons for Modrinth.</p><h2>What's next?</h2><p>We're thrilled to keep on building and iterating on Modrinth over the next few years. Here's a look into what we have in store over the next few months for Modrinth:</p><ul><li>A feature-packed launcher</li><li>Creator organizations (like GitHub), wikis, graphs (with playtime, views, downloads, etc)</li><li>More creator payouts, through the growth of Adrinth</li><li>Discovery/recommendation of mods (especially up-and-coming content)</li><li>Comments (with built-in moderation and spam protection)</li><li>[Redacted]</li></ul><p>Support for new games!</p><p>We are excited that we are able to build a product that will manage to grow us to sustainability and create the best modding experience for creators and users. Being able to pay ourselves and bring on new people is a big step in making that happen. There is still a lot to do, so let's get to it!</p><h2>Q&amp;A:</h2><p>We know there might be some concerns so we included a short Q&amp;A section below for some common ones. Feel free to ask in our <a href="https://discord.modrinth.com" rel="noopener nofollow ugc">Discord</a> if you have any more questions!</p><h3>Why does Modrinth need funding?</h3><p>Our main expense is and will continue to be salaries. The labor cost has always been the main bottleneck for Modrinth. Having paid employees will allow us to develop Modrinth faster, bringing Modrinth to a point of sustainability and growing the platform. For example, we're planning to release our launcher this year, and eventually we're hoping to expand into more games. Those won't be possible without having paid employees.</p><h3>Is Modrinth still community-first?</h3><p>We started and always will have the goal of creating a community-oriented, open-source modding platform. Simply put, there isn't any reason for us not to be. It's clear that the previous impersonal, corporate approaches to video game modding have not worked, and Modrinth is excited to change that.</p><h3>Will Modrinth still be open-source?</h3><p>Yes! We are committed to having all (when possible) our current code and future code we write to be open-source. Copyright is held by the contributors as we have no <a href="https://en.wikipedia.org/wiki/Contributor_License_Agreement" rel="noopener nofollow ugc">CLA</a>, so we cannot make it closed-source (even if we wanted to) without, well, violating the law.</p><h3>Who's behind Modrinth?</h3><p>The Modrinth team (currently consisting of Prospector, Emma, and Geometrically) is behind Modrinth. We've been modding Minecraft for years, with connections extending back to grade school. Investors have a minority stake in the company, and have no control or say in our decisions.</p><h3>Is Modrinth going to adopt web3/cryptocurrency?</h3><p>No. We have no plans to adopt or explore web3 for Modrinth.</p><h3>Will investment money be used to fund creator payouts?</h3><p>Not directly. Hiring more people will allow us to build up the infrastructure that can increase payouts, but the money we pay out to creators will always come from sustainable sources such as advertising and never from investment funds.</p>]]> - - <![CDATA[Two years of Modrinth: a retrospective]]> - - https://modrinth.com/news/article/two-years-of-modrinth-history/ - https://modrinth.com/news/article/two-years-of-modrinth-history/ - Sat, 07 Jan 2023 00:00:00 GMT - <![CDATA[<p>Let's rewind a bit and take a look at the past two years of Modrinth's history. We've come so far from our pre-beta HexFabric days to today. A good portion of our pre-beta history can be found in the <a href="../what-is-modrinth" rel="noopener nofollow ugc">What is Modrinth</a> blog post, but Modrinth obviously is not the same platform it was two years ago.</p><h2>December 2020: Modrinth Beta begins</h2><p><img src="../modrinth-beta/new-design.jpg" alt="Modrinth's brand new design, rolling out with the launch of Beta"></p><blockquote><p>Modrinth's brand new design, rolling out with the launch of Beta</p></blockquote><p>December was the release of the initial <a href="../modrinth-beta" rel="noopener nofollow ugc">Modrinth Beta</a>, bringing a completely different interface and the ability for mods to be created for the first time. This interface has since been completely discarded, but this is what Modrinth looked like for well over a year. It's hard to believe!</p><p>December also brought the introduction of the <a href="https://github.com/modrinth/minotaur" rel="noopener nofollow ugc">Minotaur</a> Gradle plugin for the first time for upload automation. Minotaur today also looks nothing like it did when it was introduced, but it still accomplishes the same exact thing.</p><h2>January 2021: Improvements to mod uploading</h2><p>An announcement in mid-January brought several essential additions and improvements to Modrinth which we consider commonplace today. Among these were:</p><ul><li>A separate version creation page</li><li>The ability to edit and delete existing versions</li><li>The ability to delete existing mods and users</li></ul><p>January also brought the introduction of Google AdSense onto Modrinth. The eventual results, including our switch after to EthicalAds, solidified Modrinth's stance that ads should be unobtrusive and generally friendly to users.</p><h2>February-March 2021: Follows, reports, notifications, oh my!</h2><p>March brought the first introduction of the abilities to follow and report projects, as well as the automatic featuring of some versions depending on loader and Minecraft version. These systems have largely remained unchanged since their introduction, though the notification system will likely be getting a refresh come 2023.</p><h2>April-December 2021: Season of silence</h2><p>After follows, reports, and all that jazz, Modrinth largely went silent for a good while. This time period had some of the largest growth Modrinth had ever seen, and yet it seemed Modrinth's development had ground to a halt. Modrinth Team members were dropping like flies until there was a point where there was a single person on the team. What happened?</p><p>For various reasons, whether it be lack of free time or a lack of interest in Minecraft in general, people ended up leaving to pursue other things. It's not quite as apocalyptic or barren as these descriptions make it seem, but it's more fun to describe it like this.</p><p>Picking up the remnants from what others had left behind, one man was destined to continue developing for Modrinth. The one who began the whole operation in the first place, Geometrically, stood up and began developing. Thus came the development of project types, gallery images, API v2, and modpacks.</p><h2>January 2022: API v2 introduction</h2><p>Right around the corner came 2022. Perchance this would be the time for the silence to be broken? Indeed, the world would be able to hear about all that was brewing over the past few months.</p><p>Of course, this wasn't all introduced at once—it was a gradual rollout over several months. First was the introduction of v2 of Modrinth's API, allowing many breaking changes to occur, including namely the renaming of <em>mods</em> to <em>projects</em>. Wait, why was this necessary?</p><p>Up until this point, Modrinth only hosted mods. Project types, as we call them, allow projects to be given the designation of something other than <em>mod</em>; for example, <em>modpack</em> or <em>resourcepack</em>, like we have today. This simple field, alongside all of the infrastructure which was needed to support it, was the first step to allow modpacks on Modrinth.</p><h2>February 2022: Redesign</h2><p>Remember the interface introduced in December 2020? Let's scrap it! Actually, it wasn't entirely scrapped, but it got a treatment similar to the <a href="https://en.wikipedia.org/wiki/Ship_of_Theseus" rel="noopener nofollow ugc">Ship of Theseus</a> to the point that it was barely recognizable.</p><p><img src="../redesign/thumbnail.jpg" alt="The Modrinth homepage"></p><blockquote><p>The former Modrinth homepage</p></blockquote><p>Alongside this was the official announcement of API v2, as well as the introduction of the project gallery, the changelog tab, dependencies, and many other things. <a href="../redesign" rel="noopener nofollow ugc">Here's the blog post announcement for the redesign</a>!</p><p>February also brought the introduction of several new Modrinth Team members to the fold, including Prospector and triphora, both of whom are still on the team, alongside Hutzdog and venashial, who we thank for helping us through much of 2022.</p><h2>March-April 2022: Small changes and preparation for modpacks</h2><p>A couple weeks after the redesign we pushed out some changes which included improvements to several tabs on project pages and many bug fixes. <a href="../knossos-v2.1.0" rel="noopener nofollow ugc">The blog post from that can be found here</a>.</p><p>The next couple months were spent preparing for the release of modpacks. This is the first introduction of our &quot;early adopters&quot; program, still in use today, allowing a feedback loop of authors and other community members to create the best product that we can. Without early adopters, many of the features on Modrinth which you've come to love, including modpacks, plugins, resource packs, would be less than ideal.</p><h2>May 2022: Modpacks in alpha</h2><p>In May, we finally did the big release of modpacks on Modrinth. Well, in alpha, anyway—but that was less of a marker of instability and more a marker of being incomplete without the launcher. <a href="../modpacks-alpha" rel="noopener nofollow ugc">The modpack alpha release blog post can be found here</a>.</p><p>When we first announced modpacks, the initial format had been set in stone for a couple years, and it had been decided that CurseForge links would be allowed within them. This got turned on its head due to an email sent to us by Overwolf. More information on that can be found on the <a href="../modpack-changes" rel="noopener nofollow ugc">Changes to Modrinth Modpacks blog post</a>.</p><p><img src="../modpack-changes/thumbnail.jpg" alt="Progryck"></p><h2>June-August 2022: Plugins and resource packs</h2><p>The summer of 2022 was largely dedicated to working on releasing creator monetization. First, though, we made a pit stop to introduce plugins and resource packs to Modrinth. <a href="../plugins-resource-packs" rel="noopener nofollow ugc">Find that blog post here</a>.</p><p>Plugins in particular were tricky since we had to account for projects which had both mod and plugin versions. It was at this point we realized that the project type system isn't entirely what we cracked it up to be, and we're hoping to completely replace it once API v4 rolls around, as far away as that may sound. For now, though, it will suffice.</p><h2>September-November 2022: Creator monetization</h2><p>With plugins and resource packs done, we continued working on creator monetization. This included <a href="../carbon-ads" rel="noopener nofollow ugc">a brief experiment</a> with a different ad provider before we eventually switched to creating <a href="https://adrinth.com" rel="noopener nofollow ugc">our own ad system</a>.</p><p>November brought the actual beta release of creator monetization—<a href="../creator-monetization-beta" rel="noopener nofollow ugc">here's the blog post for that</a>. We are continuing to develop and refine this system to ensure authors continue to earn money from publishing projects on Modrinth.</p><h2>December 2022-January 2023: Anniversary Update</h2><p>That, of course, brings us to today's <a href="../two-years-of-modrinth" rel="noopener nofollow ugc">Anniversary Update</a>! Now that you're done reading this, feel free to go back over to that post and read about everything that's new in the Anniversary Update so that I don't have to repeat myself. Take a look at our New Year's Resolutions for 2023 while you're at it, too!</p>]]> - <![CDATA[Modrinth's Anniversary Update]]> @@ -135,9 +127,17 @@ Sat, 07 Jan 2023 00:00:00 GMT <![CDATA[<p>Modrinth initially <a href="../modrinth-beta" rel="noopener nofollow ugc">went into beta</a> on November 30th, 2020. Just over a month ago was November 30th, 2022, marking <strong>two years</strong> since Modrinth was generally available as a platform for everyone to use. Today, we're proud to announce the Anniversary Update, celebrating both two years of Modrinth as well as the coming of the new year, and we'll be discussing our New Year's Resolutions for 2023.</p><p>Before you read this post, though, we recommend taking a look at <a href="../two-years-of-modrinth-history" rel="noopener nofollow ugc">our retrospective on Modrinth's history through 2020—2022</a>. It just wouldn't be right to take a look at the present and the future without also taking a look at our past, seeing how far we've come from our humble beginnings.</p><p>With that out of the way, this post primarily serves to announce a few of the smaller features we've been working on after the release of creator monetization. We've bundled these all together as the <strong>Anniversary Update</strong>.</p><p>Looking just at what's already done is boring, though, so we'll also be looking at what's yet to come. Modrinth's future is even brighter than any of us can imagine, so we'll be focusing on what we're gonna do in order to get to that bright future. If you've ever made <strong>New Year's Resolutions</strong>, we're going to briefly discuss our resolutions for 2023.</p><p>Without further adieu, let's get right into what's new with this new year!</p><h2>Shader packs and data packs</h2><p>The long-awaited arrival of shader packs and data packs is now here on Modrinth!</p><p>Shader packs can be viewed in the <a href="/shaders" rel="noopener nofollow ugc">shaders tab</a>. This includes shaders that support <a href="/mod/iris" rel="noopener nofollow ugc">Iris</a>, <a href="/mod/canvas" rel="noopener nofollow ugc">Canvas</a>, and OptiFine, as well as vanilla core shaders. (Even though they're installed via the resource pack system, we have decided to put Canvas and core shaders in shader packs since most users will not search in resource packs for shader packs, even if that's how they're installed.)</p><p>Data packs can be found in the <a href="/datapacks" rel="noopener nofollow ugc">data packs tab</a>. These are implemented similarly to plugins, in that projects with a mod version can also upload a data pack version (and vice versa). Additionally, data pack authors can choose to have their data packs packaged as a mod using the handy-dandy button on the site.</p><p>Data packs can optionally upload a corresponding resource pack as a separate file. We discourage bundling data files and asset files in the same zip file.</p><h2>New landing page</h2><p>The <a href="/" rel="noopener nofollow ugc">homepage</a> has been completely remade, featuring a scrolling list of random projects from Modrinth. Feel free to use this to discover new projects—just make sure you refresh occasionally, because they loop after a little while until you refresh!</p><p><img src="./landing-page.jpg" alt="A screenshot of the new homepage, with a maze background and projects scrolling across the bottom. Bold across the front is &quot;The place for Minecraft mods&quot;."></p><h2>Project overhaul for creators</h2><p>We're continuing to bring expansions to the creator dashboard introduced with monetization. The new <strong>Projects</strong> tab allows you to view all of your projects in a table and quickly access their information and settings.</p><p><a href="/dashboard/projects" rel="noopener nofollow ugc"><img src="./projects-dashboard.jpg" alt="The new Modrinth project dashboard"></a></p><p>The same page also introduces the ability to bulk-edit the external resource links without having to edit each page individually. For example, if your Discord invite expires, you used to have to edit each of your projects individually to add it back. Now you can just select the projects you want to edit the links for and edit them all at the same time!</p><p><img src="./bulk-edit.jpg" alt="A modal with several input fields for external resource links, listing multiple projects the input changes will be applied to."></p><p>Even better are the changes to the settings page for individual projects. Previously, the project settings page was disorganized and cluttered. The project settings page has been completely redone, inspired by GitHub's repository settings page.</p><p><img src="./project-settings.jpg" alt="The new project settings page, shown for Sodium."></p><p>Draft projects also now have a publishing checklist, making it more clear to authors as to what their next steps should look like. Red asterisks are items that must be completed before submitting and purple light bulbs are suggestions.</p><p><img src="./publishing-checklist.jpg" alt="A card with several tasks for a draft project owner to do, such as adding a description and selecting the necessary information."></p><h2>Version page overhaul</h2><p>The layout of the individual version page has gotten a complete overhaul. It's much easier to just show the new UI in action rather than trying to explain it!</p><p>A screenshot of the way that individual versions look now:</p><p><img src="./version-page.jpg" alt="A screenshot of the way that individual versions look now."></p><p>That's not all, though. Version creation now automatically infers most details after you upload your first file. Try it out sometime—whenever you upload your first file, most stuff should already be filled in. This system is still in-development, so if you find any issues, please file an issue on <a href="https://github.com/modrinth/code" rel="noopener nofollow ugc">GitHub</a>.</p><h2>Project card views</h2><p>Anywhere which lists projects, namely search and user pages, have gotten a great overhaul. You can choose between the classic list view, the grid view, and the gallery view.</p><p><img src="./search-gallery-view.jpg" alt="A screenshot of the default view for the Modrinth shaders search."></p><p>By default, shader packs and resource packs use the gallery view, user pages use the grid view, and everywhere else use the list view. You can cycle through them near the top of each page or change them in your <a href="/settings" rel="noopener nofollow ugc">display settings</a>.</p><p>The gallery image uses the featured gallery image on a project, so please ensure if you are a shader pack or resource pack author that you set a featured gallery image!</p><h2>Gallery image UI for creators</h2><p>The existing UI for gallery image creation, editing, and deletion was flawed in many ways, so we threw out the old way of doing it and created a whole new system for this. It should be less prone to the many many bugs that plagued the previous implementation.</p><p><img src="./gallery-ui.jpg" alt="The new gallery image editing UI, in a modal"></p><h2>New project webhook</h2><p>Our <a href="https://discord.modrinth.com" rel="noopener nofollow ugc">Discord server</a> has a brand new channel: #new-projects. A webhook sends a message to this channel every time a new project gets approved. Check it out when you get a chance!</p><p><img src="./project-webhook.jpg" alt="A screenshot of the new project webhook for Iris Shaders."></p><h2>Miscellaneous additions</h2><ul><li>Custom SPDX license identifiers can now be selected, and a license's text is now displayed in a modal if the author has not manually set a license link.</li><li>Each project now has a color associated with it, generated from the icon. This color is used in place of a gallery image in search if the project has no gallery image.</li><li>The <a href="https://github.com/modrinth/code/issues/1748" rel="noopener nofollow ugc">bug with disappearing and duplicated versions</a> due to the reuse of version numbers is now fixed.</li><li>Whenever a project gets its status updated (for example from <em>under review</em> to <em>approved</em>), the project's team members will now get a notification.</li><li>The ability to manually reorder gallery images has been added via an integer ordering field. In the future, this sorting ability may expand to team members and versions. We also hope to add a drag-and-drop functionality similar to Discord server organization.</li><li>You can also now formally request that your project be marked as unlisted, private, or archived instead of always having it be listed first.</li><li>The ability to schedule the release of projects and versions has been added to the backend and is likely to be added to the frontend in the next few weeks.</li><li>Several other bug fixes and minor features, mainly contributed by community members.</li></ul><h2>New Year's Resolutions</h2><p>Now that we've looked at everything accomplished over the past month and a half, let's take a look at our New Year's Resolutions—things we wish to achieve during 2023.</p><h3>Theseus Launcher</h3><p>During 2023, our main focus will shift to the Modrinth launcher, code-named Theseus. Progress has been off and on for the past year and a half, but we intend to fully launch it before the end of the year. Theseus will bring a next-level experience to Minecraft launchers, bringing first-class support for Modrinth and unique features that would be difficult for other providers to parallel.</p><p>The release of the Theseus project will also mark the end of the &quot;alpha&quot; status for Modrinth modpacks. Stay tuned for more information about alpha tests and early adopters programs!</p><h3>Continuing to grow creator tools</h3><p>Another one of our focuses for this year is to put more work into our analytics system and in growing creator monetization through our <a href="https://adrinth.com" rel="noopener nofollow ugc">Adrinth</a> ad network. As of today, monetization is now out of beta, but we are still constantly working on ways to make Modrinth even better and easier to use for new and returning creators. Some of these improvements are big, like the project settings overhaul, while others are more subtle quality-of-life improvements, like the fixes to usage of duplicate version numbers.</p><h3>API changes</h3><p>This year, Modrinth hopes to introduce version 3 of <a href="https://docs.modrinth.com/api/" rel="noopener nofollow ugc">our API</a> with lots of fixes and smaller changes. While our plans are still work-in-progress for this, one of the things that needs to be done first is the removal of the old API v1, which was deprecated starting in January 2022. Here's our planned timeline for the removal of API v1:</p><ul><li><strong>January 7th, 2023 (Now):</strong> Begin sending messages to existing API v1 users</li><li><strong>January 7th, 2023 (Now):</strong> Add a field to each API result telling people to switch</li><li><strong>February 14th, 2023:</strong> Begin doing flickers of 5-10 minutes of 410 GONE response codes</li><li><strong>March 1st, 2023:</strong> Begin sending a permanent 410 GONE response for any non-GET routes</li><li><strong>March 1st, 2023:</strong> Ramp up 410 GONE flickers to last 6-12 hours for GET routes</li><li><strong>March 15th, 2023:</strong> Replace all remaining GET routes with a permanent 410 GONE response</li></ul><h3>Small updates throughout the year</h3><p>As always, we will be interspersing other, smaller quality-of-life updates throughout the year even as we work on the big stuff. We also want to fix any bugs which might come up alongside any updates.</p><h2>Conclusion</h2><p>Modrinth was founded with the goal of creating a platform which keeps the broader modding community's interests at heart. Modrinth would not exist without the support of our users and of our contributors, and we thank everyone involved immensely for everything. Modrinth's development shall continue as long as the community is willing to support us on the way!</p><p>We would love to hear any feedback you might have. Feel free to get in contact on <a href="https://discord.modrinth.com" rel="noopener nofollow ugc">Discord</a>, on <a href="https://twitter.com/modrinth" rel="noopener nofollow ugc">Twitter</a>, and on <a href="https://floss.social/@modrinth" rel="noopener nofollow ugc">Mastodon</a>.</p>]]> + + <![CDATA[Two years of Modrinth: a retrospective]]> + + https://modrinth.com/news/article/two-years-of-modrinth-history/ + https://modrinth.com/news/article/two-years-of-modrinth-history/ + Sat, 07 Jan 2023 00:00:00 GMT + <![CDATA[<p>Let's rewind a bit and take a look at the past two years of Modrinth's history. We've come so far from our pre-beta HexFabric days to today. A good portion of our pre-beta history can be found in the <a href="../what-is-modrinth" rel="noopener nofollow ugc">What is Modrinth</a> blog post, but Modrinth obviously is not the same platform it was two years ago.</p><h2>December 2020: Modrinth Beta begins</h2><p><img src="../modrinth-beta/new-design.jpg" alt="Modrinth's brand new design, rolling out with the launch of Beta"></p><blockquote><p>Modrinth's brand new design, rolling out with the launch of Beta</p></blockquote><p>December was the release of the initial <a href="../modrinth-beta" rel="noopener nofollow ugc">Modrinth Beta</a>, bringing a completely different interface and the ability for mods to be created for the first time. This interface has since been completely discarded, but this is what Modrinth looked like for well over a year. It's hard to believe!</p><p>December also brought the introduction of the <a href="https://github.com/modrinth/minotaur" rel="noopener nofollow ugc">Minotaur</a> Gradle plugin for the first time for upload automation. Minotaur today also looks nothing like it did when it was introduced, but it still accomplishes the same exact thing.</p><h2>January 2021: Improvements to mod uploading</h2><p>An announcement in mid-January brought several essential additions and improvements to Modrinth which we consider commonplace today. Among these were:</p><ul><li>A separate version creation page</li><li>The ability to edit and delete existing versions</li><li>The ability to delete existing mods and users</li></ul><p>January also brought the introduction of Google AdSense onto Modrinth. The eventual results, including our switch after to EthicalAds, solidified Modrinth's stance that ads should be unobtrusive and generally friendly to users.</p><h2>February-March 2021: Follows, reports, notifications, oh my!</h2><p>March brought the first introduction of the abilities to follow and report projects, as well as the automatic featuring of some versions depending on loader and Minecraft version. These systems have largely remained unchanged since their introduction, though the notification system will likely be getting a refresh come 2023.</p><h2>April-December 2021: Season of silence</h2><p>After follows, reports, and all that jazz, Modrinth largely went silent for a good while. This time period had some of the largest growth Modrinth had ever seen, and yet it seemed Modrinth's development had ground to a halt. Modrinth Team members were dropping like flies until there was a point where there was a single person on the team. What happened?</p><p>For various reasons, whether it be lack of free time or a lack of interest in Minecraft in general, people ended up leaving to pursue other things. It's not quite as apocalyptic or barren as these descriptions make it seem, but it's more fun to describe it like this.</p><p>Picking up the remnants from what others had left behind, one man was destined to continue developing for Modrinth. The one who began the whole operation in the first place, Geometrically, stood up and began developing. Thus came the development of project types, gallery images, API v2, and modpacks.</p><h2>January 2022: API v2 introduction</h2><p>Right around the corner came 2022. Perchance this would be the time for the silence to be broken? Indeed, the world would be able to hear about all that was brewing over the past few months.</p><p>Of course, this wasn't all introduced at once—it was a gradual rollout over several months. First was the introduction of v2 of Modrinth's API, allowing many breaking changes to occur, including namely the renaming of <em>mods</em> to <em>projects</em>. Wait, why was this necessary?</p><p>Up until this point, Modrinth only hosted mods. Project types, as we call them, allow projects to be given the designation of something other than <em>mod</em>; for example, <em>modpack</em> or <em>resourcepack</em>, like we have today. This simple field, alongside all of the infrastructure which was needed to support it, was the first step to allow modpacks on Modrinth.</p><h2>February 2022: Redesign</h2><p>Remember the interface introduced in December 2020? Let's scrap it! Actually, it wasn't entirely scrapped, but it got a treatment similar to the <a href="https://en.wikipedia.org/wiki/Ship_of_Theseus" rel="noopener nofollow ugc">Ship of Theseus</a> to the point that it was barely recognizable.</p><p><img src="../redesign/thumbnail.jpg" alt="The Modrinth homepage"></p><blockquote><p>The former Modrinth homepage</p></blockquote><p>Alongside this was the official announcement of API v2, as well as the introduction of the project gallery, the changelog tab, dependencies, and many other things. <a href="../redesign" rel="noopener nofollow ugc">Here's the blog post announcement for the redesign</a>!</p><p>February also brought the introduction of several new Modrinth Team members to the fold, including Prospector and triphora, both of whom are still on the team, alongside Hutzdog and venashial, who we thank for helping us through much of 2022.</p><h2>March-April 2022: Small changes and preparation for modpacks</h2><p>A couple weeks after the redesign we pushed out some changes which included improvements to several tabs on project pages and many bug fixes. <a href="../knossos-v2.1.0" rel="noopener nofollow ugc">The blog post from that can be found here</a>.</p><p>The next couple months were spent preparing for the release of modpacks. This is the first introduction of our &quot;early adopters&quot; program, still in use today, allowing a feedback loop of authors and other community members to create the best product that we can. Without early adopters, many of the features on Modrinth which you've come to love, including modpacks, plugins, resource packs, would be less than ideal.</p><h2>May 2022: Modpacks in alpha</h2><p>In May, we finally did the big release of modpacks on Modrinth. Well, in alpha, anyway—but that was less of a marker of instability and more a marker of being incomplete without the launcher. <a href="../modpacks-alpha" rel="noopener nofollow ugc">The modpack alpha release blog post can be found here</a>.</p><p>When we first announced modpacks, the initial format had been set in stone for a couple years, and it had been decided that CurseForge links would be allowed within them. This got turned on its head due to an email sent to us by Overwolf. More information on that can be found on the <a href="../modpack-changes" rel="noopener nofollow ugc">Changes to Modrinth Modpacks blog post</a>.</p><p><img src="../modpack-changes/thumbnail.jpg" alt="Progryck"></p><h2>June-August 2022: Plugins and resource packs</h2><p>The summer of 2022 was largely dedicated to working on releasing creator monetization. First, though, we made a pit stop to introduce plugins and resource packs to Modrinth. <a href="../plugins-resource-packs" rel="noopener nofollow ugc">Find that blog post here</a>.</p><p>Plugins in particular were tricky since we had to account for projects which had both mod and plugin versions. It was at this point we realized that the project type system isn't entirely what we cracked it up to be, and we're hoping to completely replace it once API v4 rolls around, as far away as that may sound. For now, though, it will suffice.</p><h2>September-November 2022: Creator monetization</h2><p>With plugins and resource packs done, we continued working on creator monetization. This included <a href="../carbon-ads" rel="noopener nofollow ugc">a brief experiment</a> with a different ad provider before we eventually switched to creating <a href="https://adrinth.com" rel="noopener nofollow ugc">our own ad system</a>.</p><p>November brought the actual beta release of creator monetization—<a href="../creator-monetization-beta" rel="noopener nofollow ugc">here's the blog post for that</a>. We are continuing to develop and refine this system to ensure authors continue to earn money from publishing projects on Modrinth.</p><h2>December 2022-January 2023: Anniversary Update</h2><p>That, of course, brings us to today's <a href="../two-years-of-modrinth" rel="noopener nofollow ugc">Anniversary Update</a>! Now that you're done reading this, feel free to go back over to that post and read about everything that's new in the Anniversary Update so that I don't have to repeat myself. Take a look at our New Year's Resolutions for 2023 while you're at it, too!</p>]]> + <![CDATA[Creators can now make money on Modrinth!]]> - + https://modrinth.com/news/article/creator-monetization/ https://modrinth.com/news/article/creator-monetization/ Sat, 12 Nov 2022 00:00:00 GMT @@ -145,7 +145,7 @@ <![CDATA[Modrinth's Carbon Ads experiment]]> - + https://modrinth.com/news/article/carbon-ads/ https://modrinth.com/news/article/carbon-ads/ Thu, 08 Sep 2022 00:00:00 GMT @@ -177,7 +177,7 @@ <![CDATA[This week in Modrinth development: Filters and Fixes]]> - + https://modrinth.com/news/article/knossos-v2.1.0/ https://modrinth.com/news/article/knossos-v2.1.0/ Wed, 09 Mar 2022 00:00:00 GMT @@ -185,7 +185,7 @@ <![CDATA[Now showing on Modrinth: A new look!]]> - + https://modrinth.com/news/article/redesign/ https://modrinth.com/news/article/redesign/ Sun, 27 Feb 2022 00:00:00 GMT diff --git a/package.json b/package.json index f5ac243e3..19dc488e5 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "app:build": "turbo run build --filter=@modrinth/app", "app:fix": "turbo run fix --filter=@modrinth/app", "app:intl:extract": "pnpm run --filter=@modrinth/app-frontend intl:extract", + "blog:fix": "turbo run fix --filter=@modrinth/blog", "pages:build": "NITRO_PRESET=cloudflare-pages pnpm --filter frontend run build", "build": "turbo run build --continue", "lint": "turbo run lint --continue", diff --git a/packages/blog/check.ts b/packages/blog/check.ts index b976e053a..ffaf7862f 100644 --- a/packages/blog/check.ts +++ b/packages/blog/check.ts @@ -1,16 +1,16 @@ import { promises as fs } from 'fs' import * as path from 'path' -import fastGlob from 'fast-glob' import { repoPath, toVarName } from './utils' +import { glob } from 'glob' import { PUBLIC_SRC, PUBLIC_LOCATIONS, ARTICLES_GLOB, COMPILED_DIR } from './blog.config' async function checkPublicAssets() { - const srcFiles = await fastGlob(['**/*'], { cwd: PUBLIC_SRC, dot: true }) + const srcFiles = await glob('**/*', { cwd: PUBLIC_SRC, dot: true }) let allOk = true for (const target of PUBLIC_LOCATIONS) { for (const relativeFile of srcFiles) { - const shouldExist = path.join(target, relativeFile) + const shouldExist = path.posix.join(target, relativeFile) try { await fs.access(shouldExist) } catch { @@ -26,15 +26,15 @@ async function checkPublicAssets() { } async function checkCompiledArticles() { - const mdFiles = await fastGlob([ARTICLES_GLOB]) - const compiledFiles = await fastGlob([`${COMPILED_DIR}/*.ts`]) + const mdFiles = await glob(ARTICLES_GLOB) + const compiledFiles = await glob(`${COMPILED_DIR}/*.ts`) const compiledVarNames = compiledFiles.map((f) => path.basename(f, '.ts')) // Check all .md have compiled .ts and .content.ts and the proper public thumbnail for (const file of mdFiles) { const varName = toVarName(path.basename(file, '.md')) - const compiledPath = path.join(COMPILED_DIR, varName + '.ts') - const contentPath = path.join(COMPILED_DIR, varName + '.content.ts') + const compiledPath = path.posix.join(COMPILED_DIR, varName + '.ts') + const contentPath = path.posix.join(COMPILED_DIR, varName + '.content.ts') if (!compiledVarNames.includes(varName)) { console.error(`⚠️ Missing compiled article for: ${file} (should be: ${compiledPath})`) process.exit(1) @@ -59,7 +59,7 @@ async function checkCompiledArticles() { if (varName === 'index' || varName.endsWith('.content')) continue const mdPathGlob = repoPath(`packages/blog/articles/**/${varName.replace(/_/g, '*')}.md`) - const found = await fastGlob([mdPathGlob]) + const found = await glob(mdPathGlob) if (!found.length) { console.error(`❌ Compiled article ${compiled} has no matching markdown source!`) process.exit(1) diff --git a/packages/blog/compile.ts b/packages/blog/compile.ts index 684d13b29..0065a4594 100644 --- a/packages/blog/compile.ts +++ b/packages/blog/compile.ts @@ -1,12 +1,12 @@ import { promises as fs } from 'fs' import * as path from 'path' -import fg from 'fast-glob' import matter from 'gray-matter' import { md } from '@modrinth/utils' import { minify } from 'html-minifier-terser' import { copyDir, toVarName } from './utils' import RSS from 'rss' import { parseStringPromise } from 'xml2js' +import { glob } from 'glob' import { ARTICLES_GLOB, @@ -24,7 +24,7 @@ async function ensureCompiledDir() { } async function hasThumbnail(slug: string): Promise { - const thumbnailPath = path.join(PUBLIC_SRC, slug, 'thumbnail.webp') + const thumbnailPath = path.posix.join(PUBLIC_SRC, slug, 'thumbnail.webp') try { await fs.access(thumbnailPath) return true @@ -48,7 +48,7 @@ function getThumbnailUrl(slug: string, hasThumb: boolean): string { async function compileArticles() { await ensureCompiledDir() - const files = await fg([ARTICLES_GLOB]) + const files = await glob(ARTICLES_GLOB) console.log(`🔎 Found ${files.length} markdown articles!`) const articleExports: string[] = [] const articlesArray: string[] = [] @@ -75,8 +75,8 @@ async function compileArticles() { const slug = frontSlug || path.basename(file, '.md') const varName = toVarName(slug) - const exportFile = path.join(COMPILED_DIR, `${varName}.ts`) - const contentFile = path.join(COMPILED_DIR, `${varName}.content.ts`) + const exportFile = path.posix.join(COMPILED_DIR, `${varName}.ts`) + const contentFile = path.posix.join(COMPILED_DIR, `${varName}.content.ts`) const thumbnailPresent = await hasThumbnail(slug) const contentTs = ` @@ -221,7 +221,7 @@ async function deleteDirContents(dir: string) { const entries = await fs.readdir(dir, { withFileTypes: true }) await Promise.all( entries.map(async (entry) => { - const fullPath = path.join(dir, entry.name) + const fullPath = path.posix.join(dir, entry.name) if (entry.isDirectory()) { await fs.rm(fullPath, { recursive: true, force: true }) } else { diff --git a/packages/blog/compiled/index.ts b/packages/blog/compiled/index.ts index df58df5ec..7016f9810 100644 --- a/packages/blog/compiled/index.ts +++ b/packages/blog/compiled/index.ts @@ -1,56 +1,56 @@ // AUTO-GENERATED FILE - DO NOT EDIT -import { article as a_new_chapter_for_modrinth_servers } from './a_new_chapter_for_modrinth_servers' -import { article as accelerating_development } from './accelerating_development' -import { article as becoming_sustainable } from './becoming_sustainable' -import { article as capital_return } from './capital_return' -import { article as carbon_ads } from './carbon_ads' -import { article as creator_monetization } from './creator_monetization' -import { article as creator_update } from './creator_update' -import { article as creator_updates_july_2025 } from './creator_updates_july_2025' -import { article as design_refresh } from './design_refresh' -import { article as download_adjustment } from './download_adjustment' -import { article as knossos_v2_1_0 } from './knossos_v2_1_0' -import { article as licensing_guide } from './licensing_guide' -import { article as modpack_changes } from './modpack_changes' -import { article as modpacks_alpha } from './modpacks_alpha' -import { article as modrinth_app_beta } from './modrinth_app_beta' -import { article as modrinth_beta } from './modrinth_beta' -import { article as modrinth_servers_beta } from './modrinth_servers_beta' -import { article as new_site_beta } from './new_site_beta' -import { article as plugins_resource_packs } from './plugins_resource_packs' -import { article as pride_campaign_2025 } from './pride_campaign_2025' -import { article as redesign } from './redesign' -import { article as skins_now_in_modrinth_app } from './skins_now_in_modrinth_app' -import { article as two_years_of_modrinth_history } from './two_years_of_modrinth_history' -import { article as two_years_of_modrinth } from './two_years_of_modrinth' -import { article as whats_modrinth } from './whats_modrinth' import { article as windows_borderless_malware_disclosure } from './windows_borderless_malware_disclosure' +import { article as whats_modrinth } from './whats_modrinth' +import { article as two_years_of_modrinth } from './two_years_of_modrinth' +import { article as two_years_of_modrinth_history } from './two_years_of_modrinth_history' +import { article as skins_now_in_modrinth_app } from './skins_now_in_modrinth_app' +import { article as redesign } from './redesign' +import { article as pride_campaign_2025 } from './pride_campaign_2025' +import { article as plugins_resource_packs } from './plugins_resource_packs' +import { article as new_site_beta } from './new_site_beta' +import { article as modrinth_servers_beta } from './modrinth_servers_beta' +import { article as modrinth_beta } from './modrinth_beta' +import { article as modrinth_app_beta } from './modrinth_app_beta' +import { article as modpacks_alpha } from './modpacks_alpha' +import { article as modpack_changes } from './modpack_changes' +import { article as licensing_guide } from './licensing_guide' +import { article as knossos_v2_1_0 } from './knossos_v2_1_0' +import { article as download_adjustment } from './download_adjustment' +import { article as design_refresh } from './design_refresh' +import { article as creator_updates_july_2025 } from './creator_updates_july_2025' +import { article as creator_update } from './creator_update' +import { article as creator_monetization } from './creator_monetization' +import { article as carbon_ads } from './carbon_ads' +import { article as capital_return } from './capital_return' +import { article as becoming_sustainable } from './becoming_sustainable' +import { article as accelerating_development } from './accelerating_development' +import { article as a_new_chapter_for_modrinth_servers } from './a_new_chapter_for_modrinth_servers' export const articles = [ - a_new_chapter_for_modrinth_servers, - accelerating_development, - becoming_sustainable, - capital_return, - carbon_ads, - creator_monetization, - creator_update, - creator_updates_july_2025, - design_refresh, - download_adjustment, - knossos_v2_1_0, - licensing_guide, - modpack_changes, - modpacks_alpha, - modrinth_app_beta, - modrinth_beta, - modrinth_servers_beta, - new_site_beta, - plugins_resource_packs, - pride_campaign_2025, - redesign, - skins_now_in_modrinth_app, - two_years_of_modrinth_history, - two_years_of_modrinth, - whats_modrinth, windows_borderless_malware_disclosure, + whats_modrinth, + two_years_of_modrinth, + two_years_of_modrinth_history, + skins_now_in_modrinth_app, + redesign, + pride_campaign_2025, + plugins_resource_packs, + new_site_beta, + modrinth_servers_beta, + modrinth_beta, + modrinth_app_beta, + modpacks_alpha, + modpack_changes, + licensing_guide, + knossos_v2_1_0, + download_adjustment, + design_refresh, + creator_updates_july_2025, + creator_update, + creator_monetization, + carbon_ads, + capital_return, + becoming_sustainable, + accelerating_development, + a_new_chapter_for_modrinth_servers, ] diff --git a/packages/blog/package.json b/packages/blog/package.json index c192ad1d0..6e7128a7c 100644 --- a/packages/blog/package.json +++ b/packages/blog/package.json @@ -9,6 +9,7 @@ "fix": "jiti ./compile.ts && eslint . --fix && prettier --write ." }, "devDependencies": { + "@types/glob": "^9.0.0", "@types/html-minifier-terser": "^7.0.2", "@types/rss": "^0.0.32", "@types/xml2js": "^0.4.14", @@ -19,7 +20,7 @@ }, "dependencies": { "@modrinth/utils": "workspace:*", - "fast-glob": "^3.3.3", + "glob": "^10.2.7", "gray-matter": "^4.0.3", "html-minifier-terser": "^7.2.0", "rss": "^1.2.2", diff --git a/packages/blog/utils.ts b/packages/blog/utils.ts index 06d1d587b..bddccd992 100644 --- a/packages/blog/utils.ts +++ b/packages/blog/utils.ts @@ -8,7 +8,7 @@ export function getRepoRoot(): string { } export function repoPath(...segments: string[]): string { - return path.join(getRepoRoot(), ...segments) + return path.posix.join(getRepoRoot(), ...segments) } export async function copyDir( @@ -20,8 +20,8 @@ export async function copyDir( await fs.mkdir(dest, { recursive: true }) const entries = await fs.readdir(src, { withFileTypes: true }) for (const entry of entries) { - const srcPath = path.join(src, entry.name) - const destPath = path.join(dest, entry.name) + const srcPath = path.posix.join(src, entry.name) + const destPath = path.posix.join(dest, entry.name) if (entry.isDirectory()) { await copyDir(srcPath, destPath, logFn) } else if (entry.isFile()) { diff --git a/packages/moderation/data/checklist.ts b/packages/moderation/data/checklist.ts index 5b0edc4c4..6d21e274a 100644 --- a/packages/moderation/data/checklist.ts +++ b/packages/moderation/data/checklist.ts @@ -1,28 +1,32 @@ import type { Stage } from '../types/stage' import modpackPermissionsStage from './modpack-permissions-stage' import categories from './stages/categories' -import copyright from './stages/copyright' +import reupload from './stages/reupload' import description from './stages/description' import gallery from './stages/gallery' import links from './stages/links' import ruleFollowing from './stages/rule-following' import sideTypes from './stages/side-types' -import slug from './stages/slug' import summary from './stages/summary' -import title from './stages/title' +import titleSlug from './stages/title-slug' import versions from './stages/versions' +import license from './stages/license' +import undefinedProject from './stages/undefined-project' +import statusAlerts from './stages/status-alerts' export default [ - title, - slug, + titleSlug, summary, description, links, + license, categories, sideTypes, gallery, versions, - copyright, + reupload, ruleFollowing, modpackPermissionsStage, + statusAlerts, + undefinedProject, ] as ReadonlyArray diff --git a/packages/moderation/data/messages/categories/inaccurate.md b/packages/moderation/data/messages/categories/inaccurate.md index ae75c47de..fb523e065 100644 --- a/packages/moderation/data/messages/categories/inaccurate.md +++ b/packages/moderation/data/messages/categories/inaccurate.md @@ -1,3 +1,3 @@ ## Misuse of Tags -Per section 5.1 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous), it is important that the metadata of your projects is accurate. Including that selected tags honestly represent your project. +Per section 5.1 of %RULES%, it is important that the metadata of your projects is accurate. Including that selected tags honestly represent your project. diff --git a/packages/moderation/data/messages/categories/optimization_misused.md b/packages/moderation/data/messages/categories/optimization_misused.md new file mode 100644 index 000000000..ab9a6512b --- /dev/null +++ b/packages/moderation/data/messages/categories/optimization_misused.md @@ -0,0 +1 @@ +It looks like the Optimization tag is not accurate for this project. diff --git a/packages/moderation/data/messages/categories/resolutions_misused.md b/packages/moderation/data/messages/categories/resolutions_misused.md new file mode 100644 index 000000000..da44d9c4c --- /dev/null +++ b/packages/moderation/data/messages/categories/resolutions_misused.md @@ -0,0 +1,5 @@ +Currently, your pack has multiple Resolutions selected, in most cases, this will misrepresent your project. +For a brief rundown of how this works: +Vanilla Minecraft textures like blocks and items have a width and height of 16 pixels. +This means that packs with textures the same size as the default are considered 16x. +Some packs make the resolution of textures smaller than the default, such as 8x, and some bigger, such as 32x. diff --git a/packages/moderation/data/messages/checklist-text/categories.md b/packages/moderation/data/messages/checklist-text/categories.md new file mode 100644 index 000000000..d08553337 --- /dev/null +++ b/packages/moderation/data/messages/checklist-text/categories.md @@ -0,0 +1,2 @@ +**Featured Tags:** %PROJECT_CATEGORIES% \ +**Additional Tags:** %PROJECT_ADDITIONAL_CATEGORIES% diff --git a/packages/moderation/data/messages/checklist-text/license/id.md b/packages/moderation/data/messages/checklist-text/license/id.md new file mode 100644 index 000000000..37e3ac376 --- /dev/null +++ b/packages/moderation/data/messages/checklist-text/license/id.md @@ -0,0 +1 @@ +**License id:** %PROJECT_LICENSE_ID% \ diff --git a/packages/moderation/data/messages/checklist-text/license/link.md b/packages/moderation/data/messages/checklist-text/license/link.md new file mode 100644 index 000000000..ff5f4c4c3 --- /dev/null +++ b/packages/moderation/data/messages/checklist-text/license/link.md @@ -0,0 +1 @@ +**License Link:** %PROJECT_LICENSE_URL% diff --git a/packages/moderation/data/messages/checklist-text/links/base.md b/packages/moderation/data/messages/checklist-text/links/base.md new file mode 100644 index 000000000..9b12a8e9e --- /dev/null +++ b/packages/moderation/data/messages/checklist-text/links/base.md @@ -0,0 +1,4 @@ +**Discord:** %PROJECT_DISCORD_URL% \ +**Issues:** %PROJECT_ISSUES_URL% \ +**Source:** %PROJECT_SOURCE_URL% \ +**Wiki:** %PROJECT_WIKI_URL% diff --git a/packages/moderation/data/messages/checklist-text/links/donation/donation.md b/packages/moderation/data/messages/checklist-text/links/donation/donation.md new file mode 100644 index 000000000..154b77d20 --- /dev/null +++ b/packages/moderation/data/messages/checklist-text/links/donation/donation.md @@ -0,0 +1 @@ +> **{PLATFORM}:** {URL} diff --git a/packages/moderation/data/messages/checklist-text/links/donation/donations.md b/packages/moderation/data/messages/checklist-text/links/donation/donations.md new file mode 100644 index 000000000..7dc9615c1 --- /dev/null +++ b/packages/moderation/data/messages/checklist-text/links/donation/donations.md @@ -0,0 +1 @@ +**Donation Links:** diff --git a/packages/moderation/data/messages/checklist-text/status-alerts/text.md b/packages/moderation/data/messages/checklist-text/status-alerts/text.md new file mode 100644 index 000000000..64a94da8a --- /dev/null +++ b/packages/moderation/data/messages/checklist-text/status-alerts/text.md @@ -0,0 +1 @@ +**Applying for:** `%PROJECT_REQUESTED_STATUS%` diff --git a/packages/moderation/data/messages/checklist-text/summary/summary.md b/packages/moderation/data/messages/checklist-text/summary/summary.md new file mode 100644 index 000000000..2107bc9d8 --- /dev/null +++ b/packages/moderation/data/messages/checklist-text/summary/summary.md @@ -0,0 +1,2 @@ +**Summary:** +`%PROJECT_SUMMARY%` diff --git a/packages/moderation/data/messages/checklist-text/title-slug.md b/packages/moderation/data/messages/checklist-text/title-slug.md new file mode 100644 index 000000000..9a29a51b9 --- /dev/null +++ b/packages/moderation/data/messages/checklist-text/title-slug.md @@ -0,0 +1,4 @@ +**Title:** %PROJECT_TITLE% \ +**Slug:** `%PROJECT_SLUG%` + +**Title issues?** diff --git a/packages/moderation/data/messages/description/insufficient.md b/packages/moderation/data/messages/description/insufficient.md index b87fa62d7..f86ded144 100644 --- a/packages/moderation/data/messages/description/insufficient.md +++ b/packages/moderation/data/messages/description/insufficient.md @@ -1,7 +1,6 @@ ## Insufficient Description -Per section 2.1 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#general-expectations) your project's Description should clearly inform the reader of the content, purpose, and appeal of your project. +Per section 2.1 of %RULES% your project's Description should clearly inform the reader of the content, purpose, and appeal of your project. Currently, it looks like there are some missing details. - -> %EXPLAINER% +%EXPLAINER% diff --git a/packages/moderation/data/messages/description/non-english.md b/packages/moderation/data/messages/description/non-english.md index 1a9131e23..5ceb22ad8 100644 --- a/packages/moderation/data/messages/description/non-english.md +++ b/packages/moderation/data/messages/description/non-english.md @@ -1,5 +1,5 @@ ## No English Description -Per section 2.2 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#accessibility) a project's Summary and Description must be in English, unless meant exclusively for non-English use, such as translations. +Per section 2.2 of %RULES% a project's Summary and Description must be in English, unless meant exclusively for non-English use, such as translations. You may include your non-English Description if you would like but we ask that you also add an English translation of the Description to your Description page, if you would like to use an online translator to do this, we recommend [DeepL](https://www.deepl.com/translator). diff --git a/packages/moderation/data/messages/description/non-standard-text.md b/packages/moderation/data/messages/description/non-standard-text.md index 88d0f2d23..be648f276 100644 --- a/packages/moderation/data/messages/description/non-standard-text.md +++ b/packages/moderation/data/messages/description/non-standard-text.md @@ -1,6 +1,6 @@ ## Description Accessibility -Per section 2 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#clear-and-honest-function) your description must be plainly readable and accessible. +Per section 2 of %RULES% your description must be plainly readable and accessible. Using non-standard text characters like Zalgo or "fancy text" in place of text anywhere in your project, including the Description, Summary, or Title can make your project pages inaccessible. diff --git a/packages/moderation/data/messages/description/unfinished.md b/packages/moderation/data/messages/description/unfinished.md index 9e6e161e4..c5a830580 100644 --- a/packages/moderation/data/messages/description/unfinished.md +++ b/packages/moderation/data/messages/description/unfinished.md @@ -1,7 +1,4 @@ ## Unfinished Description -It looks like your project Description is still a WIP (Work In Progress). - -> %REASON% - -Please remember to submit only when ready, as it is important your project meets the requirements of Section 2.1 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#general-expectations), if you have any questions on this feel free to reach out! +It looks like your project Description is still a Work In Progress. +Please remember to submit only when ready, as it is important your project meets the requirements of Section 2.1 of %RULES%. diff --git a/packages/moderation/data/messages/gallery/insufficient.md b/packages/moderation/data/messages/gallery/insufficient.md index 0319ce6d8..8bfebbd25 100644 --- a/packages/moderation/data/messages/gallery/insufficient.md +++ b/packages/moderation/data/messages/gallery/insufficient.md @@ -1,6 +1,6 @@ ## Insufficient Gallery Images -We ask that projects like yours show off their content using images in the Gallery, or optionally in the Description, in order to effectively and clearly inform users of its content per section 2.1 of [Modrinth's content rules](https://modrinth.com/legal/rules#general-expectations). +We ask that projects like yours show off their content using images in the Gallery, or optionally in the Description, in order to effectively and clearly inform users of its content per section 2.1 of %RULES%. Keep in mind that you should: - Set a featured image that best represents your project. diff --git a/packages/moderation/data/messages/gallery/not-relevant.md b/packages/moderation/data/messages/gallery/not-relevant.md index 6a3a5a85a..78f879669 100644 --- a/packages/moderation/data/messages/gallery/not-relevant.md +++ b/packages/moderation/data/messages/gallery/not-relevant.md @@ -1,3 +1,3 @@ ## Unrelated Gallery Images -Per section 5.5 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous) any images in your project's Gallery must be relevant to the project and also include a Title. +Per section 5.5 of %RULES% any images in your project's Gallery must be relevant to the project and also include a Title. diff --git a/packages/moderation/data/messages/license/invalid_link-custom_license.md b/packages/moderation/data/messages/license/invalid_link-custom_license.md new file mode 100644 index 000000000..e14ed370d --- /dev/null +++ b/packages/moderation/data/messages/license/invalid_link-custom_license.md @@ -0,0 +1 @@ +If this is a project-specific License you've written yourself, you must host the full License in a way that makes it publicly available, for instance, in a public source repository on a platform like GitHub. diff --git a/packages/moderation/data/messages/license/invalid_link.md b/packages/moderation/data/messages/license/invalid_link.md new file mode 100644 index 000000000..dec1b9771 --- /dev/null +++ b/packages/moderation/data/messages/license/invalid_link.md @@ -0,0 +1,4 @@ +## Invalid License Link + +It's important that your project's License link is accurate and leads directly to a valid license for this content. +Your current link: `%PROJECT_LICENSE_URL%` does not appear to lead to a valid license for this project, or it is not publicly accessable. diff --git a/packages/moderation/data/messages/license/no_source-fork.md b/packages/moderation/data/messages/license/no_source-fork.md new file mode 100644 index 000000000..1ff659c73 --- /dev/null +++ b/packages/moderation/data/messages/license/no_source-fork.md @@ -0,0 +1,5 @@ +## No Source Code Provided + +Your project's license of `%PROJECT_LICENSE_NAME%`, requires source disclosure. +Consider adding a Source link to your project's repository, or including a Sources file for each version as an Additional File. +Keep in mind this may be a requirement of the source work's licensing, which must be abided per section 4 of %RULES%. diff --git a/packages/moderation/data/messages/license/no_source.md b/packages/moderation/data/messages/license/no_source.md new file mode 100644 index 000000000..76e7c7a9f --- /dev/null +++ b/packages/moderation/data/messages/license/no_source.md @@ -0,0 +1,4 @@ +## No Source Code Provided + +Your project's license of `%PROJECT_LICENSE_NAME%`, requires source disclosure. +Consider adding a Source link to your project's repository, or including a Sources file for each version as an Additional File. You may also want to refer to %LICENSING_GUIDE% if you wish to select a different License, remember to make sure your selected License is consistent with the license in your project's files as well. diff --git a/packages/moderation/data/messages/links/misused.md b/packages/moderation/data/messages/links/misused.md index b38a87f3b..15582bee4 100644 --- a/packages/moderation/data/messages/links/misused.md +++ b/packages/moderation/data/messages/links/misused.md @@ -1,3 +1,4 @@ -## Misuse of External Resources +## Misuse of Links -Per section 5.4 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous) all links must lead to correctly labeled publicly available resources that are directly related to your project. +Per section 5.4 of %RULES% all %PROJECT_LINKS_FLINK% must lead to correctly labeled publicly available resources that are directly related to your project. +Currently it looks like your %MISUSED_LINKS% link(s) are misused or incorrectly labeled. diff --git a/packages/moderation/data/messages/links/not-accessible-other.md b/packages/moderation/data/messages/links/not-accessible-other.md deleted file mode 100644 index af1f5a23a..000000000 --- a/packages/moderation/data/messages/links/not-accessible-other.md +++ /dev/null @@ -1,5 +0,0 @@ -## Unreachable Links - -Per section 5.4 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous) all links must lead to correctly labeled publicly available resources that are directly related to your project. - -Currently, your %LINK% link is inaccessible! diff --git a/packages/moderation/data/messages/links/not-accessible-source.md b/packages/moderation/data/messages/links/not-accessible-source.md deleted file mode 100644 index 74953b027..000000000 --- a/packages/moderation/data/messages/links/not-accessible-source.md +++ /dev/null @@ -1,5 +0,0 @@ -## Unreachable Links - -Per section 5.4 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous) all links must lead to correctly labeled publicly available resources that are directly related to your project. - -Currently, your Source link directs to a Page Not Found error, likely because your repository is private, make sure to make your repository public before resubmitting your project! diff --git a/packages/moderation/data/messages/links/not_accessible-discord.md b/packages/moderation/data/messages/links/not_accessible-discord.md new file mode 100644 index 000000000..b095e08ca --- /dev/null +++ b/packages/moderation/data/messages/links/not_accessible-discord.md @@ -0,0 +1 @@ +Currently, your Discord link directs to an invalid invite, likely because your invite has expired. Make sure to set your invite link to permanent with unlimited uses before resubmitting your project. diff --git a/packages/moderation/data/messages/links/not_accessible-source.md b/packages/moderation/data/messages/links/not_accessible-source.md new file mode 100644 index 000000000..0a970b67d --- /dev/null +++ b/packages/moderation/data/messages/links/not_accessible-source.md @@ -0,0 +1 @@ +Currently, your Source link directs to a Page Not Found error, likely because your repository is private. Make sure to set your repository to public before resubmitting your project. diff --git a/packages/moderation/data/messages/links/not_accessible.md b/packages/moderation/data/messages/links/not_accessible.md new file mode 100644 index 000000000..50f868bad --- /dev/null +++ b/packages/moderation/data/messages/links/not_accessible.md @@ -0,0 +1,3 @@ +## Unreachable Links + +Per section 5.4 of %RULES% all %PROJECT_LINKS_FLINK% must lead to correctly labeled publicly available resources that are directly related to your project. diff --git a/packages/moderation/data/messages/reupload/fork.md b/packages/moderation/data/messages/reupload/fork.md new file mode 100644 index 000000000..ba885a230 --- /dev/null +++ b/packages/moderation/data/messages/reupload/fork.md @@ -0,0 +1,4 @@ +## Forks and Reuploads + +Per section 4 of %RULES%, please provide proof that this project is both license-abiding and significantly divergent from the source work. +Alternatively, please provide proof of your explicit permission from the author of the source work to distribute this content on Modrinth. diff --git a/packages/moderation/data/messages/reupload/insufficient_fork.md b/packages/moderation/data/messages/reupload/insufficient_fork.md new file mode 100644 index 000000000..90a0f018c --- /dev/null +++ b/packages/moderation/data/messages/reupload/insufficient_fork.md @@ -0,0 +1,4 @@ +## Insufficient Fork + +This project does not appear to significantly diverge from the source work, or does not abide by the license of the source work as required by section 4 of %RULES%. +Please provide proof of your explicit permission to distribute this project from the creator(s) of the source work. diff --git a/packages/moderation/data/messages/reupload/proof_of_permissions.md b/packages/moderation/data/messages/reupload/proof_of_permissions.md new file mode 100644 index 000000000..26296101f --- /dev/null +++ b/packages/moderation/data/messages/reupload/proof_of_permissions.md @@ -0,0 +1,5 @@ +## Proof of permissions + +This project appears to contain content from other creators. +Per section 4 of %RULES%, we ask that you provide proof of your permission to distribute this content, or derivatives of this content in your project on Modrinth. +Either implicit permission abiding by the terms of the content's license(s) or explicit permission from the original creator of the content. diff --git a/packages/moderation/data/messages/copyright/reupload.md b/packages/moderation/data/messages/reupload/reupload.md similarity index 53% rename from packages/moderation/data/messages/copyright/reupload.md rename to packages/moderation/data/messages/reupload/reupload.md index 3822ad78c..51fcab855 100644 --- a/packages/moderation/data/messages/copyright/reupload.md +++ b/packages/moderation/data/messages/reupload/reupload.md @@ -1,7 +1,5 @@ ## Reuploads are forbidden -This project appears to contain content from %ORIGINAL_PROJECT% by %ORIGINAL_AUTHOR%. - -Per section 4 of [Modrinth's Content Rules](https://modrinth.com/legal/rules) this is strictly forbidden. - -If you believe this is an error, or you can verify you are the creator and rightful owner of this content please let us know. Otherwise, we ask that you **do not resubmit this project**.`, +This project appears to contain content from %ORIGINAL_PROJECT% by %ORIGINAL_AUTHOR%. +Per section 4 of %RULES% this is strictly forbidden. +If you believe this is an error, or you can verify you are the creator and rightful owner of this content please let us know. Otherwise, we ask that you **do not resubmit this project**. diff --git a/packages/moderation/data/messages/rule-breaking.md b/packages/moderation/data/messages/rule-breaking.md index 4c475aee5..0d12cabff 100644 --- a/packages/moderation/data/messages/rule-breaking.md +++ b/packages/moderation/data/messages/rule-breaking.md @@ -1,5 +1 @@ -# Does not follow content rules - -Our moderators have determined that your project does not follow Modrinth's Content Rules, and has been rejected. - %MESSAGE% diff --git a/packages/moderation/data/messages/side-types/inaccurate-mod.md b/packages/moderation/data/messages/side-types/inaccurate-mod.md index 2e1243a06..be1be391a 100644 --- a/packages/moderation/data/messages/side-types/inaccurate-mod.md +++ b/packages/moderation/data/messages/side-types/inaccurate-mod.md @@ -1,6 +1,6 @@ ## Environment Information -Per section 5.1 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous), it is important that the metadata of your projects is accurate, including whether the project runs on the client or server side. +Per section 5.1 of %RULES%, it is important that the metadata of your projects is accurate, including whether the project runs on the client or server side. For a brief rundown of how this works: diff --git a/packages/moderation/data/messages/side-types/inaccurate-modpack.md b/packages/moderation/data/messages/side-types/inaccurate-modpack.md index 05bc1a8de..dccfba6a7 100644 --- a/packages/moderation/data/messages/side-types/inaccurate-modpack.md +++ b/packages/moderation/data/messages/side-types/inaccurate-modpack.md @@ -1,6 +1,6 @@ ## Incorrect Environment Information -Per section 5.1 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous), it is important that the metadata of your projects is accurate, including whether the project runs on the client or server side. +Per section 5.1 of %RULES%, it is important that the metadata of your projects is accurate, including whether the project runs on the client or server side. For a brief rundown of how this works: diff --git a/packages/moderation/data/messages/slug/misused.md b/packages/moderation/data/messages/slug/misused.md index 37f2afa43..097e449ca 100644 --- a/packages/moderation/data/messages/slug/misused.md +++ b/packages/moderation/data/messages/slug/misused.md @@ -1,3 +1,3 @@ ## Misuse of Slug -Per section 5.2 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous) your project slug (URL) must accurately represent your project. +Per section 5.2 of %RULES% must accurately represent your project. diff --git a/packages/moderation/data/messages/status-alerts/account_issues.md b/packages/moderation/data/messages/status-alerts/account_issues.md new file mode 100644 index 000000000..9c4fdc277 --- /dev/null +++ b/packages/moderation/data/messages/status-alerts/account_issues.md @@ -0,0 +1,6 @@ +--- + +## Account Issues Indicated + +We're sorry to hear you're having trouble accessing your accounts, unfortunately, our moderation team is unable to assist with account-related issues. +Before resubmitting your project, %SUPPORT%. diff --git a/packages/moderation/data/messages/status-alerts/automod_confusion.md b/packages/moderation/data/messages/status-alerts/automod_confusion.md new file mode 100644 index 000000000..842f5b544 --- /dev/null +++ b/packages/moderation/data/messages/status-alerts/automod_confusion.md @@ -0,0 +1,5 @@ +--- + +Unfortunately, our AutoMod cannot read your project's Description or your messages to moderation. +AutoMod will warn both you and our Moderation Staff about potential issues, but if you've already followed the necessary steps these warnings can safely be ignored. +Note that if your project is being rejected by AutoMod this means your project has content that can not be included in your modpack and must be removed before resubmission, including deleting versions of your modpack that include the content. diff --git a/packages/moderation/data/messages/status-alerts/fixed.md b/packages/moderation/data/messages/status-alerts/fixed.md new file mode 100644 index 000000000..433588624 --- /dev/null +++ b/packages/moderation/data/messages/status-alerts/fixed.md @@ -0,0 +1,5 @@ +--- + +## Corrections Applied + +I've gone ahead and corrected the issues listed above so your project can be Approved. diff --git a/packages/moderation/data/messages/status-alerts/private.md b/packages/moderation/data/messages/status-alerts/private.md new file mode 100644 index 000000000..a28626191 --- /dev/null +++ b/packages/moderation/data/messages/status-alerts/private.md @@ -0,0 +1,8 @@ +--- + +## Private Use + +Under normal circumstances, your project would be rejected due to the issues listed above. +However, since your project is not intended for for public use, these requirements will be waived and your project will be unlisted. This means it will remain accessible through a direct link without appearing in public search results, allowing you to share it privately. +If you're okay with this, or submitted your project to be unlisted already, than no further action is necessary. +If you would like to publish your project publicly, please address all moderation concerns before resubmitting this project. diff --git a/packages/moderation/data/messages/summary/formatting.md b/packages/moderation/data/messages/summary/formatting.md index 36cbfdd9e..8b9704a12 100644 --- a/packages/moderation/data/messages/summary/formatting.md +++ b/packages/moderation/data/messages/summary/formatting.md @@ -1,6 +1,6 @@ ## Insufficient Summary -Per section 5.3 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous) your Summary can not include any extra formatting such as lists, or links. +Per section 5.3 of %RULES% your Summary can not include any extra formatting such as lists, or links. Your project summary should provide a brief overview of your project that informs and entices users. diff --git a/packages/moderation/data/messages/summary/insufficient.md b/packages/moderation/data/messages/summary/insufficient.md index a804b0be0..2505b8baa 100644 --- a/packages/moderation/data/messages/summary/insufficient.md +++ b/packages/moderation/data/messages/summary/insufficient.md @@ -1,5 +1,5 @@ ## Insufficient Summary -Per section 5.3 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous) your project summary should provide a brief overview of your project that informs and entices users. +Per section 5.3 of %RULES% your project summary should provide a brief overview of your project that informs and entices users. This is the first thing most people will see about your mod other than the Logo, so it's important it be accurate, reasonably detailed, and exciting. diff --git a/packages/moderation/data/messages/summary/non-english.md b/packages/moderation/data/messages/summary/non-english.md index 9e3c525d6..64059f4d5 100644 --- a/packages/moderation/data/messages/summary/non-english.md +++ b/packages/moderation/data/messages/summary/non-english.md @@ -1,5 +1,5 @@ ## No English Summary -Per section 2.2 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#accessibility) a project's Summary and Description must be in English, unless meant exclusively for non-English use, such as translations. +Per section 2.2 of %RULES% a project's Summary and Description must be in English, unless meant exclusively for non-English use, such as translations. You may include your non-English Summary but we ask that you also add an English translation. diff --git a/packages/moderation/data/messages/summary/repeat-title.md b/packages/moderation/data/messages/summary/repeat-title.md index 772374444..e67061385 100644 --- a/packages/moderation/data/messages/summary/repeat-title.md +++ b/packages/moderation/data/messages/summary/repeat-title.md @@ -1,6 +1,6 @@ ## Insufficient Summary -Per section 5.3 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous) your Summary can not be the same as your project's Title. +Per section 5.3 of %RULES% your Summary can not be the same as your project's Title. Your project summary should provide a brief overview of your project that informs and entices users. diff --git a/packages/moderation/data/messages/title/minecraft-branding.md b/packages/moderation/data/messages/title/minecraft-branding.md index 525a1d8c7..6c8e7f988 100644 --- a/packages/moderation/data/messages/title/minecraft-branding.md +++ b/packages/moderation/data/messages/title/minecraft-branding.md @@ -1,7 +1,6 @@ -## Project Title +## Minecraft Project Names -Projects must not use Minecraft's branding or include "Minecraft" as a significant part of the title. - -The title of your project may be confusingly similar to the game, and we encourage you to change your title to avoid a potential violation of Minecraft's Usage Guidelines. - -Abbreviations like "MC" or elaborate titles that do not make the name Minecraft a significant portion of the name are okay. +Projects must not use Minecraft's branding or include "Minecraft" as a significant part of the title. +Your project's current Name of `%PROJECT_TITLE%` may be confusingly similar to, or imply association with, the game Minecraft. We encourage you to change your project's [Name](%PROJECT_SETTINGS_LINK%) to avoid a potential violation of Minecraft's Usage Guidelines. +Abbreviations like "MC" or elaborate titles that do not make the name Minecraft a significant portion of the name are okay. +When editing your project's Name, remember to update its [URL](%PROJECT_SETTINGS_LINK%) to match. diff --git a/packages/moderation/data/messages/title/similarities-fork.md b/packages/moderation/data/messages/title/similarities-fork.md new file mode 100644 index 000000000..9318c8e75 --- /dev/null +++ b/packages/moderation/data/messages/title/similarities-fork.md @@ -0,0 +1,2 @@ +You may reference the source work in the Description of your fork, however, you must do so in a way that is unlikely to cause confusion or imply association with or endorsement from the author of the source work. +Additionally, per section 4 of %RULES%, we ask that you ensure your project's Name and Branding abide by the license of the source work. diff --git a/packages/moderation/data/messages/title/similarities-modpack.md b/packages/moderation/data/messages/title/similarities-modpack.md new file mode 100644 index 000000000..963a01f5a --- /dev/null +++ b/packages/moderation/data/messages/title/similarities-modpack.md @@ -0,0 +1 @@ +You may reference the projects that make up the focus point of your modpack, however, you must do so in a way that is unlikely to cause confusion or imply association with or endorsement from the author of that content. diff --git a/packages/moderation/data/messages/title/similarities.md b/packages/moderation/data/messages/title/similarities.md index 0011e5a16..280b5f0b9 100644 --- a/packages/moderation/data/messages/title/similarities.md +++ b/packages/moderation/data/messages/title/similarities.md @@ -1,3 +1,5 @@ ## Project Branding -Per section 1.8 of [Modrinth's Content Rules](https://modrinth.com/legal/rules) we ask that you change your project title and other relevant branding to avoid causing confusion or implying association with existing projects. +Per section 1.8 of %RULES%, your project or its branding must not imply association or be easily confused with any other person or organization. +We ask that you change your project's [Name](%PROJECT_SETTINGS_LINK%) and other relevant branding to avoid causing confusion or implying association with existing projects or individuals. +When editing your project's Name, remember to update its [URL](%PROJECT_SETTINGS_LINK%) to match. diff --git a/packages/moderation/data/messages/title/useless-info.md b/packages/moderation/data/messages/title/useless-info.md index 51e1f5182..f23185bff 100644 --- a/packages/moderation/data/messages/title/useless-info.md +++ b/packages/moderation/data/messages/title/useless-info.md @@ -1,7 +1,6 @@ -## Misuse of Title +## Misuse of Project Name -Per section 5.2 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous) we ask that you limit the title to just the name of your project. - -Additional information, such as themes, tags, supported versions or loaders, etc. should be saved for the Summary or Description. - -When changing your project title, remember to also ensure that your project slug (URL) matches and accurately represents your project. +Per section 5.2 of %RULES%, your project's [Name](%PROJECT_SETTINGS_LINK%) should not include unnecessary information such as loaders, themes, tags, or versions. +Your project's current Name of `%PROJECT_TITLE%` appears to contain extra information. +We ask that you remove all additional information from the [Name](%PROJECT_SETTINGS_LINK%). Instead, consider including this in your project's Summary or Description, or as a part of its relevant metadata. +When editing your project's Name, remember to update its [URL](%PROJECT_SETTINGS_LINK%) to match. diff --git a/packages/moderation/data/messages/undefined-project/no_versions.md b/packages/moderation/data/messages/undefined-project/no_versions.md new file mode 100644 index 000000000..e0f6a5ab1 --- /dev/null +++ b/packages/moderation/data/messages/undefined-project/no_versions.md @@ -0,0 +1,4 @@ +## No Versions + +It looks like all versions of your project have been deleted, meaning that our Moderation Team cannot finish reviewing your project. +Please resubmit your project once you've uploaded a new version. diff --git a/packages/moderation/data/messages/versions/alternate_versions-additional.md b/packages/moderation/data/messages/versions/alternate_versions-additional.md new file mode 100644 index 000000000..ad9023cda --- /dev/null +++ b/packages/moderation/data/messages/versions/alternate_versions-additional.md @@ -0,0 +1,5 @@ +## Unsupported Project + +Per section 5.7 of [Modrinth's Content Rules](https://modrinth.com/legal/rules), Modrinth does not support uploading multiple variations of your project as Additional files. +Having alternate versions of your content on the same project will hurt the functionality of the Modrinth App and other supported launchers as it would prevent users from updating your content, and may make it harder for your users to find the content they want. +We ask that you upload each alternate version of your project as a new project, ensuring that all users will be able to access and easily find your content. diff --git a/packages/moderation/data/messages/versions/alternate_versions-mono.md b/packages/moderation/data/messages/versions/alternate_versions-mono.md new file mode 100644 index 000000000..c4f7eb400 --- /dev/null +++ b/packages/moderation/data/messages/versions/alternate_versions-mono.md @@ -0,0 +1,5 @@ +## Unsupported Project + +Modrinth does not support uploading projects that have unnecessary or extraneous installation steps. +Having alternate versions of your content on the same project will hurt the functionality of the Modrinth App and other supported launchers as it would prevent users from updating your content, and may make it harder for your users to find the content they want. +We ask that you upload each alternate version of your project as a new project, ensuring that all users will be able to access and easily find your content. diff --git a/packages/moderation/data/messages/versions/alternate_versions-primary.md b/packages/moderation/data/messages/versions/alternate_versions-primary.md new file mode 100644 index 000000000..dd986956c --- /dev/null +++ b/packages/moderation/data/messages/versions/alternate_versions-primary.md @@ -0,0 +1,6 @@ +## Unsupported Project + +Modrinth does not support uploading multiple variations of your project as separate versions. +New Versions of your project should strictly be a linear upgrade of the same content. +Having alternate versions of your content on the same project will hurt the functionality of the Modrinth App and other supported launchers as it would prevent users from updating your content, and may make it harder for your users to find the content they want. +We ask that you upload each alternate version of your project as a new project, ensuring that all users will be able to access and easily find your content. diff --git a/packages/moderation/data/messages/versions/alternate_versions-server-additional.md b/packages/moderation/data/messages/versions/alternate_versions-server-additional.md new file mode 100644 index 000000000..7095cd848 --- /dev/null +++ b/packages/moderation/data/messages/versions/alternate_versions-server-additional.md @@ -0,0 +1,4 @@ +## Incorrect Additional Files + +Per section 5.7 of [Modrinth's Content Rules](https://modrinth.com/legal/rules) the additional files section should only be used for specific designated purposes such as a `Sources.jar`. +To ensure a smooth experience for you and your users, please upload each alternate version of your modpack as its own Modpack project, thank you. diff --git a/packages/moderation/data/messages/versions/alternate_versions-server.md b/packages/moderation/data/messages/versions/alternate_versions-server.md new file mode 100644 index 000000000..9123c5d45 --- /dev/null +++ b/packages/moderation/data/messages/versions/alternate_versions-server.md @@ -0,0 +1,6 @@ +## Unsupported Project + +Modrinth does not support uploading multiple variations of your project as separate versions. +New Versions of your project should strictly be a linear upgrade of the same content. +Having alternate versions of your content on the same project will hurt the functionality of the Modrinth App and other supported launchers as it would prevent users from updating your content, and may make it harder for your users to find the content they want. +To ensure a smooth experience for you and your users, please upload each alternate version of your modpack as its own Modpack project, thank you. diff --git a/packages/moderation/data/messages/versions/alternate_versions-zip.md b/packages/moderation/data/messages/versions/alternate_versions-zip.md new file mode 100644 index 000000000..284ffa871 --- /dev/null +++ b/packages/moderation/data/messages/versions/alternate_versions-zip.md @@ -0,0 +1,5 @@ +## Incorrect Additional Files + +Per section 5.7 of [Modrinth's Content Rules](https://modrinth.com/legal/rules) the additional files section should only be used for specific designated purposes such as a `Sources.jar`. +Modrinth does not support the upload of modpacks in the `.zip` format, as this may cause issues for Modrinth users or distribute copyrighted content without the proper permissions. +If you would like to upload a server-specific version of your modpack, consider creating a separate Modpack project. diff --git a/packages/moderation/data/messages/versions/broken_version.md b/packages/moderation/data/messages/versions/broken_version.md new file mode 100644 index 000000000..93d0721b6 --- /dev/null +++ b/packages/moderation/data/messages/versions/broken_version.md @@ -0,0 +1,5 @@ +## Broken Version + +It looks like you've uploaded multiple files with the same name to the same version. This triggers a bug that produces duplicate primary file entries. +This may cause issues for users and creators as it would prevent Modpacks that include this content from functioning in the Modrinth App and other launchers. +We ask that you delete and reupload all applicable versions. Be sure to only upload one file to each version before resubmission. diff --git a/packages/moderation/data/messages/versions/incorrect-additional-files.md b/packages/moderation/data/messages/versions/incorrect-additional-files.md deleted file mode 100644 index 34c9c72df..000000000 --- a/packages/moderation/data/messages/versions/incorrect-additional-files.md +++ /dev/null @@ -1,7 +0,0 @@ -## Incorrect Use of Additional Files - -It looks like you've uploaded multiple `mod.jar` files to one Version as Additional Files. Per section 5.7 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous) each Version of your project must include only one `mod.jar` that corresponds to its respective Minecraft and loader versions. - -This allows users to easily find and download the file they need for the version they're on with ease. The Additional Files feature can be used for things like a `Sources.jar`. - -Please upload each version of your mod separately, thank you. diff --git a/packages/moderation/data/messages/versions/incorrect_additional_files.md b/packages/moderation/data/messages/versions/incorrect_additional_files.md new file mode 100644 index 000000000..475367e1b --- /dev/null +++ b/packages/moderation/data/messages/versions/incorrect_additional_files.md @@ -0,0 +1,5 @@ +## Incorrect Use of Additional Files + +It looks like you've uploaded multiple primary files to one Version as Additional Files. Per section 5.7 of %RULES% each Version of your project must include only one primary file that corresponds to its respective Minecraft and loader versions. +This allows users to easily find and download the content they need for their game profile with ease. The Additional Files feature can be used for things like a `Sources.jar`. +Please upload each version of your project separately, thank you. diff --git a/packages/moderation/data/messages/versions/invalid-datapacks.md b/packages/moderation/data/messages/versions/invalid-datapacks.md new file mode 100644 index 000000000..5fd337183 --- /dev/null +++ b/packages/moderation/data/messages/versions/invalid-datapacks.md @@ -0,0 +1,3 @@ +## Data Packs on Modrinth + +It looks like you've selected loaders for your Data Pack that are causing it to be marked as a different project type. Data Packs must only be uploaded with the "Data Pack" loader selected. Please re-upload all versions of your data pack and make sure to only select "Data Pack" as the loader. diff --git a/packages/moderation/data/messages/versions/invalid-modpacks.md b/packages/moderation/data/messages/versions/invalid-modpacks.md index 62cb8fcaf..fc7cc8049 100644 --- a/packages/moderation/data/messages/versions/invalid-modpacks.md +++ b/packages/moderation/data/messages/versions/invalid-modpacks.md @@ -1,3 +1,5 @@ ## Modpacks on Modrinth -It looks like you've uploaded your Modpack as a `.zip`, unfortunately, this is invalid and is why your project type is "Mod". I recommend taking a look at our support page about [Modrinth Modpacks](https://support.modrinth.com/en/articles/8802250-modpacks-on-modrinth), and once you're ready feel free to resubmit your project as a `.mrpack`. Don't forget to delete the old files from your Versions! +It looks like you've uploaded your Modpack as a `.zip`, unfortunately, this is invalid and is why your project type is "Mod". Please refer to our support article to learn more about %MODPACKS_ON_MODRINTH%. +Once you're ready feel free to resubmit your project as a `.mrpack`. +Don't forget to delete the old files from your %PROJECT_VERSIONS_FLINK%! diff --git a/packages/moderation/data/messages/versions/redist_libs.md b/packages/moderation/data/messages/versions/redist_libs.md new file mode 100644 index 000000000..be6189801 --- /dev/null +++ b/packages/moderation/data/messages/versions/redist_libs.md @@ -0,0 +1,5 @@ +## Excessive File Size + +This project appears to include libs or dependencies, unnecessarily redistributing their entire contents. +This is often due to an error in project structure or compilation, and in some cases, may violate the copyrights or licensing agreements of these libraries. +We ask that you remove all unnecessary files, assets, and code from your project before resubmission. diff --git a/packages/moderation/data/messages/versions/vanilla_assets.md b/packages/moderation/data/messages/versions/vanilla_assets.md new file mode 100644 index 000000000..6b8fb6644 --- /dev/null +++ b/packages/moderation/data/messages/versions/vanilla_assets.md @@ -0,0 +1,4 @@ +## Vanilla Assets + +Your resource pack currently includes an excessive amount of unmodified assets from vanilla Minecraft. +Please remove these from your pack and ensure your project only contains original assets created by you, thank you. diff --git a/packages/moderation/data/modpack-permissions-stage.ts b/packages/moderation/data/modpack-permissions-stage.ts index c64b3b74d..e3c7414da 100644 --- a/packages/moderation/data/modpack-permissions-stage.ts +++ b/packages/moderation/data/modpack-permissions-stage.ts @@ -1,15 +1,22 @@ import type { ModerationModpackPermissionApprovalType, Project } from '@modrinth/utils' import type { Stage } from '../types/stage' -import { BoxIcon } from '@modrinth/assets' +import { PackageOpenIcon } from '@modrinth/assets' export default { id: 'modpack-permissions', title: 'Modpack Permissions', - icon: BoxIcon, + icon: PackageOpenIcon, // Replace me please. - guidance_url: 'https://docs.modrinth.com/moderation/modpack-permissions', + guidance_url: + 'https://www.notion.so/Content-Moderation-Cheat-Sheets-22d5ee711bf081a4920ef08879fe6bf5?source=copy_link#22d5ee711bf08116bd8bc1186f357062', shouldShow: (project: Project) => project.project_type === 'modpack', - actions: [], + actions: [ + { + id: 'button', + type: 'button', + label: 'This dummy button must be present or the stage will not appear.', + }, + ], } as Stage export const finalPermissionMessages: Record< @@ -18,7 +25,7 @@ export const finalPermissionMessages: Record< > = { yes: undefined, 'with-attribution-and-source': undefined, - 'with-attribution': `The following content has attribution requirements, meaning that you must link back to the page where you originally found this content in your modpack description or version changelog (e.g. linking a mod's CurseForge page if you got it from CurseForge):`, + 'with-attribution': `The following content has attribution requirements, meaning that you must link back to the page where you originally found this content in your Modpack's description or version changelog (e.g. linking a mod's CurseForge page if you got it from CurseForge):`, no: 'The following content is not allowed in Modrinth modpacks due to licensing restrictions. Please contact the author(s) directly for permission or remove the content from your modpack:', 'permanent-no': `The following content is not allowed in Modrinth modpacks, regardless of permission obtained. This may be because it breaks Modrinth's content rules or because the authors, upon being contacted for permission, have declined. Please remove the content from your modpack:`, unidentified: `The following content could not be identified. Please provide proof of its origin along with proof that you have permission to include it:`, diff --git a/packages/moderation/data/stages/categories.ts b/packages/moderation/data/stages/categories.ts index d3a89710e..5ef5840b8 100644 --- a/packages/moderation/data/stages/categories.ts +++ b/packages/moderation/data/stages/categories.ts @@ -3,21 +3,53 @@ import type { ButtonAction } from '../../types/actions' import { TagsIcon } from '@modrinth/assets' const categories: Stage = { - title: "Are the project's tags/categories accurate?", + title: "Are the project's tags accurate?", id: 'tags', icon: TagsIcon, guidance_url: 'https://modrinth.com/legal/rules#miscellaneous', navigate: '/settings/tags', + shouldShow: (project) => + project.categories.length > 0 || project.additional_categories.length > 0, + text: async () => { + return (await import('../messages/checklist-text/categories.md?raw')).default + }, actions: [ { id: 'categories_inaccurate', type: 'button', label: 'Inaccurate', - weight: 10, + weight: 700, suggestedStatus: 'flagged', severity: 'low', message: async () => (await import('../messages/categories/inaccurate.md?raw')).default, + disablesActions: ['categories_optimization_misused', 'categories_resolutions_misused'], } as ButtonAction, + { + id: 'categories_optimization_misused', + type: 'button', + label: 'Optimization', + weight: 701, + suggestedStatus: 'flagged', + severity: 'low', + shouldShow: (project) => project.categories.includes('optimization'), + message: async () => + (await import('../messages/categories/inaccurate.md?raw')).default + + (await import('../messages/categories/optimization_misused.md?raw')).default, + disablesActions: ['categories_inaccurate', 'categories_resolutions_misused'], + } as ButtonAction, + { + id: 'categories_resolutions_misused', + type: 'button', + label: 'Resolutions', + weight: 702, + suggestedStatus: 'flagged', + severity: 'low', + shouldShow: (project) => project.project_type === 'resourcepack', + message: async () => + (await import('../messages/categories/inaccurate.md?raw')).default + + (await import('../messages/categories/resolutions_misused.md?raw')).default, + disablesActions: ['categories_inaccurate', 'categories_optimization_misused'], + }, ], } diff --git a/packages/moderation/data/stages/copyright.ts b/packages/moderation/data/stages/copyright.ts deleted file mode 100644 index 64d5a8ae4..000000000 --- a/packages/moderation/data/stages/copyright.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { Stage } from '../../types/stage' -import type { ButtonAction } from '../../types/actions' -import { CopyrightIcon } from '@modrinth/assets' - -const copyright: Stage = { - title: 'Does the author have proper permissions to post this project?', - id: 'copyright', - icon: CopyrightIcon, - guidance_url: 'https://modrinth.com/legal/rules', - actions: [ - { - id: 'copyright_reupload', - type: 'button', - label: 'Re-upload', - weight: 10, - suggestedStatus: 'rejected', - severity: 'high', - message: async () => (await import('../messages/copyright/reupload.md?raw')).default, - relevantExtraInput: [ - { - label: 'What is the title of the original project?', - variable: 'ORIGINAL_PROJECT', - required: true, - suggestions: ['Vanilla Tweaks'], - }, - { - label: 'What is the author of the original project?', - variable: 'ORIGINAL_AUTHOR', - required: true, - suggestions: ['Vanilla Tweaks Team'], - }, - ], - } as ButtonAction, - ], -} - -export default copyright diff --git a/packages/moderation/data/stages/description.ts b/packages/moderation/data/stages/description.ts index 9afe05b4b..beab75148 100644 --- a/packages/moderation/data/stages/description.ts +++ b/packages/moderation/data/stages/description.ts @@ -3,7 +3,7 @@ import type { ButtonAction } from '../../types/actions' import { LibraryIcon } from '@modrinth/assets' const description: Stage = { - title: "Is the project's description sufficient?", + title: 'Is the description sufficient, accurate, and accessible?', id: 'description', icon: LibraryIcon, guidance_url: 'https://modrinth.com/legal/rules#general-expectations', @@ -13,7 +13,7 @@ const description: Stage = { id: 'description_insufficient', type: 'button', label: 'Insufficient (custom)', - weight: 10, + weight: 400, suggestedStatus: 'flagged', severity: 'medium', message: async () => (await import('../messages/description/insufficient.md?raw')).default, @@ -30,7 +30,7 @@ const description: Stage = { id: 'description_insufficient_packs', type: 'button', label: 'Insufficient', - weight: 10, + weight: 401, suggestedStatus: 'flagged', severity: 'medium', shouldShow: (project) => project.project_type === 'modpack', @@ -41,7 +41,7 @@ const description: Stage = { id: 'description_insufficient_projects', type: 'button', label: 'Insufficient', - weight: 10, + weight: 401, suggestedStatus: 'flagged', severity: 'medium', shouldShow: (project) => project.project_type !== 'modpack', @@ -52,7 +52,7 @@ const description: Stage = { id: 'description_non_english', type: 'button', label: 'Non-english', - weight: 10, + weight: 402, suggestedStatus: 'flagged', severity: 'medium', message: async () => (await import('../messages/description/non-english.md?raw')).default, @@ -61,23 +61,16 @@ const description: Stage = { id: 'description_unfinished', type: 'button', label: 'Unfinished', - weight: 10, + weight: 403, suggestedStatus: 'flagged', severity: 'low', message: async () => (await import('../messages/description/unfinished.md?raw')).default, - relevantExtraInput: [ - { - label: 'Please specify the reason the description appears unfinished.', - variable: 'REASON', - required: true, - }, - ], } as ButtonAction, { id: 'description_headers_as_body', type: 'button', label: 'Headers as body text', - weight: 10, + weight: 404, suggestedStatus: 'flagged', severity: 'low', message: async () => (await import('../messages/description/headers-as-body.md?raw')).default, @@ -86,7 +79,7 @@ const description: Stage = { id: 'description_image_only', type: 'button', label: 'Image-only', - weight: 10, + weight: 405, suggestedStatus: 'flagged', severity: 'medium', message: async () => (await import('../messages/description/image-only.md?raw')).default, @@ -95,7 +88,7 @@ const description: Stage = { id: 'description_non_standard_text', type: 'button', label: 'Non-standard text', - weight: 10, + weight: 406, suggestedStatus: 'flagged', severity: 'medium', message: async () => diff --git a/packages/moderation/data/stages/gallery.ts b/packages/moderation/data/stages/gallery.ts index d7dcb6c7e..6732ad0f3 100644 --- a/packages/moderation/data/stages/gallery.ts +++ b/packages/moderation/data/stages/gallery.ts @@ -13,7 +13,7 @@ const gallery: Stage = { id: 'gallery_insufficient', type: 'button', label: 'Insufficient', - weight: 10, + weight: 900, suggestedStatus: 'flagged', severity: 'low', message: async () => (await import('../messages/gallery/insufficient.md?raw')).default, @@ -22,7 +22,7 @@ const gallery: Stage = { id: 'gallery_not_relevant', type: 'button', label: 'Not relevant', - weight: 10, + weight: 901, suggestedStatus: 'flagged', severity: 'low', message: async () => (await import('../messages/gallery/not-relevant.md?raw')).default, diff --git a/packages/moderation/data/stages/license.ts b/packages/moderation/data/stages/license.ts new file mode 100644 index 000000000..6a8ff0fdd --- /dev/null +++ b/packages/moderation/data/stages/license.ts @@ -0,0 +1,100 @@ +import { BookTextIcon } from '@modrinth/assets' +import type { Stage } from '../../types/stage' + +const licensesNotRequiringSource: string[] = [ + 'LicenseRef-All-Rights-Reserved', + 'Apache-2.0', + 'BSD-2-Clause', + 'BSD-3-Clause', + 'CC0-1.0', + 'CC-BY-4.0', + 'CC-BY-SA-4.0', + 'CC-BY-NC-4.0', + 'CC-BY-NC-SA-4.0', + 'CC-BY-ND-4.0', + 'CC-BY-NC-ND-4.0', + 'ISC', + 'MIT', + 'Zlib', +] + +const licenseStage: Stage = { + title: 'Is this license and link valid?', + text: async (project) => { + let text = '' + text += (await import('../messages/checklist-text/license/id.md?raw')).default + if (project.license.url) + text += (await import('../messages/checklist-text/license/link.md?raw')).default + + return text + }, + id: 'license', + icon: BookTextIcon, + guidance_url: 'https://modrinth.com/legal/rules#miscellaneous', + navigate: '/settings/license', + actions: [ + { + id: 'license_invalid_link', + type: 'button', + label: 'Invalid Link', + weight: 600, + suggestedStatus: 'flagged', + severity: 'medium', + shouldShow: (project) => Boolean(project.license.url), + message: async () => (await import('../messages/license/invalid_link.md?raw')).default, + enablesActions: [ + { + id: 'license_invalid_link-custom_license', + type: 'toggle', + label: 'Invalid Link: Custom License', + weight: 601, + suggestedStatus: 'flagged', + severity: 'medium', + message: async () => + (await import('../messages/license/invalid_link-custom_license.md?raw')).default, + }, + ], + }, + // { + // id: 'license_no_source', + // type: 'conditional-button', + // label: 'No Source', + // fallbackWeight: 602, + // suggestedStatus: 'rejected', + // severity: 'medium', + // fallbackMessage: async () => (await import('../messages/license/no_source.md?raw')).default, + // messageVariants: [ + // { + // conditions: { + // requiredActions: ['reupload_unclear_fork'], + // }, + // weight: 602, + // message: async () => (await import('../messages/license/no_source-fork.md?raw')).default, + // }, + // ], + // }, + { + id: 'license_no_source', + type: 'button', + label: 'No Source', + weight: 602, + suggestedStatus: 'rejected', + severity: 'medium', + shouldShow: (project) => !licensesNotRequiringSource.includes(project.license.id), + message: async () => (await import('../messages/license/no_source.md?raw')).default, + enablesActions: [ + { + id: 'license_no_source-fork', + type: 'toggle', + label: 'No Source: Fork', + weight: 602, + suggestedStatus: 'rejected', + severity: 'high', + message: async () => (await import('../messages/license/no_source-fork.md?raw')).default, + }, + ], + }, + ], +} + +export default licenseStage diff --git a/packages/moderation/data/stages/links.ts b/packages/moderation/data/stages/links.ts index 531c15fb0..73d6209e4 100644 --- a/packages/moderation/data/stages/links.ts +++ b/packages/moderation/data/stages/links.ts @@ -3,43 +3,81 @@ import type { ButtonAction } from '../../types/actions' import { LinkIcon } from '@modrinth/assets' const links: Stage = { - title: "Are the project's links accessible and not misleading?", + title: "Are the project's links accurate and accessible?", id: 'links', icon: LinkIcon, - guidance_url: 'https://modrinth.com/legal/rules#miscellaneous', + guidance_url: 'https://modrinth.com/legal/rules', navigate: '/settings/links', + shouldShow: (project) => + Boolean( + project.issues_url || + project.source_url || + project.wiki_url || + project.discord_url || + project.donation_urls.length > 0, + ), + text: async (project) => { + let text = (await import('../messages/checklist-text/links/base.md?raw')).default + + if (project.donation_urls.length > 0) { + text += (await import('../messages/checklist-text/links/donation/donations.md?raw')).default + + for (const donation of project.donation_urls) { + text += (await import(`../messages/checklist-text/links/donation/donation.md?raw`)).default + .replace('{URL}', donation.url) + .replace('{PLATFORM}', donation.platform) + } + } + + return text + }, actions: [ { id: 'links_misused', type: 'button', label: 'Links are misused', - weight: 10, + weight: 500, suggestedStatus: 'flagged', severity: 'low', message: async () => (await import('../messages/links/misused.md?raw')).default, - } as ButtonAction, - { - id: 'links_not_accessible_source', - type: 'button', - label: 'Not accessible (source)', - weight: 10, - suggestedStatus: 'flagged', - severity: 'low', - message: async () => (await import('../messages/links/not-accessible-source.md?raw')).default, - } as ButtonAction, - { - id: 'links_not_accessible_other', - type: 'button', - label: 'Not accessible (other)', - weight: 10, - suggestedStatus: 'flagged', - severity: 'low', - message: async () => (await import('../messages/links/not-accessible-other.md?raw')).default, relevantExtraInput: [ { - label: 'Please specify the link type that is inaccessible.', - variable: 'LINK', - required: true, + label: 'What links are misused?', + variable: 'MISUSED_LINKS', + required: false, + }, + ], + } as ButtonAction, + { + id: 'links_unaccessible', + type: 'button', + label: 'Links are inaccessible', + weight: 510, + suggestedStatus: 'flagged', + // Theoretically a conditional could go here to prevent overlap of misuse and unaccessible messages repeating while still allowing for a multi-select in each. + // if links_misused was selected, send nothing. + message: async () => (await import('../messages/links/not_accessible.md?raw')).default, + enablesActions: [ + { + id: 'links_unaccessible_options', + type: 'multi-select-chips', + label: 'Warn of unaccessible link?', + options: [ + { + label: 'Source', + weight: 511, + shouldShow: (project) => Boolean(project.source_url), + message: async () => + (await import('../messages/links/not_accessible-source.md?raw')).default, + }, + { + label: 'Discord', + weight: 512, + shouldShow: (project) => Boolean(project.discord_url), + message: async () => + (await import('../messages/links/not_accessible-discord.md?raw')).default, + }, + ], }, ], } as ButtonAction, diff --git a/packages/moderation/data/stages/reupload.ts b/packages/moderation/data/stages/reupload.ts new file mode 100644 index 000000000..24c637669 --- /dev/null +++ b/packages/moderation/data/stages/reupload.ts @@ -0,0 +1,77 @@ +import type { Stage } from '../../types/stage' +import type { ButtonAction } from '../../types/actions' +import { CopyrightIcon } from '@modrinth/assets' + +const reupload: Stage = { + title: 'Does the author have proper permissions to post this project?', + id: 'reupload', + icon: CopyrightIcon, + guidance_url: 'https://modrinth.com/legal/rules', + actions: [ + { + id: 'reupload_reupload', + type: 'button', + label: 'Re-upload', + weight: 1100, + suggestedStatus: 'rejected', + severity: 'high', + message: async () => (await import('../messages/reupload/reupload.md?raw')).default, + disablesActions: [ + 'reupload_unclear_fork', + 'reupload_insufficient_fork', + 'reupload_request_proof', + ], + relevantExtraInput: [ + { + label: 'What is the title of the original project?', + variable: 'ORIGINAL_PROJECT', + required: true, + suggestions: ['Vanilla Tweaks'], + }, + { + label: 'What is the author of the original project?', + variable: 'ORIGINAL_AUTHOR', + required: true, + suggestions: ['Vanilla Tweaks Team'], + }, + ], + } as ButtonAction, + { + id: 'reupload_unclear_fork', + type: 'button', + label: 'Unclear Fork', + weight: 1100, + suggestedStatus: 'rejected', + severity: 'high', + message: async () => (await import('../messages/reupload/fork.md?raw')).default, + // disablesActions: [ + // 'reupload_reupload', + // 'reupload_insufficient_fork', + // 'reupload_request_proof', + // ], + } as ButtonAction, + { + id: 'reupload_insufficient_fork', + type: 'button', + label: 'Insufficient Fork', + weight: 1100, + suggestedStatus: 'rejected', + severity: 'high', + message: async () => (await import('../messages/reupload/insufficient_fork.md?raw')).default, + // disablesActions: ['reupload_unclear_fork', 'reupload_reupload', 'reupload_request_proof'], + } as ButtonAction, + { + id: 'reupload_request_proof', + type: 'button', + label: 'Proof of permissions', + weight: 1100, + suggestedStatus: 'rejected', + severity: 'high', + message: async () => + (await import('../messages/reupload/proof_of_permissions.md?raw')).default, + // disablesActions: ['reupload_reupload', 'reupload_unclear_fork', 'reupload_insufficient_fork'], + }, + ], +} + +export default reupload diff --git a/packages/moderation/data/stages/rule-following.ts b/packages/moderation/data/stages/rule-following.ts index 15bad9359..1d382e5db 100644 --- a/packages/moderation/data/stages/rule-following.ts +++ b/packages/moderation/data/stages/rule-following.ts @@ -3,17 +3,18 @@ import type { ButtonAction } from '../../types/actions' import { ListBulletedIcon } from '@modrinth/assets' const ruleFollowing: Stage = { - title: 'Does this project break our content rules?', + title: 'Does this project violate the rules?', id: 'rule-following', icon: ListBulletedIcon, - guidance_url: 'https://modrinth.com/legal/rules', - navigate: '/', + guidance_url: + 'https://www.notion.so/Creator-Communication-Guide-1b65ee711bf080ec9337e3ccdded146c', + navigate: '/moderation', actions: [ { id: 'rule_breaking_yes', type: 'button', label: 'Yes', - weight: 10, + weight: 0, suggestedStatus: 'rejected', severity: 'critical', message: async () => (await import('../messages/rule-breaking.md?raw')).default, diff --git a/packages/moderation/data/stages/side-types.ts b/packages/moderation/data/stages/side-types.ts index 3a37a89ad..1dda8e85b 100644 --- a/packages/moderation/data/stages/side-types.ts +++ b/packages/moderation/data/stages/side-types.ts @@ -12,8 +12,8 @@ const sideTypes: Stage = { { id: 'side_types_inaccurate_modpack', type: 'button', - label: 'Inaccurate (modpack)', - weight: 10, + label: 'Inaccurate', + weight: 800, suggestedStatus: 'flagged', severity: 'low', shouldShow: (project) => project.project_type === 'modpack', @@ -23,8 +23,8 @@ const sideTypes: Stage = { { id: 'side_types_inaccurate_mod', type: 'button', - label: 'Inaccurate (mod)', - weight: 10, + label: 'Inaccurate', + weight: 800, suggestedStatus: 'flagged', severity: 'low', shouldShow: (project) => project.project_type === 'mod', diff --git a/packages/moderation/data/stages/slug.ts b/packages/moderation/data/stages/slug.ts deleted file mode 100644 index 6fad5c813..000000000 --- a/packages/moderation/data/stages/slug.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { HashIcon } from '@modrinth/assets' -import type { Stage } from '../../types/stage' - -const slugStage: Stage = { - title: 'Is the slug accurate and appropriate?', - id: 'slug', - icon: HashIcon, - guidance_url: 'https://modrinth.com/legal/rules#miscellaneous', - navigate: '/settings', - actions: [ - { - id: 'slug_misused', - type: 'button', - label: 'Misused', - weight: 100, - suggestedStatus: 'flagged', - severity: 'low', - message: async () => (await import('../messages/slug/misused.md?raw')).default, - }, - ], -} - -export default slugStage diff --git a/packages/moderation/data/stages/status-alerts.ts b/packages/moderation/data/stages/status-alerts.ts new file mode 100644 index 000000000..fd6d1c63d --- /dev/null +++ b/packages/moderation/data/stages/status-alerts.ts @@ -0,0 +1,53 @@ +import type { Stage } from '../../types/stage' +import type { ButtonAction } from '../../types/actions' +import { TriangleAlertIcon } from '@modrinth/assets' + +const statusAlerts: Stage = { + title: `Is anything else affecting this project's status?`, + id: 'status-alerts', + icon: TriangleAlertIcon, + text: async () => (await import('../messages/checklist-text/status-alerts/text.md?raw')).default, + guidance_url: + 'https://www.notion.so/Project-Modification-Guidelines-22e5ee711bf080628416f0471ba6af02', + navigate: '/moderation', + actions: [ + { + id: 'status_corrections_applied', + type: 'button', + label: 'Corrections applied', + weight: 999999, + suggestedStatus: 'approved', + disablesActions: ['status_private_use', 'status_account_issues'], + message: async () => (await import('../messages/status-alerts/fixed.md?raw')).default, + } as ButtonAction, + { + id: 'status_private_use', + type: 'button', + label: 'Private use', + weight: 999999, + suggestedStatus: 'flagged', + disablesActions: ['status_corrections_applied', 'status_account_issues'], + message: async () => (await import('../messages/status-alerts/private.md?raw')).default, + } as ButtonAction, + { + id: 'status_account_issues', + type: 'button', + label: 'Account issues', + weight: 999999, + suggestedStatus: 'rejected', + disablesActions: ['status_corrections_applied', 'status_private_use'], + message: async () => + (await import('../messages/status-alerts/account_issues.md?raw')).default, + } as ButtonAction, + { + id: 'status_automod_confusion', + type: 'button', + label: `Automod confusion`, + weight: 999999, + message: async () => + (await import('../messages/status-alerts/automod_confusion.md?raw')).default, + } as ButtonAction, + ], +} + +export default statusAlerts diff --git a/packages/moderation/data/stages/summary.ts b/packages/moderation/data/stages/summary.ts index 5e4834d54..72de764bc 100644 --- a/packages/moderation/data/stages/summary.ts +++ b/packages/moderation/data/stages/summary.ts @@ -4,6 +4,7 @@ import { AlignLeftIcon } from '@modrinth/assets' const summary: Stage = { title: "Is the project's summary sufficient?", + text: async () => (await import('../messages/checklist-text/summary/summary.md?raw')).default, id: 'summary', icon: AlignLeftIcon, guidance_url: 'https://modrinth.com/legal/rules#miscellaneous', @@ -12,25 +13,27 @@ const summary: Stage = { id: 'summary_insufficient', type: 'button', label: 'Insufficient', - weight: 10, + weight: 300, suggestedStatus: 'flagged', severity: 'low', + disablesActions: ['summary_repeat_title'], message: async () => (await import('../messages/summary/insufficient.md?raw')).default, } as ButtonAction, { id: 'summary_repeat_title', type: 'button', label: 'Repeat of title', - weight: 10, + weight: 300, suggestedStatus: 'flagged', severity: 'low', + disablesActions: ['summary_insufficient'], message: async () => (await import('../messages/summary/repeat-title.md?raw')).default, } as ButtonAction, { id: 'summary_formatting', type: 'button', label: 'Formatting', - weight: 10, + weight: 301, suggestedStatus: 'flagged', severity: 'low', message: async () => (await import('../messages/summary/formatting.md?raw')).default, @@ -39,7 +42,7 @@ const summary: Stage = { id: 'summary_non_english', type: 'button', label: 'Non-english', - weight: 10, + weight: 302, suggestedStatus: 'flagged', severity: 'medium', message: async () => (await import('../messages/summary/non-english.md?raw')).default, diff --git a/packages/moderation/data/stages/title-slug.ts b/packages/moderation/data/stages/title-slug.ts new file mode 100644 index 000000000..4fe699a69 --- /dev/null +++ b/packages/moderation/data/stages/title-slug.ts @@ -0,0 +1,77 @@ +import { BookOpenIcon } from '@modrinth/assets' +import type { Stage } from '../../types/stage' + +const titleSlug: Stage = { + title: 'Are the Name and URL accurate and appropriate?', + id: 'title-&-slug', + text: async () => (await import('../messages/checklist-text/title-slug.md?raw')).default, + icon: BookOpenIcon, + guidance_url: 'https://modrinth.com/legal/rules#miscellaneous', + actions: [ + { + id: 'title_useless_info', + type: 'button', + label: 'Contains useless info', + weight: 100, + suggestedStatus: 'flagged', + severity: 'low', + message: async () => (await import('../messages/title/useless-info.md?raw')).default, + }, + { + id: 'title_minecraft_branding', + type: 'button', + label: 'Minecraft title', + weight: 100, + suggestedStatus: 'flagged', + severity: 'medium', + message: async () => (await import('../messages/title/minecraft-branding.md?raw')).default, + }, + { + id: 'title_similarities', + type: 'button', + label: 'Title similarities', + weight: 110, + suggestedStatus: 'flagged', + severity: 'medium', + message: async () => (await import('../messages/title/similarities.md?raw')).default, + enablesActions: [ + { + id: 'title_similarities_options', + type: 'multi-select-chips', + label: 'Similarities additional info', + options: [ + { + label: 'Modpack named after mod', + weight: 111, + shouldShow: (project) => project.project_type === 'modpack', + message: async () => + (await import('../messages/title/similarities-modpack.md?raw')).default, + }, + { + label: 'Forked project', + weight: 112, + message: async () => + (await import('../messages/title/similarities-fork.md?raw')).default, + }, + ], + }, + ], + }, + { + id: 'slug_misused_options', + type: 'multi-select-chips', + label: 'Slug issues?', + suggestedStatus: 'rejected', + severity: 'low', + options: [ + { + label: 'Misused', + weight: 200, + message: async () => (await import('../messages/slug/misused.md?raw')).default, + }, + ], + }, + ], +} + +export default titleSlug diff --git a/packages/moderation/data/stages/title.ts b/packages/moderation/data/stages/title.ts deleted file mode 100644 index 1bc15d383..000000000 --- a/packages/moderation/data/stages/title.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { BookOpenIcon } from '@modrinth/assets' -import type { Stage } from '../../types/stage' - -const titleStage: Stage = { - title: 'Is this title free of useless information?', - text: async () => '**Title:** `%PROJECT_TITLE%`', - id: 'title', - icon: BookOpenIcon, - guidance_url: 'https://modrinth.com/legal/rules#miscellaneous', - actions: [ - { - id: 'title_useless_info', - type: 'button', - label: 'Contains useless info', - weight: 100, - suggestedStatus: 'flagged', - severity: 'low', - message: async () => (await import('../messages/title/useless-info.md?raw')).default, - }, - { - id: 'title_minecraft_branding', - type: 'button', - label: 'Minecraft title', - weight: 100, - suggestedStatus: 'flagged', - severity: 'medium', - message: async () => (await import('../messages/title/minecraft-branding.md?raw')).default, - }, - { - id: 'title_similarities', - type: 'button', - label: 'Title similarities', - weight: 100, - suggestedStatus: 'flagged', - severity: 'medium', - message: async () => (await import('../messages/title/similarities.md?raw')).default, - }, - ], -} - -export default titleStage diff --git a/packages/moderation/data/stages/undefined-project.ts b/packages/moderation/data/stages/undefined-project.ts new file mode 100644 index 000000000..bf729d430 --- /dev/null +++ b/packages/moderation/data/stages/undefined-project.ts @@ -0,0 +1,24 @@ +import { XIcon } from '@modrinth/assets' +import type { Stage } from '../../types/stage' + +const undefinedProjectStage: Stage = { + title: 'This project is undefined!', + id: 'undefined-project', + icon: XIcon, + guidance_url: 'https://modrinth.com/legal/rules#miscellaneous', + navigate: '/versions', + shouldShow: (project) => project.versions.length === 0, + actions: [ + { + id: 'undefined_no_versions', + type: 'button', + label: 'No Versions', + weight: -100, + suggestedStatus: 'rejected', + message: async () => + (await import('../messages/undefined-project/no_versions.md?raw')).default, + }, + ], +} + +export default undefinedProjectStage diff --git a/packages/moderation/data/stages/versions.ts b/packages/moderation/data/stages/versions.ts index 7e96bec1a..e93840adc 100644 --- a/packages/moderation/data/stages/versions.ts +++ b/packages/moderation/data/stages/versions.ts @@ -1,9 +1,9 @@ import type { Stage } from '../../types/stage' -import type { ButtonAction } from '../../types/actions' +import type { ButtonAction, DropdownAction, DropdownActionOption } from '../../types/actions' import { VersionIcon } from '@modrinth/assets' const versions: Stage = { - title: "Are these project's files correct?", + title: "Are this project's files correct?", id: 'versions', icon: VersionIcon, guidance_url: 'https://modrinth.com/legal/rules#miscellaneous', @@ -13,33 +13,140 @@ const versions: Stage = { id: 'versions_incorrect_additional', type: 'button', label: 'Incorrect additional files', - weight: 10, + weight: 1000, suggestedStatus: 'flagged', severity: 'medium', message: async () => - (await import('../messages/versions/incorrect-additional-files.md?raw')).default, + (await import('../messages/versions/incorrect_additional_files.md?raw')).default, } as ButtonAction, { - id: 'versions_invalid_modpacks', + id: 'versions_incorrect_project_type', type: 'button', - label: 'Invalid file type (modpacks)', - weight: 10, + label: 'Incorrect Project Type', suggestedStatus: 'rejected', severity: 'medium', - shouldShow: (project) => project.project_type === 'modpack', - message: async () => (await import('../messages/versions/invalid-modpacks.md?raw')).default, + enablesActions: [ + { + id: 'versions_incorrect_project_type_options', + type: 'dropdown', + label: 'What type should this project be?', + options: [ + { + label: 'Modpack', + weight: 1001, + shouldShow: (project) => project.project_type !== 'modpack', + message: async () => + (await import('../messages/versions/invalid-modpacks.md?raw')).default, + } as DropdownActionOption, + { + label: 'Resource Pack', + weight: 1001, + shouldShow: (project) => project.project_type !== 'resourcepack', + message: async () => + (await import('../messages/versions/invalid-resourcepacks.md?raw')).default, + } as DropdownActionOption, + { + label: 'Data Pack', + weight: 1001, + shouldShow: (project) => !project.loaders.includes('datapack'), + message: async () => + (await import('../messages/versions/invalid-datapacks.md?raw')).default, + } as DropdownActionOption, + ], + } as DropdownAction, + ], } as ButtonAction, { - id: 'versions_invalid_resourcepacks', + id: 'versions_alternate_versions', type: 'button', - label: 'Invalid file type (resourcepacks)', - weight: 10, - suggestedStatus: 'rejected', + label: 'Alternate Versions', + suggestedStatus: 'flagged', severity: 'medium', + enablesActions: [ + { + id: 'versions_incorrect_project_type_options', + type: 'dropdown', + label: 'How are the alternate versions distributed?', + options: [ + { + label: 'Primary Files', + weight: 1002, + message: async () => + (await import('../messages/versions/alternate_versions-primary.md?raw')).default, + } as DropdownActionOption, + { + label: 'Additional Files', + weight: 1002, + message: async () => + (await import('../messages/versions/alternate_versions-additional.md?raw')).default, + } as DropdownActionOption, + { + label: 'Monofile', + weight: 1002, + shouldShow: (project) => + project.project_type === 'resourcepack' || project.loaders.includes('datapack'), + message: async () => + (await import('../messages/versions/alternate_versions-mono.md?raw')).default, + } as DropdownActionOption, + { + label: 'Server Files (Primary Files)', + weight: 1002, + shouldShow: (project) => project.project_type === 'modpack', + message: async () => + (await import('../messages/versions/alternate_versions-server.md?raw')).default, + } as DropdownActionOption, + { + label: 'Server Files (Additional Files)', + weight: 1002, + suggestedStatus: 'rejected', + severity: 'high', + shouldShow: (project) => project.project_type === 'modpack', + message: async () => + (await import('../messages/versions/alternate_versions-server-additional.md?raw')) + .default, + } as DropdownActionOption, + { + label: 'mods.zip', + weight: 1002, + suggestedStatus: 'rejected', + severity: 'high', + shouldShow: (project) => project.project_type === `modpack`, + message: async () => + (await import('../messages/versions/alternate_versions-zip.md?raw')).default, + } as DropdownActionOption, + ], + } as DropdownAction, + ], + } as ButtonAction, + { + id: 'versions_vanilla_assets', + type: 'button', + label: 'Vanilla Assets', + suggestedStatus: `rejected`, + severity: `medium`, + weight: 1003, shouldShow: (project) => project.project_type === 'resourcepack', - message: async () => - (await import('../messages/versions/invalid-resourcepacks.md?raw')).default, + message: async () => (await import('../messages/versions/vanilla_assets.md?raw')).default, } as ButtonAction, + { + id: 'versions_redist_libs', + type: 'button', + label: 'Oversized File', + suggestedStatus: `rejected`, + severity: `medium`, + weight: 1003, + shouldShow: (project) => project.project_type === 'mod', + message: async () => (await import('../messages/versions/redist_libs.md?raw')).default, + } as ButtonAction, + { + id: 'versions_duplicate_primary_files', + type: 'button', + label: 'Duplicate Primary Files', + suggestedStatus: 'flagged', + severity: `medium`, + weight: 1004, + message: async () => (await import('../messages/versions/broken_version.md?raw')).default, + }, ], } diff --git a/packages/moderation/types/stage.ts b/packages/moderation/types/stage.ts index 661cec83e..70be14708 100644 --- a/packages/moderation/types/stage.ts +++ b/packages/moderation/types/stage.ts @@ -14,7 +14,7 @@ export interface Stage { /** * An optional description or additional text for the stage. */ - text?: () => Promise + text?: (project: Project) => Promise /** * Optional id for the stage, used for identification in the checklist. Will be used in the stage list as well instead of the title. diff --git a/packages/moderation/utils.ts b/packages/moderation/utils.ts index 48f843968..202b3ffa1 100644 --- a/packages/moderation/utils.ts +++ b/packages/moderation/utils.ts @@ -229,6 +229,10 @@ export function kebabToTitleCase(input: string): string { .join(' ') } +export function arrayOrNone(arr: string[]): string { + return arr.length > 0 ? arr.join(', ') : 'None' +} + export function flattenProjectVariables(project: Project): Record { const vars: Record = {} @@ -236,17 +240,17 @@ export function flattenProjectVariables(project: Project): Record=8.6.0'} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -9336,7 +9339,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -9512,7 +9515,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10659,6 +10662,10 @@ snapshots: dependencies: '@types/node': 20.14.11 + '@types/glob@9.0.0': + dependencies: + glob: 10.4.2 + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -12392,6 +12399,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.0: + dependencies: + ms: 2.1.3 + debug@4.4.0(supports-color@9.4.0): dependencies: ms: 2.1.3 @@ -13154,7 +13165,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -13369,14 +13380,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {}