diff --git a/.env b/.env index 9ca3a05..1e45dba 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ NEXT_PUBLIC_SITE_NAME = 开放黑客松 NEXT_PUBLIC_SITE_SUMMARY = 基于 Git 云开发环境的开放黑客马拉松平台 -NEXT_PUBLIC_API_HOST = https://openhackathon-service-server.onrender.com +NEXT_PUBLIC_API_HOST = https://openhackathon-service.onrender.com NEXT_PUBLIC_AUTHING_APP_ID = 60178760106d5f26cb267ac1 \ No newline at end of file diff --git a/README.md b/README.md index 8cfb41b..967cb47 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Open-source [Hackathon][1] Platform with **Git-based Cloud Development Environme - testing: https://test.hackathon.kaiyuanshe.cn/ - production: https://hackathon.kaiyuanshe.cn/ - RESTful API - - production: https://openhackathon-service-server.onrender.com/ + - production: https://openhackathon-service.onrender.com/ ## Technology stack diff --git a/components/Activity/ActivityEditor.tsx b/components/Activity/ActivityEditor.tsx index d33045d..8774e33 100644 --- a/components/Activity/ActivityEditor.tsx +++ b/components/Activity/ActivityEditor.tsx @@ -1,10 +1,17 @@ -import { Hackathon } from '@kaiyuanshe/openhackathon-service'; +import { Hackathon, Media } from '@kaiyuanshe/openhackathon-service'; import { Loading } from 'idea-react'; import { computed } from 'mobx'; import { textJoin } from 'mobx-i18n'; import { observer } from 'mobx-react'; import { ObservedComponent } from 'mobx-react-helper'; -import { BadgeInput, Field, FileUploader, RestForm } from 'mobx-restful-table'; +import { + ArrayField, + ArrayFieldProps, + Field, + FileUploader, + FormField, + RestForm, +} from 'mobx-restful-table'; import activityStore from '../../models/Activity'; import fileStore from '../../models/Base/File'; @@ -33,13 +40,14 @@ export class ActivityEditor extends ObservedComponent[] { - const { t } = this.observedContext; + const i18n = this.observedContext; + const { t } = i18n; return [ { key: 'name', renderLabel: t('activity_id'), - pattern: '[a-zA-Z0-9]+', + pattern: '[\\w-]+', required: true, invalidMessage: t('name_placeholder'), }, @@ -49,31 +57,14 @@ export class ActivityEditor extends ObservedComponent ( - - - - ), - }, + { key: 'tags', renderLabel: t('tag'), multiple: true, placeholder: t('tag_placeholder') }, { key: 'banners', renderLabel: t('bannerUrls'), - accept: 'image/*', - required: true, - multiple: true, max: 10, - uploader: fileStore, - renderInput: ({ banners }, { key, uploader, ...meta }) => ( + renderInput: ({ banners }, { key, ...meta }) => ( - uri)} - /> + ), }, @@ -148,6 +139,28 @@ export class ActivityEditor extends ObservedComponent['renderItem'] => + ({ uri, name, description }) => ( +
+ + + +
+ ); + render() { const i18n = this.observedContext, { downloading, uploading } = activityStore; diff --git a/components/Message/MessageList.tsx b/components/Message/MessageList.tsx index 9565349..e993f3c 100644 --- a/components/Message/MessageList.tsx +++ b/components/Message/MessageList.tsx @@ -25,8 +25,6 @@ export class AnnouncementList extends ObservedComponent - ); + return ; } } diff --git a/models/Base/File.ts b/models/Base/File.ts index 0489844..d83db2c 100644 --- a/models/Base/File.ts +++ b/models/Base/File.ts @@ -1,65 +1,34 @@ -import { HTTPError, Request, request } from 'koajax'; -import { DataObject, toggle } from 'mobx-restful'; +import { SignedLink } from '@kaiyuanshe/openhackathon-service'; +import { toggle } from 'mobx-restful'; import { FileModel } from 'mobx-restful-table'; +import { blobOf, uniqueID } from 'web-utility'; import sessionStore from '../User/Session'; -import { ErrorBaseData, UploadUrl } from './index'; -export class AzureFileModel extends FileModel { - static async uploadBlob( - fullPath: string, - method: Request['method'] = 'PUT', - body?: any, - headers: DataObject = {}, - ) { - headers['x-ms-blob-type'] = 'BlockBlob'; - - const { response } = request({ - path: fullPath, - method, - body, - headers, - }); - const { headers: header, body: data } = await response; - - if (!data || !('traceId' in (data as DataObject))) return data!; - - const { status, title, detail } = data as unknown as ErrorBaseData; - - throw new HTTPError( - detail || title, - { method, path: fullPath, headers, body }, - { status, statusText: title, headers: header, body: data }, - ); - } +export class S3FileModel extends FileModel { + client = sessionStore.client; @toggle('uploading') - async upload(file: File) { - const { type, name } = file; - - const { body } = await sessionStore.client.post( - `user/generateFileUrl`, - { filename: name }, + async upload(file: string | Blob) { + if (typeof file === 'string') { + const name = file.split('/').pop()!; + + file = new File([await blobOf(file)], name); + } + const { body } = await this.client.post( + `file/signed-link/${file instanceof File ? file.name : uniqueID()}`, ); - const parts = body!.uploadUrl.split('/'); - - const path = parts.slice(0, -1).join('/'), - [fileName, data] = parts.at(-1)!.split('?'); - - const URI_Put = `${path}/${encodeURIComponent(fileName)}?${data}`; + await this.client.put(body!.putLink, file, { 'Content-Type': file.type }); - await AzureFileModel.uploadBlob(URI_Put, 'PUT', file, { - 'Content-Type': type, - }); - - const { origin, pathname } = new URL(body!.url); + return super.upload(body!.getLink); + } - const URI_Get = `${ - origin + pathname.split('/').slice(0, -1).join('/') - }/${encodeURIComponent(fileName)}`; + @toggle('uploading') + async delete(link: string) { + await this.client.delete(`file/${link.replace(`${this.client.baseURI}/file/`, '')}`); - return super.upload(URI_Get); + await super.delete(link); } } -export default new AzureFileModel(); +export default new S3FileModel(); diff --git a/models/Base/index.ts b/models/Base/index.ts index b369302..63cb8c5 100644 --- a/models/Base/index.ts +++ b/models/Base/index.ts @@ -1,11 +1,10 @@ import { Base, ListChunk } from '@kaiyuanshe/openhackathon-service'; -import { Filter as BaseFilter, ListModel, RESTClient } from 'mobx-restful'; +import { Filter as BaseFilter, IDType, ListModel, RESTClient, toggle } from 'mobx-restful'; import { buildURLData } from 'web-utility'; import { ownClient } from '../User/Session'; -export interface UploadUrl - extends Record<'filename' | 'uploadUrl' | 'url', string> { +export interface UploadUrl extends Record<'filename' | 'uploadUrl' | 'url', string> { expiration: number; } @@ -59,6 +58,15 @@ export abstract class TableModel< > extends ListModel { client = ownClient; + @toggle('uploading') + async updateOne(data: BaseFilter, id?: IDType) { + const { body } = await (id + ? this.client.put(`${this.baseURI}/${id}`, data) + : this.client.post(this.baseURI, data)); + + return (this.currentOne = body!); + } + async loadPage(pageIndex: number, pageSize: number, filter: F) { const { body } = await this.client.get>( `${this.baseURI}?${buildURLData({ ...filter, pageIndex, pageSize })}`, diff --git a/package.json b/package.json index cee2b61..65ae327 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "mobx-react": "^9.2.0", "mobx-react-helper": "^0.4.1", "mobx-restful": "^2.1.0", - "mobx-restful-table": "^2.5.1", + "mobx-restful-table": "^2.5.2", "next": "^15.3.3", "next-ssr-middleware": "^1.0.0", "open-react-map": "^0.9.0", @@ -49,8 +49,8 @@ "@cspell/eslint-plugin": "^9.0.2", "@eslint/compat": "^1.2.9", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.27.0", - "@kaiyuanshe/openhackathon-service": "^0.21.1", + "@eslint/js": "^9.28.0", + "@kaiyuanshe/openhackathon-service": "^0.22.0", "@next/eslint-plugin-next": "^15.3.3", "@octokit/openapi-types": "^25.1.0", "@softonus/prettier-plugin-duplicate-remover": "^1.1.2", @@ -62,7 +62,7 @@ "@types/next-pwa": "^5.6.9", "@types/node": "^22.15.29", "@types/react": "^19.1.6", - "eslint": "^9.27.0", + "eslint": "^9.28.0", "eslint-config-next": "^15.3.3", "eslint-config-prettier": "^10.1.5", "eslint-plugin-react": "^7.37.5", diff --git a/pages/activity/[name]/index.tsx b/pages/activity/[name]/index.tsx index c620602..b202c92 100644 --- a/pages/activity/[name]/index.tsx +++ b/pages/activity/[name]/index.tsx @@ -49,7 +49,7 @@ export const getServerSideProps = compose<{ name?: string }, ActivityPageProps>( activityStore.organizationOf(name).getList(), ]); - return { props: { activity, organizationList } }; + return { props: JSON.parse(JSON.stringify({ activity, organizationList })) }; }, ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db4ea70..07bacd9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -82,8 +82,8 @@ importers: specifier: ^2.1.0 version: 2.1.0(mobx@6.13.7)(typescript@5.8.3) mobx-restful-table: - specifier: ^2.5.1 - version: 2.5.1(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + specifier: ^2.5.2 + version: 2.5.2(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) next: specifier: ^15.3.3 version: 15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -126,19 +126,19 @@ importers: version: 7.27.1(@babel/core@7.27.4) '@cspell/eslint-plugin': specifier: ^9.0.2 - version: 9.0.2(eslint@9.27.0(jiti@2.4.2)) + version: 9.0.2(eslint@9.28.0(jiti@2.4.2)) '@eslint/compat': specifier: ^1.2.9 - version: 1.2.9(eslint@9.27.0(jiti@2.4.2)) + version: 1.2.9(eslint@9.28.0(jiti@2.4.2)) '@eslint/eslintrc': specifier: ^3.3.1 version: 3.3.1 '@eslint/js': - specifier: ^9.27.0 - version: 9.27.0 + specifier: ^9.28.0 + version: 9.28.0 '@kaiyuanshe/openhackathon-service': - specifier: ^0.21.1 - version: 0.21.1(mobx@6.13.7)(typescript@5.8.3) + specifier: ^0.22.0 + version: 0.22.0(mobx@6.13.7)(typescript@5.8.3) '@next/eslint-plugin-next': specifier: ^15.3.3 version: 15.3.3 @@ -150,7 +150,7 @@ importers: version: 1.1.2 '@stylistic/eslint-plugin': specifier: ^4.4.0 - version: 4.4.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 4.4.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) '@types/eslint-config-prettier': specifier: ^6.11.3 version: 6.11.3 @@ -173,20 +173,20 @@ importers: specifier: ^19.1.6 version: 19.1.6 eslint: - specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) + specifier: ^9.28.0 + version: 9.28.0(jiti@2.4.2) eslint-config-next: specifier: ^15.3.3 - version: 15.3.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 15.3.3(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) eslint-config-prettier: specifier: ^10.1.5 - version: 10.1.5(eslint@9.27.0(jiti@2.4.2)) + version: 10.1.5(eslint@9.28.0(jiti@2.4.2)) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.27.0(jiti@2.4.2)) + version: 7.37.5(eslint@9.28.0(jiti@2.4.2)) eslint-plugin-simple-import-sort: specifier: ^12.1.1 - version: 12.1.1(eslint@9.27.0(jiti@2.4.2)) + version: 12.1.1(eslint@9.28.0(jiti@2.4.2)) get-git-folder: specifier: ^0.1.2 version: 0.1.2(@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4))(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@types/node@22.15.29) @@ -225,7 +225,7 @@ importers: version: 5.8.3 typescript-eslint: specifier: ^8.33.0 - version: 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) webpack: specifier: ^5.99.9 version: 5.99.9 @@ -1070,8 +1070,8 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.27.0': - resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} + '@eslint/js@9.28.0': + resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -1274,8 +1274,8 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@kaiyuanshe/openhackathon-service@0.21.1': - resolution: {integrity: sha512-lmNiIshBSep9ApBJfmE2jYKohz7UprgcyIzwLvhxyLDaXtOQ2BV0DYBzUsRADm7bT0Q8SO+GVxcsiYo3xQgT0w==, tarball: https://npm.pkg.github.com/download/@kaiyuanshe/openhackathon-service/0.21.1/7637215c91fea1a82ce7709a5e5d752877d7f8c7} + '@kaiyuanshe/openhackathon-service@0.22.0': + resolution: {integrity: sha512-4V59hhPrjYSauK/Q3vqcNnag/w4GjJODGTZhA+YIU+r1jl3ds4/kLeBuZfZ9mXEd+cUHTr7s74BtYfcumXmkCQ==, tarball: https://npm.pkg.github.com/download/@kaiyuanshe/openhackathon-service/0.22.0/a34a45c582cf7bdedcb2f5d4647212dc9879f43a} '@koa/bodyparser@5.1.2': resolution: {integrity: sha512-eGJm9/66iUX+LUH03Cz0e94unbSKrmSPCick4MO5UorAAomcjC5Kl+SkoZ6CSyPew3neMYjj7n+djnlGYBSJAg==} @@ -3014,8 +3014,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.27.0: - resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} + eslint@9.28.0: + resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3993,8 +3993,8 @@ packages: react-native: optional: true - mobx-restful-table@2.5.1: - resolution: {integrity: sha512-Xh5MjJ8itANcfLEoWnWYPvEEqrKwnUKz11NiqES5jW55YCjA+T3/nq7HrEFPx9gF3BIheNlEAERfczAU+bHoFQ==} + mobx-restful-table@2.5.2: + resolution: {integrity: sha512-+LubMlc+Mm1WGJbASaIWiJndSTRSlW8DIrGwqdKKjYSQcj3/ULloQELrUoCVuid3Q4hCYdjmioarwTqTyFvBsQ==} peerDependencies: react: '>=16.8' @@ -6193,12 +6193,12 @@ snapshots: '@cspell/url': 9.0.2 import-meta-resolve: 4.1.0 - '@cspell/eslint-plugin@9.0.2(eslint@9.27.0(jiti@2.4.2))': + '@cspell/eslint-plugin@9.0.2(eslint@9.28.0(jiti@2.4.2))': dependencies: '@cspell/cspell-types': 9.0.2 '@cspell/url': 9.0.2 cspell-lib: 9.0.2 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) synckit: 0.11.8 '@cspell/filetypes@9.0.2': {} @@ -6229,16 +6229,16 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))': dependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.2.9(eslint@9.27.0(jiti@2.4.2))': + '@eslint/compat@1.2.9(eslint@9.28.0(jiti@2.4.2))': optionalDependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) '@eslint/config-array@0.20.0': dependencies: @@ -6268,7 +6268,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.27.0': {} + '@eslint/js@9.28.0': {} '@eslint/object-schema@2.1.6': {} @@ -6425,7 +6425,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@kaiyuanshe/openhackathon-service@0.21.1(mobx@6.13.7)(typescript@5.8.3)': + '@kaiyuanshe/openhackathon-service@0.22.0(mobx@6.13.7)(typescript@5.8.3)': dependencies: '@types/jsonwebtoken': 9.0.9 '@types/koa': 2.15.0 @@ -7115,10 +7115,10 @@ snapshots: '@softonus/prettier-plugin-duplicate-remover@1.1.2': {} - '@stylistic/eslint-plugin@4.4.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@stylistic/eslint-plugin@4.4.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/utils': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.27.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.28.0(jiti@2.4.2) eslint-visitor-keys: 4.2.0 espree: 10.3.0 estraverse: 5.3.0 @@ -7376,15 +7376,15 @@ snapshots: '@types/which@3.0.4': {} - '@typescript-eslint/eslint-plugin@8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.33.0 - '@typescript-eslint/type-utils': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.33.0 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.4 natural-compare: 1.4.0 @@ -7393,14 +7393,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.33.0 '@typescript-eslint/types': 8.33.0 '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.33.0 debug: 4.4.1 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -7423,12 +7423,12 @@ snapshots: dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -7452,13 +7452,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.33.0 '@typescript-eslint/types': 8.33.0 '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3) - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -8365,19 +8365,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.3.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3): + eslint-config-next@15.3.3(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3): dependencies: '@next/eslint-plugin-next': 15.3.3 '@rushstack/eslint-patch': 1.11.0 - '@typescript-eslint/eslint-plugin': 8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.27.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.28.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.4.2)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.27.0(jiti@2.4.2)) - eslint-plugin-react: 7.37.5(eslint@9.27.0(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.27.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.28.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.28.0(jiti@2.4.2)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.28.0(jiti@2.4.2)) + eslint-plugin-react: 7.37.5(eslint@9.28.0(jiti@2.4.2)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.28.0(jiti@2.4.2)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -8385,9 +8385,9 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-prettier@10.1.5(eslint@9.27.0(jiti@2.4.2)): + eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)): dependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) eslint-import-resolver-node@0.3.9: dependencies: @@ -8397,33 +8397,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.28.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.14 unrs-resolver: 1.7.8 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.28.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.28.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.27.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.28.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.28.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.28.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -8432,9 +8432,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.28.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -8446,13 +8446,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.4.2)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.28.0(jiti@2.4.2)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -8462,7 +8462,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -8471,11 +8471,11 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.27.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.28.0(jiti@2.4.2)): dependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) - eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.4.2)): + eslint-plugin-react@7.37.5(eslint@9.28.0(jiti@2.4.2)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -8483,7 +8483,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -8497,9 +8497,9 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.27.0(jiti@2.4.2)): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.28.0(jiti@2.4.2)): dependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) eslint-scope@5.1.1: dependencies: @@ -8515,15 +8515,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.27.0(jiti@2.4.2): + eslint@9.28.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.2 '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.27.0 + '@eslint/js': 9.28.0 '@eslint/plugin-kit': 0.3.1 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -9585,7 +9585,7 @@ snapshots: optionalDependencies: react-dom: 19.1.0(react@19.1.0) - mobx-restful-table@2.5.1(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3): + mobx-restful-table@2.5.2(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3): dependencies: '@swc/helpers': 0.5.17 classnames: 2.5.1 @@ -10686,12 +10686,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.27.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.28.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color