feat:移除了弹窗,服务器添加sls

This commit is contained in:
2026-09-08 22:39:45 +08:00
commit 6a295f9a7a
4082 changed files with 1322534 additions and 0 deletions

View File

@ -0,0 +1,27 @@
/**
* @see https://prettier.io/docs/configuration
* @type {import("prettier").Config}
*/
module.exports = {
semi: false,
singleQuote: true,
plugins: ['prettier-plugin-toml', 'prettier-plugin-sql-cst', '@prettier/plugin-xml'],
overrides: [
{
files: ['*.sql'],
options: {
parser: 'sqlite',
sqlAcceptUnsupportedGrammar: true,
},
},
{
files: ['*.jsonc'],
options: {
parser: 'jsonc',
// By spec, JSONC only extends JSON with comment support, not trailing commas as Prettier likes to add
trailingComma: 'none',
},
},
],
xmlWhitespaceSensitivity: 'ignore',
}

View File

@ -0,0 +1,20 @@
import eslint from '@eslint/js'
import prettierEslint from 'eslint-plugin-prettier/recommended'
import tseslint from 'typescript-eslint'
import common from './common.mjs'
export default tseslint.config(
eslint.configs.recommended,
prettierEslint,
...common,
{
languageOptions: {
parserOptions: {
warnOnUnsupportedTypeScriptVersion: false,
},
},
},
{
ignores: ['node_modules/', 'dist/', 'build/'],
},
)

View File

@ -0,0 +1,22 @@
import simpleImportSort from 'eslint-plugin-simple-import-sort'
export default [
{
plugins: {
'simple-import-sort': simpleImportSort,
},
rules: {
'simple-import-sort/imports': 'error',
'simple-import-sort/exports': 'error',
},
},
{
rules: {
'@typescript-eslint/no-type-alias': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/prefer-literal-enum-member': 'off',
'@typescript-eslint/no-namespace': 'off',
'@typescript-eslint/no-invalid-void-type': 'off',
},
},
]

View File

@ -0,0 +1,53 @@
import { fixupPluginRules } from '@eslint/compat'
import { createConfigForNuxt } from '@nuxt/eslint-config/flat'
import turboPlugin from 'eslint-plugin-turbo'
import common from './common.mjs'
export const configurationNuxtToAppend = [
...common,
{
name: 'turbo',
plugins: {
turbo: fixupPluginRules(turboPlugin),
},
rules: {
'turbo/no-undeclared-env-vars': 'error',
},
},
{
name: 'modrinth',
rules: {
'vue/html-self-closing': 'off',
'vue/multi-word-component-names': 'off',
'vue/no-undef-components': [
'error',
{
ignorePatterns: [
'NuxtPage',
'NuxtLayout',
'NuxtLink',
'NuxtRouteAnnouncer',
'ClientOnly',
'Teleport',
'Transition',
'TransitionGroup',
'Head',
'Title',
'router-link',
'RouterView',
'RouterLink',
'nuxt-link',
],
},
],
'vue/no-undef-properties': 'warn',
},
languageOptions: {
parserOptions: {
warnOnUnsupportedTypeScriptVersion: false,
},
},
},
]
export default createConfigForNuxt().append(configurationNuxtToAppend)

View File

@ -0,0 +1,33 @@
/**
* @see https://prettier.io/docs/configuration
* @type {import("prettier").Config}
*/
module.exports = {
semi: false,
singleQuote: true,
plugins: [
// In typical JS/TS britleness fashion, the Tailwind CSS plugin
// has a transitive dependency on an import sort plugin that breaks
// TypeScript type annotations, for reasons unbeknownst to anyone.
// Our frontend project was the only one enabling such plugin, so
// to avoid this bug spreading to other parts of the monorepo, let's
// keep it contained to it. See:
// https://github.com/tailwindlabs/prettier-plugin-tailwindcss/issues/338
// https://github.com/prettier/prettier-vscode/issues/3578
'prettier-plugin-tailwindcss',
'prettier-plugin-toml',
'prettier-plugin-sql-cst',
'@prettier/plugin-xml',
],
overrides: [
{
files: ['*.jsonc'],
options: {
parser: 'jsonc',
// By spec, JSONC only extends JSON with comment support, not trailing commas as Prettier likes to add
trailingComma: 'none',
},
},
],
xmlWhitespaceSensitivity: 'ignore',
}

View File

@ -0,0 +1,27 @@
/**
* @see https://prettier.io/docs/configuration
* @type {import("prettier").Config}
*/
module.exports = {
semi: false,
singleQuote: true,
plugins: ['prettier-plugin-toml', 'prettier-plugin-sql-cst', '@prettier/plugin-xml'],
overrides: [
{
files: ['*.sql'],
options: {
parser: 'postgresql',
sqlAcceptUnsupportedGrammar: true,
},
},
{
files: ['*.jsonc'],
options: {
parser: 'jsonc',
// By spec, JSONC only extends JSON with comment support, not trailing commas as Prettier likes to add
trailingComma: 'none',
},
},
],
xmlWhitespaceSensitivity: 'ignore',
}

View File

@ -0,0 +1,54 @@
{
"name": "@modrinth/tooling-config",
"version": "0.0.0",
"type": "module",
"private": true,
"description": "Unified tooling configuration for Modrinth monorepo",
"main": "./index.js",
"scripts": {
"lint": "prettier --check .",
"fix": "prettier --write ."
},
"exports": {
"./eslint/*": "./eslint/*",
"./typescript/*": "./typescript/*",
"./prettier.config.cjs": "./prettier.config.cjs",
"./frontend.prettier.config.cjs": "./frontend.prettier.config.cjs",
"./app-lib.prettier.config.cjs": "./app-lib.prettier.config.cjs",
"./labrinth.prettier.config.cjs": "./labrinth.prettier.config.cjs",
"./tailwind/*": "./tailwind/*",
"./script-utils/*": "./script-utils/*"
},
"files": [
"eslint/",
"typescript/",
"prettier/",
"tailwind/",
"index.js"
],
"peerDependencies": {
"eslint": "^9.31.0",
"prettier": "^3.6.2",
"typescript": ">=5.0.0"
},
"dependencies": {
"@prettier/plugin-xml": "^3.4.2",
"prettier-plugin-sql-cst": "^0.13.0",
"prettier-plugin-toml": "^2.0.6"
},
"devDependencies": {
"@eslint/compat": "^1.4.1",
"@eslint/js": "^9.32.0",
"@nuxt/eslint-config": "^0.5.7",
"@vue/tsconfig": "^0.7.0",
"eslint": "^9.32.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.3",
"eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-turbo": "^2.5.4",
"eslint-plugin-vue": "^10.4.0",
"vue-eslint-parser": "^10.1.3",
"globals": "^16.3.0",
"typescript-eslint": "^8.38.0"
}
}

View File

@ -0,0 +1,20 @@
/**
* @see https://prettier.io/docs/configuration
* @type {import("prettier").Config}
*/
module.exports = {
semi: false,
singleQuote: true,
plugins: ['prettier-plugin-toml', 'prettier-plugin-sql-cst', '@prettier/plugin-xml'],
overrides: [
{
files: ['*.jsonc'],
options: {
parser: 'jsonc',
// By spec, JSONC only extends JSON with comment support, not trailing commas as Prettier likes to add
trailingComma: 'none',
},
},
],
xmlWhitespaceSensitivity: 'ignore',
}

View File

@ -0,0 +1,73 @@
/**
* Import sorting utility that matches eslint-plugin-simple-import-sort's algorithm.
* Use this to pre-sort generated imports so ESLint doesn't need to reformat them - which can cause it to have different diffs
*/
const collator = new Intl.Collator('en', {
sensitivity: 'base',
numeric: true,
})
function compare(a: string, b: string): number {
return collator.compare(a, b) || (a < b ? -1 : a > b ? 1 : 0)
}
/**
* Transforms an import source path the same way simple-import-sort does internally.
* This swaps certain characters to achieve the desired sort order:
* - `.` and `/` sort before other punctuation
* - `..` sorts like `../,` to come after `../../` but before `../a`
*/
function transformSource(source: string): string {
return source
.replace(/^[./]*\.$/, '$&/')
.replace(/^[./]*\/$/, '$&,')
.replace(/[./_-]/g, (char) => {
switch (char) {
case '.':
return '_'
case '/':
return '-'
case '_':
return '.'
case '-':
return '/'
default:
return char
}
})
}
/**
* Compares two import source paths using the same algorithm as simple-import-sort.
* Use this as a comparator function for Array.sort().
*
* @example
* const imports = ['./foo', './bar', './baz'];
* imports.sort(compareImportSources);
*/
export function compareImportSources(a: string, b: string): number {
return compare(transformSource(a), transformSource(b))
}
/**
* Sorts an array of import source paths using the same algorithm as simple-import-sort.
*
* @example
* const sorted = sortImportSources(['./z', './a', './m']);
* // Returns: ['./a', './m', './z']
*/
export function sortImportSources<T extends string>(sources: T[]): T[] {
return sources.slice().sort(compareImportSources)
}
/**
* Sorts an array of items by their import source path.
*
* @example
* const items = [{ path: './z' }, { path: './a' }];
* const sorted = sortByImportSource(items, item => item.path);
*/
export function sortByImportSource<T>(items: T[], getSource: (item: T) => string): T[] {
return items.slice().sort((a, b) => compareImportSources(getSource(a), getSource(b)))
}

View File

@ -0,0 +1,264 @@
import containerQueries from '@tailwindcss/container-queries'
import type { Config } from 'tailwindcss'
const config: Config = {
theme: {
extend: {
colors: {
surface: {
1: 'var(--surface-1)',
1.5: 'var(--surface-1-5)',
2: 'var(--surface-2)',
2.5: 'var(--surface-2-5)',
3: 'var(--surface-3)',
4: 'var(--surface-4)',
5: 'var(--surface-5)',
},
/// TODO: Clean up these aliases within codebase to use default, primary, tertiary.
// text-default
primary: 'var(--color-text-default)',
// text-primary
contrast: 'var(--color-text-primary)',
// text-tertiary
secondary: 'var(--color-text-tertiary)',
red: {
DEFAULT: 'var(--color-red)',
50: 'var(--color-red-50)',
100: 'var(--color-red-100)',
200: 'var(--color-red-200)',
300: 'var(--color-red-300)',
400: 'var(--color-red-400)',
500: 'var(--color-red-500)',
600: 'var(--color-red-600)',
700: 'var(--color-red-700)',
800: 'var(--color-red-800)',
900: 'var(--color-red-900)',
950: 'var(--color-red-950)',
},
orange: {
DEFAULT: 'var(--color-orange)',
50: 'var(--color-orange-50)',
100: 'var(--color-orange-100)',
200: 'var(--color-orange-200)',
300: 'var(--color-orange-300)',
400: 'var(--color-orange-400)',
500: 'var(--color-orange-500)',
600: 'var(--color-orange-600)',
700: 'var(--color-orange-700)',
800: 'var(--color-orange-800)',
900: 'var(--color-orange-900)',
950: 'var(--color-orange-950)',
},
green: {
DEFAULT: 'var(--color-green)',
50: 'var(--color-green-50)',
100: 'var(--color-green-100)',
200: 'var(--color-green-200)',
300: 'var(--color-green-300)',
400: 'var(--color-green-400)',
500: 'var(--color-green-500)',
600: 'var(--color-green-600)',
700: 'var(--color-green-700)',
800: 'var(--color-green-800)',
900: 'var(--color-green-900)',
950: 'var(--color-green-950)',
},
blue: {
DEFAULT: 'var(--color-blue)',
50: 'var(--color-blue-50)',
100: 'var(--color-blue-100)',
200: 'var(--color-blue-200)',
300: 'var(--color-blue-300)',
400: 'var(--color-blue-400)',
500: 'var(--color-blue-500)',
600: 'var(--color-blue-600)',
700: 'var(--color-blue-700)',
800: 'var(--color-blue-800)',
900: 'var(--color-blue-900)',
950: 'var(--color-blue-950)',
},
purple: {
DEFAULT: 'var(--color-purple)',
50: 'var(--color-purple-50)',
100: 'var(--color-purple-100)',
200: 'var(--color-purple-200)',
300: 'var(--color-purple-300)',
400: 'var(--color-purple-400)',
500: 'var(--color-purple-500)',
600: 'var(--color-purple-600)',
700: 'var(--color-purple-700)',
800: 'var(--color-purple-800)',
900: 'var(--color-purple-900)',
950: 'var(--color-purple-950)',
},
gray: {
DEFAULT: 'var(--color-gray)',
50: 'var(--color-gray-50)',
100: 'var(--color-gray-100)',
200: 'var(--color-gray-200)',
300: 'var(--color-gray-300)',
400: 'var(--color-gray-400)',
500: 'var(--color-gray-500)',
600: 'var(--color-gray-600)',
700: 'var(--color-gray-700)',
800: 'var(--color-gray-800)',
900: 'var(--color-gray-900)',
950: 'var(--color-gray-950)',
},
/// === LEGACY ===
icon: 'var(--color-base)',
// Text
inactive: 'var(--color-text-inactive)',
dark: 'var(--color-text-dark)',
inverted: 'var(--color-text-inverted)',
heading: 'var(--color-heading)',
bg: {
DEFAULT: 'var(--surface-1)', // var(--color-bg)
red: 'var(--color-red-bg)',
orange: 'var(--color-orange-bg)',
green: 'var(--color-green-bg)',
blue: 'var(--color-blue-bg)',
purple: 'var(--color-purple-bg)',
raised: 'var(--surface-3)', // var(--color-raised-bg)
},
banners: {
error: {
bg: 'var(--banner-error-bg)',
text: 'var(--banner-error-text)',
border: 'var(--banner-error-border)',
},
warning: {
bg: 'var(--banner-warning-bg)',
text: 'var(--banner-warning-text)',
border: 'var(--banner-warning-border)',
},
info: {
bg: 'var(--banner-info-bg)',
text: 'var(--banner-info-text)',
border: 'var(--banner-info-border)',
},
},
highlight: {
DEFAULT: 'var(--color-brand-highlight)',
red: 'var(--color-red-highlight)',
orange: 'var(--color-orange-highlight)',
green: 'var(--color-green-highlight)',
blue: 'var(--color-blue-highlight)',
purple: 'var(--color-purple-highlight)',
},
divider: {
DEFAULT: 'var(--color-divider)',
dark: 'var(--color-divider-dark)',
},
brand: {
DEFAULT: 'var(--color-brand)',
red: 'var(--color-red)',
orange: 'var(--color-orange)',
green: 'var(--color-green)',
blue: 'var(--color-blue)',
purple: 'var(--color-purple)',
highlight: 'var(--color-brand-highlight)',
shadow: 'var(--color-brand-shadow)',
inverted: 'var(--color-accent-contrast)',
},
tabUnderlineHovered: 'var(--tab-underline-hovered)',
button: {
bg: 'var(--color-button-bg)',
text: 'var(--color-button-text)',
bgHover: 'var(--color-button-bg-hover)',
textHover: 'var(--color-button-text-hover)',
bgActive: 'var(--color-button-bg-active)',
textActive: 'var(--color-button-text-active)',
border: 'var(--color-button-border)',
bgSelected: 'var(--color-button-bg-selected)',
textSelected: 'var(--color-button-text-selected)',
},
toggleHandle: 'var(--color-toggle-handle)',
dropdown: {
bg: 'var(--color-dropdown-bg)',
text: 'var(--color-dropdown-text)',
},
tooltip: {
bg: 'var(--color-tooltip-bg)',
text: 'var(--color-tooltip-text)',
},
code: {
bg: 'var(--color-code-bg)',
text: 'var(--color-code-text)',
},
kbdShadow: 'var(--color-kbd-shadow)',
ad: {
DEFAULT: 'var(--color-ad)',
raised: 'var(--color-ad-raised)',
contrast: 'var(--color-ad-contrast)',
highlight: 'var(--color-ad-highlight)',
},
greyLink: {
DEFAULT: 'var(--color-grey-link)',
hover: 'var(--color-grey-link-hover)',
active: 'var(--color-grey-link-active)',
},
link: {
DEFAULT: 'var(--color-link)',
hover: 'var(--color-link-hover)',
active: 'var(--color-link-active)',
},
warning: {
bg: 'var(--color-warning-bg)',
text: 'var(--color-warning-text)',
banner: {
text: 'var(--color-warning-banner-text)',
bg: 'var(--color-warning-banner-bg)',
side: 'var(--color-warning-banner-side)',
},
},
infoBanner: {
text: 'var(--color-info-banner-text)',
bg: 'var(--color-info-banner-bg)',
side: 'var(--color-info-banner-side)',
},
blockQuote: 'var(--color-block-quote)',
headerUnderline: 'var(--color-header-underline)',
hr: 'var(--color-hr)',
table: {
border: 'var(--color-table-border)',
alternateRow: 'var(--color-table-alternate-row)',
},
},
backgroundImage: {
mazeBg: 'var(--landing-maze-bg)',
mazeGradientBg: 'var(--landing-maze-gradient-bg)',
// @ts-ignore
landing: {
mazeOuterBg: 'var(--landing-maze-outer-bg)',
colorHeading: 'var(--landing-color-heading)',
colorSubheading: 'var(--landing-color-subheading)',
transitionGradientStart: 'var(--landing-transition-gradient-start)',
transitionGradientEnd: 'var(--landing-transition-gradient-end)',
hoverCardGradient: 'var(--landing-hover-card-gradient)',
borderGradient: 'var(--landing-border-gradient)',
borderColor: 'var(--landing-border-color)',
creatorGradient: 'var(--landing-creator-gradient)',
blobGradient: 'var(--landing-blob-gradient)',
cardBg: 'var(--landing-card-bg)',
blueLabel: 'var(--landing-blue-label)',
blueLabelBg: 'var(--landing-blue-label-bg)',
greenLabel: 'var(--landing-green-label)',
greenLabelBg: 'var(--landing-green-label-bg)',
rawBg: 'var(--landing-raw-bg)',
},
},
},
},
plugins: [containerQueries],
corePlugins: {
preflight: false,
},
}
export default config

View File

@ -0,0 +1,17 @@
{
"$schema": "https://www.schemastore.org/tsconfig",
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"lib": ["esnext", "dom"],
"allowSyntheticDefaultImports": true
}
}

View File

@ -0,0 +1,9 @@
{
"$schema": "https://www.schemastore.org/tsconfig",
"extends": "@vue/tsconfig/tsconfig.dom.json",
"compilerOptions": {
"lib": ["ESNext", "DOM"],
"moduleResolution": "bundler",
"noImplicitAny": false
}
}